UNPKG

@sigiljs/sigil

Version:

TypeScript-first Node.js HTTP framework offering schema-driven routing, modifier-based middleware, plugin extensibility, and flexible response templating

2 lines (1 loc) 3.95 kB
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const H=require("node:fs"),y=require("node:path"),q=require("../requests/process-request-content.js"),l=require("../responses/exceptions/exceptions-basic.js"),M=require("../responses/middleware-modification-request.js"),g=require("../responses/file-response.js"),v=require("../responses/raw-response.js"),m=require("../responses/redirect.js"),$=require("../responses/sigil-response.js");require("../utils/make-log.js");const f=require("../utils/safe-json.js"),j=require("./misc/sigil-responses-list.js"),p=require("./sigil-plugin-system.js"),h=require("../responses/exceptions/exception.js"),R=u=>u&&u.__esModule?u:{default:u},b=R(H),w=R(y);class _ extends p.default{constructor(t){super(t),this.incomingMessageHandler=this.incomingMessageHandler.bind(this),this.$incomingMessageHandlerImpl=this.$incomingMessageHandlerImpl.bind(this),this.$incomingMessageHandlerRef=this.$incomingMessageHandlerImpl}incomingMessageHandler(t,o){return this.$incomingMessageHandlerRef?.(t,o)}async $sendResponse(t,o,e,n,a,d){a.code&&(e.code=a.code);for(const r of this.$plugins.values()){const s=await r.onBeforeResponseSent(o,e);if(s){n.writeHead(s.code,Object.assign(s.headers.link,a.headers)).end(Buffer.isBuffer(s.content)||typeof s.content=="string"?s.content:f.jsonStringify(s.content,{throw:!0}));return}}const i=this.$responseTemplate(e),c=performance.now()-d;if(this.logger({message:`${t.method} ${t.url} - ${e.code} - ${Math.round(c*1e3)/1e3}ms`,level:e.code>499?"error":"info",module:"requests",json:{method:t.method,path:t.url,code:e.code,time:c}}),i.code>399&&this.$options.codeOnlyResponse?.includes(i.code)){n.writeHead(i.code,a.headers).end();return}if(e instanceof v.default){const r=typeof e.content=="string"||Buffer.isBuffer(e.content)?e.content:f.jsonStringify(e.content,{throw:!0});n.writeHead(e.code,Object.assign(e.headers.link,a.headers)).end(r);return}if(e instanceof g.default){n.writeHead(e.code,Object.assign(e.headers.link,a.headers)).end(e.content);return}if(e instanceof h.default){n.writeHead(e.code,Object.assign(i.headers,a.headers)).end(i.content),e.code>499&&this.logger({level:"error",module:"handler",message:r=>` ${r("-> ")}${r(`${e.name}: ${e.message}`)}`,json:{name:e.name,message:e.message}});return}if(e instanceof m.default){n.writeHead(e.code,Object.assign(e.headers.link,a.headers)).end();return}n.writeHead(i.code,Object.assign(i.headers,a.headers)).end(typeof i.content=="string"?i.content:f.jsonStringify(i.content))}async $executeHandler(t,o){try{return await t(o)}catch(e){return h.default.fromError(e)}}async $formatResponse(t){if(t instanceof Error)return h.default.fromError(t);if(t instanceof m.default)return t;if(t instanceof g.default)try{const o=w.default.isAbsolute(t.content)?t.content:w.default.resolve(t.content),e=t.headers.get("content-encoding");return t.content=await b.default.promises.readFile(o,e??"utf-8"),t}catch{return new l.NotFound(`File at path ${t.content} not found`)}return t instanceof $.default?t:new $.default(t,200)}async $incomingMessageHandlerImpl(t,o){for(const c of this.$plugins.values())if(c.onBeforeRequestReceived(t,o)===!1)return;const e=performance.now(),n=await q.default(t),a=new j.default;if(!n)return this.$sendResponse(t,n,new l.NotFound,o,{},e);for(const c of this.$plugins.values())c.onRequestReceived(n);const d={headers:{},code:void 0};for(const c of this.$middlewares.values()){const r=await c(n,a,d);if(r!==void 0){const s=await this.$formatResponse(r);if(s instanceof M.default)d.headers={...d.headers,...s.headers.link},d.code=s.code;else return this.$sendResponse(t,n,s,o,{},e)}}const i=this.$root.__$pathfinder.lookup(n.method,n.path);if(i){const c=await this.$executeHandler(i.handler,n.createClientRequest(i.params)),r=await this.$formatResponse(c);return this.$sendResponse(t,n,r,o,d,e)}this.$sendResponse(t,n,new l.NotFound,o,d,e)}}exports.default=_;