insite-http 2.2.1 → 2.2.2

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/dist/Request.d.ts CHANGED
@@ -32,6 +32,8 @@ export declare class Request<P = RequestParams> extends IncomingMessage {
32
32
  /** Query string part of the URL string */
33
33
  querystring: string;
34
34
  _addHeaderLine(field: string, value: string, first: boolean): void;
35
+ /** IPv4 */
36
+ get ip(): string;
35
37
  [matchSymbol]?: RegExpExecArray;
36
38
  /** Params parsed from the URL string */
37
39
  get params(): P;
@@ -1 +1 @@
1
- {"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../src/Request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAMjE,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAUvD;AAGD,qBAAa,WAAW;;gBACX,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IAOjC,uCAAuC;IACvC,MAAM;IAMN,+BAA+B;IAC/B,IAAI;IAmBJ,oCAAoC;IAC9B,KAAK;IAOX,qCAAqC;IAC/B,WAAW;IAMjB,2CAA2C;IACrC,IAAI;IASV,kDAAkD;IAC5C,UAAU;CAYhB;AAGD,OAAO,QAAQ,WAAW,CAAC;IAC1B,UAAU,eAAe;QACxB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;KACnE;CACD;AAED,qBAAa,OAAO,CAAC,CAAC,GAAG,aAAa,CAAE,SAAQ,eAAe;;IAEtD,GAAG,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,IAAI,EAAG,MAAM,CAAC;IAEd,0CAA0C;IAC1C,WAAW,EAAG,MAAM,CAAC;IAErB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAQlE,CAAC,WAAW,CAAC,CAAC,EAAE,eAAe,CAAC;IAIhC,wCAAwC;IACxC,IAAI,MAAM,MAET;IAID,iEAAiE;IACjE,IAAI,KAAK,uBAER;IAID,kCAAkC;IAClC,IAAI,MAAM,kBAET;IAID,wDAAwD;IACxD,IAAI,IAAI,gBAEP;CAED"}
1
+ {"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../src/Request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAMjE,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAUvD;AAGD,qBAAa,WAAW;;gBACX,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IAOjC,uCAAuC;IACvC,MAAM;IAMN,+BAA+B;IAC/B,IAAI;IAmBJ,oCAAoC;IAC9B,KAAK;IAOX,qCAAqC;IAC/B,WAAW;IAMjB,2CAA2C;IACrC,IAAI;IASV,kDAAkD;IAC5C,UAAU;CAYhB;AAGD,OAAO,QAAQ,WAAW,CAAC;IAC1B,UAAU,eAAe;QACxB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;KACnE;CACD;AAED,qBAAa,OAAO,CAAC,CAAC,GAAG,aAAa,CAAE,SAAQ,eAAe;;IAEtD,GAAG,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,IAAI,EAAG,MAAM,CAAC;IAEd,0CAA0C;IAC1C,WAAW,EAAG,MAAM,CAAC;IAErB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAUlE,WAAW;IACX,IAAI,EAAE,WAEL;IAED,CAAC,WAAW,CAAC,CAAC,EAAE,eAAe,CAAC;IAIhC,wCAAwC;IACxC,IAAI,MAAM,MAET;IAID,iEAAiE;IACjE,IAAI,KAAK,uBAER;IAID,kCAAkC;IAClC,IAAI,MAAM,kBAET;IAID,wDAAwD;IACxD,IAAI,IAAI,gBAEP;CAED"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- var m=class{listeners};var Se=void 0;import O from"node:fs";import l from"node:path";import u from"node:zlib";var se={params:{[u.constants.BROTLI_PARAM_MODE]:u.constants.BROTLI_MODE_TEXT,[u.constants.BROTLI_PARAM_QUALITY]:11}},$={params:{[u.constants.BROTLI_PARAM_MODE]:u.constants.BROTLI_MODE_TEXT,[u.constants.BROTLI_PARAM_QUALITY]:4}},ie={level:9},A={level:3};function I(o){return u.brotliCompressSync(o,se)}function C(o){return u.gzipSync(o,ie)}function k(o){return o==="br"?u.createBrotliCompress($):u.createGzip(A)}function _(o,e,t,r){let n=/\bbr\b/.test(o.headers["accept-encoding"]);t["Content-Encoding"]=n?"br":"gzip",e.writeHead(200,t).end(n?u.brotliCompressSync(r,$):u.gzipSync(r,A))}var D=[["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"}]].filter(Boolean);var N=[...process.env.NODE_ENV==="production"?["/index.js","/favicon.ico"]:[]];var ae={mimeType:"application/octet-stream"},E=class extends m{constructor({src:e="public",urlPrefix:t="",path:r,extensions:n=D,resolved:s,restricted:p,preloaded:a="default"}={}){if(super(),!l.isAbsolute(e)){let[,i]=process.argv;e=l.resolve(O.statSync(i).isDirectory()?i:l.dirname(i),e)}if(this.#e=e,this.#o=t,this.#t=new RegExp(`^${l.join("/",t,"/")}`),n)for(let i of n)i&&this.#p(...i);if(s)for(let i of s)i&&this.#u(...i);if(p)for(let i of p)i&&this.#l(i);if(a){a==="default"&&(a=N);for(let i of a)i&&this.#c(i)}this.listeners={GET:[[r??new RegExp(`^${l.join("/",this.#o,"/")}(\\w[^\\/]*/)*[^\\/]+\\.[^\\/]`),this.#f]]}}#e;#o;#t;#r=new Map;#n=new Map;#s=new Set;#i=new Map;#a(e){return this.#r.get(e.slice(Math.max(0,e.lastIndexOf(".")+1)))??ae}#p(e,t){this.#r.set(e,{...t,name:e})}#u(e,t){this.#n.set(e,l.isAbsolute(t)?t:l.join(this.#e,t))}#l(e){this.#s.add(l.join(this.#e,e))}#c(e){e=this.#n.get(e)??l.join(this.#e,e);try{let{isText:t}=this.#a(e),r=O.readFileSync(e,t?"utf8":null);this.#i.set(e,t?{br:I(r),gzip:C(r)}:r)}catch(t){console.warn(`\u26A0\uFE0F inSite Static Server: Unable to preload ${e}`,`
2
- `,t)}}#f=(e,t)=>{let r=decodeURI(e.url).replace(this.#t,"").replaceAll("../","");if(r=this.#n.get(r)??l.join(this.#e,r),this.#s.has(r))return!1;if(!O.existsSync(r))return t.notFound();let{mimeType:n,isText:s}=this.#a(r),p=s?/\bbr\b/.test(e.headers["accept-encoding"])?"br":"gzip":null;t.writeHead(200,{"Content-Type":n+(s?"; charset=utf-8":""),...p&&{"Content-Encoding":p}});let a=this.#i.get(r);return a?t.end(s&&p?a[p]:a):new Promise(i=>{let c=O.createReadStream(r).on("error",()=>i(!1));p&&(c=c.pipe(k(p))),c.on("end",i),c.pipe(t)})}};function U(o){for(let e in o)o[e]===void 0&&delete o[e];return o}function y(){}function pe(o,e=0,t={}){let{leading:r=!1,trailing:n=!0}=t,{maxWait:s=1/0}=t,p,a,i,c,b,R,d,P,B=async()=>{let x=Date.now();x>=i?(p=void 0,i=void 0,clearTimeout(a),typeof d=="function"&&await d(),f.resolve(P),f.promise.isResolved=!0,R=r):(clearTimeout(p),p=setTimeout(B,i-x))},L=Number.isFinite(s)?()=>{d===h&&(d=!1),h(),a=setTimeout(L,s)}:null;async function h(){return P=await o.apply(c,b)}r&&typeof r=="boolean"&&(r=h),R=r,n&&typeof n=="boolean"&&(n=h),d=n;let f=Object.assign(function(...x){return b=x,c=this,i=Date.now()+e,d=n,f.promise.isResolved&&(f.promise=Object.assign(new Promise(ne=>{f.resolve=ne,typeof R=="function"&&(R(),R=!1,d===h&&(d=!1)),p||(p=setTimeout(B,e),L&&(a=setTimeout(L,s)))}),{isResolved:!1})),f.promise},{callback:o,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:y,run:h,clear:async x=>{clearTimeout(p),p=void 0,clearTimeout(a),f.promise.isResolved=!0,f.resolve(x?await h():P)}});return f}pe.noop=Object.assign(()=>{},{callback:y,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:y,run:y,clear:y});function q(o){for(let e in o)return!1;return!0}function G(o,e,t,r,n=!0){return Array.isArray(o)&&(o=o.length),typeof r!="string"&&(n=r??!0,r=t),(n?`${o}\xA0`:"")+G.raw(o,e,t,r)}G.raw=(o,e,t,r=t)=>{o=Math.abs(o);let n=o%10,s=o%100;return n===1&&s!==11?e:n>=2&&n<=4&&!(s>=12&&s<=15)?t:r};var{INSITE_TITLE:ue}=process.env,z={};for(let o in process.env)o.startsWith("INSITE_CLIENT_")&&(z[o.replace(/INSITE_CLIENT_/,"").toLowerCase()]=process.env[o]);var le={"Content-Type":"text/html; charset=utf-8"},F=class extends m{constructor({path:e=/.*/,globals:t={},title:r=ue??"inSite",css:n=[],rootId:s="root"}={}){super(),this.listeners={GET:[[e,this.#n]]},this.#e=r,this.#o=Array.isArray(n)?n:[n],this.#t=s,Object.assign(t,z),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>${this.#o.map(p=>`<link rel="stylesheet" href="${p}" />`).join("")}${q(t)?"":`<script>globalThis.__insite=${JSON.stringify(t)};</script>`}<script type="text/javascript" src="/index.js" defer></script></head><body><div id="${this.#t}"></div></body></html>`}#e;#o;#t;#r;#n=(e,t)=>_(e,t,le,this.#r)};import{createServer as ge,resolveSSL as Re,showServerListeningMessage as re}from"insite-common/backend";import{IncomingMessage as de}from"node:http";import me from"node:querystring";var T=Symbol("server"),S=Symbol("request"),g=Symbol("match");var ce=/\/(?:(\*)|:([^/?]+)(\?(.*))?)/g;function Q(o,e=0){return o.replaceAll(ce,(t,r,n,s,p)=>{if(r)return`/(?<__${e++}>.*?)`;let a=`/(?<${n}>[^/]+)`;return s?`(?:${a}${p?Q(p,e):""})?`:a})}function J(o){return new RegExp(`^${o.startsWith("/")?"":"/"}${Q(o)}/?$`)}var fe=/^__/;function W(o){let e=o[g];if(e){delete o[g];let t=[void 0,...e.slice(1)];if(e.groups)for(let[r,n]of Object.entries(e.groups))t[r.replace(fe,"")]=n;return t}return[]}function K({querystring:o}){return o?.split("&").reduce((e,t)=>{let[r,n]=t.split("=");return e[r]=decodeURIComponent(n||""),e},{})??{}}function V({headers:{authorization:o}}){return o?.indexOf("Bearer ")===0?o.slice(7):null}function X(o,e){let t=e.exec(o.path);return t?(o[g]=t,!0):!1}var H=class{constructor(e){this.#e=e}#e;stream(){return this.#e}#o;text(){return new Promise((e,t)=>{if(this.#o)e(this.#o);else{let r="";this.#e.on("data",n=>{r+=n}),this.#e.on("end",()=>{e(this.#o=r)}),this.#e.on("error",t)}})}#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()),this.#r}#n;async urlEncoded(){return this.#n=me.parse(await this.text()),this.#n}},w=class extends de{path;querystring;_addHeaderLine(e,t,r){super._addHeaderLine(e,t,r),this.path||([this.path,this.querystring]=this.url.split("?",2))}[g];#e;get params(){return this.#e??=W(this)}#o;get query(){return this.#o??=K(this)}#t;get bearer(){return this.#t??=V(this)}#r;get body(){return this.#r??=new H(this)}};import{ServerResponse as he}from"node:http";import{Readable as xe}from"node:stream";var v=class extends he{[T];[S];status(e){return this.statusCode=e,this}set(e,t){if(typeof e=="string")return this.setHeader(e,t);for(let r in e)this.setHeader(r,e[r]);return this}header=this.set;text(e,t=200){return this.writeHead(t,{"Content-Type":"text/plain; charset=utf-8","Content-Length":Buffer.byteLength(e)}).end(e)}json(e,t=200){let r=JSON.stringify(e);return this.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(r)}).end(r)}urlEncoded(e,t=200){let r=new URLSearchParams(e).toString();return this.writeHead(t,{"Content-Type":"application/x-www-form-urlencoded; charset=utf-8","Content-Length":Buffer.byteLength(r)}).end(r)}stream(e,t,r=200){return typeof t=="number"&&(r=t,t=void 0),this.writeHead(r,t),e.pipe(this)}give(e,t,r=200){return typeof t=="number"&&(r=t,t=void 0),typeof e=="string"?this.text(e,r):e instanceof xe?this.stream(e,t,r):this.json(e,r)}error(e,t,{headers:r,handler:n}={}){return this[T]._throw(this,U({statusCode:e,headers:r,body:t,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 ye=["DELETE","GET","PATCH","POST","PUT"];function j(o){return ye.includes(o)||o==="ALL"}function Y(o){return Array.isArray(o)}function Z(o){return!Array.isArray(o)}function ee(o,e){return!!(o&&e[o])}function te(o){return!!o&&"emit"in o}var M=class o{constructor({port:e,ssl:t,listeners:r,errors:n,server:s},p=[]){if(te(s)?(this.server=s,new Promise(a=>void(s.listening?a():s.on("listening",a))).then(()=>re(this))):(this.server=ge(o.makeProps({ssl:t,server:s})),this.server.listen(typeof e=="string"?Number.parseInt(e):e??(this.isS?443:80),()=>re(this))),r)for(let[a,i]of Object.entries(r))for(let[c,b]of i)this.addRequestListener(a,c,b);if(n)for(let a of Object.keys(n)){let i=Number.parseInt(a);i&&(this.#t[i]?Object.assign(this.#t[i],n[i]):this.#t[i]=n[i])}if(p)for(let a of p)a&&this.addMiddleware(a);this.server.on("request",this.#o)}icon="\u{1F578}\uFE0F ";name="HTTP";get protocol(){return`http${this.isS?"s":""}`}server;get isS(){return"setSecureContext"in this.server}#e={POST:[],GET:[],PUT:[],PATCH:[],DELETE:[]};#o=async(e,t)=>{if(t[T]=this,t[S]=e,!("status"in e)&&ee(e.method,this.#e)){for(let[r,n]of this.#e[e.method])if(X(e,r)&&await n(e,t)!==!1)return}t.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,t,{statusCode:r,headers:n,body:s}){return t.give(s,n,r)}}};_throw(e,{statusCode:t,...r}){let{handler:n,...s}={...this.#t.default,...this.#t[t],...r};return n(e[S],e,s)}addRequestListener(e,t,r){if(typeof t=="string"&&(t=J(t)),e&&e!=="ALL")this.#e[e]?.push([t,r]);else for(let n of Object.keys(this.#e))this.addRequestListener(n,t,r);return this}addMiddleware(e){if(e instanceof m){for(let[t,r]of Object.entries(e.listeners))for(let[n,s]of r)this.addRequestListener(t,n,s);e.bindTo?.(this)}else if(Y(e)){Z(e)&&(e=[e]);for(let t of e)this.addRequestListener(...t.length===2?["GET",...t]:t)}else this.#r(e);return this}#r(e,t="GET",r=""){for(let[n,s]of Object.entries(e))typeof s=="function"?j(n)?this.addRequestListener(n,r,s):this.addRequestListener(t,`${r}${n}`,s):j(n)?this.#r(s,n,r):this.#r(s,t,`${r}${n}`)}post(e,t){return this.addRequestListener("POST",e,t),this}get(e,t){return this.addRequestListener("GET",e,t),this}put(e,t){return this.addRequestListener("PUT",e,t),this}patch(e,t){return this.addRequestListener("PATCH",e,t),this}delete(e,t){return this.addRequestListener("DELETE",e,t),this}static makeProps({ssl:e,server:t}){return{...Re(e),IncomingMessage:w,ServerResponse:v,...t}}};var oe=class extends M{constructor(e,t,r=[]){super(t,[new E(e),...r])}name="Static";icon="\u{1F6D2}"};export{m as ClassMiddleware,M as HTTPServer,Se as InitialsMiddleware,E as StaticMiddleware,oe as StaticServer,F as TemplateMiddleware};
1
+ var m=class{listeners};var be=void 0;import O from"node:fs";import l from"node:path";import u from"node:zlib";var se={params:{[u.constants.BROTLI_PARAM_MODE]:u.constants.BROTLI_MODE_TEXT,[u.constants.BROTLI_PARAM_QUALITY]:11}},$={params:{[u.constants.BROTLI_PARAM_MODE]:u.constants.BROTLI_MODE_TEXT,[u.constants.BROTLI_PARAM_QUALITY]:4}},ie={level:9},A={level:3};function I(o){return u.brotliCompressSync(o,se)}function C(o){return u.gzipSync(o,ie)}function k(o){return o==="br"?u.createBrotliCompress($):u.createGzip(A)}function _(o,e,t,r){let n=/\bbr\b/.test(o.headers["accept-encoding"]);t["Content-Encoding"]=n?"br":"gzip",e.writeHead(200,t).end(n?u.brotliCompressSync(r,$):u.gzipSync(r,A))}var D=[["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"}]].filter(Boolean);var N=[...process.env.NODE_ENV==="production"?["/index.js","/favicon.ico"]:[]];var ae={mimeType:"application/octet-stream"},E=class extends m{constructor({src:e="public",urlPrefix:t="",path:r,extensions:n=D,resolved:s,restricted:p,preloaded:a="default"}={}){if(super(),!l.isAbsolute(e)){let[,i]=process.argv;e=l.resolve(O.statSync(i).isDirectory()?i:l.dirname(i),e)}if(this.#e=e,this.#o=t,this.#t=new RegExp(`^${l.join("/",t,"/")}`),n)for(let i of n)i&&this.#p(...i);if(s)for(let i of s)i&&this.#u(...i);if(p)for(let i of p)i&&this.#l(i);if(a){a==="default"&&(a=N);for(let i of a)i&&this.#f(i)}this.listeners={GET:[[r??new RegExp(`^${l.join("/",this.#o,"/")}(\\w[^\\/]*/)*[^\\/]+\\.[^\\/]`),this.#c]]}}#e;#o;#t;#r=new Map;#n=new Map;#s=new Set;#i=new Map;#a(e){return this.#r.get(e.slice(Math.max(0,e.lastIndexOf(".")+1)))??ae}#p(e,t){this.#r.set(e,{...t,name:e})}#u(e,t){this.#n.set(e,l.isAbsolute(t)?t:l.join(this.#e,t))}#l(e){this.#s.add(l.join(this.#e,e))}#f(e){e=this.#n.get(e)??l.join(this.#e,e);try{let{isText:t}=this.#a(e),r=O.readFileSync(e,t?"utf8":null);this.#i.set(e,t?{br:I(r),gzip:C(r)}:r)}catch(t){console.warn(`\u26A0\uFE0F inSite Static Server: Unable to preload ${e}`,`
2
+ `,t)}}#c=(e,t)=>{let r=decodeURI(e.url).replace(this.#t,"").replaceAll("../","");if(r=this.#n.get(r)??l.join(this.#e,r),this.#s.has(r))return!1;if(!O.existsSync(r))return t.notFound();let{mimeType:n,isText:s}=this.#a(r),p=s?/\bbr\b/.test(e.headers["accept-encoding"])?"br":"gzip":null;t.writeHead(200,{"Content-Type":n+(s?"; charset=utf-8":""),...p&&{"Content-Encoding":p}});let a=this.#i.get(r);return a?t.end(s&&p?a[p]:a):new Promise(i=>{let f=O.createReadStream(r).on("error",()=>i(!1));p&&(f=f.pipe(k(p))),f.on("end",i),f.pipe(t)})}};function U(o){for(let e in o)o[e]===void 0&&delete o[e];return o}function g(){}function pe(o,e=0,t={}){let{leading:r=!1,trailing:n=!0}=t,{maxWait:s=1/0}=t,p,a,i,f,b,R,d,P,B=async()=>{let x=Date.now();x>=i?(p=void 0,i=void 0,clearTimeout(a),typeof d=="function"&&await d(),c.resolve(P),c.promise.isResolved=!0,R=r):(clearTimeout(p),p=setTimeout(B,i-x))},L=Number.isFinite(s)?()=>{d===h&&(d=!1),h(),a=setTimeout(L,s)}:null;async function h(){return P=await o.apply(f,b)}r&&typeof r=="boolean"&&(r=h),R=r,n&&typeof n=="boolean"&&(n=h),d=n;let c=Object.assign(function(...x){return b=x,f=this,i=Date.now()+e,d=n,c.promise.isResolved&&(c.promise=Object.assign(new Promise(ne=>{c.resolve=ne,typeof R=="function"&&(R(),R=!1,d===h&&(d=!1)),p||(p=setTimeout(B,e),L&&(a=setTimeout(L,s)))}),{isResolved:!1})),c.promise},{callback:o,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:g,run:h,clear:async x=>{clearTimeout(p),p=void 0,clearTimeout(a),c.promise.isResolved=!0,c.resolve(x?await h():P)}});return c}pe.noop=Object.assign(()=>{},{callback:g,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:g,run:g,clear:g});function q(o){for(let e in o)return!1;return!0}function G(o,e,t,r,n=!0){return Array.isArray(o)&&(o=o.length),typeof r!="string"&&(n=r??!0,r=t),(n?`${o}\xA0`:"")+G.raw(o,e,t,r)}G.raw=(o,e,t,r=t)=>{o=Math.abs(o);let n=o%10,s=o%100;return n===1&&s!==11?e:n>=2&&n<=4&&!(s>=12&&s<=15)?t:r};var{INSITE_TITLE:ue}=process.env,z={};for(let o in process.env)o.startsWith("INSITE_CLIENT_")&&(z[o.replace(/INSITE_CLIENT_/,"").toLowerCase()]=process.env[o]);var le={"Content-Type":"text/html; charset=utf-8"},F=class extends m{constructor({path:e=/.*/,globals:t={},title:r=ue??"inSite",css:n=[],rootId:s="root"}={}){super(),this.listeners={GET:[[e,this.#n]]},this.#e=r,this.#o=Array.isArray(n)?n:[n],this.#t=s,Object.assign(t,z),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>${this.#o.map(p=>`<link rel="stylesheet" href="${p}" />`).join("")}${q(t)?"":`<script>globalThis.__insite=${JSON.stringify(t)};</script>`}<script type="text/javascript" src="/index.js" defer></script></head><body><div id="${this.#t}"></div></body></html>`}#e;#o;#t;#r;#n=(e,t)=>_(e,t,le,this.#r)};import{createServer as Re,resolveSSL as Te,showServerListeningMessage as re}from"insite-common/backend";import{IncomingMessage as de}from"node:http";import me from"node:querystring";import{getRemoteAddress as he}from"insite-common/backend";var T=Symbol("server"),S=Symbol("request"),y=Symbol("match");var fe=/\/(?:(\*)|:([^/?]+)(\?(.*))?)/g;function Q(o,e=0){return o.replaceAll(fe,(t,r,n,s,p)=>{if(r)return`/(?<__${e++}>.*?)`;let a=`/(?<${n}>[^/]+)`;return s?`(?:${a}${p?Q(p,e):""})?`:a})}function J(o){return new RegExp(`^${o.startsWith("/")?"":"/"}${Q(o)}/?$`)}var ce=/^__/;function W(o){let e=o[y];if(e){delete o[y];let t=[void 0,...e.slice(1)];if(e.groups)for(let[r,n]of Object.entries(e.groups))t[r.replace(ce,"")]=n;return t}return[]}function K({querystring:o}){return o?.split("&").reduce((e,t)=>{let[r,n]=t.split("=");return e[r]=decodeURIComponent(n||""),e},{})??{}}function V({headers:{authorization:o}}){return o?.indexOf("Bearer ")===0?o.slice(7):null}function X(o,e){let t=e.exec(o.path);return t?(o[y]=t,!0):!1}var H=class{constructor(e){this.#e=e}#e;stream(){return this.#e}#o;text(){return new Promise((e,t)=>{if(this.#o)e(this.#o);else{let r="";this.#e.on("data",n=>{r+=n}),this.#e.on("end",()=>{e(this.#o=r)}),this.#e.on("error",t)}})}#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=me.parse(await this.text()),this.#n}},w=class extends de{path;querystring;_addHeaderLine(e,t,r){super._addHeaderLine(e,t,r),this.path||([this.path,this.querystring]=this.url.split("?",2))}#e;get ip(){return this.#e??=he(this)}[y];#o;get params(){return this.#o??=W(this)}#t;get query(){return this.#t??=K(this)}#r;get bearer(){return this.#r??=V(this)}#n;get body(){return this.#n??=new H(this)}};import{ServerResponse as xe}from"node:http";import{Readable as ge}from"node:stream";var v=class extends xe{[T];[S];status(e){return this.statusCode=e,this}set(e,t){if(typeof e=="string")return this.setHeader(e,t);for(let r in e)this.setHeader(r,e[r]);return this}header=this.set;text(e,t=200){return this.writeHead(t,{"Content-Type":"text/plain; charset=utf-8","Content-Length":Buffer.byteLength(e)}).end(e)}json(e,t=200){let r=JSON.stringify(e);return this.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(r)}).end(r)}urlEncoded(e,t=200){let r=new URLSearchParams(e).toString();return this.writeHead(t,{"Content-Type":"application/x-www-form-urlencoded; charset=utf-8","Content-Length":Buffer.byteLength(r)}).end(r)}stream(e,t,r=200){return typeof t=="number"&&(r=t,t=void 0),this.writeHead(r,t),e.pipe(this)}give(e,t,r=200){return typeof t=="number"&&(r=t,t=void 0),typeof e=="string"?this.text(e,r):e instanceof ge?this.stream(e,t,r):this.json(e,r)}error(e,t,{headers:r,handler:n}={}){return this[T]._throw(this,U({statusCode:e,headers:r,body:t,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 ye=["DELETE","GET","PATCH","POST","PUT"];function j(o){return ye.includes(o)||o==="ALL"}function Y(o){return Array.isArray(o)}function Z(o){return!Array.isArray(o)}function ee(o,e){return!!(o&&e[o])}function te(o){return!!o&&"emit"in o}var M=class o{constructor({port:e,ssl:t,listeners:r,errors:n,server:s},p=[]){if(te(s)?(this.server=s,new Promise(a=>void(s.listening?a():s.on("listening",a))).then(()=>re(this))):(this.server=Re(o.makeProps({ssl:t,server:s})),this.server.listen(typeof e=="string"?Number.parseInt(e):e??(this.isS?443:80),()=>re(this))),r)for(let[a,i]of Object.entries(r))for(let[f,b]of i)this.addRequestListener(a,f,b);if(n)for(let a of Object.keys(n)){let i=Number.parseInt(a);i&&(this.#t[i]?Object.assign(this.#t[i],n[i]):this.#t[i]=n[i])}if(p)for(let a of p)a&&this.addMiddleware(a);this.server.on("request",this.#o)}icon="\u{1F578}\uFE0F ";name="HTTP";get protocol(){return`http${this.isS?"s":""}`}server;get isS(){return"setSecureContext"in this.server}#e={POST:[],GET:[],PUT:[],PATCH:[],DELETE:[]};#o=async(e,t)=>{if(t[T]=this,t[S]=e,!("status"in e)&&ee(e.method,this.#e)){for(let[r,n]of this.#e[e.method])if(X(e,r)&&await n(e,t)!==!1)return}t.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,t,{statusCode:r,headers:n,body:s}){return t.give(s,n,r)}}};_throw(e,{statusCode:t,...r}){let{handler:n,...s}={...this.#t.default,...this.#t[t],...r};return n(e[S],e,s)}addRequestListener(e,t,r){if(typeof t=="string"&&(t=J(t)),e&&e!=="ALL")this.#e[e]?.push([t,r]);else for(let n of Object.keys(this.#e))this.addRequestListener(n,t,r);return this}addMiddleware(e){if(e instanceof m){for(let[t,r]of Object.entries(e.listeners))for(let[n,s]of r)this.addRequestListener(t,n,s);e.bindTo?.(this)}else if(Y(e)){Z(e)&&(e=[e]);for(let t of e)this.addRequestListener(...t.length===2?["GET",...t]:t)}else this.#r(e);return this}#r(e,t="GET",r=""){for(let[n,s]of Object.entries(e))typeof s=="function"?j(n)?this.addRequestListener(n,r,s):this.addRequestListener(t,`${r}${n}`,s):j(n)?this.#r(s,n,r):this.#r(s,t,`${r}${n}`)}post(e,t){return this.addRequestListener("POST",e,t),this}get(e,t){return this.addRequestListener("GET",e,t),this}put(e,t){return this.addRequestListener("PUT",e,t),this}patch(e,t){return this.addRequestListener("PATCH",e,t),this}delete(e,t){return this.addRequestListener("DELETE",e,t),this}static makeProps({ssl:e,server:t}){return{...Te(e),IncomingMessage:w,ServerResponse:v,...t}}};var oe=class extends M{constructor(e,t,r=[]){super(t,[new E(e),...r])}name="Static";icon="\u{1F6D2}"};export{m as ClassMiddleware,M as HTTPServer,be as InitialsMiddleware,E as StaticMiddleware,oe as StaticServer,F 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", "../../../../@nesvet/npm/n/src/cleanup.ts", "../../../../@nesvet/npm/n/src/noop.ts", "../../../../@nesvet/npm/n/src/debounce.ts", "../../../../@nesvet/npm/n/src/isEmpty.ts", "../../../../@nesvet/npm/n/src/howmuch.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 { Handler, Method, RegExpOrString } from \"./types\";\n\n\nexport class ClassMiddleware {\n\tlisteners!: Partial<Record<Method, [ RegExpOrString, Handler ][]>>;\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 nullExtension = {\n\tmimeType: \"application/octet-stream\"\n};\n\n\nexport class StaticMiddleware extends ClassMiddleware {\n\tconstructor({\n\t\tsrc = \"public\",\n\t\turlPrefix = \"\",\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.#urlPrefix = urlPrefix;\n\t\tthis.#urlPrefixRegExp = new RegExp(`^${path.join(\"/\", urlPrefix, \"/\")}`);\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(`^${path.join(\"/\", this.#urlPrefix, \"/\")}(\\\\w[^\\\\/]*/)*[^\\\\/]+\\\\.[^\\\\/]`), this.#handler ] ]\n\t\t};\n\t\t\n\t}\n\t\n\t#src;\n\t#urlPrefix;\n\t#urlPrefixRegExp;\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\tlet fileName = decodeURI(request.url).replace(this.#urlPrefixRegExp, \"\").replaceAll(\"../\", \"\");\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].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", "// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function cleanup<T extends Record<string, any>>(object: T): T {\n\tfor (const key in object)\n\t\tif (object[key] === undefined)\n\t\t\tdelete object[key];\n\t\n\treturn object;\n}\n", "export function noop() { /**/ }\n", "import { noop } from \"./noop.js\";\n\n\ntype Callback<Result> = (...args: unknown[]) => Result;\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\ntype NumberOrUndefined = number | undefined;\n\ntype DebouncedFunction<Result> = {\n\t(this: unknown, ..._args: unknown[]): Promise<Result>;\n};\n\nexport type Debounced<Result> = {\n\tcallback: Callback<Result>;\n\tpromise: {\n\t\tisResolved: boolean;\n\t} & Promise<unknown>;\n\tresolve: (value: Result) => void;\n\trun(): Promise<Result>;\n\tclear(shouldRun?: boolean): Promise<void>;\n} & DebouncedFunction<Result>;\n\n\nexport function debounce<Result>(callback: Callback<Result>, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: NumberOrUndefined;\n\tlet maxWaitTimeout: NumberOrUndefined;\n\tlet end: NumberOrUndefined;\n\tlet context: unknown;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: Result;\n\t\n\tconst expired = async () => {\n\t\t\n\t\tconst n = Date.now();\n\t\t\n\t\tif (n >= end!) {\n\t\t\ttimeout = undefined;\n\t\t\tend = undefined;\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\tdebounced.resolve(result);\n\t\t\tdebounced.promise.isResolved = true;\n\t\t\tinitial = leading;\n\t\t} else {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(expired, end! - n);\n\t\t}\n\t\t\n\t};\n\t\n\tconst maxWaitExpired = Number.isFinite(maxWait) ? () => {\n\t\t\n\t\tif (final === run)\n\t\t\tfinal = false;\n\t\trun();\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\treturn (result = await callback.apply(context, args));\n\t}\n\t\n\tif (leading && typeof leading == \"boolean\")\n\t\tleading = run;\n\tinitial = leading;\n\t\n\tif (trailing && typeof trailing == \"boolean\")\n\t\ttrailing = run;\n\tfinal = trailing;\n\t\n\tconst debounced: Debounced<Result> = Object.assign(function (..._args) {\n\t\targs = _args;\n\t\tcontext = this;// eslint-disable-line no-invalid-this\n\t\t\n\t\tend = Date.now() + limit;\n\t\tfinal = trailing;\n\t\t\n\t\tif (debounced.promise.isResolved)\n\t\t\tdebounced.promise = Object.assign(new Promise(resolve => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\tinitial = false;\n\t\t\t\t\tif (final === run)\n\t\t\t\t\t\tfinal = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(expired, limit);\n\t\t\t\t\tif (maxWaitExpired)\n\t\t\t\t\t\tmaxWaitTimeout = setTimeout(maxWaitExpired, maxWait);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}), {\n\t\t\t\tisResolved: false\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<Result>, {\n\t\tcallback,\n\t\tpromise: Object.assign(Promise.resolve(), {\n\t\t\tisResolved: true\n\t\t}),\n\t\tresolve: noop,\n\t\trun,\n\t\tclear: async (shouldRun?: boolean) => {\n\t\t\t\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\t\n\t\t\tdebounced.promise.isResolved = true;\n\t\t\tdebounced.resolve(shouldRun ? await run() : result);\n\t\t\t\n\t\t}\n\t});\n\t\n\treturn debounced;\n}\n\n\ndebounce.noop = Object.assign(() => { /**/ }, {\n\tcallback: noop,\n\tpromise: Object.assign(Promise.resolve(), {\n\t\tisResolved: true\n\t}),\n\tresolve: noop,\n\trun: noop,\n\tclear: noop\n}) as unknown as Debounced<void>;\n\n\nexport function throttle<Result>(callback: Callback<Result>, limit?: number, options?: Options) {\n\treturn debounce(callback, limit, {\n\t\tmaxWait: limit,\n\t\tleading: true,\n\t\ttrailing: true,\n\t\t...options\n\t});\n}\n", "export function isEmpty(object: object) {\n\tfor (const _ in object)// eslint-disable-line guard-for-in, no-unreachable-loop\n\t\treturn false;\n\t\n\treturn true;\n}\n", "export function howmuch(number: [] | number, one: string, two: string, five: boolean | string, shouldPrintNumber = true) {\n\tif (Array.isArray(number))\n\t\tnumber = number.length;\n\t\n\tif (typeof five != \"string\") {\n\t\tshouldPrintNumber = five ?? true;\n\t\tfive = two;\n\t}\n\t\n\t\n\treturn (shouldPrintNumber ? `${number}\u00A0` : \"\") + howmuch.raw(number, one, two, five);\n}\n\nhowmuch.raw = (number: number, one: string, two: string, five = two) => {\n\tnumber = Math.abs(number);\n\tconst u = number % 10;\n\tconst d = number % 100;\n\t\n\treturn (\n\t\t(u === 1 && d !== 11) ?\n\t\t\tone :\n\t\t\t((u >= 2 && u <= 4) && !(d >= 12 && d <= 15)) ?\n\t\t\t\ttwo :\n\t\t\t\tfive\n\t);\n};\n", "import { isEmpty } from \"@nesvet/n\";\nimport { handleRequestCompressed } from \"../compression\";\nimport { ClassMiddleware } from \"../Middleware\";\nimport { Handler } from \"../types\";\n\n\nconst { INSITE_TITLE } = 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 Options = {\n\tpath?: RegExp;\n\tglobals?: Record<string, unknown>;\n\ttitle?: string;\n\tcss?: string[] | string;\n\trootId?: string;\n};\n\nexport type { Options as TemplateMiddlewareOptions };\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}: 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`${this.#css.map(fileName => `<link rel=\"stylesheet\" href=\"${fileName}\" />`).join(\"\")}` +\n\t\t\t`${isEmpty(globals) ? \"\" : `<script>globalThis.__insite=${JSON.stringify(globals)};</script>`}` +\n\t\t\t\"<script type=\\\"text/javascript\\\" src=\\\"/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\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 RegExpOrString,\n\ttype ResponseBody\n} from \"./types\";\nimport { pathToRegExp } from \"./utils\";\n\n\nexport class HTTPServer {\n\tconstructor({\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\tif (isServerServer(server)) {\n\t\t\tthis.server = server;\n\t\t\t\n\t\t\tnew 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 ] of methodListeners)\n\t\t\t\t\tthis.addRequestListener(method, regExp, handler);\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\t/** Server icon */\n\ticon = \"\uD83D\uDD78\uFE0F \";\n\t\n\t/** Server name */\n\tname = \"HTTP\";\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\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\tfor (const [ regExp, handler ] of this.#listeners[request.method])\n\t\t\t\tif (matches(request, regExp) && await handler(request, response) !== false)\n\t\t\t\t\treturn;\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/** Add request listener */\n\taddRequestListener(method: Method | \"ALL\", regExp: RegExpOrString, handler: Handler) {\n\t\tif (typeof regExp == \"string\")\n\t\t\tregExp = pathToRegExp(regExp);\n\t\t\n\t\tif (method && method !== \"ALL\")\n\t\t\tthis.#listeners[method]?.push([ regExp, handler ]);\n\t\telse\n\t\t\tfor (const specificMethod of Object.keys(this.#listeners) as Method[])\n\t\t\t\tthis.addRequestListener(specificMethod, regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add middleware */\n\taddMiddleware(middleware: GenericMiddleware) {\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 ] of regExpOrStringArrayMap)\n\t\t\t\t\tthis.addRequestListener(method as Method, regExpOrString, handler);\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(...params.length === 2 ? [ \"GET\", ...params ] as const : params);\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) {\n\t\tthis.addRequestListener(\"POST\", regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add GET request listener */\n\tget(regExp: RegExpOrString, handler: Handler) {\n\t\tthis.addRequestListener(\"GET\", regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add PUT request listener */\n\tput(regExp: RegExpOrString, handler: Handler) {\n\t\tthis.addRequestListener(\"PUT\", regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add PATCH request listener */\n\tpatch(regExp: RegExpOrString, handler: Handler) {\n\t\tthis.addRequestListener(\"PATCH\", regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add DELETE request listener */\n\tdelete(regExp: RegExpOrString, handler: Handler) {\n\t\tthis.addRequestListener(\"DELETE\", regExp, handler);\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 { 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 */\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());\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\ndeclare module \"node:http\" {\n\tinterface IncomingMessage { // eslint-disable-line no-shadow\n\t\t_addHeaderLine(field: string, value: string, first: boolean): void;\n\t}\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_addHeaderLine(field: string, value: string, first: boolean): void {\n\t\tsuper._addHeaderLine(field, value, first);\n\t\t\n\t\tif (!this.path)\n\t\t\t([ this.path, this.querystring ] = this.url.split(\"?\", 2));\n\t\t\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\tqueryParams[key] = decodeURIComponent(value || \"\");\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 Handler = (request: Request, response: Response) => unknown;\n\nexport type Listener = [ RegExp, Handler ];\n\nexport type Options = {\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 ] | readonly [ RegExpOrString, Handler ];\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;\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", "nullExtension", "StaticMiddleware", "ClassMiddleware", "src", "urlPrefix", "_path", "extensions", "defaultExtensions", "resolved", "restricted", "preloaded", "path", "entryPoint", "fs", "#src", "#urlPrefix", "#urlPrefixRegExp", "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", "cleanup", "object", "key", "noop", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "_args", "resolve", "noop", "shouldRun", "isEmpty", "object", "_", "howmuch", "number", "one", "two", "five", "shouldPrintNumber", "u", "d", "INSITE_TITLE", "envGlobals", "key", "headers", "TemplateMiddleware", "ClassMiddleware", "path", "globals", "title", "css", "rootId", "#handler", "#title", "#css", "#rootId", "#html", "fileName", "isEmpty", "request", "response", "handleRequestCompressed", "createServer", "resolveSSL", "showServerListeningMessage", "IncomingMessage", "querystring", "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", "field", "value", "first", "#params", "extractUrlParams", "#query", "extractQueryParams", "#bearer", "extractBearerToken", "#body", "ServerResponse", "Readable", "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", "port", "ssl", "listeners", "errors", "server", "middlewares", "isServerServer", "resolve", "showServerListeningMessage", "createServer", "method", "methodListeners", "regExp", "handler", "statusCodeString", "statusCode", "#errors", "middleware", "#requestListener", "#listeners", "request", "response", "serverSymbol", "requestSymbol", "isRequestMethodAccepted", "matches", "headers", "body", "restParams", "handlerParams", "pathToRegExp", "specificMethod", "ClassMiddleware", "regExpOrStringArrayMap", "regExpOrString", "isTupleMiddlewareOrArray", "isTupleMiddleware", "params", "#parseMappedMiddleware", "prefix", "key", "value", "isMethod", "resolveSSL", "Request", "Response", "StaticServer", "HTTPServer", "options", "serverOptions", "middlewares", "StaticMiddleware"]
4
+ "sourcesContent": ["import { HTTPServer } from \"./Server\";\nimport { Handler, Method, RegExpOrString } from \"./types\";\n\n\nexport class ClassMiddleware {\n\tlisteners!: Partial<Record<Method, [ RegExpOrString, Handler ][]>>;\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 nullExtension = {\n\tmimeType: \"application/octet-stream\"\n};\n\n\nexport class StaticMiddleware extends ClassMiddleware {\n\tconstructor({\n\t\tsrc = \"public\",\n\t\turlPrefix = \"\",\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.#urlPrefix = urlPrefix;\n\t\tthis.#urlPrefixRegExp = new RegExp(`^${path.join(\"/\", urlPrefix, \"/\")}`);\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(`^${path.join(\"/\", this.#urlPrefix, \"/\")}(\\\\w[^\\\\/]*/)*[^\\\\/]+\\\\.[^\\\\/]`), this.#handler ] ]\n\t\t};\n\t\t\n\t}\n\t\n\t#src;\n\t#urlPrefix;\n\t#urlPrefixRegExp;\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\tlet fileName = decodeURI(request.url).replace(this.#urlPrefixRegExp, \"\").replaceAll(\"../\", \"\");\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].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", "// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function cleanup<T extends Record<string, any>>(object: T): T {\n\tfor (const key in object)\n\t\tif (object[key] === undefined)\n\t\t\tdelete object[key];\n\t\n\treturn object;\n}\n", "export function noop() { /**/ }\n", "import { noop } from \"./noop.js\";\n\n\ntype Callback<Result> = (...args: unknown[]) => Result;\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\ntype NumberOrUndefined = number | undefined;\n\ntype DebouncedFunction<Result> = {\n\t(this: unknown, ..._args: unknown[]): Promise<Result>;\n};\n\nexport type Debounced<Result> = {\n\tcallback: Callback<Result>;\n\tpromise: {\n\t\tisResolved: boolean;\n\t} & Promise<unknown>;\n\tresolve: (value: Result) => void;\n\trun(): Promise<Result>;\n\tclear(shouldRun?: boolean): Promise<void>;\n} & DebouncedFunction<Result>;\n\n\nexport function debounce<Result>(callback: Callback<Result>, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: NumberOrUndefined;\n\tlet maxWaitTimeout: NumberOrUndefined;\n\tlet end: NumberOrUndefined;\n\tlet context: unknown;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: Result;\n\t\n\tconst expired = async () => {\n\t\t\n\t\tconst n = Date.now();\n\t\t\n\t\tif (n >= end!) {\n\t\t\ttimeout = undefined;\n\t\t\tend = undefined;\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\tdebounced.resolve(result);\n\t\t\tdebounced.promise.isResolved = true;\n\t\t\tinitial = leading;\n\t\t} else {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(expired, end! - n);\n\t\t}\n\t\t\n\t};\n\t\n\tconst maxWaitExpired = Number.isFinite(maxWait) ? () => {\n\t\t\n\t\tif (final === run)\n\t\t\tfinal = false;\n\t\trun();\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\treturn (result = await callback.apply(context, args));\n\t}\n\t\n\tif (leading && typeof leading == \"boolean\")\n\t\tleading = run;\n\tinitial = leading;\n\t\n\tif (trailing && typeof trailing == \"boolean\")\n\t\ttrailing = run;\n\tfinal = trailing;\n\t\n\tconst debounced: Debounced<Result> = Object.assign(function (..._args) {\n\t\targs = _args;\n\t\tcontext = this;// eslint-disable-line no-invalid-this\n\t\t\n\t\tend = Date.now() + limit;\n\t\tfinal = trailing;\n\t\t\n\t\tif (debounced.promise.isResolved)\n\t\t\tdebounced.promise = Object.assign(new Promise(resolve => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\tinitial = false;\n\t\t\t\t\tif (final === run)\n\t\t\t\t\t\tfinal = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(expired, limit);\n\t\t\t\t\tif (maxWaitExpired)\n\t\t\t\t\t\tmaxWaitTimeout = setTimeout(maxWaitExpired, maxWait);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}), {\n\t\t\t\tisResolved: false\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<Result>, {\n\t\tcallback,\n\t\tpromise: Object.assign(Promise.resolve(), {\n\t\t\tisResolved: true\n\t\t}),\n\t\tresolve: noop,\n\t\trun,\n\t\tclear: async (shouldRun?: boolean) => {\n\t\t\t\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\t\n\t\t\tdebounced.promise.isResolved = true;\n\t\t\tdebounced.resolve(shouldRun ? await run() : result);\n\t\t\t\n\t\t}\n\t});\n\t\n\treturn debounced;\n}\n\n\ndebounce.noop = Object.assign(() => { /**/ }, {\n\tcallback: noop,\n\tpromise: Object.assign(Promise.resolve(), {\n\t\tisResolved: true\n\t}),\n\tresolve: noop,\n\trun: noop,\n\tclear: noop\n}) as unknown as Debounced<void>;\n\n\nexport function throttle<Result>(callback: Callback<Result>, limit?: number, options?: Options) {\n\treturn debounce(callback, limit, {\n\t\tmaxWait: limit,\n\t\tleading: true,\n\t\ttrailing: true,\n\t\t...options\n\t});\n}\n", "export function isEmpty(object: object) {\n\tfor (const _ in object)// eslint-disable-line guard-for-in, no-unreachable-loop\n\t\treturn false;\n\t\n\treturn true;\n}\n", "export function howmuch(number: [] | number, one: string, two: string, five: boolean | string, shouldPrintNumber = true) {\n\tif (Array.isArray(number))\n\t\tnumber = number.length;\n\t\n\tif (typeof five != \"string\") {\n\t\tshouldPrintNumber = five ?? true;\n\t\tfive = two;\n\t}\n\t\n\t\n\treturn (shouldPrintNumber ? `${number}\u00A0` : \"\") + howmuch.raw(number, one, two, five);\n}\n\nhowmuch.raw = (number: number, one: string, two: string, five = two) => {\n\tnumber = Math.abs(number);\n\tconst u = number % 10;\n\tconst d = number % 100;\n\t\n\treturn (\n\t\t(u === 1 && d !== 11) ?\n\t\t\tone :\n\t\t\t((u >= 2 && u <= 4) && !(d >= 12 && d <= 15)) ?\n\t\t\t\ttwo :\n\t\t\t\tfive\n\t);\n};\n", "import { isEmpty } from \"@nesvet/n\";\nimport { handleRequestCompressed } from \"../compression\";\nimport { ClassMiddleware } from \"../Middleware\";\nimport { Handler } from \"../types\";\n\n\nconst { INSITE_TITLE } = 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 Options = {\n\tpath?: RegExp;\n\tglobals?: Record<string, unknown>;\n\ttitle?: string;\n\tcss?: string[] | string;\n\trootId?: string;\n};\n\nexport type { Options as TemplateMiddlewareOptions };\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}: 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`${this.#css.map(fileName => `<link rel=\"stylesheet\" href=\"${fileName}\" />`).join(\"\")}` +\n\t\t\t`${isEmpty(globals) ? \"\" : `<script>globalThis.__insite=${JSON.stringify(globals)};</script>`}` +\n\t\t\t\"<script type=\\\"text/javascript\\\" src=\\\"/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\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 RegExpOrString,\n\ttype ResponseBody\n} from \"./types\";\nimport { pathToRegExp } from \"./utils\";\n\n\nexport class HTTPServer {\n\tconstructor({\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\tif (isServerServer(server)) {\n\t\t\tthis.server = server;\n\t\t\t\n\t\t\tnew 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 ] of methodListeners)\n\t\t\t\t\tthis.addRequestListener(method, regExp, handler);\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\t/** Server icon */\n\ticon = \"\uD83D\uDD78\uFE0F \";\n\t\n\t/** Server name */\n\tname = \"HTTP\";\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\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\tfor (const [ regExp, handler ] of this.#listeners[request.method])\n\t\t\t\tif (matches(request, regExp) && await handler(request, response) !== false)\n\t\t\t\t\treturn;\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/** Add request listener */\n\taddRequestListener(method: Method | \"ALL\", regExp: RegExpOrString, handler: Handler) {\n\t\tif (typeof regExp == \"string\")\n\t\t\tregExp = pathToRegExp(regExp);\n\t\t\n\t\tif (method && method !== \"ALL\")\n\t\t\tthis.#listeners[method]?.push([ regExp, handler ]);\n\t\telse\n\t\t\tfor (const specificMethod of Object.keys(this.#listeners) as Method[])\n\t\t\t\tthis.addRequestListener(specificMethod, regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add middleware */\n\taddMiddleware(middleware: GenericMiddleware) {\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 ] of regExpOrStringArrayMap)\n\t\t\t\t\tthis.addRequestListener(method as Method, regExpOrString, handler);\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(...params.length === 2 ? [ \"GET\", ...params ] as const : params);\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) {\n\t\tthis.addRequestListener(\"POST\", regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add GET request listener */\n\tget(regExp: RegExpOrString, handler: Handler) {\n\t\tthis.addRequestListener(\"GET\", regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add PUT request listener */\n\tput(regExp: RegExpOrString, handler: Handler) {\n\t\tthis.addRequestListener(\"PUT\", regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add PATCH request listener */\n\tpatch(regExp: RegExpOrString, handler: Handler) {\n\t\tthis.addRequestListener(\"PATCH\", regExp, handler);\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/** Add DELETE request listener */\n\tdelete(regExp: RegExpOrString, handler: Handler) {\n\t\tthis.addRequestListener(\"DELETE\", regExp, handler);\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 */\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\ndeclare module \"node:http\" {\n\tinterface IncomingMessage { // eslint-disable-line no-shadow\n\t\t_addHeaderLine(field: string, value: string, first: boolean): void;\n\t}\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_addHeaderLine(field: string, value: string, first: boolean): void {\n\t\tsuper._addHeaderLine(field, value, first);\n\t\t\n\t\tif (!this.path)\n\t\t\t([ this.path, this.querystring ] = this.url.split(\"?\", 2));\n\t\t\n\t}\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\tqueryParams[key] = decodeURIComponent(value || \"\");\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 Handler = (request: Request, response: Response) => unknown;\n\nexport type Listener = [ RegExp, Handler ];\n\nexport type Options = {\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 ] | readonly [ RegExpOrString, Handler ];\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;\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", "nullExtension", "StaticMiddleware", "ClassMiddleware", "src", "urlPrefix", "_path", "extensions", "defaultExtensions", "resolved", "restricted", "preloaded", "path", "entryPoint", "fs", "#src", "#urlPrefix", "#urlPrefixRegExp", "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", "cleanup", "object", "key", "noop", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "_args", "resolve", "noop", "shouldRun", "isEmpty", "object", "_", "howmuch", "number", "one", "two", "five", "shouldPrintNumber", "u", "d", "INSITE_TITLE", "envGlobals", "key", "headers", "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", "field", "value", "first", "#ip", "getRemoteAddress", "#params", "extractUrlParams", "#query", "extractQueryParams", "#bearer", "extractBearerToken", "#body", "ServerResponse", "Readable", "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", "port", "ssl", "listeners", "errors", "server", "middlewares", "isServerServer", "resolve", "showServerListeningMessage", "createServer", "method", "methodListeners", "regExp", "handler", "statusCodeString", "statusCode", "#errors", "middleware", "#requestListener", "#listeners", "request", "response", "serverSymbol", "requestSymbol", "isRequestMethodAccepted", "matches", "headers", "body", "restParams", "handlerParams", "pathToRegExp", "specificMethod", "ClassMiddleware", "regExpOrStringArrayMap", "regExpOrString", "isTupleMiddlewareOrArray", "isTupleMiddleware", "params", "#parseMappedMiddleware", "prefix", "key", "value", "isMethod", "resolveSSL", "Request", "Response", "StaticServer", "HTTPServer", "options", "serverOptions", "middlewares", "StaticMiddleware"]
7
7
  }
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "insite-http",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "description": "inSite HTTPS server",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
8
- "packageManager": "bun@1.2.5",
8
+ "packageManager": "bun@1.2.7",
9
9
  "scripts": {
10
10
  "test": "echo \"Error: no test specified\" && exit 1",
11
11
  "build": "bun .conveyer.js",
@@ -24,13 +24,13 @@
24
24
  "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
25
25
  "license": "MIT",
26
26
  "dependencies": {
27
- "@nesvet/n": "^1.1.26",
28
- "insite-common": "^2.2.1"
27
+ "@nesvet/n": "^1.1.28",
28
+ "insite-common": "^2.2.2"
29
29
  },
30
30
  "devDependencies": {
31
- "@nesvet/conveyer": "^2.5.0",
32
- "@nesvet/eslint-config": "^2.0.48",
33
- "@types/node": "^22.13.10",
31
+ "@nesvet/conveyer": "^2.5.1",
32
+ "@nesvet/eslint-config": "^2.0.51",
33
+ "@types/node": "^22.13.14",
34
34
  "typescript": "^5.8.2"
35
35
  }
36
36
  }