@keetanetwork/anchor 0.0.21 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/config.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import Resolver from './lib/resolver.js';
2
2
  import type { Client as KeetaNetClient, UserClient as KeetaNetUserClient } from '@keetanetwork/keetanet-client';
3
- import KeetaNet from '@keetanetwork/keetanet-client';
3
+ import * as KeetaNet from '@keetanetwork/keetanet-client';
4
4
  type KeetaNetNetworks = typeof KeetaNet.Client.Config.networksArray[number];
5
5
  type ResolverOptions = Partial<Omit<ConstructorParameters<typeof Resolver>[0], 'client'>> & {
6
6
  network?: bigint | KeetaNetNetworks | string | undefined;
package/config.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EACX,MAAM,IAAI,cAAc,EACxB,UAAU,IAAI,kBAAkB,EAChC,MAAM,+BAA+B,CAAC;AACvC,OAAO,QAAQ,MAAM,+BAA+B,CAAC;AAErD,KAAK,gBAAgB,GAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC5E,KAAK,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG;IAE3F,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAC;CACzD,CAAC;AACF,KAAK,cAAc,GAAG,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB,EAAE,OAAO,GAAE,eAAoB,GAAG,cAAc,CAkCnI;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB,EAAE,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAIvH"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EACX,MAAM,IAAI,cAAc,EACxB,UAAU,IAAI,kBAAkB,EAChC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAE1D,KAAK,gBAAgB,GAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC5E,KAAK,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG;IAE3F,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAC;CACzD,CAAC;AACF,KAAK,cAAc,GAAG,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB,EAAE,OAAO,GAAE,eAAoB,GAAG,cAAc,CAkCnI;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB,EAAE,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAIvH"}
package/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import Resolver from './lib/resolver.js';
2
- import KeetaNet from '@keetanetwork/keetanet-client';
2
+ import * as KeetaNet from '@keetanetwork/keetanet-client';
3
3
  export function getDefaultResolverConfig(client, options = {}) {
4
4
  /**
5
5
  * The default Root account for the resolver is the network account, so
package/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAKzC,OAAO,QAAQ,MAAM,+BAA+B,CAAC;AASrD,MAAM,UAAU,wBAAwB,CAAC,MAA2C,EAAE,UAA2B,EAAE;IAClH;;;OAGG;IACH,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAClC,CAAC;IACF,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,MAAK,CAAC,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC,CAAC;IAC1G,CAAC;IAED,IAAI,SAAiB,CAAC;IACtB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACxD,MAAK,CAAC,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7E,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC5E,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC;IACnC,CAAC;SAAM,CAAC;QACP,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAC7B,CAAC;IACD,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAE9E,OAAM,CAAC;QACN,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,EAAE;QACd,GAAG,OAAO;KACV,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAA2C,EAAE,UAA2B,EAAE;IAC5G,MAAM,cAAc,GAAG,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjE,OAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;AACtC,CAAC","sourcesContent":["import Resolver from './lib/resolver.js';\nimport type {\n\tClient as KeetaNetClient,\n\tUserClient as KeetaNetUserClient\n} from '@keetanetwork/keetanet-client';\nimport KeetaNet from '@keetanetwork/keetanet-client';\n\ntype KeetaNetNetworks = typeof KeetaNet.Client.Config.networksArray[number];\ntype ResolverOptions = Partial<Omit<ConstructorParameters<typeof Resolver>[0], 'client'>> & {\n\t// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n\tnetwork?: bigint | KeetaNetNetworks | string | undefined;\n};\ntype ResolverConfig = ConstructorParameters<typeof Resolver>[0];\n\nexport function getDefaultResolverConfig(client: KeetaNetClient | KeetaNetUserClient, options: ResolverOptions = {}): ResolverConfig {\n\t/**\n\t * The default Root account for the resolver is the network account, so\n\t * we need to look it up from what the user provided.\n\t */\n\tif (options.network === undefined) {\n\t\tif ('network' in client && client.network !== undefined) {\n\t\t\toptions.network = client.network;\n\t\t}\n\t}\n\n\tif (options.network === undefined) {\n\t\tthrow(new Error('Network must be specified in options or a UserClient must be provided with a network'));\n\t}\n\n\tlet networkID: bigint;\n\tif (typeof options.network === 'string') {\n\t\tif (!KeetaNet.Client.Config.isNetwork(options.network)) {\n\t\t\tthrow(new Error(`Invalid network: ${options.network}`));\n\t\t}\n\t\tconst networkAlias = KeetaNet.Client.Config.getNetworkAlias(options.network);\n\t\tconst defaultConfig = KeetaNet.Client.Config.getDefaultConfig(networkAlias);\n\t\tnetworkID = defaultConfig.network;\n\t} else {\n\t\tnetworkID = options.network;\n\t}\n\tconst networkAccount = KeetaNet.lib.Account.generateNetworkAddress(networkID);\n\n\treturn({\n\t\tclient: client,\n\t\troot: networkAccount,\n\t\ttrustedCAs: [],\n\t\t...options\n\t});\n}\n\nexport function getDefaultResolver(client: KeetaNetClient | KeetaNetUserClient, options: ResolverOptions = {}): Resolver {\n\tconst resolverConfig = getDefaultResolverConfig(client, options);\n\n\treturn(new Resolver(resolverConfig));\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAKzC,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAS1D,MAAM,UAAU,wBAAwB,CAAC,MAA2C,EAAE,UAA2B,EAAE;IAClH;;;OAGG;IACH,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAClC,CAAC;IACF,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,MAAK,CAAC,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC,CAAC;IAC1G,CAAC;IAED,IAAI,SAAiB,CAAC;IACtB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACxD,MAAK,CAAC,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7E,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC5E,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC;IACnC,CAAC;SAAM,CAAC;QACP,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAC7B,CAAC;IACD,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAE9E,OAAM,CAAC;QACN,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,EAAE;QACd,GAAG,OAAO;KACV,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAA2C,EAAE,UAA2B,EAAE;IAC5G,MAAM,cAAc,GAAG,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjE,OAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;AACtC,CAAC","sourcesContent":["import Resolver from './lib/resolver.js';\nimport type {\n\tClient as KeetaNetClient,\n\tUserClient as KeetaNetUserClient\n} from '@keetanetwork/keetanet-client';\nimport * as KeetaNet from '@keetanetwork/keetanet-client';\n\ntype KeetaNetNetworks = typeof KeetaNet.Client.Config.networksArray[number];\ntype ResolverOptions = Partial<Omit<ConstructorParameters<typeof Resolver>[0], 'client'>> & {\n\t// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n\tnetwork?: bigint | KeetaNetNetworks | string | undefined;\n};\ntype ResolverConfig = ConstructorParameters<typeof Resolver>[0];\n\nexport function getDefaultResolverConfig(client: KeetaNetClient | KeetaNetUserClient, options: ResolverOptions = {}): ResolverConfig {\n\t/**\n\t * The default Root account for the resolver is the network account, so\n\t * we need to look it up from what the user provided.\n\t */\n\tif (options.network === undefined) {\n\t\tif ('network' in client && client.network !== undefined) {\n\t\t\toptions.network = client.network;\n\t\t}\n\t}\n\n\tif (options.network === undefined) {\n\t\tthrow(new Error('Network must be specified in options or a UserClient must be provided with a network'));\n\t}\n\n\tlet networkID: bigint;\n\tif (typeof options.network === 'string') {\n\t\tif (!KeetaNet.Client.Config.isNetwork(options.network)) {\n\t\t\tthrow(new Error(`Invalid network: ${options.network}`));\n\t\t}\n\t\tconst networkAlias = KeetaNet.Client.Config.getNetworkAlias(options.network);\n\t\tconst defaultConfig = KeetaNet.Client.Config.getDefaultConfig(networkAlias);\n\t\tnetworkID = defaultConfig.network;\n\t} else {\n\t\tnetworkID = options.network;\n\t}\n\tconst networkAccount = KeetaNet.lib.Account.generateNetworkAddress(networkID);\n\n\treturn({\n\t\tclient: client,\n\t\troot: networkAccount,\n\t\ttrustedCAs: [],\n\t\t...options\n\t});\n}\n\nexport function getDefaultResolver(client: KeetaNetClient | KeetaNetUserClient, options: ResolverOptions = {}): Resolver {\n\tconst resolverConfig = getDefaultResolverConfig(client, options);\n\n\treturn(new Resolver(resolverConfig));\n}\n"]}
package/lib/error.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { LogLevel } from './log/index.ts';
1
2
  /**
2
3
  * Base error class for all Keeta Anchor errors
3
4
  */
@@ -7,6 +8,7 @@ export declare class KeetaAnchorError extends Error {
7
8
  private readonly keetaAnchorErrorObjectTypeID;
8
9
  private static readonly keetaAnchorErrorObjectTypeID;
9
10
  protected userError: boolean;
11
+ readonly logLevel: LogLevel;
10
12
  get name(): string;
11
13
  protected set name(value: string);
12
14
  get statusCode(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"AA4CA;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;;IAC1C,gBAAyB,IAAI,EAAE,MAAM,CAAsB;IAI3D,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAU;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAA0C;IAC9F,SAAS,CAAC,SAAS,UAAS;IAE5B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,SAAS,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,EAE/B;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,SAAS,KAAK,UAAU,CAAC,KAAK,EAAE,MAAM,EAErC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,SAAS,KAAK,SAAS,CAAC,KAAK,EAAE,OAAO,EAErC;gBAEW,OAAO,EAAE,MAAM;IAa3B;;;OAGG;IACH,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI;IAkBlE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB;IAI5D,eAAe,CAAC,WAAW,EAAE,YAAY,GAAG,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAgB7I,MAAM,IAAI;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAe5F,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI;SAAG,GAAG,IAAI,IAAI,GAAG,KAAK;KAAE;IAkB5K;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAA;KAAC;WAgCnI,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA2BhE;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;IACzD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAU;IAC3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAA0C;IAClG,UAAmB,SAAS,UAAQ;IAEpC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB;gBAIpD,OAAO,EAAE,MAAM;IAS3B,eAAe,CAAC,WAAW,EAAE,YAAY,GAAG,kBAAkB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;WAI9G,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;CAMzE"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgD/C;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;;IAC1C,gBAAyB,IAAI,EAAE,MAAM,CAAsB;IAI3D,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAU;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAA0C;IAC9F,SAAS,CAAC,SAAS,UAAS;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAW;IAEtC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,SAAS,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,EAE/B;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,SAAS,KAAK,UAAU,CAAC,KAAK,EAAE,MAAM,EAErC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,SAAS,KAAK,SAAS,CAAC,KAAK,EAAE,OAAO,EAErC;gBAEW,OAAO,EAAE,MAAM;IAa3B;;;OAGG;IACH,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI;IAkBlE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB;IAI5D,eAAe,CAAC,WAAW,EAAE,YAAY,GAAG,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAgB7I,MAAM,IAAI;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAe5F,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI;SAAG,GAAG,IAAI,IAAI,GAAG,KAAK;KAAE;IAkB5K;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAA;KAAC;WAgCnI,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA2BhE;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;IACzD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAU;IAC3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAA0C;IAClG,UAAmB,SAAS,UAAQ;IAEpC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB;gBAIpD,OAAO,EAAE,MAAM;IAS3B,eAAe,CAAC,WAAW,EAAE,YAAY,GAAG,kBAAkB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;WAI9G,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;CAMzE"}
package/lib/error.js CHANGED
@@ -10,6 +10,9 @@ async function getErrorClassMapping() {
10
10
  // Dynamically import KYC errors to avoid circular dependencies
11
11
  const kycModule = await import('../services/kyc/common.js');
12
12
  const KYCErrors = kycModule.Errors;
13
+ // Dynamically import FX errors to avoid circular dependencies
14
+ const fxModule = await import('../services/fx/common.js');
15
+ const FXErrors = fxModule.Errors;
13
16
  const ERROR_CLASSES = [
14
17
  /*
15
18
  * We purposefully leave out KeetaAnchorError here since it
@@ -17,9 +20,8 @@ async function getErrorClassMapping() {
17
20
  */
18
21
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
19
22
  KeetaAnchorUserError,
20
- KYCErrors.VerificationNotFound,
21
- KYCErrors.CertificateNotFound,
22
- KYCErrors.PaymentRequired
23
+ ...Object.values(KYCErrors),
24
+ ...Object.values(FXErrors)
23
25
  ];
24
26
  const mapping = {};
25
27
  for (const errorClass of ERROR_CLASSES) {
@@ -39,6 +41,7 @@ export class KeetaAnchorError extends Error {
39
41
  keetaAnchorErrorObjectTypeID;
40
42
  static keetaAnchorErrorObjectTypeID = '5d7f1578-e887-4104-bab0-4115ae33b08f';
41
43
  userError = false;
44
+ logLevel = 'ERROR';
42
45
  get name() {
43
46
  return (this.#name);
44
47
  }
package/lib/error.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Type for error classes that can be deserialized\n */\ninterface DeserializableErrorClass {\n\treadonly name: string;\n\tfromJSON: (input: unknown) => Promise<KeetaAnchorError>;\n}\n\n/**\n * Lazy-loaded error classes to avoid circular dependencies\n * The classes are loaded on first use\n */\nlet ERROR_CLASS_MAPPING: { [key: string]: (input: unknown) => Promise<KeetaAnchorError> } | null = null;\n\nasync function getErrorClassMapping(): Promise<{ [key: string]: (input: unknown) => Promise<KeetaAnchorError> }> {\n\tif (ERROR_CLASS_MAPPING) {\n\t\treturn(ERROR_CLASS_MAPPING);\n\t}\n\n\t// Dynamically import KYC errors to avoid circular dependencies\n\tconst kycModule = await import('../services/kyc/common.js');\n\tconst KYCErrors = kycModule.Errors;\n\n\tconst ERROR_CLASSES: DeserializableErrorClass[] = [\n\t\t/*\n\t\t * We purposefully leave out KeetaAnchorError here since it\n\t\t * is the base error class and could cause circular resolution\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tKeetaAnchorUserError,\n\t\tKYCErrors.VerificationNotFound,\n\t\tKYCErrors.CertificateNotFound,\n\t\tKYCErrors.PaymentRequired\n\t];\n\n\tconst mapping: { [key: string]: (input: unknown) => Promise<KeetaAnchorError> } = {};\n\tfor (const errorClass of ERROR_CLASSES) {\n\t\tmapping[errorClass.name] = errorClass.fromJSON.bind(errorClass);\n\t}\n\n\tERROR_CLASS_MAPPING = mapping;\n\treturn(mapping);\n}\n\n/**\n * Base error class for all Keeta Anchor errors\n */\nexport class KeetaAnchorError extends Error {\n\tstatic override readonly name: string = 'KeetaAnchorError';\n\t#name: string;\n\t#statusCode = 400;\n\t#retryable = false;\n\tprivate readonly keetaAnchorErrorObjectTypeID!: string;\n\tprivate static readonly keetaAnchorErrorObjectTypeID = '5d7f1578-e887-4104-bab0-4115ae33b08f';\n\tprotected userError = false;\n\n\tget name(): string {\n\t\treturn(this.#name);\n\t}\n\n\tprotected set name(value: string) {\n\t\tthis.#name = value;\n\t}\n\n\tget statusCode(): number {\n\t\treturn(this.#statusCode);\n\t}\n\n\tprotected set statusCode(value: number) {\n\t\tthis.#statusCode = value;\n\t}\n\n\tget retryable(): boolean {\n\t\treturn(this.#retryable);\n\t}\n\n\tprotected set retryable(value: boolean) {\n\t\tthis.#retryable = value;\n\t}\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\n\t\t// Need to cast to access the static name property from the constructor\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tthis.#name = (this.constructor as typeof KeetaAnchorError).name;\n\n\t\tObject.defineProperty(this, 'keetaAnchorErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorError.keetaAnchorErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\t/**\n\t * Protected method to restore error properties from JSON\n\t * This allows subclasses to properly restore properties without using any\n\t */\n\tprotected restoreFromJSON(other: { [key: string]: unknown }): void {\n\t\t// Restore statusCode if present\n\t\tif ('statusCode' in other) {\n\t\t\tif (typeof other.statusCode !== 'number') {\n\t\t\t\tthrow(new TypeError('Invalid statusCode: expected number'));\n\t\t\t}\n\t\t\tthis.statusCode = other.statusCode;\n\t\t}\n\n\t\t// Restore retryable if present\n\t\tif ('retryable' in other) {\n\t\t\tif (typeof other.retryable !== 'boolean') {\n\t\t\t\tthrow(new TypeError('Invalid retryable: expected boolean'));\n\t\t\t}\n\t\t\tthis.retryable = other.retryable;\n\t\t}\n\t}\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorError {\n\t\treturn(this.hasPropWithValue(input, 'keetaAnchorErrorObjectTypeID', KeetaAnchorError.keetaAnchorErrorObjectTypeID));\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json', message?: string): { error: string; statusCode: number; contentType: string } {\n\t\tmessage ??= 'Internal error';\n\t\tif (contentType === 'application/json') {\n\t\t\tmessage = JSON.stringify({\n\t\t\t\t...this.toJSON(),\n\t\t\t\tstatusCode: undefined\n\t\t\t});\n\t\t}\n\n\t\treturn({\n\t\t\terror: message,\n\t\t\tstatusCode: this.statusCode,\n\t\t\tcontentType: contentType\n\t\t});\n\t}\n\n\ttoJSON(): { ok: false; retryable: boolean; error: string; name: string; statusCode: number } {\n\t\tlet message = 'Internal error';\n\t\tif (this.userError) {\n\t\t\tmessage = this.message;\n\t\t}\n\n\t\treturn({\n\t\t\tok: false,\n\t\t\tretryable: this.retryable,\n\t\t\terror: message,\n\t\t\tname: this.#name,\n\t\t\tstatusCode: this.statusCode\n\t\t});\n\t}\n\n\tprotected static hasPropWithValue<PROP extends string, VALUE extends string | number | boolean>(input: unknown, prop: PROP, value: VALUE): input is { [key in PROP]: VALUE } {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (!(prop in input)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst inputValue = input[prop as keyof typeof input] as unknown;\n\t\tif (inputValue !== value) {\n\t\t\treturn(false);\n\t\t}\n\n\t\treturn(true);\n\t}\n\n\t/**\n\t * Extract common error properties from JSON input\n\t * This validates the structure and extracts properties needed for construction\n\t */\n\tprotected static extractErrorProperties(input: unknown, expectedClass?: { name: string }): { message: string; other: { [key: string]: unknown }} {\n\t\tif (!this.hasPropWithValue(input, 'ok', false)) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\t// Verify the name matches if an expected class is provided\n\t\tif (expectedClass && 'name' in input && input.name !== expectedClass.name) {\n\t\t\tthrow(new Error(`Error name mismatch: expected ${expectedClass.name}, got ${input.name}`));\n\t\t}\n\n\t\t// Extract error message\n\t\tlet message = 'Internal error';\n\t\tif ('error' in input && typeof input.error === 'string') {\n\t\t\tmessage = input.error;\n\t\t}\n\n\t\t// Extract other properties\n\t\tconst other: { [key: string]: unknown } = {};\n\t\tfor (const key in input) {\n\t\t\tif (key !== 'error' && key !== 'ok') {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tother[key] = input[key as keyof typeof input];\n\t\t\t}\n\t\t}\n\n\t\treturn({ message, other });\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaAnchorError> {\n\t\t// Try to use the deserializer mapping if available for subclasses\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\tif (!('ok' in input) || input.ok !== false) {\n\t\t\tthrow(new Error('Invalid error JSON object: expected ok: false'));\n\t\t}\n\n\t\t// Check if there's a specific error class name\n\t\tif ('name' in input && typeof input.name === 'string') {\n\t\t\tif (input.name === 'KeetaAnchorError') {\n\t\t\t\tconst { message, other } = KeetaAnchorError.extractErrorProperties(input, this);\n\t\t\t\tconst error = new this(message);\n\t\t\t\terror.restoreFromJSON(other);\n\t\t\t\treturn(error);\n\t\t\t}\n\t\t\tconst mapping = await getErrorClassMapping();\n\t\t\tconst deserializer = mapping[input.name];\n\t\t\tif (deserializer) {\n\t\t\t\treturn(await deserializer(input));\n\t\t\t}\n\t\t}\n\n\t\tthrow(new Error('Invalid error JSON object: unknown error class'));\n\t}\n}\n\n/**\n * User-facing error class that extends KeetaAnchorError\n */\nexport class KeetaAnchorUserError extends KeetaAnchorError {\n\tstatic readonly name: string = 'KeetaAnchorUserError';\n\tprivate readonly keetaAnchorUserErrorObjectTypeID!: string;\n\tprivate static readonly keetaAnchorUserErrorObjectTypeID = 'a1e64819-14b6-45ac-a1ec-b9c0bdd51e7b';\n\tprotected override userError = true;\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorUserError {\n\t\treturn(this.hasPropWithValue(input, 'keetaAnchorUserErrorObjectTypeID', KeetaAnchorUserError.keetaAnchorUserErrorObjectTypeID));\n\t}\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\n\t\tObject.defineProperty(this, 'keetaAnchorUserErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorUserError.keetaAnchorUserErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json'): { error: string; statusCode: number; contentType: string } {\n\t\treturn(super.asErrorResponse(contentType, this.message));\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<InstanceType<typeof this>> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\t\tconst error = new this(message);\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n}\n"]}
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LogLevel } from './log/index.ts';\n/**\n * Type for error classes that can be deserialized\n */\ninterface DeserializableErrorClass {\n\treadonly name: string;\n\tfromJSON: (input: unknown) => Promise<KeetaAnchorError>;\n}\n\n/**\n * Lazy-loaded error classes to avoid circular dependencies\n * The classes are loaded on first use\n */\nlet ERROR_CLASS_MAPPING: { [key: string]: (input: unknown) => Promise<KeetaAnchorError> } | null = null;\n\nasync function getErrorClassMapping(): Promise<{ [key: string]: (input: unknown) => Promise<KeetaAnchorError> }> {\n\tif (ERROR_CLASS_MAPPING) {\n\t\treturn(ERROR_CLASS_MAPPING);\n\t}\n\n\t// Dynamically import KYC errors to avoid circular dependencies\n\tconst kycModule = await import('../services/kyc/common.js');\n\tconst KYCErrors = kycModule.Errors;\n\n\t// Dynamically import FX errors to avoid circular dependencies\n\tconst fxModule = await import('../services/fx/common.js');\n\tconst FXErrors = fxModule.Errors;\n\n\tconst ERROR_CLASSES: DeserializableErrorClass[] = [\n\t\t/*\n\t\t * We purposefully leave out KeetaAnchorError here since it\n\t\t * is the base error class and could cause circular resolution\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tKeetaAnchorUserError,\n\t\t...Object.values(KYCErrors),\n\t\t...Object.values(FXErrors)\n\t];\n\n\tconst mapping: { [key: string]: (input: unknown) => Promise<KeetaAnchorError> } = {};\n\tfor (const errorClass of ERROR_CLASSES) {\n\t\tmapping[errorClass.name] = errorClass.fromJSON.bind(errorClass);\n\t}\n\n\tERROR_CLASS_MAPPING = mapping;\n\treturn(mapping);\n}\n\n/**\n * Base error class for all Keeta Anchor errors\n */\nexport class KeetaAnchorError extends Error {\n\tstatic override readonly name: string = 'KeetaAnchorError';\n\t#name: string;\n\t#statusCode = 400;\n\t#retryable = false;\n\tprivate readonly keetaAnchorErrorObjectTypeID!: string;\n\tprivate static readonly keetaAnchorErrorObjectTypeID = '5d7f1578-e887-4104-bab0-4115ae33b08f';\n\tprotected userError = false;\n\treadonly logLevel: LogLevel = 'ERROR';\n\n\tget name(): string {\n\t\treturn(this.#name);\n\t}\n\n\tprotected set name(value: string) {\n\t\tthis.#name = value;\n\t}\n\n\tget statusCode(): number {\n\t\treturn(this.#statusCode);\n\t}\n\n\tprotected set statusCode(value: number) {\n\t\tthis.#statusCode = value;\n\t}\n\n\tget retryable(): boolean {\n\t\treturn(this.#retryable);\n\t}\n\n\tprotected set retryable(value: boolean) {\n\t\tthis.#retryable = value;\n\t}\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\n\t\t// Need to cast to access the static name property from the constructor\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tthis.#name = (this.constructor as typeof KeetaAnchorError).name;\n\n\t\tObject.defineProperty(this, 'keetaAnchorErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorError.keetaAnchorErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\t/**\n\t * Protected method to restore error properties from JSON\n\t * This allows subclasses to properly restore properties without using any\n\t */\n\tprotected restoreFromJSON(other: { [key: string]: unknown }): void {\n\t\t// Restore statusCode if present\n\t\tif ('statusCode' in other) {\n\t\t\tif (typeof other.statusCode !== 'number') {\n\t\t\t\tthrow(new TypeError('Invalid statusCode: expected number'));\n\t\t\t}\n\t\t\tthis.statusCode = other.statusCode;\n\t\t}\n\n\t\t// Restore retryable if present\n\t\tif ('retryable' in other) {\n\t\t\tif (typeof other.retryable !== 'boolean') {\n\t\t\t\tthrow(new TypeError('Invalid retryable: expected boolean'));\n\t\t\t}\n\t\t\tthis.retryable = other.retryable;\n\t\t}\n\t}\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorError {\n\t\treturn(this.hasPropWithValue(input, 'keetaAnchorErrorObjectTypeID', KeetaAnchorError.keetaAnchorErrorObjectTypeID));\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json', message?: string): { error: string; statusCode: number; contentType: string } {\n\t\tmessage ??= 'Internal error';\n\t\tif (contentType === 'application/json') {\n\t\t\tmessage = JSON.stringify({\n\t\t\t\t...this.toJSON(),\n\t\t\t\tstatusCode: undefined\n\t\t\t});\n\t\t}\n\n\t\treturn({\n\t\t\terror: message,\n\t\t\tstatusCode: this.statusCode,\n\t\t\tcontentType: contentType\n\t\t});\n\t}\n\n\ttoJSON(): { ok: false; retryable: boolean; error: string; name: string; statusCode: number } {\n\t\tlet message = 'Internal error';\n\t\tif (this.userError) {\n\t\t\tmessage = this.message;\n\t\t}\n\n\t\treturn({\n\t\t\tok: false,\n\t\t\tretryable: this.retryable,\n\t\t\terror: message,\n\t\t\tname: this.#name,\n\t\t\tstatusCode: this.statusCode\n\t\t});\n\t}\n\n\tprotected static hasPropWithValue<PROP extends string, VALUE extends string | number | boolean>(input: unknown, prop: PROP, value: VALUE): input is { [key in PROP]: VALUE } {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (!(prop in input)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst inputValue = input[prop as keyof typeof input] as unknown;\n\t\tif (inputValue !== value) {\n\t\t\treturn(false);\n\t\t}\n\n\t\treturn(true);\n\t}\n\n\t/**\n\t * Extract common error properties from JSON input\n\t * This validates the structure and extracts properties needed for construction\n\t */\n\tprotected static extractErrorProperties(input: unknown, expectedClass?: { name: string }): { message: string; other: { [key: string]: unknown }} {\n\t\tif (!this.hasPropWithValue(input, 'ok', false)) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\t// Verify the name matches if an expected class is provided\n\t\tif (expectedClass && 'name' in input && input.name !== expectedClass.name) {\n\t\t\tthrow(new Error(`Error name mismatch: expected ${expectedClass.name}, got ${input.name}`));\n\t\t}\n\n\t\t// Extract error message\n\t\tlet message = 'Internal error';\n\t\tif ('error' in input && typeof input.error === 'string') {\n\t\t\tmessage = input.error;\n\t\t}\n\n\t\t// Extract other properties\n\t\tconst other: { [key: string]: unknown } = {};\n\t\tfor (const key in input) {\n\t\t\tif (key !== 'error' && key !== 'ok') {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tother[key] = input[key as keyof typeof input];\n\t\t\t}\n\t\t}\n\n\t\treturn({ message, other });\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaAnchorError> {\n\t\t// Try to use the deserializer mapping if available for subclasses\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\tif (!('ok' in input) || input.ok !== false) {\n\t\t\tthrow(new Error('Invalid error JSON object: expected ok: false'));\n\t\t}\n\n\t\t// Check if there's a specific error class name\n\t\tif ('name' in input && typeof input.name === 'string') {\n\t\t\tif (input.name === 'KeetaAnchorError') {\n\t\t\t\tconst { message, other } = KeetaAnchorError.extractErrorProperties(input, this);\n\t\t\t\tconst error = new this(message);\n\t\t\t\terror.restoreFromJSON(other);\n\t\t\t\treturn(error);\n\t\t\t}\n\t\t\tconst mapping = await getErrorClassMapping();\n\t\t\tconst deserializer = mapping[input.name];\n\t\t\tif (deserializer) {\n\t\t\t\treturn(await deserializer(input));\n\t\t\t}\n\t\t}\n\n\t\tthrow(new Error('Invalid error JSON object: unknown error class'));\n\t}\n}\n\n/**\n * User-facing error class that extends KeetaAnchorError\n */\nexport class KeetaAnchorUserError extends KeetaAnchorError {\n\tstatic readonly name: string = 'KeetaAnchorUserError';\n\tprivate readonly keetaAnchorUserErrorObjectTypeID!: string;\n\tprivate static readonly keetaAnchorUserErrorObjectTypeID = 'a1e64819-14b6-45ac-a1ec-b9c0bdd51e7b';\n\tprotected override userError = true;\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorUserError {\n\t\treturn(this.hasPropWithValue(input, 'keetaAnchorUserErrorObjectTypeID', KeetaAnchorUserError.keetaAnchorUserErrorObjectTypeID));\n\t}\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\n\t\tObject.defineProperty(this, 'keetaAnchorUserErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorUserError.keetaAnchorUserErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json'): { error: string; statusCode: number; contentType: string } {\n\t\treturn(super.asErrorResponse(contentType, this.message));\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<InstanceType<typeof this>> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\t\tconst error = new this(message);\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n}\n"]}
@@ -52,9 +52,11 @@ export declare abstract class KeetaNetAnchorHTTPServer<ConfigType extends KeetaA
52
52
  /**
53
53
  * Get the URL of the server, which can be used to make requests to
54
54
  * it. This will use "localhost" as the hostname and the port that
55
- * the server is listening on.
55
+ * the server is listening on by default but can be overridden by
56
+ * setting a custom URL.
56
57
  */
57
58
  get url(): string;
59
+ set url(value: string | URL | ((object: this) => string));
58
60
  [Symbol.asyncDispose](): Promise<void>;
59
61
  }
60
62
  //# sourceMappingURL=http-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/lib/http-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAI7C,eAAO,MAAM,mBAAmB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAAkF,CAAC;AAOpM,MAAM,MAAM,MAAM,GAAG;IACpB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,mBAAmB,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;SAAE,CAAC;KAAE,CAAC,CAAC;CACrQ,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC3C;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8BAAsB,wBAAwB,CAAC,UAAU,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,YAAW,QAAQ,CAAC,2BAA2B,CAAC;;IAC5K,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAKxD,MAAM,EAAE,UAAU;IAM9B,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAElE,OAAO,CAAC,MAAM,CAAC,UAAU;IA2BzB,OAAO,CAAC,MAAM,CAAC,SAAS;IA2BxB,OAAO,CAAC,MAAM,CAAC,OAAO;YAsGR,IAAI;IA8LlB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;;;OAIG;IACH,IAAI,GAAG,IAAI,MAAM,CAMhB;IAED,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/lib/http-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAK7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAY,MAAM,gBAAgB,CAAC;AAKvD,eAAO,MAAM,mBAAmB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAAkF,CAAC;AAOpM,MAAM,MAAM,MAAM,GAAG;IACpB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,mBAAmB,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;SAAE,CAAC;KAAE,CAAC,CAAC;CACrQ,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC3C;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8BAAsB,wBAAwB,CAAC,UAAU,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,YAAW,QAAQ,CAAC,2BAA2B,CAAC;;IAC5K,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAMxD,MAAM,EAAE,UAAU;IAM9B,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAElE,OAAO,CAAC,MAAM,CAAC,UAAU;IA2BzB,OAAO,CAAC,MAAM,CAAC,SAAS;IA2BxB,OAAO,CAAC,MAAM,CAAC,OAAO;YAsGR,IAAI;IAsMlB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;;;;OAKG;IACH,IAAI,GAAG,IAAI,MAAM,CAyBhB;IAED,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,EAEvD;IAED,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}
@@ -1,8 +1,9 @@
1
1
  import * as __typia_transform__assertGuard from "typia/lib/internal/_assertGuard.js";
2
2
  import * as http from 'http';
3
- import { KeetaAnchorUserError } from './error.js';
3
+ import { KeetaAnchorError, KeetaAnchorUserError } from './error.js';
4
4
  import { Log } from './log/index.js';
5
5
  import { createAssert } from 'typia';
6
+ import { assertNever } from './utils/never.js';
6
7
  export const AssertHTTPErrorData = (() => { const _io0 = input => "string" === typeof input.error && (undefined === input.statusCode || "number" === typeof input.statusCode) && (undefined === input.contentType || "string" === typeof input.contentType); const _ao0 = (input, _path, _exceptionable = true) => ("string" === typeof input.error || __typia_transform__assertGuard._assertGuard(_exceptionable, {
7
8
  method: "createAssert",
8
9
  path: _path + ".error",
@@ -45,6 +46,7 @@ export class KeetaNetAnchorHTTPServer {
45
46
  logger;
46
47
  #serverPromise;
47
48
  #server;
49
+ #url;
48
50
  #config;
49
51
  constructor(config) {
50
52
  this.#config = { ...config };
@@ -201,7 +203,6 @@ export class KeetaNetAnchorHTTPServer {
201
203
  const responseFinalize = async () => {
202
204
  if ('sync' in this.logger && typeof this.logger.sync === 'function') {
203
205
  try {
204
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
205
206
  await this.logger.sync();
206
207
  }
207
208
  catch {
@@ -272,10 +273,19 @@ export class KeetaNetAnchorHTTPServer {
272
273
  generatedResult = true;
273
274
  }
274
275
  catch (err) {
276
+ let logLevel = 'error';
277
+ if (KeetaAnchorError.isInstance(err)) {
278
+ /*
279
+ * We're able to safely cast this here because the cast
280
+ * duplicates the logic.
281
+ */
282
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
283
+ logLevel = err.logLevel.toLowerCase();
284
+ }
275
285
  /**
276
286
  * If an error occurs, log it and return an error page
277
287
  */
278
- this.logger?.error('KeetaAnchorHTTP.Server', err);
288
+ this.logger?.[logLevel]('KeetaAnchorHTTP.Server', err);
279
289
  /**
280
290
  * If it is a user error, provide a user-friendly error page
281
291
  */
@@ -283,7 +293,6 @@ export class KeetaNetAnchorHTTPServer {
283
293
  if (errorHandlerRoute !== undefined) {
284
294
  if (KeetaAnchorUserError.isInstance(err)) {
285
295
  result = await errorHandlerRoute(new Map(), err.asErrorResponse('application/json'), request.headers);
286
- generatedResult = true;
287
296
  }
288
297
  else {
289
298
  result = await errorHandlerRoute(new Map(), {
@@ -291,8 +300,8 @@ export class KeetaNetAnchorHTTPServer {
291
300
  statusCode: 500,
292
301
  contentType: 'application/json'
293
302
  }, request.headers);
294
- generatedResult = true;
295
303
  }
304
+ generatedResult = true;
296
305
  }
297
306
  if (!generatedResult) {
298
307
  /**
@@ -384,14 +393,37 @@ export class KeetaNetAnchorHTTPServer {
384
393
  /**
385
394
  * Get the URL of the server, which can be used to make requests to
386
395
  * it. This will use "localhost" as the hostname and the port that
387
- * the server is listening on.
396
+ * the server is listening on by default but can be overridden by
397
+ * setting a custom URL.
388
398
  */
389
399
  get url() {
390
400
  if (this.port === 0 || this.#server === undefined) {
391
401
  throw (new Error('Server not started'));
392
402
  }
403
+ if (this.#url !== undefined) {
404
+ let newURL;
405
+ if (typeof this.#url === 'string') {
406
+ newURL = this.#url;
407
+ }
408
+ else if (this.#url instanceof URL || ('port' in this.#url && 'hostname' in this.#url && 'toString' in this.#url)) {
409
+ newURL = this.#url.toString();
410
+ }
411
+ else if (typeof this.#url === 'function') {
412
+ newURL = this.#url(this);
413
+ }
414
+ else {
415
+ assertNever(this.#url);
416
+ }
417
+ const newURLObj = new URL(newURL);
418
+ newURLObj.pathname = '/';
419
+ newURLObj.search = '';
420
+ return (newURLObj.toString());
421
+ }
393
422
  return (`http://localhost:${this.port}`);
394
423
  }
424
+ set url(value) {
425
+ this.#url = value;
426
+ }
395
427
  [Symbol.asyncDispose]() {
396
428
  return (this.stop());
397
429
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/lib/http-server.ts"],"names":[],"mappings":"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","sourcesContent":["import * as http from 'http';\nimport {\n\tKeetaAnchorUserError\n} from './error.js';\nimport type { JSONSerializable } from './utils/json.js';\nimport type { Logger } from './log/index.js';\nimport { Log } from './log/index.js';\nimport { createAssert } from 'typia';\n\nexport const AssertHTTPErrorData: (input: unknown) => { error: string; statusCode?: number; contentType?: string; } = createAssert<{ error: string; statusCode?: number; contentType?: string; }>();\n\n/**\n * The maximum size of a request (128KiB)\n */\nconst MAX_REQUEST_SIZE = 1024 * 128;\n\nexport type Routes = {\n\t[route: string]: (urlParams: Map<string, string>, postData: JSONSerializable | undefined, requestHeaders: http.IncomingHttpHeaders) => Promise<{ output: string | Buffer; statusCode?: number; contentType?: string; headers?: { [headerName: string]: string; }; }>;\n};\n\nexport interface KeetaAnchorHTTPServerConfig {\n\t/**\n\t * The port for the HTTP server to listen on (default is an ephemeral port).\n\t */\n\tport?: number;\n\n\t/**\n\t * Enable debug logging\n\t */\n\tlogger?: Logger;\n};\n\nexport abstract class KeetaNetAnchorHTTPServer<ConfigType extends KeetaAnchorHTTPServerConfig = KeetaAnchorHTTPServerConfig> implements Required<KeetaAnchorHTTPServerConfig> {\n\treadonly port: NonNullable<KeetaAnchorHTTPServerConfig['port']>;\n\treadonly logger: NonNullable<KeetaAnchorHTTPServerConfig['logger']>;\n\t#serverPromise?: Promise<void>;\n\t#server?: http.Server;\n\treadonly #config: ConfigType;\n\n\tconstructor(config: ConfigType) {\n\t\tthis.#config = { ...config };\n\t\tthis.port = config.port ?? 0;\n\t\tthis.logger = config.logger ?? Log.Legacy('ANCHOR');\n\t}\n\n\tprotected abstract initRoutes(config: ConfigType): Promise<Routes>;\n\n\tprivate static routeMatch(requestURL: URL, routeURL: URL): ({ match: true; params: Map<string, string> } | { match: false }) {\n\t\tconst requestURLPaths = requestURL.pathname.split('/');\n\t\tconst routeURLPaths = routeURL.pathname.split('/');\n\n\t\tif (requestURLPaths.length !== routeURLPaths.length) {\n\t\t\treturn({ match: false });\n\t\t}\n\n\t\tconst params = new Map<string, string>();\n\t\tfor (let partIndex = 0; partIndex < requestURLPaths.length; partIndex++) {\n\t\t\tconst requestPath = requestURLPaths[partIndex];\n\t\t\tconst routePath = routeURLPaths[partIndex];\n\n\t\t\tif (routePath === undefined || requestPath === undefined) {\n\t\t\t\treturn({ match: false });\n\t\t\t}\n\n\t\t\tif (routePath.startsWith(':')) {\n\t\t\t\tparams.set(routePath.slice(1), requestPath);\n\t\t\t} else if (requestPath !== routePath) {\n\t\t\t\treturn({ match: false });\n\t\t\t}\n\t\t}\n\n\t\treturn({ match: true, params: params });\n\t}\n\n\tprivate static routeFind(method: string, requestURL: URL, routes: Routes): { route: Routes[keyof Routes]; params: Map<string, string> } | null {\n\t\tfor (const routeKey in routes) {\n\t\t\tconst route = routes[routeKey];\n\t\t\tif (route === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [routeMethod, ...routePathParts] = routeKey.split(' ');\n\t\t\tconst routePath = `/${routePathParts.join(' ')}`.replace(/^\\/+/, '/');\n\n\t\t\tif (method !== routeMethod) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst routeURL = new URL(routePath, 'http://localhost');\n\t\t\tconst matchResult = this.routeMatch(requestURL, routeURL);\n\t\t\tif (matchResult.match) {\n\t\t\t\treturn({\n\t\t\t\t\troute: route,\n\t\t\t\t\tparams: matchResult.params\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn(null);\n\t}\n\n\tprivate static addCORS(routes: Routes): Routes {\n\t\tconst newRoutes: Routes = {};\n\n\t\tconst validMethods = new Set(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD']);\n\n\t\tconst methodsByPath: { [key: string]: Set<string>; } = {};\n\t\tfor (const routeKey in routes) {\n\t\t\tconst methodAndPath = routeKey.split(' ');\n\t\t\tconst method = methodAndPath[0];\n\t\t\tconst path = methodAndPath.slice(1).join(' ');\n\n\t\t\tif (method === undefined || path === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!validMethods.has(method)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!(path in methodsByPath)) {\n\t\t\t\tmethodsByPath[path] = new Set<string>();\n\t\t\t}\n\n\t\t\tif (methodsByPath[path] === undefined) {\n\t\t\t\tthrow(new Error(`internal error: methodsByPath missing path for ${path}`));\n\t\t\t}\n\n\t\t\tmethodsByPath[path].add(method);\n\t\t}\n\n\t\tconst seenPaths = new Set<string>();\n\t\tfor (const routeKey in routes) {\n\t\t\tconst methodAndPath = routeKey.split(' ');\n\t\t\tconst method = methodAndPath[0];\n\t\t\tconst path = methodAndPath.slice(1).join(' ');\n\n\t\t\tconst routeHandler = routes[routeKey];\n\t\t\tif (routeHandler === undefined) {\n\t\t\t\tthrow(new Error(`internal error: routeHandler missing for routeKey ${routeKey}`));\n\t\t\t}\n\n\t\t\tif (method !== 'ERROR') {\n\t\t\t\tif (method === undefined || path === undefined) {\n\t\t\t\t\tnewRoutes[routeKey] = routeHandler;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!validMethods.has(method)) {\n\t\t\t\t\tnewRoutes[routeKey] = routeHandler;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst validMethodsForPath = methodsByPath[path];\n\n\t\t\tlet validMethodsForPathParts: string[] = [];\n\t\t\tif (validMethodsForPath !== undefined) {\n\t\t\t\tvalidMethodsForPath.add('OPTIONS');\n\t\t\t\tvalidMethodsForPathParts = Array.from(validMethodsForPath);\n\t\t\t} else {\n\t\t\t\tvalidMethodsForPathParts = [...Array.from(validMethods), 'OPTIONS'];\n\t\t\t}\n\n\t\t\tnewRoutes[routeKey] = async function(...args: Parameters<typeof routes[keyof typeof routes]>) {\n\t\t\t\tconst retval = await routeHandler(...args);\n\n\t\t\t\t/* Add CORS headers to the response for the original route handler */\n\t\t\t\tif (retval.contentType === 'application/json' || retval.contentType === undefined) {\n\t\t\t\t\tif (!('headers' in retval) || retval.headers === undefined) {\n\t\t\t\t\t\tretval.headers = {};\n\t\t\t\t\t}\n\t\t\t\t\tretval.headers['Access-Control-Allow-Origin'] = '*';\n\t\t\t\t}\n\n\t\t\t\treturn(retval);\n\t\t\t};\n\n\t\t\tif (!seenPaths.has(path) && path !== '' && path !== undefined) {\n\t\t\t\tconst corsRouteKey = `OPTIONS ${path}`;\n\n\t\t\t\tnewRoutes[corsRouteKey] = async function() {\n\t\t\t\t\treturn({\n\t\t\t\t\t\toutput: '',\n\t\t\t\t\t\tstatusCode: 204,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Access-Control-Allow-Origin': '*',\n\t\t\t\t\t\t\t'Access-Control-Allow-Methods': validMethodsForPathParts.join(', '),\n\t\t\t\t\t\t\t'Access-Control-Allow-Headers': 'Content-Type',\n\t\t\t\t\t\t\t'Access-Control-Max-Age': '86400'\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t\tseenPaths.add(path);\n\t\t\t}\n\t\t}\n\n\t\treturn(newRoutes);\n\t}\n\n\tprivate async main(onSetPort?: (port: number) => void): Promise<void> {\n\t\tthis.logger?.debug('KeetaAnchorHTTP.Server', 'Starting HTTP server...');\n\n\t\tconst port = this.port;\n\n\t\tconst routes = KeetaNetAnchorHTTPServer.addCORS({\n\t\t\tERROR: async function(_ignore_params, postData) {\n\t\t\t\tconst errorInfo = AssertHTTPErrorData(postData);\n\n\t\t\t\tconst retval = {\n\t\t\t\t\toutput: errorInfo.error,\n\t\t\t\t\tstatusCode: errorInfo.statusCode ?? 400,\n\t\t\t\t\tcontentType: errorInfo.contentType ?? 'text/plain'\n\t\t\t\t};\n\n\t\t\t\treturn(retval);\n\t\t\t},\n\t\t\t...(await this.initRoutes(this.#config))\n\t\t});\n\n\t\tconst server = new http.Server(async (request, response) => {\n\t\t\tconst url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n\t\t\tconst method = request.method ?? 'GET';\n\n\t\t\t/*\n\t\t\t * Finalize the response by syncing the logger and ending\n\t\t\t * the response.\n\t\t\t */\n\t\t\tconst responseFinalize = async () => {\n\t\t\t\tif ('sync' in this.logger && typeof this.logger.sync === 'function') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-call\n\t\t\t\t\t\tawait this.logger.sync();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* ignore errors */\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresponse.end();\n\t\t\t};\n\n\t\t\t/*\n\t\t\t * Lookup the route based on the request\n\t\t\t */\n\t\t\tconst requestedRouteAndParams = KeetaNetAnchorHTTPServer.routeFind(method, url, routes);\n\t\t\tif (requestedRouteAndParams === null) {\n\t\t\t\tresponse.statusCode = 404;\n\t\t\t\tresponse.setHeader('Content-Type', 'text/plain');\n\t\t\t\tresponse.write('Not Found');\n\t\t\t\tawait responseFinalize();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Extract the route handler and the parameters from\n\t\t\t * the request\n\t\t\t */\n\t\t\tconst { route, params } = requestedRouteAndParams;\n\n\t\t\t/**\n\t\t\t * Attempt to run the route, catch any errors\n\t\t\t */\n\t\t\tlet result: Awaited<ReturnType<typeof route>> | undefined = undefined;\n\t\t\tlet generatedResult = false;\n\t\t\ttry {\n\t\t\t\t/**\n\t\t\t\t * If POST'ing, read and parse the POST data\n\t\t\t\t */\n\t\t\t\tlet postData: JSONSerializable | undefined;\n\t\t\t\tif (request.method === 'POST') {\n\t\t\t\t\tconst data = await request.map(function(chunk) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t\t\t\treturn(Buffer.from(chunk));\n\t\t\t\t\t}).reduce(function(prev, curr) {\n\t\t\t\t\t\tif (prev.length > MAX_REQUEST_SIZE) {\n\t\t\t\t\t\t\tthrow(new Error('Request too large'));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!Buffer.isBuffer(curr)) {\n\t\t\t\t\t\t\tthrow(new Error(`internal error: Current item is not a buffer -- ${typeof curr}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn(Buffer.concat([prev, curr]));\n\t\t\t\t\t}, Buffer.from(''));\n\n\t\t\t\t\tif (request.headers['content-type'] === 'application/json') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\t\t\tpostData = JSON.parse(data.toString('utf-8'));\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tthrow(new Error('Invalid JSON data'));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Unsupported content type'));\n\t\t\t\t\t}\n\t\t\t\t\t/**\n\t\t\t\t\t * Call the route handler\n\t\t\t\t\t */\n\t\t\t\t\tresult = await route(params, postData, request.headers);\n\t\t\t\t} else {\n\t\t\t\t\tresult = await route(params, undefined, request.headers);\n\t\t\t\t}\n\n\t\t\t\tgeneratedResult = true;\n\t\t\t} catch (err) {\n\t\t\t\t/**\n\t\t\t\t * If an error occurs, log it and return an error page\n\t\t\t\t */\n\t\t\t\tthis.logger?.error('KeetaAnchorHTTP.Server', err);\n\n\t\t\t\t/**\n\t\t\t\t * If it is a user error, provide a user-friendly error page\n\t\t\t\t */\n\t\t\t\tconst errorHandlerRoute = routes['ERROR'];\n\t\t\t\tif (errorHandlerRoute !== undefined) {\n\t\t\t\t\tif (KeetaAnchorUserError.isInstance(err)) {\n\t\t\t\t\t\tresult = await errorHandlerRoute(new Map(), err.asErrorResponse('application/json'), request.headers);\n\t\t\t\t\t\tgeneratedResult = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = await errorHandlerRoute(new Map(), {\n\t\t\t\t\t\t\terror: JSON.stringify({ ok: false, error: 'Internal Server Error' }),\n\t\t\t\t\t\t\tstatusCode: 500,\n\t\t\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t\t\t}, request.headers);\n\t\t\t\t\t\tgeneratedResult = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!generatedResult) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Otherwise provide a generic error page\n\t\t\t\t\t */\n\t\t\t\t\tresponse.statusCode = 500;\n\t\t\t\t\tresponse.setHeader('Content-Type', 'text/plain');\n\t\t\t\t\tresponse.write('Internal Server Error');\n\t\t\t\t\tawait responseFinalize();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (result === undefined) {\n\t\t\t\tthrow(new Error('internal error: No result'));\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Write the response to the client\n\t\t\t */\n\t\t\tresponse.statusCode = result.statusCode ?? 200;\n\n\t\t\tfor (const headerKey in result.headers ?? {}) {\n\t\t\t\tconst headerValue = result.headers?.[headerKey];\n\t\t\t\tif (headerValue !== undefined) {\n\t\t\t\t\tresponse.setHeader(headerKey, headerValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresponse.setHeader('Content-Type', result.contentType ?? 'application/json');\n\t\t\tresponse.write(result.output);\n\t\t\tawait responseFinalize();\n\t\t});\n\t\tthis.#server = server;\n\n\t\t/**\n\t\t * Create a promise to wait for the server to close\n\t\t */\n\t\tconst waiter = new Promise<void>((resolve) => {\n\t\t\tserver.on('close', () => {\n\t\t\t\tthis.logger?.debug('KeetaAnchorHTTP.Server', 'Server closed');\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\t/**\n\t\t * Start listening on the port\n\t\t */\n\t\tserver.listen(port, () => {\n\t\t\tconst address = server.address();\n\t\t\tif (address !== null && typeof address === 'object') {\n\t\t\t\t// @ts-ignore\n\t\t\t\tthis.port = address.port;\n\t\t\t\tonSetPort?.(this.port);\n\t\t\t}\n\t\t\tthis.logger?.debug('KeetaAnchorHTTP.Server', 'Listening on port:', this.port);\n\t\t});\n\n\t\t/**\n\t\t * Wait for the server to close\n\t\t */\n\t\tawait waiter;\n\t}\n\n\t/**\n\t * Start the HTTP server and wait for it to be fully initialized.\n\t */\n\tasync start(): Promise<void> {\n\t\t/*\n\t\t * Start the server and wait for it to be initialized before returning\n\t\t */\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tthis.#serverPromise = this.main(function() {\n\t\t\t\tresolve();\n\t\t\t}).catch(function(error: unknown) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Wait for the server to terminate. This will only resolve once the\n\t * server has been stopped.\n\t */\n\tasync wait(): Promise<void> {\n\t\tawait this.#serverPromise;\n\t}\n\n\t/**\n\t * Stop the HTTP server and wait for it to be fully terminated.\n\t */\n\tasync stop(): Promise<void> {\n\t\tthis.#server?.close();\n\t\t// @ts-ignore\n\t\tthis.#server = undefined;\n\t\tawait this.wait();\n\t}\n\n\t/**\n\t * Get the URL of the server, which can be used to make requests to\n\t * it. This will use \"localhost\" as the hostname and the port that\n\t * the server is listening on.\n\t */\n\tget url(): string {\n\t\tif (this.port === 0 || this.#server === undefined) {\n\t\t\tthrow(new Error('Server not started'));\n\t\t}\n\n\t\treturn(`http://localhost:${this.port}`);\n\t}\n\n\t[Symbol.asyncDispose](): Promise<void> {\n\t\treturn(this.stop());\n\t}\n}\n"]}
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/lib/http-server.ts"],"names":[],"mappings":"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","sourcesContent":["import * as http from 'http';\nimport {\n\tKeetaAnchorError,\n\tKeetaAnchorUserError\n} from './error.js';\nimport type { JSONSerializable } from './utils/json.js';\nimport type { Logger, LogLevel } from './log/index.js';\nimport { Log } from './log/index.js';\nimport { createAssert } from 'typia';\nimport { assertNever } from './utils/never.js';\n\nexport const AssertHTTPErrorData: (input: unknown) => { error: string; statusCode?: number; contentType?: string; } = createAssert<{ error: string; statusCode?: number; contentType?: string; }>();\n\n/**\n * The maximum size of a request (128KiB)\n */\nconst MAX_REQUEST_SIZE = 1024 * 128;\n\nexport type Routes = {\n\t[route: string]: (urlParams: Map<string, string>, postData: JSONSerializable | undefined, requestHeaders: http.IncomingHttpHeaders) => Promise<{ output: string | Buffer; statusCode?: number; contentType?: string; headers?: { [headerName: string]: string; }; }>;\n};\n\nexport interface KeetaAnchorHTTPServerConfig {\n\t/**\n\t * The port for the HTTP server to listen on (default is an ephemeral port).\n\t */\n\tport?: number;\n\n\t/**\n\t * Enable debug logging\n\t */\n\tlogger?: Logger;\n};\n\nexport abstract class KeetaNetAnchorHTTPServer<ConfigType extends KeetaAnchorHTTPServerConfig = KeetaAnchorHTTPServerConfig> implements Required<KeetaAnchorHTTPServerConfig> {\n\treadonly port: NonNullable<KeetaAnchorHTTPServerConfig['port']>;\n\treadonly logger: NonNullable<KeetaAnchorHTTPServerConfig['logger']>;\n\t#serverPromise?: Promise<void>;\n\t#server?: http.Server;\n\t#url: undefined | string | URL | ((object: this) => string);\n\treadonly #config: ConfigType;\n\n\tconstructor(config: ConfigType) {\n\t\tthis.#config = { ...config };\n\t\tthis.port = config.port ?? 0;\n\t\tthis.logger = config.logger ?? Log.Legacy('ANCHOR');\n\t}\n\n\tprotected abstract initRoutes(config: ConfigType): Promise<Routes>;\n\n\tprivate static routeMatch(requestURL: URL, routeURL: URL): ({ match: true; params: Map<string, string> } | { match: false }) {\n\t\tconst requestURLPaths = requestURL.pathname.split('/');\n\t\tconst routeURLPaths = routeURL.pathname.split('/');\n\n\t\tif (requestURLPaths.length !== routeURLPaths.length) {\n\t\t\treturn({ match: false });\n\t\t}\n\n\t\tconst params = new Map<string, string>();\n\t\tfor (let partIndex = 0; partIndex < requestURLPaths.length; partIndex++) {\n\t\t\tconst requestPath = requestURLPaths[partIndex];\n\t\t\tconst routePath = routeURLPaths[partIndex];\n\n\t\t\tif (routePath === undefined || requestPath === undefined) {\n\t\t\t\treturn({ match: false });\n\t\t\t}\n\n\t\t\tif (routePath.startsWith(':')) {\n\t\t\t\tparams.set(routePath.slice(1), requestPath);\n\t\t\t} else if (requestPath !== routePath) {\n\t\t\t\treturn({ match: false });\n\t\t\t}\n\t\t}\n\n\t\treturn({ match: true, params: params });\n\t}\n\n\tprivate static routeFind(method: string, requestURL: URL, routes: Routes): { route: Routes[keyof Routes]; params: Map<string, string> } | null {\n\t\tfor (const routeKey in routes) {\n\t\t\tconst route = routes[routeKey];\n\t\t\tif (route === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [routeMethod, ...routePathParts] = routeKey.split(' ');\n\t\t\tconst routePath = `/${routePathParts.join(' ')}`.replace(/^\\/+/, '/');\n\n\t\t\tif (method !== routeMethod) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst routeURL = new URL(routePath, 'http://localhost');\n\t\t\tconst matchResult = this.routeMatch(requestURL, routeURL);\n\t\t\tif (matchResult.match) {\n\t\t\t\treturn({\n\t\t\t\t\troute: route,\n\t\t\t\t\tparams: matchResult.params\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn(null);\n\t}\n\n\tprivate static addCORS(routes: Routes): Routes {\n\t\tconst newRoutes: Routes = {};\n\n\t\tconst validMethods = new Set(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD']);\n\n\t\tconst methodsByPath: { [key: string]: Set<string>; } = {};\n\t\tfor (const routeKey in routes) {\n\t\t\tconst methodAndPath = routeKey.split(' ');\n\t\t\tconst method = methodAndPath[0];\n\t\t\tconst path = methodAndPath.slice(1).join(' ');\n\n\t\t\tif (method === undefined || path === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!validMethods.has(method)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!(path in methodsByPath)) {\n\t\t\t\tmethodsByPath[path] = new Set<string>();\n\t\t\t}\n\n\t\t\tif (methodsByPath[path] === undefined) {\n\t\t\t\tthrow(new Error(`internal error: methodsByPath missing path for ${path}`));\n\t\t\t}\n\n\t\t\tmethodsByPath[path].add(method);\n\t\t}\n\n\t\tconst seenPaths = new Set<string>();\n\t\tfor (const routeKey in routes) {\n\t\t\tconst methodAndPath = routeKey.split(' ');\n\t\t\tconst method = methodAndPath[0];\n\t\t\tconst path = methodAndPath.slice(1).join(' ');\n\n\t\t\tconst routeHandler = routes[routeKey];\n\t\t\tif (routeHandler === undefined) {\n\t\t\t\tthrow(new Error(`internal error: routeHandler missing for routeKey ${routeKey}`));\n\t\t\t}\n\n\t\t\tif (method !== 'ERROR') {\n\t\t\t\tif (method === undefined || path === undefined) {\n\t\t\t\t\tnewRoutes[routeKey] = routeHandler;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!validMethods.has(method)) {\n\t\t\t\t\tnewRoutes[routeKey] = routeHandler;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst validMethodsForPath = methodsByPath[path];\n\n\t\t\tlet validMethodsForPathParts: string[] = [];\n\t\t\tif (validMethodsForPath !== undefined) {\n\t\t\t\tvalidMethodsForPath.add('OPTIONS');\n\t\t\t\tvalidMethodsForPathParts = Array.from(validMethodsForPath);\n\t\t\t} else {\n\t\t\t\tvalidMethodsForPathParts = [...Array.from(validMethods), 'OPTIONS'];\n\t\t\t}\n\n\t\t\tnewRoutes[routeKey] = async function(...args: Parameters<typeof routes[keyof typeof routes]>) {\n\t\t\t\tconst retval = await routeHandler(...args);\n\n\t\t\t\t/* Add CORS headers to the response for the original route handler */\n\t\t\t\tif (retval.contentType === 'application/json' || retval.contentType === undefined) {\n\t\t\t\t\tif (!('headers' in retval) || retval.headers === undefined) {\n\t\t\t\t\t\tretval.headers = {};\n\t\t\t\t\t}\n\t\t\t\t\tretval.headers['Access-Control-Allow-Origin'] = '*';\n\t\t\t\t}\n\n\t\t\t\treturn(retval);\n\t\t\t};\n\n\t\t\tif (!seenPaths.has(path) && path !== '' && path !== undefined) {\n\t\t\t\tconst corsRouteKey = `OPTIONS ${path}`;\n\n\t\t\t\tnewRoutes[corsRouteKey] = async function() {\n\t\t\t\t\treturn({\n\t\t\t\t\t\toutput: '',\n\t\t\t\t\t\tstatusCode: 204,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Access-Control-Allow-Origin': '*',\n\t\t\t\t\t\t\t'Access-Control-Allow-Methods': validMethodsForPathParts.join(', '),\n\t\t\t\t\t\t\t'Access-Control-Allow-Headers': 'Content-Type',\n\t\t\t\t\t\t\t'Access-Control-Max-Age': '86400'\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t\tseenPaths.add(path);\n\t\t\t}\n\t\t}\n\n\t\treturn(newRoutes);\n\t}\n\n\tprivate async main(onSetPort?: (port: number) => void): Promise<void> {\n\t\tthis.logger?.debug('KeetaAnchorHTTP.Server', 'Starting HTTP server...');\n\n\t\tconst port = this.port;\n\n\t\tconst routes = KeetaNetAnchorHTTPServer.addCORS({\n\t\t\tERROR: async function(_ignore_params, postData) {\n\t\t\t\tconst errorInfo = AssertHTTPErrorData(postData);\n\n\t\t\t\tconst retval = {\n\t\t\t\t\toutput: errorInfo.error,\n\t\t\t\t\tstatusCode: errorInfo.statusCode ?? 400,\n\t\t\t\t\tcontentType: errorInfo.contentType ?? 'text/plain'\n\t\t\t\t};\n\n\t\t\t\treturn(retval);\n\t\t\t},\n\t\t\t...(await this.initRoutes(this.#config))\n\t\t});\n\n\t\tconst server = new http.Server(async (request, response) => {\n\t\t\tconst url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n\t\t\tconst method = request.method ?? 'GET';\n\n\t\t\t/*\n\t\t\t * Finalize the response by syncing the logger and ending\n\t\t\t * the response.\n\t\t\t */\n\t\t\tconst responseFinalize = async () => {\n\t\t\t\tif ('sync' in this.logger && typeof this.logger.sync === 'function') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.logger.sync();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* ignore errors */\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresponse.end();\n\t\t\t};\n\n\t\t\t/*\n\t\t\t * Lookup the route based on the request\n\t\t\t */\n\t\t\tconst requestedRouteAndParams = KeetaNetAnchorHTTPServer.routeFind(method, url, routes);\n\t\t\tif (requestedRouteAndParams === null) {\n\t\t\t\tresponse.statusCode = 404;\n\t\t\t\tresponse.setHeader('Content-Type', 'text/plain');\n\t\t\t\tresponse.write('Not Found');\n\t\t\t\tawait responseFinalize();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Extract the route handler and the parameters from\n\t\t\t * the request\n\t\t\t */\n\t\t\tconst { route, params } = requestedRouteAndParams;\n\n\t\t\t/**\n\t\t\t * Attempt to run the route, catch any errors\n\t\t\t */\n\t\t\tlet result: Awaited<ReturnType<typeof route>> | undefined = undefined;\n\t\t\tlet generatedResult = false;\n\t\t\ttry {\n\t\t\t\t/**\n\t\t\t\t * If POST'ing, read and parse the POST data\n\t\t\t\t */\n\t\t\t\tlet postData: JSONSerializable | undefined;\n\t\t\t\tif (request.method === 'POST') {\n\t\t\t\t\tconst data = await request.map(function(chunk) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t\t\t\treturn(Buffer.from(chunk));\n\t\t\t\t\t}).reduce(function(prev, curr) {\n\t\t\t\t\t\tif (prev.length > MAX_REQUEST_SIZE) {\n\t\t\t\t\t\t\tthrow(new Error('Request too large'));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!Buffer.isBuffer(curr)) {\n\t\t\t\t\t\t\tthrow(new Error(`internal error: Current item is not a buffer -- ${typeof curr}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn(Buffer.concat([prev, curr]));\n\t\t\t\t\t}, Buffer.from(''));\n\n\t\t\t\t\tif (request.headers['content-type'] === 'application/json') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\t\t\tpostData = JSON.parse(data.toString('utf-8'));\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tthrow(new Error('Invalid JSON data'));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Unsupported content type'));\n\t\t\t\t\t}\n\t\t\t\t\t/**\n\t\t\t\t\t * Call the route handler\n\t\t\t\t\t */\n\t\t\t\t\tresult = await route(params, postData, request.headers);\n\t\t\t\t} else {\n\t\t\t\t\tresult = await route(params, undefined, request.headers);\n\t\t\t\t}\n\n\t\t\t\tgeneratedResult = true;\n\t\t\t} catch (err) {\n\t\t\t\tlet logLevel: Lowercase<LogLevel> = 'error';\n\t\t\t\tif (KeetaAnchorError.isInstance(err)) {\n\t\t\t\t\t/*\n\t\t\t\t\t * We're able to safely cast this here because the cast\n\t\t\t\t\t * duplicates the logic.\n\t\t\t\t\t */\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\tlogLevel = err.logLevel.toLowerCase() as Lowercase<typeof err.logLevel>;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * If an error occurs, log it and return an error page\n\t\t\t\t */\n\t\t\t\tthis.logger?.[logLevel]('KeetaAnchorHTTP.Server', err);\n\n\t\t\t\t/**\n\t\t\t\t * If it is a user error, provide a user-friendly error page\n\t\t\t\t */\n\t\t\t\tconst errorHandlerRoute = routes['ERROR'];\n\t\t\t\tif (errorHandlerRoute !== undefined) {\n\t\t\t\t\tif (KeetaAnchorUserError.isInstance(err)) {\n\t\t\t\t\t\tresult = await errorHandlerRoute(new Map(), err.asErrorResponse('application/json'), request.headers);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = await errorHandlerRoute(new Map(), {\n\t\t\t\t\t\t\terror: JSON.stringify({ ok: false, error: 'Internal Server Error' }),\n\t\t\t\t\t\t\tstatusCode: 500,\n\t\t\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t\t\t}, request.headers);\n\t\t\t\t\t}\n\t\t\t\t\tgeneratedResult = true;\n\t\t\t\t}\n\n\t\t\t\tif (!generatedResult) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Otherwise provide a generic error page\n\t\t\t\t\t */\n\t\t\t\t\tresponse.statusCode = 500;\n\t\t\t\t\tresponse.setHeader('Content-Type', 'text/plain');\n\t\t\t\t\tresponse.write('Internal Server Error');\n\t\t\t\t\tawait responseFinalize();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (result === undefined) {\n\t\t\t\tthrow(new Error('internal error: No result'));\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Write the response to the client\n\t\t\t */\n\t\t\tresponse.statusCode = result.statusCode ?? 200;\n\n\t\t\tfor (const headerKey in result.headers ?? {}) {\n\t\t\t\tconst headerValue = result.headers?.[headerKey];\n\t\t\t\tif (headerValue !== undefined) {\n\t\t\t\t\tresponse.setHeader(headerKey, headerValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresponse.setHeader('Content-Type', result.contentType ?? 'application/json');\n\t\t\tresponse.write(result.output);\n\t\t\tawait responseFinalize();\n\t\t});\n\t\tthis.#server = server;\n\n\t\t/**\n\t\t * Create a promise to wait for the server to close\n\t\t */\n\t\tconst waiter = new Promise<void>((resolve) => {\n\t\t\tserver.on('close', () => {\n\t\t\t\tthis.logger?.debug('KeetaAnchorHTTP.Server', 'Server closed');\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\t/**\n\t\t * Start listening on the port\n\t\t */\n\t\tserver.listen(port, () => {\n\t\t\tconst address = server.address();\n\t\t\tif (address !== null && typeof address === 'object') {\n\t\t\t\t// @ts-ignore\n\t\t\t\tthis.port = address.port;\n\t\t\t\tonSetPort?.(this.port);\n\t\t\t}\n\t\t\tthis.logger?.debug('KeetaAnchorHTTP.Server', 'Listening on port:', this.port);\n\t\t});\n\n\t\t/**\n\t\t * Wait for the server to close\n\t\t */\n\t\tawait waiter;\n\t}\n\n\t/**\n\t * Start the HTTP server and wait for it to be fully initialized.\n\t */\n\tasync start(): Promise<void> {\n\t\t/*\n\t\t * Start the server and wait for it to be initialized before returning\n\t\t */\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tthis.#serverPromise = this.main(function() {\n\t\t\t\tresolve();\n\t\t\t}).catch(function(error: unknown) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Wait for the server to terminate. This will only resolve once the\n\t * server has been stopped.\n\t */\n\tasync wait(): Promise<void> {\n\t\tawait this.#serverPromise;\n\t}\n\n\t/**\n\t * Stop the HTTP server and wait for it to be fully terminated.\n\t */\n\tasync stop(): Promise<void> {\n\t\tthis.#server?.close();\n\t\t// @ts-ignore\n\t\tthis.#server = undefined;\n\t\tawait this.wait();\n\t}\n\n\t/**\n\t * Get the URL of the server, which can be used to make requests to\n\t * it. This will use \"localhost\" as the hostname and the port that\n\t * the server is listening on by default but can be overridden by\n\t * setting a custom URL.\n\t */\n\tget url(): string {\n\t\tif (this.port === 0 || this.#server === undefined) {\n\t\t\tthrow(new Error('Server not started'));\n\t\t}\n\n\t\tif (this.#url !== undefined) {\n\t\t\tlet newURL: string;\n\t\t\tif (typeof this.#url === 'string') {\n\t\t\t\tnewURL = this.#url;\n\t\t\t} else if (this.#url instanceof URL || ('port' in this.#url && 'hostname' in this.#url && 'toString' in this.#url)) {\n\t\t\t\tnewURL = this.#url.toString();\n\t\t\t} else if (typeof this.#url === 'function') {\n\t\t\t\tnewURL = this.#url(this);\n\t\t\t} else {\n\t\t\t\tassertNever(this.#url);\n\t\t\t}\n\n\t\t\tconst newURLObj = new URL(newURL);\n\t\t\tnewURLObj.pathname = '/';\n\t\t\tnewURLObj.search = '';\n\n\t\t\treturn(newURLObj.toString());\n\t\t}\n\n\t\treturn(`http://localhost:${this.port}`);\n\t}\n\n\tset url(value: string | URL | ((object: this) => string)) {\n\t\tthis.#url = value;\n\t}\n\n\t[Symbol.asyncDispose](): Promise<void> {\n\t\treturn(this.stop());\n\t}\n}\n"]}