web-listener 0.6.0 → 0.7.0
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/index.d.ts +27 -8
- package/index.js +1 -1
- package/package.json +1 -1
- package/run.js +1 -1
package/index.d.ts
CHANGED
|
@@ -851,61 +851,80 @@ declare function acceptBody(req: IncomingMessage): void;
|
|
|
851
851
|
|
|
852
852
|
interface BusboyOptions {
|
|
853
853
|
/**
|
|
854
|
-
*
|
|
854
|
+
* `true` to block `multipart/form-data` (including file uploads). If set, only `application/x-www-form-urlencoded` is supported.
|
|
855
855
|
* @default false
|
|
856
856
|
*/
|
|
857
857
|
blockMultipart?: boolean;
|
|
858
858
|
limits?: Limits;
|
|
859
|
+
/**
|
|
860
|
+
* `true` to preserve path information in filenames. `false` to only include the basename (omitting everything before the last `/` or `\`)
|
|
861
|
+
* @default false
|
|
862
|
+
*/
|
|
859
863
|
preservePath?: boolean;
|
|
864
|
+
/**
|
|
865
|
+
* High water mark to set on the underlying stream.
|
|
866
|
+
* @default 65536
|
|
867
|
+
*/
|
|
860
868
|
highWaterMark?: number;
|
|
869
|
+
/**
|
|
870
|
+
* High water mark to set on file streams.
|
|
871
|
+
* @default 65536
|
|
872
|
+
*/
|
|
861
873
|
fileHwm?: number;
|
|
874
|
+
/**
|
|
875
|
+
* Default character set to use for reading name and filename from the content-disposition header in multipart content.
|
|
876
|
+
* According to the standard this should be `latin1`, but most browsers use `utf-8`.
|
|
877
|
+
* @default 'utf-8'
|
|
878
|
+
*/
|
|
862
879
|
defParamCharset?: string;
|
|
880
|
+
/**
|
|
881
|
+
* Default character set to use for reading field content (and field names in urlencoded content).
|
|
882
|
+
* @default 'utf-8'
|
|
883
|
+
*/
|
|
863
884
|
defCharset?: string;
|
|
864
885
|
}
|
|
865
886
|
interface Limits {
|
|
866
887
|
/**
|
|
867
888
|
* Max field name size (in bytes).
|
|
868
|
-
*
|
|
869
889
|
* @default 100
|
|
870
890
|
*/
|
|
871
891
|
fieldNameSize?: number | undefined;
|
|
872
892
|
/**
|
|
873
893
|
* Max field value size (in bytes).
|
|
874
|
-
*
|
|
875
894
|
* @default 1048576 (1MB)
|
|
876
895
|
*/
|
|
877
896
|
fieldSize?: number | undefined;
|
|
878
897
|
/**
|
|
879
898
|
* Max number of non-file fields.
|
|
880
|
-
*
|
|
881
899
|
* @default Infinity
|
|
882
900
|
*/
|
|
883
901
|
fields?: number | undefined;
|
|
884
902
|
/**
|
|
885
903
|
* For multipart forms, the max file size (in bytes).
|
|
886
|
-
*
|
|
887
904
|
* @default Infinity
|
|
888
905
|
*/
|
|
889
906
|
fileSize?: number | undefined;
|
|
890
907
|
/**
|
|
891
908
|
* For multipart forms, the max number of file fields.
|
|
892
|
-
*
|
|
893
909
|
* @default Infinity
|
|
894
910
|
*/
|
|
895
911
|
files?: number | undefined;
|
|
896
912
|
/**
|
|
897
913
|
* For multipart forms, the max number of parts (fields + files).
|
|
898
|
-
*
|
|
899
914
|
* @default Infinity
|
|
900
915
|
*/
|
|
901
916
|
parts?: number | undefined;
|
|
902
917
|
/**
|
|
903
918
|
* For multipart forms, the max number of header key-value pairs to parse.
|
|
904
|
-
*
|
|
905
919
|
* @default 2000 (same as node's http module)
|
|
906
920
|
*/
|
|
907
921
|
headerPairs?: number | undefined;
|
|
908
922
|
}
|
|
923
|
+
declare global {
|
|
924
|
+
interface Buffer {
|
|
925
|
+
latin1Slice(begin?: number, end?: number): string;
|
|
926
|
+
}
|
|
927
|
+
}
|
|
909
928
|
|
|
910
929
|
declare function getFormFields(req: IncomingMessage, { closeAfterErrorDelay, ...options }?: GetFormFieldsOptions): AsyncIterable<FormField, unknown, undefined>;
|
|
911
930
|
declare function getFormData(req: IncomingMessage, config?: GetFormDataOptions): Promise<AugmentedFormData>;
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isIPv4 as t,isIPv6 as e}from"node:net";import{STATUS_CODES as n,createServer as i,Agent as r,request as s,ServerResponse as o}from"node:http";import{createReadStream as c,constants as a,createWriteStream as f,openAsBlob as u}from"node:fs";import{createHash as h,randomUUID as l}from"node:crypto";import{pipeline as d}from"node:stream/promises";import w from"node:zlib";import{promisify as p}from"node:util";import{extname as m,join as y,dirname as g,basename as b,sep as v,resolve as E}from"node:path";import{readFile as x,writeFile as _,stat as T,readdir as S,realpath as k,open as $,mkdtemp as A,rm as O}from"node:fs/promises";import{tmpdir as N,platform as P}from"node:os";import{Agent as M,request as R}from"node:https";import{TransformStream as F,TextDecoderStream as U,DecompressionStream as C,ReadableStream as B}from"node:stream/web";import{Readable as I,Duplex as j,Writable as H}from"node:stream";function q(n){if(!n||"unknown"===n)return;const i=/^((?:\d{1,3}\.){3}\d{1,3})(?::(\d+))?$/.exec(n);if(i?.[1]&&t(i[1]))return{type:"IPv4",ip:i[1],port:i[2]?Number.parseInt(i[2]):void 0};const r=/^\[([\da-fA-F:]+)\](?::(\d+))?$|^([\da-fA-F:]+)$/.exec(n);if(r?.[1]&&e(r[1]))return{type:"IPv6",ip:r[1].toLowerCase(),port:r[2]?Number.parseInt(r[2]):void 0};if(r?.[3]&&e(r[3]))return{type:"IPv6",ip:r[3].toLowerCase(),port:void 0};const s=/^(.*?):(\d+)$/i.exec(n);return s?.[2]?{type:"alias",ip:s[1],port:Number.parseInt(s[2])}:{type:"alias",ip:n,port:void 0}}function D(t){const e=new Set,n=[],i=[];for(const r of t){const t=/^((?:\d{1,3}\.){3}\d{1,3})(?:\/(\d+))?$/.exec(r);if(t?.[1]){const e=t[2]?Number.parseInt(t[2]):32,i=e<32?4294967295>>>e:0;n.push([z(t[1])|i,i]);continue}const s=/^\[?([\da-fA-F:]+)\]?(?:\/(\d+))?$/.exec(r);if(s?.[1]){const t=W(s[1]),e=s[2]?L>>BigInt(Number.parseInt(s[2])):0n;i.push([t|e,e]);continue}e.add(r)}return t=>{switch(t?.type){case"alias":return e.has(t.ip);case"IPv4":const r=z(t.ip);return n.some(([t,e])=>(r|e)===t);case"IPv6":const s=W(t.ip);return i.some(([t,e])=>(s|e)===t);default:return!1}}}const L=/*@__PURE__*/BigInt("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");function z(t){const e=t.split(".").map(Number);return(e[0]<<24|e[1]<<16|e[2]<<8|e[3])>>>0}function W(t){const e=t.split(":").map(t=>t?Number.parseInt(t,16):-1);let n=0n;for(const t of e)t<0?n<<=16n*BigInt(9-e.length):n=n<<16n|BigInt(t);return n}class J{constructor(t){const e={t:null,i:null};this.o=e,this.u=e,void 0!==t&&this.push(t)}isEmpty(){return!this.o.i}clear(){this.o.i=null,this.o.t=null,this.u=this.o}push(t){const e={t,i:null};this.u.i=e,this.u=e}shift(){if(!this.o.i)return null;this.o=this.o.i;const t=this.o.t;return this.o.t=null,t}remove(t){for(let e=this.o;e.i;e=e.i)if(e.i.t===t){e.i=e.i.i;break}}[Symbol.iterator](){return{next:()=>{if(!this.o.i)return{value:null,done:!0};this.o=this.o.i;const t=this.o.t;return this.o.t=null,{value:t,done:!1}}}}}class G{constructor(){this.h=new J,this.l=new J,this.m=0}push(t){if(this.m)return;const e=this.l.shift();e?(e.v&&clearTimeout(e.v),e._(t)):this.h.push(t)}shift(t){return this.h.isEmpty()?this.m?Promise.reject(this.T):new Promise((e,n)=>{const i={_:e,S:n,v:null};this.l.push(i),void 0!==t&&(i.v=setTimeout(()=>{this.l.remove(i),n(new Error(`Timeout after ${t}ms`))},t))}):Promise.resolve(this.h.shift())}k(t){this.T=t;for(const e of this.l)e.S(t),e.v&&clearTimeout(e.v)}close(t){this.m||(this.m=1,this.k(t))}fail(t){this.m||(this.m=2,this.k(t))}[Symbol.asyncIterator](){return{next:()=>this.shift().then(t=>({value:t,done:!1}),t=>{if(2===this.m)throw t;return{value:null,done:!0}})}}}function V(t,e){if(t instanceof e)return t;if(t&&"object"==typeof t){if("cause"in t)return V(t.cause,e);if("error"in t)return V(t.error,e)}}function Z(t,e="http"){if(!t)throw new Error("no address");if("string"==typeof t)return t;if("IPv4"===t.family)return`${e}://${t.address}:${t.port}`;if("IPv6"===t.family)return`${e}://[${t.address}]:${t.port}`;throw new Error(`unknown address family: ${t.family}`)}const X=/*@__PURE__*/Buffer.alloc(0),Y=t=>new URL("http://localhost"+(t.url??"/"));class K extends Error{constructor(t,e,n){super(n??""),this.error=t,this.suppressed=e}}const Q=globalThis.SuppressedError??K;class tt{constructor(){this.$=!1}A(t){this.$?t!==this.O&&(this.O=new Q(t,this.O)):(this.O=t,this.$=!0)}N(){this.$=!1,this.O=void 0}}class et{constructor(t){this.P=t,this.M=Object.create(null),this.R=!1}get headersSent(){return this.R}writeHead(t,e,i){if(this.R)throw new Error("headers already sent");const r={...this.M};for(const[t,e]of(t=>{if(!t)return[];const e=[];if(Array.isArray(t)){const n=t.length;if(1&n)throw new Error("headers must be a list of alternating keys and values");for(let i=0;i<n;i+=2){const n=t[i],r=t[i+1];if("string"!=typeof n)throw new Error("invalid header name");void 0!==r&&e.push([n.toLowerCase(),r])}}else for(const[n,i]of Object.entries(t))void 0!==i&&e.push([n.toLowerCase(),i]);return e})(i))r[t]=e;return this.P.write([`HTTP/1.1 ${t} ${rt(e??n[t]??"-")}`,...nt(r),"",""].join("\r\n"),"ascii"),this.R=!0,this}write(t,e="utf-8",n){return this.P.write(t,e,n)}end(t,e="utf-8",n){return this.P.end(t,e,n),this}setHeader(t,e){const n=t.toLowerCase();return this.M[n]="string"==typeof e||"number"==typeof e?e:[...e],this}setHeaders(t){for(const[e,n]of t)this.setHeader(e,n);return this}}function nt(t){const e=[];for(const[n,i]of Object.entries(t)){const t=it(i);t&&e.push(`${rt(n)}: ${rt(t)}`)}return e}const it=t=>"string"==typeof t?t:"number"==typeof t?String(t):t?t.join(", "):"",rt=t=>t.replaceAll(/[^ \t!-~]/g,"");class st extends Error{constructor(t,{message:e,statusMessage:i,headers:r,body:s,...o}={}){super(e??("string"==typeof s?s:void 0),o),this.statusCode=0|t,this.statusMessage=i??n[this.statusCode]??"-",this.headers=r,this.body=s??"",this.name=`HTTPError(${this.statusCode} ${this.statusMessage})`}static INTERNAL_SERVER_ERROR=/*@__PURE__*/new st(500);send(t,e){t.setHeaders((t=>{if(t){if(t instanceof Headers)return t;if(Array.isArray(t))return new Headers(t);{const e=t instanceof Map?[...t.entries()]:Object.entries(t);return new Headers(e.map(([t,e])=>[t,it(e)]).filter(([t,e])=>e))}}return new Headers})(this.headers));const n=Buffer.byteLength(this.body,"utf-8");t.setHeader("content-length",String(n)),t.writeHead(this.statusCode,this.statusMessage,e),t.end(this.body,"utf-8")}}const ot=(t,e,n)=>{n.headersSent?n.end():(V(t,st)??st.INTERNAL_SERVER_ERROR).send(n)},ct=(t,e,n)=>{if(n.writable){n.addListener("finish",()=>n.destroy());const e=new et(n);(V(t,st)??st.INTERNAL_SERVER_ERROR).send(e,{connection:"close"})}else n.destroy()},at=(t,e,n)=>{(V(t,st)?.statusCode??1)&&console.error("%s",`unhandled error while ${e} ${n?.url??"(no request information)"}:`,t)},ft=new WeakMap;function ut(t,e){const n=ft.get(t);if(n)return n;const i=Y(t),r={F:t,U:i,C:decodeURIComponent(i.pathname),B:ct,I:new AbortController,j:[],H:[],D:e?dt(t):null};return ft.set(t,r),r}function ht(t,e,n,i){e||(t.D=null),t.L=n;const r=async()=>{t.I.abort(n.W.writableEnded?"complete":"client abort");const e=new tt;await lt(t.j,e,t),await lt(t.H,e,t,()=>{t.J=async e=>{try{await e()}catch(e){i(e,t.F)}}}),e.$&&i(e.O,t.F)};return n.W.closed?r():n.W.once("close",r),t}async function lt(t,e,n,i){for(;n.G;)await n.G;const r=(async()=>{for(;;){const n=t.pop();if(!n)return void i?.();try{await n()}catch(t){e.A(t)}}})().then(()=>{n.G===r&&(n.G=void 0)});n.G=r,await r}function dt(t){return new Set(t.headers.upgrade?.split(",").map(t=>t.trim().toLowerCase())??[])}const wt=t=>ft.get(t);function pt(t){const e=wt(t);if(!e)throw new Error("unknown request");return e}function mt(t,e){const n=wt(t);n&&yt(n,e)}function yt(t,e){t.V=e;const n=t.Z;n&&queueMicrotask(()=>xt(e,n,t))}const gt=t=>Boolean(wt(t)?.Z);function bt(t,e,n){if(!t.Z){if(t.L&&!t.D){const e=t.L.W;e.headersSent||e.hasHeader("connection")||e.setHeader("connection","close")}t.L?.W.once("close",()=>t.F.socket.destroy()),t.Z={X:e,Y:n},xt(t.V,t.Z,t),Et(t)}}function vt(t){if(t.L){if(!t.D){const e=t.L.W;e.headersSent||(e.statusCode=503,e.hasHeader("connection")||e.setHeader("connection","close"))}t.L.W.end(()=>t.F.socket.destroy())}else t.F.socket.destroy()}function Et(t){if(clearTimeout(t.K),!t.tt||t.J)return;const e=Date.now();if(e>=t.tt)return void vt(t);let n=t.tt;t.et&&!t.Z&&(e<t.et.nt?n=t.et.nt:(t.Z=t.et,xt(t.V,t.Z,t))),void 0===t.K&&t.H.push(()=>clearTimeout(t.K)),t.K=setTimeout(()=>Et(t),n-e)}async function xt(t,e,n){try{await(t?.(e.X))}catch(t){e.Y(t,"soft closing",n.F),vt(n)}}const _t=(t,e)=>{const n=pt(t);n.J?n.J(e):n.j.push(e)},Tt=(t,e)=>{const n=pt(t);n.J?n.J(e):n.H.push(e)},St=t=>pt(t).I.signal;class kt extends Error{}const $t=new kt("STOP"),At=new kt("CONTINUE"),Ot=new kt("NEXT_ROUTE"),Nt=new kt("NEXT_ROUTER");async function Pt(t,e){const n=pt(t);if(!n.L)throw new Error("cannot call acceptUpgrade from shouldUpgrade");if(!n.D)throw new Error("not an upgrade request");if(n.it)return n.rt;const i=n.L.W;if(!i.readable||!i.writable)throw $t;const r=await e(t,i,n.L.o);return n.L.o=X,n.B=r.onError,yt(n,r.softCloseHandler),n.rt=r.return,n.it=!0,r.return}const Mt=RegExp.escape??(t=>t.replaceAll(/[^a-zA-Z0-9_ ]/g,t=>"\\u"+t.charCodeAt(0).toString(16).padStart(4,"0"))),Rt=t=>t,Ft=t=>void 0===t?void 0:""===t?[]:t.split("/"),Ut=t=>void 0===t?void 0:""===t?[]:t.split("/").filter(t=>t);function Ct(t){const e={},n=new Map;for(const[i,r]of Object.entries(t))e[i]=!1,n.set(r,i);return t=>{const i={...e};for(let e=0;e<t.length;++e){const r=n.get(t[e]);if(!r)return[i,t.substring(e)];i[r]=!0}return[i,""]}}const Bt=/*@__PURE__*/Ct({st:"i",ot:"!"}),It=Object.freeze({});function jt(t,e,n){const i=t.F.url,r=t.C,s=t.ct??It;return t.F.url=encodeURIComponent(e).replaceAll(/%2F/g,"/")+t.U.search,t.C=e,n.length>0&&(t.ct=Object.freeze(Object.fromEntries([...Object.entries(s),...n]))),()=>{t.F.url=i,t.C=r,t.ct=s}}function Ht(t){return wt(t)?.ct??It}function qt(t,e){return Ht(t)[e]}function Dt(t){const e=wt(t);return e?e.U.pathname+e.U.search:t.url??"/"}function Lt(t){const e=wt(t);e&&(t.url=e.U.pathname+e.U.search)}const zt=t=>"function"==typeof t?{handleRequest:t}:t,Wt=(t,e)=>"function"==typeof t?{handleUpgrade:t,shouldUpgrade:e}:{shouldUpgrade:e,...t},Jt=(t,e=Xt)=>({handleRequest:t,handleUpgrade:t,shouldUpgrade:e}),Gt=t=>"function"==typeof t?{handleError:t}:t,Vt=t=>"function"==typeof t?{handleRequest:t}:t,Zt=t=>"function"==typeof t?{handleUpgrade:t}:t,Xt=()=>!1,Yt=Symbol("http");class Kt{constructor(){this.ft=[],this.ut=[]}A(t,e,n,i,r){const s=n?((t,e)=>{const n=["^"],i=[],r=/[{}]|\/+|\\(.)|[:*]([a-zA-Z0-9_]*)/g,[{st:s,ot:o},c]=Bt(t);if("/"!==c[0])throw new Error("path must begin with '/' or flags");let a=0,f=0;for(const t of c.matchAll(r)){t.index>a&&n.push(Mt(c.substring(a,t.index)));const e=t[0];if("{"===e)n.push("(?:"),++f;else if("}"===e){if(0===f)throw new Error(`unbalanced optional braces in path at ${t.index}`);--f,n.push(")?")}else if("/"===e[0])n.push(e),o||n.push("+");else if("\\"===e[0])n.push(Mt(t[1]));else{const r=e[0],s=t[2];if(!s)throw new Error(`unnamed parameter or unescaped '${r}' at ${t.index}`);"*"===r?(n.push("(.*?)"),i.push({ht:s,lt:o?Ft:Ut})):(n.push("([^/]+?)"),i.push({ht:s,lt:Rt}))}a=t.index+e.length}if(a<c.length&&n.push(Mt(c.substring(a))),f>0)throw new Error("unbalanced optional braces in path");return e&&(n.push("(?:"),o?n.push("(?:(?<=/)|/)"):n.push("(?:/+|(?<=/))"),n.push("(?<rest>.*))?")),n.push("$"),{dt:new RegExp(n.join(""),s?"i":""),wt:i}})(n,i):{dt:null,wt:[]};return this.ft.push({yt:t,gt:"string"==typeof e?e.toLowerCase():e,bt:s.dt,vt:s.wt,Et:r}),this}use(...t){return this.A(null,null,null,!0,t.map(Vt))}mount(t,...e){return this.A(null,null,t,!0,e.map(Vt))}within(t,e){const n=new Kt;return e(n),this.mount(t,n)}at(t,...e){return this.A(null,null,t,!1,e.map(Vt))}onRequest(t,e,...n){return this.A(te(t),Yt,e,!1,n.map(Vt))}onUpgrade(t,e,n,...i){return this.A(te(t),e,n,!1,i.map(Zt))}onError(...t){return this.A(null,null,null,!0,t.map(Gt))}onReturn(...t){return this.ut.push(...t),this}on(t,...e){const n=/^([A-Z]+) (\/.*)$/.exec(t);if(!n)throw new Error("invalid method + path spec: "+JSON.stringify(t));return this.A(n[1],Yt,n[2],!1,e.map(Vt))}get=(t,...e)=>this.A(Qt,Yt,t,!1,e.map(Vt));delete=(...t)=>this.onRequest("DELETE",...t);getOnly=(...t)=>this.onRequest("GET",...t);head=(...t)=>this.onRequest("HEAD",...t);options=(...t)=>this.onRequest("OPTIONS",...t);patch=(...t)=>this.onRequest("PATCH",...t);post=(...t)=>this.onRequest("POST",...t);put=(...t)=>this.onRequest("PUT",...t);ws=(...t)=>this.onUpgrade("GET","websocket",...t);async handleRequest(t){return this.xt(t,new tt)}async handleUpgrade(t){return this.xt(t,new tt)}async handleError(t,e){const n=new tt;return n.A(t),this.xt(e,n)}shouldUpgrade(t){return this._t(pt(t))}_t(t){for(const e of this.ft){const n=ee(t,e);if(!n)continue;let i=()=>{};if(!0!==n)try{i=jt(t,n.Tt,[])}catch{continue}try{for(const n of e.Et)if(re(n,t))return!0}finally{i()}}return!1}async xt(t,e){const n=pt(t),i=await this.St(n,e);if(e.$)throw e.O;return i}async St(t,e){for(const n of this.ft){const i=ee(t,n);if(!i)continue;let r=()=>{};if(!0!==i)try{const e=i.kt();r=jt(t,i.Tt,e)}catch(t){e.A(t);continue}try{const i=await ne(t,n.Et,this.ut,e);if(i===Nt)break;if(i===Ot)continue;return i}finally{r()}}return At}}const Qt=new Set(["HEAD","GET"]),te=t=>t?"string"==typeof t?t:new Set(t):null;function ee(t,e){if("string"==typeof e.yt){if(e.yt!==t.F.method)return!1}else if(null!==e.yt&&!e.yt.has(t.F.method??""))return!1;if(e.gt===Yt){if(t.D)return!1}else if(null!==e.gt&&!t.D?.has(e.gt))return!1;if(null===e.bt)return!0;const n=e.bt.exec(t.C);return!!n&&{Tt:"/"+(n.groups?.rest??""),kt:()=>e.vt.map((t,e)=>[t.ht,t.lt(n[e+1])])}}async function ne(t,e,n,i){for(const r of e){let e=await ie(r,t,i);if(e!==At){if(!t.D&&!(e instanceof kt)&&n.length)try{const i="object"==typeof e?e:void 0,r=t.F,s=t.L.W;for(const t of n)await t(i,r,s)}catch(t){i.A(t);continue}return e}}return Ot}async function ie(t,e,n){if(t instanceof Kt)return t.St(e,n);let i=At;try{if(n.$){if(t.handleError){const r=n.O;n.N(),i=await t.handleError(r,e.F,e.D?{socket:e.L.W,head:e.L.o}:{response:e.L.W})}}else if(e.D){if(t.handleUpgrade){const n=e.L;i=await t.handleUpgrade(e.F,n.W,n.o)}}else t.handleRequest&&(i=await t.handleRequest(e.F,e.L.W))}catch(t){t instanceof kt?i=t:n.A(t)}finally{await((t,e)=>lt(t.j,e,t))(e,n)}return i===$t?void 0:i}function re(t,e){if(t instanceof Kt)return t._t(e);if(!t.shouldUpgrade)return Boolean(t.handleUpgrade);try{return t.shouldUpgrade(e.F)}catch(t){return e.$t(t),!1}}function se(t,{onError:e=at,socketCloseTimeout:n=500}={}){const i=[],r=new Set,s=()=>{const t=[...i];i.length=0;for(const e of t)e()},o=t=>{t&&(r.size?i.push(t):setImmediate(t))},c=t=>{r.add(t),t.H.push(()=>{r.delete(t),!r.size&&i.length&&setImmediate(s)})},a=(t,n)=>e(t,"tearing down",n);return{request:async(n,i)=>{let r;try{r=ut(n,!1)}catch(t){return e(t,"parsing request",n),void ot(new st(400),0,i)}ht(r,!1,{W:i},a),c(r);const s=new tt,o=await ie(t,r,s);s.$?(e(s.O,"handling request",n),ot(s.O,0,i)):o!==At&&o!==Ot&&o!==Nt||ot(new st(404),0,i)},upgrade:async(i,r,s)=>{let o;r.once("finish",()=>{const t=setTimeout(()=>r.destroy(),n);r.once("close",()=>clearTimeout(t))});try{o=ut(i,!0)}catch(t){return e(t,"parsing upgrade",i),void ct(new st(400),0,r)}ht(o,!0,{W:r,o:s},a),s=X,c(o);const f=new tt,u=await ie(t,o,f);f.$?(e(f.O,"handling upgrade",i),o.B(f.O,i,r)):u!==At&&u!==Ot&&u!==Nt||(console.warn(`Upgrade ${i.headers.upgrade} request for ${i.url} fell-through. This probably means you need to add shouldUpgrade to one of your upgrade handlers, or if this is intentional, explicitly reject the request (throw new HTTPError(404)) instead of using CONTINUE.`),o.B(new st(404),i,r))},shouldUpgrade:n=>{try{const i=ut(n,!0);return i.$t=t=>e(t,"checking should upgrade",n),re(t,i)}catch{return!1}},clientError:(t,n)=>{const i=n.At,r=t.code;n.writable&&!i?.headersSent&&n.end(ce.get(r)??ae),n.destroy(t),"HPE_INVALID_EOF_STATE"===r||e(t,"initialising request")},softClose(t,e,n){for(const n of r)bt(n,t,e);o(n)},hardClose(t){for(const t of r)vt(t);o(t)},countConnections:()=>r.size}}const oe=t=>Buffer.from(`HTTP/1.1 ${t} ${n[t]}\r\nConnection: close\r\n\r\n`),ce=/*@__PURE__*/new Map([["HPE_HEADER_OVERFLOW",/*@__PURE__*/oe(431)],["HPE_CHUNK_EXTENSIONS_OVERFLOW",/*@__PURE__*/oe(413)],["ERR_HTTP_REQUEST_TIMEOUT",/*@__PURE__*/oe(408)]]),ae=/*@__PURE__*/oe(400);class fe extends EventTarget{constructor(t){super(),this.Ot=t}attach(t,e={}){const n=se(this.Ot,{...e,onError:this.Nt.bind(this,t)});!1===e.autoContinue&&t.addListener("checkContinue",n.request),!1===e.rejectNonStandardExpect&&t.addListener("checkExpectation",n.request),t.addListener("request",n.request),t.addListener("upgrade",n.upgrade);const i=t.shouldUpgradeCallback??(()=>!1);!1!==e.overrideShouldUpgradeCallback&&(t.shouldUpgradeCallback=n.shouldUpgrade),t.addListener("clientError",n.clientError);let r=!1;return(e="",s=-1,o=!1)=>{r||(r=!0,t.removeListener("checkContinue",n.request),t.removeListener("checkExpectation",n.request),t.removeListener("request",n.request),t.removeListener("upgrade",n.upgrade),t.shouldUpgradeCallback===n.shouldUpgrade&&(t.shouldUpgradeCallback=i),t.removeListener("clientError",n.clientError));const c=()=>{o&&t.closeAllConnections()};if(s>0){const i=setTimeout(n.hardClose,s);n.softClose(e,this.Nt.bind(this,t),()=>{clearTimeout(i),c()})}else 0===s&&n.hardClose(c);return n}}listen(t,e,n={}){n.shouldUpgradeCallback&&(n={overrideShouldUpgradeCallback:!1,...n});const r=i(n);n.socketTimeout&&r.setTimeout(n.socketTimeout);const s=this.attach(r,n),o=Object.assign(r,{closeWithTimeout:(t,e)=>new Promise(n=>{r.close(()=>n()),s(t,e,!0)})});return new Promise((i,s)=>{r.once("error",s),r.listen(t,e,n.backlog??511,()=>{r.off("error",s),i(o)})})}Nt(t,e,n,i){const r={error:e,server:t,action:n,request:i};this.dispatchEvent(new CustomEvent("error",{detail:r}))&&at(e,n,i)}}const ue=t=>wt(t)?.U??Y(t),he=t=>ue(t).search,le=t=>new URLSearchParams(ue(t).searchParams),de=(t,e)=>ue(t).searchParams.get(e);function we(t,e){const n=t.indexOf(e);return-1===n?[t]:[t.substring(0,n),t.substring(n+e.length)]}function pe(t){const e=t.headers.authorization;if(!e)return;const[n,i]=we(e," ");return void 0!==i?[n.trim().toLowerCase(),i.trim()]:void 0}function me(t){const e=/^text\/.*;\s*charset=([^;]+)/i.exec(t.headers["content-type"]??"");return e?.[1]?.trim().toLowerCase()??void 0}function ye(t){const e=t.headers["if-range"];return e&&"string"==typeof e?/^("|W\/")/.test(e)?{etag:[e]}:{modifiedSeconds:_e(e)}:{}}function ge(t,e,{maxRanges:n=10,maxNonSequential:i=2,maxWithOverlap:r=2}={}){const s=t.headers.range;if(!s||0===e)return;const[o,c]=we(s,"=");if("bytes"!==o||!c)return;const a=new st(416,{headers:{"content-range":`bytes */${e}`}}),f=t=>{const e=ve(t);if(void 0===e)throw a;return e},u=[];for(const t of c.split(",")){const[i,r]=we(t.trim(),"-");if(void 0===r)throw a;let s;if(i)s={start:f(i),end:r?Math.min(f(r),e-1):e-1};else{if(!r)throw a;s={start:Math.max(e-f(r),0),end:e-1}}if(!(s.start>=e)){if(s.end<s.start||u.length>=n)throw a;u.push(s)}}if(!u.length)throw a;if(u.length>i)for(let t=0;t<u.length-1;++t)if(u[t].start>u[t+1].start)throw a;if(u.length>r)for(let t=1;t<u.length;++t){const e=u[t];for(let n=0;n<t;++n){const t=u[n];if(e.end>=t.start&&t.end>=e.start)throw a}}return{ranges:u,totalSize:e}}function be(t){if(void 0!==t)return"number"==typeof t?[String(t)]:t.length?"string"==typeof t?t.split(",").map(t=>t.trim()):t.flatMap(t=>t.split(",").map(t=>t.trim())):[]}function ve(t){if(t&&/^\s*-?\d+\s*$/.test(t))return Number.parseInt(t,10)}function Ee(t){if(t)return t.split(",").map(t=>{const[e,...n]=t.split(";"),i=new Map(n.map(t=>{const[e,n]=we(t,"=");return[e.trim(),n?.trim()??""]})),r=e.trim(),s="*/*"===r||"*"===r?0:r.endsWith("/*")?1:2,o=Math.max(0,Math.min(1,Number.parseFloat(i.get("q")??"1")));return{name:r,specifiers:i,specificity:s,q:o}})}function xe(t){const e=new Map,n=/\s*([^=]+)=([^";]*?|"(?:[^\\"]|\\.)*")\s*(?:;|$)/y;for(;n.lastIndex<t.length;){const i=n.exec(t);if(!i)throw new st(400,{body:"invalid HTTP key values"});const r=i[1].toLowerCase();let s=i[2];'"'===s[0]&&(s=s.substring(1,s.length-1).replaceAll(/\\(.)/g,(t,e)=>e)),e.set(r,s)}return e}function _e(t){if("string"!=typeof t)return;const e=Date.parse(t);return Number.isNaN(e)?void 0:e/1e3|0}const Te=t=>"function"==typeof t?t:()=>t;class Se{constructor(t=Pe){this.Pt=Te(t)}set(t,e){Ae(t,this,e)}get(t){return Oe(t,this)}clear(t){Ne(t,this)}withValue(t){return Jt(e=>(Ae(e,this,t),At))}}const ke=(t,...e)=>{const n={Pt:n=>t(n,...e)};return t=>Oe(t,n)};function $e(t){return t.Mt||(t.Mt=new Map),t.Mt}function Ae(t,e,n){$e(pt(t)).set(e,n)}function Oe(t,e){const n=wt(t);if(!n)return e.Pt(t);const i=$e(n);if(i.has(e))return i.get(e);const r=e.Pt(t);return i.set(e,r),r}function Ne(t,e){const n=wt(t);n?.Mt?.delete(e)}const Pe=()=>{throw new Error("property has not been set")};function Me({realm:t,extractAndValidateToken:e,fallbackTokenFetcher:n,closeOnExpiry:i=!0,softCloseBufferTime:r=0,onSoftCloseError:s}){const o=Te(t);return Jt(async t=>{const c=Date.now(),a=await o(t),f={"www-authenticate":`Bearer realm="${a}"`},u=pe(t),h="bearer"===u?.[0]?u[1]:await(n?.(t));if(!h)throw new st(401,{headers:f,body:"no token provided"});const l=await e(h,a,t);if(!l)throw new st(401,{headers:f,body:"invalid token"});if("object"==typeof l){if("nbf"in l&&"number"==typeof l.nbf&&c<1e3*l.nbf)throw new st(401,{headers:f,body:"token not valid yet"});if("exp"in l&&"number"==typeof l.exp){const e=1e3*l.exp;if(c>=e-r)throw new st(401,{headers:f,body:"token expired"});i&&((t,e,n,i=0,r=at)=>{const s=pt(t),o=n-Math.max(i,0),c=s.tt??Number.POSITIVE_INFINITY,a=s.et?.nt??c;o>=a&&n>=c||(n<c&&(s.tt=n),o<a&&(s.et={nt:o,X:e,Y:r}),Et(s))})(t,"token expired",e,r,s)}}return Ce.set(t,{realm:a,data:l,scopes:Be(l)}),At})}const Re=t=>Ce.get(t).data,Fe=(t,e)=>Ce.get(t).scopes.has(e),Ue=t=>Jt(e=>{const n=Ce.get(e);if(!n.scopes.has(t))throw new st(403,{headers:{"www-authenticate":`Bearer realm="${n.realm}", scope="${t}"`},body:`scope required: ${t}`});return At}),Ce=/*@__PURE__*/new Se({realm:"",data:null,scopes:new Set});function Be(t){if(!t||"object"!=typeof t||!("scopes"in t))return new Set;const{scopes:e}=t;return Array.isArray(e)?new Set(e):"string"==typeof e?new Set([e]):e&&"object"==typeof e?new Set(Object.entries(e).filter(([t,e])=>e).map(([t])=>t)):new Set}function Ie(t,e){const n=`${0|e.mtimeMs} ${e.size} ${t??""}`;return`W/"${h("sha256").update(n).digest("base64").substring(0,12)}"`}async function je(t){const e=h("sha256");return"string"==typeof t?await d(c(t),e):await d(t.createReadStream({start:0,autoClose:!1}),e),`"sha256-${e.digest("base64")}"`}const He=(t,e)=>new RegExp(t,(t.unicodeSets?"v":t.unicode?"u":"")+(t.ignoreCase||e?"i":"")),qe={mime:"accept",language:"accept-language",encoding:"accept-encoding"},De={zstd:"{file}.zst",br:"{file}.br",gzip:"{file}.gz",deflate:"{file}.deflate",identity:"{file}"},Le=t=>{return{type:"encoding",options:(e=t,n=De,Array.isArray(e)?e.map(t=>[t,n[t]]):Object.entries(e)).map(([t,e])=>({match:t,file:e}))};var e,n};function ze(t,e=10){const n=t.map(t=>({Rt:t.type,Ft:t.options.map(t=>({Ut:t.file,Ct:"string"==typeof t.match?t.match.toLowerCase():He(t.match,!0),Bt:t.as??("string"==typeof t.match?t.match:void 0)}))})).filter(t=>t.Ft.length>0);return{options(t,i){let r=e;const s={},o={mime:We(i.mime),language:We(i.language),encoding:We(i.encoding)};return function*t(e,i){const c=n[i];if(!c)return--r,void(yield{filename:e,info:s});const a=new Set,f=o[c.Rt]??[];for(const n of f){const o=n.name.toLowerCase();for(const n of c.Ft)if("string"==typeof n.Ct?n.Ct===o:n.Ct.test(o)){const o=Je(e,n.Ut);if(a.has(o))continue;if(a.add(o),s[c.Rt]=n.Bt,yield*t(o,i+1),r<=0)return}}s[c.Rt]=void 0,!a.has(e)&&r>0&&(yield*t(e,i+1))}(t,0)},vary:[...new Set(n.map(t=>qe[t.Rt]))].join(" ")}}function We(t){if(t?.length)return 1===t.length?t:[...t].sort((t,e)=>e.q-t.q||e.specificity-t.specificity)}function Je(t,e){return e.replaceAll(/\{(?:file|base|ext)\}/g,e=>"{file}"===e?t:"{base}"===e?t.replace(/\.[^.]*$/,""):m(t))}const Ge=/*@__PURE__*/Ye("bin=application/octet-stream;gz(ip),json,ogg,pdf,wasm,xml,y(a)ml,zip,zst(d)=application/{ext};aac,flac,mid(i),wav(e)=audio/{ext};mp3=audio/mpeg;oga,opus=audio/ogg;otf,ttf,woff,woff2=font/{ext};apng,avif,bmp,gif,heic,heif,jp(e)g,png,tif(f),webp=image/{ext};ico,cur=image/x-icon;svg=image/svg+xml;3mf,obj,stl,u3d=model/{ext};wrl=model/vrml;x3d=model/x3d+xml;x3db=model/x3d+binary;x3dv=model/x3d+vrml;css,csv,htm(l),rtf,vcard=text/{ext};(m)js=text/javascript;md=text/markdown;txt=text/plain;3gp(p),3g(pp)2,mp4,mp(e)g,h264=video/{ext};mov=video/quicktime;ogv=video/ogg");let Ve=/*@__PURE__*/new Map(Ge);function Ze(){Ve=new Map(Ge)}function Xe(t){const e=new Map;for(const n of t.split("\n")){const[t,...i]=n.replaceAll(/\s+/g," ").trim().split(" ");if(!t.startsWith("#"))for(const n of i)e.set(n.toLowerCase(),t)}return e}function Ye(t){const e=new Map;for(const n of t.split(/[\n;]/g)){const[t,i,r]=/^ *([^=]+)=(.*)$/.exec(n)??[null,null,""];for(const t of i?.split(",")??[]){const[n,i,s="",o=""]=/^([^(]*)(?:\(([^)]*)\)(.*))?$/.exec(t),c=i+s+o,a=r.replace("{ext}",c);e.set(c.toLowerCase(),a),s&&e.set((i+o).toLowerCase(),a)}}return e}function Ke(t){for(const[e,n]of t)Ve.set(e.toLowerCase(),n)}function Qe(t,e="utf-8"){"."===t[0]&&(t=t.substring(1));const n=Ve.get(t)??"application/octet-stream";return n.startsWith("text/")&&!n.includes("charset=")?`${n}; charset=${e}`:n}async function tn(t,e,n){const i=await x(t),r={file:t,mime:Qe(m(t)),rawSize:i.byteLength,bestSize:i.byteLength,created:0};if(r.rawSize<=n)return r;if(["image","video","audio","font"].includes(r.mime.split("/")[0]))return r;for(const s of e){const e=rn.get(s.match),o=y(g(t),Je(b(t),s.file));if(!e||o===s.file)continue;const c=await e(i);c.byteLength<=r.rawSize-n&&(await _(o,c),r.bestSize=Math.min(r.bestSize,c.byteLength),++r.created)}return r}async function en(t,e,n){const i=[];await nn(t,i);const r=new Set(i);for(const t of r)for(const n of e){const e=y(g(t),Je(b(t),n.file));e!==t&&r.delete(e)}return Promise.all([...r].map(t=>tn(t,e,n)))}async function nn(t,e){const n=await T(t);if(n.isDirectory())for(const n of await S(t))await nn(y(t,n),e);else n.isFile()&&e.push(t)}const rn=/*@__PURE__*/new Map([["zstd",t=>p(w.zstdCompress)(t)],["brotli",t=>p(w.brotliCompress)(t,{params:{[w.constants.BROTLI_PARAM_QUALITY]:w.constants.BROTLI_MAX_QUALITY,[w.constants.BROTLI_PARAM_SIZE_HINT]:t.length}})],["gzip",t=>p(w.gzip)(t,{level:w.constants.Z_BEST_COMPRESSION})],["deflate",t=>p(w.deflate)(t)]]);class sn{constructor(t,{subDirectories:e=!0,caseSensitive:n="exact",allowAllDotfiles:i=!1,allowAllTildefiles:r=!1,allowDirectIndexAccess:s=!1,allow:o=[".well-known"],hide:c=[],indexFiles:a=["index.htm","index.html"],implicitSuffixes:f=[],negotiation:u}){this.It=t,this.jt=!0===e?Number.POSITIVE_INFINITY:e||0,this.Ht=n,this.qt=i,this.Dt=r,this.Lt=s,this.zt=a,this.Wt=["",...f],this.Jt=new Set(o.map(t=>this.Gt(t))),this.Vt=new Set,this.Zt=[];for(const t of c)"string"==typeof t?this.Vt.add(this.Gt(t)):this.Zt.push(He(t,!n));this.Xt=new Set(a.map(t=>this.Gt(t))),u?.length?(this.Yt=ze(u),this.vary=this.Yt.vary):this.vary=""}static async build(t,e){return new sn(await k(t,{encoding:"utf-8"})+v,e)}Gt(t){return"exact"===this.Ht?t:t.toLowerCase()}Kt(t){if(this.Jt.has(t))return!0;const e=t.trim();return!(!("~"!==e[0]&&"~"!==e[e.length-1]||this.Dt)||"."===e[0]&&!this.qt||this.Vt.has(e)||this.Zt.some(t=>t.test(e)))}async find(t,e={}){let n=t.join(v);"force-lowercase"===this.Ht&&(n=n.toLowerCase());let i=E(this.It,n);if(!i.startsWith(this.It)&&i+v!==this.It)return null;let r=null,s=null;for(const t of this.Wt){const e=i+t;if(r=e.substring(this.It.length).split(v).filter(t=>t),r.length>this.jt+1)return null;if(r.some(t=>!this.Kt(this.Gt(t))))return null;const n=r[r.length-1]??"";if(!this.Lt&&this.Xt.has(this.Gt(n))&&!this.Jt.has(this.Gt(n)))return null;if(s=await k(e,{encoding:"utf-8"}).catch(()=>null),s){i=e;break}}if(!s||!r)return null;if(this.Gt(s)!==this.Gt(i))return null;let o=s,c=await T(s).catch(()=>null);if(!c)return null;if(c.isDirectory()){if(r.length>this.jt)return null;for(const t of this.zt){const e=y(s,t);if(c=await T(e).catch(()=>null),c?.isFile()){o=e;break}}}if(!c?.isFile())return null;if(this.Yt){const t=b(o),n=g(o);for(const i of this.Yt.options(t,e)){if(!i.filename||i.filename.includes(v))continue;const t=await cn({canonicalPath:o,negotiatedPath:y(n,i.filename),...i.info});if(t)return t}}return cn({canonicalPath:o,negotiatedPath:o})}async precompute(){const t=new Map,e=(e,n)=>{const i=t.get(e);(!i||n.p>i.p)&&t.set(e,n)},n=new J({dir:[this.It],depth:0});for(const{dir:t,depth:i}of n){const r=await S(y(...t),{withFileTypes:!0,encoding:"utf-8"}),s=new Set(r.map(t=>this.Gt(t.name)));for(const o of r){const r=this.Gt(o.name);if(!this.Kt(r))continue;const c=[...t,o.name];if(o.isDirectory())i<this.jt&&n.push({dir:c,depth:i+1}),e(this.Gt(c.slice(1).join("/")),on);else if(o.isFile()){const n={file:y(...c),dir:y(...t),basename:r,siblings:s},i=this.zt.indexOf(r);if(-1!==i&&(e(this.Gt(t.slice(1).join("/")),{...n,p:this.zt.length+1-i}),!this.Lt&&!this.Jt.has(r)))continue;const a=this.Gt(c.slice(1).join("/"));for(let t=0;t<this.Wt.length;++t){const i=this.Wt[t];o.name.endsWith(i)&&e(a.substring(0,a.length-i.length),{...n,p:-t})}}}}return{find:async(e,n={})=>{const i=t.get(this.Gt(e.join("/")));if(!i?.file)return null;if(this.Yt)for(const t of this.Yt.options(i.basename,n)){if(!i.siblings.has(this.Gt(t.filename)))continue;const e=await cn({canonicalPath:i.file,negotiatedPath:y(i.dir,t.filename),...t.info});if(e)return e}return cn({canonicalPath:i.file,negotiatedPath:i.file})},vary:this.vary}}}const on={file:"",dir:"",basename:"",siblings:new Set,p:1};async function cn(t){const e=await $(t.negotiatedPath,a.O_RDONLY).catch(()=>null);if(!e)return null;const n=()=>(e.close().catch(()=>{}),null),i=await e.stat().catch(n);return i?.isFile()?{handle:e,stats:i,...t}:n()}const an=/*@__PURE__*/ke(async t=>{const e=St(t);if(e.aborted)throw $t;e.throwIfAborted();const n=await A(y(N(),"upload"));Tt(t,()=>O(n,{recursive:!0}));let i=0;const r=()=>{if(e.aborted)throw $t;return y(n,(++i).toString(10).padStart(6,"0"))};return{dir:n,nextFile:r,save:async(t,{mode:n=384}={})=>{const i=r(),s=f(i,{mode:n});try{return await d(t,s,{signal:e}),{path:i,size:s.bytesWritten}}finally{s.close()}}}});function fn(t){const e=pt(t);if(!e.L)throw new Error("cannot call acceptBody from shouldUpgrade");if(e.I.signal.aborted)throw $t;e.Qt||e.D||(e.Qt=!0,"100-continue"===t.headers.expect?.trim().toLowerCase()&&e.L.W.writeContinue())}function un(t,{blockRequestHeaders:e=["connection","expect","host","keep-alive","proxy-authorization","transfer-encoding","upgrade","via"],requestHeaders:n=[],blockResponseHeaders:i=["connection","keep-alive","transfer-encoding"],responseHeaders:o=[],agent:c,keepAlive:a=!0,maxSockets:f=10,...u}={}){let h;t.startsWith("https://")?(c??=new M({keepAlive:a,maxSockets:f,...u}),h=s):(c??=new r({keepAlive:a,maxSockets:f,...u}),h=R);const l=t.endsWith("/")?t:t+"/";return zt((r,s)=>new Promise((a,f)=>{const u=St(r),w=t=>f(u.aborted?$t:new st(502,{cause:t})),p=new URL(l+r.url?.substring(1)),m=p.toString();if(!m.startsWith(l)&&m!==t)return f(new st(400,{message:"directory traversal blocked"}));fn(r);let y={...r.headers};hn(y,e);for(const t of n)y=t(r,y);const g=h(p,{agent:c,method:r.method,headers:y,signal:u});g.once("error",w),g.once("response",t=>{if(!s.headersSent){let e={...t.headers};hn(e,i);for(const n of o)e=n(r,t,e);s.writeHead(t.statusCode??200,t.statusMessage,e)}d(t,s).then(a,f)}),d(r,g).catch(w)}))}function hn(t,e){for(const e of be(t.connection)??[])delete t[e.toLowerCase()];for(const n of e)delete t[n]}function ln({trustedProxyCount:t,trustedProxyAddresses:e,trustedHeaders:n}){const i=e?D(e):()=>!0,r=t??(e?Number.POSITIVE_INFINITY:0),s=new Set(n);return ke(t=>{const e=e=>{if(s.has(e))return be(t.headers[e])?.reverse()},n=e("forwarded"),o=e("x-forwarded-for"),c=e("x-forwarded-host"),a=e("x-forwarded-proto"),f=e("x-forwarded-protocol"),u=e("x-url-scheme"),h=e("via")?.map(t=>{const e=/^([^/ ]+\/)?([^ ]+) (.+)$/.exec(t);return e?.[3]?q(e[3]):void 0}),l=[dn(t)];if(n)for(const t of n)try{const e=xe(t);l.push({client:q(e.get("for")),server:q(e.get("by")),host:e.get("host"),proto:e.get("proto")})}catch{l.push({client:void 0,server:void 0,host:void 0,proto:void 0})}else if(o){const t=o.map(q),e=c??[],n=a??f??u??[];let i=l[0].client;for(let r=0;r<t.length;++r){const s=t[r];l.push({client:s,server:h?.[r]??(i?{...i,port:void 0}:void 0),host:e[r],proto:n[r]}),i=s}}else if(h)for(const t of h)l.push({client:void 0,server:t,host:void 0,proto:void 0});let d=Math.min(1+r,l.length);for(let t=0;t<d-1;++t)i(l[t].client)||(d=t+1);return Object.freeze({trusted:l.slice(0,d),untrusted:l.slice(d),outwardChain:l,edge:l[d-1]})})}const dn=t=>({client:{...q(t.socket.remoteAddress)??wn,port:t.socket.remotePort},server:{...q(t.socket.localAddress)??wn,port:t.socket.localPort},host:t.headers.host,proto:void 0}),wn={type:"alias",ip:"_disconnected",port:void 0};function pn(t,e){return delete e.forwarded,delete e["x-forwarded-for"],delete e["x-forwarded-host"],delete e["x-forwarded-proto"],delete e["x-forwarded-protocol"],delete e["x-url-scheme"],e}function mn(t,e){const n=pn(0,e);return n.forwarded=bn([dn(t)]),n}const yn=(t,{onlyTrusted:e=!1}={})=>(n,i)=>{const r=pn(0,i),s=t(n);return r.forwarded=bn([...e?s.trusted:s.outwardChain].reverse()),r};function gn(t,e){let n=t.headers.forwarded;const i=bn([dn(t)]);n?n+=", "+i:n=i;const r=pn(0,e);return r.forwarded=n,r}function bn(t){return t.filter(t=>t.server||t.client).map(t=>Object.entries({for:t.client?.ip,by:t.server?.ip,host:t.host,proto:t.proto}).filter(([t,e])=>e).map(([t,e])=>e&&/[^a-zA-Z0-9._]/.test(e)?`${t}="${e.replaceAll("\\","\\\\").replaceAll('"','\\"').replaceAll(",","-")}"`:`${t}=${e}`).join("; ")).join(", ")}class vn{constructor(t,{fatal:e=!1}={}){this.te=t,this.ee=e,this.ne=new Uint8Array(4),this.ie=new DataView(this.ne.buffer),this.re=0}decode(t,{stream:e=!1}={}){const n=t.byteLength,i=[];let r=0;if(this.re>0){if(r=4-this.re,n<r)return this.ne.set(t,this.re),this.re+=n,"";this.ne.set(t.subarray(0,r),this.re),i.push(this.ie.getUint32(0,this.te)),this.re=0}const s=new DataView(t.buffer,t.byteOffset,t.byteLength);let o=r;for(const t=n-3;o<t;o+=4)i.push(s.getUint32(o,this.te));if(e)o<n&&this.ne.set(t.subarray(o)),this.re=n-o;else if(this.re=0,o<n){if(this.ee)throw new Error("invalid byte length for utf-32 content");i.push(65533)}return i.length>0?String.fromCodePoint(...i):""}}class En extends F{constructor(t){super({transform(e,n){try{const i=t.decode(e,{stream:!0});i&&n.enqueue(i)}catch(t){n.error(t)}},flush(e){try{const n=t.decode(X);n&&e.enqueue(n)}catch(t){e.error(t)}}})}}const xn=new Map;function _n(t,e){xn.set(t.toLowerCase(),e)}function Tn(){_n("utf-32be",{decoder:t=>new vn(!1,t)}),_n("utf-32le",{decoder:t=>new vn(!0,t)})}function Sn(t,e={}){const n=xn.get(t.toLowerCase());if(n)return n.decoder(e);try{return new TextDecoder(t,e)}catch{throw new st(415,{body:`unsupported charset: ${t}`})}}function kn(t,e={}){const n=xn.get(t.toLowerCase());if(n)return n.decoderStream?n.decoderStream(e):new En(n.decoder(e));try{return new U(t,e)}catch{throw new st(415,{body:`unsupported charset: ${t}`})}}const $n=["utf-32be",null,"utf-16be","utf-16be","utf-32le","utf-16le",null,"utf-8"];function An(t,e,n){const i=_e(t.headers["if-modified-since"]),r=be(t.headers["if-none-match"]);if(r){if(Nn(e,n,r))return!1}else if(i&&(n.mtimeMs/1e3|0)<=i)return!1;return!0}function On(t,e,n){let i=!0;const r=ye(t);return r.etag&&(i&&=Nn(e,n,r.etag)),r.modifiedSeconds&&(i&&=(n.mtimeMs/1e3|0)===r.modifiedSeconds),i}function Nn(t,e,n){if(n.includes("*"))return!0;const i=t.getHeader("etag");if("string"==typeof i){if(n.includes(i))return!0;if(i.startsWith('W/"'))return!1}return!!n.some(t=>t.startsWith('W/"'))&&n.includes(Ie(t.getHeader("content-encoding"),e))}class Pn extends F{constructor(t,e){super({transform(i,r){n+=i.byteLength,n>t?r.error(e):r.enqueue(i)}});let n=0}}function Mn(t,{maxExpandedLength:e=Number.POSITIVE_INFINITY,maxContentLength:n=e,maxEncodingSteps:i=1}={}){const r=ve(t.headers["content-length"]);if(void 0!==r&&r>n)throw new st(413);const s=be(t.headers["content-encoding"])??[];if(s.length>i)throw new st(415,{body:"too many content-encoding stages"});fn(t);let o=I.toWeb(t);void 0===r&&Number.isFinite(n)&&(o=o.pipeThrough(new Pn(n,new st(413))));for(const t of s.reverse())o=o.pipeThrough(Cn(t));return Number.isFinite(e)&&(o=o.pipeThrough(new Pn(e,new st(413,{body:"decoded content too large"})))),o}function Rn(t,e={}){const n=Mn(t,e),i=me(t)??e.defaultCharset??"utf-8";return n.pipeThrough(kn(i,e))}async function Fn(t,e={}){const n=[];for await(const i of Rn(t,e))n.push(i);return n.join("")}async function Un(t,e={}){const n=await(async(t,e)=>{const n=t.getReader(),i=new Uint8Array(3);let r=0,s=null;for(;;){const t=await n.read(),e=3-r;if(t.done){0===r?(i[0]=1,i[1]=1):1===r&&(i[1]=i[0]),i[2]=i[0],s=null;break}if(s=t.value,s.byteLength>=e){i.set(s.subarray(0,e),r);break}i.set(s,r),r+=s.byteLength}const o=$n[(i[0]?4:0)|(i[1]?2:0)|(i[2]?1:0)];if(!o)throw n.cancel(),new st(415,{body:"invalid JSON encoding"});const c=kn(o,e),a=c.writable.getWriter();return r&&a.write(i.subarray(0,r)),s&&a.write(s),n.releaseLock(),a.releaseLock(),t.pipeThrough(c)})(Mn(t,e),e),i=[];for await(const t of n)i.push(t);return JSON.parse(i.join(""))}function Cn(t){switch(t.toLowerCase()){case"gzip":case"x-gzip":return new C("gzip");case"deflate":return new C("deflate");case"br":try{return new C("brotli")}catch{return j.toWeb(w.createBrotliDecompress())}case"zstd":try{return j.toWeb(w.createZstdDecompress())}catch{throw new st(415,{body:"unsupported content encoding"})}default:throw new st(415,{body:"unknown content encoding"})}}function Bn(t){if(!t)return null;const[e,n]=we(t,";"),i=new Map;if(n){const t=/\s*([!#-'*+\-.0-:>-Z^-z|~]+)=(?:([!#-'*+\-.0-:>-Z^-z|~]+)|"((?:[^\x00-\x08\x0a-\x1f"\\\x7f]|\\.)*)")\s*(;|$)/gy;for(;t.lastIndex!==n.length;){const e=t.exec(n);if(!e)return null;const r=e[1].toLowerCase(),s=e[2]??e[3]?.replaceAll(/\\(.)/g,"$1")??"";i.has(r)||i.set(r,s)}}return{mime:e.trim().toLowerCase(),params:i}}function In(t,e,n,i){const r=t.byteLength;for(;e<r;){for(;e<r;++e){const n=t[e];if(32!==n&&9!==n)break}if(e===r)break;if(59!==t[e++])return!1;for(;e<r;++e){const n=t[e];if(32!==n&&9!==n)break}if(e===r)return!1;const s=e;for(;e<r;++e){const n=t[e];if(!qn[n]){if(61===n)break;return!1}}if(e===r)return!1;const o=t.subarray(s,e),c=jn.decode(o).toLowerCase();if(42===o[o.byteLength-1]){const i=++e;for(;e<r;++e){const n=t[e];if(!Ln[n]){if(39!==n)return!1;break}}if(e===r)return!1;const s=Sn(jn.decode(t.subarray(i,e)));for(++e;e<r&&39!==t[e];++e);if(e===r)return!1;if(++e===r)return!1;let o=e;const a=[];for(;e<r;++e){const n=t[e];if(1!==Dn[n]){if(37===n){let n,i;if(e+2<r&&-1!==(n=Wn[t[e+1]])&&-1!==(i=Wn[t[e+2]])){const r=(n<<4)+i;e>o&&a.push(s.decode(t.subarray(o,e),{stream:!0})),a.push(s.decode(Buffer.from([r]),{stream:!0})),o=(e+=2)+1;continue}return!1}break}}a.push(s.decode(t.subarray(o,e)));const f=a.join("");n.has(c)||n.set(c,f);continue}if(++e===r)return!1;if(34===t[e]){let s=++e,o=!1;const a=[];for(;e<r;++e){const n=t[e];if(92!==n){if(34===n){if(o){s=e,o=!1;continue}a.push(i.decode(t.subarray(s,e)));break}if(o&&(s=e-1,o=!1),!zn[n])return!1}else o?(s=e,o=!1):(a.push(i.decode(t.subarray(s,e),{stream:!0})),o=!0)}if(e===r)return!1;++e,n.has(c)||n.set(c,a.join(""));continue}let a=e;for(;e<r;++e){const n=t[e];if(!qn[n]){if(e===a)return!1;break}}n.has(c)||n.set(c,i.decode(t.subarray(a,e)))}return!0}const jn=/*@__PURE__*/new TextDecoder("iso-8859-1"),Hn=[1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],qn=/*@__PURE__*/(()=>{const t=new Uint8Array(256);return t.set([1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,...Hn,0,1,0,1],33),t})(),Dn=/*@__PURE__*/(()=>{const t=new Uint8Array(256);return t.set([1,0,1,1,0,1,0,0,0,0,1,0,1,1,0,...Hn,0,1,0,1],33),t})(),Ln=/*@__PURE__*/(()=>{const t=new Uint8Array(256);return t.set([1,0,1,1,1,1,0,0,0,0,1,0,1,0,0,...Hn,1,0,1,1],33),t})(),zn=/*@__PURE__*/(()=>{const t=new Uint8Array(256);return t.fill(1,32,256),t[9]=1,t[34]=0,t[92]=0,t[127]=0,t})(),Wn=/*@__PURE__*/(()=>{const t=new Int8Array(256).fill(-1);for(let e=0;e<10;++e)t[48+e]=e;for(let e=0;e<6;++e)t[65+e]=e+10,t[97+e]=e+10;return t})();class Jn{constructor(t,e){const n=t.byteLength;if(!n||n>65535)throw new Error("invalid needle");this.se=t,this.oe=e,this.ce=null,this.ae=0,this.fe=null}push(t){let e=0;const n=t.byteLength,i=this.se,r=i.byteLength-1,s=n-r;let o=-this.ae;if(this.ae){const c=this.fe,a=this.ce,f=i[r];if(s>0){const n=t[o+r];n!==f||t.compare(i,-o,r,0,o+r)?o+=c[n]:(this.oe(!0,X,0,0,!0),this.ae=0,e=o+=r+1)}const u=s<0?s:0;for(;o<u;){const n=t[o+r];if(n===f&&!a.compare(i,0,-o,this.ae+o,this.ae)&&!t.compare(i,-o,r,0,o+r)){this.oe(!0,a,0,this.ae+o,!1),this.ae=0,e=o+=r+1;break}o+=c[n]}const h=this.ae;if(h>0){const e=i[0];for(;o<0;){const r=a.subarray(0,h).indexOf(e,h+o);if(-1===r){o=0;break}const s=h-r;if(!a.compare(i,1,s,r+1,h)&&!t.compare(i,s,s+n))return r&&(this.oe(!1,a,0,r,!1),a.copy(a,0,r,s)),a.set(t,s),void(this.ae+=n-r);o=r+1-h}this.oe(!1,a,0,h,!1),this.ae=0}}for(;o<s;){const n=t.indexOf(i,o);if(-1!==n){if(this.oe(!0,t,e,n,!0),n===s+1)return;e=o=n+r+1}else o=s}const c=i[0];for(;o<n;){const s=t.indexOf(c,o);if(-1===s)return void this.oe(!1,t,e,n,!0);if(!t.compare(i,1,n-s,s+1)){if(!this.ce){this.ce=Buffer.allocUnsafe(r),this.fe=new Uint16Array(256).fill(r+1);for(let t=0;t<r;++t)this.fe[i[t]]=r-t}return t.copy(this.ce,0,s),this.ae=n-s,void(s>e&&this.oe(!1,t,e,s,!0))}o=s+1}n>e&&this.oe(!1,t,e,n,!0)}destroy(){const t=this.ae;t&&this.ce&&this.oe(!1,this.ce,0,t,!1),this.ae=0}}class Gn extends H{constructor({limits:t={},preservePath:e,highWaterMark:n,fileHwm:i,defParamCharset:r="utf-8",defCharset:s="utf-8"},o){super({autoDestroy:!0,emitClose:!0,highWaterMark:n,write:Vn,destroy:Zn,final:Xn});const c=o.get("boundary");if(!c)throw new st(400,{body:"Multipart: Boundary not found"});const a=Sn(r),f={autoDestroy:!0,emitClose:!0,highWaterMark:i},u=t.fieldSize??1048576,h=t.fileSize??Number.POSITIVE_INFINITY,l=t.fieldNameSize??100,d=t.files??Number.POSITIVE_INFINITY,w=t.fields??Number.POSITIVE_INFINITY,p=t.parts??Number.POSITIVE_INFINITY;let m=-1,y=0,g=0,b=!1;this.ue=0,this.he=!1;let v,E,x,_,T,S=0,k=0,$=!1,A=!1,O=!1,N=!1;const P=new Kn(t=>{this.le=void 0,b=!1,_="text/plain";let n,i=s;x="7bit",T=void 0,$=!1,A=!1;const r=t["content-disposition"]?.[0];if(!r)return void(b=!0);const o=((t,e)=>{if(!t.byteLength)return null;const n=new Map;let i=0;for(;i<t.byteLength;++i)if(!qn[t[i]]){if(!In(t,i,n,e))return null;break}return{type:jn.decode(t.subarray(0,i)).toLowerCase(),params:n}})(r,a);if("form-data"!==o?.type)return void(b=!0);o.params&&(T=o.params.get("name")??"",T.length>l&&(T=T.substring(0,l),$=!0),n=o.params.get("filename*")??o.params.get("filename"),void 0===n||e||(n=(t=>{for(let e=t.length;e-- >0;)if("/"===t[e]||"\\"===t[e]){t=t.slice(e+1);break}return".."===t||"."===t?"":t})(n)));const c=t["content-type"]?.[0];if(c){const t=Bn(jn.decode(c));t&&(_=t.mime,i=t.params.get("charset")?.toLowerCase()??s)}E=Sn(i);const u=t["content-transfer-encoding"]?.[0];if(u&&(x=jn.decode(u).toLowerCase()),"application/octet-stream"===_||void 0!==n){if(g===d)return O||(O=!0,this.emit("filesLimit")),void(b=!0);if(++g,0===this.listenerCount("file"))return void(b=!0);S=0,this.de=new Qn(f,this),++this.ue,this.emit("file",T,this.de,{nameTruncated:$,filename:n,encoding:x,mimeType:_})}else{if(y===w)return N||(N=!0,this.emit("fieldsLimit")),void(b=!0);if(++y,0===this.listenerCount("field"))return void(b=!0);v=[],k=0}});let M=0;const R=Buffer.from(`\r\n--${c}`,"latin1");this.we=new Jn(R,(t,e,n,i,r)=>{const s=(t,n)=>{if(r)return e.subarray(t,n);const i=Buffer.allocUnsafe(n-t);return e.copy(i,0,t,n),i};for(;n!==i;){if(this.le){const t=this.le.push(e,n,i,r);if(-1===t){this.le=void 0,P.reset(),this.emit("error",new Error("Malformed part header"));break}if(t===i)break;n=t}if(M){if(1===M){switch(e[n]){case 45:M=2,++n;break;case 13:M=3,++n;break;default:M=0}if(n===i)return}if(2===M){if(M=0,45===e[n])return this.he=!0,void(this.we=ei)}else if(3===M&&(M=0,10===e[n])){if(++n,m>=p)break;this.le=P;continue}}if(!b)if(this.de){const t=s(n,Math.min(i,n+h-S));S+=t.byteLength,S===h?(t.length>0&&this.de.push(t),this.de.emit("limit"),this.de.truncated=!0,b=!0):this.de.push(t)||(this.pe&&(this.de.me=this.pe),this.pe=void 0)}else if(v){const t=s(n,Math.min(i,n+u-k));k+=t.byteLength,v.push(E.decode(t)),k===u&&(b=!0,A=!0)}break}if(t){if(M=1,this.de)this.de.push(null),this.de=void 0;else if(v){const t=v.join("");v=void 0,k=0,this.emit("field",T,t,{nameTruncated:$,valueTruncated:A,encoding:x,mimeType:_})}++m===p&&this.emit("partsLimit")}}),this.write(ni)}ye(){if(this.le)return new Error("Malformed part header");const t=this.de;return t&&(this.de=void 0,t.destroy(new Error("Unexpected end of file"))),this.he?null:new Error("Unexpected end of form")}}function Vn(t,e,n){this.pe=n,this.we.push(t);const i=this.pe;i&&(this.pe=void 0,i())}function Zn(t,e){this.le=void 0,this.we=ei,t??=this.ye();const n=this.de;n&&(this.de=void 0,n.destroy(t??void 0)),e(t)}function Xn(t){if(this.we.destroy(),!this.he)return t(new Error("Unexpected end of form"));this.ue?this.ge=()=>t(this.ye()):t(this.ye())}const Yn=16384;class Kn{constructor(t){this.be=Object.create(null),this.ve=0,this.Ee=0,this.m=0,this.ht=[],this.xe=[],this._e=0,this.oe=t}reset(){this.be=Object.create(null),this.ve=0,this.Ee=0,this.m=0,this.ht.length=0,this.xe.length=0,this._e=0}push(t,e,n,i){let r=e;t:for(;e<n;)switch(this.m){case 0:for(;e<n;++e){if(this.Ee===Yn)return-1;++this.Ee;const n=t[e];if(!qn[n]){if(58!==n)return-1;if(e>r&&this.ht.push(jn.decode(t.subarray(r,e))),!this.ht.length)return-1;++e,this.m=1;continue t}}e>r&&this.ht.push(jn.decode(t.subarray(r,e)));break;case 1:for(;e<n;++e){if(this.Ee===Yn)return-1;++this.Ee;const n=t[e];if(32!==n&&9!==n){r=e,this.m=2;continue t}}break;case 2:switch(this._e){case 0:for(;e<n;++e){if(this.Ee===Yn)return-1;++this.Ee;const n=t[e];if(n<32||127===n){if(13!==n)return-1;++this._e;break}}if(i)this.xe.push(t.subarray(r,e));else{const n=Buffer.allocUnsafe(e-r);t.copy(n,0,r,e),this.xe.push(n)}++e;break;case 1:if(this.Ee===Yn)return-1;if(++this.Ee,10!==t[e++])return-1;++this._e;break;case 2:{if(this.Ee===Yn)return-1;++this.Ee;const n=t[e];if(32===n||9===n)r=e,this._e=0;else{if(++this.ve<2e3){const t=this.ht.join("").toLowerCase(),e=Buffer.concat(this.xe),n=this.be[t];n?n.push(e):this.be[t]=[e]}13===n?(++this._e,++e):(r=e,this._e=0,this.m=0,this.ht.length=0,this.xe.length=0)}break}case 3:{if(this.Ee===Yn)return-1;if(++this.Ee,10!==t[e++])return-1;const n=this.be;return this.reset(),this.oe(n),e}}}return e}}class Qn extends I{constructor(t,e){super({...t,read:ti}),this.truncated=!1,this.once("end",()=>{if(ti.call(this),0===--e.ue&&e.ge){const t=e.ge;e.ge=void 0,process.nextTick(t)}})}}function ti(t){const e=this.me;e&&(this.me=void 0,e())}const ei={push:()=>{},destroy:()=>{}},ni=/*@__PURE__*/Buffer.from("\r\n");class ii extends H{constructor({limits:t={},highWaterMark:e,defCharset:n="utf-8"},i){super({autoDestroy:!0,emitClose:!0,highWaterMark:e,write:ri,final:si}),this.Te=i.get("charset")??n,this.Se=t.fieldSize??1048576,this.ke=t.fields??Number.POSITIVE_INFINITY,this.$e=t.fieldNameSize??100,this.Ae=!0,this.Oe=!1,this.Ne=!1,this.Pe=0,this.Me=0,this.Re=0,this.Fe=[],this.Ue=[],this.Ce=-2,this.Be=0,this.Ie=Sn(this.Te)}je(t,e){const n=this.Ae?this.Fe:this.Ue,i=this.Ie.decode(t,{stream:!e});i&&n.push(i)}He(t,e,n){if(e>=n)return n;if(-1===this.Ce){const i=Wn[t[e++]];if(-1===i)return-1;if(e<n){const n=Wn[t[e++]];if(-1===n)return-1;this.je(Buffer.from([(i<<4)+n]),!1),this.Ce=-2,this.Be=e}else this.Ce=i}else{const n=Wn[t[e++]];if(-1===n)return-1;this.je(Buffer.from([(this.Ce<<4)+n]),!1),this.Ce=-2,this.Be=e}return e}qe(t,e,n){if(this.Pe>this.$e){for(this.Oe||this.Be<e&&this.je(t.subarray(this.Be,e-1),!1),this.Oe=!0;e<n;++e){const n=t[e];if(61===n||38===n)break}this.Be=e}return e}De(t,e,n){if(this.Me>this.Se){for(this.Ne||this.Be<e&&this.je(t.subarray(this.Be,e-1),!1),this.Ne=!0;e<n&&38!==t[e];++e);this.Be=e}return e}}function ri(t,e,n){if(this.Re>=this.ke)return n();let i=0;const r=t.length;if(this.Be=0,-2!==this.Ce){if(i=this.He(t,i,r),-1===i)return n(new Error("Malformed urlencoded form"));if(i>=r)return n();this.Ae?++this.Pe:++this.Me}t:for(;i<r;)if(this.Ae){for(i=this.qe(t,i,r);i<r;){switch(t[i]){case 61:this.je(t.subarray(this.Be,i),!0),this.Be=++i,this.Ae=!1;continue t;case 38:if(this.je(t.subarray(this.Be,i),!0),this.Be=++i,this.Fe.length>0&&(this.emit("field",this.Fe.join(""),"",{nameTruncated:this.Oe,valueTruncated:!1,encoding:this.Te,mimeType:"text/plain"}),this.Fe.length=0),this.Oe=!1,this.Pe=0,++this.Re>=this.ke)return this.emit("fieldsLimit"),n();continue;case 43:this.Be<i&&this.je(t.subarray(this.Be,i),!1),this.je(oi,!1),this.Be=i+1;break;case 37:if(this.Be<i&&this.je(t.subarray(this.Be,i),!1),this.Be=i+1,this.Ce=-1,i=this.He(t,i+1,r),-1===i)return n(new Error("Malformed urlencoded form"));if(i>=r)return n();++this.Pe,i=this.qe(t,i,r);continue}++i,++this.Pe,i=this.qe(t,i,r)}this.Be<i&&this.je(t.subarray(this.Be,i),!1)}else{for(i=this.De(t,i,r);i<r;){switch(t[i]){case 38:if(this.je(t.subarray(this.Be,i),!0),this.Be=++i,this.Ae=!0,this.emit("field",this.Fe.join(""),this.Ue.join(""),{nameTruncated:this.Oe,valueTruncated:this.Ne,encoding:this.Te,mimeType:"text/plain"}),this.Fe.length=0,this.Ue.length=0,this.Oe=!1,this.Ne=!1,this.Pe=0,this.Me=0,++this.Re>=this.ke)return this.emit("fieldsLimit"),n();continue t;case 43:this.Be<i&&this.je(t.subarray(this.Be,i),!1),this.je(oi,!1),this.Be=i+1;break;case 37:if(this.Be<i&&this.je(t.subarray(this.Be,i),!1),this.Be=i+1,this.Ce=-1,i=this.He(t,i+1,r),-1===i)return n(new Error("Malformed urlencoded form"));if(i>=r)return n();++this.Me,i=this.De(t,i,r);continue}++i,++this.Me,i=this.De(t,i,r)}this.Be<i&&this.je(t.subarray(this.Be,i),!1)}n()}function si(t){if(-2!==this.Ce)return t(new Error("Malformed urlencoded form"));this.je(X,!0),(!this.Ae||this.Fe.length>0)&&this.emit("field",this.Fe.join(""),this.Ae?"":this.Ue.join(""),{nameTruncated:this.Oe,valueTruncated:this.Ne,encoding:this.Te,mimeType:"text/plain"}),t()}const oi=/*@__PURE__*/Buffer.from(" ","utf-8");function ci(t,{closeAfterErrorDelay:e=500,...n}={}){const i=((t,e={})=>{const n=t["content-type"];if(!n)throw new st(400,{body:"Missing Content-Type"});const i=Bn(n);if(!i)throw new st(400,{body:"Malformed content type"});const r="application/x-www-form-urlencoded"===i.mime?ii:"multipart/form-data"!==i.mime||e.blockMultipart?null:Gn;if(!r)throw new st(415);return new r(e,i.params)})(t.headers,n);fn(t);const r=new G,s=(n,s)=>{if(r.fail(new st(n,s)),i.removeAllListeners(),t.unpipe(i),t.resume(),e>=0){const n=setTimeout(()=>t.socket.destroy(),e);t.once("end",()=>clearTimeout(n))}};i.on("field",(t,e,{nameTruncated:n,valueTruncated:i,encoding:o,mimeType:c})=>t?n?s(400,{body:`field name ${JSON.stringify(t)}... too long`}):i?s(400,{body:`value for ${JSON.stringify(t)} too long`}):void r.push({name:t,encoding:o,mimeType:c,type:"string",value:e}):s(400,{body:"missing field name"})),i.on("file",(t,e,{nameTruncated:n,filename:i,encoding:o,mimeType:c})=>t?n?s(400,{body:`field name ${JSON.stringify(t)}... too long`}):void(i?(e.once("limit",()=>s(400,{body:`uploaded file for ${JSON.stringify(t)}: ${JSON.stringify(i)} too large`})),r.push({name:t,encoding:o,mimeType:c,type:"file",value:e,filename:i})):e.resume()):s(400,{body:"missing field name"})),t.once("error",e=>{t.readableAborted?r.fail($t):s(500,{body:"request error",headers:{connection:"close"},cause:e})}),i.once("error",t=>s(400,{body:"error parsing form data",cause:t})),i.once("partsLimit",()=>s(400,{body:"too many parts"})),i.once("filesLimit",()=>s(400,{body:"too many files"})),i.once("fieldsLimit",()=>s(400,{body:"too many fields"}));const o=()=>r.close("complete");return i.once("close",o),Tt(t,o),t.pipe(i),r}async function ai(t,e={}){const n=new FormData,i=new Map;for await(const r of ci(t,e))if("file"===r.type){const s=r.value;let o=await(e.preCheckFile?.({fieldName:r.name,filename:r.filename,encoding:r.encoding,mimeType:r.mimeType,maxBytes:e.limits?.fileSize}));const c=t=>{if("function"==typeof o){const e=o;return o=void 0,e({actualBytes:t})}};Tt(t,()=>c(0));const a=await an(t),f=await a.save(s,{mode:384});await c(f.size);const h=new File([await u(f.path)],r.filename,{type:r.mimeType});i.set(h,f.path),n.append(r.name,h)}else{let t=r.value;e.trimAllValues&&(t=t.trim()),n.append(r.name,t)}return Object.assign(n,{getTempFilePath(t){const e=i.get(t);if(!e)throw new Error("unknown file");return e},getBoolean(t){const e=n.get(t);return null===e?null:"true"===e||"on"===e},getString(t){const e=n.get(t);return"string"==typeof e?e:null},getAllStrings:t=>n.getAll(t).filter(t=>"string"==typeof t),getFile(t){const e=n.get(t);return"string"==typeof e?null:e},getAllFiles:t=>n.getAll(t).filter(t=>"string"!=typeof t)})}const fi="win32"===/*@__PURE__*/P();function ui(t,{rejectPotentiallyUnsafe:e=!0}={}){let n=[];const i=wt(t);if(i){if("/"===i.C)return[];n=i.C.split("/")}else{const e=Y(t).pathname;if("/"===e)return[];n=e.split("/").map(decodeURIComponent)}if(""!==n[0])throw new Error("invalid path");if(n.shift(),e){const t=fi?li:hi;if(n.some(e=>t.test(e)||e.includes(v)))throw new Error("invalid path");if(n.slice(0,n.length-1).includes(""))throw new Error("invalid path")}return n}const hi=/[\x00-\x1F\x7F/]|^(\.\.?|~)$/,li=/[\x00-\x1F"*/:<>?\\|\x7F]|^[\s.]*$|^(CON|PRN|AUX|NUL|(COM|LPT)[\d\xB9\xB2\xB3])(\.|$)/i,di=t=>new Promise(e=>{const n=()=>{t.cork(),e()};t instanceof o?t.write(X,n):t.once("drain",n),t.uncork()});async function wi(t,e,{delimiter:n=",",newline:i="\n",quote:r='"',encoding:s="utf-8",headerRow:c,end:a=!0}={}){"string"==typeof n&&(n=Buffer.from(n,s)),"string"==typeof i&&(i=Buffer.from(i,s));const f="string"==typeof r?Buffer.from(r,s):r,u=r+r,h=e=>{if(!e)return!0;const n=e.includes(r);return!n&&pi.test(e)?t.write(e,s):(t.write(f),n?t.write(e.replaceAll(r,u),s):t.write(e,s),t.write(f))};t instanceof o&&!t.headersSent&&!t.hasHeader("content-type")&&t.setHeader("content-type","text/csv; charset="+s+(c?"; header=present":!1===c?"; header=absent":"")),t.cork();try{t.write(X);for await(const r of e){if(t.writableAborted)break;let e=0;if(Symbol.iterator in r)for(const i of r)e&&t.write(n),h(i)||await di(t),++e;else for await(const i of r)e&&t.write(n),h(i)||await di(t),++e;t.write(i)||await di(t)}}finally{t.uncork()}a&&t.end()}const pi=/^[^"':;,\\\r\n\t ]*$/i;function mi(t){if(!t||"object"!=typeof t)return!1;const e=t;return"number"==typeof e.fd&&"function"==typeof e.stat&&"function"==typeof e.createReadStream}class yi{constructor(t){(t=>"Le"in t&&"function"==typeof t.pipe)(t)&&(t=I.toWeb(t)),this.lt=t.getReader(),this.ze=null,this.We=0,this.m=0}getRange(t,e){if(e<t)throw new Error("invalid range");if(t<this.We)throw new Error("non-sequential range");if(this.m)throw new Error("previous range still active");let n=e-t+1,i=t-this.We;this.We=e+1,this.m=1;const r=this,s=(t,e)=>{const r=t.byteLength;r<=i?i-=r:r>i+n?(this.ze=t.subarray(i+n),e.enqueue(t.subarray(i,i+n)),n=0):i>0?(e.enqueue(t.subarray(i)),n-=r-i,i=0):(e.enqueue(t),n-=r)};return new B({start(t){if(r.ze){const e=r.ze;r.ze=null,s(e,t)}},async pull(t){if(n<=0)return r.m=0,void t.close();const e=await r.lt.read();e.done?t.error(new Error("range exceeds content")):"string"==typeof e.value?s(Buffer.from(e.value,"utf-8"),t):e.value instanceof Uint8Array?s(e.value,t):t.error(new Error("invalid stream type: must contain bytes or UTF-8 text"))}})}async close(){await this.lt.cancel(),this.lt.releaseLock()}}function gi(t,{forceSequential:e=!1,mergeOverlapDistance:n=100}={}){const i=[];if(n>=0)for(const e of t.ranges){let t=null,r=0;for(let s=0;s<i.length;++s){const o=i[s];e.end>=o.start-n-1&&o.end>=e.start-n-1?t?(++r,t.start=Math.min(t.start,o.start),t.end=Math.max(t.end,o.end)):(t=o,t.start=Math.min(t.start,e.start),t.end=Math.max(t.end,e.end)):r>0&&(i[s-r]=o)}t?i.length-=r:i.push({...e})}else i.push(...t.ranges);if(e)for(let t=0;t<i.length-1;++t)if(i[t].start>i[t+1].start){i.sort((t,e)=>t.start-e.start);break}return{ranges:i,totalSize:t.totalSize}}async function bi(t,e,n,i){if("string"==typeof n||mi(n)||(i=gi(i,{mergeOverlapDistance:0,forceSequential:!0})),1===i.ranges.length){const r=i.ranges[0];if(e.setHeader("content-length",r.end-r.start+1),e.setHeader("content-range",`bytes ${r.start}-${r.end}/${i.totalSize??"*"}`),e.writeHead(206),"HEAD"===t.method)return void e.end();const s=await vi(n);return await d(s.Je(r.start,r.end),e),void(s.Ge&&await s.Ge())}const r=e.getHeader("content-type"),s=l()+l()+"ABCDEFGHIJKLMNOPQRSTUVWXYZ";e.setHeader("content-type",`multipart/byteranges; boundary=${s}`);const o=i.ranges.map(t=>({o:[`--${s}`,...nt({"content-type":r,"content-range":`bytes ${t.start}-${t.end}/${i.totalSize??"*"}`}),"",""].join("\r\n"),Ve:t})),c=`--${s}--`;let a=c.length;for(const{o:t,Ve:e}of o)a+=t.length+e.end-e.start+1+2;if(e.setHeader("content-length",a),"HEAD"===t.method)return void e.end();let f="";const u=await vi(n);try{for(const{o:t,Ve:n}of o)e.write(f+t,"ascii"),await d(u.Je(n.start,n.end),e,{end:!1}),f="\r\n";e.end(f+c)}finally{u.Ge&&await u.Ge()}}async function vi(t){if("string"==typeof t){const e=await $(t,"r");return{Je:(t,n)=>e.createReadStream({start:t,end:n,autoClose:!1}),Ge:()=>e.close()}}if(mi(t))return{Je:(e,n)=>t.createReadStream({start:e,end:n,autoClose:!1})};{const e=new yi(t);return{Je:(t,n)=>e.getRange(t,n),Ge:()=>e.close()}}}async function Ei(t,e,n,i,r){if(i||("string"==typeof n?i=await T(n):mi(n)&&(i=await n.stat())),i){if("GET"===t.method||"HEAD"===t.method){if(!An(t,e,i))return void e.writeHead(304).end();e.setHeader("accept-ranges","bytes");const s=ge(t,i.size,r);if(s&&On(t,e,i))return bi(t,e,n,gi(s,r))}e.setHeader("content-length",i.size)}if(e.writeHead(e.statusCode,e.statusMessage),"HEAD"!==t.method)return"string"==typeof n?n=c(n):mi(n)&&(n=n.createReadStream({start:0,autoClose:!1})),d(n,e);e.end()}function xi(t,e,{replacer:n,space:i,undefinedAsNull:r=!1,encoding:s="utf-8",end:c=!0}={}){const a=JSON.stringify(e,n,i)??(r?"null":void 0);t instanceof o&&!t.headersSent&&(t.hasHeader("content-type")||t.setHeader("content-type","application/json"),c&&t.setHeader("content-length",Buffer.byteLength(a,s))),c?t.end(a,s):a&&t.write(a,s)}async function _i(t,e,{replacer:n=null,space:i="",undefinedAsNull:r=!1,encoding:s="utf-8",end:c=!0}={}){if(Array.isArray(n)){const t=new Set(n.map(t=>String(t)));n=function(e,n){return null===this||Array.isArray(this)||t.has(e)?n:void 0}}"number"==typeof i&&(i=" ".substring(0,i));const a={Ze:e=>t.write(e,s),Xe:()=>di(t),Ye:n,Ke:i};if(t instanceof o&&!t.headersSent&&!t.hasHeader("content-type")&&t.setHeader("content-type","application/json"),e=Si(null,"",e,a),ki(e))r&&a.Ze("null");else{t.cork(),t.write(X);try{await Ti(a,e,i?"\n":"")}finally{t.uncork()}}c&&t.end()}async function Ti(t,e,n){const i=(i,r,s)=>{t.Ze(i);const o=n+t.Ke,c=t.Ke?": ":":";let a=!0;return{i:async(n,i)=>{const r=Si(e,n,i,t);s&&ki(r)||(a?a=!1:t.Ze(","),t.Ze(o),s&&(t.Ze(JSON.stringify(n))||await t.Xe(),t.Ze(c)),await Ti(t,r,o))},Ge:()=>{a||t.Ze(n),t.Ze(r)}}};if(null===e||"object"!=typeof e||e instanceof String||e instanceof Number||e instanceof Boolean||e instanceof Function||e instanceof Symbol||e instanceof BigInt||$i(e))t.Ze(JSON.stringify(e)??"null")||await t.Xe();else if(e instanceof I){t.Ze('"');for await(const n of e){if("string"!=typeof n)throw new TypeError("Readables must have an encoding");const e=JSON.stringify(n);t.Ze(e.substring(1,e.length-1))||await t.Xe()}t.Ze('"')}else if(e instanceof Map){const t=i("{","}",!0);for(const[n,i]of e)await t.i(n,i);t.Ge()}else if(Ai(e)){let t=0;const n=i("[","]",!1);for(const i of e)await n.i(String(t++),i);n.Ge()}else if(Oi(e)){let t=0;const n=i("[","]",!1);for await(const i of e)await n.i(String(t++),i);n.Ge()}else{const t=i("{","}",!0);for(const[n,i]of Object.entries(e))await t.i(n,i);t.Ge()}}function Si(t,e,n,i){return i.Ye&&(n=i.Ye.call(t,e,n)),n&&"object"==typeof n&&"function"==typeof n.toJSON&&(n=n.toJSON(e)),n}const ki=t=>void 0===t||"function"==typeof t||"symbol"==typeof t||t instanceof Function||t instanceof Symbol,$i=t=>JSON.isRawJSON?.(t)??!1,Ai=t=>Symbol.iterator in t,Oi=t=>Symbol.asyncIterator in t;class Ni{constructor(t,e,{keepaliveInterval:n=15e3,softCloseReconnectDelay:i=500,softCloseReconnectStagger:r=2e3}={}){this.Qe=e,this.tn=n??0,this.I=new AbortController,e.setHeader("content-type","text/event-stream"),e.setHeader("x-accel-buffering","no"),e.setHeader("cache-control","no-store"),e.writeHead(200),e.flushHeaders(),this.ping=this.ping.bind(this),this.en(),t.once("close",()=>this.close()),mt(t,()=>this.close(i,r))}get signal(){return this.I.signal}get open(){return!this.I.signal.aborted}en(){this.tn&&(this.nn=setTimeout(this.ping,this.tn))}ping(){!this.I.signal.aborted&&this.Qe.writable&&(clearTimeout(this.nn),this.Qe.write(":\n\n",()=>this.en()))}send({event:t,id:e,data:n,reconnectDelay:i=-1}){return this.sendFields([["event",t],["id",e],["data",n],["retry",i>=0?String(0|i):void 0]])}async sendFields(t){if(this.I.signal.aborted)throw new Error("ServerSentEvents closed");let e;this.Qe.cork();try{let n=!1;for(const[e,i]of t){if(void 0===i)continue;const t=i.split(/(?<=\n)|(?<=\r)(?!\n)/g);for(let n of t)this.Qe.write(e)," "===n[0]?this.Qe.write(": "):this.Qe.write(":"),this.Qe.write(n);/[\r\n]$/.test(i)?(this.Qe.write(e),this.Qe.write(":\n")):this.Qe.write("\n"),n=!0}if(!n)return;clearTimeout(this.nn),this.Qe.write("\n",()=>e())}finally{this.Qe.uncork()}await new Promise(t=>{e=t}),this.en()}async close(t=0,e=0){if(this.I.signal.aborted){if(this.Qe.closed)return;return new Promise(t=>this.Qe.once("close",t))}this.tn=0,clearTimeout(this.nn),this.I.abort(),await new Promise(n=>{if(this.Qe.writable&&(t>0||e>0)){const i=t+Math.random()*e;this.Qe.end(`retry:${0|i}\n\n`,n)}else this.Qe.end(n)})}}const Pi=async(t,{mode:e="dynamic",fallback:n,callback:i=Mi,...r}={})=>{const s=await sn.build(E(process.cwd(),t),r);let o=null;const c=n?.statusCode??200;if(n){let t=n.filePath;t.startsWith("/")&&(t=t.substring(1)),o=t.split("/")}const a="dynamic"===e?{}:{rejectPotentiallyUnsafe:!1},f="dynamic"===e?s:await s.precompute();return{handleRequest:async(t,e)=>{if("GET"!==t.method&&"HEAD"!==t.method)return At;let n=!1;const r=ui(t,a),s={mime:Ee(t.headers.accept),language:Ee(t.headers["accept-language"]),encoding:Ee(t.headers["accept-encoding"])};let u=await f.find(r,s);if(!u&&o&&(n=!0,u=await f.find(o,s)),!u)return At;try{n&&(e.statusCode=c),e.setHeader("content-type",u.mime??Qe(m(u.canonicalPath))),u.encoding&&"identity"!==u.encoding&&e.setHeader("content-encoding",u.encoding);const r=f.vary;if(r){const t=e.getHeader("vary")??"";e.setHeader("vary",(t?t+", ":"")+r)}await i(t,e,u,n),await Ei(t,e,u.handle,u.stats)}finally{u.handle.close().catch(()=>{})}}}};function Mi(t,e,n){e.setHeader("etag",Ie(e.getHeader("content-encoding"),n.stats)),e.setHeader("last-modified",n.stats.mtime.toUTCString())}class Ri extends Error{constructor(t,{message:e,statusMessage:n,...i}={}){super(e,i),this.statusCode=0|t,this.statusMessage=n??"",this.name=`WebSocketError(${this.statusCode} ${this.statusMessage})`}static NORMAL_CLOSURE=1e3;static GOING_AWAY=1001;static UNSUPPORTED_DATA=1003;static POLICY_VIOLATION=1008;static MESSAGE_TOO_BIG=1009;static INTERNAL_SERVER_ERROR=1011;static SERVICE_RESTART=1012;static TRY_AGAIN_LATER=1013;static BAD_GATEWAY=1014}function Fi(t,{softCloseStatusCode:e=Ri.GOING_AWAY,...n}={}){const i=(i,r,s)=>new Promise((o,c)=>{const a=new t({...n,noServer:!0,clientTracking:!1});a.once("wsClientError",c),a.handleUpgrade(i,r,s,t=>{a.off("wsClientError",c),o({return:t,onError:e=>{const n=V(e,Ri);if(n)return void t.close(n.statusCode,n.statusMessage);const i=V(e,st)??st.INTERNAL_SERVER_ERROR,r=i.statusCode>=500?Ri.INTERNAL_SERVER_ERROR:4e3+i.statusCode;t.close(r,i.statusMessage)},softCloseHandler:n=>t.close(e,n)})})});return t=>Pt(t,i)}class Ui{constructor(t,e){this.data=t,this.isBinary=e}get text(){if(this.isBinary)throw new Ri(Ri.UNSUPPORTED_DATA,{statusMessage:"expected text"});return this.data.toString("utf-8")}get binary(){if(!this.isBinary)throw new Ri(Ri.UNSUPPORTED_DATA,{statusMessage:"expected binary"});return this.data}}class Ci{constructor(t,{limit:e=-1,signal:n}={}){this.rn=new G;const i=e=>{t.off("message",s),t.off("close",r),this.rn.close(new Error(e))},r=()=>i("connection closed"),s=(t,n)=>{void 0!==n?this.rn.push(new Ui(t,n)):"string"==typeof t?this.rn.push(new Ui(Buffer.from(t,"utf8"),!1)):this.rn.push(new Ui(t,!0)),e>0&&0===--e&&this.detach()};this.detach=()=>{},n?.aborted?this.rn.close(new Error("signal aborted")):2===t.readyState||3===t.readyState?this.rn.close(new Error("connection closed")):(t.on("message",s),t.on("close",r),n?.addEventListener("abort",()=>i("signal aborted")),this.detach=()=>i("WebSocket listener detached"))}next(t){return this.rn.shift(t)}[Symbol.asyncIterator](){return this.rn[Symbol.asyncIterator]()}}function Bi(t,{timeout:e,signal:n}={}){const i=new Ci(t,{limit:1,signal:n});return i.next(e).finally(()=>i.detach())}function Ii(t){const e=pt(t);return"GET"===t.method&&(e.D?.has("websocket")??!1)}const ji=t=>t.headers.origin??it(t.headers["sec-websocket-origin"]),Hi=(t,e=5e3)=>async n=>{if(!Ii(n))return;const i=await t(n);let r;try{r=await Bi(i,{timeout:e})}catch(t){if((i.readyState??0)>=2)throw $t;throw new Ri(Ri.POLICY_VIOLATION,{statusMessage:"timeout waiting for authentication token",cause:t})}if(r.isBinary)throw new Ri(Ri.UNSUPPORTED_DATA,{statusMessage:"authentication token must be sent as text"});return r.data.toString("utf-8")};export{G as BlockingQueue,At as CONTINUE,sn as FileFinder,st as HTTPError,Ot as NEXT_ROUTE,Nt as NEXT_ROUTER,Se as Property,J as Queue,Kt as Router,$t as STOP,Ni as ServerSentEvents,fe as WebListener,Ri as WebSocketError,Ui as WebSocketMessage,Ci as WebSocketMessages,fn as acceptBody,Pt as acceptUpgrade,Tt as addTeardown,Jt as anyHandler,An as checkIfModified,On as checkIfRange,Ne as clearProperty,Nn as compareETag,tn as compressFileOffline,en as compressFilesInDir,Ye as decompressMime,_t as defer,Gt as errorHandler,Pi as fileServer,V as findCause,je as generateStrongETag,Ie as generateWeakETag,St as getAbortSignal,Dt as getAbsolutePath,Z as getAddressURL,Re as getAuthData,pe as getAuthorization,Un as getBodyJson,Mn as getBodyStream,Fn as getBodyText,Rn as getBodyTextStream,me as getCharset,ai as getFormData,ci as getFormFields,ye as getIfRange,Qe as getMime,qt as getPathParameter,Ht as getPathParameters,Oe as getProperty,de as getQuery,ge as getRange,ui as getRemainingPathComponents,he as getSearch,le as getSearchParams,Sn as getTextDecoder,kn as getTextDecoderStream,ji as getWebSocketOrigin,Fe as hasAuthScope,gt as isSoftClosed,Ii as isWebSocketRequest,Fi as makeAcceptWebSocket,D as makeAddressTester,ln as makeGetClient,ke as makeMemo,ze as makeNegotiator,an as makeTempFileStorage,Hi as makeWebSocketFallbackTokenFetcher,Le as negotiateEncoding,Bi as nextWebSocketMessage,q as parseAddress,un as proxy,_e as readHTTPDateSeconds,ve as readHTTPInteger,xe as readHTTPKeyValues,Ee as readHTTPQualityValues,be as readHTTPUnquotedCommaSeparated,Xe as readMimeTypes,_n as registerCharset,Ke as registerMime,Tn as registerUTF32,pn as removeForwarded,mn as replaceForwarded,zt as requestHandler,Ue as requireAuthScope,Me as requireBearerAuth,Ze as resetMime,Lt as restoreAbsolutePath,yn as sanitiseAndAppendForwarded,wi as sendCSVStream,Ei as sendFile,xi as sendJSON,_i as sendJSONStream,bi as sendRanges,Mi as setDefaultCacheHeaders,Ae as setProperty,mt as setSoftCloseHandler,gn as simpleAppendForwarded,gi as simplifyRange,se as toListeners,Wt as upgradeHandler};
|
|
1
|
+
import{isIPv4 as t,isIPv6 as e}from"node:net";import{STATUS_CODES as n,createServer as i,Agent as r,request as o,ServerResponse as s}from"node:http";import{createReadStream as c,constants as a,createWriteStream as f,openAsBlob as u}from"node:fs";import{createHash as h,randomUUID as l}from"node:crypto";import{pipeline as d}from"node:stream/promises";import w from"node:zlib";import{promisify as p}from"node:util";import{extname as m,join as y,dirname as g,basename as b,sep as v,resolve as E}from"node:path";import{readFile as x,writeFile as _,stat as T,readdir as S,realpath as k,open as $,mkdtemp as A,rm as O}from"node:fs/promises";import{tmpdir as N,platform as P}from"node:os";import{Agent as M,request as R}from"node:https";import{TransformStream as F,TextDecoderStream as U,DecompressionStream as C,ReadableStream as B}from"node:stream/web";import{Readable as I,Duplex as j,Writable as H}from"node:stream";function q(n){if(!n||"unknown"===n)return;const i=/^((?:\d{1,3}\.){3}\d{1,3})(?::(\d+))?$/.exec(n);if(i?.[1]&&t(i[1]))return{type:"IPv4",ip:i[1],port:i[2]?Number.parseInt(i[2]):void 0};const r=/^\[([\da-fA-F:]+)\](?::(\d+))?$|^([\da-fA-F:]+)$/.exec(n);if(r?.[1]&&e(r[1]))return{type:"IPv6",ip:r[1].toLowerCase(),port:r[2]?Number.parseInt(r[2]):void 0};if(r?.[3]&&e(r[3]))return{type:"IPv6",ip:r[3].toLowerCase(),port:void 0};const o=/^(.*?):(\d+)$/i.exec(n);return o?.[2]?{type:"alias",ip:o[1],port:Number.parseInt(o[2])}:{type:"alias",ip:n,port:void 0}}function D(t){const e=new Set,n=[],i=[];for(const r of t){const t=/^((?:\d{1,3}\.){3}\d{1,3})(?:\/(\d+))?$/.exec(r);if(t?.[1]){const e=t[2]?Number.parseInt(t[2]):32,i=e<32?4294967295>>>e:0;n.push([z(t[1])|i,i]);continue}const o=/^\[?([\da-fA-F:]+)\]?(?:\/(\d+))?$/.exec(r);if(o?.[1]){const t=W(o[1]),e=o[2]?L>>BigInt(Number.parseInt(o[2])):0n;i.push([t|e,e]);continue}e.add(r)}return t=>{switch(t?.type){case"alias":return e.has(t.ip);case"IPv4":const r=z(t.ip);return n.some(([t,e])=>(r|e)===t);case"IPv6":const o=W(t.ip);return i.some(([t,e])=>(o|e)===t);default:return!1}}}const L=/*@__PURE__*/BigInt("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");function z(t){const e=t.split(".").map(Number);return(e[0]<<24|e[1]<<16|e[2]<<8|e[3])>>>0}function W(t){const e=t.split(":").map(t=>t?Number.parseInt(t,16):-1);let n=0n;for(const t of e)t<0?n<<=16n*BigInt(9-e.length):n=n<<16n|BigInt(t);return n}class J{constructor(t){const e={t:null,i:null};this.o=e,this.u=e,void 0!==t&&this.push(t)}isEmpty(){return!this.o.i}clear(){this.o.i=null,this.o.t=null,this.u=this.o}push(t){const e={t,i:null};this.u.i=e,this.u=e}shift(){if(!this.o.i)return null;this.o=this.o.i;const t=this.o.t;return this.o.t=null,t}remove(t){for(let e=this.o;e.i;e=e.i)if(e.i.t===t){e.i=e.i.i;break}}[Symbol.iterator](){return{next:()=>{if(!this.o.i)return{value:null,done:!0};this.o=this.o.i;const t=this.o.t;return this.o.t=null,{value:t,done:!1}}}}}class G{constructor(){this.h=new J,this.l=new J,this.m=0}push(t){if(this.m)return;const e=this.l.shift();e?(e.v&&clearTimeout(e.v),e._(t)):this.h.push(t)}shift(t){return this.h.isEmpty()?this.m?Promise.reject(this.T):new Promise((e,n)=>{const i={_:e,S:n,v:null};this.l.push(i),void 0!==t&&(i.v=setTimeout(()=>{this.l.remove(i),n(new Error(`Timeout after ${t}ms`))},t))}):Promise.resolve(this.h.shift())}k(t){this.T=t;for(const e of this.l)e.S(t),e.v&&clearTimeout(e.v)}close(t){this.m||(this.m=1,this.k(t))}fail(t){this.m||(this.m=2,this.k(t))}[Symbol.asyncIterator](){return{next:()=>this.shift().then(t=>({value:t,done:!1}),t=>{if(2===this.m)throw t;return{value:null,done:!0}})}}}function V(t,e){if(t instanceof e)return t;if(t&&"object"==typeof t){if("cause"in t)return V(t.cause,e);if("error"in t)return V(t.error,e)}}function Z(t,e="http"){if(!t)throw new Error("no address");if("string"==typeof t)return t;if("IPv4"===t.family)return`${e}://${t.address}:${t.port}`;if("IPv6"===t.family)return`${e}://[${t.address}]:${t.port}`;throw new Error(`unknown address family: ${t.family}`)}const X=/*@__PURE__*/Buffer.alloc(0),Y=t=>new URL("http://localhost"+(t.url??"/"));class K extends Error{constructor(t,e,n){super(n??""),this.error=t,this.suppressed=e}}const Q=globalThis.SuppressedError??K;class tt{constructor(){this.$=!1}A(t){this.$?t!==this.O&&(this.O=new Q(t,this.O)):(this.O=t,this.$=!0)}N(){this.$=!1,this.O=void 0}}class et{constructor(t){this.P=t,this.M=Object.create(null),this.R=!1}get headersSent(){return this.R}writeHead(t,e,i){if(this.R)throw new Error("headers already sent");const r={...this.M};for(const[t,e]of(t=>{if(!t)return[];const e=[];if(Array.isArray(t)){const n=t.length;if(1&n)throw new Error("headers must be a list of alternating keys and values");for(let i=0;i<n;i+=2){const n=t[i],r=t[i+1];if("string"!=typeof n)throw new Error("invalid header name");void 0!==r&&e.push([n.toLowerCase(),r])}}else for(const[n,i]of Object.entries(t))void 0!==i&&e.push([n.toLowerCase(),i]);return e})(i))r[t]=e;return this.P.write([`HTTP/1.1 ${t} ${rt(e??n[t]??"-")}`,...nt(r),"",""].join("\r\n"),"ascii"),this.R=!0,this}write(t,e="utf-8",n){return this.P.write(t,e,n)}end(t,e="utf-8",n){return this.P.end(t,e,n),this}setHeader(t,e){const n=t.toLowerCase();return this.M[n]="string"==typeof e||"number"==typeof e?e:[...e],this}setHeaders(t){for(const[e,n]of t)this.setHeader(e,n);return this}}function nt(t){const e=[];for(const[n,i]of Object.entries(t)){const t=it(i);t&&e.push(`${rt(n)}: ${rt(t)}`)}return e}const it=t=>"string"==typeof t?t:"number"==typeof t?String(t):t?t.join(", "):"",rt=t=>t.replaceAll(/[^ \t!-~]/g,"");class ot extends Error{constructor(t,{message:e,statusMessage:i,headers:r,body:o,...s}={}){super(e??("string"==typeof o?o:void 0),s),this.statusCode=0|t,this.statusMessage=i??n[this.statusCode]??"-",this.headers=r,this.body=o??"",this.name=`HTTPError(${this.statusCode} ${this.statusMessage})`}static INTERNAL_SERVER_ERROR=/*@__PURE__*/new ot(500);send(t,e){t.setHeaders((t=>{if(t){if(t instanceof Headers)return t;if(Array.isArray(t))return new Headers(t);{const e=t instanceof Map?[...t.entries()]:Object.entries(t);return new Headers(e.map(([t,e])=>[t,it(e)]).filter(([t,e])=>e))}}return new Headers})(this.headers));const n=Buffer.byteLength(this.body,"utf-8");t.setHeader("content-length",String(n)),t.writeHead(this.statusCode,this.statusMessage,e),t.end(this.body,"utf-8")}}const st=(t,e,n)=>{n.headersSent?n.end():(V(t,ot)??ot.INTERNAL_SERVER_ERROR).send(n)},ct=(t,e,n)=>{if(n.writable){n.addListener("finish",()=>n.destroy());const e=new et(n);(V(t,ot)??ot.INTERNAL_SERVER_ERROR).send(e,{connection:"close"})}else n.destroy()},at=(t,e,n)=>{(V(t,ot)?.statusCode??1)&&console.error("%s",`unhandled error while ${e} ${n?.url??"(no request information)"}:`,t)},ft=new WeakMap;function ut(t,e){const n=ft.get(t);if(n)return n;const i=Y(t),r={F:t,U:i,C:decodeURIComponent(i.pathname),B:ct,I:new AbortController,j:[],H:[],D:e?dt(t):null};return ft.set(t,r),r}function ht(t,e,n,i){e||(t.D=null),t.L=n;const r=async()=>{t.I.abort(n.W.writableEnded?"complete":"client abort");const e=new tt;await lt(t.j,e,t),await lt(t.H,e,t,()=>{t.J=async e=>{try{await e()}catch(e){i(e,t.F)}}}),e.$&&i(e.O,t.F)};return n.W.closed?r():n.W.once("close",r),t}async function lt(t,e,n,i){for(;n.G;)await n.G;const r=(async()=>{for(;;){const n=t.pop();if(!n)return void i?.();try{await n()}catch(t){e.A(t)}}})().then(()=>{n.G===r&&(n.G=void 0)});n.G=r,await r}function dt(t){return new Set(t.headers.upgrade?.split(",").map(t=>t.trim().toLowerCase())??[])}const wt=t=>ft.get(t);function pt(t){const e=wt(t);if(!e)throw new Error("unknown request");return e}function mt(t,e){const n=wt(t);n&&yt(n,e)}function yt(t,e){t.V=e;const n=t.Z;n&&queueMicrotask(()=>xt(e,n,t))}const gt=t=>Boolean(wt(t)?.Z);function bt(t,e,n){if(!t.Z){if(t.L&&!t.D){const e=t.L.W;e.headersSent||e.hasHeader("connection")||e.setHeader("connection","close")}t.L?.W.once("close",()=>t.F.socket.destroy()),t.Z={X:e,Y:n},xt(t.V,t.Z,t),Et(t)}}function vt(t){if(t.L){if(!t.D){const e=t.L.W;e.headersSent||(e.statusCode=503,e.hasHeader("connection")||e.setHeader("connection","close"))}t.L.W.end(()=>t.F.socket.destroy())}else t.F.socket.destroy()}function Et(t){if(clearTimeout(t.K),!t.tt||t.J)return;const e=Date.now();if(e>=t.tt)return void vt(t);let n=t.tt;t.et&&!t.Z&&(e<t.et.nt?n=t.et.nt:(t.Z=t.et,xt(t.V,t.Z,t))),void 0===t.K&&t.H.push(()=>clearTimeout(t.K)),t.K=setTimeout(()=>Et(t),n-e)}async function xt(t,e,n){try{await(t?.(e.X))}catch(t){e.Y(t,"soft closing",n.F),vt(n)}}const _t=(t,e)=>{const n=pt(t);n.J?n.J(e):n.j.push(e)},Tt=(t,e)=>{const n=pt(t);n.J?n.J(e):n.H.push(e)},St=t=>pt(t).I.signal;class kt extends Error{}const $t=new kt("STOP"),At=new kt("CONTINUE"),Ot=new kt("NEXT_ROUTE"),Nt=new kt("NEXT_ROUTER");async function Pt(t,e){const n=pt(t);if(!n.L)throw new Error("cannot call acceptUpgrade from shouldUpgrade");if(!n.D)throw new Error("not an upgrade request");if(n.it)return n.rt;const i=n.L.W;if(!i.readable||!i.writable)throw $t;const r=await e(t,i,n.L.o);return n.L.o=X,n.B=r.onError,yt(n,r.softCloseHandler),n.rt=r.return,n.it=!0,r.return}const Mt=RegExp.escape??(t=>t.replaceAll(/[^a-zA-Z0-9_ ]/g,t=>"\\u"+t.charCodeAt(0).toString(16).padStart(4,"0"))),Rt=t=>t,Ft=t=>void 0===t?void 0:""===t?[]:t.split("/"),Ut=t=>void 0===t?void 0:""===t?[]:t.split("/").filter(t=>t);function Ct(t){const e={},n=new Map;for(const[i,r]of Object.entries(t))e[i]=!1,n.set(r,i);return t=>{const i={...e};for(let e=0;e<t.length;++e){const r=n.get(t[e]);if(!r)return[i,t.substring(e)];i[r]=!0}return[i,""]}}const Bt=/*@__PURE__*/Ct({ot:"i",st:"!"}),It=Object.freeze({});function jt(t,e,n){const i=t.F.url,r=t.C,o=t.ct??It;return t.F.url=encodeURIComponent(e).replaceAll(/%2F/g,"/")+t.U.search,t.C=e,n.length>0&&(t.ct=Object.freeze(Object.fromEntries([...Object.entries(o),...n]))),()=>{t.F.url=i,t.C=r,t.ct=o}}function Ht(t){return wt(t)?.ct??It}function qt(t,e){return Ht(t)[e]}function Dt(t){const e=wt(t);return e?e.U.pathname+e.U.search:t.url??"/"}function Lt(t){const e=wt(t);e&&(t.url=e.U.pathname+e.U.search)}const zt=t=>"function"==typeof t?{handleRequest:t}:t,Wt=(t,e)=>"function"==typeof t?{handleUpgrade:t,shouldUpgrade:e}:{shouldUpgrade:e,...t},Jt=(t,e=Xt)=>({handleRequest:t,handleUpgrade:t,shouldUpgrade:e}),Gt=t=>"function"==typeof t?{handleError:t}:t,Vt=t=>"function"==typeof t?{handleRequest:t}:t,Zt=t=>"function"==typeof t?{handleUpgrade:t}:t,Xt=()=>!1,Yt=Symbol("http");class Kt{constructor(){this.ft=[],this.ut=[]}A(t,e,n,i,r){const o=n?((t,e)=>{const n=["^"],i=[],r=/[{}]|\/+|\\(.)|[:*]([a-zA-Z0-9_]*)/g,[{ot:o,st:s},c]=Bt(t);if("/"!==c[0])throw new Error("path must begin with '/' or flags");let a=0,f=0;for(const t of c.matchAll(r)){t.index>a&&n.push(Mt(c.substring(a,t.index)));const e=t[0];if("{"===e)n.push("(?:"),++f;else if("}"===e){if(0===f)throw new Error(`unbalanced optional braces in path at ${t.index}`);--f,n.push(")?")}else if("/"===e[0])n.push(e),s||n.push("+");else if("\\"===e[0])n.push(Mt(t[1]));else{const r=e[0],o=t[2];if(!o)throw new Error(`unnamed parameter or unescaped '${r}' at ${t.index}`);"*"===r?(n.push("(.*?)"),i.push({ht:o,lt:s?Ft:Ut})):(n.push("([^/]+?)"),i.push({ht:o,lt:Rt}))}a=t.index+e.length}if(a<c.length&&n.push(Mt(c.substring(a))),f>0)throw new Error("unbalanced optional braces in path");return e&&(n.push("(?:"),s?n.push("(?:(?<=/)|/)"):n.push("(?:/+|(?<=/))"),n.push("(?<rest>.*))?")),n.push("$"),{dt:new RegExp(n.join(""),o?"i":""),wt:i}})(n,i):{dt:null,wt:[]};return this.ft.push({yt:t,gt:"string"==typeof e?e.toLowerCase():e,bt:o.dt,vt:o.wt,Et:r}),this}use(...t){return this.A(null,null,null,!0,t.map(Vt))}mount(t,...e){return this.A(null,null,t,!0,e.map(Vt))}within(t,e){const n=new Kt;return e(n),this.mount(t,n)}at(t,...e){return this.A(null,null,t,!1,e.map(Vt))}onRequest(t,e,...n){return this.A(te(t),Yt,e,!1,n.map(Vt))}onUpgrade(t,e,n,...i){return this.A(te(t),e,n,!1,i.map(Zt))}onError(...t){return this.A(null,null,null,!0,t.map(Gt))}onReturn(...t){return this.ut.push(...t),this}on(t,...e){const n=/^([A-Z]+) (\/.*)$/.exec(t);if(!n)throw new Error("invalid method + path spec: "+JSON.stringify(t));return this.A(n[1],Yt,n[2],!1,e.map(Vt))}get=(t,...e)=>this.A(Qt,Yt,t,!1,e.map(Vt));delete=(...t)=>this.onRequest("DELETE",...t);getOnly=(...t)=>this.onRequest("GET",...t);head=(...t)=>this.onRequest("HEAD",...t);options=(...t)=>this.onRequest("OPTIONS",...t);patch=(...t)=>this.onRequest("PATCH",...t);post=(...t)=>this.onRequest("POST",...t);put=(...t)=>this.onRequest("PUT",...t);ws=(...t)=>this.onUpgrade("GET","websocket",...t);async handleRequest(t){return this.xt(t,new tt)}async handleUpgrade(t){return this.xt(t,new tt)}async handleError(t,e){const n=new tt;return n.A(t),this.xt(e,n)}shouldUpgrade(t){return this._t(pt(t))}_t(t){for(const e of this.ft){const n=ee(t,e);if(!n)continue;let i=()=>{};if(!0!==n)try{i=jt(t,n.Tt,[])}catch{continue}try{for(const n of e.Et)if(re(n,t))return!0}finally{i()}}return!1}async xt(t,e){const n=pt(t),i=await this.St(n,e);if(e.$)throw e.O;return i}async St(t,e){for(const n of this.ft){const i=ee(t,n);if(!i)continue;let r=()=>{};if(!0!==i)try{const e=i.kt();r=jt(t,i.Tt,e)}catch(t){e.A(t);continue}try{const i=await ne(t,n.Et,this.ut,e);if(i===Nt)break;if(i===Ot)continue;return i}finally{r()}}return At}}const Qt=new Set(["HEAD","GET"]),te=t=>t?"string"==typeof t?t:new Set(t):null;function ee(t,e){if("string"==typeof e.yt){if(e.yt!==t.F.method)return!1}else if(null!==e.yt&&!e.yt.has(t.F.method??""))return!1;if(e.gt===Yt){if(t.D)return!1}else if(null!==e.gt&&!t.D?.has(e.gt))return!1;if(null===e.bt)return!0;const n=e.bt.exec(t.C);return!!n&&{Tt:"/"+(n.groups?.rest??""),kt:()=>e.vt.map((t,e)=>[t.ht,t.lt(n[e+1])])}}async function ne(t,e,n,i){for(const r of e){let e=await ie(r,t,i);if(e!==At){if(!t.D&&!(e instanceof kt)&&n.length)try{const i="object"==typeof e?e:void 0,r=t.F,o=t.L.W;for(const t of n)await t(i,r,o)}catch(t){i.A(t);continue}return e}}return Ot}async function ie(t,e,n){if(t instanceof Kt)return t.St(e,n);let i=At;try{if(n.$){if(t.handleError){const r=n.O;n.N(),i=await t.handleError(r,e.F,e.D?{socket:e.L.W,head:e.L.o}:{response:e.L.W})}}else if(e.D){if(t.handleUpgrade){const n=e.L;i=await t.handleUpgrade(e.F,n.W,n.o)}}else t.handleRequest&&(i=await t.handleRequest(e.F,e.L.W))}catch(t){t instanceof kt?i=t:n.A(t)}finally{await((t,e)=>lt(t.j,e,t))(e,n)}return i===$t?void 0:i}function re(t,e){if(t instanceof Kt)return t._t(e);if(!t.shouldUpgrade)return Boolean(t.handleUpgrade);try{return t.shouldUpgrade(e.F)}catch(t){return e.$t(t),!1}}function oe(t,{onError:e=at,socketCloseTimeout:n=500}={}){const i=[],r=new Set,o=()=>{const t=[...i];i.length=0;for(const e of t)e()},s=t=>{t&&(r.size?i.push(t):setImmediate(t))},c=t=>{r.add(t),t.H.push(()=>{r.delete(t),!r.size&&i.length&&setImmediate(o)})},a=(t,n)=>e(t,"tearing down",n);return{request:async(n,i)=>{let r;try{r=ut(n,!1)}catch(t){return e(t,"parsing request",n),void st(new ot(400),0,i)}ht(r,!1,{W:i},a),c(r);const o=new tt,s=await ie(t,r,o);o.$?(e(o.O,"handling request",n),st(o.O,0,i)):s!==At&&s!==Ot&&s!==Nt||st(new ot(404),0,i)},upgrade:async(i,r,o)=>{let s;r.once("finish",()=>{const t=setTimeout(()=>r.destroy(),n);r.once("close",()=>clearTimeout(t))});try{s=ut(i,!0)}catch(t){return e(t,"parsing upgrade",i),void ct(new ot(400),0,r)}ht(s,!0,{W:r,o},a),o=X,c(s);const f=new tt,u=await ie(t,s,f);f.$?(e(f.O,"handling upgrade",i),s.B(f.O,i,r)):u!==At&&u!==Ot&&u!==Nt||(console.warn(`Upgrade ${i.headers.upgrade} request for ${i.url} fell-through. This probably means you need to add shouldUpgrade to one of your upgrade handlers, or if this is intentional, explicitly reject the request (throw new HTTPError(404)) instead of using CONTINUE.`),s.B(new ot(404),i,r))},shouldUpgrade:n=>{try{const i=ut(n,!0);return i.$t=t=>e(t,"checking should upgrade",n),re(t,i)}catch{return!1}},clientError:(t,n)=>{const i=n.At,r=t.code;n.writable&&!i?.headersSent&&n.end(ce.get(r)??ae),n.destroy(t),"HPE_INVALID_EOF_STATE"===r||e(t,"initialising request")},softClose(t,e,n){for(const n of r)bt(n,t,e);s(n)},hardClose(t){for(const t of r)vt(t);s(t)},countConnections:()=>r.size}}const se=t=>Buffer.from(`HTTP/1.1 ${t} ${n[t]}\r\nConnection: close\r\n\r\n`),ce=/*@__PURE__*/new Map([["HPE_HEADER_OVERFLOW",/*@__PURE__*/se(431)],["HPE_CHUNK_EXTENSIONS_OVERFLOW",/*@__PURE__*/se(413)],["ERR_HTTP_REQUEST_TIMEOUT",/*@__PURE__*/se(408)]]),ae=/*@__PURE__*/se(400);class fe extends EventTarget{constructor(t){super(),this.Ot=t}attach(t,e={}){const n=oe(this.Ot,{...e,onError:this.Nt.bind(this,t)});!1===e.autoContinue&&t.addListener("checkContinue",n.request),!1===e.rejectNonStandardExpect&&t.addListener("checkExpectation",n.request),t.addListener("request",n.request),t.addListener("upgrade",n.upgrade);const i=t.shouldUpgradeCallback??(()=>!1);!1!==e.overrideShouldUpgradeCallback&&(t.shouldUpgradeCallback=n.shouldUpgrade),t.addListener("clientError",n.clientError);let r=!1;return(e="",o=-1,s=!1)=>{r||(r=!0,t.removeListener("checkContinue",n.request),t.removeListener("checkExpectation",n.request),t.removeListener("request",n.request),t.removeListener("upgrade",n.upgrade),t.shouldUpgradeCallback===n.shouldUpgrade&&(t.shouldUpgradeCallback=i),t.removeListener("clientError",n.clientError));const c=()=>{s&&t.closeAllConnections()};if(o>0){const i=setTimeout(n.hardClose,o);n.softClose(e,this.Nt.bind(this,t),()=>{clearTimeout(i),c()})}else 0===o&&n.hardClose(c);return n}}listen(t,e,n={}){n.shouldUpgradeCallback&&(n={overrideShouldUpgradeCallback:!1,...n});const r=i(n);n.socketTimeout&&r.setTimeout(n.socketTimeout);const o=this.attach(r,n),s=Object.assign(r,{closeWithTimeout:(t,e)=>new Promise(n=>{r.close(()=>n()),o(t,e,!0)})});return new Promise((i,o)=>{r.once("error",o),r.listen(t,e,n.backlog??511,()=>{r.off("error",o),i(s)})})}Nt(t,e,n,i){const r={error:e,server:t,action:n,request:i};this.dispatchEvent(new CustomEvent("error",{detail:r}))&&at(e,n,i)}}const ue=t=>wt(t)?.U??Y(t),he=t=>ue(t).search,le=t=>new URLSearchParams(ue(t).searchParams),de=(t,e)=>ue(t).searchParams.get(e);function we(t,e){const n=t.indexOf(e);return-1===n?[t]:[t.substring(0,n),t.substring(n+e.length)]}function pe(t){const e=t.headers.authorization;if(!e)return;const[n,i]=we(e," ");return void 0!==i?[n.trim().toLowerCase(),i.trim()]:void 0}function me(t){const e=/^text\/.*;\s*charset=([^;]+)/i.exec(t.headers["content-type"]??"");return e?.[1]?.trim().toLowerCase()??void 0}function ye(t){const e=t.headers["if-range"];return e&&"string"==typeof e?/^("|W\/")/.test(e)?{etag:[e]}:{modifiedSeconds:_e(e)}:{}}function ge(t,e,{maxRanges:n=10,maxNonSequential:i=2,maxWithOverlap:r=2}={}){const o=t.headers.range;if(!o||0===e)return;const[s,c]=we(o,"=");if("bytes"!==s||!c)return;const a=new ot(416,{headers:{"content-range":`bytes */${e}`}}),f=t=>{const e=ve(t);if(void 0===e)throw a;return e},u=[];for(const t of c.split(",")){const[i,r]=we(t.trim(),"-");if(void 0===r)throw a;let o;if(i)o={start:f(i),end:r?Math.min(f(r),e-1):e-1};else{if(!r)throw a;o={start:Math.max(e-f(r),0),end:e-1}}if(!(o.start>=e)){if(o.end<o.start||u.length>=n)throw a;u.push(o)}}if(!u.length)throw a;if(u.length>i)for(let t=0;t<u.length-1;++t)if(u[t].start>u[t+1].start)throw a;if(u.length>r)for(let t=1;t<u.length;++t){const e=u[t];for(let n=0;n<t;++n){const t=u[n];if(e.end>=t.start&&t.end>=e.start)throw a}}return{ranges:u,totalSize:e}}function be(t){if(void 0!==t)return"number"==typeof t?[String(t)]:t.length?"string"==typeof t?t.split(",").map(t=>t.trim()):t.flatMap(t=>t.split(",").map(t=>t.trim())):[]}function ve(t){if(t&&/^\s*-?\d+\s*$/.test(t))return Number.parseInt(t,10)}function Ee(t){if(t)return t.split(",").map(t=>{const[e,...n]=t.split(";"),i=new Map(n.map(t=>{const[e,n]=we(t,"=");return[e.trim(),n?.trim()??""]})),r=e.trim(),o="*/*"===r||"*"===r?0:r.endsWith("/*")?1:2,s=Math.max(0,Math.min(1,Number.parseFloat(i.get("q")??"1")));return{name:r,specifiers:i,specificity:o,q:s}})}function xe(t){const e=new Map,n=/\s*([^=]+)=([^";]*?|"(?:[^\\"]|\\.)*")\s*(?:;|$)/y;for(;n.lastIndex<t.length;){const i=n.exec(t);if(!i)throw new ot(400,{body:"invalid HTTP key values"});const r=i[1].toLowerCase();let o=i[2];'"'===o[0]&&(o=o.substring(1,o.length-1).replaceAll(/\\(.)/g,(t,e)=>e)),e.set(r,o)}return e}function _e(t){if("string"!=typeof t)return;const e=Date.parse(t);return Number.isNaN(e)?void 0:e/1e3|0}const Te=t=>"function"==typeof t?t:()=>t;class Se{constructor(t=Pe){this.Pt=Te(t)}set(t,e){Ae(t,this,e)}get(t){return Oe(t,this)}clear(t){Ne(t,this)}withValue(t){return Jt(e=>(Ae(e,this,t),At))}}const ke=(t,...e)=>{const n={Pt:n=>t(n,...e)};return t=>Oe(t,n)};function $e(t){return t.Mt||(t.Mt=new Map),t.Mt}function Ae(t,e,n){$e(pt(t)).set(e,n)}function Oe(t,e){const n=wt(t);if(!n)return e.Pt(t);const i=$e(n);if(i.has(e))return i.get(e);const r=e.Pt(t);return i.set(e,r),r}function Ne(t,e){const n=wt(t);n?.Mt?.delete(e)}const Pe=()=>{throw new Error("property has not been set")};function Me({realm:t,extractAndValidateToken:e,fallbackTokenFetcher:n,closeOnExpiry:i=!0,softCloseBufferTime:r=0,onSoftCloseError:o}){const s=Te(t);return Jt(async t=>{const c=Date.now(),a=await s(t),f={"www-authenticate":`Bearer realm="${a}"`},u=pe(t),h="bearer"===u?.[0]?u[1]:await(n?.(t));if(!h)throw new ot(401,{headers:f,body:"no token provided"});const l=await e(h,a,t);if(!l)throw new ot(401,{headers:f,body:"invalid token"});if("object"==typeof l){if("nbf"in l&&"number"==typeof l.nbf&&c<1e3*l.nbf)throw new ot(401,{headers:f,body:"token not valid yet"});if("exp"in l&&"number"==typeof l.exp){const e=1e3*l.exp;if(c>=e-r)throw new ot(401,{headers:f,body:"token expired"});i&&((t,e,n,i=0,r=at)=>{const o=pt(t),s=n-Math.max(i,0),c=o.tt??Number.POSITIVE_INFINITY,a=o.et?.nt??c;s>=a&&n>=c||(n<c&&(o.tt=n),s<a&&(o.et={nt:s,X:e,Y:r}),Et(o))})(t,"token expired",e,r,o)}}return Ce.set(t,{realm:a,data:l,scopes:Be(l)}),At})}const Re=t=>Ce.get(t).data,Fe=(t,e)=>Ce.get(t).scopes.has(e),Ue=t=>Jt(e=>{const n=Ce.get(e);if(!n.scopes.has(t))throw new ot(403,{headers:{"www-authenticate":`Bearer realm="${n.realm}", scope="${t}"`},body:`scope required: ${t}`});return At}),Ce=/*@__PURE__*/new Se({realm:"",data:null,scopes:new Set});function Be(t){if(!t||"object"!=typeof t||!("scopes"in t))return new Set;const{scopes:e}=t;return Array.isArray(e)?new Set(e):"string"==typeof e?new Set([e]):e&&"object"==typeof e?new Set(Object.entries(e).filter(([t,e])=>e).map(([t])=>t)):new Set}function Ie(t,e){const n=`${0|e.mtimeMs} ${e.size} ${t??""}`;return`W/"${h("sha256").update(n).digest("base64").substring(0,12)}"`}async function je(t){const e=h("sha256");return"string"==typeof t?await d(c(t),e):await d(t.createReadStream({start:0,autoClose:!1}),e),`"sha256-${e.digest("base64")}"`}const He=(t,e)=>new RegExp(t,(t.unicodeSets?"v":t.unicode?"u":"")+(t.ignoreCase||e?"i":"")),qe={mime:"accept",language:"accept-language",encoding:"accept-encoding"},De={zstd:"{file}.zst",br:"{file}.br",gzip:"{file}.gz",deflate:"{file}.deflate",identity:"{file}"},Le=t=>{return{type:"encoding",options:(e=t,n=De,Array.isArray(e)?e.map(t=>[t,n[t]]):Object.entries(e)).map(([t,e])=>({match:t,file:e}))};var e,n};function ze(t,e=10){const n=t.map(t=>({Rt:t.type,Ft:t.options.map(t=>({Ut:t.file,Ct:"string"==typeof t.match?t.match.toLowerCase():He(t.match,!0),Bt:t.as??("string"==typeof t.match?t.match:void 0)}))})).filter(t=>t.Ft.length>0);return{options(t,i){let r=e;const o={};return function*t(e,s){const c=n[s];if(!c)return--r,void(yield{filename:e,info:o});const a=new Set,f=(h=i[c.Rt],h?.length?1===h.length?h:[...h].sort(We):[]),u=[];var h;for(const t of c.Ft){const e=f.find(e=>"string"==typeof t.Ct?e.name.toLowerCase()===t.Ct:t.Ct.test(e.name));e&&u.push({...e,It:t})}for(const n of u.sort(We)){const i=Je(e,n.It.Ut);if(!a.has(i)&&(a.add(i),o[c.Rt]=n.It.Bt,yield*t(i,s+1),r<=0))return}o[c.Rt]=void 0,!a.has(e)&&r>0&&(yield*t(e,s+1))}(t,0)},vary:[...new Set(n.map(t=>qe[t.Rt]))].join(" ")}}const We=(t,e)=>e.q-t.q||e.specificity-t.specificity;function Je(t,e){return e.replaceAll(/\{(?:file|base|ext)\}/g,e=>"{file}"===e?t:"{base}"===e?t.replace(/\.[^.]*$/,""):m(t))}const Ge=/*@__PURE__*/Ye("bin=application/octet-stream;gz(ip),json,ogg,pdf,wasm,xml,y(a)ml,zip,zst(d)=application/{ext};aac,flac,mid(i),wav(e)=audio/{ext};mp3=audio/mpeg;oga,opus=audio/ogg;otf,ttf,woff,woff2=font/{ext};apng,avif,bmp,gif,heic,heif,jp(e)g,png,tif(f),webp=image/{ext};ico,cur=image/x-icon;svg=image/svg+xml;3mf,obj,stl,u3d=model/{ext};wrl=model/vrml;x3d=model/x3d+xml;x3db=model/x3d+binary;x3dv=model/x3d+vrml;css,csv,htm(l),rtf,vcard=text/{ext};(m)js=text/javascript;md=text/markdown;txt=text/plain;3gp(p),3g(pp)2,mp4,mp(e)g,h264=video/{ext};mov=video/quicktime;ogv=video/ogg");let Ve=/*@__PURE__*/new Map(Ge);function Ze(){Ve=new Map(Ge)}function Xe(t){const e=new Map;for(const n of t.split("\n")){const[t,...i]=n.replaceAll(/\s+/g," ").trim().split(" ");if(!t.startsWith("#"))for(const n of i)e.set(n.toLowerCase(),t)}return e}function Ye(t){const e=new Map;for(const n of t.split(/[\n;]/g)){const[t,i,r]=/^ *([^=]+)=(.*)$/.exec(n)??[null,null,""];for(const t of i?.split(",")??[]){const[n,i,o="",s=""]=/^([^(]*)(?:\(([^)]*)\)(.*))?$/.exec(t),c=i+o+s,a=r.replace("{ext}",c);e.set(c.toLowerCase(),a),o&&e.set((i+s).toLowerCase(),a)}}return e}function Ke(t){for(const[e,n]of t)Ve.set(e.toLowerCase(),n)}function Qe(t,e="utf-8"){"."===t[0]&&(t=t.substring(1));const n=Ve.get(t)??"application/octet-stream";return n.startsWith("text/")&&!n.includes("charset=")?`${n}; charset=${e}`:n}async function tn(t,e,n){const i=await x(t),r={file:t,mime:Qe(m(t)),rawSize:i.byteLength,bestSize:i.byteLength,created:0};if(r.rawSize<=n)return r;if(["image","video","audio","font"].includes(r.mime.split("/")[0]))return r;for(const o of e){const e=rn.get(o.match),s=y(g(t),Je(b(t),o.file));if(!e||s===o.file)continue;const c=await e(i);c.byteLength<=r.rawSize-n&&(await _(s,c),r.bestSize=Math.min(r.bestSize,c.byteLength),++r.created)}return r}async function en(t,e,n){const i=[];await nn(t,i);const r=new Set(i);for(const t of r)for(const n of e){const e=y(g(t),Je(b(t),n.file));e!==t&&r.delete(e)}return Promise.all([...r].map(t=>tn(t,e,n)))}async function nn(t,e){const n=await T(t);if(n.isDirectory())for(const n of await S(t))await nn(y(t,n),e);else n.isFile()&&e.push(t)}const rn=/*@__PURE__*/new Map([["zstd",t=>p(w.zstdCompress)(t)],["br",t=>p(w.brotliCompress)(t,{params:{[w.constants.BROTLI_PARAM_QUALITY]:w.constants.BROTLI_MAX_QUALITY,[w.constants.BROTLI_PARAM_SIZE_HINT]:t.length}})],["gzip",t=>p(w.gzip)(t,{level:w.constants.Z_BEST_COMPRESSION})],["deflate",t=>p(w.deflate)(t)]]);class on{constructor(t,{subDirectories:e=!0,caseSensitive:n="exact",allowAllDotfiles:i=!1,allowAllTildefiles:r=!1,allowDirectIndexAccess:o=!1,allow:s=[".well-known"],hide:c=[],indexFiles:a=["index.htm","index.html"],implicitSuffixes:f=[],negotiation:u}){this.jt=t,this.Ht=!0===e?Number.POSITIVE_INFINITY:e||0,this.qt=n,this.Dt=i,this.Lt=r,this.zt=o,this.Wt=a,this.Jt=["",...f],this.Gt=new Set(s.map(t=>this.Vt(t))),this.Zt=new Set,this.Xt=[];for(const t of c)"string"==typeof t?this.Zt.add(this.Vt(t)):this.Xt.push(He(t,!n));this.Yt=new Set(a.map(t=>this.Vt(t))),u?.length?(this.Kt=ze(u),this.vary=this.Kt.vary):this.vary=""}static async build(t,e){return new on(await k(t,{encoding:"utf-8"})+v,e)}Vt(t){return"exact"===this.qt?t:t.toLowerCase()}Qt(t){if(this.Gt.has(t))return!0;const e=t.trim();return!(!("~"!==e[0]&&"~"!==e[e.length-1]||this.Lt)||"."===e[0]&&!this.Dt||this.Zt.has(e)||this.Xt.some(t=>t.test(e)))}async find(t,e={}){let n=t.join(v);"force-lowercase"===this.qt&&(n=n.toLowerCase());let i=E(this.jt,n);if(!i.startsWith(this.jt)&&i+v!==this.jt)return null;let r=null,o=null;for(const t of this.Jt){const e=i+t;if(r=e.substring(this.jt.length).split(v).filter(t=>t),r.length>this.Ht+1)return null;if(r.some(t=>!this.Qt(this.Vt(t))))return null;const n=r[r.length-1]??"";if(!this.zt&&this.Yt.has(this.Vt(n))&&!this.Gt.has(this.Vt(n)))return null;if(o=await k(e,{encoding:"utf-8"}).catch(()=>null),o){i=e;break}}if(!o||!r)return null;if(this.Vt(o)!==this.Vt(i))return null;let s=o,c=await T(o).catch(()=>null);if(!c)return null;if(c.isDirectory()){if(r.length>this.Ht)return null;for(const t of this.Wt){const e=y(o,t);if(c=await T(e).catch(()=>null),c?.isFile()){s=e;break}}}if(!c?.isFile())return null;if(this.Kt){const t=b(s),n=g(s);for(const i of this.Kt.options(t,e)){if(!i.filename||i.filename.includes(v))continue;const t=await cn({canonicalPath:s,negotiatedPath:y(n,i.filename),...i.info});if(t)return t}}return cn({canonicalPath:s,negotiatedPath:s})}async precompute(){const t=new Map,e=(e,n)=>{const i=t.get(e);(!i||n.p>i.p)&&t.set(e,n)},n=new J({dir:[this.jt],depth:0});for(const{dir:t,depth:i}of n){const r=await S(y(...t),{withFileTypes:!0,encoding:"utf-8"}),o=new Set(r.map(t=>this.Vt(t.name)));for(const s of r){const r=this.Vt(s.name);if(!this.Qt(r))continue;const c=[...t,s.name];if(s.isDirectory())i<this.Ht&&n.push({dir:c,depth:i+1}),e(this.Vt(c.slice(1).join("/")),sn);else if(s.isFile()){const n={file:y(...c),dir:y(...t),basename:r,siblings:o},i=this.Wt.indexOf(r);if(-1!==i&&(e(this.Vt(t.slice(1).join("/")),{...n,p:this.Wt.length+1-i}),!this.zt&&!this.Gt.has(r)))continue;const a=this.Vt(c.slice(1).join("/"));for(let t=0;t<this.Jt.length;++t){const i=this.Jt[t];s.name.endsWith(i)&&e(a.substring(0,a.length-i.length),{...n,p:-t})}}}}return{find:async(e,n={})=>{const i=t.get(this.Vt(e.join("/")));if(!i?.file)return null;if(this.Kt)for(const t of this.Kt.options(i.basename,n)){if(!i.siblings.has(this.Vt(t.filename)))continue;const e=await cn({canonicalPath:i.file,negotiatedPath:y(i.dir,t.filename),...t.info});if(e)return e}return cn({canonicalPath:i.file,negotiatedPath:i.file})},vary:this.vary}}}const sn={file:"",dir:"",basename:"",siblings:new Set,p:1};async function cn(t){const e=await $(t.negotiatedPath,a.O_RDONLY).catch(()=>null);if(!e)return null;const n=()=>(e.close().catch(()=>{}),null),i=await e.stat().catch(n);return i?.isFile()?{handle:e,stats:i,...t}:n()}const an=/*@__PURE__*/ke(async t=>{const e=St(t);if(e.aborted)throw $t;e.throwIfAborted();const n=await A(y(N(),"upload"));Tt(t,()=>O(n,{recursive:!0}));let i=0;const r=()=>{if(e.aborted)throw $t;return y(n,(++i).toString(10).padStart(6,"0"))};return{dir:n,nextFile:r,save:async(t,{mode:n=384}={})=>{const i=r(),o=f(i,{mode:n});try{return await d(t,o,{signal:e}),{path:i,size:o.bytesWritten}}finally{o.close()}}}});function fn(t){const e=pt(t);if(!e.L)throw new Error("cannot call acceptBody from shouldUpgrade");if(e.I.signal.aborted)throw $t;e.te||e.D||(e.te=!0,"100-continue"===t.headers.expect?.trim().toLowerCase()&&e.L.W.writeContinue())}function un(t,{blockRequestHeaders:e=["connection","expect","host","keep-alive","proxy-authorization","transfer-encoding","upgrade","via"],requestHeaders:n=[],blockResponseHeaders:i=["connection","keep-alive","transfer-encoding"],responseHeaders:s=[],agent:c,keepAlive:a=!0,maxSockets:f=10,...u}={}){let h;t.startsWith("https://")?(c??=new M({keepAlive:a,maxSockets:f,...u}),h=o):(c??=new r({keepAlive:a,maxSockets:f,...u}),h=R);const l=t.endsWith("/")?t:t+"/";return zt((r,o)=>new Promise((a,f)=>{const u=St(r),w=t=>f(u.aborted?$t:new ot(502,{cause:t})),p=new URL(l+r.url?.substring(1)),m=p.toString();if(!m.startsWith(l)&&m!==t)return f(new ot(400,{message:"directory traversal blocked"}));fn(r);let y={...r.headers};hn(y,e);for(const t of n)y=t(r,y);const g=h(p,{agent:c,method:r.method,headers:y,signal:u});g.once("error",w),g.once("response",t=>{if(!o.headersSent){let e={...t.headers};hn(e,i);for(const n of s)e=n(r,t,e);o.writeHead(t.statusCode??200,t.statusMessage,e)}d(t,o).then(a,f)}),d(r,g).catch(w)}))}function hn(t,e){for(const e of be(t.connection)??[])delete t[e.toLowerCase()];for(const n of e)delete t[n]}function ln({trustedProxyCount:t,trustedProxyAddresses:e,trustedHeaders:n}){const i=e?D(e):()=>!0,r=t??(e?Number.POSITIVE_INFINITY:0),o=new Set(n);return ke(t=>{const e=e=>{if(o.has(e))return be(t.headers[e])?.reverse()},n=e("forwarded"),s=e("x-forwarded-for"),c=e("x-forwarded-host"),a=e("x-forwarded-proto"),f=e("x-forwarded-protocol"),u=e("x-url-scheme"),h=e("via")?.map(t=>{const e=/^([^/ ]+\/)?([^ ]+) (.+)$/.exec(t);return e?.[3]?q(e[3]):void 0}),l=[dn(t)];if(n)for(const t of n)try{const e=xe(t);l.push({client:q(e.get("for")),server:q(e.get("by")),host:e.get("host"),proto:e.get("proto")})}catch{l.push({client:void 0,server:void 0,host:void 0,proto:void 0})}else if(s){const t=s.map(q),e=c??[],n=a??f??u??[];let i=l[0].client;for(let r=0;r<t.length;++r){const o=t[r];l.push({client:o,server:h?.[r]??(i?{...i,port:void 0}:void 0),host:e[r],proto:n[r]}),i=o}}else if(h)for(const t of h)l.push({client:void 0,server:t,host:void 0,proto:void 0});let d=Math.min(1+r,l.length);for(let t=0;t<d-1;++t)i(l[t].client)||(d=t+1);return Object.freeze({trusted:l.slice(0,d),untrusted:l.slice(d),outwardChain:l,edge:l[d-1]})})}const dn=t=>({client:{...q(t.socket.remoteAddress)??wn,port:t.socket.remotePort},server:{...q(t.socket.localAddress)??wn,port:t.socket.localPort},host:t.headers.host,proto:void 0}),wn={type:"alias",ip:"_disconnected",port:void 0};function pn(t,e){return delete e.forwarded,delete e["x-forwarded-for"],delete e["x-forwarded-host"],delete e["x-forwarded-proto"],delete e["x-forwarded-protocol"],delete e["x-url-scheme"],e}function mn(t,e){const n=pn(0,e);return n.forwarded=bn([dn(t)]),n}const yn=(t,{onlyTrusted:e=!1}={})=>(n,i)=>{const r=pn(0,i),o=t(n);return r.forwarded=bn([...e?o.trusted:o.outwardChain].reverse()),r};function gn(t,e){let n=t.headers.forwarded;const i=bn([dn(t)]);n?n+=", "+i:n=i;const r=pn(0,e);return r.forwarded=n,r}function bn(t){return t.filter(t=>t.server||t.client).map(t=>Object.entries({for:t.client?.ip,by:t.server?.ip,host:t.host,proto:t.proto}).filter(([t,e])=>e).map(([t,e])=>e&&/[^a-zA-Z0-9._]/.test(e)?`${t}="${e.replaceAll("\\","\\\\").replaceAll('"','\\"').replaceAll(",","-")}"`:`${t}=${e}`).join("; ")).join(", ")}class vn{constructor(t,{fatal:e=!1}={}){this.ee=t,this.ne=e,this.ie=new Uint8Array(4),this.re=new DataView(this.ie.buffer),this.oe=0}decode(t,{stream:e=!1}={}){const n=t.byteLength,i=[];let r=0;if(this.oe>0){if(r=4-this.oe,n<r)return this.ie.set(t,this.oe),this.oe+=n,"";this.ie.set(t.subarray(0,r),this.oe),i.push(this.re.getUint32(0,this.ee)),this.oe=0}const o=new DataView(t.buffer,t.byteOffset,t.byteLength);let s=r;for(const t=n-3;s<t;s+=4)i.push(o.getUint32(s,this.ee));if(e)s<n&&this.ie.set(t.subarray(s)),this.oe=n-s;else if(this.oe=0,s<n){if(this.ne)throw new Error("invalid byte length for utf-32 content");i.push(65533)}return i.length>0?String.fromCodePoint(...i):""}}class En extends F{constructor(t){super({transform(e,n){try{const i=t.decode(e,{stream:!0});i&&n.enqueue(i)}catch(t){n.error(t)}},flush(e){try{const n=t.decode(X);n&&e.enqueue(n)}catch(t){e.error(t)}}})}}const xn=new Map;function _n(t,e){xn.set(t.toLowerCase(),e)}function Tn(){_n("utf-32be",{decoder:t=>new vn(!1,t)}),_n("utf-32le",{decoder:t=>new vn(!0,t)})}function Sn(t,e={}){const n=xn.get(t.toLowerCase());if(n)return n.decoder(e);try{return new TextDecoder(t,e)}catch{throw new ot(415,{body:`unsupported charset: ${t}`})}}function kn(t,e={}){const n=xn.get(t.toLowerCase());if(n)return n.decoderStream?n.decoderStream(e):new En(n.decoder(e));try{return new U(t,e)}catch{throw new ot(415,{body:`unsupported charset: ${t}`})}}const $n=["utf-32be",null,"utf-16be","utf-16be","utf-32le","utf-16le",null,"utf-8"];function An(t,e,n){const i=_e(t.headers["if-modified-since"]),r=be(t.headers["if-none-match"]);if(r){if(Nn(e,n,r))return!1}else if(i&&(n.mtimeMs/1e3|0)<=i)return!1;return!0}function On(t,e,n){let i=!0;const r=ye(t);return r.etag&&(i&&=Nn(e,n,r.etag)),r.modifiedSeconds&&(i&&=(n.mtimeMs/1e3|0)===r.modifiedSeconds),i}function Nn(t,e,n){if(n.includes("*"))return!0;const i=t.getHeader("etag");if("string"==typeof i){if(n.includes(i))return!0;if(i.startsWith('W/"'))return!1}return!!n.some(t=>t.startsWith('W/"'))&&n.includes(Ie(t.getHeader("content-encoding"),e))}class Pn extends F{constructor(t,e){super({transform(i,r){n+=i.byteLength,n>t?r.error(e):r.enqueue(i)}});let n=0}}function Mn(t,{maxExpandedLength:e=Number.POSITIVE_INFINITY,maxContentLength:n=e,maxEncodingSteps:i=1}={}){const r=ve(t.headers["content-length"]);if(void 0!==r&&r>n)throw new ot(413);const o=be(t.headers["content-encoding"])??[];if(o.length>i)throw new ot(415,{body:"too many content-encoding stages"});fn(t);let s=I.toWeb(t);void 0===r&&Number.isFinite(n)&&(s=s.pipeThrough(new Pn(n,new ot(413))));for(const t of o.reverse())s=s.pipeThrough(Cn(t));return Number.isFinite(e)&&(s=s.pipeThrough(new Pn(e,new ot(413,{body:"decoded content too large"})))),s}function Rn(t,e={}){const n=Mn(t,e),i=me(t)??e.defaultCharset??"utf-8";return n.pipeThrough(kn(i,e))}async function Fn(t,e={}){const n=[];for await(const i of Rn(t,e))n.push(i);return n.join("")}async function Un(t,e={}){const n=await(async(t,e)=>{const n=t.getReader(),i=new Uint8Array(3);let r=0,o=null;for(;;){const t=await n.read(),e=3-r;if(t.done){0===r?(i[0]=1,i[1]=1):1===r&&(i[1]=i[0]),i[2]=i[0],o=null;break}if(o=t.value,o.byteLength>=e){i.set(o.subarray(0,e),r);break}i.set(o,r),r+=o.byteLength}const s=$n[(i[0]?4:0)|(i[1]?2:0)|(i[2]?1:0)];if(!s)throw n.cancel(),new ot(415,{body:"invalid JSON encoding"});const c=kn(s,e),a=c.writable.getWriter();return r&&a.write(i.subarray(0,r)),o&&a.write(o),n.releaseLock(),a.releaseLock(),t.pipeThrough(c)})(Mn(t,e),e),i=[];for await(const t of n)i.push(t);return JSON.parse(i.join(""))}function Cn(t){switch(t.toLowerCase()){case"gzip":case"x-gzip":return new C("gzip");case"deflate":return new C("deflate");case"br":try{return new C("brotli")}catch{return j.toWeb(w.createBrotliDecompress())}case"zstd":try{return j.toWeb(w.createZstdDecompress())}catch{throw new ot(415,{body:"unsupported content encoding"})}default:throw new ot(415,{body:"unknown content encoding"})}}function Bn(t){if(!t)return null;const[e,n]=we(t,";"),i=new Map;if(n){const t=/\s*([!#-'*+\-.0-:>-Z^-z|~]+)=(?:([!#-'*+\-.0-:>-Z^-z|~]+)|"((?:[^\x00-\x08\x0a-\x1f"\\\x7f]|\\.)*)")\s*(;|$)/gy;for(;t.lastIndex!==n.length;){const e=t.exec(n);if(!e)return null;const r=e[1].toLowerCase(),o=e[2]??e[3]?.replaceAll(/\\(.)/g,"$1")??"";i.has(r)||i.set(r,o)}}return{mime:e.trim().toLowerCase(),params:i}}function In(t,e,n,i){const r=t.byteLength;for(;e<r;){for(;e<r;++e){const n=t[e];if(32!==n&&9!==n)break}if(e===r)break;if(59!==t[e++])return!1;for(;e<r;++e){const n=t[e];if(32!==n&&9!==n)break}if(e===r)return!1;const o=e;for(;e<r;++e){const n=t[e];if(!Hn[n]){if(61===n)break;return!1}}if(e===r)return!1;const s=t.latin1Slice(o,e).toLowerCase();if("*"===s[s.length-1]){const i=++e;for(;e<r;++e){const n=t[e];if(!Dn[n]){if(39!==n)return!1;break}}if(e===r)return!1;const o=Sn(t.latin1Slice(i,e));for(++e;e<r&&39!==t[e];++e);if(e===r)return!1;if(++e===r)return!1;let c=e;const a=[];for(;e<r;++e){const n=t[e];if(1!==qn[n]){if(37===n){let n,i;if(e+2<r&&16!==(n=zn[t[e+1]])&&16!==(i=zn[t[e+2]])){const r=(n<<4)+i;e>c&&a.push(o.decode(t.subarray(c,e),{stream:!0})),a.push(o.decode(Buffer.from([r]),{stream:!0})),c=(e+=2)+1;continue}return!1}break}}a.push(o.decode(t.subarray(c,e)));const f=a.join("");n.has(s)||n.set(s,f);continue}if(++e===r)return!1;if(34===t[e]){let o=++e,c=!1;const a=[];for(;e<r;++e){const n=t[e];if(92!==n){if(34===n){if(c){o=e,c=!1;continue}a.push(i.decode(t.subarray(o,e)));break}if(c&&(o=e-1,c=!1),!Ln[n])return!1}else c?(o=e,c=!1):(a.push(i.decode(t.subarray(o,e),{stream:!0})),c=!0)}if(e===r)return!1;++e,n.has(s)||n.set(s,a.join(""));continue}let c=e;for(;e<r;++e){const n=t[e];if(!Hn[n]){if(e===c)return!1;break}}n.has(s)||n.set(s,i.decode(t.subarray(c,e)))}return!0}const jn=[1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Hn=/*@__PURE__*/(()=>{const t=new Uint8Array(256);return t.set([1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,...jn,0,1,0,1],33),t})(),qn=/*@__PURE__*/(()=>{const t=new Uint8Array(256);return t.set([1,0,1,1,0,1,0,0,0,0,1,0,1,1,0,...jn,0,1,0,1],33),t})(),Dn=/*@__PURE__*/(()=>{const t=new Uint8Array(256);return t.set([1,0,1,1,1,1,0,0,0,0,1,0,1,0,0,...jn,1,0,1,1],33),t})(),Ln=/*@__PURE__*/(()=>{const t=new Uint8Array(256);return t.fill(1,32,256),t[9]=1,t[34]=0,t[92]=0,t[127]=0,t})(),zn=/*@__PURE__*/(()=>{const t=new Uint8Array(256).fill(16);for(let e=0;e<10;++e)t[48+e]=e;for(let e=0;e<6;++e)t[65+e]=e+10,t[97+e]=e+10;return t})();class Wn{constructor(t,e){const n=t.byteLength;if(!n||n>65535)throw new Error("invalid needle");this.se=t,this.ce=e,this.ae=null,this.fe=0,this.ue=null}push(t){let e=0;const n=t.byteLength,i=this.se,r=i.byteLength-1,o=n-r;let s=-this.fe;if(this.fe){const c=this.ue,a=this.ae,f=i[r];if(o>0){const n=t[s+r];n!==f||t.compare(i,-s,r,0,s+r)?s+=c[n]:(this.ce(!0,X,0,0,!0),this.fe=0,e=s+=r+1)}const u=o<0?o:0;for(;s<u;){const n=t[s+r];if(n===f&&!a.compare(i,0,-s,this.fe+s,this.fe)&&!t.compare(i,-s,r,0,s+r)){this.ce(!0,a,0,this.fe+s,!1),this.fe=0,e=s+=r+1;break}s+=c[n]}const h=this.fe;if(h>0){const e=i[0];for(;s<0;){const r=a.subarray(0,h).indexOf(e,h+s);if(-1===r){s=0;break}const o=h-r;if(!a.compare(i,1,o,r+1,h)&&!t.compare(i,o,o+n))return r&&(this.ce(!1,a,0,r,!1),a.copy(a,0,r,o)),a.set(t,o),void(this.fe+=n-r);s=r+1-h}this.ce(!1,a,0,h,!1),this.fe=0}}for(;s<o;){const n=t.indexOf(i,s);if(-1!==n){if(this.ce(!0,t,e,n,!0),n===o+1)return;e=s=n+r+1}else s=o}const c=i[0];for(;s<n;){const o=t.indexOf(c,s);if(-1===o)return void this.ce(!1,t,e,n,!0);if(!t.compare(i,1,n-o,o+1)){if(!this.ae){this.ae=Buffer.allocUnsafe(r),this.ue=new Uint16Array(256).fill(r+1);for(let t=0;t<r;++t)this.ue[i[t]]=r-t}return t.copy(this.ae,0,o),this.fe=n-o,void(o>e&&this.ce(!1,t,e,o,!0))}s=o+1}n>e&&this.ce(!1,t,e,n,!0)}destroy(){const t=this.fe;t&&this.ae&&this.ce(!1,this.ae,0,t,!1),this.fe=0}}class Jn extends H{constructor({limits:t={},preservePath:e,highWaterMark:n,fileHwm:i,defParamCharset:r="utf-8",defCharset:o="utf-8"},s){super({autoDestroy:!0,emitClose:!0,highWaterMark:n,write:Gn,destroy:Vn,final:Zn});const c=s.get("boundary");if(!c)throw new ot(400,{body:"Multipart: Boundary not found"});const a=Sn(r),f={autoDestroy:!0,emitClose:!0,highWaterMark:i},u=t.fieldSize??1048576,h=t.fileSize??Number.POSITIVE_INFINITY,l=t.fieldNameSize??100,d=t.files??Number.POSITIVE_INFINITY,w=t.fields??Number.POSITIVE_INFINITY,p=t.parts??Number.POSITIVE_INFINITY;let m,y,g,b,v,E=0,x=0,_=0,T=-1;this.he=0,this.le=!1;let S=!1;const k=new Xn(t=>{this.de=void 0;const n=t["content-disposition"];if(!n)return void(T=-1);const i=((t,e)=>{if(!t.byteLength)return null;const n=new Map;let i=0;for(;i<t.byteLength;++i)if(!Hn[t[i]]){if(!In(t,i,n,e))return null;break}return{type:t.latin1Slice(0,i).toLowerCase(),params:n}})(Buffer.from(n,"latin1"),a);if("form-data"!==i?.type)return void(T=-1);v=i.params.get("name")??"",S=v.length>l,S&&(v=v.substring(0,l));let r=i.params.get("filename*")??i.params.get("filename");void 0===r||e||(r=(t=>{for(let e=t.length;e-- >0;)if("/"===t[e]||"\\"===t[e]){t=t.slice(e+1);break}return".."===t||"."===t?"":t})(r));const s=Bn(t["content-type"]);b=s?.mime??"text/plain";const c=s?.params.get("charset")?.toLowerCase()??o;if(y=Sn(c),g=t["content-transfer-encoding"]?.toLowerCase()??"7bit","application/octet-stream"===b||void 0!==r){if(_++===d&&this.emit("filesLimit"),_>d||0===this.listenerCount("file"))return void(T=-1);this.we=new Yn(f,this),++this.he,this.emit("file",v,this.we,{nameTruncated:S,filename:r,encoding:g,mimeType:b}),T=h}else{if(x++===w&&this.emit("fieldsLimit"),x>w||0===this.listenerCount("field"))return void(T=-1);m="",T=u}});let $=0;const A=Buffer.from(`\r\n--${c}`,"latin1");this.pe=new Wn(A,(t,e,n,i,r)=>{try{if(n===i)return;if($){if(1===$){if(13===e[n])$=2;else{if(45!==e[n])return void($=0);$=3}if(++n===i)return}if(2!==$){if($=0,45!==e[n])return;return this.le=!0,void(this.pe=Qn)}if($=0,10!==e[n++])return;if(E++===p&&this.emit("partsLimit"),E>p)return;if(this.de=k,n===i)return}if(this.de){const t=this.de.push(e,n,i);if(-1===t)return this.de=void 0,k.reset(),void this.emit("error",new Error("Malformed part header"));if(t===i)return;n=t}if(T>=0){const t=Math.min(i,n+T);if(T-=i-n,this.we){if(t>n){let i;r?i=e.subarray(n,t):(i=Buffer.allocUnsafe(t-n),e.copy(i,0,n,t)),this.we.push(i)||(this.we.me??=this.ye,this.ye=void 0)}T<0&&(this.we.emit("limit"),this.we.truncated=!0)}else void 0!==m&&(m+=e.latin1Slice(n,t))}}finally{t&&(this.de?(this.emit("error",new Error("Unexpected end of headers")),this.de=void 0):this.we?(this.we.push(null),this.we=void 0):void 0!==m&&(this.emit("field",v,y.decode(Buffer.from(m,"latin1")),{nameTruncated:S,valueTruncated:T<0,encoding:g,mimeType:b}),m=void 0),$=1,T=-1)}}),this.write(ti)}ge(){if(this.de)return new Error("Malformed part header");const t=this.we;return t&&(this.we=void 0,t.destroy(new Error("Unexpected end of file"))),this.le?null:new Error("Unexpected end of form")}}function Gn(t,e,n){this.ye=n,this.pe.push(t);const i=this.ye;i&&(this.ye=void 0,i())}function Vn(t,e){this.de=void 0,this.pe=Qn,t??=this.ge();const n=this.we;n&&(this.we=void 0,n.destroy(t??void 0)),e(t)}function Zn(t){if(this.pe.destroy(),!this.le)return t(new Error("Unexpected end of form"));this.he?this.be=()=>t(this.ge()):t(this.ge())}class Xn{constructor(t){this.ve=Object.create(null),this.Ee=0,this.xe=0,this.m=0,this.ht="",this._e="",this.Te=0,this.ce=t}reset(){this.ve=Object.create(null),this.Ee=0,this.xe=0,this.m=0,this.ht="",this._e="",this.Te=0}push(t,e,n){let i=e,r=e;const o=Math.min(n,e+16384-this.xe);for(;r<o;)switch(this.m){case 0:for(;r<o&&Hn[t[r]];++r);if(r>i&&(this.ht+=t.latin1Slice(i,r)),r<o){if(58!==t[r])return-1;if(!this.ht)return-1;++r,this.m=1}break;case 1:for(;r<o;++r){const e=t[r];if(32!==e&&9!==e){i=r,this.m=2;break}}break;case 2:switch(this.Te){case 0:for(;r<o;++r){const e=t[r];if(e<32||127===e){if(13!==e)return-1;++this.Te;break}}this._e+=t.latin1Slice(i,r),++r;break;case 1:if(10!==t[r++])return-1;++this.Te;break;case 2:{const e=t[r];32===e||9===e?(i=r,this.Te=0):(++this.Ee<2e3&&(this.ve[this.ht.toLowerCase()]??=this._e),13===e?(++this.Te,++r):(i=r,this.Te=0,this.m=0,this.ht="",this._e=""));break}case 3:{if(10!==t[r++])return-1;const e=this.ve;return this.reset(),this.ce(e),r}}}return o<n?-1:(this.xe+=o-e,o)}}class Yn extends I{constructor(t,e){super({...t,read:Kn}),this.truncated=!1,this.once("end",()=>{if(Kn.call(this),0===--e.he&&e.be){const t=e.be;e.be=void 0,process.nextTick(t)}})}}function Kn(t){const e=this.me;e&&(this.me=void 0,e())}const Qn={push:()=>{},destroy:()=>{}},ti=/*@__PURE__*/Buffer.from("\r\n");class ei extends H{constructor({limits:t={},highWaterMark:e,defCharset:n="utf-8"},i){super({autoDestroy:!0,emitClose:!0,highWaterMark:e,write:ni,final:ii}),this.Se=i.get("charset")??n,this.ke=t.fieldSize??1048576,this.$e=t.fields??Number.POSITIVE_INFINITY,this.Ae=t.fieldNameSize??100,this.Oe=0,this.Ne=!0,this.Pe="",this.Me=this.Ae,this.Re=0,this.Fe="",this.Ue=!1,this.Ce=-2,this.Be=/^utf-?8$/i.test(this.Se)?1:/^(latin-?1|iso[\-_]?8859-?1|(us-)?ascii)$/i.test(this.Se)?2:0,this.Ie=Sn(this.Se)}}function ni(t,e,n){if(this.Oe>=this.$e||!t.byteLength)return n();const i=t.byteLength;let r=0,o=this.Ce;if(-2!==o){if(-1===o){if(16===(o=zn[t[r++]]))return n(new Error("Malformed urlencoded form"));if(this.Re|=o,r===i)return this.Ce=o,n()}const e=zn[t[r++]];if(16===e)return n(new Error("Malformed urlencoded form"));if(this.Pe+=String.fromCharCode((o<<4)+e),this.Ce=-2,r===i)return n()}for(ai[ri]=1,ai[oi]=1,ai[si]=1,ai[ci]=this.Ne?1:0;;){const e=r;for(;r<i&&!ai[t[r]];++r);if(r>e&&this.Me>=0&&((this.Me-=r-e)<0?this.Pe+=t.latin1Slice(e,r+this.Me):this.Pe+=t.latin1Slice(e,r)),r===i)return n();switch(t[r++]){case ri:for(;;){if(--this.Me<0){ai[ri]=0,ai[si]=0;break}if(r===i)return this.Ce=-1,n();const e=zn[t[r++]];if(16===e)return n(new Error("Malformed urlencoded form"));if(this.Re|=e,r===i)return this.Ce=e,n();const o=zn[t[r++]];if(16===o)return n(new Error("Malformed urlencoded form"));if(this.Pe+=String.fromCharCode((e<<4)+o),r===i)return n();if(t[r]!==ri)break;r++}break;case oi:const e=!this.Be||1===this.Be&&8&this.Re?this.Ie.decode(Buffer.from(this.Pe,"latin1")):this.Pe;if(this.Ne?e&&this.emit("field",this.Pe,"",{nameTruncated:this.Me<0,valueTruncated:!1,encoding:this.Se,mimeType:"text/plain"}):(this.emit("field",this.Fe,e,{nameTruncated:this.Ue,valueTruncated:this.Me<0,encoding:this.Se,mimeType:"text/plain"}),this.Fe="",this.Ue=!1,this.Ne=!0,ai[ci]=1),ai[ri]=1,ai[si]=1,this.Pe="",this.Me=this.Ae,this.Re=0,++this.Oe===this.$e)return this.emit("fieldsLimit"),n();break;case si:--this.Me<0?(ai[ri]=0,ai[si]=0):this.Pe+=" ";break;case ci:this.Fe=!this.Be||1===this.Be&&8&this.Re?this.Ie.decode(Buffer.from(this.Pe,"latin1")):this.Pe,this.Ue=this.Me<0,this.Ne=!1,ai[ci]=0,ai[ri]=1,ai[si]=1,this.Pe="",this.Re=0,this.Me=this.ke}if(r===i)return n()}}function ii(t){ni.call(this,fi,"",t)}const ri=37,oi=38,si=43,ci=61,ai=/*@__PURE__*/new Uint8Array(256),fi=/*@__PURE__*/Buffer.from([oi]);function ui(t,{closeAfterErrorDelay:e=500,...n}={}){const i=((t,e={})=>{const n=t["content-type"];if(!n)throw new ot(400,{body:"Missing Content-Type"});const i=Bn(n);if(!i)throw new ot(400,{body:"Malformed content type"});const r="application/x-www-form-urlencoded"===i.mime?ei:"multipart/form-data"!==i.mime||e.blockMultipart?null:Jn;if(!r)throw new ot(415);return new r(e,i.params)})(t.headers,n);fn(t);const r=new G,o=(n,o)=>{if(r.fail(new ot(n,o)),i.removeAllListeners(),t.unpipe(i),t.resume(),e>=0){const n=setTimeout(()=>t.socket.destroy(),e);t.once("end",()=>clearTimeout(n))}};i.on("field",(t,e,{nameTruncated:n,valueTruncated:i,encoding:s,mimeType:c})=>t?n?o(400,{body:`field name ${JSON.stringify(t)}... too long`}):i?o(400,{body:`value for ${JSON.stringify(t)} too long`}):void r.push({name:t,encoding:s,mimeType:c,type:"string",value:e}):o(400,{body:"missing field name"})),i.on("file",(t,e,{nameTruncated:n,filename:i,encoding:s,mimeType:c})=>t?n?o(400,{body:`field name ${JSON.stringify(t)}... too long`}):void(i?(e.once("limit",()=>o(400,{body:`uploaded file for ${JSON.stringify(t)}: ${JSON.stringify(i)} too large`})),r.push({name:t,encoding:s,mimeType:c,type:"file",value:e,filename:i})):e.resume()):o(400,{body:"missing field name"})),t.once("error",e=>{t.readableAborted?r.fail($t):o(500,{body:"request error",headers:{connection:"close"},cause:e})}),i.once("error",t=>o(400,{body:"error parsing form data",cause:t})),i.once("partsLimit",()=>o(400,{body:"too many parts"})),i.once("filesLimit",()=>o(400,{body:"too many files"})),i.once("fieldsLimit",()=>o(400,{body:"too many fields"}));const s=()=>r.close("complete");return i.once("close",s),Tt(t,s),t.pipe(i),r}async function hi(t,e={}){const n=new FormData,i=new Map;for await(const r of ui(t,e))if("file"===r.type){const o=r.value;let s=await(e.preCheckFile?.({fieldName:r.name,filename:r.filename,encoding:r.encoding,mimeType:r.mimeType,maxBytes:e.limits?.fileSize}));const c=t=>{if("function"==typeof s){const e=s;return s=void 0,e({actualBytes:t})}};Tt(t,()=>c(0));const a=await an(t),f=await a.save(o,{mode:384});await c(f.size);const h=new File([await u(f.path)],r.filename,{type:r.mimeType});i.set(h,f.path),n.append(r.name,h)}else{let t=r.value;e.trimAllValues&&(t=t.trim()),n.append(r.name,t)}return Object.assign(n,{getTempFilePath(t){const e=i.get(t);if(!e)throw new Error("unknown file");return e},getBoolean(t){const e=n.get(t);return null===e?null:"true"===e||"on"===e},getString(t){const e=n.get(t);return"string"==typeof e?e:null},getAllStrings:t=>n.getAll(t).filter(t=>"string"==typeof t),getFile(t){const e=n.get(t);return"string"==typeof e?null:e},getAllFiles:t=>n.getAll(t).filter(t=>"string"!=typeof t)})}const li="win32"===/*@__PURE__*/P();function di(t,{rejectPotentiallyUnsafe:e=!0}={}){let n=[];const i=wt(t);if(i){if("/"===i.C)return[];n=i.C.split("/")}else{const e=Y(t).pathname;if("/"===e)return[];n=e.split("/").map(decodeURIComponent)}if(""!==n[0])throw new Error("invalid path");if(n.shift(),e){const t=li?pi:wi;if(n.some(e=>t.test(e)||e.includes(v)))throw new Error("invalid path");if(n.slice(0,n.length-1).includes(""))throw new Error("invalid path")}return n}const wi=/[\x00-\x1F\x7F/]|^(\.\.?|~)$/,pi=/[\x00-\x1F"*/:<>?\\|\x7F]|^[\s.]*$|^(CON|PRN|AUX|NUL|(COM|LPT)[\d\xB9\xB2\xB3])(\.|$)/i,mi=t=>new Promise(e=>{const n=()=>{t.cork(),e()};t instanceof s?t.write(X,n):t.once("drain",n),t.uncork()});async function yi(t,e,{delimiter:n=",",newline:i="\n",quote:r='"',encoding:o="utf-8",headerRow:c,end:a=!0}={}){"string"==typeof n&&(n=Buffer.from(n,o)),"string"==typeof i&&(i=Buffer.from(i,o));const f="string"==typeof r?Buffer.from(r,o):r,u=r+r,h=e=>{if(!e)return!0;const n=e.includes(r);return!n&&gi.test(e)?t.write(e,o):(t.write(f),n?t.write(e.replaceAll(r,u),o):t.write(e,o),t.write(f))};t instanceof s&&!t.headersSent&&!t.hasHeader("content-type")&&t.setHeader("content-type","text/csv; charset="+o+(c?"; header=present":!1===c?"; header=absent":"")),t.cork();try{t.write(X);for await(const r of e){if(t.writableAborted)break;let e=0;if(Symbol.iterator in r)for(const i of r)e&&t.write(n),h(i)||await mi(t),++e;else for await(const i of r)e&&t.write(n),h(i)||await mi(t),++e;t.write(i)||await mi(t)}}finally{t.uncork()}a&&t.end()}const gi=/^[^"':;,\\\r\n\t ]*$/i;function bi(t){if(!t||"object"!=typeof t)return!1;const e=t;return"number"==typeof e.fd&&"function"==typeof e.stat&&"function"==typeof e.createReadStream}class vi{constructor(t){(t=>"je"in t&&"function"==typeof t.pipe)(t)&&(t=I.toWeb(t)),this.lt=t.getReader(),this.He=null,this.qe=0,this.m=0}getRange(t,e){if(e<t)throw new Error("invalid range");if(t<this.qe)throw new Error("non-sequential range");if(this.m)throw new Error("previous range still active");let n=e-t+1,i=t-this.qe;this.qe=e+1,this.m=1;const r=this,o=(t,e)=>{const r=t.byteLength;r<=i?i-=r:r>i+n?(this.He=t.subarray(i+n),e.enqueue(t.subarray(i,i+n)),n=0):i>0?(e.enqueue(t.subarray(i)),n-=r-i,i=0):(e.enqueue(t),n-=r)};return new B({start(t){if(r.He){const e=r.He;r.He=null,o(e,t)}},async pull(t){if(n<=0)return r.m=0,void t.close();const e=await r.lt.read();e.done?t.error(new Error("range exceeds content")):"string"==typeof e.value?o(Buffer.from(e.value,"utf-8"),t):e.value instanceof Uint8Array?o(e.value,t):t.error(new Error("invalid stream type: must contain bytes or UTF-8 text"))}})}async close(){await this.lt.cancel(),this.lt.releaseLock()}}function Ei(t,{forceSequential:e=!1,mergeOverlapDistance:n=100}={}){const i=[];if(n>=0)for(const e of t.ranges){let t=null,r=0;for(let o=0;o<i.length;++o){const s=i[o];e.end>=s.start-n-1&&s.end>=e.start-n-1?t?(++r,t.start=Math.min(t.start,s.start),t.end=Math.max(t.end,s.end)):(t=s,t.start=Math.min(t.start,e.start),t.end=Math.max(t.end,e.end)):r>0&&(i[o-r]=s)}t?i.length-=r:i.push({...e})}else i.push(...t.ranges);if(e)for(let t=0;t<i.length-1;++t)if(i[t].start>i[t+1].start){i.sort((t,e)=>t.start-e.start);break}return{ranges:i,totalSize:t.totalSize}}async function xi(t,e,n,i){if("string"==typeof n||bi(n)||(i=Ei(i,{mergeOverlapDistance:0,forceSequential:!0})),1===i.ranges.length){const r=i.ranges[0];if(e.setHeader("content-length",r.end-r.start+1),e.setHeader("content-range",`bytes ${r.start}-${r.end}/${i.totalSize??"*"}`),e.writeHead(206),"HEAD"===t.method)return void e.end();const o=await _i(n);return await d(o.De(r.start,r.end),e),void(o.Le&&await o.Le())}const r=e.getHeader("content-type"),o=l()+l()+"ABCDEFGHIJKLMNOPQRSTUVWXYZ";e.setHeader("content-type",`multipart/byteranges; boundary=${o}`);const s=i.ranges.map(t=>({o:[`--${o}`,...nt({"content-type":r,"content-range":`bytes ${t.start}-${t.end}/${i.totalSize??"*"}`}),"",""].join("\r\n"),ze:t})),c=`--${o}--`;let a=c.length;for(const{o:t,ze:e}of s)a+=t.length+e.end-e.start+1+2;if(e.setHeader("content-length",a),"HEAD"===t.method)return void e.end();let f="";const u=await _i(n);try{for(const{o:t,ze:n}of s)e.write(f+t,"ascii"),await d(u.De(n.start,n.end),e,{end:!1}),f="\r\n";e.end(f+c)}finally{u.Le&&await u.Le()}}async function _i(t){if("string"==typeof t){const e=await $(t,"r");return{De:(t,n)=>e.createReadStream({start:t,end:n,autoClose:!1}),Le:()=>e.close()}}if(bi(t))return{De:(e,n)=>t.createReadStream({start:e,end:n,autoClose:!1})};{const e=new vi(t);return{De:(t,n)=>e.getRange(t,n),Le:()=>e.close()}}}async function Ti(t,e,n,i,r){if(i||("string"==typeof n?i=await T(n):bi(n)&&(i=await n.stat())),i){if("GET"===t.method||"HEAD"===t.method){if(!An(t,e,i))return void e.writeHead(304).end();e.setHeader("accept-ranges","bytes");const o=ge(t,i.size,r);if(o&&On(t,e,i))return xi(t,e,n,Ei(o,r))}e.setHeader("content-length",i.size)}if(e.writeHead(e.statusCode,e.statusMessage),"HEAD"!==t.method)return"string"==typeof n?n=c(n):bi(n)&&(n=n.createReadStream({start:0,autoClose:!1})),d(n,e);e.end()}function Si(t,e,{replacer:n,space:i,undefinedAsNull:r=!1,encoding:o="utf-8",end:c=!0}={}){const a=JSON.stringify(e,n,i)??(r?"null":void 0);t instanceof s&&!t.headersSent&&(t.hasHeader("content-type")||t.setHeader("content-type","application/json"),c&&t.setHeader("content-length",Buffer.byteLength(a,o))),c?t.end(a,o):a&&t.write(a,o)}async function ki(t,e,{replacer:n=null,space:i="",undefinedAsNull:r=!1,encoding:o="utf-8",end:c=!0}={}){if(Array.isArray(n)){const t=new Set(n.map(t=>String(t)));n=function(e,n){return null===this||Array.isArray(this)||t.has(e)?n:void 0}}"number"==typeof i&&(i=" ".substring(0,i));const a={We:e=>t.write(e,o),Je:()=>mi(t),Ge:n,Ve:i};if(t instanceof s&&!t.headersSent&&!t.hasHeader("content-type")&&t.setHeader("content-type","application/json"),e=Ai(null,"",e,a),Oi(e))r&&a.We("null");else{t.cork(),t.write(X);try{await $i(a,e,i?"\n":"")}finally{t.uncork()}}c&&t.end()}async function $i(t,e,n){const i=(i,r,o)=>{t.We(i);const s=n+t.Ve,c=t.Ve?": ":":";let a=!0;return{i:async(n,i)=>{const r=Ai(e,n,i,t);o&&Oi(r)||(a?a=!1:t.We(","),t.We(s),o&&(t.We(JSON.stringify(n))||await t.Je(),t.We(c)),await $i(t,r,s))},Le:()=>{a||t.We(n),t.We(r)}}};if(null===e||"object"!=typeof e||e instanceof String||e instanceof Number||e instanceof Boolean||e instanceof Function||e instanceof Symbol||e instanceof BigInt||Ni(e))t.We(JSON.stringify(e)??"null")||await t.Je();else if(e instanceof I){t.We('"');for await(const n of e){if("string"!=typeof n)throw new TypeError("Readables must have an encoding");const e=JSON.stringify(n);t.We(e.substring(1,e.length-1))||await t.Je()}t.We('"')}else if(e instanceof Map){const t=i("{","}",!0);for(const[n,i]of e)await t.i(n,i);t.Le()}else if(Pi(e)){let t=0;const n=i("[","]",!1);for(const i of e)await n.i(String(t++),i);n.Le()}else if(Mi(e)){let t=0;const n=i("[","]",!1);for await(const i of e)await n.i(String(t++),i);n.Le()}else{const t=i("{","}",!0);for(const[n,i]of Object.entries(e))await t.i(n,i);t.Le()}}function Ai(t,e,n,i){return i.Ge&&(n=i.Ge.call(t,e,n)),n&&"object"==typeof n&&"function"==typeof n.toJSON&&(n=n.toJSON(e)),n}const Oi=t=>void 0===t||"function"==typeof t||"symbol"==typeof t||t instanceof Function||t instanceof Symbol,Ni=t=>JSON.isRawJSON?.(t)??!1,Pi=t=>Symbol.iterator in t,Mi=t=>Symbol.asyncIterator in t;class Ri{constructor(t,e,{keepaliveInterval:n=15e3,softCloseReconnectDelay:i=500,softCloseReconnectStagger:r=2e3}={}){this.Ze=e,this.Xe=n??0,this.I=new AbortController,e.setHeader("content-type","text/event-stream"),e.setHeader("x-accel-buffering","no"),e.setHeader("cache-control","no-store"),e.writeHead(200),e.flushHeaders(),this.ping=this.ping.bind(this),this.Ye(),t.once("close",()=>this.close()),mt(t,()=>this.close(i,r))}get signal(){return this.I.signal}get open(){return!this.I.signal.aborted}Ye(){this.Xe&&(this.Ke=setTimeout(this.ping,this.Xe))}ping(){!this.I.signal.aborted&&this.Ze.writable&&(clearTimeout(this.Ke),this.Ze.write(":\n\n",()=>this.Ye()))}send({event:t,id:e,data:n,reconnectDelay:i=-1}){return this.sendFields([["event",t],["id",e],["data",n],["retry",i>=0?String(0|i):void 0]])}async sendFields(t){if(this.I.signal.aborted)throw new Error("ServerSentEvents closed");let e;this.Ze.cork();try{let n=!1;for(const[e,i]of t){if(void 0===i)continue;const t=i.split(/(?<=\n)|(?<=\r)(?!\n)/g);for(let n of t)this.Ze.write(e)," "===n[0]?this.Ze.write(": "):this.Ze.write(":"),this.Ze.write(n);/[\r\n]$/.test(i)?(this.Ze.write(e),this.Ze.write(":\n")):this.Ze.write("\n"),n=!0}if(!n)return;clearTimeout(this.Ke),this.Ze.write("\n",()=>e())}finally{this.Ze.uncork()}await new Promise(t=>{e=t}),this.Ye()}async close(t=0,e=0){if(this.I.signal.aborted){if(this.Ze.closed)return;return new Promise(t=>this.Ze.once("close",t))}this.Xe=0,clearTimeout(this.Ke),this.I.abort(),await new Promise(n=>{if(this.Ze.writable&&(t>0||e>0)){const i=t+Math.random()*e;this.Ze.end(`retry:${0|i}\n\n`,n)}else this.Ze.end(n)})}}const Fi=async(t,{mode:e="dynamic",fallback:n,callback:i=Ui,...r}={})=>{const o=await on.build(E(process.cwd(),t),r);let s=null;const c=n?.statusCode??200;if(n){let t=n.filePath;t.startsWith("/")&&(t=t.substring(1)),s=t.split("/")}const a="dynamic"===e?{}:{rejectPotentiallyUnsafe:!1},f="dynamic"===e?o:await o.precompute();return{handleRequest:async(t,e)=>{if("GET"!==t.method&&"HEAD"!==t.method)return At;let n=!1;const r=di(t,a),o={mime:Ee(t.headers.accept),language:Ee(t.headers["accept-language"]),encoding:Ee(t.headers["accept-encoding"])};let u=await f.find(r,o);if(!u&&s&&(n=!0,u=await f.find(s,o)),!u)return At;try{n&&(e.statusCode=c),e.setHeader("content-type",u.mime??Qe(m(u.canonicalPath))),u.encoding&&"identity"!==u.encoding&&e.setHeader("content-encoding",u.encoding);const r=f.vary;if(r){const t=e.getHeader("vary")??"";e.setHeader("vary",(t?t+", ":"")+r)}await i(t,e,u,n),await Ti(t,e,u.handle,u.stats)}finally{u.handle.close().catch(()=>{})}}}};function Ui(t,e,n){e.setHeader("etag",Ie(e.getHeader("content-encoding"),n.stats)),e.setHeader("last-modified",n.stats.mtime.toUTCString())}class Ci extends Error{constructor(t,{message:e,statusMessage:n,...i}={}){super(e,i),this.statusCode=0|t,this.statusMessage=n??"",this.name=`WebSocketError(${this.statusCode} ${this.statusMessage})`}static NORMAL_CLOSURE=1e3;static GOING_AWAY=1001;static UNSUPPORTED_DATA=1003;static POLICY_VIOLATION=1008;static MESSAGE_TOO_BIG=1009;static INTERNAL_SERVER_ERROR=1011;static SERVICE_RESTART=1012;static TRY_AGAIN_LATER=1013;static BAD_GATEWAY=1014}function Bi(t,{softCloseStatusCode:e=Ci.GOING_AWAY,...n}={}){const i=(i,r,o)=>new Promise((s,c)=>{const a=new t({...n,noServer:!0,clientTracking:!1});a.once("wsClientError",c),a.handleUpgrade(i,r,o,t=>{a.off("wsClientError",c),s({return:t,onError:e=>{const n=V(e,Ci);if(n)return void t.close(n.statusCode,n.statusMessage);const i=V(e,ot)??ot.INTERNAL_SERVER_ERROR,r=i.statusCode>=500?Ci.INTERNAL_SERVER_ERROR:4e3+i.statusCode;t.close(r,i.statusMessage)},softCloseHandler:n=>t.close(e,n)})})});return t=>Pt(t,i)}class Ii{constructor(t,e){this.data=t,this.isBinary=e}get text(){if(this.isBinary)throw new Ci(Ci.UNSUPPORTED_DATA,{statusMessage:"expected text"});return this.data.toString("utf-8")}get binary(){if(!this.isBinary)throw new Ci(Ci.UNSUPPORTED_DATA,{statusMessage:"expected binary"});return this.data}}class ji{constructor(t,{limit:e=-1,signal:n}={}){this.Qe=new G;const i=e=>{t.off("message",o),t.off("close",r),this.Qe.close(new Error(e))},r=()=>i("connection closed"),o=(t,n)=>{void 0!==n?this.Qe.push(new Ii(t,n)):"string"==typeof t?this.Qe.push(new Ii(Buffer.from(t,"utf-8"),!1)):this.Qe.push(new Ii(t,!0)),e>0&&0===--e&&this.detach()};this.detach=()=>{},n?.aborted?this.Qe.close(new Error("signal aborted")):2===t.readyState||3===t.readyState?this.Qe.close(new Error("connection closed")):(t.on("message",o),t.on("close",r),n?.addEventListener("abort",()=>i("signal aborted")),this.detach=()=>i("WebSocket listener detached"))}next(t){return this.Qe.shift(t)}[Symbol.asyncIterator](){return this.Qe[Symbol.asyncIterator]()}}function Hi(t,{timeout:e,signal:n}={}){const i=new ji(t,{limit:1,signal:n});return i.next(e).finally(()=>i.detach())}function qi(t){const e=pt(t);return"GET"===t.method&&(e.D?.has("websocket")??!1)}const Di=t=>t.headers.origin??it(t.headers["sec-websocket-origin"]),Li=(t,e=5e3)=>async n=>{if(!qi(n))return;const i=await t(n);let r;try{r=await Hi(i,{timeout:e})}catch(t){if((i.readyState??0)>=2)throw $t;throw new Ci(Ci.POLICY_VIOLATION,{statusMessage:"timeout waiting for authentication token",cause:t})}if(r.isBinary)throw new Ci(Ci.UNSUPPORTED_DATA,{statusMessage:"authentication token must be sent as text"});return r.data.toString("utf-8")};export{G as BlockingQueue,At as CONTINUE,on as FileFinder,ot as HTTPError,Ot as NEXT_ROUTE,Nt as NEXT_ROUTER,Se as Property,J as Queue,Kt as Router,$t as STOP,Ri as ServerSentEvents,fe as WebListener,Ci as WebSocketError,Ii as WebSocketMessage,ji as WebSocketMessages,fn as acceptBody,Pt as acceptUpgrade,Tt as addTeardown,Jt as anyHandler,An as checkIfModified,On as checkIfRange,Ne as clearProperty,Nn as compareETag,tn as compressFileOffline,en as compressFilesInDir,Ye as decompressMime,_t as defer,Gt as errorHandler,Fi as fileServer,V as findCause,je as generateStrongETag,Ie as generateWeakETag,St as getAbortSignal,Dt as getAbsolutePath,Z as getAddressURL,Re as getAuthData,pe as getAuthorization,Un as getBodyJson,Mn as getBodyStream,Fn as getBodyText,Rn as getBodyTextStream,me as getCharset,hi as getFormData,ui as getFormFields,ye as getIfRange,Qe as getMime,qt as getPathParameter,Ht as getPathParameters,Oe as getProperty,de as getQuery,ge as getRange,di as getRemainingPathComponents,he as getSearch,le as getSearchParams,Sn as getTextDecoder,kn as getTextDecoderStream,Di as getWebSocketOrigin,Fe as hasAuthScope,gt as isSoftClosed,qi as isWebSocketRequest,Bi as makeAcceptWebSocket,D as makeAddressTester,ln as makeGetClient,ke as makeMemo,ze as makeNegotiator,an as makeTempFileStorage,Li as makeWebSocketFallbackTokenFetcher,Le as negotiateEncoding,Hi as nextWebSocketMessage,q as parseAddress,un as proxy,_e as readHTTPDateSeconds,ve as readHTTPInteger,xe as readHTTPKeyValues,Ee as readHTTPQualityValues,be as readHTTPUnquotedCommaSeparated,Xe as readMimeTypes,_n as registerCharset,Ke as registerMime,Tn as registerUTF32,pn as removeForwarded,mn as replaceForwarded,zt as requestHandler,Ue as requireAuthScope,Me as requireBearerAuth,Ze as resetMime,Lt as restoreAbsolutePath,yn as sanitiseAndAppendForwarded,yi as sendCSVStream,Ti as sendFile,Si as sendJSON,ki as sendJSONStream,xi as sendRanges,Ui as setDefaultCacheHeaders,Ae as setProperty,mt as setSoftCloseHandler,gn as simpleAppendForwarded,Ei as simplifyRange,oe as toListeners,Wt as upgradeHandler};
|
package/package.json
CHANGED
package/run.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env -S node --disable-proto=delete --disallow-code-generation-from-strings --force-node-api-uncaught-exceptions-policy --no-addons
|
|
2
|
-
import{readFile as e}from"node:fs/promises";import{join as t,dirname as o,resolve as r}from"node:path";import{createServer as s}from"node:http";import{Router as i,requestHandler as n,addTeardown as a,CONTINUE as f,proxy as c,fileServer as p,getSearch as l,getQuery as h,getPathParameter as u,WebListener as m,compressFilesInDir as d,readMimeTypes as g,decompressMime as w,resetMime as y,registerMime as b}from"./index.js";const x=new Map([["","dir"],["-a","host"],["-b","brotli"],["-c","config-file"],["-C","config-json"],["-d","dir"],["-e","ext"],["-g","gzip"],["-h","help"],["-p","port"],["-P","proxy"],["-v","version"],["br","brotli"],["gz","gzip"],["zst","zstd"]]),$=new Map([["config-file",{type:"string"}],["config-json",{type:"string"}],["dir",{type:"string"}],["ext",{type:"string",multi:!0}],["port",{type:"number"}],["host",{type:"string"}],["zstd",{type:"boolean"}],["brotli",{type:"boolean"}],["gzip",{type:"boolean"}],["deflate",{type:"boolean"}],["proxy",{type:"string"}],["404",{type:"string"}],["spa",{type:"string"}],["mime",{type:"string",multi:!0}],["mime-types",{type:"string",multi:!0}],["write-compressed",{type:"boolean"}],["min-compress",{type:"number"}],["no-serve",{type:"boolean"}],["log",{type:"string"}],["help",{type:"boolean"}],["version",{type:"boolean"}]]),v=new Map([["zstd",{match:"zstd",file:"{file}.zst"}],["brotli",{match:"brotli",file:"{file}.br"}],["gzip",{match:"gzip",file:"{file}.gz"}],["deflate",{match:"deflate",file:"{file}.deflate"}]]);const S=e=>(t,o)=>{if(t!==e)throw new A(`expected ${JSON.stringify(e)}`,o,8);return e},z=e=>(t,o)=>{if(!e.has(t))throw new A(`expected one of ${JSON.stringify(e)}`,o,7);return t},k=e=>(t,o)=>{const r=[];let s=9;for(const i of e)try{return i(t,o)}catch(e){if(e instanceof A){if(e.p>s)continue;e.p!==s&&(s=e.p,r.length=0)}else s=-1;r.push(e)}throw 1===r.length?r[0]:new AggregateError(r)},j=e=>(t,o)=>{if(!Array.isArray(t))throw new A("expected list, got "+typeof t,o);return t.map((t,r)=>e(t,{...o,path:`${o.path}[${r}]`}))},N=(e,t)=>{if("boolean"!=typeof e)throw new A("expected boolean, got "+typeof e,t);return e},E=(e,t,o)=>(r,s)=>{if("number"!=typeof r)throw new A("expected number, got "+typeof r,s);if(e&&(0|r)!==r)throw new A(`expected integer, got ${r}`,s);if("number"==typeof t&&r<t)throw new A(`value cannot be less than ${t}`,s);if("number"==typeof o&&r>o)throw new A(`value cannot be greater than ${o}`,s);return r},O=(e,t)=>(s,i)=>{if("string"!=typeof s)throw new A("expected string, got "+typeof s,i);if(e&&!e.test(s))throw new A(`expected string matching ${e}`,i);if("uri-reference"===t&&i.file){if(s.startsWith("file://"))return"file://"+r(o(i.file),s.substring(7));if(!s.includes("://"))return r(o(i.file),s)}return s},P=(e,t,o)=>(r,s)=>{if("object"!=typeof r)throw new A("expected object, got "+typeof r,s);if(!r)throw new A("expected object, got null",s);if(Array.isArray(r))throw new A("expected object, got list",s);const i={},n=new Set;for(const[o,a]of Object.entries(r)){n.add(o);const r=(e.get(o)??t)(a,{...s,path:`${s.path}.${o}`});void 0!==r&&(i[o]=r)}for(const e of o)if(void 0===i[e])throw new A(`missing required property ${JSON.stringify(e)}`,s);for(const[t,o]of e)if(!n.has(t)){const e=o(void 0,{...s,path:`${s.path}.${t}`});void 0!==e&&(i[t]=e)}return i},T=e=>e,J=(e,t)=>{throw new A("unknown property",t)};class A extends Error{constructor(e,t,o=0){super(`${e} at ${t.path||"root"}`),this.p=o}}function I(e,t){return t.replaceAll(/\$\{([^${}:]+)(?::-(([^}\\]|\\.)*))?\}/g,(t,o,r)=>{let s;return s="?"===o?l(e):"?"===o[0]?h(e,o.substring(1)):u(e,o),"string"==typeof s?s:Array.isArray(s)?s.join("/"):r??""})}class q{constructor(e,t){this.t=!1,this.o=!1,this.i=!1,this.l=e,this.h=t,this.u=new Map}async set(e){if(!this.o&&!this.i)try{this.o=!0;const t=new Set,o=[];for(let r=0;r<e.length;++r){const s=e[r],i=s.port;i<=0||i>65535?this.l(0,`servers[${r}] must have a specific port from 1 to 65535`):t.has(i)?this.l(0,`skipping servers[${r}] because port ${i} has already been defined`):(t.add(i),o.push(async()=>{const e=await this.m(s,this.u.get(i));e?this.u.set(i,e):this.u.delete(i)}))}this.t||=o.length>0;for(const[e,r]of this.u)t.has(e)||(o.push(r.close),this.u.delete(e));await Promise.all(o.map(e=>e())),this.i?this.$():this.u.size?this.l(1,"all servers ready"):this.l(1,"no servers configured")}finally{this.o=!1}}async m({port:e,host:t,options:o,mount:r},l){const h=this.h("34",`http://${t}:${e}`),u=await(async(e,t=()=>{})=>{const o=new i;o.use(n((e,o)=>{const r=Date.now();return a(e,()=>{const s=Date.now()-r;t({method:e.method??"GET",path:e.url??"/",status:o.statusCode,duration:s})}),f}));for(const t of e)switch(t.type){case"files":"/dev/null"!==t.dir&&o.mount(t.path,await p(t.dir,t.options));break;case"proxy":o.mount(t.path,c(t.target,t.options));break;case"fixture":const e=(e,o)=>{for(const[r,s]of Object.entries(t.headers))"string"==typeof s?o.setHeader(r,I(e,s)):"number"==typeof s?o.setHeader(r,s):o.setHeader(r,s.map(t=>I(e,t)));o.statusCode=t.status,o.end(I(e,t.body))};"GET"===t.method&&o.onRequest("HEAD",t.path,e),o.onRequest(t.method,t.path,e);break;case"redirect":o.at(t.path,n((e,o)=>{o.setHeader("location",I(e,t.target)),o.statusCode=t.status,o.end()}))}return o})(r,o.logRequests?e=>{const t=this.h("1",e.method.replaceAll(/[^a-zA-Z0-9\-_]/g,"?")),o=encodeURI(e.path),r=this.h(C[e.status/100|0]??"",String(e.status)),s=this.h("2",`(${e.duration}ms)`);this.l(0,`${h} ${t} ${o} ${r} ${s}`)}:()=>{}),d=new m(u);let g,w;if(d.addEventListener("error",({detail:{action:e,error:t,request:o}})=>{this.l(0,`${h} ${this.h("91","error")}: ${e} ${o?.url} ${t}`)}),l&&t===l.host&&((e,t)=>{for(const o of M)if(e[o]!==t[o])return!1;return!0})(o,l.options))g=l.server,this.l(2,`${h} updated`),l.detach();else{if(l?(this.l(2,`${h} ${this.h("2","restarting (step 1: shutdown)")}`),await l.close(),this.l(2,`${h} ${this.h("2","restarting (step 2: start)")}`)):this.l(2,`${h} ${this.h("2","starting")}`),this.i)return;g=s(o),g.setTimeout(o.socketTimeout),w=D(g,e,t,o.backlog)}const y=d.attach(g,o);return w&&(await w,await new Promise(e=>setTimeout(e,0)),this.l(2,`${h} ready`)),{host:t,options:o,server:g,detach:()=>y("restart",o.restartTimeout),close:()=>new Promise(e=>{g.close(()=>{this.l(2,`${h} closed`),e()});const t=y("shutdown",o.shutdownTimeout,!0).countConnections();t>0&&this.l(2,`${h} ${this.h("2",`closing (remaining connections: ${t})`)}`)})}}async $(){this.u.size&&(this.l(2,this.h("2","shutting down")),await Promise.all([...this.u.values()].map(e=>e.close()))),this.t&&this.l(2,"shutdown complete")}shutdown(){this.i||(this.i=!0,this.o||this.$())}}const C=["","37","32","36","31","41;97"],D=async(e,t,o,r=511)=>new Promise((s,i)=>{e.once("error",i),e.listen(t,o,r,()=>{e.off("error",i),s()})}),M=["requestTimeout","keepAliveTimeout","keepAliveTimeoutBuffer","connectionsCheckingInterval","headersTimeout","highWaterMark","maxHeaderSize","noDelay","requireHostHeader","keepAlive","keepAliveInitialDelay","uniqueHeaders","backlog","socketTimeout"];function G(e){return e.reduce((e,t)=>({rawSize:e.rawSize+t.rawSize,bestSize:e.bestSize+t.bestSize,created:e.created+t.created}),{rawSize:0,bestSize:0,created:0})}const H=e=>e<2e3?`${e}B`.padStart(8," "):`${(e/1024).toFixed(1)}kB`.padStart(8," "),R=["none","ready","progress"];process.on("SIGUSR1",()=>{});let B=2;const U=(e,t)=>e<=B&&process.stderr.write(t+"\n");function L(e){process.stdin.destroy(),U(0,e instanceof Error?e.message:String(e))}process.on("unhandledRejection",L),process.on("uncaughtException",L);const W=process.stderr.isTTY&&!process.env.NO_COLOR?(e,t)=>e?`\x1b[${e}m${t}\x1b[0m`:t:(e,t)=>t,_=(e=>{const t=[];for(let o=0;o<e.length;++o){const r=e[o];if("--"===r)continue;const s=/^--([^ =\-][^ =]*)=(.*)$/.exec(r);if(s){t.push([s[1],s[2]]);continue}const i=/^-([^ =]*)([^ =])=(.*)$/.exec(r);if(i&&"-"!==r[1]){for(const e of i[1])t.push(["-"+e,""]);t.push(["-"+i[2],i[3]]);continue}if("-"!==r[0]||"-"===r){if(0!==o)throw new Error(`value without key: ${r}`);t.push(["",r]);continue}let n=e[o+1];if(n&&"-"===n[0]&&n.length>1&&(n=void 0),void 0!==n&&++o,"-"===r[1])t.push([r.slice(2),n??""]);else{for(const e of r.slice(1,r.length-1))t.push(["-"+e,""]);t.push(["-"+r[r.length-1],n??""])}}const o=new Map;for(const[e,r]of t){const t=(x.get(e)??e).toLowerCase(),s=$.get(t);if(!s)throw new Error(`unknown flag: ${e}`);let i;switch(s.type){case"string":i=r;break;case"number":i=Number.parseFloat(r);break;case"boolean":i=["","on","true","yes","y","1"].includes(r.toLowerCase())}if(s.multi){let e=o.get(t);e||(e=[],o.set(t,e)),e.push(i)}else{if(o.has(t))throw new Error(`multiple values for ${t}`);o.set(t,i)}}return o})(process.argv.slice(2));if(_.get("version")||_.get("help")){const r=JSON.parse(await e(t(o(new URL(import.meta.url).pathname),"package.json"),"utf-8"));process.stdout.write(`${r.name} ${r.version}\n`),_.get("help")&&process.stdout.write((F=r.name,["","HTTP/1.1 server for Node.js","","Serves the current directory on port 8080 by default.","When running, send SIGINT (Ctrl+C) to stop.","Send SIGHUP or press enter to reload config.","",` npx ${F} -- [dir] [flags]`,"","Options:"," --config-file=..., -c Path to a JSON configuration file to use (see below)"," --config-json=..., -C Inline JSON configuration to use (see below)",' --port=..., -p The port to bind to. Default "8080"',' --host=..., -a The host address to bind to. Default "localhost"',' --dir=... The directory to serve. Default "."'," --ext=... Implicit file extension to attempt if the requested file"," does not exist (can be specified multiple times)"," --404=... File to use for file-not-found, with status 404"," --spa=... File to use for file-not-found, with status 200"," (e.g. to serve an index file for Single-Page-Apps)"," --zstd, --zst Serve .zst files if zstd compression is requested"," --brotli, --br, -b Serve .br files if brotli compression is requested"," --gzip, --gz, -g Serve .gz files if gzip compression is requested"," --deflate Serve .deflate files if deflate compression is requested"," --proxy=..., -P Proxy requests which match no files to this server"," --mime=... Extra file-extension-to-mime-types to use, in the format",' "ext1=mime1;ext2=mime2" (e.g. "txt=text/plain")'," --mime-types=... Path to an Apache .types file of mime types to register"," --write-compressed Generate and save zstd, brotli, gzip, or deflate files"," for each served file before starting"," --min-compress=... The minimum number of bytes that compression must save,",' otherwise the file is not written. Default "300"'," --no-serve Stop after validating the configuration and optionally"," writing any compressed files",' --log=... "none" / "ready" / "progress" / "full". Set the logging',' level. "ready" prints only the "all servers ready" line,',' "progress" prints server startup and shutdown progress,',' and "full" logs all requests. Default "full"'," --help, -h Print this message and exit"," --version, -v Print the current version and exit","","JSON Configuration:","","JSON offers a more powerful way to configure the server. You can define one or","more servers (one per port), each with its own set of mounted handlers.","Example definition:",""," {",' "servers": ['," {",' "port": 9000,',' "mount": [',' { "type": "files", "dir": "." }',' { "type": "fixture", "method": "GET", "path": "/hello.txt", "body": "Hi!" }',' { "type": "proxy", "target": "https://example.com" }'," ]"," }"," ],",' "mime": ["foo=application/x-foo"],'," }","","All CLI flags are compatible with JSON configuration except --dir and --proxy.","--port is not compatible with JSON configurations with more than one server.","","MIME definitions:","","When defining mime types, some shorthands are available:","- multiple mappings separated by semicolons: foo=text/x-foo;bar=text/x-bar","- multiple file extensions separated by commas: foo,bar=text/plain","- use the file extension in the mime type with {ext}: css,csv=text/{ext}","- optional parts in brackets: jp(e)g,tif(f)=image/{ext}"," ({ext} always maps to the full name, so the example maps .jpg to image/jpeg)","","When using an apache .types file, each line contains a mime type, any amount of","whitespace, then a list of space-separated extensions (without a dot). Lines","starting with # are ignored as comments.","","Example usage:","",` npx ${F} . --port 3000 --gzip --mime="foo=text/x-foo" --mime="bar=text/x-bar"`,"",` npx ${F} /dev/null --proxy https://example.com`,"",` npx ${F} -C '{"servers":[{"port":8080,"mount":[{"type":"files","dir":"."}]}]}'`,"",` npx ${F} . --write-compressed --min-compress 500 --brotli --gzip`,"",` npx ${F} . --write-compressed --brotli --no-serve`]).join("\n")+"\n"),process.exit(0)}var F;(async()=>{const r=new q(U,W);process.on("unhandledRejection",()=>r.shutdown()),process.on("uncaughtException",()=>r.shutdown());const s=function(e){const t=o=>{const r=o.$ref;if(r&&r.startsWith("#/$defs/")){const t=e.$defs[r.substring(8)];if(!t)throw new Error(`unable to find ${r} in schema`);o={...t,...o}}const s=((e,t)=>{if(void 0!==e.const)return S(e.const);if(e.enum)return z(new Set(e.enum));if(e.anyOf)return k(e.anyOf.map(t));switch(e.type){case"array":return j(t(e.items));case"boolean":return N;case"integer":return E(!0,e.minimum,e.maximum);case"number":return E(!1,e.minimum,e.maximum);case"object":const o=e.additionalProperties??!0;return P(new Map(Object.entries(e.properties??{}).map(([e,o])=>[e,t(o)])),"object"==typeof o?t(o):o?T:J,e.required??[]);case"string":let r=null;return e.pattern&&(r=new RegExp(e.pattern)),O(r,e.format??"");default:throw new Error(`unknown part type ${JSON.stringify(e)}`)}})(o,t);if(void 0!==o.default){const e=JSON.stringify(o.default);return(t,o)=>s(void 0===t?JSON.parse(e):t,o)}return(e,t)=>void 0===e?void 0:s(e,t)};return t(e)}(await(async()=>JSON.parse(await e(t(o(new URL(import.meta.url).pathname),"schema.json"),"utf-8")))());function i(){process.stdin.destroy(),r.shutdown()}async function n(){const t=await(async(t,o)=>{const r=e=>o.get(e)??[],s=e=>o.get(e),i=e=>o.get(e),n=s("config-file"),a=s("config-json"),f=i("port"),c=s("host"),p=s("dir")||".",l=r("ext").map(e=>e.startsWith(".")?e:`.${e}`),h=s("404"),u=s("spa"),m=s("proxy"),d=i("min-compress"),g=r("mime"),w=r("mime-types"),y=s("log");if(Number(Boolean(n))+Number(Boolean(a))+Number(Boolean(m))>1)throw new Error("multiple config files are not supported");let b;if(n)b=t(JSON.parse(await e(n,"utf-8")),{file:n,path:""});else if(a)b=t(JSON.parse(a),{file:"",path:""});else{let e;u?e={statusCode:200,filePath:u}:h&&(e={statusCode:404,filePath:h});const o=[{type:"files",dir:p,options:{fallback:e}}];m&&o.push({type:"proxy",target:m}),b=t({servers:[{port:8080,mount:o}]},{file:"",path:""})}const x=1===b.servers.length?b.servers[0]:void 0;if(void 0!==f){if((0|f)!==f)throw new Error("port must be an integer");if(!x)throw new Error("cannot specify port on commandline when defining multiple servers");x.port=f}if(void 0!==c)for(const e of b.servers)e.host=c;const $=(e,t)=>{for(const o of b.servers)for(const r of o.mount)if("files"===r.type){r.options.negotiation??=[];let o=r.options.negotiation.find(t=>t.type===e);o||(o={type:e,options:[]},r.options.negotiation=[...r.options.negotiation,o]),o.options.find(e=>e.match===t.match)||o.options.push(t)}};for(const[e,t]of v)o.get(e)&&$("encoding",t);if(l.length)for(const e of b.servers)for(const t of e.mount)"files"===t.type&&(t.options.implicitSuffixes=l);switch((g.length||w.length)&&(Array.isArray(b.mime)||(b.mime?b.mime=[b.mime]:b.mime=[]),b.mime.push(...g),b.mime.push(...w.map(e=>`file://${e}`))),o.get("write-compressed")&&(b.writeCompressed=!0),void 0!==d&&(b.minCompress=d),o.get("no-serve")&&(b.noServe=!0),y){case"none":case"ready":case"progress":b.log=y;for(const e of b.servers)e.options.logRequests=!1;break;case"full":b.log="progress"}return b})(s,_);B=R.indexOf(t.log),await(async t=>{const o=[];for(const r of Array.isArray(t)?t:[t])"string"!=typeof r?o.push(new Map(Object.entries(r))):r.startsWith("file://")?o.push(g(await e(r.substring(7),"utf-8"))):o.push(w(r));y();for(const e of o)b(e)})(t.mime),t.writeCompressed&&await(async(e,t,o)=>{let r=0;for(const s of e)for(const e of s.mount)if("files"===e.type){const s=e.options.negotiation?.find(e=>"encoding"===e.type)?.options;if(!s?.length){o(2,`skipping ${e.dir} because no compression is configured`);continue}o(2,`compressing files in ${e.dir} using ${s.map(e=>e.match).join(", ")}`);const i=await d(e.dir,s,t),n=G(i.filter(({mime:e})=>e.startsWith("text/"))),a=G(i.filter(({mime:e})=>!e.startsWith("text/")));o(2,`text: ${H(n.rawSize)} / ${H(n.bestSize)} compressed`),o(2,`other: ${H(a.rawSize)} / ${H(a.bestSize)} compressed`),r+=n.created+a.created}o(2,`${((e,t,o=t+"s")=>1===e?`1 ${t}`:`${e} ${o}`)(r,"compressed file")} written`)})(t.servers,t.minCompress,U),t.noServe?i():r.set(t.servers)}function a(){return U(2,"refreshing config"),n()}n(),process.on("SIGHUP",()=>a()),process.stdin.on("data",e=>{e.includes("\n")&&a()}),process.on("SIGINT",()=>{U(2,""),i()})})();
|
|
2
|
+
import{readFile as e}from"node:fs/promises";import{join as t,dirname as o,resolve as r}from"node:path";import{createServer as s}from"node:http";import{Router as i,requestHandler as n,addTeardown as a,CONTINUE as f,proxy as c,fileServer as p,getSearch as l,getQuery as h,getPathParameter as u,WebListener as m,compressFilesInDir as d,readMimeTypes as g,decompressMime as w,resetMime as y,registerMime as b}from"./index.js";const x=new Map([["","dir"],["-a","host"],["-b","brotli"],["-c","config-file"],["-C","config-json"],["-d","dir"],["-e","ext"],["-g","gzip"],["-h","help"],["-p","port"],["-P","proxy"],["-v","version"],["br","brotli"],["gz","gzip"],["zst","zstd"]]),$=new Map([["config-file",{type:"string"}],["config-json",{type:"string"}],["dir",{type:"string"}],["ext",{type:"string",multi:!0}],["port",{type:"number"}],["host",{type:"string"}],["zstd",{type:"boolean"}],["brotli",{type:"boolean"}],["gzip",{type:"boolean"}],["deflate",{type:"boolean"}],["proxy",{type:"string"}],["404",{type:"string"}],["spa",{type:"string"}],["mime",{type:"string",multi:!0}],["mime-types",{type:"string",multi:!0}],["write-compressed",{type:"boolean"}],["min-compress",{type:"number"}],["no-serve",{type:"boolean"}],["log",{type:"string"}],["help",{type:"boolean"}],["version",{type:"boolean"}]]),v=new Map([["zstd",{match:"zstd",file:"{file}.zst"}],["brotli",{match:"br",file:"{file}.br"}],["gzip",{match:"gzip",file:"{file}.gz"}],["deflate",{match:"deflate",file:"{file}.deflate"}]]);const S=e=>(t,o)=>{if(t!==e)throw new A(`expected ${JSON.stringify(e)}`,o,8);return e},z=e=>(t,o)=>{if(!e.has(t))throw new A(`expected one of ${JSON.stringify(e)}`,o,7);return t},k=e=>(t,o)=>{const r=[];let s=9;for(const i of e)try{return i(t,o)}catch(e){if(e instanceof A){if(e.p>s)continue;e.p!==s&&(s=e.p,r.length=0)}else s=-1;r.push(e)}throw 1===r.length?r[0]:new AggregateError(r)},j=e=>(t,o)=>{if(!Array.isArray(t))throw new A("expected list, got "+typeof t,o);return t.map((t,r)=>e(t,{...o,path:`${o.path}[${r}]`}))},N=(e,t)=>{if("boolean"!=typeof e)throw new A("expected boolean, got "+typeof e,t);return e},E=(e,t,o)=>(r,s)=>{if("number"!=typeof r)throw new A("expected number, got "+typeof r,s);if(e&&(0|r)!==r)throw new A(`expected integer, got ${r}`,s);if("number"==typeof t&&r<t)throw new A(`value cannot be less than ${t}`,s);if("number"==typeof o&&r>o)throw new A(`value cannot be greater than ${o}`,s);return r},O=(e,t)=>(s,i)=>{if("string"!=typeof s)throw new A("expected string, got "+typeof s,i);if(e&&!e.test(s))throw new A(`expected string matching ${e}`,i);if("uri-reference"===t&&i.file){if(s.startsWith("file://"))return"file://"+r(o(i.file),s.substring(7));if(!s.includes("://"))return r(o(i.file),s)}return s},P=(e,t,o)=>(r,s)=>{if("object"!=typeof r)throw new A("expected object, got "+typeof r,s);if(!r)throw new A("expected object, got null",s);if(Array.isArray(r))throw new A("expected object, got list",s);const i={},n=new Set;for(const[o,a]of Object.entries(r)){n.add(o);const r=(e.get(o)??t)(a,{...s,path:`${s.path}.${o}`});void 0!==r&&(i[o]=r)}for(const e of o)if(void 0===i[e])throw new A(`missing required property ${JSON.stringify(e)}`,s);for(const[t,o]of e)if(!n.has(t)){const e=o(void 0,{...s,path:`${s.path}.${t}`});void 0!==e&&(i[t]=e)}return i},T=e=>e,J=(e,t)=>{throw new A("unknown property",t)};class A extends Error{constructor(e,t,o=0){super(`${e} at ${t.path||"root"}`),this.p=o}}function I(e,t){return t.replaceAll(/\$\{([^${}:]+)(?::-(([^}\\]|\\.)*))?\}/g,(t,o,r)=>{let s;return s="?"===o?l(e):"?"===o[0]?h(e,o.substring(1)):u(e,o),"string"==typeof s?s:Array.isArray(s)?s.join("/"):r??""})}class q{constructor(e,t){this.t=!1,this.o=!1,this.i=!1,this.l=e,this.h=t,this.u=new Map}async set(e){if(!this.o&&!this.i)try{this.o=!0;const t=new Set,o=[];for(let r=0;r<e.length;++r){const s=e[r],i=s.port;i<=0||i>65535?this.l(0,`servers[${r}] must have a specific port from 1 to 65535`):t.has(i)?this.l(0,`skipping servers[${r}] because port ${i} has already been defined`):(t.add(i),o.push(async()=>{const e=await this.m(s,this.u.get(i));e?this.u.set(i,e):this.u.delete(i)}))}this.t||=o.length>0;for(const[e,r]of this.u)t.has(e)||(o.push(r.close),this.u.delete(e));await Promise.all(o.map(e=>e())),this.i?this.$():this.u.size?this.l(1,"all servers ready"):this.l(1,"no servers configured")}finally{this.o=!1}}async m({port:e,host:t,options:o,mount:r},l){const h=this.h("34",`http://${t}:${e}`),u=await(async(e,t=()=>{})=>{const o=new i;o.use(n((e,o)=>{const r=Date.now();return a(e,()=>{const s=Date.now()-r;t({method:e.method??"GET",path:e.url??"/",status:o.statusCode,duration:s})}),f}));for(const t of e)switch(t.type){case"files":"/dev/null"!==t.dir&&o.mount(t.path,await p(t.dir,t.options));break;case"proxy":o.mount(t.path,c(t.target,t.options));break;case"fixture":const e=(e,o)=>{for(const[r,s]of Object.entries(t.headers))"string"==typeof s?o.setHeader(r,I(e,s)):"number"==typeof s?o.setHeader(r,s):o.setHeader(r,s.map(t=>I(e,t)));o.statusCode=t.status,o.end(I(e,t.body))};"GET"===t.method&&o.onRequest("HEAD",t.path,e),o.onRequest(t.method,t.path,e);break;case"redirect":o.at(t.path,n((e,o)=>{o.setHeader("location",I(e,t.target)),o.statusCode=t.status,o.end()}))}return o})(r,o.logRequests?e=>{const t=this.h("1",e.method.replaceAll(/[^a-zA-Z0-9\-_]/g,"?")),o=encodeURI(e.path),r=this.h(C[e.status/100|0]??"",String(e.status)),s=this.h("2",`(${e.duration}ms)`);this.l(0,`${h} ${t} ${o} ${r} ${s}`)}:()=>{}),d=new m(u);let g,w;if(d.addEventListener("error",({detail:{action:e,error:t,request:o}})=>{this.l(0,`${h} ${this.h("91","error")}: ${e} ${o?.url} ${t}`)}),l&&t===l.host&&((e,t)=>{for(const o of M)if(e[o]!==t[o])return!1;return!0})(o,l.options))g=l.server,this.l(2,`${h} updated`),l.detach();else{if(l?(this.l(2,`${h} ${this.h("2","restarting (step 1: shutdown)")}`),await l.close(),this.l(2,`${h} ${this.h("2","restarting (step 2: start)")}`)):this.l(2,`${h} ${this.h("2","starting")}`),this.i)return;g=s(o),g.setTimeout(o.socketTimeout),w=D(g,e,t,o.backlog)}const y=d.attach(g,o);return w&&(await w,await new Promise(e=>setTimeout(e,0)),this.l(2,`${h} ready`)),{host:t,options:o,server:g,detach:()=>y("restart",o.restartTimeout),close:()=>new Promise(e=>{g.close(()=>{this.l(2,`${h} closed`),e()});const t=y("shutdown",o.shutdownTimeout,!0).countConnections();t>0&&this.l(2,`${h} ${this.h("2",`closing (remaining connections: ${t})`)}`)})}}async $(){this.u.size&&(this.l(2,this.h("2","shutting down")),await Promise.all([...this.u.values()].map(e=>e.close()))),this.t&&this.l(2,"shutdown complete")}shutdown(){this.i||(this.i=!0,this.o||this.$())}}const C=["","37","32","36","31","41;97"],D=async(e,t,o,r=511)=>new Promise((s,i)=>{e.once("error",i),e.listen(t,o,r,()=>{e.off("error",i),s()})}),M=["requestTimeout","keepAliveTimeout","keepAliveTimeoutBuffer","connectionsCheckingInterval","headersTimeout","highWaterMark","maxHeaderSize","noDelay","requireHostHeader","keepAlive","keepAliveInitialDelay","uniqueHeaders","backlog","socketTimeout"];function G(e){return e.reduce((e,t)=>({rawSize:e.rawSize+t.rawSize,bestSize:e.bestSize+t.bestSize,created:e.created+t.created}),{rawSize:0,bestSize:0,created:0})}const H=e=>e<2e3?`${e}B`.padStart(8," "):`${(e/1024).toFixed(1)}kB`.padStart(8," "),R=["none","ready","progress"];process.on("SIGUSR1",()=>{});let B=2;const U=(e,t)=>e<=B&&process.stderr.write(t+"\n");function L(e){process.stdin.destroy(),U(0,e instanceof Error?e.message:String(e))}process.on("unhandledRejection",L),process.on("uncaughtException",L);const W=process.stderr.isTTY&&!process.env.NO_COLOR?(e,t)=>e?`\x1b[${e}m${t}\x1b[0m`:t:(e,t)=>t,_=(e=>{const t=[];for(let o=0;o<e.length;++o){const r=e[o];if("--"===r)continue;const s=/^--([^ =\-][^ =]*)=(.*)$/.exec(r);if(s){t.push([s[1],s[2]]);continue}const i=/^-([^ =]*)([^ =])=(.*)$/.exec(r);if(i&&"-"!==r[1]){for(const e of i[1])t.push(["-"+e,""]);t.push(["-"+i[2],i[3]]);continue}if("-"!==r[0]||"-"===r){if(0!==o)throw new Error(`value without key: ${r}`);t.push(["",r]);continue}let n=e[o+1];if(n&&"-"===n[0]&&n.length>1&&(n=void 0),void 0!==n&&++o,"-"===r[1])t.push([r.slice(2),n??""]);else{for(const e of r.slice(1,r.length-1))t.push(["-"+e,""]);t.push(["-"+r[r.length-1],n??""])}}const o=new Map;for(const[e,r]of t){const t=(x.get(e)??e).toLowerCase(),s=$.get(t);if(!s)throw new Error(`unknown flag: ${e}`);let i;switch(s.type){case"string":i=r;break;case"number":i=Number.parseFloat(r);break;case"boolean":i=["","on","true","yes","y","1"].includes(r.toLowerCase())}if(s.multi){let e=o.get(t);e||(e=[],o.set(t,e)),e.push(i)}else{if(o.has(t))throw new Error(`multiple values for ${t}`);o.set(t,i)}}return o})(process.argv.slice(2));if(_.get("version")||_.get("help")){const r=JSON.parse(await e(t(o(new URL(import.meta.url).pathname),"package.json"),"utf-8"));process.stdout.write(`${r.name} ${r.version}\n`),_.get("help")&&process.stdout.write((F=r.name,["","HTTP/1.1 server for Node.js","","Serves the current directory on port 8080 by default.","When running, send SIGINT (Ctrl+C) to stop.","Send SIGHUP or press enter to reload config.","",` npx ${F} -- [dir] [flags]`,"","Options:"," --config-file=..., -c Path to a JSON configuration file to use (see below)"," --config-json=..., -C Inline JSON configuration to use (see below)",' --port=..., -p The port to bind to. Default "8080"',' --host=..., -a The host address to bind to. Default "localhost"',' --dir=... The directory to serve. Default "."'," --ext=... Implicit file extension to attempt if the requested file"," does not exist (can be specified multiple times)"," --404=... File to use for file-not-found, with status 404"," --spa=... File to use for file-not-found, with status 200"," (e.g. to serve an index file for Single-Page-Apps)"," --zstd, --zst Serve .zst files if zstd compression is requested"," --brotli, --br, -b Serve .br files if brotli compression is requested"," --gzip, --gz, -g Serve .gz files if gzip compression is requested"," --deflate Serve .deflate files if deflate compression is requested"," --proxy=..., -P Proxy requests which match no files to this server"," --mime=... Extra file-extension-to-mime-types to use, in the format",' "ext1=mime1;ext2=mime2" (e.g. "txt=text/plain")'," --mime-types=... Path to an Apache .types file of mime types to register"," --write-compressed Generate and save zstd, brotli, gzip, or deflate files"," for each served file before starting"," --min-compress=... The minimum number of bytes that compression must save,",' otherwise the file is not written. Default "300"'," --no-serve Stop after validating the configuration and optionally"," writing any compressed files",' --log=... "none" / "ready" / "progress" / "full". Set the logging',' level. "ready" prints only the "all servers ready" line,',' "progress" prints server startup and shutdown progress,',' and "full" logs all requests. Default "full"'," --help, -h Print this message and exit"," --version, -v Print the current version and exit","","JSON Configuration:","","JSON offers a more powerful way to configure the server. You can define one or","more servers (one per port), each with its own set of mounted handlers.","Example definition:",""," {",' "servers": ['," {",' "port": 9000,',' "mount": [',' { "type": "files", "dir": "." }',' { "type": "fixture", "method": "GET", "path": "/hello.txt", "body": "Hi!" }',' { "type": "proxy", "target": "https://example.com" }'," ]"," }"," ],",' "mime": ["foo=application/x-foo"],'," }","","All CLI flags are compatible with JSON configuration except --dir and --proxy.","--port is not compatible with JSON configurations with more than one server.","","MIME definitions:","","When defining mime types, some shorthands are available:","- multiple mappings separated by semicolons: foo=text/x-foo;bar=text/x-bar","- multiple file extensions separated by commas: foo,bar=text/plain","- use the file extension in the mime type with {ext}: css,csv=text/{ext}","- optional parts in brackets: jp(e)g,tif(f)=image/{ext}"," ({ext} always maps to the full name, so the example maps .jpg to image/jpeg)","","When using an apache .types file, each line contains a mime type, any amount of","whitespace, then a list of space-separated extensions (without a dot). Lines","starting with # are ignored as comments.","","Example usage:","",` npx ${F} . --port 3000 --gzip --mime="foo=text/x-foo" --mime="bar=text/x-bar"`,"",` npx ${F} /dev/null --proxy https://example.com`,"",` npx ${F} -C '{"servers":[{"port":8080,"mount":[{"type":"files","dir":"."}]}]}'`,"",` npx ${F} . --write-compressed --min-compress 500 --brotli --gzip`,"",` npx ${F} . --write-compressed --brotli --no-serve`]).join("\n")+"\n"),process.exit(0)}var F;(async()=>{const r=new q(U,W);process.on("unhandledRejection",()=>r.shutdown()),process.on("uncaughtException",()=>r.shutdown());const s=function(e){const t=o=>{const r=o.$ref;if(r&&r.startsWith("#/$defs/")){const t=e.$defs[r.substring(8)];if(!t)throw new Error(`unable to find ${r} in schema`);o={...t,...o}}const s=((e,t)=>{if(void 0!==e.const)return S(e.const);if(e.enum)return z(new Set(e.enum));if(e.anyOf)return k(e.anyOf.map(t));switch(e.type){case"array":return j(t(e.items));case"boolean":return N;case"integer":return E(!0,e.minimum,e.maximum);case"number":return E(!1,e.minimum,e.maximum);case"object":const o=e.additionalProperties??!0;return P(new Map(Object.entries(e.properties??{}).map(([e,o])=>[e,t(o)])),"object"==typeof o?t(o):o?T:J,e.required??[]);case"string":let r=null;return e.pattern&&(r=new RegExp(e.pattern)),O(r,e.format??"");default:throw new Error(`unknown part type ${JSON.stringify(e)}`)}})(o,t);if(void 0!==o.default){const e=JSON.stringify(o.default);return(t,o)=>s(void 0===t?JSON.parse(e):t,o)}return(e,t)=>void 0===e?void 0:s(e,t)};return t(e)}(await(async()=>JSON.parse(await e(t(o(new URL(import.meta.url).pathname),"schema.json"),"utf-8")))());function i(){process.stdin.destroy(),r.shutdown()}async function n(){const t=await(async(t,o)=>{const r=e=>o.get(e)??[],s=e=>o.get(e),i=e=>o.get(e),n=s("config-file"),a=s("config-json"),f=i("port"),c=s("host"),p=s("dir")||".",l=r("ext").map(e=>e.startsWith(".")?e:`.${e}`),h=s("404"),u=s("spa"),m=s("proxy"),d=i("min-compress"),g=r("mime"),w=r("mime-types"),y=s("log");if(Number(Boolean(n))+Number(Boolean(a))+Number(Boolean(m))>1)throw new Error("multiple config files are not supported");let b;if(n)b=t(JSON.parse(await e(n,"utf-8")),{file:n,path:""});else if(a)b=t(JSON.parse(a),{file:"",path:""});else{let e;u?e={statusCode:200,filePath:u}:h&&(e={statusCode:404,filePath:h});const o=[{type:"files",dir:p,options:{fallback:e}}];m&&o.push({type:"proxy",target:m}),b=t({servers:[{port:8080,mount:o}]},{file:"",path:""})}const x=1===b.servers.length?b.servers[0]:void 0;if(void 0!==f){if((0|f)!==f)throw new Error("port must be an integer");if(!x)throw new Error("cannot specify port on commandline when defining multiple servers");x.port=f}if(void 0!==c)for(const e of b.servers)e.host=c;const $=(e,t)=>{for(const o of b.servers)for(const r of o.mount)if("files"===r.type){r.options.negotiation??=[];let o=r.options.negotiation.find(t=>t.type===e);o||(o={type:e,options:[]},r.options.negotiation=[...r.options.negotiation,o]),o.options.find(e=>e.match===t.match)||o.options.push(t)}};for(const[e,t]of v)o.get(e)&&$("encoding",t);if(l.length)for(const e of b.servers)for(const t of e.mount)"files"===t.type&&(t.options.implicitSuffixes=l);switch((g.length||w.length)&&(Array.isArray(b.mime)||(b.mime?b.mime=[b.mime]:b.mime=[]),b.mime.push(...g),b.mime.push(...w.map(e=>`file://${e}`))),o.get("write-compressed")&&(b.writeCompressed=!0),void 0!==d&&(b.minCompress=d),o.get("no-serve")&&(b.noServe=!0),y){case"none":case"ready":case"progress":b.log=y;for(const e of b.servers)e.options.logRequests=!1;break;case"full":b.log="progress"}return b})(s,_);B=R.indexOf(t.log),await(async t=>{const o=[];for(const r of Array.isArray(t)?t:[t])"string"!=typeof r?o.push(new Map(Object.entries(r))):r.startsWith("file://")?o.push(g(await e(r.substring(7),"utf-8"))):o.push(w(r));y();for(const e of o)b(e)})(t.mime),t.writeCompressed&&await(async(e,t,o)=>{let r=0;for(const s of e)for(const e of s.mount)if("files"===e.type){const s=e.options.negotiation?.find(e=>"encoding"===e.type)?.options;if(!s?.length){o(2,`skipping ${e.dir} because no compression is configured`);continue}o(2,`compressing files in ${e.dir} using ${s.map(e=>e.match).join(", ")}`);const i=await d(e.dir,s,t),n=G(i.filter(({mime:e})=>e.startsWith("text/"))),a=G(i.filter(({mime:e})=>!e.startsWith("text/")));o(2,`text: ${H(n.rawSize)} / ${H(n.bestSize)} compressed`),o(2,`other: ${H(a.rawSize)} / ${H(a.bestSize)} compressed`),r+=n.created+a.created}o(2,`${((e,t,o=t+"s")=>1===e?`1 ${t}`:`${e} ${o}`)(r,"compressed file")} written`)})(t.servers,t.minCompress,U),t.noServe?i():r.set(t.servers)}function a(){return U(2,"refreshing config"),n()}n(),process.on("SIGHUP",()=>a()),process.stdin.on("data",e=>{e.includes("\n")&&a()}),process.on("SIGINT",()=>{U(2,""),i()})})();
|