@xyo-network/bridge-pub-sub 2.94.7 → 2.94.9

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 (36) hide show
  1. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.cts +16 -6
  2. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.cts.map +1 -1
  3. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.mts +16 -6
  4. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.mts.map +1 -1
  5. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.ts +16 -6
  6. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.ts.map +1 -1
  7. package/dist/browser/AsyncQueryBus/AsyncQueryBusClient.d.cts.map +1 -1
  8. package/dist/browser/AsyncQueryBus/AsyncQueryBusClient.d.mts.map +1 -1
  9. package/dist/browser/AsyncQueryBus/AsyncQueryBusClient.d.ts.map +1 -1
  10. package/dist/browser/AsyncQueryBus/AsyncQueryBusHost.d.cts.map +1 -1
  11. package/dist/browser/AsyncQueryBus/AsyncQueryBusHost.d.mts.map +1 -1
  12. package/dist/browser/AsyncQueryBus/AsyncQueryBusHost.d.ts.map +1 -1
  13. package/dist/browser/index.cjs +62 -24
  14. package/dist/browser/index.cjs.map +1 -1
  15. package/dist/browser/index.js +62 -24
  16. package/dist/browser/index.js.map +1 -1
  17. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.cts +16 -6
  18. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.cts.map +1 -1
  19. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.mts +16 -6
  20. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.mts.map +1 -1
  21. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.ts +16 -6
  22. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.ts.map +1 -1
  23. package/dist/node/AsyncQueryBus/AsyncQueryBusClient.d.cts.map +1 -1
  24. package/dist/node/AsyncQueryBus/AsyncQueryBusClient.d.mts.map +1 -1
  25. package/dist/node/AsyncQueryBus/AsyncQueryBusClient.d.ts.map +1 -1
  26. package/dist/node/AsyncQueryBus/AsyncQueryBusHost.d.cts.map +1 -1
  27. package/dist/node/AsyncQueryBus/AsyncQueryBusHost.d.mts.map +1 -1
  28. package/dist/node/AsyncQueryBus/AsyncQueryBusHost.d.ts.map +1 -1
  29. package/dist/node/index.cjs +80 -24
  30. package/dist/node/index.cjs.map +1 -1
  31. package/dist/node/index.js +80 -24
  32. package/dist/node/index.js.map +1 -1
  33. package/package.json +19 -19
  34. package/src/AsyncQueryBus/AsyncQueryBusBase.ts +44 -4
  35. package/src/AsyncQueryBus/AsyncQueryBusClient.ts +13 -3
  36. package/src/AsyncQueryBus/AsyncQueryBusHost.ts +13 -4
@@ -14,6 +14,7 @@ __name(_AbstractModuleHost, "AbstractModuleHost");
14
14
  var AbstractModuleHost = _AbstractModuleHost;
15
15
 
16
16
  // src/AsyncQueryBus/AsyncQueryBusClient.ts
17
+ import { assertEx as assertEx2 } from "@xylabs/assert";
17
18
  import { delay } from "@xylabs/delay";
18
19
  import { forget } from "@xylabs/forget";
19
20
  import { clearTimeoutEx, setTimeoutEx } from "@xylabs/timer";
@@ -32,6 +33,15 @@ var _AsyncQueryBusBase = class _AsyncQueryBusBase extends Base2 {
32
33
  _lastState;
33
34
  _targetConfigs = {};
34
35
  _targetQueries = {};
36
+ _lastQueriesArchivistAttempt;
37
+ _lastQueriesDivinerAttempt;
38
+ _lastResponseArchivistAttempt;
39
+ _lastResponseDivinerAttempt;
40
+ _queriesArchivist;
41
+ _queriesDiviner;
42
+ _reResolveDelay = 5e3;
43
+ _responseArchivist;
44
+ _responseDiviner;
35
45
  constructor(params) {
36
46
  super(params);
37
47
  }
@@ -58,6 +68,12 @@ var _AsyncQueryBusBase = class _AsyncQueryBusBase extends Base2 {
58
68
  }
59
69
  async queriesArchivist() {
60
70
  var _a, _b, _c;
71
+ if (this._queriesArchivist) {
72
+ return this._queriesArchivist;
73
+ }
74
+ if (this._lastQueriesArchivistAttempt && Date.now() - this._lastQueriesArchivistAttempt < this._reResolveDelay) {
75
+ return;
76
+ }
61
77
  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, {
62
78
  direction: "up"
63
79
  });
@@ -69,28 +85,50 @@ var _AsyncQueryBusBase = class _AsyncQueryBusBase extends Base2 {
69
85
  var _a2, _b2, _c2, _d;
70
86
  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)}`;
71
87
  });
88
+ this._queriesArchivist = result;
72
89
  return result;
73
90
  }
74
91
  async queriesDiviner() {
75
92
  var _a, _b, _c;
76
- return assertEx(asDivinerInstance(await this.resolver.resolve((_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.queries) == null ? void 0 : _c.boundWitnessDiviner)), () => {
93
+ if (this._queriesDiviner) {
94
+ return this._queriesDiviner;
95
+ }
96
+ if (this._lastQueriesDivinerAttempt && Date.now() - this._lastQueriesDivinerAttempt < this._reResolveDelay) {
97
+ return;
98
+ }
99
+ this._queriesDiviner = assertEx(asDivinerInstance(await this.resolver.resolve((_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.queries) == null ? void 0 : _c.boundWitnessDiviner)), () => {
77
100
  var _a2, _b2, _c2;
78
101
  return `Unable to resolve queriesDiviner [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.queries) == null ? void 0 : _c2.boundWitnessDiviner}]`;
79
102
  });
103
+ return this._queriesDiviner;
80
104
  }
81
105
  async responsesArchivist() {
82
106
  var _a, _b, _c;
83
- return assertEx(asArchivistInstance(await this.resolver.resolve((_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.responses) == null ? void 0 : _c.archivist)), () => {
107
+ if (this._responseArchivist) {
108
+ return this._responseArchivist;
109
+ }
110
+ if (this._lastResponseArchivistAttempt && Date.now() - this._lastResponseArchivistAttempt < this._reResolveDelay) {
111
+ return;
112
+ }
113
+ this._responseArchivist = assertEx(asArchivistInstance(await this.resolver.resolve((_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.responses) == null ? void 0 : _c.archivist)), () => {
84
114
  var _a2, _b2, _c2;
85
115
  return `Unable to resolve responsesArchivist [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.responses) == null ? void 0 : _c2.archivist}]`;
86
116
  });
117
+ return this._responseArchivist;
87
118
  }
88
119
  async responsesDiviner() {
89
120
  var _a, _b, _c;
90
- return assertEx(asDivinerInstance(await this.resolver.resolve((_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.responses) == null ? void 0 : _c.boundWitnessDiviner)), () => {
121
+ if (this._responseDiviner) {
122
+ return this._responseDiviner;
123
+ }
124
+ if (this._lastResponseDivinerAttempt && Date.now() - this._lastResponseDivinerAttempt < this._reResolveDelay) {
125
+ return;
126
+ }
127
+ this._responseDiviner = assertEx(asDivinerInstance(await this.resolver.resolve((_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.responses) == null ? void 0 : _c.boundWitnessDiviner)), () => {
91
128
  var _a2, _b2, _c2;
92
129
  return `Unable to resolve responsesDiviner [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.responses) == null ? void 0 : _c2.boundWitnessDiviner}]`;
93
130
  });
131
+ return this._responseDiviner;
94
132
  }
95
133
  /**
96
134
  * Commit the internal state of the process. This is similar
@@ -181,7 +219,10 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
181
219
  ...query,
182
220
  $meta
183
221
  });
184
- const queryArchivist = await this.queriesArchivist();
222
+ const queryArchivist = assertEx2(await this.queriesArchivist(), () => {
223
+ var _a2, _b2, _c2;
224
+ return `Unable to contact queriesArchivist [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.queries) == null ? void 0 : _c2.archivist}]`;
225
+ });
185
226
  const routedQueryHash = (
186
227
  // Trust the signed hash if it's there
187
228
  (routedQuery == null ? void 0 : routedQuery.$hash) ?? // TODO: What is the right way to find the dataHash
@@ -260,8 +301,14 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
260
301
  * Background process for processing incoming responses to previously issued queries
261
302
  */
262
303
  processIncomingResponses = async () => {
263
- const responseArchivist = await this.responsesArchivist();
264
- const responseBoundWitnessDiviner = await this.responsesDiviner();
304
+ const responseArchivist = assertEx2(await this.responsesArchivist(), () => {
305
+ var _a, _b, _c;
306
+ return `Unable to contact the responsesArchivist [${(_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.responses) == null ? void 0 : _c.archivist}]`;
307
+ });
308
+ const responseBoundWitnessDiviner = assertEx2(await this.responsesDiviner(), () => {
309
+ var _a, _b, _c;
310
+ return `Unable to contact responsesDiviner [${(_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.responses) == null ? void 0 : _c.boundWitnessDiviner}]`;
311
+ });
265
312
  const pendingCommands = [
266
313
  ...this.queryCache.entries()
267
314
  ].filter(([_, status]) => status === Pending);
@@ -311,7 +358,7 @@ var AsyncQueryBusClient = _AsyncQueryBusClient;
311
358
 
312
359
  // src/AsyncQueryBus/AsyncQueryBusHost.ts
313
360
  import { containsAll } from "@xylabs/array";
314
- import { assertEx as assertEx2 } from "@xylabs/assert";
361
+ import { assertEx as assertEx3 } from "@xylabs/assert";
315
362
  import { clearTimeoutEx as clearTimeoutEx2, setTimeoutEx as setTimeoutEx2 } from "@xylabs/timer";
316
363
  import { isQueryBoundWitnessWithMeta } from "@xyo-network/boundwitness-model";
317
364
  import { BoundWitnessDivinerQuerySchema as BoundWitnessDivinerQuerySchema2 } from "@xyo-network/diviner-boundwitness-model";
@@ -337,7 +384,7 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
337
384
  expose(address, options = {}) {
338
385
  var _a;
339
386
  const { failOnAlreadyExposed } = options;
340
- assertEx2(!failOnAlreadyExposed || !this._exposedAddresses.has(address), () => `Address already exposed [${address}]`);
387
+ assertEx3(!failOnAlreadyExposed || !this._exposedAddresses.has(address), () => `Address already exposed [${address}]`);
341
388
  this._exposedAddresses.add(address);
342
389
  this._exposeOptions[address] = {
343
390
  ...options
@@ -350,7 +397,7 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
350
397
  ...((_a = this.config) == null ? void 0 : _a.listeningModules) ?? [],
351
398
  ...this.exposedAddresses.values()
352
399
  ];
353
- const mods = await Promise.all(exposedModules.map(async (listeningModule) => assertEx2(asModuleInstance(await this.resolver.resolve(listeningModule)), () => `Unable to resolve listeningModule [${listeningModule}]`)));
400
+ const mods = await Promise.all(exposedModules.map(async (listeningModule) => assertEx3(asModuleInstance(await this.resolver.resolve(listeningModule)), () => `Unable to resolve listeningModule [${listeningModule}]`)));
354
401
  return mods;
355
402
  }
356
403
  start() {
@@ -369,7 +416,7 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
369
416
  }
370
417
  unexpose(address, validate = true) {
371
418
  var _a;
372
- assertEx2(!validate || this._exposedAddresses.has(address), () => `Address not exposed [${address}]`);
419
+ assertEx3(!validate || this._exposedAddresses.has(address), () => `Address not exposed [${address}]`);
373
420
  this._exposedAddresses.delete(address);
374
421
  delete this._exposeOptions[address];
375
422
  (_a = this.logger) == null ? void 0 : _a.debug(`${address} unexposed`);
@@ -377,8 +424,14 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
377
424
  callLocalModule = async (localModule, query) => {
378
425
  var _a, _b, _c, _d, _e, _f, _g;
379
426
  const localModuleName = localModule.config.name ?? localModule.address;
380
- const queryArchivist = await this.queriesArchivist();
381
- const responseArchivist = await this.responsesArchivist();
427
+ const queryArchivist = assertEx3(await this.queriesArchivist(), () => {
428
+ var _a2, _b2, _c2;
429
+ return `Unable to contact queriesArchivist [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.queries) == null ? void 0 : _c2.archivist}]`;
430
+ });
431
+ const responsesArchivist = assertEx3(await this.responsesArchivist(), () => {
432
+ var _a2, _b2, _c2;
433
+ return `Unable to contact responsesArchivist [${(_c2 = (_b2 = (_a2 = this.config) == null ? void 0 : _a2.intersect) == null ? void 0 : _b2.queries) == null ? void 0 : _c2.archivist}]`;
434
+ });
382
435
  const queryDestination = (_a = query.$meta) == null ? void 0 : _a.destination;
383
436
  if (queryDestination && (queryDestination == null ? void 0 : queryDestination.includes(localModule.address))) {
384
437
  const queryIndex = query.payload_hashes.indexOf(query.query);
@@ -401,7 +454,7 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
401
454
  });
402
455
  const [bw, payloads, errors] = response;
403
456
  (_e = this.logger) == null ? void 0 : _e.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`);
