@xyo-network/bridge-pub-sub 2.93.0-rc.1 → 2.93.0-rc.2

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 (51) hide show
  1. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.cts.map +1 -1
  2. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.mts.map +1 -1
  3. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.ts.map +1 -1
  4. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts +7 -2
  5. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  6. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts +7 -2
  7. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  8. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts +7 -2
  9. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  10. package/dist/browser/PubSubBridge.d.cts +4 -4
  11. package/dist/browser/PubSubBridge.d.cts.map +1 -1
  12. package/dist/browser/PubSubBridge.d.mts +4 -4
  13. package/dist/browser/PubSubBridge.d.mts.map +1 -1
  14. package/dist/browser/PubSubBridge.d.ts +4 -4
  15. package/dist/browser/PubSubBridge.d.ts.map +1 -1
  16. package/dist/browser/PubSubBridgeModuleResolver.d.cts.map +1 -1
  17. package/dist/browser/PubSubBridgeModuleResolver.d.mts.map +1 -1
  18. package/dist/browser/PubSubBridgeModuleResolver.d.ts.map +1 -1
  19. package/dist/browser/index.cjs +35 -26
  20. package/dist/browser/index.cjs.map +1 -1
  21. package/dist/browser/index.js +33 -24
  22. package/dist/browser/index.js.map +1 -1
  23. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.cts.map +1 -1
  24. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.mts.map +1 -1
  25. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.ts.map +1 -1
  26. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts +7 -2
  27. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  28. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts +7 -2
  29. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  30. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts +7 -2
  31. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  32. package/dist/node/PubSubBridge.d.cts +4 -4
  33. package/dist/node/PubSubBridge.d.cts.map +1 -1
  34. package/dist/node/PubSubBridge.d.mts +4 -4
  35. package/dist/node/PubSubBridge.d.mts.map +1 -1
  36. package/dist/node/PubSubBridge.d.ts +4 -4
  37. package/dist/node/PubSubBridge.d.ts.map +1 -1
  38. package/dist/node/PubSubBridgeModuleResolver.d.cts.map +1 -1
  39. package/dist/node/PubSubBridgeModuleResolver.d.mts.map +1 -1
  40. package/dist/node/PubSubBridgeModuleResolver.d.ts.map +1 -1
  41. package/dist/node/index.cjs +38 -28
  42. package/dist/node/index.cjs.map +1 -1
  43. package/dist/node/index.js +36 -26
  44. package/dist/node/index.js.map +1 -1
  45. package/package.json +18 -16
  46. package/src/AsyncQueryBus/AsyncQueryBusBase.ts +0 -4
  47. package/src/AsyncQueryBus/AsyncQueryBusClient.ts +4 -4
  48. package/src/AsyncQueryBus/AsyncQueryBusHost.ts +1 -1
  49. package/src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts +14 -7
  50. package/src/PubSubBridge.ts +19 -14
  51. package/src/PubSubBridgeModuleResolver.ts +15 -3
@@ -91,21 +91,17 @@ var _AsyncQueryBusBase = class _AsyncQueryBusBase extends import_object2.Base {
91
91
  }
92
92
  async queriesArchivist() {
93
93
  var _a, _b, _c;
94
- console.log(`queriesArchivist: ${this.resolver.constructor.name}`);
95
94
  const resolved = await this.resolver.resolve((_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.queries) == null ? void 0 : _c.archivist, {
96
95
  direction: "up"
97
96
  });
98
- console.log(`resolved: ${(0, import_object2.toJsonString)(resolved)}`);
99
97
  const existingResolved = (0, import_assert.assertEx)(resolved, () => {
100
98
  var _a2, _b2, _c2;
101
99
  return `Unable to resolve queriesArchivist [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.queries) == null ? void 0 : _c2.archivist}]`;
102
100
  });
103
- console.log("existingResolved", (0, import_object2.toJsonString)(existingResolved));
104
101
  const result = (0, import_archivist_model.asArchivistInstance)(existingResolved, () => {
105
102
  var _a2, _b2, _c2, _d;
106
103
  return `Unable to resolve queriesArchivist as correct type [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.queries) == null ? void 0 : _c2.archivist}][${(_d = existingResolved == null ? void 0 : existingResolved.constructor) == null ? void 0 : _d.name}]: ${(0, import_object2.toJsonString)(existingResolved)}`;
107
104
  });
108
- console.log("result", (0, import_object2.toJsonString)(result));
109
105
  return result;
110
106
  }
111
107
  async queriesDiviner() {
@@ -207,7 +203,6 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
207
203
  }
208
204
  async send(address, query, payloads) {
209
205
  var _a, _b, _c, _d;
210
- console.log("send");
211
206
  (_a = this.logger) == null ? void 0 : _a.debug(`Begin issuing query to: ${address}`);
212
207
  const $meta = {
213
208
  ...query == null ? void 0 : query.$meta,
@@ -219,9 +214,7 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
219
214
  ...query,
220
215
  $meta
221
216
  });
222
- console.log("queryArchivist - calling");
223
217
  const queryArchivist = await this.queriesArchivist();
