Files
Diego Marcos 3332f609a9 Initial commit
2025-05-24 00:14:53 -07:00

65 lines
1.8 KiB
JavaScript

import fs from "node:fs/promises";
import http from "node:http";
import path from "node:path";
import { fileURLToPath } from "node:url";
// Resolve __dirname in ESM
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Get directory to serve
const root = path.resolve(process.argv[2] || ".");
const mimeTypes = {
".html": "text/html",
".js": "text/javascript",
".css": "text/css",
".json": "application/json",
".png": "image/png",
".jpg": "image/jpeg",
".svg": "image/svg+xml",
};
const server = http.createServer(async (req, res) => {
try {
const requestedPath = decodeURIComponent(req.url.split("?")[0]);
const fullPath = path.join(root, requestedPath);
const safePath = path.normalize(fullPath);
if (!safePath.startsWith(root)) {
res.writeHead(403);
return res.end("Access denied");
}
const stats = await fs.stat(safePath);
if (stats.isDirectory()) {
const indexPath = path.join(safePath, "index.html");
try {
const content = await fs.readFile(indexPath);
res.writeHead(200, { "Content-Type": "text/html" });
return res.end(content);
} catch {
res.writeHead(403);
return res.end("Directory listing is disabled");
}
} else {
const ext = path.extname(safePath).toLowerCase();
const contentType = mimeTypes[ext] || "application/octet-stream";
const content = await fs.readFile(safePath);
res.writeHead(200, { "Content-Type": contentType });
res.end(content);
}
} catch (err) {
res.writeHead(err.code === "ENOENT" ? 404 : 500);
res.end(
err.code === "ENOENT" ? "Not Found" : `Server Error: ${err.message}`,
);
}
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`Serving ${root} at http://localhost:${PORT}`);
});