@xyo-network/bridge-pub-sub 2.101.2 → 2.101.4

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.
Files changed (70) hide show
  1. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts +8 -1
  2. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  3. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts +8 -1
  4. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  5. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts +8 -1
  6. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  7. package/dist/browser/PubSubBridge.d.cts +8 -2
  8. package/dist/browser/PubSubBridge.d.cts.map +1 -1
  9. package/dist/browser/PubSubBridge.d.mts +8 -2
  10. package/dist/browser/PubSubBridge.d.mts.map +1 -1
  11. package/dist/browser/PubSubBridge.d.ts +8 -2
  12. package/dist/browser/PubSubBridge.d.ts.map +1 -1
  13. package/dist/browser/PubSubBridgeModuleResolver.d.cts +13 -0
  14. package/dist/browser/PubSubBridgeModuleResolver.d.cts.map +1 -1
  15. package/dist/browser/PubSubBridgeModuleResolver.d.mts +13 -0
  16. package/dist/browser/PubSubBridgeModuleResolver.d.mts.map +1 -1
  17. package/dist/browser/PubSubBridgeModuleResolver.d.ts +13 -0
  18. package/dist/browser/PubSubBridgeModuleResolver.d.ts.map +1 -1
  19. package/dist/browser/index.cjs +106 -20
  20. package/dist/browser/index.cjs.map +1 -1
  21. package/dist/browser/index.js +102 -16
  22. package/dist/browser/index.js.map +1 -1
  23. package/dist/neutral/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts +8 -1
  24. package/dist/neutral/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  25. package/dist/neutral/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts +8 -1
  26. package/dist/neutral/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  27. package/dist/neutral/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts +8 -1
  28. package/dist/neutral/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  29. package/dist/neutral/PubSubBridge.d.cts +8 -2
  30. package/dist/neutral/PubSubBridge.d.cts.map +1 -1
  31. package/dist/neutral/PubSubBridge.d.mts +8 -2
  32. package/dist/neutral/PubSubBridge.d.mts.map +1 -1
  33. package/dist/neutral/PubSubBridge.d.ts +8 -2
  34. package/dist/neutral/PubSubBridge.d.ts.map +1 -1
  35. package/dist/neutral/PubSubBridgeModuleResolver.d.cts +13 -0
  36. package/dist/neutral/PubSubBridgeModuleResolver.d.cts.map +1 -1
  37. package/dist/neutral/PubSubBridgeModuleResolver.d.mts +13 -0
  38. package/dist/neutral/PubSubBridgeModuleResolver.d.mts.map +1 -1
  39. package/dist/neutral/PubSubBridgeModuleResolver.d.ts +13 -0
  40. package/dist/neutral/PubSubBridgeModuleResolver.d.ts.map +1 -1
  41. package/dist/neutral/index.cjs +106 -20
  42. package/dist/neutral/index.cjs.map +1 -1
  43. package/dist/neutral/index.js +102 -16
  44. package/dist/neutral/index.js.map +1 -1
  45. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts +8 -1
  46. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  47. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts +8 -1
  48. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  49. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts +8 -1
  50. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  51. package/dist/node/PubSubBridge.d.cts +8 -2
  52. package/dist/node/PubSubBridge.d.cts.map +1 -1
  53. package/dist/node/PubSubBridge.d.mts +8 -2
  54. package/dist/node/PubSubBridge.d.mts.map +1 -1
  55. package/dist/node/PubSubBridge.d.ts +8 -2
  56. package/dist/node/PubSubBridge.d.ts.map +1 -1
  57. package/dist/node/PubSubBridgeModuleResolver.d.cts +13 -0
  58. package/dist/node/PubSubBridgeModuleResolver.d.cts.map +1 -1
  59. package/dist/node/PubSubBridgeModuleResolver.d.mts +13 -0
  60. package/dist/node/PubSubBridgeModuleResolver.d.mts.map +1 -1
  61. package/dist/node/PubSubBridgeModuleResolver.d.ts +13 -0
  62. package/dist/node/PubSubBridgeModuleResolver.d.ts.map +1 -1
  63. package/dist/node/index.cjs +107 -20
  64. package/dist/node/index.cjs.map +1 -1
  65. package/dist/node/index.js +103 -16
  66. package/dist/node/index.js.map +1 -1
  67. package/package.json +20 -20
  68. package/src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts +50 -1
  69. package/src/PubSubBridge.ts +57 -3
  70. package/src/PubSubBridgeModuleResolver.ts +10 -2
