@xyo-network/module-abstract 2.93.0-rc.1 → 2.93.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.
Files changed (48) hide show
  1. package/dist/browser/AbstractModule.d.cts +4 -11
  2. package/dist/browser/AbstractModule.d.cts.map +1 -1
  3. package/dist/browser/AbstractModule.d.mts +4 -11
  4. package/dist/browser/AbstractModule.d.mts.map +1 -1
  5. package/dist/browser/AbstractModule.d.ts +4 -11
  6. package/dist/browser/AbstractModule.d.ts.map +1 -1
  7. package/dist/browser/AbstractModuleInstance.d.cts +13 -3
  8. package/dist/browser/AbstractModuleInstance.d.cts.map +1 -1
  9. package/dist/browser/AbstractModuleInstance.d.mts +13 -3
  10. package/dist/browser/AbstractModuleInstance.d.mts.map +1 -1
  11. package/dist/browser/AbstractModuleInstance.d.ts +13 -3
  12. package/dist/browser/AbstractModuleInstance.d.ts.map +1 -1
  13. package/dist/browser/ResolveHelper.d.cts +6 -1
  14. package/dist/browser/ResolveHelper.d.cts.map +1 -1
  15. package/dist/browser/ResolveHelper.d.mts +6 -1
  16. package/dist/browser/ResolveHelper.d.mts.map +1 -1
  17. package/dist/browser/ResolveHelper.d.ts +6 -1
  18. package/dist/browser/ResolveHelper.d.ts.map +1 -1
  19. package/dist/browser/index.cjs +174 -146
  20. package/dist/browser/index.cjs.map +1 -1
  21. package/dist/browser/index.js +141 -113
  22. package/dist/browser/index.js.map +1 -1
  23. package/dist/node/AbstractModule.d.cts +4 -11
  24. package/dist/node/AbstractModule.d.cts.map +1 -1
  25. package/dist/node/AbstractModule.d.mts +4 -11
  26. package/dist/node/AbstractModule.d.mts.map +1 -1
  27. package/dist/node/AbstractModule.d.ts +4 -11
  28. package/dist/node/AbstractModule.d.ts.map +1 -1
  29. package/dist/node/AbstractModuleInstance.d.cts +13 -3
  30. package/dist/node/AbstractModuleInstance.d.cts.map +1 -1
  31. package/dist/node/AbstractModuleInstance.d.mts +13 -3
  32. package/dist/node/AbstractModuleInstance.d.mts.map +1 -1
  33. package/dist/node/AbstractModuleInstance.d.ts +13 -3
  34. package/dist/node/AbstractModuleInstance.d.ts.map +1 -1
  35. package/dist/node/ResolveHelper.d.cts +6 -1
  36. package/dist/node/ResolveHelper.d.cts.map +1 -1
  37. package/dist/node/ResolveHelper.d.mts +6 -1
  38. package/dist/node/ResolveHelper.d.mts.map +1 -1
  39. package/dist/node/ResolveHelper.d.ts +6 -1
  40. package/dist/node/ResolveHelper.d.ts.map +1 -1
  41. package/dist/node/index.cjs +175 -147
  42. package/dist/node/index.cjs.map +1 -1
  43. package/dist/node/index.js +142 -114
  44. package/dist/node/index.js.map +1 -1
  45. package/package.json +18 -19
  46. package/src/AbstractModule.ts +11 -50
  47. package/src/AbstractModuleInstance.ts +69 -4
  48. package/src/ResolveHelper.ts +37 -12
@@ -1,15 +1,27 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
2
  import { Address } from '@xylabs/hex'
3
+ import { compact } from '@xylabs/lodash'
3
4
  import { AccountInstance } from '@xyo-network/account-model'
5
+ import { ArchivistInstance, asArchivistInstance } from '@xyo-network/archivist-model'
4
6
  import { ModuleManifestPayload } from '@xyo-network/manifest-model'
5
- import { AddressPreviousHashPayload, Module, ModuleDescriptionPayload, ModuleEventData, ModuleParams } from '@xyo-network/module-model'
7
+ import {
8
+ AddressPreviousHashPayload,
9
+ ModuleDescriptionPayload,
10
+ ModuleEventData,
11
+ ModuleFilter,
12
+ ModuleFilterOptions,
13
+ ModuleIdentifier,
14
+ ModuleInstance,
15
+ ModuleParams,
16
+ } from '@xyo-network/module-model'
6
17
  import { Payload } from '@xyo-network/payload-model'
