@xyo-network/bridge-http-express 3.18.10 → 4.0.1

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.
@@ -70,10 +70,12 @@ var HttpBridgeExpress = class extends HttpBridge {
70
70
  return this._exposedModules.map((ref) => ref.deref()?.address).filter(exists);
71
71
  }
72
72
  async startHandler() {
73
- return await super.startHandler() && await this.startHttpServer();
73
+ await super.startHandler();
74
+ await this.startHttpServer();
74
75
  }
75
76
  async stopHandler(_timeout) {
76
- return await super.stopHandler() && await this.stopHttpServer();
77
+ await super.stopHandler();
78
+ await this.stopHttpServer();
77
79
  }
78
80
  async unexposeHandler(address, options) {
79
81
  const { maxDepth = 2, required = true } = options ?? {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/HttpBridge.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/express'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { isQueryBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { HttpBridge, HttpBridgeConfig } from '@xyo-network/bridge-http'\nimport {\n BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\n// import { standardResponses } from '@xyo-network/express-node-middleware'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance, ModuleQueryResult, resolveAddressToInstanceUp,\n} from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport express, {\n Application, Request, Response,\n} from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\n/**\n * The type of the path parameters for the address path.\n */\ntype AddressPathParams = {\n address: Address\n}\n\n/**\n * The type of the request body for the address path.\n */\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\n// TODO: This does not match the error response shape of the legacy bridge BUT it its the\n// shape this bridge is currently returning. Massage this into the standard\n// error shape constructed via middleware.\n/* type ErrorResponseBody = {\n error: string\n} */\n\nexport const HttpBridgeExpressConfigSchema = 'network.xyo.bridge.http.express.config' as const\nexport type HttpBridgeExpressConfigSchema = typeof HttpBridgeExpressConfigSchema\n\nexport interface HttpBridgeExpressConfig extends HttpBridgeConfig<{}, HttpBridgeExpressConfigSchema> {}\n\nexport interface HttpBridgeExpressParams extends BridgeParams<AnyConfigSchema<HttpBridgeExpressConfig>> {}\n\n@creatableModule()\nexport class HttpBridgeExpress<TParams extends HttpBridgeExpressParams> extends HttpBridge<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeExpressConfigSchema]\n protected _app?: Application\n protected _exposedModules: WeakRef<ModuleInstance>[] = []\n protected _server?: Server\n\n protected get app() {\n if (!this._app) this._app = this.initializeApp()\n return assertEx(this._app, () => 'App not initialized')\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5 } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n this._exposedModules.push(new WeakRef(mod))\n const children = maxDepth > 0 ? ((await mod.publicChildren?.()) ?? []) : []\n this.logger?.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toJsonString(children.map(child => child.id))}`)\n const exposedChildren = (await Promise.all(children.map(child => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false }))))\n .flat()\n .filter(exists)\n const allExposed = [mod, ...exposedChildren]\n\n for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`)\n\n return allExposed\n }\n\n override async exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { required = true } = options ?? {}\n const mod = await resolveAddressToInstanceUp(this, address)\n if (required && !mod) {\n throw new Error(`Unable to find required module: ${address}`)\n }\n if (mod) {\n return this.exposeChild(mod, options)\n }\n return []\n }\n\n override exposedHandler(): Address[] {\n return this._exposedModules.map(ref => ref.deref()?.address).filter(exists)\n }\n\n override async startHandler(): Promise<boolean> {\n return (await super.startHandler()) && (await this.startHttpServer())\n }\n\n override async stopHandler(_timeout?: number | undefined): Promise<boolean> {\n return (await super.stopHandler()) && (await this.stopHttpServer())\n }\n\n override async unexposeHandler(address: Address, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, required = true } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n assertEx(!required || mod, () => `Module not exposed: ${address}`)\n this._exposedModules = this._exposedModules.filter(ref => ref.deref()?.address !== address)\n if (mod) {\n const children = maxDepth > 0 ? ((await mod.publicChildren?.()) ?? []) : []\n const exposedChildren = (\n await Promise.all(children.map(child => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [mod, ...exposedChildren]\n }\n return []\n }\n\n protected async callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null> {\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n return mod ? await mod.query(query, payloads) : null\n }\n\n protected async handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n try {\n if (address == this.address) {\n res.json(await this.stateQuery(this.account))\n } else {\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n // TODO: Use standard errors middleware\n if (mod) {\n res.json(await mod.stateQuery(this.account))\n } else {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected async handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n const [bw, payloads = []] = Array.isArray(req.body) ? req.body : []\n const query = isQueryBoundWitness(bw) ? bw : undefined\n if (!query) {\n // TODO: Use standard errors middleware\n res.status(StatusCodes.BAD_REQUEST).json({ error: 'No query provided' })\n return\n }\n try {\n if (address == this.address) {\n const result = await this.query(query, payloads)\n return res.json(result)\n } else {\n const result = await this.callLocalModule(address, query, payloads)\n // TODO: Use standard errors middleware\n if (result === null) {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n } else {\n res.json(result)\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected initializeApp() {\n // Create the express app\n const app = express()\n\n // Add middleware\n app.use(responseProfiler)\n app.use(jsonBodyParser)\n // removed for now since this causes a cycle\n // app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n useRequestCounters(app)\n\n // Add routes\n // Redirect all requests to the root to this module's address\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${this.address}`))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`))\n\n app.get<AddressPathParams, ModuleQueryResult>(\n '/:address',\n\n asyncHandler(async (req, res) => await this.handleGet(req, res)),\n )\n app.post<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>(\n '/:address',\n\n asyncHandler(async (req, res) => { await this.handlePost(req, res) }),\n )\n return app\n }\n\n protected startHttpServer(): Promise<boolean> {\n if (this.config.host) {\n assertEx(!this._server, () => 'Server already started')\n this._server = this.app.listen(this.config.host?.port ?? 3030)\n }\n return Promise.resolve(true)\n }\n\n protected stopHttpServer(): Promise<boolean> {\n if (this.config.host) {\n return new Promise((resolve, reject) => {\n if (this._server) {\n this._server.close((err) => {\n if (err) {\n reject(err)\n } else {\n this._server = undefined\n resolve(true)\n }\n })\n }\n })\n }\n return Promise.resolve(true)\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/HttpBridge.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/express'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { isQueryBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { HttpBridge, HttpBridgeConfig } from '@xyo-network/bridge-http'\nimport {\n BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\n// import { standardResponses } from '@xyo-network/express-node-middleware'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance, ModuleQueryResult, resolveAddressToInstanceUp,\n} from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport express, {\n Application, Request, Response,\n} from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\n/**\n * The type of the path parameters for the address path.\n */\ntype AddressPathParams = {\n address: Address\n}\n\n/**\n * The type of the request body for the address path.\n */\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\n// TODO: This does not match the error response shape of the legacy bridge BUT it its the\n// shape this bridge is currently returning. Massage this into the standard\n// error shape constructed via middleware.\n/* type ErrorResponseBody = {\n error: string\n} */\n\nexport const HttpBridgeExpressConfigSchema = 'network.xyo.bridge.http.express.config' as const\nexport type HttpBridgeExpressConfigSchema = typeof HttpBridgeExpressConfigSchema\n\nexport interface HttpBridgeExpressConfig extends HttpBridgeConfig<{}, HttpBridgeExpressConfigSchema> {}\n\nexport interface HttpBridgeExpressParams extends BridgeParams<AnyConfigSchema<HttpBridgeExpressConfig>> {}\n\n@creatableModule()\nexport class HttpBridgeExpress<TParams extends HttpBridgeExpressParams> extends HttpBridge<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeExpressConfigSchema]\n protected _app?: Application\n protected _exposedModules: WeakRef<ModuleInstance>[] = []\n protected _server?: Server\n\n protected get app() {\n if (!this._app) this._app = this.initializeApp()\n return assertEx(this._app, () => 'App not initialized')\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5 } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n this._exposedModules.push(new WeakRef(mod))\n const children = maxDepth > 0 ? ((await mod.publicChildren?.()) ?? []) : []\n this.logger?.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toJsonString(children.map(child => child.id))}`)\n const exposedChildren = (await Promise.all(children.map(child => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false }))))\n .flat()\n .filter(exists)\n const allExposed = [mod, ...exposedChildren]\n\n for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`)\n\n return allExposed\n }\n\n override async exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { required = true } = options ?? {}\n const mod = await resolveAddressToInstanceUp(this, address)\n if (required && !mod) {\n throw new Error(`Unable to find required module: ${address}`)\n }\n if (mod) {\n return this.exposeChild(mod, options)\n }\n return []\n }\n\n override exposedHandler(): Address[] {\n return this._exposedModules.map(ref => ref.deref()?.address).filter(exists)\n }\n\n override async startHandler() {\n await super.startHandler()\n await this.startHttpServer()\n }\n\n override async stopHandler(_timeout?: number | undefined) {\n await super.stopHandler()\n await this.stopHttpServer()\n }\n\n override async unexposeHandler(address: Address, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, required = true } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n assertEx(!required || mod, () => `Module not exposed: ${address}`)\n this._exposedModules = this._exposedModules.filter(ref => ref.deref()?.address !== address)\n if (mod) {\n const children = maxDepth > 0 ? ((await mod.publicChildren?.()) ?? []) : []\n const exposedChildren = (\n await Promise.all(children.map(child => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [mod, ...exposedChildren]\n }\n return []\n }\n\n protected async callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null> {\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n return mod ? await mod.query(query, payloads) : null\n }\n\n protected async handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n try {\n if (address == this.address) {\n res.json(await this.stateQuery(this.account))\n } else {\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n // TODO: Use standard errors middleware\n if (mod) {\n res.json(await mod.stateQuery(this.account))\n } else {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected async handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n const [bw, payloads = []] = Array.isArray(req.body) ? req.body : []\n const query = isQueryBoundWitness(bw) ? bw : undefined\n if (!query) {\n // TODO: Use standard errors middleware\n res.status(StatusCodes.BAD_REQUEST).json({ error: 'No query provided' })\n return\n }\n try {\n if (address == this.address) {\n const result = await this.query(query, payloads)\n return res.json(result)\n } else {\n const result = await this.callLocalModule(address, query, payloads)\n // TODO: Use standard errors middleware\n if (result === null) {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n } else {\n res.json(result)\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected initializeApp() {\n // Create the express app\n const app = express()\n\n // Add middleware\n app.use(responseProfiler)\n app.use(jsonBodyParser)\n // removed for now since this causes a cycle\n // app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n useRequestCounters(app)\n\n // Add routes\n // Redirect all requests to the root to this module's address\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${this.address}`))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`))\n\n app.get<AddressPathParams, ModuleQueryResult>(\n '/:address',\n\n asyncHandler(async (req, res) => await this.handleGet(req, res)),\n )\n app.post<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>(\n '/:address',\n\n asyncHandler(async (req, res) => { await this.handlePost(req, res) }),\n )\n return app\n }\n\n protected startHttpServer(): Promise<boolean> {\n if (this.config.host) {\n assertEx(!this._server, () => 'Server already started')\n this._server = this.app.listen(this.config.host?.port ?? 3030)\n }\n return Promise.resolve(true)\n }\n\n protected stopHttpServer(): Promise<boolean> {\n if (this.config.host) {\n return new Promise((resolve, reject) => {\n if (this._server) {\n this._server.close((err) => {\n if (err) {\n reject(err)\n } else {\n this._server = undefined\n resolve(true)\n }\n })\n }\n })\n }\n return Promise.resolve(true)\n }\n}\n"],"mappings":"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","names":[]}
