From 930f232a935ba071195155c6d841d42a240afacb Mon Sep 17 00:00:00 2001 From: Flummi Date: Sat, 15 Mar 2025 13:24:52 +0000 Subject: [PATCH] =?UTF-8?q?src/index.mjs=20gel=C3=B6scht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.mjs | 139 -------------------------------------------------- 1 file changed, 139 deletions(-) delete mode 100644 src/index.mjs diff --git a/src/index.mjs b/src/index.mjs deleted file mode 100644 index aabecdc..0000000 --- a/src/index.mjs +++ /dev/null @@ -1,139 +0,0 @@ -import http from "http"; -import { URL } from "url"; -import { Buffer } from "buffer"; -import querystring from "querystring"; - -import Router from "./router.mjs"; -import Tpl from "./template.mjs"; - -export { Router, Tpl }; - -export default class flummpress { - #server; - - constructor() { - this.router = new Router(); - this.tpl = new Tpl(); - this.middleware = new Set(); - return this; - }; - - use(obj) { - if(obj instanceof Router) { - this.router.use(obj); - } - else if(obj instanceof Tpl) { - this.tpl = obj; - } - else { - if(!this.middleware.has(obj)) - this.middleware.add(obj); - } - return this; - }; - - listen(...args) { - this.#server = http.createServer(async (req, res) => { - const t_start = process.hrtime(); - - const _url = new URL(req.url.replace(/(?!^.)(\/+)?$/, ''), "relative:///"); - req.url = { - pathname: _url.pathname, - split: _url.pathname.split("/").slice(1), - searchParams: _url.searchParams, - qs: {...querystring.parse(_url.search.substring(1))} // legacy - }; - - req.cookies = {}; - if(req.headers.cookie) { - req.headers.cookie.split("; ").forEach(c => { - const parts = c.split('='); - req.cookies[parts.shift().trim()] = decodeURI(parts.join('=')); - }); - } - - await Promise.all([...this.middleware].map(m => m(req, res))); - - const method = req.method === 'HEAD' ? 'get' : req.method.toLowerCase(); - const route = this.router.getRoute(req.url.pathname, req.method == 'HEAD' ? 'GET' : req.method); - - if(route) { // 200 - const cb = route[1][method]; - const middleware = route[1][`${method}mw`]; - req.params = req.url.pathname.match(new RegExp(route[0]))?.groups; - req.post = await this.readBody(req); - - const result = await this.processMiddleware(middleware, req, this.createResponse(res)); - if(result) - cb(req, res); - } - else { // 404 - res - .writeHead(404) - .end(`404 - ${req.method} ${req.url.pathname}`); - } - - console.log([ - `[${(new Date()).toLocaleTimeString()}]`, - `${(process.hrtime(t_start)[1] / 1e6).toFixed(2)}ms`, - `${req.method} ${res.statusCode}`, - req.url.pathname - ].map(e => e.toString().padEnd(15)).join("")); - - }).listen(...args); - return this; - }; - - readBody(req) { - return new Promise((resolve, _, data = "") => req - .on("data", d => void (data += d)) - .on("end", () => { - if(req.headers['content-type'] === "application/json") { - try { - return void resolve(JSON.parse(data)); - } catch(err) {} - } - void resolve(Object.fromEntries(Object.entries(querystring.parse(data)).map(([k, v]) => { - try { - return [k, decodeURIComponent(v)]; - } catch(err) { - return [k, v]; - } - }))); - })); - }; - - createResponse(res) { - res.reply = ({ - code = 200, - type = "text/html", - body - }) => { - res.writeHead(code, { - "content-type": `${type}; charset=UTF-8`, - "content-length": Buffer.byteLength(body, 'utf-8') - }); - if(res.method === 'HEAD') - body = null; - res.end(body); - return res; - }; - res.json = (body, code = 200) => { - if(typeof body === 'object') - body = JSON.stringify(body); - return res.reply({ code, body, type: "application/json" }); - }; - res.html = (body, code = 200) => res.reply({ code, body, type: "text/html" }); - res.redirect = (target, code = 307) => res.writeHead(code, { - "Cache-Control": "no-cache, public", - "Location": target - }).end(); - return res; - }; - - processMiddleware(middleware, req, res) { - if(!middleware) - return new Promise(resolve => resolve(true)); - return new Promise(resolve => middleware(req, res, () => resolve(true))); - }; -};