404
- const insertResult = await responseArchivist.insert([
457
+ const insertResult = await responsesArchivist.insert([
405
458
  bw,
406
459
  ...payloads,
407
460
  ...errors
@@ -425,7 +478,10 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
425
478
  * @param address The address to find commands for
426
479
  */
427
480
  findQueriesToAddress = async (address) => {
428
- const queryBoundWitnessDiviner = await this.queriesDiviner();
481
+ const queryBoundWitnessDiviner = assertEx3(await this.queriesDiviner(), () => {
482
+ var _a, _b, _c;
483
+ return `Unable to resolve queriesDiviner [${(_c = (_b = (_a = this.config) == null ? void 0 : _a.intersect) == null ? void 0 : _b.queries) == null ? void 0 : _c.boundWitnessDiviner}]`;
484
+ });
429
485
  const timestamp = await this.retrieveState(address);
430
486
  const destination = [
431
487
  address
@@ -542,13 +598,13 @@ var PubSubBridgeSchema = "network.xyo.bridge.pubsub";
542
598
  var PubSubBridgeConfigSchema = `${PubSubBridgeSchema}.config`;
543
599
 
544
600
  // src/PubSubBridge.ts
545
- import { assertEx as assertEx4 } from "@xylabs/assert";
601
+ import { assertEx as assertEx5 } from "@xylabs/assert";
546
602
  import { exists } from "@xylabs/exists";
547
603
  import { AbstractBridge } from "@xyo-network/abstract-bridge";
548
604
  import { creatableModule } from "@xyo-network/module-model";
549
605
 
550
606
  // src/PubSubBridgeModuleResolver.ts
551
- import { assertEx as assertEx3 } from "@xylabs/assert";
607
+ import { assertEx as assertEx4 } from "@xylabs/assert";
552
608
  import { isAddress } from "@xylabs/hex";
553
609
  import { AbstractBridgeModuleResolver, wrapModuleWithType } from "@xyo-network/abstract-bridge";
554
610
  import { Account } from "@xyo-network/account";
@@ -563,7 +619,7 @@ var _PubSubBridgeModuleResolver = class _PubSubBridgeModuleResolver extends Abst
563
619
  }
564
620
  const idParts = id.split(":");
565
621
  const firstPart = idParts.shift();
566
- assertEx3(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
622
+ assertEx4(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
567
623
  const remainderParts = idParts.join(":");
568
624
  const account = Account.randomSync();
569
625
  const params = {
@@ -580,13 +636,13 @@ var _PubSubBridgeModuleResolver = class _PubSubBridgeModuleResolver extends Abst
580
636
  const state = await proxy.state();
581
637
  if (state) {
582
638
  const configSchema = (_a = state.find((payload) => payload.schema === ConfigSchema)) == null ? void 0 : _a.config;
583
- const config = assertEx3(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
639
+ const config = assertEx4(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
584
640
  proxy.setConfig(config);
585
641
  }
586
642
  }
587
643
  await ((_b = proxy.start) == null ? void 0 : _b.call(proxy));
588
644
  const wrapped = wrapModuleWithType(proxy, account);
589
- const as = assertEx3(asModuleInstance2(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
645
+ const as = assertEx4(asModuleInstance2(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
590
646
  proxy.upResolver.add(as);
591
647
  proxy.downResolver.add(as);
592
648
  this.add(as);
@@ -621,7 +677,7 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
621
677
  get resolver() {
622
678
  this._resolver = this._resolver ?? new PubSubBridgeModuleResolver({
623
679
  bridge: this,
624
- busClient: assertEx4(this.busClient(), () => "busClient not configured"),
680
+ busClient: assertEx5(this.busClient(), () => "busClient not configured"),
625
681
  wrapperAccount: this.account
626
682
  });
627
683
  return this._resolver;
@@ -630,7 +686,7 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
630
686
  return `${this.config.name ?? moduleName}`;
631
687
  }
632
688
  get roots() {
633
- return assertEx4(this.config.roots, () => "roots not configured");
689
+ return assertEx5(this.config.roots, () => "roots not configured");
634
690
  }
635
691
  async discoverRoots() {
636
692
  const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve(root)))).filter(exists);
@@ -641,9 +697,9 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
641
697
  }
642
698
  async exposeHandler(id, options) {
643
699
  const { maxDepth = 2, direction = "all" } = options ?? {};
644
- const module = assertEx4(await super.resolve(id), () => `Expose failed to locate module [${id}]`);
700
+ const module = assertEx5(await super.resolve(id), () => `Expose failed to locate module [${id}]`);
645
701
  if (module) {
646
- const host = assertEx4(this.busHost(), () => "Not configured as a host");
702
+ const host = assertEx5(this.busHost(), () => "Not configured as a host");
647
703
  host.expose(module.address);
648
704
  const children = await module.resolve("*", {
649
705
  direction,
@@ -679,7 +735,7 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
679
735
  };
680
736
  const module = await super.resolve(id, filterOptions);
681
737
  if (module) {
682
- const host = assertEx4(this.busHost(), () => "Not configured as a host");
738
+ const host = assertEx5(this.busHost(), () => "Not configured as a host");
683
739
  host.unexpose(module.address);
684
740
  const children = await module.resolve("*", {
685
741
  direction,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../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":["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 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 = 2, direction = 'all' } = options ?? {}\n const module = assertEx(await super.resolve(id), () => `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 = 5, 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 { asModuleInstance, 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 wrapped = wrapModuleWithType(proxy, account) as unknown as T\n const as = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(as)\n proxy.downResolver.add(as)\n this.add(as)\n return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : as\n }\n}\n"],"mappings":";;;;;;;;;AAAA,SAASA,YAAwB;AAQ1B,IAAeC,sBAAf,MAAeA,4BAAgFC,KAAAA;AAGtG;AAHsGA;AAA/F,IAAeD,qBAAf;;;ACRP,SAASE,aAAa;AACtB,SAASC,cAAc;AAEvB,SAASC,gBAAgBC,oBAAoB;AAC7C,SAASC,8BAAiD;AAC1D,SAA0CC,sCAAsC;AAEhF,SAASC,sBAAsB;AAE/B,SAASC,YAAAA,iBAAgB;;;ACTzB,SAASC,gBAAgB;AAEzB,SAASC,QAAAA,OAAMC,oBAAoB;AACnC,SAASC,2BAA2B;AAGpC,SAASC,yBAA0C;AAEnD,SAASC,gBAAgB;AAIlB,IAAMC,qBAAN,MAAMA,2BAAqFC,MAAAA;EACtFC;EACAC,iBAAgD,CAAC;EACjDC,iBAA4C,CAAC;EAEvDC,YAAYC,QAAiB;AAC3B,UAAMA,MAAAA;EACR;EAEA,IAAIC,SAA4B;AAC9B,WAAO,KAAKD,OAAOC;EACrB;EAEA,IAAIC,sBAA8B;AAzBpC;AA0BI,aAAO,UAAKD,WAAL,mBAAaE,kBAAiB;EACvC;EAEA,IAAIC,WAAW;AACb,WAAO,KAAKJ,OAAOI;EACrB;;;;EAKA,IAAcC,YAAuC;AACnD,UAAMC,iBAAiB;MAAEC,KAAK;MAAMC,KAAK;IAAE;AAC3C,SAAKZ,aAAa,KAAKA,cAAc,IAAIa,SAA0BH,cAAAA;AACnE,WAAO,KAAKV;EACd;EAEA,MAAMc,mBAAmB;AA1C3B;AA2CI,UAAMC,WAAW,MAAM,KAAKP,SAASQ,SAAQ,sBAAKX,WAAL,mBAAaY,cAAb,mBAAwBC,YAAxB,mBAAiCC,WAAW;MAAEC,WAAW;IAAK,CAAA;AAC3G,UAAMC,mBAAmBC,SAASP,UAAU,MAAA;AA5ChD,UAAAQ,KAAAC,KAAAC;AA4CsD,qDAAuCA,OAAAD,OAAAD,MAAA,KAAKlB,WAAL,gBAAAkB,IAAaN,cAAb,gBAAAO,IAAwBN,YAAxB,gBAAAO,IAAiCN,SAAAA;KAAY;AACtI,UAAMO,SAASC,oBACbN,kBACA,MAAA;AA/CN,UAAAE,KAAAC,KAAAC,KAAA;AAgDQ,qEAAuDA,OAAAD,OAAAD,MAAA,KAAKlB,WAAL,gBAAAkB,IAAaN,cAAb,gBAAAO,IAAwBN,YAAxB,gBAAAO,IAAiCN,SAAAA,MAAcE,0DAAkBlB,gBAAlBkB,mBAA+BO,IAAAA,MAAUC,aAAaR,gBAAAA,CAAAA;KAAmB;AAEnL,WAAOK;EACT;EAEA,MAAMI,iBAAiB;AArDzB;AAsDI,WAAOR,SACLS,kBAAkB,MAAM,KAAKvB,SAASQ,SAAQ,sBAAKX,WAAL,mBAAaY,cAAb,mBAAwBC,YAAxB,mBAAiCc,mBAAAA,CAAAA,GAC/E,MAAA;AAxDN,UAAAT,KAAAC,KAAAC;AAwDY,mDAAqCA,OAAAD,OAAAD,MAAA,KAAKlB,WAAL,gBAAAkB,IAAaN,cAAb,gBAAAO,IAAwBN,YAAxB,gBAAAO,IAAiCO,mBAAAA;KAAsB;EAEtG;EAEA,MAAMC,qBAAqB;AA5D7B;AA6DI,WAAOX,SACLK,oBAAoB,MAAM,KAAKnB,SAASQ,SAAQ,sBAAKX,WAAL,mBAAaY,cAAb,mBAAwBiB,cAAxB,mBAAmCf,SAAAA,CAAAA,GACnF,MAAA;AA/DN,UAAAI,KAAAC,KAAAC;AA+DY,uDAAyCA,OAAAD,OAAAD,MAAA,KAAKlB,WAAL,gBAAAkB,IAAaN,cAAb,gBAAAO,IAAwBU,cAAxB,gBAAAT,IAAmCN,SAAAA;KAAY;EAElG;EAEA,MAAMgB,mBAAmB;AAnE3B;AAoEI,WAAOb,SACLS,kBAAkB,MAAM,KAAKvB,SAASQ,SAAQ,sBAAKX,WAAL,mBAAaY,cAAb,mBAAwBiB,cAAxB,mBAAmCF,mBAAAA,CAAAA,GACjF,MAAA;AAtEN,UAAAT,KAAAC,KAAAC;AAsEY,qDAAuCA,OAAAD,OAAAD,MAAA,KAAKlB,WAAL,gBAAAkB,IAAaN,cAAb,gBAAAO,IAAwBU,cAAxB,gBAAAT,IAAmCO,mBAAAA;KAAsB;EAE1G;;;;;;;;;EAUA,MAAgBI,YAAYC,SAAkBC,WAAmB;AAC/D,UAAMC,QAAQvB,QAAO;AAErB,UAAMP,YAAY,KAAKA,UAAU+B,IAAIH,OAAAA;AACrC,QAAI5B,aAAaA,aAAa6B;AAAW;AACzC,SAAK7B,UAAUgC,IAAIJ,SAASC,SAAAA;EAC9B;;;;;EAMA,MAAgBI,cAAcL,SAAmC;AAC/D,UAAME,QAAQvB,QAAO;AACrB,UAAM2B,QAAQ,KAAKlC,UAAU+B,IAAIH,OAAAA;AACjC,QAAIM,UAAUC,QAAW;AAGvB,YAAMC,WAAWC,KAAKC,IAAG,IAAK;AAC9B,WAAKtC,UAAUgC,IAAIJ,SAASQ,QAAAA;AAC5B,aAAOA;IACT,OAAO;AACL,aAAOF;IACT;EACF;AACF;AA/FkG5C;AAA3F,IAAMD,oBAAN;;;ACZA,IAAMkD,UAAU;;;AFchB,IAAMC,uBAAN,MAAMA,6BAAmGC,kBAAAA;EACpGC;EACFC,aAAa;EACbC;EAERC,YAAYC,QAAiB;AAC3B,UAAMA,MAAAA;EACR;EAEA,IAAIC,mBAAoF;AAvB1F;AAwBI,UAAMA,qBAA4C,UAAKC,WAAL,mBAAaC,gBAAe,OAAO,CAAC,KAAI,UAAKD,WAAL,mBAAaC;AACvG,WAAO;MAAEC,KAAK;MAAKC,KAAK,MAAO;MAAI,GAAGJ;IAAiB;EACzD;EAEA,IAAIK,UAAU;AACZ,WAAO,CAAC,CAAC,KAAKR;EAChB;;;;EAKA,IAAcK,aAA6D;AACzE,UAAMD,SAAS,KAAKD;AACpB,UAAMM,iBAAiB;MAAEC,aAAa;MAAOC,cAAc;IAAK;AAChE,SAAKb,cAAc,KAAKA,eAAe,IAAIc,UAA+C;MAAE,GAAGR;MAAQ,GAAGK;IAAe,CAAA;AACzH,WAAO,KAAKX;EACd;EAEAe,qBAAqB;AA1CvB;AA2CI,YAAO,UAAKf,gBAAL,mBAAkBgB;EAC3B;EAEA,MAAMC,KAAKC,SAAkBC,OAA0BC,UAA8D;AA9CvH;AAgDI,eAAKC,WAAL,mBAAaC,MAAM,2BAA2BJ,OAAAA;AAC9C,UAAMK,QAAQ;MAAE,GAAGJ,+BAAOI;MAAOC,aAAa;QAACN;;IAAS;AACxD,UAAMO,cAAc,MAAMC,eAAeC,MAAM;MAAE,GAAGR;MAAOI;IAAM,CAAA;AAEjE,UAAMK,iBAAiB,MAAM,KAAKC,iBAAgB;AASlD,UAAMC;;OAEHL,2CAA6CM;MAE9CC,OAAOhB,KAAK,MAAMU,eAAeO,cAAc;QAACR;OAAY,CAAA,EAAG,CAAA;;AACjE,eAAKJ,WAAL,mBAAaC,MAAM,kBAAkBQ,eAAAA,QAAuBZ,OAAAA;AAE5D,UAAMgB,OAAOd,WAAW;MAACK;SAAgBL;QAAY;MAACK;;AACtD,UAAMU,eAAe,QAAMP,oBAAeQ,WAAfR,wCAAwBM;AACnD,eAAKb,WAAL,mBAAaC,MAAM,iBAAiBQ,eAAAA,QAAuBZ,OAAAA;AAC3D,SAAKX,WAAW8B,IAAIP,iBAAiBQ,OAAAA;AACrC,QAAI,CAACH;AAAc,YAAM,IAAII,MAAM,yCAAA;AACnC,UAAMC,UAAU,IAAIC,QAA2B,CAACC,SAASC,WAAAA;AAzE7D,UAAAC;AA0EM,OAAAA,MAAA,KAAKvB,WAAL,gBAAAuB,IAAatB,MAAM,kCAAkCQ,eAAAA;AACrD,YAAMe,kBAAkB,mCAAA;AA3E9B,YAAAD,KAAAE;AA4EQ,YAAI;AACF,eAAKC,MAAK;AACV,cAAIC,WAAW,KAAKzC,WAAW0C,IAAInB,eAAAA;AAEnC,iBAAOkB,aAAaE,QAAW;AAG7B,kBAAMC,MAAM,GAAA;AAEZH,uBAAW,KAAKzC,WAAW0C,IAAInB,eAAAA;AAE/B,gBAAIkB,YAAYA,aAAaV,SAAS;AACpC,eAAAM,MAAA,KAAKvB,WAAL,gBAAAuB,IAAatB,MAAM,gCAAgCQ,eAAAA;AACnDY,sBAAQM,QAAAA;AACR;YACF;UACF;AAEA,WAAAF,MAAA,KAAKzB,WAAL,gBAAAyB,IAAaM,MAAM;AAGnB,gBAAMA,QAAqB;YACzBC,SAAS;YACTlC,OAAO;YACPmC,QAAQ;YACRC,SAAS;cAACzB;;UACZ;AACAa,iBAAOS,KAAAA;AACP;QACF,UAAA;AACE,eAAKI,KAAI;QACX;MACF,GAjCwB;AAkCxBC,aAAOZ,gBAAAA,CAAAA;IACT,CAAA;AACA,WAAOL;EACT;;;;;EAMQkB,OAAO;AACb,SAAKxD,UAAUyD,aAAa,YAAA;AAvHhC;AAwHM,UAAI;AACF,cAAM,KAAKC,yBAAwB;MACrC,SAASC,GAAG;AACV,yBAAKxC,WAAL,mBAAa+B,UAAb,4BAAqB,uBAAuBS,CAAAA;MAC9C,UAAA;AACE,YAAI,KAAK3D;AAAS4D,yBAAe,KAAK5D,OAAO;AAC7C,aAAKA,UAAUgD;AACf,aAAKQ,KAAI;MACX;IACF,GAAG,KAAKK,mBAAmB;EAC7B;;;;EAKQH,2BAA2B,YAAA;AACjC,UAAMI,oBAAoB,MAAM,KAAKC,mBAAkB;AACvD,UAAMC,8BAA8B,MAAM,KAAKC,iBAAgB;AAC/D,UAAMC,kBAAkB;SAAI,KAAK7D,WAAW8D,QAAO;MAAIC,OAAO,CAAC,CAACC,GAAGC,MAAAA,MAAYA,WAAWlC,OAAAA;AAE1F,UAAMG,QAAQgC,WACZL,gBAAgBM,IAAI,OAAO,CAACC,aAAaH,MAAAA,MAAO;AA7ItD;AA8IQ,UAAIA,WAAWlC,SAAS;AACtB,cAAMsC,eAAgD;UAAEtB,QAAQuB;UAAgCF;QAAY;AAC5G,cAAMG,SAAS,MAAMZ,4BAA4Ba,OAAO;UAACH;SAAa;AACtE,YAAIE,UAAUA,OAAOE,SAAS,GAAG;AAC/B,gBAAMhC,WAAW8B,OAAOG,KAAKC,sBAAAA;AAC7B,cAAIlC,cAAaA,0CAAUzB,UAAVyB,mBAAwD2B,iBAAgBA,aAAa;AACpG,uBAAKtD,WAAL,mBAAaC,MAAM,4BAA4BqD,WAAAA;AAE/C,kBAAMvD,aAA8B4B,cAASmC,mBAATnC,mBAAyBgC,UAAS,IAAI,MAAMhB,kBAAkBf,IAAID,SAASmC,cAAc,IAAI,CAAA;AACjI,iBAAK5E,WAAW8B,IAAIsC,aAAa;cAAC3B;cAAU5B;cAAU,CAAA;aAAG;UAC3D;QACF;MACF;IACF,CAAA,CAAA;EAEJ;EAEQ2B,QAAQ;AACd,QAAI,KAAK9C,eAAe,GAAG;AACzB,WAAKyD,KAAI;IACX;AACA,SAAKzD;EACP;EAEQuD,OAAO;AACb,SAAKvD;AACL,QAAI,KAAKA,cAAc,GAAG;AACxB,UAAI,KAAKC;AAAS4D,uBAAe,KAAK5D,OAAO;AAC7C,WAAKA,UAAUgD;AACf,WAAKjD,aAAa;IACpB;EACF;AACF;AAhKgHF;AAAzG,IAAMD,sBAAN;;;AGdP,SAASsF,mBAAmB;AAC5B,SAASC,YAAAA,iBAAgB;AAEzB,SAASC,kBAAAA,iBAAgBC,gBAAAA,qBAAoB;AAC7C,SAASC,mCAAsD;AAC/D,SAASC,kCAAAA,uCAAsC;AAC/C,SAASC,kBAAkBC,0BAA0C;AACrE,SAASC,kBAAAA,uBAAsB;AAWxB,IAAMC,qBAAN,MAAMA,2BAA6FC,kBAAAA;EAC9FC,oBAAoB,oBAAIC,IAAAA;EAC1BC,iBAAiD,CAAC;EAClDC;EAERC,YAAYC,QAAiB;AAC3B,UAAMA,MAAAA;EACR;EAEA,IAAIC,mBAAmB;AACrB,WAAO,KAAKN;EACd;EAEA,IAAIO,4BAAoC;AA/B1C;AAgCI,aAAO,UAAKC,WAAL,mBAAaD,8BAA6B;EACnD;EAEA,IAAIE,UAAU;AACZ,WAAO,CAAC,CAAC,KAAKN;EAChB;EAEAO,OAAOC,SAAkBC,UAAyB,CAAC,GAAG;AAvCxD;AAwCI,UAAM,EAAEC,qBAAoB,IAAKD;AACjCE,IAAAA,UAAS,CAACD,wBAAwB,CAAC,KAAKb,kBAAkBe,IAAIJ,OAAAA,GAAU,MAAM,4BAA4BA,OAAAA,GAAU;AACpH,SAAKX,kBAAkBgB,IAAIL,OAAAA;AAC3B,SAAKT,eAAeS,OAAAA,IAAW;MAAE,GAAGC;IAAQ;AAC5C,eAAKK,WAAL,mBAAaC,MAAM,GAAGP,OAAAA;EACxB;EAEA,MAAMQ,mBAA8C;AA/CtD;AAgDI,UAAMC,iBAAiB;WAAK,UAAKZ,WAAL,mBAAaW,qBAAoB,CAAA;SAAQ,KAAKb,iBAAiBe,OAAM;;AACjG,UAAMC,OAAO,MAAMC,QAAQC,IACzBJ,eAAeK,IAAI,OAAOC,oBACxBZ,UAASa,iBAAiB,MAAM,KAAKC,SAASC,QAAQH,eAAAA,CAAAA,GAAmB,MAAM,sCAAsCA,eAAAA,GAAkB,CAAA,CAAA;AAG3I,WAAOJ;EACT;EAEAQ,QAAQ;AACN,QAAI,KAAKrB,SAAS;AAChBsB,cAAQC,KAAK,6CAAA;IACf;AACA,SAAKC,KAAI;EACX;EAEAC,OAAO;AACL,QAAI,CAAC,KAAKzB,SAAS;AACjBsB,cAAQC,KAAK,6CAAA;IACf;AACA,QAAI,KAAK7B;AAASgC,MAAAA,gBAAe,KAAKhC,OAAO;AAC7C,SAAKA,UAAUiC;EACjB;EAEAC,SAAS1B,SAAkB2B,WAAW,MAAM;AAxE9C;AAyEIxB,IAAAA,UAAS,CAACwB,YAAY,KAAKtC,kBAAkBe,IAAIJ,OAAAA,GAAU,MAAM,wBAAwBA,OAAAA,GAAU;AACnG,SAAKX,kBAAkBuC,OAAO5B,OAAAA;AAC9B,WAAO,KAAKT,eAAeS,OAAAA;AAC3B,eAAKM,WAAL,mBAAaC,MAAM,GAAGP,OAAAA;EACxB;EAEU6B,kBAAkB,OAAOC,aAA6BC,UAAAA;AA/ElE;AAgFI,UAAMC,kBAAkBF,YAAYjC,OAAOoC,QAAQH,YAAY9B;AAC/D,UAAMkC,iBAAiB,MAAM,KAAKC,iBAAgB;AAClD,UAAMC,oBAAoB,MAAM,KAAKC,mBAAkB;AACvD,UAAMC,oBAAoBP,WAAMQ,UAANR,mBAA4CS;AACtE,QAAIF,qBAAoBA,qDAAkBG,SAASX,YAAY9B,WAAU;AAEvE,YAAM0C,aAAaX,MAAMY,eAAeC,QAAQb,MAAMA,KAAK;AAC3D,UAAIW,eAAe,IAAI;AACrB,cAAMG,cAAcd,MAAMe,gBAAgBJ,UAAAA;AAE1C,YAAIZ,YAAYiB,QAAQN,SAASI,WAAAA,GAAc;AAE7C,gBAAMG,gBAAgB,MAAMd,eAAee,IAAIlB,MAAMY,cAAc;AACnE,gBAAMO,oBAAoB,MAAMC,gBAAeC,aAAaJ,aAAAA;AAC5D,gBAAMK,aAAa,MAAMF,gBAAeG,MAAMvB,KAAAA,GAAQwB;AAEtD,cAAI,CAACC,YAAYC,OAAOC,KAAKR,iBAAAA,GAAoBnB,MAAMY,cAAc,GAAG;AACtE,uBAAKrC,WAAL,mBAAaqD,MAAM,4BAA4BN,SAAAA,eAAwBrB,eAAAA;AACvE;UACF;AACA,cAAI;AAEF,kBAAMa,eAAcK,kBAAkBnB,MAAMA,KAAK,EAAE6B;AACnD,uBAAKtD,WAAL,mBAAaC,MAAM,iBAAiBsC,YAAAA,KAAgBQ,SAAAA,0BAAmCrB,eAAAA;AACvF,kBAAM6B,WAAW,MAAM/B,YAAYC,MAAMA,OAAOiB,eAAe;cAC7Dc,iBAAgB,UAAKvE,eAAeuC,YAAY9B,OAAO,MAAvC,mBAA0C8D;cAC1DF,QAAQG;YACV,CAAA;AACA,kBAAM,CAACC,IAAIC,UAAUC,MAAAA,IAAUL;AAC/B,uBAAKvD,WAAL,mBAAaC,MAAM,qBAAqB8C,SAAAA,yBAAkCrB,eAAAA;AAC1E,kBAAMmC,eAAe,MAAM/B,kBAAkBgC,OAAO;cAACJ;iBAAOC;iBAAaC;aAAO;AAIhF,gBAAIC,aAAaE,WAAW,GAAG;AAC7B,yBAAK/D,WAAL,mBAAaqD,MAAM,2BAA2BN,SAAAA,yBAAkCrB,eAAAA;YAClF;AACA,gBAAID,+BAAOuC,WAAW;AAIpB,oBAAM,KAAKC,YAAYzC,YAAY9B,SAAS+B,MAAMuC,SAAS;YAC7D;UACF,SAASX,OAAO;AACd,uBAAKrD,WAAL,mBAAaqD,MAAM,0BAA0BN,SAAAA,eAAwBrB,eAAAA,KAAoB2B,KAAAA;AACzFvC,oBAAQuC,MAAM,0BAA0BN,SAAAA,eAAwBrB,eAAAA,KAAoB2B,KAAAA,EAAO;UAC7F;QACF;MACF;IACF;EACF;;;;;EAMUa,uBAAuB,OAAOxE,YAAAA;AACtC,UAAMyE,2BAA2B,MAAM,KAAKC,eAAc;AAE1D,UAAMJ,YAAY,MAAM,KAAKK,cAAc3E,OAAAA;AAC3C,UAAMwC,cAAc;MAACxC;;AACrB,UAAM4E,QAAQ,KAAKhF;AAEnB,UAAMiF,eAAe;MAAErC;MAAaoC;MAAOhB,QAAQkB;MAAgCC,MAAM;MAAOT;IAAU;AAC1G,UAAMU,SAAS,MAAMP,yBAAyBQ,OAAO;MAACJ;KAAa;AACnE,UAAM9B,UAAUiC,OAAOE,OAAOC,2BAAAA;AAC9B,UAAMC,YAAYrC,QAAQsB,SAAS,IAAIgB,KAAKC,IAAG,GAAIvC,QAAQjC,IAAI,CAACyE,MAAMA,EAAEjB,aAAa,CAAA,CAAA,IAAM,IAAIA;AAI/F,UAAM,KAAKC,YAAYvE,SAASoF,SAAAA;AAChC,WAAOrC;EACT;;;;;EAMQzB,OAAO;AACb,SAAK9B,UAAUgG,cAAa,YAAA;AA/JhC;AAgKM,UAAI;AACF,cAAM,KAAKC,uBAAsB;MACnC,SAASC,GAAG;AACV,yBAAKpF,WAAL,mBAAaqD,UAAb,4BAAqB,uBAAuB+B,CAAAA;MAC9C,UAAA;AACE,YAAI,KAAKlG;AAASgC,UAAAA,gBAAe,KAAKhC,OAAO;AAC7C,aAAKA,UAAUiC;AACf,aAAKH,KAAI;MACX;IACF,GAAG,KAAKqE,mBAAmB;EAC7B;;;;EAKQF,yBAAyB,YAAA;AA/KnC;AAgLI,eAAKnF,WAAL,mBAAaC,MAAM;AAEnB,UAAMqF,eAAe,MAAM,KAAKpF,iBAAgB;AAGhD,UAAMI,QAAQiF,WACZD,aAAa9E,IAAI,OAAOgB,gBAAAA;AAtL9B,UAAAgE,KAAA;AAuLQ,UAAI;AACF,cAAM9D,kBAAkBF,YAAYjC,OAAOoC,QAAQH,YAAY9B;AAC/D,SAAA8F,MAAA,KAAKxF,WAAL,gBAAAwF,IAAavF,MAAM,mCAAmCyB,eAAAA,KAAoBF,YAAY9B,OAAO;AAC7F,cAAM+C,UAAU,MAAM,KAAKyB,qBAAqB1C,YAAY9B,OAAO;AACnE,YAAI+C,QAAQsB,WAAW;AAAG;AAC1B,mBAAK/D,WAAL,mBAAaC,MAAM,4CAA4CyB,eAAAA;AAC/D,mBAAWD,SAASgB,SAAS;AAC3B,gBAAM,KAAKlB,gBAAgBC,aAAaC,KAAAA;QAC1C;MACF,SAAS4B,OAAO;AACd,mBAAKrD,WAAL,mBAAaqD,MAAM,wCAAwC7B,YAAY9B,OAAO,KAAK2D,KAAAA;MACrF;IACF,CAAA,CAAA;EAEJ;AACF;AApL0GvE;AAAnG,IAAMD,oBAAN;;;ACVA,IAAM4G,2BAAN,MAAMA,iCAAgCC,mBAAAA;EACnCC;EAERC,YAAYC,QAAuC;AACjD,UAAMA,MAAAA;EACR;EAEA,MAAeC,QAAuB;AAfxC;AAgBI,UAAMC,mBACJ,KAAKF,OAAOG,OAAOD,qBAAqB,MAAM,KAAKF,OAAOI,OAAOC,QAAQ,KAAK;MAAEC,WAAW;IAAO,CAAA,GAAIC,IAAI,CAACC,MAAMA,EAAEC,OAAO;AAC5H,SAAKX,WAAW,IAAIY,kBAAkB;MACpCP,QAAQ;QAAE,GAAG,KAAKH,OAAOG;QAAQD;MAAiB;MAClDS,QAAQ,KAAKX,OAAOW;MACpBC,UAAU,KAAKZ,OAAOI;IACxB,CAAA;AACA,eAAKN,aAAL,mBAAeG;EACjB;EACSY,OAAO;AAzBlB;AA0BI,eAAKf,aAAL,mBAAee;EACjB;AACF;AApB6ChB;AAAtC,IAAMD,0BAAN;;;ACRP,SAASkB,2BAA8C;AAWhD,IAAMC,4BAAN,MAAMA,kCASHC,oBAAAA;EAGR,MAAMC,kBAAmEC,OAAUC,UAAkD;AACnI,WAAO,MAAM,KAAKC,OAAOC,UAAUC,KAAK,KAAKC,SAASL,OAAOC,QAAAA;EAC/D;EAEA,MAAeK,eAAiC;AAC9C,WAAO,MAAM,MAAMA,aAAAA;EACrB;AACF;AAVUR;AATH,IAAMD,2BAAN;;;ACXA,IAAMU,qBAAqB;;;ACO3B,IAAMC,2BAA2B,GAAGC,kBAAAA;;;ACP3C,SAASC,YAAAA,iBAAgB;AACzB,SAASC,cAAc;AAEvB,SAASC,sBAAsB;AAE/B,SAASC,uBAAsG;;;ACL/G,SAASC,YAAAA,iBAAgB;AACzB,SAAkBC,iBAAiB;AACnC,SAASC,8BAA2DC,0BAA0B;AAC9F,SAASC,eAAe;AACxB,SAAwBC,oBAAoB;AAC5C,SAASC,oBAAAA,mBAAgCC,sBAAAA,2BAAiF;AAQnH,IAAMC,8BAAN,MAAMA,oCAAmCC,6BAAAA;EAC9C,MAAeC,eACbC,IACAC,SAC8B;AAjBlC;AAkBI,UAAMC,eAAe,MAAM,MAAMH,eAAeC,IAAIC,OAAAA;AACpD,QAAIC,cAAc;AAChB,aAAOA;IACT;AACA,UAAMC,UAAUH,GAAGI,MAAM,GAAA;AACzB,UAAMC,YAAYF,QAAQG,MAAK;AAC/BC,IAAAA,UAASC,UAAUH,SAAAA,GAAY,MAAM,2BAA2BA,SAAAA,EAAW;AAC3E,UAAMI,iBAAiBN,QAAQO,KAAK,GAAA;AACpC,UAAMC,UAAUC,QAAQC,WAAU;AAClC,UAAMC,SAAyC;MAC7CH;MACAI,WAAW,KAAKd,QAAQc;MACxBC,QAAQ;QAAEC,QAAQC;MAAmB;MACrCC,MAAM,KAAKlB,QAAQmB;MACnBC,eAAehB;IACjB;AACA,UAAMiB,QAAQ,IAAIC,yBAA4DT,MAAAA;AAC9E,QAAIQ,OAAO;AACT,YAAME,QAAQ,MAAMF,MAAME,MAAK;AAC/B,UAAIA,OAAO;AACT,cAAMC,gBAAgBD,WAAME,KAAK,CAACC,YAAYA,QAAQV,WAAWW,YAAAA,MAA3CJ,mBAAwFR;AAC9G,cAAMA,SAAST,UACbiB,MAAME,KAAK,CAACC,YAAYA,QAAQV,WAAWQ,YAAAA,GAC3C,MAAM,yBAAA;AAERH,cAAMO,UAAUb,MAAAA;MAClB;IACF;AACA,YAAMM,WAAMQ,UAANR;AACN,UAAMS,UAAUC,mBAAmBV,OAAOX,OAAAA;AAC1C,UAAMsB,KAAK1B,UAAS2B,kBAAoBH,SAAS,CAAC,CAAA,GAAI,MAAM,+BAA+B/B,EAAAA,GAAK;AAChGsB,UAAMa,WAAWC,IAAIH,EAAAA;AACrBX,UAAMe,aAAaD,IAAIH,EAAAA;AACvB,SAAKG,IAAIH,EAAAA;AACT,WAAOxB,eAAe6B,SAAS,IAAI,MAAMhB,MAAMiB,QAAQ9B,gBAAgBR,OAAAA,IAAWgC;EACpF;AACF;AAzCgDnC;AAAzC,IAAMD,6BAAN;;;;;;;;;;;;;;ADAP,IAAM2C,aAAa;AAGZ,IAAMC,gBAAN,MAAMA,sBAA8EC,eAAAA;EAG/EC,qBAA8B;EAC9BC,6BAAqC;EACrCC,uCAA+C;EAC/CC,oBAA+B,CAAA;EAC/BC;EAEFC;EACAC;EACAC;EAER,IAAaC,WAAmC;AAC9C,SAAKD,YACH,KAAKA,aACL,IAAIE,2BAA2B;MAC7BC,QAAQ;MACRC,WAAWC,UAAS,KAAKD,UAAS,GAAI,MAAM,0BAAA;MAC5CE,gBAAgB,KAAKC;IACvB,CAAA;AACF,WAAO,KAAKP;EACd;EAEA,IAAcV,aAAa;AACzB,WAAO,GAAG,KAAKkB,OAAOC,QAAQnB,UAAAA;EAChC;EAEA,IAAcoB,QAAQ;AACpB,WAAOL,UAAS,KAAKG,OAAOE,OAAO,MAAM,sBAAA;EAC3C;EAEA,MAAeC,gBAA2C;AACxD,UAAMC,iBAAiB,MAAMC,QAAQC,IAAI,KAAKJ,MAAMK,IAAI,OAAOC,SAAS,MAAM,KAAKf,SAASgB,QAAwBD,IAAAA,CAAAA,CAAAA,GAASE,OAAOC,MAAAA;AACpI,eAAWC,YAAYR,eAAe;AACpC,WAAKS,aAAaC,IAAIF,QAAAA;IACxB;AACA,WAAOR;EACT;EAEA,MAAMW,cAAcC,IAAsBC,SAAsE;AAC9G,UAAM,EAAEC,WAAW,GAAGC,YAAY,MAAK,IAAKF,WAAW,CAAC;AACxD,UAAMG,SAASvB,UAAS,MAAM,MAAMY,QAAQO,EAAAA,GAAK,MAAM,mCAAmCA,EAAAA,GAAK;AAC/F,QAAII,QAAQ;AACV,YAAMC,OAAOxB,UAAS,KAAKyB,QAAO,GAAI,MAAM,0BAAA;AAC5CD,WAAKE,OAAOH,OAAOI,OAAO;AAC1B,YAAMC,WAAW,MAAML,OAAOX,QAAQ,KAAK;QAAEU;QAAWD;QAAUQ,YAAY;MAAS,CAAA;AACvF,iBAAWC,SAASF,UAAU;AAC5BJ,aAAKE,OAAOI,MAAMH,OAAO;MAC3B;AACA,aAAO;QAACJ;WAAWK;;IACrB;AACA,WAAO,CAAA;EACT;EAEAG,iBAA4B;;AAC1B,UAAMC,cAAa,UAAKP,QAAO,MAAZ,mBAAgBQ;AACnC,WAAOD,aAAa;SAAIA;QAAc,CAAA;EACxC;EAEA,MAAeE,eAAiC;;AAC9C,eAAKT,QAAO,MAAZ,mBAAgBU;AAChB,WAAO,MAAM,MAAMD,aAAAA;EACrB;EAEA,MAAME,gBAAgBjB,IAAsBC,SAAwE;AAClH,UAAM,EAAEC,WAAW,GAAGC,UAAS,IAAKF,WAAW,CAAC;AAChD,UAAMiB,gBAAqC;MAAEf;IAAU;AACvD,UAAMC,SAAS,MAAM,MAAMX,QAAQO,IAAIkB,aAAAA;AACvC,QAAId,QAAQ;AACV,YAAMC,OAAOxB,UAAS,KAAKyB,QAAO,GAAI,MAAM,0BAAA;AAC5CD,WAAKc,SAASf,OAAOI,OAAO;AAC5B,YAAMC,WAAW,MAAML,OAAOX,QAAQ,KAAK;QAAEU;QAAWD;QAAUQ,YAAY;MAAS,CAAA;AACvF,iBAAWC,SAASF,UAAU;AAC5BJ,aAAKc,SAASR,MAAMH,OAAO;MAC7B;AACA,aAAO;QAACJ;WAAWK;;IACrB;AACA,WAAO,CAAA;EACT;EAEU7B,YAAY;AACpB,QAAI,CAAC,KAAKN,cAAc,KAAKU,OAAOoC,QAAQ;AAC1C,WAAK9C,aAAa,IAAI+C,oBAAoB;QACxCrC,QAAQ,KAAKA,OAAOoC;QACpBE,QAAQ,KAAKA;QACb7C,UAAU;MACZ,CAAA;IACF;AACA,WAAO,KAAKH;EACd;EAEUgC,UAAU;AAClB,QAAI,CAAC,KAAK/B,YAAY,KAAKS,OAAOqB,MAAM;AACtC,WAAK9B,WAAW,IAAIgD,kBAAkB;QACpCvC,QAAQ,KAAKA,OAAOqB;QACpBiB,QAAQ,KAAKA;QACb7C,UAAU;MACZ,CAAA;IACF;AACA,WAAO,KAAKF;EACd;EAEmBiD,YAAYC,UAA+B;;AAC5D,eAAKnB,QAAO,MAAZ,mBAAgBoB;AAChB,WAAO;EACT;AACF;AA3G2F1D;AACzF,cADWD,eACK4D,iBAAgB;EAACC;;AAD5B,IAAM7D,eAAN;AAAMA,eAAAA,aAAAA;EADZ8D,gBAAAA;GACY9D,YAAAA;","names":["Base","AbstractModuleHost","Base","delay","forget","clearTimeoutEx","setTimeoutEx","isBoundWitnessWithMeta","BoundWitnessDivinerQuerySchema","PayloadBuilder","LRUCache","assertEx","Base","toJsonString","asArchivistInstance","asDivinerInstance","LRUCache","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","containsAll","assertEx","clearTimeoutEx","setTimeoutEx","isQueryBoundWitnessWithMeta","BoundWitnessDivinerQuerySchema","asModuleInstance","ModuleConfigSchema","PayloadBuilder","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","AbstractModuleProxy","AsyncQueryBusModuleProxy","AbstractModuleProxy","proxyQueryHandler","query","payloads","params","busClient","send","address","startHandler","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","assertEx","exists","AbstractBridge","creatableModule","assertEx","isAddress","AbstractBridgeModuleResolver","wrapModuleWithType","Account","ConfigSchema","asModuleInstance","ModuleConfigSchema","PubSubBridgeModuleResolver","AbstractBridgeModuleResolver","resolveHandler","id","options","parentResult","idParts","split","firstPart","shift","assertEx","isAddress","remainderParts","join","account","Account","randomSync","params","busClient","config","schema","ModuleConfigSchema","host","bridge","moduleAddress","proxy","AsyncQueryBusModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","as","asModuleInstance","upResolver","add","downResolver","length","resolve","moduleName","PubSubBridge","AbstractBridge","_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","module","host","busHost","expose","address","children","visibility","child","exposedHandler","exposedSet","exposedAddresses","startHandler","start","unexposeHandler","filterOptions","unexpose","client","AsyncQueryBusClient","logger","AsyncQueryBusHost","stopHandler","_timeout","stop","configSchemas","PubSubBridgeConfigSchema","creatableModule"]}
1
+ {"version":3,"sources":["../../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":["import { Base, BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { ModuleInstance } from '@xyo-network/module-model'\n\nexport type ModuleHostParams<THostedInstance extends ModuleInstance = ModuleInstance> = BaseParams<{\n module: THostedInstance\n}>\n\nexport abstract class AbstractModuleHost<TParams extends ModuleHostParams = ModuleHostParams> extends Base<TParams> {\n abstract start(): Promisable<void>\n abstract stop(): Promisable<void>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { CacheConfig, ModuleQueryResult } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { ModuleError, Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusClientParams, Pending } from './model'\n\nexport class AsyncQueryBusClient<TParams extends AsyncQueryBusClientParams = AsyncQueryBusClientParams> extends AsyncQueryBusBase<TParams> {\n protected _queryCache?: LRUCache<Address, Pending | ModuleQueryResult>\n private _pollCount = 0\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get queryCacheConfig(): LRUCache.Options<Address, Pending | ModuleQueryResult, unknown> {\n const queryCacheConfig: CacheConfig | undefined = this.config?.queryCache === true ? {} : this.config?.queryCache\n return { max: 100, ttl: 1000 * 60, ...queryCacheConfig }\n }\n\n get started() {\n return !!this._pollId\n }\n\n /**\n * A cache of queries that have been issued\n */\n protected get queryCache(): LRUCache<Address, Pending | ModuleQueryResult> {\n const config = this.queryCacheConfig\n const requiredConfig = { noUpdateTTL: false, ttlAutopurge: true }\n this._queryCache = this._queryCache ?? new LRUCache<Address, Pending | ModuleQueryResult>({ ...config, ...requiredConfig })\n return this._queryCache\n }\n\n listeningAddresses() {\n return this._queryCache?.keys()\n }\n\n async send(address: Address, query: QueryBoundWitness, payloads?: Payload[] | undefined): Promise<ModuleQueryResult> {\n //console.log('send')\n this.logger?.debug(`Begin issuing query to: ${address}`)\n const $meta = { ...query?.$meta, destination: [address] }\n const routedQuery = await PayloadBuilder.build({ ...query, $meta })\n //console.log('queryArchivist - calling')\n const queryArchivist = assertEx(\n await this.queriesArchivist(),\n () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n //console.log('queryArchivist')\n\n // TODO: Should we always re-hash to true up timestamps? We can't\n // re-sign correctly so we would lose that information if we did and\n // would also be replying to consumers with a different query hash than\n // they sent us (which might be OK since it reflect the chain of custody)\n // Revisit this once we have proxy module support as they are another\n // intermediary to consider.\n const routedQueryHash =\n // Trust the signed hash if it's there\n (routedQuery as WithMeta<QueryBoundWitness>)?.$hash ??\n // TODO: What is the right way to find the dataHash\n Object.keys(await PayloadBuilder.toDataHashMap([routedQuery]))[0]\n this.logger?.debug(`Issuing query: ${routedQueryHash} to: ${address}`)\n // If there was data associated with the query, add it to the insert\n const data = payloads ? [routedQuery, ...payloads] : [routedQuery]\n const insertResult = await queryArchivist.insert?.(data)\n this.logger?.debug(`Issued query: ${routedQueryHash} to: ${address}`)\n this.queryCache.set(routedQueryHash, Pending)\n if (!insertResult) throw new Error('Unable to issue query to queryArchivist')\n const context = new Promise<ModuleQueryResult>((resolve, reject) => {\n this.logger?.debug(`Polling for response to query: ${routedQueryHash}`)\n const pollForResponse = async () => {\n try {\n this.start()\n let response = this.queryCache.get(routedQueryHash)\n // Poll for response until cache key expires (response timed out)\n while (response !== undefined) {\n //console.log('polling...')\n // Wait a bit\n await delay(100)\n // Check the status of the response\n response = this.queryCache.get(routedQueryHash)\n // If status is no longer pending that means we received a response\n if (response && response !== Pending) {\n this.logger?.debug(`Returning response to query: ${routedQueryHash}`)\n resolve(response)\n return\n }\n }\n // If we got here waiting for a response timed out\n this.logger?.error('Timeout waiting for query response')\n // Resolve with error to match what a local module would do if it were to error\n // TODO: BW Builder/Sign result as this module?\n const error: ModuleError = {\n message: 'Timeout waiting for query response',\n query: 'network.xyo.boundwitness',\n schema: 'network.xyo.error.module',\n sources: [routedQueryHash],\n }\n reject(error)\n return\n } finally {\n this.stop()\n }\n }\n forget(pollForResponse())\n })\n return context\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingResponses()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for processing incoming responses to previously issued queries\n */\n private processIncomingResponses = async () => {\n const responseArchivist = assertEx(\n await this.responsesArchivist(),\n () => `Unable to contact the responsesArchivist [${this.config?.intersect?.responses?.archivist}]`,\n )\n const responseBoundWitnessDiviner = assertEx(\n await this.responsesDiviner(),\n () => `Unable to contact responsesDiviner [${this.config?.intersect?.responses?.boundWitnessDiviner}]`,\n )\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 { ArchivistInstance, asArchivistInstance } from '@xyo-network/archivist-model'\nimport { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload } from '@xyo-network/diviner-boundwitness-model'\nimport { asDivinerInstance, DivinerInstance } from '@xyo-network/diviner-model'\nimport { ModuleConfig } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusParams } from './model'\n\nexport class AsyncQueryBusBase<TParams extends AsyncQueryBusParams = AsyncQueryBusParams> extends Base<TParams> {\n protected _lastState?: LRUCache<Address, number>\n protected _targetConfigs: Record<Address, ModuleConfig> = {}\n protected _targetQueries: Record<Address, string[]> = {}\n\n private _lastQueriesArchivistAttempt?: number\n private _lastQueriesDivinerAttempt?: number\n private _lastResponseArchivistAttempt?: number\n private _lastResponseDivinerAttempt?: number\n private _queriesArchivist?: ArchivistInstance\n private _queriesDiviner?: DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, QueryBoundWitness>\n private _reResolveDelay = 5000\n private _responseArchivist?: ArchivistInstance\n private _responseDiviner?: DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, BoundWitness>\n\n constructor(params: TParams) {\n super(params)\n }\n\n get config(): TParams['config'] {\n return this.params.config\n }\n\n get pollFrequencyConfig(): number {\n return this.config?.pollFrequency ?? 1000\n }\n\n get resolver() {\n return this.params.resolver\n }\n\n /**\n * A cache of the last offset of the Diviner process per address\n */\n protected get lastState(): LRUCache<Address, number> {\n const requiredConfig = { max: 1000, ttl: 0 }\n this._lastState = this._lastState ?? new LRUCache<Address, number>(requiredConfig)\n return this._lastState\n }\n\n async queriesArchivist() {\n if (this._queriesArchivist) {\n return this._queriesArchivist\n }\n if (this._lastQueriesArchivistAttempt && Date.now() - this._lastQueriesArchivistAttempt < this._reResolveDelay) {\n return\n }\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 this._queriesArchivist = result\n return result\n }\n\n async queriesDiviner() {\n if (this._queriesDiviner) {\n return this._queriesDiviner\n }\n if (this._lastQueriesDivinerAttempt && Date.now() - this._lastQueriesDivinerAttempt < this._reResolveDelay) {\n return\n }\n this._queriesDiviner = 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 return this._queriesDiviner\n }\n\n async responsesArchivist() {\n if (this._responseArchivist) {\n return this._responseArchivist\n }\n if (this._lastResponseArchivistAttempt && Date.now() - this._lastResponseArchivistAttempt < this._reResolveDelay) {\n return\n }\n this._responseArchivist = assertEx(\n asArchivistInstance(await this.resolver.resolve(this.config?.intersect?.responses?.archivist)),\n () => `Unable to resolve responsesArchivist [${this.config?.intersect?.responses?.archivist}]`,\n )\n return this._responseArchivist\n }\n\n async responsesDiviner() {\n if (this._responseDiviner) {\n return this._responseDiviner\n }\n if (this._lastResponseDivinerAttempt && Date.now() - this._lastResponseDivinerAttempt < this._reResolveDelay) {\n return\n }\n this._responseDiviner = 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 return this._responseDiviner\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 = assertEx(\n await this.queriesArchivist(),\n () => `Unable to contact queriesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n const responsesArchivist = assertEx(\n await this.responsesArchivist(),\n () => `Unable to contact responsesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n const queryDestination = (query.$meta as { destination?: string[] })?.destination\n if (queryDestination && queryDestination?.includes(localModule.address)) {\n // Find the query\n const queryIndex = query.payload_hashes.indexOf(query.query)\n if (queryIndex !== -1) {\n const querySchema = query.payload_schemas[queryIndex]\n // If the destination can process this type of query\n if (localModule.queries.includes(querySchema)) {\n // Get the associated payloads\n const queryPayloads = await queryArchivist.get(query.payload_hashes)\n const queryPayloadsDict = await PayloadBuilder.toAllHashMap(queryPayloads)\n const queryHash = (await PayloadBuilder.build(query)).$hash\n // Check that we have all the arguments for the command\n if (!containsAll(Object.keys(queryPayloadsDict), query.payload_hashes)) {\n this.logger?.error(`Error processing command ${queryHash} for module ${localModuleName}, missing payloads`)\n return\n }\n try {\n // Issue the query against module\n const querySchema = queryPayloadsDict[query.query].schema\n this.logger?.debug(`Issuing query ${querySchema} (${queryHash}) addressed to module: ${localModuleName}`)\n const response = await localModule.query(query, queryPayloads, {\n allowedQueries: this._exposeOptions[localModule.address]?.allowedQueries,\n schema: ModuleConfigSchema,\n })\n const [bw, payloads, errors] = response\n this.logger?.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`)\n const insertResult = await responsesArchivist.insert([bw, ...payloads, ...errors])\n // NOTE: If all archivists support the contract that numPayloads inserted === numPayloads returned we can\n // do some deeper assertions here like lenIn === lenOut, but for now this should be good enough since BWs\n // should always be unique causing at least one insertion\n if (insertResult.length === 0) {\n this.logger?.error(`Error replying to query ${queryHash} addressed to module: ${localModuleName}`)\n }\n if (query?.timestamp) {\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to ensure we are using the timestamp of the store\n // so there's no chance of multiple commands at the same time\n await this.commitState(localModule.address, query.timestamp)\n }\n } catch (error) {\n this.logger?.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n console.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n }\n }\n }\n }\n }\n\n /**\n * Finds unprocessed commands addressed to the supplied address\n * @param address The address to find commands for\n */\n protected findQueriesToAddress = async (address: Address) => {\n const queryBoundWitnessDiviner = assertEx(\n await this.queriesDiviner(),\n () => `Unable to resolve queriesDiviner [${this.config?.intersect?.queries?.boundWitnessDiviner}]`,\n )\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 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 = 2, direction = 'all' } = options ?? {}\n const module = assertEx(await super.resolve(id), () => `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 = 5, 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 { asModuleInstance, 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 wrapped = wrapModuleWithType(proxy, account) as unknown as T\n const as = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(as)\n proxy.downResolver.add(as)\n this.add(as)\n return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : as\n }\n}\n"],"mappings":"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","names":["Base","AbstractModuleHost","Base","assertEx","delay","forget","clearTimeoutEx","setTimeoutEx","isBoundWitnessWithMeta","BoundWitnessDivinerQuerySchema","PayloadBuilder","LRUCache","assertEx","Base","toJsonString","asArchivistInstance","asDivinerInstance","LRUCache","AsyncQueryBusBase","Base","_lastState","_targetConfigs","_targetQueries","_lastQueriesArchivistAttempt","_lastQueriesDivinerAttempt","_lastResponseArchivistAttempt","_lastResponseDivinerAttempt","_queriesArchivist","_queriesDiviner","_reResolveDelay","_responseArchivist","_responseDiviner","constructor","params","config","pollFrequencyConfig","pollFrequency","resolver","lastState","requiredConfig","max","ttl","LRUCache","queriesArchivist","Date","now","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","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","_a","_b","_c","intersect","queries","archivist","routedQueryHash","$hash","Object","toDataHashMap","data","insertResult","insert","set","Pending","Error","context","Promise","resolve","reject","pollForResponse","start","response","get","undefined","delay","error","message","schema","sources","stop","forget","poll","setTimeoutEx","processIncomingResponses","e","clearTimeoutEx","pollFrequencyConfig","responseArchivist","responsesArchivist","responses","responseBoundWitnessDiviner","responsesDiviner","boundWitnessDiviner","pendingCommands","entries","filter","_","status","allSettled","map","sourceQuery","divinerQuery","BoundWitnessDivinerQuerySchema","result","divine","length","find","isBoundWitnessWithMeta","payload_hashes","containsAll","assertEx","clearTimeoutEx","setTimeoutEx","isQueryBoundWitnessWithMeta","BoundWitnessDivinerQuerySchema","asModuleInstance","ModuleConfigSchema","PayloadBuilder","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","_a","_b","_c","intersect","queries","archivist","responsesArchivist","queryDestination","$meta","destination","includes","queryIndex","payload_hashes","indexOf","querySchema","payload_schemas","queryPayloads","get","queryPayloadsDict","PayloadBuilder","toAllHashMap","queryHash","build","$hash","containsAll","Object","keys","error","schema","response","allowedQueries","ModuleConfigSchema","bw","payloads","errors","insertResult","insert","length","timestamp","commitState","findQueriesToAddress","queryBoundWitnessDiviner","queriesDiviner","boundWitnessDiviner","retrieveState","limit","divinerQuery","BoundWitnessDivinerQuerySchema","sort","result","divine","filter","isQueryBoundWitnessWithMeta","nextState","Math","max","c","setTimeoutEx","processIncomingQueries","e","pollFrequencyConfig","localModules","allSettled","AsyncQueryBusModuleHost","AbstractModuleHost","_busHost","constructor","params","start","listeningModules","config","module","resolve","direction","map","m","address","AsyncQueryBusHost","logger","resolver","stop","AbstractModuleProxy","AsyncQueryBusModuleProxy","AbstractModuleProxy","proxyQueryHandler","query","payloads","params","busClient","send","address","startHandler","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","assertEx","exists","AbstractBridge","creatableModule","assertEx","isAddress","AbstractBridgeModuleResolver","wrapModuleWithType","Account","ConfigSchema","asModuleInstance","ModuleConfigSchema","PubSubBridgeModuleResolver","AbstractBridgeModuleResolver","resolveHandler","id","options","parentResult","idParts","split","firstPart","shift","assertEx","isAddress","remainderParts","join","account","Account","randomSync","params","busClient","config","schema","ModuleConfigSchema","host","bridge","moduleAddress","proxy","AsyncQueryBusModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","as","asModuleInstance","upResolver","add","downResolver","length","resolve","moduleName","PubSubBridge","AbstractBridge","_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","module","host","busHost","expose","address","children","visibility","child","exposedHandler","exposedSet","exposedAddresses","startHandler","start","unexposeHandler","filterOptions","unexpose","client","AsyncQueryBusClient","logger","AsyncQueryBusHost","stopHandler","_timeout","stop","configSchemas","PubSubBridgeConfigSchema","creatableModule"]}
package/package.json CHANGED
@@ -19,28 +19,28 @@
19
19
  "@xylabs/object": "^3.0.25",
20
20
  "@xylabs/promise": "^3.0.25",
21
21
  "@xylabs/timer": "^3.0.25",
22
- "@xyo-network/abstract-bridge": "~2.94.7",
23
- "@xyo-network/account": "~2.94.7",
24
- "@xyo-network/archivist-model": "~2.94.7",
25
- "@xyo-network/boundwitness-model": "~2.94.7",
26
- "@xyo-network/bridge-model": "~2.94.7",
27
- "@xyo-network/config-payload-plugin": "~2.94.7",
28
- "@xyo-network/diviner-boundwitness-model": "~2.94.7",
29
- "@xyo-network/diviner-model": "~2.94.7",
30
- "@xyo-network/module-model": "~2.94.7",
31
- "@xyo-network/payload-builder": "~2.94.7",
32
- "@xyo-network/payload-model": "~2.94.7",
22
+ "@xyo-network/abstract-bridge": "~2.94.9",
23
+ "@xyo-network/account": "~2.94.9",
24
+ "@xyo-network/archivist-model": "~2.94.9",
25
+ "@xyo-network/boundwitness-model": "~2.94.9",
26
+ "@xyo-network/bridge-model": "~2.94.9",
27
+ "@xyo-network/config-payload-plugin": "~2.94.9",
28
+ "@xyo-network/diviner-boundwitness-model": "~2.94.9",
29
+ "@xyo-network/diviner-model": "~2.94.9",
30
+ "@xyo-network/module-model": "~2.94.9",
31
+ "@xyo-network/payload-builder": "~2.94.9",
32
+ "@xyo-network/payload-model": "~2.94.9",
33
33
  "lru-cache": "^10.2.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@xylabs/logger": "^3.0.25",
37
- "@xylabs/ts-scripts-yarn3": "^3.5.2",
38
- "@xylabs/tsconfig": "^3.5.2",
39
- "@xyo-network/archivist-memory": "~2.94.7",
40
- "@xyo-network/diviner-boundwitness-memory": "~2.94.7",
41
- "@xyo-network/node-memory": "~2.94.7",
42
- "@xyo-network/node-model": "~2.94.7",
43
- "@xyo-network/payload-wrapper": "~2.94.7",
37
+ "@xylabs/ts-scripts-yarn3": "^3.9.0",
38
+ "@xylabs/tsconfig": "^3.9.0",
39
+ "@xyo-network/archivist-memory": "~2.94.9",
40
+ "@xyo-network/diviner-boundwitness-memory": "~2.94.9",
41
+ "@xyo-network/node-memory": "~2.94.9",
42
+ "@xyo-network/node-model": "~2.94.9",
43
+ "@xyo-network/payload-wrapper": "~2.94.9",
44
44
  "typescript": "^5.4.3"
45
45
  },
46
46
  "description": "Primary SDK for using XYO Protocol 2.0",
@@ -82,6 +82,6 @@
82
82
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
83
83
  },
84
84
  "sideEffects": false,
85
- "version": "2.94.7",
85
+ "version": "2.94.9",
86
86
  "type": "module"
87
87
  }