7
18
 
8
19
  import { AbstractModule } from './AbstractModule'
20
+ import { ResolveHelper, ResolveHelperConfig } from './ResolveHelper'
9
21
 
10
22
  export abstract class AbstractModuleInstance<TParams extends ModuleParams = ModuleParams, TEventData extends ModuleEventData = ModuleEventData>
11
23
  extends AbstractModule<TParams, TEventData>
12
- implements Module<TParams, TEventData>
24
+ implements ModuleInstance<TParams, TEventData>
13
25
  {
14
26
  constructor(privateConstructorKey: string, params: TParams, account: AccountInstance) {
15
27
  assertEx(AbstractModule.privateConstructorKey === privateConstructorKey, () => 'Use create function instead of constructor')
@@ -27,10 +39,10 @@ export abstract class AbstractModuleInstance<TParams extends ModuleParams = Modu
27
39
  })
28
40
  }
29
41
 
30
- discover(): Promise<Payload[]> {
42
+ discover(maxDepth = 5): Promise<Payload[]> {
31
43
  this._checkDead()
32
44
  return this.busy(async () => {
33
- return await this.discoverHandler()
45
+ return await this.discoverHandler(maxDepth)
34
46
  })
35
47
  }
36
48
 
@@ -48,6 +60,41 @@ export abstract class AbstractModuleInstance<TParams extends ModuleParams = Modu
48
60
  })
49
61
  }
50
62
 
