kequapp
Version:
A minimal, zero-magic Node web framework built on native APIs
52 lines (51 loc) • 1.7 kB
JavaScript
import createGetBody from "./body/create-get-body.js";
import { renderError, renderRoute } from "./router/actions.js";
import createCookies from "./router/create-cookies.js";
import createRouter from "./router/create-router.js";
export { default as sendFile } from "./built-in/helpers/send-file.js";
export { default as staticDirectory } from "./built-in/helpers/static-directory.js";
export { default as Ex } from "./built-in/tools/ex.js";
export { default as inject } from "./built-in/tools/inject.js";
export * from "./router/modules.js";
export * from "./types.js";
export function createApp(structure) {
const router = createRouter(structure);
function app(req, res) {
requestProcessor(router, req, res);
}
return app;
}
async function requestProcessor(router, req, res) {
const startedAt = Date.now();
const url = new URL(req.url ?? '/', `${req.headers.protocol}://${req.headers.host}`);
const method = req.method ?? 'GET';
const [route, params, methods] = router(method, url.pathname);
const { logger } = route;
const bundle = Object.freeze({
req,
res,
url,
context: {},
params,
methods,
cookies: createCookies(req, res),
getBody: createGetBody(req),
logger,
});
try {
await renderRoute(route, bundle);
}
catch (error) {
try {
await renderError(route, bundle, error);
}
catch (fatalError) {
res.statusCode = 500;
logger.error(fatalError);
}
}
if (!res.writableEnded) {
res.end();
}
logger.http(res.statusCode, Date.now() - startedAt, method, url.pathname);
}