@xyo-network/bridge-pub-sub 2.92.6 → 2.92.8
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.
- package/dist/browser/AsyncQueryBus/AsyncQueryBusClient.d.cts.map +1 -1
- package/dist/browser/AsyncQueryBus/AsyncQueryBusClient.d.mts.map +1 -1
- package/dist/browser/AsyncQueryBus/AsyncQueryBusClient.d.ts.map +1 -1
- package/dist/browser/AsyncQueryBus/AsyncQueryBusHost.d.cts +7 -2
- package/dist/browser/AsyncQueryBus/AsyncQueryBusHost.d.cts.map +1 -1
- package/dist/browser/AsyncQueryBus/AsyncQueryBusHost.d.mts +7 -2
- package/dist/browser/AsyncQueryBus/AsyncQueryBusHost.d.mts.map +1 -1
- package/dist/browser/AsyncQueryBus/AsyncQueryBusHost.d.ts +7 -2
- package/dist/browser/AsyncQueryBus/AsyncQueryBusHost.d.ts.map +1 -1
- package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts +1 -1
- package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts.map +1 -1
- package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts +1 -1
- package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts.map +1 -1
- package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts +1 -1
- package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts.map +1 -1
- package/dist/browser/AsyncQueryBus/model/ClientConfig.d.cts +1 -1
- package/dist/browser/AsyncQueryBus/model/ClientConfig.d.mts +1 -1
- package/dist/browser/AsyncQueryBus/model/ClientConfig.d.ts +1 -1
- package/dist/browser/PubSubBridge.d.cts +7 -5
- package/dist/browser/PubSubBridge.d.cts.map +1 -1
- package/dist/browser/PubSubBridge.d.mts +7 -5
- package/dist/browser/PubSubBridge.d.mts.map +1 -1
- package/dist/browser/PubSubBridge.d.ts +7 -5
- package/dist/browser/PubSubBridge.d.ts.map +1 -1
- package/dist/browser/PubSubBridgeModuleResolver.d.cts +10 -0
- package/dist/browser/PubSubBridgeModuleResolver.d.cts.map +1 -0
- package/dist/browser/PubSubBridgeModuleResolver.d.mts +10 -0
- package/dist/browser/PubSubBridgeModuleResolver.d.mts.map +1 -0
- package/dist/browser/PubSubBridgeModuleResolver.d.ts +10 -0
- package/dist/browser/PubSubBridgeModuleResolver.d.ts.map +1 -0
- package/dist/browser/index.cjs +56 -31
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +1 -0
- package/dist/browser/index.d.cts.map +1 -1
- package/dist/browser/index.d.mts +1 -0
- package/dist/browser/index.d.mts.map +1 -1
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +56 -31
- package/dist/browser/index.js.map +1 -1
- package/dist/node/AsyncQueryBus/AsyncQueryBusClient.d.cts.map +1 -1
- package/dist/node/AsyncQueryBus/AsyncQueryBusClient.d.mts.map +1 -1
- package/dist/node/AsyncQueryBus/AsyncQueryBusClient.d.ts.map +1 -1
- package/dist/node/AsyncQueryBus/AsyncQueryBusHost.d.cts +7 -2
- package/dist/node/AsyncQueryBus/AsyncQueryBusHost.d.cts.map +1 -1
- package/dist/node/AsyncQueryBus/AsyncQueryBusHost.d.mts +7 -2
- package/dist/node/AsyncQueryBus/AsyncQueryBusHost.d.mts.map +1 -1
- package/dist/node/AsyncQueryBus/AsyncQueryBusHost.d.ts +7 -2
- package/dist/node/AsyncQueryBus/AsyncQueryBusHost.d.ts.map +1 -1
- package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts +1 -1
- package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts.map +1 -1
- package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts +1 -1
- package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts.map +1 -1
- package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts +1 -1
- package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts.map +1 -1
- package/dist/node/AsyncQueryBus/model/ClientConfig.d.cts +1 -1
- package/dist/node/AsyncQueryBus/model/ClientConfig.d.mts +1 -1
- package/dist/node/AsyncQueryBus/model/ClientConfig.d.ts +1 -1
- package/dist/node/PubSubBridge.d.cts +7 -5
- package/dist/node/PubSubBridge.d.cts.map +1 -1
- package/dist/node/PubSubBridge.d.mts +7 -5
- package/dist/node/PubSubBridge.d.mts.map +1 -1
- package/dist/node/PubSubBridge.d.ts +7 -5
- package/dist/node/PubSubBridge.d.ts.map +1 -1
- package/dist/node/PubSubBridgeModuleResolver.d.cts +10 -0
- package/dist/node/PubSubBridgeModuleResolver.d.cts.map +1 -0
- package/dist/node/PubSubBridgeModuleResolver.d.mts +10 -0
- package/dist/node/PubSubBridgeModuleResolver.d.mts.map +1 -0
- package/dist/node/PubSubBridgeModuleResolver.d.ts +10 -0
- package/dist/node/PubSubBridgeModuleResolver.d.ts.map +1 -0
- package/dist/node/index.cjs +60 -35
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +1 -0
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.mts +1 -0
- package/dist/node/index.d.mts.map +1 -1
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +59 -35
- package/dist/node/index.js.map +1 -1
- package/package.json +24 -25
- package/src/AsyncQueryBus/AsyncQueryBusClient.ts +3 -4
- package/src/AsyncQueryBus/AsyncQueryBusHost.ts +17 -5
- package/src/AsyncQueryBus/ModuleHost/ModuleHost.ts +1 -1
- package/src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts +1 -1
- package/src/AsyncQueryBus/model/ClientConfig.ts +1 -1
- package/src/PubSubBridge.ts +22 -26
- package/src/PubSubBridgeModuleResolver.ts +29 -0
- package/src/index.ts +1 -0
package/dist/node/index.js
CHANGED
|
@@ -193,7 +193,7 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
|
|
|
193
193
|
this.queryCache.set(routedQueryHash, Pending);
|
|
194
194
|
if (!insertResult)
|
|
195
195
|
throw new Error("Unable to issue query to queryArchivist");
|
|
196
|
-
const context = new Promise((resolve) => {
|
|
196
|
+
const context = new Promise((resolve, reject) => {
|
|
197
197
|
var _a2;
|
|
198
198
|
(_a2 = this.logger) == null ? void 0 : _a2.debug(`Polling for response to query: ${routedQueryHash}`);
|
|
199
199
|
const pollForResponse = /* @__PURE__ */ __name(async () => {
|
|
@@ -219,13 +219,7 @@ var _AsyncQueryBusClient = class _AsyncQueryBusClient extends AsyncQueryBusBase
|
|
|
219
219
|
routedQueryHash
|
|
220
220
|
]
|
|
221
221
|
};
|
|
222
|
-
|
|
223
|
-
routedQuery,
|
|
224
|
-
[],
|
|
225
|
-
[
|
|
226
|
-
await PayloadBuilder.build(error)
|
|
227
|
-
]
|
|
228
|
-
]);
|
|
222
|
+
reject(error);
|
|
229
223
|
return;
|
|
230
224
|
} finally {
|
|
231
225
|
this.stop();
|
|
@@ -313,10 +307,11 @@ import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
|
313
307
|
import { clearTimeoutEx as clearTimeoutEx2, setTimeoutEx as setTimeoutEx2 } from "@xylabs/timer";
|
|
314
308
|
import { isQueryBoundWitnessWithMeta } from "@xyo-network/boundwitness-model";
|
|
315
309
|
import { BoundWitnessDivinerQuerySchema as BoundWitnessDivinerQuerySchema2 } from "@xyo-network/diviner-boundwitness-model";
|
|
316
|
-
import { asModuleInstance } from "@xyo-network/module-model";
|
|
310
|
+
import { asModuleInstance, ModuleConfigSchema } from "@xyo-network/module-model";
|
|
317
311
|
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
|
|
318
312
|
var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
|
|
319
313
|
_exposedAddresses = /* @__PURE__ */ new Set();
|
|
314
|
+
_exposeOptions = {};
|
|
320
315
|
_pollId;
|
|
321
316
|
constructor(params) {
|
|
322
317
|
super(params);
|
|
@@ -331,10 +326,14 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
|
|
|
331
326
|
get started() {
|
|
332
327
|
return !!this._pollId;
|
|
333
328
|
}
|
|
334
|
-
expose(address,
|
|
329
|
+
expose(address, options = {}) {
|
|
335
330
|
var _a;
|
|
336
|
-
|
|
331
|
+
const { failOnAlreadyExposed } = options;
|
|
332
|
+
assertEx2(!failOnAlreadyExposed || !this._exposedAddresses.has(address), () => `Address already exposed [${address}]`);
|
|
337
333
|
this._exposedAddresses.add(address);
|
|
334
|
+
this._exposeOptions[address] = {
|
|
335
|
+
...options
|
|
336
|
+
};
|
|
338
337
|
(_a = this.logger) == null ? void 0 : _a.debug(`${address} exposed`);
|
|
339
338
|
}
|
|
340
339
|
async listeningModules() {
|
|
@@ -364,10 +363,11 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
|
|
|
364
363
|
var _a;
|
|
365
364
|
assertEx2(!validate || this._exposedAddresses.has(address), () => `Address not exposed [${address}]`);
|
|
366
365
|
this._exposedAddresses.delete(address);
|
|
366
|
+
delete this._exposeOptions[address];
|
|
367
367
|
(_a = this.logger) == null ? void 0 : _a.debug(`${address} unexposed`);
|
|
368
368
|
}
|
|
369
369
|
callLocalModule = async (localModule, query) => {
|
|
370
|
-
var _a, _b, _c, _d, _e, _f;
|
|
370
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
371
371
|
const localModuleName = localModule.config.name ?? localModule.address;
|
|
372
372
|
const queryArchivist = await this.queriesArchivist();
|
|
373
373
|
const responseArchivist = await this.responsesArchivist();
|
|
@@ -387,22 +387,25 @@ var _AsyncQueryBusHost = class _AsyncQueryBusHost extends AsyncQueryBusBase {
|
|
|
387
387
|
try {
|
|
388
388
|
const querySchema2 = queryPayloadsDict[query.query].schema;
|
|
389
389
|
(_c = this.logger) == null ? void 0 : _c.debug(`Issuing query ${querySchema2} (${queryHash}) addressed to module: ${localModuleName}`);
|
|
390
|
-
const response = await localModule.query(query, queryPayloads
|
|
390
|
+
const response = await localModule.query(query, queryPayloads, {
|
|
391
|
+
allowedQueries: (_d = this._exposeOptions[localModule.address]) == null ? void 0 : _d.allowedQueries,
|
|
392
|
+
schema: ModuleConfigSchema
|
|
393
|
+
});
|
|
391
394
|
const [bw, payloads, errors] = response;
|
|
392
|
-
(
|
|
395
|
+
(_e = this.logger) == null ? void 0 : _e.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`);
|
|
393
396
|
const insertResult = await responseArchivist.insert([
|
|
394
397
|
bw,
|
|
395
398
|
...payloads,
|
|
396
399
|
...errors
|
|
397
400
|
]);
|
|
398
401
|
if (insertResult.length === 0) {
|
|
399
|
-
(
|
|
402
|
+
(_f = this.logger) == null ? void 0 : _f.error(`Error replying to query ${queryHash} addressed to module: ${localModuleName}`);
|
|
400
403
|
}
|
|
401
404
|
if (query == null ? void 0 : query.timestamp) {
|
|
402
405
|
await this.commitState(localModule.address, query.timestamp);
|
|
403
406
|
}
|
|
404
407
|
} catch (error) {
|
|
405
|
-
(
|
|
408
|
+
(_g = this.logger) == null ? void 0 : _g.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`);
|
|
406
409
|
console.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`);
|
|
407
410
|
}
|
|
408
411
|
}
|
|
@@ -490,7 +493,7 @@ var _AsyncQueryBusModuleHost = class _AsyncQueryBusModuleHost extends AbstractMo
|
|
|
490
493
|
}
|
|
491
494
|
async start() {
|
|
492
495
|
var _a;
|
|
493
|
-
const listeningModules = this.params.config.listeningModules ?? (await this.params.module.resolve(
|
|
496
|
+
const listeningModules = this.params.config.listeningModules ?? (await this.params.module.resolve("*", {
|
|
494
497
|
direction: "down"
|
|
495
498
|
})).map((m) => m.address);
|
|
496
499
|
this._busHost = new AsyncQueryBusHost({
|
|
@@ -514,7 +517,7 @@ var AsyncQueryBusModuleHost = _AsyncQueryBusModuleHost;
|
|
|
514
517
|
// src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts
|
|
515
518
|
import { AbstractModuleProxy } from "@xyo-network/abstract-bridge";
|
|
516
519
|
var _AsyncQueryBusModuleProxy = class _AsyncQueryBusModuleProxy extends AbstractModuleProxy {
|
|
517
|
-
async
|
|
520
|
+
async proxyQueryHandler(query, payloads) {
|
|
518
521
|
return await this.proxyParams.busClient.send(this.address, query, payloads);
|
|
519
522
|
}
|
|
520
523
|
};
|
|
@@ -530,8 +533,31 @@ var PubSubBridgeConfigSchema = `${PubSubBridgeSchema}.config`;
|
|
|
530
533
|
// src/PubSubBridge.ts
|
|
531
534
|
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
532
535
|
import { AbstractBridge } from "@xyo-network/abstract-bridge";
|
|
533
|
-
import { Account } from "@xyo-network/account";
|
|
534
536
|
import { creatableModule } from "@xyo-network/module-model";
|
|
537
|
+
|
|
538
|
+
// src/PubSubBridgeModuleResolver.ts
|
|
539
|
+
import { AbstractBridgeModuleResolver } from "@xyo-network/abstract-bridge";
|
|
540
|
+
import { Account } from "@xyo-network/account";
|
|
541
|
+
var _PubSubBridgeModuleResolver = class _PubSubBridgeModuleResolver extends AbstractBridgeModuleResolver {
|
|
542
|
+
async resolveHandler(id, options) {
|
|
543
|
+
const idParts = id.split(":");
|
|
544
|
+
const firstPart = idParts.shift();
|
|
545
|
+
const remainderParts = idParts.join(":");
|
|
546
|
+
const account = Account.randomSync();
|
|
547
|
+
const params = {
|
|
548
|
+
account,
|
|
549
|
+
busClient: this.options.busClient,
|
|
550
|
+
host: this.options.bridge,
|
|
551
|
+
moduleAddress: firstPart
|
|
552
|
+
};
|
|
553
|
+
const proxy = new AsyncQueryBusModuleProxy(params);
|
|
554
|
+
return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : proxy;
|
|
555
|
+
}
|
|
556
|
+
};
|
|
557
|
+
__name(_PubSubBridgeModuleResolver, "PubSubBridgeModuleResolver");
|
|
558
|
+
var PubSubBridgeModuleResolver = _PubSubBridgeModuleResolver;
|
|
559
|
+
|
|
560
|
+
// src/PubSubBridge.ts
|
|
535
561
|
function _ts_decorate(decorators, target, key, desc) {
|
|
536
562
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
537
563
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
@@ -552,6 +578,17 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
|
|
|
552
578
|
_lastState;
|
|
553
579
|
_busClient;
|
|
554
580
|
_busHost;
|
|
581
|
+
_resolver;
|
|
582
|
+
get resolver() {
|
|
583
|
+
this._resolver = this._resolver ?? new PubSubBridgeModuleResolver({
|
|
584
|
+
bridge: this,
|
|
585
|
+
busClient: assertEx3(this.busClient(), () => "busClient not configured"),
|
|
586
|
+
downResolver: this.downResolver,
|
|
587
|
+
upResolver: this.upResolver,
|
|
588
|
+
wrapperAccount: this.account
|
|
589
|
+
});
|
|
590
|
+
return this._resolver;
|
|
591
|
+
}
|
|
555
592
|
get moduleName() {
|
|
556
593
|
return `${this.config.name ?? moduleName}`;
|
|
557
594
|
}
|
|
@@ -561,7 +598,7 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
|
|
|
561
598
|
};
|
|
562
599
|
const module = await super.resolve(id, filterOptions);
|
|
563
600
|
if (module) {
|
|
564
|
-
const host = assertEx3(this.busHost(), "Not configured as a host");
|
|
601
|
+
const host = assertEx3(this.busHost(), () => "Not configured as a host");
|
|
565
602
|
host.expose(module.address);
|
|
566
603
|
return [
|
|
567
604
|
module.address
|
|
@@ -569,27 +606,13 @@ var _PubSubBridge = class _PubSubBridge extends AbstractBridge {
|
|
|
569
606
|
}
|
|
570
607
|
return [];
|
|
571
608
|
}
|
|
572
|
-
async resolveHandler(id, options) {
|
|
573
|
-
const idParts = id.split(":");
|
|
574
|
-
const firstPart = idParts.shift();
|
|
575
|
-
const remainderParts = idParts.join(":");
|
|
576
|
-
const account = Account.randomSync();
|
|
577
|
-
const params = {
|
|
578
|
-
account,
|
|
579
|
-
bridge: this,
|
|
580
|
-
busClient: assertEx3(this.busClient(), "Bus client not initialized"),
|
|
581
|
-
moduleAddress: firstPart
|
|
582
|
-
};
|
|
583
|
-
const proxy = new AsyncQueryBusModuleProxy(params);
|
|
584
|
-
return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : proxy;
|
|
585
|
-
}
|
|
586
609
|
async unexposeHandler(id, options) {
|
|
587
610
|
const filterOptions = {
|
|
588
611
|
direction: options == null ? void 0 : options.direction
|
|
589
612
|
};
|
|
590
613
|
const module = await super.resolve(id, filterOptions);
|
|
591
614
|
if (module) {
|
|
592
|
-
const host = assertEx3(this.busHost(), "Not configured as a host");
|
|
615
|
+
const host = assertEx3(this.busHost(), () => "Not configured as a host");
|
|
593
616
|
host.unexpose(module.address);
|
|
594
617
|
return [
|
|
595
618
|
module.address
|
|
@@ -645,6 +668,7 @@ export {
|
|
|
645
668
|
Pending,
|
|
646
669
|
PubSubBridge,
|
|
647
670
|
PubSubBridgeConfigSchema,
|
|
671
|
+
PubSubBridgeModuleResolver,
|
|
648
672
|
PubSubBridgeSchema
|
|
649
673
|
};
|
|
650
674
|
//# sourceMappingURL=index.js.map
|
package/dist/node/index.js.map
CHANGED
|
@@ -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"],"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 { CacheConfig } from '@xyo-network/bridge-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { ModuleQueryResult } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { ModuleError, Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusClientParams, Pending } from './model'\n\nexport class AsyncQueryBusClient<TParams extends AsyncQueryBusClientParams = AsyncQueryBusClientParams> extends AsyncQueryBusBase<TParams> {\n protected _queryCache?: LRUCache<Address, Pending | ModuleQueryResult>\n private _pollCount = 0\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get queryCacheConfig(): LRUCache.Options<Address, Pending | ModuleQueryResult, unknown> {\n const queryCacheConfig: CacheConfig | undefined = this.config?.queryCache === true ? {} : this.config?.queryCache\n return { max: 100, ttl: 1000 * 60, ...queryCacheConfig }\n }\n\n get started() {\n return !!this._pollId\n }\n\n /**\n * A cache of queries that have been issued\n */\n protected get queryCache(): LRUCache<Address, Pending | ModuleQueryResult> {\n const config = this.queryCacheConfig\n const requiredConfig = { noUpdateTTL: false, ttlAutopurge: true }\n this._queryCache = this._queryCache ?? new LRUCache<Address, Pending | ModuleQueryResult>({ ...config, ...requiredConfig })\n return this._queryCache\n }\n\n listeningAddresses() {\n return this._queryCache?.keys()\n }\n\n async send(address: Address, query: QueryBoundWitness, payloads?: Payload[] | undefined): Promise<ModuleQueryResult> {\n this.logger?.debug(`Begin issuing query to: ${address}`)\n const $meta = { ...query?.$meta, destination: [address] }\n const routedQuery = await PayloadBuilder.build({ ...query, $meta })\n const queryArchivist = await this.queriesArchivist()\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) => {\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 // 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 resolve([routedQuery, [], [await PayloadBuilder.build(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 } 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 return assertEx(\n asArchivistInstance(await this.resolver.resolve(this.config?.intersect?.queries?.archivist)),\n () => `Unable to resolve queriesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\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, ModuleInstance } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { WithMeta } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusHostParams } from './model'\n\nexport class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQueryBusHostParams> extends AsyncQueryBusBase<TParams> {\n protected _exposedAddresses = new Set<Address>()\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, validate = true) {\n assertEx(!validate || !this._exposedAddresses.has(address), () => `Address already exposed [${address}]`)\n this._exposedAddresses.add(address)\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 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 const [bw, payloads, errors] = response\n this.logger?.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`)\n const insertResult = await responseArchivist.insert([bw, ...payloads, ...errors])\n // NOTE: If all archivists support the contract that numPayloads inserted === numPayloads returned we can\n // do some deeper assertions here like lenIn === lenOut, but for now this should be good enough since BWs\n // should always be unique causing at least one insertion\n if (insertResult.length === 0) {\n this.logger?.error(`Error replying to query ${queryHash} addressed to module: ${localModuleName}`)\n }\n if (query?.timestamp) {\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to ensure we are using the timestamp of the store\n // so there's no chance of multiple commands at the same time\n await this.commitState(localModule.address, query.timestamp)\n }\n } catch (error) {\n this.logger?.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n console.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n }\n }\n }\n }\n }\n\n /**\n * Finds unprocessed commands addressed to the supplied address\n * @param address The address to find commands for\n */\n protected findQueriesToAddress = async (address: Address) => {\n const queryBoundWitnessDiviner = await this.queriesDiviner()\n // Retrieve last offset from state store\n const timestamp = await this.retrieveState(address)\n const destination = [address]\n const limit = this.perAddressBatchQueryLimit\n // Filter for commands to us by destination address\n const divinerQuery = { destination, limit, schema: BoundWitnessDivinerQuerySchema, sort: 'asc', timestamp }\n const result = await queryBoundWitnessDiviner.divine([divinerQuery])\n const queries = result.filter(isQueryBoundWitnessWithMeta)\n const nextState = queries.length > 0 ? Math.max(...queries.map((c) => c.timestamp ?? 0)) + 1 : timestamp\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to use the timestamp of the store so there's no\n // chance of multiple commands at the same time\n await this.commitState(address, nextState)\n return queries\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingQueries()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for checking for inbound queries\n */\n private processIncomingQueries = async () => {\n this.logger?.debug('Checking for inbound queries')\n // Check for any queries that have been issued and have not been responded to\n const localModules = await this.listeningModules()\n\n // TODO: Do in throttled batches\n await Promise.allSettled(\n localModules.map(async (localModule) => {\n try {\n const localModuleName = localModule.config.name ?? localModule.address\n this.logger?.debug(`Checking for inbound queries to ${localModuleName}`)\n const queries = await this.findQueriesToAddress(localModule.address)\n if (queries.length === 0) return\n this.logger?.debug(`Found queries addressed to local module: ${localModuleName}`)\n for (const query of queries) {\n await this.callLocalModule(localModule, query)\n }\n } catch (error) {\n this.logger?.error(`Error processing queries for address ${localModule.address}: ${error}`)\n }\n }),\n )\n }\n}\n","import { AbstractModuleHost, ModuleHostParams } from '../../AbstractModuleHost'\nimport { AsyncQueryBusHost } from '../AsyncQueryBusHost'\nimport { AsyncQueryBusHostConfig } from '../model'\n\nexport type AsyncQueryBusModuleHostParams = ModuleHostParams & {\n config: AsyncQueryBusHostConfig\n}\n\nexport class AsyncQueryBusModuleHost extends AbstractModuleHost<AsyncQueryBusModuleHostParams> {\n private _busHost?: AsyncQueryBusHost\n\n constructor(params: AsyncQueryBusModuleHostParams) {\n super(params)\n }\n\n override async start(): Promise<void> {\n const listeningModules =\n this.params.config.listeningModules ?? (await this.params.module.resolve(undefined, { direction: 'down' })).map((m) => m.address)\n this._busHost = new AsyncQueryBusHost({\n config: { ...this.params.config, listeningModules },\n logger: this.params.logger,\n resolver: this.params.module,\n })\n this._busHost?.start()\n }\n override stop() {\n this._busHost?.stop()\n }\n}\n","import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { Module, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusClient } from '../AsyncQueryBusClient'\n\nexport type AsyncQueryBusModuleProxyParams = ModuleProxyParams & {\n busClient: AsyncQueryBusClient\n}\n\nexport class AsyncQueryBusModuleProxy<TWrappedModule extends Module = Module>\n extends AbstractModuleProxy<AsyncQueryBusModuleProxyParams, TWrappedModule>\n implements ModuleInstance<TWrappedModule['params'], TWrappedModule['eventData']>\n{\n async query<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {\n return await this.proxyParams.busClient.send(this.address, query, payloads)\n }\n}\n","export const PubSubBridgeSchema = 'network.xyo.bridge.pubsub'\nexport type PubSubBridgeSchema = typeof PubSubBridgeSchema\n","import { 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 } & TConfig,\n TSchema extends string ? TSchema : PubSubBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { creatableModule, ModuleEventData, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusClient, AsyncQueryBusHost, AsyncQueryBusModuleProxy, AsyncQueryBusModuleProxyParams } from './AsyncQueryBus'\nimport { PubSubBridgeConfigSchema } from './Config'\nimport { PubSubBridgeParams } from './Params'\n\nconst moduleName = 'PubSubBridge'\n\n@creatableModule()\nexport class PubSubBridge<TParams extends PubSubBridgeParams = PubSubBridgeParams, TEventData extends ModuleEventData = ModuleEventData>\n extends AbstractBridge<TParams, TEventData>\n implements BridgeModule<TParams, TEventData>\n{\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\n protected get moduleName() {\n return `${this.config.name ?? moduleName}`\n }\n\n async exposeHandler(id: ModuleIdentifier, options?: BridgeExposeOptions | undefined): Promise<Lowercase<string>[]> {\n const filterOptions: ModuleFilterOptions = { direction: options?.direction }\n const module = await super.resolve(id, filterOptions)\n if (module) {\n const host = assertEx(this.busHost(), 'Not configured as a host')\n host.expose(module.address)\n return [module.address]\n }\n return []\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined> {\n const idParts = id.split(':')\n const firstPart = idParts.shift()\n const remainderParts = idParts.join(':')\n const account = Account.randomSync()\n const params: AsyncQueryBusModuleProxyParams = {\n account,\n bridge: this,\n busClient: assertEx(this.busClient(), 'Bus client not initialized'),\n moduleAddress: firstPart as Address,\n }\n const proxy = new AsyncQueryBusModuleProxy<T>(params) as unknown as T\n return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : proxy\n }\n\n async unexposeHandler(id: ModuleIdentifier, options?: BridgeUnexposeOptions | undefined): Promise<Lowercase<string>[]> {\n const filterOptions: ModuleFilterOptions = { direction: options?.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 return [module.address]\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 startHandler(): Promise<boolean> {\n this.busHost()?.start()\n return Promise.resolve(true)\n }\n\n protected override stopHandler(_timeout?: number | undefined) {\n this.busHost()?.stop()\n return true\n }\n}\n"],"mappings":"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","names":["Base","AbstractModuleHost","Base","delay","forget","clearTimeoutEx","setTimeoutEx","isBoundWitnessWithMeta","BoundWitnessDivinerQuerySchema","PayloadBuilder","LRUCache","assertEx","Base","asArchivistInstance","asDivinerInstance","LRUCache","AsyncQueryBusBase","Base","_lastState","_targetConfigs","_targetQueries","constructor","params","config","pollFrequencyConfig","pollFrequency","resolver","lastState","requiredConfig","max","ttl","LRUCache","queriesArchivist","assertEx","asArchivistInstance","resolve","intersect","queries","archivist","_a","_b","_c","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","_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","PayloadBuilder","AsyncQueryBusHost","AsyncQueryBusBase","_exposedAddresses","Set","_pollId","constructor","params","exposedAddresses","perAddressBatchQueryLimit","config","started","expose","address","validate","assertEx","has","add","logger","debug","listeningModules","exposedModules","values","mods","Promise","all","map","listeningModule","asModuleInstance","resolver","resolve","start","console","warn","poll","stop","clearTimeoutEx","undefined","unexpose","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","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","undefined","direction","map","m","address","AsyncQueryBusHost","logger","resolver","stop","AbstractModuleProxy","AsyncQueryBusModuleProxy","AbstractModuleProxy","query","payloads","proxyParams","busClient","send","address","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","assertEx","AbstractBridge","Account","creatableModule","moduleName","PubSubBridge","AbstractBridge","_configRootAddress","_configStateStoreArchivist","_configStateStoreBoundWitnessDiviner","_exposedAddresses","_lastState","_busClient","_busHost","config","name","exposeHandler","id","options","filterOptions","direction","module","resolve","host","assertEx","busHost","expose","address","resolveHandler","idParts","split","firstPart","shift","remainderParts","join","account","Account","randomSync","params","bridge","busClient","moduleAddress","proxy","AsyncQueryBusModuleProxy","length","unexposeHandler","unexpose","client","AsyncQueryBusClient","logger","resolver","AsyncQueryBusHost","startHandler","start","Promise","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 { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { CacheConfig, ModuleQueryResult } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { ModuleError, Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusClientParams, Pending } from './model'\n\nexport class AsyncQueryBusClient<TParams extends AsyncQueryBusClientParams = AsyncQueryBusClientParams> extends AsyncQueryBusBase<TParams> {\n protected _queryCache?: LRUCache<Address, Pending | ModuleQueryResult>\n private _pollCount = 0\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get queryCacheConfig(): LRUCache.Options<Address, Pending | ModuleQueryResult, unknown> {\n const queryCacheConfig: CacheConfig | undefined = this.config?.queryCache === true ? {} : this.config?.queryCache\n return { max: 100, ttl: 1000 * 60, ...queryCacheConfig }\n }\n\n get started() {\n return !!this._pollId\n }\n\n /**\n * A cache of queries that have been issued\n */\n protected get queryCache(): LRUCache<Address, Pending | ModuleQueryResult> {\n const config = this.queryCacheConfig\n const requiredConfig = { noUpdateTTL: false, ttlAutopurge: true }\n this._queryCache = this._queryCache ?? new LRUCache<Address, Pending | ModuleQueryResult>({ ...config, ...requiredConfig })\n return this._queryCache\n }\n\n listeningAddresses() {\n return this._queryCache?.keys()\n }\n\n async send(address: Address, query: QueryBoundWitness, payloads?: Payload[] | undefined): Promise<ModuleQueryResult> {\n this.logger?.debug(`Begin issuing query to: ${address}`)\n const $meta = { ...query?.$meta, destination: [address] }\n const routedQuery = await PayloadBuilder.build({ ...query, $meta })\n const queryArchivist = await this.queriesArchivist()\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 // 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 } 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 return assertEx(\n asArchivistInstance(await this.resolver.resolve(this.config?.intersect?.queries?.archivist)),\n () => `Unable to resolve queriesArchivist [${this.config?.intersect?.queries?.archivist}]`,\n )\n }\n\n async queriesDiviner() {\n return assertEx(\n asDivinerInstance(await this.resolver.resolve(this.config?.intersect?.queries?.boundWitnessDiviner)),\n () => `Unable to resolve queriesDiviner [${this.config?.intersect?.queries?.boundWitnessDiviner}]`,\n ) as DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, QueryBoundWitness>\n }\n\n async responsesArchivist() {\n return assertEx(\n asArchivistInstance(await this.resolver.resolve(this.config?.intersect?.responses?.archivist)),\n () => `Unable to resolve responsesArchivist [${this.config?.intersect?.responses?.archivist}]`,\n )\n }\n\n async responsesDiviner() {\n return assertEx(\n asDivinerInstance(await this.resolver.resolve(this.config?.intersect?.responses?.boundWitnessDiviner)),\n () => `Unable to resolve responsesDiviner [${this.config?.intersect?.responses?.boundWitnessDiviner}]`,\n ) as DivinerInstance<BoundWitnessDivinerParams, BoundWitnessDivinerQueryPayload, BoundWitness>\n }\n\n /**\n * Commit the internal state of the process. This is similar\n * to a transaction completion in a database and should only be called\n * when results have been successfully persisted to the appropriate\n * external stores.\n * @param address The module address to commit the state for\n * @param nextState The state to commit\n */\n protected async commitState(address: Address, nextState: number) {\n await Promise.resolve()\n // TODO: Offload to Archivist/Diviner instead of in-memory\n const lastState = this.lastState.get(address)\n if (lastState && lastState >= nextState) return\n this.lastState.set(address, nextState)\n }\n\n /**\n * Retrieves the last state of the process. Used to recover state after\n * preemptions, reboots, etc.\n */\n protected async retrieveState(address: Address): Promise<number> {\n await Promise.resolve()\n const state = this.lastState.get(address)\n if (state === undefined) {\n // If this is a boot we can go back a bit in time\n // and begin processing recent commands\n const newState = Date.now() - 1000\n this.lastState.set(address, newState)\n return newState\n } else {\n return state\n }\n }\n}\n","export const Pending = 'pending' as const\nexport type Pending = typeof Pending\n","import { containsAll } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'\nimport { isQueryBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { asModuleInstance, ModuleConfigSchema, ModuleInstance } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Schema, WithMeta } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusBase } from './AsyncQueryBusBase'\nimport { AsyncQueryBusHostParams } from './model'\n\nexport interface ExposeOptions {\n allowedQueries?: Schema[]\n failOnAlreadyExposed?: boolean\n}\n\nexport class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQueryBusHostParams> extends AsyncQueryBusBase<TParams> {\n protected _exposedAddresses = new Set<Address>()\n private _exposeOptions: Record<Address, ExposeOptions> = {}\n private _pollId?: string\n\n constructor(params: TParams) {\n super(params)\n }\n\n get exposedAddresses() {\n return this._exposedAddresses\n }\n\n get perAddressBatchQueryLimit(): number {\n return this.config?.perAddressBatchQueryLimit ?? 10\n }\n\n get started() {\n return !!this._pollId\n }\n\n expose(address: Address, options: ExposeOptions = {}) {\n const { failOnAlreadyExposed } = options\n assertEx(!failOnAlreadyExposed || !this._exposedAddresses.has(address), () => `Address already exposed [${address}]`)\n this._exposedAddresses.add(address)\n this._exposeOptions[address] = { ...options }\n this.logger?.debug(`${address} exposed`)\n }\n\n async listeningModules(): Promise<ModuleInstance[]> {\n const exposedModules = [...(this.config?.listeningModules ?? []), ...this.exposedAddresses.values()]\n const mods = await Promise.all(\n exposedModules.map(async (listeningModule) =>\n assertEx(asModuleInstance(await this.resolver.resolve(listeningModule)), () => `Unable to resolve listeningModule [${listeningModule}]`),\n ),\n )\n return mods\n }\n\n start() {\n if (this.started) {\n console.warn('AsyncQueryBus starting when already started')\n }\n this.poll()\n }\n\n stop() {\n if (!this.started) {\n console.warn('AsyncQueryBus stopping when already stopped')\n }\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n }\n\n unexpose(address: Address, validate = true) {\n assertEx(!validate || this._exposedAddresses.has(address), () => `Address not exposed [${address}]`)\n this._exposedAddresses.delete(address)\n delete this._exposeOptions[address]\n this.logger?.debug(`${address} unexposed`)\n }\n\n protected callLocalModule = async (localModule: ModuleInstance, query: WithMeta<QueryBoundWitness>) => {\n const localModuleName = localModule.config.name ?? localModule.address\n const queryArchivist = await this.queriesArchivist()\n const responseArchivist = await this.responsesArchivist()\n const queryDestination = (query.$meta as { destination?: string[] })?.destination\n if (queryDestination && queryDestination?.includes(localModule.address)) {\n // Find the query\n const queryIndex = query.payload_hashes.indexOf(query.query)\n if (queryIndex !== -1) {\n const querySchema = query.payload_schemas[queryIndex]\n // If the destination can process this type of query\n if (localModule.queries.includes(querySchema)) {\n // Get the associated payloads\n const queryPayloads = await queryArchivist.get(query.payload_hashes)\n const queryPayloadsDict = await PayloadBuilder.toAllHashMap(queryPayloads)\n const queryHash = (await PayloadBuilder.build(query)).$hash\n // Check that we have all the arguments for the command\n if (!containsAll(Object.keys(queryPayloadsDict), query.payload_hashes)) {\n this.logger?.error(`Error processing command ${queryHash} for module ${localModuleName}, missing payloads`)\n return\n }\n try {\n // Issue the query against module\n const querySchema = queryPayloadsDict[query.query].schema\n this.logger?.debug(`Issuing query ${querySchema} (${queryHash}) addressed to module: ${localModuleName}`)\n const response = await localModule.query(query, queryPayloads, {\n allowedQueries: this._exposeOptions[localModule.address]?.allowedQueries,\n schema: ModuleConfigSchema,\n })\n const [bw, payloads, errors] = response\n this.logger?.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`)\n const insertResult = await responseArchivist.insert([bw, ...payloads, ...errors])\n // NOTE: If all archivists support the contract that numPayloads inserted === numPayloads returned we can\n // do some deeper assertions here like lenIn === lenOut, but for now this should be good enough since BWs\n // should always be unique causing at least one insertion\n if (insertResult.length === 0) {\n this.logger?.error(`Error replying to query ${queryHash} addressed to module: ${localModuleName}`)\n }\n if (query?.timestamp) {\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to ensure we are using the timestamp of the store\n // so there's no chance of multiple commands at the same time\n await this.commitState(localModule.address, query.timestamp)\n }\n } catch (error) {\n this.logger?.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n console.error(`Error processing query ${queryHash} for module ${localModuleName}: ${error}`)\n }\n }\n }\n }\n }\n\n /**\n * Finds unprocessed commands addressed to the supplied address\n * @param address The address to find commands for\n */\n protected findQueriesToAddress = async (address: Address) => {\n const queryBoundWitnessDiviner = await this.queriesDiviner()\n // Retrieve last offset from state store\n const timestamp = await this.retrieveState(address)\n const destination = [address]\n const limit = this.perAddressBatchQueryLimit\n // Filter for commands to us by destination address\n const divinerQuery = { destination, limit, schema: BoundWitnessDivinerQuerySchema, sort: 'asc', timestamp }\n const result = await queryBoundWitnessDiviner.divine([divinerQuery])\n const queries = result.filter(isQueryBoundWitnessWithMeta)\n const nextState = queries.length > 0 ? Math.max(...queries.map((c) => c.timestamp ?? 0)) + 1 : timestamp\n // TODO: This needs to be thought through as we can't use a distributed timestamp\n // because of collisions. We need to use the timestamp of the store so there's no\n // chance of multiple commands at the same time\n await this.commitState(address, nextState)\n return queries\n }\n\n /**\n * Runs the background divine process on a loop with a delay\n * specified by the `config.pollFrequency`\n */\n private poll() {\n this._pollId = setTimeoutEx(async () => {\n try {\n await this.processIncomingQueries()\n } catch (e) {\n this.logger?.error?.(`Error in main loop: ${e}`)\n } finally {\n if (this._pollId) clearTimeoutEx(this._pollId)\n this._pollId = undefined\n this.poll()\n }\n }, this.pollFrequencyConfig)\n }\n\n /**\n * Background process for checking for inbound queries\n */\n private processIncomingQueries = async () => {\n this.logger?.debug('Checking for inbound queries')\n // Check for any queries that have been issued and have not been responded to\n const localModules = await this.listeningModules()\n\n // TODO: Do in throttled batches\n await Promise.allSettled(\n localModules.map(async (localModule) => {\n try {\n const localModuleName = localModule.config.name ?? localModule.address\n this.logger?.debug(`Checking for inbound queries to ${localModuleName}`)\n const queries = await this.findQueriesToAddress(localModule.address)\n if (queries.length === 0) return\n this.logger?.debug(`Found queries addressed to local module: ${localModuleName}`)\n for (const query of queries) {\n await this.callLocalModule(localModule, query)\n }\n } catch (error) {\n this.logger?.error(`Error processing queries for address ${localModule.address}: ${error}`)\n }\n }),\n )\n }\n}\n","import { AbstractModuleHost, ModuleHostParams } from '../../AbstractModuleHost'\nimport { AsyncQueryBusHost } from '../AsyncQueryBusHost'\nimport { AsyncQueryBusHostConfig } from '../model'\n\nexport type AsyncQueryBusModuleHostParams = ModuleHostParams & {\n config: AsyncQueryBusHostConfig\n}\n\nexport class AsyncQueryBusModuleHost extends AbstractModuleHost<AsyncQueryBusModuleHostParams> {\n private _busHost?: AsyncQueryBusHost\n\n constructor(params: AsyncQueryBusModuleHostParams) {\n super(params)\n }\n\n override async start(): Promise<void> {\n const listeningModules =\n this.params.config.listeningModules ?? (await this.params.module.resolve('*', { direction: 'down' })).map((m) => m.address)\n this._busHost = new AsyncQueryBusHost({\n config: { ...this.params.config, listeningModules },\n logger: this.params.logger,\n resolver: this.params.module,\n })\n this._busHost?.start()\n }\n override stop() {\n this._busHost?.stop()\n }\n}\n","import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { Module, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nimport { AsyncQueryBusClient } from '../AsyncQueryBusClient'\n\nexport type AsyncQueryBusModuleProxyParams = ModuleProxyParams & {\n busClient: AsyncQueryBusClient\n}\n\nexport class AsyncQueryBusModuleProxy<TWrappedModule extends Module = Module>\n extends AbstractModuleProxy<AsyncQueryBusModuleProxyParams, TWrappedModule>\n implements ModuleInstance<TWrappedModule['params'], TWrappedModule['eventData']>\n{\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {\n return await this.proxyParams.busClient.send(this.address, query, payloads)\n }\n}\n","export const PubSubBridgeSchema = 'network.xyo.bridge.pubsub'\nexport type PubSubBridgeSchema = typeof PubSubBridgeSchema\n","import { 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 } & TConfig,\n TSchema extends string ? TSchema : PubSubBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\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 } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AsyncQueryBusClient, AsyncQueryBusHost } from './AsyncQueryBus'\nimport { PubSubBridgeConfigSchema } from './Config'\nimport { PubSubBridgeParams } from './Params'\nimport { PubSubBridgeModuleResolver } from './PubSubBridgeModuleResolver'\n\nconst moduleName = 'PubSubBridge'\n\n@creatableModule()\nexport class PubSubBridge<TParams extends PubSubBridgeParams = PubSubBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams> {\n static override configSchemas = [PubSubBridgeConfigSchema]\n\n protected _configRootAddress: Address = ''\n protected _configStateStoreArchivist: string = ''\n protected _configStateStoreBoundWitnessDiviner: string = ''\n protected _exposedAddresses: Address[] = []\n protected _lastState?: LRUCache<string, number>\n\n private _busClient?: AsyncQueryBusClient\n private _busHost?: AsyncQueryBusHost\n private _resolver?: PubSubBridgeModuleResolver\n\n override get resolver() {\n this._resolver =\n this._resolver ??\n new PubSubBridgeModuleResolver({\n bridge: this,\n busClient: assertEx(this.busClient(), () => 'busClient not configured'),\n downResolver: this.downResolver,\n upResolver: this.upResolver,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n protected get moduleName() {\n return `${this.config.name ?? moduleName}`\n }\n\n async exposeHandler(id: ModuleIdentifier, options?: BridgeExposeOptions | undefined): Promise<Address[]> {\n const filterOptions: ModuleFilterOptions = { direction: options?.direction }\n const module = await super.resolve(id, filterOptions)\n if (module) {\n const host = assertEx(this.busHost(), () => 'Not configured as a host')\n host.expose(module.address)\n return [module.address]\n }\n return []\n }\n\n async unexposeHandler(id: ModuleIdentifier, options?: BridgeUnexposeOptions | undefined): Promise<Address[]> {\n const filterOptions: ModuleFilterOptions = { direction: options?.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 return [module.address]\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 startHandler(): Promise<boolean> {\n this.busHost()?.start()\n return Promise.resolve(true)\n }\n\n protected override stopHandler(_timeout?: number | undefined) {\n this.busHost()?.stop()\n return true\n }\n}\n","import { Address } from '@xylabs/hex'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverOptions } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\n\nimport { AsyncQueryBusClient, AsyncQueryBusModuleProxy, AsyncQueryBusModuleProxyParams } from './AsyncQueryBus'\n\nexport interface PubSubBridgeModuleResolverOptions extends BridgeModuleResolverOptions {\n busClient: AsyncQueryBusClient\n}\n\nexport class PubSubBridgeModuleResolver<\n T extends PubSubBridgeModuleResolverOptions = PubSubBridgeModuleResolverOptions,\n> extends AbstractBridgeModuleResolver<T> {\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined> {\n const idParts = id.split(':')\n const firstPart = idParts.shift()\n const remainderParts = idParts.join(':')\n const account = Account.randomSync()\n const params: AsyncQueryBusModuleProxyParams = {\n account,\n busClient: this.options.busClient,\n host: this.options.bridge,\n moduleAddress: firstPart as Address,\n }\n const proxy = new AsyncQueryBusModuleProxy<T>(params) as unknown as T\n return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : proxy\n }\n}\n"],"mappings":"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","names":["Base","AbstractModuleHost","Base","delay","forget","clearTimeoutEx","setTimeoutEx","isBoundWitnessWithMeta","BoundWitnessDivinerQuerySchema","PayloadBuilder","LRUCache","assertEx","Base","asArchivistInstance","asDivinerInstance","LRUCache","AsyncQueryBusBase","Base","_lastState","_targetConfigs","_targetQueries","constructor","params","config","pollFrequencyConfig","pollFrequency","resolver","lastState","requiredConfig","max","ttl","LRUCache","queriesArchivist","assertEx","asArchivistInstance","resolve","intersect","queries","archivist","_a","_b","_c","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","proxyParams","busClient","send","address","PubSubBridgeSchema","PubSubBridgeConfigSchema","PubSubBridgeSchema","assertEx","AbstractBridge","creatableModule","AbstractBridgeModuleResolver","Account","PubSubBridgeModuleResolver","AbstractBridgeModuleResolver","resolveHandler","id","options","idParts","split","firstPart","shift","remainderParts","join","account","Account","randomSync","params","busClient","host","bridge","moduleAddress","proxy","AsyncQueryBusModuleProxy","length","resolve","moduleName","PubSubBridge","AbstractBridge","_configRootAddress","_configStateStoreArchivist","_configStateStoreBoundWitnessDiviner","_exposedAddresses","_lastState","_busClient","_busHost","_resolver","resolver","PubSubBridgeModuleResolver","bridge","busClient","assertEx","downResolver","upResolver","wrapperAccount","account","config","name","exposeHandler","id","options","filterOptions","direction","module","resolve","host","busHost","expose","address","unexposeHandler","unexpose","client","AsyncQueryBusClient","logger","AsyncQueryBusHost","startHandler","start","Promise","stopHandler","_timeout","stop","configSchemas","PubSubBridgeConfigSchema","creatableModule"]}
|
package/package.json
CHANGED
|
@@ -10,35 +10,34 @@
|
|
|
10
10
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@xylabs/array": "^3.0.
|
|
14
|
-
"@xylabs/assert": "^3.0.
|
|
15
|
-
"@xylabs/delay": "^3.0.
|
|
16
|
-
"@xylabs/forget": "^3.0.
|
|
17
|
-
"@xylabs/hex": "^3.0.
|
|
18
|
-
"@xylabs/object": "^3.0.
|
|
19
|
-
"@xylabs/promise": "^3.0.
|
|
20
|
-
"@xylabs/timer": "^3.0.
|
|
21
|
-
"@xyo-network/abstract-bridge": "~2.92.
|
|
22
|
-
"@xyo-network/account": "~2.92.
|
|
23
|
-
"@xyo-network/archivist-model": "~2.92.
|
|
24
|
-
"@xyo-network/boundwitness-model": "~2.92.
|
|
25
|
-
"@xyo-network/bridge-model": "~2.92.
|
|
26
|
-
"@xyo-network/diviner-boundwitness-model": "~2.92.
|
|
27
|
-
"@xyo-network/diviner-model": "~2.92.
|
|
28
|
-
"@xyo-network/module-model": "~2.92.
|
|
29
|
-
"@xyo-network/payload-builder": "~2.92.
|
|
30
|
-
"@xyo-network/payload-model": "~2.92.
|
|
13
|
+
"@xylabs/array": "^3.0.15",
|
|
14
|
+
"@xylabs/assert": "^3.0.15",
|
|
15
|
+
"@xylabs/delay": "^3.0.15",
|
|
16
|
+
"@xylabs/forget": "^3.0.15",
|
|
17
|
+
"@xylabs/hex": "^3.0.15",
|
|
18
|
+
"@xylabs/object": "^3.0.15",
|
|
19
|
+
"@xylabs/promise": "^3.0.15",
|
|
20
|
+
"@xylabs/timer": "^3.0.15",
|
|
21
|
+
"@xyo-network/abstract-bridge": "~2.92.8",
|
|
22
|
+
"@xyo-network/account": "~2.92.8",
|
|
23
|
+
"@xyo-network/archivist-model": "~2.92.8",
|
|
24
|
+
"@xyo-network/boundwitness-model": "~2.92.8",
|
|
25
|
+
"@xyo-network/bridge-model": "~2.92.8",
|
|
26
|
+
"@xyo-network/diviner-boundwitness-model": "~2.92.8",
|
|
27
|
+
"@xyo-network/diviner-model": "~2.92.8",
|
|
28
|
+
"@xyo-network/module-model": "~2.92.8",
|
|
29
|
+
"@xyo-network/payload-builder": "~2.92.8",
|
|
30
|
+
"@xyo-network/payload-model": "~2.92.8",
|
|
31
31
|
"lru-cache": "^10.2.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@xylabs/ts-scripts-yarn3": "^3.5.2",
|
|
35
35
|
"@xylabs/tsconfig": "^3.5.2",
|
|
36
|
-
"@xyo-network/archivist-memory": "~2.92.
|
|
37
|
-
"@xyo-network/archivist-wrapper": "~2.92.
|
|
38
|
-
"@xyo-network/diviner-boundwitness-memory": "~2.92.
|
|
39
|
-
"@xyo-network/
|
|
40
|
-
"@xyo-network/node-
|
|
41
|
-
"@xyo-network/node-model": "~2.92.6",
|
|
36
|
+
"@xyo-network/archivist-memory": "~2.92.8",
|
|
37
|
+
"@xyo-network/archivist-wrapper": "~2.92.8",
|
|
38
|
+
"@xyo-network/diviner-boundwitness-memory": "~2.92.8",
|
|
39
|
+
"@xyo-network/node-memory": "~2.92.8",
|
|
40
|
+
"@xyo-network/node-model": "~2.92.8",
|
|
42
41
|
"typescript": "^5.4.2"
|
|
43
42
|
},
|
|
44
43
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
@@ -80,6 +79,6 @@
|
|
|
80
79
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
81
80
|
},
|
|
82
81
|
"sideEffects": false,
|
|
83
|
-
"version": "2.92.
|
|
82
|
+
"version": "2.92.8",
|
|
84
83
|
"type": "module"
|
|
85
84
|
}
|
|
@@ -3,9 +3,8 @@ import { forget } from '@xylabs/forget'
|
|
|
3
3
|
import { Address } from '@xylabs/hex'
|
|
4
4
|
import { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'
|
|
5
5
|
import { isBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'
|
|
6
|
-
import { CacheConfig } from '@xyo-network/bridge-model'
|
|
7
6
|
import { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'
|
|
8
|
-
import { ModuleQueryResult } from '@xyo-network/module-model'
|
|
7
|
+
import { CacheConfig, ModuleQueryResult } from '@xyo-network/module-model'
|
|
9
8
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
10
9
|
import { ModuleError, Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'
|
|
11
10
|
import { LRUCache } from 'lru-cache'
|
|
@@ -69,7 +68,7 @@ export class AsyncQueryBusClient<TParams extends AsyncQueryBusClientParams = Asy
|
|
|
69
68
|
this.logger?.debug(`Issued query: ${routedQueryHash} to: ${address}`)
|
|
70
69
|
this.queryCache.set(routedQueryHash, Pending)
|
|
71
70
|
if (!insertResult) throw new Error('Unable to issue query to queryArchivist')
|
|
72
|
-
const context = new Promise<ModuleQueryResult>((resolve) => {
|
|
71
|
+
const context = new Promise<ModuleQueryResult>((resolve, reject) => {
|
|
73
72
|
this.logger?.debug(`Polling for response to query: ${routedQueryHash}`)
|
|
74
73
|
const pollForResponse = async () => {
|
|
75
74
|
try {
|
|
@@ -98,7 +97,7 @@ export class AsyncQueryBusClient<TParams extends AsyncQueryBusClientParams = Asy
|
|
|
98
97
|
schema: 'network.xyo.error.module',
|
|
99
98
|
sources: [routedQueryHash],
|
|
100
99
|
}
|
|
101
|
-
|
|
100
|
+
reject(error)
|
|
102
101
|
return
|
|
103
102
|
} finally {
|
|
104
103
|
this.stop()
|
|
@@ -4,15 +4,21 @@ import { Address } from '@xylabs/hex'
|
|
|
4
4
|
import { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer'
|
|
5
5
|
import { isQueryBoundWitnessWithMeta, QueryBoundWitness } from '@xyo-network/boundwitness-model'
|
|
6
6
|
import { BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'
|
|
7
|
-
import { asModuleInstance, ModuleInstance } from '@xyo-network/module-model'
|
|
7
|
+
import { asModuleInstance, ModuleConfigSchema, ModuleInstance } from '@xyo-network/module-model'
|
|
8
8
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
9
|
-
import { WithMeta } from '@xyo-network/payload-model'
|
|
9
|
+
import { Schema, WithMeta } from '@xyo-network/payload-model'
|
|
10
10
|
|
|
11
11
|
import { AsyncQueryBusBase } from './AsyncQueryBusBase'
|
|
12
12
|
import { AsyncQueryBusHostParams } from './model'
|
|
13
13
|
|
|
14
|
+
export interface ExposeOptions {
|
|
15
|
+
allowedQueries?: Schema[]
|
|
16
|
+
failOnAlreadyExposed?: boolean
|
|
17
|
+
}
|
|
18
|
+
|
|
14
19
|
export class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQueryBusHostParams> extends AsyncQueryBusBase<TParams> {
|
|
15
20
|
protected _exposedAddresses = new Set<Address>()
|
|
21
|
+
private _exposeOptions: Record<Address, ExposeOptions> = {}
|
|
16
22
|
private _pollId?: string
|
|
17
23
|
|
|
18
24
|
constructor(params: TParams) {
|
|
@@ -31,9 +37,11 @@ export class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQu
|
|
|
31
37
|
return !!this._pollId
|
|
32
38
|
}
|
|
33
39
|
|
|
34
|
-
expose(address: Address,
|
|
35
|
-
|
|
40
|
+
expose(address: Address, options: ExposeOptions = {}) {
|
|
41
|
+
const { failOnAlreadyExposed } = options
|
|
42
|
+
assertEx(!failOnAlreadyExposed || !this._exposedAddresses.has(address), () => `Address already exposed [${address}]`)
|
|
36
43
|
this._exposedAddresses.add(address)
|
|
44
|
+
this._exposeOptions[address] = { ...options }
|
|
37
45
|
this.logger?.debug(`${address} exposed`)
|
|
38
46
|
}
|
|
39
47
|
|
|
@@ -65,6 +73,7 @@ export class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQu
|
|
|
65
73
|
unexpose(address: Address, validate = true) {
|
|
66
74
|
assertEx(!validate || this._exposedAddresses.has(address), () => `Address not exposed [${address}]`)
|
|
67
75
|
this._exposedAddresses.delete(address)
|
|
76
|
+
delete this._exposeOptions[address]
|
|
68
77
|
this.logger?.debug(`${address} unexposed`)
|
|
69
78
|
}
|
|
70
79
|
|
|
@@ -93,7 +102,10 @@ export class AsyncQueryBusHost<TParams extends AsyncQueryBusHostParams = AsyncQu
|
|
|
93
102
|
// Issue the query against module
|
|
94
103
|
const querySchema = queryPayloadsDict[query.query].schema
|
|
95
104
|
this.logger?.debug(`Issuing query ${querySchema} (${queryHash}) addressed to module: ${localModuleName}`)
|
|
96
|
-
const response = await localModule.query(query, queryPayloads
|
|
105
|
+
const response = await localModule.query(query, queryPayloads, {
|
|
106
|
+
allowedQueries: this._exposeOptions[localModule.address]?.allowedQueries,
|
|
107
|
+
schema: ModuleConfigSchema,
|
|
108
|
+
})
|
|
97
109
|
const [bw, payloads, errors] = response
|
|
98
110
|
this.logger?.debug(`Replying to query ${queryHash} addressed to module: ${localModuleName}`)
|
|
99
111
|
const insertResult = await responseArchivist.insert([bw, ...payloads, ...errors])
|
|
@@ -15,7 +15,7 @@ export class AsyncQueryBusModuleHost extends AbstractModuleHost<AsyncQueryBusMod
|
|
|
15
15
|
|
|
16
16
|
override async start(): Promise<void> {
|
|
17
17
|
const listeningModules =
|
|
18
|
-
this.params.config.listeningModules ?? (await this.params.module.resolve(
|
|
18
|
+
this.params.config.listeningModules ?? (await this.params.module.resolve('*', { direction: 'down' })).map((m) => m.address)
|
|
19
19
|
this._busHost = new AsyncQueryBusHost({
|
|
20
20
|
config: { ...this.params.config, listeningModules },
|
|
21
21
|
logger: this.params.logger,
|
|
@@ -13,7 +13,7 @@ export class AsyncQueryBusModuleProxy<TWrappedModule extends Module = Module>
|
|
|
13
13
|
extends AbstractModuleProxy<AsyncQueryBusModuleProxyParams, TWrappedModule>
|
|
14
14
|
implements ModuleInstance<TWrappedModule['params'], TWrappedModule['eventData']>
|
|
15
15
|
{
|
|
16
|
-
async
|
|
16
|
+
async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {
|
|
17
17
|
return await this.proxyParams.busClient.send(this.address, query, payloads)
|
|
18
18
|
}
|
|
19
19
|
}
|