tdpeuter/routes.js
2025-10-01 15:48:30 +02:00

104 lines
3.4 KiB
JavaScript

const {promises: fs} = require('fs');
const http = require('http');
const path = require('path');
const {
MIME_TYPES_HEADER_NAME,
MIME_TYPES,
STATUS_CODES
} = require('./constants');
const host = 'localhost';
const DEFAULT_PORT = 8008;
const home = JSON.stringify({
message: 'My name is Tibo De Peuter. I like working with computers.'
});
const contact = JSON.stringify([
{
category: 'mail',
target: 'mailto:tibo@depeuter.dev'
},
{
category: 'git',
target: 'https://git.depeuter.dev/tdpeuter'
},
{
category: 'github',
target: 'https://github.com/tdpeuter'
},
{
category: 'twitter',
target: 'https://x.com/tdpeuter'
},
{
category: 'linkedin',
target: 'https://www.linkedin.com/in/tdpeuter/'
}
]);
function respondWithType(response, content, status, mimeType) {
response.setHeader(MIME_TYPES_HEADER_NAME, mimeType);
response.writeHead(status);
response.end(content);
return response;
}
function respondWithRedirect(response, target, status) {
response.setHeader('Location', target);
response.writeHead(status);
response.end();
return response;
}
async function requestListener(request, response) {
/* Check if it is a static file or not. */
if (request.url.startsWith('/assets/') || request.url.startsWith('/components/')) {
let filePath = __dirname + request.url;
let content = await fs.readFile(filePath);
let fileExt = path.extname(filePath).substring(1).toLowerCase();
let mimeType = MIME_TYPES[fileExt] || MIME_TYPES.default;
respondWithType(response, content, STATUS_CODES.OK, mimeType);
return;
}
switch (request.url) {
case '/':
if (request.headers.accept.startsWith(MIME_TYPES.html)) {
let indexFile = await fs.readFile(__dirname + '/pages/index.html');
respondWithType(response, indexFile, STATUS_CODES.OK, MIME_TYPES.html);
} else {
respondWithType(response, home, STATUS_CODES.OK, MIME_TYPES.json);
}
break;
case '/loader.js':
respondWithType(response, await fs.readFile(__dirname + '/loader.js', 'utf8'), STATUS_CODES.OK, MIME_TYPES.js);
break;
case '/about':
if (request.headers.accept.startsWith(MIME_TYPES.html)) {
let indexFile = await fs.readFile(__dirname + '/pages/about.html');
respondWithType(response, indexFile, STATUS_CODES.OK, MIME_TYPES.html);
} else {
respondWithType(response, contact, STATUS_CODES.OK, MIME_TYPES.json);
}
break;
case '/contact':
respondWithType(response, contact, STATUS_CODES.OK, MIME_TYPES.json);
break;
case '/pgp':
const url = 'https://keys.openpgp.org/vks/v1/by-fingerprint/08A9C1C8CF9159C9172ABA129B11F5243089DB5B';
respondWithRedirect(response, url, STATUS_CODES.MOVED_PERMANENTLY);
break;
default:
respondWithType(response, JSON.stringify({error: 'Resource not found'}), STATUS_CODES.NOT_FOUND, MIME_TYPES.json);
}
}
const server = http.createServer(requestListener);
const port = process.env.PORT || DEFAULT_PORT;
server.listen(port, host, () => {
console.log(`Server is running on https://${host}:${port}`);
});