@xyo-network/bridge-module-resolver 2.75.0 → 2.75.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,30 @@
1
+ import { AccountInstance } from '@xyo-network/account-model';
2
+ import { BridgeModule } from '@xyo-network/bridge-model';
3
+ import { CompositeModuleResolver } from '@xyo-network/module';
4
+ import { Module, ModuleFilter, ModuleFilterOptions, ModuleInstance, ModuleResolver } from '@xyo-network/module-model';
5
+ export declare class BridgeModuleResolver extends CompositeModuleResolver implements ModuleResolver {
6
+ protected readonly bridge: BridgeModule;
7
+ protected wrapperAccount: AccountInstance;
8
+ private primed;
9
+ private remoteAddresses?;
10
+ private resolvedModules;
11
+ constructor(bridge: BridgeModule, wrapperAccount: AccountInstance);
12
+ get isModuleResolver(): boolean;
13
+ add(module: Module): this;
14
+ add(module: Module[]): this;
15
+ currentResolvedModules<T extends ModuleInstance = ModuleInstance>(): Promise<Record<string, T>>;
16
+ getRemoteAddresses(): Promise<string[]>;
17
+ prime(): Promise<boolean>;
18
+ remove(_address: string | string[]): this;
19
+ reset(): void;
20
+ resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>;
21
+ resolve<T extends ModuleInstance = ModuleInstance>(nameOrAddress: string, options?: ModuleFilterOptions<T>): Promise<T | undefined>;
22
+ private resolveByAddress;
23
+ private resolveByName;
24
+ private resolveByQuery;
25
+ private resolveRemoteModules;
26
+ private resolveRemoteModulesByAddress;
27
+ private resolveRemoteModulesByName;
28
+ private resolveRemoteModulesByQuery;
29
+ }
30
+ //# sourceMappingURL=ModuleResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModuleResolver.d.ts","sourceRoot":"","sources":["../../src/ModuleResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAI5D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAIxD,OAAO,EAAE,uBAAuB,EAAiB,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAEL,MAAM,EACN,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,cAAc,EAGf,MAAM,2BAA2B,CAAA;AASlC,qBAAa,oBAAqB,SAAQ,uBAAwB,YAAW,cAAc;IAQvF,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY;IACvC,SAAS,CAAC,cAAc,EAAE,eAAe;IAR3C,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,eAAe,CAAC,CAAmB;IAC3C,OAAO,CAAC,eAAe,CAA8C;gBAKhD,MAAM,EAAE,YAAY,EAC7B,cAAc,EAAE,eAAe;IAK3C,IAAa,gBAAgB,IAAI,OAAO,CAEvC;IAEQ,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IACzB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAK9B,sBAAsB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAW/F,kBAAkB;IAmBxB,KAAK;IAUI,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAIlD,KAAK;IAMU,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5H,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;YAgCpI,gBAAgB;YAoDhB,aAAa;YAOb,cAAc;YAUd,oBAAoB;YAiBpB,6BAA6B;YAI7B,0BAA0B;YAI1B,2BAA2B;CAG1C"}
@@ -16,26 +16,135 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/ModuleResolver.ts
19
21
  var ModuleResolver_exports = {};
20
22
  __export(ModuleResolver_exports, {
21
23
  BridgeModuleResolver: () => BridgeModuleResolver
22
24
  });
23
25
  module.exports = __toCommonJS(ModuleResolver_exports);
24
- var import_lodash = require("@xylabs/lodash");
25
- var import_address_payload_plugin = require("@xyo-network/address-payload-plugin");
26
+ var import_lodash2 = require("@xylabs/lodash");
27
+ var import_address_payload_plugin2 = require("@xyo-network/address-payload-plugin");
26
28
  var import_archivist_model = require("@xyo-network/archivist-model");
27
29
  var import_archivist_wrapper = require("@xyo-network/archivist-wrapper");
28
30
  var import_diviner = require("@xyo-network/diviner");
29
31
  var import_diviner_model = require("@xyo-network/diviner-model");
30
32
  var import_error = require("@xyo-network/error");
31
- var import_module = require("@xyo-network/module");
33
+ var import_module2 = require("@xyo-network/module");
32
34
  var import_node_model = require("@xyo-network/node-model");
33
35
  var import_node_wrapper = require("@xyo-network/node-wrapper");
34
36
  var import_sentinel = require("@xyo-network/sentinel");
35
37
  var import_witness_model = require("@xyo-network/witness-model");
36
38
  var import_witness_wrapper = require("@xyo-network/witness-wrapper");
