insite-http 2.4.2 → 2.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -105,7 +105,7 @@ Options: src, root, path, extensions, resolved, restricted, preloaded
105
105
 
106
106
  ### TemplateMiddleware
107
107
 
108
- Options: path, globals, title, css, rootId
108
+ Options: path, globals, title, css, rootId, lang (default `en`), head
109
109
 
110
110
  ## SSL / HTTPS
111
111
 
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  var m=class{priority=0;listeners};var Re=void 0;import R from"node:fs";import c from"node:path";import u from"node:zlib";var Y={params:{[u.constants.BROTLI_PARAM_MODE]:u.constants.BROTLI_MODE_TEXT,[u.constants.BROTLI_PARAM_QUALITY]:11}},w={params:{[u.constants.BROTLI_PARAM_MODE]:u.constants.BROTLI_MODE_TEXT,[u.constants.BROTLI_PARAM_QUALITY]:4}},X={level:9},M={level:3};function v(s){return u.brotliCompressSync(s,Y)}function H(s){return u.gzipSync(s,X)}function L(s){return s==="br"?u.createBrotliCompress(w):u.createGzip(M)}function q(s,e,r,t){let n=/\bbr\b/.test(s.headers["accept-encoding"]);r["Content-Encoding"]=n?"br":"gzip",e.writeHead(200,r).end(n?u.brotliCompressSync(t,w):u.gzipSync(t,M))}var B=[["js",{isText:!0,mimeType:"text/javascript"}],["css",{isText:!0,mimeType:"text/css"}],["ico",{mimeType:"image/x-icon"}],process.env.NODE_ENV==="development"?["css.map",{isText:!0,mimeType:"application/json"}]:null,process.env.NODE_ENV==="development"?["js.map",{isText:!0,mimeType:"application/json"}]:null,["jpg",{mimeType:"image/jpeg"}],["jpeg",{mimeType:"image/jpeg"}],["png",{mimeType:"image/png"}],["svg",{isText:!0,mimeType:"image/svg+xml"}]].filter(Boolean);var A=[...process.env.NODE_ENV==="production"?["/index.js","/favicon.ico"]:[]];var{INSITE_STATIC_ROOT:Z=""}=process.env,ee={mimeType:"application/octet-stream"},x=class extends m{constructor({src:e="public",root:r=Z,path:t,extensions:n=B,resolved:i,restricted:o,preloaded:p="default"}={}){if(super(),!c.isAbsolute(e)){let[,a]=process.argv;e=c.resolve(R.statSync(a).isDirectory()?a:c.dirname(a),e)}if(this.#e=e,this.#s=new RegExp(`^${c.join("/",r,"/")}`),n)for(let a of n)a&&this.#a(...a);if(i)for(let a of i)a&&this.#p(...a);if(o)for(let a of o)a&&this.#d(a);if(p){p==="default"&&(p=A);for(let a of p)a&&this.#u(a)}this.listeners={GET:[[t??new RegExp(String.raw`^${c.join("/",r,"/")}(\w[^\/]*/)*[^\/]+\.[^\/]`),this.#l]]}}priority=-900;#e;#s;#t=new Map;#r=new Map;#n=new Set;#i=new Map;#o(e){return this.#t.get(e.slice(Math.max(0,e.lastIndexOf(".")+1)))??ee}#a(e,r){this.#t.set(e,{...r,name:e})}#p(e,r){this.#r.set(e,c.isAbsolute(r)?r:c.join(this.#e,r))}#d(e){this.#n.add(c.join(this.#e,e))}#u(e){e=this.#r.get(e)??c.join(this.#e,e);try{let{isText:r}=this.#o(e),t=R.readFileSync(e,r?"utf8":null);this.#i.set(e,r?{br:v(t),gzip:H(t)}:t)}catch(r){console.warn(`\u26A0\uFE0F inSite Static Server: Unable to preload ${e}`,`
2
- `,r)}}#l=(e,r)=>{let t;try{t=decodeURI(e.url)}catch{return r.notFound()}if(t=t.replace(this.#s,"").replaceAll("../",""),t=this.#r.get(t)??c.join(this.#e,t),this.#n.has(t))return!1;if(!R.existsSync(t))return r.notFound();let{mimeType:n,isText:i}=this.#o(t),o=i?/\bbr\b/.test(e.headers["accept-encoding"])?"br":"gzip":null;r.writeHead(200,{"Content-Type":n+(i?"; charset=utf-8":""),...o&&{"Content-Encoding":o}});let p=this.#i.get(t);return p?r.end(i&&o?p[o]:p):new Promise(a=>{let d=R.createReadStream(t).on("error",()=>a(!1));o&&(d=d.pipe(L(o))),d.on("end",a),d.pipe(r)})}};import{isEmpty as te}from"@nesvet/n";var{INSITE_STATIC_ROOT:T="",INSITE_TITLE:re}=process.env,I={};for(let s in process.env)s.startsWith("INSITE_CLIENT_")&&(I[s.replace(/INSITE_CLIENT_/,"").toLowerCase()]=process.env[s]);var se={"Content-Type":"text/html; charset=utf-8"};function h(s){return s.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll('"',"&quot;")}function ne(s){return s.startsWith("http://")||s.startsWith("https://")?s:s.startsWith("/")?`${T}${s}`:s}function ie(s){let e=(s.links??[]).map(t=>{let n=[`rel="${h(t.rel)}"`,`href="${h(ne(t.href))}"`];return t.type&&n.push(`type="${h(t.type)}"`),t.sizes&&n.push(`sizes="${h(t.sizes)}"`),`<link ${n.join(" ")}>`}),r=(s.meta??[]).map(t=>{let n=[];return t.name&&n.push(`name="${h(t.name)}"`),t.property&&n.push(`property="${h(t.property)}"`),n.push(`content="${h(t.content)}"`),`<meta ${n.join(" ")} />`});return[...e,...r].join("")}var C=class extends m{constructor({path:e=/.*/,globals:r={},title:t=re??"inSite",css:n=[],rootId:i="root",head:o={}}={}){super(),this.listeners={GET:[[e,this.#n]]},this.#e=t,this.#s=Array.isArray(n)?n:[n],this.#t=i,Object.assign(r,I),this.#r=`<!DOCTYPE html><html lang="ru"><head><meta charset="utf-8" /><meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width" /><title>${this.#e}</title><link rel="icon" type="image/x-icon" href="${T}/favicon.ico">`+ie(o)+`${this.#s.map(p=>`<link rel="stylesheet" href="${T}/${p}" />`).join("")}${te(r)?"":`<script>globalThis.__insite=${JSON.stringify(r)};</script>`}<script type="text/javascript" src="${T}/index.js" defer></script></head><body><div id="${this.#t}"></div></body></html>`}priority=-1e3;#e;#s;#t;#r;#n=(e,r)=>q(e,r,se,this.#r)};import{createServer as ye,resolveSSL as fe,showServerListeningMessage as J}from"insite-common/backend";import{IncomingMessage as pe}from"node:http";import de from"node:querystring";import{getRemoteAddress as ue}from"insite-common/backend";var f=Symbol("server"),g=Symbol("request"),y=Symbol("match");var oe=/\/(?:(\*)|:([^/?]+)(\?(.*))?)/g;function $(s,e=0){return s.replaceAll(oe,(r,t,n,i,o)=>{if(t)return`/(?<__${e++}>.*?)`;let p=`/(?<${n}>[^/]+)`;return i?`(?:${p}${o?$(o,e):""})?`:p})}function j(s){return new RegExp(`^${s.startsWith("/")?"":"/"}${$(s)}/?$`)}var ae=/^__/;function _(s){let e=s[y];if(e){delete s[y];let r=[void 0,...e.slice(1)];if(e.groups)for(let[t,n]of Object.entries(e.groups))r[t.replace(ae,"")]=n;return r}return[]}function k({querystring:s}){return s?.split("&").reduce((e,r)=>{let[t,n]=r.split("=");try{e[t]=decodeURIComponent(n||"")}catch{e[t]=""}return e},{})??{}}function N({headers:{authorization:s}}){return s?.indexOf("Bearer ")===0?s.slice(7):null}function U(s,e){let r=e.exec(s.path);return r?(s[y]=r,!0):!1}var P=class{constructor(e){this.#e=e}#e;stream(){return this.#e}#s;text(){return new Promise((e,r)=>{if(this.#s)e(this.#s);else{let t="";this.#e.on("data",n=>{t+=n}),this.#e.on("end",()=>{e(this.#s=t)}),this.#e.on("error",r)}})}#t;async bytes(){return this.#t??=new TextEncoder().encode(await this.text()),this.#t}async arrayBuffer(){return(await this.bytes()).buffer}#r;async json(){return this.#r??=JSON.parse(await this.text()||"null"),this.#r}#n;async urlEncoded(){return this.#n=de.parse(await this.text()),this.#n}},b=class extends pe{path;querystring;#e;get ip(){return this.#e??=ue(this)}[y];#s;get params(){return this.#s??=_(this)}#t;get query(){return this.#t??=k(this)}#r;get bearer(){return this.#r??=N(this)}#n;get body(){return this.#n??=new P(this)}};import{ServerResponse as le}from"node:http";import{Readable as ce}from"node:stream";import{cleanup as me}from"@nesvet/n";var S=class extends le{[f];[g];status(e){return this.statusCode=e,this}set(e,r){if(typeof e=="string")return this.setHeader(e,r);for(let t in e)this.setHeader(t,e[t]);return this}header=this.set;text(e,r=200){return this.writeHead(r,{"Content-Type":"text/plain; charset=utf-8","Content-Length":Buffer.byteLength(e)}).end(e)}json(e,r=200){let t=JSON.stringify(e)??"{}";return this.writeHead(r,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(t)}).end(t)}urlEncoded(e,r=200){let t=new URLSearchParams(e).toString();return this.writeHead(r,{"Content-Type":"application/x-www-form-urlencoded; charset=utf-8","Content-Length":Buffer.byteLength(t)}).end(t)}stream(e,r,t=200){return typeof r=="number"&&(t=r,r=void 0),this.writeHead(t,r),e.pipe(this)}give(e,r,t=200){return typeof r=="number"&&(t=r,r=void 0),typeof e=="string"?this.text(e,t):e instanceof ce?this.stream(e,r,t):this.json(e,t)}error(e,r,{headers:t,handler:n}={}){return this[f]._throw(this,me({statusCode:e,headers:t,body:r,handler:n}))}badRequest(e){return this.error(400,e)}unauthorized(e){return this.error(401,e)}forbidden(e){return this.error(403,e)}notFound(e){return this.error(404,e)}requestTimeout(e){return this.error(408,e)}gone(e){return this.error(410,e)}internalServerError(e){return this.error(500,e)}serviceUnavailable(e){return this.error(503,e)}};var he=["DELETE","GET","PATCH","POST","PUT"];function E(s){return he.includes(s)||s==="ALL"}function G(s){return Array.isArray(s)}function z(s){return!Array.isArray(s)}function D(s,e){return!!(s&&e[s])}function Q(s){return!!s&&"emit"in s}var O=class s{constructor({icon:e="\u{1F578}\uFE0F ",name:r="HTTP",port:t,ssl:n,listeners:i,errors:o,server:p},a=[]){if(this.icon=e,this.name=r,Q(p)?(this.server=p,new Promise(d=>{p.listening?d():p.on("listening",d)}).then(()=>J(this))):(this.server=ye(s.makeProps({ssl:n,server:p})),this.server.listen(typeof t=="string"?Number.parseInt(t):t??(this.isS?443:80),()=>J(this))),i)for(let[d,l]of Object.entries(i))for(let[W,K,V]of l)this.addRequestListener(d,W,K,V);if(o)for(let d of Object.keys(o)){let l=Number.parseInt(d);l&&(this.#t[l]?Object.assign(this.#t[l],o[l]):this.#t[l]=o[l])}if(a)for(let d of a)d&&this.addMiddleware(d);this.server.on("request",this.#s)}icon;name;get protocol(){return`http${this.isS?"s":""}`}server;get isS(){return"setSecureContext"in this.server}#e={POST:[],GET:[],PUT:[],PATCH:[],DELETE:[]};#s=async(e,r)=>{if([e.path,e.querystring]=e.url.split("?",2),r[f]=this,r[g]=e,!("status"in e)&&D(e.method,this.#e)){let t=this.#e[e.method],n=0,i=async()=>{for(;n<t.length;){let o=t[n++];if(U(e,o[0]))return await o[1](e,r,i)}};return await i()}r.notFound()};#t={401:{statusCode:401,body:"Unauthorized"},403:{statusCode:403,body:"Forbidden"},404:{statusCode:404,body:"Not Found"},408:{statusCode:408,body:"Request Timeout"},410:{statusCode:410,body:"Gone"},500:{statusCode:500,body:"Internal Server Error"},503:{statusCode:503,body:"Service Unavailable"},default:{statusCode:400,body:"Bad Request",handler(e,r,{statusCode:t,headers:n,body:i}){return r.give(i,n,t)}}};_throw(e,{statusCode:r,...t}){let{handler:n,...i}={...this.#t.default,...this.#t[r],...t};return n(e[g],e,i)}#r(e,r){let t=e.source.replace(/\\\/\??\$?$/,""),n=0,i=0;for(let o=0,{length:p}=t;o<p;o++)switch(t[o]){case"/":n++;break;case"*":i++;break}return r*1e3+(n*10-i)}addRequestListener(e,r,t,n=0){if(typeof r=="string"&&(r=j(r)),e&&e!=="ALL"){let i=this.#e[e];if(i){let o=[r,t,n],p=this.#r(r,n);for(let a=0;a<i.length;a++){let[d,,l]=i[a];if(p>this.#r(d,l)){i.splice(a,0,o);break}}i.includes(o)||i.push(o)}}else for(let i of Object.keys(this.#e))this.addRequestListener(i,r,t,n);return this}addMiddleware(e,r){if(e instanceof m){for(let[t,n]of Object.entries(e.listeners))for(let[i,o,p]of n)this.addRequestListener(t,i,o,p??r??e.priority);e.bindTo?.(this)}else if(G(e)){z(e)&&(e=[e]);for(let t of e)this.addRequestListener(...E(t[0])?t:["GET",...t])}else this.#n(e);return this}#n(e,r="GET",t=""){for(let[n,i]of Object.entries(e))typeof i=="function"?E(n)?this.addRequestListener(n,t,i):this.addRequestListener(r,`${t}${n}`,i):E(n)?this.#n(i,n,t):this.#n(i,r,`${t}${n}`)}post(e,r,t){return this.addRequestListener("POST",e,r,t),this}get(e,r,t){return this.addRequestListener("GET",e,r,t),this}put(e,r,t){return this.addRequestListener("PUT",e,r,t),this}patch(e,r,t){return this.addRequestListener("PATCH",e,r,t),this}delete(e,r,t){return this.addRequestListener("DELETE",e,r,t),this}static makeProps({ssl:e,server:r}){return{...fe(e),IncomingMessage:b,ServerResponse:S,...r}}};var F=class extends O{constructor(e,r,t=[]){super(r,[new x(e),...t])}name="Static";icon="\u{1F6D2}"};export{m as ClassMiddleware,O as HTTPServer,Re as InitialsMiddleware,x as StaticMiddleware,F as StaticServer,C as TemplateMiddleware};
2
+ `,r)}}#l=(e,r)=>{let t;try{t=decodeURI(e.url)}catch{return r.notFound()}if(t=t.replace(this.#s,"").replaceAll("../",""),t=this.#r.get(t)??c.join(this.#e,t),this.#n.has(t))return!1;if(!R.existsSync(t))return r.notFound();let{mimeType:n,isText:i}=this.#o(t),o=i?/\bbr\b/.test(e.headers["accept-encoding"])?"br":"gzip":null;r.writeHead(200,{"Content-Type":n+(i?"; charset=utf-8":""),...o&&{"Content-Encoding":o}});let p=this.#i.get(t);return p?r.end(i&&o?p[o]:p):new Promise(a=>{let d=R.createReadStream(t).on("error",()=>a(!1));o&&(d=d.pipe(L(o))),d.on("end",a),d.pipe(r)})}};import{isEmpty as te}from"@nesvet/n";var{INSITE_STATIC_ROOT:T="",INSITE_TITLE:re}=process.env,I={};for(let s in process.env)s.startsWith("INSITE_CLIENT_")&&(I[s.replace(/INSITE_CLIENT_/,"").toLowerCase()]=process.env[s]);var se={"Content-Type":"text/html; charset=utf-8"};function h(s){return s.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll('"',"&quot;")}function ne(s){return s.startsWith("http://")||s.startsWith("https://")?s:s.startsWith("/")?`${T}${s}`:s}function ie(s){let e=(s.links??[]).map(t=>{let n=[`rel="${h(t.rel)}"`,`href="${h(ne(t.href))}"`];return t.type&&n.push(`type="${h(t.type)}"`),t.sizes&&n.push(`sizes="${h(t.sizes)}"`),`<link ${n.join(" ")}>`}),r=(s.meta??[]).map(t=>{let n=[];return t.name&&n.push(`name="${h(t.name)}"`),t.property&&n.push(`property="${h(t.property)}"`),n.push(`content="${h(t.content)}"`),`<meta ${n.join(" ")} />`});return[...e,...r].join("")}var C=class extends m{constructor({path:e=/.*/,globals:r={},title:t=re??"inSite",css:n=[],rootId:i="root",lang:o="en",head:p={}}={}){super(),this.listeners={GET:[[e,this.#n]]},this.#e=t,this.#s=Array.isArray(n)?n:[n],this.#t=i,Object.assign(r,I),this.#r=`<!DOCTYPE html><html lang="${h(o)}"><head><meta charset="utf-8" /><meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width" /><title>${this.#e}</title><link rel="icon" type="image/x-icon" href="${T}/favicon.ico">`+ie(p)+`${this.#s.map(a=>`<link rel="stylesheet" href="${T}/${a}" />`).join("")}${te(r)?"":`<script>globalThis.__insite=${JSON.stringify(r)};</script>`}<script type="text/javascript" src="${T}/index.js" defer></script></head><body><div id="${this.#t}"></div></body></html>`}priority=-1e3;#e;#s;#t;#r;#n=(e,r)=>q(e,r,se,this.#r)};import{createServer as ye,resolveSSL as fe,showServerListeningMessage as J}from"insite-common/backend";import{IncomingMessage as pe}from"node:http";import de from"node:querystring";import{getRemoteAddress as ue}from"insite-common/backend";var f=Symbol("server"),g=Symbol("request"),y=Symbol("match");var oe=/\/(?:(\*)|:([^/?]+)(\?(.*))?)/g;function $(s,e=0){return s.replaceAll(oe,(r,t,n,i,o)=>{if(t)return`/(?<__${e++}>.*?)`;let p=`/(?<${n}>[^/]+)`;return i?`(?:${p}${o?$(o,e):""})?`:p})}function j(s){return new RegExp(`^${s.startsWith("/")?"":"/"}${$(s)}/?$`)}var ae=/^__/;function _(s){let e=s[y];if(e){delete s[y];let r=[void 0,...e.slice(1)];if(e.groups)for(let[t,n]of Object.entries(e.groups))r[t.replace(ae,"")]=n;return r}return[]}function k({querystring:s}){return s?.split("&").reduce((e,r)=>{let[t,n]=r.split("=");try{e[t]=decodeURIComponent(n||"")}catch{e[t]=""}return e},{})??{}}function N({headers:{authorization:s}}){return s?.indexOf("Bearer ")===0?s.slice(7):null}function U(s,e){let r=e.exec(s.path);return r?(s[y]=r,!0):!1}var P=class{constructor(e){this.#e=e}#e;stream(){return this.#e}#s;text(){return new Promise((e,r)=>{if(this.#s)e(this.#s);else{let t="";this.#e.on("data",n=>{t+=n}),this.#e.on("end",()=>{e(this.#s=t)}),this.#e.on("error",r)}})}#t;async bytes(){return this.#t??=new TextEncoder().encode(await this.text()),this.#t}async arrayBuffer(){return(await this.bytes()).buffer}#r;async json(){return this.#r??=JSON.parse(await this.text()||"null"),this.#r}#n;async urlEncoded(){return this.#n=de.parse(await this.text()),this.#n}},b=class extends pe{path;querystring;#e;get ip(){return this.#e??=ue(this)}[y];#s;get params(){return this.#s??=_(this)}#t;get query(){return this.#t??=k(this)}#r;get bearer(){return this.#r??=N(this)}#n;get body(){return this.#n??=new P(this)}};import{ServerResponse as le}from"node:http";import{Readable as ce}from"node:stream";import{cleanup as me}from"@nesvet/n";var S=class extends le{[f];[g];status(e){return this.statusCode=e,this}set(e,r){if(typeof e=="string")return this.setHeader(e,r);for(let t in e)this.setHeader(t,e[t]);return this}header=this.set;text(e,r=200){return this.writeHead(r,{"Content-Type":"text/plain; charset=utf-8","Content-Length":Buffer.byteLength(e)}).end(e)}json(e,r=200){let t=JSON.stringify(e)??"{}";return this.writeHead(r,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(t)}).end(t)}urlEncoded(e,r=200){let t=new URLSearchParams(e).toString();return this.writeHead(r,{"Content-Type":"application/x-www-form-urlencoded; charset=utf-8","Content-Length":Buffer.byteLength(t)}).end(t)}stream(e,r,t=200){return typeof r=="number"&&(t=r,r=void 0),this.writeHead(t,r),e.pipe(this)}give(e,r,t=200){return typeof r=="number"&&(t=r,r=void 0),typeof e=="string"?this.text(e,t):e instanceof ce?this.stream(e,r,t):this.json(e,t)}error(e,r,{headers:t,handler:n}={}){return this[f]._throw(this,me({statusCode:e,headers:t,body:r,handler:n}))}badRequest(e){return this.error(400,e)}unauthorized(e){return this.error(401,e)}forbidden(e){return this.error(403,e)}notFound(e){return this.error(404,e)}requestTimeout(e){return this.error(408,e)}gone(e){return this.error(410,e)}internalServerError(e){return this.error(500,e)}serviceUnavailable(e){return this.error(503,e)}};var he=["DELETE","GET","PATCH","POST","PUT"];function E(s){return he.includes(s)||s==="ALL"}function G(s){return Array.isArray(s)}function z(s){return!Array.isArray(s)}function D(s,e){return!!(s&&e[s])}function Q(s){return!!s&&"emit"in s}var O=class s{constructor({icon:e="\u{1F578}\uFE0F ",name:r="HTTP",port:t,ssl:n,listeners:i,errors:o,server:p},a=[]){if(this.icon=e,this.name=r,Q(p)?(this.server=p,new Promise(d=>{p.listening?d():p.on("listening",d)}).then(()=>J(this))):(this.server=ye(s.makeProps({ssl:n,server:p})),this.server.listen(typeof t=="string"?Number.parseInt(t):t??(this.isS?443:80),()=>J(this))),i)for(let[d,l]of Object.entries(i))for(let[W,K,V]of l)this.addRequestListener(d,W,K,V);if(o)for(let d of Object.keys(o)){let l=Number.parseInt(d);l&&(this.#t[l]?Object.assign(this.#t[l],o[l]):this.#t[l]=o[l])}if(a)for(let d of a)d&&this.addMiddleware(d);this.server.on("request",this.#s)}icon;name;get protocol(){return`http${this.isS?"s":""}`}server;get isS(){return"setSecureContext"in this.server}#e={POST:[],GET:[],PUT:[],PATCH:[],DELETE:[]};#s=async(e,r)=>{if([e.path,e.querystring]=e.url.split("?",2),r[f]=this,r[g]=e,!("status"in e)&&D(e.method,this.#e)){let t=this.#e[e.method],n=0,i=async()=>{for(;n<t.length;){let o=t[n++];if(U(e,o[0]))return await o[1](e,r,i)}};return await i()}r.notFound()};#t={401:{statusCode:401,body:"Unauthorized"},403:{statusCode:403,body:"Forbidden"},404:{statusCode:404,body:"Not Found"},408:{statusCode:408,body:"Request Timeout"},410:{statusCode:410,body:"Gone"},500:{statusCode:500,body:"Internal Server Error"},503:{statusCode:503,body:"Service Unavailable"},default:{statusCode:400,body:"Bad Request",handler(e,r,{statusCode:t,headers:n,body:i}){return r.give(i,n,t)}}};_throw(e,{statusCode:r,...t}){let{handler:n,...i}={...this.#t.default,...this.#t[r],...t};return n(e[g],e,i)}#r(e,r){let t=e.source.replace(/\\\/\??\$?$/,""),n=0,i=0;for(let o=0,{length:p}=t;o<p;o++)switch(t[o]){case"/":n++;break;case"*":i++;break}return r*1e3+(n*10-i)}addRequestListener(e,r,t,n=0){if(typeof r=="string"&&(r=j(r)),e&&e!=="ALL"){let i=this.#e[e];if(i){let o=[r,t,n],p=this.#r(r,n);for(let a=0;a<i.length;a++){let[d,,l]=i[a];if(p>this.#r(d,l)){i.splice(a,0,o);break}}i.includes(o)||i.push(o)}}else for(let i of Object.keys(this.#e))this.addRequestListener(i,r,t,n);return this}addMiddleware(e,r){if(e instanceof m){for(let[t,n]of Object.entries(e.listeners))for(let[i,o,p]of n)this.addRequestListener(t,i,o,p??r??e.priority);e.bindTo?.(this)}else if(G(e)){z(e)&&(e=[e]);for(let t of e)this.addRequestListener(...E(t[0])?t:["GET",...t])}else this.#n(e);return this}#n(e,r="GET",t=""){for(let[n,i]of Object.entries(e))typeof i=="function"?E(n)?this.addRequestListener(n,t,i):this.addRequestListener(r,`${t}${n}`,i):E(n)?this.#n(i,n,t):this.#n(i,r,`${t}${n}`)}post(e,r,t){return this.addRequestListener("POST",e,r,t),this}get(e,r,t){return this.addRequestListener("GET",e,r,t),this}put(e,r,t){return this.addRequestListener("PUT",e,r,t),this}patch(e,r,t){return this.addRequestListener("PATCH",e,r,t),this}delete(e,r,t){return this.addRequestListener("DELETE",e,r,t),this}static makeProps({ssl:e,server:r}){return{...fe(e),IncomingMessage:b,ServerResponse:S,...r}}};var F=class extends O{constructor(e,r,t=[]){super(r,[new x(e),...t])}name="Static";icon="\u{1F6D2}"};export{m as ClassMiddleware,O as HTTPServer,Re as InitialsMiddleware,x as StaticMiddleware,F as StaticServer,C as TemplateMiddleware};
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/Middleware.ts", "../src/middlewares/Initials.ts", "../src/middlewares/Static/Static.ts", "../src/compression.ts", "../src/middlewares/Static/extensions.ts", "../src/middlewares/Static/preloaded.ts", "../src/middlewares/Template.ts", "../src/Server.ts", "../src/Request.ts", "../src/symbols.ts", "../src/utils.ts", "../src/Response.ts", "../src/types.ts", "../src/StaticServer.ts"],
4
- "sourcesContent": ["import { HTTPServer } from \"./Server\";\nimport type {\n\tHandler,\n\tMethod,\n\tPriority,\n\tRegExpOrString\n} from \"./types\";\n\n\nexport class ClassMiddleware {\n\tpriority: Priority = 0;\n\tlisteners!: Partial<Record<Method, [ RegExpOrString, Handler, Priority? ][]>>;\n\tbindTo?(server: HTTPServer): void;\n}\n", "//#if _SERVER && _SSR\n// import { initialsMap } from \"@insite/subscriptions\";\n// import { handleRequestCompressed } from \"../compression\";\n// import { Middleware } from \"../Middleware\";\n\n\n// const headers = { \"Content-Type\": \"text/javascript; charset=utf-8\" };\n\n\n// export class InitialsMiddleware extends Middleware {\n// \tconstructor(options = {}) {\n// \t\tsuper();\n// \t\tconst {\n// \t\t\tpath = \"/initials\"\n// \t\t} = options;\n\n// \t\tthis.listeners = {\n// \t\t\tGET: [ [ path, this.handler ] ]\n// \t\t};\n\n// \t}\n\n// \thandler = (request, response) => {\n// \t\tconst initials = initialsMap.getWithTimeout(request.url.split(\"?\")[1]);\n\n// \t\tif (initials)\n// \t\t\thandleRequestCompressed(request, response, headers, `window.__initials = [${initials.join()}];\\ndocument.currentScript.remove();`);\n// \t\telse\n// \t\t\treturn false;\n// \t};\n\n// }\n\n\n//#else\nexport const InitialsMiddleware = undefined;\n\n\n//#endif\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { brotliPreloadSync, getCompressionStreamByEncoding, gzipPreloadSync } from \"../../compression\";\nimport { ClassMiddleware } from \"../../Middleware\";\nimport type { Handler } from \"../../types\";\nimport { defaultExtensions } from \"./extensions\";\nimport { defaultPreloaded } from \"./preloaded\";\nimport type { Extension, Options } from \"./types\";\n\n\nconst { INSITE_STATIC_ROOT = \"\" } = process.env;\n\nconst nullExtension = {\n\tmimeType: \"application/octet-stream\"\n};\n\n\nexport class StaticMiddleware extends ClassMiddleware {\n\tconstructor({\n\t\tsrc = \"public\",\n\t\troot = INSITE_STATIC_ROOT,\n\t\tpath: _path,\n\t\textensions = defaultExtensions,\n\t\tresolved,\n\t\trestricted,\n\t\tpreloaded = \"default\"\n\t}: Options = {}) {\n\t\tsuper();\n\t\t\n\t\tif (!path.isAbsolute(src)) {\n\t\t\tconst [ , entryPoint ] = process.argv;\n\t\t\tsrc = path.resolve(fs.statSync(entryPoint).isDirectory() ? entryPoint : path.dirname(entryPoint), src);\n\t\t}\n\t\t\n\t\tthis.#src = src;\n\t\tthis.#rootRegExp = new RegExp(`^${path.join(\"/\", root, \"/\")}`);\n\t\t\n\t\tif (extensions)\n\t\t\tfor (const extension of extensions)\n\t\t\t\tif (extension)\n\t\t\t\t\tthis.#addExtension(...extension);\n\t\t\n\t\tif (resolved)\n\t\t\tfor (const resolvee of resolved)\n\t\t\t\tif (resolvee)\n\t\t\t\t\tthis.#resolve(...resolvee);\n\t\t\n\t\tif (restricted)\n\t\t\tfor (const fileName of restricted)\n\t\t\t\tif (fileName)\n\t\t\t\t\tthis.#restrict(fileName);\n\t\t\n\t\tif (preloaded) {\n\t\t\tif (preloaded === \"default\")\n\t\t\t\tpreloaded = defaultPreloaded;\n\t\t\t\n\t\t\tfor (const fileName of preloaded)\n\t\t\t\tif (fileName)\n\t\t\t\t\tthis.#preload(fileName);\n\t\t}\n\t\t\n\t\tthis.listeners = {\n\t\t\tGET: [ [ _path ?? new RegExp(String.raw`^${path.join(\"/\", root, \"/\")}(\\w[^\\/]*/)*[^\\/]+\\.[^\\/]`), this.#handler ] ]\n\t\t};\n\t\t\n\t}\n\t\n\tpriority = -900;\n\t\n\t#src;\n\t#rootRegExp;\n\t\n\t#extensions = new Map();\n\t\n\t#resolved = new Map();\n\t\n\t#restricted = new Set();\n\t\n\t#preloaded = new Map();\n\t\n\t#getExtensionBy(fileName: string) {\n\t\treturn this.#extensions.get(fileName.slice(Math.max(0, fileName.lastIndexOf(\".\") + 1))) ?? nullExtension;\n\t}\n\t\n\t#addExtension(name: string, extension: Extension[1]) {\n\t\tthis.#extensions.set(name, { ...extension, name });\n\t\t\n\t}\n\t\n\t#resolve(url: string, fileName: string) {\n\t\tthis.#resolved.set(url, path.isAbsolute(fileName) ? fileName : path.join(this.#src, fileName));\n\t\t\n\t}\n\t\n\t#restrict(fileName: string) {\n\t\tthis.#restricted.add(path.join(this.#src, fileName));\n\t\t\n\t}\n\t\n\t#preload(fileName: string) {\n\t\tfileName = this.#resolved.get(fileName) ?? path.join(this.#src, fileName);\n\t\t\n\t\ttry {\n\t\t\tconst { isText } = this.#getExtensionBy(fileName);\n\t\t\tconst fileData = fs.readFileSync(fileName, isText ? \"utf8\" : null);\n\t\t\tthis.#preloaded.set(fileName, isText ? {\n\t\t\t\tbr: brotliPreloadSync(fileData),\n\t\t\t\tgzip: gzipPreloadSync(fileData)\n\t\t\t} : fileData);\n\t\t} catch (error) {\n\t\t\tconsole.warn(`\u26A0\uFE0F inSite Static Server: Unable to preload ${fileName}`, \"\\n\", error);\n\t\t}\n\t\t\n\t}\n\t\n\t#handler: Handler = (request, response) => {\n\t\t\n\t\tlet fileName;\n\t\t\n\t\ttry {\n\t\t\tfileName = decodeURI(request.url);\n\t\t} catch {\n\t\t\treturn response.notFound();\n\t\t}\n\t\t\n\t\tfileName = fileName.replace(this.#rootRegExp, \"\").replaceAll(\"../\", \"\");\n\t\t\n\t\tfileName = this.#resolved.get(fileName) ?? path.join(this.#src, fileName);\n\t\t\n\t\tif (this.#restricted.has(fileName))\n\t\t\treturn false;\n\t\t\n\t\tif (!fs.existsSync(fileName))\n\t\t\treturn response.notFound();\n\t\t\n\t\tconst { mimeType, isText } = this.#getExtensionBy(fileName);\n\t\tconst contentEncoding = isText ? /\\bbr\\b/.test(request.headers[\"accept-encoding\"] as string) ? \"br\" : \"gzip\" : null;\n\t\t\n\t\tresponse.writeHead(200, {\n\t\t\t\"Content-Type\": mimeType + (isText ? \"; charset=utf-8\" : \"\"),\n\t\t\t...contentEncoding && { \"Content-Encoding\": contentEncoding }\n\t\t});\n\t\t\n\t\tconst preloaded = this.#preloaded.get(fileName);\n\t\t\n\t\tif (preloaded)\n\t\t\treturn response.end(isText && contentEncoding ? preloaded[contentEncoding] : preloaded);\n\t\t\n\t\treturn new Promise(resolve => {\n\t\t\tlet stream: Readable = fs.createReadStream(fileName).on(\"error\", () => resolve(false));\n\t\t\t\n\t\t\tif (contentEncoding)\n\t\t\t\tstream = stream.pipe(getCompressionStreamByEncoding(contentEncoding));\n\t\t\t\n\t\t\tstream.on(\"end\", resolve);\n\t\t\t\n\t\t\tstream.pipe(response);\n\t\t\t\n\t\t});\n\t};\n\t\n}\n", "import zlib, { type InputType } from \"node:zlib\";\nimport type { OutgoingHttpHeaders } from \"node:http\";\nimport type { Request } from \"./Request\";\nimport type { Response } from \"./Response\";\n\n\nconst brotliPreloadOptions = {\n\tparams: {\n\t\t[zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n\t\t[zlib.constants.BROTLI_PARAM_QUALITY]: 11\n\t}\n};\n\nconst brotliRuntimeOptions = {\n\tparams: {\n\t\t[zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n\t\t[zlib.constants.BROTLI_PARAM_QUALITY]: 4\n\t}\n};\n\nconst gzipPreloadOptions = {\n\tlevel: 9\n};\n\nconst gzipRuntimeOptions = {\n\tlevel: 3\n};\n\n\nexport function brotliPreloadSync(data: InputType) {\n\treturn zlib.brotliCompressSync(data, brotliPreloadOptions);\n}\n\nexport function gzipPreloadSync(data: InputType) {\n\treturn zlib.gzipSync(data, gzipPreloadOptions);\n}\n\nexport function getCompressionStreamByEncoding(contentEncoding: \"br\" | \"gzip\") {\n\treturn contentEncoding === \"br\" ? zlib.createBrotliCompress(brotliRuntimeOptions) : zlib.createGzip(gzipRuntimeOptions);\n}\n\nexport function handleRequestCompressed(request: Request, response: Response, headers: OutgoingHttpHeaders, data: InputType) {\n\tconst isBrotliAccepted = /\\bbr\\b/.test(request.headers[\"accept-encoding\"] as string);\n\theaders[\"Content-Encoding\"] = isBrotliAccepted ? \"br\" : \"gzip\";\n\tresponse.writeHead(200, headers).end(isBrotliAccepted ? zlib.brotliCompressSync(data, brotliRuntimeOptions) : zlib.gzipSync(data, gzipRuntimeOptions));\n\t\n}\n", "import { Extension } from \"./types\";\n\n\nexport const defaultExtensions = [\n\t\n\t[ \"js\", {\n\t\tisText: true,\n\t\tmimeType: \"text/javascript\"\n\t} ],\n\t\n\t[ \"css\", {\n\t\tisText: true,\n\t\tmimeType: \"text/css\"\n\t} ],\n\t\n\t[ \"ico\", {\n\t\tmimeType: \"image/x-icon\"\n\t} ],\n\t\n\tprocess.env.NODE_ENV === \"development\" ? [ \"css.map\", {\n\t\tisText: true,\n\t\tmimeType: \"application/json\"\n\t} ] : null,\n\t\n\tprocess.env.NODE_ENV === \"development\" ? [ \"js.map\", {\n\t\tisText: true,\n\t\tmimeType: \"application/json\"\n\t} ] : null,\n\t\n\t[ \"jpg\", {\n\t\tmimeType: \"image/jpeg\"\n\t} ],\n\t\n\t[ \"jpeg\", {\n\t\tmimeType: \"image/jpeg\"\n\t} ],\n\t\n\t[ \"png\", {\n\t\tmimeType: \"image/png\"\n\t} ],\n\t\n\t[ \"svg\", {\n\t\tisText: true,\n\t\tmimeType: \"image/svg+xml\"\n\t} ]\n\t\n].filter(Boolean) as Extension[];\n", "export const defaultPreloaded = [\n\t...process.env.NODE_ENV === \"production\" ? [\n\t\t//#if _SSR\n\t\t// \"/index.css\",\n\t\t//#endif\n\t\t\"/index.js\",\n\t\t\"/favicon.ico\"\n\t] : []\n];\n", "import { isEmpty } from \"@nesvet/n\";\nimport { handleRequestCompressed } from \"../compression\";\nimport { ClassMiddleware } from \"../Middleware\";\nimport { Handler } from \"../types\";\n\n\nconst {\n\tINSITE_STATIC_ROOT = \"\",\n\tINSITE_TITLE\n} = process.env;\n\nconst envGlobals: Record<string, unknown> = {};\nfor (const key in process.env)\n\tif (key.startsWith(\"INSITE_CLIENT_\"))\n\t\tenvGlobals[key.replace(/INSITE_CLIENT_/, \"\").toLowerCase()] = process.env[key];\n\nconst headers = { \"Content-Type\": \"text/html; charset=utf-8\" };\n\n\ntype HeadLink = {\n\trel: string;\n\thref: string;\n\ttype?: string;\n\tsizes?: string;\n};\n\ntype HeadMeta = {\n\tname?: string;\n\tproperty?: string;\n\tcontent: string;\n};\n\ntype Options = {\n\tpath?: RegExp;\n\tglobals?: Record<string, unknown>;\n\ttitle?: string;\n\tcss?: string[] | string;\n\trootId?: string;\n\thead?: {\n\t\tlinks?: HeadLink[];\n\t\tmeta?: HeadMeta[];\n\t};\n};\n\nexport type { Options as TemplateMiddlewareOptions };\n\n\nfunction escapeAttribute(value: string) {\n\treturn value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\"\\\"\", \"&quot;\");\n}\n\nfunction resolveHref(href: string) {\n\tif (href.startsWith(\"http://\") || href.startsWith(\"https://\"))\n\t\treturn href;\n\t\n\tif (href.startsWith(\"/\"))\n\t\treturn `${INSITE_STATIC_ROOT}${href}`;\n\t\n\treturn href;\n}\n\nfunction renderHead(head: NonNullable<Options[\"head\"]>) {\n\tconst links = (head.links ?? []).map(link => {\n\t\tconst attributes = [\n\t\t\t`rel=\"${escapeAttribute(link.rel)}\"`,\n\t\t\t`href=\"${escapeAttribute(resolveHref(link.href))}\"`\n\t\t];\n\t\t\n\t\tif (link.type)\n\t\t\tattributes.push(`type=\"${escapeAttribute(link.type)}\"`);\n\t\t\n\t\tif (link.sizes)\n\t\t\tattributes.push(`sizes=\"${escapeAttribute(link.sizes)}\"`);\n\t\t\n\t\treturn `<link ${attributes.join(\" \")}>`;\n\t});\n\t\n\tconst meta = (head.meta ?? []).map(item => {\n\t\tconst attributes: string[] = [];\n\t\t\n\t\tif (item.name)\n\t\t\tattributes.push(`name=\"${escapeAttribute(item.name)}\"`);\n\t\t\n\t\tif (item.property)\n\t\t\tattributes.push(`property=\"${escapeAttribute(item.property)}\"`);\n\t\t\n\t\tattributes.push(`content=\"${escapeAttribute(item.content)}\"`);\n\t\t\n\t\treturn `<meta ${attributes.join(\" \")} />`;\n\t});\n\t\n\treturn [ ...links, ...meta ].join(\"\");\n}\n\n\nexport class TemplateMiddleware extends ClassMiddleware {\n\tconstructor({\n\t\tpath = /.*/,\n\t\tglobals = {},\n\t\ttitle = INSITE_TITLE ?? \"inSite\",\n\t\tcss = [],\n\t\trootId = \"root\",\n\t\thead = {}\n\t}: Options = {}) {\n\t\tsuper();\n\t\t\n\t\tthis.listeners = {\n\t\t\tGET: [ [ path, this.#handler ] ]\n\t\t};\n\t\t\n\t\tthis.#title = title;\n\t\tthis.#css = Array.isArray(css) ? css : [ css ];\n\t\tthis.#rootId = rootId;\n\t\t\n\t\tObject.assign(globals, envGlobals);\n\t\t\n\t\tthis.#html =\n\t\t\t\"<!DOCTYPE html>\" +\n\t\t\t\"<html lang=\\\"ru\\\">\" +\n\t\t\t\"<head>\" +\n\t\t\t\"<meta charset=\\\"utf-8\\\" />\" +\n\t\t\t\"<meta name=\\\"viewport\\\" content=\\\"minimum-scale=1, initial-scale=1, width=device-width\\\" />\" +\n\t\t\t`<title>${this.#title}</title>` +\n\t\t\t`<link rel=\"icon\" type=\"image/x-icon\" href=\"${INSITE_STATIC_ROOT}/favicon.ico\">` +\n\t\t\trenderHead(head) +\n\t\t\t`${this.#css.map(fileName => `<link rel=\"stylesheet\" href=\"${INSITE_STATIC_ROOT}/${fileName}\" />`).join(\"\")}` +\n\t\t\t`${isEmpty(globals) ? \"\" : `<script>globalThis.__insite=${JSON.stringify(globals)};</script>`}` +\n\t\t\t`<script type=\"text/javascript\" src=\"${INSITE_STATIC_ROOT}/index.js\" defer></script>` +\n\t\t\t\"</head>\" +\n\t\t\t\"<body>\" +\n\t\t\t`<div id=\"${this.#rootId}\">` +\n\t\t\t\"</div>\" +\n\t\t\t\"</body>\" +\n\t\t\t\"</html>\";\n\t\t\n\t}\n\t\n\tpriority = -1000;\n\t\n\t#title;\n\t#css;\n\t#rootId;\n\t#html;\n\t\n\t#handler: Handler = (request, response) =>\n\t\thandleRequestCompressed(request, response, headers, this.#html);\n\t\n}\n", "import type http from \"node:http\";\nimport type https from \"node:https\";\nimport { createServer, resolveSSL, showServerListeningMessage } from \"insite-common/backend\";\nimport { ClassMiddleware } from \"./Middleware\";\nimport { matches, Request } from \"./Request\";\nimport { Response } from \"./Response\";\nimport { requestSymbol, serverSymbol } from \"./symbols\";\nimport {\n\tisMethod,\n\tisRequestMethodAccepted,\n\tisServerServer,\n\tisTupleMiddleware,\n\tisTupleMiddlewareOrArray,\n\ttype ErrorParams,\n\ttype GenericMiddleware,\n\ttype Handler,\n\ttype Listener,\n\ttype Method,\n\ttype Middleware,\n\ttype Options,\n\ttype Priority,\n\ttype RegExpOrString,\n\ttype ResponseBody\n} from \"./types\";\nimport { pathToRegExp } from \"./utils\";\n\n\nexport class HTTPServer {\n\tconstructor({\n\t\ticon = \"\uD83D\uDD78\uFE0F \",\n\t\tname = \"HTTP\",\n\t\tport,\n\t\tssl,\n\t\tlisteners,\n\t\terrors,\n\t\tserver\n\t}: Options, middlewares: (GenericMiddleware | false | null | undefined)[] = []) {\n\t\t\n\t\tthis.icon = icon;\n\t\tthis.name = name;\n\t\t\n\t\tif (isServerServer(server)) {\n\t\t\tthis.server = server;\n\t\t\t\n\t\t\tvoid new Promise<void>(resolve => void (\n\t\t\t\tserver.listening ?\n\t\t\t\t\tresolve() :\n\t\t\t\t\tserver.on(\"listening\", resolve)\n\t\t\t)).then(() => showServerListeningMessage(this));\n\t\t\t\n\t\t} else {\n\t\t\tthis.server = createServer(HTTPServer.makeProps({ ssl, server }));\n\t\t\t\n\t\t\tthis.server.listen(\n\t\t\t\ttypeof port == \"string\" ?\n\t\t\t\t\tNumber.parseInt(port) :\n\t\t\t\t\tport ?? (this.isS ? 443 : 80),\n\t\t\t\t() => showServerListeningMessage(this)\n\t\t\t);\n\t\t}\n\t\t\n\t\tif (listeners)\n\t\t\tfor (const [ method, methodListeners ] of Object.entries(listeners) as [ Method | \"ALL\", Listener[] ][])\n\t\t\t\tfor (const [ regExp, handler, priority ] of methodListeners)\n\t\t\t\t\tthis.addRequestListener(method, regExp, handler, priority);\n\t\t\n\t\tif (errors)\n\t\t\tfor (const statusCodeString of Object.keys(errors)) {\n\t\t\t\tconst statusCode = Number.parseInt(statusCodeString);\n\t\t\t\tif (statusCode)\n\t\t\t\t\tif (this.#errors[statusCode])\n\t\t\t\t\t\tObject.assign(this.#errors[statusCode], errors[statusCode]);\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.#errors[statusCode] = errors[statusCode];\n\t\t\t}\n\t\t\n\t\tif (middlewares)\n\t\t\tfor (const middleware of middlewares)\n\t\t\t\tif (middleware)\n\t\t\t\t\tthis.addMiddleware(middleware);\n\t\t\n\t\tthis.server.on(\"request\", this.#requestListener);\n\t\t\n\t}\n\t\n\ticon;\n\tname;\n\tget protocol() {\n\t\treturn `http${this.isS ? \"s\" : \"\"}`;\n\t}\n\t\n\t/** Node.js http(s) server object */\n\tserver;\n\t\n\t/** Does the server use SSL */\n\tget isS() {\n\t\treturn \"setSecureContext\" in this.server;\n\t}\n\t\n\t#listeners: Record<Method, Listener[]> = {\n\t\tPOST: [],\n\t\tGET: [],\n\t\tPUT: [],\n\t\tPATCH: [],\n\t\tDELETE: []\n\t};\n\t\n\t#requestListener: Handler = async (request, response) => {\n\t\t\n\t\t([\n\t\t\trequest.path,\n\t\t\trequest.querystring\n\t\t] = request.url.split(\"?\", 2));\n\t\t\n\t\tresponse[serverSymbol] = this;\n\t\tresponse[requestSymbol] = request;\n\t\t\n\t\tif (!(\"status\" in request) && isRequestMethodAccepted(request.method, this.#listeners)) {\n\t\t\tconst stack = this.#listeners[request.method];\n\t\t\tlet i = 0;\n\t\t\t\n\t\t\tconst next = async () => {\n\t\t\t\t\n\t\t\t\twhile (i < stack.length) {\n\t\t\t\t\tconst listener = stack[i++];\n\t\t\t\t\t\n\t\t\t\t\tif (matches(request, listener[0]))\n\t\t\t\t\t\treturn await listener[1](request, response, next);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t};\n\t\t\t\n\t\t\treturn await next();\n\t\t}\n\t\t\n\t\tresponse.notFound();\n\t\t\n\t};\n\t\n\t#errors: Record<\"default\" | number, ErrorParams> = {\n\t\t401: {\n\t\t\tstatusCode: 401,\n\t\t\tbody: \"Unauthorized\"\n\t\t},\n\t\t403: {\n\t\t\tstatusCode: 403,\n\t\t\tbody: \"Forbidden\"\n\t\t},\n\t\t404: {\n\t\t\tstatusCode: 404,\n\t\t\tbody: \"Not Found\"\n\t\t},\n\t\t408: {\n\t\t\tstatusCode: 408,\n\t\t\tbody: \"Request Timeout\"\n\t\t},\n\t\t410: {\n\t\t\tstatusCode: 410,\n\t\t\tbody: \"Gone\"\n\t\t},\n\t\t500: {\n\t\t\tstatusCode: 500,\n\t\t\tbody: \"Internal Server Error\"\n\t\t},\n\t\t503: {\n\t\t\tstatusCode: 503,\n\t\t\tbody: \"Service Unavailable\"\n\t\t},\n\t\tdefault: {\n\t\t\tstatusCode: 400,\n\t\t\tbody: \"Bad Request\",\n\t\t\thandler(request, response, { statusCode, headers, body }) {\n\t\t\t\treturn response.give(body, headers, statusCode);\n\t\t\t}\n\t\t}\n\t};\n\t\n\t_throw(response: Response, { statusCode, ...restParams }: Omit<ErrorParams, \"body\"> & { body?: ResponseBody }) {\n\t\t\n\t\tconst {\n\t\t\thandler,\n\t\t\t...handlerParams\n\t\t} = {\n\t\t\t...this.#errors.default,\n\t\t\t...this.#errors[statusCode],\n\t\t\t...restParams\n\t\t};\n\t\t\n\t\treturn handler!(response[requestSymbol], response, handlerParams);\n\t}\n\t\n\t#getWeight(regExp: RegExp, priority: number) {\n\t\tconst source = regExp.source.replace(/\\\\\\/\\??\\$?$/, \"\");\n\t\t\n\t\tlet depth = 0;\n\t\tlet wildcards = 0;\n\t\t\n\t\tfor (let i = 0, { length } = source; i < length; i++)\n\t\t\tswitch (source[i]) {\n\t\t\t\tcase \"/\":\n\t\t\t\t\tdepth++;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"*\":\n\t\t\t\t\twildcards++;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\treturn (priority * 1000) + ((depth * 10) - wildcards);\n\t}\n\t\n\t/** Add request listener */\n\taddRequestListener(method: Method | \"ALL\", regExp: RegExpOrString, handler: Handler, priority = 0) {\n\t\tif (typeof regExp == \"string\")\n\t\t\tregExp = pathToRegExp(regExp);\n\t\t\n\t\tif (method && method !== \"ALL\") {\n\t\t\tconst methodListeners = this.#listeners[method];\n\t\t\t\n\t\t\tif (methodListeners) {\n\t\t\t\tconst listener: Listener = [ regExp, handler, priority ];\n\t\t\t\tconst weight = this.#getWeight(regExp, priority);\n\t\t\t\t\n\t\t\t\tfor (let i = 0; i < methodListeners.length; i++) {\n\t\t\t\t\tconst [ anotherRegExp, , anotherPriority ] = methodListeners[i];\n\t\t\t\t\t\n\t\t\t\t\tif (weight > this.#getWeight(anotherRegExp, anotherPriority)) {\n\t\t\t\t\t\tmethodListeners.splice(i, 0, listener);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!methodListeners.includes(listener))\n\t\t\t\t\tmethodListeners.push(listener);\n\t\t\t}\n\t\t} else\n\t\t\tfor (const specificMethod of Object.keys(this.#listeners) as Method[])\n\t\t\t\tthis.addRequestListener(specificMethod, regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add middleware */\n\taddMiddleware(middleware: GenericMiddleware, priority?: Priority) {\n\t\tif (middleware instanceof ClassMiddleware) {\n\t\t\tfor (const [ method, regExpOrStringArrayMap ] of Object.entries(middleware.listeners))\n\t\t\t\tfor (const [ regExpOrString, handler, listenerPriority ] of regExpOrStringArrayMap)\n\t\t\t\t\tthis.addRequestListener(method as Method, regExpOrString, handler, listenerPriority ?? priority ?? middleware.priority);\n\t\t\tmiddleware.bindTo?.(this);\n\t\t} else if (isTupleMiddlewareOrArray(middleware)) {\n\t\t\tif (isTupleMiddleware(middleware))\n\t\t\t\tmiddleware = [ middleware ];\n\t\t\t\n\t\t\tfor (const params of middleware)\n\t\t\t\tthis.addRequestListener(\n\t\t\t\t\t...isMethod(params[0] as string) ?\n\t\t\t\t\t\tparams as readonly [ Method, RegExpOrString, Handler, Priority? ] :\n\t\t\t\t\t\t[ \"GET\", ...params as [ RegExpOrString, Handler, Priority? ] ] as const\n\t\t\t\t);\n\t\t} else\n\t\t\tthis.#parseMappedMiddleware(middleware);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t#parseMappedMiddleware(middleware: Middleware, method: Method | \"ALL\" = \"GET\", prefix: string = \"\") {\n\t\tfor (const [ key, value ] of Object.entries(middleware))\n\t\t\tif (typeof value == \"function\")\n\t\t\t\tif (isMethod(key))\n\t\t\t\t\tthis.addRequestListener(key, prefix, value);\n\t\t\t\telse\n\t\t\t\t\tthis.addRequestListener(method, `${prefix}${key}`, value);\n\t\t\telse\n\t\t\t\tif (isMethod(key))\n\t\t\t\t\tthis.#parseMappedMiddleware(value, key, prefix);\n\t\t\t\telse\n\t\t\t\t\tthis.#parseMappedMiddleware(value, method, `${prefix}${key}`);\n\t\t\n\t}\n\t\n\t/** Add POST request listener */\n\tpost(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"POST\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add GET request listener */\n\tget(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"GET\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add PUT request listener */\n\tput(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"PUT\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add PATCH request listener */\n\tpatch(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"PATCH\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add DELETE request listener */\n\tdelete(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"DELETE\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t\n\t/** Make props for Node.js http(s).createServer method */\n\tstatic makeProps({ ssl, server }: Options) {\n\t\treturn {\n\t\t\t...resolveSSL(ssl),\n\t\t\tIncomingMessage: Request,\n\t\t\tServerResponse: Response,\n\t\t\t...server\n\t\t} as http.ServerOptions | https.ServerOptions;\n\t}\n\t\n}\n", "import { IncomingMessage } from \"node:http\";\nimport querystring from \"node:querystring\";\nimport { getRemoteAddress } from \"insite-common/backend\";\nimport { matchSymbol } from \"./symbols\";\nimport { extractBearerToken, extractQueryParams, extractUrlParams } from \"./utils\";\nimport type { RequestParams, RequestQueryParams } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @stylistic/max-statements-per-line */\n\n\nexport function matches(request: Request, regExp: RegExp) {\n\tconst match = regExp.exec(request.path);\n\t\n\tif (match) {\n\t\trequest[matchSymbol] = match;\n\t\t\n\t\treturn true;\n\t}\n\t\n\treturn false;\n}\n\n\nexport class RequestBody {\n\tconstructor(request: Request<any>) {\n\t\tthis.#request = request;\n\t\t\n\t}\n\t\n\t#request;\n\t\n\t/** Request body as a ReadableStream */\n\tstream() {\n\t\treturn this.#request;\n\t}\n\t\n\t#text?: string;\n\t\n\t/** Request body as a string */\n\ttext() {\n\t\treturn new Promise<string>((resolve, reject) => {\n\t\t\t\n\t\t\tif (this.#text)\n\t\t\t\tresolve(this.#text);\n\t\t\telse {\n\t\t\t\tlet text = \"\";\n\t\t\t\t\n\t\t\t\tthis.#request.on(\"data\", chunk => { text += chunk; });\n\t\t\t\tthis.#request.on(\"end\", () => { resolve(this.#text = text); });\n\t\t\t\t\n\t\t\t\tthis.#request.on(\"error\", reject);\n\t\t\t}\n\t\t\t\n\t\t});\n\t}\n\t\n\t#bytes?: Uint8Array<ArrayBufferLike>;\n\t\n\t/** Request body as an Uint8Array */\n\tasync bytes() {\n\t\t\n\t\tthis.#bytes ??= new TextEncoder().encode(await this.text());\n\t\t\n\t\treturn this.#bytes;\n\t}\n\t\n\t/** Request body as an ArrayBuffer */\n\tasync arrayBuffer() {\n\t\treturn (await this.bytes()).buffer;\n\t}\n\t\n\t#json?: any;\n\t\n\t/** Request body as a parsed JSON object */\n\tasync json() {\n\t\t\n\t\tthis.#json ??= JSON.parse(await this.text() || \"null\");\n\t\t\n\t\treturn this.#json;\n\t}\n\t\n\t#urlEncoded?: querystring.ParsedUrlQuery;\n\t\n\t/** Request body as a parsed URL-encoded object */\n\tasync urlEncoded() {\n\t\t\n\t\tthis.#urlEncoded = querystring.parse(await this.text());\n\t\t\n\t\treturn this.#urlEncoded;\n\t}\n\t\n\t// TODO:\n\t/** Request body as a parsed MessagePack object */\n\t// messagePack() {\n\t// }\n\t\n}\n\n\nexport class Request<P = RequestParams> extends IncomingMessage {\n\t\n\tdeclare url: string;\n\t\n\t/** Pathname part of the URL string */\n\tpath!: string;\n\t\n\t/** Query string part of the URL string */\n\tquerystring!: string;\n\t\n\t#ip?: string;\n\t\n\t/** IPv4 */\n\tget ip() {\n\t\treturn (this.#ip ??= getRemoteAddress(this));\n\t}\n\t\n\t[matchSymbol]?: RegExpExecArray;\n\t\n\t#params?: P;\n\t\n\t/** Params parsed from the URL string */\n\tget params() {\n\t\treturn (this.#params ??= extractUrlParams(this) as P);\n\t}\n\t\n\t#query?: RequestQueryParams;\n\t\n\t/** Params parsed from the query string part of the URL string */\n\tget query() {\n\t\treturn (this.#query ??= extractQueryParams(this));\n\t}\n\t\n\t#bearer?: string | null;\n\t\n\t/** Authorization: Bearer token */\n\tget bearer() {\n\t\treturn (this.#bearer ??= extractBearerToken(this));\n\t}\n\t\n\t#body?: RequestBody;\n\t\n\t/** Object with async methods to get the request body */\n\tget body() {\n\t\treturn (this.#body ??= new RequestBody(this));\n\t}\n\t\n}\n", "export const serverSymbol = Symbol(\"server\");\nexport const requestSymbol = Symbol(\"request\");\nexport const matchSymbol = Symbol(\"match\");\n", "import { matchSymbol } from \"./symbols\";\nimport type { Request } from \"./Request\";\nimport type { RequestParams, RequestQueryParams } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nconst pathRegExp = /\\/(?:(\\*)|:([^/?]+)(\\?(.*))?)/g;\n\nfunction subPathToRegExpSource(path: string, index = 0): string {\n\treturn path.replaceAll(pathRegExp, (_, wildcard, param, optional, subPath) => {\n\t\tif (wildcard)\n\t\t\treturn `/(?<__${index++}>.*?)`;\n\t\t\n\t\tconst group = `/(?<${param}>[^/]+)`;\n\t\t\n\t\treturn optional ?\n\t\t\t`(?:${group}${subPath ? subPathToRegExpSource(subPath, index) : \"\"})?` :\n\t\t\tgroup;\n\t});\n}\n\nexport function pathToRegExp(path: string) {\n\treturn new RegExp(`^${path.startsWith(\"/\") ? \"\" : \"/\"}${subPathToRegExpSource(path)}/?$`);\n}\n\n\nconst wildcardKeyRegExp = /^__/;\n\nexport function extractUrlParams(request: Request<any>): RequestParams {\n\tconst match = request[matchSymbol];\n\t\n\tif (match) {\n\t\tdelete request[matchSymbol];\n\t\t\n\t\tconst params = [ undefined, ...match.slice(1) ] as RequestParams;\n\t\t\n\t\tif (match.groups)\n\t\t\tfor (const [ key, value ] of Object.entries(match.groups))\n\t\t\t\tparams[key.replace(wildcardKeyRegExp, \"\")] = value;\n\t\t\n\t\treturn params;\n\t}\n\t\n\treturn [] as unknown as RequestParams;\n}\n\n\nexport function extractQueryParams({ querystring }: Request<any>): RequestQueryParams {\n\treturn querystring?.split(\"&\").reduce((queryParams, pair) => {\n\t\tconst [ key, value ] = pair.split(\"=\");\n\t\t\n\t\ttry {\n\t\t\tqueryParams[key] = decodeURIComponent(value || \"\");\n\t\t} catch {\n\t\t\tqueryParams[key] = \"\";\n\t\t}\n\t\t\n\t\treturn queryParams;\n\t}, {} as RequestQueryParams) ?? {};\n}\n\nexport function extractBearerToken({ headers: { authorization } }: Request<any>) {\n\tif (authorization?.indexOf(\"Bearer \") === 0)\n\t\treturn authorization.slice(7);\n\t\n\treturn null;\n}\n", "import { ServerResponse } from \"node:http\";\nimport { Readable } from \"node:stream\";\nimport { cleanup } from \"@nesvet/n\";\nimport { requestSymbol, serverSymbol } from \"./symbols\";\nimport type { Request } from \"./Request\";\nimport type { HTTPServer } from \"./Server\";\nimport type {\n\tErrorHandler,\n\tJSONResponseBody,\n\tResponseBody,\n\tResponseHeaders,\n\tUrlEncodedResponseBody\n} from \"./types\";\n\n\nexport class Response extends ServerResponse<Request> {\n\t\n\t[serverSymbol]!: HTTPServer;\n\t[requestSymbol]!: Request;\n\t\n\t/** Set status code */\n\tstatus(code: number) {\n\t\tthis.statusCode = code;\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Set status code */\n\tset(headers: Record<string, string[] | string>): this;\n\tset(header: string, value: string[] | string): this;\n\tset(header: Record<string, string[] | string> | string, value?: string[] | string) {\n\t\tif (typeof header == \"string\")\n\t\t\treturn this.setHeader(header, value!);\n\t\t\n\t\t// eslint-disable-next-line guard-for-in\n\t\tfor (const key in header)\n\t\t\tthis.setHeader(key, header[key]);\n\t\t\n\t\treturn this;\n\t}\n\t\n\theader = this.set;\n\t\n\t/** End response with a plain text */\n\ttext(body: string, statusCode = 200) {\n\t\treturn this.writeHead(statusCode, {\n\t\t\t\"Content-Type\": \"text/plain; charset=utf-8\",\n\t\t\t\"Content-Length\": Buffer.byteLength(body)\n\t\t}).end(body);\n\t}\n\t\n\t/** End response with a JSON string */\n\tjson(value: JSONResponseBody, statusCode = 200) {\n\t\tconst body = JSON.stringify(value) ?? \"{}\";\n\t\t\n\t\treturn this.writeHead(statusCode, {\n\t\t\t\"Content-Type\": \"application/json; charset=utf-8\",\n\t\t\t\"Content-Length\": Buffer.byteLength(body)\n\t\t}).end(body);\n\t}\n\t\n\t/** End response with an URL-encoded string */\n\turlEncoded(params: UrlEncodedResponseBody, statusCode = 200) {\n\t\tconst body = new URLSearchParams(params).toString();\n\t\t\n\t\treturn this.writeHead(statusCode, {\n\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded; charset=utf-8\",\n\t\t\t\"Content-Length\": Buffer.byteLength(body)\n\t\t}).end(body);\n\t}\n\t\n\t/** End response with a stream */\n\tstream(stream: Readable, statusCode?: number): this;\n\tstream(stream: Readable, headers?: ResponseHeaders, statusCode?: number): this;\n\tstream(stream: Readable, headers?: ResponseHeaders | number, statusCode = 200) {\n\t\tif (typeof headers == \"number\") {\n\t\t\tstatusCode = headers;\n\t\t\theaders = undefined;\n\t\t}\n\t\t\n\t\tthis.writeHead(statusCode, headers);\n\t\t\n\t\treturn stream.pipe(this);\n\t}\n\t\n\t/** End response depend on the type of the passed body */\n\tgive(body: ResponseBody, statusCode?: number): this;\n\tgive(body: ResponseBody, headers?: ResponseHeaders, statusCode?: number): this;\n\tgive(body: ResponseBody, headers?: ResponseHeaders | number, statusCode = 200) {\n\t\tif (typeof headers == \"number\") {\n\t\t\tstatusCode = headers;\n\t\t\theaders = undefined;\n\t\t}\n\t\t\n\t\treturn (\n\t\t\ttypeof body == \"string\" ?\n\t\t\t\tthis.text(body, statusCode) :\n\t\t\t\tbody instanceof Readable ?\n\t\t\t\t\tthis.stream(body, headers, statusCode) :\n\t\t\t\t\tthis.json(body, statusCode)\n\t\t);\n\t}\n\t\n\t// TODO:\n\t// messagePack() {\n\t// }\n\t\n\t/** End response with an error */\n\terror(statusCode: number, body?: ResponseBody, { headers, handler }: { headers?: ResponseHeaders; handler?: ErrorHandler } = {}) {\n\t\treturn this[serverSymbol]._throw(this, cleanup({ statusCode, headers, body, handler }));\n\t}\n\t\n\t/** End response with the 400 Bad Request */\n\tbadRequest(body?: ResponseBody) {\n\t\treturn this.error(400, body);\n\t}\n\t\n\t/** End response with the 401 Unauthorized */\n\tunauthorized(body?: ResponseBody) {\n\t\treturn this.error(401, body);\n\t}\n\t\n\t/** End response with the 403 Forbidden */\n\tforbidden(body?: ResponseBody) {\n\t\treturn this.error(403, body);\n\t}\n\t\n\t/** End response with the 404 Not Found */\n\tnotFound(body?: ResponseBody) {\n\t\treturn this.error(404, body);\n\t}\n\t\n\t/** End response with the 408 Request Timeout */\n\trequestTimeout(body?: ResponseBody) {\n\t\treturn this.error(408, body);\n\t}\n\t\n\t/** End response with the 410 Gone */\n\tgone(body?: ResponseBody) {\n\t\treturn this.error(410, body);\n\t}\n\t\n\t/** End response with the 500 Internal Server Error */\n\tinternalServerError(body?: ResponseBody) {\n\t\treturn this.error(500, body);\n\t}\n\t\n\t/** End response with the 503 Service Unavailable */\n\tserviceUnavailable(body?: ResponseBody) {\n\t\treturn this.error(503, body);\n\t}\n\t\n}\n", "import type http from \"node:http\";\nimport type https from \"node:https\";\nimport type { Readable } from \"node:stream\";\nimport type { ClassMiddleware } from \"./Middleware\";\nimport type { Request } from \"./Request\";\nimport type { Response } from \"./Response\";\n\n\nconst METHODS = [ \"DELETE\", \"GET\", \"PATCH\", \"POST\", \"PUT\" ] as const;\n\nexport type Method = typeof METHODS[number];\n\nexport function isMethod(string: string): string is Method | \"ALL\" {\n\treturn METHODS.includes(string as Method) || string === \"ALL\";\n}\n\nexport type Next<R = unknown> = () => Promise<R>;\n\nexport type Priority = number;\n\nexport type Handler = (request: Request, response: Response, next: Next) => unknown;\n\nexport type Listener = [ RegExp, Handler, Priority ];\n\nexport type Options = {\n\t\n\t/**\n\t * Icon for console logs\n\t * @default \"\uD83D\uDD78\uFE0F \"\n\t */\n\ticon?: string;\n\t\n\t/**\n\t * Name\n\t * @default \"HTTP\"\n\t */\n\tname?: string;\n\t\n\tssl?: {\n\t\tcert: Buffer | string;\n\t\tkey: Buffer | string;\n\t};\n\tport?: number | string;\n\thttps?: boolean;\n\tlisteners?: Partial<Record<Method | \"ALL\", Listener[]>>;\n\terrors?: Record<\"default\" | number, ErrorParams>;\n\tserver?: http.Server | http.ServerOptions | https.Server | https.ServerOptions;\n};\n\nexport type RegExpOrString = RegExp | string;\n\nexport type RequestParams = Record<string, string> & [ undefined, ...string[] ];\n\nexport type RequestQueryParams = Record<string, string>;\n\nexport type Middleware = {\n\t[K: string]: Handler | Middleware;\n} | {\n\t[K: {} & string]: Handler | Middleware;\n} | {\n\t[K in Method | \"ALL\"]?: Middleware;\n};\n\nexport type TupleMiddleware = readonly [ Method, RegExpOrString, Handler, Priority? ] | readonly [ RegExpOrString, Handler, Priority? ];\n\nexport type GenericMiddleware =\n\tClassMiddleware |\n\tMiddleware |\n\tTupleMiddleware |\n\tTupleMiddleware[];\n\nexport function isTupleMiddlewareOrArray(middleware: GenericMiddleware): middleware is TupleMiddleware | TupleMiddleware[] {\n\treturn Array.isArray(middleware);\n}\n\nexport function isTupleMiddleware(middleware: TupleMiddleware | TupleMiddleware[]): middleware is TupleMiddleware {\n\treturn !Array.isArray(middleware);\n}\n\nexport function isRequestMethodAccepted(requestMethod: string | undefined, listeners: Record<string, unknown>): requestMethod is Method {\n\treturn Boolean(requestMethod && listeners[requestMethod]);\n}\n\nexport function isServerServer(serverOrOptions: Options[\"server\"]): serverOrOptions is http.Server | https.Server {\n\treturn !!serverOrOptions && \"emit\" in serverOrOptions;\n}\n\nexport type ResponseHeaders = http.OutgoingHttpHeader[] | http.OutgoingHttpHeaders;\n\nexport type JSONResponseBody = Parameters<JSON[\"stringify\"]>[0];\n\nexport type UrlEncodedResponseBody = ConstructorParameters<typeof URLSearchParams>[0];\n\nexport type ResponseBody = JSONResponseBody | Readable | UrlEncodedResponseBody | string;// eslint-disable-line @typescript-eslint/no-redundant-type-constituents\n\nexport type ErrorParams = {\n\tstatusCode: number;\n\theaders?: ResponseHeaders;\n\tbody: ResponseBody;\n\thandler?: ErrorHandler;\n};\n\nexport type ErrorHandler = (request: Request, response: Response, errorParams: Omit<ErrorParams, \"handler\">) => Response;\n", "import { StaticMiddleware, StaticMiddlewareOptions } from \"./middlewares/Static\";\nimport { HTTPServer } from \"./Server\";\nimport { GenericMiddleware, Options } from \"./types\";\n\n\nexport class StaticServer extends HTTPServer {\n\tconstructor(options: StaticMiddlewareOptions, serverOptions: Options, middlewares: GenericMiddleware[] = []) {\n\t\tsuper(serverOptions, [\n\t\t\tnew StaticMiddleware(options),\n\t\t\t...middlewares\n\t\t]);\n\t\t\n\t}\n\t\n\tname = \"Static\";\n\ticon = \"\uD83D\uDED2\";\n\t\n}\n"],
5
- "mappings": "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",
6
- "names": ["ClassMiddleware", "InitialsMiddleware", "fs", "path", "zlib", "brotliPreloadOptions", "brotliRuntimeOptions", "gzipPreloadOptions", "gzipRuntimeOptions", "brotliPreloadSync", "data", "gzipPreloadSync", "getCompressionStreamByEncoding", "contentEncoding", "handleRequestCompressed", "request", "response", "headers", "isBrotliAccepted", "defaultExtensions", "defaultPreloaded", "INSITE_STATIC_ROOT", "nullExtension", "StaticMiddleware", "ClassMiddleware", "src", "root", "_path", "extensions", "defaultExtensions", "resolved", "restricted", "preloaded", "path", "entryPoint", "fs", "#src", "#rootRegExp", "extension", "#addExtension", "resolvee", "#resolve", "fileName", "#restrict", "defaultPreloaded", "#preload", "#handler", "#extensions", "#resolved", "#restricted", "#preloaded", "#getExtensionBy", "name", "url", "isText", "fileData", "brotliPreloadSync", "gzipPreloadSync", "error", "request", "response", "mimeType", "contentEncoding", "resolve", "stream", "getCompressionStreamByEncoding", "isEmpty", "INSITE_STATIC_ROOT", "INSITE_TITLE", "envGlobals", "key", "headers", "escapeAttribute", "value", "resolveHref", "href", "renderHead", "head", "links", "link", "attributes", "meta", "item", "TemplateMiddleware", "ClassMiddleware", "path", "globals", "title", "css", "rootId", "#handler", "#title", "#css", "#rootId", "#html", "fileName", "isEmpty", "request", "response", "handleRequestCompressed", "createServer", "resolveSSL", "showServerListeningMessage", "IncomingMessage", "querystring", "getRemoteAddress", "serverSymbol", "requestSymbol", "matchSymbol", "pathRegExp", "subPathToRegExpSource", "path", "index", "_", "wildcard", "param", "optional", "subPath", "group", "pathToRegExp", "wildcardKeyRegExp", "extractUrlParams", "request", "match", "matchSymbol", "params", "key", "value", "extractQueryParams", "querystring", "queryParams", "pair", "extractBearerToken", "authorization", "matches", "request", "regExp", "match", "matchSymbol", "RequestBody", "#request", "#text", "resolve", "reject", "text", "chunk", "#bytes", "#json", "#urlEncoded", "querystring", "Request", "IncomingMessage", "#ip", "getRemoteAddress", "#params", "extractUrlParams", "#query", "extractQueryParams", "#bearer", "extractBearerToken", "#body", "ServerResponse", "Readable", "cleanup", "Response", "ServerResponse", "serverSymbol", "requestSymbol", "code", "header", "value", "key", "body", "statusCode", "params", "stream", "headers", "Readable", "handler", "cleanup", "METHODS", "isMethod", "string", "isTupleMiddlewareOrArray", "middleware", "isTupleMiddleware", "isRequestMethodAccepted", "requestMethod", "listeners", "isServerServer", "serverOrOptions", "HTTPServer", "_HTTPServer", "icon", "name", "port", "ssl", "listeners", "errors", "server", "middlewares", "isServerServer", "resolve", "showServerListeningMessage", "createServer", "method", "methodListeners", "regExp", "handler", "priority", "statusCodeString", "statusCode", "#errors", "middleware", "#requestListener", "#listeners", "request", "response", "serverSymbol", "requestSymbol", "isRequestMethodAccepted", "stack", "i", "next", "listener", "matches", "headers", "body", "restParams", "handlerParams", "#getWeight", "source", "depth", "wildcards", "length", "pathToRegExp", "weight", "anotherRegExp", "anotherPriority", "specificMethod", "ClassMiddleware", "regExpOrStringArrayMap", "regExpOrString", "listenerPriority", "isTupleMiddlewareOrArray", "isTupleMiddleware", "params", "isMethod", "#parseMappedMiddleware", "prefix", "key", "value", "resolveSSL", "Request", "Response", "StaticServer", "HTTPServer", "options", "serverOptions", "middlewares", "StaticMiddleware"]
4
+ "sourcesContent": ["import { HTTPServer } from \"./Server\";\nimport type {\n\tHandler,\n\tMethod,\n\tPriority,\n\tRegExpOrString\n} from \"./types\";\n\n\nexport class ClassMiddleware {\n\tpriority: Priority = 0;\n\tlisteners!: Partial<Record<Method, [ RegExpOrString, Handler, Priority? ][]>>;\n\tbindTo?(server: HTTPServer): void;\n}\n", "//#if _SERVER && _SSR\n// import { initialsMap } from \"@insite/subscriptions\";\n// import { handleRequestCompressed } from \"../compression\";\n// import { Middleware } from \"../Middleware\";\n\n\n// const headers = { \"Content-Type\": \"text/javascript; charset=utf-8\" };\n\n\n// export class InitialsMiddleware extends Middleware {\n// \tconstructor(options = {}) {\n// \t\tsuper();\n// \t\tconst {\n// \t\t\tpath = \"/initials\"\n// \t\t} = options;\n\n// \t\tthis.listeners = {\n// \t\t\tGET: [ [ path, this.handler ] ]\n// \t\t};\n\n// \t}\n\n// \thandler = (request, response) => {\n// \t\tconst initials = initialsMap.getWithTimeout(request.url.split(\"?\")[1]);\n\n// \t\tif (initials)\n// \t\t\thandleRequestCompressed(request, response, headers, `window.__initials = [${initials.join()}];\\ndocument.currentScript.remove();`);\n// \t\telse\n// \t\t\treturn false;\n// \t};\n\n// }\n\n\n//#else\nexport const InitialsMiddleware = undefined;\n\n\n//#endif\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { brotliPreloadSync, getCompressionStreamByEncoding, gzipPreloadSync } from \"../../compression\";\nimport { ClassMiddleware } from \"../../Middleware\";\nimport type { Handler } from \"../../types\";\nimport { defaultExtensions } from \"./extensions\";\nimport { defaultPreloaded } from \"./preloaded\";\nimport type { Extension, Options } from \"./types\";\n\n\nconst { INSITE_STATIC_ROOT = \"\" } = process.env;\n\nconst nullExtension = {\n\tmimeType: \"application/octet-stream\"\n};\n\n\nexport class StaticMiddleware extends ClassMiddleware {\n\tconstructor({\n\t\tsrc = \"public\",\n\t\troot = INSITE_STATIC_ROOT,\n\t\tpath: _path,\n\t\textensions = defaultExtensions,\n\t\tresolved,\n\t\trestricted,\n\t\tpreloaded = \"default\"\n\t}: Options = {}) {\n\t\tsuper();\n\t\t\n\t\tif (!path.isAbsolute(src)) {\n\t\t\tconst [ , entryPoint ] = process.argv;\n\t\t\tsrc = path.resolve(fs.statSync(entryPoint).isDirectory() ? entryPoint : path.dirname(entryPoint), src);\n\t\t}\n\t\t\n\t\tthis.#src = src;\n\t\tthis.#rootRegExp = new RegExp(`^${path.join(\"/\", root, \"/\")}`);\n\t\t\n\t\tif (extensions)\n\t\t\tfor (const extension of extensions)\n\t\t\t\tif (extension)\n\t\t\t\t\tthis.#addExtension(...extension);\n\t\t\n\t\tif (resolved)\n\t\t\tfor (const resolvee of resolved)\n\t\t\t\tif (resolvee)\n\t\t\t\t\tthis.#resolve(...resolvee);\n\t\t\n\t\tif (restricted)\n\t\t\tfor (const fileName of restricted)\n\t\t\t\tif (fileName)\n\t\t\t\t\tthis.#restrict(fileName);\n\t\t\n\t\tif (preloaded) {\n\t\t\tif (preloaded === \"default\")\n\t\t\t\tpreloaded = defaultPreloaded;\n\t\t\t\n\t\t\tfor (const fileName of preloaded)\n\t\t\t\tif (fileName)\n\t\t\t\t\tthis.#preload(fileName);\n\t\t}\n\t\t\n\t\tthis.listeners = {\n\t\t\tGET: [ [ _path ?? new RegExp(String.raw`^${path.join(\"/\", root, \"/\")}(\\w[^\\/]*/)*[^\\/]+\\.[^\\/]`), this.#handler ] ]\n\t\t};\n\t\t\n\t}\n\t\n\tpriority = -900;\n\t\n\t#src;\n\t#rootRegExp;\n\t\n\t#extensions = new Map();\n\t\n\t#resolved = new Map();\n\t\n\t#restricted = new Set();\n\t\n\t#preloaded = new Map();\n\t\n\t#getExtensionBy(fileName: string) {\n\t\treturn this.#extensions.get(fileName.slice(Math.max(0, fileName.lastIndexOf(\".\") + 1))) ?? nullExtension;\n\t}\n\t\n\t#addExtension(name: string, extension: Extension[1]) {\n\t\tthis.#extensions.set(name, { ...extension, name });\n\t\t\n\t}\n\t\n\t#resolve(url: string, fileName: string) {\n\t\tthis.#resolved.set(url, path.isAbsolute(fileName) ? fileName : path.join(this.#src, fileName));\n\t\t\n\t}\n\t\n\t#restrict(fileName: string) {\n\t\tthis.#restricted.add(path.join(this.#src, fileName));\n\t\t\n\t}\n\t\n\t#preload(fileName: string) {\n\t\tfileName = this.#resolved.get(fileName) ?? path.join(this.#src, fileName);\n\t\t\n\t\ttry {\n\t\t\tconst { isText } = this.#getExtensionBy(fileName);\n\t\t\tconst fileData = fs.readFileSync(fileName, isText ? \"utf8\" : null);\n\t\t\tthis.#preloaded.set(fileName, isText ? {\n\t\t\t\tbr: brotliPreloadSync(fileData),\n\t\t\t\tgzip: gzipPreloadSync(fileData)\n\t\t\t} : fileData);\n\t\t} catch (error) {\n\t\t\tconsole.warn(`\u26A0\uFE0F inSite Static Server: Unable to preload ${fileName}`, \"\\n\", error);\n\t\t}\n\t\t\n\t}\n\t\n\t#handler: Handler = (request, response) => {\n\t\t\n\t\tlet fileName;\n\t\t\n\t\ttry {\n\t\t\tfileName = decodeURI(request.url);\n\t\t} catch {\n\t\t\treturn response.notFound();\n\t\t}\n\t\t\n\t\tfileName = fileName.replace(this.#rootRegExp, \"\").replaceAll(\"../\", \"\");\n\t\t\n\t\tfileName = this.#resolved.get(fileName) ?? path.join(this.#src, fileName);\n\t\t\n\t\tif (this.#restricted.has(fileName))\n\t\t\treturn false;\n\t\t\n\t\tif (!fs.existsSync(fileName))\n\t\t\treturn response.notFound();\n\t\t\n\t\tconst { mimeType, isText } = this.#getExtensionBy(fileName);\n\t\tconst contentEncoding = isText ? /\\bbr\\b/.test(request.headers[\"accept-encoding\"] as string) ? \"br\" : \"gzip\" : null;\n\t\t\n\t\tresponse.writeHead(200, {\n\t\t\t\"Content-Type\": mimeType + (isText ? \"; charset=utf-8\" : \"\"),\n\t\t\t...contentEncoding && { \"Content-Encoding\": contentEncoding }\n\t\t});\n\t\t\n\t\tconst preloaded = this.#preloaded.get(fileName);\n\t\t\n\t\tif (preloaded)\n\t\t\treturn response.end(isText && contentEncoding ? preloaded[contentEncoding] : preloaded);\n\t\t\n\t\treturn new Promise(resolve => {\n\t\t\tlet stream: Readable = fs.createReadStream(fileName).on(\"error\", () => resolve(false));\n\t\t\t\n\t\t\tif (contentEncoding)\n\t\t\t\tstream = stream.pipe(getCompressionStreamByEncoding(contentEncoding));\n\t\t\t\n\t\t\tstream.on(\"end\", resolve);\n\t\t\t\n\t\t\tstream.pipe(response);\n\t\t\t\n\t\t});\n\t};\n\t\n}\n", "import zlib, { type InputType } from \"node:zlib\";\nimport type { OutgoingHttpHeaders } from \"node:http\";\nimport type { Request } from \"./Request\";\nimport type { Response } from \"./Response\";\n\n\nconst brotliPreloadOptions = {\n\tparams: {\n\t\t[zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n\t\t[zlib.constants.BROTLI_PARAM_QUALITY]: 11\n\t}\n};\n\nconst brotliRuntimeOptions = {\n\tparams: {\n\t\t[zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n\t\t[zlib.constants.BROTLI_PARAM_QUALITY]: 4\n\t}\n};\n\nconst gzipPreloadOptions = {\n\tlevel: 9\n};\n\nconst gzipRuntimeOptions = {\n\tlevel: 3\n};\n\n\nexport function brotliPreloadSync(data: InputType) {\n\treturn zlib.brotliCompressSync(data, brotliPreloadOptions);\n}\n\nexport function gzipPreloadSync(data: InputType) {\n\treturn zlib.gzipSync(data, gzipPreloadOptions);\n}\n\nexport function getCompressionStreamByEncoding(contentEncoding: \"br\" | \"gzip\") {\n\treturn contentEncoding === \"br\" ? zlib.createBrotliCompress(brotliRuntimeOptions) : zlib.createGzip(gzipRuntimeOptions);\n}\n\nexport function handleRequestCompressed(request: Request, response: Response, headers: OutgoingHttpHeaders, data: InputType) {\n\tconst isBrotliAccepted = /\\bbr\\b/.test(request.headers[\"accept-encoding\"] as string);\n\theaders[\"Content-Encoding\"] = isBrotliAccepted ? \"br\" : \"gzip\";\n\tresponse.writeHead(200, headers).end(isBrotliAccepted ? zlib.brotliCompressSync(data, brotliRuntimeOptions) : zlib.gzipSync(data, gzipRuntimeOptions));\n\t\n}\n", "import { Extension } from \"./types\";\n\n\nexport const defaultExtensions = [\n\t\n\t[ \"js\", {\n\t\tisText: true,\n\t\tmimeType: \"text/javascript\"\n\t} ],\n\t\n\t[ \"css\", {\n\t\tisText: true,\n\t\tmimeType: \"text/css\"\n\t} ],\n\t\n\t[ \"ico\", {\n\t\tmimeType: \"image/x-icon\"\n\t} ],\n\t\n\tprocess.env.NODE_ENV === \"development\" ? [ \"css.map\", {\n\t\tisText: true,\n\t\tmimeType: \"application/json\"\n\t} ] : null,\n\t\n\tprocess.env.NODE_ENV === \"development\" ? [ \"js.map\", {\n\t\tisText: true,\n\t\tmimeType: \"application/json\"\n\t} ] : null,\n\t\n\t[ \"jpg\", {\n\t\tmimeType: \"image/jpeg\"\n\t} ],\n\t\n\t[ \"jpeg\", {\n\t\tmimeType: \"image/jpeg\"\n\t} ],\n\t\n\t[ \"png\", {\n\t\tmimeType: \"image/png\"\n\t} ],\n\t\n\t[ \"svg\", {\n\t\tisText: true,\n\t\tmimeType: \"image/svg+xml\"\n\t} ]\n\t\n].filter(Boolean) as Extension[];\n", "export const defaultPreloaded = [\n\t...process.env.NODE_ENV === \"production\" ? [\n\t\t//#if _SSR\n\t\t// \"/index.css\",\n\t\t//#endif\n\t\t\"/index.js\",\n\t\t\"/favicon.ico\"\n\t] : []\n];\n", "import { isEmpty } from \"@nesvet/n\";\nimport { handleRequestCompressed } from \"../compression\";\nimport { ClassMiddleware } from \"../Middleware\";\nimport { Handler } from \"../types\";\n\n\nconst {\n\tINSITE_STATIC_ROOT = \"\",\n\tINSITE_TITLE\n} = process.env;\n\nconst envGlobals: Record<string, unknown> = {};\nfor (const key in process.env)\n\tif (key.startsWith(\"INSITE_CLIENT_\"))\n\t\tenvGlobals[key.replace(/INSITE_CLIENT_/, \"\").toLowerCase()] = process.env[key];\n\nconst headers = { \"Content-Type\": \"text/html; charset=utf-8\" };\n\n\ntype HeadLink = {\n\trel: string;\n\thref: string;\n\ttype?: string;\n\tsizes?: string;\n};\n\ntype HeadMeta = {\n\tname?: string;\n\tproperty?: string;\n\tcontent: string;\n};\n\ntype Options = {\n\tpath?: RegExp;\n\tglobals?: Record<string, unknown>;\n\ttitle?: string;\n\tcss?: string[] | string;\n\trootId?: string;\n\tlang?: string;\n\thead?: {\n\t\tlinks?: HeadLink[];\n\t\tmeta?: HeadMeta[];\n\t};\n};\n\nexport type { Options as TemplateMiddlewareOptions };\n\n\nfunction escapeAttribute(value: string) {\n\treturn value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\"\\\"\", \"&quot;\");\n}\n\nfunction resolveHref(href: string) {\n\tif (href.startsWith(\"http://\") || href.startsWith(\"https://\"))\n\t\treturn href;\n\t\n\tif (href.startsWith(\"/\"))\n\t\treturn `${INSITE_STATIC_ROOT}${href}`;\n\t\n\treturn href;\n}\n\nfunction renderHead(head: NonNullable<Options[\"head\"]>) {\n\tconst links = (head.links ?? []).map(link => {\n\t\tconst attributes = [\n\t\t\t`rel=\"${escapeAttribute(link.rel)}\"`,\n\t\t\t`href=\"${escapeAttribute(resolveHref(link.href))}\"`\n\t\t];\n\t\t\n\t\tif (link.type)\n\t\t\tattributes.push(`type=\"${escapeAttribute(link.type)}\"`);\n\t\t\n\t\tif (link.sizes)\n\t\t\tattributes.push(`sizes=\"${escapeAttribute(link.sizes)}\"`);\n\t\t\n\t\treturn `<link ${attributes.join(\" \")}>`;\n\t});\n\t\n\tconst meta = (head.meta ?? []).map(item => {\n\t\tconst attributes: string[] = [];\n\t\t\n\t\tif (item.name)\n\t\t\tattributes.push(`name=\"${escapeAttribute(item.name)}\"`);\n\t\t\n\t\tif (item.property)\n\t\t\tattributes.push(`property=\"${escapeAttribute(item.property)}\"`);\n\t\t\n\t\tattributes.push(`content=\"${escapeAttribute(item.content)}\"`);\n\t\t\n\t\treturn `<meta ${attributes.join(\" \")} />`;\n\t});\n\t\n\treturn [ ...links, ...meta ].join(\"\");\n}\n\n\nexport class TemplateMiddleware extends ClassMiddleware {\n\tconstructor({\n\t\tpath = /.*/,\n\t\tglobals = {},\n\t\ttitle = INSITE_TITLE ?? \"inSite\",\n\t\tcss = [],\n\t\trootId = \"root\",\n\t\tlang = \"en\",\n\t\thead = {}\n\t}: Options = {}) {\n\t\tsuper();\n\t\t\n\t\tthis.listeners = {\n\t\t\tGET: [ [ path, this.#handler ] ]\n\t\t};\n\t\t\n\t\tthis.#title = title;\n\t\tthis.#css = Array.isArray(css) ? css : [ css ];\n\t\tthis.#rootId = rootId;\n\t\t\n\t\tObject.assign(globals, envGlobals);\n\t\t\n\t\tthis.#html =\n\t\t\t\"<!DOCTYPE html>\" +\n\t\t\t`<html lang=\"${escapeAttribute(lang)}\">` +\n\t\t\t\"<head>\" +\n\t\t\t\"<meta charset=\\\"utf-8\\\" />\" +\n\t\t\t\"<meta name=\\\"viewport\\\" content=\\\"minimum-scale=1, initial-scale=1, width=device-width\\\" />\" +\n\t\t\t`<title>${this.#title}</title>` +\n\t\t\t`<link rel=\"icon\" type=\"image/x-icon\" href=\"${INSITE_STATIC_ROOT}/favicon.ico\">` +\n\t\t\trenderHead(head) +\n\t\t\t`${this.#css.map(fileName => `<link rel=\"stylesheet\" href=\"${INSITE_STATIC_ROOT}/${fileName}\" />`).join(\"\")}` +\n\t\t\t`${isEmpty(globals) ? \"\" : `<script>globalThis.__insite=${JSON.stringify(globals)};</script>`}` +\n\t\t\t`<script type=\"text/javascript\" src=\"${INSITE_STATIC_ROOT}/index.js\" defer></script>` +\n\t\t\t\"</head>\" +\n\t\t\t\"<body>\" +\n\t\t\t`<div id=\"${this.#rootId}\">` +\n\t\t\t\"</div>\" +\n\t\t\t\"</body>\" +\n\t\t\t\"</html>\";\n\t\t\n\t}\n\t\n\tpriority = -1000;\n\t\n\t#title;\n\t#css;\n\t#rootId;\n\t#html;\n\t\n\t#handler: Handler = (request, response) =>\n\t\thandleRequestCompressed(request, response, headers, this.#html);\n\t\n}\n", "import type http from \"node:http\";\nimport type https from \"node:https\";\nimport { createServer, resolveSSL, showServerListeningMessage } from \"insite-common/backend\";\nimport { ClassMiddleware } from \"./Middleware\";\nimport { matches, Request } from \"./Request\";\nimport { Response } from \"./Response\";\nimport { requestSymbol, serverSymbol } from \"./symbols\";\nimport {\n\tisMethod,\n\tisRequestMethodAccepted,\n\tisServerServer,\n\tisTupleMiddleware,\n\tisTupleMiddlewareOrArray,\n\ttype ErrorParams,\n\ttype GenericMiddleware,\n\ttype Handler,\n\ttype Listener,\n\ttype Method,\n\ttype Middleware,\n\ttype Options,\n\ttype Priority,\n\ttype RegExpOrString,\n\ttype ResponseBody\n} from \"./types\";\nimport { pathToRegExp } from \"./utils\";\n\n\nexport class HTTPServer {\n\tconstructor({\n\t\ticon = \"\uD83D\uDD78\uFE0F \",\n\t\tname = \"HTTP\",\n\t\tport,\n\t\tssl,\n\t\tlisteners,\n\t\terrors,\n\t\tserver\n\t}: Options, middlewares: (GenericMiddleware | false | null | undefined)[] = []) {\n\t\t\n\t\tthis.icon = icon;\n\t\tthis.name = name;\n\t\t\n\t\tif (isServerServer(server)) {\n\t\t\tthis.server = server;\n\t\t\t\n\t\t\tvoid new Promise<void>(resolve => void (\n\t\t\t\tserver.listening ?\n\t\t\t\t\tresolve() :\n\t\t\t\t\tserver.on(\"listening\", resolve)\n\t\t\t)).then(() => showServerListeningMessage(this));\n\t\t\t\n\t\t} else {\n\t\t\tthis.server = createServer(HTTPServer.makeProps({ ssl, server }));\n\t\t\t\n\t\t\tthis.server.listen(\n\t\t\t\ttypeof port == \"string\" ?\n\t\t\t\t\tNumber.parseInt(port) :\n\t\t\t\t\tport ?? (this.isS ? 443 : 80),\n\t\t\t\t() => showServerListeningMessage(this)\n\t\t\t);\n\t\t}\n\t\t\n\t\tif (listeners)\n\t\t\tfor (const [ method, methodListeners ] of Object.entries(listeners) as [ Method | \"ALL\", Listener[] ][])\n\t\t\t\tfor (const [ regExp, handler, priority ] of methodListeners)\n\t\t\t\t\tthis.addRequestListener(method, regExp, handler, priority);\n\t\t\n\t\tif (errors)\n\t\t\tfor (const statusCodeString of Object.keys(errors)) {\n\t\t\t\tconst statusCode = Number.parseInt(statusCodeString);\n\t\t\t\tif (statusCode)\n\t\t\t\t\tif (this.#errors[statusCode])\n\t\t\t\t\t\tObject.assign(this.#errors[statusCode], errors[statusCode]);\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.#errors[statusCode] = errors[statusCode];\n\t\t\t}\n\t\t\n\t\tif (middlewares)\n\t\t\tfor (const middleware of middlewares)\n\t\t\t\tif (middleware)\n\t\t\t\t\tthis.addMiddleware(middleware);\n\t\t\n\t\tthis.server.on(\"request\", this.#requestListener);\n\t\t\n\t}\n\t\n\ticon;\n\tname;\n\tget protocol() {\n\t\treturn `http${this.isS ? \"s\" : \"\"}`;\n\t}\n\t\n\t/** Node.js http(s) server object */\n\tserver;\n\t\n\t/** Does the server use SSL */\n\tget isS() {\n\t\treturn \"setSecureContext\" in this.server;\n\t}\n\t\n\t#listeners: Record<Method, Listener[]> = {\n\t\tPOST: [],\n\t\tGET: [],\n\t\tPUT: [],\n\t\tPATCH: [],\n\t\tDELETE: []\n\t};\n\t\n\t#requestListener: Handler = async (request, response) => {\n\t\t\n\t\t([\n\t\t\trequest.path,\n\t\t\trequest.querystring\n\t\t] = request.url.split(\"?\", 2));\n\t\t\n\t\tresponse[serverSymbol] = this;\n\t\tresponse[requestSymbol] = request;\n\t\t\n\t\tif (!(\"status\" in request) && isRequestMethodAccepted(request.method, this.#listeners)) {\n\t\t\tconst stack = this.#listeners[request.method];\n\t\t\tlet i = 0;\n\t\t\t\n\t\t\tconst next = async () => {\n\t\t\t\t\n\t\t\t\twhile (i < stack.length) {\n\t\t\t\t\tconst listener = stack[i++];\n\t\t\t\t\t\n\t\t\t\t\tif (matches(request, listener[0]))\n\t\t\t\t\t\treturn await listener[1](request, response, next);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t};\n\t\t\t\n\t\t\treturn await next();\n\t\t}\n\t\t\n\t\tresponse.notFound();\n\t\t\n\t};\n\t\n\t#errors: Record<\"default\" | number, ErrorParams> = {\n\t\t401: {\n\t\t\tstatusCode: 401,\n\t\t\tbody: \"Unauthorized\"\n\t\t},\n\t\t403: {\n\t\t\tstatusCode: 403,\n\t\t\tbody: \"Forbidden\"\n\t\t},\n\t\t404: {\n\t\t\tstatusCode: 404,\n\t\t\tbody: \"Not Found\"\n\t\t},\n\t\t408: {\n\t\t\tstatusCode: 408,\n\t\t\tbody: \"Request Timeout\"\n\t\t},\n\t\t410: {\n\t\t\tstatusCode: 410,\n\t\t\tbody: \"Gone\"\n\t\t},\n\t\t500: {\n\t\t\tstatusCode: 500,\n\t\t\tbody: \"Internal Server Error\"\n\t\t},\n\t\t503: {\n\t\t\tstatusCode: 503,\n\t\t\tbody: \"Service Unavailable\"\n\t\t},\n\t\tdefault: {\n\t\t\tstatusCode: 400,\n\t\t\tbody: \"Bad Request\",\n\t\t\thandler(request, response, { statusCode, headers, body }) {\n\t\t\t\treturn response.give(body, headers, statusCode);\n\t\t\t}\n\t\t}\n\t};\n\t\n\t_throw(response: Response, { statusCode, ...restParams }: Omit<ErrorParams, \"body\"> & { body?: ResponseBody }) {\n\t\t\n\t\tconst {\n\t\t\thandler,\n\t\t\t...handlerParams\n\t\t} = {\n\t\t\t...this.#errors.default,\n\t\t\t...this.#errors[statusCode],\n\t\t\t...restParams\n\t\t};\n\t\t\n\t\treturn handler!(response[requestSymbol], response, handlerParams);\n\t}\n\t\n\t#getWeight(regExp: RegExp, priority: number) {\n\t\tconst source = regExp.source.replace(/\\\\\\/\\??\\$?$/, \"\");\n\t\t\n\t\tlet depth = 0;\n\t\tlet wildcards = 0;\n\t\t\n\t\tfor (let i = 0, { length } = source; i < length; i++)\n\t\t\tswitch (source[i]) {\n\t\t\t\tcase \"/\":\n\t\t\t\t\tdepth++;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"*\":\n\t\t\t\t\twildcards++;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\treturn (priority * 1000) + ((depth * 10) - wildcards);\n\t}\n\t\n\t/** Add request listener */\n\taddRequestListener(method: Method | \"ALL\", regExp: RegExpOrString, handler: Handler, priority = 0) {\n\t\tif (typeof regExp == \"string\")\n\t\t\tregExp = pathToRegExp(regExp);\n\t\t\n\t\tif (method && method !== \"ALL\") {\n\t\t\tconst methodListeners = this.#listeners[method];\n\t\t\t\n\t\t\tif (methodListeners) {\n\t\t\t\tconst listener: Listener = [ regExp, handler, priority ];\n\t\t\t\tconst weight = this.#getWeight(regExp, priority);\n\t\t\t\t\n\t\t\t\tfor (let i = 0; i < methodListeners.length; i++) {\n\t\t\t\t\tconst [ anotherRegExp, , anotherPriority ] = methodListeners[i];\n\t\t\t\t\t\n\t\t\t\t\tif (weight > this.#getWeight(anotherRegExp, anotherPriority)) {\n\t\t\t\t\t\tmethodListeners.splice(i, 0, listener);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!methodListeners.includes(listener))\n\t\t\t\t\tmethodListeners.push(listener);\n\t\t\t}\n\t\t} else\n\t\t\tfor (const specificMethod of Object.keys(this.#listeners) as Method[])\n\t\t\t\tthis.addRequestListener(specificMethod, regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add middleware */\n\taddMiddleware(middleware: GenericMiddleware, priority?: Priority) {\n\t\tif (middleware instanceof ClassMiddleware) {\n\t\t\tfor (const [ method, regExpOrStringArrayMap ] of Object.entries(middleware.listeners))\n\t\t\t\tfor (const [ regExpOrString, handler, listenerPriority ] of regExpOrStringArrayMap)\n\t\t\t\t\tthis.addRequestListener(method as Method, regExpOrString, handler, listenerPriority ?? priority ?? middleware.priority);\n\t\t\tmiddleware.bindTo?.(this);\n\t\t} else if (isTupleMiddlewareOrArray(middleware)) {\n\t\t\tif (isTupleMiddleware(middleware))\n\t\t\t\tmiddleware = [ middleware ];\n\t\t\t\n\t\t\tfor (const params of middleware)\n\t\t\t\tthis.addRequestListener(\n\t\t\t\t\t...isMethod(params[0] as string) ?\n\t\t\t\t\t\tparams as readonly [ Method, RegExpOrString, Handler, Priority? ] :\n\t\t\t\t\t\t[ \"GET\", ...params as [ RegExpOrString, Handler, Priority? ] ] as const\n\t\t\t\t);\n\t\t} else\n\t\t\tthis.#parseMappedMiddleware(middleware);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t#parseMappedMiddleware(middleware: Middleware, method: Method | \"ALL\" = \"GET\", prefix: string = \"\") {\n\t\tfor (const [ key, value ] of Object.entries(middleware))\n\t\t\tif (typeof value == \"function\")\n\t\t\t\tif (isMethod(key))\n\t\t\t\t\tthis.addRequestListener(key, prefix, value);\n\t\t\t\telse\n\t\t\t\t\tthis.addRequestListener(method, `${prefix}${key}`, value);\n\t\t\telse\n\t\t\t\tif (isMethod(key))\n\t\t\t\t\tthis.#parseMappedMiddleware(value, key, prefix);\n\t\t\t\telse\n\t\t\t\t\tthis.#parseMappedMiddleware(value, method, `${prefix}${key}`);\n\t\t\n\t}\n\t\n\t/** Add POST request listener */\n\tpost(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"POST\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add GET request listener */\n\tget(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"GET\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add PUT request listener */\n\tput(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"PUT\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add PATCH request listener */\n\tpatch(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"PATCH\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add DELETE request listener */\n\tdelete(regExp: RegExpOrString, handler: Handler, priority?: Priority) {\n\t\tthis.addRequestListener(\"DELETE\", regExp, handler, priority);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t\n\t/** Make props for Node.js http(s).createServer method */\n\tstatic makeProps({ ssl, server }: Options) {\n\t\treturn {\n\t\t\t...resolveSSL(ssl),\n\t\t\tIncomingMessage: Request,\n\t\t\tServerResponse: Response,\n\t\t\t...server\n\t\t} as http.ServerOptions | https.ServerOptions;\n\t}\n\t\n}\n", "import { IncomingMessage } from \"node:http\";\nimport querystring from \"node:querystring\";\nimport { getRemoteAddress } from \"insite-common/backend\";\nimport { matchSymbol } from \"./symbols\";\nimport { extractBearerToken, extractQueryParams, extractUrlParams } from \"./utils\";\nimport type { RequestParams, RequestQueryParams } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @stylistic/max-statements-per-line */\n\n\nexport function matches(request: Request, regExp: RegExp) {\n\tconst match = regExp.exec(request.path);\n\t\n\tif (match) {\n\t\trequest[matchSymbol] = match;\n\t\t\n\t\treturn true;\n\t}\n\t\n\treturn false;\n}\n\n\nexport class RequestBody {\n\tconstructor(request: Request<any>) {\n\t\tthis.#request = request;\n\t\t\n\t}\n\t\n\t#request;\n\t\n\t/** Request body as a ReadableStream */\n\tstream() {\n\t\treturn this.#request;\n\t}\n\t\n\t#text?: string;\n\t\n\t/** Request body as a string */\n\ttext() {\n\t\treturn new Promise<string>((resolve, reject) => {\n\t\t\t\n\t\t\tif (this.#text)\n\t\t\t\tresolve(this.#text);\n\t\t\telse {\n\t\t\t\tlet text = \"\";\n\t\t\t\t\n\t\t\t\tthis.#request.on(\"data\", chunk => { text += chunk; });\n\t\t\t\tthis.#request.on(\"end\", () => { resolve(this.#text = text); });\n\t\t\t\t\n\t\t\t\tthis.#request.on(\"error\", reject);\n\t\t\t}\n\t\t\t\n\t\t});\n\t}\n\t\n\t#bytes?: Uint8Array<ArrayBufferLike>;\n\t\n\t/** Request body as an Uint8Array */\n\tasync bytes() {\n\t\t\n\t\tthis.#bytes ??= new TextEncoder().encode(await this.text());\n\t\t\n\t\treturn this.#bytes;\n\t}\n\t\n\t/** Request body as an ArrayBuffer */\n\tasync arrayBuffer() {\n\t\treturn (await this.bytes()).buffer;\n\t}\n\t\n\t#json?: any;\n\t\n\t/** Request body as a parsed JSON object */\n\tasync json() {\n\t\t\n\t\tthis.#json ??= JSON.parse(await this.text() || \"null\");\n\t\t\n\t\treturn this.#json;\n\t}\n\t\n\t#urlEncoded?: querystring.ParsedUrlQuery;\n\t\n\t/** Request body as a parsed URL-encoded object */\n\tasync urlEncoded() {\n\t\t\n\t\tthis.#urlEncoded = querystring.parse(await this.text());\n\t\t\n\t\treturn this.#urlEncoded;\n\t}\n\t\n\t// TODO:\n\t/** Request body as a parsed MessagePack object */\n\t// messagePack() {\n\t// }\n\t\n}\n\n\nexport class Request<P = RequestParams> extends IncomingMessage {\n\t\n\tdeclare url: string;\n\t\n\t/** Pathname part of the URL string */\n\tpath!: string;\n\t\n\t/** Query string part of the URL string */\n\tquerystring!: string;\n\t\n\t#ip?: string;\n\t\n\t/** IPv4 */\n\tget ip() {\n\t\treturn (this.#ip ??= getRemoteAddress(this));\n\t}\n\t\n\t[matchSymbol]?: RegExpExecArray;\n\t\n\t#params?: P;\n\t\n\t/** Params parsed from the URL string */\n\tget params() {\n\t\treturn (this.#params ??= extractUrlParams(this) as P);\n\t}\n\t\n\t#query?: RequestQueryParams;\n\t\n\t/** Params parsed from the query string part of the URL string */\n\tget query() {\n\t\treturn (this.#query ??= extractQueryParams(this));\n\t}\n\t\n\t#bearer?: string | null;\n\t\n\t/** Authorization: Bearer token */\n\tget bearer() {\n\t\treturn (this.#bearer ??= extractBearerToken(this));\n\t}\n\t\n\t#body?: RequestBody;\n\t\n\t/** Object with async methods to get the request body */\n\tget body() {\n\t\treturn (this.#body ??= new RequestBody(this));\n\t}\n\t\n}\n", "export const serverSymbol = Symbol(\"server\");\nexport const requestSymbol = Symbol(\"request\");\nexport const matchSymbol = Symbol(\"match\");\n", "import { matchSymbol } from \"./symbols\";\nimport type { Request } from \"./Request\";\nimport type { RequestParams, RequestQueryParams } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nconst pathRegExp = /\\/(?:(\\*)|:([^/?]+)(\\?(.*))?)/g;\n\nfunction subPathToRegExpSource(path: string, index = 0): string {\n\treturn path.replaceAll(pathRegExp, (_, wildcard, param, optional, subPath) => {\n\t\tif (wildcard)\n\t\t\treturn `/(?<__${index++}>.*?)`;\n\t\t\n\t\tconst group = `/(?<${param}>[^/]+)`;\n\t\t\n\t\treturn optional ?\n\t\t\t`(?:${group}${subPath ? subPathToRegExpSource(subPath, index) : \"\"})?` :\n\t\t\tgroup;\n\t});\n}\n\nexport function pathToRegExp(path: string) {\n\treturn new RegExp(`^${path.startsWith(\"/\") ? \"\" : \"/\"}${subPathToRegExpSource(path)}/?$`);\n}\n\n\nconst wildcardKeyRegExp = /^__/;\n\nexport function extractUrlParams(request: Request<any>): RequestParams {\n\tconst match = request[matchSymbol];\n\t\n\tif (match) {\n\t\tdelete request[matchSymbol];\n\t\t\n\t\tconst params = [ undefined, ...match.slice(1) ] as RequestParams;\n\t\t\n\t\tif (match.groups)\n\t\t\tfor (const [ key, value ] of Object.entries(match.groups))\n\t\t\t\tparams[key.replace(wildcardKeyRegExp, \"\")] = value;\n\t\t\n\t\treturn params;\n\t}\n\t\n\treturn [] as unknown as RequestParams;\n}\n\n\nexport function extractQueryParams({ querystring }: Request<any>): RequestQueryParams {\n\treturn querystring?.split(\"&\").reduce((queryParams, pair) => {\n\t\tconst [ key, value ] = pair.split(\"=\");\n\t\t\n\t\ttry {\n\t\t\tqueryParams[key] = decodeURIComponent(value || \"\");\n\t\t} catch {\n\t\t\tqueryParams[key] = \"\";\n\t\t}\n\t\t\n\t\treturn queryParams;\n\t}, {} as RequestQueryParams) ?? {};\n}\n\nexport function extractBearerToken({ headers: { authorization } }: Request<any>) {\n\tif (authorization?.indexOf(\"Bearer \") === 0)\n\t\treturn authorization.slice(7);\n\t\n\treturn null;\n}\n", "import { ServerResponse } from \"node:http\";\nimport { Readable } from \"node:stream\";\nimport { cleanup } from \"@nesvet/n\";\nimport { requestSymbol, serverSymbol } from \"./symbols\";\nimport type { Request } from \"./Request\";\nimport type { HTTPServer } from \"./Server\";\nimport type {\n\tErrorHandler,\n\tJSONResponseBody,\n\tResponseBody,\n\tResponseHeaders,\n\tUrlEncodedResponseBody\n} from \"./types\";\n\n\nexport class Response extends ServerResponse<Request> {\n\t\n\t[serverSymbol]!: HTTPServer;\n\t[requestSymbol]!: Request;\n\t\n\t/** Set status code */\n\tstatus(code: number) {\n\t\tthis.statusCode = code;\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Set status code */\n\tset(headers: Record<string, string[] | string>): this;\n\tset(header: string, value: string[] | string): this;\n\tset(header: Record<string, string[] | string> | string, value?: string[] | string) {\n\t\tif (typeof header == \"string\")\n\t\t\treturn this.setHeader(header, value!);\n\t\t\n\t\t// eslint-disable-next-line guard-for-in\n\t\tfor (const key in header)\n\t\t\tthis.setHeader(key, header[key]);\n\t\t\n\t\treturn this;\n\t}\n\t\n\theader = this.set;\n\t\n\t/** End response with a plain text */\n\ttext(body: string, statusCode = 200) {\n\t\treturn this.writeHead(statusCode, {\n\t\t\t\"Content-Type\": \"text/plain; charset=utf-8\",\n\t\t\t\"Content-Length\": Buffer.byteLength(body)\n\t\t}).end(body);\n\t}\n\t\n\t/** End response with a JSON string */\n\tjson(value: JSONResponseBody, statusCode = 200) {\n\t\tconst body = JSON.stringify(value) ?? \"{}\";\n\t\t\n\t\treturn this.writeHead(statusCode, {\n\t\t\t\"Content-Type\": \"application/json; charset=utf-8\",\n\t\t\t\"Content-Length\": Buffer.byteLength(body)\n\t\t}).end(body);\n\t}\n\t\n\t/** End response with an URL-encoded string */\n\turlEncoded(params: UrlEncodedResponseBody, statusCode = 200) {\n\t\tconst body = new URLSearchParams(params).toString();\n\t\t\n\t\treturn this.writeHead(statusCode, {\n\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded; charset=utf-8\",\n\t\t\t\"Content-Length\": Buffer.byteLength(body)\n\t\t}).end(body);\n\t}\n\t\n\t/** End response with a stream */\n\tstream(stream: Readable, statusCode?: number): this;\n\tstream(stream: Readable, headers?: ResponseHeaders, statusCode?: number): this;\n\tstream(stream: Readable, headers?: ResponseHeaders | number, statusCode = 200) {\n\t\tif (typeof headers == \"number\") {\n\t\t\tstatusCode = headers;\n\t\t\theaders = undefined;\n\t\t}\n\t\t\n\t\tthis.writeHead(statusCode, headers);\n\t\t\n\t\treturn stream.pipe(this);\n\t}\n\t\n\t/** End response depend on the type of the passed body */\n\tgive(body: ResponseBody, statusCode?: number): this;\n\tgive(body: ResponseBody, headers?: ResponseHeaders, statusCode?: number): this;\n\tgive(body: ResponseBody, headers?: ResponseHeaders | number, statusCode = 200) {\n\t\tif (typeof headers == \"number\") {\n\t\t\tstatusCode = headers;\n\t\t\theaders = undefined;\n\t\t}\n\t\t\n\t\treturn (\n\t\t\ttypeof body == \"string\" ?\n\t\t\t\tthis.text(body, statusCode) :\n\t\t\t\tbody instanceof Readable ?\n\t\t\t\t\tthis.stream(body, headers, statusCode) :\n\t\t\t\t\tthis.json(body, statusCode)\n\t\t);\n\t}\n\t\n\t// TODO:\n\t// messagePack() {\n\t// }\n\t\n\t/** End response with an error */\n\terror(statusCode: number, body?: ResponseBody, { headers, handler }: { headers?: ResponseHeaders; handler?: ErrorHandler } = {}) {\n\t\treturn this[serverSymbol]._throw(this, cleanup({ statusCode, headers, body, handler }));\n\t}\n\t\n\t/** End response with the 400 Bad Request */\n\tbadRequest(body?: ResponseBody) {\n\t\treturn this.error(400, body);\n\t}\n\t\n\t/** End response with the 401 Unauthorized */\n\tunauthorized(body?: ResponseBody) {\n\t\treturn this.error(401, body);\n\t}\n\t\n\t/** End response with the 403 Forbidden */\n\tforbidden(body?: ResponseBody) {\n\t\treturn this.error(403, body);\n\t}\n\t\n\t/** End response with the 404 Not Found */\n\tnotFound(body?: ResponseBody) {\n\t\treturn this.error(404, body);\n\t}\n\t\n\t/** End response with the 408 Request Timeout */\n\trequestTimeout(body?: ResponseBody) {\n\t\treturn this.error(408, body);\n\t}\n\t\n\t/** End response with the 410 Gone */\n\tgone(body?: ResponseBody) {\n\t\treturn this.error(410, body);\n\t}\n\t\n\t/** End response with the 500 Internal Server Error */\n\tinternalServerError(body?: ResponseBody) {\n\t\treturn this.error(500, body);\n\t}\n\t\n\t/** End response with the 503 Service Unavailable */\n\tserviceUnavailable(body?: ResponseBody) {\n\t\treturn this.error(503, body);\n\t}\n\t\n}\n", "import type http from \"node:http\";\nimport type https from \"node:https\";\nimport type { Readable } from \"node:stream\";\nimport type { ClassMiddleware } from \"./Middleware\";\nimport type { Request } from \"./Request\";\nimport type { Response } from \"./Response\";\n\n\nconst METHODS = [ \"DELETE\", \"GET\", \"PATCH\", \"POST\", \"PUT\" ] as const;\n\nexport type Method = typeof METHODS[number];\n\nexport function isMethod(string: string): string is Method | \"ALL\" {\n\treturn METHODS.includes(string as Method) || string === \"ALL\";\n}\n\nexport type Next<R = unknown> = () => Promise<R>;\n\nexport type Priority = number;\n\nexport type Handler = (request: Request, response: Response, next: Next) => unknown;\n\nexport type Listener = [ RegExp, Handler, Priority ];\n\nexport type Options = {\n\t\n\t/**\n\t * Icon for console logs\n\t * @default \"\uD83D\uDD78\uFE0F \"\n\t */\n\ticon?: string;\n\t\n\t/**\n\t * Name\n\t * @default \"HTTP\"\n\t */\n\tname?: string;\n\t\n\tssl?: {\n\t\tcert: Buffer | string;\n\t\tkey: Buffer | string;\n\t};\n\tport?: number | string;\n\thttps?: boolean;\n\tlisteners?: Partial<Record<Method | \"ALL\", Listener[]>>;\n\terrors?: Record<\"default\" | number, ErrorParams>;\n\tserver?: http.Server | http.ServerOptions | https.Server | https.ServerOptions;\n};\n\nexport type RegExpOrString = RegExp | string;\n\nexport type RequestParams = Record<string, string> & [ undefined, ...string[] ];\n\nexport type RequestQueryParams = Record<string, string>;\n\nexport type Middleware = {\n\t[K: string]: Handler | Middleware;\n} | {\n\t[K: {} & string]: Handler | Middleware;\n} | {\n\t[K in Method | \"ALL\"]?: Middleware;\n};\n\nexport type TupleMiddleware = readonly [ Method, RegExpOrString, Handler, Priority? ] | readonly [ RegExpOrString, Handler, Priority? ];\n\nexport type GenericMiddleware =\n\tClassMiddleware |\n\tMiddleware |\n\tTupleMiddleware |\n\tTupleMiddleware[];\n\nexport function isTupleMiddlewareOrArray(middleware: GenericMiddleware): middleware is TupleMiddleware | TupleMiddleware[] {\n\treturn Array.isArray(middleware);\n}\n\nexport function isTupleMiddleware(middleware: TupleMiddleware | TupleMiddleware[]): middleware is TupleMiddleware {\n\treturn !Array.isArray(middleware);\n}\n\nexport function isRequestMethodAccepted(requestMethod: string | undefined, listeners: Record<string, unknown>): requestMethod is Method {\n\treturn Boolean(requestMethod && listeners[requestMethod]);\n}\n\nexport function isServerServer(serverOrOptions: Options[\"server\"]): serverOrOptions is http.Server | https.Server {\n\treturn !!serverOrOptions && \"emit\" in serverOrOptions;\n}\n\nexport type ResponseHeaders = http.OutgoingHttpHeader[] | http.OutgoingHttpHeaders;\n\nexport type JSONResponseBody = Parameters<JSON[\"stringify\"]>[0];\n\nexport type UrlEncodedResponseBody = ConstructorParameters<typeof URLSearchParams>[0];\n\nexport type ResponseBody = JSONResponseBody | Readable | UrlEncodedResponseBody | string;// eslint-disable-line @typescript-eslint/no-redundant-type-constituents\n\nexport type ErrorParams = {\n\tstatusCode: number;\n\theaders?: ResponseHeaders;\n\tbody: ResponseBody;\n\thandler?: ErrorHandler;\n};\n\nexport type ErrorHandler = (request: Request, response: Response, errorParams: Omit<ErrorParams, \"handler\">) => Response;\n", "import { StaticMiddleware, StaticMiddlewareOptions } from \"./middlewares/Static\";\nimport { HTTPServer } from \"./Server\";\nimport { GenericMiddleware, Options } from \"./types\";\n\n\nexport class StaticServer extends HTTPServer {\n\tconstructor(options: StaticMiddlewareOptions, serverOptions: Options, middlewares: GenericMiddleware[] = []) {\n\t\tsuper(serverOptions, [\n\t\t\tnew StaticMiddleware(options),\n\t\t\t...middlewares\n\t\t]);\n\t\t\n\t}\n\t\n\tname = \"Static\";\n\ticon = \"\uD83D\uDED2\";\n\t\n}\n"],
5
+ "mappings": "AASO,IAAMA,EAAN,KAAsB,CAC5B,SAAqB,EACrB,SAED,ECsBO,IAAMC,GAAqB,OCnClC,OAAOC,MAAQ,UACf,OAAOC,MAAU,YCDjB,OAAOC,MAA8B,YAMrC,IAAMC,EAAuB,CAC5B,OAAQ,CACP,CAACD,EAAK,UAAU,iBAAiB,EAAGA,EAAK,UAAU,iBACnD,CAACA,EAAK,UAAU,oBAAoB,EAAG,EACxC,CACD,EAEME,EAAuB,CAC5B,OAAQ,CACP,CAACF,EAAK,UAAU,iBAAiB,EAAGA,EAAK,UAAU,iBACnD,CAACA,EAAK,UAAU,oBAAoB,EAAG,CACxC,CACD,EAEMG,EAAqB,CAC1B,MAAO,CACR,EAEMC,EAAqB,CAC1B,MAAO,CACR,EAGO,SAASC,EAAkBC,EAAiB,CAClD,OAAON,EAAK,mBAAmBM,EAAML,CAAoB,CAC1D,CAEO,SAASM,EAAgBD,EAAiB,CAChD,OAAON,EAAK,SAASM,EAAMH,CAAkB,CAC9C,CAEO,SAASK,EAA+BC,EAAgC,CAC9E,OAAOA,IAAoB,KAAOT,EAAK,qBAAqBE,CAAoB,EAAIF,EAAK,WAAWI,CAAkB,CACvH,CAEO,SAASM,EAAwBC,EAAkBC,EAAoBC,EAA8BP,EAAiB,CAC5H,IAAMQ,EAAmB,SAAS,KAAKH,EAAQ,QAAQ,iBAAiB,CAAW,EACnFE,EAAQ,kBAAkB,EAAIC,EAAmB,KAAO,OACxDF,EAAS,UAAU,IAAKC,CAAO,EAAE,IAAIC,EAAmBd,EAAK,mBAAmBM,EAAMJ,CAAoB,EAAIF,EAAK,SAASM,EAAMF,CAAkB,CAAC,CAEtJ,CC3CO,IAAMW,EAAoB,CAEhC,CAAE,KAAM,CACP,OAAQ,GACR,SAAU,iBACX,CAAE,EAEF,CAAE,MAAO,CACR,OAAQ,GACR,SAAU,UACX,CAAE,EAEF,CAAE,MAAO,CACR,SAAU,cACX,CAAE,EAEF,QAAQ,IAAI,WAAa,cAAgB,CAAE,UAAW,CACrD,OAAQ,GACR,SAAU,kBACX,CAAE,EAAI,KAEN,QAAQ,IAAI,WAAa,cAAgB,CAAE,SAAU,CACpD,OAAQ,GACR,SAAU,kBACX,CAAE,EAAI,KAEN,CAAE,MAAO,CACR,SAAU,YACX,CAAE,EAEF,CAAE,OAAQ,CACT,SAAU,YACX,CAAE,EAEF,CAAE,MAAO,CACR,SAAU,WACX,CAAE,EAEF,CAAE,MAAO,CACR,OAAQ,GACR,SAAU,eACX,CAAE,CAEH,EAAE,OAAO,OAAO,EC9CT,IAAMC,EAAmB,CAC/B,GAAG,QAAQ,IAAI,WAAa,aAAe,CAI1C,YACA,cACD,EAAI,CAAC,CACN,EHGA,GAAM,CAAE,mBAAAC,EAAqB,EAAG,EAAI,QAAQ,IAEtCC,GAAgB,CACrB,SAAU,0BACX,EAGaC,EAAN,cAA+BC,CAAgB,CACrD,YAAY,CACX,IAAAC,EAAM,SACN,KAAAC,EAAOL,EACP,KAAMM,EACN,WAAAC,EAAaC,EACb,SAAAC,EACA,WAAAC,EACA,UAAAC,EAAY,SACb,EAAa,CAAC,EAAG,CAGhB,GAFA,MAAM,EAEF,CAACC,EAAK,WAAWR,CAAG,EAAG,CAC1B,GAAM,CAAE,CAAES,CAAW,EAAI,QAAQ,KACjCT,EAAMQ,EAAK,QAAQE,EAAG,SAASD,CAAU,EAAE,YAAY,EAAIA,EAAaD,EAAK,QAAQC,CAAU,EAAGT,CAAG,CACtG,CAKA,GAHA,KAAKW,GAAOX,EACZ,KAAKY,GAAc,IAAI,OAAO,IAAIJ,EAAK,KAAK,IAAKP,EAAM,GAAG,CAAC,EAAE,EAEzDE,EACH,QAAWU,KAAaV,EACnBU,GACH,KAAKC,GAAc,GAAGD,CAAS,EAElC,GAAIR,EACH,QAAWU,KAAYV,EAClBU,GACH,KAAKC,GAAS,GAAGD,CAAQ,EAE5B,GAAIT,EACH,QAAWW,KAAYX,EAClBW,GACH,KAAKC,GAAUD,CAAQ,EAE1B,GAAIV,EAAW,CACVA,IAAc,YACjBA,EAAYY,GAEb,QAAWF,KAAYV,EAClBU,GACH,KAAKG,GAASH,CAAQ,CACzB,CAEA,KAAK,UAAY,CAChB,IAAK,CAAE,CAAEf,GAAS,IAAI,OAAO,OAAO,OAAOM,EAAK,KAAK,IAAKP,EAAM,GAAG,CAAC,2BAA2B,EAAG,KAAKoB,EAAS,CAAE,CACnH,CAED,CAEA,SAAW,KAEXV,GACAC,GAEAU,GAAc,IAAI,IAElBC,GAAY,IAAI,IAEhBC,GAAc,IAAI,IAElBC,GAAa,IAAI,IAEjBC,GAAgBT,EAAkB,CACjC,OAAO,KAAKK,GAAY,IAAIL,EAAS,MAAM,KAAK,IAAI,EAAGA,EAAS,YAAY,GAAG,EAAI,CAAC,CAAC,CAAC,GAAKpB,EAC5F,CAEAiB,GAAca,EAAcd,EAAyB,CACpD,KAAKS,GAAY,IAAIK,EAAM,CAAE,GAAGd,EAAW,KAAAc,CAAK,CAAC,CAElD,CAEAX,GAASY,EAAaX,EAAkB,CACvC,KAAKM,GAAU,IAAIK,EAAKpB,EAAK,WAAWS,CAAQ,EAAIA,EAAWT,EAAK,KAAK,KAAKG,GAAMM,CAAQ,CAAC,CAE9F,CAEAC,GAAUD,EAAkB,CAC3B,KAAKO,GAAY,IAAIhB,EAAK,KAAK,KAAKG,GAAMM,CAAQ,CAAC,CAEpD,CAEAG,GAASH,EAAkB,CAC1BA,EAAW,KAAKM,GAAU,IAAIN,CAAQ,GAAKT,EAAK,KAAK,KAAKG,GAAMM,CAAQ,EAExE,GAAI,CACH,GAAM,CAAE,OAAAY,CAAO,EAAI,KAAKH,GAAgBT,CAAQ,EAC1Ca,EAAWpB,EAAG,aAAaO,EAAUY,EAAS,OAAS,IAAI,EACjE,KAAKJ,GAAW,IAAIR,EAAUY,EAAS,CACtC,GAAIE,EAAkBD,CAAQ,EAC9B,KAAME,EAAgBF,CAAQ,CAC/B,EAAIA,CAAQ,CACb,OAASG,EAAO,CACf,QAAQ,KAAK,yDAA+ChB,CAAQ,GAAI;AAAA,EAAMgB,CAAK,CACpF,CAED,CAEAZ,GAAoB,CAACa,EAASC,IAAa,CAE1C,IAAIlB,EAEJ,GAAI,CACHA,EAAW,UAAUiB,EAAQ,GAAG,CACjC,MAAQ,CACP,OAAOC,EAAS,SAAS,CAC1B,CAMA,GAJAlB,EAAWA,EAAS,QAAQ,KAAKL,GAAa,EAAE,EAAE,WAAW,MAAO,EAAE,EAEtEK,EAAW,KAAKM,GAAU,IAAIN,CAAQ,GAAKT,EAAK,KAAK,KAAKG,GAAMM,CAAQ,EAEpE,KAAKO,GAAY,IAAIP,CAAQ,EAChC,MAAO,GAER,GAAI,CAACP,EAAG,WAAWO,CAAQ,EAC1B,OAAOkB,EAAS,SAAS,EAE1B,GAAM,CAAE,SAAAC,EAAU,OAAAP,CAAO,EAAI,KAAKH,GAAgBT,CAAQ,EACpDoB,EAAkBR,EAAS,SAAS,KAAKK,EAAQ,QAAQ,iBAAiB,CAAW,EAAI,KAAO,OAAS,KAE/GC,EAAS,UAAU,IAAK,CACvB,eAAgBC,GAAYP,EAAS,kBAAoB,IACzD,GAAGQ,GAAmB,CAAE,mBAAoBA,CAAgB,CAC7D,CAAC,EAED,IAAM9B,EAAY,KAAKkB,GAAW,IAAIR,CAAQ,EAE9C,OAAIV,EACI4B,EAAS,IAAIN,GAAUQ,EAAkB9B,EAAU8B,CAAe,EAAI9B,CAAS,EAEhF,IAAI,QAAQ+B,GAAW,CAC7B,IAAIC,EAAmB7B,EAAG,iBAAiBO,CAAQ,EAAE,GAAG,QAAS,IAAMqB,EAAQ,EAAK,CAAC,EAEjFD,IACHE,EAASA,EAAO,KAAKC,EAA+BH,CAAe,CAAC,GAErEE,EAAO,GAAG,MAAOD,CAAO,EAExBC,EAAO,KAAKJ,CAAQ,CAErB,CAAC,CACF,CAED,EIlKA,OAAS,WAAAM,OAAe,YAMxB,GAAM,CACL,mBAAAC,EAAqB,GACrB,aAAAC,EACD,EAAI,QAAQ,IAENC,EAAsC,CAAC,EAC7C,QAAWC,KAAO,QAAQ,IACrBA,EAAI,WAAW,gBAAgB,IAClCD,EAAWC,EAAI,QAAQ,iBAAkB,EAAE,EAAE,YAAY,CAAC,EAAI,QAAQ,IAAIA,CAAG,GAE/E,IAAMC,GAAU,CAAE,eAAgB,0BAA2B,EAgC7D,SAASC,EAAgBC,EAAe,CACvC,OAAOA,EAAM,WAAW,IAAK,OAAO,EAAE,WAAW,IAAK,MAAM,EAAE,WAAW,IAAM,QAAQ,CACxF,CAEA,SAASC,GAAYC,EAAc,CAClC,OAAIA,EAAK,WAAW,SAAS,GAAKA,EAAK,WAAW,UAAU,EACpDA,EAEJA,EAAK,WAAW,GAAG,EACf,GAAGR,CAAkB,GAAGQ,CAAI,GAE7BA,CACR,CAEA,SAASC,GAAWC,EAAoC,CACvD,IAAMC,GAASD,EAAK,OAAS,CAAC,GAAG,IAAIE,GAAQ,CAC5C,IAAMC,EAAa,CAClB,QAAQR,EAAgBO,EAAK,GAAG,CAAC,IACjC,SAASP,EAAgBE,GAAYK,EAAK,IAAI,CAAC,CAAC,GACjD,EAEA,OAAIA,EAAK,MACRC,EAAW,KAAK,SAASR,EAAgBO,EAAK,IAAI,CAAC,GAAG,EAEnDA,EAAK,OACRC,EAAW,KAAK,UAAUR,EAAgBO,EAAK,KAAK,CAAC,GAAG,EAElD,SAASC,EAAW,KAAK,GAAG,CAAC,GACrC,CAAC,EAEKC,GAAQJ,EAAK,MAAQ,CAAC,GAAG,IAAIK,GAAQ,CAC1C,IAAMF,EAAuB,CAAC,EAE9B,OAAIE,EAAK,MACRF,EAAW,KAAK,SAASR,EAAgBU,EAAK,IAAI,CAAC,GAAG,EAEnDA,EAAK,UACRF,EAAW,KAAK,aAAaR,EAAgBU,EAAK,QAAQ,CAAC,GAAG,EAE/DF,EAAW,KAAK,YAAYR,EAAgBU,EAAK,OAAO,CAAC,GAAG,EAErD,SAASF,EAAW,KAAK,GAAG,CAAC,KACrC,CAAC,EAED,MAAO,CAAE,GAAGF,EAAO,GAAGG,CAAK,EAAE,KAAK,EAAE,CACrC,CAGO,IAAME,EAAN,cAAiCC,CAAgB,CACvD,YAAY,CACX,KAAAC,EAAO,KACP,QAAAC,EAAU,CAAC,EACX,MAAAC,EAAQnB,IAAgB,SACxB,IAAAoB,EAAM,CAAC,EACP,OAAAC,EAAS,OACT,KAAAC,EAAO,KACP,KAAAb,EAAO,CAAC,CACT,EAAa,CAAC,EAAG,CAChB,MAAM,EAEN,KAAK,UAAY,CAChB,IAAK,CAAE,CAAEQ,EAAM,KAAKM,EAAS,CAAE,CAChC,EAEA,KAAKC,GAASL,EACd,KAAKM,GAAO,MAAM,QAAQL,CAAG,EAAIA,EAAM,CAAEA,CAAI,EAC7C,KAAKM,GAAUL,EAEf,OAAO,OAAOH,EAASjB,CAAU,EAEjC,KAAK0B,GACJ,8BACevB,EAAgBkB,CAAI,CAAC,iIAI1B,KAAKE,EAAM,sDACyBzB,CAAkB,iBAChES,GAAWC,CAAI,EACf,GAAG,KAAKgB,GAAK,IAAIG,GAAY,gCAAgC7B,CAAkB,IAAI6B,CAAQ,MAAM,EAAE,KAAK,EAAE,CAAC,GACxGC,GAAQX,CAAO,EAAI,GAAK,+BAA+B,KAAK,UAAUA,CAAO,CAAC,YAAY,uCACtDnB,CAAkB,mDAG7C,KAAK2B,EAAO,wBAK1B,CAEA,SAAW,KAEXF,GACAC,GACAC,GACAC,GAEAJ,GAAoB,CAACO,EAASC,IAC7BC,EAAwBF,EAASC,EAAU5B,GAAS,KAAKwB,EAAK,CAEhE,ECnJA,OAAS,gBAAAM,GAAc,cAAAC,GAAY,8BAAAC,MAAkC,wBCFrE,OAAS,mBAAAC,OAAuB,YAChC,OAAOC,OAAiB,mBACxB,OAAS,oBAAAC,OAAwB,wBCF1B,IAAMC,EAAe,OAAO,QAAQ,EAC9BC,EAAgB,OAAO,SAAS,EAChCC,EAAc,OAAO,OAAO,ECMzC,IAAMC,GAAa,iCAEnB,SAASC,EAAsBC,EAAcC,EAAQ,EAAW,CAC/D,OAAOD,EAAK,WAAWF,GAAY,CAACI,EAAGC,EAAUC,EAAOC,EAAUC,IAAY,CAC7E,GAAIH,EACH,MAAO,SAASF,GAAO,QAExB,IAAMM,EAAQ,OAAOH,CAAK,UAE1B,OAAOC,EACN,MAAME,CAAK,GAAGD,EAAUP,EAAsBO,EAASL,CAAK,EAAI,EAAE,KAClEM,CACF,CAAC,CACF,CAEO,SAASC,EAAaR,EAAc,CAC1C,OAAO,IAAI,OAAO,IAAIA,EAAK,WAAW,GAAG,EAAI,GAAK,GAAG,GAAGD,EAAsBC,CAAI,CAAC,KAAK,CACzF,CAGA,IAAMS,GAAoB,MAEnB,SAASC,EAAiBC,EAAsC,CACtE,IAAMC,EAAQD,EAAQE,CAAW,EAEjC,GAAID,EAAO,CACV,OAAOD,EAAQE,CAAW,EAE1B,IAAMC,EAAS,CAAE,OAAW,GAAGF,EAAM,MAAM,CAAC,CAAE,EAE9C,GAAIA,EAAM,OACT,OAAW,CAAEG,EAAKC,CAAM,IAAK,OAAO,QAAQJ,EAAM,MAAM,EACvDE,EAAOC,EAAI,QAAQN,GAAmB,EAAE,CAAC,EAAIO,EAE/C,OAAOF,CACR,CAEA,MAAO,CAAC,CACT,CAGO,SAASG,EAAmB,CAAE,YAAAC,CAAY,EAAqC,CACrF,OAAOA,GAAa,MAAM,GAAG,EAAE,OAAO,CAACC,EAAaC,IAAS,CAC5D,GAAM,CAAEL,EAAKC,CAAM,EAAII,EAAK,MAAM,GAAG,EAErC,GAAI,CACHD,EAAYJ,CAAG,EAAI,mBAAmBC,GAAS,EAAE,CAClD,MAAQ,CACPG,EAAYJ,CAAG,EAAI,EACpB,CAEA,OAAOI,CACR,EAAG,CAAC,CAAuB,GAAK,CAAC,CAClC,CAEO,SAASE,EAAmB,CAAE,QAAS,CAAE,cAAAC,CAAc,CAAE,EAAiB,CAChF,OAAIA,GAAe,QAAQ,SAAS,IAAM,EAClCA,EAAc,MAAM,CAAC,EAEtB,IACR,CFzDO,SAASC,EAAQC,EAAkBC,EAAgB,CACzD,IAAMC,EAAQD,EAAO,KAAKD,EAAQ,IAAI,EAEtC,OAAIE,GACHF,EAAQG,CAAW,EAAID,EAEhB,IAGD,EACR,CAGO,IAAME,EAAN,KAAkB,CACxB,YAAYJ,EAAuB,CAClC,KAAKK,GAAWL,CAEjB,CAEAK,GAGA,QAAS,CACR,OAAO,KAAKA,EACb,CAEAC,GAGA,MAAO,CACN,OAAO,IAAI,QAAgB,CAACC,EAASC,IAAW,CAE/C,GAAI,KAAKF,GACRC,EAAQ,KAAKD,EAAK,MACd,CACJ,IAAIG,EAAO,GAEX,KAAKJ,GAAS,GAAG,OAAQK,GAAS,CAAED,GAAQC,CAAO,CAAC,EACpD,KAAKL,GAAS,GAAG,MAAO,IAAM,CAAEE,EAAQ,KAAKD,GAAQG,CAAI,CAAG,CAAC,EAE7D,KAAKJ,GAAS,GAAG,QAASG,CAAM,CACjC,CAED,CAAC,CACF,CAEAG,GAGA,MAAM,OAAQ,CAEb,YAAKA,KAAW,IAAI,YAAY,EAAE,OAAO,MAAM,KAAK,KAAK,CAAC,EAEnD,KAAKA,EACb,CAGA,MAAM,aAAc,CACnB,OAAQ,MAAM,KAAK,MAAM,GAAG,MAC7B,CAEAC,GAGA,MAAM,MAAO,CAEZ,YAAKA,KAAU,KAAK,MAAM,MAAM,KAAK,KAAK,GAAK,MAAM,EAE9C,KAAKA,EACb,CAEAC,GAGA,MAAM,YAAa,CAElB,YAAKA,GAAcC,GAAY,MAAM,MAAM,KAAK,KAAK,CAAC,EAE/C,KAAKD,EACb,CAOD,EAGaE,EAAN,cAAyCC,EAAgB,CAK/D,KAGA,YAEAC,GAGA,IAAI,IAAK,CACR,OAAQ,KAAKA,KAAQC,GAAiB,IAAI,CAC3C,CAEA,CAACf,CAAW,EAEZgB,GAGA,IAAI,QAAS,CACZ,OAAQ,KAAKA,KAAYC,EAAiB,IAAI,CAC/C,CAEAC,GAGA,IAAI,OAAQ,CACX,OAAQ,KAAKA,KAAWC,EAAmB,IAAI,CAChD,CAEAC,GAGA,IAAI,QAAS,CACZ,OAAQ,KAAKA,KAAYC,EAAmB,IAAI,CACjD,CAEAC,GAGA,IAAI,MAAO,CACV,OAAQ,KAAKA,KAAU,IAAIrB,EAAY,IAAI,CAC5C,CAED,EGnJA,OAAS,kBAAAsB,OAAsB,YAC/B,OAAS,YAAAC,OAAgB,cACzB,OAAS,WAAAC,OAAe,YAajB,IAAMC,EAAN,cAAuBC,EAAwB,CAErD,CAACC,CAAY,EACb,CAACC,CAAa,EAGd,OAAOC,EAAc,CACpB,YAAK,WAAaA,EAEX,IACR,CAKA,IAAIC,EAAoDC,EAA2B,CAClF,GAAI,OAAOD,GAAU,SACpB,OAAO,KAAK,UAAUA,EAAQC,CAAM,EAGrC,QAAWC,KAAOF,EACjB,KAAK,UAAUE,EAAKF,EAAOE,CAAG,CAAC,EAEhC,OAAO,IACR,CAEA,OAAS,KAAK,IAGd,KAAKC,EAAcC,EAAa,IAAK,CACpC,OAAO,KAAK,UAAUA,EAAY,CACjC,eAAgB,4BAChB,iBAAkB,OAAO,WAAWD,CAAI,CACzC,CAAC,EAAE,IAAIA,CAAI,CACZ,CAGA,KAAKF,EAAyBG,EAAa,IAAK,CAC/C,IAAMD,EAAO,KAAK,UAAUF,CAAK,GAAK,KAEtC,OAAO,KAAK,UAAUG,EAAY,CACjC,eAAgB,kCAChB,iBAAkB,OAAO,WAAWD,CAAI,CACzC,CAAC,EAAE,IAAIA,CAAI,CACZ,CAGA,WAAWE,EAAgCD,EAAa,IAAK,CAC5D,IAAMD,EAAO,IAAI,gBAAgBE,CAAM,EAAE,SAAS,EAElD,OAAO,KAAK,UAAUD,EAAY,CACjC,eAAgB,mDAChB,iBAAkB,OAAO,WAAWD,CAAI,CACzC,CAAC,EAAE,IAAIA,CAAI,CACZ,CAKA,OAAOG,EAAkBC,EAAoCH,EAAa,IAAK,CAC9E,OAAI,OAAOG,GAAW,WACrBH,EAAaG,EACbA,EAAU,QAGX,KAAK,UAAUH,EAAYG,CAAO,EAE3BD,EAAO,KAAK,IAAI,CACxB,CAKA,KAAKH,EAAoBI,EAAoCH,EAAa,IAAK,CAC9E,OAAI,OAAOG,GAAW,WACrBH,EAAaG,EACbA,EAAU,QAIV,OAAOJ,GAAQ,SACd,KAAK,KAAKA,EAAMC,CAAU,EAC1BD,aAAgBK,GACf,KAAK,OAAOL,EAAMI,EAASH,CAAU,EACrC,KAAK,KAAKD,EAAMC,CAAU,CAE9B,CAOA,MAAMA,EAAoBD,EAAqB,CAAE,QAAAI,EAAS,QAAAE,CAAQ,EAA2D,CAAC,EAAG,CAChI,OAAO,KAAKZ,CAAY,EAAE,OAAO,KAAMa,GAAQ,CAAE,WAAAN,EAAY,QAAAG,EAAS,KAAAJ,EAAM,QAAAM,CAAQ,CAAC,CAAC,CACvF,CAGA,WAAWN,EAAqB,CAC/B,OAAO,KAAK,MAAM,IAAKA,CAAI,CAC5B,CAGA,aAAaA,EAAqB,CACjC,OAAO,KAAK,MAAM,IAAKA,CAAI,CAC5B,CAGA,UAAUA,EAAqB,CAC9B,OAAO,KAAK,MAAM,IAAKA,CAAI,CAC5B,CAGA,SAASA,EAAqB,CAC7B,OAAO,KAAK,MAAM,IAAKA,CAAI,CAC5B,CAGA,eAAeA,EAAqB,CACnC,OAAO,KAAK,MAAM,IAAKA,CAAI,CAC5B,CAGA,KAAKA,EAAqB,CACzB,OAAO,KAAK,MAAM,IAAKA,CAAI,CAC5B,CAGA,oBAAoBA,EAAqB,CACxC,OAAO,KAAK,MAAM,IAAKA,CAAI,CAC5B,CAGA,mBAAmBA,EAAqB,CACvC,OAAO,KAAK,MAAM,IAAKA,CAAI,CAC5B,CAED,EChJA,IAAMQ,GAAU,CAAE,SAAU,MAAO,QAAS,OAAQ,KAAM,EAInD,SAASC,EAASC,EAA0C,CAClE,OAAOF,GAAQ,SAASE,CAAgB,GAAKA,IAAW,KACzD,CAyDO,SAASC,EAAyBC,EAAkF,CAC1H,OAAO,MAAM,QAAQA,CAAU,CAChC,CAEO,SAASC,EAAkBD,EAAgF,CACjH,MAAO,CAAC,MAAM,QAAQA,CAAU,CACjC,CAEO,SAASE,EAAwBC,EAAmCC,EAA6D,CACvI,MAAO,GAAQD,GAAiBC,EAAUD,CAAa,EACxD,CAEO,SAASE,EAAeC,EAAmF,CACjH,MAAO,CAAC,CAACA,GAAmB,SAAUA,CACvC,CL1DO,IAAMC,EAAN,MAAMC,CAAW,CACvB,YAAY,CACX,KAAAC,EAAO,mBACP,KAAAC,EAAO,OACP,KAAAC,EACA,IAAAC,EACA,UAAAC,EACA,OAAAC,EACA,OAAAC,CACD,EAAYC,EAAgE,CAAC,EAAG,CAyB/E,GAvBA,KAAK,KAAOP,EACZ,KAAK,KAAOC,EAERO,EAAeF,CAAM,GACxB,KAAK,OAASA,EAET,IAAI,QAAcG,GAAQ,CAC9BH,EAAO,UACNG,EAAQ,EACRH,EAAO,GAAG,YAAaG,CAAO,EAC/B,EAAE,KAAK,IAAMC,EAA2B,IAAI,CAAC,IAG9C,KAAK,OAASC,GAAaZ,EAAW,UAAU,CAAE,IAAAI,EAAK,OAAAG,CAAO,CAAC,CAAC,EAEhE,KAAK,OAAO,OACX,OAAOJ,GAAQ,SACd,OAAO,SAASA,CAAI,EACpBA,IAAS,KAAK,IAAM,IAAM,IAC3B,IAAMQ,EAA2B,IAAI,CACtC,GAGGN,EACH,OAAW,CAAEQ,EAAQC,CAAgB,IAAK,OAAO,QAAQT,CAAS,EACjE,OAAW,CAAEU,EAAQC,EAASC,CAAS,IAAKH,EAC3C,KAAK,mBAAmBD,EAAQE,EAAQC,EAASC,CAAQ,EAE5D,GAAIX,EACH,QAAWY,KAAoB,OAAO,KAAKZ,CAAM,EAAG,CACnD,IAAMa,EAAa,OAAO,SAASD,CAAgB,EAC/CC,IACC,KAAKC,GAAQD,CAAU,EAC1B,OAAO,OAAO,KAAKC,GAAQD,CAAU,EAAGb,EAAOa,CAAU,CAAC,EAE1D,KAAKC,GAAQD,CAAU,EAAIb,EAAOa,CAAU,EAC/C,CAED,GAAIX,EACH,QAAWa,KAAcb,EACpBa,GACH,KAAK,cAAcA,CAAU,EAEhC,KAAK,OAAO,GAAG,UAAW,KAAKC,EAAgB,CAEhD,CAEA,KACA,KACA,IAAI,UAAW,CACd,MAAO,OAAO,KAAK,IAAM,IAAM,EAAE,EAClC,CAGA,OAGA,IAAI,KAAM,CACT,MAAO,qBAAsB,KAAK,MACnC,CAEAC,GAAyC,CACxC,KAAM,CAAC,EACP,IAAK,CAAC,EACN,IAAK,CAAC,EACN,MAAO,CAAC,EACR,OAAQ,CAAC,CACV,EAEAD,GAA4B,MAAOE,EAASC,IAAa,CAUxD,GARC,CACAD,EAAQ,KACRA,EAAQ,WACT,EAAIA,EAAQ,IAAI,MAAM,IAAK,CAAC,EAE5BC,EAASC,CAAY,EAAI,KACzBD,EAASE,CAAa,EAAIH,EAEtB,EAAE,WAAYA,IAAYI,EAAwBJ,EAAQ,OAAQ,KAAKD,EAAU,EAAG,CACvF,IAAMM,EAAQ,KAAKN,GAAWC,EAAQ,MAAM,EACxCM,EAAI,EAEFC,EAAO,SAAY,CAExB,KAAOD,EAAID,EAAM,QAAQ,CACxB,IAAMG,EAAWH,EAAMC,GAAG,EAE1B,GAAIG,EAAQT,EAASQ,EAAS,CAAC,CAAC,EAC/B,OAAO,MAAMA,EAAS,CAAC,EAAER,EAASC,EAAUM,CAAI,CAClD,CAED,EAEA,OAAO,MAAMA,EAAK,CACnB,CAEAN,EAAS,SAAS,CAEnB,EAEAL,GAAmD,CAClD,IAAK,CACJ,WAAY,IACZ,KAAM,cACP,EACA,IAAK,CACJ,WAAY,IACZ,KAAM,WACP,EACA,IAAK,CACJ,WAAY,IACZ,KAAM,WACP,EACA,IAAK,CACJ,WAAY,IACZ,KAAM,iBACP,EACA,IAAK,CACJ,WAAY,IACZ,KAAM,MACP,EACA,IAAK,CACJ,WAAY,IACZ,KAAM,uBACP,EACA,IAAK,CACJ,WAAY,IACZ,KAAM,qBACP,EACA,QAAS,CACR,WAAY,IACZ,KAAM,cACN,QAAQI,EAASC,EAAU,CAAE,WAAAN,EAAY,QAAAe,EAAS,KAAAC,CAAK,EAAG,CACzD,OAAOV,EAAS,KAAKU,EAAMD,EAASf,CAAU,CAC/C,CACD,CACD,EAEA,OAAOM,EAAoB,CAAE,WAAAN,EAAY,GAAGiB,CAAW,EAAwD,CAE9G,GAAM,CACL,QAAApB,EACA,GAAGqB,CACJ,EAAI,CACH,GAAG,KAAKjB,GAAQ,QAChB,GAAG,KAAKA,GAAQD,CAAU,EAC1B,GAAGiB,CACJ,EAEA,OAAOpB,EAASS,EAASE,CAAa,EAAGF,EAAUY,CAAa,CACjE,CAEAC,GAAWvB,EAAgBE,EAAkB,CAC5C,IAAMsB,EAASxB,EAAO,OAAO,QAAQ,cAAe,EAAE,EAElDyB,EAAQ,EACRC,EAAY,EAEhB,QAASX,EAAI,EAAG,CAAE,OAAAY,CAAO,EAAIH,EAAQT,EAAIY,EAAQZ,IAChD,OAAQS,EAAOT,CAAC,EAAG,CAClB,IAAK,IACJU,IACA,MAED,IAAK,IACJC,IACA,KACF,CAED,OAAQxB,EAAW,KAAUuB,EAAQ,GAAMC,EAC5C,CAGA,mBAAmB5B,EAAwBE,EAAwBC,EAAkBC,EAAW,EAAG,CAIlG,GAHI,OAAOF,GAAU,WACpBA,EAAS4B,EAAa5B,CAAM,GAEzBF,GAAUA,IAAW,MAAO,CAC/B,IAAMC,EAAkB,KAAKS,GAAWV,CAAM,EAE9C,GAAIC,EAAiB,CACpB,IAAMkB,EAAqB,CAAEjB,EAAQC,EAASC,CAAS,EACjD2B,EAAS,KAAKN,GAAWvB,EAAQE,CAAQ,EAE/C,QAASa,EAAI,EAAGA,EAAIhB,EAAgB,OAAQgB,IAAK,CAChD,GAAM,CAAEe,EAAe,CAAEC,CAAgB,EAAIhC,EAAgBgB,CAAC,EAE9D,GAAIc,EAAS,KAAKN,GAAWO,EAAeC,CAAe,EAAG,CAC7DhC,EAAgB,OAAOgB,EAAG,EAAGE,CAAQ,EACrC,KACD,CACD,CAEKlB,EAAgB,SAASkB,CAAQ,GACrClB,EAAgB,KAAKkB,CAAQ,CAC/B,CACD,KACC,SAAWe,KAAkB,OAAO,KAAK,KAAKxB,EAAU,EACvD,KAAK,mBAAmBwB,EAAgBhC,EAAQC,EAASC,CAAQ,EAEnE,OAAO,IACR,CAGA,cAAcI,EAA+BJ,EAAqB,CACjE,GAAII,aAAsB2B,EAAiB,CAC1C,OAAW,CAAEnC,EAAQoC,CAAuB,IAAK,OAAO,QAAQ5B,EAAW,SAAS,EACnF,OAAW,CAAE6B,EAAgBlC,EAASmC,CAAiB,IAAKF,EAC3D,KAAK,mBAAmBpC,EAAkBqC,EAAgBlC,EAASmC,GAAoBlC,GAAYI,EAAW,QAAQ,EACxHA,EAAW,SAAS,IAAI,CACzB,SAAW+B,EAAyB/B,CAAU,EAAG,CAC5CgC,EAAkBhC,CAAU,IAC/BA,EAAa,CAAEA,CAAW,GAE3B,QAAWiC,KAAUjC,EACpB,KAAK,mBACJ,GAAGkC,EAASD,EAAO,CAAC,CAAW,EAC9BA,EACA,CAAE,MAAO,GAAGA,CAAiD,CAC/D,CACF,MACC,KAAKE,GAAuBnC,CAAU,EAEvC,OAAO,IACR,CAEAmC,GAAuBnC,EAAwBR,EAAyB,MAAO4C,EAAiB,GAAI,CACnG,OAAW,CAAEC,EAAKC,CAAM,IAAK,OAAO,QAAQtC,CAAU,EACjD,OAAOsC,GAAS,WACfJ,EAASG,CAAG,EACf,KAAK,mBAAmBA,EAAKD,EAAQE,CAAK,EAE1C,KAAK,mBAAmB9C,EAAQ,GAAG4C,CAAM,GAAGC,CAAG,GAAIC,CAAK,EAErDJ,EAASG,CAAG,EACf,KAAKF,GAAuBG,EAAOD,EAAKD,CAAM,EAE9C,KAAKD,GAAuBG,EAAO9C,EAAQ,GAAG4C,CAAM,GAAGC,CAAG,EAAE,CAEhE,CAGA,KAAK3C,EAAwBC,EAAkBC,EAAqB,CACnE,YAAK,mBAAmB,OAAQF,EAAQC,EAASC,CAAQ,EAElD,IACR,CAGA,IAAIF,EAAwBC,EAAkBC,EAAqB,CAClE,YAAK,mBAAmB,MAAOF,EAAQC,EAASC,CAAQ,EAEjD,IACR,CAGA,IAAIF,EAAwBC,EAAkBC,EAAqB,CAClE,YAAK,mBAAmB,MAAOF,EAAQC,EAASC,CAAQ,EAEjD,IACR,CAGA,MAAMF,EAAwBC,EAAkBC,EAAqB,CACpE,YAAK,mBAAmB,QAASF,EAAQC,EAASC,CAAQ,EAEnD,IACR,CAGA,OAAOF,EAAwBC,EAAkBC,EAAqB,CACrE,YAAK,mBAAmB,SAAUF,EAAQC,EAASC,CAAQ,EAEpD,IACR,CAIA,OAAO,UAAU,CAAE,IAAAb,EAAK,OAAAG,CAAO,EAAY,CAC1C,MAAO,CACN,GAAGqD,GAAWxD,CAAG,EACjB,gBAAiByD,EACjB,eAAgBC,EAChB,GAAGvD,CACJ,CACD,CAED,EMjUO,IAAMwD,EAAN,cAA2BC,CAAW,CAC5C,YAAYC,EAAkCC,EAAwBC,EAAmC,CAAC,EAAG,CAC5G,MAAMD,EAAe,CACpB,IAAIE,EAAiBH,CAAO,EAC5B,GAAGE,CACJ,CAAC,CAEF,CAEA,KAAO,SACP,KAAO,WAER",
6
+ "names": ["ClassMiddleware", "InitialsMiddleware", "fs", "path", "zlib", "brotliPreloadOptions", "brotliRuntimeOptions", "gzipPreloadOptions", "gzipRuntimeOptions", "brotliPreloadSync", "data", "gzipPreloadSync", "getCompressionStreamByEncoding", "contentEncoding", "handleRequestCompressed", "request", "response", "headers", "isBrotliAccepted", "defaultExtensions", "defaultPreloaded", "INSITE_STATIC_ROOT", "nullExtension", "StaticMiddleware", "ClassMiddleware", "src", "root", "_path", "extensions", "defaultExtensions", "resolved", "restricted", "preloaded", "path", "entryPoint", "fs", "#src", "#rootRegExp", "extension", "#addExtension", "resolvee", "#resolve", "fileName", "#restrict", "defaultPreloaded", "#preload", "#handler", "#extensions", "#resolved", "#restricted", "#preloaded", "#getExtensionBy", "name", "url", "isText", "fileData", "brotliPreloadSync", "gzipPreloadSync", "error", "request", "response", "mimeType", "contentEncoding", "resolve", "stream", "getCompressionStreamByEncoding", "isEmpty", "INSITE_STATIC_ROOT", "INSITE_TITLE", "envGlobals", "key", "headers", "escapeAttribute", "value", "resolveHref", "href", "renderHead", "head", "links", "link", "attributes", "meta", "item", "TemplateMiddleware", "ClassMiddleware", "path", "globals", "title", "css", "rootId", "lang", "#handler", "#title", "#css", "#rootId", "#html", "fileName", "isEmpty", "request", "response", "handleRequestCompressed", "createServer", "resolveSSL", "showServerListeningMessage", "IncomingMessage", "querystring", "getRemoteAddress", "serverSymbol", "requestSymbol", "matchSymbol", "pathRegExp", "subPathToRegExpSource", "path", "index", "_", "wildcard", "param", "optional", "subPath", "group", "pathToRegExp", "wildcardKeyRegExp", "extractUrlParams", "request", "match", "matchSymbol", "params", "key", "value", "extractQueryParams", "querystring", "queryParams", "pair", "extractBearerToken", "authorization", "matches", "request", "regExp", "match", "matchSymbol", "RequestBody", "#request", "#text", "resolve", "reject", "text", "chunk", "#bytes", "#json", "#urlEncoded", "querystring", "Request", "IncomingMessage", "#ip", "getRemoteAddress", "#params", "extractUrlParams", "#query", "extractQueryParams", "#bearer", "extractBearerToken", "#body", "ServerResponse", "Readable", "cleanup", "Response", "ServerResponse", "serverSymbol", "requestSymbol", "code", "header", "value", "key", "body", "statusCode", "params", "stream", "headers", "Readable", "handler", "cleanup", "METHODS", "isMethod", "string", "isTupleMiddlewareOrArray", "middleware", "isTupleMiddleware", "isRequestMethodAccepted", "requestMethod", "listeners", "isServerServer", "serverOrOptions", "HTTPServer", "_HTTPServer", "icon", "name", "port", "ssl", "listeners", "errors", "server", "middlewares", "isServerServer", "resolve", "showServerListeningMessage", "createServer", "method", "methodListeners", "regExp", "handler", "priority", "statusCodeString", "statusCode", "#errors", "middleware", "#requestListener", "#listeners", "request", "response", "serverSymbol", "requestSymbol", "isRequestMethodAccepted", "stack", "i", "next", "listener", "matches", "headers", "body", "restParams", "handlerParams", "#getWeight", "source", "depth", "wildcards", "length", "pathToRegExp", "weight", "anotherRegExp", "anotherPriority", "specificMethod", "ClassMiddleware", "regExpOrStringArrayMap", "regExpOrString", "listenerPriority", "isTupleMiddlewareOrArray", "isTupleMiddleware", "params", "isMethod", "#parseMappedMiddleware", "prefix", "key", "value", "resolveSSL", "Request", "Response", "StaticServer", "HTTPServer", "options", "serverOptions", "middlewares", "StaticMiddleware"]
7
7
  }
@@ -16,6 +16,7 @@ type Options = {
16
16
  title?: string;
17
17
  css?: string[] | string;
18
18
  rootId?: string;
19
+ lang?: string;
19
20
  head?: {
20
21
  links?: HeadLink[];
21
22
  meta?: HeadMeta[];
@@ -24,7 +25,7 @@ type Options = {
24
25
  export type { Options as TemplateMiddlewareOptions };
25
26
  export declare class TemplateMiddleware extends ClassMiddleware {
26
27
  #private;
27
- constructor({ path, globals, title, css, rootId, head }?: Options);
28
+ constructor({ path, globals, title, css, rootId, lang, head }?: Options);
28
29
  priority: number;
29
30
  }
30
31
  //# sourceMappingURL=Template.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Template.d.ts","sourceRoot":"","sources":["../../src/middlewares/Template.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAiBhD,KAAK,QAAQ,GAAG;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,QAAQ,GAAG;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,OAAO,GAAG;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;KAClB,CAAC;CACF,CAAC;AAEF,YAAY,EAAE,OAAO,IAAI,yBAAyB,EAAE,CAAC;AAmDrD,qBAAa,kBAAmB,SAAQ,eAAe;;gBAC1C,EACX,IAAW,EACX,OAAY,EACZ,KAAgC,EAChC,GAAQ,EACR,MAAe,EACf,IAAS,EACT,GAAE,OAAY;IAkCf,QAAQ,SAAS;CAUjB"}
1
+ {"version":3,"file":"Template.d.ts","sourceRoot":"","sources":["../../src/middlewares/Template.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAiBhD,KAAK,QAAQ,GAAG;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,QAAQ,GAAG;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,OAAO,GAAG;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;KAClB,CAAC;CACF,CAAC;AAEF,YAAY,EAAE,OAAO,IAAI,yBAAyB,EAAE,CAAC;AAmDrD,qBAAa,kBAAmB,SAAQ,eAAe;;gBAC1C,EACX,IAAW,EACX,OAAY,EACZ,KAAgC,EAChC,GAAQ,EACR,MAAe,EACf,IAAW,EACX,IAAS,EACT,GAAE,OAAY;IAkCf,QAAQ,SAAS;CAUjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "insite-http",
3
- "version": "2.4.2",
3
+ "version": "2.4.3",
4
4
  "description": "HTTPS server for inSite",
5
5
  "keywords": [
6
6
  "insite",