@@ -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 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 let nextDelay = 100\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(nextDelay)\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?.log(`Returning response to query: ${routedQueryHash}`)\n resolve(response)\n return\n }\n //back off the polling frequency\n nextDelay = Math.floor(nextDelay * 1.2)\n //cap it at 1000ms\n if (nextDelay > 1000) nextDelay = 1000\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.pollFrequency)\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 = { limit: 1, order: 'desc', 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, ResolveHelper } from '@xyo-network/module-model'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusParams } from './model'\n\nconst POLLING_FREQUENCY_MIN = 100 as const\nconst POLLING_FREQUENCY_MAX = 60_000 as const\nconst POLLING_FREQUENCY_DEFAULT = 1000 as const\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 _lastResolveFailure: 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 pollFrequency(): number {\n const frequency = this.config?.pollFrequency ?? POLLING_FREQUENCY_DEFAULT\n if (frequency < POLLING_FREQUENCY_MIN || frequency > POLLING_FREQUENCY_MAX) {\n return POLLING_FREQUENCY_DEFAULT\n }\n return frequency\n }\n\n get rootModule() {\n return this.params.rootModule\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._resolveMutex.runExclusive(async () => {\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\n async queriesDiviner() {\n return await this._resolveMutex.runExclusive(async () => {\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\n async responsesArchivist() {\n return await this._resolveMutex.runExclusive(async () => {\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\n async responsesDiviner() {\n return await this._resolveMutex.runExclusive(async () => {\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 /**\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 if (Date.now() - (this._lastResolveFailure[id] ?? 0) < this._reResolveDelay) {\n return\n }\n this._lastResolveFailure[id] = Date.now()\n const resolved = await ResolveHelper.resolveModuleIdentifier(this.rootModule, id)\n if (resolved) {\n if (typeCheck(resolved)) {\n delete this._lastResolveFailure[id]\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?.debug(`Unable to resolve queriesArchivist [${id}] [${await ResolveHelper.traceModuleIdentifier(this.rootModule, id)}]`)\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 { isBridgeInstance } from '@xyo-network/bridge-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport {\n asModuleInstance,\n ModuleConfigSchema,\n ModuleIdentifier,\n ModuleInstance,\n resolveAddressToInstance,\n ResolveHelper,\n} 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}\n\nconst IDLE_POLLING_FREQUENCY_RATIO_MIN = 4 as const\nconst IDLE_POLLING_FREQUENCY_RATIO_MAX = 64 as const\nconst IDLE_POLLING_FREQUENCY_RATIO_DEFAULT = 16 as const\n\nconst IDLE_THRESHOLD_RATIO_MIN = 4 as const\nconst IDLE_THRESHOLD_RATIO_MAX = 64 as const\nconst IDLE_THRESHOLD_RATIO_DEFAULT = 16 as const\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 _idle = false\n private _lastQueryTime?: number\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 idlePollFrequency() {\n const frequency = this.config?.idlePollFrequency ?? IDLE_POLLING_FREQUENCY_RATIO_DEFAULT * this.pollFrequency\n if (frequency < this.pollFrequency * IDLE_POLLING_FREQUENCY_RATIO_MIN) {\n return IDLE_POLLING_FREQUENCY_RATIO_MIN * this.pollFrequency\n }\n if (frequency > this.pollFrequency * IDLE_POLLING_FREQUENCY_RATIO_MAX) {\n return IDLE_POLLING_FREQUENCY_RATIO_MAX * this.pollFrequency\n }\n return frequency\n }\n\n get idleThreshold() {\n const threshold = this.config?.idleThreshold ?? IDLE_THRESHOLD_RATIO_DEFAULT * this.idlePollFrequency\n if (threshold < this.idlePollFrequency * IDLE_THRESHOLD_RATIO_MIN) {\n return IDLE_POLLING_FREQUENCY_RATIO_MIN * this.pollFrequency\n }\n if (threshold > this.idlePollFrequency * IDLE_THRESHOLD_RATIO_MAX) {\n return IDLE_POLLING_FREQUENCY_RATIO_MAX * this.pollFrequency\n }\n return threshold\n }\n\n get perAddressBatchQueryLimit(): number {\n return this.config?.perAddressBatchQueryLimit ?? 10\n }\n\n get started() {\n return !!this._pollId\n }\n\n expose(module: ModuleInstance, options?: ExposeOptions) {\n const { failOnAlreadyExposed } = options ?? {}\n if (isBridgeInstance(module)) {\n this.logger?.warn(`Attempted to expose a BridgeModule [${module.id}] - Not exposing`)\n } else {\n assertEx(\n !failOnAlreadyExposed || !this._exposedAddresses.has(module.address),\n () => `Address already exposed: ${module.id} [${module.address}]`,\n )\n this._exposedAddresses.add(module.address)\n this._exposeOptions[module.address] = { ...options }\n this.logger?.debug(`${module.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 resolveAddressToInstance(this.rootModule, exposedModule)),\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.rootModule.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 this._idle = false\n this._lastQueryTime = Date.now()\n const localModuleName = localModule.id\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 this.params.onQueryFulfillStarted?.({ payloads: queryPayloads, query })\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 result = await localModule.query(query, queryPayloads, {\n allowedQueries: this._exposeOptions[localModule.address]?.allowedQueries,\n schema: ModuleConfigSchema,\n })\n const [bw, payloads, errors] = result\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 this.params.onQueryFulfillFinished?.({ payloads: queryPayloads, query, result, status: 'success' })\n } catch (error) {\n this.params.onQueryFulfillFinished?.({ payloads: queryPayloads, query, status: 'failure' })\n this.logger?.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 queriesDivinerId = assertEx(this.config?.intersect?.queries?.boundWitnessDiviner, () => 'No queries Diviner defined')\n const queriesBoundWitnessDiviner = await this.queriesDiviner()\n if (queriesBoundWitnessDiviner) {\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: BoundWitnessDivinerQueryPayload = {\n destination,\n limit,\n order: 'asc',\n schema: BoundWitnessDivinerQuerySchema,\n timestamp,\n }\n const result = await queriesBoundWitnessDiviner.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(\n `Unable to resolve queriesBoundWitnessDiviner [${queriesDivinerId}] [${await ResolveHelper.traceModuleIdentifier(this.rootModule, queriesDivinerId)}]`,\n )\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(\n 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 const now = Date.now()\n if (this.idleThreshold < now - (this._lastQueryTime ?? now)) {\n this._idle = true\n }\n },\n this._idle ? this.idlePollFrequency : this.pollFrequency,\n )\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.id\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 rootModule: 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 static createCount = 0\n\n constructor(params: TParams) {\n AsyncQueryBusModuleProxy.createCount = AsyncQueryBusModuleProxy.createCount + 1\n if (Math.floor(AsyncQueryBusModuleProxy.createCount / 10) === AsyncQueryBusModuleProxy.createCount / 10) {\n console.log(`AsyncQueryBusModuleProxy.createCount: ${AsyncQueryBusModuleProxy.createCount}`)\n }\n super(params)\n }\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 { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport {\n BridgeExposeOptions,\n BridgeModule,\n BridgeUnexposeOptions,\n QueryFulfillFinishedEventArgs,\n QueryFulfillStartedEventArgs,\n QuerySendFinishedEventArgs,\n QuerySendStartedEventArgs,\n} from '@xyo-network/bridge-model'\nimport { creatableModule, ModuleIdentifier, ModuleInstance, resolveAddressToInstanceUp, ResolveHelper } from '@xyo-network/module-model'\nimport { asNodeInstance } from '@xyo-network/node-model'\nimport { isPayloadOfSchemaType, Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\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 readonly configSchemas: Schema[] = [...super.configSchemas, PubSubBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = 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 _discoverRootsMutex = new Mutex()\n private _resolver?: PubSubBridgeModuleResolver\n private _roots?: ModuleInstance[]\n\n override get resolver(): PubSubBridgeModuleResolver {\n this._resolver =\n this._resolver ??\n new PubSubBridgeModuleResolver({\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n busClient: assertEx(this.busClient(), () => 'busClient not configured'),\n onQuerySendFinished: (args: Omit<QuerySendFinishedEventArgs, 'module'>) => {\n forget(this.emit('querySendFinished', { module: this, ...args }))\n },\n onQuerySendStarted: (args: Omit<QuerySendStartedEventArgs, 'module'>) => {\n forget(this.emit('querySendStarted', { module: this, ...args }))\n },\n root: this,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n protected get moduleName() {\n return this.modName ?? moduleName\n }\n\n async connect(id: ModuleIdentifier, maxDepth = 5): Promise<Address | undefined> {\n const transformedId = assertEx(await ResolveHelper.transformModuleIdentifier(id), () => `Unable to transform module identifier: ${id}`)\n //check if already connected\n const existingInstance = await this.resolve<ModuleInstance>(transformedId)\n if (existingInstance) {\n return existingInstance.address\n }\n\n //use the resolver to create the proxy instance\n const [instance] = await this.resolver.resolveHandler<ModuleInstance>(id)\n return await this.connectInstance(instance, maxDepth)\n }\n\n async disconnect(id: ModuleIdentifier): Promise<Address | undefined> {\n const transformedId = assertEx(await ResolveHelper.transformModuleIdentifier(id), () => `Unable to transform module identifier: ${id}`)\n const instance = await this.resolve<ModuleInstance>(transformedId)\n if (instance) {\n this.downResolver.remove(instance.address)\n return instance.address\n }\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5 } = options ?? {}\n console.log(`exposeChild: ${mod.address} ${mod?.id} ${maxDepth}`)\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n host.expose(mod)\n const children = maxDepth > 0 ? (await mod.publicChildren?.()) ?? [] : []\n this.logger.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toJsonString(children.map((child) => child.id))}`)\n const exposedChildren = (await Promise.all(children.map((child) => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false }))))\n .flat()\n .filter(exists)\n const allExposed = [mod, ...exposedChildren]\n\n for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`)\n\n return allExposed\n }\n\n async exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { required = true } = options ?? {}\n const mod = await resolveAddressToInstanceUp(this, address)\n console.log(`exposeHandler: ${address} ${mod?.id}`)\n if (required && !mod) {\n throw new Error(`Unable to find required module: ${address}`)\n }\n if (mod) {\n return this.exposeChild(mod, options)\n }\n return []\n }\n\n exposedHandler(): Address[] {\n const exposedSet = this.busHost()?.exposedAddresses\n return exposedSet ? [...exposedSet] : []\n }\n\n async getRoots(force?: boolean): Promise<ModuleInstance[]> {\n return await this._discoverRootsMutex.runExclusive(async () => {\n if (this._roots === undefined || force) {\n const rootAddresses = (\n await Promise.all(\n (this.config.roots ?? []).map((id) => {\n try {\n return ResolveHelper.transformModuleIdentifier(id)\n } catch (ex) {\n this.logger?.warn('Unable to transform module identifier:', id, ex)\n return\n }\n }),\n )\n ).filter(exists)\n const rootInstances = (\n await Promise.all(\n rootAddresses.map(async (root) => {\n try {\n return await this.resolver.resolveHandler<ModuleInstance>(root)\n } catch (ex) {\n this.logger?.warn('Unable to resolve root:', root, ex)\n return\n }\n }),\n )\n )\n .flat()\n .filter(exists)\n for (const instance of rootInstances) {\n this.downResolver.add(instance)\n }\n this._roots = rootInstances\n }\n return this._roots\n })\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, 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.publicChildren?.()) ?? [] : []\n const exposedChildren = (\n await Promise.all(children.map((child) => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [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 rootModule: 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 onQueryFulfillFinished: (args: Omit<QueryFulfillFinishedEventArgs, 'module'>) => {\n forget(this.emit('queryFulfillFinished', { module: this, ...args }))\n },\n onQueryFulfillStarted: (args: Omit<QueryFulfillStartedEventArgs, 'module'>) => {\n forget(this.emit('queryFulfillStarted', { module: this, ...args }))\n },\n rootModule: this,\n })\n }\n return this._busHost\n }\n\n protected async connectInstance(instance?: ModuleInstance, maxDepth = 5): Promise<Address | undefined> {\n if (instance) {\n this.downResolver.add(instance)\n if (maxDepth > 0) {\n const node = asNodeInstance(instance)\n if (node) {\n const state = await node.state()\n const children = (state?.filter(isPayloadOfSchemaType<AddressPayload>(AddressSchema)).map((s) => s.address) ?? []).filter(\n (a) => a !== instance.address,\n )\n await Promise.all(children.map((child) => this.connect(child, maxDepth - 1)))\n }\n }\n this.logger?.log(`Connect: ${instance.id}`)\n return instance.address\n }\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>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T[]> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult.length > 0) {\n return parentResult\n }\n const idParts = id.split(':')\n const firstPart = idParts.shift()\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const account = Account.randomSync()\n const finalParams: AsyncQueryBusModuleProxyParams = {\n account,\n archiving: this.params.archiving,\n busClient: this.params.busClient,\n config: { schema: ModuleConfigSchema },\n host: this.params.bridge,\n moduleAddress: firstPart as Address,\n onQuerySendFinished: this.params.onQuerySendFinished,\n onQuerySendStarted: this.params.onQuerySendStarted,\n }\n const proxy = new AsyncQueryBusModuleProxy<T, AsyncQueryBusModuleProxyParams>(finalParams)\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 instance = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(instance)\n proxy.downResolver.add(instance)\n this.add(instance)\n const result = remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : instance\n return result ? [result] : []\n }\n}\n"],"mappings":"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","names":["AbstractModuleHost","Base","import_assert","import_lru_cache","import_object","POLLING_FREQUENCY_MIN","POLLING_FREQUENCY_MAX","POLLING_FREQUENCY_DEFAULT","AsyncQueryBusBase","Base","_lastState","_targetConfigs","_targetQueries","_lastResolveFailure","_queriesArchivist","_queriesDiviner","_reResolveDelay","_resolveMutex","Mutex","_responsesArchivist","_responsesDiviner","constructor","params","config","pollFrequency","frequency","rootModule","lastState","requiredConfig","max","ttl","LRUCache","queriesArchivist","runExclusive","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","resolved","ResolveHelper","resolveModuleIdentifier","logger","warn","name","debug","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","nextDelay","pollForResponse","start","response","get","undefined","delay","log","Math","floor","error","message","schema","sources","stop","forget","poll","setTimeoutEx","processIncomingResponses","e","clearTimeoutEx","pollFrequency","responseArchivist","responsesArchivist","responseBoundWitnessDiviner","responsesDiviner","pendingCommands","entries","filter","_","status","allSettled","map","sourceQuery","divinerQuery","limit","order","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","IDLE_POLLING_FREQUENCY_RATIO_MIN","IDLE_POLLING_FREQUENCY_RATIO_MAX","IDLE_POLLING_FREQUENCY_RATIO_DEFAULT","IDLE_THRESHOLD_RATIO_MIN","IDLE_THRESHOLD_RATIO_MAX","IDLE_THRESHOLD_RATIO_DEFAULT","AsyncQueryBusHost","AsyncQueryBusBase","_exposedAddresses","Set","_exposeOptions","_idle","_lastQueryTime","_pollId","constructor","params","exposedAddresses","idlePollFrequency","frequency","config","pollFrequency","idleThreshold","threshold","perAddressBatchQueryLimit","started","expose","module","options","failOnAlreadyExposed","isBridgeInstance","logger","warn","id","assertEx","has","address","add","debug","listeningModules","exposedModules","values","mods","Promise","all","map","exposedModule","asModuleInstance","resolveAddressToInstance","rootModule","start","console","poll","stop","clearTimeoutEx","undefined","unexpose","validate","resolve","maxDepth","delete","callLocalModule","localModule","query","Date","now","localModuleName","queryArchivist","queriesArchivist","intersect","queries","archivist","responsesArchivist","queryDestination","$meta","destination","includes","queryIndex","payload_hashes","indexOf","querySchema","payload_schemas","queryPayloads","get","onQueryFulfillStarted","payloads","queryPayloadsDict","PayloadBuilder","toAllHashMap","queryHash","build","$hash","containsAll","Object","keys","error","schema","result","allowedQueries","ModuleConfigSchema","bw","errors","insertResult","insert","length","timestamp","commitState","onQueryFulfillFinished","status","findQueriesToAddress","queriesDivinerId","boundWitnessDiviner","queriesBoundWitnessDiviner","queriesDiviner","retrieveState","limit","divinerQuery","order","BoundWitnessDivinerQuerySchema","divine","filter","isQueryBoundWitnessWithMeta","nextState","Math","max","c","ResolveHelper","traceModuleIdentifier","setTimeoutEx","processIncomingQueries","e","localModules","allSettled","AsyncQueryBusModuleHost","AbstractModuleHost","_busHost","constructor","params","start","listeningModules","config","module","resolve","direction","map","m","address","AsyncQueryBusHost","logger","rootModule","stop","AsyncQueryBusModuleProxy","AbstractModuleProxy","createCount","constructor","params","Math","floor","console","log","proxyQueryHandler","query","payloads","busClient","send","address","startHandler","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","import_assert","import_forget","import_object","import_abstract_bridge","import_module_model","import_async_mutex","import_assert","import_abstract_bridge","import_module_model","PubSubBridgeModuleResolver","AbstractBridgeModuleResolver","resolveHandler","id","options","parentResult","length","idParts","split","firstPart","shift","assertEx","isAddress","remainderParts","join","account","Account","randomSync","finalParams","archiving","params","busClient","config","schema","ModuleConfigSchema","host","bridge","moduleAddress","onQuerySendFinished","onQuerySendStarted","proxy","AsyncQueryBusModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","instance","asModuleInstance","upResolver","add","downResolver","result","resolve","moduleName","PubSubBridge","AbstractBridge","configSchemas","PubSubBridgeConfigSchema","defaultConfigSchema","_configRootAddress","_configStateStoreArchivist","_configStateStoreBoundWitnessDiviner","_exposedAddresses","_lastState","_busClient","_busHost","_discoverRootsMutex","Mutex","_resolver","_roots","resolver","PubSubBridgeModuleResolver","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","busClient","assertEx","onQuerySendFinished","args","forget","emit","module","onQuerySendStarted","root","wrapperAccount","account","modName","connect","id","maxDepth","transformedId","ResolveHelper","transformModuleIdentifier","existingInstance","resolve","address","instance","resolveHandler","connectInstance","disconnect","downResolver","remove","exposeChild","mod","options","console","log","host","busHost","expose","children","publicChildren","logger","toJsonString","map","child","exposedChildren","Promise","all","required","flat","filter","exists","allExposed","exposedMod","exposeHandler","resolveAddressToInstanceUp","Error","exposedHandler","exposedSet","exposedAddresses","getRoots","force","runExclusive","undefined","rootAddresses","config","roots","ex","warn","rootInstances","add","startHandler","start","unexposeHandler","unexpose","client","AsyncQueryBusClient","rootModule","AsyncQueryBusHost","onQueryFulfillFinished","onQueryFulfillStarted","node","asNodeInstance","state","isPayloadOfSchemaType","AddressSchema","s","a","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 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 let nextDelay = 100\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(nextDelay)\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?.log(`Returning response to query: ${routedQueryHash}`)\n resolve(response)\n return\n }\n //back off the polling frequency\n nextDelay = Math.floor(nextDelay * 1.2)\n //cap it at 1000ms\n if (nextDelay > 1000) nextDelay = 1000\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.pollFrequency)\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 = { limit: 1, order: 'desc', 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, ResolveHelper } from '@xyo-network/module-model'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusParams } from './model'\n\nconst POLLING_FREQUENCY_MIN = 100 as const\nconst POLLING_FREQUENCY_MAX = 60_000 as const\nconst POLLING_FREQUENCY_DEFAULT = 1000 as const\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 _lastResolveFailure: 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 pollFrequency(): number {\n const frequency = this.config?.pollFrequency ?? POLLING_FREQUENCY_DEFAULT\n if (frequency < POLLING_FREQUENCY_MIN || frequency > POLLING_FREQUENCY_MAX) {\n return POLLING_FREQUENCY_DEFAULT\n }\n return frequency\n }\n\n get rootModule() {\n return this.params.rootModule\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._resolveMutex.runExclusive(async () => {\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\n async queriesDiviner() {\n return await this._resolveMutex.runExclusive(async () => {\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\n async responsesArchivist() {\n return await this._resolveMutex.runExclusive(async () => {\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\n async responsesDiviner() {\n return await this._resolveMutex.runExclusive(async () => {\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 /**\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 if (Date.now() - (this._lastResolveFailure[id] ?? 0) < this._reResolveDelay) {\n return\n }\n this._lastResolveFailure[id] = Date.now()\n const resolved = await ResolveHelper.resolveModuleIdentifier(this.rootModule, id)\n if (resolved) {\n if (typeCheck(resolved)) {\n delete this._lastResolveFailure[id]\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?.debug(`Unable to resolve queriesArchivist [${id}] [${await ResolveHelper.traceModuleIdentifier(this.rootModule, id)}]`)\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 { isBridgeInstance } from '@xyo-network/bridge-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport {\n asModuleInstance,\n ModuleConfigSchema,\n ModuleIdentifier,\n ModuleInstance,\n resolveAddressToInstance,\n ResolveHelper,\n} 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}\n\nconst IDLE_POLLING_FREQUENCY_RATIO_MIN = 4 as const\nconst IDLE_POLLING_FREQUENCY_RATIO_MAX = 64 as const\nconst IDLE_POLLING_FREQUENCY_RATIO_DEFAULT = 16 as const\n\nconst IDLE_THRESHOLD_RATIO_MIN = 4 as const\nconst IDLE_THRESHOLD_RATIO_MAX = 64 as const\nconst IDLE_THRESHOLD_RATIO_DEFAULT = 16 as const\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 _idle = false\n private _lastQueryTime?: number\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 idlePollFrequency() {\n const frequency = this.config?.idlePollFrequency ?? IDLE_POLLING_FREQUENCY_RATIO_DEFAULT * this.pollFrequency\n if (frequency < this.pollFrequency * IDLE_POLLING_FREQUENCY_RATIO_MIN) {\n return IDLE_POLLING_FREQUENCY_RATIO_MIN * this.pollFrequency\n }\n if (frequency > this.pollFrequency * IDLE_POLLING_FREQUENCY_RATIO_MAX) {\n return IDLE_POLLING_FREQUENCY_RATIO_MAX * this.pollFrequency\n }\n return frequency\n }\n\n get idleThreshold() {\n const threshold = this.config?.idleThreshold ?? IDLE_THRESHOLD_RATIO_DEFAULT * this.idlePollFrequency\n if (threshold < this.idlePollFrequency * IDLE_THRESHOLD_RATIO_MIN) {\n return IDLE_POLLING_FREQUENCY_RATIO_MIN * this.pollFrequency\n }\n if (threshold > this.idlePollFrequency * IDLE_THRESHOLD_RATIO_MAX) {\n return IDLE_POLLING_FREQUENCY_RATIO_MAX * this.pollFrequency\n }\n return threshold\n }\n\n get perAddressBatchQueryLimit(): number {\n return this.config?.perAddressBatchQueryLimit ?? 10\n }\n\n get started() {\n return !!this._pollId\n }\n\n expose(module: ModuleInstance, options?: ExposeOptions) {\n const { failOnAlreadyExposed } = options ?? {}\n if (isBridgeInstance(module)) {\n this.logger?.warn(`Attempted to expose a BridgeModule [${module.id}] - Not exposing`)\n } else {\n assertEx(\n !failOnAlreadyExposed || !this._exposedAddresses.has(module.address),\n () => `Address already exposed: ${module.id} [${module.address}]`,\n )\n this._exposedAddresses.add(module.address)\n this._exposeOptions[module.address] = { ...options }\n this.logger?.debug(`${module.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 resolveAddressToInstance(this.rootModule, exposedModule)),\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.rootModule.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 this._idle = false\n this._lastQueryTime = Date.now()\n const localModuleName = localModule.id\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 this.params.onQueryFulfillStarted?.({ payloads: queryPayloads, query })\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 result = await localModule.query(query, queryPayloads, {\n allowedQueries: this._exposeOptions[localModule.address]?.allowedQueries,\n schema: ModuleConfigSchema,\n })\n const [bw, payloads, errors] = result\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 this.params.onQueryFulfillFinished?.({ payloads: queryPayloads, query, result, status: 'success' })\n } catch (error) {\n this.params.onQueryFulfillFinished?.({ payloads: queryPayloads, query, status: 'failure' })\n this.logger?.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 queriesDivinerId = assertEx(this.config?.intersect?.queries?.boundWitnessDiviner, () => 'No queries Diviner defined')\n const queriesBoundWitnessDiviner = await this.queriesDiviner()\n if (queriesBoundWitnessDiviner) {\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: BoundWitnessDivinerQueryPayload = {\n destination,\n limit,\n order: 'asc',\n schema: BoundWitnessDivinerQuerySchema,\n timestamp,\n }\n const result = await queriesBoundWitnessDiviner.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(\n `Unable to resolve queriesBoundWitnessDiviner [${queriesDivinerId}] [${await ResolveHelper.traceModuleIdentifier(this.rootModule, queriesDivinerId)}]`,\n )\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(\n 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 const now = Date.now()\n if (this.idleThreshold < now - (this._lastQueryTime ?? now)) {\n this._idle = true\n }\n },\n this._idle ? this.idlePollFrequency : this.pollFrequency,\n )\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.id\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 rootModule: this.params.module,\n })\n this._busHost?.start()\n }\n override stop() {\n this._busHost?.stop()\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isAddress } from '@xylabs/hex'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleQueryResult,\n ResolveHelper,\n ResolveHelperConfig,\n} 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 static createCount = 0\n\n constructor(params: TParams) {\n AsyncQueryBusModuleProxy.createCount = AsyncQueryBusModuleProxy.createCount + 1\n if (Math.floor(AsyncQueryBusModuleProxy.createCount / 10) === AsyncQueryBusModuleProxy.createCount / 10) {\n console.log(`AsyncQueryBusModuleProxy.createCount: ${AsyncQueryBusModuleProxy.createCount}`)\n }\n super(params)\n }\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 /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const config: ResolveHelperConfig = {\n address: this.address,\n dead: this.dead,\n downResolver: this.downResolver,\n logger: this.logger,\n module: this,\n transformers: this.moduleIdentifierTransformers,\n upResolver: this.upResolver,\n }\n if (idOrFilter === '*') {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address)\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const parts = idOrFilter.split(':')\n const first = assertEx(parts.shift(), () => 'Missing first')\n const address = isAddress(first) ? first : this.childAddressByName(first)\n return this.params.host.resolve(address)\n }\n case 'object': {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address)\n }\n default: {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address)\n }\n }\n }\n\n 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 { forget } from '@xylabs/forget'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport {\n BridgeExposeOptions,\n BridgeModule,\n BridgeUnexposeOptions,\n QueryFulfillFinishedEventArgs,\n QueryFulfillStartedEventArgs,\n QuerySendFinishedEventArgs,\n QuerySendStartedEventArgs,\n} from '@xyo-network/bridge-model'\nimport {\n creatableModule,\n isAddressModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n resolveAddressToInstance,\n resolveAddressToInstanceUp,\n ResolveHelper,\n} from '@xyo-network/module-model'\nimport { asNodeInstance } from '@xyo-network/node-model'\nimport { isPayloadOfSchemaType, Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\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 readonly configSchemas: Schema[] = [...super.configSchemas, PubSubBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = 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 _discoverRootsMutex = new Mutex()\n private _resolver?: PubSubBridgeModuleResolver\n\n override get resolver(): PubSubBridgeModuleResolver {\n this._resolver =\n this._resolver ??\n new PubSubBridgeModuleResolver({\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n busClient: assertEx(this.busClient(), () => 'busClient not configured'),\n onQuerySendFinished: (args: Omit<QuerySendFinishedEventArgs, 'module'>) => {\n forget(this.emit('querySendFinished', { module: this, ...args }))\n },\n onQuerySendStarted: (args: Omit<QuerySendStartedEventArgs, 'module'>) => {\n forget(this.emit('querySendStarted', { module: this, ...args }))\n },\n root: this,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n protected get moduleName() {\n return this.modName ?? moduleName\n }\n\n async connect(id: ModuleIdentifier, maxDepth = 5): Promise<Address | undefined> {\n const transformedId = assertEx(await ResolveHelper.transformModuleIdentifier(id), () => `Unable to transform module identifier: ${id}`)\n //check if already connected\n const existingInstance = await this.resolve<ModuleInstance>(transformedId)\n if (existingInstance) {\n return existingInstance.address\n }\n\n //use the resolver to create the proxy instance\n const [instance] = await this.resolver.resolveHandler<ModuleInstance>(id)\n return await this.connectInstance(instance, maxDepth)\n }\n\n async disconnect(id: ModuleIdentifier): Promise<Address | undefined> {\n const transformedId = assertEx(await ResolveHelper.transformModuleIdentifier(id), () => `Unable to transform module identifier: ${id}`)\n const instance = await this.resolve<ModuleInstance>(transformedId)\n if (instance) {\n this.downResolver.remove(instance.address)\n return instance.address\n }\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5 } = options ?? {}\n console.log(`exposeChild: ${mod.address} ${mod?.id} ${maxDepth}`)\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n host.expose(mod)\n const children = maxDepth > 0 ? (await mod.publicChildren?.()) ?? [] : []\n this.logger.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toJsonString(children.map((child) => child.id))}`)\n const exposedChildren = (await Promise.all(children.map((child) => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false }))))\n .flat()\n .filter(exists)\n const allExposed = [mod, ...exposedChildren]\n\n for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`)\n\n return allExposed\n }\n\n async exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { required = true } = options ?? {}\n const mod = await resolveAddressToInstanceUp(this, address)\n console.log(`exposeHandler: ${address} ${mod?.id}`)\n if (required && !mod) {\n throw new Error(`Unable to find required module: ${address}`)\n }\n if (mod) {\n return this.exposeChild(mod, options)\n }\n return []\n }\n\n exposedHandler(): Address[] {\n const exposedSet = this.busHost()?.exposedAddresses\n return exposedSet ? [...exposedSet] : []\n }\n\n async getRoots(force?: boolean): Promise<ModuleInstance[]> {\n return await this._discoverRootsMutex.runExclusive(async () => {\n if (this._roots === undefined || force) {\n const rootAddresses = (\n await Promise.all(\n (this.config.roots ?? []).map((id) => {\n try {\n return ResolveHelper.transformModuleIdentifier(id)\n } catch (ex) {\n this.logger?.warn('Unable to transform module identifier:', id, ex)\n return\n }\n }),\n )\n ).filter(exists)\n const rootInstances = (\n await Promise.all(\n rootAddresses.map(async (root) => {\n try {\n return await this.resolver.resolveHandler<ModuleInstance>(root)\n } catch (ex) {\n this.logger?.warn('Unable to resolve root:', root, ex)\n return\n }\n }),\n )\n )\n .flat()\n .filter(exists)\n for (const instance of rootInstances) {\n this.downResolver.add(instance)\n }\n this._roots = rootInstances\n }\n return this._roots\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n // eslint-disable-next-line complexity\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const roots = (this._roots ?? []) as T[]\n const workingSet = (options.direction === 'up' ? [this as ModuleInstance] : [...roots, this]) as T[]\n if (idOrFilter === '*') {\n const remainingDepth = (options.maxDepth ?? 1) - 1\n return remainingDepth <= 0 ? workingSet : (\n [...workingSet, ...(await Promise.all(roots.map((mod) => mod.resolve('*', { ...options, maxDepth: remainingDepth })))).flat()]\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const parts = idOrFilter.split(':')\n const first = assertEx(parts.shift(), () => 'Missing first part')\n const firstInstance: ModuleInstance | undefined =\n isAddress(first) ?\n ((await resolveAddressToInstance(this, first, undefined, [], options.direction)) as T)\n : this._roots?.find((mod) => mod.id === first)\n return (parts.length === 0 ? firstInstance : firstInstance?.resolve(parts.join(':'), options)) as T | undefined\n }\n case 'object': {\n const results: T[] = []\n if (isAddressModuleFilter(idOrFilter)) {\n for (const mod of workingSet) {\n if (mod.modName && idOrFilter.address.includes(mod.address)) results.push(mod as T)\n }\n }\n return results\n }\n default: {\n return\n }\n }\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, 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.publicChildren?.()) ?? [] : []\n const exposedChildren = (\n await Promise.all(children.map((child) => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [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 rootModule: 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 onQueryFulfillFinished: (args: Omit<QueryFulfillFinishedEventArgs, 'module'>) => {\n forget(this.emit('queryFulfillFinished', { module: this, ...args }))\n },\n onQueryFulfillStarted: (args: Omit<QueryFulfillStartedEventArgs, 'module'>) => {\n forget(this.emit('queryFulfillStarted', { module: this, ...args }))\n },\n rootModule: this,\n })\n }\n return this._busHost\n }\n\n protected async connectInstance(instance?: ModuleInstance, maxDepth = 5): Promise<Address | undefined> {\n if (instance) {\n this.downResolver.add(instance)\n if (maxDepth > 0) {\n const node = asNodeInstance(instance)\n if (node) {\n const state = await node.state()\n const children = (state?.filter(isPayloadOfSchemaType<AddressPayload>(AddressSchema)).map((s) => s.address) ?? []).filter(\n (a) => a !== instance.address,\n )\n await Promise.all(children.map((child) => this.connect(child, maxDepth - 1)))\n }\n }\n this.logger?.log(`Connect: ${instance.id}`)\n return instance.address\n }\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'\nimport { LRUCache } from 'lru-cache'\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 protected _resolvedCache = new LRUCache<Address, ModuleInstance>({ max: 1000 })\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T[]> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult.length > 0) {\n return parentResult\n }\n const idParts = id.split(':')\n const firstPart = idParts.shift()\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const cachedMod = this._resolvedCache.get(firstPart as Address)\n if (cachedMod) {\n const result = idParts.length <= 0 ? cachedMod : cachedMod.resolve(remainderParts, { ...options, maxDepth: (options?.maxDepth ?? 5) - 1 })\n return (result ? [result] : []) as T[]\n }\n const account = Account.randomSync()\n const finalParams: AsyncQueryBusModuleProxyParams = {\n account,\n archiving: this.params.archiving,\n busClient: this.params.busClient,\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress: firstPart as Address,\n onQuerySendFinished: this.params.onQuerySendFinished,\n onQuerySendStarted: this.params.onQuerySendStarted,\n }\n const proxy = new AsyncQueryBusModuleProxy<T, AsyncQueryBusModuleProxyParams>(finalParams)\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 instance = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(instance)\n proxy.downResolver.add(instance)\n this._resolvedCache.set(instance.address, instance)\n const result = remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : instance\n return result ? [result] : []\n }\n}\n"],"mappings":"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","names":["AbstractModuleHost","Base","import_assert","import_lru_cache","import_object","POLLING_FREQUENCY_MIN","POLLING_FREQUENCY_MAX","POLLING_FREQUENCY_DEFAULT","AsyncQueryBusBase","Base","_lastState","_targetConfigs","_targetQueries","_lastResolveFailure","_queriesArchivist","_queriesDiviner","_reResolveDelay","_resolveMutex","Mutex","_responsesArchivist","_responsesDiviner","constructor","params","config","pollFrequency","frequency","rootModule","lastState","requiredConfig","max","ttl","LRUCache","queriesArchivist","runExclusive","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","resolved","ResolveHelper","resolveModuleIdentifier","logger","warn","name","debug","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","nextDelay","pollForResponse","start","response","get","undefined","delay","log","Math","floor","error","message","schema","sources","stop","forget","poll","setTimeoutEx","processIncomingResponses","e","clearTimeoutEx","pollFrequency","responseArchivist","responsesArchivist","responseBoundWitnessDiviner","responsesDiviner","pendingCommands","entries","filter","_","status","allSettled","map","sourceQuery","divinerQuery","limit","order","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","IDLE_POLLING_FREQUENCY_RATIO_MIN","IDLE_POLLING_FREQUENCY_RATIO_MAX","IDLE_POLLING_FREQUENCY_RATIO_DEFAULT","IDLE_THRESHOLD_RATIO_MIN","IDLE_THRESHOLD_RATIO_MAX","IDLE_THRESHOLD_RATIO_DEFAULT","AsyncQueryBusHost","AsyncQueryBusBase","_exposedAddresses","Set","_exposeOptions","_idle","_lastQueryTime","_pollId","constructor","params","exposedAddresses","idlePollFrequency","frequency","config","pollFrequency","idleThreshold","threshold","perAddressBatchQueryLimit","started","expose","module","options","failOnAlreadyExposed","isBridgeInstance","logger","warn","id","assertEx","has","address","add","debug","listeningModules","exposedModules","values","mods","Promise","all","map","exposedModule","asModuleInstance","resolveAddressToInstance","rootModule","start","console","poll","stop","clearTimeoutEx","undefined","unexpose","validate","resolve","maxDepth","delete","callLocalModule","localModule","query","Date","now","localModuleName","queryArchivist","queriesArchivist","intersect","queries","archivist","responsesArchivist","queryDestination","$meta","destination","includes","queryIndex","payload_hashes","indexOf","querySchema","payload_schemas","queryPayloads","get","onQueryFulfillStarted","payloads","queryPayloadsDict","PayloadBuilder","toAllHashMap","queryHash","build","$hash","containsAll","Object","keys","error","schema","result","allowedQueries","ModuleConfigSchema","bw","errors","insertResult","insert","length","timestamp","commitState","onQueryFulfillFinished","status","findQueriesToAddress","queriesDivinerId","boundWitnessDiviner","queriesBoundWitnessDiviner","queriesDiviner","retrieveState","limit","divinerQuery","order","BoundWitnessDivinerQuerySchema","divine","filter","isQueryBoundWitnessWithMeta","nextState","Math","max","c","ResolveHelper","traceModuleIdentifier","setTimeoutEx","processIncomingQueries","e","localModules","allSettled","AsyncQueryBusModuleHost","AbstractModuleHost","_busHost","constructor","params","start","listeningModules","config","module","resolve","direction","map","m","address","AsyncQueryBusHost","logger","rootModule","stop","import_assert","import_module_model","AsyncQueryBusModuleProxy","AbstractModuleProxy","createCount","constructor","params","Math","floor","console","log","proxyQueryHandler","query","payloads","busClient","send","address","resolve","idOrFilter","options","config","dead","downResolver","logger","module","transformers","moduleIdentifierTransformers","upResolver","ResolveHelper","filter","mod","parts","split","first","assertEx","shift","isAddress","childAddressByName","host","startHandler","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","import_assert","import_forget","import_hex","import_object","import_abstract_bridge","import_module_model","import_async_mutex","import_assert","import_hex","import_abstract_bridge","import_module_model","import_lru_cache","PubSubBridgeModuleResolver","AbstractBridgeModuleResolver","_resolvedCache","LRUCache","max","resolveHandler","id","options","parentResult","length","idParts","split","firstPart","shift","assertEx","isAddress","remainderParts","join","cachedMod","get","result","resolve","maxDepth","account","Account","randomSync","finalParams","archiving","params","busClient","config","schema","ModuleConfigSchema","host","moduleAddress","onQuerySendFinished","onQuerySendStarted","proxy","AsyncQueryBusModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","instance","asModuleInstance","upResolver","add","downResolver","set","address","moduleName","PubSubBridge","AbstractBridge","configSchemas","PubSubBridgeConfigSchema","defaultConfigSchema","_configRootAddress","_configStateStoreArchivist","_configStateStoreBoundWitnessDiviner","_exposedAddresses","_lastState","_busClient","_busHost","_discoverRootsMutex","Mutex","_resolver","resolver","PubSubBridgeModuleResolver","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","busClient","assertEx","onQuerySendFinished","args","forget","emit","module","onQuerySendStarted","root","wrapperAccount","account","modName","connect","id","maxDepth","transformedId","ResolveHelper","transformModuleIdentifier","existingInstance","resolve","address","instance","resolveHandler","connectInstance","disconnect","downResolver","remove","exposeChild","mod","options","console","log","host","busHost","expose","children","publicChildren","logger","toJsonString","map","child","exposedChildren","Promise","all","required","flat","filter","exists","allExposed","exposedMod","exposeHandler","resolveAddressToInstanceUp","Error","exposedHandler","exposedSet","exposedAddresses","getRoots","force","runExclusive","_roots","undefined","rootAddresses","config","roots","ex","warn","rootInstances","add","idOrFilter","workingSet","direction","remainingDepth","parts","split","first","shift","firstInstance","isAddress","resolveAddressToInstance","find","length","join","results","isAddressModuleFilter","includes","push","startHandler","start","unexposeHandler","unexpose","client","AsyncQueryBusClient","rootModule","AsyncQueryBusHost","onQueryFulfillFinished","onQueryFulfillStarted","node","asNodeInstance","state","isPayloadOfSchemaType","AddressSchema","s","a","stopHandler","_timeout","stop","creatableModule"]}
@@ -602,7 +602,10 @@ var AsyncQueryBusModuleHost = class extends AbstractModuleHost {
602
602
  };