37
- var import_ProxyModule = require("./ProxyModule");
38
- class BridgeModuleResolver extends import_module.CompositeModuleResolver {
39
+
40
+ // src/ProxyModule.ts
41
+ var import_assert = require("@xylabs/assert");
42
+ var import_lodash = require("@xylabs/lodash");
43
+ var import_address_payload_plugin = require("@xyo-network/address-payload-plugin");
44
+ var import_manifest_model = require("@xyo-network/manifest-model");
45
+ var import_module = require("@xyo-network/module");
46
+ var ProxyModuleConfigSchema = "network.xyo.module.proxy.config";
47
+ var ProxyModule = class extends import_module.BaseEmitter {
48
+ constructor(proxyParams) {
49
+ super({ config: proxyParams.bridge.targetConfig(proxyParams.address) });
50
+ this.proxyParams = proxyParams;
51
+ }
52
+ upResolver = new import_module.CompositeModuleResolver();
53
+ _busyCount = 0;
54
+ get address() {
55
+ return this.proxyParams.address.toLowerCase();
56
+ }
57
+ get bridge() {
58
+ return this.proxyParams.bridge;
59
+ }
60
+ get config() {
61
+ const config = this.bridge.targetConfig(this.address);
62
+ return config;
63
+ }
64
+ get downResolver() {
65
+ return (0, import_assert.assertEx)(this.bridge.targetDownResolver(this.address), "Unable to get resolver");
66
+ }
67
+ get queries() {
68
+ return this.bridge.targetQueries(this.address);
69
+ }
70
+ addressPreviousHash() {
71
+ throw Error("Not Implemented");
72
+ }
73
+ async busy(closure) {
74
+ if (this._busyCount <= 0) {
75
+ this._busyCount = 0;
76
+ const args = { busy: true, module: this };
77
+ await this.emit("moduleBusy", args);
78
+ }
79
+ this._busyCount++;
80
+ try {
81
+ return await closure();
82
+ } finally {
83
+ this._busyCount--;
84
+ if (this._busyCount <= 0) {
85
+ this._busyCount = 0;
86
+ const args = { busy: false, module: this };
87
+ await this.emit("moduleBusy", args);
88
+ }
89
+ }
90
+ }
91
+ async describe() {
92
+ return await this.busy(async () => {
93
+ const description = {
94
+ address: this.address,
95
+ queries: this.queries
96
+ };
97
+ if (this.config.name) {
98
+ description.name = this.config.name;
99
+ }
100
+ const discover = await this.discover();
101
+ description.children = (0, import_lodash.compact)(
102
+ (discover == null ? void 0 : discover.map((payload) => {
103
+ const address = payload.schema === import_address_payload_plugin.AddressSchema ? payload.address : void 0;
104
+ return address != this.address ? address : void 0;
105
+ })) ?? []
106
+ );
107
+ return description;
108
+ });
109
+ }
110
+ async discover() {
111
+ return await this.busy(async () => {
112
+ return await this.bridge.targetDiscover();
113
+ });
114
+ }
115
+ manifest() {
116
+ const name = this.config.name ?? "Anonymous";
117
+ return { config: { name, ...this.config }, schema: import_manifest_model.ManifestPayloadSchema };
118
+ }
119
+ moduleAddress() {
120
+ throw Error("Not Implemented");
121
+ }
122
+ previousHash() {
123
+ throw Error("Not Implemented");
124
+ }
125
+ async query(query, payloads) {
126
+ return await this.busy(async () => {
127
+ const result = (0, import_assert.assertEx)(await this.bridge.targetQuery(this.address, query, payloads), "Remote Query Failed");
128
+ await this.emit("moduleQueried", { module: this, payloads, query, result });
129
+ return result;
130
+ });
131
+ }
132
+ async queryable(query, payloads, queryConfig) {
133
+ return await this.bridge.targetQueryable(this.address, query, payloads, queryConfig);
134
+ }
135
+ async resolve(nameOrAddressOrFilter, options) {
136
+ return await this.busy(async () => {
137
+ if (typeof nameOrAddressOrFilter === "string") {
138
+ return await this.bridge.targetResolve(this.address, nameOrAddressOrFilter, options);
139
+ } else {
140
+ return await this.bridge.targetResolve(this.address, nameOrAddressOrFilter, options);
141
+ }
142
+ });
143
+ }
144
+ };
145
+
146
+ // src/ModuleResolver.ts
147
+ var BridgeModuleResolver = class _BridgeModuleResolver extends import_module2.CompositeModuleResolver {
39
148
  // TODO: Allow optional ctor param for supplying address for nested Nodes
40
149
  // protected readonly address?: string,
41
150
  constructor(bridge, wrapperAccount) {
@@ -64,9 +173,9 @@ class BridgeModuleResolver extends import_module.CompositeModuleResolver {
64
173
  async getRemoteAddresses() {
65
174
  this.remoteAddresses = this.remoteAddresses ?? (async () => {
66
175
  const discover = await this.bridge.targetDiscover();
67
- return (0, import_lodash.compact)(
68
- discover?.map((payload) => {
69
- if (payload.schema === import_address_payload_plugin.AddressSchema) {
176
+ return (0, import_lodash2.compact)(
177
+ discover == null ? void 0 : discover.map((payload) => {
178
+ if (payload.schema === import_address_payload_plugin2.AddressSchema) {
70
179
  const schemaPayload = payload;
71
180
  return schemaPayload.address;
72
181
  } else {
@@ -94,7 +203,7 @@ class BridgeModuleResolver extends import_module.CompositeModuleResolver {
94
203
  }
95
204
  async resolve(nameOrAddressOrFilter, options) {
96
205
  const unfiltered = await (async () => {
97
- const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? BridgeModuleResolver.defaultMaxDepth) - 1 };
206
+ const mutatedOptions = { ...options, maxDepth: ((options == null ? void 0 : options.maxDepth) ?? _BridgeModuleResolver.defaultMaxDepth) - 1 };
98
207
  await this.prime();
99
208
  await this.resolveRemoteModules();
100
209
  if (typeof nameOrAddressOrFilter === "string") {
@@ -111,9 +220,9 @@ class BridgeModuleResolver extends import_module.CompositeModuleResolver {
111
220
  return result;
112
221
  }
113
222
  })();
114
- const identity = options?.identity;
223
+ const identity = options == null ? void 0 : options.identity;
115
224
  if (identity) {
116
- return Array.isArray(unfiltered) ? unfiltered?.filter((module2) => identity(module2)) : identity(unfiltered) ? unfiltered : void 0;
225
+ return Array.isArray(unfiltered) ? unfiltered == null ? void 0 : unfiltered.filter((module2) => identity(module2)) : identity(unfiltered) ? unfiltered : void 0;
117
226
  } else {
118
227
  return unfiltered;
119
228
  }
@@ -128,7 +237,7 @@ class BridgeModuleResolver extends import_module.CompositeModuleResolver {
128
237
  return await cached;
129
238
  this.resolvedModules[targetAddress] = this.resolvedModules[targetAddress] ?? (async (address) => {
130
239
  await this.bridge.targetDiscover(address);
131
- const mod = new import_ProxyModule.ProxyModule({ address, bridge: this.bridge, config: { schema: import_ProxyModule.ProxyModuleConfigSchema } });
240
+ const mod = new ProxyModule({ address, bridge: this.bridge, config: { schema: ProxyModuleConfigSchema } });
132
241
  try {
133
242
  if ((0, import_archivist_model.isArchivistModule)(mod)) {
134
243
  return import_archivist_wrapper.ArchivistWrapper.wrap(mod, this.wrapperAccount);
@@ -146,7 +255,7 @@ class BridgeModuleResolver extends import_module.CompositeModuleResolver {
146
255
  return import_sentinel.SentinelWrapper.wrap(mod, this.wrapperAccount);
147
256
  }
148
257
  console.warn(`BridgeModuleResolver: Unknown Module Type: [${targetAddress}]`);
149
- return import_module.ModuleWrapper.wrap(mod, this.wrapperAccount);
258
+ return import_module2.ModuleWrapper.wrap(mod, this.wrapperAccount);
150
259
  } catch (ex) {
151
260
  (0, import_error.handleError)(ex, (error) => {
152
261
  console.error(`BridgeModuleResolver.resolveByAddress: ${error.message} [${targetAddress}]`);
@@ -166,27 +275,27 @@ class BridgeModuleResolver extends import_module.CompositeModuleResolver {
166
275
  });
167
276
  }
168
277
  async resolveRemoteModules(filter) {
169
- if (filter?.address) {
278
+ if (filter == null ? void 0 : filter.address) {
170
279
  return await this.resolveRemoteModulesByAddress(filter);
171
280
  }
172
- if (filter?.name) {
281
+ if (filter == null ? void 0 : filter.name) {
173
282
  return await this.resolveRemoteModulesByName(filter);
174
283
  }
175
- if (filter?.query) {
284
+ if (filter == null ? void 0 : filter.query) {
176
285
  return await this.resolveRemoteModulesByQuery(filter);
177
286
  }
178
287
  return await this.resolveRemoteModulesByAddress({ address: await this.getRemoteAddresses() });
179
288
  }
180
289
  async resolveRemoteModulesByAddress(filter) {
181
- return (0, import_lodash.compact)(await Promise.all(filter.address.map((address) => this.resolveByAddress(address))));
290
+ return (0, import_lodash2.compact)(await Promise.all(filter.address.map((address) => this.resolveByAddress(address))));
182
291
  }
183
292
  async resolveRemoteModulesByName(filter) {
184
- return (0, import_lodash.compact)(await Promise.all(filter.name.map(async (name) => await this.resolveByName(name))));
293
+ return (0, import_lodash2.compact)(await Promise.all(filter.name.map(async (name) => await this.resolveByName(name))));
185
294
  }
186
295
  async resolveRemoteModulesByQuery(filter) {
187
- return (0, import_lodash.compact)((await Promise.all(filter.query.map(async (query) => await this.resolveByQuery(query)))).flat());
296
+ return (0, import_lodash2.compact)((await Promise.all(filter.query.map(async (query) => await this.resolveByQuery(query)))).flat());
188
297
  }
189
- }
298
+ };
190
299
  // Annotate the CommonJS export names for ESM import in node:
191
300
  0 && (module.exports = {
192
301
  BridgeModuleResolver
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ModuleResolver.ts"],"sourcesContent":["import { compact } from '@xylabs/lodash'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport { isArchivistModule } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BridgeModule } from '@xyo-network/bridge-model'\nimport { DivinerWrapper } from '@xyo-network/diviner'\nimport { isDivinerModule } from '@xyo-network/diviner-model'\nimport { handleError } from '@xyo-network/error'\nimport { CompositeModuleResolver, ModuleWrapper } from '@xyo-network/module'\nimport {\n AddressModuleFilter,\n Module,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleInstance,\n ModuleResolver,\n NameModuleFilter,\n QueryModuleFilter,\n} from '@xyo-network/module-model'\nimport { isNodeModule } from '@xyo-network/node-model'\nimport { NodeWrapper } from '@xyo-network/node-wrapper'\nimport { isSentinelModule, SentinelWrapper } from '@xyo-network/sentinel'\nimport { isWitnessModule } from '@xyo-network/witness-model'\nimport { WitnessWrapper } from '@xyo-network/witness-wrapper'\n\nimport { ProxyModule, ProxyModuleConfigSchema, ProxyModuleParams } from './ProxyModule'\n\nexport class BridgeModuleResolver extends CompositeModuleResolver implements ModuleResolver {\n private primed: Promise<boolean> | undefined = undefined\n private remoteAddresses?: Promise<string[]>\n private resolvedModules: Record<string, Promise<ModuleInstance>> = {}\n\n // TODO: Allow optional ctor param for supplying address for nested Nodes\n // protected readonly address?: string,\n constructor(\n protected readonly bridge: BridgeModule,\n protected wrapperAccount: AccountInstance,\n ) {\n super()\n }\n\n override get isModuleResolver(): boolean {\n return true\n }\n\n override add(module: Module): this\n override add(module: Module[]): this\n override add(_module: Module | Module[]): this {\n throw new Error('Method not implemented.')\n }\n\n async currentResolvedModules<T extends ModuleInstance = ModuleInstance>(): Promise<Record<string, T>> {\n const result: Record<string, T> = {}\n await Promise.all(\n Object.entries(this.resolvedModules).map(async ([key, value]) => {\n result[key] = (await value) as T\n }),\n )\n\n return result\n }\n\n async getRemoteAddresses() {\n this.remoteAddresses =\n this.remoteAddresses ??\n (async () => {\n const discover = await this.bridge.targetDiscover()\n return compact(\n discover?.map((payload) => {\n if (payload.schema === AddressSchema) {\n const schemaPayload = payload as AddressPayload\n return schemaPayload.address\n } else {\n return null\n }\n }),\n )\n })()\n return await this.remoteAddresses\n }\n\n prime() {\n this.primed =\n this.primed ??\n (async () => {\n await this.resolveRemoteModules()\n return true\n })()\n return this.primed\n }\n\n override remove(_address: string | string[]): this {\n throw new Error('Method not implemented.')\n }\n\n reset() {\n this.primed = undefined\n this.remoteAddresses = undefined\n this.resolvedModules = {}\n }\n\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(nameOrAddress: string, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n nameOrAddressOrFilter?: ModuleFilter<T> | string,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const unfiltered = await (async () => {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? BridgeModuleResolver.defaultMaxDepth) - 1 }\n await this.prime()\n await this.resolveRemoteModules()\n if (typeof nameOrAddressOrFilter === 'string') {\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const result: T | undefined = (await this.resolveByAddress<T>(nameOrAddressOrFilter)) ?? (await this.resolveByName<T>(nameOrAddressOrFilter))\n return result\n } else {\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result: T[] = await this.resolveRemoteModules<T>(nameOrAddressOrFilter)\n return result\n }\n })()\n\n const identity = options?.identity\n if (identity) {\n return Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module)) : identity(unfiltered) ? unfiltered : undefined\n } else {\n return unfiltered\n }\n }\n\n private async resolveByAddress<T extends ModuleInstance = ModuleInstance>(targetAddress: string): Promise<T | undefined> {\n const remoteAddresses = await this.getRemoteAddresses()\n\n //check if it is even there\n if (!remoteAddresses.find((address) => address === targetAddress)) {\n //this.logger?.log(`Not in RA: ${targetAddress}`)\n return undefined\n }\n\n const cached = this.resolvedModules[targetAddress]\n if (cached) return (await cached) as T\n\n this.resolvedModules[targetAddress] =\n this.resolvedModules[targetAddress] ??\n (async (address: string) => {\n //discover it to set the config in the bridge\n await this.bridge.targetDiscover(address)\n\n const mod: Module = new ProxyModule({ address, bridge: this.bridge, config: { schema: ProxyModuleConfigSchema } } as ProxyModuleParams)\n\n try {\n if (isArchivistModule(mod)) {\n return ArchivistWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isDivinerModule(mod)) {\n return DivinerWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isWitnessModule(mod)) {\n return WitnessWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isNodeModule(mod)) {\n return NodeWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isSentinelModule(mod)) {\n return SentinelWrapper.wrap(mod, this.wrapperAccount)\n }\n console.warn(`BridgeModuleResolver: Unknown Module Type: [${targetAddress}]`)\n return ModuleWrapper.wrap(mod, this.wrapperAccount)\n } catch (ex) {\n handleError(ex, (error) => {\n console.error(`BridgeModuleResolver.resolveByAddress: ${error.message} [${targetAddress}]`)\n })\n }\n })(targetAddress)\n\n return (await this.resolvedModules[targetAddress]) as T\n }\n\n private async resolveByName<T extends ModuleInstance = ModuleInstance>(name: string): Promise<T | undefined> {\n const modules = await this.currentResolvedModules()\n return Object.values(modules)\n .filter((module) => module.config.name === name)\n .pop() as T\n }\n\n private async resolveByQuery<T extends ModuleInstance = ModuleInstance>(queries: string[]): Promise<T[]> {\n return Object.values(await this.currentResolvedModules()).filter((module) => {\n //filter out the requested queries\n const found = module.queries.filter((query) => queries.find((q) => q === query))\n\n //did we find all the requested queries?\n return queries.length === found.length\n }) as T[]\n }\n\n private async resolveRemoteModules<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter): Promise<T[]> {\n if ((filter as AddressModuleFilter)?.address) {\n return await this.resolveRemoteModulesByAddress<T>(filter as AddressModuleFilter)\n }\n\n if ((filter as NameModuleFilter)?.name) {\n return await this.resolveRemoteModulesByName<T>(filter as NameModuleFilter)\n }\n\n if ((filter as QueryModuleFilter)?.query) {\n return await this.resolveRemoteModulesByQuery<T>(filter as QueryModuleFilter)\n }\n\n //get all of them\n return await this.resolveRemoteModulesByAddress<T>({ address: await this.getRemoteAddresses() })\n }\n\n private async resolveRemoteModulesByAddress<T extends ModuleInstance = ModuleInstance>(filter: AddressModuleFilter): Promise<T[]> {\n return compact(await Promise.all(filter.address.map((address) => this.resolveByAddress<T>(address))))\n }\n\n private async resolveRemoteModulesByName<T extends ModuleInstance = ModuleInstance>(filter: NameModuleFilter): Promise<T[]> {\n return compact(await Promise.all(filter.name.map(async (name) => await this.resolveByName<T>(name))))\n }\n\n private async resolveRemoteModulesByQuery<T extends ModuleInstance = ModuleInstance>(filter: QueryModuleFilter): Promise<T[]> {\n return compact((await Promise.all(filter.query.map(async (query) => await this.resolveByQuery<T>(query)))).flat())\n }\n}\n"],"mappings":"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","names":["module"]}
1
+ {"version":3,"sources":["../../src/ModuleResolver.ts","../../src/ProxyModule.ts"],"sourcesContent":["import { compact } from '@xylabs/lodash'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport { isArchivistModule } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BridgeModule } from '@xyo-network/bridge-model'\nimport { DivinerWrapper } from '@xyo-network/diviner'\nimport { isDivinerModule } from '@xyo-network/diviner-model'\nimport { handleError } from '@xyo-network/error'\nimport { CompositeModuleResolver, ModuleWrapper } from '@xyo-network/module'\nimport {\n AddressModuleFilter,\n Module,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleInstance,\n ModuleResolver,\n NameModuleFilter,\n QueryModuleFilter,\n} from '@xyo-network/module-model'\nimport { isNodeModule } from '@xyo-network/node-model'\nimport { NodeWrapper } from '@xyo-network/node-wrapper'\nimport { isSentinelModule, SentinelWrapper } from '@xyo-network/sentinel'\nimport { isWitnessModule } from '@xyo-network/witness-model'\nimport { WitnessWrapper } from '@xyo-network/witness-wrapper'\n\nimport { ProxyModule, ProxyModuleConfigSchema, ProxyModuleParams } from './ProxyModule'\n\nexport class BridgeModuleResolver extends CompositeModuleResolver implements ModuleResolver {\n private primed: Promise<boolean> | undefined = undefined\n private remoteAddresses?: Promise<string[]>\n private resolvedModules: Record<string, Promise<ModuleInstance>> = {}\n\n // TODO: Allow optional ctor param for supplying address for nested Nodes\n // protected readonly address?: string,\n constructor(\n protected readonly bridge: BridgeModule,\n protected wrapperAccount: AccountInstance,\n ) {\n super()\n }\n\n override get isModuleResolver(): boolean {\n return true\n }\n\n override add(module: Module): this\n override add(module: Module[]): this\n override add(_module: Module | Module[]): this {\n throw new Error('Method not implemented.')\n }\n\n async currentResolvedModules<T extends ModuleInstance = ModuleInstance>(): Promise<Record<string, T>> {\n const result: Record<string, T> = {}\n await Promise.all(\n Object.entries(this.resolvedModules).map(async ([key, value]) => {\n result[key] = (await value) as T\n }),\n )\n\n return result\n }\n\n async getRemoteAddresses() {\n this.remoteAddresses =\n this.remoteAddresses ??\n (async () => {\n const discover = await this.bridge.targetDiscover()\n return compact(\n discover?.map((payload) => {\n if (payload.schema === AddressSchema) {\n const schemaPayload = payload as AddressPayload\n return schemaPayload.address\n } else {\n return null\n }\n }),\n )\n })()\n return await this.remoteAddresses\n }\n\n prime() {\n this.primed =\n this.primed ??\n (async () => {\n await this.resolveRemoteModules()\n return true\n })()\n return this.primed\n }\n\n override remove(_address: string | string[]): this {\n throw new Error('Method not implemented.')\n }\n\n reset() {\n this.primed = undefined\n this.remoteAddresses = undefined\n this.resolvedModules = {}\n }\n\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(nameOrAddress: string, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n nameOrAddressOrFilter?: ModuleFilter<T> | string,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const unfiltered = await (async () => {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? BridgeModuleResolver.defaultMaxDepth) - 1 }\n await this.prime()\n await this.resolveRemoteModules()\n if (typeof nameOrAddressOrFilter === 'string') {\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const result: T | undefined = (await this.resolveByAddress<T>(nameOrAddressOrFilter)) ?? (await this.resolveByName<T>(nameOrAddressOrFilter))\n return result\n } else {\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result: T[] = await this.resolveRemoteModules<T>(nameOrAddressOrFilter)\n return result\n }\n })()\n\n const identity = options?.identity\n if (identity) {\n return Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module)) : identity(unfiltered) ? unfiltered : undefined\n } else {\n return unfiltered\n }\n }\n\n private async resolveByAddress<T extends ModuleInstance = ModuleInstance>(targetAddress: string): Promise<T | undefined> {\n const remoteAddresses = await this.getRemoteAddresses()\n\n //check if it is even there\n if (!remoteAddresses.find((address) => address === targetAddress)) {\n //this.logger?.log(`Not in RA: ${targetAddress}`)\n return undefined\n }\n\n const cached = this.resolvedModules[targetAddress]\n if (cached) return (await cached) as T\n\n this.resolvedModules[targetAddress] =\n this.resolvedModules[targetAddress] ??\n (async (address: string) => {\n //discover it to set the config in the bridge\n await this.bridge.targetDiscover(address)\n\n const mod: Module = new ProxyModule({ address, bridge: this.bridge, config: { schema: ProxyModuleConfigSchema } } as ProxyModuleParams)\n\n try {\n if (isArchivistModule(mod)) {\n return ArchivistWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isDivinerModule(mod)) {\n return DivinerWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isWitnessModule(mod)) {\n return WitnessWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isNodeModule(mod)) {\n return NodeWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isSentinelModule(mod)) {\n return SentinelWrapper.wrap(mod, this.wrapperAccount)\n }\n console.warn(`BridgeModuleResolver: Unknown Module Type: [${targetAddress}]`)\n return ModuleWrapper.wrap(mod, this.wrapperAccount)\n } catch (ex) {\n handleError(ex, (error) => {\n console.error(`BridgeModuleResolver.resolveByAddress: ${error.message} [${targetAddress}]`)\n })\n }\n })(targetAddress)\n\n return (await this.resolvedModules[targetAddress]) as T\n }\n\n private async resolveByName<T extends ModuleInstance = ModuleInstance>(name: string): Promise<T | undefined> {\n const modules = await this.currentResolvedModules()\n return Object.values(modules)\n .filter((module) => module.config.name === name)\n .pop() as T\n }\n\n private async resolveByQuery<T extends ModuleInstance = ModuleInstance>(queries: string[]): Promise<T[]> {\n return Object.values(await this.currentResolvedModules()).filter((module) => {\n //filter out the requested queries\n const found = module.queries.filter((query) => queries.find((q) => q === query))\n\n //did we find all the requested queries?\n return queries.length === found.length\n }) as T[]\n }\n\n private async resolveRemoteModules<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter): Promise<T[]> {\n if ((filter as AddressModuleFilter)?.address) {\n return await this.resolveRemoteModulesByAddress<T>(filter as AddressModuleFilter)\n }\n\n if ((filter as NameModuleFilter)?.name) {\n return await this.resolveRemoteModulesByName<T>(filter as NameModuleFilter)\n }\n\n if ((filter as QueryModuleFilter)?.query) {\n return await this.resolveRemoteModulesByQuery<T>(filter as QueryModuleFilter)\n }\n\n //get all of them\n return await this.resolveRemoteModulesByAddress<T>({ address: await this.getRemoteAddresses() })\n }\n\n private async resolveRemoteModulesByAddress<T extends ModuleInstance = ModuleInstance>(filter: AddressModuleFilter): Promise<T[]> {\n return compact(await Promise.all(filter.address.map((address) => this.resolveByAddress<T>(address))))\n }\n\n private async resolveRemoteModulesByName<T extends ModuleInstance = ModuleInstance>(filter: NameModuleFilter): Promise<T[]> {\n return compact(await Promise.all(filter.name.map(async (name) => await this.resolveByName<T>(name))))\n }\n\n private async resolveRemoteModulesByQuery<T extends ModuleInstance = ModuleInstance>(filter: QueryModuleFilter): Promise<T[]> {\n return compact((await Promise.all(filter.query.map(async (query) => await this.resolveByQuery<T>(query)))).flat())\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-builder'\nimport { BridgeModule } from '@xyo-network/bridge-model'\nimport { ManifestPayloadSchema, ModuleManifestPayload } from '@xyo-network/manifest-model'\nimport {\n AddressPreviousHashPayload,\n BaseEmitter,\n CompositeModuleResolver,\n ModuleBusyEventArgs,\n ModuleConfig,\n ModuleDescription,\n ModuleEventData,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleInstance,\n ModuleParams,\n ModuleQueryResult,\n} from '@xyo-network/module'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Promisable } from '@xyo-network/promise'\n\nexport type ProxyModuleConfigSchema = 'network.xyo.module.proxy.config'\nexport const ProxyModuleConfigSchema: ProxyModuleConfigSchema = 'network.xyo.module.proxy.config'\n\nexport type TProxyModuleConfig = ModuleConfig<{ schema: ProxyModuleConfigSchema }>\n\nexport type ProxyModuleParams = ModuleParams<\n TProxyModuleConfig,\n {\n address: string\n bridge: BridgeModule\n }\n>\n\nexport class ProxyModule extends BaseEmitter<ModuleParams, ModuleEventData> implements ModuleInstance<ModuleParams, ModuleEventData> {\n readonly upResolver = new CompositeModuleResolver()\n\n private _busyCount = 0\n\n constructor(public proxyParams: ProxyModuleParams) {\n super({ config: proxyParams.bridge.targetConfig(proxyParams.address) })\n }\n\n get address() {\n return this.proxyParams.address.toLowerCase()\n }\n\n get bridge() {\n return this.proxyParams.bridge\n }\n\n get config(): ModuleConfig {\n const config = this.bridge.targetConfig(this.address)\n return config\n }\n\n get downResolver() {\n return assertEx(this.bridge.targetDownResolver(this.address), 'Unable to get resolver')\n }\n\n get queries() {\n return this.bridge.targetQueries(this.address)\n }\n\n addressPreviousHash(): Promise<AddressPreviousHashPayload> {\n throw Error('Not Implemented')\n }\n\n async busy<R>(closure: () => Promise<R>) {\n if (this._busyCount <= 0) {\n this._busyCount = 0\n const args: ModuleBusyEventArgs = { busy: true, module: this }\n await this.emit('moduleBusy', args)\n }\n this._busyCount++\n try {\n return await closure()\n } finally {\n this._busyCount--\n if (this._busyCount <= 0) {\n this._busyCount = 0\n const args: ModuleBusyEventArgs = { busy: false, module: this }\n await this.emit('moduleBusy', args)\n }\n }\n }\n\n async describe(): Promise<ModuleDescription> {\n return await this.busy(async () => {\n const description: ModuleDescription = {\n address: this.address,\n queries: this.queries,\n }\n if (this.config.name) {\n description.name = this.config.name\n }\n\n const discover = await this.discover()\n\n description.children = compact(\n discover?.map((payload) => {\n const address = payload.schema === AddressSchema ? (payload as AddressPayload).address : undefined\n return address != this.address ? address : undefined\n }) ?? [],\n )\n\n return description\n })\n }\n\n async discover(): Promise<Payload[]> {\n return await this.busy(async () => {\n return await this.bridge.targetDiscover()\n })\n }\n\n manifest(): Promisable<ModuleManifestPayload> {\n const name = this.config.name ?? 'Anonymous'\n return { config: { name, ...this.config }, schema: ManifestPayloadSchema }\n }\n\n moduleAddress(): Promise<AddressPreviousHashPayload[]> {\n throw Error('Not Implemented')\n }\n\n previousHash(): Promise<string | undefined> {\n throw Error('Not Implemented')\n }\n\n async query<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {\n return await this.busy(async () => {\n const result = assertEx(await this.bridge.targetQuery(this.address, query, payloads), 'Remote Query Failed')\n await this.emit('moduleQueried', { module: this, payloads, query, result })\n return result\n })\n }\n\n async queryable(query: QueryBoundWitness, payloads?: Payload[], queryConfig?: ModuleConfig): Promise<boolean> {\n return await this.bridge.targetQueryable(this.address, query, payloads, queryConfig)\n }\n\n /* Resolves a filter from the perspective of the module, including through the parent/gateway module */\n resolve(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<ModuleInstance[]>\n resolve(nameOrAddress: string, options?: ModuleFilterOptions): Promise<ModuleInstance | undefined>\n async resolve(\n nameOrAddressOrFilter?: ModuleFilter | string,\n options?: ModuleFilterOptions,\n ): Promise<ModuleInstance | ModuleInstance[] | undefined> {\n return await this.busy(async () => {\n if (typeof nameOrAddressOrFilter === 'string') {\n return await this.bridge.targetResolve(this.address, nameOrAddressOrFilter, options)\n } else {\n return await this.bridge.targetResolve(this.address, nameOrAddressOrFilter, options)\n }\n })\n }\n}\n"],"mappings":"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","names":["import_lodash","import_address_payload_plugin","import_module","module"]}
@@ -1,18 +1,129 @@
1
- import { compact } from "@xylabs/lodash";
2
- import { AddressSchema } from "@xyo-network/address-payload-plugin";
1
+ // src/ModuleResolver.ts
2
+ import { compact as compact2 } from "@xylabs/lodash";
3
+ import { AddressSchema as AddressSchema2 } from "@xyo-network/address-payload-plugin";
3
4
  import { isArchivistModule } from "@xyo-network/archivist-model";
4
5
  import { ArchivistWrapper } from "@xyo-network/archivist-wrapper";
5
6
  import { DivinerWrapper } from "@xyo-network/diviner";
6
7
  import { isDivinerModule } from "@xyo-network/diviner-model";
7
8
  import { handleError } from "@xyo-network/error";
8
- import { CompositeModuleResolver, ModuleWrapper } from "@xyo-network/module";
9
+ import { CompositeModuleResolver as CompositeModuleResolver2, ModuleWrapper } from "@xyo-network/module";
9
10
  import { isNodeModule } from "@xyo-network/node-model";
10
11
  import { NodeWrapper } from "@xyo-network/node-wrapper";
11
12
  import { isSentinelModule, SentinelWrapper } from "@xyo-network/sentinel";
12
13
  import { isWitnessModule } from "@xyo-network/witness-model";
13
14
  import { WitnessWrapper } from "@xyo-network/witness-wrapper";
14
- import { ProxyModule, ProxyModuleConfigSchema } from "./ProxyModule";
15
- class BridgeModuleResolver extends CompositeModuleResolver {
15
+
16
+ // src/ProxyModule.ts
17
+ import { assertEx } from "@xylabs/assert";
18
+ import { compact } from "@xylabs/lodash";
19
+ import { AddressSchema } from "@xyo-network/address-payload-plugin";
20
+ import { ManifestPayloadSchema } from "@xyo-network/manifest-model";
21
+ import {
22
+ BaseEmitter,
23
+ CompositeModuleResolver
24
+ } from "@xyo-network/module";
25
+ var ProxyModuleConfigSchema = "network.xyo.module.proxy.config";
26
+ var ProxyModule = class extends BaseEmitter {
27
+ constructor(proxyParams) {
28
+ super({ config: proxyParams.bridge.targetConfig(proxyParams.address) });
29
+ this.proxyParams = proxyParams;
30
+ }
31
+ upResolver = new CompositeModuleResolver();
32
+ _busyCount = 0;
33
+ get address() {
34
+ return this.proxyParams.address.toLowerCase();
35
+ }
36
+ get bridge() {
37
+ return this.proxyParams.bridge;
38
+ }
39
+ get config() {
40
+ const config = this.bridge.targetConfig(this.address);
41
+ return config;
42
+ }
43
+ get downResolver() {
44
+ return assertEx(this.bridge.targetDownResolver(this.address), "Unable to get resolver");
45
+ }
46
+ get queries() {
47
+ return this.bridge.targetQueries(this.address);
48
+ }
49
+ addressPreviousHash() {
50
+ throw Error("Not Implemented");
51
+ }
52
+ async busy(closure) {
53
+ if (this._busyCount <= 0) {
54
+ this._busyCount = 0;
55
+ const args = { busy: true, module: this };
56
+ await this.emit("moduleBusy", args);
57
+ }
58
+ this._busyCount++;
59
+ try {
60
+ return await closure();
61
+ } finally {
62
+ this._busyCount--;
63
+ if (this._busyCount <= 0) {
64
+ this._busyCount = 0;
65
+ const args = { busy: false, module: this };
66
+ await this.emit("moduleBusy", args);
67
+ }
68
+ }
69
+ }
70
+ async describe() {
71
+ return await this.busy(async () => {
72
+ const description = {
73
+ address: this.address,
74
+ queries: this.queries
75
+ };
76
+ if (this.config.name) {
77
+ description.name = this.config.name;
78
+ }
79
+ const discover = await this.discover();
80
+ description.children = compact(
81
+ (discover == null ? void 0 : discover.map((payload) => {
82
+ const address = payload.schema === AddressSchema ? payload.address : void 0;
83
+ return address != this.address ? address : void 0;
84
+ })) ?? []
85
+ );
86
+ return description;
87
+ });
88
+ }
89
+ async discover() {
90
+ return await this.busy(async () => {
91
+ return await this.bridge.targetDiscover();
92
+ });
93
+ }
94
+ manifest() {
95
+ const name = this.config.name ?? "Anonymous";
96
+ return { config: { name, ...this.config }, schema: ManifestPayloadSchema };
97
+ }
98
+ moduleAddress() {
99
+ throw Error("Not Implemented");
100
+ }
101
+ previousHash() {
102
+ throw Error("Not Implemented");
103
+ }
104
+ async query(query, payloads) {
105
+ return await this.busy(async () => {
106
+ const result = assertEx(await this.bridge.targetQuery(this.address, query, payloads), "Remote Query Failed");
107
+ await this.emit("moduleQueried", { module: this, payloads, query, result });
108
+ return result;
109
+ });
110
+ }
111
+ async queryable(query, payloads, queryConfig) {
112
+ return await this.bridge.targetQueryable(this.address, query, payloads, queryConfig);
113
+ }
114
+ async resolve(nameOrAddressOrFilter, options) {
115
+ return await this.busy(async () => {
116
+ if (typeof nameOrAddressOrFilter === "string") {
117
+ return await this.bridge.targetResolve(this.address, nameOrAddressOrFilter, options);
118
+ } else {
119
+ return await this.bridge.targetResolve(this.address, nameOrAddressOrFilter, options);
120
+ }
121
+ });
122
+ }
123
+ };
124
+
125
+ // src/ModuleResolver.ts
126
+ var BridgeModuleResolver = class _BridgeModuleResolver extends CompositeModuleResolver2 {
16
127
  // TODO: Allow optional ctor param for supplying address for nested Nodes
17
128
  // protected readonly address?: string,
18
129
  constructor(bridge, wrapperAccount) {
@@ -41,9 +152,9 @@ class BridgeModuleResolver extends CompositeModuleResolver {
41
152
  async getRemoteAddresses() {
42
153
  this.remoteAddresses = this.remoteAddresses ?? (async () => {
43
154
  const discover = await this.bridge.targetDiscover();
44
- return compact(
45
- discover?.map((payload) => {
46
- if (payload.schema === AddressSchema) {
155
+ return compact2(
156
+ discover == null ? void 0 : discover.map((payload) => {
157
+ if (payload.schema === AddressSchema2) {
47
158
  const schemaPayload = payload;
48
159
  return schemaPayload.address;
49
160
  } else {
@@ -71,7 +182,7 @@ class BridgeModuleResolver extends CompositeModuleResolver {
71
182
  }
72
183
  async resolve(nameOrAddressOrFilter, options) {
73
184
  const unfiltered = await (async () => {
74
- const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? BridgeModuleResolver.defaultMaxDepth) - 1 };
185
+ const mutatedOptions = { ...options, maxDepth: ((options == null ? void 0 : options.maxDepth) ?? _BridgeModuleResolver.defaultMaxDepth) - 1 };
75
186
  await this.prime();
76
187
  await this.resolveRemoteModules();
77
188
  if (typeof nameOrAddressOrFilter === "string") {
@@ -88,9 +199,9 @@ class BridgeModuleResolver extends CompositeModuleResolver {
88
199
  return result;
89
200
  }
90
201
  })();
91
- const identity = options?.identity;
202
+ const identity = options == null ? void 0 : options.identity;
92
203
  if (identity) {
93
- return Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module)) : identity(unfiltered) ? unfiltered : void 0;
204
+ return Array.isArray(unfiltered) ? unfiltered == null ? void 0 : unfiltered.filter((module) => identity(module)) : identity(unfiltered) ? unfiltered : void 0;
94
205
  } else {
95
206
  return unfiltered;
96
207
  }
@@ -143,27 +254,27 @@ class BridgeModuleResolver extends CompositeModuleResolver {
143
254
  });
144
255
  }
145
256
  async resolveRemoteModules(filter) {
146
- if (filter?.address) {
257
+ if (filter == null ? void 0 : filter.address) {
147
258
  return await this.resolveRemoteModulesByAddress(filter);
148
259
  }
149
- if (filter?.name) {
260
+ if (filter == null ? void 0 : filter.name) {
150
261
  return await this.resolveRemoteModulesByName(filter);
151
262
  }
152
- if (filter?.query) {
263
+ if (filter == null ? void 0 : filter.query) {
153
264
  return await this.resolveRemoteModulesByQuery(filter);
154
265
  }
155
266
  return await this.resolveRemoteModulesByAddress({ address: await this.getRemoteAddresses() });
156
267
  }
157
268
  async resolveRemoteModulesByAddress(filter) {
158
- return compact(await Promise.all(filter.address.map((address) => this.resolveByAddress(address))));
269
+ return compact2(await Promise.all(filter.address.map((address) => this.resolveByAddress(address))));
159
270
  }
160
271
  async resolveRemoteModulesByName(filter) {
161
- return compact(await Promise.all(filter.name.map(async (name) => await this.resolveByName(name))));
272
+ return compact2(await Promise.all(filter.name.map(async (name) => await this.resolveByName(name))));
162
273
  }
163
274
  async resolveRemoteModulesByQuery(filter) {
164
- return compact((await Promise.all(filter.query.map(async (query) => await this.resolveByQuery(query)))).flat());
275
+ return compact2((await Promise.all(filter.query.map(async (query) => await this.resolveByQuery(query)))).flat());
165
276
  }
166
- }
277
+ };
167
278
  export {
168
279
  BridgeModuleResolver
169
280
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ModuleResolver.ts"],"sourcesContent":["import { compact } from '@xylabs/lodash'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport { isArchivistModule } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BridgeModule } from '@xyo-network/bridge-model'\nimport { DivinerWrapper } from '@xyo-network/diviner'\nimport { isDivinerModule } from '@xyo-network/diviner-model'\nimport { handleError } from '@xyo-network/error'\nimport { CompositeModuleResolver, ModuleWrapper } from '@xyo-network/module'\nimport {\n AddressModuleFilter,\n Module,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleInstance,\n ModuleResolver,\n NameModuleFilter,\n QueryModuleFilter,\n} from '@xyo-network/module-model'\nimport { isNodeModule } from '@xyo-network/node-model'\nimport { NodeWrapper } from '@xyo-network/node-wrapper'\nimport { isSentinelModule, SentinelWrapper } from '@xyo-network/sentinel'\nimport { isWitnessModule } from '@xyo-network/witness-model'\nimport { WitnessWrapper } from '@xyo-network/witness-wrapper'\n\nimport { ProxyModule, ProxyModuleConfigSchema, ProxyModuleParams } from './ProxyModule'\n\nexport class BridgeModuleResolver extends CompositeModuleResolver implements ModuleResolver {\n private primed: Promise<boolean> | undefined = undefined\n private remoteAddresses?: Promise<string[]>\n private resolvedModules: Record<string, Promise<ModuleInstance>> = {}\n\n // TODO: Allow optional ctor param for supplying address for nested Nodes\n // protected readonly address?: string,\n constructor(\n protected readonly bridge: BridgeModule,\n protected wrapperAccount: AccountInstance,\n ) {\n super()\n }\n\n override get isModuleResolver(): boolean {\n return true\n }\n\n override add(module: Module): this\n override add(module: Module[]): this\n override add(_module: Module | Module[]): this {\n throw new Error('Method not implemented.')\n }\n\n async currentResolvedModules<T extends ModuleInstance = ModuleInstance>(): Promise<Record<string, T>> {\n const result: Record<string, T> = {}\n await Promise.all(\n Object.entries(this.resolvedModules).map(async ([key, value]) => {\n result[key] = (await value) as T\n }),\n )\n\n return result\n }\n\n async getRemoteAddresses() {\n this.remoteAddresses =\n this.remoteAddresses ??\n (async () => {\n const discover = await this.bridge.targetDiscover()\n return compact(\n discover?.map((payload) => {\n if (payload.schema === AddressSchema) {\n const schemaPayload = payload as AddressPayload\n return schemaPayload.address\n } else {\n return null\n }\n }),\n )\n })()\n return await this.remoteAddresses\n }\n\n prime() {\n this.primed =\n this.primed ??\n (async () => {\n await this.resolveRemoteModules()\n return true\n })()\n return this.primed\n }\n\n override remove(_address: string | string[]): this {\n throw new Error('Method not implemented.')\n }\n\n reset() {\n this.primed = undefined\n this.remoteAddresses = undefined\n this.resolvedModules = {}\n }\n\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(nameOrAddress: string, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n nameOrAddressOrFilter?: ModuleFilter<T> | string,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const unfiltered = await (async () => {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? BridgeModuleResolver.defaultMaxDepth) - 1 }\n await this.prime()\n await this.resolveRemoteModules()\n if (typeof nameOrAddressOrFilter === 'string') {\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const result: T | undefined = (await this.resolveByAddress<T>(nameOrAddressOrFilter)) ?? (await this.resolveByName<T>(nameOrAddressOrFilter))\n return result\n } else {\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result: T[] = await this.resolveRemoteModules<T>(nameOrAddressOrFilter)\n return result\n }\n })()\n\n const identity = options?.identity\n if (identity) {\n return Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module)) : identity(unfiltered) ? unfiltered : undefined\n } else {\n return unfiltered\n }\n }\n\n private async resolveByAddress<T extends ModuleInstance = ModuleInstance>(targetAddress: string): Promise<T | undefined> {\n const remoteAddresses = await this.getRemoteAddresses()\n\n //check if it is even there\n if (!remoteAddresses.find((address) => address === targetAddress)) {\n //this.logger?.log(`Not in RA: ${targetAddress}`)\n return undefined\n }\n\n const cached = this.resolvedModules[targetAddress]\n if (cached) return (await cached) as T\n\n this.resolvedModules[targetAddress] =\n this.resolvedModules[targetAddress] ??\n (async (address: string) => {\n //discover it to set the config in the bridge\n await this.bridge.targetDiscover(address)\n\n const mod: Module = new ProxyModule({ address, bridge: this.bridge, config: { schema: ProxyModuleConfigSchema } } as ProxyModuleParams)\n\n try {\n if (isArchivistModule(mod)) {\n return ArchivistWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isDivinerModule(mod)) {\n return DivinerWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isWitnessModule(mod)) {\n return WitnessWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isNodeModule(mod)) {\n return NodeWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isSentinelModule(mod)) {\n return SentinelWrapper.wrap(mod, this.wrapperAccount)\n }\n console.warn(`BridgeModuleResolver: Unknown Module Type: [${targetAddress}]`)\n return ModuleWrapper.wrap(mod, this.wrapperAccount)\n } catch (ex) {\n handleError(ex, (error) => {\n console.error(`BridgeModuleResolver.resolveByAddress: ${error.message} [${targetAddress}]`)\n })\n }\n })(targetAddress)\n\n return (await this.resolvedModules[targetAddress]) as T\n }\n\n private async resolveByName<T extends ModuleInstance = ModuleInstance>(name: string): Promise<T | undefined> {\n const modules = await this.currentResolvedModules()\n return Object.values(modules)\n .filter((module) => module.config.name === name)\n .pop() as T\n }\n\n private async resolveByQuery<T extends ModuleInstance = ModuleInstance>(queries: string[]): Promise<T[]> {\n return Object.values(await this.currentResolvedModules()).filter((module) => {\n //filter out the requested queries\n const found = module.queries.filter((query) => queries.find((q) => q === query))\n\n //did we find all the requested queries?\n return queries.length === found.length\n }) as T[]\n }\n\n private async resolveRemoteModules<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter): Promise<T[]> {\n if ((filter as AddressModuleFilter)?.address) {\n return await this.resolveRemoteModulesByAddress<T>(filter as AddressModuleFilter)\n }\n\n if ((filter as NameModuleFilter)?.name) {\n return await this.resolveRemoteModulesByName<T>(filter as NameModuleFilter)\n }\n\n if ((filter as QueryModuleFilter)?.query) {\n return await this.resolveRemoteModulesByQuery<T>(filter as QueryModuleFilter)\n }\n\n //get all of them\n return await this.resolveRemoteModulesByAddress<T>({ address: await this.getRemoteAddresses() })\n }\n\n private async resolveRemoteModulesByAddress<T extends ModuleInstance = ModuleInstance>(filter: AddressModuleFilter): Promise<T[]> {\n return compact(await Promise.all(filter.address.map((address) => this.resolveByAddress<T>(address))))\n }\n\n private async resolveRemoteModulesByName<T extends ModuleInstance = ModuleInstance>(filter: NameModuleFilter): Promise<T[]> {\n return compact(await Promise.all(filter.name.map(async (name) => await this.resolveByName<T>(name))))\n }\n\n private async resolveRemoteModulesByQuery<T extends ModuleInstance = ModuleInstance>(filter: QueryModuleFilter): Promise<T[]> {\n return compact((await Promise.all(filter.query.map(async (query) => await this.resolveByQuery<T>(query)))).flat())\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/ModuleResolver.ts","../../src/ProxyModule.ts"],"sourcesContent":["import { compact } from '@xylabs/lodash'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport { isArchivistModule } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BridgeModule } from '@xyo-network/bridge-model'\nimport { DivinerWrapper } from '@xyo-network/diviner'\nimport { isDivinerModule } from '@xyo-network/diviner-model'\nimport { handleError } from '@xyo-network/error'\nimport { CompositeModuleResolver, ModuleWrapper } from '@xyo-network/module'\nimport {\n AddressModuleFilter,\n Module,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleInstance,\n ModuleResolver,\n NameModuleFilter,\n QueryModuleFilter,\n} from '@xyo-network/module-model'\nimport { isNodeModule } from '@xyo-network/node-model'\nimport { NodeWrapper } from '@xyo-network/node-wrapper'\nimport { isSentinelModule, SentinelWrapper } from '@xyo-network/sentinel'\nimport { isWitnessModule } from '@xyo-network/witness-model'\nimport { WitnessWrapper } from '@xyo-network/witness-wrapper'\n\nimport { ProxyModule, ProxyModuleConfigSchema, ProxyModuleParams } from './ProxyModule'\n\nexport class BridgeModuleResolver extends CompositeModuleResolver implements ModuleResolver {\n private primed: Promise<boolean> | undefined = undefined\n private remoteAddresses?: Promise<string[]>\n private resolvedModules: Record<string, Promise<ModuleInstance>> = {}\n\n // TODO: Allow optional ctor param for supplying address for nested Nodes\n // protected readonly address?: string,\n constructor(\n protected readonly bridge: BridgeModule,\n protected wrapperAccount: AccountInstance,\n ) {\n super()\n }\n\n override get isModuleResolver(): boolean {\n return true\n }\n\n override add(module: Module): this\n override add(module: Module[]): this\n override add(_module: Module | Module[]): this {\n throw new Error('Method not implemented.')\n }\n\n async currentResolvedModules<T extends ModuleInstance = ModuleInstance>(): Promise<Record<string, T>> {\n const result: Record<string, T> = {}\n await Promise.all(\n Object.entries(this.resolvedModules).map(async ([key, value]) => {\n result[key] = (await value) as T\n }),\n )\n\n return result\n }\n\n async getRemoteAddresses() {\n this.remoteAddresses =\n this.remoteAddresses ??\n (async () => {\n const discover = await this.bridge.targetDiscover()\n return compact(\n discover?.map((payload) => {\n if (payload.schema === AddressSchema) {\n const schemaPayload = payload as AddressPayload\n return schemaPayload.address\n } else {\n return null\n }\n }),\n )\n })()\n return await this.remoteAddresses\n }\n\n prime() {\n this.primed =\n this.primed ??\n (async () => {\n await this.resolveRemoteModules()\n return true\n })()\n return this.primed\n }\n\n override remove(_address: string | string[]): this {\n throw new Error('Method not implemented.')\n }\n\n reset() {\n this.primed = undefined\n this.remoteAddresses = undefined\n this.resolvedModules = {}\n }\n\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(nameOrAddress: string, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n nameOrAddressOrFilter?: ModuleFilter<T> | string,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const unfiltered = await (async () => {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? BridgeModuleResolver.defaultMaxDepth) - 1 }\n await this.prime()\n await this.resolveRemoteModules()\n if (typeof nameOrAddressOrFilter === 'string') {\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const result: T | undefined = (await this.resolveByAddress<T>(nameOrAddressOrFilter)) ?? (await this.resolveByName<T>(nameOrAddressOrFilter))\n return result\n } else {\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result: T[] = await this.resolveRemoteModules<T>(nameOrAddressOrFilter)\n return result\n }\n })()\n\n const identity = options?.identity\n if (identity) {\n return Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module)) : identity(unfiltered) ? unfiltered : undefined\n } else {\n return unfiltered\n }\n }\n\n private async resolveByAddress<T extends ModuleInstance = ModuleInstance>(targetAddress: string): Promise<T | undefined> {\n const remoteAddresses = await this.getRemoteAddresses()\n\n //check if it is even there\n if (!remoteAddresses.find((address) => address === targetAddress)) {\n //this.logger?.log(`Not in RA: ${targetAddress}`)\n return undefined\n }\n\n const cached = this.resolvedModules[targetAddress]\n if (cached) return (await cached) as T\n\n this.resolvedModules[targetAddress] =\n this.resolvedModules[targetAddress] ??\n (async (address: string) => {\n //discover it to set the config in the bridge\n await this.bridge.targetDiscover(address)\n\n const mod: Module = new ProxyModule({ address, bridge: this.bridge, config: { schema: ProxyModuleConfigSchema } } as ProxyModuleParams)\n\n try {\n if (isArchivistModule(mod)) {\n return ArchivistWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isDivinerModule(mod)) {\n return DivinerWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isWitnessModule(mod)) {\n return WitnessWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isNodeModule(mod)) {\n return NodeWrapper.wrap(mod, this.wrapperAccount)\n }\n\n if (isSentinelModule(mod)) {\n return SentinelWrapper.wrap(mod, this.wrapperAccount)\n }\n console.warn(`BridgeModuleResolver: Unknown Module Type: [${targetAddress}]`)\n return ModuleWrapper.wrap(mod, this.wrapperAccount)\n } catch (ex) {\n handleError(ex, (error) => {\n console.error(`BridgeModuleResolver.resolveByAddress: ${error.message} [${targetAddress}]`)\n })\n }\n })(targetAddress)\n\n return (await this.resolvedModules[targetAddress]) as T\n }\n\n private async resolveByName<T extends ModuleInstance = ModuleInstance>(name: string): Promise<T | undefined> {\n const modules = await this.currentResolvedModules()\n return Object.values(modules)\n .filter((module) => module.config.name === name)\n .pop() as T\n }\n\n private async resolveByQuery<T extends ModuleInstance = ModuleInstance>(queries: string[]): Promise<T[]> {\n return Object.values(await this.currentResolvedModules()).filter((module) => {\n //filter out the requested queries\n const found = module.queries.filter((query) => queries.find((q) => q === query))\n\n //did we find all the requested queries?\n return queries.length === found.length\n }) as T[]\n }\n\n private async resolveRemoteModules<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter): Promise<T[]> {\n if ((filter as AddressModuleFilter)?.address) {\n return await this.resolveRemoteModulesByAddress<T>(filter as AddressModuleFilter)\n }\n\n if ((filter as NameModuleFilter)?.name) {\n return await this.resolveRemoteModulesByName<T>(filter as NameModuleFilter)\n }\n\n if ((filter as QueryModuleFilter)?.query) {\n return await this.resolveRemoteModulesByQuery<T>(filter as QueryModuleFilter)\n }\n\n //get all of them\n return await this.resolveRemoteModulesByAddress<T>({ address: await this.getRemoteAddresses() })\n }\n\n private async resolveRemoteModulesByAddress<T extends ModuleInstance = ModuleInstance>(filter: AddressModuleFilter): Promise<T[]> {\n return compact(await Promise.all(filter.address.map((address) => this.resolveByAddress<T>(address))))\n }\n\n private async resolveRemoteModulesByName<T extends ModuleInstance = ModuleInstance>(filter: NameModuleFilter): Promise<T[]> {\n return compact(await Promise.all(filter.name.map(async (name) => await this.resolveByName<T>(name))))\n }\n\n private async resolveRemoteModulesByQuery<T extends ModuleInstance = ModuleInstance>(filter: QueryModuleFilter): Promise<T[]> {\n return compact((await Promise.all(filter.query.map(async (query) => await this.resolveByQuery<T>(query)))).flat())\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-builder'\nimport { BridgeModule } from '@xyo-network/bridge-model'\nimport { ManifestPayloadSchema, ModuleManifestPayload } from '@xyo-network/manifest-model'\nimport {\n AddressPreviousHashPayload,\n BaseEmitter,\n CompositeModuleResolver,\n ModuleBusyEventArgs,\n ModuleConfig,\n ModuleDescription,\n ModuleEventData,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleInstance,\n ModuleParams,\n ModuleQueryResult,\n} from '@xyo-network/module'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Promisable } from '@xyo-network/promise'\n\nexport type ProxyModuleConfigSchema = 'network.xyo.module.proxy.config'\nexport const ProxyModuleConfigSchema: ProxyModuleConfigSchema = 'network.xyo.module.proxy.config'\n\nexport type TProxyModuleConfig = ModuleConfig<{ schema: ProxyModuleConfigSchema }>\n\nexport type ProxyModuleParams = ModuleParams<\n TProxyModuleConfig,\n {\n address: string\n bridge: BridgeModule\n }\n>\n\nexport class ProxyModule extends BaseEmitter<ModuleParams, ModuleEventData> implements ModuleInstance<ModuleParams, ModuleEventData> {\n readonly upResolver = new CompositeModuleResolver()\n\n private _busyCount = 0\n\n constructor(public proxyParams: ProxyModuleParams) {\n super({ config: proxyParams.bridge.targetConfig(proxyParams.address) })\n }\n\n get address() {\n return this.proxyParams.address.toLowerCase()\n }\n\n get bridge() {\n return this.proxyParams.bridge\n }\n\n get config(): ModuleConfig {\n const config = this.bridge.targetConfig(this.address)\n return config\n }\n\n get downResolver() {\n return assertEx(this.bridge.targetDownResolver(this.address), 'Unable to get resolver')\n }\n\n get queries() {\n return this.bridge.targetQueries(this.address)\n }\n\n addressPreviousHash(): Promise<AddressPreviousHashPayload> {\n throw Error('Not Implemented')\n }\n\n async busy<R>(closure: () => Promise<R>) {\n if (this._busyCount <= 0) {\n this._busyCount = 0\n const args: ModuleBusyEventArgs = { busy: true, module: this }\n await this.emit('moduleBusy', args)\n }\n this._busyCount++\n try {\n return await closure()\n } finally {\n this._busyCount--\n if (this._busyCount <= 0) {\n this._busyCount = 0\n const args: ModuleBusyEventArgs = { busy: false, module: this }\n await this.emit('moduleBusy', args)\n }\n }\n }\n\n async describe(): Promise<ModuleDescription> {\n return await this.busy(async () => {\n const description: ModuleDescription = {\n address: this.address,\n queries: this.queries,\n }\n if (this.config.name) {\n description.name = this.config.name\n }\n\n const discover = await this.discover()\n\n description.children = compact(\n discover?.map((payload) => {\n const address = payload.schema === AddressSchema ? (payload as AddressPayload).address : undefined\n return address != this.address ? address : undefined\n }) ?? [],\n )\n\n return description\n })\n }\n\n async discover(): Promise<Payload[]> {\n return await this.busy(async () => {\n return await this.bridge.targetDiscover()\n })\n }\n\n manifest(): Promisable<ModuleManifestPayload> {\n const name = this.config.name ?? 'Anonymous'\n return { config: { name, ...this.config }, schema: ManifestPayloadSchema }\n }\n\n moduleAddress(): Promise<AddressPreviousHashPayload[]> {\n throw Error('Not Implemented')\n }\n\n previousHash(): Promise<string | undefined> {\n throw Error('Not Implemented')\n }\n\n async query<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {\n return await this.busy(async () => {\n const result = assertEx(await this.bridge.targetQuery(this.address, query, payloads), 'Remote Query Failed')\n await this.emit('moduleQueried', { module: this, payloads, query, result })\n return result\n })\n }\n\n async queryable(query: QueryBoundWitness, payloads?: Payload[], queryConfig?: ModuleConfig): Promise<boolean> {\n return await this.bridge.targetQueryable(this.address, query, payloads, queryConfig)\n }\n\n /* Resolves a filter from the perspective of the module, including through the parent/gateway module */\n resolve(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<ModuleInstance[]>\n resolve(nameOrAddress: string, options?: ModuleFilterOptions): Promise<ModuleInstance | undefined>\n async resolve(\n nameOrAddressOrFilter?: ModuleFilter | string,\n options?: ModuleFilterOptions,\n ): Promise<ModuleInstance | ModuleInstance[] | undefined> {\n return await this.busy(async () => {\n if (typeof nameOrAddressOrFilter === 'string') {\n return await this.bridge.targetResolve(this.address, nameOrAddressOrFilter, options)\n } else {\n return await this.bridge.targetResolve(this.address, nameOrAddressOrFilter, options)\n }\n })\n }\n}\n"],"mappings":"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","names":["compact","AddressSchema","CompositeModuleResolver","CompositeModuleResolver","compact","AddressSchema"]}