@interopio/gateway-server 0.19.4 → 0.20.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.
@@ -0,0 +1,2 @@
1
+ var B=Object.defineProperty;var x=(s,e)=>{for(var r in e)B(s,r,{get:e[r],enumerable:!0})};var K={};x(K,{ARGON2_VERSION:()=>O,ARGON2_VERSION_10:()=>N,ARGON2_VERSION_13:()=>k,DEFAULT_ALGORITHM:()=>G,DEFAULT_HASH_LENGTH:()=>R,DEFAULT_MEMORY:()=>S,DEFAULT_PARALLELISM:()=>P,DEFAULT_PASSES:()=>L,DEFAULT_SALT_LENGTH:()=>w,createHash:()=>$,decode:()=>U,encode:()=>H,hash:()=>V,verify:()=>W});var D={};x(D,{createSalt:()=>h});import{getRandomValues as M}from"node:crypto";function h(s){return M(Buffer.alloc(s))}var E;async function F(){if(E===void 0)try{let s=await import("node:crypto");if(!s.argon2)throw new Error("argon2 not available");E=s.argon2}catch{throw new Error("argon2 is not available in this Node.js version. Node.js 24.7.0 or later is required for Argon2 password encoding. Please upgrade Node.js or use a different authentication method.")}return E}var N=16,k=19,O=k,G="argon2id",w=16,R=32,P=4,S=65536,L=3;function U(s){let e=s.split("$");if(e.length<4)throw new Error("Invalid encoded Argon2 hash");let r=1,t=e[r++];if(t!=="argon2d"&&t!=="argon2i"&&t!=="argon2id")throw new Error("Invalid Argon2 type");let n=N;e[r].startsWith("v=")&&(n=parseInt(e[r].substring(2),10),r++);let a={},c=e[r++].split(",");for(let g of c){let[o,i]=g.split("=");switch(o){case"m":a.memory=parseInt(i,10);break;case"t":a.passes=parseInt(i,10);break;case"p":a.parallelism=parseInt(i,10);break}}a.nonce=Buffer.from(e[r++],"base64url");let l=Buffer.from(e[r++],"base64url");return{algorithm:t,version:n,parameters:a,hash:l}}function H(s){let{algorithm:e,version:r,parameters:t,hash:n}=s;return`$${e}$v=${r}$m=${t.memory},t=${t.passes},p=${t.parallelism}$${t.nonce.toString("base64url")}$${n.toString("base64url")}`}async function $(s,e,r,t){let n=t?.nonce??h(w),a=t?.memory??S,c=t?.passes??L,l=t?.parallelism??P,g={message:e,tagLength:r,nonce:n,memory:a,passes:c,parallelism:l},o=await F();return new Promise((i,p)=>{o(s,g,(d,f)=>{d?p(d):f?i(Buffer.from(f)):p(new Error("argon2 returned no result"))})})}async function V(s,e){let r=e?.algorithm??"argon2id",t=e?.saltLength??w,n=e?.hashLength??R,a=e?.parallelism??P,c=e?.memory??S,l=e?.passes??L,g=h(t),o={memory:c,passes:l,parallelism:a,nonce:g},i=await $(r,s,n,o);return H({algorithm:r,version:O,parameters:o,hash:i})}async function W(s,e){try{let r=U(s),t=await $(r.algorithm,e,r.hash.length,r.parameters);return r.hash.equals(t)}catch{return!1}}var j={};x(j,{DEFAULT_CA_NAME:()=>T,generateCert:()=>Q,generateRootCA:()=>z});import{KEYUTIL as u,KJUR as _,datetozulu as A}from"jsrsasign";import{userInfo as J,hostname as q}from"node:os";import{randomBytes as Y}from"node:crypto";var y=`${J().username}@${q()}`;function I(){return Y(16).toString("hex")}var b="io.Gateway Dev CA",T=`${b} ${y}`;function z(s){let e=s?.name||T,r=s?.passphrase,t=u.generateKeypair("EC","secp384r1"),n=t.prvKeyObj,a=t.pubKeyObj,c=r?u.getPEM(n,"PKCS8PRV",r,"AES-256-CBC"):u.getPEM(n,"PKCS8PRV"),g=new _.asn1.x509.Certificate({version:3,serial:{hex:I()},issuer:{str:`/CN=${e}/O=${b}/OU=${y}`},subject:{str:`/CN=${e}/O=${b}/OU=${y}`},notbefore:A(new Date(Date.now()-60*1e3),!1,!1),notafter:A(new Date(Date.now()+10*365*24*60*60*1e3),!1,!1),sbjpubkey:a,ext:[{extname:"basicConstraints",critical:!0,cA:!0},{extname:"keyUsage",critical:!0,names:["keyCertSign"]}],sigalg:"SHA384withECDSA",cakey:n}).getPEM();return{key:c,cert:g}}function Q(s,e,r,t=!1,n=7){let a=u.generateKeypair("EC","secp256r1"),c=a.prvKeyObj,l=a.pubKeyObj,g=u.getPEM(c,"PKCS8PRV"),o=[],i=t?"dev-user":"localhost";for(let m of r)if(m.toLowerCase().startsWith("ip:"))o.push({ip:m.substring(3)});else if(m.toLowerCase().startsWith("email:"))o.push({rfc822:m.substring(6)});else{let v=m.toLowerCase().startsWith("dns:");if(t)i=v?m.substring(4):m;else{let C=v?m.substring(4):m;o.push({dns:C}),o.length===1&&(i=C)}}let p=[{extname:"basicConstraints",cA:!1},{extname:"keyUsage",critical:!0,names:["digitalSignature","keyEncipherment"]},{extname:"extKeyUsage",array:[t?"clientAuth":"serverAuth"]}];o.length>0&&p.push({extname:"subjectAltName",array:o});let f=new _.asn1.x509.Certificate({version:3,serial:{hex:I()},issuer:{str:e},subject:{str:`/CN=${i}/O=${b}/OU=${y}`},notbefore:A(new Date(Date.now()-60*1e3),!1,!1),notafter:A(new Date(Date.now()+n*24*60*60*1e3),!1,!1),sbjpubkey:l,ext:p,sigalg:"SHA256withECDSA",cakey:s}).getPEM();return{key:g,cert:f}}export{K as argon2,D as keygen,j as mkcert};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/tools/crypto/argon2.ts", "../../src/tools/crypto/keygen.ts", "../../src/tools/mkcert.ts"],
4
+ "sourcesContent": ["import type {\n Argon2Algorithm,\n Argon2Parameters\n} from 'node:crypto';\n\nimport { createSalt } from './keygen.ts';\nimport type { Argon2Hash, Argon2HashParameters } from '../../../types/crypto/argon2';\n\n// Lazy import for argon2 (added in Node.js 24.7.0)\n// This allows the module to load on older Node.js versions\nlet argon2: typeof import('node:crypto').argon2 | undefined;\n\nasync function getArgon2() {\n if (argon2 === undefined) {\n try {\n const crypto = await import('node:crypto');\n if (!crypto.argon2) {\n throw new Error('argon2 not available');\n }\n argon2 = crypto.argon2;\n } catch (err) {\n throw new Error(\n 'argon2 is not available in this Node.js version. ' +\n 'Node.js 24.7.0 or later is required for Argon2 password encoding. ' +\n 'Please upgrade Node.js or use a different authentication method.'\n );\n }\n }\n return argon2;\n}\n\n// Argon2 version constants\nexport const ARGON2_VERSION_10 = 0x10; // 16\nexport const ARGON2_VERSION_13 = 0x13; // 19\nexport const ARGON2_VERSION = ARGON2_VERSION_13;\n\n// Default parameters for Argon2 hashing\nexport const DEFAULT_ALGORITHM: Argon2Algorithm = 'argon2id';\nexport const DEFAULT_SALT_LENGTH = 16;\nexport const DEFAULT_HASH_LENGTH = 32;\nexport const DEFAULT_PARALLELISM = 4;\nexport const DEFAULT_MEMORY = 65536; // 64 MB in KiB\nexport const DEFAULT_PASSES = 3;\n\n/**\n * Decode an encoded Argon2 hash string into its components.\n * Format: $argon2id$v=19$m=65536,t=3,p=4$base64salt$base64hash\n *\n * @param encodedHash - The encoded Argon2 hash string\n * @returns Decoded hash components\n * @see https://github.com/P-H-C/phc-winner-argon2/blob/master/src/encoding.c#L244\n */\nexport function decode(encodedHash: string): Argon2Hash {\n const parts = encodedHash.split('$'); // ['', 'argon2id', 'v=19', 'm=65536,t=3,p=4', 'base64salt', 'base64hash']\n if (parts.length < 4) {\n throw new Error('Invalid encoded Argon2 hash');\n }\n let current = 1;\n const algorithm = parts[current++];\n if (algorithm !== 'argon2d' && algorithm !== 'argon2i' && algorithm !== 'argon2id') {\n throw new Error('Invalid Argon2 type');\n }\n let version = ARGON2_VERSION_10;\n if (parts[current].startsWith('v=')) {\n version = parseInt(parts[current].substring(2), 10);\n current++;\n }\n const parameters: Partial<Argon2HashParameters> = {};\n const paramsParts = parts[current++].split(',');\n\n for (const param of paramsParts) {\n const [key, value] = param.split('=');\n switch (key) {\n case 'm':\n parameters.memory = parseInt(value, 10);\n break;\n case 't':\n parameters.passes = parseInt(value, 10);\n break;\n case 'p':\n parameters.parallelism = parseInt(value, 10);\n break;\n }\n }\n parameters.nonce = Buffer.from(parts[current++], 'base64url');\n const hash = Buffer.from(parts[current++], 'base64url');\n\n return { algorithm, version, parameters: parameters as Argon2Hash['parameters'], hash };\n}\n\n/**\n * Encode Argon2 hash components into a standard string format.\n * Format: $argon2id$v=19$m=65536,t=3,p=4$base64salt$base64hash\n *\n * @param hashData - The hash components to encode\n * @returns Encoded hash string\n */\nexport function encode(hashData: Argon2Hash): string {\n const { algorithm, version, parameters, hash } = hashData;\n return `$${algorithm}$v=${version}$m=${parameters.memory},t=${parameters.passes},p=${parameters.parallelism}$${parameters.nonce.toString('base64url')}$${hash.toString('base64url')}`;\n}\n\n\n/**\n * Create an Argon2 hash from parameters.\n * Low-level wrapper around node:crypto's argon2.\n *\n * @param algorithm - Argon2 algorithm variant ('argon2d' | 'argon2i' | 'argon2id')\n * @param password - The password to hash\n * @param hashLength - Length of the output hash in bytes\n * @param parameters - Argon2 parameters (nonce, memory, passes, parallelism). If not provided, defaults will be used.\n * @returns The hash buffer\n */\nexport async function createHash(\n algorithm: Argon2Algorithm,\n password: string,\n hashLength: number,\n parameters?: Argon2Hash['parameters']\n): Promise<Buffer> {\n const nonce = parameters?.nonce ?? createSalt(DEFAULT_SALT_LENGTH);\n const memory = parameters?.memory ?? DEFAULT_MEMORY;\n const passes = parameters?.passes ?? DEFAULT_PASSES;\n const parallelism = parameters?.parallelism ?? DEFAULT_PARALLELISM;\n\n const argon2Params: Argon2Parameters = {\n message: password,\n tagLength: hashLength,\n nonce,\n memory,\n passes,\n parallelism\n };\n const argon2Fn = await getArgon2();\n\n // Wrap callback-based argon2 in a Promise\n return new Promise((resolve, reject) => {\n argon2Fn(algorithm, argon2Params, (err: Error | null, result?: Uint8Array) => {\n if (err) {\n reject(err);\n }\n else if (result) {\n resolve(Buffer.from(result));\n }\n else {\n reject(new Error('argon2 returned no result'));\n }\n });\n });\n}\n\n\n/**\n * Hash a password using Argon2.\n *\n * @param password - The plain text password to hash\n * @param options - Optional parameters object. If not provided, defaults will be used.\n * @returns The encoded Argon2 hash string\n */\nexport async function hash(\n password: string,\n options?: {\n algorithm?: Argon2Algorithm;\n saltLength?: number;\n hashLength?: number;\n parallelism?: number;\n memory?: number;\n passes?: number;\n }\n): Promise<string> {\n const algorithm = options?.algorithm ?? 'argon2id';\n const saltLength = options?.saltLength ?? DEFAULT_SALT_LENGTH;\n const hashLength = options?.hashLength ?? DEFAULT_HASH_LENGTH;\n const parallelism = options?.parallelism ?? DEFAULT_PARALLELISM;\n const memory = options?.memory ?? DEFAULT_MEMORY;\n const passes = options?.passes ?? DEFAULT_PASSES;\n\n const nonce = createSalt(saltLength);\n const parameters = { memory, passes, parallelism, nonce };\n const hashBuffer = await createHash(algorithm, password, hashLength, parameters);\n return encode({\n algorithm,\n version: ARGON2_VERSION,\n parameters,\n hash: hashBuffer\n });\n}\n\n/**\n * Verify a password against an Argon2 hash.\n *\n * @param encodedHash - The encoded Argon2 hash to verify against\n * @param password - The plain text password to verify\n * @returns true if password matches the hash, false otherwise\n */\nexport async function verify(encodedHash: string, password: string): Promise<boolean> {\n try {\n const decoded = decode(encodedHash);\n const hashBuffer = await createHash(\n decoded.algorithm,\n password,\n decoded.hash.length,\n decoded.parameters\n );\n return decoded.hash.equals(hashBuffer);\n } catch {\n return false;\n }\n}\n\n", "import { getRandomValues } from 'node:crypto';\n\n/**\n * Create a random salt (nonce) for cryptographic operations.\n *\n * @param length - Length of the salt in bytes\n * @returns Random salt buffer\n */\nexport function createSalt(length: number): Buffer {\n return getRandomValues(Buffer.alloc(length));\n}\n\n", "import { KEYUTIL, KJUR, RSAKey, datetozulu } from \"jsrsasign\";\nimport { userInfo, hostname } from 'node:os';\nimport { randomBytes } from 'node:crypto';\n\nconst userAndHost = `${userInfo().username}@${hostname()}`;\n\nfunction randomSerialNumber(): string {\n const bytes = randomBytes(16);\n return bytes.toString('hex');\n}\n\nconst DEFAULT_ORGANISATION = `io.Gateway Dev CA`;\nexport const DEFAULT_CA_NAME = `${DEFAULT_ORGANISATION} ${userAndHost}`;\n\nexport function generateRootCA(options?: { name?: string, passphrase?: string } ): { key: string, cert: string } {\n\n const commonName = options?.name || DEFAULT_CA_NAME;\n const passphrase = options?.passphrase;\n\n // STEP 1. generate a key pair for Root CA (secp384r1 for higher security)\n const kp = KEYUTIL.generateKeypair(\"EC\", \"secp384r1\");\n const prv = kp.prvKeyObj;\n const pub = kp.pubKeyObj;\n\n const prvPem = passphrase\n ? KEYUTIL.getPEM(prv, \"PKCS8PRV\", passphrase, \"AES-256-CBC\")\n : KEYUTIL.getPEM(prv, \"PKCS8PRV\");\n\n // STEP 2: create self-signed CA certificate\n const cert = new KJUR.asn1.x509.Certificate({\n version: 3,\n serial: { hex: randomSerialNumber() },\n issuer: { str: `/CN=${commonName}/O=${DEFAULT_ORGANISATION}/OU=${userAndHost}` },\n subject: { str: `/CN=${commonName}/O=${DEFAULT_ORGANISATION}/OU=${userAndHost}` },\n\n notbefore: datetozulu(new Date(Date.now() - 60 * 1000), false, false),\n notafter: datetozulu(new Date(Date.now() + 10 * 365 * 24 * 60 * 60 * 1000), false, false), // 10 years\n\n sbjpubkey: pub,\n\n ext: [\n {extname: \"basicConstraints\", critical: true, cA: true},\n {extname: \"keyUsage\", critical: true, names: [\"keyCertSign\"]}\n ],\n\n sigalg: \"SHA384withECDSA\",\n cakey: prv\n });\n\n const certPem = cert.getPEM();\n\n return {\n key: prvPem,\n cert: certPem\n };\n}\n\n\n/**\n * Generate a certificate with custom SAN entries\n * @param cakey - CA private key\n * @param issuer - Issuer DN string\n * @param sanEntries - Array of SAN entry strings (e.g., \"localhost\", \"IP:192.168.1.1\", \"EMAIL:user@example.com\")\n * @param isClient - Generate client cert (clientAuth) vs server cert (serverAuth)\n * @param validityDays - Certificate validity period\n */\nexport function generateCert(\n cakey: string | RSAKey | KJUR.crypto.DSA | KJUR.crypto.ECDSA,\n issuer: string,\n sanEntries: string[],\n isClient: boolean = false,\n validityDays: number = 7\n): {\n key: string,\n cert: string\n} {\n // STEP 1. generate key pair (secp256r1 for faster generation)\n const kp = KEYUTIL.generateKeypair(\"EC\", \"secp256r1\");\n const prv = kp.prvKeyObj;\n const pub = kp.pubKeyObj;\n\n const prvPem = KEYUTIL.getPEM(prv, \"PKCS8PRV\");\n\n // Parse SAN entries\n const sanArray: Array<{dns?: string, ip?: string, rfc822?: string}> = [];\n let commonName = isClient ? 'dev-user' : 'localhost';\n\n for (const entry of sanEntries) {\n if (entry.toLowerCase().startsWith('ip:')) {\n sanArray.push({ip: entry.substring(3)});\n }\n else if (entry.toLowerCase().startsWith('email:')) {\n sanArray.push({rfc822: entry.substring(6)});\n }\n else {\n const dnsPrefixed = entry.toLowerCase().startsWith('dns:');\n if (isClient) {\n commonName = dnsPrefixed ? entry.substring(4) : entry;\n }\n else {\n const dns = dnsPrefixed ? entry.substring(4) : entry;\n sanArray.push({dns});\n if (sanArray.length === 1) {\n commonName = dns; // Use first DNS as CN\n }\n }\n }\n }\n\n // STEP 2: create certificate signed by CA\n const extensions: Array<{\n extname: string;\n cA?: boolean;\n critical?: boolean;\n names?: string[];\n array?: (string[] | Array<{dns?: string, ip?: string, rfc822?: string}>);\n }> = [\n {extname: \"basicConstraints\", cA: false},\n {\n extname: \"keyUsage\",\n critical: true,\n names: [\"digitalSignature\", \"keyEncipherment\"]\n },\n {\n extname: \"extKeyUsage\",\n array: [isClient ? \"clientAuth\" : \"serverAuth\"]\n }\n ];\n\n // Add SAN only if we have entries\n if (sanArray.length > 0) {\n extensions.push({\n extname: \"subjectAltName\",\n array: sanArray\n });\n }\n\n const cert = new KJUR.asn1.x509.Certificate({\n version: 3,\n serial: { hex: randomSerialNumber() },\n issuer: { str: issuer },\n subject: { str: `/CN=${commonName}/O=${DEFAULT_ORGANISATION}/OU=${userAndHost}`},\n\n notbefore: datetozulu(new Date(Date.now() - 60 * 1000), false, false),\n notafter: datetozulu(new Date(Date.now() + validityDays * 24 * 60 * 60 * 1000), false, false),\n\n sbjpubkey: pub,\n ext: extensions,\n\n sigalg: \"SHA256withECDSA\",\n cakey: cakey\n });\n\n const certPem = cert.getPEM();\n\n return {\n key: prvPem,\n cert: certPem\n };\n}\n"],
5
+ "mappings": "0FAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,EAAA,sBAAAC,EAAA,sBAAAC,EAAA,sBAAAC,EAAA,wBAAAC,EAAA,mBAAAC,EAAA,wBAAAC,EAAA,mBAAAC,EAAA,wBAAAC,EAAA,eAAAC,EAAA,WAAAC,EAAA,WAAAC,EAAA,SAAAC,EAAA,WAAAC,ICAA,IAAAC,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,IAAA,OAAS,mBAAAC,MAAuB,cAQzB,SAASD,EAAWE,EAAwB,CAC/C,OAAOD,EAAgB,OAAO,MAAMC,CAAM,CAAC,CAC/C,CDAA,IAAIC,EAEJ,eAAeC,GAAY,CACvB,GAAID,IAAW,OACX,GAAI,CACA,IAAME,EAAS,KAAM,QAAO,aAAa,EACzC,GAAI,CAACA,EAAO,OACR,MAAM,IAAI,MAAM,sBAAsB,EAE1CF,EAASE,EAAO,MACpB,MAAc,CACV,MAAM,IAAI,MACN,qLAGJ,CACJ,CAEJ,OAAOF,CACX,CAGO,IAAMG,EAAoB,GACpBC,EAAoB,GACpBC,EAAiBD,EAGjBE,EAAqC,WACrCC,EAAsB,GACtBC,EAAsB,GACtBC,EAAsB,EACtBC,EAAiB,MACjBC,EAAiB,EAUvB,SAASC,EAAOC,EAAiC,CACpD,IAAMC,EAAQD,EAAY,MAAM,GAAG,EACnC,GAAIC,EAAM,OAAS,EACf,MAAM,IAAI,MAAM,6BAA6B,EAEjD,IAAIC,EAAU,EACRC,EAAYF,EAAMC,GAAS,EACjC,GAAIC,IAAc,WAAaA,IAAc,WAAaA,IAAc,WACpE,MAAM,IAAI,MAAM,qBAAqB,EAEzC,IAAIC,EAAUd,EACVW,EAAMC,CAAO,EAAE,WAAW,IAAI,IAC9BE,EAAU,SAASH,EAAMC,CAAO,EAAE,UAAU,CAAC,EAAG,EAAE,EAClDA,KAEJ,IAAMG,EAA4C,CAAC,EAC7CC,EAAcL,EAAMC,GAAS,EAAE,MAAM,GAAG,EAE9C,QAAWK,KAASD,EAAa,CAC7B,GAAM,CAACE,EAAKC,CAAK,EAAIF,EAAM,MAAM,GAAG,EACpC,OAAQC,EAAK,CACT,IAAK,IACDH,EAAW,OAAS,SAASI,EAAO,EAAE,EACtC,MACJ,IAAK,IACDJ,EAAW,OAAS,SAASI,EAAO,EAAE,EACtC,MACJ,IAAK,IACDJ,EAAW,YAAc,SAASI,EAAO,EAAE,EAC3C,KACR,CACJ,CACAJ,EAAW,MAAQ,OAAO,KAAKJ,EAAMC,GAAS,EAAG,WAAW,EAC5D,IAAMQ,EAAO,OAAO,KAAKT,EAAMC,GAAS,EAAG,WAAW,EAEtD,MAAO,CAAE,UAAAC,EAAW,QAAAC,EAAS,WAAYC,EAAwC,KAAAK,CAAK,CAC1F,CASO,SAASC,EAAOC,EAA8B,CACjD,GAAM,CAAE,UAAAT,EAAW,QAAAC,EAAS,WAAAC,EAAY,KAAAK,CAAK,EAAIE,EACjD,MAAO,IAAIT,CAAS,MAAMC,CAAO,MAAMC,EAAW,MAAM,MAAMA,EAAW,MAAM,MAAMA,EAAW,WAAW,IAAIA,EAAW,MAAM,SAAS,WAAW,CAAC,IAAIK,EAAK,SAAS,WAAW,CAAC,EACvL,CAaA,eAAsBG,EAClBV,EACAW,EACAC,EACAV,EACe,CACf,IAAMW,EAAQX,GAAY,OAASY,EAAWvB,CAAmB,EAC3DwB,EAASb,GAAY,QAAUR,EAC/BsB,EAASd,GAAY,QAAUP,EAC/BsB,EAAcf,GAAY,aAAeT,EAEzCyB,EAAiC,CACnC,QAASP,EACT,UAAWC,EACX,MAAAC,EACA,OAAAE,EACA,OAAAC,EACA,YAAAC,CACJ,EACME,EAAW,MAAMlC,EAAU,EAGjC,OAAO,IAAI,QAAQ,CAACmC,EAASC,IAAW,CACpCF,EAASnB,EAAWkB,EAAc,CAACI,EAAmBC,IAAwB,CACtED,EACAD,EAAOC,CAAG,EAELC,EACLH,EAAQ,OAAO,KAAKG,CAAM,CAAC,EAG3BF,EAAO,IAAI,MAAM,2BAA2B,CAAC,CAErD,CAAC,CACL,CAAC,CACL,CAUA,eAAsBd,EAClBI,EACAa,EAQe,CACf,IAAMxB,EAAYwB,GAAS,WAAa,WAClCC,EAAaD,GAAS,YAAcjC,EACpCqB,EAAaY,GAAS,YAAchC,EACpCyB,EAAcO,GAAS,aAAe/B,EACtCsB,EAASS,GAAS,QAAU9B,EAC5BsB,EAASQ,GAAS,QAAU7B,EAE5BkB,EAAQC,EAAWW,CAAU,EAC7BvB,EAAa,CAAE,OAAAa,EAAQ,OAAAC,EAAQ,YAAAC,EAAa,MAAAJ,CAAM,EAClDa,EAAa,MAAMhB,EAAWV,EAAWW,EAAUC,EAAYV,CAAU,EAC/E,OAAOM,EAAO,CACV,UAAAR,EACA,QAASX,EACT,WAAAa,EACA,KAAMwB,CACV,CAAC,CACL,CASA,eAAsBC,EAAO9B,EAAqBc,EAAoC,CAClF,GAAI,CACA,IAAMiB,EAAUhC,EAAOC,CAAW,EAC5B6B,EAAa,MAAMhB,EACrBkB,EAAQ,UACRjB,EACAiB,EAAQ,KAAK,OACbA,EAAQ,UACZ,EACA,OAAOA,EAAQ,KAAK,OAAOF,CAAU,CACzC,MAAQ,CACJ,MAAO,EACX,CACJ,CE/MA,IAAAG,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,iBAAAC,EAAA,mBAAAC,IAAA,OAAS,WAAAC,EAAS,QAAAC,EAAc,cAAAC,MAAkB,YAClD,OAAS,YAAAC,EAAU,YAAAC,MAAgB,UACnC,OAAS,eAAAC,MAAmB,cAE5B,IAAMC,EAAc,GAAGH,EAAS,EAAE,QAAQ,IAAIC,EAAS,CAAC,GAExD,SAASG,GAA6B,CAElC,OADcF,EAAY,EAAE,EACf,SAAS,KAAK,CAC/B,CAEA,IAAMG,EAAuB,oBAChBX,EAAkB,GAAGW,CAAoB,IAAIF,CAAW,GAE9D,SAASP,EAAeU,EAAkF,CAE7G,IAAMC,EAAaD,GAAS,MAAQZ,EAC9Bc,EAAaF,GAAS,WAGtBG,EAAKZ,EAAQ,gBAAgB,KAAM,WAAW,EAC9Ca,EAAMD,EAAG,UACTE,EAAMF,EAAG,UAETG,EAASJ,EACTX,EAAQ,OAAOa,EAAK,WAAYF,EAAY,aAAa,EACzDX,EAAQ,OAAOa,EAAK,UAAU,EAuB9BG,EApBO,IAAIf,EAAK,KAAK,KAAK,YAAY,CACxC,QAAS,EACT,OAAQ,CAAE,IAAKM,EAAmB,CAAE,EACpC,OAAQ,CAAE,IAAK,OAAOG,CAAU,MAAMF,CAAoB,OAAOF,CAAW,EAAG,EAC/E,QAAS,CAAE,IAAK,OAAOI,CAAU,MAAMF,CAAoB,OAAOF,CAAW,EAAG,EAEhF,UAAWJ,EAAW,IAAI,KAAK,KAAK,IAAI,EAAI,GAAK,GAAI,EAAG,GAAO,EAAK,EACpE,SAAUA,EAAW,IAAI,KAAK,KAAK,IAAI,EAAI,GAAK,IAAM,GAAK,GAAK,GAAK,GAAI,EAAG,GAAO,EAAK,EAExF,UAAWY,EAEX,IAAK,CACD,CAAC,QAAS,mBAAoB,SAAU,GAAM,GAAI,EAAI,EACtD,CAAC,QAAS,WAAY,SAAU,GAAM,MAAO,CAAC,aAAa,CAAC,CAChE,EAEA,OAAQ,kBACR,MAAOD,CACX,CAAC,EAEoB,OAAO,EAE5B,MAAO,CACH,IAAKE,EACL,KAAMC,CACV,CACJ,CAWO,SAASlB,EACZmB,EACAC,EACAC,EACAC,EAAoB,GACpBC,EAAuB,EAIzB,CAEE,IAAMT,EAAKZ,EAAQ,gBAAgB,KAAM,WAAW,EAC9Ca,EAAMD,EAAG,UACTE,EAAMF,EAAG,UAETG,EAASf,EAAQ,OAAOa,EAAK,UAAU,EAGvCS,EAAgE,CAAC,EACnEZ,EAAaU,EAAW,WAAa,YAEzC,QAAWG,KAASJ,EAChB,GAAII,EAAM,YAAY,EAAE,WAAW,KAAK,EACpCD,EAAS,KAAK,CAAC,GAAIC,EAAM,UAAU,CAAC,CAAC,CAAC,UAEjCA,EAAM,YAAY,EAAE,WAAW,QAAQ,EAC5CD,EAAS,KAAK,CAAC,OAAQC,EAAM,UAAU,CAAC,CAAC,CAAC,MAEzC,CACD,IAAMC,EAAcD,EAAM,YAAY,EAAE,WAAW,MAAM,EACzD,GAAIH,EACAV,EAAac,EAAcD,EAAM,UAAU,CAAC,EAAIA,MAE/C,CACD,IAAME,EAAMD,EAAcD,EAAM,UAAU,CAAC,EAAIA,EAC/CD,EAAS,KAAK,CAAC,IAAAG,CAAG,CAAC,EACfH,EAAS,SAAW,IACpBZ,EAAae,EAErB,CACJ,CAIJ,IAAMC,EAMD,CACD,CAAC,QAAS,mBAAoB,GAAI,EAAK,EACvC,CACI,QAAS,WACT,SAAU,GACV,MAAO,CAAC,mBAAoB,iBAAiB,CACjD,EACA,CACI,QAAS,cACT,MAAO,CAACN,EAAW,aAAe,YAAY,CAClD,CACJ,EAGIE,EAAS,OAAS,GAClBI,EAAW,KAAK,CACZ,QAAS,iBACT,MAAOJ,CACX,CAAC,EAmBL,IAAMN,EAhBO,IAAIf,EAAK,KAAK,KAAK,YAAY,CACxC,QAAS,EACT,OAAQ,CAAE,IAAKM,EAAmB,CAAE,EACpC,OAAQ,CAAE,IAAKW,CAAO,EACtB,QAAS,CAAE,IAAK,OAAOR,CAAU,MAAMF,CAAoB,OAAOF,CAAW,EAAE,EAE/E,UAAWJ,EAAW,IAAI,KAAK,KAAK,IAAI,EAAI,GAAK,GAAI,EAAG,GAAO,EAAK,EACpE,SAAUA,EAAW,IAAI,KAAK,KAAK,IAAI,EAAImB,EAAe,GAAK,GAAK,GAAK,GAAI,EAAG,GAAO,EAAK,EAE5F,UAAWP,EACX,IAAKY,EAEL,OAAQ,kBACR,MAAOT,CACX,CAAC,EAEoB,OAAO,EAE5B,MAAO,CACH,IAAKF,EACL,KAAMC,CACV,CACJ",
6
+ "names": ["argon2_exports", "__export", "ARGON2_VERSION", "ARGON2_VERSION_10", "ARGON2_VERSION_13", "DEFAULT_ALGORITHM", "DEFAULT_HASH_LENGTH", "DEFAULT_MEMORY", "DEFAULT_PARALLELISM", "DEFAULT_PASSES", "DEFAULT_SALT_LENGTH", "createHash", "decode", "encode", "hash", "verify", "keygen_exports", "__export", "createSalt", "getRandomValues", "length", "argon2", "getArgon2", "crypto", "ARGON2_VERSION_10", "ARGON2_VERSION_13", "ARGON2_VERSION", "DEFAULT_ALGORITHM", "DEFAULT_SALT_LENGTH", "DEFAULT_HASH_LENGTH", "DEFAULT_PARALLELISM", "DEFAULT_MEMORY", "DEFAULT_PASSES", "decode", "encodedHash", "parts", "current", "algorithm", "version", "parameters", "paramsParts", "param", "key", "value", "hash", "encode", "hashData", "createHash", "password", "hashLength", "nonce", "createSalt", "memory", "passes", "parallelism", "argon2Params", "argon2Fn", "resolve", "reject", "err", "result", "options", "saltLength", "hashBuffer", "verify", "decoded", "mkcert_exports", "__export", "DEFAULT_CA_NAME", "generateCert", "generateRootCA", "KEYUTIL", "KJUR", "datetozulu", "userInfo", "hostname", "randomBytes", "userAndHost", "randomSerialNumber", "DEFAULT_ORGANISATION", "options", "commonName", "passphrase", "kp", "prv", "pub", "prvPem", "certPem", "cakey", "issuer", "sanEntries", "isClient", "validityDays", "sanArray", "entry", "dnsPrefixed", "dns", "extensions"]
7
+ }
package/dist/web/test.js CHANGED
@@ -1,3 +1,3 @@
1
- import{isIP as ue}from"node:net";import{Cookie as W}from"tough-cookie";function le(r,e){let t=r.get("x-forwarded-host");if(Array.isArray(t)&&(t=t[0]),t){let s=r.one("x-forwarded-port");s&&(t=`${t}:${s}`)}return t??=r.one("host"),Array.isArray(t)&&(t=t[0]),t?t.split(",",1)[0].trim():e}function pe(r){let e=r.one("x-forwarded-ssl");return typeof e=="string"&&e.toLowerCase()==="on"}function he(r,e){let t=r.get("x-forwarded-proto");return Array.isArray(t)&&(t=t[0]),t!==void 0?t.split(",",1)[0].trim():pe(r)?"https":e}function me(r,e,t){let s=t?t.port:r.protocol==="https:"?443:80,n=e.one("x-forwarded-for");if(Array.isArray(n)&&(n=n[0]),n!==void 0)return n=n.split(",",1)[0].trim(),{address:n,port:Number(s),family:ue(n)===6?"IPv6":"IPv4"}}var v=class{#e;constructor(e){this.#e=e}get headers(){return this.#e}},f=class r extends v{static logIdCounter=0;#e;get id(){return this.#e===void 0&&(this.#e=`${this.initId()}-${++r.logIdCounter}`),this.#e}initId(){return"request"}get cookies(){return ye(this.headers)}parseHost(e){return le(this.headers,e)}parseProtocol(e){return he(this.headers,e)}parseRemoteAddress(e){return me(this.URL,this.headers,e)}},m=class extends v{get cookies(){return be(this.headers)}setCookieValue(e){return new W({key:e.name,value:e.value,maxAge:e.maxAge,domain:e.domain,path:e.path,secure:e.secure,httpOnly:e.httpOnly,sameSite:e.sameSite}).toString()}};function fe(r){let e=[];{let t=0,s=0;for(let n=0;n<r.length;n++)switch(r.charCodeAt(n)){case 32:t===s&&(t=s=n+1);break;case 44:e.push(r.slice(t,s)),t=s=n+1;break;default:s=s+1;break}e.push(r.slice(t,s))}return e}function ge(r){typeof r=="string"&&(r=[r]),typeof r=="number"&&(r=[String(r)]);let e=[];if(r)for(let t of r)t&&e.push(...fe(t));return e}function ye(r){return r.list("cookie").map(e=>e.split(";").map(t=>W.parse(t))).flat(1).filter(e=>e!==void 0).map(e=>Object.freeze({name:e.key,value:e.value}))}function be(r){return r.list("set-cookie").map(e=>{let t=W.parse(e);if(t){let s={name:t.key,value:t.value,maxAge:Number(t.maxAge??-1)};return t.httpOnly&&(s.httpOnly=!0),t.domain&&(s.domain=t.domain),t.path&&(s.path=t.path),t.secure&&(s.secure=!0),t.httpOnly&&(s.httpOnly=!0),t.sameSite&&(s.sameSite=t.sameSite),Object.freeze(s)}}).filter(e=>e!==void 0)}var p=class extends Map{get(e){return super.get(e.toLowerCase())}one(e){return this.get(e)?.[0]}list(e){let t=super.get(e.toLowerCase());return ge(t)}set(e,t){return typeof t=="number"&&(t=String(t)),typeof t=="string"&&(t=[t]),t?super.set(e.toLowerCase(),t):(super.delete(e.toLowerCase()),this)}add(e,t){let s=super.get(e.toLowerCase());return typeof t=="string"&&(t=[t]),s&&(t=s.concat(t)),this.set(e,t),this}};var y=class extends f{constructor(e,t){super(new p),this.URL=t,this.method=e}URL;method},x=class extends m{constructor(e,t){super(t),this.statusCode=e}statusCode};var $=class{#e;constructor(e){this.#e=e}get value(){return this.#e}toString(){return this.#e.toString()}},H=class r{static CONTINUE=new r(100,"Continue");static SWITCHING_PROTOCOLS=new r(101,"Switching Protocols");static OK=new r(200,"OK");static CREATED=new r(201,"Created");static ACCEPTED=new r(202,"Accepted");static NON_AUTHORITATIVE_INFORMATION=new r(203,"Non-Authoritative Information");static NO_CONTENT=new r(204,"No Content");static RESET_CONTENT=new r(205,"Reset Content");static PARTIAL_CONTENT=new r(206,"Partial Content");static MULTI_STATUS=new r(207,"Multi-Status");static IM_USED=new r(226,"IM Used");static MULTIPLE_CHOICES=new r(300,"Multiple Choices");static MOVED_PERMANENTLY=new r(301,"Moved Permanently");static BAD_REQUEST=new r(400,"Bad Request");static UNAUTHORIZED=new r(401,"Unauthorized");static FORBIDDEN=new r(403,"Forbidden");static NOT_FOUND=new r(404,"Not Found");static METHOD_NOT_ALLOWED=new r(405,"Method Not Allowed");static NOT_ACCEPTABLE=new r(406,"Not Acceptable");static PROXY_AUTHENTICATION_REQUIRED=new r(407,"Proxy Authentication Required");static REQUEST_TIMEOUT=new r(408,"Request Timeout");static CONFLICT=new r(409,"Conflict");static GONE=new r(410,"Gone");static LENGTH_REQUIRED=new r(411,"Length Required");static PRECONDITION_FAILED=new r(412,"Precondition Failed");static PAYLOAD_TOO_LARGE=new r(413,"Payload Too Large");static URI_TOO_LONG=new r(414,"URI Too Long");static UNSUPPORTED_MEDIA_TYPE=new r(415,"Unsupported Media Type");static EXPECTATION_FAILED=new r(417,"Expectation Failed");static IM_A_TEAPOT=new r(418,"I'm a teapot");static TOO_EARLY=new r(425,"Too Early");static UPGRADE_REQUIRED=new r(426,"Upgrade Required");static PRECONDITION_REQUIRED=new r(428,"Precondition Required");static TOO_MANY_REQUESTS=new r(429,"Too Many Requests");static REQUEST_HEADER_FIELDS_TOO_LARGE=new r(431,"Request Header Fields Too Large");static UNAVAILABLE_FOR_LEGAL_REASONS=new r(451,"Unavailable For Legal Reasons");static INTERNAL_SERVER_ERROR=new r(500,"Internal Server Error");static NOT_IMPLEMENTED=new r(501,"Not Implemented");static BAD_GATEWAY=new r(502,"Bad Gateway");static SERVICE_UNAVAILABLE=new r(503,"Service Unavailable");static GATEWAY_TIMEOUT=new r(504,"Gateway Timeout");static HTTP_VERSION_NOT_SUPPORTED=new r(505,"HTTP Version Not Supported");static VARIANT_ALSO_NEGOTIATES=new r(506,"Variant Also Negotiates");static INSUFFICIENT_STORAGE=new r(507,"Insufficient Storage");static LOOP_DETECTED=new r(508,"Loop Detected");static NOT_EXTENDED=new r(510,"Not Extended");static NETWORK_AUTHENTICATION_REQUIRED=new r(511,"Network Authentication Required");static#e=[];static{Object.keys(r).filter(e=>e!=="VALUES"&&e!=="resolve").forEach(e=>{let t=r[e];t instanceof r&&(Object.defineProperty(t,"name",{enumerable:!0,value:e,writable:!1}),r.#e.push(t))})}static resolve(e){for(let t of r.#e)if(t.value===e)return t}#t;#r;constructor(e,t){this.#t=e,this.#r=t}get value(){return this.#t}get phrase(){return this.#r}toString(){return`${this.#t} ${this.name}`}};function b(r){if(typeof r=="number"){if(r<100||r>999)throw new Error(`status code ${r} should be in range 100-999`);let e=H.resolve(r);return e!==void 0?e:new $(r)}return r}var D=class extends y{#e;constructor(e,t){super(e,t)}async body(e){return this.#e=e instanceof ReadableStream?e:await e,await this.end()}end(){return Promise.resolve(!0)}getNativeRequest(){let e=this.method,t=new Headers;for(let n of this.headers.keys())if(n.toLowerCase()!=="content-length")for(let o of this.headers.list(n))t.append(n,o);this.headers.has("accept")||t.append("accept","*/*");let s=this.#e;return new Request(this.URL,{method:e,headers:t,body:s})}};function Re(r){let e=new p;for(let[t,s]of r.entries())e.add(t,s);return e}var V=class extends x{#e;constructor(e){super(b(e.status),Re(e.headers)),this.#e=e}get statusMessage(){return this.#e.statusText}get body(){return this.#e.body??void 0}blob(){return this.#e.blob()}},E=class{#e;constructor(e=globalThis.fetch){this.#e=e}async connect(e,t,s){let n=new D(e,t);await s(n);let o=n.getNativeRequest(),a=await this.#e(o);return new V(a)}};import*as w from"node:stream/web";var k=class extends y{#e;#t=()=>{throw new Error("Body not set")};constructor(e,t){super(t,e),this.#e=async s=>{let n=[];this.#t=()=>w.ReadableStream.from(n);let o=s.getReader(),a;do{let{value:i,done:c}=await o.read();a=c,i!==void 0&&n.push(i)}while(!a);return!0}}set writeHandler(e){this.#e=e}getNativeRequest(){return this}getBody(){return this.#t()}body(e){let t=(async function*(){if(e instanceof ReadableStream){let s=e.getReader(),n;do{let{value:o,done:a}=await s.read();n=a,o!==void 0&&(yield o)}while(!n)}else{let s=await e;s!==void 0&&(yield s)}})();return this.#e(w.ReadableStream.from(t))}async end(){return await this.body(Promise.resolve())}},T=class extends m{#e;#t=w.ReadableStream.from([]);constructor(e){super(new p),this.#e=b(e)}get statusCode(){return this.#e}addHeader(e,t){return this.headers.add(e,t),this}setHeader(e,t){return this.headers.set(e,t),this}setBody(e,t){return this.#t=w.ReadableStream.from([Buffer.from(e,t)]),this}set body(e){this.#t=e}get body(){return this.#t}async blob(){let e=[];if(this.body!==void 0)for await(let t of this.body)e.push(t);return new Blob(e,{type:this.headers.one("content-type")||"application/octet-stream"})}};import M from"node:stream/web";import X from"node:http";var Q=class extends X.IncomingMessage{exchange;upgradeHead;get urlBang(){return this.url}get socketEncrypted(){return this.socket.encrypted===!0}},K=class extends X.ServerResponse{markHeadersSent(){this._header=!0}getRawHeaderNames(){return super.getRawHeaderNames()}};var S=class extends m{#e=[];#t;#r="new";#s=[];setStatusCode(e){return this.#r==="committed"?!1:(this.#t=e,!0)}setRawStatusCode(e){return this.setStatusCode(e===void 0?void 0:b(e))}get statusCode(){return this.#t}addCookie(e){if(this.#r==="committed")throw new Error(`Cannot add cookie ${JSON.stringify(e)} because HTTP response has already been committed`);return this.#e.push(e),this}beforeCommit(e){this.#s.push(e)}get commited(){let e=this.#r;return e!=="new"&&e!=="commit-action-failed"}async body(e){if(e instanceof ReadableStream)throw new Error("ReadableStream body not supported yet");let t=await e;try{return await this.doCommit(async()=>await this.bodyInternal(Promise.resolve(t))).catch(s=>{throw s})}catch(s){throw s}}async end(){return this.commited?Promise.resolve(!1):this.doCommit(async()=>await this.bodyInternal(Promise.resolve()))}doCommit(e){let t=this.#r,s=Promise.resolve();if(t==="new")this.#r="committing",this.#s.length>0&&(s=this.#s.reduce((n,o)=>n.then(()=>o()),Promise.resolve()).catch(n=>{this.#r==="committing"&&(this.#r="commit-action-failed")}));else if(t==="commit-action-failed")this.#r="committing";else return Promise.resolve(!1);return s=s.then(()=>{this.applyStatusCode(),this.applyHeaders(),this.applyCookies(),this.#r="committed"}),s.then(async()=>e!==void 0?await e():!0)}applyStatusCode(){}applyHeaders(){}applyCookies(){}};var P=class r{#e;constructor(e){this.#e=e}get delegate(){return this.#e}setStatusCode(e){return this.delegate.setStatusCode(e)}setRawStatusCode(e){return this.delegate.setRawStatusCode(e)}get statusCode(){return this.delegate.statusCode}get cookies(){return this.delegate.cookies}addCookie(e){return this.delegate.addCookie(e),this}async end(){return await this.delegate.end()}async body(e){return await this.#e.body(e)}get headers(){return this.#e.headers}toString(){return`${r.name} [delegate: ${this.delegate.toString()}]`}static getNativeResponse(e){if(e instanceof S)return e.getNativeResponse();if(e instanceof r)return r.getNativeResponse(e.delegate);throw new Error(`Cannot get native response from ${e.constructor.name}`)}};var C=class{request;response;#e={};#t;#r="";constructor(e,t){this.#e[J]=e.id,this.request=e,this.response=t}get method(){return this.request.method}get path(){return this.request.path}get attributes(){return this.#e}attribute(e){return this.attributes[e]}principal(){return Promise.resolve(void 0)}get logPrefix(){let e=this.attribute(J);return this.#t!==e&&(this.#t=e,this.#r=e!==void 0?`[${e}] `:""),this.#r}},J="io.interop.gateway.server.log_id";var A=class extends f{#e;#t;upgrade=!1;constructor(e,t){if(super(new p),typeof e=="string")if(URL.canParse(e))e=new URL(e);else if(URL.canParse(e,"http://localhost"))e=new URL(e,"http://localhost");else throw new TypeError("URL cannot parse url");this.#e=e,this.method=t??"GET",this.setHeader("Host",this.#e.hostname),this.path=this.#e.pathname??"/"}method;path;get host(){return super.parseHost(this.#e.host)}get protocol(){return super.parseProtocol(this.#e.protocol.slice(0,-1))}get body(){if(this.#t!==void 0){let e=this.#t,t=(async function*(){yield await e.bytes()})();return M.ReadableStream.from(t)}}blob(){let e=this.#t;return e?Promise.resolve(e):Promise.reject(new Error("no body set"))}async text(){return await(await this.blob()).text()}async formData(){let t=await(await this.blob()).text();return new URLSearchParams(t)}async json(){let e=await this.blob();if(e.size===0)return;let t=await e.text();return JSON.parse(t)}async writeBody(e){if(e===void 0){this.#t=new Blob([]);return}if(e instanceof ReadableStream){let t=[],s=e.getReader(),n=!1;for(;!n;){let{value:o,done:a}=await s.read();a?n=!0:t.push(o)}this.#t=new Blob(t)}else e=await e,typeof e=="string"?this.#t=new Blob([e],{type:"text/plain"}):this.#t=new Blob([e]);this.headers.has("content-type")||this.setHeader("Content-Type",this.#t.type||"application/octet-stream")}get URL(){return new URL(this.path+this.#e.search+this.#e.hash,`${this.protocol}://${this.host}`)}addHeader(e,t){return this.headers.add(e,t),this}setHeader(e,t){return this.headers.set(e,t),this}},L=class extends S{#e;#t=()=>{throw new Error("No content was written to the response body nor end was called on this response.")};constructor(){super(new p),this.#e=async e=>{let t=[],s;this.#t=()=>(s??=M.ReadableStream.from(t),s);let n=e.getReader(),o=!1;do{let{value:a,done:i}=await n.read();i?o=!0:t.push(a)}while(!o);return!0}}get statusCode(){return super.statusCode}set writeHandler(e){this.#t=()=>{throw new Error("Not available with custom write handler")},this.#e=e}getNativeResponse(){throw new Error("This is a mock. No running server, no native response.")}applyStatusCode(){}applyHeaders(){}applyCookies(){for(let e of this.cookies)this.headers.add("Set-Cookie",super.setCookieValue(e))}bodyInternal(e){let t=(async function*(){let s=await e;s!==void 0&&(yield s)})();return this.#e(M.ReadableStream.from(t))}async end(){return this.doCommit(async()=>await new Promise((e,t)=>{this.#e(M.ReadableStream.from([]))}))}getBody(){return this.#t()}};import*as Z from"@interopio/gateway/logging/core";function g(r){return Z.getLogger(`gateway.server.${r}`)}import{AsyncLocalStorage as He}from"node:async_hooks";var O=class extends P{},G=class{#e;#t=!1;#r;#s;constructor(e,t){this.#e=e,this.#r=t}createExchange(e,t){return new C(e,t)}set storage(e){this.#s=e}set enableLoggingRequestDetails(e){this.#t=e}formatHeaders(e){let t="{";for(let s of e.keys())if(this.#t){let n=e.get(s);t+=`"${s}": "${n}", `}else{t+="masked, ";break}return t.endsWith(", ")&&(t=t.slice(0,-2)),t+="}",t}formatRequest(e){let t=e.URL.search;return`HTTP ${e.method} "${e.path}${t}`}logRequest(e){if(this.#e.enabledFor("debug")){let t=this.#e.enabledFor("trace");this.#e.debug(`${e.logPrefix}${this.formatRequest(e.request)}${t?`, headers: ${this.formatHeaders(e.request.headers)}`:""}"`)}}logResponse(e){if(this.#e.enabledFor("debug")){let t=this.#e.enabledFor("trace"),s=e.response.statusCode;this.#e.debug(`${e.logPrefix}Completed ${s??"200 OK"}${t?`, headers: ${this.formatHeaders(e.response.headers)}`:""}"`)}}handleUnresolvedError(e,t){let{request:s,response:n,logPrefix:o}=e;if(n.setStatusCode(H.INTERNAL_SERVER_ERROR)){this.#e.error(`${o}500 Server Error for ${this.formatRequest(s)}`,t);return}throw this.#e.error(`${o}Error [${t.message} for ${this.formatRequest(s)}, but already ended (${n.statusCode})`,t),t}async web(e){return await this.#r(e)}async http(e,t){let s=this.createExchange(e,t),n=()=>(this.logRequest(s),this.web(s).then(()=>{this.logResponse(s)}).catch(o=>{this.handleUnresolvedError(s,o)}).then(async()=>{await s.response.end()}));await new Promise((o,a)=>{this.#s!==void 0?this.#s.run({exchange:s},()=>{n().then(()=>o()).catch(i=>a(i))}):n().then(()=>o()).catch(i=>a(i))})}},B=class{#e;#t=new He;#r;storage(e){return this.#t=e,this}httpHandlerDecorator(e){if(this.#r===void 0)this.#r=e;else{let t=this.#r;this.#r=s=>(s=t(s),e(s))}return this}constructor(e){this.#e=e}build(){let e=g("http"),t=new G(e,this.#e);this.#t!==void 0&&(t.storage=this.#t),t.enableLoggingRequestDetails=!1;let s=async(n,o)=>t.http(n,o);return this.#r?this.#r(s):s}};import we from"node:stream/web";var F=class extends Error{completedResponse;constructor(e,t={}){super(`error occurred after response was completed: ${e}`,t),this.completedResponse=e}};async function ee(){try{return await new Promise((r,e)=>{let t=new Promise((s,n)=>{Promise.resolve().then(()=>{r({promise:t,resolve:s,reject:n})})})})}catch(r){throw r}}var I=class r{static#e=g("test.http.handler.connector");#t;constructor(e){this.#t=e}async connect(e,t,s){let n=await ee(),o=await ee(),a=[void 0],i=new k(t,e),c=new L;return i.writeHandler=async d=>{this.log("Invoking HttpHandler for ",e,t);let l=await this.adoptRequest(i,d),u=this.prepareResponse(c,l);try{await this.#t(l,u),o.resolve()}catch(h){o.reject(h)}return!0},c.writeHandler=async d=>(this.log("Creating client response for ",e,t),a[0]=this.adoptResponse(c,d),!0),this.log("Writing client request for ",e,t),s(i).then(()=>{n.resolve()}).catch(d=>{n.reject(d)}),Promise.all([n.promise,o.promise]).catch(d=>{let l=a[0];throw l!==void 0?new F(l,{cause:d}):d}).then(()=>a[0]??this.adoptResponse(c,we.ReadableStream.from([])))}log(e,t,s){r.#e.enabledFor("debug")&&r.#e.debug(`${e} ${t} "${s.href}"`)}async adoptRequest(e,t){let s=e.method,n=e.URL,o=e.headers,a=e.cookies,i=new A(n,s);for(let c of o.keys()){let d=o.get(c);if(d!==void 0)if(typeof d=="number"&&(d=String(d)),typeof d=="string")i.setHeader(c,d);else for(let l of d)i.addHeader(c,l)}return await i.writeBody(t),i}prepareResponse(e,t){return t.method==="HEAD"?new O(e):e}adoptResponse(e,t){let s=e.statusCode,n=e.headers,o=e.cookies,a=new T(s);for(let i of n.keys()){let c=n.get(i);if(c!==void 0)if(typeof c=="number"&&(c=String(c)),typeof c=="string")a.setHeader(i,c);else for(let d of c)a.addHeader(i,d)}return a.body=t,a}};import{IOGateway as te}from"@interopio/gateway";var dt=g("gateway.ws.client-verify");function re(r){if(r){let e=(r.block??r.blacklist??[]).map(te.Filtering.regexify),t=(r.allow??r.whitelist??[]).map(te.Filtering.regexify);return{non_matched:r.non_matched??"allow",missing:r.missing??"allow",allow:t,block:e}}}var Se=async r=>z();Se.toString=()=>"any-exchange";var se=Object.freeze({}),N=Object.freeze({match:!1,variables:se}),z=(r=se)=>({match:!0,variables:r}),ne=(r,e)=>{let t=e?.method,s=async n=>{let o=n.request,a=o.path;if(t!==void 0&&o.method!==t)return N;if(typeof r=="string")return a===r?z():N;{let i=r.exec(a);return i===null?N:{match:!0,variables:{...i.groups}}}};return s.toString=()=>`pattern(${r.toString()}, method=${t??"<any>"})`,s};var Ce=async({request:r})=>r.upgrade&&r.headers.one("upgrade")?.toLowerCase()==="websocket"?z():N;Ce.toString=()=>"websocket upgrade";import{IOGateway as oe}from"@interopio/gateway";async function ae(r,e,t){let s=(o,a)=>{if(a?.cors){let i=a.cors===!0?{allowOrigins:a.origins?.allow?.map(oe.Filtering.regexify),allowMethods:o.method===void 0?["*"]:[o.method],allowCredentials:a.authorize?.access!=="permitted"?!0:void 0}:a.cors,c=o.path;t.cors.push([c,i])}},n=new class{handle(...o){o.forEach(({request:a,options:i,handler:c})=>{let d=ne(oe.Filtering.regexify(a.path),{method:a.method});i?.authorize&&t.authorize.push([d,i.authorize]),s(a,i);let l=async(u,h)=>{let{match:R,variables:q}=await d(u);R?await c(u,q):await h()};t.middleware.push(l)})}socket(...o){for(let{path:a,factory:i,options:c}of o){let d=a??"/";t.sockets.set(d,{default:a===void 0,ping:c?.ping,factory:i,maxConnections:c?.maxConnections,authorize:c?.authorize,originFilters:re(c?.origins)})}}};await r(n,e)}function ie(...r){if(!Array.isArray(r))throw new Error("middleware must be array!");let e=r.flat();for(let t of e)if(typeof t!="function")throw new Error("middleware must be compose of functions!");return async function(t,s){let n=async(o,a)=>{let i=o===e.length?s:e[o];if(i===void 0)return;let c=!1,d=!1,u=await i(a,async h=>{if(c)throw new Error("next() called multiple times");c=!0;try{return await n(o+1,h??a)}finally{d=!0}});if(c&&!d)throw new Error(`middleware resolved before downstream.
2
- You are probably missing an await or return statement in your middleware function.`);return u};return n(0,t)}}import{AsyncLocalStorage as ve}from"node:async_hooks";function de(r){return new _(r)}function ce(){return new U}var j=class{#e;#t;#r;constructor(e,t,s){this.#e=e,this.#t=t,this.#r=s}fetch=async(e,t)=>{try{let s=t?.method??"GET",n=new URL(e,this.#t),o=await this.#e.connect(s,n,async d=>{let l=new Headers(t?.headers);for(let[h,R]of l.entries())d.headers.add(h,R);let u=t?.body??Promise.resolve();if(u instanceof ReadableStream)throw new Error(`Unsupported body type ${typeof t?.body} in fetch request`);if(u instanceof FormData){let h=Array.from(u.entries());u=new URLSearchParams;for(let[R,q]of h)u.append(R,q.toString())}u instanceof URLSearchParams&&(d.headers.has("content-type")||d.headers.set("content-type","application/x-www-form-urlencoded"),u=u.toString()),u instanceof Blob&&(u=await u.bytes()),typeof u=="string"&&(u=Buffer.from(u)),await d.body(u)}),a=new Headers;for(let d of o.headers.keys()){let l=o.headers.list(d);for(let u of l)a.append(d,u)}let i=o.statusCode?.value,c=await o.blob();return new Response(c,{status:i,headers:a})}catch{return Response.error()}}},U=class{#e;#t;#r="http://localhost:8080";constructor(e,t){if(!(e===void 0||t===void 0))throw new Error("You can only set either httpHandlerBuilder or connector, not both.");this.#t=t,this.#e=e}baseUrl(e){return this.#r=e,this}clientConnector(e){return this.#t=e,this}async build(){let e=this.#t;return e===void 0&&this.#e!==void 0&&(e=new I((await this.#e).build())),e??=new E,new j(e,this.#r,this)}},Y=class{configureClient(){let e=this.initHttpHandlerBuilder();return new U(e)}async build(){return await this.configureClient().build()}},_=class extends Y{#e;constructor(e){super(),this.#e=e}async initHttpHandlerBuilder(){let e={middleware:[],corsConfig:{allowOrigin:["http://localhost:8086"]},cors:[],authConfig:{type:"none"},authorize:[],storage:new ve,sockets:new Map};await ae(this.#e,{},e);let t=ie(...e.middleware);return new B(t)}};var xt={bindToApp:de,bindToServer:ce};export{xt as TestClient};
1
+ import{isIP as ue}from"node:net";import{Cookie as W}from"tough-cookie";function le(r,e){let t=r.get("x-forwarded-host");if(Array.isArray(t)&&(t=t[0]),t){let s=r.one("x-forwarded-port");s&&(t=`${t}:${s}`)}return t??=r.one("host"),Array.isArray(t)&&(t=t[0]),t?t.split(",",1)[0].trim():e}function pe(r){let e=r.one("x-forwarded-ssl");return typeof e=="string"&&e.toLowerCase()==="on"}function he(r,e){let t=r.get("x-forwarded-proto");return Array.isArray(t)&&(t=t[0]),t!==void 0?t.split(",",1)[0].trim():pe(r)?"https":e}function me(r,e,t){let s=t?t.port:r.protocol==="https:"?443:80,n=e.one("x-forwarded-for");if(Array.isArray(n)&&(n=n[0]),n!==void 0)return n=n.split(",",1)[0].trim(),{address:n,port:Number(s),family:ue(n)===6?"IPv6":"IPv4"}}var v=class{#e;constructor(e){this.#e=e}get headers(){return this.#e}},f=class r extends v{static logIdCounter=0;#e;get id(){return this.#e===void 0&&(this.#e=`${this.initId()}-${++r.logIdCounter}`),this.#e}initId(){return"request"}get cookies(){return ye(this.headers)}parseHost(e){return le(this.headers,e)}parseProtocol(e){return he(this.headers,e)}parseRemoteAddress(e){return me(this.URL,this.headers,e)}},m=class extends v{get cookies(){return be(this.headers)}setCookieValue(e){return new W({key:e.name,value:e.value,maxAge:e.maxAge,domain:e.domain,path:e.path,secure:e.secure,httpOnly:e.httpOnly,sameSite:e.sameSite}).toString()}};function fe(r){let e=[];{let t=0,s=0;for(let n=0;n<r.length;n++)switch(r.charCodeAt(n)){case 32:t===s&&(t=s=n+1);break;case 44:e.push(r.slice(t,s)),t=s=n+1;break;default:s=s+1;break}e.push(r.slice(t,s))}return e}function ge(r){typeof r=="string"&&(r=[r]),typeof r=="number"&&(r=[String(r)]);let e=[];if(r)for(let t of r)t&&e.push(...fe(t));return e}function ye(r){return r.list("cookie").map(e=>e.split(";").map(t=>W.parse(t))).flat(1).filter(e=>e!==void 0).map(e=>Object.freeze({name:e.key,value:e.value}))}function be(r){return r.list("set-cookie").map(e=>{let t=W.parse(e);if(t){let s={name:t.key,value:t.value,maxAge:Number(t.maxAge??-1)};return t.httpOnly&&(s.httpOnly=!0),t.domain&&(s.domain=t.domain),t.path&&(s.path=t.path),t.secure&&(s.secure=!0),t.httpOnly&&(s.httpOnly=!0),t.sameSite&&(s.sameSite=t.sameSite),Object.freeze(s)}}).filter(e=>e!==void 0)}var p=class extends Map{get(e){return super.get(e.toLowerCase())}one(e){return this.get(e)?.[0]}list(e){let t=super.get(e.toLowerCase());return ge(t)}set(e,t){return typeof t=="number"&&(t=String(t)),typeof t=="string"&&(t=[t]),t?super.set(e.toLowerCase(),t):(super.delete(e.toLowerCase()),this)}add(e,t){let s=super.get(e.toLowerCase());return typeof t=="string"&&(t=[t]),s&&(t=s.concat(t)),this.set(e,t),this}};var y=class extends f{constructor(e,t){super(new p),this.URL=t,this.method=e}URL;method},x=class extends m{constructor(e,t){super(t),this.statusCode=e}statusCode};var $=class{#e;constructor(e){this.#e=e}get value(){return this.#e}toString(){return this.#e.toString()}},H=class r{static CONTINUE=new r(100,"Continue");static SWITCHING_PROTOCOLS=new r(101,"Switching Protocols");static OK=new r(200,"OK");static CREATED=new r(201,"Created");static ACCEPTED=new r(202,"Accepted");static NON_AUTHORITATIVE_INFORMATION=new r(203,"Non-Authoritative Information");static NO_CONTENT=new r(204,"No Content");static RESET_CONTENT=new r(205,"Reset Content");static PARTIAL_CONTENT=new r(206,"Partial Content");static MULTI_STATUS=new r(207,"Multi-Status");static IM_USED=new r(226,"IM Used");static MULTIPLE_CHOICES=new r(300,"Multiple Choices");static MOVED_PERMANENTLY=new r(301,"Moved Permanently");static BAD_REQUEST=new r(400,"Bad Request");static UNAUTHORIZED=new r(401,"Unauthorized");static FORBIDDEN=new r(403,"Forbidden");static NOT_FOUND=new r(404,"Not Found");static METHOD_NOT_ALLOWED=new r(405,"Method Not Allowed");static NOT_ACCEPTABLE=new r(406,"Not Acceptable");static PROXY_AUTHENTICATION_REQUIRED=new r(407,"Proxy Authentication Required");static REQUEST_TIMEOUT=new r(408,"Request Timeout");static CONFLICT=new r(409,"Conflict");static GONE=new r(410,"Gone");static LENGTH_REQUIRED=new r(411,"Length Required");static PRECONDITION_FAILED=new r(412,"Precondition Failed");static PAYLOAD_TOO_LARGE=new r(413,"Payload Too Large");static URI_TOO_LONG=new r(414,"URI Too Long");static UNSUPPORTED_MEDIA_TYPE=new r(415,"Unsupported Media Type");static EXPECTATION_FAILED=new r(417,"Expectation Failed");static IM_A_TEAPOT=new r(418,"I'm a teapot");static TOO_EARLY=new r(425,"Too Early");static UPGRADE_REQUIRED=new r(426,"Upgrade Required");static PRECONDITION_REQUIRED=new r(428,"Precondition Required");static TOO_MANY_REQUESTS=new r(429,"Too Many Requests");static REQUEST_HEADER_FIELDS_TOO_LARGE=new r(431,"Request Header Fields Too Large");static UNAVAILABLE_FOR_LEGAL_REASONS=new r(451,"Unavailable For Legal Reasons");static INTERNAL_SERVER_ERROR=new r(500,"Internal Server Error");static NOT_IMPLEMENTED=new r(501,"Not Implemented");static BAD_GATEWAY=new r(502,"Bad Gateway");static SERVICE_UNAVAILABLE=new r(503,"Service Unavailable");static GATEWAY_TIMEOUT=new r(504,"Gateway Timeout");static HTTP_VERSION_NOT_SUPPORTED=new r(505,"HTTP Version Not Supported");static VARIANT_ALSO_NEGOTIATES=new r(506,"Variant Also Negotiates");static INSUFFICIENT_STORAGE=new r(507,"Insufficient Storage");static LOOP_DETECTED=new r(508,"Loop Detected");static NOT_EXTENDED=new r(510,"Not Extended");static NETWORK_AUTHENTICATION_REQUIRED=new r(511,"Network Authentication Required");static#e=[];static{Object.keys(r).filter(e=>e!=="VALUES"&&e!=="resolve").forEach(e=>{let t=r[e];t instanceof r&&(Object.defineProperty(t,"name",{enumerable:!0,value:e,writable:!1}),r.#e.push(t))})}static resolve(e){for(let t of r.#e)if(t.value===e)return t}#t;#r;constructor(e,t){this.#t=e,this.#r=t}get value(){return this.#t}get phrase(){return this.#r}toString(){return`${this.#t} ${this.name}`}};function b(r){if(typeof r=="number"){if(r<100||r>999)throw new Error(`status code ${r} should be in range 100-999`);let e=H.resolve(r);return e!==void 0?e:new $(r)}return r}var D=class extends y{#e;constructor(e,t){super(e,t)}async body(e){return this.#e=e instanceof ReadableStream?e:await e,await this.end()}end(){return Promise.resolve(!0)}getNativeRequest(){let e=this.method,t=new Headers;for(let n of this.headers.keys())if(n.toLowerCase()!=="content-length")for(let o of this.headers.list(n))t.append(n,o);this.headers.has("accept")||t.append("accept","*/*");let s=this.#e;return new Request(this.URL,{method:e,headers:t,body:s})}};function Re(r){let e=new p;for(let[t,s]of r.entries())e.add(t,s);return e}var V=class extends x{#e;constructor(e){super(b(e.status),Re(e.headers)),this.#e=e}get statusMessage(){return this.#e.statusText}get body(){return this.#e.body??void 0}blob(){return this.#e.blob()}},E=class{#e;constructor(e=globalThis.fetch){this.#e=e}async connect(e,t,s){let n=new D(e,t);await s(n);let o=n.getNativeRequest(),a=await this.#e(o);return new V(a)}};import*as w from"node:stream/web";var k=class extends y{#e;#t=()=>{throw new Error("Body not set")};constructor(e,t){super(t,e),this.#e=async s=>{let n=[];this.#t=()=>w.ReadableStream.from(n);let o=s.getReader(),a;do{let{value:i,done:c}=await o.read();a=c,i!==void 0&&n.push(i)}while(!a);return!0}}set writeHandler(e){this.#e=e}getNativeRequest(){return this}getBody(){return this.#t()}body(e){let t=(async function*(){if(e instanceof ReadableStream){let s=e.getReader(),n;do{let{value:o,done:a}=await s.read();n=a,o!==void 0&&(yield o)}while(!n)}else{let s=await e;s!==void 0&&(yield s)}})();return this.#e(w.ReadableStream.from(t))}async end(){return await this.body(Promise.resolve())}},T=class extends m{#e;#t=w.ReadableStream.from([]);constructor(e){super(new p),this.#e=b(e)}get statusCode(){return this.#e}addHeader(e,t){return this.headers.add(e,t),this}setHeader(e,t){return this.headers.set(e,t),this}setBody(e,t){return this.#t=w.ReadableStream.from([Buffer.from(e,t)]),this}set body(e){this.#t=e}get body(){return this.#t}async blob(){let e=[];if(this.body!==void 0)for await(let t of this.body)e.push(t);return new Blob(e,{type:this.headers.one("content-type")||"application/octet-stream"})}};import M from"node:stream/web";import J from"node:http";var Q=class extends J.IncomingMessage{exchange;upgradeHead;get urlBang(){return this.url}get socketEncrypted(){return this.socket.encrypted===!0}},K=class extends J.ServerResponse{markHeadersSent(){this._header=!0}getRawHeaderNames(){return super.getRawHeaderNames()}};var S=class extends m{#e=[];#t;#r="new";#s=[];setStatusCode(e){return this.#r==="committed"?!1:(this.#t=e,!0)}setRawStatusCode(e){return this.setStatusCode(e===void 0?void 0:b(e))}get statusCode(){return this.#t}addCookie(e){if(this.#r==="committed")throw new Error(`Cannot add cookie ${JSON.stringify(e)} because HTTP response has already been committed`);return this.#e.push(e),this}beforeCommit(e){this.#s.push(e)}get commited(){let e=this.#r;return e!=="new"&&e!=="commit-action-failed"}async body(e){if(e instanceof ReadableStream)throw new Error("ReadableStream body not supported yet");let t=await e;try{return await this.doCommit(async()=>await this.bodyInternal(Promise.resolve(t))).catch(s=>{throw s})}catch(s){throw s}}async end(){return this.commited?Promise.resolve(!1):this.doCommit(async()=>await this.bodyInternal(Promise.resolve()))}doCommit(e){let t=this.#r,s=Promise.resolve();if(t==="new")this.#r="committing",this.#s.length>0&&(s=this.#s.reduce((n,o)=>n.then(()=>o()),Promise.resolve()).catch(n=>{this.#r==="committing"&&(this.#r="commit-action-failed")}));else if(t==="commit-action-failed")this.#r="committing";else return Promise.resolve(!1);return s=s.then(()=>{this.applyStatusCode(),this.applyHeaders(),this.applyCookies(),this.#r="committed"}),s.then(async()=>e!==void 0?await e():!0)}applyStatusCode(){}applyHeaders(){}applyCookies(){}};var P=class r{#e;constructor(e){this.#e=e}get delegate(){return this.#e}setStatusCode(e){return this.delegate.setStatusCode(e)}setRawStatusCode(e){return this.delegate.setRawStatusCode(e)}get statusCode(){return this.delegate.statusCode}get cookies(){return this.delegate.cookies}addCookie(e){return this.delegate.addCookie(e),this}async end(){return await this.delegate.end()}async body(e){return await this.#e.body(e)}get headers(){return this.#e.headers}toString(){return`${r.name} [delegate: ${this.delegate.toString()}]`}static getNativeResponse(e){if(e instanceof S)return e.getNativeResponse();if(e instanceof r)return r.getNativeResponse(e.delegate);throw new Error(`Cannot get native response from ${e.constructor.name}`)}};var C=class{request;response;#e={};#t;#r="";constructor(e,t){this.#e[X]=e.id,this.request=e,this.response=t}get method(){return this.request.method}get path(){return this.request.path}get attributes(){return this.#e}attribute(e){return this.attributes[e]}principal(){return Promise.resolve(void 0)}get logPrefix(){let e=this.attribute(X);return this.#t!==e&&(this.#t=e,this.#r=e!==void 0?`[${e}] `:""),this.#r}},X="io.interop.gateway.server.log_id";var L=class extends f{#e;#t;upgrade=!1;constructor(e,t){if(super(new p),typeof e=="string")if(URL.canParse(e))e=new URL(e);else if(URL.canParse(e,"http://localhost"))e=new URL(e,"http://localhost");else throw new TypeError("URL cannot parse url");this.#e=e,this.method=t??"GET",this.setHeader("Host",this.#e.hostname),this.path=this.#e.pathname??"/"}method;path;get host(){return super.parseHost(this.#e.host)}get protocol(){return super.parseProtocol(this.#e.protocol.slice(0,-1))}get body(){if(this.#t!==void 0){let e=this.#t,t=(async function*(){yield await e.bytes()})();return M.ReadableStream.from(t)}}blob(){let e=this.#t;return e?Promise.resolve(e):Promise.reject(new Error("no body set"))}async text(){return await(await this.blob()).text()}async formData(){let t=await(await this.blob()).text();return new URLSearchParams(t)}async json(){let e=await this.blob();if(e.size===0)return;let t=await e.text();return JSON.parse(t)}async writeBody(e){if(e===void 0){this.#t=new Blob([]);return}if(e instanceof ReadableStream){let t=[],s=e.getReader(),n=!1;for(;!n;){let{value:o,done:a}=await s.read();a?n=!0:t.push(o)}this.#t=new Blob(t)}else e=await e,typeof e=="string"?this.#t=new Blob([e],{type:"text/plain"}):this.#t=new Blob([e]);this.headers.has("content-type")||this.setHeader("Content-Type",this.#t.type||"application/octet-stream")}get URL(){return new URL(this.path+this.#e.search+this.#e.hash,`${this.protocol}://${this.host}`)}addHeader(e,t){return this.headers.add(e,t),this}setHeader(e,t){return this.headers.set(e,t),this}},A=class extends S{#e;#t=()=>{throw new Error("No content was written to the response body nor end was called on this response.")};constructor(){super(new p),this.#e=async e=>{let t=[],s;this.#t=()=>(s??=M.ReadableStream.from(t),s);let n=e.getReader(),o=!1;do{let{value:a,done:i}=await n.read();i?o=!0:t.push(a)}while(!o);return!0}}get statusCode(){return super.statusCode}set writeHandler(e){this.#t=()=>{throw new Error("Not available with custom write handler")},this.#e=e}getNativeResponse(){throw new Error("This is a mock. No running server, no native response.")}applyStatusCode(){}applyHeaders(){}applyCookies(){for(let e of this.cookies)this.headers.add("Set-Cookie",super.setCookieValue(e))}bodyInternal(e){let t=(async function*(){let s=await e;s!==void 0&&(yield s)})();return this.#e(M.ReadableStream.from(t))}async end(){return this.doCommit(async()=>await new Promise((e,t)=>{this.#e(M.ReadableStream.from([]))}))}getBody(){return this.#t()}};import*as Z from"@interopio/gateway/logging/core";function g(r){return Z.getLogger(`gateway.server.${r}`)}import{AsyncLocalStorage as He}from"node:async_hooks";var I=class extends P{},G=class{#e;#t=!1;#r;#s;constructor(e,t){this.#e=e,this.#r=t}createExchange(e,t){return new C(e,t)}set storage(e){this.#s=e}set enableLoggingRequestDetails(e){this.#t=e}formatHeaders(e){let t="{";for(let s of e.keys())if(this.#t){let n=e.get(s);t+=`"${s}": "${n}", `}else{t+="masked, ";break}return t.endsWith(", ")&&(t=t.slice(0,-2)),t+="}",t}formatRequest(e){let t=e.URL.search;return`HTTP ${e.method} "${e.path}${t}`}logRequest(e){if(this.#e.enabledFor("debug")){let t=this.#e.enabledFor("trace");this.#e.debug(`${e.logPrefix}${this.formatRequest(e.request)}${t?`, headers: ${this.formatHeaders(e.request.headers)}`:""}"`)}}logResponse(e){if(this.#e.enabledFor("debug")){let t=this.#e.enabledFor("trace"),s=e.response.statusCode;this.#e.debug(`${e.logPrefix}Completed ${s??"200 OK"}${t?`, headers: ${this.formatHeaders(e.response.headers)}`:""}"`)}}handleUnresolvedError(e,t){let{request:s,response:n,logPrefix:o}=e;if(n.setStatusCode(H.INTERNAL_SERVER_ERROR)){this.#e.error(`${o}500 Server Error for ${this.formatRequest(s)}`,t);return}throw this.#e.error(`${o}Error [${t.message} for ${this.formatRequest(s)}, but already ended (${n.statusCode})`,t),t}async web(e){return await this.#r(e)}async http(e,t){let s=this.createExchange(e,t),n=()=>(this.logRequest(s),this.web(s).then(()=>{this.logResponse(s)}).catch(o=>{this.handleUnresolvedError(s,o)}).then(async()=>{await s.response.end()}));await new Promise((o,a)=>{this.#s!==void 0?this.#s.run({exchange:s},()=>{n().then(()=>o()).catch(i=>a(i))}):n().then(()=>o()).catch(i=>a(i))})}},O=class{#e;#t=new He;#r;storage(e){return this.#t=e,this}httpHandlerDecorator(e){if(this.#r===void 0)this.#r=e;else{let t=this.#r;this.#r=s=>(s=t(s),e(s))}return this}constructor(e){this.#e=e}build(){let e=g("http"),t=new G(e,this.#e);this.#t!==void 0&&(t.storage=this.#t),t.enableLoggingRequestDetails=!1;let s=async(n,o)=>t.http(n,o);return this.#r?this.#r(s):s}};import we from"node:stream/web";var F=class extends Error{completedResponse;constructor(e,t={}){super(`error occurred after response was completed: ${e}`,t),this.completedResponse=e}};async function ee(){try{return await new Promise((r,e)=>{let t=new Promise((s,n)=>{Promise.resolve().then(()=>{r({promise:t,resolve:s,reject:n})})})})}catch(r){throw r}}var B=class r{static#e=g("test.http.handler.connector");#t;constructor(e){this.#t=e}async connect(e,t,s){let n=await ee(),o=await ee(),a=[void 0],i=new k(t,e),c=new A;return i.writeHandler=async d=>{this.log("Invoking HttpHandler for ",e,t);let l=await this.adoptRequest(i,d),u=this.prepareResponse(c,l);try{await this.#t(l,u),o.resolve()}catch(h){o.reject(h)}return!0},c.writeHandler=async d=>(this.log("Creating client response for ",e,t),a[0]=this.adoptResponse(c,d),!0),this.log("Writing client request for ",e,t),s(i).then(()=>{n.resolve()}).catch(d=>{n.reject(d)}),Promise.all([n.promise,o.promise]).catch(d=>{let l=a[0];throw l!==void 0?new F(l,{cause:d}):d}).then(()=>a[0]??this.adoptResponse(c,we.ReadableStream.from([])))}log(e,t,s){r.#e.enabledFor("debug")&&r.#e.debug(`${e} ${t} "${s.href}"`)}async adoptRequest(e,t){let s=e.method,n=e.URL,o=e.headers,a=e.cookies,i=new L(n,s);for(let c of o.keys()){let d=o.get(c);if(d!==void 0)if(typeof d=="number"&&(d=String(d)),typeof d=="string")i.setHeader(c,d);else for(let l of d)i.addHeader(c,l)}return await i.writeBody(t),i}prepareResponse(e,t){return t.method==="HEAD"?new I(e):e}adoptResponse(e,t){let s=e.statusCode,n=e.headers,o=e.cookies,a=new T(s);for(let i of n.keys()){let c=n.get(i);if(c!==void 0)if(typeof c=="number"&&(c=String(c)),typeof c=="string")a.setHeader(i,c);else for(let d of c)a.addHeader(i,d)}return a.body=t,a}};import{IOGateway as te}from"@interopio/gateway";var dt=g("gateway.ws.client-verify");function re(r){if(r){let e=(r.block??r.blacklist??[]).map(te.Filtering.regexify),t=(r.allow??r.whitelist??[]).map(te.Filtering.regexify);return{non_matched:r.non_matched??"allow",missing:r.missing??"allow",allow:t,block:e}}}var Se=async r=>z();Se.toString=()=>"any-exchange";var se=Object.freeze({}),N=Object.freeze({match:!1,variables:se}),z=(r=se)=>({match:!0,variables:r}),ne=(r,e)=>{let t=e?.method,s=async n=>{let o=n.request,a=o.path;if(t!==void 0&&o.method!==t)return N;if(typeof r=="string")return a===r?z():N;{let i=r.exec(a);return i===null?N:{match:!0,variables:{...i.groups}}}};return s.toString=()=>`pattern(${r.toString()}, method=${t??"<any>"})`,s};var Ce=async({request:r})=>r.upgrade&&r.headers.one("upgrade")?.toLowerCase()==="websocket"?z():N;Ce.toString=()=>"websocket upgrade";import{IOGateway as oe}from"@interopio/gateway";async function ae(r,e,t){let s=(o,a)=>{if(a?.cors){let i=a.cors===!0?{allowOrigins:a.origins?.allow?.map(oe.Filtering.regexify),allowMethods:o.method===void 0?["*"]:[o.method],allowCredentials:a.authorize?.access!=="permitted"?!0:void 0}:a.cors,c=o.path;t.cors.push([c,i])}},n=new class{handle(...o){o.forEach(({request:a,options:i,handler:c})=>{let d=ne(oe.Filtering.regexify(a.path),{method:a.method});i?.authorize&&t.authorize.push([d,i.authorize]),s(a,i);let l=async(u,h)=>{let{match:R,variables:q}=await d(u);R?await c(u,q):await h()};t.middleware.push(l)})}socket(...o){for(let{path:a,factory:i,options:c}of o){let d=a??"/";t.sockets.set(d,{default:a===void 0,ping:c?.ping,factory:i,maxConnections:c?.maxConnections,authorize:c?.authorize,originFilters:re(c?.origins)})}}};await r(n,e)}function ie(...r){if(!Array.isArray(r))throw new Error("middleware must be array!");let e=r.flat();for(let t of e)if(typeof t!="function")throw new Error("middleware must be compose of functions!");return async function(t,s){let n=async(o,a)=>{let i=o===e.length?s:e[o];if(i===void 0)return;let c=!1,d=!1,u=await i(a,async h=>{if(c)throw new Error("next() called multiple times");c=!0;try{return await n(o+1,h??a)}finally{d=!0}});if(c&&!d)throw new Error(`middleware resolved before downstream.
2
+ You are probably missing an await or return statement in your middleware function.`);return u};return n(0,t)}}import{AsyncLocalStorage as ve}from"node:async_hooks";function de(r){return new _(r)}function ce(){return new U}var j=class{#e;#t;#r;constructor(e,t,s){this.#e=e,this.#t=t,this.#r=s}fetch=async(e,t)=>{try{let s=t?.method??"GET",n=new URL(e,this.#t),o=await this.#e.connect(s,n,async d=>{let l=new Headers(t?.headers);for(let[h,R]of l.entries())d.headers.add(h,R);let u=t?.body??Promise.resolve();if(u instanceof ReadableStream)throw new Error(`Unsupported body type ${typeof t?.body} in fetch request`);if(u instanceof FormData){let h=Array.from(u.entries());u=new URLSearchParams;for(let[R,q]of h)u.append(R,q.toString())}u instanceof URLSearchParams&&(d.headers.has("content-type")||d.headers.set("content-type","application/x-www-form-urlencoded"),u=u.toString()),u instanceof Blob&&(u=await u.bytes()),typeof u=="string"&&(u=Buffer.from(u)),await d.body(u)}),a=new Headers;for(let d of o.headers.keys()){let l=o.headers.list(d);for(let u of l)a.append(d,u)}let i=o.statusCode?.value,c=await o.blob();return new Response(c,{status:i,headers:a})}catch{return Response.error()}}},U=class{#e;#t;#r="http://localhost:8080";constructor(e,t){if(!(e===void 0||t===void 0))throw new Error("You can only set either httpHandlerBuilder or connector, not both.");this.#t=t,this.#e=e}baseUrl(e){return this.#r=e,this}clientConnector(e){return this.#t=e,this}async build(){let e=this.#t;return e===void 0&&this.#e!==void 0&&(e=new B((await this.#e).build())),e??=new E,new j(e,this.#r,this)}},Y=class{configureClient(){let e=this.initHttpHandlerBuilder();return new U(e)}async build(){return await this.configureClient().build()}},_=class extends Y{#e;constructor(e){super(),this.#e=e}async initHttpHandlerBuilder(){let e={middleware:[],corsConfig:{allowOrigin:["http://localhost:8086"]},cors:[],authConfig:{type:"none"},authorize:[],storage:new ve,sockets:new Map};await ae(this.#e,{},e);let t=ie(...e.middleware);return new O(t)}};var xt={bindToApp:de,bindToServer:ce};export{xt as TestClient};
3
3
  //# sourceMappingURL=test.js.map