@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.87 kB
JavaScript
;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"),j=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"),b=require("./misc/sigil-responses-list.js"),v=require("./sigil-plugin-system.js"),h=require("../responses/exceptions/exception.js"),R=u=>u&&u.__esModule?u:{default:u},_=R(H),w=R(y);class p extends v.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,s,c){s.code&&(e.code=s.code);for(const r of this.$plugins.values()){const a=await r.onBeforeResponseSent(o,e);if(a){n.writeHead(a.code,Object.assign(a.headers.link,s.headers)).end(Buffer.isBuffer(a.content)||typeof a.content=="string"?a.content:f.jsonStringify(a.content,{throw:!0}));return}}const i=this.$responseTemplate(e),d=performance.now()-c;if(this.logger({message:`${t.method} ${t.url} - ${e.code} - ${Math.round(d*1e3)/1e3}ms`,level:e.code>499?"error":"info",module:"requests",json:{method:t.method,path:t.url,code:e.code,time:d}}),i.code>399&&this.$options.codeOnlyResponse?.includes(i.code)){n.writeHead(i.code,s.headers).end();return}if(e instanceof j.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,s.headers)).end(r);return}if(e instanceof g.default){n.writeHead(e.code,Object.assign(e.headers.link,s.headers)).end(e.content);return}if(e instanceof h.default){n.writeHead(e.code,Object.assign(i.headers,s.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,s.headers)).end();return}n.writeHead(i.code,Object.assign(i.headers,s.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 _.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){const e=performance.now(),n=await q.default(t),s=new b.default;if(!n)return this.$sendResponse(t,n,new l.NotFound,o,{},e);for(const d of this.$plugins.values())d.onRequestReceived(n);const c={headers:{},code:void 0};for(const d of this.$middlewares.values()){const r=await d(n,s,c);if(r!==void 0){const a=await this.$formatResponse(r);if(a instanceof M.default)c.headers={...c.headers,...a.headers.link},c.code=a.code;else return this.$sendResponse(t,n,a,o,{},e)}}const i=this.$root.__$pathfinder.lookup(n.method,n.path);if(i){const d=await this.$executeHandler(i.handler,n.createClientRequest(i.params)),r=await this.$formatResponse(d);return this.$sendResponse(t,n,r,o,c,e)}this.$sendResponse(t,n,new l.NotFound,o,c,e)}}exports.default=p;