@xyo-network/module-resolver 2.93.1 → 2.93.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/browser/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/browser/index.cjs +22 -6
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +22 -6
- package/dist/browser/index.js.map +1 -1
- package/dist/node/CompositeModuleResolver.d.cts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.mts.map +1 -1
- package/dist/node/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/node/index.cjs +22 -6
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +22 -6
- package/dist/node/index.js.map +1 -1
- package/package.json +2 -2
- package/src/CompositeModuleResolver.ts +35 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EACL,WAAW,EAEX,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAEhB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AAE5D,MAAM,MAAM,+BAA+B,GAAG,CAAC,EAAE,EAAE,gBAAgB,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAA;AAEpG,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,4BAA4B,CAAC,EAAE,2BAA2B,EAAE,CAAA;CAC7D;AAMD,qBAAa,uBAAwB,SAAQ,sBAAsB,CAAC,oBAAoB,CAAE,YAAW,gBAAgB,EAAE,sBAAsB;IAC3I,MAAM,CAAC,eAAe,SAAI;IAC1B,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAA;IAC5D,SAAS,CAAC,SAAS,EAAE,sBAAsB,EAAE,CAAK;IAClD,OAAO,CAAC,cAAc,CAAsB;gBAEhC,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAE,oBAAyB;IAS3D,OAAO,KAAK,4BAA4B,GAEvC;IAED,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IACjC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAUnC,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKnD,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,IAAI;IAS5C,cAAc,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKhD,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC5D,UAAU,GAAE,YAAY,CAAC,CAAC,CAAC,GAAG,gBAAsB,EACpD,OAAO,GAAE,mBAAmB,CAAC,CAAC,CAAM,GACnC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IA4F/B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;YAIZ,0BAA0B;YAQ1B,yBAAyB;CAOxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EACL,WAAW,EAEX,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAEhB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AAE5D,MAAM,MAAM,+BAA+B,GAAG,CAAC,EAAE,EAAE,gBAAgB,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAA;AAEpG,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,4BAA4B,CAAC,EAAE,2BAA2B,EAAE,CAAA;CAC7D;AAMD,qBAAa,uBAAwB,SAAQ,sBAAsB,CAAC,oBAAoB,CAAE,YAAW,gBAAgB,EAAE,sBAAsB;IAC3I,MAAM,CAAC,eAAe,SAAI;IAC1B,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAA;IAC5D,SAAS,CAAC,SAAS,EAAE,sBAAsB,EAAE,CAAK;IAClD,OAAO,CAAC,cAAc,CAAsB;gBAEhC,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAE,oBAAyB;IAS3D,OAAO,KAAK,4BAA4B,GAEvC;IAED,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IACjC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAUnC,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKnD,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,IAAI;IAS5C,cAAc,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKhD,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC5D,UAAU,GAAE,YAAY,CAAC,CAAC,CAAC,GAAG,gBAAsB,EACpD,OAAO,GAAE,mBAAmB,CAAC,CAAC,CAAM,GACnC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IA4F/B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;YAIZ,0BAA0B;YAQ1B,yBAAyB;CAOxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EACL,WAAW,EAEX,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAEhB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AAE5D,MAAM,MAAM,+BAA+B,GAAG,CAAC,EAAE,EAAE,gBAAgB,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAA;AAEpG,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,4BAA4B,CAAC,EAAE,2BAA2B,EAAE,CAAA;CAC7D;AAMD,qBAAa,uBAAwB,SAAQ,sBAAsB,CAAC,oBAAoB,CAAE,YAAW,gBAAgB,EAAE,sBAAsB;IAC3I,MAAM,CAAC,eAAe,SAAI;IAC1B,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAA;IAC5D,SAAS,CAAC,SAAS,EAAE,sBAAsB,EAAE,CAAK;IAClD,OAAO,CAAC,cAAc,CAAsB;gBAEhC,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAE,oBAAyB;IAS3D,OAAO,KAAK,4BAA4B,GAEvC;IAED,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IACjC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAUnC,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKnD,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,IAAI;IAS5C,cAAc,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKhD,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC5D,UAAU,GAAE,YAAY,CAAC,CAAC,CAAC,GAAG,gBAAsB,EACpD,OAAO,GAAE,mBAAmB,CAAC,CAAC,CAAM,GACnC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IA4F/B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;YAIZ,0BAA0B;YAQ1B,yBAAyB;CAOxC"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -237,24 +237,34 @@ var CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMod
|
|
|
237
237
|
this.resolvers = this.resolvers.filter((item) => item !== resolver);
|
|
238
238
|
return this;
|
|
239
239
|
}
|
|
240
|
-
async resolveHandler(idOrFilter = "*", options) {
|
|
240
|
+
async resolveHandler(idOrFilter = "*", options = {}) {
|
|
241
241
|
const mutatedOptions = {
|
|
242
242
|
...options,
|
|
243
|
-
maxDepth:
|
|
243
|
+
maxDepth: options?.maxDepth ?? _CompositeModuleResolver.defaultMaxDepth
|
|
244
|
+
};
|
|
245
|
+
const childOptions = {
|
|
246
|
+
...mutatedOptions,
|
|
247
|
+
maxDepth: mutatedOptions?.maxDepth - 1
|
|
244
248
|
};
|
|
245
249
|
if (idOrFilter === "*") {
|
|
246
250
|
const all = idOrFilter;
|
|
247
251
|
if (mutatedOptions.maxDepth < 0) {
|
|
248
252
|
return [];
|
|
249
253
|
}
|
|
254
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
255
|
+
return await this._localResolver.resolve(all, mutatedOptions);
|
|
256
|
+
}
|
|
250
257
|
const result = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
251
|
-
const result2 = await resolver.resolve(all,
|
|
258
|
+
const result2 = await resolver.resolve(all, childOptions);
|
|
252
259
|
return result2;
|
|
253
260
|
}));
|
|
254
261
|
const flatResult = result.flat().filter(import_exists.exists);
|
|
255
262
|
return flatResult.filter(import_module_model3.duplicateModules);
|
|
256
263
|
}
|
|
257
264
|
if (typeof idOrFilter === "string") {
|
|
265
|
+
if (mutatedOptions.maxDepth < 0) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
258
268
|
const idParts = moduleIdentifierParts(idOrFilter);
|
|
259
269
|
if (idParts.length > 1) {
|
|
260
270
|
return await this.resolveMultipartIdentifier(idOrFilter);
|
|
@@ -271,8 +281,11 @@ var CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMod
|
|
|
271
281
|
return cachedResult;
|
|
272
282
|
}
|
|
273
283
|
}
|
|
284
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
285
|
+
return await this._localResolver.resolve(idOrFilter, mutatedOptions);
|
|
286
|
+
}
|
|
274
287
|
const results = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
275
|
-
const result2 = await resolver.resolve(id,
|
|
288
|
+
const result2 = await resolver.resolve(id, childOptions);
|
|
276
289
|
return result2;
|
|
277
290
|
}));
|
|
278
291
|
const result = results.filter(import_exists.exists).filter(import_module_model3.duplicateModules).pop();
|
|
@@ -281,12 +294,15 @@ var CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMod
|
|
|
281
294
|
}
|
|
282
295
|
return result;
|
|
283
296
|
} else {
|
|
284
|
-
const filter = idOrFilter;
|
|
285
297
|
if (mutatedOptions.maxDepth < 0) {
|
|
286
298
|
return [];
|
|
287
299
|
}
|
|
300
|
+
const filter = idOrFilter;
|
|
301
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
302
|
+
return await this._localResolver.resolve(filter, mutatedOptions);
|
|
303
|
+
}
|
|
288
304
|
const result = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
289
|
-
const result2 = await resolver.resolve(filter,
|
|
305
|
+
const result2 = await resolver.resolve(filter, childOptions);
|
|
290
306
|
return result2;
|
|
291
307
|
}));
|
|
292
308
|
const flatResult = result.flat().filter(import_exists.exists);
|
|
@@ -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","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth) - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, mutatedOptions)\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 //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 const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //resolve filter\n const filter = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, mutatedOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["import_assert","import_module_model","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","import_assert","import_module_model","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","defaultMaxDepth","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","all","result","Promise","map","resolve","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/CompositeModuleResolver.ts","../../src/AbstractModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["export * from './CompositeModuleResolver'\nexport * from './ResolverEventEmitter'\n","/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(all, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(idOrFilter, mutatedOptions)\n }\n\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, childOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["import_assert","import_module_model","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","import_assert","import_module_model","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","defaultMaxDepth","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","childOptions","all","resolve","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -212,24 +212,34 @@ var CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMod
|
|
|
212
212
|
this.resolvers = this.resolvers.filter((item) => item !== resolver);
|
|
213
213
|
return this;
|
|
214
214
|
}
|
|
215
|
-
async resolveHandler(idOrFilter = "*", options) {
|
|
215
|
+
async resolveHandler(idOrFilter = "*", options = {}) {
|
|
216
216
|
const mutatedOptions = {
|
|
217
217
|
...options,
|
|
218
|
-
maxDepth:
|
|
218
|
+
maxDepth: options?.maxDepth ?? _CompositeModuleResolver.defaultMaxDepth
|
|
219
|
+
};
|
|
220
|
+
const childOptions = {
|
|
221
|
+
...mutatedOptions,
|
|
222
|
+
maxDepth: mutatedOptions?.maxDepth - 1
|
|
219
223
|
};
|
|
220
224
|
if (idOrFilter === "*") {
|
|
221
225
|
const all = idOrFilter;
|
|
222
226
|
if (mutatedOptions.maxDepth < 0) {
|
|
223
227
|
return [];
|
|
224
228
|
}
|
|
229
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
230
|
+
return await this._localResolver.resolve(all, mutatedOptions);
|
|
231
|
+
}
|
|
225
232
|
const result = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
226
|
-
const result2 = await resolver.resolve(all,
|
|
233
|
+
const result2 = await resolver.resolve(all, childOptions);
|
|
227
234
|
return result2;
|
|
228
235
|
}));
|
|
229
236
|
const flatResult = result.flat().filter(exists);
|
|
230
237
|
return flatResult.filter(duplicateModules);
|
|
231
238
|
}
|
|
232
239
|
if (typeof idOrFilter === "string") {
|
|
240
|
+
if (mutatedOptions.maxDepth < 0) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
233
243
|
const idParts = moduleIdentifierParts(idOrFilter);
|
|
234
244
|
if (idParts.length > 1) {
|
|
235
245
|
return await this.resolveMultipartIdentifier(idOrFilter);
|
|
@@ -246,8 +256,11 @@ var CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMod
|
|
|
246
256
|
return cachedResult;
|
|
247
257
|
}
|
|
248
258
|
}
|
|
259
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
260
|
+
return await this._localResolver.resolve(idOrFilter, mutatedOptions);
|
|
261
|
+
}
|
|
249
262
|
const results = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
250
|
-
const result2 = await resolver.resolve(id,
|
|
263
|
+
const result2 = await resolver.resolve(id, childOptions);
|
|
251
264
|
return result2;
|
|
252
265
|
}));
|
|
253
266
|
const result = results.filter(exists).filter(duplicateModules).pop();
|
|
@@ -256,12 +269,15 @@ var CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMod
|
|
|
256
269
|
}
|
|
257
270
|
return result;
|
|
258
271
|
} else {
|
|
259
|
-
const filter = idOrFilter;
|
|
260
272
|
if (mutatedOptions.maxDepth < 0) {
|
|
261
273
|
return [];
|
|
262
274
|
}
|
|
275
|
+
const filter = idOrFilter;
|
|
276
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
277
|
+
return await this._localResolver.resolve(filter, mutatedOptions);
|
|
278
|
+
}
|
|
263
279
|
const result = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
264
|
-
const result2 = await resolver.resolve(filter,
|
|
280
|
+
const result2 = await resolver.resolve(filter, childOptions);
|
|
265
281
|
return result2;
|
|
266
282
|
}));
|
|
267
283
|
const flatResult = result.flat().filter(exists);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/CompositeModuleResolver.ts","../../src/AbstractModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth) - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, mutatedOptions)\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 //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 const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //resolve filter\n const filter = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, mutatedOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","exists","duplicateModules","LRUCache","assertEx","Base","toJsonString","asModuleInstance","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","defaultMaxDepth","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","all","result","Promise","map","resolve","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
1
|
+
{"version":3,"sources":["../../src/CompositeModuleResolver.ts","../../src/AbstractModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(all, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(idOrFilter, mutatedOptions)\n }\n\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, childOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","exists","duplicateModules","LRUCache","assertEx","Base","toJsonString","asModuleInstance","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","defaultMaxDepth","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","childOptions","all","resolve","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EACL,WAAW,EAEX,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAEhB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AAE5D,MAAM,MAAM,+BAA+B,GAAG,CAAC,EAAE,EAAE,gBAAgB,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAA;AAEpG,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,4BAA4B,CAAC,EAAE,2BAA2B,EAAE,CAAA;CAC7D;AAMD,qBAAa,uBAAwB,SAAQ,sBAAsB,CAAC,oBAAoB,CAAE,YAAW,gBAAgB,EAAE,sBAAsB;IAC3I,MAAM,CAAC,eAAe,SAAI;IAC1B,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAA;IAC5D,SAAS,CAAC,SAAS,EAAE,sBAAsB,EAAE,CAAK;IAClD,OAAO,CAAC,cAAc,CAAsB;gBAEhC,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAE,oBAAyB;IAS3D,OAAO,KAAK,4BAA4B,GAEvC;IAED,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IACjC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAUnC,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKnD,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,IAAI;IAS5C,cAAc,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKhD,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC5D,UAAU,GAAE,YAAY,CAAC,CAAC,CAAC,GAAG,gBAAsB,EACpD,OAAO,GAAE,mBAAmB,CAAC,CAAC,CAAM,GACnC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IA4F/B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;YAIZ,0BAA0B;YAQ1B,yBAAyB;CAOxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EACL,WAAW,EAEX,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAEhB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AAE5D,MAAM,MAAM,+BAA+B,GAAG,CAAC,EAAE,EAAE,gBAAgB,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAA;AAEpG,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,4BAA4B,CAAC,EAAE,2BAA2B,EAAE,CAAA;CAC7D;AAMD,qBAAa,uBAAwB,SAAQ,sBAAsB,CAAC,oBAAoB,CAAE,YAAW,gBAAgB,EAAE,sBAAsB;IAC3I,MAAM,CAAC,eAAe,SAAI;IAC1B,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAA;IAC5D,SAAS,CAAC,SAAS,EAAE,sBAAsB,EAAE,CAAK;IAClD,OAAO,CAAC,cAAc,CAAsB;gBAEhC,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAE,oBAAyB;IAS3D,OAAO,KAAK,4BAA4B,GAEvC;IAED,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IACjC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAUnC,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKnD,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,IAAI;IAS5C,cAAc,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKhD,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC5D,UAAU,GAAE,YAAY,CAAC,CAAC,CAAC,GAAG,gBAAsB,EACpD,OAAO,GAAE,mBAAmB,CAAC,CAAC,CAAM,GACnC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IA4F/B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;YAIZ,0BAA0B;YAQ1B,yBAAyB;CAOxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CompositeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/CompositeModuleResolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EACL,WAAW,EAEX,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAEhB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AAE5D,MAAM,MAAM,+BAA+B,GAAG,CAAC,EAAE,EAAE,gBAAgB,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAA;AAEpG,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,4BAA4B,CAAC,EAAE,2BAA2B,EAAE,CAAA;CAC7D;AAMD,qBAAa,uBAAwB,SAAQ,sBAAsB,CAAC,oBAAoB,CAAE,YAAW,gBAAgB,EAAE,sBAAsB;IAC3I,MAAM,CAAC,eAAe,SAAI;IAC1B,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAA;IAC5D,SAAS,CAAC,SAAS,EAAE,sBAAsB,EAAE,CAAK;IAClD,OAAO,CAAC,cAAc,CAAsB;gBAEhC,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAE,oBAAyB;IAS3D,OAAO,KAAK,4BAA4B,GAEvC;IAED,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IACjC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAUnC,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKnD,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG,IAAI;IAS5C,cAAc,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAKhD,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC5D,UAAU,GAAE,YAAY,CAAC,CAAC,CAAC,GAAG,gBAAsB,EACpD,OAAO,GAAE,mBAAmB,CAAC,CAAC,CAAM,GACnC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IA4F/B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;YAIZ,0BAA0B;YAQ1B,yBAAyB;CAOxC"}
|
package/dist/node/index.cjs
CHANGED
|
@@ -241,24 +241,34 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
241
241
|
this.resolvers = this.resolvers.filter((item) => item !== resolver);
|
|
242
242
|
return this;
|
|
243
243
|
}
|
|
244
|
-
async resolveHandler(idOrFilter = "*", options) {
|
|
244
|
+
async resolveHandler(idOrFilter = "*", options = {}) {
|
|
245
245
|
const mutatedOptions = {
|
|
246
246
|
...options,
|
|
247
|
-
maxDepth: (
|
|
247
|
+
maxDepth: (options == null ? void 0 : options.maxDepth) ?? _CompositeModuleResolver.defaultMaxDepth
|
|
248
|
+
};
|
|
249
|
+
const childOptions = {
|
|
250
|
+
...mutatedOptions,
|
|
251
|
+
maxDepth: (mutatedOptions == null ? void 0 : mutatedOptions.maxDepth) - 1
|
|
248
252
|
};
|
|
249
253
|
if (idOrFilter === "*") {
|
|
250
254
|
const all = idOrFilter;
|
|
251
255
|
if (mutatedOptions.maxDepth < 0) {
|
|
252
256
|
return [];
|
|
253
257
|
}
|
|
258
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
259
|
+
return await this._localResolver.resolve(all, mutatedOptions);
|
|
260
|
+
}
|
|
254
261
|
const result = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
255
|
-
const result2 = await resolver.resolve(all,
|
|
262
|
+
const result2 = await resolver.resolve(all, childOptions);
|
|
256
263
|
return result2;
|
|
257
264
|
}));
|
|
258
265
|
const flatResult = result.flat().filter(import_exists.exists);
|
|
259
266
|
return flatResult.filter(import_module_model3.duplicateModules);
|
|
260
267
|
}
|
|
261
268
|
if (typeof idOrFilter === "string") {
|
|
269
|
+
if (mutatedOptions.maxDepth < 0) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
262
272
|
const idParts = moduleIdentifierParts(idOrFilter);
|
|
263
273
|
if (idParts.length > 1) {
|
|
264
274
|
return await this.resolveMultipartIdentifier(idOrFilter);
|
|
@@ -275,8 +285,11 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
275
285
|
return cachedResult;
|
|
276
286
|
}
|
|
277
287
|
}
|
|
288
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
289
|
+
return await this._localResolver.resolve(idOrFilter, mutatedOptions);
|
|
290
|
+
}
|
|
278
291
|
const results = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
279
|
-
const result2 = await resolver.resolve(id,
|
|
292
|
+
const result2 = await resolver.resolve(id, childOptions);
|
|
280
293
|
return result2;
|
|
281
294
|
}));
|
|
282
295
|
const result = results.filter(import_exists.exists).filter(import_module_model3.duplicateModules).pop();
|
|
@@ -285,12 +298,15 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
285
298
|
}
|
|
286
299
|
return result;
|
|
287
300
|
} else {
|
|
288
|
-
const filter = idOrFilter;
|
|
289
301
|
if (mutatedOptions.maxDepth < 0) {
|
|
290
302
|
return [];
|
|
291
303
|
}
|
|
304
|
+
const filter = idOrFilter;
|
|
305
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
306
|
+
return await this._localResolver.resolve(filter, mutatedOptions);
|
|
307
|
+
}
|
|
292
308
|
const result = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
293
|
-
const result2 = await resolver.resolve(filter,
|
|
309
|
+
const result2 = await resolver.resolve(filter, childOptions);
|
|
294
310
|
return result2;
|
|
295
311
|
}));
|
|
296
312
|
const flatResult = result.flat().filter(import_exists.exists);
|
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","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth) - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, mutatedOptions)\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 //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 const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //resolve filter\n const filter = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, mutatedOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["import_assert","import_module_model","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","import_assert","import_module_model","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","result","Promise","map","resolve","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/CompositeModuleResolver.ts","../../src/AbstractModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["export * from './CompositeModuleResolver'\nexport * from './ResolverEventEmitter'\n","/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(all, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(idOrFilter, mutatedOptions)\n }\n\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, childOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["import_assert","import_module_model","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","import_assert","import_module_model","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","childOptions","all","resolve","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
package/dist/node/index.js
CHANGED
|
@@ -216,24 +216,34 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
216
216
|
this.resolvers = this.resolvers.filter((item) => item !== resolver);
|
|
217
217
|
return this;
|
|
218
218
|
}
|
|
219
|
-
async resolveHandler(idOrFilter = "*", options) {
|
|
219
|
+
async resolveHandler(idOrFilter = "*", options = {}) {
|
|
220
220
|
const mutatedOptions = {
|
|
221
221
|
...options,
|
|
222
|
-
maxDepth: (
|
|
222
|
+
maxDepth: (options == null ? void 0 : options.maxDepth) ?? _CompositeModuleResolver.defaultMaxDepth
|
|
223
|
+
};
|
|
224
|
+
const childOptions = {
|
|
225
|
+
...mutatedOptions,
|
|
226
|
+
maxDepth: (mutatedOptions == null ? void 0 : mutatedOptions.maxDepth) - 1
|
|
223
227
|
};
|
|
224
228
|
if (idOrFilter === "*") {
|
|
225
229
|
const all = idOrFilter;
|
|
226
230
|
if (mutatedOptions.maxDepth < 0) {
|
|
227
231
|
return [];
|
|
228
232
|
}
|
|
233
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
234
|
+
return await this._localResolver.resolve(all, mutatedOptions);
|
|
235
|
+
}
|
|
229
236
|
const result = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
230
|
-
const result2 = await resolver.resolve(all,
|
|
237
|
+
const result2 = await resolver.resolve(all, childOptions);
|
|
231
238
|
return result2;
|
|
232
239
|
}));
|
|
233
240
|
const flatResult = result.flat().filter(exists);
|
|
234
241
|
return flatResult.filter(duplicateModules);
|
|
235
242
|
}
|
|
236
243
|
if (typeof idOrFilter === "string") {
|
|
244
|
+
if (mutatedOptions.maxDepth < 0) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
237
247
|
const idParts = moduleIdentifierParts(idOrFilter);
|
|
238
248
|
if (idParts.length > 1) {
|
|
239
249
|
return await this.resolveMultipartIdentifier(idOrFilter);
|
|
@@ -250,8 +260,11 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
250
260
|
return cachedResult;
|
|
251
261
|
}
|
|
252
262
|
}
|
|
263
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
264
|
+
return await this._localResolver.resolve(idOrFilter, mutatedOptions);
|
|
265
|
+
}
|
|
253
266
|
const results = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
254
|
-
const result2 = await resolver.resolve(id,
|
|
267
|
+
const result2 = await resolver.resolve(id, childOptions);
|
|
255
268
|
return result2;
|
|
256
269
|
}));
|
|
257
270
|
const result = results.filter(exists).filter(duplicateModules).pop();
|
|
@@ -260,12 +273,15 @@ var _CompositeModuleResolver = class _CompositeModuleResolver extends AbstractMo
|
|
|
260
273
|
}
|
|
261
274
|
return result;
|
|
262
275
|
} else {
|
|
263
|
-
const filter = idOrFilter;
|
|
264
276
|
if (mutatedOptions.maxDepth < 0) {
|
|
265
277
|
return [];
|
|
266
278
|
}
|
|
279
|
+
const filter = idOrFilter;
|
|
280
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
281
|
+
return await this._localResolver.resolve(filter, mutatedOptions);
|
|
282
|
+
}
|
|
267
283
|
const result = await Promise.all(this.resolvers.map(async (resolver) => {
|
|
268
|
-
const result2 = await resolver.resolve(filter,
|
|
284
|
+
const result2 = await resolver.resolve(filter, childOptions);
|
|
269
285
|
return result2;
|
|
270
286
|
}));
|
|
271
287
|
const flatResult = result.flat().filter(exists);
|
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":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: (options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth) - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, mutatedOptions)\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 //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 const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //resolve filter\n const filter = idOrFilter\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, mutatedOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","exists","duplicateModules","LRUCache","assertEx","Base","toJsonString","asModuleInstance","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","result","Promise","map","resolve","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
1
|
+
{"version":3,"sources":["../../src/CompositeModuleResolver.ts","../../src/AbstractModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { BaseParams } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\nimport { ModuleIdentifierTransformer } from './transformers'\n\nexport type ModuleIdentifierTransformerFunc = (id: ModuleIdentifier) => Promisable<ModuleIdentifier>\n\nexport interface ModuleResolverParams extends BaseParams {\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolverParams> implements ModuleRepository, ModuleResolverInstance {\n static defaultMaxDepth = 5\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _localResolver: SimpleModuleResolver\n\n constructor({ cache, ...params }: ModuleResolverParams = {}) {\n super(params)\n const localResolver = new SimpleModuleResolver()\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...cache })\n this._localResolver = localResolver\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(resolver: ModuleResolverInstance): this {\n this.resolvers.push(resolver)\n return this\n }\n\n remove(addresses: Address[] | Address): this {\n if (Array.isArray(addresses)) {\n for (const address of addresses) this.removeSingleModule(address)\n } else {\n this.removeSingleModule(addresses)\n }\n return this\n }\n\n removeResolver(resolver: ModuleResolverInstance): this {\n this.resolvers = this.resolvers.filter((item) => item !== resolver)\n return this\n }\n\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(all, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n return await this.resolveMultipartIdentifier<T>(idOrFilter)\n }\n const id = await this.transformModuleIdentifier(idOrFilter)\n if (mutatedOptions.maxDepth < 0) {\n return undefined\n }\n const cachedResult = this._cache.get(id)\n if (cachedResult) {\n if (cachedResult.status === 'dead') {\n this._cache.delete(id)\n } else {\n return cachedResult as T\n }\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(idOrFilter, mutatedOptions)\n }\n\n const results = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, childOptions)\n return result\n }),\n )\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n }\n return result\n } else {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = await this.resolve<T>(id)\n return await module?.resolve<T>(idParts.join(':'))\n }\n\n private async transformModuleIdentifier(identifier: ModuleIdentifier) {\n let id = identifier\n for (const transformer of this.moduleIdentifierTransformers ?? []) {\n id = await transformer.transform(id)\n }\n return id\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { asModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'\n\nexport abstract class AbstractModuleResolver<T extends BaseParams = BaseParams> extends Base<T> implements ModuleResolver {\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const value = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T | T[] | undefined>\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver } from './AbstractModuleResolver'\n\n//This class is now package private (not exported from index.ts)\nexport class SimpleModuleResolver extends AbstractModuleResolver implements ModuleRepository {\n private addressToName: Record<Address, ModuleName> = {}\n private modules: Record<Address, ModuleInstance> = {}\n\n constructor() {\n super({})\n }\n\n add(module: ModuleInstance): this\n add(module: ModuleInstance[]): this\n add(module: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(module)) {\n for (const mod of module) this.addSingleModule(mod)\n } else {\n this.addSingleModule(module)\n }\n return this\n }\n\n addResolver(_resolver: ModuleResolverInstance): this {\n throw 'Adding resolvers not supported'\n }\n\n remove(address: Address | Address[]): this {\n if (Array.isArray(address)) {\n for (const addr of address) this.removeSingleModule(addr)\n } else {\n this.removeSingleModule(address)\n }\n return this\n }\n\n removeResolver(_resolver: ModuleResolverInstance): this {\n throw 'Removing resolvers not supported'\n }\n\n resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[] | T | undefined> {\n const unfiltered = (() => {\n if (idOrFilter) {\n if (typeof idOrFilter === 'string') {\n if (idOrFilter === '*') {\n return Object.values(this.modules) as T[]\n }\n const id = idOrFilter as ModuleIdentifier\n const name = isModuleName(id) ? id : undefined\n const address = isAddress(id) ? id : undefined\n assertEx(name || address, () => 'module identifier must be a ModuleName or Address')\n return (\n (name ? this.resolveByName<T>(Object.values(this.modules), [name]).pop() : undefined) ??\n (address ? this.resolveByAddress<T>(this.modules, [address]).pop() : undefined)\n )\n } else {\n const filter = idOrFilter\n if (isAddressModuleFilter(filter)) {\n return this.resolveByAddress<T>(this.modules, filter.address)\n } else if (isNameModuleFilter(filter)) {\n return this.resolveByName<T>(Object.values(this.modules), filter.name)\n } else if (isQueryModuleFilter(filter)) {\n return this.resolveByQuery<T>(Object.values(this.modules), filter.query)\n }\n }\n } else {\n return Object.values(this.modules) as T[]\n }\n })()\n const identity = options?.identity\n if (identity) {\n return (\n Array.isArray(unfiltered) ? unfiltered?.filter((module) => identity(module))\n : identity(unfiltered) ? unfiltered\n : undefined\n )\n } else {\n return unfiltered\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n if (address && this.modules[address]) {\n delete this.modules[address]\n const name = this.addressToName[address]\n if (name) {\n delete this.addressToName[address]\n }\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","exists","duplicateModules","LRUCache","assertEx","Base","toJsonString","asModuleInstance","AbstractModuleResolver","Base","resolve","idOrFilter","options","values","resolveHandler","assertEx","Array","isArray","map","value","asModuleInstance","constructor","name","toJsonString","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","AbstractModuleResolver","addressToName","modules","constructor","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","compact","map","find","config","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_localResolver","constructor","cache","params","localResolver","SimpleModuleResolver","addResolver","max","ttl","LRUCache","moduleIdentifierTransformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","childOptions","all","resolve","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","undefined","cachedResult","get","status","delete","results","pop","set","assertEx","shift","join","identifier","transformer","transform","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"@xylabs/lodash": "^3.0.24",
|
|
17
17
|
"@xylabs/object": "^3.0.24",
|
|
18
18
|
"@xylabs/promise": "^3.0.24",
|
|
19
|
-
"@xyo-network/module-model": "~2.93.
|
|
19
|
+
"@xyo-network/module-model": "~2.93.2",
|
|
20
20
|
"lru-cache": "^10.2.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
@@ -65,6 +65,6 @@
|
|
|
65
65
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
66
66
|
},
|
|
67
67
|
"sideEffects": false,
|
|
68
|
-
"version": "2.93.
|
|
68
|
+
"version": "2.93.2",
|
|
69
69
|
"type": "module"
|
|
70
70
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable max-statements */
|
|
1
2
|
import { assertEx } from '@xylabs/assert'
|
|
2
3
|
import { exists } from '@xylabs/exists'
|
|
3
4
|
import { Address } from '@xylabs/hex'
|
|
@@ -82,19 +83,28 @@ export class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolv
|
|
|
82
83
|
|
|
83
84
|
async resolveHandler<T extends ModuleInstance = ModuleInstance>(
|
|
84
85
|
idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',
|
|
85
|
-
options
|
|
86
|
+
options: ModuleFilterOptions<T> = {},
|
|
86
87
|
): Promise<T | T[] | undefined> {
|
|
87
|
-
const mutatedOptions = { ...options, maxDepth:
|
|
88
|
+
const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }
|
|
89
|
+
const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }
|
|
88
90
|
|
|
89
91
|
//resolve all
|
|
90
92
|
if (idOrFilter === '*') {
|
|
91
93
|
const all = idOrFilter
|
|
94
|
+
|
|
95
|
+
//wen't too far?
|
|
92
96
|
if (mutatedOptions.maxDepth < 0) {
|
|
93
97
|
return []
|
|
94
98
|
}
|
|
99
|
+
|
|
100
|
+
//identity resolve?
|
|
101
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
102
|
+
return await this._localResolver.resolve(all, mutatedOptions)
|
|
103
|
+
}
|
|
104
|
+
|
|
95
105
|
const result = await Promise.all(
|
|
96
106
|
this.resolvers.map(async (resolver) => {
|
|
97
|
-
const result: T[] = await resolver.resolve<T>(all,
|
|
107
|
+
const result: T[] = await resolver.resolve<T>(all, childOptions)
|
|
98
108
|
return result
|
|
99
109
|
}),
|
|
100
110
|
)
|
|
@@ -103,6 +113,11 @@ export class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolv
|
|
|
103
113
|
}
|
|
104
114
|
|
|
105
115
|
if (typeof idOrFilter === 'string') {
|
|
116
|
+
//wen't too far?
|
|
117
|
+
if (mutatedOptions.maxDepth < 0) {
|
|
118
|
+
return
|
|
119
|
+
}
|
|
120
|
+
|
|
106
121
|
//resolve ModuleIdentifier
|
|
107
122
|
const idParts = moduleIdentifierParts(idOrFilter)
|
|
108
123
|
if (idParts.length > 1) {
|
|
@@ -120,9 +135,15 @@ export class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolv
|
|
|
120
135
|
return cachedResult as T
|
|
121
136
|
}
|
|
122
137
|
}
|
|
138
|
+
|
|
139
|
+
//identity resolve?
|
|
140
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
141
|
+
return await this._localResolver.resolve(idOrFilter, mutatedOptions)
|
|
142
|
+
}
|
|
143
|
+
|
|
123
144
|
const results = await Promise.all(
|
|
124
145
|
this.resolvers.map(async (resolver) => {
|
|
125
|
-
const result: T | undefined = await resolver.resolve<T>(id,
|
|
146
|
+
const result: T | undefined = await resolver.resolve<T>(id, childOptions)
|
|
126
147
|
return result
|
|
127
148
|
}),
|
|
128
149
|
)
|
|
@@ -132,14 +153,21 @@ export class CompositeModuleResolver extends AbstractModuleResolver<ModuleResolv
|
|
|
132
153
|
}
|
|
133
154
|
return result
|
|
134
155
|
} else {
|
|
135
|
-
//
|
|
136
|
-
const filter = idOrFilter
|
|
156
|
+
//wen't too far?
|
|
137
157
|
if (mutatedOptions.maxDepth < 0) {
|
|
138
158
|
return []
|
|
139
159
|
}
|
|
160
|
+
|
|
161
|
+
const filter = idOrFilter
|
|
162
|
+
|
|
163
|
+
//identity resolve?
|
|
164
|
+
if (mutatedOptions.maxDepth === 0) {
|
|
165
|
+
return await this._localResolver.resolve(filter, mutatedOptions)
|
|
166
|
+
}
|
|
167
|
+
|
|
140
168
|
const result = await Promise.all(
|
|
141
169
|
this.resolvers.map(async (resolver) => {
|
|
142
|
-
const result: T[] = await resolver.resolve<T>(filter,
|
|
170
|
+
const result: T[] = await resolver.resolve<T>(filter, childOptions)
|
|
143
171
|
return result
|
|
144
172
|
}),
|
|
145
173
|
)
|