@xyo-network/bridge-http 3.1.13 → 3.2.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.
@@ -27,7 +27,7 @@ export declare class HttpBridge<TParams extends HttpBridgeParams> extends HttpBr
27
27
  protected callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null>;
28
28
  protected handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<void>;
29
29
  protected handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<express.Response<any, Record<string, any>> | undefined>;
30
- protected initializeApp(): import(".store/@types-express-serve-static-core-npm-4.19.5-6a71bb1fe8/package").Express;
30
+ protected initializeApp(): import(".store/@types-express-serve-static-core-npm-5.0.0-d89b918522/package").Express;
31
31
  protected startHttpServer(): Promise<boolean>;
32
32
  protected stopHttpServer(): Promise<boolean>;
33
33
  }
@@ -27,7 +27,7 @@ export declare class HttpBridge<TParams extends HttpBridgeParams> extends HttpBr
27
27
  protected callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null>;
28
28
  protected handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<void>;
29
29
  protected handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<express.Response<any, Record<string, any>> | undefined>;
30
- protected initializeApp(): import(".store/@types-express-serve-static-core-npm-4.19.5-6a71bb1fe8/package").Express;
30
+ protected initializeApp(): import(".store/@types-express-serve-static-core-npm-5.0.0-d89b918522/package").Express;
31
31
  protected startHttpServer(): Promise<boolean>;
32
32
  protected stopHttpServer(): Promise<boolean>;
33
33
  }
@@ -27,7 +27,7 @@ export declare class HttpBridge<TParams extends HttpBridgeParams> extends HttpBr
27
27
  protected callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null>;
28
28
  protected handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<void>;
29
29
  protected handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response): Promise<express.Response<any, Record<string, any>> | undefined>;
30
- protected initializeApp(): import(".store/@types-express-serve-static-core-npm-4.19.5-6a71bb1fe8/package").Express;
30
+ protected initializeApp(): import(".store/@types-express-serve-static-core-npm-5.0.0-d89b918522/package").Express;
31
31
  protected startHttpServer(): Promise<boolean>;
32
32
  protected stopHttpServer(): Promise<boolean>;
33
33
  }
@@ -519,16 +519,10 @@ var HttpBridge = class extends HttpBridgeBase {
519
519
  useRequestCounters(app);
520
520
  app.get("/", (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${this.address}`));
521
521
  app.post("/", (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`));
522
- app.get(
523
- "/:address",
524
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
525
- asyncHandler(async (req, res) => await this.handleGet(req, res))
526
- );
527
- app.post(
528
- "/:address",
529
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
530
- asyncHandler(async (req, res) => await this.handlePost(req, res))
531
- );
522
+ app.get("/:address", asyncHandler(async (req, res) => await this.handleGet(req, res)));
523
+ app.post("/:address", asyncHandler(async (req, res) => {
524
+ await this.handlePost(req, res);
525
+ }));
532
526
  return app;
533
527
  }