224
- console.log("queryArchivist");
225
218
  const routedQueryHash = (
226
219
  // Trust the signed hash if it's there
227
220
  (routedQuery == null ? void 0 : routedQuery.$hash) ?? // TODO: What is the right way to find the dataHash
@@ -250,7 +243,6 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
250
243
  this.start();
251
244
  let response = this.queryCache.get(routedQueryHash);
252
245
  while (response !== void 0) {
253
- console.log("polling...");
254
246
  await (0, import_delay.delay)(100);
255
247
  response = this.queryCache.get(routedQueryHash);
256
248
  if (response && response !== Pending) {
@@ -517,7 +509,7 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
517
509
  var _a2, _b, _c;
518
510
  try {
519
511
  const localModuleName = localModule.config.name ?? localModule.address;
520
- (_a2 = this.logger) == null ? void 0 : _a2.debug(`Checking for inbound queries to ${localModuleName}`);
512
+ (_a2 = this.logger) == null ? void 0 : _a2.debug(`Checking for inbound queries to ${localModuleName} [${localModule.address}]`);
521
513
  const queries = await this.findQueriesToAddress(localModule.address);
522
514
  if (queries.length === 0)
523
515
  return;
@@ -566,12 +558,11 @@ var AsyncQueryBusModuleHost = _AsyncQueryBusModuleHost;
566
558
  // src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts
567
559
  var import_abstract_bridge = require("@xyo-network/abstract-bridge");
568
560
  var _AsyncQueryBusModuleProxy = class _AsyncQueryBusModuleProxy extends import_abstract_bridge.AbstractModuleProxy {
561
+ pipeline;
569
562
  async proxyQueryHandler(query, payloads) {
570
- console.log("proxyQueryHandler - async query bus module proxy");
571
- return await this.proxyParams.busClient.send(this.address, query, payloads);
563
+ return await this.params.busClient.send(this.address, query, payloads);
572
564
  }
573
565
  async startHandler() {
574
- console.log("startHandler - async query bus module proxy");
575
566
  return await super.startHandler();
576
567
  }
577
568
  };
@@ -588,16 +579,18 @@ var PubSubBridgeConfigSchema = `${PubSubBridgeSchema}.config`;
588
579
  var import_assert4 = require("@xylabs/assert");
589
580
  var import_exists = require("@xylabs/exists");
590
581
  var import_abstract_bridge3 = require("@xyo-network/abstract-bridge");
591
- var import_module_model2 = require("@xyo-network/module-model");
582
+ var import_module_model3 = require("@xyo-network/module-model");
592
583
 
593
584
  // src/PubSubBridgeModuleResolver.ts
594
585
  var import_assert3 = require("@xylabs/assert");
595
586
  var import_hex = require("@xylabs/hex");
596
587
  var import_abstract_bridge2 = require("@xyo-network/abstract-bridge");
597
588
  var import_account = require("@xyo-network/account");
589
+ var import_config_payload_plugin = require("@xyo-network/config-payload-plugin");
590
+ var import_module_model2 = require("@xyo-network/module-model");
598
591
  var _PubSubBridgeModuleResolver = class _PubSubBridgeModuleResolver extends import_abstract_bridge2.AbstractBridgeModuleResolver {
599
592
  async resolveHandler(id, options) {
600
- var _a;
593
+ var _a, _b;
601
594
  const parentResult = await super.resolveHandler(id, options);
602
595
  if (parentResult) {
603
596
  return parentResult;
@@ -610,14 +603,24 @@ var _PubSubBridgeModuleResolver = class _PubSubBridgeModuleResolver extends impo
610
603
  const params = {
611
604
  account,
612
605
  busClient: this.options.busClient,
606
+ config: {
607
+ schema: import_module_model2.ModuleConfigSchema
608
+ },
613
609
  host: this.options.bridge,
614
610
  moduleAddress: firstPart
615
611
  };
616
612
  const proxy = new AsyncQueryBusModuleProxy(params);
617
- await ((_a = proxy.start) == null ? void 0 : _a.call(proxy));
613
+ if (proxy) {
614
+ const state = await proxy.state();
615
+ if (state) {
616
+ const configSchema = (_a = state.find((payload) => payload.schema === import_config_payload_plugin.ConfigSchema)) == null ? void 0 : _a.config;
617
+ const config = (0, import_assert3.assertEx)(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
618
+ proxy.setConfig(config);
619
+ }
620
+ }
621
+ await ((_b = proxy.start) == null ? void 0 : _b.call(proxy));
618
622
  const wrappedProxy = (0, import_abstract_bridge2.wrapModuleWithType)(proxy, account);
619
623
  this.add(wrappedProxy);
620
- console.log("ding!");
621
624
  return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : wrappedProxy;
622
625
  }
623
626
  };
@@ -660,12 +663,19 @@ var _PubSubBridge = class _PubSubBridge extends import_abstract_bridge3.Abstract
660
663
  get roots() {
661
664
  return (0, import_assert4.assertEx)(this.config.roots, () => "roots not configured");
662
665
  }
666
+ async discoverRoots() {
667
+ const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve(root)))).filter(import_exists.exists);
668
+ for (const instance of rootInstances) {
669
+ this.downResolver.add(instance);
670
+ }
671
+ return rootInstances;
672
+ }
663
673
  async exposeHandler(id, options) {
664
- const { maxDepth = 1, direction } = options ?? {};
674
+ const { maxDepth = 5, direction } = options ?? {};
665
675
  const filterOptions = {
666
676
  direction
667
677
  };
668
- const module2 = await super.resolve(id, filterOptions);
678
+ const module2 = (0, import_assert4.assertEx)(await super.resolve(id, filterOptions), () => `Expose failed to locate module [${id}]`);
669
679
  if (module2) {
670
680
  const host = (0, import_assert4.assertEx)(this.busHost(), () => "Not configured as a host");
671
681
  host.expose(module2.address);
@@ -684,6 +694,13 @@ var _PubSubBridge = class _PubSubBridge extends import_abstract_bridge3.Abstract
684
694
  }
685
695
  return [];
686
696
  }
697
+ exposedHandler() {
698
+ var _a;
699
+ const exposedSet = (_a = this.busHost()) == null ? void 0 : _a.exposedAddresses;
700
+ return exposedSet ? [
701
+ ...exposedSet
702
+ ] : [];
703
+ }
687
704
  async startHandler() {
688
705
  var _a;
689
706
  (_a = this.busHost()) == null ? void 0 : _a.start();
@@ -718,7 +735,7 @@ var _PubSubBridge = class _PubSubBridge extends import_abstract_bridge3.Abstract
718
735
  this._busClient = new AsyncQueryBusClient({
719
736
  config: this.config.client,
720
737
  logger: this.logger,
721
- resolver: this.upResolver
738
+ resolver: this
722
739
  });
723
740
  }
724
741
  return this._busClient;
@@ -728,18 +745,11 @@ var _PubSubBridge = class _PubSubBridge extends import_abstract_bridge3.Abstract
728
745
  this._busHost = new AsyncQueryBusHost({
729
746
  config: this.config.host,
730
747
  logger: this.logger,
731
- resolver: this.upResolver
748
+ resolver: this
732
749
  });
733
750
  }
734
751
  return this._busHost;
735
752
  }
736
- async discoverRoots() {
737
- const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve(root)))).filter(import_exists.exists);
738
- for (const instance of rootInstances) {
739
- this.downResolver.add(instance);
740
- }
741
- return rootInstances;
742
- }
743
753
  stopHandler(_timeout) {
744
754
  var _a;
745
755
  (_a = this.busHost()) == null ? void 0 : _a.stop();
@@ -752,7 +762,7 @@ __publicField(_PubSubBridge, "configSchemas", [
752
762
  ]);
753
763
  var PubSubBridge = _PubSubBridge;
754
764
  PubSubBridge = _ts_decorate([
755
- (0, import_module_model2.creatableModule)()
765
+ (0, import_module_model3.creatableModule)()
756
766
  ], PubSubBridge);
757
767
  // Annotate the CommonJS export names for ESM import in node:
758
768
  0 && (module.exports = {
@@ -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 { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { CacheConfig, ModuleQueryResult } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { ModuleError, Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusClientParams, Pending } from './model'\n\nexport class AsyncQueryBusClient<TParams extends AsyncQueryBusClientParams = AsyncQueryBusClientParams> extends AsyncQueryBusBase<TParams> {\n protected _queryCache?: LRUCache<Address, Pending | ModuleQueryResult>\n private _pollCount = 0\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get queryCacheConfig(): LRUCache.Options<Address, Pending | ModuleQueryResult, unknown> {\n const queryCacheConfig: CacheConfig | undefined = this.config?.queryCache === true ? {} : this.config?.queryCache\n return { max: 100, ttl: 1000 * 60, ...queryCacheConfig }\n }\n\n get started() {\n return !!this._pollId\n }\n\n /**\n * A cache of queries that have been issued\n */\n protected get queryCache(): LRUCache<Address, Pending | ModuleQueryResult> {\n const config = this.queryCacheConfig\n const requiredConfig = { noUpdateTTL: false, ttlAutopurge: true }\n this._queryCache = this._queryCache ?? new LRUCache<Address, Pending | ModuleQueryResult>({ ...config, ...requiredConfig })\n return this._queryCache\n }\n\n listeningAddresses() {\n return this._queryCache?.keys()\n }\n\n async send(address: Address, query: QueryBoundWitness, payloads?: Payload[] | undefined): Promise<ModuleQueryResult> {\n console.log('send')\n this.logger?.debug(`Begin issuing query to: ${address}`)\n const $meta = { ...query?.$meta, destination: [address] }\n const routedQuery = await PayloadBuilder.build({ ...query, $meta })\n console.log('queryArchivist - calling')\n const queryArchivist = await this.queriesArchivist()\n console.log('queryArchivist')\n\n // TODO: Should we always re-hash to true up timestamps? We can't\n // re-sign correctly so we would lose that information if we did and\n // would also be replying to consumers with a different query hash than\n // they sent us (which might be OK since it reflect the chain of custody)\n // Revisit this once we have proxy module support as they are another\n // intermediary to consider.\n const routedQueryHash =\n // Trust the signed hash if it's there\n (routedQuery as WithMeta<QueryBoundWitness>)?.$hash ??\n // TODO: What is the right way to find the dataHash\n Object.keys(await PayloadBuilder.toDataHashMap([routedQuery]))[0]\n this.logger?.debug(`Issuing query: ${routedQueryHash} to: ${address}`)\n // If there was data associated with the query, add it to the insert\n const data = payloads ? [routedQuery, ...payloads] : [routedQuery]\n const insertResult = await queryArchivist.insert?.(data)\n this.logger?.debug(`Issued query: ${routedQueryHash} to: ${address}`)\n this.queryCache.set(routedQueryHash, Pending)\n if (!insertResult) throw new Error('Unable to issue query to queryArchivist')\n const context = new Promise<ModuleQueryResult>((resolve, reject) => {\n this.logger?.debug(`Polling for response to query: ${routedQueryHash}`)\n const pollForResponse = async () => {\n try {\n this.start()\n let response = this.queryCache.get(routedQueryHash)\n // Poll for response until cache key expires (response timed out)\n while (response !== undefined) {\n console.log('polling...')\n // Wait a bit\n await delay(100)\n // Check the status of the response\n response = this.queryCache.get(routedQueryHash)\n // If status is no longer pending that means we received a response\n if (response && response !== Pending) {\n this.logger?.debug(`Returning response to query: ${routedQueryHash}`)\n resolve(response)\n return\n }\n }\n // If we got here waiting for a response timed out\n this.logger?.error('Timeout waiting for query response')\n // Resolve with error to match what a local module would do if it were to error\n // TODO: BW Builder/Sign result as this module?\n const error: ModuleError = {\n message: 'Timeout waiting for query response',\n query: 'network.xyo.boundwitness',\n schema: 'network.xyo.error.module',\n sources: [routedQueryHash],\n }\n reject(error)\n return\n } finally {\n this.stop()\n }\n }\n forget(pollForResponse())\n })\n return context\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingResponses()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for processing incoming responses to previously issued queries\n */\n private processIncomingResponses = async () => {\n const responseArchivist = await this.responsesArchivist()\n const responseBoundWitnessDiviner = await this.responsesDiviner()\n const pendingCommands = [...this.queryCache.entries()].filter(([_, status]) => status === Pending)\n // TODO: Do in throttled batches\n await Promise.allSettled(\n pendingCommands.map(async ([sourceQuery, status]) => {\n if (status === Pending) {\n const divinerQuery: BoundWitnessDivinerQueryPayload = { schema: BoundWitnessDivinerQuerySchema, sourceQuery }\n const result = await responseBoundWitnessDiviner.divine([divinerQuery])\n if (result && result.length > 0) {\n const response = result.find(isBoundWitnessWithMeta)\n if (response && (response?.$meta as unknown as { sourceQuery: string })?.sourceQuery === sourceQuery) {\n this.logger?.debug(`Found response to query: ${sourceQuery}`)\n // Get any payloads associated with the response\n const payloads: PayloadWithMeta[] = response.payload_hashes?.length > 0 ? await responseArchivist.get(response.payload_hashes) : []\n this.queryCache.set(sourceQuery, [response, payloads, []])\n }\n }\n }\n }),\n )\n }\n\n 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, toJsonString } from '@xylabs/object'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload } from '@xyo-network/diviner-boundwitness-model'\nimport { asDivinerInstance, DivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleConfig } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusParams } from './model'\n\nexport class AsyncQueryBusBase<TParams extends AsyncQueryBusParams = AsyncQueryBusParams> extends Base<TParams> {\n protected _lastState?: LRUCache<Address, number>\n protected _targetConfigs: Record<Address, ModuleConfig> = {}\n protected _targetQueries: Record<Address, string[]> = {}\n\n constructor(params: TParams) {\n super(params)\n }\n\n get config(): TParams['config'] {\n return this.params.config\n }\n\n get pollFrequencyConfig(): number {\n return this.config?.pollFrequency ?? 1000\n }\n\n get resolver() {\n return this.params.resolver\n }\n\n /**\n * A cache of the last offset of the Diviner process per address\n */\n protected get lastState(): LRUCache<Address, number> {\n const requiredConfig = { max: 1000, ttl: 0 }\n this._lastState = this._lastState ?? new LRUCache<Address, number>(requiredConfig)\n return this._lastState\n }\n\n async queriesArchivist() {\n console.log(`queriesArchivist: ${this.resolver.constructor.name}`)\n const resolved = await this.resolver.resolve(this.config?.intersect?.queries?.archivist, { direction: 'up' })\n console.log(`resolved: ${toJsonString(resolved)}`)\n const existingResolved = assertEx(resolved, () => `Unable to resolve queriesArchivist [${this.config?.intersect?.queries?.archivist}]`)\n console.log('existingResolved', toJsonString(existingResolved))\n const result = asArchivistInstance(\n existingResolved,\n () =>\n `Unable to resolve queriesArchivist as correct type [${this.config?.intersect?.queries?.archivist}][${existingResolved?.constructor?.name}]: ${toJsonString(existingResolved)}`,\n )\n console.log('result', toJsonString(result))\n return result\n }\n\n async queriesDiviner() {\n return assertEx(\n asDivinerInstance(await this.resolver.resolve(this.config?.intersect?.queries?.boundWitnessDiviner)),\n () => `Unable to resolve queriesDiviner [${this.config?.intersect?.queries?.boundWitnessDiviner}]`,\n ) as DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, QueryBoundWitness>\n }\n\n async responsesArchivist() {\n return assertEx(\n asArchivistInstance(await this.resolver.resolve(this.config?.intersect?.responses?.archivist)),\n () => `Unable to resolve responsesArchivist [${this.config?.intersect?.responses?.archivist}]`,\n )\n }\n\n async responsesDiviner() {\n return assertEx(\n asDivinerInstance(await this.resolver.resolve(this.config?.intersect?.responses?.boundWitnessDiviner)),\n () => `Unable to resolve responsesDiviner [${this.config?.intersect?.responses?.boundWitnessDiviner}]`,\n ) as DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, BoundWitness>\n }\n\n /**\n * Commit the internal state of the process. This is similar\n * to a transaction completion in a database and should only be called\n * when results have been successfully persisted to the appropriate\n * external stores.\n * @param address The module address to commit the state for\n * @param nextState The state to commit\n */\n protected async commitState(address: Address, nextState: number) {\n await Promise.resolve()\n // TODO: Offload to Archivist/Diviner instead of in-memory\n const lastState = this.lastState.get(address)\n if (lastState && lastState >= nextState) return\n this.lastState.set(address, nextState)\n }\n\n /**\n * Retrieves the last state of the process. Used to recover state after\n * preemptions, reboots, etc.\n */\n protected async retrieveState(address: Address): Promise<number> {\n await Promise.resolve()\n const state = this.lastState.get(address)\n if (state === undefined) {\n // If this is a boot we can go back a bit in time\n // and begin processing recent commands\n const newState = Date.now() - 1000\n this.lastState.set(address, newState)\n return newState\n } else {\n return state\n }\n }\n}\n","export const Pending = 'pending' as const\nexport type Pending = typeof Pending\n","import { containsAll } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isQueryBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { asModuleInstance, ModuleConfigSchema, ModuleInstance } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Schema, WithMeta } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusHostParams } from './model'\n\nexport interface ExposeOptions {\n allowedQueries?: Schema[]\n failOnAlreadyExposed?: boolean\n}\n\nexport class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQueryBusHostParams> extends AsyncQueryBusBase<TParams> {\n protected _exposedAddresses = new Set<Address>()\n private _exposeOptions: Record<Address, ExposeOptions> = {}\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get exposedAddresses() {\n return this._exposedAddresses\n }\n\n get perAddressBatchQueryLimit(): number {\n return this.config?.perAddressBatchQueryLimit ?? 10\n }\n\n get started() {\n return !!this._pollId\n }\n\n expose(address: Address, options: ExposeOptions = {}) {\n const { failOnAlreadyExposed } = options\n assertEx(!failOnAlreadyExposed || !this._exposedAddresses.has(address), () => `Address already exposed [${address}]`)\n this._exposedAddresses.add(address)\n this._exposeOptions[address] = { ...options }\n this.logger?.debug(`${address} exposed`)\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 (listeningModule) =>\n assertEx(asModuleInstance(await this.resolver.resolve(listeningModule)), () => `Unable to resolve listeningModule [${listeningModule}]`),\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 unexpose(address: Address, validate = true) {\n assertEx(!validate || this._exposedAddresses.has(address), () => `Address not exposed [${address}]`)\n this._exposedAddresses.delete(address)\n delete this._exposeOptions[address]\n this.logger?.debug(`${address} unexposed`)\n }\n\n protected callLocalModule = async (localModule: ModuleInstance, query: WithMeta<QueryBoundWitness>) => {\n const localModuleName = localModule.config.name ?? localModule.address\n const queryArchivist = await this.queriesArchivist()\n const responseArchivist = await this.responsesArchivist()\n const queryDestination = (query.$meta as { destination?: string[] })?.destination\n if (queryDestination && queryDestination?.includes(localModule.address)) {\n // Find the query\n const queryIndex = query.payload_hashes.indexOf(query.query)\n if (queryIndex !== -1) {\n const querySchema = query.payload_schemas[queryIndex]\n // If the destination can process this type of query\n if (localModule.queries.includes(querySchema)) {\n // Get the associated payloads\n const queryPayloads = await queryArchivist.get(query.payload_hashes)\n const queryPayloadsDict = await PayloadBuilder.toAllHashMap(queryPayloads)\n const queryHash = (await PayloadBuilder.build(query)).$hash\n // Check that we have all the arguments for the command\n if (!containsAll(Object.keys(queryPayloadsDict), query.payload_hashes)) {\n this.logger?.error(`Error processing command ${queryHash} for module ${localModuleName}, missing payloads`)\n return\n }\n try {\n // Issue the query against module\n const querySchema = queryPayloadsDict[query.query].schema\n this.logger?.debug(`Issuing query ${querySchema} (${queryHash}) addressed to module: ${localModuleName}`)\n const response = await localModule.query(query, queryPayloads, {\n allowedQueries: this._exposeOptions[localModule.address]?.allowedQueries,\n schema: ModuleConfigSchema,\n })\n const [bw, payloads, errors] = response\n this.logger?.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`)\n const insertResult = await responseArchivist.insert([bw, ...payloads, ...errors])\n // NOTE: If all archivists support the contract that numPayloads inserted === numPayloads returned we can\n // do some deeper assertions here like lenIn === lenOut, but for now this should be good enough since BWs\n // should always be unique causing at least one insertion\n if (insertResult.length === 0) {\n this.logger?.error(`Error replying to query ${queryHash} addressed to module: ${localModuleName}`)\n }\n if (query?.timestamp) {\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to ensure we are using the timestamp of the store\n // so there's no chance of multiple commands at the same time\n await this.commitState(localModule.address, query.timestamp)\n }\n } catch (error) {\n this.logger?.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n console.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n }\n }\n }\n }\n }\n\n /**\n * Finds unprocessed commands addressed to the supplied address\n * @param address The address to find commands for\n */\n protected findQueriesToAddress = async (address: Address) => {\n const queryBoundWitnessDiviner = await this.queriesDiviner()\n // Retrieve last offset from state store\n const timestamp = await this.retrieveState(address)\n const destination = [address]\n const limit = this.perAddressBatchQueryLimit\n // Filter for commands to us by destination address\n const divinerQuery = { destination, limit, schema: BoundWitnessDivinerQuerySchema, sort: 'asc', timestamp }\n const result = await queryBoundWitnessDiviner.divine([divinerQuery])\n const queries = result.filter(isQueryBoundWitnessWithMeta)\n const nextState = queries.length > 0 ? Math.max(...queries.map((c) => c.timestamp ?? 0)) + 1 : timestamp\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to use the timestamp of the store so there's no\n // chance of multiple commands at the same time\n await this.commitState(address, nextState)\n return queries\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingQueries()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for checking for inbound queries\n */\n private processIncomingQueries = async () => {\n this.logger?.debug('Checking for inbound queries')\n // Check for any queries that have been issued and have not been responded to\n const localModules = await this.listeningModules()\n\n // TODO: Do in throttled batches\n await Promise.allSettled(\n localModules.map(async (localModule) => {\n try {\n const localModuleName = localModule.config.name ?? localModule.address\n this.logger?.debug(`Checking for inbound queries to ${localModuleName}`)\n const queries = await this.findQueriesToAddress(localModule.address)\n if (queries.length === 0) return\n this.logger?.debug(`Found queries addressed to local module: ${localModuleName}`)\n for (const query of queries) {\n await this.callLocalModule(localModule, query)\n }\n } catch (error) {\n this.logger?.error(`Error processing queries for address ${localModule.address}: ${error}`)\n }\n }),\n )\n }\n}\n","import { AbstractModuleHost, ModuleHostParams } from '../../AbstractModuleHost'\nimport { AsyncQueryBusHost } from '../AsyncQueryBusHost'\nimport { AsyncQueryBusHostConfig } from '../model'\n\nexport type AsyncQueryBusModuleHostParams = ModuleHostParams & {\n config: AsyncQueryBusHostConfig\n}\n\nexport class AsyncQueryBusModuleHost extends AbstractModuleHost<AsyncQueryBusModuleHostParams> {\n private _busHost?: AsyncQueryBusHost\n\n constructor(params: AsyncQueryBusModuleHostParams) {\n super(params)\n }\n\n override async start(): Promise<void> {\n const listeningModules =\n this.params.config.listeningModules ?? (await this.params.module.resolve('*', { direction: 'down' })).map((m) => m.address)\n this._busHost = new AsyncQueryBusHost({\n config: { ...this.params.config, listeningModules },\n logger: this.params.logger,\n resolver: this.params.module,\n })\n this._busHost?.start()\n }\n override stop() {\n this._busHost?.stop()\n }\n}\n","import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { Module, 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<TWrappedModule extends Module = Module>\n extends AbstractModuleProxy<AsyncQueryBusModuleProxyParams, TWrappedModule>\n implements ModuleInstance<TWrappedModule['params'], TWrappedModule['eventData']>\n{\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {\n console.log('proxyQueryHandler - async query bus module proxy')\n return await this.proxyParams.busClient.send(this.address, query, payloads)\n }\n\n override async startHandler(): Promise<boolean> {\n console.log('startHandler - async query bus module proxy')\n return await super.startHandler()\n }\n}\n","export const PubSubBridgeSchema = 'network.xyo.bridge.pubsub'\nexport type PubSubBridgeSchema = typeof PubSubBridgeSchema\n","import { Address } from '@xylabs/hex'\nimport { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nimport { AsyncQueryBusClientConfig, AsyncQueryBusHostConfig } from './AsyncQueryBus'\nimport { PubSubBridgeSchema } from './Schema'\n\nexport const PubSubBridgeConfigSchema = `${PubSubBridgeSchema}.config`\nexport type PubSubBridgeConfigSchema = typeof PubSubBridgeConfigSchema\n\n/**\n * Configuration for the PubSubBridge\n */\nexport type PubSubBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n client?: AsyncQueryBusClientConfig\n host?: AsyncQueryBusHostConfig\n roots?: Address[]\n } & TConfig,\n TSchema extends string ? TSchema : PubSubBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { creatableModule, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusClient, AsyncQueryBusHost } from './AsyncQueryBus'\nimport { PubSubBridgeConfigSchema } from './Config'\nimport { PubSubBridgeParams } from './Params'\nimport { PubSubBridgeModuleResolver } from './PubSubBridgeModuleResolver'\n\nconst moduleName = 'PubSubBridge'\n\n@creatableModule()\nexport class PubSubBridge<TParams extends PubSubBridgeParams = PubSubBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams> {\n static override configSchemas = [PubSubBridgeConfigSchema]\n\n protected _configRootAddress: Address = ''\n protected _configStateStoreArchivist: string = ''\n protected _configStateStoreBoundWitnessDiviner: string = ''\n protected _exposedAddresses: Address[] = []\n protected _lastState?: LRUCache<string, number>\n\n private _busClient?: AsyncQueryBusClient\n private _busHost?: AsyncQueryBusHost\n private _resolver?: PubSubBridgeModuleResolver\n\n override get resolver() {\n this._resolver =\n this._resolver ??\n new PubSubBridgeModuleResolver({\n bridge: this,\n busClient: assertEx(this.busClient(), () => 'busClient not configured'),\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n protected get moduleName() {\n return `${this.config.name ?? moduleName}`\n }\n\n protected get roots() {\n return assertEx(this.config.roots, () => 'roots not configured')\n }\n\n async exposeHandler(id: ModuleIdentifier, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 1, direction } = options ?? {}\n const filterOptions: ModuleFilterOptions = { direction }\n const module = await super.resolve(id, filterOptions)\n if (module) {\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n host.expose(module.address)\n const children = await module.resolve('*', { direction, maxDepth, visibility: 'public' })\n for (const child of children) {\n host.expose(child.address)\n }\n return [module, ...children]\n }\n return []\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 = 1, direction } = options ?? {}\n const filterOptions: ModuleFilterOptions = { direction }\n const module = await super.resolve(id, filterOptions)\n if (module) {\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n host.unexpose(module.address)\n const children = await module.resolve('*', { direction, maxDepth, visibility: 'public' })\n for (const child of children) {\n host.unexpose(child.address)\n }\n return [module, ...children]\n }\n return []\n }\n\n protected busClient() {\n if (!this._busClient && this.config.client) {\n this._busClient = new AsyncQueryBusClient({\n config: this.config.client,\n logger: this.logger,\n resolver: this.upResolver,\n })\n }\n return this._busClient\n }\n\n protected busHost() {\n if (!this._busHost && this.config.host) {\n this._busHost = new AsyncQueryBusHost({\n config: this.config.host,\n logger: this.logger,\n resolver: this.upResolver,\n })\n }\n return this._busHost\n }\n\n protected override async discoverRoots(): Promise<ModuleInstance[]> {\n const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve<ModuleInstance>(root)))).filter(exists)\n for (const instance of rootInstances) {\n this.downResolver.add(instance)\n }\n return rootInstances\n }\n\n 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, BridgeModuleResolverOptions, wrapModuleWithType } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\n\nimport { AsyncQueryBusClient, AsyncQueryBusModuleProxy, AsyncQueryBusModuleProxyParams } from './AsyncQueryBus'\n\nexport interface PubSubBridgeModuleResolverOptions extends BridgeModuleResolverOptions {\n busClient: AsyncQueryBusClient\n}\n\nexport class PubSubBridgeModuleResolver extends AbstractBridgeModuleResolver<PubSubBridgeModuleResolverOptions> {\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult) {\n return parentResult\n }\n const idParts = id.split(':')\n const firstPart = idParts.shift()\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const account = Account.randomSync()\n const params: AsyncQueryBusModuleProxyParams = {\n account,\n busClient: this.options.busClient,\n host: this.options.bridge,\n moduleAddress: firstPart as Address,\n }\n const proxy = new AsyncQueryBusModuleProxy<T>(params) as unknown as T\n await proxy.start?.()\n const wrappedProxy = wrapModuleWithType(proxy, account) as unknown as T\n this.add(wrappedProxy)\n console.log('ding!')\n return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : wrappedProxy\n }\n}\n"],"mappings":"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","names":["AbstractModuleHost","Base","import_lru_cache","import_object","AsyncQueryBusBase","Base","_lastState","_targetConfigs","_targetQueries","constructor","params","config","pollFrequencyConfig","pollFrequency","resolver","lastState","requiredConfig","max","ttl","LRUCache","queriesArchivist","console","log","name","resolved","resolve","intersect","queries","archivist","direction","toJsonString","existingResolved","assertEx","_a","_b","_c","result","asArchivistInstance","queriesDiviner","asDivinerInstance","boundWitnessDiviner","responsesArchivist","responses","responsesDiviner","commitState","address","nextState","Promise","get","set","retrieveState","state","undefined","newState","Date","now","Pending","AsyncQueryBusClient","AsyncQueryBusBase","_queryCache","_pollCount","_pollId","constructor","params","queryCacheConfig","config","queryCache","max","ttl","started","requiredConfig","noUpdateTTL","ttlAutopurge","LRUCache","listeningAddresses","keys","send","address","query","payloads","console","log","logger","debug","$meta","destination","routedQuery","PayloadBuilder","build","queryArchivist","queriesArchivist","routedQueryHash","$hash","Object","toDataHashMap","data","insertResult","insert","set","Pending","Error","context","Promise","resolve","reject","_a","pollForResponse","_b","start","response","get","undefined","delay","error","message","schema","sources","stop","forget","poll","setTimeoutEx","processIncomingResponses","e","clearTimeoutEx","pollFrequencyConfig","responseArchivist","responsesArchivist","responseBoundWitnessDiviner","responsesDiviner","pendingCommands","entries","filter","_","status","allSettled","map","sourceQuery","divinerQuery","BoundWitnessDivinerQuerySchema","result","divine","length","find","isBoundWitnessWithMeta","payload_hashes","import_assert","import_timer","import_boundwitness_model","import_diviner_boundwitness_model","import_payload_builder","AsyncQueryBusHost","AsyncQueryBusBase","_exposedAddresses","Set","_exposeOptions","_pollId","constructor","params","exposedAddresses","perAddressBatchQueryLimit","config","started","expose","address","options","failOnAlreadyExposed","assertEx","has","add","logger","debug","listeningModules","exposedModules","values","mods","Promise","all","map","listeningModule","asModuleInstance","resolver","resolve","start","console","warn","poll","stop","clearTimeoutEx","undefined","unexpose","validate","delete","callLocalModule","localModule","query","localModuleName","name","queryArchivist","queriesArchivist","responseArchivist","responsesArchivist","queryDestination","$meta","destination","includes","queryIndex","payload_hashes","indexOf","querySchema","payload_schemas","queries","queryPayloads","get","queryPayloadsDict","PayloadBuilder","toAllHashMap","queryHash","build","$hash","containsAll","Object","keys","error","schema","response","allowedQueries","ModuleConfigSchema","bw","payloads","errors","insertResult","insert","length","timestamp","commitState","findQueriesToAddress","queryBoundWitnessDiviner","queriesDiviner","retrieveState","limit","divinerQuery","BoundWitnessDivinerQuerySchema","sort","result","divine","filter","isQueryBoundWitnessWithMeta","nextState","Math","max","c","setTimeoutEx","processIncomingQueries","e","pollFrequencyConfig","localModules","allSettled","_a","AsyncQueryBusModuleHost","AbstractModuleHost","_busHost","constructor","params","start","listeningModules","config","module","resolve","direction","map","m","address","AsyncQueryBusHost","logger","resolver","stop","AsyncQueryBusModuleProxy","AbstractModuleProxy","proxyQueryHandler","query","payloads","console","log","proxyParams","busClient","send","address","startHandler","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","import_assert","import_abstract_bridge","import_module_model","import_assert","import_abstract_bridge","PubSubBridgeModuleResolver","AbstractBridgeModuleResolver","resolveHandler","id","options","parentResult","idParts","split","firstPart","shift","assertEx","isAddress","remainderParts","join","account","Account","randomSync","params","busClient","host","bridge","moduleAddress","proxy","AsyncQueryBusModuleProxy","start","wrappedProxy","wrapModuleWithType","add","console","log","length","resolve","moduleName","PubSubBridge","AbstractBridge","_configRootAddress","_configStateStoreArchivist","_configStateStoreBoundWitnessDiviner","_exposedAddresses","_lastState","_busClient","_busHost","_resolver","resolver","PubSubBridgeModuleResolver","bridge","busClient","assertEx","wrapperAccount","account","config","name","roots","exposeHandler","id","options","maxDepth","direction","filterOptions","module","resolve","host","busHost","expose","address","children","visibility","child","startHandler","start","unexposeHandler","unexpose","client","AsyncQueryBusClient","logger","upResolver","AsyncQueryBusHost","discoverRoots","rootInstances","Promise","all","map","root","filter","exists","instance","downResolver","add","stopHandler","_timeout","stop","configSchemas","PubSubBridgeConfigSchema","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 { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { CacheConfig, ModuleQueryResult } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { ModuleError, Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusClientParams, Pending } from './model'\n\nexport class AsyncQueryBusClient<TParams extends AsyncQueryBusClientParams = AsyncQueryBusClientParams> extends AsyncQueryBusBase<TParams> {\n protected _queryCache?: LRUCache<Address, Pending | ModuleQueryResult>\n private _pollCount = 0\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get queryCacheConfig(): LRUCache.Options<Address, Pending | ModuleQueryResult, unknown> {\n const queryCacheConfig: CacheConfig | undefined = this.config?.queryCache === true ? {} : this.config?.queryCache\n return { max: 100, ttl: 1000 * 60, ...queryCacheConfig }\n }\n\n get started() {\n return !!this._pollId\n }\n\n /**\n * A cache of queries that have been issued\n */\n protected get queryCache(): LRUCache<Address, Pending | ModuleQueryResult> {\n const config = this.queryCacheConfig\n const requiredConfig = { noUpdateTTL: false, ttlAutopurge: true }\n this._queryCache = this._queryCache ?? new LRUCache<Address, Pending | ModuleQueryResult>({ ...config, ...requiredConfig })\n return this._queryCache\n }\n\n listeningAddresses() {\n return this._queryCache?.keys()\n }\n\n async send(address: Address, query: QueryBoundWitness, payloads?: Payload[] | undefined): Promise<ModuleQueryResult> {\n //console.log('send')\n this.logger?.debug(`Begin issuing query to: ${address}`)\n const $meta = { ...query?.$meta, destination: [address] }\n const routedQuery = await PayloadBuilder.build({ ...query, $meta })\n //console.log('queryArchivist - calling')\n const queryArchivist = await this.queriesArchivist()\n //console.log('queryArchivist')\n\n // TODO: Should we always re-hash to true up timestamps? We can't\n // re-sign correctly so we would lose that information if we did and\n // would also be replying to consumers with a different query hash than\n // they sent us (which might be OK since it reflect the chain of custody)\n // Revisit this once we have proxy module support as they are another\n // intermediary to consider.\n const routedQueryHash =\n // Trust the signed hash if it's there\n (routedQuery as WithMeta<QueryBoundWitness>)?.$hash ??\n // TODO: What is the right way to find the dataHash\n Object.keys(await PayloadBuilder.toDataHashMap([routedQuery]))[0]\n this.logger?.debug(`Issuing query: ${routedQueryHash} to: ${address}`)\n // If there was data associated with the query, add it to the insert\n const data = payloads ? [routedQuery, ...payloads] : [routedQuery]\n const insertResult = await queryArchivist.insert?.(data)\n this.logger?.debug(`Issued query: ${routedQueryHash} to: ${address}`)\n this.queryCache.set(routedQueryHash, Pending)\n if (!insertResult) throw new Error('Unable to issue query to queryArchivist')\n const context = new Promise<ModuleQueryResult>((resolve, reject) => {\n this.logger?.debug(`Polling for response to query: ${routedQueryHash}`)\n const pollForResponse = async () => {\n try {\n this.start()\n let response = this.queryCache.get(routedQueryHash)\n // Poll for response until cache key expires (response timed out)\n while (response !== undefined) {\n //console.log('polling...')\n // Wait a bit\n await delay(100)\n // Check the status of the response\n response = this.queryCache.get(routedQueryHash)\n // If status is no longer pending that means we received a response\n if (response && response !== Pending) {\n this.logger?.debug(`Returning response to query: ${routedQueryHash}`)\n resolve(response)\n return\n }\n }\n // If we got here waiting for a response timed out\n this.logger?.error('Timeout waiting for query response')\n // Resolve with error to match what a local module would do if it were to error\n // TODO: BW Builder/Sign result as this module?\n const error: ModuleError = {\n message: 'Timeout waiting for query response',\n query: 'network.xyo.boundwitness',\n schema: 'network.xyo.error.module',\n sources: [routedQueryHash],\n }\n reject(error)\n return\n } finally {\n this.stop()\n }\n }\n forget(pollForResponse())\n })\n return context\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingResponses()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for processing incoming responses to previously issued queries\n */\n private processIncomingResponses = async () => {\n const responseArchivist = await this.responsesArchivist()\n const responseBoundWitnessDiviner = await this.responsesDiviner()\n const pendingCommands = [...this.queryCache.entries()].filter(([_, status]) => status === Pending)\n // TODO: Do in throttled batches\n await Promise.allSettled(\n pendingCommands.map(async ([sourceQuery, status]) => {\n if (status === Pending) {\n const divinerQuery: BoundWitnessDivinerQueryPayload = { schema: BoundWitnessDivinerQuerySchema, sourceQuery }\n const result = await responseBoundWitnessDiviner.divine([divinerQuery])\n if (result && result.length > 0) {\n const response = result.find(isBoundWitnessWithMeta)\n if (response && (response?.$meta as unknown as { sourceQuery: string })?.sourceQuery === sourceQuery) {\n this.logger?.debug(`Found response to query: ${sourceQuery}`)\n // Get any payloads associated with the response\n const payloads: PayloadWithMeta[] = response.payload_hashes?.length > 0 ? await responseArchivist.get(response.payload_hashes) : []\n this.queryCache.set(sourceQuery, [response, payloads, []])\n }\n }\n }\n }),\n )\n }\n\n 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, toJsonString } from '@xylabs/object'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload } from '@xyo-network/diviner-boundwitness-model'\nimport { asDivinerInstance, DivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleConfig } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusParams } from './model'\n\nexport class AsyncQueryBusBase<TParams extends AsyncQueryBusParams = AsyncQueryBusParams> extends Base<TParams> {\n protected _lastState?: LRUCache<Address, number>\n protected _targetConfigs: Record<Address, ModuleConfig> = {}\n protected _targetQueries: Record<Address, string[]> = {}\n\n constructor(params: TParams) {\n super(params)\n }\n\n get config(): TParams['config'] {\n return this.params.config\n }\n\n get pollFrequencyConfig(): number {\n return this.config?.pollFrequency ?? 1000\n }\n\n get resolver() {\n return this.params.resolver\n }\n\n /**\n * A cache of the last offset of the Diviner process per address\n */\n protected get lastState(): LRUCache<Address, number> {\n const requiredConfig = { max: 1000, ttl: 0 }\n this._lastState = this._lastState ?? new LRUCache<Address, number>(requiredConfig)\n return this._lastState\n }\n\n async queriesArchivist() {\n const resolved = await this.resolver.resolve(this.config?.intersect?.queries?.archivist, { direction: 'up' })\n const existingResolved = assertEx(resolved, () => `Unable to resolve queriesArchivist [${this.config?.intersect?.queries?.archivist}]`)\n const result = asArchivistInstance(\n existingResolved,\n () =>\n `Unable to resolve queriesArchivist as correct type [${this.config?.intersect?.queries?.archivist}][${existingResolved?.constructor?.name}]: ${toJsonString(existingResolved)}`,\n )\n return result\n }\n\n async queriesDiviner() {\n return assertEx(\n asDivinerInstance(await this.resolver.resolve(this.config?.intersect?.queries?.boundWitnessDiviner)),\n () => `Unable to resolve queriesDiviner [${this.config?.intersect?.queries?.boundWitnessDiviner}]`,\n ) as DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, QueryBoundWitness>\n }\n\n async responsesArchivist() {\n return assertEx(\n asArchivistInstance(await this.resolver.resolve(this.config?.intersect?.responses?.archivist)),\n () => `Unable to resolve responsesArchivist [${this.config?.intersect?.responses?.archivist}]`,\n )\n }\n\n async responsesDiviner() {\n return assertEx(\n asDivinerInstance(await this.resolver.resolve(this.config?.intersect?.responses?.boundWitnessDiviner)),\n () => `Unable to resolve responsesDiviner [${this.config?.intersect?.responses?.boundWitnessDiviner}]`,\n ) as DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, BoundWitness>\n }\n\n /**\n * Commit the internal state of the process. This is similar\n * to a transaction completion in a database and should only be called\n * when results have been successfully persisted to the appropriate\n * external stores.\n * @param address The module address to commit the state for\n * @param nextState The state to commit\n */\n protected async commitState(address: Address, nextState: number) {\n await Promise.resolve()\n // TODO: Offload to Archivist/Diviner instead of in-memory\n const lastState = this.lastState.get(address)\n if (lastState && lastState >= nextState) return\n this.lastState.set(address, nextState)\n }\n\n /**\n * Retrieves the last state of the process. Used to recover state after\n * preemptions, reboots, etc.\n */\n protected async retrieveState(address: Address): Promise<number> {\n await Promise.resolve()\n const state = this.lastState.get(address)\n if (state === undefined) {\n // If this is a boot we can go back a bit in time\n // and begin processing recent commands\n const newState = Date.now() - 1000\n this.lastState.set(address, newState)\n return newState\n } else {\n return state\n }\n }\n}\n","export const Pending = 'pending' as const\nexport type Pending = typeof Pending\n","import { containsAll } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isQueryBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { asModuleInstance, ModuleConfigSchema, ModuleInstance } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Schema, WithMeta } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusHostParams } from './model'\n\nexport interface ExposeOptions {\n allowedQueries?: Schema[]\n failOnAlreadyExposed?: boolean\n}\n\nexport class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQueryBusHostParams> extends AsyncQueryBusBase<TParams> {\n protected _exposedAddresses = new Set<Address>()\n private _exposeOptions: Record<Address, ExposeOptions> = {}\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get exposedAddresses() {\n return this._exposedAddresses\n }\n\n get perAddressBatchQueryLimit(): number {\n return this.config?.perAddressBatchQueryLimit ?? 10\n }\n\n get started() {\n return !!this._pollId\n }\n\n expose(address: Address, options: ExposeOptions = {}) {\n const { failOnAlreadyExposed } = options\n assertEx(!failOnAlreadyExposed || !this._exposedAddresses.has(address), () => `Address already exposed [${address}]`)\n this._exposedAddresses.add(address)\n this._exposeOptions[address] = { ...options }\n this.logger?.debug(`${address} exposed`)\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 (listeningModule) =>\n assertEx(asModuleInstance(await this.resolver.resolve(listeningModule)), () => `Unable to resolve listeningModule [${listeningModule}]`),\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 unexpose(address: Address, validate = true) {\n assertEx(!validate || this._exposedAddresses.has(address), () => `Address not exposed [${address}]`)\n this._exposedAddresses.delete(address)\n delete this._exposeOptions[address]\n this.logger?.debug(`${address} unexposed`)\n }\n\n protected callLocalModule = async (localModule: ModuleInstance, query: WithMeta<QueryBoundWitness>) => {\n const localModuleName = localModule.config.name ?? localModule.address\n const queryArchivist = await this.queriesArchivist()\n const responseArchivist = await this.responsesArchivist()\n const queryDestination = (query.$meta as { destination?: string[] })?.destination\n if (queryDestination && queryDestination?.includes(localModule.address)) {\n // Find the query\n const queryIndex = query.payload_hashes.indexOf(query.query)\n if (queryIndex !== -1) {\n const querySchema = query.payload_schemas[queryIndex]\n // If the destination can process this type of query\n if (localModule.queries.includes(querySchema)) {\n // Get the associated payloads\n const queryPayloads = await queryArchivist.get(query.payload_hashes)\n const queryPayloadsDict = await PayloadBuilder.toAllHashMap(queryPayloads)\n const queryHash = (await PayloadBuilder.build(query)).$hash\n // Check that we have all the arguments for the command\n if (!containsAll(Object.keys(queryPayloadsDict), query.payload_hashes)) {\n this.logger?.error(`Error processing command ${queryHash} for module ${localModuleName}, missing payloads`)\n return\n }\n try {\n // Issue the query against module\n const querySchema = queryPayloadsDict[query.query].schema\n this.logger?.debug(`Issuing query ${querySchema} (${queryHash}) addressed to module: ${localModuleName}`)\n const response = await localModule.query(query, queryPayloads, {\n allowedQueries: this._exposeOptions[localModule.address]?.allowedQueries,\n schema: ModuleConfigSchema,\n })\n const [bw, payloads, errors] = response\n this.logger?.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`)\n const insertResult = await responseArchivist.insert([bw, ...payloads, ...errors])\n // NOTE: If all archivists support the contract that numPayloads inserted === numPayloads returned we can\n // do some deeper assertions here like lenIn === lenOut, but for now this should be good enough since BWs\n // should always be unique causing at least one insertion\n if (insertResult.length === 0) {\n this.logger?.error(`Error replying to query ${queryHash} addressed to module: ${localModuleName}`)\n }\n if (query?.timestamp) {\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to ensure we are using the timestamp of the store\n // so there's no chance of multiple commands at the same time\n await this.commitState(localModule.address, query.timestamp)\n }\n } catch (error) {\n this.logger?.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n console.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n }\n }\n }\n }\n }\n\n /**\n * Finds unprocessed commands addressed to the supplied address\n * @param address The address to find commands for\n */\n protected findQueriesToAddress = async (address: Address) => {\n const queryBoundWitnessDiviner = await this.queriesDiviner()\n // Retrieve last offset from state store\n const timestamp = await this.retrieveState(address)\n const destination = [address]\n const limit = this.perAddressBatchQueryLimit\n // Filter for commands to us by destination address\n const divinerQuery = { destination, limit, schema: BoundWitnessDivinerQuerySchema, sort: 'asc', timestamp }\n const result = await queryBoundWitnessDiviner.divine([divinerQuery])\n const queries = result.filter(isQueryBoundWitnessWithMeta)\n const nextState = queries.length > 0 ? Math.max(...queries.map((c) => c.timestamp ?? 0)) + 1 : timestamp\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to use the timestamp of the store so there's no\n // chance of multiple commands at the same time\n await this.commitState(address, nextState)\n return queries\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingQueries()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for checking for inbound queries\n */\n private processIncomingQueries = async () => {\n this.logger?.debug('Checking for inbound queries')\n // Check for any queries that have been issued and have not been responded to\n const localModules = await this.listeningModules()\n\n // TODO: Do in throttled batches\n await Promise.allSettled(\n localModules.map(async (localModule) => {\n try {\n const localModuleName = localModule.config.name ?? localModule.address\n this.logger?.debug(`Checking for inbound queries to ${localModuleName} [${localModule.address}]`)\n const queries = await this.findQueriesToAddress(localModule.address)\n if (queries.length === 0) return\n this.logger?.debug(`Found queries addressed to local module: ${localModuleName}`)\n for (const query of queries) {\n await this.callLocalModule(localModule, query)\n }\n } catch (error) {\n this.logger?.error(`Error processing queries for address ${localModule.address}: ${error}`)\n }\n }),\n )\n }\n}\n","import { AbstractModuleHost, ModuleHostParams } from '../../AbstractModuleHost'\nimport { AsyncQueryBusHost } from '../AsyncQueryBusHost'\nimport { AsyncQueryBusHostConfig } from '../model'\n\nexport type AsyncQueryBusModuleHostParams = ModuleHostParams & {\n config: AsyncQueryBusHostConfig\n}\n\nexport class AsyncQueryBusModuleHost extends AbstractModuleHost<AsyncQueryBusModuleHostParams> {\n private _busHost?: AsyncQueryBusHost\n\n constructor(params: AsyncQueryBusModuleHostParams) {\n super(params)\n }\n\n override async start(): Promise<void> {\n const listeningModules =\n this.params.config.listeningModules ?? (await this.params.module.resolve('*', { direction: 'down' })).map((m) => m.address)\n this._busHost = new AsyncQueryBusHost({\n config: { ...this.params.config, listeningModules },\n logger: this.params.logger,\n resolver: this.params.module,\n })\n this._busHost?.start()\n }\n override stop() {\n this._busHost?.stop()\n }\n}\n","import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusClient } from '../AsyncQueryBusClient'\n\nexport type AsyncQueryBusModuleProxyParams = ModuleProxyParams & {\n busClient: AsyncQueryBusClient\n}\n\nexport class AsyncQueryBusModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<AsyncQueryBusModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<\n AsyncQueryBusModuleProxyParams,\n 'config'\n > & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements ModuleInstance<TParams, TWrappedModule['eventData']>\n{\n pipeline?: 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many' | undefined\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {\n return await this.params.busClient.send(this.address, query, payloads)\n }\n\n override async startHandler(): Promise<boolean> {\n return await super.startHandler()\n }\n}\n","export const PubSubBridgeSchema = 'network.xyo.bridge.pubsub'\nexport type PubSubBridgeSchema = typeof PubSubBridgeSchema\n","import { Address } from '@xylabs/hex'\nimport { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nimport { AsyncQueryBusClientConfig, AsyncQueryBusHostConfig } from './AsyncQueryBus'\nimport { PubSubBridgeSchema } from './Schema'\n\nexport const PubSubBridgeConfigSchema = `${PubSubBridgeSchema}.config`\nexport type PubSubBridgeConfigSchema = typeof PubSubBridgeConfigSchema\n\n/**\n * Configuration for the PubSubBridge\n */\nexport type PubSubBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n client?: AsyncQueryBusClientConfig\n host?: AsyncQueryBusHostConfig\n roots?: Address[]\n } & TConfig,\n TSchema extends string ? TSchema : PubSubBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { creatableModule, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolverInstance } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusClient, AsyncQueryBusHost } from './AsyncQueryBus'\nimport { PubSubBridgeConfigSchema } from './Config'\nimport { PubSubBridgeParams } from './Params'\nimport { PubSubBridgeModuleResolver } from './PubSubBridgeModuleResolver'\n\nconst moduleName = 'PubSubBridge'\n\n@creatableModule()\nexport class PubSubBridge<TParams extends PubSubBridgeParams = PubSubBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams> {\n static override configSchemas = [PubSubBridgeConfigSchema]\n\n protected _configRootAddress: Address = ''\n protected _configStateStoreArchivist: string = ''\n protected _configStateStoreBoundWitnessDiviner: string = ''\n protected _exposedAddresses: Address[] = []\n protected _lastState?: LRUCache<string, number>\n\n private _busClient?: AsyncQueryBusClient\n private _busHost?: AsyncQueryBusHost\n private _resolver?: PubSubBridgeModuleResolver\n\n override get resolver(): ModuleResolverInstance {\n this._resolver =\n this._resolver ??\n new PubSubBridgeModuleResolver({\n bridge: this,\n busClient: assertEx(this.busClient(), () => 'busClient not configured'),\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n protected get moduleName() {\n return `${this.config.name ?? moduleName}`\n }\n\n protected get roots() {\n return assertEx(this.config.roots, () => 'roots not configured')\n }\n\n override async discoverRoots(): Promise<ModuleInstance[]> {\n const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve<ModuleInstance>(root)))).filter(exists)\n for (const instance of rootInstances) {\n this.downResolver.add(instance)\n }\n return rootInstances\n }\n\n async exposeHandler(id: ModuleIdentifier, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5, direction } = options ?? {}\n const filterOptions: ModuleFilterOptions = { direction }\n const module = assertEx(await super.resolve(id, filterOptions), () => `Expose failed to locate module [${id}]`)\n if (module) {\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n host.expose(module.address)\n const children = await module.resolve('*', { direction, maxDepth, visibility: 'public' })\n for (const child of children) {\n host.expose(child.address)\n }\n return [module, ...children]\n }\n return []\n }\n\n exposedHandler(): Address[] {\n const exposedSet = this.busHost()?.exposedAddresses\n return exposedSet ? [...exposedSet] : []\n }\n\n override async startHandler(): Promise<boolean> {\n this.busHost()?.start()\n return await super.startHandler()\n }\n\n async unexposeHandler(id: ModuleIdentifier, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 1, direction } = options ?? {}\n const filterOptions: ModuleFilterOptions = { direction }\n const module = await super.resolve(id, filterOptions)\n if (module) {\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n host.unexpose(module.address)\n const children = await module.resolve('*', { direction, maxDepth, visibility: 'public' })\n for (const child of children) {\n host.unexpose(child.address)\n }\n return [module, ...children]\n }\n return []\n }\n\n protected busClient() {\n if (!this._busClient && this.config.client) {\n this._busClient = new AsyncQueryBusClient({\n config: this.config.client,\n logger: this.logger,\n resolver: this,\n })\n }\n return this._busClient\n }\n\n protected busHost() {\n if (!this._busHost && this.config.host) {\n this._busHost = new AsyncQueryBusHost({\n config: this.config.host,\n logger: this.logger,\n resolver: this,\n })\n }\n return this._busHost\n }\n\n protected override stopHandler(_timeout?: number | undefined) {\n this.busHost()?.stop()\n return true\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverOptions, wrapModuleWithType } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport { ModuleConfig, ModuleConfigSchema, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\n\nimport { AsyncQueryBusClient, AsyncQueryBusModuleProxy, AsyncQueryBusModuleProxyParams } from './AsyncQueryBus'\n\nexport interface PubSubBridgeModuleResolverOptions extends BridgeModuleResolverOptions {\n busClient: AsyncQueryBusClient\n}\n\nexport class PubSubBridgeModuleResolver extends AbstractBridgeModuleResolver<PubSubBridgeModuleResolverOptions> {\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult) {\n return parentResult\n }\n const idParts = id.split(':')\n const firstPart = idParts.shift()\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const account = Account.randomSync()\n const params: AsyncQueryBusModuleProxyParams = {\n account,\n busClient: this.options.busClient,\n config: { schema: ModuleConfigSchema },\n host: this.options.bridge,\n moduleAddress: firstPart as Address,\n }\n const proxy = new AsyncQueryBusModuleProxy<T, AsyncQueryBusModuleProxyParams>(params)\n if (proxy) {\n const state = await proxy.state()\n if (state) {\n const configSchema = (state.find((payload) => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config\n const config = assertEx(\n state.find((payload) => payload.schema === configSchema),\n () => 'Unable to locate config',\n ) as ModuleConfig\n proxy.setConfig(config)\n }\n }\n await proxy.start?.()\n const wrappedProxy = wrapModuleWithType(proxy, account) as unknown as T\n this.add(wrappedProxy)\n return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : wrappedProxy\n }\n}\n"],"mappings":"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","names":["AbstractModuleHost","Base","import_lru_cache","import_object","AsyncQueryBusBase","Base","_lastState","_targetConfigs","_targetQueries","constructor","params","config","pollFrequencyConfig","pollFrequency","resolver","lastState","requiredConfig","max","ttl","LRUCache","queriesArchivist","resolved","resolve","intersect","queries","archivist","direction","existingResolved","assertEx","_a","_b","_c","result","asArchivistInstance","name","toJsonString","queriesDiviner","asDivinerInstance","boundWitnessDiviner","responsesArchivist","responses","responsesDiviner","commitState","address","nextState","Promise","get","set","retrieveState","state","undefined","newState","Date","now","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","queriesArchivist","routedQueryHash","$hash","Object","toDataHashMap","data","insertResult","insert","set","Pending","Error","context","Promise","resolve","reject","_a","pollForResponse","_b","start","response","get","undefined","delay","error","message","schema","sources","stop","forget","poll","setTimeoutEx","processIncomingResponses","e","clearTimeoutEx","pollFrequencyConfig","responseArchivist","responsesArchivist","responseBoundWitnessDiviner","responsesDiviner","pendingCommands","entries","filter","_","status","allSettled","map","sourceQuery","divinerQuery","BoundWitnessDivinerQuerySchema","result","divine","length","find","isBoundWitnessWithMeta","payload_hashes","import_assert","import_timer","import_boundwitness_model","import_diviner_boundwitness_model","import_payload_builder","AsyncQueryBusHost","AsyncQueryBusBase","_exposedAddresses","Set","_exposeOptions","_pollId","constructor","params","exposedAddresses","perAddressBatchQueryLimit","config","started","expose","address","options","failOnAlreadyExposed","assertEx","has","add","logger","debug","listeningModules","exposedModules","values","mods","Promise","all","map","listeningModule","asModuleInstance","resolver","resolve","start","console","warn","poll","stop","clearTimeoutEx","undefined","unexpose","validate","delete","callLocalModule","localModule","query","localModuleName","name","queryArchivist","queriesArchivist","responseArchivist","responsesArchivist","queryDestination","$meta","destination","includes","queryIndex","payload_hashes","indexOf","querySchema","payload_schemas","queries","queryPayloads","get","queryPayloadsDict","PayloadBuilder","toAllHashMap","queryHash","build","$hash","containsAll","Object","keys","error","schema","response","allowedQueries","ModuleConfigSchema","bw","payloads","errors","insertResult","insert","length","timestamp","commitState","findQueriesToAddress","queryBoundWitnessDiviner","queriesDiviner","retrieveState","limit","divinerQuery","BoundWitnessDivinerQuerySchema","sort","result","divine","filter","isQueryBoundWitnessWithMeta","nextState","Math","max","c","setTimeoutEx","processIncomingQueries","e","pollFrequencyConfig","localModules","allSettled","_a","AsyncQueryBusModuleHost","AbstractModuleHost","_busHost","constructor","params","start","listeningModules","config","module","resolve","direction","map","m","address","AsyncQueryBusHost","logger","resolver","stop","AsyncQueryBusModuleProxy","AbstractModuleProxy","pipeline","proxyQueryHandler","query","payloads","params","busClient","send","address","startHandler","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","import_assert","import_abstract_bridge","import_module_model","import_assert","import_abstract_bridge","import_module_model","PubSubBridgeModuleResolver","AbstractBridgeModuleResolver","resolveHandler","id","options","parentResult","idParts","split","firstPart","shift","assertEx","isAddress","remainderParts","join","account","Account","randomSync","params","busClient","config","schema","ModuleConfigSchema","host","bridge","moduleAddress","proxy","AsyncQueryBusModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrappedProxy","wrapModuleWithType","add","length","resolve","moduleName","PubSubBridge","AbstractBridge","_configRootAddress","_configStateStoreArchivist","_configStateStoreBoundWitnessDiviner","_exposedAddresses","_lastState","_busClient","_busHost","_resolver","resolver","PubSubBridgeModuleResolver","bridge","busClient","assertEx","wrapperAccount","account","config","name","roots","discoverRoots","rootInstances","Promise","all","map","root","resolve","filter","exists","instance","downResolver","add","exposeHandler","id","options","maxDepth","direction","filterOptions","module","host","busHost","expose","address","children","visibility","child","exposedHandler","exposedSet","exposedAddresses","startHandler","start","unexposeHandler","unexpose","client","AsyncQueryBusClient","logger","AsyncQueryBusHost","stopHandler","_timeout","stop","configSchemas","PubSubBridgeConfigSchema","creatableModule"]}
@@ -58,21 +58,17 @@ var _AsyncQueryBusBase = class _AsyncQueryBusBase extends Base2 {
58
58
  }
59
59
  async queriesArchivist() {
60
60
  var _a, _b, _c;
61
- console.log(`queriesArchivist: ${this.resolver.constructor.name}`);
62
61
  const resolved = await this.resolver.resolve((_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.queries) == null ? void 0 : _c.archivist, {
63
62
  direction: "up"
64
63
  });
65
- console.log(`resolved: ${toJsonString(resolved)}`);
66
64
  const existingResolved = assertEx(resolved, () => {
67
65
  var _a2, _b2, _c2;
68
66
  return `Unable to resolve queriesArchivist [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.queries) == null ? void 0 : _c2.archivist}]`;
69
67
  });
70
- console.log("existingResolved", toJsonString(existingResolved));
71
68
  const result = asArchivistInstance(existingResolved, () => {
72
69
  var _a2, _b2, _c2, _d;
73
70
  return `Unable to resolve queriesArchivist as correct type [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.queries) == null ? void 0 : _c2.archivist}][${(_d = existingResolved == null ? void 0 : existingResolved.constructor) == null ? void 0 : _d.name}]: ${toJsonString(existingResolved)}`;
74
71
  });
75
- console.log("result", toJsonString(result));
76
72
  return result;
77
73
  }
78
74
  async queriesDiviner() {
@@ -174,7 +170,6 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
174
170
  }
175
171
  async send(address, query, payloads) {
176
172
  var _a, _b, _c, _d;
177
- console.log("send");
178
173
  (_a = this.logger) == null ? void 0 : _a.debug(`Begin issuing query to: ${address}`);
179
174
  const $meta = {
180
175
  ...query == null ? void 0 : query.$meta,
@@ -186,9 +181,7 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
186
181
  ...query,
187
182
  $meta
188
183
  });
189
- console.log("queryArchivist - calling");
190
184
  const queryArchivist = await this.queriesArchivist();
191
- console.log("queryArchivist");
192
185
  const routedQueryHash = (
193
186
  // Trust the signed hash if it's there
194
187
  (routedQuery == null ? void 0 : routedQuery.$hash) ?? // TODO: What is the right way to find the dataHash
@@ -217,7 +210,6 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
217
210
  this.start();
218
211
  let response = this.queryCache.get(routedQueryHash);
219
212
  while (response !== void 0) {
220
- console.log("polling...");
221
213
  await delay(100);
222
214
  response = this.queryCache.get(routedQueryHash);
223
215
  if (response && response !== Pending) {
@@ -484,7 +476,7 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
484
476
  var _a2, _b, _c;
485
477
  try {
486
478
  const localModuleName = localModule.config.name ?? localModule.address;
487
- (_a2 = this.logger) == null ? void 0 : _a2.debug(`Checking for inbound queries to ${localModuleName}`);
479
+ (_a2 = this.logger) == null ? void 0 : _a2.debug(`Checking for inbound queries to ${localModuleName} [${localModule.address}]`);
488
480
  const queries = await this.findQueriesToAddress(localModule.address);
489
481
  if (queries.length === 0)
490
482
  return;
@@ -533,12 +525,11 @@ var AsyncQueryBusModuleHost = _AsyncQueryBusModuleHost;
533
525
  // src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts
534
526
  import { AbstractModuleProxy } from "@xyo-network/abstract-bridge";
535
527
  var _AsyncQueryBusModuleProxy = class _AsyncQueryBusModuleProxy extends AbstractModuleProxy {
528
+ pipeline;
536
529
  async proxyQueryHandler(query, payloads) {
537
- console.log("proxyQueryHandler - async query bus module proxy");
538
- return await this.proxyParams.busClient.send(this.address, query, payloads);
530
+ return await this.params.busClient.send(this.address, query, payloads);
539
531
  }
540
532
  async startHandler() {
541
- console.log("startHandler - async query bus module proxy");
542
533
  return await super.startHandler();
543
534
  }
544
535
  };
@@ -562,9 +553,11 @@ import { assertEx as assertEx3 } from "@xylabs/assert";
562
553
  import { isAddress } from "@xylabs/hex";
563
554
  import { AbstractBridgeModuleResolver, wrapModuleWithType } from "@xyo-network/abstract-bridge";
564
555
  import { Account } from "@xyo-network/account";
556
+ import { ConfigSchema } from "@xyo-network/config-payload-plugin";
557
+ import { ModuleConfigSchema as ModuleConfigSchema2 } from "@xyo-network/module-model";
565
558
  var _PubSubBridgeModuleResolver = class _PubSubBridgeModuleResolver extends AbstractBridgeModuleResolver {
566
559
  async resolveHandler(id, options) {
567
- var _a;
560
+ var _a, _b;
568
561
  const parentResult = await super.resolveHandler(id, options);
569
562
  if (parentResult) {
570
563
  return parentResult;
@@ -577,14 +570,24 @@ var _PubSubBridgeModuleResolver = class _PubSubBridgeModuleResolver extends Abst
577
570
  const params = {
578
571
  account,
579
572
  busClient: this.options.busClient,
573
+ config: {
574
+ schema: ModuleConfigSchema2
575
+ },
580
576
  host: this.options.bridge,
581
577
  moduleAddress: firstPart
582
578
  };
583
579
  const proxy = new AsyncQueryBusModuleProxy(params);
584
- await ((_a = proxy.start) == null ? void 0 : _a.call(proxy));
580
+ if (proxy) {
581
+ const state = await proxy.state();
582
+ if (state) {
583
+ const configSchema = (_a = state.find((payload) => payload.schema === ConfigSchema)) == null ? void 0 : _a.config;
584
+ const config = assertEx3(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
585
+ proxy.setConfig(config);
586
+ }
587
+ }
588
+ await ((_b = proxy.start) == null ? void 0 : _b.call(proxy));
585
589
  const wrappedProxy = wrapModuleWithType(proxy, account);
586
590
  this.add(wrappedProxy);
587
- console.log("ding!");
588
591
  return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : wrappedProxy;
589
592
  }
590
593
  };
@@ -627,12 +630,19 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
627
630
  get roots() {
628
631
  return assertEx4(this.config.roots, () => "roots not configured");
629
632
  }
633
+ async discoverRoots() {
634
+ const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve(root)))).filter(exists);
635
+ for (const instance of rootInstances) {
636
+ this.downResolver.add(instance);
637
+ }
638
+ return rootInstances;
639
+ }
630
640
  async exposeHandler(id, options) {
631
- const { maxDepth = 1, direction } = options ?? {};
641
+ const { maxDepth = 5, direction } = options ?? {};
632
642
  const filterOptions = {
633
643
  direction
634
644
  };
635
- const module = await super.resolve(id, filterOptions);
645
+ const module = assertEx4(await super.resolve(id, filterOptions), () => `Expose failed to locate module [${id}]`);
636
646
  if (module) {
637
647
  const host = assertEx4(this.busHost(), () => "Not configured as a host");
638
648
  host.expose(module.address);
@@ -651,6 +661,13 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
651
661
  }
652
662
  return [];
653
663
  }
664
+ exposedHandler() {
665
+ var _a;
666
+ const exposedSet = (_a = this.busHost()) == null ? void 0 : _a.exposedAddresses;
667
+ return exposedSet ? [
668
+ ...exposedSet
669
+ ] : [];
670
+ }
654
671
  async startHandler() {
655
672
  var _a;
656
673
  (_a = this.busHost()) == null ? void 0 : _a.start();
@@ -685,7 +702,7 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
685
702
  this._busClient = new AsyncQueryBusClient({
686
703
  config: this.config.client,
687
704
  logger: this.logger,
688
- resolver: this.upResolver
705
+ resolver: this
689
706
  });
690
707
  }
691
708
  return this._busClient;
@@ -695,18 +712,11 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
695
712
  this._busHost = new AsyncQueryBusHost({
696
713
  config: this.config.host,
697
714
  logger: this.logger,
698
- resolver: this.upResolver
715
+ resolver: this
699
716
  });
700
717
  }
701
718
  return this._busHost;
702
719
  }
703
- async discoverRoots() {
704
- const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve(root)))).filter(exists);
705
- for (const instance of rootInstances) {
706
- this.downResolver.add(instance);
707
- }
708
- return rootInstances;
709
- }
710
720
  stopHandler(_timeout) {
711
721
  var _a;
712
722
  (_a = this.busHost()) == null ? void 0 : _a.stop();