603
603
 
604
604
  // src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts
605
+ import { assertEx as assertEx4 } from "@xylabs/assert";
606
+ import { isAddress } from "@xylabs/hex";
605
607
  import { AbstractModuleProxy } from "@xyo-network/abstract-bridge";
608
+ import { ResolveHelper as ResolveHelper3 } from "@xyo-network/module-model";
606
609
  var AsyncQueryBusModuleProxy = class _AsyncQueryBusModuleProxy extends AbstractModuleProxy {
607
610
  static {
608
611
  __name(this, "AsyncQueryBusModuleProxy");
@@ -618,6 +621,34 @@ var AsyncQueryBusModuleProxy = class _AsyncQueryBusModuleProxy extends AbstractM
618
621
  async proxyQueryHandler(query, payloads) {
619
622
  return await this.params.busClient.send(this.address, query, payloads);
620
623
  }
624
+ async resolve(idOrFilter = "*", options = {}) {
625
+ const config = {
626
+ address: this.address,
627
+ dead: this.dead,
628
+ downResolver: this.downResolver,
629
+ logger: this.logger,
630
+ module: this,
631
+ transformers: this.moduleIdentifierTransformers,
632
+ upResolver: this.upResolver
633
+ };
634
+ if (idOrFilter === "*") {
635
+ return (await ResolveHelper3.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address);
636
+ }
637
+ switch (typeof idOrFilter) {
638
+ case "string": {
639
+ const parts = idOrFilter.split(":");
640
+ const first = assertEx4(parts.shift(), () => "Missing first");
641
+ const address = isAddress(first) ? first : this.childAddressByName(first);
642
+ return this.params.host.resolve(address);
643
+ }
644
+ case "object": {
645
+ return (await ResolveHelper3.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address);
646
+ }
647
+ default: {
648
+ return (await ResolveHelper3.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address);
649
+ }
650
+ }
651
+ }
621
652
  async startHandler() {
622
653
  return await super.startHandler();
623
654
  }
@@ -630,28 +661,33 @@ var PubSubBridgeSchema = "network.xyo.bridge.pubsub";
630
661
  var PubSubBridgeConfigSchema = `${PubSubBridgeSchema}.config`;
631
662
 
632
663
  // src/PubSubBridge.ts
633
- import { assertEx as assertEx5 } from "@xylabs/assert";
664
+ import { assertEx as assertEx6 } from "@xylabs/assert";
634
665
  import { exists } from "@xylabs/exists";
635
666
  import { forget as forget2 } from "@xylabs/forget";
667
+ import { isAddress as isAddress3 } from "@xylabs/hex";
636
668
  import { toJsonString } from "@xylabs/object";
637
669
  import { AbstractBridge } from "@xyo-network/abstract-bridge";
638
670
  import { AddressSchema } from "@xyo-network/address-payload-plugin";
639
- import { creatableModule, resolveAddressToInstanceUp, ResolveHelper as ResolveHelper3 } from "@xyo-network/module-model";
671
+ import { creatableModule, isAddressModuleFilter, resolveAddressToInstance as resolveAddressToInstance2, resolveAddressToInstanceUp, ResolveHelper as ResolveHelper4 } from "@xyo-network/module-model";
640
672
  import { asNodeInstance } from "@xyo-network/node-model";
641
673
  import { isPayloadOfSchemaType } from "@xyo-network/payload-model";
642
674
  import { Mutex as Mutex2 } from "async-mutex";
643
675
 
644
676
  // src/PubSubBridgeModuleResolver.ts
645
- import { assertEx as assertEx4 } from "@xylabs/assert";
646
- import { isAddress } from "@xylabs/hex";
677
+ import { assertEx as assertEx5 } from "@xylabs/assert";
678
+ import { isAddress as isAddress2 } from "@xylabs/hex";
647
679
  import { AbstractBridgeModuleResolver, wrapModuleWithType } from "@xyo-network/abstract-bridge";
648
680
  import { Account } from "@xyo-network/account";
649
681
  import { ConfigSchema } from "@xyo-network/config-payload-plugin";
650
682
  import { asModuleInstance as asModuleInstance2, ModuleConfigSchema as ModuleConfigSchema2 } from "@xyo-network/module-model";
683
+ import { LRUCache as LRUCache3 } from "lru-cache";
651
684
  var PubSubBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
652
685
  static {
653
686
  __name(this, "PubSubBridgeModuleResolver");
654
687
  }
688
+ _resolvedCache = new LRUCache3({
689
+ max: 1e3
690
+ });
655
691
  async resolveHandler(id, options) {
656
692
  const parentResult = await super.resolveHandler(id, options);
657
693
  if (parentResult.length > 0) {
@@ -659,8 +695,18 @@ var PubSubBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
659
695
  }
660
696
  const idParts = id.split(":");
661
697
  const firstPart = idParts.shift();
662
- assertEx4(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
698
+ assertEx5(isAddress2(firstPart), () => `Invalid module address: ${firstPart}`);
663
699
  const remainderParts = idParts.join(":");
700
+ const cachedMod = this._resolvedCache.get(firstPart);
701
+ if (cachedMod) {
702
+ const result2 = idParts.length <= 0 ? cachedMod : cachedMod.resolve(remainderParts, {
703
+ ...options,
704
+ maxDepth: (options?.maxDepth ?? 5) - 1
705
+ });
706
+ return result2 ? [
707
+ result2
708
+ ] : [];
709
+ }
664
710
  const account = Account.randomSync();
665
711
  const finalParams = {
666
712
  account,
@@ -669,7 +715,7 @@ var PubSubBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
669
715
  config: {
670
716
  schema: ModuleConfigSchema2
671
717
  },
672
- host: this.params.bridge,
718
+ host: this,
673
719
  moduleAddress: firstPart,
674
720
  onQuerySendFinished: this.params.onQuerySendFinished,
675
721
  onQuerySendStarted: this.params.onQuerySendStarted
@@ -679,16 +725,16 @@ var PubSubBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
679
725
  const state = await proxy.state();
680
726
  if (state) {
681
727
  const configSchema = state.find((payload) => payload.schema === ConfigSchema)?.config;
682
- const config = assertEx4(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
728
+ const config = assertEx5(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
683
729
  proxy.setConfig(config);
684
730
  }
685
731
  }
686
732
  await proxy.start?.();
687
733
  const wrapped = wrapModuleWithType(proxy, account);
688
- const instance = assertEx4(asModuleInstance2(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
734
+ const instance = assertEx5(asModuleInstance2(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
689
735
  proxy.upResolver.add(instance);
690
736
  proxy.downResolver.add(instance);
691
- this.add(instance);
737
+ this._resolvedCache.set(instance.address, instance);
692
738
  const result = remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : instance;
693
739
  return result ? [
694
740
  result
@@ -727,7 +773,6 @@ var PubSubBridge = class extends AbstractBridge {
727
773
  _busHost;
728
774
  _discoverRootsMutex = new Mutex2();
729
775
  _resolver;
730
- _roots;
731
776
  get resolver() {
732
777
  this._resolver = this._resolver ?? new PubSubBridgeModuleResolver({
733
778
  archiving: {
@@ -735,7 +780,7 @@ var PubSubBridge = class extends AbstractBridge {
735
780
  resolveArchivists: this.resolveArchivingArchivists.bind(this)
736
781
  },
737
782
  bridge: this,
738
- busClient: assertEx5(this.busClient(), () => "busClient not configured"),
783
+ busClient: assertEx6(this.busClient(), () => "busClient not configured"),
739
784
  onQuerySendFinished: (args) => {
740
785
  forget2(this.emit("querySendFinished", {
741
786
  module: this,
@@ -757,7 +802,7 @@ var PubSubBridge = class extends AbstractBridge {
757
802
  return this.modName ?? moduleName;
758
803
  }
759
804
  async connect(id, maxDepth = 5) {
760
- const transformedId = assertEx5(await ResolveHelper3.transformModuleIdentifier(id), () => `Unable to transform module identifier: ${id}`);
805
+ const transformedId = assertEx6(await ResolveHelper4.transformModuleIdentifier(id), () => `Unable to transform module identifier: ${id}`);
761
806
  const existingInstance = await this.resolve(transformedId);
762
807
  if (existingInstance) {
763
808
  return existingInstance.address;
@@ -766,7 +811,7 @@ var PubSubBridge = class extends AbstractBridge {
766
811
  return await this.connectInstance(instance, maxDepth);
767
812
  }
768
813
  async disconnect(id) {
769
- const transformedId = assertEx5(await ResolveHelper3.transformModuleIdentifier(id), () => `Unable to transform module identifier: ${id}`);
814
+ const transformedId = assertEx6(await ResolveHelper4.transformModuleIdentifier(id), () => `Unable to transform module identifier: ${id}`);
770
815
  const instance = await this.resolve(transformedId);
771
816
  if (instance) {
772
817
  this.downResolver.remove(instance.address);
@@ -776,7 +821,7 @@ var PubSubBridge = class extends AbstractBridge {
776
821
  async exposeChild(mod, options) {
777
822
  const { maxDepth = 5 } = options ?? {};
778
823
  console.log(`exposeChild: ${mod.address} ${mod?.id} ${maxDepth}`);
779
- const host = assertEx5(this.busHost(), () => "Not configured as a host");
824
+ const host = assertEx6(this.busHost(), () => "Not configured as a host");
780
825
  host.expose(mod);
781
826
  const children = maxDepth > 0 ? await mod.publicChildren?.() ?? [] : [];
782
827
  this.logger.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toJsonString(children.map((child) => child.id))}`);
@@ -815,7 +860,7 @@ var PubSubBridge = class extends AbstractBridge {
815
860
  if (this._roots === void 0 || force) {
816
861
  const rootAddresses = (await Promise.all((this.config.roots ?? []).map((id) => {
817
862
  try {
818
- return ResolveHelper3.transformModuleIdentifier(id);
863
+ return ResolveHelper4.transformModuleIdentifier(id);
819
864
  } catch (ex) {
820
865
  this.logger?.warn("Unable to transform module identifier:", id, ex);
821
866
  return;
@@ -837,13 +882,54 @@ var PubSubBridge = class extends AbstractBridge {
837
882
  return this._roots;
838
883
  });
839
884
  }
885
+ // eslint-disable-next-line complexity
886
+ async resolve(idOrFilter = "*", options = {}) {
887
+ const roots = this._roots ?? [];
888
+ const workingSet = options.direction === "up" ? [
889
+ this
890
+ ] : [
891
+ ...roots,
892
+ this
893
+ ];
894
+ if (idOrFilter === "*") {
895
+ const remainingDepth = (options.maxDepth ?? 1) - 1;
896
+ return remainingDepth <= 0 ? workingSet : [
897
+ ...workingSet,
898
+ ...(await Promise.all(roots.map((mod) => mod.resolve("*", {
899
+ ...options,
900
+ maxDepth: remainingDepth
901
+ })))).flat()
902
+ ];
903
+ }
904
+ switch (typeof idOrFilter) {
905
+ case "string": {
906
+ const parts = idOrFilter.split(":");
907
+ const first = assertEx6(parts.shift(), () => "Missing first part");
908
+ const firstInstance = isAddress3(first) ? await resolveAddressToInstance2(this, first, void 0, [], options.direction) : this._roots?.find((mod) => mod.id === first);
909
+ return parts.length === 0 ? firstInstance : firstInstance?.resolve(parts.join(":"), options);
910
+ }
911
+ case "object": {
912
+ const results = [];
913
+ if (isAddressModuleFilter(idOrFilter)) {
914
+ for (const mod of workingSet) {
915
+ if (mod.modName && idOrFilter.address.includes(mod.address))
916
+ results.push(mod);
917
+ }
918
+ }
919
+ return results;
920
+ }
921
+ default: {
922
+ return;
923
+ }
924
+ }
925
+ }
840
926
  async startHandler() {
841
927
  this.busHost()?.start();
842
928
  return await super.startHandler();
843
929
  }
844
930
  async unexposeHandler(id, options) {
845
931
  const { maxDepth = 2, required = true } = options ?? {};
846
- const host = assertEx5(this.busHost(), () => "Not configured as a host");
932
+ const host = assertEx6(this.busHost(), () => "Not configured as a host");
847
933
  const module = await host.unexpose(id, required);
848
934
  if (module) {
849
935
  const children = maxDepth > 0 ? await module.publicChildren?.() ?? [] : [];