@xyo-network/module-resolver 2.100.28 → 2.101.0
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/SimpleModuleResolver.d.cts +2 -2
- package/dist/browser/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.mts +2 -2
- package/dist/browser/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/browser/SimpleModuleResolver.d.ts +2 -2
- package/dist/browser/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/browser/index.cjs +16 -16
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +16 -16
- package/dist/browser/index.js.map +1 -1
- package/dist/neutral/SimpleModuleResolver.d.cts +2 -2
- package/dist/neutral/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/neutral/SimpleModuleResolver.d.mts +2 -2
- package/dist/neutral/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/neutral/SimpleModuleResolver.d.ts +2 -2
- package/dist/neutral/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/neutral/index.cjs +16 -16
- package/dist/neutral/index.cjs.map +1 -1
- package/dist/neutral/index.js +16 -16
- package/dist/neutral/index.js.map +1 -1
- package/dist/node/SimpleModuleResolver.d.cts +2 -2
- package/dist/node/SimpleModuleResolver.d.cts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.mts +2 -2
- package/dist/node/SimpleModuleResolver.d.mts.map +1 -1
- package/dist/node/SimpleModuleResolver.d.ts +2 -2
- package/dist/node/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/node/index.cjs +16 -16
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +16 -16
- package/dist/node/index.js.map +1 -1
- package/package.json +4 -4
- package/src/SimpleModuleResolver.ts +18 -18
package/dist/node/index.cjs
CHANGED
|
@@ -106,12 +106,12 @@ var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleRe
|
|
|
106
106
|
get allowNameResolution() {
|
|
107
107
|
return this.params.allowNameResolution ?? true;
|
|
108
108
|
}
|
|
109
|
-
add(
|
|
110
|
-
if (Array.isArray(
|
|
111
|
-
for (const mod of
|
|
109
|
+
add(mods) {
|
|
110
|
+
if (Array.isArray(mods)) {
|
|
111
|
+
for (const mod of mods)
|
|
112
112
|
this.addSingleModule(mod);
|
|
113
113
|
} else {
|
|
114
|
-
this.addSingleModule(
|
|
114
|
+
this.addSingleModule(mods);
|
|
115
115
|
}
|
|
116
116
|
return this;
|
|
117
117
|
}
|
|
@@ -182,23 +182,23 @@ var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleRe
|
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
|
-
addSingleModule(
|
|
186
|
-
if (
|
|
187
|
-
const
|
|
188
|
-
if (
|
|
189
|
-
(0, import_assert2.assertEx)(this.nameToModule[
|
|
190
|
-
this.nameToModule[
|
|
185
|
+
addSingleModule(mod) {
|
|
186
|
+
if (mod) {
|
|
187
|
+
const modName = mod.modName;
|
|
188
|
+
if (modName && this.allowNameResolution) {
|
|
189
|
+
(0, import_assert2.assertEx)(this.nameToModule[modName] === void 0, () => `Module with name ${modName} already added`);
|
|
190
|
+
this.nameToModule[modName] = mod;
|
|
191
191
|
}
|
|
192
|
-
this.modules[
|
|
192
|
+
this.modules[mod.address] = mod;
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
195
|
removeSingleModule(address) {
|
|
196
196
|
(0, import_assert2.assertEx)((0, import_hex.isAddress)(address), () => "Invalid address");
|
|
197
|
-
const
|
|
197
|
+
const mod = (0, import_assert2.assertEx)(this.modules[address], () => "Address not found in modules");
|
|
198
198
|
delete this.modules[address];
|
|
199
|
-
const
|
|
200
|
-
if (
|
|
201
|
-
delete this.nameToModule[
|
|
199
|
+
const modName = mod.modName;
|
|
200
|
+
if (modName) {
|
|
201
|
+
delete this.nameToModule[modName];
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
resolveByAddress(modules, address) {
|
|
@@ -208,7 +208,7 @@ var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleRe
|
|
|
208
208
|
}
|
|
209
209
|
resolveByName(modules, name) {
|
|
210
210
|
return (0, import_lodash.compact)(name.map((name2) => {
|
|
211
|
-
return modules.find((module2) => module2.
|
|
211
|
+
return modules.find((module2) => module2.modName === name2);
|
|
212
212
|
}));
|
|
213
213
|
}
|
|
214
214
|
resolveByQuery(modules, query) {
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/AbstractModuleResolver.ts","../../src/CompositeModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/NameRegistrarTransformer.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["export * from './AbstractModuleResolver'\nexport * from './CompositeModuleResolver'\nexport * from './NameRegistrarTransformer'\nexport * from './ResolverEventEmitter'\nexport * from './SimpleModuleResolver'\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n asModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n} from '@xyo-network/module-model'\n\nexport interface ModuleResolverParams extends BaseParams {\n priority?: ObjectResolverPriority\n root: ModuleInstance\n}\n\nexport abstract class AbstractModuleResolver<TParams extends ModuleResolverParams = ModuleResolverParams>\n extends Base<TParams>\n implements ModuleResolverInstance\n{\n get priority() {\n return this.params.priority ?? ObjectResolverPriority.Normal\n }\n\n set priority(value: ObjectResolverPriority) {\n this.params.priority = value\n }\n\n get root() {\n return assertEx(this.params.root, () => 'root is not set')\n }\n\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = await this.resolveHandler(idOrFilter, options)\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const [value] = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ObjectFilterOptions<T>): Promise<T[]>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ObjectFilterOptions<T>): Promise<T | undefined>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n _options?: ObjectFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n if (id === '*') return await Promise.resolve([])\n }\n\n abstract addResolver(resolver: ModuleResolverInstance): this\n abstract removeResolver(resolver: ModuleResolverInstance): this\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[]>\n\n abstract resolveIdentifier(id: ModuleIdentifier, options?: ObjectFilterOptions): Promisable<Address | undefined>\n}\n","/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleIdentifierTransformer,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n ResolveHelper,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\n\nexport interface CompositeModuleResolverParams extends ModuleResolverParams {\n allowNameResolution?: boolean\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver<T extends CompositeModuleResolverParams = CompositeModuleResolverParams>\n extends AbstractModuleResolver<T>\n implements ModuleRepository, ModuleResolverInstance\n{\n static defaultMaxDepth = 3\n\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _allowAddResolver = true\n private _localResolver: SimpleModuleResolver\n\n constructor(params: T) {\n super(params)\n const localResolver = new SimpleModuleResolver({ allowNameResolution: params.allowNameResolution, root: params.root })\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = params.cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...params.cache })\n this._localResolver = localResolver\n }\n\n get allowAddResolver() {\n return this._allowAddResolver\n }\n\n set allowAddResolver(value: boolean) {\n this.resolvers = [this._localResolver]\n this._allowAddResolver = value\n }\n\n get allowNameResolution() {\n return this.params.allowNameResolution ?? true\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers ?? ResolveHelper.transformers\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 if (this.allowAddResolver) {\n this.resolvers.push(resolver)\n }\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 // eslint-disable-next-line complexity\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T[]> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return (await this._localResolver.resolve(all, mutatedOptions)) ?? []\n }\n\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n const mod = await this.resolveMultipartIdentifier<T>(idOrFilter)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n const id = await ResolveHelper.transformModuleIdentifier(idOrFilter, this.moduleIdentifierTransformers)\n if (id) {\n if (mutatedOptions.maxDepth < 0) {\n return []\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 const mod = await this._localResolver.resolve(idOrFilter, mutatedOptions)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n\n //recursive function to resolve by priority\n const resolvePriority = async (priority: ObjectResolverPriority): Promise<T | undefined> => {\n const resolvers = this.resolvers.filter((resolver) => resolver.priority === priority)\n const results: T[] = (\n await Promise.all(\n resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n ).filter(exists)\n\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n return result\n }\n return priority === ObjectResolverPriority.VeryLow ? undefined : await resolvePriority(priority - 1)\n }\n const mod = await resolvePriority(ObjectResolverPriority.VeryHigh)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n } else if (typeof idOrFilter === 'object') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n return []\n }\n\n async resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promise<Address | undefined> {\n const idParts = id.split(':')\n if (idParts.length > 1) {\n return this.resolveComplexIdentifier(id)\n }\n const results = (\n await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result = await resolver.resolveIdentifier(id)\n return result\n }),\n )\n ).filter(exists)\n const result = results.shift()\n if (results.length > 0) {\n for (const altResult of results) {\n assertEx(altResult === result, () => `Inconsistent results for ${id} [${result}][${altResult}]`)\n }\n }\n return result\n }\n\n protected resolveComplexIdentifier(_id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n throw new Error('Method not implemented.')\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = (await this.resolve<T>(id)) ?? (await this.resolvePrivate<T>(id))\n return (await module?.resolve<T>(idParts.join(':'))) ?? (await module?.resolvePrivate<T>(idParts.join(':')))\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\n\nexport type SimpleModuleResolverParams = ModuleResolverParams & {\n allowNameResolution?: boolean\n}\n\nexport class SimpleModuleResolver extends AbstractModuleResolver<SimpleModuleResolverParams> implements ModuleRepository {\n private modules: Record<Address, ModuleInstance> = {}\n private nameToModule: Record<ModuleName, ModuleInstance> = {}\n\n constructor(params: SimpleModuleResolverParams) {\n super(params)\n }\n\n get allowNameResolution() {\n return this.params.allowNameResolution ?? true\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[]> {\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 : []\n )\n } else {\n return (\n unfiltered ?\n Array.isArray(unfiltered) ?\n unfiltered\n : [unfiltered]\n : []\n )\n }\n }\n\n resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n //check if id is a name of one of modules in the resolver\n const moduleFromName = this.nameToModule[id]\n if (moduleFromName) {\n return moduleFromName.address\n }\n\n //check if any of the modules have the id as an address\n for (const module of Object.values(this.modules)) {\n if (module.address === id) {\n return module.address\n }\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n const name = module.config.name\n if (name && this.allowNameResolution) {\n //check for collision\n assertEx(this.nameToModule[name] === undefined, () => `Module with name ${name} already added`)\n this.nameToModule[name] = module\n }\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n const module = assertEx(this.modules[address], () => 'Address not found in modules')\n delete this.modules[address]\n const name = module.config.name\n if (name) {\n delete this.nameToModule[name]\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Address } from '@xylabs/hex'\nimport { DivinerInstance } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { ModuleIdentifier, ModuleIdentifierTransformer } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nexport class NameRegistrarTransformer implements ModuleIdentifierTransformer {\n private _cache: LRUCache<ModuleIdentifier, ModuleIdentifier> = new LRUCache<ModuleIdentifier, ModuleIdentifier>({ max: 1000, ttl: 1000 * 5 })\n\n constructor(\n private registrarDiviner: DivinerInstance,\n private root: string,\n ) {}\n\n async transform(identifier: ModuleIdentifier): Promise<ModuleIdentifier> {\n const parts = identifier.split(':')\n const first = parts.shift()\n const nameParts = first?.split('.')\n if (nameParts?.length === 2 && nameParts[1] === this.root) {\n //check cache\n const cachedResult = this._cache.get(identifier)\n if (cachedResult) return cachedResult\n\n //not cached, so check registrar\n const query = { domain: nameParts[0], order: 'desc' as const, schema: PayloadDivinerQuerySchema, tld: nameParts[1] }\n const result = await this.registrarDiviner?.divine([query])\n const resultPayload = result?.shift()\n if (!resultPayload) {\n throw new Error(`Unable to resolve registrar name (failed) [${first}]`)\n }\n //TODO: Use proper types for this check\n if (resultPayload) {\n const address = (resultPayload as unknown as { address: Address[] }).address?.shift()\n if (address) {\n this._cache.set(identifier, address)\n return address\n }\n }\n throw new Error(`Unable to resolve registrar name (not found) [${first}]`)\n }\n return identifier\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["AbstractModuleResolver","Base","priority","params","ObjectResolverPriority","Normal","value","root","assertEx","resolve","idOrFilter","options","values","resolveHandler","Array","isArray","map","asModuleInstance","constructor","name","toJsonString","resolvePrivate","id","_options","Promise","import_assert","import_module_model","import_assert","import_module_model","SimpleModuleResolver","AbstractModuleResolver","modules","nameToModule","constructor","params","allowNameResolution","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","resolveIdentifier","_options","moduleFromName","config","compact","map","find","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_allowAddResolver","_localResolver","constructor","params","localResolver","SimpleModuleResolver","allowNameResolution","root","addResolver","max","ttl","cache","LRUCache","allowAddResolver","value","moduleIdentifierTransformers","ResolveHelper","transformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","resolve","childOptions","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","cachedResult","get","status","delete","resolvePriority","priority","results","pop","set","ObjectResolverPriority","VeryLow","undefined","VeryHigh","resolveIdentifier","_options","resolveComplexIdentifier","shift","altResult","assertEx","_id","Error","resolvePrivate","join","import_lru_cache","NameRegistrarTransformer","_cache","constructor","registrarDiviner","root","LRUCache","max","ttl","transform","identifier","parts","split","first","shift","nameParts","length","cachedResult","get","query","domain","order","schema","PayloadDivinerQuerySchema","tld","result","divine","resultPayload","Error","address","set","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/AbstractModuleResolver.ts","../../src/CompositeModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/NameRegistrarTransformer.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["export * from './AbstractModuleResolver'\nexport * from './CompositeModuleResolver'\nexport * from './NameRegistrarTransformer'\nexport * from './ResolverEventEmitter'\nexport * from './SimpleModuleResolver'\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n asModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n} from '@xyo-network/module-model'\n\nexport interface ModuleResolverParams extends BaseParams {\n priority?: ObjectResolverPriority\n root: ModuleInstance\n}\n\nexport abstract class AbstractModuleResolver<TParams extends ModuleResolverParams = ModuleResolverParams>\n extends Base<TParams>\n implements ModuleResolverInstance\n{\n get priority() {\n return this.params.priority ?? ObjectResolverPriority.Normal\n }\n\n set priority(value: ObjectResolverPriority) {\n this.params.priority = value\n }\n\n get root() {\n return assertEx(this.params.root, () => 'root is not set')\n }\n\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = await this.resolveHandler(idOrFilter, options)\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const [value] = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ObjectFilterOptions<T>): Promise<T[]>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ObjectFilterOptions<T>): Promise<T | undefined>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n _options?: ObjectFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n if (id === '*') return await Promise.resolve([])\n }\n\n abstract addResolver(resolver: ModuleResolverInstance): this\n abstract removeResolver(resolver: ModuleResolverInstance): this\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[]>\n\n abstract resolveIdentifier(id: ModuleIdentifier, options?: ObjectFilterOptions): Promisable<Address | undefined>\n}\n","/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleIdentifierTransformer,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n ResolveHelper,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\n\nexport interface CompositeModuleResolverParams extends ModuleResolverParams {\n allowNameResolution?: boolean\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver<T extends CompositeModuleResolverParams = CompositeModuleResolverParams>\n extends AbstractModuleResolver<T>\n implements ModuleRepository, ModuleResolverInstance\n{\n static defaultMaxDepth = 3\n\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _allowAddResolver = true\n private _localResolver: SimpleModuleResolver\n\n constructor(params: T) {\n super(params)\n const localResolver = new SimpleModuleResolver({ allowNameResolution: params.allowNameResolution, root: params.root })\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = params.cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...params.cache })\n this._localResolver = localResolver\n }\n\n get allowAddResolver() {\n return this._allowAddResolver\n }\n\n set allowAddResolver(value: boolean) {\n this.resolvers = [this._localResolver]\n this._allowAddResolver = value\n }\n\n get allowNameResolution() {\n return this.params.allowNameResolution ?? true\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers ?? ResolveHelper.transformers\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 if (this.allowAddResolver) {\n this.resolvers.push(resolver)\n }\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 // eslint-disable-next-line complexity\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T[]> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return (await this._localResolver.resolve(all, mutatedOptions)) ?? []\n }\n\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n const mod = await this.resolveMultipartIdentifier<T>(idOrFilter)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n const id = await ResolveHelper.transformModuleIdentifier(idOrFilter, this.moduleIdentifierTransformers)\n if (id) {\n if (mutatedOptions.maxDepth < 0) {\n return []\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 const mod = await this._localResolver.resolve(idOrFilter, mutatedOptions)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n\n //recursive function to resolve by priority\n const resolvePriority = async (priority: ObjectResolverPriority): Promise<T | undefined> => {\n const resolvers = this.resolvers.filter((resolver) => resolver.priority === priority)\n const results: T[] = (\n await Promise.all(\n resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n ).filter(exists)\n\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n return result\n }\n return priority === ObjectResolverPriority.VeryLow ? undefined : await resolvePriority(priority - 1)\n }\n const mod = await resolvePriority(ObjectResolverPriority.VeryHigh)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n } else if (typeof idOrFilter === 'object') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n return []\n }\n\n async resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promise<Address | undefined> {\n const idParts = id.split(':')\n if (idParts.length > 1) {\n return this.resolveComplexIdentifier(id)\n }\n const results = (\n await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result = await resolver.resolveIdentifier(id)\n return result\n }),\n )\n ).filter(exists)\n const result = results.shift()\n if (results.length > 0) {\n for (const altResult of results) {\n assertEx(altResult === result, () => `Inconsistent results for ${id} [${result}][${altResult}]`)\n }\n }\n return result\n }\n\n protected resolveComplexIdentifier(_id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n throw new Error('Method not implemented.')\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = (await this.resolve<T>(id)) ?? (await this.resolvePrivate<T>(id))\n return (await module?.resolve<T>(idParts.join(':'))) ?? (await module?.resolvePrivate<T>(idParts.join(':')))\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\n\nexport type SimpleModuleResolverParams = ModuleResolverParams & {\n allowNameResolution?: boolean\n}\n\nexport class SimpleModuleResolver extends AbstractModuleResolver<SimpleModuleResolverParams> implements ModuleRepository {\n private modules: Record<Address, ModuleInstance> = {}\n private nameToModule: Record<ModuleName, ModuleInstance> = {}\n\n constructor(params: SimpleModuleResolverParams) {\n super(params)\n }\n\n get allowNameResolution() {\n return this.params.allowNameResolution ?? true\n }\n\n add(mods: ModuleInstance): this\n add(mods: ModuleInstance[]): this\n add(mods: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(mods)) {\n for (const mod of mods) this.addSingleModule(mod)\n } else {\n this.addSingleModule(mods)\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[]> {\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 : []\n )\n } else {\n return (\n unfiltered ?\n Array.isArray(unfiltered) ?\n unfiltered\n : [unfiltered]\n : []\n )\n }\n }\n\n resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n //check if id is a name of one of modules in the resolver\n const moduleFromName = this.nameToModule[id]\n if (moduleFromName) {\n return moduleFromName.address\n }\n\n //check if any of the modules have the id as an address\n for (const module of Object.values(this.modules)) {\n if (module.address === id) {\n return module.address\n }\n }\n }\n\n private addSingleModule(mod?: ModuleInstance) {\n if (mod) {\n const modName = mod.modName\n if (modName && this.allowNameResolution) {\n //check for collision\n assertEx(this.nameToModule[modName] === undefined, () => `Module with name ${modName} already added`)\n this.nameToModule[modName] = mod\n }\n this.modules[mod.address] = mod\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n const mod = assertEx(this.modules[address], () => 'Address not found in modules')\n delete this.modules[address]\n const modName = mod.modName\n if (modName) {\n delete this.nameToModule[modName]\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.modName === 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 { Address } from '@xylabs/hex'\nimport { DivinerInstance } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { ModuleIdentifier, ModuleIdentifierTransformer } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nexport class NameRegistrarTransformer implements ModuleIdentifierTransformer {\n private _cache: LRUCache<ModuleIdentifier, ModuleIdentifier> = new LRUCache<ModuleIdentifier, ModuleIdentifier>({ max: 1000, ttl: 1000 * 5 })\n\n constructor(\n private registrarDiviner: DivinerInstance,\n private root: string,\n ) {}\n\n async transform(identifier: ModuleIdentifier): Promise<ModuleIdentifier> {\n const parts = identifier.split(':')\n const first = parts.shift()\n const nameParts = first?.split('.')\n if (nameParts?.length === 2 && nameParts[1] === this.root) {\n //check cache\n const cachedResult = this._cache.get(identifier)\n if (cachedResult) return cachedResult\n\n //not cached, so check registrar\n const query = { domain: nameParts[0], order: 'desc' as const, schema: PayloadDivinerQuerySchema, tld: nameParts[1] }\n const result = await this.registrarDiviner?.divine([query])\n const resultPayload = result?.shift()\n if (!resultPayload) {\n throw new Error(`Unable to resolve registrar name (failed) [${first}]`)\n }\n //TODO: Use proper types for this check\n if (resultPayload) {\n const address = (resultPayload as unknown as { address: Address[] }).address?.shift()\n if (address) {\n this._cache.set(identifier, address)\n return address\n }\n }\n throw new Error(`Unable to resolve registrar name (not found) [${first}]`)\n }\n return identifier\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["AbstractModuleResolver","Base","priority","params","ObjectResolverPriority","Normal","value","root","assertEx","resolve","idOrFilter","options","values","resolveHandler","Array","isArray","map","asModuleInstance","constructor","name","toJsonString","resolvePrivate","id","_options","Promise","import_assert","import_module_model","import_assert","import_module_model","SimpleModuleResolver","AbstractModuleResolver","modules","nameToModule","constructor","params","allowNameResolution","add","mods","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","module","resolveIdentifier","_options","moduleFromName","modName","compact","map","find","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_allowAddResolver","_localResolver","constructor","params","localResolver","SimpleModuleResolver","allowNameResolution","root","addResolver","max","ttl","cache","LRUCache","allowAddResolver","value","moduleIdentifierTransformers","ResolveHelper","transformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","resolve","childOptions","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","cachedResult","get","status","delete","resolvePriority","priority","results","pop","set","ObjectResolverPriority","VeryLow","undefined","VeryHigh","resolveIdentifier","_options","resolveComplexIdentifier","shift","altResult","assertEx","_id","Error","resolvePrivate","join","import_lru_cache","NameRegistrarTransformer","_cache","constructor","registrarDiviner","root","LRUCache","max","ttl","transform","identifier","parts","split","first","shift","nameParts","length","cachedResult","get","query","domain","order","schema","PayloadDivinerQuerySchema","tld","result","divine","resultPayload","Error","address","set","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
|
@@ -78,12 +78,12 @@ var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleRe
|
|
|
78
78
|
get allowNameResolution() {
|
|
79
79
|
return this.params.allowNameResolution ?? true;
|
|
80
80
|
}
|
|
81
|
-
add(
|
|
82
|
-
if (Array.isArray(
|
|
83
|
-
for (const mod of
|
|
81
|
+
add(mods) {
|
|
82
|
+
if (Array.isArray(mods)) {
|
|
83
|
+
for (const mod of mods)
|
|
84
84
|
this.addSingleModule(mod);
|
|
85
85
|
} else {
|
|
86
|
-
this.addSingleModule(
|
|
86
|
+
this.addSingleModule(mods);
|
|
87
87
|
}
|
|
88
88
|
return this;
|
|
89
89
|
}
|
|
@@ -154,23 +154,23 @@ var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleRe
|
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
|
-
addSingleModule(
|
|
158
|
-
if (
|
|
159
|
-
const
|
|
160
|
-
if (
|
|
161
|
-
assertEx2(this.nameToModule[
|
|
162
|
-
this.nameToModule[
|
|
157
|
+
addSingleModule(mod) {
|
|
158
|
+
if (mod) {
|
|
159
|
+
const modName = mod.modName;
|
|
160
|
+
if (modName && this.allowNameResolution) {
|
|
161
|
+
assertEx2(this.nameToModule[modName] === void 0, () => `Module with name ${modName} already added`);
|
|
162
|
+
this.nameToModule[modName] = mod;
|
|
163
163
|
}
|
|
164
|
-
this.modules[
|
|
164
|
+
this.modules[mod.address] = mod;
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
removeSingleModule(address) {
|
|
168
168
|
assertEx2(isAddress(address), () => "Invalid address");
|
|
169
|
-
const
|
|
169
|
+
const mod = assertEx2(this.modules[address], () => "Address not found in modules");
|
|
170
170
|
delete this.modules[address];
|
|
171
|
-
const
|
|
172
|
-
if (
|
|
173
|
-
delete this.nameToModule[
|
|
171
|
+
const modName = mod.modName;
|
|
172
|
+
if (modName) {
|
|
173
|
+
delete this.nameToModule[modName];
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
resolveByAddress(modules, address) {
|
|
@@ -180,7 +180,7 @@ var _SimpleModuleResolver = class _SimpleModuleResolver extends AbstractModuleRe
|
|
|
180
180
|
}
|
|
181
181
|
resolveByName(modules, name) {
|
|
182
182
|
return compact(name.map((name2) => {
|
|
183
|
-
return modules.find((module) => module.
|
|
183
|
+
return modules.find((module) => module.modName === name2);
|
|
184
184
|
}));
|
|
185
185
|
}
|
|
186
186
|
resolveByQuery(modules, query) {
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/AbstractModuleResolver.ts","../../src/CompositeModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/NameRegistrarTransformer.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n asModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n} from '@xyo-network/module-model'\n\nexport interface ModuleResolverParams extends BaseParams {\n priority?: ObjectResolverPriority\n root: ModuleInstance\n}\n\nexport abstract class AbstractModuleResolver<TParams extends ModuleResolverParams = ModuleResolverParams>\n extends Base<TParams>\n implements ModuleResolverInstance\n{\n get priority() {\n return this.params.priority ?? ObjectResolverPriority.Normal\n }\n\n set priority(value: ObjectResolverPriority) {\n this.params.priority = value\n }\n\n get root() {\n return assertEx(this.params.root, () => 'root is not set')\n }\n\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = await this.resolveHandler(idOrFilter, options)\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const [value] = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ObjectFilterOptions<T>): Promise<T[]>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ObjectFilterOptions<T>): Promise<T | undefined>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n _options?: ObjectFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n if (id === '*') return await Promise.resolve([])\n }\n\n abstract addResolver(resolver: ModuleResolverInstance): this\n abstract removeResolver(resolver: ModuleResolverInstance): this\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[]>\n\n abstract resolveIdentifier(id: ModuleIdentifier, options?: ObjectFilterOptions): Promisable<Address | undefined>\n}\n","/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleIdentifierTransformer,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n ResolveHelper,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\n\nexport interface CompositeModuleResolverParams extends ModuleResolverParams {\n allowNameResolution?: boolean\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver<T extends CompositeModuleResolverParams = CompositeModuleResolverParams>\n extends AbstractModuleResolver<T>\n implements ModuleRepository, ModuleResolverInstance\n{\n static defaultMaxDepth = 3\n\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _allowAddResolver = true\n private _localResolver: SimpleModuleResolver\n\n constructor(params: T) {\n super(params)\n const localResolver = new SimpleModuleResolver({ allowNameResolution: params.allowNameResolution, root: params.root })\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = params.cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...params.cache })\n this._localResolver = localResolver\n }\n\n get allowAddResolver() {\n return this._allowAddResolver\n }\n\n set allowAddResolver(value: boolean) {\n this.resolvers = [this._localResolver]\n this._allowAddResolver = value\n }\n\n get allowNameResolution() {\n return this.params.allowNameResolution ?? true\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers ?? ResolveHelper.transformers\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 if (this.allowAddResolver) {\n this.resolvers.push(resolver)\n }\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 // eslint-disable-next-line complexity\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T[]> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return (await this._localResolver.resolve(all, mutatedOptions)) ?? []\n }\n\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n const mod = await this.resolveMultipartIdentifier<T>(idOrFilter)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n const id = await ResolveHelper.transformModuleIdentifier(idOrFilter, this.moduleIdentifierTransformers)\n if (id) {\n if (mutatedOptions.maxDepth < 0) {\n return []\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 const mod = await this._localResolver.resolve(idOrFilter, mutatedOptions)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n\n //recursive function to resolve by priority\n const resolvePriority = async (priority: ObjectResolverPriority): Promise<T | undefined> => {\n const resolvers = this.resolvers.filter((resolver) => resolver.priority === priority)\n const results: T[] = (\n await Promise.all(\n resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n ).filter(exists)\n\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n return result\n }\n return priority === ObjectResolverPriority.VeryLow ? undefined : await resolvePriority(priority - 1)\n }\n const mod = await resolvePriority(ObjectResolverPriority.VeryHigh)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n } else if (typeof idOrFilter === 'object') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n return []\n }\n\n async resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promise<Address | undefined> {\n const idParts = id.split(':')\n if (idParts.length > 1) {\n return this.resolveComplexIdentifier(id)\n }\n const results = (\n await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result = await resolver.resolveIdentifier(id)\n return result\n }),\n )\n ).filter(exists)\n const result = results.shift()\n if (results.length > 0) {\n for (const altResult of results) {\n assertEx(altResult === result, () => `Inconsistent results for ${id} [${result}][${altResult}]`)\n }\n }\n return result\n }\n\n protected resolveComplexIdentifier(_id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n throw new Error('Method not implemented.')\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = (await this.resolve<T>(id)) ?? (await this.resolvePrivate<T>(id))\n return (await module?.resolve<T>(idParts.join(':'))) ?? (await module?.resolvePrivate<T>(idParts.join(':')))\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\n\nexport type SimpleModuleResolverParams = ModuleResolverParams & {\n allowNameResolution?: boolean\n}\n\nexport class SimpleModuleResolver extends AbstractModuleResolver<SimpleModuleResolverParams> implements ModuleRepository {\n private modules: Record<Address, ModuleInstance> = {}\n private nameToModule: Record<ModuleName, ModuleInstance> = {}\n\n constructor(params: SimpleModuleResolverParams) {\n super(params)\n }\n\n get allowNameResolution() {\n return this.params.allowNameResolution ?? true\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[]> {\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 : []\n )\n } else {\n return (\n unfiltered ?\n Array.isArray(unfiltered) ?\n unfiltered\n : [unfiltered]\n : []\n )\n }\n }\n\n resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n //check if id is a name of one of modules in the resolver\n const moduleFromName = this.nameToModule[id]\n if (moduleFromName) {\n return moduleFromName.address\n }\n\n //check if any of the modules have the id as an address\n for (const module of Object.values(this.modules)) {\n if (module.address === id) {\n return module.address\n }\n }\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n const name = module.config.name\n if (name && this.allowNameResolution) {\n //check for collision\n assertEx(this.nameToModule[name] === undefined, () => `Module with name ${name} already added`)\n this.nameToModule[name] = module\n }\n this.modules[module.address] = module\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n const module = assertEx(this.modules[address], () => 'Address not found in modules')\n delete this.modules[address]\n const name = module.config.name\n if (name) {\n delete this.nameToModule[name]\n }\n }\n\n private resolveByAddress<T extends ModuleInstance = ModuleInstance>(modules: Record<Address, ModuleInstance>, address: Address[]): T[] {\n return compact(\n address.map((address) => {\n return modules[address]\n }),\n ) as T[]\n }\n\n private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {\n return compact(\n name.map((name) => {\n return modules.find((module) => module.config.name === name)\n }),\n ) as T[]\n }\n\n private resolveByQuery<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], query: string[][]): T[] {\n return compact(\n modules.filter((module) =>\n query?.reduce((supported, queryList) => {\n return (\n // eslint-disable-next-line unicorn/no-array-reduce\n queryList.reduce((supported, query) => {\n const queryable = module.queries.includes(query)\n return supported && queryable\n }, true) || supported\n )\n }, false),\n ),\n ) as T[]\n }\n}\n","import { Address } from '@xylabs/hex'\nimport { DivinerInstance } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { ModuleIdentifier, ModuleIdentifierTransformer } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nexport class NameRegistrarTransformer implements ModuleIdentifierTransformer {\n private _cache: LRUCache<ModuleIdentifier, ModuleIdentifier> = new LRUCache<ModuleIdentifier, ModuleIdentifier>({ max: 1000, ttl: 1000 * 5 })\n\n constructor(\n private registrarDiviner: DivinerInstance,\n private root: string,\n ) {}\n\n async transform(identifier: ModuleIdentifier): Promise<ModuleIdentifier> {\n const parts = identifier.split(':')\n const first = parts.shift()\n const nameParts = first?.split('.')\n if (nameParts?.length === 2 && nameParts[1] === this.root) {\n //check cache\n const cachedResult = this._cache.get(identifier)\n if (cachedResult) return cachedResult\n\n //not cached, so check registrar\n const query = { domain: nameParts[0], order: 'desc' as const, schema: PayloadDivinerQuerySchema, tld: nameParts[1] }\n const result = await this.registrarDiviner?.divine([query])\n const resultPayload = result?.shift()\n if (!resultPayload) {\n throw new Error(`Unable to resolve registrar name (failed) [${first}]`)\n }\n //TODO: Use proper types for this check\n if (resultPayload) {\n const address = (resultPayload as unknown as { address: Address[] }).address?.shift()\n if (address) {\n this._cache.set(identifier, address)\n return address\n }\n }\n throw new Error(`Unable to resolve registrar name (not found) [${first}]`)\n }\n return identifier\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","Base","toJsonString","asModuleInstance","ObjectResolverPriority","AbstractModuleResolver","Base","priority","params","ObjectResolverPriority","Normal","value","root","assertEx","resolve","idOrFilter","options","values","resolveHandler","Array","isArray","map","asModuleInstance","constructor","name","toJsonString","resolvePrivate","id","_options","Promise","assertEx","exists","duplicateModules","ObjectResolverPriority","ResolveHelper","LRUCache","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","AbstractModuleResolver","modules","nameToModule","constructor","params","allowNameResolution","add","module","Array","isArray","mod","addSingleModule","addResolver","_resolver","remove","address","addr","removeSingleModule","removeResolver","resolveHandler","idOrFilter","options","unfiltered","Object","values","id","name","isModuleName","undefined","isAddress","assertEx","resolveByName","pop","resolveByAddress","filter","isAddressModuleFilter","isNameModuleFilter","isQueryModuleFilter","resolveByQuery","query","identity","resolveIdentifier","_options","moduleFromName","config","compact","map","find","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_allowAddResolver","_localResolver","constructor","params","localResolver","SimpleModuleResolver","allowNameResolution","root","addResolver","max","ttl","cache","LRUCache","allowAddResolver","value","moduleIdentifierTransformers","ResolveHelper","transformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","resolve","childOptions","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","cachedResult","get","status","delete","resolvePriority","priority","results","pop","set","ObjectResolverPriority","VeryLow","undefined","VeryHigh","resolveIdentifier","_options","resolveComplexIdentifier","shift","altResult","assertEx","_id","Error","resolvePrivate","join","PayloadDivinerQuerySchema","LRUCache","NameRegistrarTransformer","_cache","constructor","registrarDiviner","root","LRUCache","max","ttl","transform","identifier","parts","split","first","shift","nameParts","length","cachedResult","get","query","domain","order","schema","PayloadDivinerQuerySchema","tld","result","divine","resultPayload","Error","address","set","getMixin","resolver","listeners","emit","event","args","length","map","listener","onModuleResolved","module","filter","resolve","originalResolve","bind","on","push","modules","Promise","allSettled","mod","mixinResolverEventEmitter","mixin","ret","Object","assign"]}
|
|
1
|
+
{"version":3,"sources":["../../src/AbstractModuleResolver.ts","../../src/CompositeModuleResolver.ts","../../src/SimpleModuleResolver.ts","../../src/NameRegistrarTransformer.ts","../../src/ResolverEventEmitter.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Base, BaseParams, toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport {\n asModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n} from '@xyo-network/module-model'\n\nexport interface ModuleResolverParams extends BaseParams {\n priority?: ObjectResolverPriority\n root: ModuleInstance\n}\n\nexport abstract class AbstractModuleResolver<TParams extends ModuleResolverParams = ModuleResolverParams>\n extends Base<TParams>\n implements ModuleResolverInstance\n{\n get priority() {\n return this.params.priority ?? ObjectResolverPriority.Normal\n }\n\n set priority(value: ObjectResolverPriority) {\n this.params.priority = value\n }\n\n get root() {\n return assertEx(this.params.root, () => 'root is not set')\n }\n\n async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter<T>, options?: ModuleFilterOptions<T>): Promise<T[]>\n async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | string = '*',\n options?: ModuleFilterOptions<T>,\n ): Promise<T[] | T | undefined> {\n if (idOrFilter === '*') {\n const values = await this.resolveHandler(idOrFilter, options)\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (*) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const [value] = await this.resolveHandler(idOrFilter, options)\n return asModuleInstance<T>(\n value,\n () =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n `resolveHandler returned invalid result (string) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`,\n )\n }\n default: {\n const values = (await this.resolveHandler(idOrFilter, options)) as []\n assertEx(Array.isArray(values), () => 'resolveHandler returned a non-array')\n return values.map((value) =>\n asModuleInstance<T>(value, () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return `resolveHandler returned invalid result (filter) [${(value as any)?.constructor?.name}][${toJsonString(value)}]`\n }),\n )\n }\n }\n }\n\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ObjectFilterOptions<T>): Promise<T[]>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ObjectFilterOptions<T>): Promise<T | undefined>\n async resolvePrivate<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n _options?: ObjectFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n if (id === '*') return await Promise.resolve([])\n }\n\n abstract addResolver(resolver: ModuleResolverInstance): this\n abstract removeResolver(resolver: ModuleResolverInstance): this\n\n abstract resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promisable<T[]>\n\n abstract resolveIdentifier(id: ModuleIdentifier, options?: ObjectFilterOptions): Promisable<Address | undefined>\n}\n","/* eslint-disable max-statements */\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport {\n CacheConfig,\n duplicateModules,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleIdentifierPart,\n ModuleIdentifierTransformer,\n ModuleInstance,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n ObjectResolverPriority,\n ResolveHelper,\n} from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\nimport { SimpleModuleResolver } from './SimpleModuleResolver'\n\nexport interface CompositeModuleResolverParams extends ModuleResolverParams {\n allowNameResolution?: boolean\n cache?: CacheConfig\n moduleIdentifierTransformers?: ModuleIdentifierTransformer[]\n}\n\nconst moduleIdentifierParts = (moduleIdentifier: ModuleIdentifier): ModuleIdentifierPart[] => {\n return moduleIdentifier?.split(':') as ModuleIdentifierPart[]\n}\n\nexport class CompositeModuleResolver<T extends CompositeModuleResolverParams = CompositeModuleResolverParams>\n extends AbstractModuleResolver<T>\n implements ModuleRepository, ModuleResolverInstance\n{\n static defaultMaxDepth = 3\n\n protected _cache: LRUCache<ModuleIdentifier, ModuleInstance>\n protected resolvers: ModuleResolverInstance[] = []\n private _allowAddResolver = true\n private _localResolver: SimpleModuleResolver\n\n constructor(params: T) {\n super(params)\n const localResolver = new SimpleModuleResolver({ allowNameResolution: params.allowNameResolution, root: params.root })\n this.addResolver(localResolver)\n const { max = 100, ttl = 1000 * 5 /* five seconds */ } = params.cache ?? {}\n this._cache = new LRUCache<ModuleIdentifier, ModuleInstance>({ max, ttl, ...params.cache })\n this._localResolver = localResolver\n }\n\n get allowAddResolver() {\n return this._allowAddResolver\n }\n\n set allowAddResolver(value: boolean) {\n this.resolvers = [this._localResolver]\n this._allowAddResolver = value\n }\n\n get allowNameResolution() {\n return this.params.allowNameResolution ?? true\n }\n\n private get moduleIdentifierTransformers() {\n return this.params.moduleIdentifierTransformers ?? ResolveHelper.transformers\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 if (this.allowAddResolver) {\n this.resolvers.push(resolver)\n }\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 // eslint-disable-next-line complexity\n async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T[]> {\n const mutatedOptions = { ...options, maxDepth: options?.maxDepth ?? CompositeModuleResolver.defaultMaxDepth }\n\n //resolve all\n if (idOrFilter === '*') {\n const all = idOrFilter\n\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return (await this._localResolver.resolve(all, mutatedOptions)) ?? []\n }\n\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(all, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n\n if (typeof idOrFilter === 'string') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n //resolve ModuleIdentifier\n const idParts = moduleIdentifierParts(idOrFilter)\n if (idParts.length > 1) {\n const mod = await this.resolveMultipartIdentifier<T>(idOrFilter)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n const id = await ResolveHelper.transformModuleIdentifier(idOrFilter, this.moduleIdentifierTransformers)\n if (id) {\n if (mutatedOptions.maxDepth < 0) {\n return []\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 const mod = await this._localResolver.resolve(idOrFilter, mutatedOptions)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n\n //recursive function to resolve by priority\n const resolvePriority = async (priority: ObjectResolverPriority): Promise<T | undefined> => {\n const resolvers = this.resolvers.filter((resolver) => resolver.priority === priority)\n const results: T[] = (\n await Promise.all(\n resolvers.map(async (resolver) => {\n const result: T | undefined = await resolver.resolve<T>(id, mutatedOptions)\n return result\n }),\n )\n ).filter(exists)\n\n const result: T | undefined = results.filter(exists).filter(duplicateModules).pop()\n if (result) {\n this._cache.set(id, result)\n return result\n }\n return priority === ObjectResolverPriority.VeryLow ? undefined : await resolvePriority(priority - 1)\n }\n const mod = await resolvePriority(ObjectResolverPriority.VeryHigh)\n return (\n mod ?\n Array.isArray(mod) ?\n mod\n : [mod]\n : []\n )\n }\n } else if (typeof idOrFilter === 'object') {\n //wen't too far?\n if (mutatedOptions.maxDepth < 0) {\n return []\n }\n\n const filter = idOrFilter\n\n //identity resolve?\n if (mutatedOptions.maxDepth === 0) {\n return await this._localResolver.resolve(filter, mutatedOptions)\n }\n\n const childOptions = { ...mutatedOptions, maxDepth: mutatedOptions?.maxDepth - 1 }\n\n const result = await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result: T[] = await resolver.resolve<T>(filter, childOptions)\n return result\n }),\n )\n const flatResult: T[] = result.flat().filter(exists)\n return flatResult.filter(duplicateModules)\n }\n return []\n }\n\n async resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promise<Address | undefined> {\n const idParts = id.split(':')\n if (idParts.length > 1) {\n return this.resolveComplexIdentifier(id)\n }\n const results = (\n await Promise.all(\n this.resolvers.map(async (resolver) => {\n const result = await resolver.resolveIdentifier(id)\n return result\n }),\n )\n ).filter(exists)\n const result = results.shift()\n if (results.length > 0) {\n for (const altResult of results) {\n assertEx(altResult === result, () => `Inconsistent results for ${id} [${result}][${altResult}]`)\n }\n }\n return result\n }\n\n protected resolveComplexIdentifier(_id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n throw new Error('Method not implemented.')\n }\n\n private addSingleModule(module?: ModuleInstance) {\n if (module) {\n this._localResolver.add(module)\n }\n }\n private removeSingleModule(address: Address) {\n this._localResolver.remove(address)\n }\n\n private async resolveMultipartIdentifier<T extends ModuleInstance = ModuleInstance>(moduleIdentifier: ModuleIdentifier): Promise<T | undefined> {\n const idParts = moduleIdentifierParts(moduleIdentifier)\n assertEx(idParts.length >= 2, () => 'Not a valid multipart identifier')\n const id = assertEx(idParts.shift())\n const module = (await this.resolve<T>(id)) ?? (await this.resolvePrivate<T>(id))\n return (await module?.resolve<T>(idParts.join(':'))) ?? (await module?.resolvePrivate<T>(idParts.join(':')))\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable } from '@xylabs/promise'\nimport {\n isAddressModuleFilter,\n isModuleName,\n isNameModuleFilter,\n isQueryModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleName,\n ModuleRepository,\n ModuleResolverInstance,\n ObjectFilterOptions,\n} from '@xyo-network/module-model'\n\nimport { AbstractModuleResolver, ModuleResolverParams } from './AbstractModuleResolver'\n\nexport type SimpleModuleResolverParams = ModuleResolverParams & {\n allowNameResolution?: boolean\n}\n\nexport class SimpleModuleResolver extends AbstractModuleResolver<SimpleModuleResolverParams> implements ModuleRepository {\n private modules: Record<Address, ModuleInstance> = {}\n private nameToModule: Record<ModuleName, ModuleInstance> = {}\n\n constructor(params: SimpleModuleResolverParams) {\n super(params)\n }\n\n get allowNameResolution() {\n return this.params.allowNameResolution ?? true\n }\n\n add(mods: ModuleInstance): this\n add(mods: ModuleInstance[]): this\n add(mods: ModuleInstance | ModuleInstance[]): this {\n if (Array.isArray(mods)) {\n for (const mod of mods) this.addSingleModule(mod)\n } else {\n this.addSingleModule(mods)\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[]> {\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 : []\n )\n } else {\n return (\n unfiltered ?\n Array.isArray(unfiltered) ?\n unfiltered\n : [unfiltered]\n : []\n )\n }\n }\n\n resolveIdentifier(id: ModuleIdentifier, _options?: ObjectFilterOptions): Promisable<Address | undefined> {\n //check if id is a name of one of modules in the resolver\n const moduleFromName = this.nameToModule[id]\n if (moduleFromName) {\n return moduleFromName.address\n }\n\n //check if any of the modules have the id as an address\n for (const module of Object.values(this.modules)) {\n if (module.address === id) {\n return module.address\n }\n }\n }\n\n private addSingleModule(mod?: ModuleInstance) {\n if (mod) {\n const modName = mod.modName\n if (modName && this.allowNameResolution) {\n //check for collision\n assertEx(this.nameToModule[modName] === undefined, () => `Module with name ${modName} already added`)\n this.nameToModule[modName] = mod\n }\n this.modules[mod.address] = mod\n }\n }\n\n private removeSingleModule(address: Address) {\n assertEx(isAddress(address), () => 'Invalid address')\n const mod = assertEx(this.modules[address], () => 'Address not found in modules')\n delete this.modules[address]\n const modName = mod.modName\n if (modName) {\n delete this.nameToModule[modName]\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.modName === 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 { Address } from '@xylabs/hex'\nimport { DivinerInstance } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { ModuleIdentifier, ModuleIdentifierTransformer } from '@xyo-network/module-model'\nimport { LRUCache } from 'lru-cache'\n\nexport class NameRegistrarTransformer implements ModuleIdentifierTransformer {\n private _cache: LRUCache<ModuleIdentifier, ModuleIdentifier> = new LRUCache<ModuleIdentifier, ModuleIdentifier>({ max: 1000, ttl: 1000 * 5 })\n\n constructor(\n private registrarDiviner: DivinerInstance,\n private root: string,\n ) {}\n\n async transform(identifier: ModuleIdentifier): Promise<ModuleIdentifier> {\n const parts = identifier.split(':')\n const first = parts.shift()\n const nameParts = first?.split('.')\n if (nameParts?.length === 2 && nameParts[1] === this.root) {\n //check cache\n const cachedResult = this._cache.get(identifier)\n if (cachedResult) return cachedResult\n\n //not cached, so check registrar\n const query = { domain: nameParts[0], order: 'desc' as const, schema: PayloadDivinerQuerySchema, tld: nameParts[1] }\n const result = await this.registrarDiviner?.divine([query])\n const resultPayload = result?.shift()\n if (!resultPayload) {\n throw new Error(`Unable to resolve registrar name (failed) [${first}]`)\n }\n //TODO: Use proper types for this check\n if (resultPayload) {\n const address = (resultPayload as unknown as { address: Address[] }).address?.shift()\n if (address) {\n this._cache.set(identifier, address)\n return address\n }\n }\n throw new Error(`Unable to resolve registrar name (not found) [${first}]`)\n }\n return identifier\n }\n}\n","import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'\n\nexport interface ModuleResolvedEventArgs {\n filter?: ModuleFilter\n module: Module\n}\n\nexport interface ResolverEventEmitter {\n on(event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void): void\n}\n\ntype ListenerFunction = (args: ModuleResolvedEventArgs) => void\n\nconst getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {\n const listeners: ListenerFunction[] = []\n const emit = (event: 'moduleResolved', args: ModuleResolvedEventArgs): boolean => {\n if (listeners.length === 0) return false\n listeners.map((listener) => listener(args))\n return true\n }\n const onModuleResolved = (module: Module, filter?: ModuleFilter) => {\n const args = { filter, module }\n emit('moduleResolved', args)\n }\n // eslint-disable-next-line deprecation/deprecation\n const { resolve } = resolver\n function originalResolve(filter?: ModuleFilter) {\n return resolve.bind(resolver)(filter)\n }\n\n return {\n on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {\n listeners.push(listener)\n },\n resolve: async (filter?: ModuleFilter): Promise<Module[]> => {\n const modules: Module[] = await originalResolve(filter)\n await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))\n return modules\n },\n }\n}\n\nexport const mixinResolverEventEmitter = <T extends ModuleResolver = ModuleResolver>(resolver: T): T & ResolverEventEmitter => {\n const mixin = getMixin(resolver)\n const ret = Object.assign(resolver, mixin)\n return ret\n}\n"],"mappings":"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","names":["assertEx","Base","toJsonString","asModuleInstance","ObjectResolverPriority","AbstractModuleResolver","Base","priority","params","ObjectResolverPriority","Normal","value","root","assertEx","resolve","idOrFilter","options","values","resolveHandler","Array","isArray","map","asModuleInstance","constructor","name","toJsonString","resolvePrivate","id","_options","Promise","assertEx","exists","duplicateModules","ObjectResolverPriority","ResolveHelper","LRUCache","assertEx","isAddress","compact","isAddressModuleFilter","isModuleName","isNameModuleFilter","isQueryModuleFilter","SimpleModuleResolver","AbstractModuleResolver","modules","nameToModule","constructor","params","allowNameResolution","add","mods","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","module","resolveIdentifier","_options","moduleFromName","modName","compact","map","find","reduce","supported","queryList","queryable","queries","includes","moduleIdentifierParts","moduleIdentifier","split","CompositeModuleResolver","AbstractModuleResolver","_cache","resolvers","_allowAddResolver","_localResolver","constructor","params","localResolver","SimpleModuleResolver","allowNameResolution","root","addResolver","max","ttl","cache","LRUCache","allowAddResolver","value","moduleIdentifierTransformers","ResolveHelper","transformers","add","module","Array","isArray","mod","addSingleModule","resolver","push","remove","addresses","address","removeSingleModule","removeResolver","filter","item","resolveHandler","idOrFilter","options","mutatedOptions","maxDepth","defaultMaxDepth","all","resolve","childOptions","result","Promise","map","flatResult","flat","exists","duplicateModules","idParts","length","resolveMultipartIdentifier","id","transformModuleIdentifier","cachedResult","get","status","delete","resolvePriority","priority","results","pop","set","ObjectResolverPriority","VeryLow","undefined","VeryHigh","resolveIdentifier","_options","resolveComplexIdentifier","shift","altResult","assertEx","_id","Error","resolvePrivate","join","PayloadDivinerQuerySchema","LRUCache","NameRegistrarTransformer","_cache","constructor","registrarDiviner","root","LRUCache","max","ttl","transform","identifier","parts","split","first","shift","nameParts","length","cachedResult","get","query","domain","order","schema","PayloadDivinerQuerySchema","tld","result","divine","resultPayload","Error","address","set","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,9 +16,9 @@
|
|
|
16
16
|
"@xylabs/lodash": "^3.3.3",
|
|
17
17
|
"@xylabs/object": "^3.3.3",
|
|
18
18
|
"@xylabs/promise": "^3.3.3",
|
|
19
|
-
"@xyo-network/diviner-model": "~2.
|
|
20
|
-
"@xyo-network/diviner-payload-model": "~2.
|
|
21
|
-
"@xyo-network/module-model": "~2.
|
|
19
|
+
"@xyo-network/diviner-model": "~2.101.0",
|
|
20
|
+
"@xyo-network/diviner-payload-model": "~2.101.0",
|
|
21
|
+
"@xyo-network/module-model": "~2.101.0",
|
|
22
22
|
"lru-cache": "^10.2.2"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
@@ -67,6 +67,6 @@
|
|
|
67
67
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
68
68
|
},
|
|
69
69
|
"sideEffects": false,
|
|
70
|
-
"version": "2.
|
|
70
|
+
"version": "2.101.0",
|
|
71
71
|
"type": "module"
|
|
72
72
|
}
|
|
@@ -35,13 +35,13 @@ export class SimpleModuleResolver extends AbstractModuleResolver<SimpleModuleRes
|
|
|
35
35
|
return this.params.allowNameResolution ?? true
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
add(
|
|
39
|
-
add(
|
|
40
|
-
add(
|
|
41
|
-
if (Array.isArray(
|
|
42
|
-
for (const mod of
|
|
38
|
+
add(mods: ModuleInstance): this
|
|
39
|
+
add(mods: ModuleInstance[]): this
|
|
40
|
+
add(mods: ModuleInstance | ModuleInstance[]): this {
|
|
41
|
+
if (Array.isArray(mods)) {
|
|
42
|
+
for (const mod of mods) this.addSingleModule(mod)
|
|
43
43
|
} else {
|
|
44
|
-
this.addSingleModule(
|
|
44
|
+
this.addSingleModule(mods)
|
|
45
45
|
}
|
|
46
46
|
return this
|
|
47
47
|
}
|
|
@@ -128,25 +128,25 @@ export class SimpleModuleResolver extends AbstractModuleResolver<SimpleModuleRes
|
|
|
128
128
|
}
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
-
private addSingleModule(
|
|
132
|
-
if (
|
|
133
|
-
const
|
|
134
|
-
if (
|
|
131
|
+
private addSingleModule(mod?: ModuleInstance) {
|
|
132
|
+
if (mod) {
|
|
133
|
+
const modName = mod.modName
|
|
134
|
+
if (modName && this.allowNameResolution) {
|
|
135
135
|
//check for collision
|
|
136
|
-
assertEx(this.nameToModule[
|
|
137
|
-
this.nameToModule[
|
|
136
|
+
assertEx(this.nameToModule[modName] === undefined, () => `Module with name ${modName} already added`)
|
|
137
|
+
this.nameToModule[modName] = mod
|
|
138
138
|
}
|
|
139
|
-
this.modules[
|
|
139
|
+
this.modules[mod.address] = mod
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
private removeSingleModule(address: Address) {
|
|
144
144
|
assertEx(isAddress(address), () => 'Invalid address')
|
|
145
|
-
const
|
|
145
|
+
const mod = assertEx(this.modules[address], () => 'Address not found in modules')
|
|
146
146
|
delete this.modules[address]
|
|
147
|
-
const
|
|
148
|
-
if (
|
|
149
|
-
delete this.nameToModule[
|
|
147
|
+
const modName = mod.modName
|
|
148
|
+
if (modName) {
|
|
149
|
+
delete this.nameToModule[modName]
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
|
|
@@ -161,7 +161,7 @@ export class SimpleModuleResolver extends AbstractModuleResolver<SimpleModuleRes
|
|
|
161
161
|
private resolveByName<T extends ModuleInstance = ModuleInstance>(modules: ModuleInstance[], name: ModuleName[]): T[] {
|
|
162
162
|
return compact(
|
|
163
163
|
name.map((name) => {
|
|
164
|
-
return modules.find((module) => module.
|
|
164
|
+
return modules.find((module) => module.modName === name)
|
|
165
165
|
}),
|
|
166
166
|
) as T[]
|
|
167
167
|
}
|