534
528
  startHttpServer() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/HttpBridgeConfig.ts","../../src/HttpBridgeFull.ts","../../src/HttpBridgeBase.ts","../../src/HttpBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/object'\nimport type { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport type HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\nexport const HttpBridgeConfigSchema: HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\n\nexport type HttpBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n client?: BridgeConfig['client'] & {\n url: string\n }\n failureRetryTime?: number\n failureTimeCacheMax?: number\n host?: {\n port: number\n }\n maxConnections?: number\n maxPayloadSizeWarning?: number\n /** @deprecated use client.url instead */\n nodeUrl?: string\n schema: HttpBridgeConfigSchema\n } & TConfig,\n TSchema extends string ? TSchema : HttpBridgeConfigSchema\n>\n","import { Server } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/sdk-api-express-ecs'\nimport { isQueryBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\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 } from '@xyo-network/payload-model'\nimport express, {\n Application, Request, Response,\n} from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { HttpBridgeBase } from './HttpBridgeBase.ts'\nimport { HttpBridgeConfig } from './HttpBridgeConfig.ts'\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 interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {}\n\n@creatableModule()\nexport class HttpBridge<TParams extends HttpBridgeParams> extends HttpBridgeBase<TParams> {\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 // eslint-disable-next-line @typescript-eslint/no-misused-promises\n asyncHandler(async (req, res) => await this.handleGet(req, res)),\n )\n app.post<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>(\n '/:address',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\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","import { assertEx } from '@xylabs/assert'\nimport { AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions,\n BridgeModule,\n BridgeParams,\n BridgeUnexposeOptions,\n QuerySendFinishedEventArgs,\n QuerySendStartedEventArgs,\n} from '@xyo-network/bridge-model'\nimport {\n ModuleManifestPayload, NodeManifestPayload, NodeManifestPayloadSchema,\n} from '@xyo-network/manifest-model'\nimport {\n AnyConfigSchema,\n creatableModule,\n ModuleInstance,\n ModuleQueryResult,\n ModuleResolverInstance,\n ModuleStateQuery,\n ModuleStateQuerySchema,\n} from '@xyo-network/module-model'\nimport { asAttachableNodeInstance } from '@xyo-network/node-model'\nimport {\n isPayloadOfSchemaType, Payload, Schema, WithMeta,\n} from '@xyo-network/payload-model'\nimport { Mutex, Semaphore } from 'async-mutex'\nimport type { AxiosError } from 'axios'\nimport { LRUCache } from 'lru-cache'\n\nimport { HttpBridgeConfig, HttpBridgeConfigSchema } from './HttpBridgeConfig.ts'\nimport { HttpBridgeModuleResolver } from './HttpBridgeModuleResolver.ts'\nimport { BridgeQuerySender } from './ModuleProxy/index.ts'\n\nexport interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {\n axios?: AxiosJson\n}\n\n@creatableModule()\nexport class HttpBridgeBase<TParams extends HttpBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams>, BridgeQuerySender {\n static axios = new AxiosJson()\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = HttpBridgeConfigSchema\n static defaultFailureRetryTime = 1000 * 60\n static defaultMaxConnections = 4\n static defaultMaxPayloadSizeWarning = 256 * 256\n static maxFailureCacheSize = 1000\n\n private _axios?: AxiosJson\n private _discoverRootsMutex = new Mutex()\n private _failureTimeCache = new LRUCache<Address, number>({ max: HttpBridgeBase.maxFailureCacheSize })\n private _querySemaphore?: Semaphore\n private _resolver?: HttpBridgeModuleResolver\n\n get axios() {\n this._axios = this._axios ?? this.params.axios ?? HttpBridgeBase.axios\n return this._axios\n }\n\n get clientUrl() {\n return assertEx(this.config.client?.url ?? this.config.nodeUrl, () => 'No Url Set')\n }\n\n get failureRetryTime() {\n return this.config.failureRetryTime ?? HttpBridgeBase.defaultFailureRetryTime\n }\n\n get maxConnections() {\n return this.config.maxConnections ?? HttpBridgeBase.defaultMaxConnections\n }\n\n get maxPayloadSizeWarning() {\n return this.config.maxPayloadSizeWarning ?? HttpBridgeBase.defaultMaxPayloadSizeWarning\n }\n\n get querySemaphore() {\n this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections)\n return this._querySemaphore\n }\n\n override get resolver() {\n this._resolver\n = this._resolver\n ?? new HttpBridgeModuleResolver({\n additionalSigners: this.additionalSigners,\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n onQuerySendFinished: (args: Omit<QuerySendFinishedEventArgs, 'mod'>) => {\n forget(this.emit('querySendFinished', { mod: this, ...args }))\n },\n onQuerySendStarted: (args: Omit<QuerySendStartedEventArgs, 'mod'>) => {\n forget(this.emit('querySendStarted', { mod: this, ...args }))\n },\n querySender: this,\n root: this,\n rootUrl: this.clientUrl,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n async getRoots(force?: boolean): Promise<ModuleInstance[]> {\n return await this._discoverRootsMutex.runExclusive(async () => {\n if (this._roots === undefined || force) {\n const state = await this.getRootState()\n this.logger?.debug(`HttpBridge:discoverRoots.state [${state?.length}]`)\n const nodeManifest = state?.find(isPayloadOfSchemaType<WithMeta<NodeManifestPayload>>(NodeManifestPayloadSchema))\n if (nodeManifest) {\n const mods = (await this.resolveRootNode(nodeManifest)).filter(exists)\n this.logger?.debug(`HttpBridge:discoverRoots [${mods.length}]`)\n this._roots = mods\n } else {\n this._roots = []\n }\n }\n return this._roots\n })\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.clientUrl)\n }\n\n async sendBridgeQuery<TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n query: TQuery,\n payloads?: TIn[],\n ): Promise<ModuleQueryResult<TOut>> {\n const lastFailureTime = this._failureTimeCache.get(targetAddress)\n if (lastFailureTime !== undefined) {\n const now = Date.now()\n const timeSincePreviousFailure = now - lastFailureTime\n if (timeSincePreviousFailure > this.failureRetryTime) {\n throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`)\n }\n this._failureTimeCache.delete(targetAddress)\n }\n try {\n await this.querySemaphore.acquire()\n const payloadSize = JSON.stringify([query, payloads]).length\n if (payloadSize > this.maxPayloadSizeWarning) {\n this.logger?.warn(\n `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,\n )\n }\n const moduleUrl = this.moduleUrl(targetAddress).href\n const result = await this.axios.post<ApiEnvelope<ModuleQueryResult<TOut>>>(moduleUrl, [query, payloads])\n if (result.status === 404) {\n throw `target module not found [${moduleUrl}] [${result.status}]`\n }\n if (result.status >= 400) {\n this.logger?.error(`targetQuery failed [${moduleUrl}]`)\n throw `targetQuery failed [${moduleUrl}] [${result.status}]`\n }\n return result.data?.data\n } catch (ex) {\n const error = ex as AxiosError\n this.logger?.error(`Error: ${toJsonString(error)}`)\n throw error\n } finally {\n this.querySemaphore.release()\n }\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n private async getRootState() {\n const queryPayload: ModuleStateQuery = { schema: ModuleStateQuerySchema }\n const boundQuery = await this.bindQuery(queryPayload)\n try {\n const response = await this.axios.post<ApiEnvelope<ModuleQueryResult>>(this.clientUrl.toString(), boundQuery)\n if (response.status === 404) {\n return []\n }\n const [, payloads, errors] = response.data.data\n if (errors.length > 0) {\n throw new Error(`getRootState failed: ${JSON.stringify(errors, null, 2)}`)\n }\n return payloads\n } catch (ex) {\n const error = ex as Error\n this.logger?.warn(`Unable to connect to remote node: ${error.message} [${this.clientUrl}]`)\n }\n }\n\n private async resolveRootNode(nodeManifest: ModuleManifestPayload): Promise<ModuleInstance[]> {\n const rootModule = assertEx(\n (\n await this.resolver.resolveHandler(\n assertEx(nodeManifest.status?.address, () => 'Root has no address'),\n undefined,\n { manifest: nodeManifest },\n )\n ).at(0),\n () => `Root not found [${nodeManifest.status?.address}]`,\n )\n assertEx(rootModule.constructor.name !== 'HttpModuleProxy', () => 'rootModule is not a Wrapper')\n const rootNode = asAttachableNodeInstance(rootModule, 'Root modules is not a node')\n if (rootNode) {\n this.logger.debug(`rootNode: ${rootNode.id}`)\n this.downResolver.addResolver(rootNode as unknown as ModuleResolverInstance)\n return [rootNode]\n }\n return []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport type { BridgeModuleResolverParams } from '@xyo-network/bridge-abstract'\nimport { AbstractBridgeModuleResolver, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport type { ConfigPayload } from '@xyo-network/config-payload-plugin'\nimport { ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport type {\n ModuleConfig,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '@xyo-network/module-model'\nimport {\n asModuleInstance,\n isModuleInstance,\n ModuleConfigSchema,\n ResolveHelper,\n} from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport type { BridgeQuerySender, HttpModuleProxyParams } from './ModuleProxy/index.ts'\nimport { HttpModuleProxy } from './ModuleProxy/index.ts'\n\nconst NotFoundModule = { notFound: true }\n\nexport interface HttpBridgeModuleResolverParams extends BridgeModuleResolverParams {\n querySender: BridgeQuerySender\n rootUrl: string\n}\n\nexport class HttpBridgeModuleResolver<\n T extends HttpBridgeModuleResolverParams = HttpBridgeModuleResolverParams,\n> extends AbstractBridgeModuleResolver<T> {\n protected _resolvedCache = new LRUCache<Address, ModuleInstance | typeof NotFoundModule>({ max: 1000 })\n protected _resolvedCacheMutex = new Mutex()\n\n get querySender() {\n return this.params.querySender\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.params.rootUrl)\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n params?: Partial<HttpModuleProxyParams>,\n ): Promise<T[]> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult.length > 0) {\n return parentResult\n }\n const idParts = id.split(':')\n const untransformedFirstPart = assertEx(idParts.shift(), () => 'Missing module identifier')\n const firstPart = await ResolveHelper.transformModuleIdentifier(untransformedFirstPart)\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const instance: T | undefined = await this._resolvedCacheMutex.runExclusive(async () => {\n const cachedMod = this._resolvedCache.get(firstPart as Address)\n if (cachedMod) {\n if (isModuleInstance(cachedMod)) {\n const result = idParts.length <= 0 ? cachedMod : cachedMod.resolve(remainderParts, { ...options, maxDepth: (options?.maxDepth ?? 5) - 1 })\n return result as T\n } else {\n // return cached 404\n return\n }\n }\n const account = await Account.random()\n const finalParams: HttpModuleProxyParams = {\n account,\n archiving: this.params.archiving,\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress: firstPart as Address,\n onQuerySendFinished: this.params.onQuerySendFinished,\n onQuerySendStarted: this.params.onQuerySendStarted,\n querySender: this.params.querySender,\n ...params,\n }\n\n this.logger?.debug(`creating HttpProxy [${firstPart}] ${id}`)\n\n const proxy = new HttpModuleProxy<T, HttpModuleProxyParams>(finalParams)\n\n let state: Payload[] | undefined\n\n try {\n state = await proxy.state()\n } catch (ex) {\n const error = ex as Error\n this.logger?.log(error.message)\n }\n\n if (!state) {\n // cache the fact that it was not found\n this._resolvedCache.set(firstPart as Address, NotFoundModule)\n return\n }\n\n const configSchema = (state.find(payload => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config\n const config = assertEx(\n state.find(payload => payload.schema === configSchema),\n () => 'Unable to locate config',\n ) as ModuleConfig\n proxy.setConfig(config)\n\n this.logger?.log(`created HttpProxy [${firstPart}] ${proxy.id}`)\n\n await proxy.start?.()\n const wrapped = wrapModuleWithType(proxy, account) as unknown as T\n assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n this._resolvedCache.set(wrapped.address, wrapped)\n return wrapped as ModuleInstance as T\n })\n const result = remainderParts.length > 0 ? await instance?.resolve(remainderParts, options) : instance\n return result ? [result] : []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AbstractModuleProxy } from '@xyo-network/bridge-abstract'\nimport type {\n AttachableModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleQueryResult,\n ResolveHelperConfig,\n} from '@xyo-network/module-model'\nimport { ResolveHelper } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\n\nexport interface BridgeQuerySender {\n sendBridgeQuery: <TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n query: TQuery,\n payloads?: TIn[],\n ) => Promise<ModuleQueryResult<TOut>>\n}\n\nexport type HttpModuleProxyParams = ModuleProxyParams & {\n querySender: BridgeQuerySender\n}\n\nexport class HttpModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<HttpModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<HttpModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n>\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements AttachableModuleInstance<TParams, TWrappedModule['eventData']> {\n static createCount = 0\n\n constructor(params: TParams) {\n HttpModuleProxy.createCount = HttpModuleProxy.createCount + 1\n super(params)\n if (Math.floor(HttpModuleProxy.createCount / 10) === HttpModuleProxy.createCount / 10) {\n console.log(`HttpModuleProxy.createCount: ${HttpModuleProxy.createCount}`)\n }\n }\n\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists([query, ...(payloads ?? [])]))\n }\n const result = await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists(result.flat()))\n }\n return result\n }\n\n override async publicChildren(): Promise<ModuleInstance[]> {\n return (\n await Promise.all(\n Object.values(await this.childAddressMap())\n .filter(exists)\n .map(address => this.resolve(address)),\n )\n ).filter(exists)\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const config: ResolveHelperConfig = {\n address: this.address,\n dead: this.dead,\n downResolver: this.downResolver,\n logger: this.logger,\n mod: this,\n transformers: this.moduleIdentifierTransformers,\n upResolver: this.upResolver,\n }\n if (idOrFilter === '*') {\n return [...(await this.publicChildren()), await this.params.host.resolve(this.address)] as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const parts = idOrFilter.split(':')\n const first = assertEx(parts.shift(), () => 'Missing first')\n const remainingPath = parts.join(':')\n const address\n = isAddress(first)\n ? first\n : this.id === first\n ? this.address\n : this.childAddressByName(first)\n if (!address) return undefined\n const firstInstance = (await this.params.host.resolve(address)) as ModuleInstance | undefined\n return (remainingPath ? await firstInstance?.resolve(remainingPath) : firstInstance) as T | undefined\n }\n case 'object': {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter(mod => mod.address !== this.address)\n }\n default: {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter(mod => mod.address !== this.address)\n }\n }\n }\n}\n"],"mappings":"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","names":["HttpBridgeConfigSchema","assertEx","exists","toJsonString","asyncHandler","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","jsonBodyParser","responseProfiler","useRequestCounters","isQueryBoundWitness","creatableModule","resolveAddressToInstanceUp","express","StatusCodes","assertEx","AxiosJson","exists","forget","toJsonString","AbstractBridge","NodeManifestPayloadSchema","creatableModule","ModuleStateQuerySchema","asAttachableNodeInstance","isPayloadOfSchemaType","Mutex","Semaphore","LRUCache","assertEx","isAddress","Account","AbstractBridgeModuleResolver","wrapModuleWithType","ConfigSchema","asModuleInstance","isModuleInstance","ModuleConfigSchema","ResolveHelper","Mutex","LRUCache","assertEx","exists","forget","isAddress","AbstractModuleProxy","ResolveHelper","HttpModuleProxy","AbstractModuleProxy","createCount","constructor","params","Math","floor","console","log","proxyQueryHandler","query","payloads","archiving","isAllowedArchivingQuery","schema","forget","storeToArchivists","result","querySender","sendBridgeQuery","moduleAddress","flat","publicChildren","Promise","all","Object","values","childAddressMap","filter","exists","map","address","resolve","idOrFilter","options","config","dead","downResolver","logger","mod","transformers","moduleIdentifierTransformers","upResolver","host","parts","split","first","assertEx","shift","remainingPath","join","isAddress","id","childAddressByName","undefined","firstInstance","ResolveHelper","NotFoundModule","notFound","HttpBridgeModuleResolver","AbstractBridgeModuleResolver","_resolvedCache","LRUCache","max","_resolvedCacheMutex","Mutex","querySender","params","moduleUrl","address","URL","rootUrl","resolveHandler","id","options","parentResult","length","idParts","split","untransformedFirstPart","assertEx","shift","firstPart","ResolveHelper","transformModuleIdentifier","isAddress","remainderParts","join","instance","runExclusive","cachedMod","get","isModuleInstance","result","resolve","maxDepth","account","Account","random","finalParams","archiving","config","schema","ModuleConfigSchema","host","moduleAddress","onQuerySendFinished","onQuerySendStarted","logger","debug","proxy","HttpModuleProxy","state","ex","error","log","message","set","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","asModuleInstance","HttpBridgeBase","AbstractBridge","axios","AxiosJson","configSchemas","HttpBridgeConfigSchema","defaultConfigSchema","defaultFailureRetryTime","defaultMaxConnections","defaultMaxPayloadSizeWarning","maxFailureCacheSize","_axios","_discoverRootsMutex","Mutex","_failureTimeCache","LRUCache","max","_querySemaphore","_resolver","params","clientUrl","assertEx","config","client","url","nodeUrl","failureRetryTime","maxConnections","maxPayloadSizeWarning","querySemaphore","Semaphore","resolver","HttpBridgeModuleResolver","additionalSigners","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","onQuerySendFinished","args","forget","emit","mod","onQuerySendStarted","querySender","root","rootUrl","wrapperAccount","account","exposeHandler","_id","_options","Error","exposedHandler","getRoots","force","runExclusive","_roots","undefined","state","getRootState","logger","debug","length","nodeManifest","find","isPayloadOfSchemaType","NodeManifestPayloadSchema","mods","resolveRootNode","filter","exists","moduleUrl","address","URL","sendBridgeQuery","targetAddress","query","payloads","lastFailureTime","get","now","Date","timeSincePreviousFailure","delete","acquire","payloadSize","JSON","stringify","warn","moduleAddress","schema","href","result","post","status","error","data","ex","toJsonString","release","unexposeHandler","queryPayload","ModuleStateQuerySchema","boundQuery","bindQuery","response","toString","errors","message","rootModule","resolveHandler","manifest","at","constructor","name","rootNode","asAttachableNodeInstance","id","downResolver","addResolver","HttpBridge","HttpBridgeBase","_app","_exposedModules","_server","app","initializeApp","assertEx","exposeChild","mod","options","maxDepth","config","host","push","WeakRef","children","publicChildren","logger","log","id","address","toJsonString","map","child","exposedChildren","Promise","all","required","flat","filter","exists","allExposed","exposedMod","exposeHandler","resolveAddressToInstanceUp","Error","exposedHandler","ref","deref","startHandler","startHttpServer","stopHandler","_timeout","stopHttpServer","unexposeHandler","find","callLocalModule","query","payloads","handleGet","req","res","params","json","stateQuery","account","status","StatusCodes","NOT_FOUND","error","ex","INTERNAL_SERVER_ERROR","message","handlePost","bw","Array","isArray","body","isQueryBoundWitness","undefined","BAD_REQUEST","result","express","use","responseProfiler","jsonBodyParser","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","useRequestCounters","get","_req","redirect","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","asyncHandler","listen","port","resolve","reject","close","err"]}
1
+ {"version":3,"sources":["../../src/HttpBridgeConfig.ts","../../src/HttpBridgeFull.ts","../../src/HttpBridgeBase.ts","../../src/HttpBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/object'\nimport type { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport type HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\nexport const HttpBridgeConfigSchema: HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\n\nexport type HttpBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n client?: BridgeConfig['client'] & {\n url: string\n }\n failureRetryTime?: number\n failureTimeCacheMax?: number\n host?: {\n port: number\n }\n maxConnections?: number\n maxPayloadSizeWarning?: number\n /** @deprecated use client.url instead */\n nodeUrl?: string\n schema: HttpBridgeConfigSchema\n } & TConfig,\n TSchema extends string ? TSchema : HttpBridgeConfigSchema\n>\n","import { Server } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/sdk-api-express-ecs'\nimport { isQueryBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\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 } from '@xyo-network/payload-model'\nimport express, {\n Application, Request, Response,\n} from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { HttpBridgeBase } from './HttpBridgeBase.ts'\nimport { HttpBridgeConfig } from './HttpBridgeConfig.ts'\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 interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {}\n\n@creatableModule()\nexport class HttpBridge<TParams extends HttpBridgeParams> extends HttpBridgeBase<TParams> {\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","import { assertEx } from '@xylabs/assert'\nimport { AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions,\n BridgeModule,\n BridgeParams,\n BridgeUnexposeOptions,\n QuerySendFinishedEventArgs,\n QuerySendStartedEventArgs,\n} from '@xyo-network/bridge-model'\nimport {\n ModuleManifestPayload, NodeManifestPayload, NodeManifestPayloadSchema,\n} from '@xyo-network/manifest-model'\nimport {\n AnyConfigSchema,\n creatableModule,\n ModuleInstance,\n ModuleQueryResult,\n ModuleResolverInstance,\n ModuleStateQuery,\n ModuleStateQuerySchema,\n} from '@xyo-network/module-model'\nimport { asAttachableNodeInstance } from '@xyo-network/node-model'\nimport {\n isPayloadOfSchemaType, Payload, Schema, WithMeta,\n} from '@xyo-network/payload-model'\nimport { Mutex, Semaphore } from 'async-mutex'\nimport type { AxiosError } from 'axios'\nimport { LRUCache } from 'lru-cache'\n\nimport { HttpBridgeConfig, HttpBridgeConfigSchema } from './HttpBridgeConfig.ts'\nimport { HttpBridgeModuleResolver } from './HttpBridgeModuleResolver.ts'\nimport { BridgeQuerySender } from './ModuleProxy/index.ts'\n\nexport interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {\n axios?: AxiosJson\n}\n\n@creatableModule()\nexport class HttpBridgeBase<TParams extends HttpBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams>, BridgeQuerySender {\n static axios = new AxiosJson()\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = HttpBridgeConfigSchema\n static defaultFailureRetryTime = 1000 * 60\n static defaultMaxConnections = 4\n static defaultMaxPayloadSizeWarning = 256 * 256\n static maxFailureCacheSize = 1000\n\n private _axios?: AxiosJson\n private _discoverRootsMutex = new Mutex()\n private _failureTimeCache = new LRUCache<Address, number>({ max: HttpBridgeBase.maxFailureCacheSize })\n private _querySemaphore?: Semaphore\n private _resolver?: HttpBridgeModuleResolver\n\n get axios() {\n this._axios = this._axios ?? this.params.axios ?? HttpBridgeBase.axios\n return this._axios\n }\n\n get clientUrl() {\n return assertEx(this.config.client?.url ?? this.config.nodeUrl, () => 'No Url Set')\n }\n\n get failureRetryTime() {\n return this.config.failureRetryTime ?? HttpBridgeBase.defaultFailureRetryTime\n }\n\n get maxConnections() {\n return this.config.maxConnections ?? HttpBridgeBase.defaultMaxConnections\n }\n\n get maxPayloadSizeWarning() {\n return this.config.maxPayloadSizeWarning ?? HttpBridgeBase.defaultMaxPayloadSizeWarning\n }\n\n get querySemaphore() {\n this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections)\n return this._querySemaphore\n }\n\n override get resolver() {\n this._resolver\n = this._resolver\n ?? new HttpBridgeModuleResolver({\n additionalSigners: this.additionalSigners,\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n onQuerySendFinished: (args: Omit<QuerySendFinishedEventArgs, 'mod'>) => {\n forget(this.emit('querySendFinished', { mod: this, ...args }))\n },\n onQuerySendStarted: (args: Omit<QuerySendStartedEventArgs, 'mod'>) => {\n forget(this.emit('querySendStarted', { mod: this, ...args }))\n },\n querySender: this,\n root: this,\n rootUrl: this.clientUrl,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n async getRoots(force?: boolean): Promise<ModuleInstance[]> {\n return await this._discoverRootsMutex.runExclusive(async () => {\n if (this._roots === undefined || force) {\n const state = await this.getRootState()\n this.logger?.debug(`HttpBridge:discoverRoots.state [${state?.length}]`)\n const nodeManifest = state?.find(isPayloadOfSchemaType<WithMeta<NodeManifestPayload>>(NodeManifestPayloadSchema))\n if (nodeManifest) {\n const mods = (await this.resolveRootNode(nodeManifest)).filter(exists)\n this.logger?.debug(`HttpBridge:discoverRoots [${mods.length}]`)\n this._roots = mods\n } else {\n this._roots = []\n }\n }\n return this._roots\n })\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.clientUrl)\n }\n\n async sendBridgeQuery<TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n query: TQuery,\n payloads?: TIn[],\n ): Promise<ModuleQueryResult<TOut>> {\n const lastFailureTime = this._failureTimeCache.get(targetAddress)\n if (lastFailureTime !== undefined) {\n const now = Date.now()\n const timeSincePreviousFailure = now - lastFailureTime\n if (timeSincePreviousFailure > this.failureRetryTime) {\n throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`)\n }\n this._failureTimeCache.delete(targetAddress)\n }\n try {\n await this.querySemaphore.acquire()\n const payloadSize = JSON.stringify([query, payloads]).length\n if (payloadSize > this.maxPayloadSizeWarning) {\n this.logger?.warn(\n `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,\n )\n }\n const moduleUrl = this.moduleUrl(targetAddress).href\n const result = await this.axios.post<ApiEnvelope<ModuleQueryResult<TOut>>>(moduleUrl, [query, payloads])\n if (result.status === 404) {\n throw `target module not found [${moduleUrl}] [${result.status}]`\n }\n if (result.status >= 400) {\n this.logger?.error(`targetQuery failed [${moduleUrl}]`)\n throw `targetQuery failed [${moduleUrl}] [${result.status}]`\n }\n return result.data?.data\n } catch (ex) {\n const error = ex as AxiosError\n this.logger?.error(`Error: ${toJsonString(error)}`)\n throw error\n } finally {\n this.querySemaphore.release()\n }\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n private async getRootState() {\n const queryPayload: ModuleStateQuery = { schema: ModuleStateQuerySchema }\n const boundQuery = await this.bindQuery(queryPayload)\n try {\n const response = await this.axios.post<ApiEnvelope<ModuleQueryResult>>(this.clientUrl.toString(), boundQuery)\n if (response.status === 404) {\n return []\n }\n const [, payloads, errors] = response.data.data\n if (errors.length > 0) {\n throw new Error(`getRootState failed: ${JSON.stringify(errors, null, 2)}`)\n }\n return payloads\n } catch (ex) {\n const error = ex as Error\n this.logger?.warn(`Unable to connect to remote node: ${error.message} [${this.clientUrl}]`)\n }\n }\n\n private async resolveRootNode(nodeManifest: ModuleManifestPayload): Promise<ModuleInstance[]> {\n const rootModule = assertEx(\n (\n await this.resolver.resolveHandler(\n assertEx(nodeManifest.status?.address, () => 'Root has no address'),\n undefined,\n { manifest: nodeManifest },\n )\n ).at(0),\n () => `Root not found [${nodeManifest.status?.address}]`,\n )\n assertEx(rootModule.constructor.name !== 'HttpModuleProxy', () => 'rootModule is not a Wrapper')\n const rootNode = asAttachableNodeInstance(rootModule, 'Root modules is not a node')\n if (rootNode) {\n this.logger.debug(`rootNode: ${rootNode.id}`)\n this.downResolver.addResolver(rootNode as unknown as ModuleResolverInstance)\n return [rootNode]\n }\n return []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport type { BridgeModuleResolverParams } from '@xyo-network/bridge-abstract'\nimport { AbstractBridgeModuleResolver, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport type { ConfigPayload } from '@xyo-network/config-payload-plugin'\nimport { ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport type {\n ModuleConfig,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '@xyo-network/module-model'\nimport {\n asModuleInstance,\n isModuleInstance,\n ModuleConfigSchema,\n ResolveHelper,\n} from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport type { BridgeQuerySender, HttpModuleProxyParams } from './ModuleProxy/index.ts'\nimport { HttpModuleProxy } from './ModuleProxy/index.ts'\n\nconst NotFoundModule = { notFound: true }\n\nexport interface HttpBridgeModuleResolverParams extends BridgeModuleResolverParams {\n querySender: BridgeQuerySender\n rootUrl: string\n}\n\nexport class HttpBridgeModuleResolver<\n T extends HttpBridgeModuleResolverParams = HttpBridgeModuleResolverParams,\n> extends AbstractBridgeModuleResolver<T> {\n protected _resolvedCache = new LRUCache<Address, ModuleInstance | typeof NotFoundModule>({ max: 1000 })\n protected _resolvedCacheMutex = new Mutex()\n\n get querySender() {\n return this.params.querySender\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.params.rootUrl)\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n params?: Partial<HttpModuleProxyParams>,\n ): Promise<T[]> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult.length > 0) {\n return parentResult\n }\n const idParts = id.split(':')\n const untransformedFirstPart = assertEx(idParts.shift(), () => 'Missing module identifier')\n const firstPart = await ResolveHelper.transformModuleIdentifier(untransformedFirstPart)\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const instance: T | undefined = await this._resolvedCacheMutex.runExclusive(async () => {\n const cachedMod = this._resolvedCache.get(firstPart as Address)\n if (cachedMod) {\n if (isModuleInstance(cachedMod)) {\n const result = idParts.length <= 0 ? cachedMod : cachedMod.resolve(remainderParts, { ...options, maxDepth: (options?.maxDepth ?? 5) - 1 })\n return result as T\n } else {\n // return cached 404\n return\n }\n }\n const account = await Account.random()\n const finalParams: HttpModuleProxyParams = {\n account,\n archiving: this.params.archiving,\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress: firstPart as Address,\n onQuerySendFinished: this.params.onQuerySendFinished,\n onQuerySendStarted: this.params.onQuerySendStarted,\n querySender: this.params.querySender,\n ...params,\n }\n\n this.logger?.debug(`creating HttpProxy [${firstPart}] ${id}`)\n\n const proxy = new HttpModuleProxy<T, HttpModuleProxyParams>(finalParams)\n\n let state: Payload[] | undefined\n\n try {\n state = await proxy.state()\n } catch (ex) {\n const error = ex as Error\n this.logger?.log(error.message)\n }\n\n if (!state) {\n // cache the fact that it was not found\n this._resolvedCache.set(firstPart as Address, NotFoundModule)\n return\n }\n\n const configSchema = (state.find(payload => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config\n const config = assertEx(\n state.find(payload => payload.schema === configSchema),\n () => 'Unable to locate config',\n ) as ModuleConfig\n proxy.setConfig(config)\n\n this.logger?.log(`created HttpProxy [${firstPart}] ${proxy.id}`)\n\n await proxy.start?.()\n const wrapped = wrapModuleWithType(proxy, account) as unknown as T\n assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n this._resolvedCache.set(wrapped.address, wrapped)\n return wrapped as ModuleInstance as T\n })\n const result = remainderParts.length > 0 ? await instance?.resolve(remainderParts, options) : instance\n return result ? [result] : []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AbstractModuleProxy } from '@xyo-network/bridge-abstract'\nimport type {\n AttachableModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleQueryResult,\n ResolveHelperConfig,\n} from '@xyo-network/module-model'\nimport { ResolveHelper } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\n\nexport interface BridgeQuerySender {\n sendBridgeQuery: <TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n query: TQuery,\n payloads?: TIn[],\n ) => Promise<ModuleQueryResult<TOut>>\n}\n\nexport type HttpModuleProxyParams = ModuleProxyParams & {\n querySender: BridgeQuerySender\n}\n\nexport class HttpModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<HttpModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<HttpModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n>\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements AttachableModuleInstance<TParams, TWrappedModule['eventData']> {\n static createCount = 0\n\n constructor(params: TParams) {\n HttpModuleProxy.createCount = HttpModuleProxy.createCount + 1\n super(params)\n if (Math.floor(HttpModuleProxy.createCount / 10) === HttpModuleProxy.createCount / 10) {\n console.log(`HttpModuleProxy.createCount: ${HttpModuleProxy.createCount}`)\n }\n }\n\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists([query, ...(payloads ?? [])]))\n }\n const result = await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists(result.flat()))\n }\n return result\n }\n\n override async publicChildren(): Promise<ModuleInstance[]> {\n return (\n await Promise.all(\n Object.values(await this.childAddressMap())\n .filter(exists)\n .map(address => this.resolve(address)),\n )\n ).filter(exists)\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const config: ResolveHelperConfig = {\n address: this.address,\n dead: this.dead,\n downResolver: this.downResolver,\n logger: this.logger,\n mod: this,\n transformers: this.moduleIdentifierTransformers,\n upResolver: this.upResolver,\n }\n if (idOrFilter === '*') {\n return [...(await this.publicChildren()), await this.params.host.resolve(this.address)] as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const parts = idOrFilter.split(':')\n const first = assertEx(parts.shift(), () => 'Missing first')\n const remainingPath = parts.join(':')\n const address\n = isAddress(first)\n ? first\n : this.id === first\n ? this.address\n : this.childAddressByName(first)\n if (!address) return undefined\n const firstInstance = (await this.params.host.resolve(address)) as ModuleInstance | undefined\n return (remainingPath ? await firstInstance?.resolve(remainingPath) : firstInstance) as T | undefined\n }\n case 'object': {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter(mod => mod.address !== this.address)\n }\n default: {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter(mod => mod.address !== this.address)\n }\n }\n }\n}\n"],"mappings":"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","names":["HttpBridgeConfigSchema","assertEx","exists","toJsonString","asyncHandler","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","jsonBodyParser","responseProfiler","useRequestCounters","isQueryBoundWitness","creatableModule","resolveAddressToInstanceUp","express","StatusCodes","assertEx","AxiosJson","exists","forget","toJsonString","AbstractBridge","NodeManifestPayloadSchema","creatableModule","ModuleStateQuerySchema","asAttachableNodeInstance","isPayloadOfSchemaType","Mutex","Semaphore","LRUCache","assertEx","isAddress","Account","AbstractBridgeModuleResolver","wrapModuleWithType","ConfigSchema","asModuleInstance","isModuleInstance","ModuleConfigSchema","ResolveHelper","Mutex","LRUCache","assertEx","exists","forget","isAddress","AbstractModuleProxy","ResolveHelper","HttpModuleProxy","AbstractModuleProxy","createCount","constructor","params","Math","floor","console","log","proxyQueryHandler","query","payloads","archiving","isAllowedArchivingQuery","schema","forget","storeToArchivists","result","querySender","sendBridgeQuery","moduleAddress","flat","publicChildren","Promise","all","Object","values","childAddressMap","filter","exists","map","address","resolve","idOrFilter","options","config","dead","downResolver","logger","mod","transformers","moduleIdentifierTransformers","upResolver","host","parts","split","first","assertEx","shift","remainingPath","join","isAddress","id","childAddressByName","undefined","firstInstance","ResolveHelper","NotFoundModule","notFound","HttpBridgeModuleResolver","AbstractBridgeModuleResolver","_resolvedCache","LRUCache","max","_resolvedCacheMutex","Mutex","querySender","params","moduleUrl","address","URL","rootUrl","resolveHandler","id","options","parentResult","length","idParts","split","untransformedFirstPart","assertEx","shift","firstPart","ResolveHelper","transformModuleIdentifier","isAddress","remainderParts","join","instance","runExclusive","cachedMod","get","isModuleInstance","result","resolve","maxDepth","account","Account","random","finalParams","archiving","config","schema","ModuleConfigSchema","host","moduleAddress","onQuerySendFinished","onQuerySendStarted","logger","debug","proxy","HttpModuleProxy","state","ex","error","log","message","set","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","asModuleInstance","HttpBridgeBase","AbstractBridge","axios","AxiosJson","configSchemas","HttpBridgeConfigSchema","defaultConfigSchema","defaultFailureRetryTime","defaultMaxConnections","defaultMaxPayloadSizeWarning","maxFailureCacheSize","_axios","_discoverRootsMutex","Mutex","_failureTimeCache","LRUCache","max","_querySemaphore","_resolver","params","clientUrl","assertEx","config","client","url","nodeUrl","failureRetryTime","maxConnections","maxPayloadSizeWarning","querySemaphore","Semaphore","resolver","HttpBridgeModuleResolver","additionalSigners","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","onQuerySendFinished","args","forget","emit","mod","onQuerySendStarted","querySender","root","rootUrl","wrapperAccount","account","exposeHandler","_id","_options","Error","exposedHandler","getRoots","force","runExclusive","_roots","undefined","state","getRootState","logger","debug","length","nodeManifest","find","isPayloadOfSchemaType","NodeManifestPayloadSchema","mods","resolveRootNode","filter","exists","moduleUrl","address","URL","sendBridgeQuery","targetAddress","query","payloads","lastFailureTime","get","now","Date","timeSincePreviousFailure","delete","acquire","payloadSize","JSON","stringify","warn","moduleAddress","schema","href","result","post","status","error","data","ex","toJsonString","release","unexposeHandler","queryPayload","ModuleStateQuerySchema","boundQuery","bindQuery","response","toString","errors","message","rootModule","resolveHandler","manifest","at","constructor","name","rootNode","asAttachableNodeInstance","id","downResolver","addResolver","HttpBridge","HttpBridgeBase","_app","_exposedModules","_server","app","initializeApp","assertEx","exposeChild","mod","options","maxDepth","config","host","push","WeakRef","children","publicChildren","logger","log","id","address","toJsonString","map","child","exposedChildren","Promise","all","required","flat","filter","exists","allExposed","exposedMod","exposeHandler","resolveAddressToInstanceUp","Error","exposedHandler","ref","deref","startHandler","startHttpServer","stopHandler","_timeout","stopHttpServer","unexposeHandler","find","callLocalModule","query","payloads","handleGet","req","res","params","json","stateQuery","account","status","StatusCodes","NOT_FOUND","error","ex","INTERNAL_SERVER_ERROR","message","handlePost","bw","Array","isArray","body","isQueryBoundWitness","undefined","BAD_REQUEST","result","express","use","responseProfiler","jsonBodyParser","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","useRequestCounters","get","_req","redirect","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","asyncHandler","listen","port","resolve","reject","close","err"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/bridge-http",
3
- "version": "3.1.13",
3
+ "version": "3.2.0",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -37,46 +37,46 @@
37
37
  "module": "dist/neutral/index-browser.mjs",
38
38
  "types": "dist/neutral/index-browser.d.ts",
39
39
  "dependencies": {
40
- "@xylabs/assert": "^4.0.9",
41
- "@xylabs/axios": "^4.0.9",
42
- "@xylabs/exists": "^4.0.9",
43
- "@xylabs/forget": "^4.0.9",
44
- "@xylabs/hex": "^4.0.9",
45
- "@xylabs/object": "^4.0.9",
46
- "@xylabs/promise": "^4.0.9",
40
+ "@xylabs/assert": "^4.1.0",
41
+ "@xylabs/axios": "^4.1.0",
42
+ "@xylabs/exists": "^4.1.0",
43
+ "@xylabs/forget": "^4.1.0",
44
+ "@xylabs/hex": "^4.1.0",
45
+ "@xylabs/object": "^4.1.0",
46
+ "@xylabs/promise": "^4.1.0",
47
47
  "@xylabs/sdk-api-express-ecs": "^2.0.4",
48
- "@xyo-network/account": "^3.1.13",
49
- "@xyo-network/api-models": "^3.1.13",
50
- "@xyo-network/boundwitness-model": "^3.1.13",
51
- "@xyo-network/bridge-abstract": "^3.1.13",
52
- "@xyo-network/bridge-model": "^3.1.13",
53
- "@xyo-network/config-payload-plugin": "^3.1.13",
54
- "@xyo-network/manifest-model": "^3.1.13",
55
- "@xyo-network/module-model": "^3.1.13",
56
- "@xyo-network/node-model": "^3.1.13",
57
- "@xyo-network/payload-model": "^3.1.13",
48
+ "@xyo-network/account": "^3.2.0",
49
+ "@xyo-network/api-models": "^3.2.0",
50
+ "@xyo-network/boundwitness-model": "^3.2.0",
51
+ "@xyo-network/bridge-abstract": "^3.2.0",
52
+ "@xyo-network/bridge-model": "^3.2.0",
53
+ "@xyo-network/config-payload-plugin": "^3.2.0",
54
+ "@xyo-network/manifest-model": "^3.2.0",
55
+ "@xyo-network/module-model": "^3.2.0",
56
+ "@xyo-network/node-model": "^3.2.0",
57
+ "@xyo-network/payload-model": "^3.2.0",
58
58
  "async-mutex": "^0.5.0",
59
59
  "axios": "^1.7.7",
60
- "express": "^4.19.2",
60
+ "express": "^4.21.1",
61
61
  "http-status-codes": "^2.3.0",
62
- "lru-cache": "^11.0.0"
62
+ "lru-cache": "^11.0.1"
63
63
  },
64
64
  "devDependencies": {
65
- "@types/express": "^4.17.21",
66
- "@types/node": "^22.5.4",
67
- "@xylabs/ts-scripts-yarn3": "^4.0.7",
68
- "@xylabs/tsconfig": "^4.0.7",
69
- "@xyo-network/account": "^3.1.13",
70
- "@xyo-network/archivist-model": "^3.1.13",
71
- "@xyo-network/bridge-abstract": "^3.1.13",
72
- "@xyo-network/diviner-model": "^3.1.13",
73
- "@xyo-network/module-resolver": "^3.1.13",
74
- "@xyo-network/node-memory": "^3.1.13",
75
- "@xyo-network/node-model": "^3.1.13",
76
- "@xyo-network/payload-builder": "^3.1.13",
77
- "@xyo-network/payload-wrapper": "^3.1.13",
65
+ "@types/express": "^5.0.0",
66
+ "@types/node": "^22.7.5",
67
+ "@xylabs/ts-scripts-yarn3": "^4.1.0",
68
+ "@xylabs/tsconfig": "^4.1.0",
69
+ "@xyo-network/account": "^3.2.0",
70
+ "@xyo-network/archivist-model": "^3.2.0",
71
+ "@xyo-network/bridge-abstract": "^3.2.0",
72
+ "@xyo-network/diviner-model": "^3.2.0",
73
+ "@xyo-network/module-resolver": "^3.2.0",
74
+ "@xyo-network/node-memory": "^3.2.0",
75
+ "@xyo-network/node-model": "^3.2.0",
76
+ "@xyo-network/payload-builder": "^3.2.0",
77
+ "@xyo-network/payload-wrapper": "^3.2.0",
78
78
  "get-port-please": "^3.1.2",
79
- "typescript": "^5.5.4"
79
+ "typescript": "^5.6.2"
80
80
  },
81
81
  "publishConfig": {
82
82
  "access": "public"
@@ -194,13 +194,13 @@ export class HttpBridge<TParams extends HttpBridgeParams> extends HttpBridgeBase
194
194
 
195
195
  app.get<AddressPathParams, ModuleQueryResult>(
196
196
  '/:address',
197
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
197
+
198
198
  asyncHandler(async (req, res) => await this.handleGet(req, res)),
199
199
  )
200
200
  app.post<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>(
201
201
  '/:address',
202
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
203
- asyncHandler(async (req, res) => await this.handlePost(req, res)),
202
+
203
+ asyncHandler(async (req, res) => { await this.handlePost(req, res) }),
204
204
  )
205
205
  return app
206
206
  }