@@ -31,8 +31,8 @@ export declare class HttpBridgeExpress<TParams extends HttpBridgeExpressParams>
31
31
  exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]>;
32
32
  exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]>;
33
33
  exposedHandler(): Address[];
34
- startHandler(): Promise<boolean>;
35
- stopHandler(_timeout?: number | undefined): Promise<boolean>;
34
+ startHandler(): Promise<void>;
35
+ stopHandler(_timeout?: number | undefined): Promise<void>;
36
36
  unexposeHandler(address: Address, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]>;
37
37
  protected callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null>;
38
38
  protected handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"HttpBridge.d.ts","sourceRoot":"","sources":["../../src/HttpBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAalC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EAAuB,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACxF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,EACL,mBAAmB,EAAE,YAAY,EAAE,qBAAqB,EACzD,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,eAAe,EAAmB,cAAc,EAAE,iBAAiB,EACpE,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,OAAO,EAAE,EACd,WAAW,EAAE,OAAO,EAAE,QAAQ,EAC/B,MAAM,SAAS,CAAA;AAGhB;;GAEG;AACH,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED;;GAEG;AACH,KAAK,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,CAAC,CAAA;AASxE,eAAO,MAAM,6BAA6B,EAAG,wCAAiD,CAAA;AAC9F,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAA;AAEhF,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB,CAAC,EAAE,EAAE,6BAA6B,CAAC;CAAG;AAEvG,MAAM,WAAW,uBAAwB,SAAQ,YAAY,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC;CAAG;AAE1G,qBACa,iBAAiB,CAAC,OAAO,SAAS,uBAAuB,CAAE,SAAQ,UAAU,CAAC,OAAO,CAAC;IACjG,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA0D;IAC1G,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,CAAA;IAC5B,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,CAAK;IACzD,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IAE1B,SAAS,KAAK,GAAG,wBAGhB;IAEK,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgB7F,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAY3G,cAAc,IAAI,OAAO,EAAE;IAIrB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5D,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;cAkBxG,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;cAKnH,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,EAAE,GAAG,EAAE,QAAQ;cAoBnG,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,EAAE,GAAG,EAAE,QAAQ;IA4BpH,SAAS,CAAC,aAAa;IAgCvB,SAAS,CAAC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ7C,SAAS,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAiB7C"}
