@xyo-network/bridge-pub-sub 2.94.16 → 2.94.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/AbstractModuleHost/AbstractModuleHost.ts","../../src/AsyncQueryBus/AsyncQueryBusClient.ts","../../src/AsyncQueryBus/AsyncQueryBusBase.ts","../../src/AsyncQueryBus/model/QueryStatus.ts","../../src/AsyncQueryBus/AsyncQueryBusHost.ts","../../src/AsyncQueryBus/ModuleHost/ModuleHost.ts","../../src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts","../../src/Schema.ts","../../src/Config.ts","../../src/PubSubBridge.ts","../../src/PubSubBridgeModuleResolver.ts"],"sourcesContent":["export * from './AbstractModuleHost'\nexport * from './AsyncQueryBus'\nexport * from './Config'\nexport * from './Params'\nexport * from './PubSubBridge'\nexport * from './PubSubBridgeModuleResolver'\nexport * from './Schema'\n","import { Base, BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { ModuleInstance } from '@xyo-network/module-model'\n\nexport type ModuleHostParams<THostedInstance extends ModuleInstance = ModuleInstance> = BaseParams<{\n module: THostedInstance\n}>\n\nexport abstract class AbstractModuleHost<TParams extends ModuleHostParams = ModuleHostParams> extends Base<TParams> {\n abstract start(): Promisable<void>\n abstract stop(): Promisable<void>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { CacheConfig, ModuleQueryResult } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { ModuleError, Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusClientParams, Pending } from './model'\n\nexport class AsyncQueryBusClient<TParams extends AsyncQueryBusClientParams = AsyncQueryBusClientParams> extends AsyncQueryBusBase<TParams> {\n protected _queryCache?: LRUCache<Address, Pending | ModuleQueryResult>\n private _pollCount = 0\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get queryCacheConfig(): LRUCache.Options<Address, Pending | ModuleQueryResult, unknown> {\n const queryCacheConfig: CacheConfig | undefined = this.config?.queryCache === true ? {} : this.config?.queryCache\n return { max: 100, ttl: 1000 * 60, ...queryCacheConfig }\n }\n\n get started() {\n return !!this._pollId\n }\n\n /**\n * A cache of queries that have been issued\n */\n protected get queryCache(): LRUCache<Address, Pending | ModuleQueryResult> {\n const config = this.queryCacheConfig\n const requiredConfig = { noUpdateTTL: false, ttlAutopurge: true }\n this._queryCache = this._queryCache ?? new LRUCache<Address, Pending | ModuleQueryResult>({ ...config, ...requiredConfig })\n return this._queryCache\n }\n\n listeningAddresses() {\n return this._queryCache?.keys()\n }\n\n async send(address: Address, query: QueryBoundWitness, payloads?: Payload[] | undefined): Promise<ModuleQueryResult> {\n //console.log('send')\n this.logger?.debug(`Begin issuing query to: ${address}`)\n const $meta = { ...query?.$meta, destination: [address] }\n const routedQuery = await PayloadBuilder.build({ ...query, $meta })\n //console.log('queryArchivist - calling')\n const queryArchivist = assertEx(\n await this.queriesArchivist(),\n () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n //console.log('queryArchivist')\n\n // TODO: Should we always re-hash to true up timestamps? We can't\n // re-sign correctly so we would lose that information if we did and\n // would also be replying to consumers with a different query hash than\n // they sent us (which might be OK since it reflect the chain of custody)\n // Revisit this once we have proxy module support as they are another\n // intermediary to consider.\n const routedQueryHash =\n // Trust the signed hash if it's there\n (routedQuery as WithMeta<QueryBoundWitness>)?.$hash ??\n // TODO: What is the right way to find the dataHash\n Object.keys(await PayloadBuilder.toDataHashMap([routedQuery]))[0]\n this.logger?.debug(`Issuing query: ${routedQueryHash} to: ${address}`)\n // If there was data associated with the query, add it to the insert\n const data = payloads ? [routedQuery, ...payloads] : [routedQuery]\n const insertResult = await queryArchivist.insert?.(data)\n this.logger?.debug(`Issued query: ${routedQueryHash} to: ${address}`)\n this.queryCache.set(routedQueryHash, Pending)\n if (!insertResult) throw new Error('Unable to issue query to queryArchivist')\n const context = new Promise<ModuleQueryResult>((resolve, reject) => {\n this.logger?.debug(`Polling for response to query: ${routedQueryHash}`)\n const pollForResponse = async () => {\n try {\n this.start()\n let response = this.queryCache.get(routedQueryHash)\n // Poll for response until cache key expires (response timed out)\n while (response !== undefined) {\n //console.log('polling...')\n // Wait a bit\n await delay(100)\n // Check the status of the response\n response = this.queryCache.get(routedQueryHash)\n // If status is no longer pending that means we received a response\n if (response && response !== Pending) {\n this.logger?.debug(`Returning response to query: ${routedQueryHash}`)\n resolve(response)\n return\n }\n }\n // If we got here waiting for a response timed out\n this.logger?.error('Timeout waiting for query response')\n // Resolve with error to match what a local module would do if it were to error\n // TODO: BW Builder/Sign result as this module?\n const error: ModuleError = {\n message: 'Timeout waiting for query response',\n query: 'network.xyo.boundwitness',\n schema: 'network.xyo.error.module',\n sources: [routedQueryHash],\n }\n reject(error)\n return\n } finally {\n this.stop()\n }\n }\n forget(pollForResponse())\n })\n return context\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingResponses()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for processing incoming responses to previously issued queries\n */\n private processIncomingResponses = async () => {\n const responseArchivist = await this.responsesArchivist()\n if (responseArchivist) {\n const responseBoundWitnessDiviner = await this.responsesDiviner()\n if (responseBoundWitnessDiviner) {\n const pendingCommands = [...this.queryCache.entries()].filter(([_, status]) => status === Pending)\n // TODO: Do in throttled batches\n await Promise.allSettled(\n pendingCommands.map(async ([sourceQuery, status]) => {\n if (status === Pending) {\n const divinerQuery: BoundWitnessDivinerQueryPayload = { schema: BoundWitnessDivinerQuerySchema, sourceQuery }\n const result = await responseBoundWitnessDiviner.divine([divinerQuery])\n if (result && result.length > 0) {\n const response = result.find(isBoundWitnessWithMeta)\n if (response && (response?.$meta as unknown as { sourceQuery: string })?.sourceQuery === sourceQuery) {\n this.logger?.debug(`Found response to query: ${sourceQuery}`)\n // Get any payloads associated with the response\n const payloads: PayloadWithMeta[] = response.payload_hashes?.length > 0 ? await responseArchivist.get(response.payload_hashes) : []\n this.queryCache.set(sourceQuery, [response, payloads, []])\n }\n }\n }\n }),\n )\n }\n }\n }\n\n private start() {\n if (this._pollCount === 0) {\n this.poll()\n }\n this._pollCount++\n }\n\n private stop() {\n this._pollCount--\n if (this._pollCount <= 0) {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this._pollCount = 0\n }\n }\n}\n","import { Address } from '@xylabs/hex'\nimport { Base, toJsonString } from '@xylabs/object'\nimport { ArchivistInstance, asArchivistInstance } from '@xyo-network/archivist-model'\nimport { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload } from '@xyo-network/diviner-boundwitness-model'\nimport { asDivinerInstance, DivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleConfig } from '@xyo-network/module-model'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusParams } from './model'\n\nexport class AsyncQueryBusBase<TParams extends AsyncQueryBusParams = AsyncQueryBusParams> extends Base<TParams> {\n protected _lastState?: LRUCache<Address, number>\n protected _targetConfigs: Record<Address, ModuleConfig> = {}\n protected _targetQueries: Record<Address, string[]> = {}\n\n private _lastQueriesArchivistAttempt?: number\n private _lastQueriesDivinerAttempt?: number\n private _lastResponsesArchivistAttempt?: number\n private _lastResponsesDivinerAttempt?: number\n private _queriesArchivist?: ArchivistInstance\n private _queriesArchivistMutex = new Mutex()\n private _queriesDiviner?: DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, QueryBoundWitness>\n private _queriesDivinerMutex = new Mutex()\n private _reResolveDelay = 50_000\n private _responsesArchivist?: ArchivistInstance\n private _responsesArchivistMutex = new Mutex()\n private _responsesDiviner?: DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, BoundWitness>\n private _responsesDivinerMutex = new Mutex()\n\n constructor(params: TParams) {\n super(params)\n }\n\n get config(): TParams['config'] {\n return this.params.config\n }\n\n get pollFrequencyConfig(): number {\n return this.config?.pollFrequency ?? 1000\n }\n\n get resolver() {\n return this.params.resolver\n }\n\n /**\n * A cache of the last offset of the Diviner process per address\n */\n protected get lastState(): LRUCache<Address, number> {\n const requiredConfig = { max: 1000, ttl: 0 }\n this._lastState = this._lastState ?? new LRUCache<Address, number>(requiredConfig)\n return this._lastState\n }\n\n async queriesArchivist() {\n return await this._queriesArchivistMutex.runExclusive(async () => {\n if (this._queriesArchivist) {\n return this._queriesArchivist\n }\n if (Date.now() - (this._lastQueriesArchivistAttempt ?? 0) < this._reResolveDelay) {\n return\n }\n this._lastQueriesArchivistAttempt = Date.now()\n const resolved = await this.resolver.resolve(this.config?.intersect?.queries?.archivist)\n if (resolved) {\n const typedResolve = asArchivistInstance(resolved)\n if (typedResolve) {\n return typedResolve\n } else {\n this.logger?.warn(\n `Unable to resolve queriesArchivist as correct type [${this.config?.intersect?.queries?.archivist}][${resolved?.constructor?.name}]: ${toJsonString(resolved)}`,\n )\n }\n } else {\n this.logger?.log(`Unable to resolve queriesArchivist [${this.config?.intersect?.queries?.archivist}]`)\n }\n })\n }\n\n async queriesDiviner() {\n return await this._queriesDivinerMutex.runExclusive(async () => {\n if (this._queriesDiviner) {\n return this._queriesDiviner\n }\n if (Date.now() - (this._lastQueriesDivinerAttempt ?? 0) < this._reResolveDelay) {\n return\n }\n this._lastQueriesDivinerAttempt = Date.now()\n const resolved = await this.resolver.resolve(this.config?.intersect?.queries?.boundWitnessDiviner)\n if (resolved) {\n const typedResolve = asDivinerInstance(resolved)\n if (typedResolve) {\n return typedResolve\n } else {\n this.logger?.warn(\n `Unable to resolve queriesDiviner as correct type [${this.config?.intersect?.queries?.boundWitnessDiviner}][${resolved?.constructor?.name}]: ${toJsonString(resolved)}`,\n )\n }\n } else {\n this.logger?.log(`Unable to resolve queriesDiviner [${this.config?.intersect?.queries?.boundWitnessDiviner}]`)\n }\n })\n }\n\n async responsesArchivist() {\n return await this._responsesArchivistMutex.runExclusive(async () => {\n if (this._responsesArchivist) {\n return this._responsesArchivist\n }\n if (Date.now() - (this._lastResponsesArchivistAttempt ?? 0) < this._reResolveDelay) {\n return\n }\n this._lastResponsesArchivistAttempt = Date.now()\n const resolved = await this.resolver.resolve(this.config?.intersect?.responses?.archivist)\n if (resolved) {\n const typedResolve = asArchivistInstance(resolved)\n if (typedResolve) {\n return typedResolve\n } else {\n this.logger?.warn(\n `Unable to resolve responseArchivist as correct type [${this.config?.intersect?.responses?.archivist}][${resolved?.constructor?.name}]: ${toJsonString(resolved)}`,\n )\n }\n } else {\n this.logger?.log(`Unable to resolve responseArchivist [${this.config?.intersect?.responses?.archivist}]`)\n }\n })\n }\n\n async responsesDiviner() {\n return await this._responsesDivinerMutex.runExclusive(async () => {\n if (this._responsesDiviner) {\n return this._responsesDiviner\n }\n if (Date.now() - (this._lastResponsesDivinerAttempt ?? 0) < this._reResolveDelay) {\n return\n }\n this._lastResponsesDivinerAttempt = Date.now()\n const resolved = await this.resolver.resolve(this.config?.intersect?.responses?.boundWitnessDiviner)\n if (resolved) {\n const typedResolve = asDivinerInstance(resolved)\n if (typedResolve) {\n return typedResolve\n } else {\n this.logger?.warn(\n `Unable to resolve responsesDiviner as correct type [${this.config?.intersect?.responses?.boundWitnessDiviner}][${resolved?.constructor?.name}]: ${toJsonString(resolved)}`,\n )\n }\n } else {\n this.logger?.log(`Unable to resolve responsesDiviner [${this.config?.intersect?.responses?.boundWitnessDiviner}]`)\n }\n })\n }\n\n /**\n * Commit the internal state of the process. This is similar\n * to a transaction completion in a database and should only be called\n * when results have been successfully persisted to the appropriate\n * external stores.\n * @param address The module address to commit the state for\n * @param nextState The state to commit\n */\n protected async commitState(address: Address, nextState: number) {\n await Promise.resolve()\n // TODO: Offload to Archivist/Diviner instead of in-memory\n const lastState = this.lastState.get(address)\n if (lastState && lastState >= nextState) return\n this.lastState.set(address, nextState)\n }\n\n /**\n * Retrieves the last state of the process. Used to recover state after\n * preemptions, reboots, etc.\n */\n protected async retrieveState(address: Address): Promise<number> {\n await Promise.resolve()\n const state = this.lastState.get(address)\n if (state === undefined) {\n // If this is a boot we can go back a bit in time\n // and begin processing recent commands\n const newState = Date.now() - 1000\n this.lastState.set(address, newState)\n return newState\n } else {\n return state\n }\n }\n}\n","export const Pending = 'pending' as const\nexport type Pending = typeof Pending\n","import { containsAll } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isQueryBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { asModuleInstance, ModuleConfigSchema, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Schema, WithMeta } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusHostParams } from './model'\n\nexport interface ExposeOptions {\n allowedQueries?: Schema[]\n failOnAlreadyExposed?: boolean\n required?: boolean\n}\n\nexport class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQueryBusHostParams> extends AsyncQueryBusBase<TParams> {\n protected _exposedAddresses = new Set<Address>()\n private _exposeOptions: Record<Address, ExposeOptions> = {}\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get exposedAddresses() {\n return this._exposedAddresses\n }\n\n get perAddressBatchQueryLimit(): number {\n return this.config?.perAddressBatchQueryLimit ?? 10\n }\n\n get started() {\n return !!this._pollId\n }\n\n async expose(id: ModuleIdentifier, options?: ExposeOptions) {\n const { failOnAlreadyExposed, required = true } = options ?? {}\n const module = asModuleInstance(await this.resolver.resolve(id, { maxDepth: 10 }))\n if (!module && required) {\n throw new Error(`Unable to resolve module to expose [${id}]`)\n }\n if (module) {\n assertEx(!failOnAlreadyExposed || !this._exposedAddresses.has(module.address), () => `Address already exposed: ${id} [${module.address}]`)\n this._exposedAddresses.add(module.address)\n this._exposeOptions[module.address] = { ...options }\n this.logger?.debug(`${id} exposed [${module.address}]`)\n return module\n }\n }\n\n async listeningModules(): Promise<ModuleInstance[]> {\n const exposedModules = [...(this.config?.listeningModules ?? []), ...this.exposedAddresses.values()]\n const mods = await Promise.all(\n exposedModules.map(async (exposedModule) =>\n assertEx(\n asModuleInstance(await this.resolver.resolve(exposedModule, { maxDepth: 10 })),\n () => `Unable to resolve listeningModule [${exposedModule}]`,\n ),\n ),\n )\n return mods\n }\n\n start() {\n if (this.started) {\n console.warn('AsyncQueryBus starting when already started')\n }\n this.poll()\n }\n\n stop() {\n if (!this.started) {\n console.warn('AsyncQueryBus stopping when already stopped')\n }\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n }\n\n async unexpose(id: ModuleIdentifier, validate = true) {\n const module = asModuleInstance(await this.resolver.resolve(id, { maxDepth: 10 }))\n if (module) {\n assertEx(!validate || this._exposedAddresses.has(module.address), () => `Address not exposed [${module.address}][${module.id}]`)\n this._exposedAddresses.delete(module.address)\n delete this._exposeOptions[module.address]\n this.logger?.debug(`${module.address} [${module.id}] unexposed`)\n }\n return module\n }\n\n protected callLocalModule = async (localModule: ModuleInstance, query: WithMeta<QueryBoundWitness>) => {\n const localModuleName = localModule.config.name ?? localModule.address\n const queryArchivist = assertEx(\n await this.queriesArchivist(),\n () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n const responsesArchivist = assertEx(\n await this.responsesArchivist(),\n () => `Unable to contact responsesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n const queryDestination = (query.$meta as { destination?: string[] })?.destination\n if (queryDestination && queryDestination?.includes(localModule.address)) {\n // Find the query\n const queryIndex = query.payload_hashes.indexOf(query.query)\n if (queryIndex !== -1) {\n const querySchema = query.payload_schemas[queryIndex]\n // If the destination can process this type of query\n if (localModule.queries.includes(querySchema)) {\n // Get the associated payloads\n const queryPayloads = await queryArchivist.get(query.payload_hashes)\n const queryPayloadsDict = await PayloadBuilder.toAllHashMap(queryPayloads)\n const queryHash = (await PayloadBuilder.build(query)).$hash\n // Check that we have all the arguments for the command\n if (!containsAll(Object.keys(queryPayloadsDict), query.payload_hashes)) {\n this.logger?.error(`Error processing command ${queryHash} for module ${localModuleName}, missing payloads`)\n return\n }\n try {\n // Issue the query against module\n const querySchema = queryPayloadsDict[query.query].schema\n this.logger?.debug(`Issuing query ${querySchema} (${queryHash}) addressed to module: ${localModuleName}`)\n const response = await localModule.query(query, queryPayloads, {\n allowedQueries: this._exposeOptions[localModule.address]?.allowedQueries,\n schema: ModuleConfigSchema,\n })\n const [bw, payloads, errors] = response\n this.logger?.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`)\n const insertResult = await responsesArchivist.insert([bw, ...payloads, ...errors])\n // NOTE: If all archivists support the contract that numPayloads inserted === numPayloads returned we can\n // do some deeper assertions here like lenIn === lenOut, but for now this should be good enough since BWs\n // should always be unique causing at least one insertion\n if (insertResult.length === 0) {\n this.logger?.error(`Error replying to query ${queryHash} addressed to module: ${localModuleName}`)\n }\n if (query?.timestamp) {\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to ensure we are using the timestamp of the store\n // so there's no chance of multiple commands at the same time\n await this.commitState(localModule.address, query.timestamp)\n }\n } catch (error) {\n this.logger?.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n console.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n }\n }\n }\n }\n }\n\n /**\n * Finds unprocessed commands addressed to the supplied address\n * @param address The address to find commands for\n */\n protected findQueriesToAddress = async (address: Address) => {\n const queryBoundWitnessDiviner = await this.queriesDiviner()\n if (queryBoundWitnessDiviner) {\n // Retrieve last offset from state store\n const timestamp = await this.retrieveState(address)\n const destination = [address]\n const limit = this.perAddressBatchQueryLimit\n // Filter for commands to us by destination address\n const divinerQuery = { destination, limit, schema: BoundWitnessDivinerQuerySchema, sort: 'asc', timestamp }\n const result = await queryBoundWitnessDiviner.divine([divinerQuery])\n const queries = result.filter(isQueryBoundWitnessWithMeta)\n const nextState = queries.length > 0 ? Math.max(...queries.map((c) => c.timestamp ?? 0)) + 1 : timestamp\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to use the timestamp of the store so there's no\n // chance of multiple commands at the same time\n await this.commitState(address, nextState)\n return queries\n } else {\n this.logger?.warn(`Unable to resolve queryBoundWitnessDiviner [${this.config?.intersect?.queries?.boundWitnessDiviner}]`)\n }\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingQueries()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for checking for inbound queries\n */\n private processIncomingQueries = async () => {\n this.logger?.debug('Checking for inbound queries')\n // Check for any queries that have been issued and have not been responded to\n const localModules = await this.listeningModules()\n\n // TODO: Do in throttled batches\n await Promise.allSettled(\n localModules.map(async (localModule) => {\n try {\n const localModuleName = localModule.config.name ?? localModule.address\n this.logger?.debug(`Checking for inbound queries to ${localModuleName} [${localModule.address}]`)\n const queries = (await this.findQueriesToAddress(localModule.address)) ?? []\n if (queries.length === 0) return\n this.logger?.debug(`Found queries addressed to local module: ${localModuleName}`)\n for (const query of queries) {\n await this.callLocalModule(localModule, query)\n }\n } catch (error) {\n this.logger?.error(`Error processing queries for address ${localModule.address}: ${error}`)\n }\n }),\n )\n }\n}\n","import { AbstractModuleHost, ModuleHostParams } from '../../AbstractModuleHost'\nimport { AsyncQueryBusHost } from '../AsyncQueryBusHost'\nimport { AsyncQueryBusHostConfig } from '../model'\n\nexport type AsyncQueryBusModuleHostParams = ModuleHostParams & {\n config: AsyncQueryBusHostConfig\n}\n\nexport class AsyncQueryBusModuleHost extends AbstractModuleHost<AsyncQueryBusModuleHostParams> {\n private _busHost?: AsyncQueryBusHost\n\n constructor(params: AsyncQueryBusModuleHostParams) {\n super(params)\n }\n\n override async start(): Promise<void> {\n const listeningModules =\n this.params.config.listeningModules ?? (await this.params.module.resolve('*', { direction: 'down' })).map((m) => m.address)\n this._busHost = new AsyncQueryBusHost({\n config: { ...this.params.config, listeningModules },\n logger: this.params.logger,\n resolver: this.params.module,\n })\n this._busHost?.start()\n }\n override stop() {\n this._busHost?.stop()\n }\n}\n","import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusClient } from '../AsyncQueryBusClient'\n\nexport type AsyncQueryBusModuleProxyParams = ModuleProxyParams & {\n busClient: AsyncQueryBusClient\n}\n\nexport class AsyncQueryBusModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<AsyncQueryBusModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<\n AsyncQueryBusModuleProxyParams,\n 'config'\n > & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements ModuleInstance<TParams, TWrappedModule['eventData']>\n{\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {\n return await this.params.busClient.send(this.address, query, payloads)\n }\n\n override async startHandler(): Promise<boolean> {\n return await super.startHandler()\n }\n}\n","export const PubSubBridgeSchema = 'network.xyo.bridge.pubsub'\nexport type PubSubBridgeSchema = typeof PubSubBridgeSchema\n","import { Address } from '@xylabs/hex'\nimport { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nimport { AsyncQueryBusClientConfig, AsyncQueryBusHostConfig } from './AsyncQueryBus'\nimport { PubSubBridgeSchema } from './Schema'\n\nexport const PubSubBridgeConfigSchema = `${PubSubBridgeSchema}.config`\nexport type PubSubBridgeConfigSchema = typeof PubSubBridgeConfigSchema\n\n/**\n * Configuration for the PubSubBridge\n */\nexport type PubSubBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n client?: AsyncQueryBusClientConfig\n host?: AsyncQueryBusHostConfig\n roots?: Address[]\n } & TConfig,\n TSchema extends string ? TSchema : PubSubBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { creatableModule, ModuleIdentifier, ModuleInstance, ModuleResolverInstance } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusClient, AsyncQueryBusHost } from './AsyncQueryBus'\nimport { PubSubBridgeConfigSchema } from './Config'\nimport { PubSubBridgeParams } from './Params'\nimport { PubSubBridgeModuleResolver } from './PubSubBridgeModuleResolver'\n\nconst moduleName = 'PubSubBridge'\n\n@creatableModule()\nexport class PubSubBridge<TParams extends PubSubBridgeParams = PubSubBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams> {\n static override configSchemas = [PubSubBridgeConfigSchema]\n\n protected _configRootAddress: Address = ''\n protected _configStateStoreArchivist: string = ''\n protected _configStateStoreBoundWitnessDiviner: string = ''\n protected _exposedAddresses: Address[] = []\n protected _lastState?: LRUCache<string, number>\n\n private _busClient?: AsyncQueryBusClient\n private _busHost?: AsyncQueryBusHost\n private _resolver?: PubSubBridgeModuleResolver\n\n override get resolver(): ModuleResolverInstance {\n this._resolver =\n this._resolver ??\n new PubSubBridgeModuleResolver({\n bridge: this,\n busClient: assertEx(this.busClient(), () => 'busClient not configured'),\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n protected get moduleName() {\n return `${this.config.name ?? moduleName}`\n }\n\n protected get roots() {\n return assertEx(this.config.roots, () => 'roots not configured')\n }\n\n override async discoverRoots(): Promise<ModuleInstance[]> {\n const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve<ModuleInstance>(root)))).filter(exists)\n for (const instance of rootInstances) {\n this.downResolver.add(instance)\n }\n return rootInstances\n }\n\n async exposeHandler(id: ModuleIdentifier, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, direction = 'all', required = true } = options ?? {}\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n const module = await host.expose(id, { required })\n if (module) {\n const children = maxDepth > 0 ? await module.resolve('*', { direction, maxDepth, visibility: 'public' }) : []\n const exposedChildren = (\n await Promise.all(children.map((child) => this.exposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [module, ...exposedChildren]\n }\n return []\n }\n\n exposedHandler(): Address[] {\n const exposedSet = this.busHost()?.exposedAddresses\n return exposedSet ? [...exposedSet] : []\n }\n\n override async startHandler(): Promise<boolean> {\n this.busHost()?.start()\n return await super.startHandler()\n }\n\n async unexposeHandler(id: ModuleIdentifier, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, direction = 'all', required = true } = options ?? {}\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n const module = await host.unexpose(id, required)\n if (module) {\n const children = maxDepth > 0 ? await module.resolve('*', { direction, maxDepth, visibility: 'public' }) : []\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 [module, ...exposedChildren]\n }\n return []\n }\n\n protected busClient() {\n if (!this._busClient && this.config.client) {\n this._busClient = new AsyncQueryBusClient({\n config: this.config.client,\n logger: this.logger,\n resolver: this,\n })\n }\n return this._busClient\n }\n\n protected busHost() {\n if (!this._busHost && this.config.host) {\n this._busHost = new AsyncQueryBusHost({\n config: this.config.host,\n logger: this.logger,\n resolver: this,\n })\n }\n return this._busHost\n }\n\n protected override stopHandler(_timeout?: number | undefined) {\n this.busHost()?.stop()\n return true\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport { asModuleInstance, ModuleConfig, ModuleConfigSchema, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\n\nimport { AsyncQueryBusClient, AsyncQueryBusModuleProxy, AsyncQueryBusModuleProxyParams } from './AsyncQueryBus'\n\nexport interface PubSubBridgeModuleResolverParams extends BridgeModuleResolverParams {\n busClient: AsyncQueryBusClient\n}\n\nexport class PubSubBridgeModuleResolver extends AbstractBridgeModuleResolver<PubSubBridgeModuleResolverParams> {\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult) {\n return parentResult\n }\n const idParts = id.split(':')\n const firstPart = idParts.shift()\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const account = Account.randomSync()\n const params: AsyncQueryBusModuleProxyParams = {\n account,\n busClient: this.params.busClient,\n config: { schema: ModuleConfigSchema },\n host: this.params.bridge,\n moduleAddress: firstPart as Address,\n }\n const proxy = new AsyncQueryBusModuleProxy<T, AsyncQueryBusModuleProxyParams>(params)\n if (proxy) {\n const state = await proxy.state()\n if (state) {\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 }\n await proxy.start?.()\n const wrapped = wrapModuleWithType(proxy, account) as unknown as T\n const as = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(as)\n proxy.downResolver.add(as)\n this.add(as)\n return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : as\n }\n}\n"],"mappings":"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","names":["AbstractModuleHost","Base","import_lru_cache","import_object","AsyncQueryBusBase","Base","_lastState","_targetConfigs","_targetQueries","_lastQueriesArchivistAttempt","_lastQueriesDivinerAttempt","_lastResponsesArchivistAttempt","_lastResponsesDivinerAttempt","_queriesArchivist","_queriesArchivistMutex","Mutex","_queriesDiviner","_queriesDivinerMutex","_reResolveDelay","_responsesArchivist","_responsesArchivistMutex","_responsesDiviner","_responsesDivinerMutex","constructor","params","config","pollFrequencyConfig","pollFrequency","resolver","lastState","requiredConfig","max","ttl","LRUCache","queriesArchivist","runExclusive","Date","now","resolved","resolve","intersect","queries","archivist","typedResolve","asArchivistInstance","logger","warn","name","toJsonString","log","queriesDiviner","boundWitnessDiviner","asDivinerInstance","responsesArchivist","responses","responsesDiviner","commitState","address","nextState","Promise","get","set","retrieveState","state","undefined","newState","Pending","AsyncQueryBusClient","AsyncQueryBusBase","_queryCache","_pollCount","_pollId","constructor","params","queryCacheConfig","config","queryCache","max","ttl","started","requiredConfig","noUpdateTTL","ttlAutopurge","LRUCache","listeningAddresses","keys","send","address","query","payloads","logger","debug","$meta","destination","routedQuery","PayloadBuilder","build","queryArchivist","assertEx","queriesArchivist","intersect","queries","archivist","routedQueryHash","$hash","Object","toDataHashMap","data","insertResult","insert","set","Pending","Error","context","Promise","resolve","reject","pollForResponse","start","response","get","undefined","delay","error","message","schema","sources","stop","forget","poll","setTimeoutEx","processIncomingResponses","e","clearTimeoutEx","pollFrequencyConfig","responseArchivist","responsesArchivist","responseBoundWitnessDiviner","responsesDiviner","pendingCommands","entries","filter","_","status","allSettled","map","sourceQuery","divinerQuery","BoundWitnessDivinerQuerySchema","result","divine","length","find","isBoundWitnessWithMeta","payload_hashes","import_assert","import_timer","import_boundwitness_model","import_diviner_boundwitness_model","import_payload_builder","AsyncQueryBusHost","AsyncQueryBusBase","_exposedAddresses","Set","_exposeOptions","_pollId","constructor","params","exposedAddresses","perAddressBatchQueryLimit","config","started","expose","id","options","failOnAlreadyExposed","required","module","asModuleInstance","resolver","resolve","maxDepth","Error","assertEx","has","address","add","logger","debug","listeningModules","exposedModules","values","mods","Promise","all","map","exposedModule","start","console","warn","poll","stop","clearTimeoutEx","undefined","unexpose","validate","delete","callLocalModule","localModule","query","localModuleName","name","queryArchivist","queriesArchivist","intersect","queries","archivist","responsesArchivist","queryDestination","$meta","destination","includes","queryIndex","payload_hashes","indexOf","querySchema","payload_schemas","queryPayloads","get","queryPayloadsDict","PayloadBuilder","toAllHashMap","queryHash","build","$hash","containsAll","Object","keys","error","schema","response","allowedQueries","ModuleConfigSchema","bw","payloads","errors","insertResult","insert","length","timestamp","commitState","findQueriesToAddress","queryBoundWitnessDiviner","queriesDiviner","retrieveState","limit","divinerQuery","BoundWitnessDivinerQuerySchema","sort","result","divine","filter","isQueryBoundWitnessWithMeta","nextState","Math","max","c","boundWitnessDiviner","setTimeoutEx","processIncomingQueries","e","pollFrequencyConfig","localModules","allSettled","AsyncQueryBusModuleHost","AbstractModuleHost","_busHost","constructor","params","start","listeningModules","config","module","resolve","direction","map","m","address","AsyncQueryBusHost","logger","resolver","stop","AsyncQueryBusModuleProxy","AbstractModuleProxy","proxyQueryHandler","query","payloads","params","busClient","send","address","startHandler","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","import_assert","import_abstract_bridge","import_module_model","import_assert","import_abstract_bridge","import_module_model","PubSubBridgeModuleResolver","AbstractBridgeModuleResolver","resolveHandler","id","options","parentResult","idParts","split","firstPart","shift","assertEx","isAddress","remainderParts","join","account","Account","randomSync","params","busClient","config","schema","ModuleConfigSchema","host","bridge","moduleAddress","proxy","AsyncQueryBusModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","as","asModuleInstance","upResolver","add","downResolver","length","resolve","moduleName","PubSubBridge","AbstractBridge","configSchemas","PubSubBridgeConfigSchema","_configRootAddress","_configStateStoreArchivist","_configStateStoreBoundWitnessDiviner","_exposedAddresses","_lastState","_busClient","_busHost","_resolver","resolver","PubSubBridgeModuleResolver","bridge","busClient","assertEx","wrapperAccount","account","config","name","roots","discoverRoots","rootInstances","Promise","all","map","root","resolve","filter","exists","instance","downResolver","add","exposeHandler","id","options","maxDepth","direction","required","host","busHost","module","expose","children","visibility","exposedChildren","child","address","flat","exposedHandler","exposedSet","exposedAddresses","startHandler","start","unexposeHandler","unexpose","client","AsyncQueryBusClient","logger","AsyncQueryBusHost","stopHandler","_timeout","stop","creatableModule"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/AbstractModuleHost/AbstractModuleHost.ts","../../src/AsyncQueryBus/AsyncQueryBusClient.ts","../../src/AsyncQueryBus/AsyncQueryBusBase.ts","../../src/AsyncQueryBus/model/QueryStatus.ts","../../src/AsyncQueryBus/AsyncQueryBusHost.ts","../../src/AsyncQueryBus/ModuleHost/ModuleHost.ts","../../src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts","../../src/Schema.ts","../../src/Config.ts","../../src/PubSubBridge.ts","../../src/PubSubBridgeModuleResolver.ts"],"sourcesContent":["export * from './AbstractModuleHost'\nexport * from './AsyncQueryBus'\nexport * from './Config'\nexport * from './Params'\nexport * from './PubSubBridge'\nexport * from './PubSubBridgeModuleResolver'\nexport * from './Schema'\n","import { Base, BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { ModuleInstance } from '@xyo-network/module-model'\n\nexport type ModuleHostParams<THostedInstance extends ModuleInstance = ModuleInstance> = BaseParams<{\n module: THostedInstance\n}>\n\nexport abstract class AbstractModuleHost<TParams extends ModuleHostParams = ModuleHostParams> extends Base<TParams> {\n abstract start(): Promisable<void>\n abstract stop(): Promisable<void>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { CacheConfig, ModuleQueryResult } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { ModuleError, Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusClientParams, Pending } from './model'\n\nexport class AsyncQueryBusClient<TParams extends AsyncQueryBusClientParams = AsyncQueryBusClientParams> extends AsyncQueryBusBase<TParams> {\n protected _queryCache?: LRUCache<Address, Pending | ModuleQueryResult>\n private _pollCount = 0\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get queryCacheConfig(): LRUCache.Options<Address, Pending | ModuleQueryResult, unknown> {\n const queryCacheConfig: CacheConfig | undefined = this.config?.queryCache === true ? {} : this.config?.queryCache\n return { max: 100, ttl: 1000 * 60, ...queryCacheConfig }\n }\n\n get started() {\n return !!this._pollId\n }\n\n /**\n * A cache of queries that have been issued\n */\n protected get queryCache(): LRUCache<Address, Pending | ModuleQueryResult> {\n const config = this.queryCacheConfig\n const requiredConfig = { noUpdateTTL: false, ttlAutopurge: true }\n this._queryCache = this._queryCache ?? new LRUCache<Address, Pending | ModuleQueryResult>({ ...config, ...requiredConfig })\n return this._queryCache\n }\n\n listeningAddresses() {\n return this._queryCache?.keys()\n }\n\n async send(address: Address, query: QueryBoundWitness, payloads?: Payload[] | undefined): Promise<ModuleQueryResult> {\n //console.log('send')\n this.logger?.debug(`Begin issuing query to: ${address}`)\n const $meta = { ...query?.$meta, destination: [address] }\n const routedQuery = await PayloadBuilder.build({ ...query, $meta })\n //console.log('queryArchivist - calling')\n const queryArchivist = assertEx(\n await this.queriesArchivist(),\n () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n //console.log('queryArchivist')\n\n // TODO: Should we always re-hash to true up timestamps? We can't\n // re-sign correctly so we would lose that information if we did and\n // would also be replying to consumers with a different query hash than\n // they sent us (which might be OK since it reflect the chain of custody)\n // Revisit this once we have proxy module support as they are another\n // intermediary to consider.\n const routedQueryHash =\n // Trust the signed hash if it's there\n (routedQuery as WithMeta<QueryBoundWitness>)?.$hash ??\n // TODO: What is the right way to find the dataHash\n Object.keys(await PayloadBuilder.toDataHashMap([routedQuery]))[0]\n this.logger?.debug(`Issuing query: ${routedQueryHash} to: ${address}`)\n // If there was data associated with the query, add it to the insert\n const data = payloads ? [routedQuery, ...payloads] : [routedQuery]\n const insertResult = await queryArchivist.insert?.(data)\n this.logger?.debug(`Issued query: ${routedQueryHash} to: ${address}`)\n this.queryCache.set(routedQueryHash, Pending)\n if (!insertResult) throw new Error('Unable to issue query to queryArchivist')\n const context = new Promise<ModuleQueryResult>((resolve, reject) => {\n this.logger?.debug(`Polling for response to query: ${routedQueryHash}`)\n const pollForResponse = async () => {\n try {\n this.start()\n let response = this.queryCache.get(routedQueryHash)\n // Poll for response until cache key expires (response timed out)\n while (response !== undefined) {\n //console.log('polling...')\n // Wait a bit\n await delay(100)\n // Check the status of the response\n response = this.queryCache.get(routedQueryHash)\n // If status is no longer pending that means we received a response\n if (response && response !== Pending) {\n this.logger?.debug(`Returning response to query: ${routedQueryHash}`)\n resolve(response)\n return\n }\n }\n // If we got here waiting for a response timed out\n this.logger?.error('Timeout waiting for query response')\n // Resolve with error to match what a local module would do if it were to error\n // TODO: BW Builder/Sign result as this module?\n const error: ModuleError = {\n message: 'Timeout waiting for query response',\n query: 'network.xyo.boundwitness',\n schema: 'network.xyo.error.module',\n sources: [routedQueryHash],\n }\n reject(error)\n return\n } finally {\n this.stop()\n }\n }\n forget(pollForResponse())\n })\n return context\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingResponses()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for processing incoming responses to previously issued queries\n */\n private processIncomingResponses = async () => {\n const responseArchivist = await this.responsesArchivist()\n if (responseArchivist) {\n const responseBoundWitnessDiviner = await this.responsesDiviner()\n if (responseBoundWitnessDiviner) {\n const pendingCommands = [...this.queryCache.entries()].filter(([_, status]) => status === Pending)\n // TODO: Do in throttled batches\n await Promise.allSettled(\n pendingCommands.map(async ([sourceQuery, status]) => {\n if (status === Pending) {\n const divinerQuery: BoundWitnessDivinerQueryPayload = { schema: BoundWitnessDivinerQuerySchema, sourceQuery }\n const result = await responseBoundWitnessDiviner.divine([divinerQuery])\n if (result && result.length > 0) {\n const response = result.find(isBoundWitnessWithMeta)\n if (response && (response?.$meta as unknown as { sourceQuery: string })?.sourceQuery === sourceQuery) {\n this.logger?.debug(`Found response to query: ${sourceQuery}`)\n // Get any payloads associated with the response\n const payloads: PayloadWithMeta[] = response.payload_hashes?.length > 0 ? await responseArchivist.get(response.payload_hashes) : []\n this.queryCache.set(sourceQuery, [response, payloads, []])\n }\n }\n }\n }),\n )\n }\n }\n }\n\n private start() {\n if (this._pollCount === 0) {\n this.poll()\n }\n this._pollCount++\n }\n\n private stop() {\n this._pollCount--\n if (this._pollCount <= 0) {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this._pollCount = 0\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Base, TypeCheck } from '@xylabs/object'\nimport { ArchivistInstance, isArchivistInstance } from '@xyo-network/archivist-model'\nimport { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload } from '@xyo-network/diviner-boundwitness-model'\nimport { DivinerInstance, isDivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleConfig, ModuleIdentifier, ModuleInstance, traceModuleIdentifier } from '@xyo-network/module-model'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusParams } from './model'\n\nexport class AsyncQueryBusBase<TParams extends AsyncQueryBusParams = AsyncQueryBusParams> extends Base<TParams> {\n protected _lastState?: LRUCache<Address, number>\n protected _targetConfigs: Record<Address, ModuleConfig> = {}\n protected _targetQueries: Record<Address, string[]> = {}\n\n private _lastResolveAttempt: Record<ModuleIdentifier, number> = {}\n private _queriesArchivist?: ArchivistInstance\n private _queriesDiviner?: DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, QueryBoundWitness>\n private _reResolveDelay = 1000 * 5 //5 seconds\n private _resolveMutex = new Mutex()\n private _responsesArchivist?: ArchivistInstance\n private _responsesDiviner?: DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, BoundWitness>\n\n constructor(params: TParams) {\n super(params)\n }\n\n get config(): TParams['config'] {\n return this.params.config\n }\n\n get pollFrequencyConfig(): number {\n return this.config?.pollFrequency ?? 1000\n }\n\n get resolver() {\n return this.params.resolver\n }\n\n /**\n * A cache of the last offset of the Diviner process per address\n */\n protected get lastState(): LRUCache<Address, number> {\n const requiredConfig = { max: 1000, ttl: 0 }\n this._lastState = this._lastState ?? new LRUCache<Address, number>(requiredConfig)\n return this._lastState\n }\n\n async queriesArchivist() {\n this._queriesArchivist =\n this._queriesArchivist ??\n (await this.resolve(\n assertEx(this.config?.intersect?.queries?.archivist, () => 'No queries Archivist defined'),\n isArchivistInstance,\n ))\n return this._queriesArchivist\n }\n\n async queriesDiviner() {\n this._queriesDiviner =\n this._queriesDiviner ??\n ((await this.resolve(\n assertEx(this.config?.intersect?.queries?.boundWitnessDiviner, () => 'No queries Diviner defined'),\n isDivinerInstance,\n )) as DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, QueryBoundWitness>)\n return this._queriesDiviner\n }\n\n async responsesArchivist() {\n this._responsesArchivist =\n this._responsesArchivist ??\n (await this.resolve(\n assertEx(this.config?.intersect?.responses?.archivist, () => 'No responses Archivist defined'),\n isArchivistInstance,\n ))\n return this._responsesArchivist\n }\n\n async responsesDiviner() {\n this._responsesDiviner =\n this._responsesDiviner ??\n ((await this.resolve(\n assertEx(this.config?.intersect?.responses?.boundWitnessDiviner, () => 'No responses Diviner defined'),\n isDivinerInstance,\n )) as DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, BoundWitness>)\n return this._responsesDiviner\n }\n\n /**\n * Commit the internal state of the process. This is similar\n * to a transaction completion in a database and should only be called\n * when results have been successfully persisted to the appropriate\n * external stores.\n * @param address The module address to commit the state for\n * @param nextState The state to commit\n */\n protected async commitState(address: Address, nextState: number) {\n await Promise.resolve()\n // TODO: Offload to Archivist/Diviner instead of in-memory\n const lastState = this.lastState.get(address)\n if (lastState && lastState >= nextState) return\n this.lastState.set(address, nextState)\n }\n\n /**\n * Retrieves the last state of the process. Used to recover state after\n * preemptions, reboots, etc.\n */\n protected async retrieveState(address: Address): Promise<number> {\n await Promise.resolve()\n const state = this.lastState.get(address)\n if (state === undefined) {\n // If this is a boot we can go back a bit in time\n // and begin processing recent commands\n const newState = Date.now() - 1000\n this.lastState.set(address, newState)\n return newState\n } else {\n return state\n }\n }\n\n private async resolve<T extends ModuleInstance>(id: ModuleIdentifier, typeCheck: TypeCheck<T>): Promise<T | undefined> {\n return (await this._resolveMutex.runExclusive(async () => {\n if (this._queriesArchivist) {\n return this._queriesArchivist\n }\n if (Date.now() - (this._lastResolveAttempt[id] ?? 0) < this._reResolveDelay) {\n return\n }\n this._lastResolveAttempt[id] = Date.now()\n const resolved = await this.resolver.resolve(id)\n if (resolved) {\n if (typeCheck(resolved)) {\n return resolved\n } else {\n this.logger?.warn(`Unable to resolve responsesDiviner as correct type [${id}][${resolved?.constructor?.name}]: ${resolved.id}`)\n }\n } else {\n this.logger?.log(`Unable to resolve queriesArchivist [${id}] [${await traceModuleIdentifier(this.resolver, id)}]`)\n }\n })) as T | undefined\n }\n}\n","export const Pending = 'pending' as const\nexport type Pending = typeof Pending\n","import { containsAll } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isQueryBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { asModuleInstance, ModuleConfigSchema, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Schema, WithMeta } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusHostParams } from './model'\n\nexport interface ExposeOptions {\n allowedQueries?: Schema[]\n failOnAlreadyExposed?: boolean\n required?: boolean\n}\n\nexport class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQueryBusHostParams> extends AsyncQueryBusBase<TParams> {\n protected _exposedAddresses = new Set<Address>()\n private _exposeOptions: Record<Address, ExposeOptions> = {}\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get exposedAddresses() {\n return this._exposedAddresses\n }\n\n get perAddressBatchQueryLimit(): number {\n return this.config?.perAddressBatchQueryLimit ?? 10\n }\n\n get started() {\n return !!this._pollId\n }\n\n async expose(id: ModuleIdentifier, options?: ExposeOptions) {\n const { failOnAlreadyExposed, required = true } = options ?? {}\n const module = asModuleInstance(await this.resolver.resolve(id, { maxDepth: 10 }))\n if (!module && required) {\n throw new Error(`Unable to resolve module to expose [${id}]`)\n }\n if (module) {\n assertEx(!failOnAlreadyExposed || !this._exposedAddresses.has(module.address), () => `Address already exposed: ${id} [${module.address}]`)\n this._exposedAddresses.add(module.address)\n this._exposeOptions[module.address] = { ...options }\n this.logger?.debug(`${id} exposed [${module.address}]`)\n return module\n }\n }\n\n async listeningModules(): Promise<ModuleInstance[]> {\n const exposedModules = [...(this.config?.listeningModules ?? []), ...this.exposedAddresses.values()]\n const mods = await Promise.all(\n exposedModules.map(async (exposedModule) =>\n assertEx(\n asModuleInstance(await this.resolver.resolve(exposedModule, { maxDepth: 10 })),\n () => `Unable to resolve listeningModule [${exposedModule}]`,\n ),\n ),\n )\n return mods\n }\n\n start() {\n if (this.started) {\n console.warn('AsyncQueryBus starting when already started')\n }\n this.poll()\n }\n\n stop() {\n if (!this.started) {\n console.warn('AsyncQueryBus stopping when already stopped')\n }\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n }\n\n async unexpose(id: ModuleIdentifier, validate = true) {\n const module = asModuleInstance(await this.resolver.resolve(id, { maxDepth: 10 }))\n if (module) {\n assertEx(!validate || this._exposedAddresses.has(module.address), () => `Address not exposed [${module.address}][${module.id}]`)\n this._exposedAddresses.delete(module.address)\n delete this._exposeOptions[module.address]\n this.logger?.debug(`${module.address} [${module.id}] unexposed`)\n }\n return module\n }\n\n protected callLocalModule = async (localModule: ModuleInstance, query: WithMeta<QueryBoundWitness>) => {\n const localModuleName = localModule.config.name ?? localModule.address\n const queryArchivist = assertEx(\n await this.queriesArchivist(),\n () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n const responsesArchivist = assertEx(\n await this.responsesArchivist(),\n () => `Unable to contact responsesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n const queryDestination = (query.$meta as { destination?: string[] })?.destination\n if (queryDestination && queryDestination?.includes(localModule.address)) {\n // Find the query\n const queryIndex = query.payload_hashes.indexOf(query.query)\n if (queryIndex !== -1) {\n const querySchema = query.payload_schemas[queryIndex]\n // If the destination can process this type of query\n if (localModule.queries.includes(querySchema)) {\n // Get the associated payloads\n const queryPayloads = await queryArchivist.get(query.payload_hashes)\n const queryPayloadsDict = await PayloadBuilder.toAllHashMap(queryPayloads)\n const queryHash = (await PayloadBuilder.build(query)).$hash\n // Check that we have all the arguments for the command\n if (!containsAll(Object.keys(queryPayloadsDict), query.payload_hashes)) {\n this.logger?.error(`Error processing command ${queryHash} for module ${localModuleName}, missing payloads`)\n return\n }\n try {\n // Issue the query against module\n const querySchema = queryPayloadsDict[query.query].schema\n this.logger?.debug(`Issuing query ${querySchema} (${queryHash}) addressed to module: ${localModuleName}`)\n const response = await localModule.query(query, queryPayloads, {\n allowedQueries: this._exposeOptions[localModule.address]?.allowedQueries,\n schema: ModuleConfigSchema,\n })\n const [bw, payloads, errors] = response\n this.logger?.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`)\n const insertResult = await responsesArchivist.insert([bw, ...payloads, ...errors])\n // NOTE: If all archivists support the contract that numPayloads inserted === numPayloads returned we can\n // do some deeper assertions here like lenIn === lenOut, but for now this should be good enough since BWs\n // should always be unique causing at least one insertion\n if (insertResult.length === 0) {\n this.logger?.error(`Error replying to query ${queryHash} addressed to module: ${localModuleName}`)\n }\n if (query?.timestamp) {\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to ensure we are using the timestamp of the store\n // so there's no chance of multiple commands at the same time\n await this.commitState(localModule.address, query.timestamp)\n }\n } catch (error) {\n this.logger?.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n console.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n }\n }\n }\n }\n }\n\n /**\n * Finds unprocessed commands addressed to the supplied address\n * @param address The address to find commands for\n */\n protected findQueriesToAddress = async (address: Address) => {\n const queryBoundWitnessDiviner = await this.queriesDiviner()\n if (queryBoundWitnessDiviner) {\n // Retrieve last offset from state store\n const timestamp = await this.retrieveState(address)\n const destination = [address]\n const limit = this.perAddressBatchQueryLimit\n // Filter for commands to us by destination address\n const divinerQuery = { destination, limit, schema: BoundWitnessDivinerQuerySchema, sort: 'asc', timestamp }\n const result = await queryBoundWitnessDiviner.divine([divinerQuery])\n const queries = result.filter(isQueryBoundWitnessWithMeta)\n const nextState = queries.length > 0 ? Math.max(...queries.map((c) => c.timestamp ?? 0)) + 1 : timestamp\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to use the timestamp of the store so there's no\n // chance of multiple commands at the same time\n await this.commitState(address, nextState)\n return queries\n } else {\n this.logger?.warn(`Unable to resolve queryBoundWitnessDiviner [${this.config?.intersect?.queries?.boundWitnessDiviner}]`)\n }\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingQueries()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for checking for inbound queries\n */\n private processIncomingQueries = async () => {\n this.logger?.debug('Checking for inbound queries')\n // Check for any queries that have been issued and have not been responded to\n const localModules = await this.listeningModules()\n\n // TODO: Do in throttled batches\n await Promise.allSettled(\n localModules.map(async (localModule) => {\n try {\n const localModuleName = localModule.config.name ?? localModule.address\n this.logger?.debug(`Checking for inbound queries to ${localModuleName} [${localModule.address}]`)\n const queries = (await this.findQueriesToAddress(localModule.address)) ?? []\n if (queries.length === 0) return\n this.logger?.debug(`Found queries addressed to local module: ${localModuleName}`)\n for (const query of queries) {\n await this.callLocalModule(localModule, query)\n }\n } catch (error) {\n this.logger?.error(`Error processing queries for address ${localModule.address}: ${error}`)\n }\n }),\n )\n }\n}\n","import { AbstractModuleHost, ModuleHostParams } from '../../AbstractModuleHost'\nimport { AsyncQueryBusHost } from '../AsyncQueryBusHost'\nimport { AsyncQueryBusHostConfig } from '../model'\n\nexport type AsyncQueryBusModuleHostParams = ModuleHostParams & {\n config: AsyncQueryBusHostConfig\n}\n\nexport class AsyncQueryBusModuleHost extends AbstractModuleHost<AsyncQueryBusModuleHostParams> {\n private _busHost?: AsyncQueryBusHost\n\n constructor(params: AsyncQueryBusModuleHostParams) {\n super(params)\n }\n\n override async start(): Promise<void> {\n const listeningModules =\n this.params.config.listeningModules ?? (await this.params.module.resolve('*', { direction: 'down' })).map((m) => m.address)\n this._busHost = new AsyncQueryBusHost({\n config: { ...this.params.config, listeningModules },\n logger: this.params.logger,\n resolver: this.params.module,\n })\n this._busHost?.start()\n }\n override stop() {\n this._busHost?.stop()\n }\n}\n","import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusClient } from '../AsyncQueryBusClient'\n\nexport type AsyncQueryBusModuleProxyParams = ModuleProxyParams & {\n busClient: AsyncQueryBusClient\n}\n\nexport class AsyncQueryBusModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<AsyncQueryBusModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<\n AsyncQueryBusModuleProxyParams,\n 'config'\n > & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements ModuleInstance<TParams, TWrappedModule['eventData']>\n{\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {\n return await this.params.busClient.send(this.address, query, payloads)\n }\n\n override async startHandler(): Promise<boolean> {\n return await super.startHandler()\n }\n}\n","export const PubSubBridgeSchema = 'network.xyo.bridge.pubsub'\nexport type PubSubBridgeSchema = typeof PubSubBridgeSchema\n","import { Address } from '@xylabs/hex'\nimport { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nimport { AsyncQueryBusClientConfig, AsyncQueryBusHostConfig } from './AsyncQueryBus'\nimport { PubSubBridgeSchema } from './Schema'\n\nexport const PubSubBridgeConfigSchema = `${PubSubBridgeSchema}.config`\nexport type PubSubBridgeConfigSchema = typeof PubSubBridgeConfigSchema\n\n/**\n * Configuration for the PubSubBridge\n */\nexport type PubSubBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n client?: AsyncQueryBusClientConfig\n host?: AsyncQueryBusHostConfig\n roots?: Address[]\n } & TConfig,\n TSchema extends string ? TSchema : PubSubBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { creatableModule, ModuleIdentifier, ModuleInstance, ModuleResolverInstance } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusClient, AsyncQueryBusHost } from './AsyncQueryBus'\nimport { PubSubBridgeConfigSchema } from './Config'\nimport { PubSubBridgeParams } from './Params'\nimport { PubSubBridgeModuleResolver } from './PubSubBridgeModuleResolver'\n\nconst moduleName = 'PubSubBridge'\n\n@creatableModule()\nexport class PubSubBridge<TParams extends PubSubBridgeParams = PubSubBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams> {\n static override configSchemas = [PubSubBridgeConfigSchema]\n\n protected _configRootAddress: Address = ''\n protected _configStateStoreArchivist: string = ''\n protected _configStateStoreBoundWitnessDiviner: string = ''\n protected _exposedAddresses: Address[] = []\n protected _lastState?: LRUCache<string, number>\n\n private _busClient?: AsyncQueryBusClient\n private _busHost?: AsyncQueryBusHost\n private _resolver?: PubSubBridgeModuleResolver\n\n override get resolver(): ModuleResolverInstance {\n this._resolver =\n this._resolver ??\n new PubSubBridgeModuleResolver({\n bridge: this,\n busClient: assertEx(this.busClient(), () => 'busClient not configured'),\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n protected get moduleName() {\n return `${this.config.name ?? moduleName}`\n }\n\n protected get roots() {\n return assertEx(this.config.roots, () => 'roots not configured')\n }\n\n override async discoverRoots(): Promise<ModuleInstance[]> {\n const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve<ModuleInstance>(root)))).filter(exists)\n for (const instance of rootInstances) {\n this.downResolver.add(instance)\n }\n return rootInstances\n }\n\n async exposeHandler(id: ModuleIdentifier, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, direction = 'all', required = true } = options ?? {}\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n const module = await host.expose(id, { required })\n if (module) {\n const children = maxDepth > 0 ? await module.resolve('*', { direction, maxDepth, visibility: 'public' }) : []\n const exposedChildren = (\n await Promise.all(children.map((child) => this.exposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [module, ...exposedChildren]\n }\n return []\n }\n\n exposedHandler(): Address[] {\n const exposedSet = this.busHost()?.exposedAddresses\n return exposedSet ? [...exposedSet] : []\n }\n\n override async startHandler(): Promise<boolean> {\n this.busHost()?.start()\n return await super.startHandler()\n }\n\n async unexposeHandler(id: ModuleIdentifier, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, direction = 'all', required = true } = options ?? {}\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n const module = await host.unexpose(id, required)\n if (module) {\n const children = maxDepth > 0 ? await module.resolve('*', { direction, maxDepth, visibility: 'public' }) : []\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 [module, ...exposedChildren]\n }\n return []\n }\n\n protected busClient() {\n if (!this._busClient && this.config.client) {\n this._busClient = new AsyncQueryBusClient({\n config: this.config.client,\n logger: this.logger,\n resolver: this,\n })\n }\n return this._busClient\n }\n\n protected busHost() {\n if (!this._busHost && this.config.host) {\n this._busHost = new AsyncQueryBusHost({\n config: this.config.host,\n logger: this.logger,\n resolver: this,\n })\n }\n return this._busHost\n }\n\n protected override stopHandler(_timeout?: number | undefined) {\n this.busHost()?.stop()\n return true\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport { asModuleInstance, ModuleConfig, ModuleConfigSchema, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\n\nimport { AsyncQueryBusClient, AsyncQueryBusModuleProxy, AsyncQueryBusModuleProxyParams } from './AsyncQueryBus'\n\nexport interface PubSubBridgeModuleResolverParams extends BridgeModuleResolverParams {\n busClient: AsyncQueryBusClient\n}\n\nexport class PubSubBridgeModuleResolver extends AbstractBridgeModuleResolver<PubSubBridgeModuleResolverParams> {\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult) {\n return parentResult\n }\n const idParts = id.split(':')\n const firstPart = idParts.shift()\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const account = Account.randomSync()\n const params: AsyncQueryBusModuleProxyParams = {\n account,\n busClient: this.params.busClient,\n config: { schema: ModuleConfigSchema },\n host: this.params.bridge,\n moduleAddress: firstPart as Address,\n }\n const proxy = new AsyncQueryBusModuleProxy<T, AsyncQueryBusModuleProxyParams>(params)\n if (proxy) {\n const state = await proxy.state()\n if (state) {\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 }\n await proxy.start?.()\n const wrapped = wrapModuleWithType(proxy, account) as unknown as T\n const as = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(as)\n proxy.downResolver.add(as)\n this.add(as)\n return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : as\n }\n}\n"],"mappings":"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","names":["AbstractModuleHost","Base","import_assert","import_lru_cache","import_object","AsyncQueryBusBase","Base","_lastState","_targetConfigs","_targetQueries","_lastResolveAttempt","_queriesArchivist","_queriesDiviner","_reResolveDelay","_resolveMutex","Mutex","_responsesArchivist","_responsesDiviner","constructor","params","config","pollFrequencyConfig","pollFrequency","resolver","lastState","requiredConfig","max","ttl","LRUCache","queriesArchivist","resolve","assertEx","intersect","queries","archivist","isArchivistInstance","queriesDiviner","boundWitnessDiviner","isDivinerInstance","responsesArchivist","responses","responsesDiviner","commitState","address","nextState","Promise","get","set","retrieveState","state","undefined","newState","Date","now","id","typeCheck","runExclusive","resolved","logger","warn","name","log","traceModuleIdentifier","Pending","AsyncQueryBusClient","AsyncQueryBusBase","_queryCache","_pollCount","_pollId","constructor","params","queryCacheConfig","config","queryCache","max","ttl","started","requiredConfig","noUpdateTTL","ttlAutopurge","LRUCache","listeningAddresses","keys","send","address","query","payloads","logger","debug","$meta","destination","routedQuery","PayloadBuilder","build","queryArchivist","assertEx","queriesArchivist","intersect","queries","archivist","routedQueryHash","$hash","Object","toDataHashMap","data","insertResult","insert","set","Pending","Error","context","Promise","resolve","reject","pollForResponse","start","response","get","undefined","delay","error","message","schema","sources","stop","forget","poll","setTimeoutEx","processIncomingResponses","e","clearTimeoutEx","pollFrequencyConfig","responseArchivist","responsesArchivist","responseBoundWitnessDiviner","responsesDiviner","pendingCommands","entries","filter","_","status","allSettled","map","sourceQuery","divinerQuery","BoundWitnessDivinerQuerySchema","result","divine","length","find","isBoundWitnessWithMeta","payload_hashes","import_assert","import_timer","import_boundwitness_model","import_diviner_boundwitness_model","import_module_model","import_payload_builder","AsyncQueryBusHost","AsyncQueryBusBase","_exposedAddresses","Set","_exposeOptions","_pollId","constructor","params","exposedAddresses","perAddressBatchQueryLimit","config","started","expose","id","options","failOnAlreadyExposed","required","module","asModuleInstance","resolver","resolve","maxDepth","Error","assertEx","has","address","add","logger","debug","listeningModules","exposedModules","values","mods","Promise","all","map","exposedModule","start","console","warn","poll","stop","clearTimeoutEx","undefined","unexpose","validate","delete","callLocalModule","localModule","query","localModuleName","name","queryArchivist","queriesArchivist","intersect","queries","archivist","responsesArchivist","queryDestination","$meta","destination","includes","queryIndex","payload_hashes","indexOf","querySchema","payload_schemas","queryPayloads","get","queryPayloadsDict","PayloadBuilder","toAllHashMap","queryHash","build","$hash","containsAll","Object","keys","error","schema","response","allowedQueries","ModuleConfigSchema","bw","payloads","errors","insertResult","insert","length","timestamp","commitState","findQueriesToAddress","queryBoundWitnessDiviner","queriesDiviner","retrieveState","limit","divinerQuery","BoundWitnessDivinerQuerySchema","sort","result","divine","filter","isQueryBoundWitnessWithMeta","nextState","Math","max","c","boundWitnessDiviner","setTimeoutEx","processIncomingQueries","e","pollFrequencyConfig","localModules","allSettled","AsyncQueryBusModuleHost","AbstractModuleHost","_busHost","constructor","params","start","listeningModules","config","module","resolve","direction","map","m","address","AsyncQueryBusHost","logger","resolver","stop","AsyncQueryBusModuleProxy","AbstractModuleProxy","proxyQueryHandler","query","payloads","params","busClient","send","address","startHandler","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","import_assert","import_abstract_bridge","import_module_model","import_assert","import_abstract_bridge","import_module_model","PubSubBridgeModuleResolver","AbstractBridgeModuleResolver","resolveHandler","id","options","parentResult","idParts","split","firstPart","shift","assertEx","isAddress","remainderParts","join","account","Account","randomSync","params","busClient","config","schema","ModuleConfigSchema","host","bridge","moduleAddress","proxy","AsyncQueryBusModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","as","asModuleInstance","upResolver","add","downResolver","length","resolve","moduleName","PubSubBridge","AbstractBridge","configSchemas","PubSubBridgeConfigSchema","_configRootAddress","_configStateStoreArchivist","_configStateStoreBoundWitnessDiviner","_exposedAddresses","_lastState","_busClient","_busHost","_resolver","resolver","PubSubBridgeModuleResolver","bridge","busClient","assertEx","wrapperAccount","account","config","name","roots","discoverRoots","rootInstances","Promise","all","map","root","resolve","filter","exists","instance","downResolver","add","exposeHandler","id","options","maxDepth","direction","required","host","busHost","module","expose","children","visibility","exposedChildren","child","address","flat","exposedHandler","exposedSet","exposedAddresses","startHandler","start","unexposeHandler","unexpose","client","AsyncQueryBusClient","logger","AsyncQueryBusHost","stopHandler","_timeout","stop","creatableModule"]}
@@ -10,7 +10,7 @@ var AbstractModuleHost = class extends Base {
10
10
  };
11
11
 
12
12
  // src/AsyncQueryBus/AsyncQueryBusClient.ts
13
- import { assertEx } from "@xylabs/assert";
13
+ import { assertEx as assertEx2 } from "@xylabs/assert";
14
14
  import { delay } from "@xylabs/delay";
15
15
  import { forget } from "@xylabs/forget";
16
16
  import { clearTimeoutEx, setTimeoutEx } from "@xylabs/timer";
@@ -20,9 +20,11 @@ import { PayloadBuilder } from "@xyo-network/payload-builder";
20
20
  import { LRUCache as LRUCache2 } from "lru-cache";
21
21
 
22
22
  // src/AsyncQueryBus/AsyncQueryBusBase.ts
23
- import { Base as Base2, toJsonString } from "@xylabs/object";
24
- import { asArchivistInstance } from "@xyo-network/archivist-model";
25
- import { asDivinerInstance } from "@xyo-network/diviner-model";
23
+ import { assertEx } from "@xylabs/assert";
24
+ import { Base as Base2 } from "@xylabs/object";
25
+ import { isArchivistInstance } from "@xyo-network/archivist-model";
26
+ import { isDivinerInstance } from "@xyo-network/diviner-model";
27
+ import { traceModuleIdentifier } from "@xyo-network/module-model";
26
28
  import { Mutex } from "async-mutex";
27
29
  import { LRUCache } from "lru-cache";
28
30
  var AsyncQueryBusBase = class extends Base2 {
@@ -32,19 +34,13 @@ var AsyncQueryBusBase = class extends Base2 {
32
34
  _lastState;
33
35
  _targetConfigs = {};
34
36
  _targetQueries = {};
35
- _lastQueriesArchivistAttempt;
36
- _lastQueriesDivinerAttempt;
37
- _lastResponsesArchivistAttempt;
38
- _lastResponsesDivinerAttempt;
37
+ _lastResolveAttempt = {};
39
38
  _queriesArchivist;
40
- _queriesArchivistMutex = new Mutex();
41
39
  _queriesDiviner;
42
- _queriesDivinerMutex = new Mutex();
43
- _reResolveDelay = 5e4;
40
+ _reResolveDelay = 1e3 * 5;
41
+ _resolveMutex = new Mutex();
44
42
  _responsesArchivist;
45
- _responsesArchivistMutex = new Mutex();
46
43
  _responsesDiviner;
47
- _responsesDivinerMutex = new Mutex();
48
44
  constructor(params) {
49
45
  super(params);
50
46
  }
@@ -69,92 +65,20 @@ var AsyncQueryBusBase = class extends Base2 {
69
65
  return this._lastState;
70
66
  }
71
67
  async queriesArchivist() {
72
- return await this._queriesArchivistMutex.runExclusive(async () => {
73
- if (this._queriesArchivist) {
74
- return this._queriesArchivist;
75
- }
76
- if (Date.now() - (this._lastQueriesArchivistAttempt ?? 0) < this._reResolveDelay) {
77
- return;
78
- }
79
- this._lastQueriesArchivistAttempt = Date.now();
80
- const resolved = await this.resolver.resolve(this.config?.intersect?.queries?.archivist);
81
- if (resolved) {
82
- const typedResolve = asArchivistInstance(resolved);
83
- if (typedResolve) {
84
- return typedResolve;
85
- } else {
86
- this.logger?.warn(`Unable to resolve queriesArchivist as correct type [${this.config?.intersect?.queries?.archivist}][${resolved?.constructor?.name}]: ${toJsonString(resolved)}`);
87
- }
88
- } else {
89
- this.logger?.log(`Unable to resolve queriesArchivist [${this.config?.intersect?.queries?.archivist}]`);
90
- }
91
- });
68
+ this._queriesArchivist = this._queriesArchivist ?? await this.resolve(assertEx(this.config?.intersect?.queries?.archivist, () => "No queries Archivist defined"), isArchivistInstance);
69
+ return this._queriesArchivist;
92
70
  }
93
71
  async queriesDiviner() {
94
- return await this._queriesDivinerMutex.runExclusive(async () => {
95
- if (this._queriesDiviner) {
96
- return this._queriesDiviner;
97
- }
98
- if (Date.now() - (this._lastQueriesDivinerAttempt ?? 0) < this._reResolveDelay) {
99
- return;
100
- }
101
- this._lastQueriesDivinerAttempt = Date.now();
102
- const resolved = await this.resolver.resolve(this.config?.intersect?.queries?.boundWitnessDiviner);
103
- if (resolved) {
104
- const typedResolve = asDivinerInstance(resolved);
105
- if (typedResolve) {
106
- return typedResolve;
107
- } else {
108
- this.logger?.warn(`Unable to resolve queriesDiviner as correct type [${this.config?.intersect?.queries?.boundWitnessDiviner}][${resolved?.constructor?.name}]: ${toJsonString(resolved)}`);
109
- }
110
- } else {
111
- this.logger?.log(`Unable to resolve queriesDiviner [${this.config?.intersect?.queries?.boundWitnessDiviner}]`);
112
- }
113
- });
72
+ this._queriesDiviner = this._queriesDiviner ?? await this.resolve(assertEx(this.config?.intersect?.queries?.boundWitnessDiviner, () => "No queries Diviner defined"), isDivinerInstance);
73
+ return this._queriesDiviner;
114
74
  }
115
75
  async responsesArchivist() {
116
- return await this._responsesArchivistMutex.runExclusive(async () => {
117
- if (this._responsesArchivist) {
118
- return this._responsesArchivist;
119
- }
120
- if (Date.now() - (this._lastResponsesArchivistAttempt ?? 0) < this._reResolveDelay) {
121
- return;
122
- }
123
- this._lastResponsesArchivistAttempt = Date.now();
124
- const resolved = await this.resolver.resolve(this.config?.intersect?.responses?.archivist);
125
- if (resolved) {
126
- const typedResolve = asArchivistInstance(resolved);
127
- if (typedResolve) {
128
- return typedResolve;
129
- } else {
130
- this.logger?.warn(`Unable to resolve responseArchivist as correct type [${this.config?.intersect?.responses?.archivist}][${resolved?.constructor?.name}]: ${toJsonString(resolved)}`);
131
- }
132
- } else {
133
- this.logger?.log(`Unable to resolve responseArchivist [${this.config?.intersect?.responses?.archivist}]`);
134
- }
135
- });
76
+ this._responsesArchivist = this._responsesArchivist ?? await this.resolve(assertEx(this.config?.intersect?.responses?.archivist, () => "No responses Archivist defined"), isArchivistInstance);
77
+ return this._responsesArchivist;
136
78
  }
137
79
  async responsesDiviner() {
138
- return await this._responsesDivinerMutex.runExclusive(async () => {
139
- if (this._responsesDiviner) {
140
- return this._responsesDiviner;
141
- }
142
- if (Date.now() - (this._lastResponsesDivinerAttempt ?? 0) < this._reResolveDelay) {
143
- return;
144
- }
145
- this._lastResponsesDivinerAttempt = Date.now();
146
- const resolved = await this.resolver.resolve(this.config?.intersect?.responses?.boundWitnessDiviner);
147
- if (resolved) {
148
- const typedResolve = asDivinerInstance(resolved);
149
- if (typedResolve) {
150
- return typedResolve;
151
- } else {
152
- this.logger?.warn(`Unable to resolve responsesDiviner as correct type [${this.config?.intersect?.responses?.boundWitnessDiviner}][${resolved?.constructor?.name}]: ${toJsonString(resolved)}`);
153
- }
154
- } else {
155
- this.logger?.log(`Unable to resolve responsesDiviner [${this.config?.intersect?.responses?.boundWitnessDiviner}]`);
156
- }
157
- });
80
+ this._responsesDiviner = this._responsesDiviner ?? await this.resolve(assertEx(this.config?.intersect?.responses?.boundWitnessDiviner, () => "No responses Diviner defined"), isDivinerInstance);
81
+ return this._responsesDiviner;
158
82
  }
159
83
  /**
160
84
  * Commit the internal state of the process. This is similar
@@ -186,6 +110,27 @@ var AsyncQueryBusBase = class extends Base2 {
186
110
  return state;
187
111
  }
188
112
  }
113
+ async resolve(id, typeCheck) {
114
+ return await this._resolveMutex.runExclusive(async () => {
115
+ if (this._queriesArchivist) {
116
+ return this._queriesArchivist;
117
+ }
118
+ if (Date.now() - (this._lastResolveAttempt[id] ?? 0) < this._reResolveDelay) {
119
+ return;
120
+ }
121
+ this._lastResolveAttempt[id] = Date.now();
122
+ const resolved = await this.resolver.resolve(id);
123
+ if (resolved) {
124
+ if (typeCheck(resolved)) {
125
+ return resolved;
126
+ } else {
127
+ this.logger?.warn(`Unable to resolve responsesDiviner as correct type [${id}][${resolved?.constructor?.name}]: ${resolved.id}`);
128
+ }
129
+ } else {
130
+ this.logger?.log(`Unable to resolve queriesArchivist [${id}] [${await traceModuleIdentifier(this.resolver, id)}]`);
131
+ }
132
+ });
133
+ }
189
134
  };
190
135
 
191
136
  // src/AsyncQueryBus/model/QueryStatus.ts
@@ -243,7 +188,7 @@ var AsyncQueryBusClient = class extends AsyncQueryBusBase {
243
188
  ...query,
244
189
  $meta
245
190
  });
246
- const queryArchivist = assertEx(await this.queriesArchivist(), () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`);
191
+ const queryArchivist = assertEx2(await this.queriesArchivist(), () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`);
247
192
  const routedQueryHash = (
248
193
  // Trust the signed hash if it's there
249
194
  routedQuery?.$hash ?? // TODO: What is the right way to find the dataHash
@@ -371,7 +316,7 @@ var AsyncQueryBusClient = class extends AsyncQueryBusBase {
371
316
 
372
317
  // src/AsyncQueryBus/AsyncQueryBusHost.ts
373
318
  import { containsAll } from "@xylabs/array";
374
- import { assertEx as assertEx2 } from "@xylabs/assert";
319
+ import { assertEx as assertEx3 } from "@xylabs/assert";
375
320
  import { clearTimeoutEx as clearTimeoutEx2, setTimeoutEx as setTimeoutEx2 } from "@xylabs/timer";
376
321
  import { isQueryBoundWitnessWithMeta } from "@xyo-network/boundwitness-model";
377
322
  import { BoundWitnessDivinerQuerySchema as BoundWitnessDivinerQuerySchema2 } from "@xyo-network/diviner-boundwitness-model";
@@ -405,7 +350,7 @@ var AsyncQueryBusHost = class extends AsyncQueryBusBase {
405
350
  throw new Error(`Unable to resolve module to expose [${id}]`);
406
351
  }
407
352
  if (module) {
408
- assertEx2(!failOnAlreadyExposed || !this._exposedAddresses.has(module.address), () => `Address already exposed: ${id} [${module.address}]`);
353
+ assertEx3(!failOnAlreadyExposed || !this._exposedAddresses.has(module.address), () => `Address already exposed: ${id} [${module.address}]`);
409
354
  this._exposedAddresses.add(module.address);
410
355
  this._exposeOptions[module.address] = {
411
356
  ...options
@@ -419,7 +364,7 @@ var AsyncQueryBusHost = class extends AsyncQueryBusBase {
419
364
  ...this.config?.listeningModules ?? [],
420
365
  ...this.exposedAddresses.values()
421
366
  ];
422
- const mods = await Promise.all(exposedModules.map(async (exposedModule) => assertEx2(asModuleInstance(await this.resolver.resolve(exposedModule, {
367
+ const mods = await Promise.all(exposedModules.map(async (exposedModule) => assertEx3(asModuleInstance(await this.resolver.resolve(exposedModule, {
423
368
  maxDepth: 10
424
369
  })), () => `Unable to resolve listeningModule [${exposedModule}]`)));
425
370
  return mods;
@@ -443,7 +388,7 @@ var AsyncQueryBusHost = class extends AsyncQueryBusBase {
443
388
  maxDepth: 10
444
389
  }));
445
390
  if (module) {
446
- assertEx2(!validate || this._exposedAddresses.has(module.address), () => `Address not exposed [${module.address}][${module.id}]`);
391
+ assertEx3(!validate || this._exposedAddresses.has(module.address), () => `Address not exposed [${module.address}][${module.id}]`);
447
392
  this._exposedAddresses.delete(module.address);
448
393
  delete this._exposeOptions[module.address];
449
394
  this.logger?.debug(`${module.address} [${module.id}] unexposed`);
@@ -452,8 +397,8 @@ var AsyncQueryBusHost = class extends AsyncQueryBusBase {
452
397
  }
453
398
  callLocalModule = async (localModule, query) => {
454
399
  const localModuleName = localModule.config.name ?? localModule.address;
455
- const queryArchivist = assertEx2(await this.queriesArchivist(), () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`);
456
- const responsesArchivist = assertEx2(await this.responsesArchivist(), () => `Unable to contact responsesArchivist [${this.config?.intersect?.queries?.archivist}]`);
400
+ const queryArchivist = assertEx3(await this.queriesArchivist(), () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`);
401
+ const responsesArchivist = assertEx3(await this.responsesArchivist(), () => `Unable to contact responsesArchivist [${this.config?.intersect?.queries?.archivist}]`);
457
402
  const queryDestination = query.$meta?.destination;
458
403
  if (queryDestination && queryDestination?.includes(localModule.address)) {
459
404
  const queryIndex = query.payload_hashes.indexOf(query.query);
@@ -616,13 +561,13 @@ var PubSubBridgeSchema = "network.xyo.bridge.pubsub";
616
561
  var PubSubBridgeConfigSchema = `${PubSubBridgeSchema}.config`;
617
562
 
618
563
  // src/PubSubBridge.ts
619
- import { assertEx as assertEx4 } from "@xylabs/assert";
564
+ import { assertEx as assertEx5 } from "@xylabs/assert";
620
565
  import { exists } from "@xylabs/exists";
621
566
  import { AbstractBridge } from "@xyo-network/abstract-bridge";
622
567
  import { creatableModule } from "@xyo-network/module-model";
623
568
 
624
569
  // src/PubSubBridgeModuleResolver.ts
625
- import { assertEx as assertEx3 } from "@xylabs/assert";
570
+ import { assertEx as assertEx4 } from "@xylabs/assert";
626
571
  import { isAddress } from "@xylabs/hex";
627
572
  import { AbstractBridgeModuleResolver, wrapModuleWithType } from "@xyo-network/abstract-bridge";
628
573
  import { Account } from "@xyo-network/account";
@@ -639,7 +584,7 @@ var PubSubBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
639
584
  }
640
585
  const idParts = id.split(":");
641
586
  const firstPart = idParts.shift();
642
- assertEx3(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
587
+ assertEx4(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
643
588
  const remainderParts = idParts.join(":");
644
589
  const account = Account.randomSync();
645
590
  const params = {
@@ -656,13 +601,13 @@ var PubSubBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
656
601
  const state = await proxy.state();
657
602
  if (state) {
658
603
  const configSchema = state.find((payload) => payload.schema === ConfigSchema)?.config;
659
- const config = assertEx3(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
604
+ const config = assertEx4(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
660
605
  proxy.setConfig(config);
661
606
  }
662
607
  }
663
608
  await proxy.start?.();
664
609
  const wrapped = wrapModuleWithType(proxy, account);
665
- const as = assertEx3(asModuleInstance2(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
610
+ const as = assertEx4(asModuleInstance2(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
666
611
  proxy.upResolver.add(as);
667
612
  proxy.downResolver.add(as);
668
613
  this.add(as);
@@ -701,7 +646,7 @@ var PubSubBridge = class extends AbstractBridge {
701
646
  get resolver() {
702
647
  this._resolver = this._resolver ?? new PubSubBridgeModuleResolver({
703
648
  bridge: this,
704
- busClient: assertEx4(this.busClient(), () => "busClient not configured"),
649
+ busClient: assertEx5(this.busClient(), () => "busClient not configured"),
705
650
  wrapperAccount: this.account
706
651
  });
707
652
  return this._resolver;
@@ -710,7 +655,7 @@ var PubSubBridge = class extends AbstractBridge {
710
655
  return `${this.config.name ?? moduleName}`;
711
656
  }
712
657
  get roots() {
713
- return assertEx4(this.config.roots, () => "roots not configured");
658
+ return assertEx5(this.config.roots, () => "roots not configured");
714
659
  }
715
660
  async discoverRoots() {
716
661
  const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve(root)))).filter(exists);
@@ -721,7 +666,7 @@ var PubSubBridge = class extends AbstractBridge {
721
666
  }
722
667
  async exposeHandler(id, options) {
723
668
  const { maxDepth = 2, direction = "all", required = true } = options ?? {};
724
- const host = assertEx4(this.busHost(), () => "Not configured as a host");
669
+ const host = assertEx5(this.busHost(), () => "Not configured as a host");
725
670
  const module = await host.expose(id, {
726
671
  required
727
672
  });
@@ -754,7 +699,7 @@ var PubSubBridge = class extends AbstractBridge {
754
699
  }
755
700
  async unexposeHandler(id, options) {
756
701
  const { maxDepth = 2, direction = "all", required = true } = options ?? {};
757
- const host = assertEx4(this.busHost(), () => "Not configured as a host");
702
+ const host = assertEx5(this.busHost(), () => "Not configured as a host");
758
703
  const module = await host.unexpose(id, required);
759
704
  if (module) {
760
705
  const children = maxDepth > 0 ? await module.resolve("*", {