@xyo-network/bridge-http-express 6.0.4 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,10 +38,12 @@ bun add {{name}}
38
38
 
39
39
  See the [LICENSE](LICENSE) file for license rights and limitations (LGPL-3.0-only).
40
40
 
41
+ ## Credits
41
42
 
43
+ [Made with 🔥 and ❄️ by XYO Foundation](https://xyo.network)
42
44
 
43
- [logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png
44
45
  [npm-badge]: https://img.shields.io/npm/v/@xyo-network/bridge-http-express.svg
45
46
  [npm-link]: https://www.npmjs.com/package/@xyo-network/bridge-http-express
46
47
  [license-badge]: https://img.shields.io/npm/l/@xyo-network/bridge-http-express.svg
47
48
  [license-link]: https://github.com/xylabs/sdk-js/blob/main/LICENSE
49
+ [logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png
@@ -1,10 +1,12 @@
1
1
  import type { Server } from 'node:http';
2
+ import { zodAsFactory, zodIsFactory, zodToFactory } from '@xylabs/sdk-js';
2
3
  import type { HttpBridgeConfig } from '@xyo-network/bridge-http';
3
- import { HttpBridge } from '@xyo-network/bridge-http';
4
+ import { HttpBridge, HttpBridgeConfigZod } from '@xyo-network/bridge-http';
4
5
  import type { BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model';
5
6
  import type { AnyConfigSchema, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model';
6
7
  import type { Payload, QueryBoundWitness, Schema, XyoAddress } from '@xyo-network/sdk-protocol-js';
7
8
  import type { Application, Request, Response } from 'express';
9
+ import * as z from 'zod/mini';
8
10
  /**
9
11
  * The type of the path parameters for the address path.
10
12
  */
@@ -15,10 +17,17 @@ interface AddressPathParams {
15
17
  * The type of the request body for the address path.
16
18
  */
17
19
  type PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]];
18
- export declare const HttpBridgeExpressConfigSchema: "network.xyo.bridge.http.express.config" & {
20
+ export declare const HttpBridgeExpressConfigSchema: 'network.xyo.bridge.http.express.config' & {
19
21
  readonly __schema: true;
20
22
  };
21
23
  export type HttpBridgeExpressConfigSchema = typeof HttpBridgeExpressConfigSchema;
24
+ export declare const HttpBridgeExpressConfigZod: z.ZodMiniObject<Omit<(typeof HttpBridgeConfigZod)['shape'], 'schema'> & {
25
+ schema: z.ZodMiniLiteral<HttpBridgeExpressConfigSchema>;
26
+ }, z.core.$strip>;
27
+ export type HttpBridgeExpressConfigBase = z.infer<typeof HttpBridgeExpressConfigZod>;
28
+ export declare const isHttpBridgeExpressConfig: ReturnType<typeof zodIsFactory<HttpBridgeExpressConfigBase>>;
29
+ export declare const asHttpBridgeExpressConfig: ReturnType<typeof zodAsFactory<HttpBridgeExpressConfigBase>>;
30
+ export declare const toHttpBridgeExpressConfig: ReturnType<typeof zodToFactory<HttpBridgeExpressConfigBase>>;
22
31
  export interface HttpBridgeExpressConfig extends HttpBridgeConfig<{}, HttpBridgeExpressConfigSchema> {
23
32
  }
24
33
  export interface HttpBridgeExpressParams extends BridgeParams<AnyConfigSchema<HttpBridgeExpressConfig>> {
@@ -1 +1 @@
1
- {"version":3,"file":"HttpBridge.d.ts","sourceRoot":"","sources":["../../src/HttpBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAevC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EACV,mBAAmB,EAAE,YAAY,EAAE,qBAAqB,EACzD,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EACV,eAAe,EAAE,cAAc,EAAE,iBAAiB,EACnD,MAAM,2BAA2B,CAAA;AAGlC,OAAO,KAAK,EACV,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAC/C,MAAM,8BAA8B,CAAA;AAErC,OAAO,KAAK,EACV,WAAW,EAAE,OAAO,EAAE,QAAQ,EAC/B,MAAM,SAAS,CAAA;AAIhB;;GAEG;AACH,UAAU,iBAAiB;IACzB,OAAO,EAAE,UAAU,CAAA;CACpB;AAED;;GAEG;AACH,KAAK,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,CAAC,CAAA;AASxE,eAAO,MAAM,6BAA6B;;CAA2D,CAAA;AACrG,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,gBAGhB;IAEK,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBjF,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAYlG,cAAc,IAAI,UAAU,EAAE;IAIxB,YAAY;IAKZ,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM;IAK7B,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;cAkB/F,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;cAKtH,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,IAAI,WAAW;IAgCtC,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":"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"}
@@ -27,15 +27,23 @@ import {
27
27
  import {
28
28
  assertEx,
29
29
  exists,
30
- toSafeJsonString
30
+ toSafeJsonString,
31
+ zodAsFactory,
32
+ zodIsFactory,
33
+ zodToFactory
31
34
  } from "@xylabs/sdk-js";
32
- import { HttpBridge } from "@xyo-network/bridge-http";
35
+ import { HttpBridge, HttpBridgeConfigZod } from "@xyo-network/bridge-http";
33
36
  import { creatableModule } from "@xyo-network/module-model";
34
37
  import { resolveAddressToInstanceUp } from "@xyo-network/module-resolver";
35
38
  import { asSchema, isQueryBoundWitness } from "@xyo-network/sdk-protocol-js";
36
39
  import express from "express";
37
40
  import { StatusCodes } from "http-status-codes";
41
+ import * as z from "zod/mini";
38
42
  var HttpBridgeExpressConfigSchema = asSchema("network.xyo.bridge.http.express.config", true);
43
+ var HttpBridgeExpressConfigZod = z.extend(HttpBridgeConfigZod, { schema: z.literal(HttpBridgeExpressConfigSchema) });
44
+ var isHttpBridgeExpressConfig = zodIsFactory(HttpBridgeExpressConfigZod);
45
+ var asHttpBridgeExpressConfig = zodAsFactory(HttpBridgeExpressConfigZod, "asHttpBridgeExpressConfig");
46
+ var toHttpBridgeExpressConfig = zodToFactory(HttpBridgeExpressConfigZod, "toHttpBridgeExpressConfig");
39
47
  var HttpBridgeExpress = class extends HttpBridge {
40
48
  _app;
41
49
  _exposedModules = [];
@@ -188,6 +196,10 @@ HttpBridgeExpress = __decorateClass([
188
196
  ], HttpBridgeExpress);
189
197
  export {
190
198
  HttpBridgeExpress,
191
- HttpBridgeExpressConfigSchema
199
+ HttpBridgeExpressConfigSchema,
200
+ HttpBridgeExpressConfigZod,
201
+ asHttpBridgeExpressConfig,
202
+ isHttpBridgeExpressConfig,
203
+ toHttpBridgeExpressConfig
192
204
  };
193
205
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/HttpBridge.ts"],
4
- "sourcesContent": ["import type { Server } from 'node:http'\n\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/express'\nimport {\n assertEx,\n exists, toSafeJsonString,\n} from '@xylabs/sdk-js'\nimport type { HttpBridgeConfig } from '@xyo-network/bridge-http'\nimport { HttpBridge } from '@xyo-network/bridge-http'\nimport type {\n BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\n// import { standardResponses } from '@xyo-network/express-node-middleware'\nimport type {\n AnyConfigSchema, ModuleInstance, ModuleQueryResult,\n} from '@xyo-network/module-model'\nimport { creatableModule } from '@xyo-network/module-model'\nimport { resolveAddressToInstanceUp } from '@xyo-network/module-resolver'\nimport type {\n Payload, QueryBoundWitness, Schema, XyoAddress,\n} from '@xyo-network/sdk-protocol-js'\nimport { asSchema, isQueryBoundWitness } from '@xyo-network/sdk-protocol-js'\nimport type {\n Application, Request, Response,\n} from 'express'\nimport express from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\n/**\n * The type of the path parameters for the address path.\n */\ninterface AddressPathParams {\n address: XyoAddress\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 = asSchema('network.xyo.bridge.http.express.config', true)\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 this._app ??= this.initializeApp()\n return assertEx(this._app, () => 'App not initialized')\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions): 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}]: ${toSafeJsonString(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: XyoAddress, options?: BridgeExposeOptions): 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(): XyoAddress[] {\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) {\n await super.stopHandler()\n await this.stopHttpServer()\n }\n\n override async unexposeHandler(address: XyoAddress, options?: BridgeUnexposeOptions): 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: XyoAddress, 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(): Application {\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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Server } from 'node:http'\n\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/express'\nimport {\n assertEx,\n exists, toSafeJsonString,\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport type { HttpBridgeConfig } from '@xyo-network/bridge-http'\nimport { HttpBridge, HttpBridgeConfigZod } from '@xyo-network/bridge-http'\nimport type {\n BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\n// import { standardResponses } from '@xyo-network/express-node-middleware'\nimport type {\n AnyConfigSchema, ModuleInstance, ModuleQueryResult,\n} from '@xyo-network/module-model'\nimport { creatableModule } from '@xyo-network/module-model'\nimport { resolveAddressToInstanceUp } from '@xyo-network/module-resolver'\nimport type {\n Payload, QueryBoundWitness, Schema, XyoAddress,\n} from '@xyo-network/sdk-protocol-js'\nimport { asSchema, isQueryBoundWitness } from '@xyo-network/sdk-protocol-js'\nimport type {\n Application, Request, Response,\n} from 'express'\nimport express from 'express'\nimport { StatusCodes } from 'http-status-codes'\nimport * as z from 'zod/mini'\n\n/**\n * The type of the path parameters for the address path.\n */\ninterface AddressPathParams {\n address: XyoAddress\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' & {\n readonly __schema: true\n} = asSchema('network.xyo.bridge.http.express.config', true)\nexport type HttpBridgeExpressConfigSchema = typeof HttpBridgeExpressConfigSchema\n\nexport const HttpBridgeExpressConfigZod: z.ZodMiniObject<\n Omit<(typeof HttpBridgeConfigZod)['shape'], 'schema'> & { schema: z.ZodMiniLiteral<HttpBridgeExpressConfigSchema> },\n z.core.$strip\n> = z.extend(HttpBridgeConfigZod, { schema: z.literal(HttpBridgeExpressConfigSchema) })\n\nexport type HttpBridgeExpressConfigBase = z.infer<typeof HttpBridgeExpressConfigZod>\n\nexport const isHttpBridgeExpressConfig: ReturnType<typeof zodIsFactory<HttpBridgeExpressConfigBase>> = zodIsFactory(HttpBridgeExpressConfigZod)\nexport const asHttpBridgeExpressConfig: ReturnType<typeof zodAsFactory<HttpBridgeExpressConfigBase>>\n = zodAsFactory(HttpBridgeExpressConfigZod, 'asHttpBridgeExpressConfig')\nexport const toHttpBridgeExpressConfig: ReturnType<typeof zodToFactory<HttpBridgeExpressConfigBase>>\n = zodToFactory(HttpBridgeExpressConfigZod, 'toHttpBridgeExpressConfig')\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 this._app ??= this.initializeApp()\n return assertEx(this._app, () => 'App not initialized')\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions): 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}]: ${toSafeJsonString(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: XyoAddress, options?: BridgeExposeOptions): 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(): XyoAddress[] {\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) {\n await super.stopHandler()\n await this.stopHttpServer()\n }\n\n override async unexposeHandler(address: XyoAddress, options?: BridgeUnexposeOptions): 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: XyoAddress, 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(): Application {\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"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EAAQ;AAAA,EACR;AAAA,EAAc;AAAA,EAAc;AAAA,OACvB;AAEP,SAAS,YAAY,2BAA2B;AAQhD,SAAS,uBAAuB;AAChC,SAAS,kCAAkC;AAI3C,SAAS,UAAU,2BAA2B;AAI9C,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAC5B,YAAY,OAAO;AAqBZ,IAAM,gCAET,SAAS,0CAA0C,IAAI;AAGpD,IAAM,6BAGP,SAAO,qBAAqB,EAAE,QAAU,UAAQ,6BAA6B,EAAE,CAAC;AAI/E,IAAM,4BAA0F,aAAa,0BAA0B;AACvI,IAAM,4BACT,aAAa,4BAA4B,2BAA2B;AACjE,IAAM,4BACT,aAAa,4BAA4B,2BAA2B;AAOjE,IAAM,oBAAN,cAAyE,WAAoB;AAAA,EAExF;AAAA,EACA,kBAA6C,CAAC;AAAA,EAC9C;AAAA,EAEV,IAAc,MAAM;AAClB,SAAK,SAAS,KAAK,cAAc;AACjC,WAAO,SAAS,KAAK,MAAM,MAAM,qBAAqB;AAAA,EACxD;AAAA,EAEA,MAAM,YAAY,KAAqB,SAA0D;AAC/F,UAAM,EAAE,WAAW,EAAE,IAAI,WAAW,CAAC;AACrC,aAAS,KAAK,OAAO,MAAM,MAAM,0BAA0B;AAC3D,SAAK,gBAAgB,KAAK,IAAI,QAAQ,GAAG,CAAC;AAC1C,UAAM,WAAW,WAAW,IAAM,MAAM,IAAI,iBAAiB,KAAM,CAAC,IAAK,CAAC;AAC1E,SAAK,QAAQ,IAAI,qBAAqB,IAAI,EAAE,KAAK,IAAI,OAAO,MAAM,iBAAiB,SAAS,IAAI,WAAS,MAAM,EAAE,CAAC,CAAC,EAAE;AACrH,UAAM,mBAAmB,MAAM,QAAQ,IAAI,SAAS,IAAI,WAAS,KAAK,YAAY,OAAO,EAAE,UAAU,WAAW,GAAG,UAAU,MAAM,CAAC,CAAC,CAAC,GACnI,KAAK,EACL,OAAO,MAAM;AAChB,UAAM,aAAa,CAAC,KAAK,GAAG,eAAe;AAE3C,eAAW,cAAc,WAAY,MAAK,QAAQ,IAAI,YAAY,WAAW,OAAO,KAAK,IAAI,EAAE,GAAG;AAElG,WAAO;AAAA,EACT;AAAA,EAEA,MAAe,cAAc,SAAqB,SAA0D;AAC1G,UAAM,EAAE,WAAW,KAAK,IAAI,WAAW,CAAC;AACxC,UAAM,MAAM,MAAM,2BAA2B,MAAM,OAAO;AAC1D,QAAI,YAAY,CAAC,KAAK;AACpB,YAAM,IAAI,MAAM,mCAAmC,OAAO,EAAE;AAAA,IAC9D;AACA,QAAI,KAAK;AACP,aAAO,KAAK,YAAY,KAAK,OAAO;AAAA,IACtC;AACA,WAAO,CAAC;AAAA,EACV;AAAA,EAES,iBAA+B;AACtC,WAAO,KAAK,gBAAgB,IAAI,SAAO,IAAI,MAAM,GAAG,OAAO,EAAE,OAAO,MAAM;AAAA,EAC5E;AAAA,EAEA,MAAe,eAAe;AAC5B,UAAM,MAAM,aAAa;AACzB,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AAAA,EAEA,MAAe,YAAY,UAAmB;AAC5C,UAAM,MAAM,YAAY;AACxB,UAAM,KAAK,eAAe;AAAA,EAC5B;AAAA,EAEA,MAAe,gBAAgB,SAAqB,SAA4D;AAC9G,UAAM,EAAE,WAAW,GAAG,WAAW,KAAK,IAAI,WAAW,CAAC;AACtD,aAAS,KAAK,OAAO,MAAM,MAAM,0BAA0B;AAC3D,UAAM,MAAM,KAAK,gBAAgB,KAAK,SAAO,IAAI,MAAM,GAAG,YAAY,OAAO,GAAG,MAAM;AACtF,aAAS,CAAC,YAAY,KAAK,MAAM,uBAAuB,OAAO,EAAE;AACjE,SAAK,kBAAkB,KAAK,gBAAgB,OAAO,SAAO,IAAI,MAAM,GAAG,YAAY,OAAO;AAC1F,QAAI,KAAK;AACP,YAAM,WAAW,WAAW,IAAM,MAAM,IAAI,iBAAiB,KAAM,CAAC,IAAK,CAAC;AAC1E,YAAM,mBACJ,MAAM,QAAQ,IAAI,SAAS,IAAI,WAAS,KAAK,gBAAgB,MAAM,SAAS,EAAE,UAAU,WAAW,GAAG,UAAU,MAAM,CAAC,CAAC,CAAC,GAExH,KAAK,EACL,OAAO,MAAM;AAChB,aAAO,CAAC,KAAK,GAAG,eAAe;AAAA,IACjC;AACA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAgB,gBAAgB,SAAqB,OAA0B,UAAwD;AACrI,UAAM,MAAM,KAAK,gBAAgB,KAAK,SAAO,IAAI,MAAM,GAAG,YAAY,OAAO,GAAG,MAAM;AACtF,WAAO,MAAM,MAAM,IAAI,MAAM,OAAO,QAAQ,IAAI;AAAA,EAClD;AAAA,EAEA,MAAgB,UAAU,KAA4E,KAAe;AACnH,UAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,QAAI;AACF,UAAI,WAAW,KAAK,SAAS;AAC3B,YAAI,KAAK,MAAM,KAAK,WAAW,KAAK,OAAO,CAAC;AAAA,MAC9C,OAAO;AACL,cAAM,MAAM,KAAK,gBAAgB,KAAK,SAAO,IAAI,MAAM,GAAG,YAAY,OAAO,GAAG,MAAM;AAEtF,YAAI,KAAK;AACP,cAAI,KAAK,MAAM,IAAI,WAAW,KAAK,OAAO,CAAC;AAAA,QAC7C,OAAO;AACL,cAAI,OAAO,YAAY,SAAS,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAAA,QACtE;AAAA,MACF;AAAA,IACF,SAAS,IAAI;AAEX,UAAI,OAAO,YAAY,qBAAqB,EAAE,KAAK,EAAE,OAAQ,GAAa,QAAQ,CAAC;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,MAAgB,WAAW,KAA4E,KAAe;AACpH,UAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,UAAM,CAAC,IAAI,WAAW,CAAC,CAAC,IAAI,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC;AAClE,UAAM,QAAQ,oBAAoB,EAAE,IAAI,KAAK;AAC7C,QAAI,CAAC,OAAO;AAEV,UAAI,OAAO,YAAY,WAAW,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACvE;AAAA,IACF;AACA,QAAI;AACF,UAAI,WAAW,KAAK,SAAS;AAC3B,cAAM,SAAS,MAAM,KAAK,MAAM,OAAO,QAAQ;AAC/C,eAAO,IAAI,KAAK,MAAM;AAAA,MACxB,OAAO;AACL,cAAM,SAAS,MAAM,KAAK,gBAAgB,SAAS,OAAO,QAAQ;AAElE,YAAI,WAAW,MAAM;AACnB,cAAI,OAAO,YAAY,SAAS,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAAA,QACtE,OAAO;AACL,cAAI,KAAK,MAAM;AAAA,QACjB;AAAA,MACF;AAAA,IACF,SAAS,IAAI;AAEX,UAAI,OAAO,YAAY,qBAAqB,EAAE,KAAK,EAAE,OAAQ,GAAa,QAAQ,CAAC;AAAA,IACrF;AAAA,EACF;AAAA,EAEU,gBAA6B;AAErC,UAAM,MAAM,QAAQ;AAGpB,QAAI,IAAI,gBAAgB;AACxB,QAAI,IAAI,cAAc;AAGtB,yCAAqC,GAAG;AACxC,QAAI,IAAI,qBAAqB;AAC7B,gCAA4B,GAAG;AAC/B,uBAAmB,GAAG;AAItB,QAAI,IAAI,KAAK,CAAC,MAAM,QAAQ,IAAI,SAAS,YAAY,mBAAmB,IAAI,KAAK,OAAO,EAAE,CAAC;AAC3F,QAAI,KAAK,KAAK,CAAC,MAAM,QAAQ,IAAI,SAAS,YAAY,oBAAoB,IAAI,KAAK,OAAO,EAAE,CAAC;AAE7F,QAAI;AAAA,MACF;AAAA,MAEA,aAAa,OAAO,KAAK,QAAQ,MAAM,KAAK,UAAU,KAAK,GAAG,CAAC;AAAA,IACjE;AACA,QAAI;AAAA,MACF;AAAA,MAEA,aAAa,OAAO,KAAK,QAAQ;AAAE,cAAM,KAAK,WAAW,KAAK,GAAG;AAAA,MAAE,CAAC;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AAAA,EAEU,kBAAoC;AAC5C,QAAI,KAAK,OAAO,MAAM;AACpB,eAAS,CAAC,KAAK,SAAS,MAAM,wBAAwB;AACtD,WAAK,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,MAAM,QAAQ,IAAI;AAAA,IAC/D;AACA,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC7B;AAAA,EAEU,iBAAmC;AAC3C,QAAI,KAAK,OAAO,MAAM;AACpB,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAI,KAAK,SAAS;AAChB,eAAK,QAAQ,MAAM,CAAC,QAAQ;AAC1B,gBAAI,KAAK;AACP,qBAAO,GAAG;AAAA,YACZ,OAAO;AACL,mBAAK,UAAU;AACf,sBAAQ,IAAI;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC7B;AACF;AApLE,cADW,mBACc,iBAA0B,CAAC,GAAG,iDAAM,kBAAe,6BAA6B;AAD9F,oBAAN;AAAA,EADN,gBAAgB;AAAA,GACJ;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/bridge-http-express",
3
- "version": "6.0.4",
3
+ "version": "7.0.0",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -33,37 +33,35 @@
33
33
  "package.json"
34
34
  ],
35
35
  "dependencies": {
36
- "@xyo-network/bridge-http": "~6.0.4",
37
- "@xyo-network/bridge-model": "~6.0.4",
38
- "@xyo-network/module-resolver": "~6.0.4",
39
- "@xyo-network/module-model": "~6.0.4"
36
+ "@xyo-network/module-resolver": "~7.0.0",
37
+ "@xyo-network/bridge-model": "~7.0.0",
38
+ "@xyo-network/module-model": "~7.0.0",
39
+ "@xyo-network/bridge-http": "~7.0.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@bitauth/libauth": "~3.0.0",
43
43
  "@metamask/providers": "^22.1.1",
44
44
  "@noble/post-quantum": "~0.6.1",
45
45
  "@opentelemetry/api": "^1.9.1",
46
- "@opentelemetry/sdk-trace-base": "^2.7.1",
46
+ "@opentelemetry/sdk-trace-base": "^2.8.0",
47
47
  "@scure/base": "~2.2.0",
48
48
  "@scure/bip39": "~2.2.0",
49
49
  "@types/express": "^5.0.6",
50
- "@types/node": "^25.9.1",
51
- "@xylabs/express": "^6.0.8",
52
- "@xylabs/geo": "^6.0.8",
53
- "@xylabs/sdk-js": "^6.0.8",
54
- "@xylabs/threads": "^6.0.8",
55
- "@xylabs/toolchain": "~8.1.16",
56
- "@xylabs/tsconfig": "~8.1.16",
57
- "@xylabs/vitest-extended": "~6.0.8",
58
- "@xyo-network/sdk-protocol-js": "~6.0.9",
50
+ "@types/node": "^25.9.3",
51
+ "@xylabs/express": "^6.1.1",
52
+ "@xylabs/geo": "^6.1.1",
53
+ "@xylabs/sdk-js": "^6.1.1",
54
+ "@xylabs/threads": "^6.1.1",
55
+ "@xylabs/toolchain": "^8.1.20",
56
+ "@xylabs/tsconfig": "^8.1.20",
57
+ "@xylabs/vitest-extended": "^6.1.1",
58
+ "@xyo-network/sdk-protocol-js": "~7.0",
59
59
  "ajv": "^8.20.0",
60
60
  "async-mutex": "^0.5.0",
61
- "bn.js": "^5.2.3",
62
61
  "body-parser": "^2.2.2",
63
- "buffer": "^6.0.3",
64
62
  "connect": "^3.7.0",
65
63
  "debug": "~4.4.3",
66
- "eslint": "^10.4.1",
64
+ "eslint": "^10.5.0",
67
65
  "ethers": "^6.16.0",
68
66
  "express": "^5.2.1",
69
67
  "get-port-please": "~3.2.0",
@@ -81,12 +79,12 @@
81
79
  "winston": "^3.19.0",
82
80
  "winston-transport": "^4.9.0",
83
81
  "zod": "^4.4.3",
84
- "@xyo-network/archivist-model": "~6.0.4",
85
- "@xyo-network/bridge-pub-sub": "~6.0.4",
86
- "@xyo-network/bridge-abstract": "~6.0.4",
87
- "@xyo-network/diviner-model": "~6.0.4",
88
- "@xyo-network/node-memory": "~6.0.4",
89
- "@xyo-network/node-model": "~6.0.4"
82
+ "@xyo-network/bridge-pub-sub": "~7.0.0",
83
+ "@xyo-network/bridge-abstract": "~7.0.0",
84
+ "@xyo-network/node-memory": "~7.0.0",
85
+ "@xyo-network/node-model": "~7.0.0",
86
+ "@xyo-network/archivist-model": "~7.0.0",
87
+ "@xyo-network/diviner-model": "~7.0.0"
90
88
  },
91
89
  "peerDependencies": {
92
90
  "@bitauth/libauth": "~3.0",
@@ -100,12 +98,10 @@
100
98
  "@xylabs/geo": "^6.0",
101
99
  "@xylabs/sdk-js": "^6.0",
102
100
  "@xylabs/threads": "^6.0",
103
- "@xyo-network/sdk-protocol-js": "~6.0",
101
+ "@xyo-network/sdk-protocol-js": "^7.0",
104
102
  "ajv": "^8.20",
105
103
  "async-mutex": "^0.5",
106
- "bn.js": "^5.2",
107
104
  "body-parser": "^2.2",
108
- "buffer": "^6.0",
109
105
  "connect": "^3.7",
110
106
  "debug": "~4.4",
111
107
  "ethers": "^6.16",
@@ -1,46 +0,0 @@
1
- import type { Server } from 'node:http';
2
- import type { HttpBridgeConfig } from '@xyo-network/bridge-http';
3
- import { HttpBridge } from '@xyo-network/bridge-http';
4
- import type { BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model';
5
- import type { AnyConfigSchema, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model';
6
- import type { Payload, QueryBoundWitness, Schema, XyoAddress } from '@xyo-network/sdk-protocol-js';
7
- import type { Application, Request, Response } from 'express';
8
- /**
9
- * The type of the path parameters for the address path.
10
- */
11
- interface AddressPathParams {
12
- address: XyoAddress;
13
- }
14
- /**
15
- * The type of the request body for the address path.
16
- */
17
- type PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]];
18
- export declare const HttpBridgeExpressConfigSchema: "network.xyo.bridge.http.express.config" & {
19
- readonly __schema: true;
20
- };
21
- export type HttpBridgeExpressConfigSchema = typeof HttpBridgeExpressConfigSchema;
22
- export interface HttpBridgeExpressConfig extends HttpBridgeConfig<{}, HttpBridgeExpressConfigSchema> {
23
- }
24
- export interface HttpBridgeExpressParams extends BridgeParams<AnyConfigSchema<HttpBridgeExpressConfig>> {
25
- }
26
- export declare class HttpBridgeExpress<TParams extends HttpBridgeExpressParams> extends HttpBridge<TParams> {
27
- static readonly configSchemas: Schema[];
28
- protected _app?: Application;
29
- protected _exposedModules: WeakRef<ModuleInstance>[];
30
- protected _server?: Server;
31
- protected get app(): Application;
32
- exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions): Promise<ModuleInstance[]>;
33
- exposeHandler(address: XyoAddress, options?: BridgeExposeOptions): Promise<ModuleInstance[]>;
34
- exposedHandler(): XyoAddress[];
35
- startHandler(): Promise<void>;
36
- stopHandler(_timeout?: number): Promise<void>;
37
- unexposeHandler(address: XyoAddress, options?: BridgeUnexposeOptions): Promise<ModuleInstance[]>;
38
- protected callLocalModule(address: XyoAddress, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null>;
39
- protected handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<void>;
40
- protected handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<Response<any, Record<string, any>> | undefined>;
41
- protected initializeApp(): Application;
42
- protected startHttpServer(): Promise<boolean>;
43
- protected stopHttpServer(): Promise<boolean>;
44
- }
45
- export {};
46
- //# sourceMappingURL=HttpBridge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HttpBridge.d.ts","sourceRoot":"","sources":["../../src/HttpBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAevC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EACV,mBAAmB,EAAE,YAAY,EAAE,qBAAqB,EACzD,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EACV,eAAe,EAAE,cAAc,EAAE,iBAAiB,EACnD,MAAM,2BAA2B,CAAA;AAGlC,OAAO,KAAK,EACV,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAC/C,MAAM,8BAA8B,CAAA;AAErC,OAAO,KAAK,EACV,WAAW,EAAE,OAAO,EAAE,QAAQ,EAC/B,MAAM,SAAS,CAAA;AAIhB;;GAEG;AACH,UAAU,iBAAiB;IACzB,OAAO,EAAE,UAAU,CAAA;CACpB;AAED;;GAEG;AACH,KAAK,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,CAAC,CAAA;AASxE,eAAO,MAAM,6BAA6B;;CAA2D,CAAA;AACrG,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,gBAGhB;IAEK,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBjF,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAYlG,cAAc,IAAI,UAAU,EAAE;IAIxB,YAAY;IAKZ,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM;IAK7B,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;cAkB/F,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;cAKtH,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,IAAI,WAAW;IAgCtC,SAAS,CAAC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ7C,SAAS,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAiB7C"}
@@ -1,2 +0,0 @@
1
- export * from './HttpBridge.ts';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
@@ -1,193 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getProtoOf = Object.getPrototypeOf;
4
- var __reflectGet = Reflect.get;
5
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
- var __decorateClass = (decorators, target, key, kind) => {
7
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
8
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
9
- if (decorator = decorators[i])
10
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
11
- if (kind && result) __defProp(target, key, result);
12
- return result;
13
- };
14
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
15
- var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
16
-
17
- // src/HttpBridge.ts
18
- import {
19
- asyncHandler,
20
- customPoweredByHeader,
21
- disableCaseSensitiveRouting,
22
- disableExpressDefaultPoweredByHeader,
23
- jsonBodyParser,
24
- responseProfiler,
25
- useRequestCounters
26
- } from "@xylabs/express";
27
- import {
28
- assertEx,
29
- exists,
30
- toSafeJsonString
31
- } from "@xylabs/sdk-js";
32
- import { HttpBridge } from "@xyo-network/bridge-http";
33
- import { creatableModule } from "@xyo-network/module-model";
34
- import { resolveAddressToInstanceUp } from "@xyo-network/module-resolver";
35
- import { asSchema, isQueryBoundWitness } from "@xyo-network/sdk-protocol-js";
36
- import express from "express";
37
- import { StatusCodes } from "http-status-codes";
38
- var HttpBridgeExpressConfigSchema = asSchema("network.xyo.bridge.http.express.config", true);
39
- var HttpBridgeExpress = class extends HttpBridge {
40
- _app;
41
- _exposedModules = [];
42
- _server;
43
- get app() {
44
- this._app ??= this.initializeApp();
45
- return assertEx(this._app, () => "App not initialized");
46
- }
47
- async exposeChild(mod, options) {
48
- const { maxDepth = 5 } = options ?? {};
49
- assertEx(this.config.host, () => "Not configured as a host");
50
- this._exposedModules.push(new WeakRef(mod));
51
- const children = maxDepth > 0 ? await mod.publicChildren?.() ?? [] : [];
52
- this.logger?.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toSafeJsonString(children.map((child) => child.id))}`);
53
- const exposedChildren = (await Promise.all(children.map((child) => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false })))).flat().filter(exists);
54
- const allExposed = [mod, ...exposedChildren];
55
- for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`);
56
- return allExposed;
57
- }
58
- async exposeHandler(address, options) {
59
- const { required = true } = options ?? {};
60
- const mod = await resolveAddressToInstanceUp(this, address);
61
- if (required && !mod) {
62
- throw new Error(`Unable to find required module: ${address}`);
63
- }
64
- if (mod) {
65
- return this.exposeChild(mod, options);
66
- }
67
- return [];
68
- }
69
- exposedHandler() {
70
- return this._exposedModules.map((ref) => ref.deref()?.address).filter(exists);
71
- }
72
- async startHandler() {
73
- await super.startHandler();
74
- await this.startHttpServer();
75
- }
76
- async stopHandler(_timeout) {
77
- await super.stopHandler();
78
- await this.stopHttpServer();
79
- }
80
- async unexposeHandler(address, options) {
81
- const { maxDepth = 2, required = true } = options ?? {};
82
- assertEx(this.config.host, () => "Not configured as a host");
83
- const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref();
84
- assertEx(!required || mod, () => `Module not exposed: ${address}`);
85
- this._exposedModules = this._exposedModules.filter((ref) => ref.deref()?.address !== address);
86
- if (mod) {
87
- const children = maxDepth > 0 ? await mod.publicChildren?.() ?? [] : [];
88
- const exposedChildren = (await Promise.all(children.map((child) => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))).flat().filter(exists);
89
- return [mod, ...exposedChildren];
90
- }
91
- return [];
92
- }
93
- async callLocalModule(address, query, payloads) {
94
- const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref();
95
- return mod ? await mod.query(query, payloads) : null;
96
- }
97
- async handleGet(req, res) {
98
- const { address } = req.params;
99
- try {
100
- if (address == this.address) {
101
- res.json(await this.stateQuery(this.account));
102
- } else {
103
- const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref();
104
- if (mod) {
105
- res.json(await mod.stateQuery(this.account));
106
- } else {
107
- res.status(StatusCodes.NOT_FOUND).json({ error: "Module not found" });
108
- }
109
- }
110
- } catch (ex) {
111
- res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: ex.message });
112
- }
113
- }
114
- async handlePost(req, res) {
115
- const { address } = req.params;
116
- const [bw, payloads = []] = Array.isArray(req.body) ? req.body : [];
117
- const query = isQueryBoundWitness(bw) ? bw : void 0;
118
- if (!query) {
119
- res.status(StatusCodes.BAD_REQUEST).json({ error: "No query provided" });
120
- return;
121
- }
122
- try {
123
- if (address == this.address) {
124
- const result = await this.query(query, payloads);
125
- return res.json(result);
126
- } else {
127
- const result = await this.callLocalModule(address, query, payloads);
128
- if (result === null) {
129
- res.status(StatusCodes.NOT_FOUND).json({ error: "Module not found" });
130
- } else {
131
- res.json(result);
132
- }
133
- }
134
- } catch (ex) {
135
- res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: ex.message });
136
- }
137
- }
138
- initializeApp() {
139
- const app = express();
140
- app.use(responseProfiler);
141
- app.use(jsonBodyParser);
142
- disableExpressDefaultPoweredByHeader(app);
143
- app.use(customPoweredByHeader);
144
- disableCaseSensitiveRouting(app);
145
- useRequestCounters(app);
146
- app.get("/", (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${this.address}`));
147
- app.post("/", (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`));
148
- app.get(
149
- "/:address",
150
- asyncHandler(async (req, res) => await this.handleGet(req, res))
151
- );
152
- app.post(
153
- "/:address",
154
- asyncHandler(async (req, res) => {
155
- await this.handlePost(req, res);
156
- })
157
- );
158
- return app;
159
- }
160
- startHttpServer() {
161
- if (this.config.host) {
162
- assertEx(!this._server, () => "Server already started");
163
- this._server = this.app.listen(this.config.host?.port ?? 3030);
164
- }
165
- return Promise.resolve(true);
166
- }
167
- stopHttpServer() {
168
- if (this.config.host) {
169
- return new Promise((resolve, reject) => {
170
- if (this._server) {
171
- this._server.close((err) => {
172
- if (err) {
173
- reject(err);
174
- } else {
175
- this._server = void 0;
176
- resolve(true);
177
- }
178
- });
179
- }
180
- });
181
- }
182
- return Promise.resolve(true);
183
- }
184
- };
185
- __publicField(HttpBridgeExpress, "configSchemas", [...__superGet(HttpBridgeExpress, HttpBridgeExpress, "configSchemas"), HttpBridgeExpressConfigSchema]);
186
- HttpBridgeExpress = __decorateClass([
187
- creatableModule()
188
- ], HttpBridgeExpress);
189
- export {
190
- HttpBridgeExpress,
191
- HttpBridgeExpressConfigSchema
192
- };
193
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/HttpBridge.ts"],
4
- "sourcesContent": ["import type { Server } from 'node:http'\n\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/express'\nimport {\n assertEx,\n exists, toSafeJsonString,\n} from '@xylabs/sdk-js'\nimport type { HttpBridgeConfig } from '@xyo-network/bridge-http'\nimport { HttpBridge } from '@xyo-network/bridge-http'\nimport type {\n BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\n// import { standardResponses } from '@xyo-network/express-node-middleware'\nimport type {\n AnyConfigSchema, ModuleInstance, ModuleQueryResult,\n} from '@xyo-network/module-model'\nimport { creatableModule } from '@xyo-network/module-model'\nimport { resolveAddressToInstanceUp } from '@xyo-network/module-resolver'\nimport type {\n Payload, QueryBoundWitness, Schema, XyoAddress,\n} from '@xyo-network/sdk-protocol-js'\nimport { asSchema, isQueryBoundWitness } from '@xyo-network/sdk-protocol-js'\nimport type {\n Application, Request, Response,\n} from 'express'\nimport express from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\n/**\n * The type of the path parameters for the address path.\n */\ninterface AddressPathParams {\n address: XyoAddress\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 = asSchema('network.xyo.bridge.http.express.config', true)\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 this._app ??= this.initializeApp()\n return assertEx(this._app, () => 'App not initialized')\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions): 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}]: ${toSafeJsonString(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: XyoAddress, options?: BridgeExposeOptions): 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(): XyoAddress[] {\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) {\n await super.stopHandler()\n await this.stopHttpServer()\n }\n\n override async unexposeHandler(address: XyoAddress, options?: BridgeUnexposeOptions): 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: XyoAddress, 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(): Application {\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"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,46 +0,0 @@
1
- import type { Server } from 'node:http';
2
- import type { HttpBridgeConfig } from '@xyo-network/bridge-http';
3
- import { HttpBridge } from '@xyo-network/bridge-http';
4
- import type { BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model';
5
- import type { AnyConfigSchema, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model';
6
- import type { Payload, QueryBoundWitness, Schema, XyoAddress } from '@xyo-network/sdk-protocol-js';
7
- import type { Application, Request, Response } from 'express';
8
- /**
9
- * The type of the path parameters for the address path.
10
- */
11
- interface AddressPathParams {
12
- address: XyoAddress;
13
- }
14
- /**
15
- * The type of the request body for the address path.
16
- */
17
- type PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]];
18
- export declare const HttpBridgeExpressConfigSchema: "network.xyo.bridge.http.express.config" & {
19
- readonly __schema: true;
20
- };
21
- export type HttpBridgeExpressConfigSchema = typeof HttpBridgeExpressConfigSchema;
22
- export interface HttpBridgeExpressConfig extends HttpBridgeConfig<{}, HttpBridgeExpressConfigSchema> {
23
- }
24
- export interface HttpBridgeExpressParams extends BridgeParams<AnyConfigSchema<HttpBridgeExpressConfig>> {
25
- }
26
- export declare class HttpBridgeExpress<TParams extends HttpBridgeExpressParams> extends HttpBridge<TParams> {
27
- static readonly configSchemas: Schema[];
28
- protected _app?: Application;
29
- protected _exposedModules: WeakRef<ModuleInstance>[];
30
- protected _server?: Server;
31
- protected get app(): Application;
32
- exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions): Promise<ModuleInstance[]>;
33
- exposeHandler(address: XyoAddress, options?: BridgeExposeOptions): Promise<ModuleInstance[]>;
34
- exposedHandler(): XyoAddress[];
35
- startHandler(): Promise<void>;
36
- stopHandler(_timeout?: number): Promise<void>;
37
- unexposeHandler(address: XyoAddress, options?: BridgeUnexposeOptions): Promise<ModuleInstance[]>;
38
- protected callLocalModule(address: XyoAddress, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null>;
39
- protected handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<void>;
40
- protected handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<Response<any, Record<string, any>> | undefined>;
41
- protected initializeApp(): Application;
42
- protected startHttpServer(): Promise<boolean>;
43
- protected stopHttpServer(): Promise<boolean>;
44
- }
45
- export {};
46
- //# sourceMappingURL=HttpBridge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HttpBridge.d.ts","sourceRoot":"","sources":["../../src/HttpBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAevC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EACV,mBAAmB,EAAE,YAAY,EAAE,qBAAqB,EACzD,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EACV,eAAe,EAAE,cAAc,EAAE,iBAAiB,EACnD,MAAM,2BAA2B,CAAA;AAGlC,OAAO,KAAK,EACV,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAC/C,MAAM,8BAA8B,CAAA;AAErC,OAAO,KAAK,EACV,WAAW,EAAE,OAAO,EAAE,QAAQ,EAC/B,MAAM,SAAS,CAAA;AAIhB;;GAEG;AACH,UAAU,iBAAiB;IACzB,OAAO,EAAE,UAAU,CAAA;CACpB;AAED;;GAEG;AACH,KAAK,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,CAAC,CAAA;AASxE,eAAO,MAAM,6BAA6B;;CAA2D,CAAA;AACrG,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,gBAGhB;IAEK,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBjF,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAYlG,cAAc,IAAI,UAAU,EAAE;IAIxB,YAAY;IAKZ,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM;IAK7B,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;cAkB/F,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;cAKtH,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,IAAI,WAAW;IAgCtC,SAAS,CAAC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ7C,SAAS,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAiB7C"}
@@ -1,2 +0,0 @@
1
- export * from './HttpBridge.ts';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
@@ -1,193 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getProtoOf = Object.getPrototypeOf;
4
- var __reflectGet = Reflect.get;
5
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
- var __decorateClass = (decorators, target, key, kind) => {
7
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
8
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
9
- if (decorator = decorators[i])
10
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
11
- if (kind && result) __defProp(target, key, result);
12
- return result;
13
- };
14
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
15
- var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
16
-
17
- // src/HttpBridge.ts
18
- import {
19
- asyncHandler,
20
- customPoweredByHeader,
21
- disableCaseSensitiveRouting,
22
- disableExpressDefaultPoweredByHeader,
23
- jsonBodyParser,
24
- responseProfiler,
25
- useRequestCounters
26
- } from "@xylabs/express";
27
- import {
28
- assertEx,
29
- exists,
30
- toSafeJsonString
31
- } from "@xylabs/sdk-js";
32
- import { HttpBridge } from "@xyo-network/bridge-http";
33
- import { creatableModule } from "@xyo-network/module-model";
34
- import { resolveAddressToInstanceUp } from "@xyo-network/module-resolver";
35
- import { asSchema, isQueryBoundWitness } from "@xyo-network/sdk-protocol-js";
36
- import express from "express";
37
- import { StatusCodes } from "http-status-codes";
38
- var HttpBridgeExpressConfigSchema = asSchema("network.xyo.bridge.http.express.config", true);
39
- var HttpBridgeExpress = class extends HttpBridge {
40
- _app;
41
- _exposedModules = [];
42
- _server;
43
- get app() {
44
- this._app ??= this.initializeApp();
45
- return assertEx(this._app, () => "App not initialized");
46
- }
47
- async exposeChild(mod, options) {
48
- const { maxDepth = 5 } = options ?? {};
49
- assertEx(this.config.host, () => "Not configured as a host");
50
- this._exposedModules.push(new WeakRef(mod));
51
- const children = maxDepth > 0 ? await mod.publicChildren?.() ?? [] : [];
52
- this.logger?.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toSafeJsonString(children.map((child) => child.id))}`);
53
- const exposedChildren = (await Promise.all(children.map((child) => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false })))).flat().filter(exists);
54
- const allExposed = [mod, ...exposedChildren];
55
- for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`);
56
- return allExposed;
57
- }
58
- async exposeHandler(address, options) {
59
- const { required = true } = options ?? {};
60
- const mod = await resolveAddressToInstanceUp(this, address);
61
- if (required && !mod) {
62
- throw new Error(`Unable to find required module: ${address}`);
63
- }
64
- if (mod) {
65
- return this.exposeChild(mod, options);
66
- }
67
- return [];
68
- }
69
- exposedHandler() {
70
- return this._exposedModules.map((ref) => ref.deref()?.address).filter(exists);
71
- }
72
- async startHandler() {
73
- await super.startHandler();
74
- await this.startHttpServer();
75
- }
76
- async stopHandler(_timeout) {
77
- await super.stopHandler();
78
- await this.stopHttpServer();
79
- }
80
- async unexposeHandler(address, options) {
81
- const { maxDepth = 2, required = true } = options ?? {};
82
- assertEx(this.config.host, () => "Not configured as a host");
83
- const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref();
84
- assertEx(!required || mod, () => `Module not exposed: ${address}`);
85
- this._exposedModules = this._exposedModules.filter((ref) => ref.deref()?.address !== address);
86
- if (mod) {
87
- const children = maxDepth > 0 ? await mod.publicChildren?.() ?? [] : [];
88
- const exposedChildren = (await Promise.all(children.map((child) => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))).flat().filter(exists);
89
- return [mod, ...exposedChildren];
90
- }
91
- return [];
92
- }
93
- async callLocalModule(address, query, payloads) {
94
- const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref();
95
- return mod ? await mod.query(query, payloads) : null;
96
- }
97
- async handleGet(req, res) {
98
- const { address } = req.params;
99
- try {
100
- if (address == this.address) {
101
- res.json(await this.stateQuery(this.account));
102
- } else {
103
- const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref();
104
- if (mod) {
105
- res.json(await mod.stateQuery(this.account));
106
- } else {
107
- res.status(StatusCodes.NOT_FOUND).json({ error: "Module not found" });
108
- }
109
- }
110
- } catch (ex) {
111
- res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: ex.message });
112
- }
113
- }
114
- async handlePost(req, res) {
115
- const { address } = req.params;
116
- const [bw, payloads = []] = Array.isArray(req.body) ? req.body : [];
117
- const query = isQueryBoundWitness(bw) ? bw : void 0;
118
- if (!query) {
119
- res.status(StatusCodes.BAD_REQUEST).json({ error: "No query provided" });
120
- return;
121
- }
122
- try {
123
- if (address == this.address) {
124
- const result = await this.query(query, payloads);
125
- return res.json(result);
126
- } else {
127
- const result = await this.callLocalModule(address, query, payloads);
128
- if (result === null) {
129
- res.status(StatusCodes.NOT_FOUND).json({ error: "Module not found" });
130
- } else {
131
- res.json(result);
132
- }
133
- }
134
- } catch (ex) {
135
- res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: ex.message });
136
- }
137
- }
138
- initializeApp() {
139
- const app = express();
140
- app.use(responseProfiler);
141
- app.use(jsonBodyParser);
142
- disableExpressDefaultPoweredByHeader(app);
143
- app.use(customPoweredByHeader);
144
- disableCaseSensitiveRouting(app);
145
- useRequestCounters(app);
146
- app.get("/", (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${this.address}`));
147
- app.post("/", (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`));
148
- app.get(
149
- "/:address",
150
- asyncHandler(async (req, res) => await this.handleGet(req, res))
151
- );
152
- app.post(
153
- "/:address",
154
- asyncHandler(async (req, res) => {
155
- await this.handlePost(req, res);
156
- })
157
- );
158
- return app;
159
- }
160
- startHttpServer() {
161
- if (this.config.host) {
162
- assertEx(!this._server, () => "Server already started");
163
- this._server = this.app.listen(this.config.host?.port ?? 3030);
164
- }
165
- return Promise.resolve(true);
166
- }
167
- stopHttpServer() {
168
- if (this.config.host) {
169
- return new Promise((resolve, reject) => {
170
- if (this._server) {
171
- this._server.close((err) => {
172
- if (err) {
173
- reject(err);
174
- } else {
175
- this._server = void 0;
176
- resolve(true);
177
- }
178
- });
179
- }
180
- });
181
- }
182
- return Promise.resolve(true);
183
- }
184
- };
185
- __publicField(HttpBridgeExpress, "configSchemas", [...__superGet(HttpBridgeExpress, HttpBridgeExpress, "configSchemas"), HttpBridgeExpressConfigSchema]);
186
- HttpBridgeExpress = __decorateClass([
187
- creatableModule()
188
- ], HttpBridgeExpress);
189
- export {
190
- HttpBridgeExpress,
191
- HttpBridgeExpressConfigSchema
192
- };
193
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/HttpBridge.ts"],
4
- "sourcesContent": ["import type { Server } from 'node:http'\n\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/express'\nimport {\n assertEx,\n exists, toSafeJsonString,\n} from '@xylabs/sdk-js'\nimport type { HttpBridgeConfig } from '@xyo-network/bridge-http'\nimport { HttpBridge } from '@xyo-network/bridge-http'\nimport type {\n BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\n// import { standardResponses } from '@xyo-network/express-node-middleware'\nimport type {\n AnyConfigSchema, ModuleInstance, ModuleQueryResult,\n} from '@xyo-network/module-model'\nimport { creatableModule } from '@xyo-network/module-model'\nimport { resolveAddressToInstanceUp } from '@xyo-network/module-resolver'\nimport type {\n Payload, QueryBoundWitness, Schema, XyoAddress,\n} from '@xyo-network/sdk-protocol-js'\nimport { asSchema, isQueryBoundWitness } from '@xyo-network/sdk-protocol-js'\nimport type {\n Application, Request, Response,\n} from 'express'\nimport express from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\n/**\n * The type of the path parameters for the address path.\n */\ninterface AddressPathParams {\n address: XyoAddress\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 = asSchema('network.xyo.bridge.http.express.config', true)\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 this._app ??= this.initializeApp()\n return assertEx(this._app, () => 'App not initialized')\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions): 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}]: ${toSafeJsonString(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: XyoAddress, options?: BridgeExposeOptions): 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(): XyoAddress[] {\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) {\n await super.stopHandler()\n await this.stopHttpServer()\n }\n\n override async unexposeHandler(address: XyoAddress, options?: BridgeUnexposeOptions): 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: XyoAddress, 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(): Application {\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"],
5
- "mappings": ";;;;;;;;;;;;;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EAAQ;AAAA,OACH;AAEP,SAAS,kBAAkB;AAQ3B,SAAS,uBAAuB;AAChC,SAAS,kCAAkC;AAI3C,SAAS,UAAU,2BAA2B;AAI9C,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAqBrB,IAAM,gCAAgC,SAAS,0CAA0C,IAAI;AAQ7F,IAAM,oBAAN,cAAyE,WAAoB;AAAA,EAExF;AAAA,EACA,kBAA6C,CAAC;AAAA,EAC9C;AAAA,EAEV,IAAc,MAAM;AAClB,SAAK,SAAS,KAAK,cAAc;AACjC,WAAO,SAAS,KAAK,MAAM,MAAM,qBAAqB;AAAA,EACxD;AAAA,EAEA,MAAM,YAAY,KAAqB,SAA0D;AAC/F,UAAM,EAAE,WAAW,EAAE,IAAI,WAAW,CAAC;AACrC,aAAS,KAAK,OAAO,MAAM,MAAM,0BAA0B;AAC3D,SAAK,gBAAgB,KAAK,IAAI,QAAQ,GAAG,CAAC;AAC1C,UAAM,WAAW,WAAW,IAAM,MAAM,IAAI,iBAAiB,KAAM,CAAC,IAAK,CAAC;AAC1E,SAAK,QAAQ,IAAI,qBAAqB,IAAI,EAAE,KAAK,IAAI,OAAO,MAAM,iBAAiB,SAAS,IAAI,WAAS,MAAM,EAAE,CAAC,CAAC,EAAE;AACrH,UAAM,mBAAmB,MAAM,QAAQ,IAAI,SAAS,IAAI,WAAS,KAAK,YAAY,OAAO,EAAE,UAAU,WAAW,GAAG,UAAU,MAAM,CAAC,CAAC,CAAC,GACnI,KAAK,EACL,OAAO,MAAM;AAChB,UAAM,aAAa,CAAC,KAAK,GAAG,eAAe;AAE3C,eAAW,cAAc,WAAY,MAAK,QAAQ,IAAI,YAAY,WAAW,OAAO,KAAK,IAAI,EAAE,GAAG;AAElG,WAAO;AAAA,EACT;AAAA,EAEA,MAAe,cAAc,SAAqB,SAA0D;AAC1G,UAAM,EAAE,WAAW,KAAK,IAAI,WAAW,CAAC;AACxC,UAAM,MAAM,MAAM,2BAA2B,MAAM,OAAO;AAC1D,QAAI,YAAY,CAAC,KAAK;AACpB,YAAM,IAAI,MAAM,mCAAmC,OAAO,EAAE;AAAA,IAC9D;AACA,QAAI,KAAK;AACP,aAAO,KAAK,YAAY,KAAK,OAAO;AAAA,IACtC;AACA,WAAO,CAAC;AAAA,EACV;AAAA,EAES,iBAA+B;AACtC,WAAO,KAAK,gBAAgB,IAAI,SAAO,IAAI,MAAM,GAAG,OAAO,EAAE,OAAO,MAAM;AAAA,EAC5E;AAAA,EAEA,MAAe,eAAe;AAC5B,UAAM,MAAM,aAAa;AACzB,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AAAA,EAEA,MAAe,YAAY,UAAmB;AAC5C,UAAM,MAAM,YAAY;AACxB,UAAM,KAAK,eAAe;AAAA,EAC5B;AAAA,EAEA,MAAe,gBAAgB,SAAqB,SAA4D;AAC9G,UAAM,EAAE,WAAW,GAAG,WAAW,KAAK,IAAI,WAAW,CAAC;AACtD,aAAS,KAAK,OAAO,MAAM,MAAM,0BAA0B;AAC3D,UAAM,MAAM,KAAK,gBAAgB,KAAK,SAAO,IAAI,MAAM,GAAG,YAAY,OAAO,GAAG,MAAM;AACtF,aAAS,CAAC,YAAY,KAAK,MAAM,uBAAuB,OAAO,EAAE;AACjE,SAAK,kBAAkB,KAAK,gBAAgB,OAAO,SAAO,IAAI,MAAM,GAAG,YAAY,OAAO;AAC1F,QAAI,KAAK;AACP,YAAM,WAAW,WAAW,IAAM,MAAM,IAAI,iBAAiB,KAAM,CAAC,IAAK,CAAC;AAC1E,YAAM,mBACJ,MAAM,QAAQ,IAAI,SAAS,IAAI,WAAS,KAAK,gBAAgB,MAAM,SAAS,EAAE,UAAU,WAAW,GAAG,UAAU,MAAM,CAAC,CAAC,CAAC,GAExH,KAAK,EACL,OAAO,MAAM;AAChB,aAAO,CAAC,KAAK,GAAG,eAAe;AAAA,IACjC;AACA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAgB,gBAAgB,SAAqB,OAA0B,UAAwD;AACrI,UAAM,MAAM,KAAK,gBAAgB,KAAK,SAAO,IAAI,MAAM,GAAG,YAAY,OAAO,GAAG,MAAM;AACtF,WAAO,MAAM,MAAM,IAAI,MAAM,OAAO,QAAQ,IAAI;AAAA,EAClD;AAAA,EAEA,MAAgB,UAAU,KAA4E,KAAe;AACnH,UAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,QAAI;AACF,UAAI,WAAW,KAAK,SAAS;AAC3B,YAAI,KAAK,MAAM,KAAK,WAAW,KAAK,OAAO,CAAC;AAAA,MAC9C,OAAO;AACL,cAAM,MAAM,KAAK,gBAAgB,KAAK,SAAO,IAAI,MAAM,GAAG,YAAY,OAAO,GAAG,MAAM;AAEtF,YAAI,KAAK;AACP,cAAI,KAAK,MAAM,IAAI,WAAW,KAAK,OAAO,CAAC;AAAA,QAC7C,OAAO;AACL,cAAI,OAAO,YAAY,SAAS,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAAA,QACtE;AAAA,MACF;AAAA,IACF,SAAS,IAAI;AAEX,UAAI,OAAO,YAAY,qBAAqB,EAAE,KAAK,EAAE,OAAQ,GAAa,QAAQ,CAAC;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,MAAgB,WAAW,KAA4E,KAAe;AACpH,UAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,UAAM,CAAC,IAAI,WAAW,CAAC,CAAC,IAAI,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC;AAClE,UAAM,QAAQ,oBAAoB,EAAE,IAAI,KAAK;AAC7C,QAAI,CAAC,OAAO;AAEV,UAAI,OAAO,YAAY,WAAW,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACvE;AAAA,IACF;AACA,QAAI;AACF,UAAI,WAAW,KAAK,SAAS;AAC3B,cAAM,SAAS,MAAM,KAAK,MAAM,OAAO,QAAQ;AAC/C,eAAO,IAAI,KAAK,MAAM;AAAA,MACxB,OAAO;AACL,cAAM,SAAS,MAAM,KAAK,gBAAgB,SAAS,OAAO,QAAQ;AAElE,YAAI,WAAW,MAAM;AACnB,cAAI,OAAO,YAAY,SAAS,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAAA,QACtE,OAAO;AACL,cAAI,KAAK,MAAM;AAAA,QACjB;AAAA,MACF;AAAA,IACF,SAAS,IAAI;AAEX,UAAI,OAAO,YAAY,qBAAqB,EAAE,KAAK,EAAE,OAAQ,GAAa,QAAQ,CAAC;AAAA,IACrF;AAAA,EACF;AAAA,EAEU,gBAA6B;AAErC,UAAM,MAAM,QAAQ;AAGpB,QAAI,IAAI,gBAAgB;AACxB,QAAI,IAAI,cAAc;AAGtB,yCAAqC,GAAG;AACxC,QAAI,IAAI,qBAAqB;AAC7B,gCAA4B,GAAG;AAC/B,uBAAmB,GAAG;AAItB,QAAI,IAAI,KAAK,CAAC,MAAM,QAAQ,IAAI,SAAS,YAAY,mBAAmB,IAAI,KAAK,OAAO,EAAE,CAAC;AAC3F,QAAI,KAAK,KAAK,CAAC,MAAM,QAAQ,IAAI,SAAS,YAAY,oBAAoB,IAAI,KAAK,OAAO,EAAE,CAAC;AAE7F,QAAI;AAAA,MACF;AAAA,MAEA,aAAa,OAAO,KAAK,QAAQ,MAAM,KAAK,UAAU,KAAK,GAAG,CAAC;AAAA,IACjE;AACA,QAAI;AAAA,MACF;AAAA,MAEA,aAAa,OAAO,KAAK,QAAQ;AAAE,cAAM,KAAK,WAAW,KAAK,GAAG;AAAA,MAAE,CAAC;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AAAA,EAEU,kBAAoC;AAC5C,QAAI,KAAK,OAAO,MAAM;AACpB,eAAS,CAAC,KAAK,SAAS,MAAM,wBAAwB;AACtD,WAAK,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,MAAM,QAAQ,IAAI;AAAA,IAC/D;AACA,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC7B;AAAA,EAEU,iBAAmC;AAC3C,QAAI,KAAK,OAAO,MAAM;AACpB,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAI,KAAK,SAAS;AAChB,eAAK,QAAQ,MAAM,CAAC,QAAQ;AAC1B,gBAAI,KAAK;AACP,qBAAO,GAAG;AAAA,YACZ,OAAO;AACL,mBAAK,UAAU;AACf,sBAAQ,IAAI;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC7B;AACF;AApLE,cADW,mBACc,iBAA0B,CAAC,GAAG,iDAAM,kBAAe,6BAA6B;AAD9F,oBAAN;AAAA,EADN,gBAAgB;AAAA,GACJ;",
6
- "names": []
7
- }