63
+ /** @deprecated do not pass undefined. If trying to get all, pass '*' */
64
+ async resolve(): Promise<ModuleInstance[]>
65
+ async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>
66
+ async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>
67
+ async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>
68
+ /** @deprecated use '*' if trying to resolve all */
69
+ async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>
70
+ async resolve<T extends ModuleInstance = ModuleInstance>(
71
+ idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',
72
+ options: ModuleFilterOptions<T> = {},
73
+ ): Promise<T | T[] | undefined> {
74
+ const config: ResolveHelperConfig = {
75
+ address: this.address,
76
+ dead: this.dead,
77
+ downResolver: this.downResolver,
78
+ logger: this.logger,
79
+ module: this,
80
+ upResolver: this.upResolver,
81
+ }
82
+ if (idOrFilter === '*') {
83
+ return await ResolveHelper.resolve(config, idOrFilter, options)
84
+ }
85
+ switch (typeof idOrFilter) {
86
+ case 'string': {
87
+ return await ResolveHelper.resolve(config, idOrFilter, options)
88
+ }
89
+ case 'object': {
90
+ return await ResolveHelper.resolve(config, idOrFilter, options)
91
+ }
92
+ default: {
93
+ return await ResolveHelper.resolve(config, idOrFilter, options)
94
+ }
95
+ }
96
+ }
97
+
51
98
  state() {
52
99
  this._checkDead()
53
100
  return this.busy(async () => {
@@ -59,4 +106,22 @@ export abstract class AbstractModuleInstance<TParams extends ModuleParams = Modu
59
106
  this._checkDead()
60
107
  return this.subscribeHandler()
61
108
  }
109
+
110
+ protected async resolveArchivingArchivists(): Promise<ArchivistInstance[]> {
111
+ const archivists = this.config.archiving?.archivists
112
+ if (!archivists) return []
113
+ const resolved = await Promise.all(archivists.map((archivist) => this.resolve(archivist)))
114
+ return compact(resolved.map((mod) => asArchivistInstance(mod)))
115
+ }
116
+
117
+ protected async storeToArchivists(payloads: Payload[]): Promise<Payload[]> {
118
+ const archivists = await this.resolveArchivingArchivists()
119
+ return (
120
+ await Promise.all(
121
+ archivists.map((archivist) => {
122
+ return archivist.insert?.(payloads)
123
+ }),
124
+ )
125
+ ).map(([bw]) => bw)
126
+ }
62
127
  }
@@ -1,13 +1,20 @@
1
- import { Logger } from '@xylabs/logger'
1
+ /* eslint-disable complexity */
2
+ import { Address } from '@xylabs/hex'
3
+ import { IdLogger, Logger } from '@xylabs/logger'
4
+ import { toJsonString } from '@xylabs/object'
2
5
  import { duplicateModules, ModuleFilter, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolver } from '@xyo-network/module-model'
3
6
 
4
7
  export interface ResolveHelperConfig {
8
+ address: Address
5
9
  dead?: boolean
6
10
  downResolver?: ModuleResolver
11
+ logger?: Logger
12
+ module: ModuleInstance
7
13
  upResolver?: ModuleResolver
8
14
  }
9
15
 
10
16
  export class ResolveHelper {
17
+ static defaultLogger?: Logger
11
18
  static async resolve<T extends ModuleInstance = ModuleInstance>(
12
19
  config: ResolveHelperConfig,
13
20
  all: '*',
@@ -26,22 +33,40 @@ export class ResolveHelper {
26
33
  static async resolve<T extends ModuleInstance = ModuleInstance>(
27
34
  config: ResolveHelperConfig,
28
35
  idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',
29
- { required = 'log', ...options }: ModuleFilterOptions<T> = {},
36
+ { visibility, maxDepth = 5, required = 'log', ...options }: ModuleFilterOptions<T> = {},
30
37
  ): Promise<T | T[] | undefined> {
31
- const { dead = false, upResolver, downResolver } = config
32
- const childOptions = { ...options, required: false }
38
+ const { module, logger = this.defaultLogger, dead = false, upResolver, downResolver } = config
39
+ const log = logger ? new IdLogger(logger, () => `ResolveHelper [${module.id}][${idOrFilter}][${visibility}]`) : undefined
40
+ const childOptions: ModuleFilterOptions<T> = { ...options, direction: 'down', maxDepth: maxDepth - 1, required: false, visibility }
33
41
  const direction = options?.direction ?? 'all'
34
42
  const up = direction === 'up' || direction === 'all'
35
43
  const down = direction === 'down' || direction === 'all'
36
44
  let result: T | T[] | undefined
45
+ log?.debug('start', idOrFilter, maxDepth)
37
46
  if (idOrFilter === '*') {
38
47
  if (dead) {
48
+ log?.warn('failed [dead]', idOrFilter)
39
49
  return []
40
50
  }
41
- return [
51
+ const modules = [
42
52
  ...(down ? await (downResolver as ModuleResolver).resolve<T>('*', childOptions) : []),
43
53
  ...(up ? await (upResolver as ModuleResolver).resolve<T>('*', childOptions) : []),
44
- ].filter(duplicateModules)
54
+ ]
55
+ .filter(duplicateModules)
56
+ .filter((module) => module.address !== config.address)
57
+
58
+ if (modules.length > 0) {
59
+ log?.log('modules [count]', modules.length)
60
+ log?.debug('modules', toJsonString(modules, 4))
61
+ }
62
+
63
+ if (maxDepth === 0) {
64
+ return modules
65
+ }
66
+ const childModules = (await Promise.all(modules.map(async (module) => await module.resolve<T>('*', childOptions))))
67
+ .flat()
68
+ .filter(duplicateModules)
69
+ return [module as T, ...modules, ...childModules].filter(duplicateModules)
45
70
  } else {
46
71
  switch (typeof idOrFilter) {
47
72
  case 'string': {
@@ -66,7 +91,7 @@ export class ResolveHelper {
66
91
  }
67
92
  }
68
93
  }
69
- this.validateRequiredResolve(required, result, idOrFilter)
94
+ this.validateRequiredResolve(required, result, idOrFilter, logger)
70
95
  return result
71
96
  }
72
97
 
@@ -74,21 +99,21 @@ export class ResolveHelper {
74
99
  required: boolean | 'warn' | 'log',
75
100
  result: ModuleInstance[] | ModuleInstance | undefined,
76
101
  idOrFilter: ModuleIdentifier | ModuleFilter,
77
- logger?: Logger,
102
+ logger = this.defaultLogger,
78
103
  ) {
104
+ const log = logger ? new IdLogger(logger, () => `validateRequiredResolve [${idOrFilter}][${result}]`) : undefined
79
105
  if (required && (result === undefined || (Array.isArray(result) && result.length > 0))) {
80
106
  switch (required) {
81
107
  case 'warn': {
82
- logger?.warn('resolve failed', idOrFilter)
108
+ log?.warn('resolve failed', idOrFilter)
83
109
  break
84
110
  }
85
111
  case 'log': {
86
- logger?.log('resolve failed', idOrFilter)
112
+ log?.log('resolve failed', idOrFilter)
87
113
  break
88
114
  }
89
115
  default: {
90
- logger?.error('resolve failed', idOrFilter)
91
- break
116
+ throw new Error(`resolve failed [${idOrFilter}]`)
92
117
  }
93
118
  }
94
119
  }