UNPKG

kequapp

Version:

A minimal, zero-magic Node web framework built on native APIs

52 lines (51 loc) 1.7 kB
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); }