@xyo-network/module-abstract 2.66.2 → 2.66.4

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.
Files changed (29) hide show
  1. package/dist/cjs/AbstractIndirectModule.js +19 -15
  2. package/dist/cjs/AbstractIndirectModule.js.map +1 -1
  3. package/dist/cjs/QueryValidator/SupportedQueryValidator.js.map +1 -1
  4. package/dist/cjs/Resolver/CompositeModuleResolver.js.map +1 -1
  5. package/dist/cjs/Resolver/ResolverEventEmitter.js.map +1 -1
  6. package/dist/cjs/Resolver/SimpleModuleResolver.js.map +1 -1
  7. package/dist/docs.json +3377 -3591
  8. package/dist/esm/AbstractIndirectModule.js +18 -14
  9. package/dist/esm/AbstractIndirectModule.js.map +1 -1
  10. package/dist/esm/QueryValidator/SupportedQueryValidator.js.map +1 -1
  11. package/dist/esm/Resolver/CompositeModuleResolver.js.map +1 -1
  12. package/dist/esm/Resolver/ResolverEventEmitter.js.map +1 -1
  13. package/dist/esm/Resolver/SimpleModuleResolver.js.map +1 -1
  14. package/dist/types/AbstractIndirectModule.d.ts +9 -9
  15. package/dist/types/AbstractIndirectModule.d.ts.map +1 -1
  16. package/dist/types/QueryValidator/SupportedQueryValidator.d.ts +4 -4
  17. package/dist/types/QueryValidator/SupportedQueryValidator.d.ts.map +1 -1
  18. package/dist/types/Resolver/CompositeModuleResolver.d.ts +5 -5
  19. package/dist/types/Resolver/CompositeModuleResolver.d.ts.map +1 -1
  20. package/dist/types/Resolver/ResolverEventEmitter.d.ts +2 -2
  21. package/dist/types/Resolver/ResolverEventEmitter.d.ts.map +1 -1
  22. package/dist/types/Resolver/SimpleModuleResolver.d.ts +5 -5
  23. package/dist/types/Resolver/SimpleModuleResolver.d.ts.map +1 -1
  24. package/package.json +19 -20
  25. package/src/AbstractIndirectModule.ts +33 -31
  26. package/src/QueryValidator/SupportedQueryValidator.ts +3 -3
  27. package/src/Resolver/CompositeModuleResolver.ts +10 -12
  28. package/src/Resolver/ResolverEventEmitter.ts +5 -5
  29. package/src/Resolver/SimpleModuleResolver.ts +18 -20
@@ -4,8 +4,7 @@ import { exists } from '@xylabs/exists'
4
4
  import { HDWallet } from '@xyo-network/account'
5
5
  import { AccountInstance } from '@xyo-network/account-model'