1
+ {"version":3,"file":"HttpBridge.d.ts","sourceRoot":"","sources":["../../src/HttpBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAalC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EAAuB,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACxF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,EACL,mBAAmB,EAAE,YAAY,EAAE,qBAAqB,EACzD,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,eAAe,EAAmB,cAAc,EAAE,iBAAiB,EACpE,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,OAAO,EAAE,EACd,WAAW,EAAE,OAAO,EAAE,QAAQ,EAC/B,MAAM,SAAS,CAAA;AAGhB;;GAEG;AACH,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED;;GAEG;AACH,KAAK,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,CAAC,CAAA;AASxE,eAAO,MAAM,6BAA6B,EAAG,wCAAiD,CAAA;AAC9F,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAA;AAEhF,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB,CAAC,EAAE,EAAE,6BAA6B,CAAC;CAAG;AAEvG,MAAM,WAAW,uBAAwB,SAAQ,YAAY,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC;CAAG;AAE1G,qBACa,iBAAiB,CAAC,OAAO,SAAS,uBAAuB,CAAE,SAAQ,UAAU,CAAC,OAAO,CAAC;IACjG,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA0D;IAC1G,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,CAAA;IAC5B,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,CAAK;IACzD,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IAE1B,SAAS,KAAK,GAAG,wBAGhB;IAEK,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgB7F,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAY3G,cAAc,IAAI,OAAO,EAAE;IAIrB,YAAY;IAKZ,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS;IAKzC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;cAkBxG,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;cAKnH,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,EAAE,GAAG,EAAE,QAAQ;cAoBnG,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,EAAE,GAAG,EAAE,QAAQ;IA4BpH,SAAS,CAAC,aAAa;IAgCvB,SAAS,CAAC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ7C,SAAS,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAiB7C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/bridge-http-express",
3
- "version": "3.18.10",
3
+ "version": "4.0.1",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -36,39 +36,39 @@
36
36
  "package.json"
37
37
  ],
38
38
  "dependencies": {
39
- "@xylabs/assert": "^4.11.21",
40
- "@xylabs/exists": "^4.11.21",
41
- "@xylabs/express": "^4.11.21",
42
- "@xylabs/hex": "^4.11.21",
43
- "@xylabs/object": "^4.11.21",
44
- "@xyo-network/boundwitness-model": "^3.18.10",
45
- "@xyo-network/bridge-http": "^3.18.10",
46
- "@xyo-network/bridge-model": "^3.18.10",
47
- "@xyo-network/module-model": "^3.18.10",
48
- "@xyo-network/payload-model": "^3.18.10",
39
+ "@xylabs/assert": "^4.12.30",
40
+ "@xylabs/exists": "^4.12.30",
41
+ "@xylabs/express": "^4.12.30",
42
+ "@xylabs/hex": "^4.12.30",
43
+ "@xylabs/object": "^4.12.30",
44
+ "@xyo-network/boundwitness-model": "^4.0.1",
45
+ "@xyo-network/bridge-http": "^4.0.1",
46
+ "@xyo-network/bridge-model": "^4.0.1",
47
+ "@xyo-network/module-model": "^4.0.1",
48
+ "@xyo-network/payload-model": "^4.0.1",
49
49
  "express": "^5.1.0",
50
50
  "http-status-codes": "^2.3.0"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/express": "^5.0.3",
54
- "@types/node": "^24.0.3",
55
- "@xylabs/ts-scripts-yarn3": "^6.5.8",
56
- "@xylabs/tsconfig": "^6.5.8",
57
- "@xylabs/vitest-extended": "^4.11.21",
58
- "@xyo-network/api-models": "^3.18.10",
59
- "@xyo-network/archivist-model": "^3.18.10",
60
- "@xyo-network/bridge-abstract": "^3.18.10",
61
- "@xyo-network/bridge-pub-sub": "^3.18.10",
62
- "@xyo-network/diviner-model": "^3.18.10",
63
- "@xyo-network/module-resolver": "^3.18.10",
64
- "@xyo-network/node-memory": "^3.18.10",
65
- "@xyo-network/node-model": "^3.18.10",
66
- "@xyo-network/payload-builder": "^3.18.10",
67
- "@xyo-network/payload-wrapper": "^3.18.10",
68
- "@xyo-network/wallet": "^3.18.10",
54
+ "@types/node": "^24.0.10",
55
+ "@xylabs/ts-scripts-yarn3": "^6.5.12",
56
+ "@xylabs/tsconfig": "^6.5.12",
57
+ "@xylabs/vitest-extended": "^4.12.30",
58
+ "@xyo-network/api-models": "^4.0.1",
59
+ "@xyo-network/archivist-model": "^4.0.1",
60
+ "@xyo-network/bridge-abstract": "^4.0.1",
61
+ "@xyo-network/bridge-pub-sub": "^4.0.1",
62
+ "@xyo-network/diviner-model": "^4.0.1",
63
+ "@xyo-network/module-resolver": "^4.0.1",
64
+ "@xyo-network/node-memory": "^4.0.1",
65
+ "@xyo-network/node-model": "^4.0.1",
66
+ "@xyo-network/payload-builder": "^4.0.1",
67
+ "@xyo-network/payload-wrapper": "^4.0.1",
68
+ "@xyo-network/wallet": "^4.0.1",
69
69
  "get-port-please": "^3.1.2",
70
70
  "typescript": "^5.8.3",
71
- "vitest": "^3.2.3"
71
+ "vitest": "^3.2.4"
72
72
  },
73
73
  "publishConfig": {
74
74
  "access": "public"
package/src/HttpBridge.ts CHANGED
@@ -98,12 +98,14 @@ export class HttpBridgeExpress<TParams extends HttpBridgeExpressParams> extends
98
98
  return this._exposedModules.map(ref => ref.deref()?.address).filter(exists)
99
99
  }
100
100
 
101
- override async startHandler(): Promise<boolean> {
102
- return (await super.startHandler()) && (await this.startHttpServer())
101
+ override async startHandler() {
102
+ await super.startHandler()
103
+ await this.startHttpServer()
103
104
  }
104
105
 
105
- override async stopHandler(_timeout?: number | undefined): Promise<boolean> {
106
- return (await super.stopHandler()) && (await this.stopHttpServer())
106
+ override async stopHandler(_timeout?: number | undefined) {
107
+ await super.stopHandler()
108
+ await this.stopHttpServer()
107
109
  }
108
110
 
109
111
  override async unexposeHandler(address: Address, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {
@@ -54,7 +54,9 @@ describe.skip('HttpBridge with PubSubBridge', () => {
54
54
  const config: PubSubBridgeConfig = {
55
55
  client: { intersect }, host: { intersect }, name: 'PubSubBridgeArie', schema: PubSubBridgeConfigSchema,
56
56
  }
57
- const psParams: PubSubBridgeParams = { account: 'random', config }
57
+ const psParams: PubSubBridgeParams = {
58
+ account: 'random', config, name: 'PubSubBridge',
59
+ }
58
60
  const psBridge = await PubSubBridge.create(psParams)
59
61
  await memNode.register(psBridge)
60
62
  await memNode.attach(psBridge?.address, true)
@@ -94,6 +94,7 @@ describe('HttpBridgeExpress', () => {
94
94
  const remoteNode = asAttachableNodeInstance(
95
95
  rootModule,
96
96
  () => `Failed to resolve correct object type [XYOPublic] [${rootModule?.constructor.name}]`,
97
+ { required: true },
97
98
  )
98
99
 
99
100
  const state = await remoteNode.state()
@@ -130,7 +131,7 @@ describe('HttpBridgeExpress', () => {
130
131
  expect(archivistByName3).toEqual(archivistByName1)
131
132
  expect(archivistByName3).toEqual(archivistByName2)
132
133
  expect(archivistByName2).toBeDefined()
133
- const archivistInstance = asArchivistInstance(archivistByName2, 'Failed to cast archivist')
134
+ const archivistInstance = asArchivistInstance(archivistByName2, 'Failed to cast archivist', { required: true })
134
135
  expect(archivistInstance).toBeDefined()
135
136
  const knownPayload = PayloadWrapper.parse({ schema: 'network.xyo.test' })?.payload as Payload
136
137
  expect(knownPayload).toBeDefined()
@@ -164,7 +165,11 @@ describe('HttpBridgeExpress', () => {
164
165
  expect(isModule(mod)).toBeTrue()
165
166
  expect(isModuleObject(mod)).toBeTrue()
166
167
 
167
- const remoteNode = asAttachableNodeInstance(mod, `Failed to resolve [XYOPublic] - ${mod?.address} [${mod?.id}] [${mod?.constructor.name}]`)
168
+ const remoteNode = asAttachableNodeInstance(
169
+ mod,
170
+ `Failed to resolve [XYOPublic] - ${mod?.address} [${mod?.id}] [${mod?.constructor.name}]`,
171
+ { required: true },
172
+ )
168
173
 
169
174
  expect(isNodeInstance(remoteNode)).toBeTrue()
170
175
  expect(isModuleInstance(remoteNode)).toBeTrue()
@@ -40,7 +40,11 @@ describe('HttpBridgeExpress - Xns', () => {
40
40
  const rootModule = await bridge?.resolve('XNS')
41
41
  expect(rootModule).toBeDefined()
42
42
 
43
- const remoteNode = asAttachableNodeInstance(rootModule, () => `Failed to resolve correct object type [XYO] [${rootModule?.constructor.name}]`)
43
+ const remoteNode = asAttachableNodeInstance(
44
+ rootModule,
45
+ () => `Failed to resolve correct object type [XYO] [${rootModule?.constructor.name}]`,
46
+ { required: true },
47
+ )
44
48
 
45
49
  const registrarDiviner = asDivinerInstance(await remoteNode.resolve('XNS:AddressRecords:AddressRecordIndexDiviner'))
46
50
  expect(registrarDiviner).toBeDefined()