@xyo-network/module-resolver 2.93.4 → 2.93.6
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/AbstractModuleResolver.d.cts +3 -1
- package/dist/browser/AbstractModuleResolver.d.cts.map +1 -1
- package/dist/browser/AbstractModuleResolver.d.mts +3 -1
- package/dist/browser/AbstractModuleResolver.d.mts.map +1 -1
- package/dist/browser/AbstractModuleResolver.d.ts +3 -1
- package/dist/browser/AbstractModuleResolver.d.ts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.cts +4 -3
- package/dist/browser/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.mts +4 -3
- package/dist/browser/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.ts +4 -3
- package/dist/browser/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/browser/ResolverEventEmitter.d.cts +2 -0
- package/dist/browser/ResolverEventEmitter.d.cts.map +1 -1
- package/dist/browser/ResolverEventEmitter.d.mts +2 -0
- package/dist/browser/ResolverEventEmitter.d.mts.map +1 -1
- package/dist/browser/ResolverEventEmitter.d.ts +2 -0
- package/dist/browser/ResolverEventEmitter.d.ts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.cts +3 -2
- package/dist/browser/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.mts +3 -2
- package/dist/browser/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.ts +3 -2
- package/dist/browser/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/browser/index.cjs +44 -8
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +44 -8
- package/dist/browser/index.js.map +1 -1
- package/dist/node/AbstractModuleResolver.d.cts +3 -1
- package/dist/node/AbstractModuleResolver.d.cts.map +1 -1
- package/dist/node/AbstractModuleResolver.d.mts +3 -1
- package/dist/node/AbstractModuleResolver.d.mts.map +1 -1
- package/dist/node/AbstractModuleResolver.d.ts +3 -1
- package/dist/node/AbstractModuleResolver.d.ts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.cts +4 -3
- package/dist/node/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.mts +4 -3
- package/dist/node/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.ts +4 -3
- package/dist/node/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/node/ResolverEventEmitter.d.cts +2 -0
- package/dist/node/ResolverEventEmitter.d.cts.map +1 -1
- package/dist/node/ResolverEventEmitter.d.mts +2 -0
- package/dist/node/ResolverEventEmitter.d.mts.map +1 -1
- package/dist/node/ResolverEventEmitter.d.ts +2 -0
- package/dist/node/ResolverEventEmitter.d.ts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.cts +3 -2
- package/dist/node/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.mts +3 -2
- package/dist/node/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.ts +3 -2
- package/dist/node/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/node/index.cjs +44 -8
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +44 -8
- package/dist/node/index.js.map +1 -1
- package/package.json +2 -2
- package/src/AbstractModuleResolver.ts +12 -1
- package/src/CompositeModuleResolver.ts +30 -4
- package/src/SimpleModuleResolver.ts +28 -7
- package/dist/browser/transformers/Xns.d.cts +0 -3
- package/dist/browser/transformers/Xns.d.cts.map +0 -1
- package/dist/browser/transformers/Xns.d.mts +0 -3
- package/dist/browser/transformers/Xns.d.mts.map +0 -1
- package/dist/browser/transformers/Xns.d.ts +0 -3
- package/dist/browser/transformers/Xns.d.ts.map +0 -1
- package/dist/browser/transformers/index.d.cts +0 -3
- package/dist/browser/transformers/index.d.cts.map +0 -1
- package/dist/browser/transformers/index.d.mts +0 -3
- package/dist/browser/transformers/index.d.mts.map +0 -1
- package/dist/browser/transformers/index.d.ts +0 -3
- package/dist/browser/transformers/index.d.ts.map +0 -1
- package/dist/browser/transformers/model.d.cts +0 -7
- package/dist/browser/transformers/model.d.cts.map +0 -1
- package/dist/browser/transformers/model.d.mts +0 -7
- package/dist/browser/transformers/model.d.mts.map +0 -1
- package/dist/browser/transformers/model.d.ts +0 -7
- package/dist/browser/transformers/model.d.ts.map +0 -1
- package/dist/node/transformers/Xns.d.cts +0 -3
- package/dist/node/transformers/Xns.d.cts.map +0 -1
- package/dist/node/transformers/Xns.d.mts +0 -3
- package/dist/node/transformers/Xns.d.mts.map +0 -1
- package/dist/node/transformers/Xns.d.ts +0 -3
- package/dist/node/transformers/Xns.d.ts.map +0 -1
- package/dist/node/transformers/index.d.cts +0 -3
- package/dist/node/transformers/index.d.cts.map +0 -1
- package/dist/node/transformers/index.d.mts +0 -3
- package/dist/node/transformers/index.d.mts.map +0 -1
- package/dist/node/transformers/index.d.ts +0 -3
- package/dist/node/transformers/index.d.ts.map +0 -1
- package/dist/node/transformers/model.d.cts +0 -7
- package/dist/node/transformers/model.d.cts.map +0 -1
- package/dist/node/transformers/model.d.mts +0 -7
- package/dist/node/transformers/model.d.mts.map +0 -1
- package/dist/node/transformers/model.d.ts +0 -7
- package/dist/node/transformers/model.d.ts.map +0 -1
- package/src/transformers/Xns.ts +0 -5
- package/src/transformers/index.ts +0 -2
- package/src/transformers/model.ts +0 -8
package/dist/node/index.cjs
CHANGED
|
@@ -82,8 +82,8 @@ var import_hex = require("@xylabs/hex");
|
|
|
82
82
|
var import_lodash = require("@xylabs/lodash");
|
|
83
83
|
var import_module_model2 = require("@xyo-network/module-model");
|
|
84
84
|
var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleResolver {
|
|
85
|
-
addressToName = {};
|
|
86
85
|
modules = {};
|
|
86
|
+
nameToModule = {};
|
|
87
87
|
constructor() {
|
|
88
88
|
super({});
|
|
89
89
|
}
|
|
@@ -148,19 +148,34 @@ var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleRe
|
|
|
148
148
|
return unfiltered;
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
|
+
resolveIdentifier(id, _options) {
|
|
152
|
+
const moduleFromName = this.nameToModule[id];
|
|
153
|
+
if (moduleFromName) {
|
|
154
|
+
return moduleFromName.address;
|
|
155
|
+
}
|
|
156
|
+
for (const module2 of Object.values(this.modules)) {
|
|
157
|
+
if (module2.address === id) {
|
|
158
|
+
return module2.address;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
151
162
|
addSingleModule(module2) {
|
|
152
163
|
if (module2) {
|
|
164
|
+
const name = module2.config.name;
|
|
165
|
+
if (name) {
|
|
166
|
+
(0, import_assert2.assertEx)(this.nameToModule[name] === void 0, () => `Module with name ${name} already added`);
|
|
167
|
+
this.nameToModule[name] = module2;
|
|
168
|
+
}
|
|
153
169
|
this.modules[module2.address] = module2;
|
|
154
170
|
}
|
|
155
171
|
}
|
|
156
172
|
removeSingleModule(address) {
|
|
157
173
|
(0, import_assert2.assertEx)((0, import_hex.isAddress)(address), () => "Invalid address");
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
174
|
+
const module2 = (0, import_assert2.assertEx)(this.modules[address], () => "Address not found in modules");
|
|
175
|
+
delete this.modules[address];
|
|
176
|
+
const name = module2.config.name;
|
|
177
|
+
if (name) {
|
|
178
|
+
delete this.nameToModule[name];
|
|
164
179
|
}
|
|
165
180
|
}
|
|
166
181
|
resolveByAddress(modules, address) {
|
|
@@ -313,6 +328,26 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
313
328
|
return flatResult.filter(import_module_model3.duplicateModules);
|
|
314
329
|
}
|
|
315
330
|
}
|
|
331
|
+
async resolveIdentifier(id, _options) {
|
|
332
|
+
const idParts = id.split(":");
|
|
333
|
+
if (idParts.length > 1) {
|
|
334
|
+
return this.resolveComplexIdentifier(id);
|
|
335
|
+
}
|
|
336
|
+
const results = (await Promise.all(this.resolvers.map(async (resolver) => {
|
|
337
|
+
const result2 = await resolver.resolveIdentifier(id);
|
|
338
|
+
return result2;
|
|
339
|
+
}))).filter(import_exists.exists);
|
|
340
|
+
const result = results.shift();
|
|
341
|
+
if (results.length > 0) {
|
|
342
|
+
for (const altResult of results) {
|
|
343
|
+
(0, import_assert3.assertEx)(altResult === result, () => `Inconsistent results for ${id} [${result}][${altResult}]`);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return result;
|
|
347
|
+
}
|
|
348
|
+
resolveComplexIdentifier(_id, _options) {
|
|
349
|
+
throw new Error("Method not implemented.");
|
|
350
|
+
}
|
|
316
351
|
addSingleModule(module2) {
|
|
317
352
|
if (module2) {
|
|
318
353
|
this._localResolver.add(module2);
|
|
@@ -330,7 +365,7 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
330
365
|
}
|
|
331
366
|
async transformModuleIdentifier(identifier) {
|
|
332
367
|
let id = identifier;
|
|
333
|
-
for (const transformer of this.moduleIdentifierTransformers ??
|
|
368
|
+
for (const transformer of this.moduleIdentifierTransformers ?? _CompositeModuleResolver.transformers) {
|
|
334
369
|
id = await transformer.transform(id);
|
|
335
370
|
}
|
|
336
371
|
return id;
|
|
@@ -338,6 +373,7 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
338
373
|
};
|
|
339
374
|
__name(_CompositeModuleResolver, "CompositeModuleResolver");
|
|
340
375
|
__publicField(_CompositeModuleResolver, "defaultMaxDepth", 5);
|
|
376
|
+
__publicField(_CompositeModuleResolver, "transformers", []);
|
|
341
377
|
var CompositeModuleResolver = _CompositeModuleResolver;
|
|
342
378
|
|
|
343
379
|
// src/ResolverEventEmitter.ts
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/CompositeModuleResolver.ts","../../src/AbstractModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["export * from './CompositeModuleResolver'\nexport * from './ResolverEventEmitter'\n","/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(all, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(idOrFilter, mutatedOptions)\n }\n\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, childOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["import_assert","import_module_model","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","import_assert","import_module_model","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","childOptions","all","resolve","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/CompositeModuleResolver.ts","../../src/AbstractModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["export * from './CompositeModuleResolver'\nexport * from './ResolverEventEmitter'\n","/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleIdentifierTransformer,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n static transformers: ModuleIdentifierTransformer[] = []\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(all, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(idOrFilter, mutatedOptions)\n }\n\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, childOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n async resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promise<Address | undefined> {\n const idParts = id.split(':')\n if (idParts.length > 1) {\n return this.resolveComplexIdentifier(id)\n }\n const results = (\n await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result = await resolver.resolveIdentifier(id)\n return result\n }),\n )\n ).filter(exists)\n const result = results.shift()\n if (results.length > 0) {\n for (const altResult of results) {\n assertEx(altResult === result, () => `Inconsistent results for ${id} [${result}][${altResult}]`)\n }\n }\n return result\n }\n\n protected resolveComplexIdentifier(_id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n throw new Error('Method not implemented.')\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? CompositeModuleResolver.transformers) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n asModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleResolver,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n\n abstract resolveIdentifier(id: ModuleIdentifier, options?: ObjectFilterOptions): Promisable<Address | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private modules: Record<Address, ModuleInstance> = {}\n private nameToModule: Record<ModuleName, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n //check if id is a name of one of modules in the resolver\n const moduleFromName = this.nameToModule[id]\n if (moduleFromName) {\n return moduleFromName.address\n }\n\n //check if any of the modules have the id as an address\n for (const module of Object.values(this.modules)) {\n if (module.address === id) {\n return module.address\n }\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n const name = module.config.name\n if (name) {\n //check for collision\n assertEx(this.nameToModule[name] === undefined, () => `Module with name ${name} already added`)\n this.nameToModule[name] = module\n }\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n const module = assertEx(this.modules[address], () => 'Address not found in modules')\n delete this.modules[address]\n const name = module.config.name\n if (name) {\n delete this.nameToModule[name]\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["import_assert","import_module_model","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","import_assert","import_module_model","SimpleModuleResolver","AbstractModuleResolver","modules","nameToModule","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","resolveIdentifier","_options","moduleFromName","config","compact","map","find","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","childOptions","all","resolve","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","resolveIdentifier","_options","resolveComplexIdentifier","shift","altResult","assertEx","_id","Error","join","identifier","transformer","transformers","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
package/dist/node/index.js
CHANGED
|
@@ -57,8 +57,8 @@ import { isAddress } from "@xylabs/hex";
|
|
|
57
57
|
import { compact } from "@xylabs/lodash";
|
|
58
58
|
import { isAddressModuleFilter, isModuleName, isNameModuleFilter, isQueryModuleFilter } from "@xyo-network/module-model";
|
|
59
59
|
var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleResolver {
|
|
60
|
-
addressToName = {};
|
|
61
60
|
modules = {};
|
|
61
|
+
nameToModule = {};
|
|
62
62
|
constructor() {
|
|
63
63
|
super({});
|
|
64
64
|
}
|
|
@@ -123,19 +123,34 @@ var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleRe
|
|
|
123
123
|
return unfiltered;
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
+
resolveIdentifier(id, _options) {
|
|
127
|
+
const moduleFromName = this.nameToModule[id];
|
|
128
|
+
if (moduleFromName) {
|
|
129
|
+
return moduleFromName.address;
|
|
130
|
+
}
|
|
131
|
+
for (const module of Object.values(this.modules)) {
|
|
132
|
+
if (module.address === id) {
|
|
133
|
+
return module.address;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
126
137
|
addSingleModule(module) {
|
|
127
138
|
if (module) {
|
|
139
|
+
const name = module.config.name;
|
|
140
|
+
if (name) {
|
|
141
|
+
assertEx2(this.nameToModule[name] === void 0, () => `Module with name ${name} already added`);
|
|
142
|
+
this.nameToModule[name] = module;
|
|
143
|
+
}
|
|
128
144
|
this.modules[module.address] = module;
|
|
129
145
|
}
|
|
130
146
|
}
|
|
131
147
|
removeSingleModule(address) {
|
|
132
148
|
assertEx2(isAddress(address), () => "Invalid address");
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
149
|
+
const module = assertEx2(this.modules[address], () => "Address not found in modules");
|
|
150
|
+
delete this.modules[address];
|
|
151
|
+
const name = module.config.name;
|
|
152
|
+
if (name) {
|
|
153
|
+
delete this.nameToModule[name];
|
|
139
154
|
}
|
|
140
155
|
}
|
|
141
156
|
resolveByAddress(modules, address) {
|
|
@@ -288,6 +303,26 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
288
303
|
return flatResult.filter(duplicateModules);
|
|
289
304
|
}
|
|
290
305
|
}
|
|
306
|
+
async resolveIdentifier(id, _options) {
|
|
307
|
+
const idParts = id.split(":");
|
|
308
|
+
if (idParts.length > 1) {
|
|
309
|
+
return this.resolveComplexIdentifier(id);
|
|
310
|
+
}
|
|
311
|
+
const results = (await Promise.all(this.resolvers.map(async (resolver) => {
|
|
312
|
+
const result2 = await resolver.resolveIdentifier(id);
|
|
313
|
+
return result2;
|
|
314
|
+
}))).filter(exists);
|
|
315
|
+
const result = results.shift();
|
|
316
|
+
if (results.length > 0) {
|
|
317
|
+
for (const altResult of results) {
|
|
318
|
+
assertEx3(altResult === result, () => `Inconsistent results for ${id} [${result}][${altResult}]`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
resolveComplexIdentifier(_id, _options) {
|
|
324
|
+
throw new Error("Method not implemented.");
|
|
325
|
+
}
|
|
291
326
|
addSingleModule(module) {
|
|
292
327
|
if (module) {
|
|
293
328
|
this._localResolver.add(module);
|
|
@@ -305,7 +340,7 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
305
340
|
}
|
|
306
341
|
async transformModuleIdentifier(identifier) {
|
|
307
342
|
let id = identifier;
|
|
308
|
-
for (const transformer of this.moduleIdentifierTransformers ??
|
|
343
|
+
for (const transformer of this.moduleIdentifierTransformers ?? _CompositeModuleResolver.transformers) {
|
|
309
344
|
id = await transformer.transform(id);
|
|
310
345
|
}
|
|
311
346
|
return id;
|
|
@@ -313,6 +348,7 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
313
348
|
};
|
|
314
349
|
__name(_CompositeModuleResolver, "CompositeModuleResolver");
|
|
315
350
|
__publicField(_CompositeModuleResolver, "defaultMaxDepth", 5);
|
|
351
|
+
__publicField(_CompositeModuleResolver, "transformers", []);
|
|
316
352
|
var CompositeModuleResolver = _CompositeModuleResolver;
|
|
317
353
|
|
|
318
354
|
// src/ResolverEventEmitter.ts
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/CompositeModuleResolver.ts","../../src/AbstractModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(all, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(idOrFilter, mutatedOptions)\n }\n\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, childOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","exists","duplicateModules","LRUCache","assertEx","Base","toJsonString","asModuleInstance","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","childOptions","all","resolve","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
1
|
+
{"version":3,"sources":["../../src/CompositeModuleResolver.ts","../../src/AbstractModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleIdentifierTransformer,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n static transformers: ModuleIdentifierTransformer[] = []\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(all, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(idOrFilter, mutatedOptions)\n }\n\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, childOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n async resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promise<Address | undefined> {\n const idParts = id.split(':')\n if (idParts.length > 1) {\n return this.resolveComplexIdentifier(id)\n }\n const results = (\n await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result = await resolver.resolveIdentifier(id)\n return result\n }),\n )\n ).filter(exists)\n const result = results.shift()\n if (results.length > 0) {\n for (const altResult of results) {\n assertEx(altResult === result, () => `Inconsistent results for ${id} [${result}][${altResult}]`)\n }\n }\n return result\n }\n\n protected resolveComplexIdentifier(_id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n throw new Error('Method not implemented.')\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? CompositeModuleResolver.transformers) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n asModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleResolver,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n\n abstract resolveIdentifier(id: ModuleIdentifier, options?: ObjectFilterOptions): Promisable<Address | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private modules: Record<Address, ModuleInstance> = {}\n private nameToModule: Record<ModuleName, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n //check if id is a name of one of modules in the resolver\n const moduleFromName = this.nameToModule[id]\n if (moduleFromName) {\n return moduleFromName.address\n }\n\n //check if any of the modules have the id as an address\n for (const module of Object.values(this.modules)) {\n if (module.address === id) {\n return module.address\n }\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n const name = module.config.name\n if (name) {\n //check for collision\n assertEx(this.nameToModule[name] === undefined, () => `Module with name ${name} already added`)\n this.nameToModule[name] = module\n }\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n const module = assertEx(this.modules[address], () => 'Address not found in modules')\n delete this.modules[address]\n const name = module.config.name\n if (name) {\n delete this.nameToModule[name]\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","exists","duplicateModules","LRUCache","assertEx","Base","toJsonString","asModuleInstance","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","AbstractModuleResolver","modules","nameToModule","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","resolveIdentifier","_options","moduleFromName","config","compact","map","find","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","childOptions","all","resolve","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","resolveIdentifier","_options","resolveComplexIdentifier","shift","altResult","assertEx","_id","Error","join","identifier","transformer","transformers","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"@xylabs/lodash": "^3.0.24",
|
|
17
17
|
"@xylabs/object": "^3.0.24",
|
|
18
18
|
"@xylabs/promise": "^3.0.24",
|
|
19
|
-
"@xyo-network/module-model": "~2.93.
|
|
19
|
+
"@xyo-network/module-model": "~2.93.6",
|
|
20
20
|
"lru-cache": "^10.2.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
@@ -65,6 +65,6 @@
|
|
|
65
65
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
66
66
|
},
|
|
67
67
|
"sideEffects": false,
|
|
68
|
-
"version": "2.93.
|
|
68
|
+
"version": "2.93.6",
|
|
69
69
|
"type": "module"
|
|
70
70
|
}
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import { Address } from '@xylabs/hex'
|
|
2
3
|
import { Base, BaseParams, toJsonString } from '@xylabs/object'
|
|
3
4
|
import { Promisable } from '@xylabs/promise'
|
|
4
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
asModuleInstance,
|
|
7
|
+
ModuleFilter,
|
|
8
|
+
ModuleFilterOptions,
|
|
9
|
+
ModuleIdentifier,
|
|
10
|
+
ModuleInstance,
|
|
11
|
+
ModuleResolver,
|
|
12
|
+
ObjectFilterOptions,
|
|
13
|
+
} from '@xyo-network/module-model'
|
|
5
14
|
|
|
6
15
|
export abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {
|
|
7
16
|
async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>
|
|
@@ -50,4 +59,6 @@ export abstract class AbstractModuleResolver<T extends BaseParams = BaseParams>
|
|
|
50
59
|
idOrFilter: ModuleFilter<T> | ModuleIdentifier,
|
|
51
60
|
options?: ModuleFilterOptions<T>,
|
|
52
61
|
): Promisable<T | T[] | undefined>
|
|
62
|
+
|
|
63
|
+
abstract resolveIdentifier(id: ModuleIdentifier, options?: ObjectFilterOptions): Promisable<Address | undefined>
|
|
53
64
|
}
|
|
@@ -11,17 +11,16 @@ import {
|
|
|
11
11
|
ModuleFilterOptions,
|
|
12
12
|
ModuleIdentifier,
|
|
13
13
|
ModuleIdentifierPart,
|
|
14
|
+
ModuleIdentifierTransformer,
|
|
14
15
|
ModuleInstance,
|
|
15
16
|
ModuleRepository,
|
|
16
17
|
ModuleResolverInstance,
|
|
18
|
+
ObjectFilterOptions,
|
|
17
19
|
} from '@xyo-network/module-model'
|
|
18
20
|
import { LRUCache } from 'lru-cache'
|
|
19
21
|
|
|
20
22
|
import { AbstractModuleResolver } from './AbstractModuleResolver'
|
|
21
23
|
import { SimpleModuleResolver } from './SimpleModuleResolver'
|
|
22
|
-
import { ModuleIdentifierTransformer } from './transformers'
|
|
23
|
-
|
|
24
|
-
export type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>
|
|
25
24
|
|
|
26
25
|
export interface ModuleResolverParams extends BaseParams {
|
|
27
26
|
cache?: CacheConfig
|
|
@@ -34,6 +33,7 @@ const moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdenti
|
|
|
34
33
|
|
|
35
34
|
export class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {
|
|
36
35
|
static defaultMaxDepth = 5
|
|
36
|
+
static transformers: ModuleIdentifierTransformer[] = []
|
|
37
37
|
protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>
|
|
38
38
|
protected resolvers: ModuleResolverInstance[] = []
|
|
39
39
|
private _localResolver: SimpleModuleResolver
|
|
@@ -176,6 +176,32 @@ export class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolv
|
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
+
async resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promise<Address | undefined> {
|
|
180
|
+
const idParts = id.split(':')
|
|
181
|
+
if (idParts.length > 1) {
|
|
182
|
+
return this.resolveComplexIdentifier(id)
|
|
183
|
+
}
|
|
184
|
+
const results = (
|
|
185
|
+
await Promise.all(
|
|
186
|
+
this.resolvers.map(async (resolver) => {
|
|
187
|
+
const result = await resolver.resolveIdentifier(id)
|
|
188
|
+
return result
|
|
189
|
+
}),
|
|
190
|
+
)
|
|
191
|
+
).filter(exists)
|
|
192
|
+
const result = results.shift()
|
|
193
|
+
if (results.length > 0) {
|
|
194
|
+
for (const altResult of results) {
|
|
195
|
+
assertEx(altResult === result, () => `Inconsistent results for ${id} [${result}][${altResult}]`)
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return result
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
protected resolveComplexIdentifier(_id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {
|
|
202
|
+
throw new Error('Method not implemented.')
|
|
203
|
+
}
|
|
204
|
+
|
|
179
205
|
private addSingleModule(module?: ModuleInstance) {
|
|
180
206
|
if (module) {
|
|
181
207
|
this._localResolver.add(module)
|
|
@@ -195,7 +221,7 @@ export class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolv
|
|
|
195
221
|
|
|
196
222
|
private async transformModuleIdentifier(identifier: ModuleIdentifier) {
|
|
197
223
|
let id = identifier
|
|
198
|
-
for (const transformer of this.moduleIdentifierTransformers ??
|
|
224
|
+
for (const transformer of this.moduleIdentifierTransformers ?? CompositeModuleResolver.transformers) {
|
|
199
225
|
id = await transformer.transform(id)
|
|
200
226
|
}
|
|
201
227
|
return id
|