@interopio/gateway-server 0.21.0 → 0.22.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.
@@ -1,2 +1,2 @@
1
- import*as r from"@interopio/gateway/metrics/publisher/rest";import{CookieAgent as a}from"http-cookie-agent/undici/v6";import{CookieAgent as f}from"http-cookie-agent/undici";import{interceptors as p}from"undici";import{CookieJar as m}from"tough-cookie";function g(e){let o=process.version,t=Number(o.substring(1,o.indexOf(".")));return t>=18&&t<24?new a({cookies:{jar:e}}):new f({cookies:{jar:e}}).compose(p.redirect())}var u=e=>{let o=e??globalThis.fetch,t=new m,i=g(t);return async(n,s)=>{let c={...s,dispatcher:i};return await o(n,c)}},y=r.name;async function l(e,o){return r.create({...e,fetch:u(e.fetch)},o)}export{l as create,u as fetchWithCookies,y as name};
1
+ import*as i from"@interopio/gateway/metrics/publisher/rest";import{CookieAgent as a}from"http-cookie-agent/undici/v6";import{CookieAgent as f}from"http-cookie-agent/undici";import{CookieJar as p}from"tough-cookie";async function m(e){let t=process.version,o=Number(t.substring(1,t.indexOf(".")));if(o>=18&&o<24)return new a({cookies:{jar:e}});{let{interceptors:r}=await import("undici");return new f({cookies:{jar:e}}).compose(r.redirect())}}var g=async e=>{let t=e??globalThis.fetch,o=new p,n=await m(o);return async(r,s)=>{let c={...s,dispatcher:n};return await t(r,c)}},w=i.name;async function y(e,t){return i.create({...e,fetch:await g(e.fetch)},t)}export{y as create,g as fetchWithCookies,w as name};
2
2
  //# sourceMappingURL=rest.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/gateway/metrics/rest.ts"],
4
- "sourcesContent": ["import * as rest from '@interopio/gateway/metrics/publisher/rest';\nimport type { Logger } from '@interopio/gateway/logging/api';\nimport { CookieAgent as CookieAgentUndiciV6 } from 'http-cookie-agent/undici/v6';\nimport { CookieAgent as CookieAgentUndici } from 'http-cookie-agent/undici';\nimport { interceptors } from 'undici';\nimport { CookieJar } from 'tough-cookie';\n\nfunction cookieAgent(jar: CookieJar) {\n const version = process.version;\n const major = Number(version.substring(1 /*skip v prefix*/, version.indexOf('.')));\n const useUndiciV6 = major >= 18 && major < 24; // undici v6 is used for Node.js 18.x to 23.x\n\n if (useUndiciV6) {\n return new CookieAgentUndiciV6({cookies: {jar}});\n }\n else {\n return new CookieAgentUndici({cookies: {jar}}).compose(interceptors.redirect());\n }\n\n}\nexport const fetchWithCookies = (existing?: typeof fetch): typeof fetch => {\n const fetchFn = existing ?? globalThis.fetch;\n const jar = new CookieJar();\n const dispatcher = cookieAgent(jar);\n return async (input: RequestInfo | URL, request?: RequestInit) => {\n const requestWithDispatcher = {...request, dispatcher};\n return await fetchFn(input, requestWithDispatcher);\n }\n}\nexport const name = rest.name;\n\nexport async function create(cfg: rest.RestPublisherConfig, logger: Logger) {\n return rest.create({...cfg, fetch: fetchWithCookies(cfg.fetch)}, logger);\n}\n"],
5
- "mappings": "AAAA,UAAYA,MAAU,4CAEtB,OAAS,eAAeC,MAA2B,8BACnD,OAAS,eAAeC,MAAyB,2BACjD,OAAS,gBAAAC,MAAoB,SAC7B,OAAS,aAAAC,MAAiB,eAE1B,SAASC,EAAYC,EAAgB,CACjC,IAAMC,EAAU,QAAQ,QAClBC,EAAQ,OAAOD,EAAQ,UAAU,EAAqBA,EAAQ,QAAQ,GAAG,CAAC,CAAC,EAGjF,OAFoBC,GAAS,IAAMA,EAAQ,GAGhC,IAAIP,EAAoB,CAAC,QAAS,CAAC,IAAAK,CAAG,CAAC,CAAC,EAGxC,IAAIJ,EAAkB,CAAC,QAAS,CAAC,IAAAI,CAAG,CAAC,CAAC,EAAE,QAAQH,EAAa,SAAS,CAAC,CAGtF,CACO,IAAMM,EAAoBC,GAA0C,CACvE,IAAMC,EAAUD,GAAY,WAAW,MACjCJ,EAAM,IAAIF,EACVQ,EAAaP,EAAYC,CAAG,EAClC,MAAO,OAAOO,EAA0BC,IAA0B,CAC9D,IAAMC,EAAwB,CAAC,GAAGD,EAAS,WAAAF,CAAU,EACrD,OAAO,MAAMD,EAAQE,EAAOE,CAAqB,CACrD,CACJ,EACaC,EAAY,OAEzB,eAAsBC,EAAOC,EAA+BC,EAAgB,CACxE,OAAY,SAAO,CAAC,GAAGD,EAAK,MAAOT,EAAiBS,EAAI,KAAK,CAAC,EAAGC,CAAM,CAC3E",
6
- "names": ["rest", "CookieAgentUndiciV6", "CookieAgentUndici", "interceptors", "CookieJar", "cookieAgent", "jar", "version", "major", "fetchWithCookies", "existing", "fetchFn", "dispatcher", "input", "request", "requestWithDispatcher", "name", "create", "cfg", "logger"]
4
+ "sourcesContent": ["import * as rest from '@interopio/gateway/metrics/publisher/rest';\nimport type { Logger } from '@interopio/gateway/logging/api';\nimport { CookieAgent as CookieAgentUndiciV6 } from 'http-cookie-agent/undici/v6';\nimport { CookieAgent as CookieAgentUndici } from 'http-cookie-agent/undici';\nimport { CookieJar } from 'tough-cookie';\n\nasync function cookieAgent(jar: CookieJar) {\n const version = process.version;\n const major = Number(version.substring(1 /*skip v prefix*/, version.indexOf('.')));\n const useUndiciV6 = major >= 18 && major < 24; // undici v6 is used for Node.js 18.x to 23.x\n\n if (useUndiciV6) {\n return new CookieAgentUndiciV6({cookies: {jar}});\n }\n else {\n const { interceptors } = await import('undici');\n return new CookieAgentUndici({cookies: {jar}}).compose(interceptors.redirect());\n }\n\n}\nexport const fetchWithCookies = async (existing?: typeof fetch): Promise<typeof fetch> => {\n const fetchFn = existing ?? globalThis.fetch;\n const jar = new CookieJar();\n const dispatcher = await cookieAgent(jar);\n return async (input: RequestInfo | URL, request?: RequestInit) => {\n const requestWithDispatcher = {...request, dispatcher};\n return await fetchFn(input, requestWithDispatcher);\n }\n}\nexport const name = rest.name;\n\nexport async function create(cfg: rest.RestPublisherConfig, logger: Logger) {\n return rest.create({...cfg, fetch: await fetchWithCookies(cfg.fetch)}, logger);\n}\n"],
5
+ "mappings": "AAAA,UAAYA,MAAU,4CAEtB,OAAS,eAAeC,MAA2B,8BACnD,OAAS,eAAeC,MAAyB,2BACjD,OAAS,aAAAC,MAAiB,eAE1B,eAAeC,EAAYC,EAAgB,CACvC,IAAMC,EAAU,QAAQ,QAClBC,EAAQ,OAAOD,EAAQ,UAAU,EAAqBA,EAAQ,QAAQ,GAAG,CAAC,CAAC,EAGjF,GAFoBC,GAAS,IAAMA,EAAQ,GAGvC,OAAO,IAAIN,EAAoB,CAAC,QAAS,CAAC,IAAAI,CAAG,CAAC,CAAC,EAE9C,CACD,GAAM,CAAE,aAAAG,CAAa,EAAI,KAAM,QAAO,QAAQ,EAC9C,OAAO,IAAIN,EAAkB,CAAC,QAAS,CAAC,IAAAG,CAAG,CAAC,CAAC,EAAE,QAAQG,EAAa,SAAS,CAAC,CAClF,CAEJ,CACO,IAAMC,EAAmB,MAAOC,GAAmD,CACtF,IAAMC,EAAUD,GAAY,WAAW,MACjCL,EAAM,IAAIF,EACVS,EAAa,MAAMR,EAAYC,CAAG,EACxC,MAAO,OAAOQ,EAA0BC,IAA0B,CAC9D,IAAMC,EAAwB,CAAC,GAAGD,EAAS,WAAAF,CAAU,EACrD,OAAO,MAAMD,EAAQE,EAAOE,CAAqB,CACrD,CACJ,EACaC,EAAY,OAEzB,eAAsBC,EAAOC,EAA+BC,EAAgB,CACxE,OAAY,SAAO,CAAC,GAAGD,EAAK,MAAO,MAAMT,EAAiBS,EAAI,KAAK,CAAC,EAAGC,CAAM,CACjF",
6
+ "names": ["rest", "CookieAgentUndiciV6", "CookieAgentUndici", "CookieJar", "cookieAgent", "jar", "version", "major", "interceptors", "fetchWithCookies", "existing", "fetchFn", "dispatcher", "input", "request", "requestWithDispatcher", "name", "create", "cfg", "logger"]
7
7
  }
