@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.
- package/dist/browser/AbstractModule.d.cts +4 -11
- package/dist/browser/AbstractModule.d.cts.map +1 -1
- package/dist/browser/AbstractModule.d.mts +4 -11
- package/dist/browser/AbstractModule.d.mts.map +1 -1
- package/dist/browser/AbstractModule.d.ts +4 -11
- package/dist/browser/AbstractModule.d.ts.map +1 -1
- package/dist/browser/AbstractModuleInstance.d.cts +13 -3
- package/dist/browser/AbstractModuleInstance.d.cts.map +1 -1
- package/dist/browser/AbstractModuleInstance.d.mts +13 -3
- package/dist/browser/AbstractModuleInstance.d.mts.map +1 -1
- package/dist/browser/AbstractModuleInstance.d.ts +13 -3
- package/dist/browser/AbstractModuleInstance.d.ts.map +1 -1
- package/dist/browser/ResolveHelper.d.cts +6 -1
- package/dist/browser/ResolveHelper.d.cts.map +1 -1
- package/dist/browser/ResolveHelper.d.mts +6 -1
- package/dist/browser/ResolveHelper.d.mts.map +1 -1
- package/dist/browser/ResolveHelper.d.ts +6 -1
- package/dist/browser/ResolveHelper.d.ts.map +1 -1
- package/dist/browser/index.cjs +174 -146
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +141 -113
- package/dist/browser/index.js.map +1 -1
- package/dist/node/AbstractModule.d.cts +4 -11
- package/dist/node/AbstractModule.d.cts.map +1 -1
- package/dist/node/AbstractModule.d.mts +4 -11
- package/dist/node/AbstractModule.d.mts.map +1 -1
- package/dist/node/AbstractModule.d.ts +4 -11
- package/dist/node/AbstractModule.d.ts.map +1 -1
- package/dist/node/AbstractModuleInstance.d.cts +13 -3
- package/dist/node/AbstractModuleInstance.d.cts.map +1 -1
- package/dist/node/AbstractModuleInstance.d.mts +13 -3
- package/dist/node/AbstractModuleInstance.d.mts.map +1 -1
- package/dist/node/AbstractModuleInstance.d.ts +13 -3
- package/dist/node/AbstractModuleInstance.d.ts.map +1 -1
- package/dist/node/ResolveHelper.d.cts +6 -1
- package/dist/node/ResolveHelper.d.cts.map +1 -1
- package/dist/node/ResolveHelper.d.mts +6 -1
- package/dist/node/ResolveHelper.d.mts.map +1 -1
- package/dist/node/ResolveHelper.d.ts +6 -1
- package/dist/node/ResolveHelper.d.ts.map +1 -1
- package/dist/node/index.cjs +175 -147
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +142 -114
- package/dist/node/index.js.map +1 -1
- package/package.json +18 -19
- package/src/AbstractModule.ts +11 -50
- package/src/AbstractModuleInstance.ts +69 -4
- 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 {
|
|
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
|
|
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
|
}
|
package/src/ResolveHelper.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
|
|
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
|
|
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
|
-
|
|
51
|
+
const modules = [
|
|
42
52
|
...(down ? await (downResolver as ModuleResolver).resolve<T>('*', childOptions) : []),
|
|
43
53
|
...(up ? await (upResolver as ModuleResolver).resolve<T>('*', childOptions) : []),
|
|
44
|
-
]
|
|
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
|
|
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
|
-
|
|
108
|
+
log?.warn('resolve failed', idOrFilter)
|
|
83
109
|
break
|
|
84
110
|
}
|
|
85
111
|
case 'log': {
|
|
86
|
-
|
|
112
|
+
log?.log('resolve failed', idOrFilter)
|
|
87
113
|
break
|
|
88
114
|
}
|
|
89
115
|
default: {
|
|
90
|
-
|
|
91
|
-
break
|
|
116
|
+
throw new Error(`resolve failed [${idOrFilter}]`)
|
|
92
117
|
}
|
|
93
118
|
}
|
|
94
119
|
}
|