@xyo-network/module-resolver 2.94.19 → 2.94.21
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 +18 -2
- package/dist/browser/AbstractModuleResolver.d.cts.map +1 -1
- package/dist/browser/AbstractModuleResolver.d.mts +18 -2
- package/dist/browser/AbstractModuleResolver.d.mts.map +1 -1
- package/dist/browser/AbstractModuleResolver.d.ts +18 -2
- package/dist/browser/AbstractModuleResolver.d.ts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.cts +3 -4
- package/dist/browser/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.mts +3 -4
- package/dist/browser/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.ts +3 -4
- package/dist/browser/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.cts +2 -2
- package/dist/browser/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.mts +2 -2
- package/dist/browser/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.ts +2 -2
- package/dist/browser/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/browser/index.cjs +21 -11
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +1 -0
- package/dist/browser/index.d.cts.map +1 -1
- package/dist/browser/index.d.mts +1 -0
- package/dist/browser/index.d.mts.map +1 -1
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +21 -11
- package/dist/browser/index.js.map +1 -1
- package/dist/node/AbstractModuleResolver.d.cts +18 -2
- package/dist/node/AbstractModuleResolver.d.cts.map +1 -1
- package/dist/node/AbstractModuleResolver.d.mts +18 -2
- package/dist/node/AbstractModuleResolver.d.mts.map +1 -1
- package/dist/node/AbstractModuleResolver.d.ts +18 -2
- package/dist/node/AbstractModuleResolver.d.ts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.cts +3 -4
- package/dist/node/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.mts +3 -4
- package/dist/node/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.ts +3 -4
- package/dist/node/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.cts +2 -2
- package/dist/node/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.mts +2 -2
- package/dist/node/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.ts +2 -2
- package/dist/node/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/node/index.cjs +22 -11
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +1 -0
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.mts +1 -0
- package/dist/node/index.d.mts.map +1 -1
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +21 -11
- package/dist/node/index.js.map +1 -1
- package/package.json +3 -3
- package/src/AbstractModuleResolver.ts +23 -2
- package/src/CompositeModuleResolver.ts +6 -6
- package/src/SimpleModuleResolver.ts +3 -3
- package/src/index.ts +1 -0
package/dist/node/index.cjs
CHANGED
|
@@ -26,17 +26,12 @@ var __publicField = (obj, key, value) => {
|
|
|
26
26
|
// src/index.ts
|
|
27
27
|
var src_exports = {};
|
|
28
28
|
__export(src_exports, {
|
|
29
|
+
AbstractModuleResolver: () => AbstractModuleResolver,
|
|
29
30
|
CompositeModuleResolver: () => CompositeModuleResolver,
|
|
30
31
|
mixinResolverEventEmitter: () => mixinResolverEventEmitter
|
|
31
32
|
});
|
|
32
33
|
module.exports = __toCommonJS(src_exports);
|
|
33
34
|
|
|
34
|
-
// src/CompositeModuleResolver.ts
|
|
35
|
-
var import_assert3 = require("@xylabs/assert");
|
|
36
|
-
var import_exists = require("@xylabs/exists");
|
|
37
|
-
var import_module_model3 = require("@xyo-network/module-model");
|
|
38
|
-
var import_lru_cache = require("lru-cache");
|
|
39
|
-
|
|
40
35
|
// src/AbstractModuleResolver.ts
|
|
41
36
|
var import_assert = require("@xylabs/assert");
|
|
42
37
|
var import_object = require("@xylabs/object");
|
|
@@ -45,6 +40,9 @@ var _AbstractModuleResolver = class _AbstractModuleResolver extends import_objec
|
|
|
45
40
|
get priority() {
|
|
46
41
|
return this.params.priority ?? import_module_model.ObjectResolverPriority.Normal;
|
|
47
42
|
}
|
|
43
|
+
get root() {
|
|
44
|
+
return (0, import_assert.assertEx)(this.params.root, () => "root is not set");
|
|
45
|
+
}
|
|
48
46
|
async resolve(idOrFilter = "*", options) {
|
|
49
47
|
if (idOrFilter === "*") {
|
|
50
48
|
const values = await this.resolveHandler(idOrFilter, options);
|
|
@@ -75,10 +73,20 @@ var _AbstractModuleResolver = class _AbstractModuleResolver extends import_objec
|
|
|
75
73
|
}
|
|
76
74
|
}
|
|
77
75
|
}
|
|
76
|
+
async resolvePrivate(id, _options) {
|
|
77
|
+
if (id === "*")
|
|
78
|
+
return await Promise.resolve([]);
|
|
79
|
+
}
|
|
78
80
|
};
|
|
79
81
|
__name(_AbstractModuleResolver, "AbstractModuleResolver");
|
|
80
82
|
var AbstractModuleResolver = _AbstractModuleResolver;
|
|
81
83
|
|
|
84
|
+
// src/CompositeModuleResolver.ts
|
|
85
|
+
var import_assert3 = require("@xylabs/assert");
|
|
86
|
+
var import_exists = require("@xylabs/exists");
|
|
87
|
+
var import_module_model3 = require("@xyo-network/module-model");
|
|
88
|
+
var import_lru_cache = require("lru-cache");
|
|
89
|
+
|
|
82
90
|
// src/SimpleModuleResolver.ts
|
|
83
91
|
var import_assert2 = require("@xylabs/assert");
|
|
84
92
|
var import_hex = require("@xylabs/hex");
|
|
@@ -87,8 +95,8 @@ var import_module_model2 = require("@xyo-network/module-model");
|
|
|
87
95
|
var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleResolver {
|
|
88
96
|
modules = {};
|
|
89
97
|
nameToModule = {};
|
|
90
|
-
constructor() {
|
|
91
|
-
super(
|
|
98
|
+
constructor(params) {
|
|
99
|
+
super(params);
|
|
92
100
|
}
|
|
93
101
|
add(module2) {
|
|
94
102
|
if (Array.isArray(module2)) {
|
|
@@ -216,7 +224,9 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
216
224
|
_localResolver;
|
|
217
225
|
constructor(params) {
|
|
218
226
|
super(params);
|
|
219
|
-
const localResolver = new SimpleModuleResolver(
|
|
227
|
+
const localResolver = new SimpleModuleResolver({
|
|
228
|
+
root: params.root
|
|
229
|
+
});
|
|
220
230
|
this.addResolver(localResolver);
|
|
221
231
|
const {
|
|
222
232
|
max = 100,
|
|
@@ -372,8 +382,8 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
372
382
|
const idParts = moduleIdentifierParts(moduleIdentifier);
|
|
373
383
|
(0, import_assert3.assertEx)(idParts.length >= 2, () => "Not a valid multipart identifier");
|
|
374
384
|
const id = (0, import_assert3.assertEx)(idParts.shift());
|
|
375
|
-
const module2 = await this.resolve(id);
|
|
376
|
-
return await (module2 == null ? void 0 : module2.resolve(idParts.join(":")));
|
|
385
|
+
const module2 = await this.resolve(id) ?? await this.resolvePrivate(id);
|
|
386
|
+
return await (module2 == null ? void 0 : module2.resolve(idParts.join(":"))) ?? await (module2 == null ? void 0 : module2.resolvePrivate(idParts.join(":")));
|
|
377
387
|
}
|
|
378
388
|
async transformModuleIdentifier(identifier) {
|
|
379
389
|
let id = identifier;
|
|
@@ -427,6 +437,7 @@ var mixinResolverEventEmitter = /* @__PURE__ */ __name((resolver) => {
|
|
|
427
437
|
}, "mixinResolverEventEmitter");
|
|
428
438
|
// Annotate the CommonJS export names for ESM import in node:
|
|
429
439
|
0 && (module.exports = {
|
|
440
|
+
AbstractModuleResolver,
|
|
430
441
|
CompositeModuleResolver,
|
|
431
442
|
mixinResolverEventEmitter
|
|
432
443
|
});
|
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 ModuleIdentifierTransformer,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\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<T extends ModuleResolverParams = ModuleResolverParams>\n extends AbstractModuleResolver<T>\n implements ModuleRepository, ModuleResolverInstance\n{\n static defaultMaxDepth = 3\n static transformers: ModuleIdentifierTransformer[] = []\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor(params: T) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = params.cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...params.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\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 childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\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 //recursive function to resolve by priority\n const resolvePriority = async (priority: ObjectResolverPriority): Promise<T | undefined> => {\n const resolvers = this.resolvers.filter((resolver) => resolver.priority === priority)\n const results: (T | undefined)[] = (\n await Promise.all(\n resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n ).filter(exists)\n\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n return result\n }\n return priority === ObjectResolverPriority.VeryLow ? undefined : await resolvePriority(priority - 1)\n }\n\n return resolvePriority(ObjectResolverPriority.VeryHigh)\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 childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\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 ObjectResolverPriority,\n} from '@xyo-network/module-model'\n\nexport interface ModuleResolverParams extends BaseParams {\n priority?: ObjectResolverPriority\n}\n\nexport abstract class AbstractModuleResolver<T extends ModuleResolverParams = ModuleResolverParams> extends Base<T> implements ModuleResolver {\n get priority() {\n return this.params.priority ?? ObjectResolverPriority.Normal\n }\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","priority","params","ObjectResolverPriority","Normal","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","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","cache","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","resolve","childOptions","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","resolvePriority","priority","results","pop","set","ObjectResolverPriority","VeryLow","VeryHigh","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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/AbstractModuleResolver.ts","../../src/CompositeModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["export * from './AbstractModuleResolver'\nexport * from './CompositeModuleResolver'\nexport * from './ResolverEventEmitter'\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 ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n} from '@xyo-network/module-model'\n\nexport interface ModuleResolverParams extends BaseParams {\n priority?: ObjectResolverPriority\n root: ModuleInstance\n}\n\nexport abstract class AbstractModuleResolver<TParams extends ModuleResolverParams = ModuleResolverParams>\n extends Base<TParams>\n implements ModuleResolverInstance\n{\n get priority() {\n return this.params.priority ?? ObjectResolverPriority.Normal\n }\n\n get root() {\n return assertEx(this.params.root, () => 'root is not set')\n }\n\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 async resolvePrivate<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ObjectFilterOptions<T>): Promise<T[]>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ObjectFilterOptions<T>): Promise<T | undefined>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n _options?: ObjectFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n if (id === '*') return await Promise.resolve([])\n }\n\n abstract addResolver(resolver: ModuleResolverInstance): this\n abstract removeResolver(resolver: ModuleResolverInstance): this\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","/* 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 ObjectResolverPriority,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\n\nexport interface CompositeModuleResolverParams extends ModuleResolverParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver<T extends CompositeModuleResolverParams = CompositeModuleResolverParams>\n extends AbstractModuleResolver<T>\n implements ModuleRepository, ModuleResolverInstance\n{\n static defaultMaxDepth = 3\n static transformers: ModuleIdentifierTransformer[] = []\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor(params: T) {\n super(params)\n const localResolver = new SimpleModuleResolver({ root: params.root })\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = params.cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...params.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\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 childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\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 //recursive function to resolve by priority\n const resolvePriority = async (priority: ObjectResolverPriority): Promise<T | undefined> => {\n const resolvers = this.resolvers.filter((resolver) => resolver.priority === priority)\n const results: (T | undefined)[] = (\n await Promise.all(\n resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n ).filter(exists)\n\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n return result\n }\n return priority === ObjectResolverPriority.VeryLow ? undefined : await resolvePriority(priority - 1)\n }\n\n return resolvePriority(ObjectResolverPriority.VeryHigh)\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 childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\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)) ?? (await this.resolvePrivate<T>(id))\n return (await module?.resolve<T>(idParts.join(':'))) ?? (await module?.resolvePrivate<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, 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, ModuleResolverParams } 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(params: ModuleResolverParams) {\n super(params)\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":["AbstractModuleResolver","Base","priority","params","ObjectResolverPriority","Normal","root","assertEx","resolve","idOrFilter","options","values","resolveHandler","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","resolvePrivate","id","_options","Promise","import_assert","import_module_model","import_assert","import_module_model","SimpleModuleResolver","AbstractModuleResolver","modules","nameToModule","constructor","params","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","params","localResolver","SimpleModuleResolver","root","addResolver","max","ttl","cache","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","resolve","childOptions","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","resolvePriority","priority","results","pop","set","ObjectResolverPriority","VeryLow","VeryHigh","resolveIdentifier","_options","resolveComplexIdentifier","shift","altResult","assertEx","_id","Error","resolvePrivate","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.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA"}
|
package/dist/node/index.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA"}
|
package/dist/node/index.d.ts
CHANGED
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA"}
|
package/dist/node/index.js
CHANGED
|
@@ -6,12 +6,6 @@ var __publicField = (obj, key, value) => {
|
|
|
6
6
|
return value;
|
|
7
7
|
};
|
|
8
8
|
|
|
9
|
-
// src/CompositeModuleResolver.ts
|
|
10
|
-
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
11
|
-
import { exists } from "@xylabs/exists";
|
|
12
|
-
import { duplicateModules, ObjectResolverPriority as ObjectResolverPriority2 } from "@xyo-network/module-model";
|
|
13
|
-
import { LRUCache } from "lru-cache";
|
|
14
|
-
|
|
15
9
|
// src/AbstractModuleResolver.ts
|
|
16
10
|
import { assertEx } from "@xylabs/assert";
|
|
17
11
|
import { Base, toJsonString } from "@xylabs/object";
|
|
@@ -20,6 +14,9 @@ var _AbstractModuleResolver = class _AbstractModuleResolver extends Base {
|
|
|
20
14
|
get priority() {
|
|
21
15
|
return this.params.priority ?? ObjectResolverPriority.Normal;
|
|
22
16
|
}
|
|
17
|
+
get root() {
|
|
18
|
+
return assertEx(this.params.root, () => "root is not set");
|
|
19
|
+
}
|
|
23
20
|
async resolve(idOrFilter = "*", options) {
|
|
24
21
|
if (idOrFilter === "*") {
|
|
25
22
|
const values = await this.resolveHandler(idOrFilter, options);
|
|
@@ -50,10 +47,20 @@ var _AbstractModuleResolver = class _AbstractModuleResolver extends Base {
|
|
|
50
47
|
}
|
|
51
48
|
}
|
|
52
49
|
}
|
|
50
|
+
async resolvePrivate(id, _options) {
|
|
51
|
+
if (id === "*")
|
|
52
|
+
return await Promise.resolve([]);
|
|
53
|
+
}
|
|
53
54
|
};
|
|
54
55
|
__name(_AbstractModuleResolver, "AbstractModuleResolver");
|
|
55
56
|
var AbstractModuleResolver = _AbstractModuleResolver;
|
|
56
57
|
|
|
58
|
+
// src/CompositeModuleResolver.ts
|
|
59
|
+
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
60
|
+
import { exists } from "@xylabs/exists";
|
|
61
|
+
import { duplicateModules, ObjectResolverPriority as ObjectResolverPriority2 } from "@xyo-network/module-model";
|
|
62
|
+
import { LRUCache } from "lru-cache";
|
|
63
|
+
|
|
57
64
|
// src/SimpleModuleResolver.ts
|
|
58
65
|
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
59
66
|
import { isAddress } from "@xylabs/hex";
|
|
@@ -62,8 +69,8 @@ import { isAddressModuleFilter, isModuleName, isNameModuleFilter, isQueryModuleF
|
|
|
62
69
|
var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleResolver {
|
|
63
70
|
modules = {};
|
|
64
71
|
nameToModule = {};
|
|
65
|
-
constructor() {
|
|
66
|
-
super(
|
|
72
|
+
constructor(params) {
|
|
73
|
+
super(params);
|
|
67
74
|
}
|
|
68
75
|
add(module) {
|
|
69
76
|
if (Array.isArray(module)) {
|
|
@@ -191,7 +198,9 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
191
198
|
_localResolver;
|
|
192
199
|
constructor(params) {
|
|
193
200
|
super(params);
|
|
194
|
-
const localResolver = new SimpleModuleResolver(
|
|
201
|
+
const localResolver = new SimpleModuleResolver({
|
|
202
|
+
root: params.root
|
|
203
|
+
});
|
|
195
204
|
this.addResolver(localResolver);
|
|
196
205
|
const {
|
|
197
206
|
max = 100,
|
|
@@ -347,8 +356,8 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
347
356
|
const idParts = moduleIdentifierParts(moduleIdentifier);
|
|
348
357
|
assertEx3(idParts.length >= 2, () => "Not a valid multipart identifier");
|
|
349
358
|
const id = assertEx3(idParts.shift());
|
|
350
|
-
const module = await this.resolve(id);
|
|
351
|
-
return await (module == null ? void 0 : module.resolve(idParts.join(":")));
|
|
359
|
+
const module = await this.resolve(id) ?? await this.resolvePrivate(id);
|
|
360
|
+
return await (module == null ? void 0 : module.resolve(idParts.join(":"))) ?? await (module == null ? void 0 : module.resolvePrivate(idParts.join(":")));
|
|
352
361
|
}
|
|
353
362
|
async transformModuleIdentifier(identifier) {
|
|
354
363
|
let id = identifier;
|
|
@@ -401,6 +410,7 @@ var mixinResolverEventEmitter = /* @__PURE__ */ __name((resolver) => {
|
|
|
401
410
|
return ret;
|
|
402
411
|
}, "mixinResolverEventEmitter");
|
|
403
412
|
export {
|
|
413
|
+
AbstractModuleResolver,
|
|
404
414
|
CompositeModuleResolver,
|
|
405
415
|
mixinResolverEventEmitter
|
|
406
416
|
};
|
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 ModuleIdentifierTransformer,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\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<T extends ModuleResolverParams = ModuleResolverParams>\n extends AbstractModuleResolver<T>\n implements ModuleRepository, ModuleResolverInstance\n{\n static defaultMaxDepth = 3\n static transformers: ModuleIdentifierTransformer[] = []\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor(params: T) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = params.cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...params.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\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 childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\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 //recursive function to resolve by priority\n const resolvePriority = async (priority: ObjectResolverPriority): Promise<T | undefined> => {\n const resolvers = this.resolvers.filter((resolver) => resolver.priority === priority)\n const results: (T | undefined)[] = (\n await Promise.all(\n resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n ).filter(exists)\n\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n return result\n }\n return priority === ObjectResolverPriority.VeryLow ? undefined : await resolvePriority(priority - 1)\n }\n\n return resolvePriority(ObjectResolverPriority.VeryHigh)\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 childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\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 ObjectResolverPriority,\n} from '@xyo-network/module-model'\n\nexport interface ModuleResolverParams extends BaseParams {\n priority?: ObjectResolverPriority\n}\n\nexport abstract class AbstractModuleResolver<T extends ModuleResolverParams = ModuleResolverParams> extends Base<T> implements ModuleResolver {\n get priority() {\n return this.params.priority ?? ObjectResolverPriority.Normal\n }\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":";;;;;;;;;AACA,SAASA,YAAAA,iBAAgB;AACzB,SAASC,cAAc;AAIvB,SAEEC,kBAUAC,0BAAAA,+BACK;AACP,SAASC,gBAAgB;;;ACpBzB,SAASC,gBAAgB;AAEzB,SAASC,MAAkBC,oBAAoB;AAE/C,SACEC,kBAOAC,8BACK;AAMA,IAAeC,0BAAf,MAAeA,gCAAsFC,KAAAA;EAC1G,IAAIC,WAAW;AACb,WAAO,KAAKC,OAAOD,YAAYE,uBAAuBC;EACxD;EAMA,MAAMC,QACJC,aAAuC,KACvCC,SAC8B;AAC9B,QAAID,eAAe,KAAK;AACtB,YAAME,SAAU,MAAM,KAAKC,eAAeH,YAAYC,OAAAA;AACtDG,eAASC,MAAMC,QAAQJ,MAAAA,GAAS,MAAM,qCAAA;AACtC,aAAOA,OAAOK,IAAI,CAACC,UACjBC,iBAAoBD,OAAO,MAAA;AApCnC;AAsCU,eAAO,gDAAgDA,oCAAeE,gBAAfF,mBAA4BG,IAAAA,KAASC,aAAaJ,KAAAA,CAAAA;MAC3G,CAAA,CAAA;IAEJ;AACA,YAAQ,OAAOR,YAAAA;MACb,KAAK,UAAU;AACb,cAAMQ,QAAQ,MAAM,KAAKL,eAAeH,YAAYC,OAAAA;AACpD,eAAOQ,iBACLD,OACA,MAAA;AA/CV;AAiDY;;iEAAqDA,oCAAeE,gBAAfF,mBAA4BG,IAAAA,KAASC,aAAaJ,KAAAA,CAAAA;;SAAS;MAEtH;MACA,SAAS;AACP,cAAMN,SAAU,MAAM,KAAKC,eAAeH,YAAYC,OAAAA;AACtDG,iBAASC,MAAMC,QAAQJ,MAAAA,GAAS,MAAM,qCAAA;AACtC,eAAOA,OAAOK,IAAI,CAACC,UACjBC,iBAAoBD,OAAO,MAAA;AAxDrC;AA0DY,iBAAO,qDAAqDA,oCAAeE,gBAAfF,mBAA4BG,IAAAA,KAASC,aAAaJ,KAAAA,CAAAA;QAChH,CAAA,CAAA;MAEJ;IACF;EACF;AAQF;AApD4Gd;AAArG,IAAeD,yBAAf;;;ACnBP,SAASoB,YAAAA,iBAAgB;AACzB,SAAkBC,iBAAiB;AACnC,SAASC,eAAe;AAExB,SACEC,uBACAC,cACAC,oBACAC,2BASK;AAKA,IAAMC,wBAAN,MAAMA,8BAA6BC,uBAAAA;EAChCC,UAA2C,CAAC;EAC5CC,eAAmD,CAAC;EAE5DC,cAAc;AACZ,UAAM,CAAC,CAAA;EACT;EAIAC,IAAIC,QAAiD;AACnD,QAAIC,MAAMC,QAAQF,MAAAA,GAAS;AACzB,iBAAWG,OAAOH;AAAQ,aAAKI,gBAAgBD,GAAAA;IACjD,OAAO;AACL,WAAKC,gBAAgBJ,MAAAA;IACvB;AACA,WAAO;EACT;EAEAK,YAAYC,WAAyC;AACnD,UAAM;EACR;EAEAC,OAAOC,SAAoC;AACzC,QAAIP,MAAMC,QAAQM,OAAAA,GAAU;AAC1B,iBAAWC,QAAQD;AAAS,aAAKE,mBAAmBD,IAAAA;IACtD,OAAO;AACL,WAAKC,mBAAmBF,OAAAA;IAC1B;AACA,WAAO;EACT;EAEAG,eAAeL,WAAyC;AACtD,UAAM;EACR;EAEAM,eACEC,aAAuC,KACvCC,SACiC;AACjC,UAAMC,cAAc,MAAA;AAClB,UAAIF,YAAY;AACd,YAAI,OAAOA,eAAe,UAAU;AAClC,cAAIA,eAAe,KAAK;AACtB,mBAAOG,OAAOC,OAAO,KAAKrB,OAAO;UACnC;AACA,gBAAMsB,KAAKL;AACX,gBAAMM,OAAOC,aAAaF,EAAAA,IAAMA,KAAKG;AACrC,gBAAMb,UAAUc,UAAUJ,EAAAA,IAAMA,KAAKG;AACrCE,UAAAA,UAASJ,QAAQX,SAAS,MAAM,mDAAA;AAChC,kBACGW,OAAO,KAAKK,cAAiBR,OAAOC,OAAO,KAAKrB,OAAO,GAAG;YAACuB;WAAK,EAAEM,IAAG,IAAKJ,YAC1Eb,UAAU,KAAKkB,iBAAoB,KAAK9B,SAAS;YAACY;WAAQ,EAAEiB,IAAG,IAAKJ;QAEzE,OAAO;AACL,gBAAMM,SAASd;AACf,cAAIe,sBAAsBD,MAAAA,GAAS;AACjC,mBAAO,KAAKD,iBAAoB,KAAK9B,SAAS+B,OAAOnB,OAAO;UAC9D,WAAWqB,mBAAmBF,MAAAA,GAAS;AACrC,mBAAO,KAAKH,cAAiBR,OAAOC,OAAO,KAAKrB,OAAO,GAAG+B,OAAOR,IAAI;UACvE,WAAWW,oBAAoBH,MAAAA,GAAS;AACtC,mBAAO,KAAKI,eAAkBf,OAAOC,OAAO,KAAKrB,OAAO,GAAG+B,OAAOK,KAAK;UACzE;QACF;MACF,OAAO;AACL,eAAOhB,OAAOC,OAAO,KAAKrB,OAAO;MACnC;IACF,GAAA;AACA,UAAMqC,WAAWnB,mCAASmB;AAC1B,QAAIA,UAAU;AACZ,aACEhC,MAAMC,QAAQa,UAAAA,IAAcA,yCAAYY,OAAO,CAAC3B,WAAWiC,SAASjC,MAAAA,KAClEiC,SAASlB,UAAAA,IAAcA,aACvBM;IAEN,OAAO;AACL,aAAON;IACT;EACF;EAEAmB,kBAAkBhB,IAAsBiB,UAAiE;AAEvG,UAAMC,iBAAiB,KAAKvC,aAAaqB,EAAAA;AACzC,QAAIkB,gBAAgB;AAClB,aAAOA,eAAe5B;IACxB;AAGA,eAAWR,UAAUgB,OAAOC,OAAO,KAAKrB,OAAO,GAAG;AAChD,UAAII,OAAOQ,YAAYU,IAAI;AACzB,eAAOlB,OAAOQ;MAChB;IACF;EACF;EAEQJ,gBAAgBJ,QAAyB;AAC/C,QAAIA,QAAQ;AACV,YAAMmB,OAAOnB,OAAOqC,OAAOlB;AAC3B,UAAIA,MAAM;AAERI,QAAAA,UAAS,KAAK1B,aAAasB,IAAAA,MAAUE,QAAW,MAAM,oBAAoBF,IAAAA,gBAAoB;AAC9F,aAAKtB,aAAasB,IAAAA,IAAQnB;MAC5B;AACA,WAAKJ,QAAQI,OAAOQ,OAAO,IAAIR;IACjC;EACF;EAEQU,mBAAmBF,SAAkB;AAC3Ce,IAAAA,UAASD,UAAUd,OAAAA,GAAU,MAAM,iBAAA;AACnC,UAAMR,SAASuB,UAAS,KAAK3B,QAAQY,OAAAA,GAAU,MAAM,8BAAA;AACrD,WAAO,KAAKZ,QAAQY,OAAAA;AACpB,UAAMW,OAAOnB,OAAOqC,OAAOlB;AAC3B,QAAIA,MAAM;AACR,aAAO,KAAKtB,aAAasB,IAAAA;IAC3B;EACF;EAEQO,iBAA4D9B,SAA0CY,SAAyB;AACrI,WAAO8B,QACL9B,QAAQ+B,IAAI,CAAC/B,aAAAA;AACX,aAAOZ,QAAQY,QAAAA;IACjB,CAAA,CAAA;EAEJ;EAEQgB,cAAyD5B,SAA2BuB,MAAyB;AACnH,WAAOmB,QACLnB,KAAKoB,IAAI,CAACpB,UAAAA;AACR,aAAOvB,QAAQ4C,KAAK,CAACxC,WAAWA,OAAOqC,OAAOlB,SAASA,KAAAA;IACzD,CAAA,CAAA;EAEJ;EAEQY,eAA0DnC,SAA2BoC,OAAwB;AACnH,WAAOM,QACL1C,QAAQ+B,OAAO,CAAC3B,WACdgC,+BAAOS,OAAO,CAACC,WAAWC,cAAAA;AACxB;;QAEEA,UAAUF,OAAO,CAACC,YAAWV,WAAAA;AAC3B,gBAAMY,YAAY5C,OAAO6C,QAAQC,SAASd,MAAAA;AAC1C,iBAAOU,cAAaE;QACtB,GAAG,IAAA,KAASF;;IAEhB,GAAG,MAAA,CAAA;EAGT;AACF;AApJ0C/C;AAAnC,IAAMD,uBAAN;;;AFQP,IAAMqD,wBAAwB,wBAACC,qBAAAA;AAC7B,SAAOA,qDAAkBC,MAAM;AACjC,GAF8B;AAIvB,IAAMC,2BAAN,MAAMA,iCACHC,uBAAAA;EAKEC;EACAC,YAAsC,CAAA;EACxCC;EAERC,YAAYC,QAAW;AACrB,UAAMA,MAAAA;AACN,UAAMC,gBAAgB,IAAIC,qBAAAA;AAC1B,SAAKC,YAAYF,aAAAA;AACjB,UAAM;MAAEG,MAAM;MAAKC,MAAM,MAAO;;IAAC,IAAwBL,OAAOM,SAAS,CAAC;AAC1E,SAAKV,SAAS,IAAIW,SAA2C;MAAEH;MAAKC;MAAK,GAAGL,OAAOM;IAAM,CAAA;AACzF,SAAKR,iBAAiBG;EACxB;EAEA,IAAYO,+BAA+B;AACzC,WAAO,KAAKR,OAAOQ;EACrB;EAIAC,IAAIC,QAAiD;AACnD,QAAIC,MAAMC,QAAQF,MAAAA,GAAS;AACzB,iBAAWG,OAAOH;AAAQ,aAAKI,gBAAgBD,GAAAA;IACjD,OAAO;AACL,WAAKC,gBAAgBJ,MAAAA;IACvB;AACA,WAAO;EACT;EAEAP,YAAYY,UAAwC;AAClD,SAAKlB,UAAUmB,KAAKD,QAAAA;AACpB,WAAO;EACT;EAEAE,OAAOC,WAAsC;AAC3C,QAAIP,MAAMC,QAAQM,SAAAA,GAAY;AAC5B,iBAAWC,WAAWD;AAAW,aAAKE,mBAAmBD,OAAAA;IAC3D,OAAO;AACL,WAAKC,mBAAmBF,SAAAA;IAC1B;AACA,WAAO;EACT;EAEAG,eAAeN,UAAwC;AACrD,SAAKlB,YAAY,KAAKA,UAAUyB,OAAO,CAACC,SAASA,SAASR,QAAAA;AAC1D,WAAO;EACT;EAEA,MAAMS,eACJC,aAAiD,KACjDC,UAAkC,CAAC,GACL;AAC9B,UAAMC,iBAAiB;MAAE,GAAGD;MAASE,WAAUF,mCAASE,aAAYlC,yBAAwBmC;IAAgB;AAG5G,QAAIJ,eAAe,KAAK;AACtB,YAAMK,MAAML;AAGZ,UAAIE,eAAeC,WAAW,GAAG;AAC/B,eAAO,CAAA;MACT;AAGA,UAAID,eAAeC,aAAa,GAAG;AACjC,eAAO,MAAM,KAAK9B,eAAeiC,QAAQD,KAAKH,cAAAA;MAChD;AAEA,YAAMK,eAAe;QAAE,GAAGL;QAAgBC,WAAUD,iDAAgBC,YAAW;MAAE;AAEjF,YAAMK,SAAS,MAAMC,QAAQJ,IAC3B,KAAKjC,UAAUsC,IAAI,OAAOpB,aAAAA;AACxB,cAAMkB,UAAc,MAAMlB,SAASgB,QAAWD,KAAKE,YAAAA;AACnD,eAAOC;MACT,CAAA,CAAA;AAEF,YAAMG,aAAkBH,OAAOI,KAAI,EAAGf,OAAOgB,MAAAA;AAC7C,aAAOF,WAAWd,OAAOiB,gBAAAA;IAC3B;AAEA,QAAI,OAAOd,eAAe,UAAU;AAElC,UAAIE,eAAeC,WAAW,GAAG;AAC/B;MACF;AAGA,YAAMY,UAAUjD,sBAAsBkC,UAAAA;AACtC,UAAIe,QAAQC,SAAS,GAAG;AACtB,eAAO,MAAM,KAAKC,2BAA8BjB,UAAAA;MAClD;AACA,YAAMkB,KAAK,MAAM,KAAKC,0BAA0BnB,UAAAA;AAChD,UAAIE,eAAeC,WAAW,GAAG;AAC/B,eAAOiB;MACT;AACA,YAAMC,eAAe,KAAKlD,OAAOmD,IAAIJ,EAAAA;AACrC,UAAIG,cAAc;AAChB,YAAIA,aAAaE,WAAW,QAAQ;AAClC,eAAKpD,OAAOqD,OAAON,EAAAA;QACrB,OAAO;AACL,iBAAOG;QACT;MACF;AAGA,UAAInB,eAAeC,aAAa,GAAG;AACjC,eAAO,MAAM,KAAK9B,eAAeiC,QAAQN,YAAYE,cAAAA;MACvD;AAGA,YAAMuB,kBAAkB,8BAAOC,aAAAA;AAC7B,cAAMtD,YAAY,KAAKA,UAAUyB,OAAO,CAACP,aAAaA,SAASoC,aAAaA,QAAAA;AAC5E,cAAMC,WACJ,MAAMlB,QAAQJ,IACZjC,UAAUsC,IAAI,OAAOpB,aAAAA;AACnB,gBAAMkB,UAAwB,MAAMlB,SAASgB,QAAWY,IAAIhB,cAAAA;AAC5D,iBAAOM;QACT,CAAA,CAAA,GAEFX,OAAOgB,MAAAA;AAET,cAAML,SAAwBmB,QAAQ9B,OAAOgB,MAAAA,EAAQhB,OAAOiB,gBAAAA,EAAkBc,IAAG;AACjF,YAAIpB,QAAQ;AACV,eAAKrC,OAAO0D,IAAIX,IAAIV,MAAAA;AACpB,iBAAOA;QACT;AACA,eAAOkB,aAAaI,wBAAuBC,UAAUX,SAAY,MAAMK,gBAAgBC,WAAW,CAAA;MACpG,GAjBwB;AAmBxB,aAAOD,gBAAgBK,wBAAuBE,QAAQ;IACxD,OAAO;AAEL,UAAI9B,eAAeC,WAAW,GAAG;AAC/B,eAAO,CAAA;MACT;AAEA,YAAMN,SAASG;AAGf,UAAIE,eAAeC,aAAa,GAAG;AACjC,eAAO,MAAM,KAAK9B,eAAeiC,QAAQT,QAAQK,cAAAA;MACnD;AAEA,YAAMK,eAAe;QAAE,GAAGL;QAAgBC,WAAUD,iDAAgBC,YAAW;MAAE;AAEjF,YAAMK,SAAS,MAAMC,QAAQJ,IAC3B,KAAKjC,UAAUsC,IAAI,OAAOpB,aAAAA;AACxB,cAAMkB,UAAc,MAAMlB,SAASgB,QAAWT,QAAQU,YAAAA;AACtD,eAAOC;MACT,CAAA,CAAA;AAEF,YAAMG,aAAkBH,OAAOI,KAAI,EAAGf,OAAOgB,MAAAA;AAC7C,aAAOF,WAAWd,OAAOiB,gBAAAA;IAC3B;EACF;EAEA,MAAMmB,kBAAkBf,IAAsBgB,UAA8D;AAC1G,UAAMnB,UAAUG,GAAGlD,MAAM,GAAA;AACzB,QAAI+C,QAAQC,SAAS,GAAG;AACtB,aAAO,KAAKmB,yBAAyBjB,EAAAA;IACvC;AACA,UAAMS,WACJ,MAAMlB,QAAQJ,IACZ,KAAKjC,UAAUsC,IAAI,OAAOpB,aAAAA;AACxB,YAAMkB,UAAS,MAAMlB,SAAS2C,kBAAkBf,EAAAA;AAChD,aAAOV;IACT,CAAA,CAAA,GAEFX,OAAOgB,MAAAA;AACT,UAAML,SAASmB,QAAQS,MAAK;AAC5B,QAAIT,QAAQX,SAAS,GAAG;AACtB,iBAAWqB,aAAaV,SAAS;AAC/BW,QAAAA,UAASD,cAAc7B,QAAQ,MAAM,4BAA4BU,EAAAA,KAAOV,MAAAA,KAAW6B,SAAAA,GAAY;MACjG;IACF;AACA,WAAO7B;EACT;EAEU2B,yBAAyBI,KAAuBL,UAAiE;AACzH,UAAM,IAAIM,MAAM,yBAAA;EAClB;EAEQnD,gBAAgBJ,QAAyB;AAC/C,QAAIA,QAAQ;AACV,WAAKZ,eAAeW,IAAIC,MAAAA;IAC1B;EACF;EACQU,mBAAmBD,SAAkB;AAC3C,SAAKrB,eAAemB,OAAOE,OAAAA;EAC7B;EAEA,MAAcuB,2BAAsElD,kBAA4D;AAC9I,UAAMgD,UAAUjD,sBAAsBC,gBAAAA;AACtCuE,IAAAA,UAASvB,QAAQC,UAAU,GAAG,MAAM,kCAAA;AACpC,UAAME,KAAKoB,UAASvB,QAAQqB,MAAK,CAAA;AACjC,UAAMnD,SAAS,MAAM,KAAKqB,QAAWY,EAAAA;AACrC,WAAO,OAAMjC,iCAAQqB,QAAWS,QAAQ0B,KAAK,GAAA;EAC/C;EAEA,MAActB,0BAA0BuB,YAA8B;AACpE,QAAIxB,KAAKwB;AACT,eAAWC,eAAe,KAAK5D,gCAAgCd,yBAAwB2E,cAAc;AACnG1B,WAAK,MAAMyB,YAAYE,UAAU3B,EAAAA;IACnC;AACA,WAAOA;EACT;AACF;AAlNUhD;AAGR,cAJWD,0BAIJmC,mBAAkB;AACzB,cALWnC,0BAKJ2E,gBAA8C,CAAA;AALhD,IAAM3E,0BAAN;;;AGrBP,IAAM6E,WAAW,wBAA4CC,aAAAA;AAC3D,QAAMC,YAAgC,CAAA;AACtC,QAAMC,OAAO,wBAACC,OAAyBC,SAAAA;AACrC,QAAIH,UAAUI,WAAW;AAAG,aAAO;AACnCJ,cAAUK,IAAI,CAACC,aAAaA,SAASH,IAAAA,CAAAA;AACrC,WAAO;EACT,GAJa;AAKb,QAAMI,mBAAmB,wBAACC,QAAgBC,WAAAA;AACxC,UAAMN,OAAO;MAAEM;MAAQD;IAAO;AAC9BP,SAAK,kBAAkBE,IAAAA;EACzB,GAHyB;AAKzB,QAAM,EAAEO,QAAO,IAAKX;AACpB,WAASY,gBAAgBF,QAAqB;AAC5C,WAAOC,QAAQE,KAAKb,QAAAA,EAAUU,MAAAA;EAChC;AAFSE;AAIT,SAAO;IACLE,IAAI,CAACX,OAAyBI,aAAAA;AAC5BN,gBAAUc,KAAKR,QAAAA;IACjB;IACAI,SAAS,OAAOD,WAAAA;AACd,YAAMM,UAAoB,MAAMJ,gBAAgBF,MAAAA;AAChD,YAAMO,QAAQC,WAAWF,QAAQV,IAAI,CAACa,QAAQX,iBAAiBW,KAAKT,MAAAA,CAAAA,CAAAA;AACpE,aAAOM;IACT;EACF;AACF,GA3BiB;AA6BV,IAAMI,4BAA4B,wBAA4CpB,aAAAA;AACnF,QAAMqB,QAAQtB,SAASC,QAAAA;AACvB,QAAMsB,MAAMC,OAAOC,OAAOxB,UAAUqB,KAAAA;AACpC,SAAOC;AACT,GAJyC;","names":["assertEx","exists","duplicateModules","ObjectResolverPriority","LRUCache","assertEx","Base","toJsonString","asModuleInstance","ObjectResolverPriority","AbstractModuleResolver","Base","priority","params","ObjectResolverPriority","Normal","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","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","cache","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","resolve","childOptions","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","resolvePriority","priority","results","pop","set","ObjectResolverPriority","VeryLow","VeryHigh","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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/AbstractModuleResolver.ts","../../src/CompositeModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["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 ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n} from '@xyo-network/module-model'\n\nexport interface ModuleResolverParams extends BaseParams {\n priority?: ObjectResolverPriority\n root: ModuleInstance\n}\n\nexport abstract class AbstractModuleResolver<TParams extends ModuleResolverParams = ModuleResolverParams>\n extends Base<TParams>\n implements ModuleResolverInstance\n{\n get priority() {\n return this.params.priority ?? ObjectResolverPriority.Normal\n }\n\n get root() {\n return assertEx(this.params.root, () => 'root is not set')\n }\n\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 async resolvePrivate<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ObjectFilterOptions<T>): Promise<T[]>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ObjectFilterOptions<T>): Promise<T | undefined>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n _options?: ObjectFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n if (id === '*') return await Promise.resolve([])\n }\n\n abstract addResolver(resolver: ModuleResolverInstance): this\n abstract removeResolver(resolver: ModuleResolverInstance): this\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","/* 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 ObjectResolverPriority,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\n\nexport interface CompositeModuleResolverParams extends ModuleResolverParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver<T extends CompositeModuleResolverParams = CompositeModuleResolverParams>\n extends AbstractModuleResolver<T>\n implements ModuleRepository, ModuleResolverInstance\n{\n static defaultMaxDepth = 3\n static transformers: ModuleIdentifierTransformer[] = []\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor(params: T) {\n super(params)\n const localResolver = new SimpleModuleResolver({ root: params.root })\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = params.cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...params.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\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 childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\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 //recursive function to resolve by priority\n const resolvePriority = async (priority: ObjectResolverPriority): Promise<T | undefined> => {\n const resolvers = this.resolvers.filter((resolver) => resolver.priority === priority)\n const results: (T | undefined)[] = (\n await Promise.all(\n resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n ).filter(exists)\n\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n return result\n }\n return priority === ObjectResolverPriority.VeryLow ? undefined : await resolvePriority(priority - 1)\n }\n\n return resolvePriority(ObjectResolverPriority.VeryHigh)\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 childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\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)) ?? (await this.resolvePrivate<T>(id))\n return (await module?.resolve<T>(idParts.join(':'))) ?? (await module?.resolvePrivate<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, 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, ModuleResolverParams } 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(params: ModuleResolverParams) {\n super(params)\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","Base","toJsonString","asModuleInstance","ObjectResolverPriority","AbstractModuleResolver","Base","priority","params","ObjectResolverPriority","Normal","root","assertEx","resolve","idOrFilter","options","values","resolveHandler","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","resolvePrivate","id","_options","Promise","assertEx","exists","duplicateModules","ObjectResolverPriority","LRUCache","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","AbstractModuleResolver","modules","nameToModule","constructor","params","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","params","localResolver","SimpleModuleResolver","root","addResolver","max","ttl","cache","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","resolve","childOptions","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","resolvePriority","priority","results","pop","set","ObjectResolverPriority","VeryLow","VeryHigh","resolveIdentifier","_options","resolveComplexIdentifier","shift","altResult","assertEx","_id","Error","resolvePrivate","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.25",
|
|
17
17
|
"@xylabs/object": "^3.0.25",
|
|
18
18
|
"@xylabs/promise": "^3.0.25",
|
|
19
|
-
"@xyo-network/module-model": "~2.94.
|
|
19
|
+
"@xyo-network/module-model": "~2.94.21",
|
|
20
20
|
"lru-cache": "^10.2.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@xylabs/tsconfig": "^3.9.0",
|
|
25
25
|
"jest": "^29.7.0",
|
|
26
26
|
"jest-mock-extended": "^3.0.5",
|
|
27
|
-
"typescript": "^5.4.
|
|
27
|
+
"typescript": "^5.4.4"
|
|
28
28
|
},
|
|
29
29
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
30
30
|
"types": "dist/node/index.d.ts",
|
|
@@ -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.94.
|
|
68
|
+
"version": "2.94.21",
|
|
69
69
|
"type": "module"
|
|
70
70
|
}
|
|
@@ -8,19 +8,28 @@ import {
|
|
|
8
8
|
ModuleFilterOptions,
|
|
9
9
|
ModuleIdentifier,
|
|
10
10
|
ModuleInstance,
|
|
11
|
-
|
|
11
|
+
ModuleResolverInstance,
|
|
12
12
|
ObjectFilterOptions,
|
|
13
13
|
ObjectResolverPriority,
|
|
14
14
|
} from '@xyo-network/module-model'
|
|
15
15
|
|
|
16
16
|
export interface ModuleResolverParams extends BaseParams {
|
|
17
17
|
priority?: ObjectResolverPriority
|
|
18
|
+
root: ModuleInstance
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
export abstract class AbstractModuleResolver<
|
|
21
|
+
export abstract class AbstractModuleResolver<TParams extends ModuleResolverParams = ModuleResolverParams>
|
|
22
|
+
extends Base<TParams>
|
|
23
|
+
implements ModuleResolverInstance
|
|
24
|
+
{
|
|
21
25
|
get priority() {
|
|
22
26
|
return this.params.priority ?? ObjectResolverPriority.Normal
|
|
23
27
|
}
|
|
28
|
+
|
|
29
|
+
get root() {
|
|
30
|
+
return assertEx(this.params.root, () => 'root is not set')
|
|
31
|
+
}
|
|
32
|
+
|
|
24
33
|
async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>
|
|
25
34
|
async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>
|
|
26
35
|
async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>
|
|
@@ -63,6 +72,18 @@ export abstract class AbstractModuleResolver<T extends ModuleResolverParams = Mo
|
|
|
63
72
|
}
|
|
64
73
|
}
|
|
65
74
|
|
|
75
|
+
async resolvePrivate<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ObjectFilterOptions<T>): Promise<T[]>
|
|
76
|
+
async resolvePrivate<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ObjectFilterOptions<T>): Promise<T | undefined>
|
|
77
|
+
async resolvePrivate<T extends ModuleInstance = ModuleInstance>(
|
|
78
|
+
id: ModuleIdentifier,
|
|
79
|
+
_options?: ObjectFilterOptions<T>,
|
|
80
|
+
): Promise<T | T[] | undefined> {
|
|
81
|
+
if (id === '*') return await Promise.resolve([])
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
abstract addResolver(resolver: ModuleResolverInstance): this
|
|
85
|
+
abstract removeResolver(resolver: ModuleResolverInstance): this
|
|
86
|
+
|
|
66
87
|
abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(
|
|
67
88
|
idOrFilter: ModuleFilter<T> | ModuleIdentifier,
|
|
68
89
|
options?: ModuleFilterOptions<T>,
|