package/dist/tools.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";var W=Object.create;var y=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var z=Object.getPrototypeOf,Q=Object.prototype.hasOwnProperty;var f=(e,t)=>{for(var r in t)y(e,r,{get:t[r],enumerable:!0})},v=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Y(t))!Q.call(e,s)&&s!==r&&y(e,s,{get:()=>t[s],enumerable:!(n=q(t,s))||n.enumerable});return e};var T=(e,t,r)=>(r=e!=null?W(z(e)):{},v(t||!e||!e.__esModule?y(r,"default",{value:e,enumerable:!0}):r,e)),X=e=>v(y({},"__esModule",{value:!0}),e);var ae={};f(ae,{argon2:()=>L,keygen:()=>w,manage:()=>k,mkcert:()=>D});module.exports=X(ae);var L={};f(L,{ARGON2_VERSION:()=>_,ARGON2_VERSION_10:()=>I,ARGON2_VERSION_13:()=>K,DEFAULT_ALGORITHM:()=>ee,DEFAULT_HASH_LENGTH:()=>M,DEFAULT_MEMORY:()=>N,DEFAULT_PARALLELISM:()=>P,DEFAULT_PASSES:()=>$,DEFAULT_SALT_LENGTH:()=>C,createHash:()=>O,decode:()=>B,encode:()=>F,hash:()=>te,verify:()=>re});var w={};f(w,{createSalt:()=>A});var H=require("node:crypto");function A(e){return(0,H.getRandomValues)(Buffer.alloc(e))}var S;async function Z(){if(S===void 0)try{let e=await import("node:crypto");if(!e.argon2)throw new Error("argon2 not available");S=e.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 S}var I=16,K=19,_=K,ee="argon2id",C=16,M=32,P=4,N=65536,$=3;function B(e){let t=e.split("$");if(t.length<4)throw new Error("Invalid encoded Argon2 hash");let r=1,n=t[r++];if(n!=="argon2d"&&n!=="argon2i"&&n!=="argon2id")throw new Error("Invalid Argon2 type");let s=I;t[r].startsWith("v=")&&(s=parseInt(t[r].substring(2),10),r++);let a={},p=t[r++].split(",");for(let c of p){let[i,o]=c.split("=");switch(i){case"m":a.memory=parseInt(o,10);break;case"t":a.passes=parseInt(o,10);break;case"p":a.parallelism=parseInt(o,10);break}}a.nonce=Buffer.from(t[r++],"base64url");let g=Buffer.from(t[r++],"base64url");return{algorithm:n,version:s,parameters:a,hash:g}}function F(e){let{algorithm:t,version:r,parameters:n,hash:s}=e;return`$${t}$v=${r}$m=${n.memory},t=${n.passes},p=${n.parallelism}$${n.nonce.toString("base64url")}$${s.toString("base64url")}`}async function O(e,t,r,n){let s=n?.nonce??A(C),a=n?.memory??N,p=n?.passes??$,g=n?.parallelism??P,c={message:t,tagLength:r,nonce:s,memory:a,passes:p,parallelism:g},i=await Z();return new Promise((o,l)=>{i(e,c,(x,h)=>{x?l(x):h?o(Buffer.from(h)):l(new Error("argon2 returned no result"))})})}async function te(e,t){let r=t?.algorithm??"argon2id",n=t?.saltLength??C,s=t?.hashLength??M,a=t?.parallelism??P,p=t?.memory??N,g=t?.passes??$,c=A(n),i={memory:p,passes:g,parallelism:a,nonce:c},o=await O(r,e,s,i);return F({algorithm:r,version:_,parameters:i,hash:o})}async function re(e,t){try{let r=B(e),n=await O(r.algorithm,t,r.hash.length,r.parameters);return r.hash.equals(n)}catch{return!1}}var k={};f(k,{sendCommand:()=>ne});var j=T(require("net"),1);function ne(e,t,r={}){let{timeout:n=5e3}=r,s=e?.path?{path:e.path}:{port:e?.port??0},a=e?.path??`port ${e?.port}`;return new Promise((p,g)=>{let c=j.default.connect(s,()=>{c.write(JSON.stringify(t))}),i=setTimeout(()=>{c.destroy(),g(new Error(`Connection timed out after ${n}`))},n);c.on("data",o=>{clearTimeout(i);try{let l=JSON.parse(o.toString());l.error?g(new Error(l.error)):p(l.result)}catch{p(o.toString())}c.end()}),c.on("error",o=>{clearTimeout(i),o.code==="ENOENT"||o.code==="ECONNREFUSED"?g(new Error(`Cannot connect to gateway at ${a}. Make sure the gateway server is running and the path is correct.`,{cause:o})):g(o)})})}var D={};f(D,{DEFAULT_CA_NAME:()=>J,generateCert:()=>oe,generateRootCA:()=>se});var m=require("jsrsasign"),E=require("node:os"),G=require("node:crypto"),d=`${(0,E.userInfo)().username}@${(0,E.hostname)()}`;function V(){return(0,G.randomBytes)(16).toString("hex")}var b="io.Gateway Dev CA",J=`${b} ${d}`;function se(e){let t=e?.name||J,r=e?.passphrase,n=m.KEYUTIL.generateKeypair("EC","secp384r1"),s=n.prvKeyObj,a=n.pubKeyObj,p=r?m.KEYUTIL.getPEM(s,"PKCS8PRV",r,"AES-256-CBC"):m.KEYUTIL.getPEM(s,"PKCS8PRV"),c=new m.KJUR.asn1.x509.Certificate({version:3,serial:{hex:V()},issuer:{str:`/CN=${t}/O=${b}/OU=${d}`},subject:{str:`/CN=${t}/O=${b}/OU=${d}`},notbefore:(0,m.datetozulu)(new Date(Date.now()-60*1e3),!1,!1),notafter:(0,m.datetozulu)(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:s}).getPEM();return{key:p,cert:c}}function oe(e,t,r,n=!1,s=7){let a=m.KEYUTIL.generateKeypair("EC","secp256r1"),p=a.prvKeyObj,g=a.pubKeyObj,c=m.KEYUTIL.getPEM(p,"PKCS8PRV"),i=[],o=n?"dev-user":"localhost";for(let u of r)if(u.toLowerCase().startsWith("ip:"))i.push({ip:u.substring(3)});else if(u.toLowerCase().startsWith("email:"))i.push({rfc822:u.substring(6)});else{let R=u.toLowerCase().startsWith("dns:");if(n)o=R?u.substring(4):u;else{let U=R?u.substring(4):u;i.push({dns:U}),i.length===1&&(o=U)}}let l=[{extname:"basicConstraints",cA:!1},{extname:"keyUsage",critical:!0,names:["digitalSignature","keyEncipherment"]},{extname:"extKeyUsage",array:[n?"clientAuth":"serverAuth"]}];i.length>0&&l.push({extname:"subjectAltName",array:i});let h=new m.KJUR.asn1.x509.Certificate({version:3,serial:{hex:V()},issuer:{str:t},subject:{str:`/CN=${o}/O=${b}/OU=${d}`},notbefore:(0,m.datetozulu)(new Date(Date.now()-60*1e3),!1,!1),notafter:(0,m.datetozulu)(new Date(Date.now()+s*24*60*60*1e3),!1,!1),sbjpubkey:g,ext:l,sigalg:"SHA256withECDSA",cakey:e}).getPEM();return{key:c,cert:h}}0&&(module.exports={argon2,keygen,manage,mkcert});
2
+ //# sourceMappingURL=tools.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/tools/index.ts", "../src/tools/crypto/argon2.ts", "../src/tools/crypto/keygen.ts", "../src/manage/client.ts", "../src/tools/mkcert.ts"],
4
+ "sourcesContent": ["export * as argon2 from './crypto/argon2.ts';\nexport * as keygen from './crypto/keygen.ts';\nexport * as manage from '../manage/client.ts';\nexport * as mkcert from './mkcert.ts';\n", "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 net from 'net';\nimport type { ManagementCommand, ManagementEndpoint, SendCommandOptions } from '../../types/manage.d.ts';\n\nexport function sendCommand(\n server: ManagementEndpoint,\n command: ManagementCommand,\n options: SendCommandOptions = {}\n): Promise<unknown> {\n const { timeout = 5000 } = options;\n\n // Determine connection target: named pipe/socket path or port\n const connectOptions: net.NetConnectOpts = server?.path\n ? { path: server.path }\n : { port: server?.port ?? 0 };\n\n const target = server?.path ?? `port ${server?.port}`;\n\n return new Promise((resolve, reject) => {\n const client = net.connect(connectOptions, () => {\n client.write(JSON.stringify(command));\n });\n\n const timeoutId = setTimeout(() => {\n client.destroy();\n reject(new Error(`Connection timed out after ${timeout}`));\n }, timeout);\n\n client.on('data', (data) => {\n clearTimeout(timeoutId);\n try {\n const response = JSON.parse(data.toString());\n if (response.error) {\n reject(new Error(response.error));\n }\n else {\n resolve(response.result);\n }\n }\n catch {\n // Not JSON, return as raw string\n resolve(data.toString());\n }\n client.end();\n });\n\n client.on('error', (err: NodeJS.ErrnoException) => {\n clearTimeout(timeoutId);\n if (err.code === 'ENOENT' || err.code === 'ECONNREFUSED') {\n reject(new Error(`Cannot connect to gateway at ${target}. Make sure the gateway server is running and the path is correct.`, { cause: err }));\n }\n else {\n reject(err);\n }\n });\n });\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": "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",
6
+ "names": ["index_exports", "__export", "argon2_exports", "keygen_exports", "client_exports", "mkcert_exports", "__toCommonJS", "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", "import_node_crypto", "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", "client_exports", "__export", "sendCommand", "import_net", "server", "command", "options", "timeout", "connectOptions", "target", "resolve", "reject", "client", "net", "timeoutId", "data", "response", "err", "mkcert_exports", "__export", "DEFAULT_CA_NAME", "generateCert", "generateRootCA", "import_jsrsasign", "import_node_os", "import_node_crypto", "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/tools.js ADDED
@@ -0,0 +1,2 @@
1
+ var F=Object.defineProperty;var h=(t,e)=>{for(var r in e)F(t,r,{get:e[r],enumerable:!0})};var H={};h(H,{ARGON2_VERSION:()=>R,ARGON2_VERSION_10:()=>k,ARGON2_VERSION_13:()=>D,DEFAULT_ALGORITHM:()=>V,DEFAULT_HASH_LENGTH:()=>U,DEFAULT_MEMORY:()=>C,DEFAULT_PARALLELISM:()=>S,DEFAULT_PASSES:()=>P,DEFAULT_SALT_LENGTH:()=>w,createHash:()=>N,decode:()=>v,encode:()=>T,hash:()=>J,verify:()=>W});var L={};h(L,{createSalt:()=>y});import{getRandomValues as j}from"node:crypto";function y(t){return j(Buffer.alloc(t))}var x;async function G(){if(x===void 0)try{let t=await import("node:crypto");if(!t.argon2)throw new Error("argon2 not available");x=t.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 x}var k=16,D=19,R=D,V="argon2id",w=16,U=32,S=4,C=65536,P=3;function v(t){let e=t.split("$");if(e.length<4)throw new Error("Invalid encoded Argon2 hash");let r=1,n=e[r++];if(n!=="argon2d"&&n!=="argon2i"&&n!=="argon2id")throw new Error("Invalid Argon2 type");let o=k;e[r].startsWith("v=")&&(o=parseInt(e[r].substring(2),10),r++);let a={},g=e[r++].split(",");for(let c of g){let[i,s]=c.split("=");switch(i){case"m":a.memory=parseInt(s,10);break;case"t":a.passes=parseInt(s,10);break;case"p":a.parallelism=parseInt(s,10);break}}a.nonce=Buffer.from(e[r++],"base64url");let m=Buffer.from(e[r++],"base64url");return{algorithm:n,version:o,parameters:a,hash:m}}function T(t){let{algorithm:e,version:r,parameters:n,hash:o}=t;return`$${e}$v=${r}$m=${n.memory},t=${n.passes},p=${n.parallelism}$${n.nonce.toString("base64url")}$${o.toString("base64url")}`}async function N(t,e,r,n){let o=n?.nonce??y(w),a=n?.memory??C,g=n?.passes??P,m=n?.parallelism??S,c={message:e,tagLength:r,nonce:o,memory:a,passes:g,parallelism:m},i=await G();return new Promise((s,p)=>{i(t,c,(E,f)=>{E?p(E):f?s(Buffer.from(f)):p(new Error("argon2 returned no result"))})})}async function J(t,e){let r=e?.algorithm??"argon2id",n=e?.saltLength??w,o=e?.hashLength??U,a=e?.parallelism??S,g=e?.memory??C,m=e?.passes??P,c=y(n),i={memory:g,passes:m,parallelism:a,nonce:c},s=await N(r,t,o,i);return T({algorithm:r,version:R,parameters:i,hash:s})}async function W(t,e){try{let r=v(t),n=await N(r.algorithm,e,r.hash.length,r.parameters);return r.hash.equals(n)}catch{return!1}}var I={};h(I,{sendCommand:()=>Y});import q from"net";function Y(t,e,r={}){let{timeout:n=5e3}=r,o=t?.path?{path:t.path}:{port:t?.port??0},a=t?.path??`port ${t?.port}`;return new Promise((g,m)=>{let c=q.connect(o,()=>{c.write(JSON.stringify(e))}),i=setTimeout(()=>{c.destroy(),m(new Error(`Connection timed out after ${n}`))},n);c.on("data",s=>{clearTimeout(i);try{let p=JSON.parse(s.toString());p.error?m(new Error(p.error)):g(p.result)}catch{g(s.toString())}c.end()}),c.on("error",s=>{clearTimeout(i),s.code==="ENOENT"||s.code==="ECONNREFUSED"?m(new Error(`Cannot connect to gateway at ${a}. Make sure the gateway server is running and the path is correct.`,{cause:s})):m(s)})})}var B={};h(B,{DEFAULT_CA_NAME:()=>M,generateCert:()=>ee,generateRootCA:()=>Z});import{KEYUTIL as u,KJUR as K,datetozulu as A}from"jsrsasign";import{userInfo as z,hostname as Q}from"node:os";import{randomBytes as X}from"node:crypto";var d=`${z().username}@${Q()}`;function _(){return X(16).toString("hex")}var b="io.Gateway Dev CA",M=`${b} ${d}`;function Z(t){let e=t?.name||M,r=t?.passphrase,n=u.generateKeypair("EC","secp384r1"),o=n.prvKeyObj,a=n.pubKeyObj,g=r?u.getPEM(o,"PKCS8PRV",r,"AES-256-CBC"):u.getPEM(o,"PKCS8PRV"),c=new K.asn1.x509.Certificate({version:3,serial:{hex:_()},issuer:{str:`/CN=${e}/O=${b}/OU=${d}`},subject:{str:`/CN=${e}/O=${b}/OU=${d}`},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:o}).getPEM();return{key:g,cert:c}}function ee(t,e,r,n=!1,o=7){let a=u.generateKeypair("EC","secp256r1"),g=a.prvKeyObj,m=a.pubKeyObj,c=u.getPEM(g,"PKCS8PRV"),i=[],s=n?"dev-user":"localhost";for(let l of r)if(l.toLowerCase().startsWith("ip:"))i.push({ip:l.substring(3)});else if(l.toLowerCase().startsWith("email:"))i.push({rfc822:l.substring(6)});else{let $=l.toLowerCase().startsWith("dns:");if(n)s=$?l.substring(4):l;else{let O=$?l.substring(4):l;i.push({dns:O}),i.length===1&&(s=O)}}let p=[{extname:"basicConstraints",cA:!1},{extname:"keyUsage",critical:!0,names:["digitalSignature","keyEncipherment"]},{extname:"extKeyUsage",array:[n?"clientAuth":"serverAuth"]}];i.length>0&&p.push({extname:"subjectAltName",array:i});let f=new K.asn1.x509.Certificate({version:3,serial:{hex:_()},issuer:{str:e},subject:{str:`/CN=${s}/O=${b}/OU=${d}`},notbefore:A(new Date(Date.now()-60*1e3),!1,!1),notafter:A(new Date(Date.now()+o*24*60*60*1e3),!1,!1),sbjpubkey:m,ext:p,sigalg:"SHA256withECDSA",cakey:t}).getPEM();return{key:c,cert:f}}export{H as argon2,L as keygen,I as manage,B as mkcert};
2
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/tools/crypto/argon2.ts", "../src/tools/crypto/keygen.ts", "../src/manage/client.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 net from 'net';\nimport type { ManagementCommand, ManagementEndpoint, SendCommandOptions } from '../../types/manage.d.ts';\n\nexport function sendCommand(\n server: ManagementEndpoint,\n command: ManagementCommand,\n options: SendCommandOptions = {}\n): Promise<unknown> {\n const { timeout = 5000 } = options;\n\n // Determine connection target: named pipe/socket path or port\n const connectOptions: net.NetConnectOpts = server?.path\n ? { path: server.path }\n : { port: server?.port ?? 0 };\n\n const target = server?.path ?? `port ${server?.port}`;\n\n return new Promise((resolve, reject) => {\n const client = net.connect(connectOptions, () => {\n client.write(JSON.stringify(command));\n });\n\n const timeoutId = setTimeout(() => {\n client.destroy();\n reject(new Error(`Connection timed out after ${timeout}`));\n }, timeout);\n\n client.on('data', (data) => {\n clearTimeout(timeoutId);\n try {\n const response = JSON.parse(data.toString());\n if (response.error) {\n reject(new Error(response.error));\n }\n else {\n resolve(response.result);\n }\n }\n catch {\n // Not JSON, return as raw string\n resolve(data.toString());\n }\n client.end();\n });\n\n client.on('error', (err: NodeJS.ErrnoException) => {\n clearTimeout(timeoutId);\n if (err.code === 'ENOENT' || err.code === 'ECONNREFUSED') {\n reject(new Error(`Cannot connect to gateway at ${target}. Make sure the gateway server is running and the path is correct.`, { cause: err }));\n }\n else {\n reject(err);\n }\n });\n });\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": "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",
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", "client_exports", "__export", "sendCommand", "net", "server", "command", "options", "timeout", "connectOptions", "target", "resolve", "reject", "client", "timeoutId", "data", "response", "err", "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,14 @@
1
- import{isIP as le}from"node:net";import{Cookie as W}from"tough-cookie";function ue(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:le(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 ue(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()}},R=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=R.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 we(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),we(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 H 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=()=>H.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(H.ReadableStream.from(t))}async end(){return await this.body(Promise.resolve())}},T=class extends m{#e;#t=H.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=H.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 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 Re}from"node:async_hooks";var I=class extends P{};function He(r,e){if(r==null)return!1;let{code:t,message:s}=r;return t==="ECONNRESET"||t==="EPIPE"||t==="ERR_STREAM_PREMATURE_CLOSE"||s?.toLowerCase().includes("client aborted")||s?.toLowerCase().includes("socket hang up")||s?.toLowerCase().includes("aborted")?(e.enabledFor("trace")?e.trace("looks like the client has gone away:",r):e.enabledFor("debug")&&e.debug(`looks like the client has gone away: ${r.message} (For full stack trace enable trace logging level.)`),!0):!1}var F=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(R.INTERNAL_SERVER_ERROR)){this.#e.error(`${o}500 Server Error for ${this.formatRequest(s)}`,t);return}if(!He(t,this.#e))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=[];#r=new Re;#s;constructor(e){this.#e=e}middleware(e){return e(this.#t),this}storage(e){return this.#r=e,this}httpHandlerDecorator(e){if(this.#s===void 0)this.#s=e;else{let t=this.#s;this.#s=s=>(s=e(s),s=t(s),s)}return this}hasHttpHandlerDecorator(){return this.#s!==void 0}build(){let e=g("http"),t=new F(e,this.#e);this.#r!==void 0&&(t.storage=this.#r),t.enableLoggingRequestDetails=!1;let s=async(n,o)=>t.http(n,o);return this.#s?this.#s(s):s}};import Se from"node:stream/web";var G=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;#r;constructor(e,t){this.#t=e,this.#r=t}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 u=await this.adoptRequest(i,d),l=this.prepareResponse(c,u);try{await this.#t(u,l),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 u=a[0];throw u!==void 0?new G(u,{cause:d}):d}).then(()=>a[0]??this.adoptResponse(c,Se.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 u of d)i.addHeader(c,u)}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 ct=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 Ce=async r=>z();Ce.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 ve=async({request:r})=>r.upgrade&&r.headers.one("upgrade")?.toLowerCase()==="websocket"?z():N;ve.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 u=async(l,h)=>{let{match:w,variables:q}=await d(l);w?await c(l,q):await h()};t.middleware.push(u)})}socket(...o){for(let{path:a,factory:i,options:c}of o){let d=a??"/";t.sockets.set(d,{default:a===void 0||a==="/",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,l=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 l};return n(0,t)}}import{AsyncLocalStorage as xe}from"node:async_hooks";function de(r){return new Y(r)}function ce(){return new U}var j=class{#e;#t;constructor(e,t,s){this.#e=e,this.#t=t}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 u=new Headers(t?.headers);for(let[h,w]of u.entries())d.headers.add(h,w);let l=t?.body??Promise.resolve();if(l instanceof ReadableStream)throw new Error(`Unsupported body type ${typeof t?.body} in fetch request`);if(l instanceof FormData){let h=Array.from(l.entries());l=new URLSearchParams;for(let[w,q]of h)l.append(w,q.toString())}l instanceof URLSearchParams&&(d.headers.has("content-type")||d.headers.set("content-type","application/x-www-form-urlencoded"),l=l.toString()),l instanceof Blob&&(l=await l.bytes()),typeof l=="string"&&(l=Buffer.from(l)),await d.body(l)}),a=new Headers;for(let d of o.headers.keys()){let u=o.headers.get(d);if(u!==void 0){if(typeof u=="string")a.set(d,u);else if(Array.isArray(u))for(let l of u)a.append(d,l)}}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;#s="http://localhost:8080";constructor(e,t,s){if(!(e===void 0||t===void 0))throw new Error("You can only set either httpHandlerBuilder or connector, not both.");this.#t=t,this.#r=s,this.#e=e}baseUrl(e){return this.#s=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(),this.#r)),e??=new E,new j(e,this.#s,this)}},_=class{#e;#t=[];middleware(...e){return this.#t=[...this.#t,...e],this}sslInfo(e){return this.#e=e,this}configureClient(){let e=this.initHttpHandlerBuilder(...this.#t);return new U(e,void 0,this.#e)}async build(){return await this.configureClient().build()}},Y=class extends _{#e;constructor(e){super(),this.#e=e}async initHttpHandlerBuilder(...e){let t={middleware:e,corsConfig:{allowOrigin:["http://localhost:8086"]},resourcesConfig:{locations:[]},cors:[],authConfig:{type:"none"},authorize:[],storage:new xe,sockets:new Map};await ae(this.#e,{},t);let s=ie(...t.middleware);return new O(s)}};var Et={bindToApp:de,bindToServer:ce};export{Et as TestClient};
1
+ import{isIP as Ze}from"node:net";import{Cookie as ie}from"tough-cookie";function et(r,e){let t=r.get("x-forwarded-host");if(Array.isArray(t)&&(t=t[0]),t){let n=r.one("x-forwarded-port");n&&(t=`${t}:${n}`)}return t??=r.one("host"),Array.isArray(t)&&(t=t[0]),t?t.split(",",1)[0].trim():e}function tt(r){let e=r.one("x-forwarded-ssl");return typeof e=="string"&&e.toLowerCase()==="on"}function rt(r,e){let t=r.get("x-forwarded-proto");return Array.isArray(t)&&(t=t[0]),t!==void 0?t.split(",",1)[0].trim():tt(r)?"https":e}function nt(r,e,t){let n=t?t.port:r.protocol==="https:"?443:80,s=e.one("x-forwarded-for");if(Array.isArray(s)&&(s=s[0]),s!==void 0)return s=s.split(",",1)[0].trim(),{address:s,port:Number(n),family:Ze(s)===6?"IPv6":"IPv4"}}var N=class{#e;constructor(e){this.#e=e}get headers(){return this.#e}},w=class r extends N{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 st(this.headers)}parseHost(e){return et(this.headers,e)}parseProtocol(e){return rt(this.headers,e)}parseRemoteAddress(e){return nt(this.URL,this.headers,e)}},m=class extends N{get cookies(){return ot(this.headers)}setCookieValue(e){return new ie({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 st(r){return r.list("cookie").map(e=>e.split(";").map(t=>ie.parse(t))).flat(1).filter(e=>e!==void 0).map(e=>Object.freeze({name:e.key,value:e.value}))}function ot(r){return r.list("set-cookie").map(e=>{let t=ie.parse(e);if(t){let n={name:t.key,value:t.value,maxAge:Number(t.maxAge??-1)};return t.httpOnly&&(n.httpOnly=!0),t.domain&&(n.domain=t.domain),t.path&&(n.path=t.path),t.secure&&(n.secure=!0),t.httpOnly&&(n.httpOnly=!0),t.sameSite&&(n.sameSite=t.sameSite),Object.freeze(n)}}).filter(e=>e!==void 0)}import{MIMEType as it}from"node:util";import{MIMEType as ae}from"node:util";var y="*",de=new ae(`${y}/${y}`),ce="application/octet-stream",Mt=new ae(ce);function B(r){return r.type===y}function R(r){return r.subtype===y||r.subtype.startsWith(`${y}+`)}function le(r){return!B(r)&&!R(r)}var q=class extends Error{mimeType;constructor(e,t,n){super(t===void 0?`Invalid MIME type "${e}"`:`Invalid MIME type "${e}": ${t}`,n),this.mimeType=e}};function pe(r,e,t){let n=`${r}/${e}`,s;try{s=new ae(n)}catch(o){throw new q(n,void 0,{cause:o})}return t&&s.params.set("charset",t),s}function Ae(r){let e=r.subtype.lastIndexOf("+");return e!==-1&&e<r.subtype.length?r.subtype.substring(e+1):null}function M(r,e){if(!e)return!1;if(B(r)||B(e))return!0;if(r.type===e.type){if(r.subtype===e.subtype)return!0;if(R(r)||R(e)){let t=Ae(r),n=Ae(e);if(r.subtype===y||e.subtype===y)return!0;if(R(r)&&n!==null)return t===e.subtype||t===n;if(R(e)&&t!==null)return r.subtype===n||n===t}}return!1}var at=`
2
+ application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy
3
+ application/json json
4
+ application/wasm wasm
5
+ application/x-pkcs12 p12 pfx
6
+ text/css css
7
+ text/csv csv
8
+ text/html html htm
9
+ text/javascript js mjs
10
+ text/plain txt text conf def list log in
11
+ `,u=class r extends it{static ALL=new r("*/*");static APPLICATION_OCTET_STREAM=new r(ce);static APPLICATION_JSON=new r("application/json");static APPLICATION_NDJSON=new r("application/x-ndjson");static MULTIPART_FORM_DATA=new r("multipart/form-data");static TEXT_PLAIN=new r("text/plain");static TEXT_HTML=new r("text/html");static#e="q";constructor(e){super(e),this.#t(this.type),this.#t(this.subtype);for(let[t,n]of this.params)this.checkParameters(t,n)}checkParameters(e,t){if(this.#t(e),Le(t)||this.#t(t),e===r.#e){let n=Ie(t),s=parseFloat(n);if(isNaN(s)||s<0||s>1)throw new U(`Invalid quality value: ${t}`)}}#t(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<32||n>126||n===40||n===41||n===60||n===62||n===64||n===44||n===59||n===58||n===92||n===34||n===53||n===91||n===93||n===63||n===61||n===123||n===125||n===32||n===9)throw new U(`Invalid token: ${e}`)}}get quality(){let e=this.params.get(r.#e);return e!==null?parseFloat(Ie(e)):1}static parseMediaType(e){return new r(e)}static parseMediaTypesList(e){return e?.trim()?e.split(",").map(t=>t.trim()).filter(t=>t.length>0).map(t=>r.parseMediaType(t)):[]}static parseMediaTypes(...e){return e?e.length===1?r.parseMediaTypesList(e[0]):e.flatMap(t=>r.parseMediaTypesList(t)):[]}static asMediaType(e){return e instanceof r?e:new r(e.toString())}static asMediaTypes(...e){return e.map(t=>r.asMediaType(t))}},U=class extends Error{constructor(e){super(e)}},Pt=(function(){let e=new Map;for(let t of at.trim().split(`
12
+ `)){let n=t.trim();if(!n||n.startsWith("#"))continue;let s=n.split(/\s+/);if(s.length<2)continue;let[o,...i]=s,a=u.parseMediaType(o);for(let c of i){let d="."+c.toLowerCase(),p=e.get(d);p?p.push(a):e.set(d,[a])}}return e})();function Le(r){return r.length>=2&&(r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'"))}function Ie(r){return Le(r)?r.substring(1,r.length-1):r}function dt(r){let e=[];{let t=0,n=0;for(let s=0;s<r.length;s++)switch(r.charCodeAt(s)){case 32:t===n&&(t=n=s+1);break;case 44:e.push(r.slice(t,n)),t=n=s+1;break;default:n=n+1;break}e.push(r.slice(t,n))}return e}function ct(r){typeof r=="string"&&(r=[r]),typeof r=="number"&&(r=[String(r)]);let e=[];if(r)for(let t of r)t&&e.push(...dt(t));return e}var h=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 ct(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 n=super.get(e.toLowerCase());return typeof t=="string"&&(t=[t]),n&&(t=n.concat(t)),this.set(e,t),this}},It=new h;function We(r){let e=r.one("content-type");return e?u.parseMediaType(e):void 0}var C=class extends w{constructor(e,t){super(new h),this.URL=t,this.method=e}URL;method},D=class extends m{constructor(e,t){super(t),this.statusCode=e}statusCode};var ue=class{#e;constructor(e){this.#e=e}get value(){return this.#e}toString(){return this.#e.toString()}},x=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 H(r){if(typeof r=="number"){if(r<100||r>999)throw new Error(`status code ${r} should be in range 100-999`);let e=x.resolve(r);return e!==void 0?e:new ue(r)}return r}var he=class extends C{#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 s of this.headers.keys())if(s.toLowerCase()!=="content-length")for(let o of this.headers.list(s))t.append(s,o);this.headers.has("accept")||t.append("accept","*/*");let n=this.#e;return new Request(this.URL,{method:e,headers:t,body:n})}};function lt(r){let e=new h;for(let[t,n]of r.entries())e.add(t,n);return e}var fe=class extends D{#e;constructor(e){super(H(e.status),lt(e.headers)),this.#e=e}get statusMessage(){return this.#e.statusText}get body(){return this.#e.body??void 0}blob(){return this.#e.blob()}},F=class{#e;constructor(e=globalThis.fetch){this.#e=e}async connect(e,t,n){let s=new he(e,t);await n(s);let o=s.getNativeRequest(),i=await this.#e(o);return new fe(i)}};import*as E from"node:stream/web";var $=class extends C{#e;#t=()=>{throw new Error("Body not set")};constructor(e,t){super(t,e),this.#e=async n=>{let s=[];this.#t=()=>E.ReadableStream.from(s);let o=n.getReader(),i;do{let{value:a,done:c}=await o.read();i=c,a!==void 0&&s.push(a)}while(!i);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 n=e.getReader(),s;do{let{value:o,done:i}=await n.read();s=i,o!==void 0&&(yield o)}while(!s)}else{let n=await e;n!==void 0&&(yield n)}})();return this.#e(E.ReadableStream.from(t))}async end(){return await this.body(Promise.resolve())}},V=class extends m{#e;#t=E.ReadableStream.from([]);constructor(e){super(new h),this.#e=H(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=E.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 Ue from"node:http";function ge(r,e,t){let n=r.elements;if(t=t??n.length,e===0&&t===n.length)return r;if(e===t)return P.EMPTY_PATH;if(!(e>=0&&e<n.length))throw new Error("start index out of bounds: "+e);if(!(e>=0&&t<=n.length))throw new Error("end index out of bounds: "+t);if(!(e<t))throw new Error("start index must be less than end index: "+e+" >= "+t);let s=n.slice(e,t),o=s.map(i=>i.value).join("");return new P(o,s)}var pt={separator:47,decodeAndParseParameters:!0};function z(r,e){return P.createFromUrlPath(r,e??pt)}var P=class r{static EMPTY_PATH=new r("",[]);static#e=new Map([[47,{value:"/",encoded:"%2F"}],[46,{value:".",encoded:"%2E"}]]);#t;#r;constructor(e,t){this.#t=e,this.#r=Object.freeze(t)}get value(){return this.#t}get elements(){return this.#r}static createFromUrlPath(e,t){if(e==="")return r.EMPTY_PATH;let n=t.separator,s=r.#e.get(n);if(s===void 0)throw new Error("Unsupported separator: "+n);let o=[],i;for(e.charCodeAt(0)===n?(i=1,o.push(s)):i=0;i<e.length;){let a=-1;for(let d=i;d<e.length;d++)if(e.charCodeAt(d)===n){a=d;break}let c=a!==-1?e.substring(i,a):e.substring(i);if(c.length>0&&o.push(t.decodeAndParseParameters?r.#n(c):v.from(c,s)),a===-1)break;o.push(s),i=a+1}return new r(e,o)}static#n(e){let t=e.indexOf(";");if(t===-1){let n=decodeURIComponent(e);return v.from(e,n)}else{let n=decodeURIComponent(e.substring(0,t)),s=e.substring(t),o=r.#s(s);return v.from(e,n,o)}}static#s(e){let t=new Map,n=1;for(;n<e.length;){let s=-1;for(let i=n;i<e.length;i++)if(e.charAt(i)===";"){s=i;break}let o=s!==-1?e.substring(n,s):e.substring(n);if(r.#o(o,t),s===-1)break;n=s+1}if(t.size>0)for(let s of t.values())Object.freeze(s);return t}static#o(e,t){if(e){let n=e.indexOf("=");if(n!==-1){let s=decodeURIComponent(e.substring(0,n));if(s.trim()){let o=e.substring(n+1);for(let i of o.split(",")){let a=t.get(s);a!==void 0?a.push(decodeURIComponent(i)):t.set(s,[decodeURIComponent(i)])}}}else{let s=decodeURIComponent(e);if(s.trim()){let o=t.get(s);o!==void 0?o.push(""):t.set(s,[""])}}}}},v=class r{static#e=new Map;static from(e,t,n){if(typeof t=="string"){let s=t;return new r(e,s,n)}else{let s=t,o=e.includes(s.encoded)?e.replaceAll(s.encoded,s.value):e;return r.from(e,o,n)}}#t;#r;#n;constructor(e,t,n=r.#e){this.#t=e,this.#r=t,this.#n=n}get value(){return this.#t}get valueToMatch(){return this.#r}get parameters(){return this.#n}};function Oe(r,e){return typeof r=="string"?me.parse(r,e):Oe(r.href,e)}var me=class r{static#e(e,t){if(!(t&&t.trim())||t.charAt(0)!=="/")return z("");r.#t(e.value,t);let n=t.length,s=0;for(let o=0;o<e.elements.length;o++){let i=e.elements[o];if(s+=i.value.length,n===s)return ge(e,0,o+1)}throw new Error(`Failed to initialize context path: '${t}' for request path: '${e.value}'`)}static#t(e,t){let n=t.length;if(t.charAt(0)!=="/"||t.charAt(n-1)==="/")throw new Error(`Invalid context path: '${t}'. Context path must start with '/' and must not end with '/'`);if(!e.startsWith(t))throw new Error(`Invalid context path: '${t}'. Context path must be a prefix of request path: '${e}'`);if(e.length>n&&e.charAt(n)!=="/")throw new Error(`Invalid context path: '${t}'. Context path must match to full path segments for request path: '${e}'`)}static#r(e,t){let n=t.elements.length;return ge(e,n)}static parse(e,t){let n=z(e),s=r.#e(n,t),o=r.#r(n,s);return new r(z(e),s,o)}#n;#s;#o;constructor(e,t,n){this.#n=e,this.#s=t,this.#o=n}get value(){return this.#n.value}get elements(){return this.#n.elements}get contextPath(){return this.#s}get pathWithinApplication(){return this.#o}modifyContextPath(e){let t=r.#e(this,e),n=r.#r(this,t);return new r(this,t,n)}toString(){return this.#n.toString()}},k=class extends w{#e;#t;#r;get requestPath(){return this.#t===void 0&&(this.#t=Oe(this.URL.pathname,this.#r)),this.#t}get sslInfo(){return this.#e===void 0&&(this.#e=this.initSslInfo()),this.#e}};var Ne=class extends Ue.IncomingMessage{exchange;upgradeHead;get urlBang(){return this.url}get socketEncrypted(){return this.socket.encrypted===!0}},Be=class extends Ue.ServerResponse{markHeadersSent(){this._header=!0}getRawHeaderNames(){return super.getRawHeaderNames()}},A=class extends m{#e=[];#t;#r="new";#n=[];setStatusCode(e){return this.#r==="committed"?!1:(this.#t=e,!0)}setRawStatusCode(e){return this.setStatusCode(e===void 0?void 0:H(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.#n.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(n=>{throw n})}catch(n){throw n}}async end(){return this.commited?Promise.resolve(!1):this.doCommit(async()=>await this.bodyInternal(Promise.resolve()))}doCommit(e){let t=this.#r,n=Promise.resolve();if(t==="new")this.#r="committing",this.#n.length>0&&(n=this.#n.reduce((s,o)=>s.then(()=>o()),Promise.resolve()).catch(s=>{this.#r==="committing"&&(this.#r="commit-action-failed")}));else if(t==="commit-action-failed")this.#r="committing";else return Promise.resolve(!1);return n=n.then(()=>{this.applyStatusCode(),this.applyHeaders(),this.applyCookies(),this.#r="committed"}),n.then(async()=>e!==void 0?await e():!0)}applyStatusCode(){}applyHeaders(){}applyCookies(){}};var j=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 A)return e.getNativeResponse();if(e instanceof r)return r.getNativeResponse(e.delegate);throw new Error(`Cannot get native response from ${e.constructor.name}`)}};var I=class{request;response;#e=new Map;#t;#r="";constructor(e,t,n){this.#e[qe]=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.get(e)}principal(){return Promise.resolve(void 0)}get logPrefix(){let e=this.attribute(qe);return this.#t!==e&&(this.#t=e,this.#r=e!==void 0?`[${e}] `:""),this.#r}},qe="io.interop.web.server.exchange.log_id";import*as De from"@interopio/gateway/logging/core";function f(r){return De.getLogger(`gateway.server.${r}`)}function ye(r){return r?.get("io.gateway.logging.suppress")===!0}var Fe="io.gateway.logging.prefix";function be(r){return r?.has(Fe)?r.get(Fe)??"":""}var S=class{#e;logger=f("codec.encoder");constructor(...e){this.#e=[...e]}setLogger(e){this.logger=e}encodableMimeTypes(){return this.#e}canEncode(e,t){if(t===void 0)return!0;for(let n of this.#e)if(M(t,n))return!0;return!1}},G=class extends S{constructor(){super(de)}canEncode(e,t){return super.canEncode(e,t)}async encode(e,t,n){let s=await e;return this.logger.enabledFor("debug")&&!ye(n)&&this.#e(s),s}#e(e,t){let n=be(t);this.logger.debug(`${n}Encoding value of type ${typeof e} with size ${e.byteLength??e.size??e.length}`)}},Y=class r extends S{constructor(...e){super(...e)}canEncode(e,t){return super.canEncode(e,t)&&e==="string"}async encode(e,t,n){if(e=await e,!ye(n)&&this.logger.enabledFor("debug")){let s=be(n),o=this.logger.enabledFor("trace");this.logger.debug(`${s}Writing ${o?`${e}`:`${e.substring(0,100)}...`}`)}return e}static textPlainOnly(){return new r(pe("text","plain","utf-8"))}static allMimeTypes(){return new r(pe("text","plain","utf-8"),de)}};var b=class{log=f("http.codec");#e=!1;set enableLoggingRequestDetails(e){this.#e=e}get enableLoggingRequestDetails(){return this.#e}};var L=class r extends b{static MEDIA_TYPES=Object.freeze([u.MULTIPART_FORM_DATA]);#e;constructor(e){super(),this.#e=e}get partReader(){return this.#e}getReadableMediaTypes(){return r.MEDIA_TYPES}canRead(e,t){return this.#t(t)&&e.name===FormData.name}#t(e){if(e===void 0)return!0;for(let t of r.MEDIA_TYPES)if(M(t,e))return!0;return!1}async readPromise(e,t,n){let s=this.#e.read(e,t,n),o=new FormData;for await(let[i,a]of s)o.append(i,a);return o}read(e,t,n){throw new Error("not implemented yet")}},W=class extends b{getReadableMediaTypes(){return[u.MULTIPART_FORM_DATA]}canRead(e,t){return e==="string"||e.name===File.name&&(t===void 0||M(u.MULTIPART_FORM_DATA,t))}readPromise(e,t,n){throw new Error("not implemented yet")}read(e,t,n){throw new Error("not implemented yet")}};var O=class r{#e;#t;#r;constructor(e){r.initLogger(e),this.#e=e,this.#t=u.asMediaTypes(...e.encodableMimeTypes()),this.#r=this.#t.find(t=>le(t))}get encoder(){return this.#e}getWriteableMediaTypes(){return this.#t}canWrite(e,t){return this.#e.canEncode(e,t)}async write(e,t,n,s,o){let i=this.#n(n,s),a=this.#e.encode(e,i,o);await n.body(a)}static initLogger(e){e instanceof S}#n(e,t){let n=We(e.headers);if(n)return n;let s=this.#r;n=ht(t,s)?s:t,n&&(n=ut(n,s),e.headers.set("Content-Type",n.toString()))}};function ut(r,e){if(!r.params.has("charset")&&e!==void 0){let t=e.params.get("charset");if(t){let n=u.parseMediaType(r.toString());return n.params.set("charset",t),n}}return r}function ht(r,e){return(r===void 0||!le(r)||r.essence===u.APPLICATION_OCTET_STREAM.essence)&&e!==void 0}var we=class{#e;#t;#r;#n=!0;#s=Array();#o=Array();constructor(){this.initReaders(),this.initWriters()}multipartReader(e){this.#e=e,this.initReaders()}registerDefaults(e){this.#n!==e&&(this.#n=e,this.initReaders(),this.initWriters())}initReaders(){if(this.#o.length=0,!!this.#n)if(this.#e!==void 0)this.addCodec(this.#o,this.#e);else{let e=new W;this.addCodec(this.#o,e),this.addCodec(this.#o,new L(e))}}initWriters(){this.#s.length=0,this.#n&&(this.#s.push(...this.#i()),this.extendWriters(this.#s))}extendWriters(e){}#i(){if(!this.#n)return[];let e=Array();return this.addCodec(e,new O(new G)),e}maxInMemorySize(e){this.#t!==e&&(this.#t=e,this.initReaders())}enableLoggingRequestDetails(e){this.#r!==e&&(this.#r=e,this.initReaders(),this.initWriters())}get catchAllReaders(){return this.#n?Array():[]}get typedWriters(){return this.#s}get typedReaders(){return this.#o}get catchAllWriters(){if(!this.#n)return[];let e=Array();return this.addCodec(e,new O(Y.allMimeTypes())),e}addCodec(e,t){this.#a(t),e.push(t)}#a(e){if(e instanceof O&&(e=e.encoder),e===void 0)return;let t=this.#t,n=this.#r;n!==void 0&&(e instanceof L&&(e.enableLoggingRequestDetails=n),e instanceof W&&(e.enableLoggingRequestDetails=n))}},Re=class{baseDefaultCodecs;constructor(e){this.baseDefaultCodecs=e}get defaultCodecs(){return this.baseDefaultCodecs}registerDefaults(e){this.baseDefaultCodecs.registerDefaults(e)}get readers(){let e=new Array;return e.push(...this.baseDefaultCodecs.typedReaders),e.push(...this.baseDefaultCodecs.catchAllReaders),e}get writers(){let e=new Array;return e.push(...this.baseDefaultCodecs.typedWriters),e.push(...this.baseDefaultCodecs.catchAllWriters),e}},Ce=class extends we{},He=class extends Re{constructor(){super(new Ce)}};function ft(){return new He}var Se={serverConfigurer:{create:ft}};import Q from"node:stream/web";var _=class r extends k{#e;#t;#r;upgrade=!1;constructor(e,t){if(super(new h),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??"/"}static get(e){return new r(e,"GET")}static post(e){return new r(e,"POST")}static options(e){return new r(e,"OPTIONS")}initSslInfo(){return this.#t}getNativeRequest(){throw new Error("This is a mock. No running server, no native request available.")}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.#r!==void 0){let e=this.#r,t=(async function*(){yield await e.bytes()})();return Q.ReadableStream.from(t)}}blob(){let e=this.#r;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.#r=new Blob([]);return}if(e instanceof ReadableStream){let t=[],n=e.getReader(),s=!1;for(;!s;){let{value:o,done:i}=await n.read();i?s=!0:t.push(o)}this.#r=new Blob(t)}else e=await e,typeof e=="string"?this.#r=new Blob([e],{type:"text/plain"}):this.#r=new Blob([e]);this.headers.has("content-type")||this.setHeader("Content-Type",this.#r.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}},X=class extends A{#e;#t=()=>{throw new Error("No content was written to the response body nor end was called on this response.")};constructor(){super(new h),this.#e=async e=>{let t=[],n;this.#t=()=>(n??=Q.ReadableStream.from(t),n);let s=e.getReader(),o=!1;do{let{value:i,done:a}=await s.read();a?o=!0:t.push(i)}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 n=await e;n!==void 0&&(yield n)})();return this.#e(Q.ReadableStream.from(t))}async end(){return this.doCommit(async()=>await this.#e(Q.ReadableStream.from([])))}getBody(){return this.#t()}};var J=class extends j{};import gt from"node:stream/web";var Te=class extends Error{completedResponse;constructor(e,t={}){super(`error occurred after response was completed: ${e}`,t),this.completedResponse=e}};async function $e(){try{return await new Promise((r,e)=>{let t=new Promise((n,s)=>{Promise.resolve().then(()=>{r({promise:t,resolve:n,reject:s})})})})}catch(r){throw r}}var K=class r{static#e=f("test.http.handler.connector");#t;#r;constructor(e,t){this.#t=e,this.#r=t}async connect(e,t,n){let s=await $e(),o=await $e(),i=[void 0],a=new $(t,e),c=new X;return a.writeHandler=async d=>{this.log("Invoking HttpHandler for ",e,t);let p=await this.adoptRequest(a,d),l=this.prepareResponse(c,p);try{await this.#t(p,l),o.resolve()}catch(g){o.reject(g)}return!0},c.writeHandler=async d=>(this.log("Creating client response for ",e,t),i[0]=this.adoptResponse(c,d),!0),this.log("Writing client request for ",e,t),n(a).then(()=>{s.resolve()}).catch(d=>{s.reject(d)}),Promise.all([s.promise,o.promise]).catch(d=>{let p=i[0];throw p!==void 0?new Te(p,{cause:d}):d}).then(()=>i[0]??this.adoptResponse(c,gt.ReadableStream.from([])))}log(e,t,n){r.#e.enabledFor("debug")&&r.#e.debug(`${e} ${t} "${n.href}"`)}async adoptRequest(e,t){let n=e.method,s=e.URL,o=e.headers,i=e.cookies,a=new _(s,n);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")a.setHeader(c,d);else for(let p of d)a.addHeader(c,p)}return await a.writeBody(t),a}prepareResponse(e,t){return t.method==="HEAD"?new J(e):e}adoptResponse(e,t){let n=e.statusCode,s=e.headers,o=e.cookies,i=new V(n);for(let a of s.keys()){let c=s.get(a);if(c!==void 0)if(typeof c=="number"&&(c=String(c)),typeof c=="string")i.setHeader(a,c);else for(let d of c)i.addHeader(a,d)}return i.body=t,i}};import{IOGateway as Ve}from"@interopio/gateway";var Ur=f("gateway.ws.client-verify");function ze(r){if(r){let e=(r.block??r.blacklist??[]).map(Ve.Filtering.regexify),t=(r.allow??r.whitelist??[]).map(Ve.Filtering.regexify);return{non_matched:r.non_matched??"allow",missing:r.missing??"allow",allow:t,block:e}}}var mt=async r=>Me();mt.toString=()=>"any-exchange";var je=Object.freeze({}),Z=Object.freeze({match:!1,variables:je}),Me=(r=je)=>({match:!0,variables:r}),Ge=(r,e)=>{let t=e?.method,n=async s=>{let o=s.request,i=o.path;if(t!==void 0&&o.method!==t)return Z;if(typeof r=="string")return i===r?Me():Z;{let a=r.exec(i);return a===null?Z:{match:!0,variables:{...a.groups}}}};return n.toString=()=>`pattern(${r.toString()}, method=${t??"<any>"})`,n};var yt=async({request:r})=>r.upgrade&&r.headers.one("upgrade")?.toLowerCase()==="websocket"?Me():Z;yt.toString=()=>"websocket upgrade";import{IOGateway as Ye}from"@interopio/gateway";async function Qe(r,e,t){let n=(o,i)=>{if(i?.cors){let a=i.cors===!0?{allowOrigins:i.origins?.allow?.map(Ye.Filtering.regexify),allowMethods:o.method===void 0?["*"]:[o.method],allowCredentials:i.authorize?.access!=="permitted"?!0:void 0}:i.cors,c=o.path;t.cors.push([c,a])}},s=new class{handle(...o){o.forEach(({request:i,options:a,handler:c})=>{let d=Ge(Ye.Filtering.regexify(i.path),{method:i.method});a?.authorize&&t.authorize.push([d,a.authorize]),n(i,a);let p=async(l,g)=>{let{match:T,variables:oe}=await d(l);T?await c(l,oe):await g()};t.middleware.push(p)})}socket(...o){for(let{path:i,factory:a,options:c}of o){let d=i??"/";t.sockets.set(d,{default:i===void 0||i==="/",ping:c?.ping,factory:a,maxConnections:c?.maxConnections,authorize:c?.authorize,originFilters:ze(c?.origins)})}}};await r(s,e)}function _e(...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,n){let s=async(o,i)=>{let a=o===e.length?n:e[o];if(a===void 0)return;let c=!1,d=!1,l=await a(i,async g=>{if(c)throw new Error("next() called multiple times");c=!0;try{return await s(o+1,g??i)}finally{d=!0}});if(c&&!d)throw new Error(`middleware resolved before downstream.
13
+ You are probably missing an await or return statement in your middleware function.`);return l};return s(0,t)}}import{AsyncLocalStorage as Rt}from"node:async_hooks";import{AsyncLocalStorage as wt}from"node:async_hooks";function bt(r){if(r==null)return!1;let{code:e,message:t}=r;return e==="ECONNRESET"||e==="EPIPE"||e==="ERR_STREAM_PREMATURE_CLOSE"||t?.toLowerCase().includes("client aborted")||t?.toLowerCase().includes("socket hang up")||t?.toLowerCase().includes("aborted")}function Xe(r,e){return bt(r)?(e.enabledFor("trace")?e.debug("looks like the client has gone away:",r):e.enabledFor("debug")&&e.debug(`looks like the client has gone away: ${r.message} (For full stack trace enable trace logging level.)`),!0):!1}var ee=class{#e;constructor(e){if(e==null)throw new Error("delegate must not be null or undefined");this.#e=e}get delegate(){return this.#e}async handle(e){return await this.#e.handle(e)}toString(){return`WebHandlerDecorator[delegate=${this.#e}]`}},te=class extends ee{#e;constructor(e,...t){super(e),this.#e=[...t],Object.freeze(this.#e)}get errorHandlers(){return this.#e}handle(e){let t;try{t=super.handle(e)}catch(n){t=Promise.reject(n)}for(let n of this.#e)t=t.catch(async s=>{let o=s instanceof Error?s:new Error(String(s));await n.handle(e,o)});return t}},xe=class r{#e;#t;#r;#n;static of(e,...t){let n=[...t],s=new r(t,e),o=r.initChain(t,e);return s.#r=o.#r,s.#n=o.#n,s}static initChain(e,t){let n=new r(e,t,void 0,void 0);for(let s of[...e].reverse())n=new r(e,t,s,n);return n}constructor(e,t,n,s){this.#e=e,this.#t=t,this.#r=n,this.#n=s}get filters(){return this.#e}get handler(){return this.#t}async filter(e){this.#r!==void 0&&this.#n!==void 0?await this.#s(this.#r,this.#n,e):await this.#t.handle(e)}#s(e,t,n){return e.filter(n,t)}},re=class extends ee{#e;constructor(e,...t){super(e),this.#e=xe.of(e,...t)}get filters(){return this.#e.filters}handle(e){return this.#e.filter(e)}};var Ee=class{#e;#t=void 0;#r=!1;#n;#s;constructor(e,t){this.#e=e,this.#n=t}get codecConfigurer(){return this.#t===void 0&&(this.codecConfigurer=Se.serverConfigurer.create()),this.#t}set codecConfigurer(e){if(e==null)throw new Error("codecConfigurer must not be null or undefined");this.#t=e,this.#r=!1;for(let t of this.#t.readers)if(t instanceof b&&t.enableLoggingRequestDetails){this.#r=!0;break}}createExchange(e,t){return new I(e,t,this.codecConfigurer)}set storage(e){this.#s=e}formatHeaders(e){let t="{";for(let n of e.keys())if(this.#r){let s=e.get(n);t+=`"${n}": "${s}", `}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"),n=e.response.statusCode;this.#e.debug(`${e.logPrefix}Completed ${n??"200 OK"}${t?`, headers: ${this.formatHeaders(e.response.headers)}`:""}"`)}}handleUnresolvedError(e,t){let{request:n,response:s,logPrefix:o}=e;if(s.setStatusCode(x.INTERNAL_SERVER_ERROR)){this.#e.error(`${o}500 Server Error for ${this.formatRequest(n)}`,t);return}else{if(Xe(t,this.#e))return;throw this.#e.error(`${o}Error [${t.message} for ${this.formatRequest(n)}, but already ended (${s.statusCode})`,t),t}}async web(e){return await this.#n.handle(e)}async http(e,t){let n=this.createExchange(e,t),s=()=>(this.logRequest(n),this.web(n).then(()=>{this.logResponse(n)}).catch(o=>{this.handleUnresolvedError(n,o)}).then(async()=>{await n.response.end()}));await new Promise((o,i)=>{this.#s!==void 0?this.#s.run({exchange:n},()=>{s().then(()=>o()).catch(a=>i(a))}):s().then(()=>o()).catch(a=>i(a))})}},ne=class r{#e;#t=[];#r=[];#n=[];#s;#o=new wt;#i;constructor(e){this.#e=e}static webHandler(e){return new r(e)}filter(...e){return e&&this.#t.push(...e),this}middleware(e){return e(this.#n),this}exceptionHandler(...e){return e&&this.#r.push(...e),this}exceptionHandlers(e){return e(this.#r),this}storage(e){return this.#o=e,this}codecConfigurer(e){return this.#i=e,this}hasCodecConfigurer(){return this.#i!==void 0}httpHandlerDecorator(e){if(this.#s===void 0)this.#s=e;else{let t=this.#s;this.#s=n=>(n=e(n),n=t(n),n)}return this}hasHttpHandlerDecorator(){return this.#s!==void 0}build(){let e=f("http"),t=new re(this.#e,...this.#t);t=new te(t,...this.#r);let n=new Ee(e,t);this.#o!==void 0&&(n.storage=this.#o),this.#i!==void 0&&(n.codecConfigurer=this.#i);let s=async(o,i)=>n.http(o,i);return this.#s?this.#s(s):s}};function Je(r){return new ke(r)}function Ke(){return new se}var ve=class{#e;#t;constructor(e,t,n){this.#e=e,this.#t=t}fetch=async(e,t)=>{try{let n=t?.method??"GET",s=new URL(e,this.#t),o=await this.#e.connect(n,s,async d=>{let p=new Headers(t?.headers);for(let[g,T]of p.entries())d.headers.add(g,T);let l=t?.body??Promise.resolve();if(l instanceof ReadableStream)throw new Error(`Unsupported body type ${typeof t?.body} in fetch request`);if(l instanceof FormData){let g=Array.from(l.entries());l=new URLSearchParams;for(let[T,oe]of g)l.append(T,oe.toString())}l instanceof URLSearchParams&&(d.headers.has("content-type")||d.headers.set("content-type","application/x-www-form-urlencoded"),l=l.toString()),l instanceof Blob&&(l=await l.bytes()),typeof l=="string"&&(l=Buffer.from(l)),await d.body(l)}),i=new Headers;for(let d of o.headers.keys()){let p=o.headers.get(d);if(p!==void 0){if(typeof p=="string")i.set(d,p);else if(Array.isArray(p))for(let l of p)i.append(d,l)}}let a=o.statusCode?.value,c=await o.blob();return new Response(c,{status:a,headers:i})}catch{return Response.error()}}},se=class{#e;#t;#r;#n="http://localhost:8080";constructor(e,t,n){if(!(e===void 0||t===void 0))throw new Error("You can only set either httpHandlerBuilder or connector, not both.");this.#t=t,this.#r=n,this.#e=e}baseUrl(e){return this.#n=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 K((await this.#e).build(),this.#r)),e??=new F,new ve(e,this.#n,this)}},Pe=class{#e;#t=[];middleware(...e){return this.#t=[...this.#t,...e],this}sslInfo(e){return this.#e=e,this}configureClient(){let e=this.initHttpHandlerBuilder(...this.#t);return new se(e,void 0,this.#e)}async build(){return await this.configureClient().build()}},ke=class extends Pe{#e;constructor(e){super(),this.#e=e}async initHttpHandlerBuilder(...e){let t={middleware:e,corsConfig:{allowOrigin:["http://localhost:8086"]},resourcesConfig:{locations:[]},cors:[],authConfig:{type:"none"},authorize:[],storage:new Rt,sockets:new Map};await Qe(this.#e,{},t);let n={handle:_e(...t.middleware)};return ne.webHandler(n)}};var fn={bindToApp:Je,bindToServer:Ke};export{fn as TestClient};
3
14
  //# sourceMappingURL=test.js.map