6
6
  import { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'
7
- import { ArchivistInstance } from '@xyo-network/archivist-model'
8
- import { IndirectArchivistWrapper } from '@xyo-network/archivist-wrapper'
7
+ import { ArchivistInstance, asArchivistInstance } from '@xyo-network/archivist-model'
9
8
  import { BoundWitnessBuilder, QueryBoundWitness, QueryBoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'
10
9
  import { BoundWitness } from '@xyo-network/boundwitness-model'
11
10
  import { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'
@@ -18,8 +17,8 @@ import {
18
17
  CreatableModule,
19
18
  CreatableModuleFactory,
20
19
  duplicateModules,
21
- IndirectModule,
22
20
  IndividualArchivistConfig,
21
+ Module,
23
22
  ModuleAddressQuerySchema,
24
23
  ModuleBusyEventArgs,
25
24
  ModuleConfig,
@@ -58,11 +57,11 @@ import { CompositeModuleResolver } from './Resolver'
58
57
  /** @description Abstract class for modules that allow access only through querying and not through direct calls */
59
58
  export abstract class AbstractIndirectModule<TParams extends ModuleParams = ModuleParams, TEventData extends ModuleEventData = ModuleEventData>
60
59
  extends BaseEmitter<TParams, TEventData>
61
- implements IndirectModule<TParams, TEventData>, IndirectModule
60
+ implements Module<TParams, TEventData>, Module
62
61
  {
63
62
  static configSchemas: string[]
64
63
  static enableBusy = false
65
- static enableLazyLoad = true
64
+ static enableLazyLoad = false
66
65
 
67
66
  protected static privateConstructorKey = Date.now().toString()
68
67
 
@@ -84,8 +83,8 @@ export abstract class AbstractIndirectModule<TParams extends ModuleParams = Modu
84
83
  [ModuleManifestQuerySchema]: undefined,
85
84
  [ModuleSubscribeQuerySchema]: undefined,
86
85
  }
87
- protected _started: Promise<boolean> | true | undefined = undefined
88
- protected _starting: Promise<boolean> | true | undefined = undefined
86
+ protected _startPromise: Promisable<boolean> | undefined = undefined
87
+ protected _started: Promisable<boolean> | undefined = undefined
89
88
  protected readonly moduleConfigQueryValidator: Queryable
90
89
  protected readonly supportedQueryValidator: Queryable
91
90
 
@@ -97,7 +96,7 @@ export abstract class AbstractIndirectModule<TParams extends ModuleParams = Modu
97
96
  const mutatedParams = { ...params } as TParams
98
97
  super(mutatedParams)
99
98
 
100
- this.supportedQueryValidator = new SupportedQueryValidator(this as IndirectModule).queryable
99
+ this.supportedQueryValidator = new SupportedQueryValidator(this as Module).queryable
101
100
  this.moduleConfigQueryValidator = new ModuleConfigQueryValidator(mutatedParams?.config).queryable
102
101
  }
103
102
 
@@ -139,7 +138,7 @@ export abstract class AbstractIndirectModule<TParams extends ModuleParams = Modu
139
138
 
140
139
  protected abstract get _queryAccountPaths(): Record<Query['schema'], string>
141
140
 
142
- static async create<TModule extends IndirectModule>(this: CreatableModule<TModule>, params?: TModule['params']) {
141
+ static async create<TModule extends Module>(this: CreatableModule<TModule>, params?: TModule['params']) {
143
142
  if (!this.configSchemas || this.configSchemas.length === 0) {
144
143
  throw Error(`Missing configSchema [${params?.config?.schema}][${this.name}]`)
145
144
  }
@@ -154,14 +153,14 @@ export abstract class AbstractIndirectModule<TParams extends ModuleParams = Modu
154
153
  params?.logger?.debug(`config: ${JSON.stringify(mutatedConfig, null, 2)}`)
155
154
  const mutatedParams = { ...params, config: mutatedConfig } as TModule['params']
156
155
  const newModule = new this(AbstractIndirectModule.privateConstructorKey, mutatedParams)
156
+ await newModule.loadAccount?.()
157
157
  if (!AbstractIndirectModule.enableLazyLoad) {
158
158
  await newModule.start?.()
159
159
  }
160
- await newModule.loadAccount?.()
161
160
  return newModule
162
161
  }
163
162
 
164
- static factory<TModule extends IndirectModule>(this: CreatableModule<TModule>, params?: TModule['params']): CreatableModuleFactory<TModule> {
163
+ static factory<TModule extends Module>(this: CreatableModule<TModule>, params?: TModule['params']): CreatableModuleFactory<TModule> {
165
164
  return ModuleFactory.withParams(this, params)
166
165
  }
167
166
 
@@ -200,7 +199,7 @@ export abstract class AbstractIndirectModule<TParams extends ModuleParams = Modu
200
199
  if (!account) console.warn(`AbstractModule.loadAccount: No account provided - Creating Random account [${this.config.schema}]`)
201
200
  this._account = account ?? (await HDWallet.random())
202
201
  }
203
- this.downResolver.add(this as IndirectModule)
202
+ this.downResolver.add(this as Module)
204
203
  return this._account
205
204
  }
206
205
 
@@ -238,43 +237,40 @@ export abstract class AbstractIndirectModule<TParams extends ModuleParams = Modu
238
237
  return validators.every((validator) => validator(query, payloads))
239
238
  }
240
239
 
241
- async resolve<TModule extends IndirectModule = IndirectModule>(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<TModule[]>
242
- async resolve<TModule extends IndirectModule = IndirectModule>(nameOrAddress: string, options?: ModuleFilterOptions): Promise<TModule | undefined>
243
- async resolve<TModule extends IndirectModule = IndirectModule>(
244
- nameOrAddressOrFilter?: ModuleFilter | string,
245
- options?: ModuleFilterOptions,
246
- ): Promise<TModule | TModule[] | undefined> {
240
+ async resolve(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<Module[]>
241
+ async resolve(nameOrAddress: string, options?: ModuleFilterOptions): Promise<Module | undefined>
242
+ async resolve(nameOrAddressOrFilter?: ModuleFilter | string, options?: ModuleFilterOptions): Promise<Module | Module[] | undefined> {
247
243
  const direction = options?.direction ?? 'all'
248
244
  const up = direction === 'up' || direction === 'all'
249
245
  const down = direction === 'down' || direction === 'all'
250
246
  switch (typeof nameOrAddressOrFilter) {
251
247
  case 'string': {
252
248
  return (
253
- (down ? await this.downResolver.resolve<TModule>(nameOrAddressOrFilter) : undefined) ??
254
- (up ? await this.upResolver.resolve<TModule>(nameOrAddressOrFilter) : undefined)
249
+ (down ? await this.downResolver.resolve(nameOrAddressOrFilter) : undefined) ??
250
+ (up ? await this.upResolver.resolve(nameOrAddressOrFilter) : undefined)
255
251
  )
256
252
  }
257
253
  default: {
258
254
  const filter: ModuleFilter | undefined = nameOrAddressOrFilter
259
- return [
260
- ...(down ? await this.downResolver.resolve<TModule>(filter) : []),
261
- ...(up ? await this.upResolver.resolve<TModule>(filter) : []),
262
- ].filter(duplicateModules)
255
+ return [...(down ? await this.downResolver.resolve(filter) : []), ...(up ? await this.upResolver.resolve(filter) : [])].filter(
256
+ duplicateModules,
257
+ )
263
258
  }
264
259
  }
265
260
  }
266
261
 
267
- start(_timeout?: number): Promise<boolean> | boolean {
262
+ start(_timeout?: number): Promisable<boolean> {
268
263
  //using promise as mutex
269
- this._starting = this._starting ?? this.startHandler()
270
- return this._starting
264
+ this._startPromise = this._startPromise ?? this.startHandler()
265
+ return this._startPromise
271
266
  }
272
267
 
273
268
  async started(notStartedAction: 'error' | 'throw' | 'warn' | 'log' | 'none' = 'log', tryStart = true): Promise<boolean> {
274
- if (this._started === true) {
269
+ const started = await this._started
270
+ if (started === true) {
275
271
  return true
276
272
  }
277
- if (!this._started) {
273
+ if (!started) {
278
274
  //using promise as mutex
279
275
  this._started = (async () => {
280
276
  if (tryStart) {
@@ -308,12 +304,18 @@ export abstract class AbstractIndirectModule<TParams extends ModuleParams = Modu
308
304
  return false
309
305
  })()
310
306
  }
307
+ if (!this._started) {
308
+ throw 'Failed to create start promise'
309
+ }
311
310
  return await this._started
312
311
  }
313
312
 
314
313
  async stop(_timeout?: number): Promise<boolean> {
315
314
  return await this.busy(async () => {
316
- return await this.stopHandler()
315
+ const result = await this.stopHandler()
316
+ this._started = undefined
317
+ this._startPromise = undefined
318
+ return result
317
319
  })
318
320
  }
319
321
 
@@ -567,6 +569,6 @@ export abstract class AbstractIndirectModule<TParams extends ModuleParams = Modu
567
569
  ? (this.config.archivist as string)
568
570
  : (this.config?.archivist?.[kind] as string)
569
571
  const resolved = await this.upResolver.resolve(filter)
570
- return resolved ? IndirectArchivistWrapper.wrap(resolved, this.account) : undefined
572
+ return asArchivistInstance(resolved)
571
573
  }
572
574
  }
@@ -1,11 +1,11 @@
1
1
  import { QueryBoundWitness, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'
2
- import { IndirectModule, ModuleQuery } from '@xyo-network/module-model'
2
+ import { Module, ModuleQuery } from '@xyo-network/module-model'
3
3
  import { Payload } from '@xyo-network/payload-model'
4
4
 
5
5
  import { Queryable, QueryValidator } from './QueryValidator'
6
6
 
7
7
  export const isQuerySupportedByModule = async <T extends QueryBoundWitness = QueryBoundWitness>(
8
- mod: IndirectModule,
8
+ mod: Module,
9
9
  query: T,
10
10
  payloads?: Payload[],
11
11
  ): Promise<boolean> => {
@@ -15,7 +15,7 @@ export const isQuerySupportedByModule = async <T extends QueryBoundWitness = Que
15
15
  }
16
16
 
17
17
  export class SupportedQueryValidator implements QueryValidator {
18
- constructor(protected readonly mod: IndirectModule) {}
18
+ constructor(protected readonly mod: Module) {}
19
19
  queryable: Queryable = (query, payloads) => {
20
20
  return isQuerySupportedByModule(this.mod, query, payloads)
21
21
  }
@@ -1,6 +1,6 @@
1
1
  import { exists } from '@xylabs/exists'
2
2
  import { Base, BaseParams } from '@xyo-network/core'
3
- import { duplicateModules, IndirectModule, ModuleFilter, ModuleRepository, ModuleResolver } from '@xyo-network/module-model'
3
+ import { duplicateModules, Module, ModuleFilter, ModuleRepository, ModuleResolver } from '@xyo-network/module-model'
4
4
 
5
5
  import { SimpleModuleResolver } from './SimpleModuleResolver'
6
6
 
@@ -19,9 +19,9 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M
19
19
  return true
20
20
  }
21
21
 
22
- add(module: IndirectModule): this
23
- add(module: IndirectModule[]): this
24
- add(module: IndirectModule | IndirectModule[]): this {
22
+ add(module: Module): this
23
+ add(module: Module[]): this
24
+ add(module: Module | Module[]): this {
25
25
  if (Array.isArray(module)) {
26
26
  module.forEach((module) => this.addSingleModule(module))
27
27
  } else {
@@ -49,22 +49,20 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M
49
49
  return this
50
50
  }
51
51
 
52
- async resolve<TModule extends IndirectModule = IndirectModule>(filter?: ModuleFilter): Promise<TModule[]>
53
- async resolve<TModule extends IndirectModule = IndirectModule>(nameOrAddress: string): Promise<TModule | undefined>
54
- async resolve<TModule extends IndirectModule = IndirectModule>(
55
- nameOrAddressOrFilter?: ModuleFilter | string,
56
- ): Promise<TModule | TModule[] | undefined> {
52
+ async resolve(filter?: ModuleFilter): Promise<Module[]>
53
+ async resolve(nameOrAddress: string): Promise<Module | undefined>
54
+ async resolve(nameOrAddressOrFilter?: ModuleFilter | string): Promise<Module | Module[] | undefined> {
57
55
  if (typeof nameOrAddressOrFilter === 'string') {
58
56
  const result = await Promise.all(
59
57
  this.resolvers.map(async (resolver) => {
60
- return await resolver.resolve<TModule>(nameOrAddressOrFilter)
58
+ return await resolver.resolve(nameOrAddressOrFilter)
61
59
  }),
62
60
  )
63
61
  return result.filter(exists).filter(duplicateModules).pop()
64
62
  } else {
65
63
  const result = await Promise.all(
66
64
  this.resolvers.map(async (resolver) => {
67
- return await resolver.resolve<TModule>(nameOrAddressOrFilter)
65
+ return await resolver.resolve(nameOrAddressOrFilter)
68
66
  }),
69
67
  )
70
68
  const flatResult = result.flat()
@@ -72,7 +70,7 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M
72
70
  }
73
71
  }
74
72
 
75
- private addSingleModule(module?: IndirectModule) {
73
+ private addSingleModule(module?: Module) {
76
74
  if (module) {
77
75
  this.localResolver.add(module)
78
76
  }
@@ -1,8 +1,8 @@
1
- import { IndirectModule, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'
1
+ import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module-model'
2
2
 
3
3
  export interface ModuleResolvedEventArgs {
4
4
  filter?: ModuleFilter
5
- module: IndirectModule
5
+ module: Module
6
6
  }
7
7
 
8
8
  export interface ResolverEventEmitter {
@@ -18,7 +18,7 @@ const getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {
18
18
  listeners.map((listener) => listener(args))
19
19
  return true
20
20
  }
21
- const onModuleResolved = (module: IndirectModule, filter?: ModuleFilter) => {
21
+ const onModuleResolved = (module: Module, filter?: ModuleFilter) => {
22
22
  const args = { filter, module }
23
23
  emit('moduleResolved', args)
24
24
  }
@@ -31,8 +31,8 @@ const getMixin = <T extends ModuleResolver = ModuleResolver>(resolver: T) => {
31
31
  on: (event: 'moduleResolved', listener: (args: ModuleResolvedEventArgs) => void) => {
32
32
  listeners.push(listener)
33
33
  },
34
- resolve: async (filter?: ModuleFilter): Promise<IndirectModule[]> => {
35
- const modules: IndirectModule[] = await originalResolve(filter)
34
+ resolve: async (filter?: ModuleFilter): Promise<Module[]> => {
35
+ const modules: Module[] = await originalResolve(filter)
36
36
  await Promise.allSettled(modules.map((mod) => onModuleResolved(mod, filter)))
37
37
  return modules
38
38
  },
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AddressModuleFilter,
3
- IndirectModule,
3
+ Module,
4
4
  ModuleFilter,
5
5
  ModuleRepository,
6
6
  ModuleResolver,
@@ -14,15 +14,15 @@ import flatten from 'lodash/flatten'
14
14
  //This class is now package private (not exported from index.ts)
15
15
  export class SimpleModuleResolver implements ModuleRepository {
16
16
  private addressToName: Record<string, string> = {}
17
- private modules: Record<string, IndirectModule> = {}
17
+ private modules: Record<string, Module> = {}
18
18
 
19
19
  get isModuleResolver() {
20
20
  return true
21
21
  }
22
22
 
23
- add(module: IndirectModule): this
24
- add(module: IndirectModule[]): this
25
- add(module: IndirectModule | IndirectModule[]): this {
23
+ add(module: Module): this
24
+ add(module: Module[]): this
25
+ add(module: Module | Module[]): this {
26
26
  if (Array.isArray(module)) {
27
27
  module.forEach((module) => this.addSingleModule(module))
28
28
  } else {
@@ -48,30 +48,28 @@ export class SimpleModuleResolver implements ModuleRepository {
48
48
  throw 'Removing resolvers not supported'
49
49
  }
50
50
 
51
- resolve<TModule extends IndirectModule = IndirectModule>(filter?: ModuleFilter): Promisable<TModule[]>
52
- resolve<TModule extends IndirectModule = IndirectModule>(nameOrAddress: string): Promisable<TModule | undefined>
53
- resolve<TModule extends IndirectModule = IndirectModule>(
54
- nameOrAddressOrFilter?: ModuleFilter | string,
55
- ): Promisable<TModule | TModule[] | undefined> {
51
+ resolve(filter?: ModuleFilter): Promisable<Module[]>
52
+ resolve(nameOrAddress: string): Promisable<Module | undefined>
53
+ resolve(nameOrAddressOrFilter?: ModuleFilter | string): Promisable<Module | Module[] | undefined> {
56
54
  if (nameOrAddressOrFilter) {
57
55
  if (typeof nameOrAddressOrFilter === 'string') {
58
56
  return (
59
- this.resolveByName(Object.values(this.modules) as TModule[], [nameOrAddressOrFilter]).pop() ??
60
- this.resolveByAddress(Object.values(this.modules) as TModule[], [nameOrAddressOrFilter]).pop()
57
+ this.resolveByName(Object.values(this.modules), [nameOrAddressOrFilter]).pop() ??
58
+ this.resolveByAddress(Object.values(this.modules), [nameOrAddressOrFilter]).pop()
61
59
  )
62
60
  } else if ((nameOrAddressOrFilter as AddressModuleFilter).address) {
63
- return this.resolveByAddress<TModule>(Object.values(this.modules) as TModule[], (nameOrAddressOrFilter as AddressModuleFilter).address)
61
+ return this.resolveByAddress(Object.values(this.modules), (nameOrAddressOrFilter as AddressModuleFilter).address)
64
62
  } else if ((nameOrAddressOrFilter as NameModuleFilter).name) {
65
- return this.resolveByName<TModule>(Object.values(this.modules) as TModule[], (nameOrAddressOrFilter as NameModuleFilter).name)
63
+ return this.resolveByName(Object.values(this.modules), (nameOrAddressOrFilter as NameModuleFilter).name)
66
64
  } else if ((nameOrAddressOrFilter as QueryModuleFilter).query) {
67
- return this.resolveByQuery<TModule>(Object.values(this.modules) as TModule[], (nameOrAddressOrFilter as QueryModuleFilter).query)
65
+ return this.resolveByQuery(Object.values(this.modules), (nameOrAddressOrFilter as QueryModuleFilter).query)
68
66
  }
69
67
  } else {
70
- return Object.values(this.modules) as TModule[]
68
+ return Object.values(this.modules)
71
69
  }
72
70
  }
73
71
 
74
- private addSingleModule(module?: IndirectModule) {
72
+ private addSingleModule(module?: Module) {
75
73
  if (module) {
76
74
  this.modules[module.address] = module
77
75
  }
@@ -89,7 +87,7 @@ export class SimpleModuleResolver implements ModuleRepository {
89
87
  }
90
88
  }
91
89
 
92
- private resolveByAddress<T extends IndirectModule = IndirectModule>(modules: T[], address?: string[]): T[] {
90
+ private resolveByAddress<T extends Module = Module>(modules: T[], address?: string[]): T[] {
93
91
  return address
94
92
  ? compact(
95
93
  flatten(
@@ -101,14 +99,14 @@ export class SimpleModuleResolver implements ModuleRepository {
101
99
  : modules
102
100
  }
103
101
 
104
- private resolveByName<T extends IndirectModule = IndirectModule>(modules: T[], name?: string[]): T[] {
102
+ private resolveByName<T extends Module = Module>(modules: T[], name?: string[]): T[] {
105
103
  if (name) {
106
104
  return compact(name.map((name) => modules.filter((module) => module.config.name === name)).flat())
107
105
  }
108
106
  return modules
109
107
  }
110
108
 
111
- private resolveByQuery<T extends IndirectModule = IndirectModule>(modules: T[], query?: string[][]): T[] {
109
+ private resolveByQuery<T extends Module = Module>(modules: T[], query?: string[][]): T[] {
112
110
  return query
113
111
  ? compact(
114
112
  modules.filter((module) =>