@xyo-network/node 2.44.1 → 2.45.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/AbstractNode.js +14 -28
- package/dist/cjs/AbstractNode.js.map +1 -1
- package/dist/cjs/MemoryNode.js +52 -47
- package/dist/cjs/MemoryNode.js.map +1 -1
- package/dist/cjs/NodeWrapper.js +10 -5
- package/dist/cjs/NodeWrapper.js.map +1 -1
- package/dist/docs.json +18845 -17310
- package/dist/esm/AbstractNode.js +9 -27
- package/dist/esm/AbstractNode.js.map +1 -1
- package/dist/esm/MemoryNode.js +51 -42
- package/dist/esm/MemoryNode.js.map +1 -1
- package/dist/esm/NodeWrapper.js +10 -5
- package/dist/esm/NodeWrapper.js.map +1 -1
- package/dist/types/AbstractNode.d.ts +16 -27
- package/dist/types/AbstractNode.d.ts.map +1 -1
- package/dist/types/Events/ModuleAttached.d.ts +4 -1
- package/dist/types/Events/ModuleAttached.d.ts.map +1 -1
- package/dist/types/MemoryNode.d.ts +17 -13
- package/dist/types/MemoryNode.d.ts.map +1 -1
- package/dist/types/Node.d.ts +1 -1
- package/dist/types/Node.d.ts.map +1 -1
- package/dist/types/NodeWrapper.d.ts +7 -18
- package/dist/types/NodeWrapper.d.ts.map +1 -1
- package/dist/types/Queries/Attach.d.ts +1 -1
- package/dist/types/Queries/Attach.d.ts.map +1 -1
- package/package.json +13 -12
- package/src/AbstractNode.ts +24 -51
- package/src/Events/ModuleAttached.ts +5 -1
- package/src/MemoryNode.ts +61 -38
- package/src/Node.ts +1 -1
- package/src/NodeWrapper.ts +16 -7
- package/src/Queries/Attach.ts +1 -1
- package/src/spec/MemoryNode.spec.ts +17 -35
package/src/AbstractNode.ts
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
|
-
import { exists } from '@xylabs/exists'
|
|
3
2
|
import { Account } from '@xyo-network/account'
|
|
4
3
|
import { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'
|
|
5
4
|
import {
|
|
6
5
|
AbstractModule,
|
|
7
6
|
AbstractModuleConfig,
|
|
7
|
+
CompositeModuleResolver,
|
|
8
8
|
Module,
|
|
9
9
|
ModuleConstructable,
|
|
10
10
|
ModuleDescription,
|
|
11
11
|
ModuleFilter,
|
|
12
12
|
ModuleParams,
|
|
13
13
|
ModuleQueryResult,
|
|
14
|
-
ModuleRepository,
|
|
15
14
|
ModuleWrapper,
|
|
16
15
|
QueryBoundWitnessWrapper,
|
|
17
|
-
SimpleModuleResolver,
|
|
18
16
|
XyoErrorBuilder,
|
|
19
17
|
XyoQueryBoundWitness,
|
|
20
18
|
} from '@xyo-network/module'
|
|
@@ -28,21 +26,19 @@ import { XyoNodeAttachedQuerySchema, XyoNodeAttachQuerySchema, XyoNodeDetachQuer
|
|
|
28
26
|
|
|
29
27
|
//const childModuleDiscoverQueryPayload = PayloadWrapper.parse<AbstractModuleDiscoverQuery>({ schema: AbstractModuleDiscoverQuerySchema })
|
|
30
28
|
|
|
31
|
-
export interface AbstractNodeParams<TConfig extends NodeConfig = NodeConfig
|
|
32
|
-
internalResolver?:
|
|
29
|
+
export interface AbstractNodeParams<TConfig extends NodeConfig = NodeConfig> extends ModuleParams<TConfig> {
|
|
30
|
+
internalResolver?: CompositeModuleResolver
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
export abstract class AbstractNode<TConfig extends NodeConfig = NodeConfig
|
|
36
|
-
extends AbstractModule<TConfig>
|
|
37
|
-
implements NodeModule
|
|
38
|
-
{
|
|
33
|
+
export abstract class AbstractNode<TConfig extends NodeConfig = NodeConfig> extends AbstractModule<TConfig> implements NodeModule<AbstractModule> {
|
|
39
34
|
static readonly configSchema = NodeConfigSchema
|
|
40
35
|
|
|
41
|
-
protected internalResolver
|
|
36
|
+
protected internalResolver = new CompositeModuleResolver()
|
|
42
37
|
|
|
43
|
-
|
|
38
|
+
private readonly isNode = true
|
|
39
|
+
|
|
40
|
+
protected constructor(params: AbstractNodeParams<TConfig>) {
|
|
44
41
|
super(params)
|
|
45
|
-
this.internalResolver = params.internalResolver ?? new SimpleModuleResolver<TModule>()
|
|
46
42
|
}
|
|
47
43
|
|
|
48
44
|
get isModuleResolver(): boolean {
|
|
@@ -53,11 +49,15 @@ export abstract class AbstractNode<TConfig extends NodeConfig = NodeConfig, TMod
|
|
|
53
49
|
return (await super.create(params)) as AbstractNode
|
|
54
50
|
}
|
|
55
51
|
|
|
52
|
+
static isNode(module: unknown) {
|
|
53
|
+
return (module as AbstractNode).isNode
|
|
54
|
+
}
|
|
55
|
+
|
|
56
56
|
async attached(): Promise<string[]> {
|
|
57
57
|
return (await this.attachedModules()).map((module) => module.address)
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
async attachedModules(): Promise<
|
|
60
|
+
async attachedModules(): Promise<Module[]> {
|
|
61
61
|
return await (this.internalResolver.resolve() ?? [])
|
|
62
62
|
}
|
|
63
63
|
|
|
@@ -126,7 +126,7 @@ export abstract class AbstractNode<TConfig extends NodeConfig = NodeConfig, TMod
|
|
|
126
126
|
return this.bindResult(resultPayloads, queryAccount)
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
register(_module:
|
|
129
|
+
register(_module: AbstractModule): Promisable<this> {
|
|
130
130
|
throw new Error('Method not implemented.')
|
|
131
131
|
}
|
|
132
132
|
|
|
@@ -134,10 +134,14 @@ export abstract class AbstractNode<TConfig extends NodeConfig = NodeConfig, TMod
|
|
|
134
134
|
throw new Error('Method not implemented.')
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
registeredModules(): Promisable<
|
|
137
|
+
registeredModules(): Promisable<Module[]> {
|
|
138
138
|
throw new Error('Method not implemented.')
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
override async resolve(filter?: ModuleFilter): Promise<AbstractModule[]> {
|
|
142
|
+
return (await this.internalResolver.resolve(filter)) ?? super.resolve(filter) ?? []
|
|
143
|
+
}
|
|
144
|
+
|
|
141
145
|
/**
|
|
142
146
|
* Resolves the supplied filter into wrapped modules
|
|
143
147
|
* @example <caption>Example using ArchivistWrapper</caption>
|
|
@@ -149,8 +153,8 @@ export abstract class AbstractNode<TConfig extends NodeConfig = NodeConfig, TMod
|
|
|
149
153
|
* @returns An array of ModuleWrapper instances corresponding to
|
|
150
154
|
* the underlying modules matching the supplied filter
|
|
151
155
|
*/
|
|
152
|
-
async resolveWrapped<T extends ModuleWrapper<
|
|
153
|
-
wrapper: ModuleConstructable<
|
|
156
|
+
async resolveWrapped<T extends ModuleWrapper<Module> = ModuleWrapper<Module>>(
|
|
157
|
+
wrapper: ModuleConstructable<Module, T>,
|
|
154
158
|
filter?: ModuleFilter,
|
|
155
159
|
): Promise<T[]> {
|
|
156
160
|
return (await this.resolve(filter)).map((mod) => new wrapper(mod))
|
|
@@ -161,44 +165,13 @@ export abstract class AbstractNode<TConfig extends NodeConfig = NodeConfig, TMod
|
|
|
161
165
|
return this
|
|
162
166
|
}
|
|
163
167
|
|
|
164
|
-
|
|
165
|
-
* Tries to resolve the supplied filter into wrapped modules
|
|
166
|
-
* @example <caption>Example using ArchivistWrapper</caption>
|
|
167
|
-
* const filter = { address: [address] }
|
|
168
|
-
* const mods: ArchivistWrapper[] = await node.tryResolveWrapped(ArchivistWrapper, filter)
|
|
169
|
-
* @param wrapper The ModuleWrapper class (ArchivistWrapper,
|
|
170
|
-
* DivinerWrapper, etc.)
|
|
171
|
-
* @param filter The ModuleFilter
|
|
172
|
-
* @returns An array of ModuleWrapper instances corresponding to
|
|
173
|
-
* the underlying modules matching the supplied filter
|
|
174
|
-
*/
|
|
175
|
-
async tryResolveWrapped<T extends ModuleWrapper<TModule> = ModuleWrapper<TModule>>(
|
|
176
|
-
wrapper: ModuleConstructable<TModule, T>,
|
|
177
|
-
filter?: ModuleFilter,
|
|
178
|
-
): Promise<T[]> {
|
|
179
|
-
return (await this.tryResolve(filter))
|
|
180
|
-
.map((mod) => {
|
|
181
|
-
try {
|
|
182
|
-
return new wrapper(mod)
|
|
183
|
-
} catch (_err) {
|
|
184
|
-
return undefined
|
|
185
|
-
}
|
|
186
|
-
})
|
|
187
|
-
.filter(exists)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
unregister(_module: TModule): Promisable<void> {
|
|
168
|
+
unregister(_module: Module): Promisable<this> {
|
|
191
169
|
throw new Error('Method not implemented.')
|
|
192
170
|
}
|
|
193
171
|
|
|
194
|
-
abstract attach(address: string): Promisable<void>
|
|
172
|
+
abstract attach(address: string, external?: boolean): Promisable<void>
|
|
195
173
|
abstract detach(address: string): Promisable<void>
|
|
196
|
-
abstract resolve(filter?: ModuleFilter): Promisable<TModule[]>
|
|
197
|
-
abstract tryResolve(filter?: ModuleFilter): Promisable<TModule[]>
|
|
198
174
|
}
|
|
199
175
|
|
|
200
176
|
/** @deprecated use AbstractNode instead */
|
|
201
|
-
export abstract class XyoNode<TConfig extends NodeConfig = NodeConfig
|
|
202
|
-
TConfig,
|
|
203
|
-
TModule
|
|
204
|
-
> {}
|
|
177
|
+
export abstract class XyoNode<TConfig extends NodeConfig = NodeConfig> extends AbstractNode<TConfig> {}
|
|
@@ -3,7 +3,11 @@ import { Module } from '@xyo-network/module-model'
|
|
|
3
3
|
|
|
4
4
|
export interface ModuleAttachedEventArgs {
|
|
5
5
|
module: Module
|
|
6
|
-
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface ModuleDetachedEventArgs {
|
|
9
|
+
address: string
|
|
7
10
|
}
|
|
8
11
|
|
|
9
12
|
export type ModuleAttachedEventEmitter = ModuleEventEmitter<'moduleAttached', ModuleAttachedEventArgs>
|
|
13
|
+
export type ModuleDetachedEventEmitter = ModuleEventEmitter<'moduleDetached', ModuleDetachedEventArgs>
|
package/src/MemoryNode.ts
CHANGED
|
@@ -1,45 +1,42 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
2
|
import { exists } from '@xylabs/exists'
|
|
3
3
|
import { fulfilled } from '@xylabs/promise'
|
|
4
|
-
import { duplicateModules, EventListener,
|
|
4
|
+
import { AbstractModule, duplicateModules, EventListener, Module, ModuleFilter } from '@xyo-network/module'
|
|
5
5
|
|
|
6
6
|
import { AbstractNode, AbstractNodeParams } from './AbstractNode'
|
|
7
7
|
import { NodeConfig, NodeConfigSchema } from './Config'
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
ModuleAttachedEventArgs,
|
|
10
|
+
ModuleAttachedEventEmitter,
|
|
11
|
+
ModuleDetachedEventArgs,
|
|
12
|
+
ModuleResolverChangedEventArgs,
|
|
13
|
+
ResolverChangedEventEmitter,
|
|
14
|
+
} from './Events'
|
|
9
15
|
|
|
10
16
|
type SupportedEventTypes = 'moduleAttached' | 'moduleResolverChanged'
|
|
11
17
|
type SupportedEventListeners<T extends SupportedEventTypes> = T extends 'moduleAttached'
|
|
12
18
|
? EventListener<ModuleAttachedEventArgs>
|
|
13
19
|
: EventListener<ModuleResolverChangedEventArgs>
|
|
14
20
|
|
|
15
|
-
export
|
|
16
|
-
extends AbstractNodeParams<TConfig, TModule> {
|
|
17
|
-
autoAttachExternallyResolved?: boolean
|
|
18
|
-
}
|
|
21
|
+
export type MemoryNodeParams<TConfig extends NodeConfig = NodeConfig> = AbstractNodeParams<TConfig>
|
|
19
22
|
|
|
20
|
-
export class MemoryNode<TConfig extends NodeConfig = NodeConfig
|
|
21
|
-
extends AbstractNode<TConfig
|
|
23
|
+
export class MemoryNode<TConfig extends NodeConfig = NodeConfig>
|
|
24
|
+
extends AbstractNode<TConfig>
|
|
22
25
|
implements ModuleAttachedEventEmitter, ResolverChangedEventEmitter
|
|
23
26
|
{
|
|
24
27
|
static configSchema = NodeConfigSchema
|
|
25
28
|
private readonly moduleAttachedEventListeners: EventListener<ModuleAttachedEventArgs>[] = []
|
|
26
|
-
private
|
|
29
|
+
private readonly moduleDetachedEventListeners: EventListener<ModuleDetachedEventArgs>[] = []
|
|
30
|
+
private registeredModuleMap = new Map<string, AbstractModule>()
|
|
27
31
|
private readonly resolverChangedEventListeners: EventListener<ModuleResolverChangedEventArgs>[] = []
|
|
28
32
|
|
|
29
|
-
override get resolver() {
|
|
30
|
-
return this._resolver
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
override set resolver(resolver: ModuleResolver | undefined) {
|
|
34
|
-
this._resolver = resolver
|
|
35
|
-
const args = { resolver }
|
|
36
|
-
this.resolverChangedEventListeners?.map((listener) => listener(args))
|
|
37
|
-
}
|
|
38
|
-
|
|
39
33
|
static override async create(params?: Partial<MemoryNodeParams>): Promise<MemoryNode> {
|
|
40
34
|
const instance = (await super.create(params)) as MemoryNode
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
|
|
36
|
+
//Arie: Why would we want to auto register modules?
|
|
37
|
+
|
|
38
|
+
/*if (params?.autoAttachExternallyResolved) {
|
|
39
|
+
const resolver = mixinResolverEventEmitter(instance.resolver)
|
|
43
40
|
resolver.on('moduleResolved', (args) => {
|
|
44
41
|
const { module, filter } = args
|
|
45
42
|
try {
|
|
@@ -56,19 +53,48 @@ export class MemoryNode<TConfig extends NodeConfig = NodeConfig, TModule extends
|
|
|
56
53
|
}
|
|
57
54
|
})
|
|
58
55
|
instance.resolver = resolver
|
|
59
|
-
}
|
|
56
|
+
}*/
|
|
60
57
|
return instance
|
|
61
58
|
}
|
|
62
59
|
|
|
63
|
-
override attach(address: string,
|
|
60
|
+
override attach(address: string, external?: boolean) {
|
|
64
61
|
const module = assertEx(this.registeredModuleMap.get(address), 'No module found at that address')
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
|
|
63
|
+
this.internalResolver.addResolver(module.resolver)
|
|
64
|
+
|
|
65
|
+
//give it inside access
|
|
66
|
+
module.parentResolver.addResolver(this.internalResolver)
|
|
67
|
+
|
|
68
|
+
//give it outside access
|
|
69
|
+
if (this.parentResolver) {
|
|
70
|
+
module.parentResolver.addResolver(this.parentResolver)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (external) {
|
|
74
|
+
//expose it externally
|
|
75
|
+
this.resolver.addResolver(module.resolver)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const args = { module }
|
|
67
79
|
this.moduleAttachedEventListeners?.map((listener) => listener(args))
|
|
68
80
|
}
|
|
69
81
|
|
|
70
82
|
override detach(address: string) {
|
|
71
|
-
this.
|
|
83
|
+
const module = assertEx(this.registeredModuleMap.get(address), 'No module found at that address')
|
|
84
|
+
|
|
85
|
+
this.internalResolver.removeResolver(module.resolver)
|
|
86
|
+
|
|
87
|
+
//remove outside access
|
|
88
|
+
module.parentResolver.removeResolver(this.parentResolver)
|
|
89
|
+
|
|
90
|
+
//remove inside access
|
|
91
|
+
module.parentResolver.removeResolver(this.internalResolver)
|
|
92
|
+
|
|
93
|
+
//remove external exposure
|
|
94
|
+
this.resolver.removeResolver(module.resolver)
|
|
95
|
+
|
|
96
|
+
const args = { address }
|
|
97
|
+
this.moduleDetachedEventListeners?.map((listener) => listener(args))
|
|
72
98
|
}
|
|
73
99
|
|
|
74
100
|
on(event: 'moduleAttached', listener: (args: ModuleAttachedEventArgs) => void): this
|
|
@@ -85,8 +111,9 @@ export class MemoryNode<TConfig extends NodeConfig = NodeConfig, TModule extends
|
|
|
85
111
|
return this
|
|
86
112
|
}
|
|
87
113
|
|
|
88
|
-
override register(module:
|
|
114
|
+
override register(module: AbstractModule) {
|
|
89
115
|
this.registeredModuleMap.set(module.address, module)
|
|
116
|
+
return this
|
|
90
117
|
}
|
|
91
118
|
|
|
92
119
|
override registered() {
|
|
@@ -101,17 +128,11 @@ export class MemoryNode<TConfig extends NodeConfig = NodeConfig, TModule extends
|
|
|
101
128
|
})
|
|
102
129
|
}
|
|
103
130
|
|
|
104
|
-
override async resolve(filter?: ModuleFilter): Promise<
|
|
131
|
+
override async resolve(filter?: ModuleFilter): Promise<AbstractModule[]> {
|
|
105
132
|
const internal = this.internalResolver.resolve(filter)
|
|
106
|
-
const external =
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
override async tryResolve(filter?: ModuleFilter): Promise<TModule[]> {
|
|
112
|
-
const internal = this.internalResolver.tryResolve(filter)
|
|
113
|
-
const external = (this.resolver as ModuleResolver<TModule> | undefined)?.tryResolve(filter) || []
|
|
114
|
-
const resolved = await Promise.allSettled([internal, external])
|
|
133
|
+
const external = this.parentResolver?.resolve(filter) || []
|
|
134
|
+
const local = this.resolver?.resolve(filter) || []
|
|
135
|
+
const resolved = await Promise.allSettled([internal, external, local])
|
|
115
136
|
return resolved
|
|
116
137
|
.filter(fulfilled)
|
|
117
138
|
.map((r) => r.value)
|
|
@@ -120,7 +141,9 @@ export class MemoryNode<TConfig extends NodeConfig = NodeConfig, TModule extends
|
|
|
120
141
|
.filter(duplicateModules)
|
|
121
142
|
}
|
|
122
143
|
|
|
123
|
-
override unregister(module:
|
|
144
|
+
override unregister(module: Module) {
|
|
145
|
+
this.detach(module.address)
|
|
124
146
|
this.registeredModuleMap.delete(module.address)
|
|
147
|
+
return this
|
|
125
148
|
}
|
|
126
149
|
}
|
package/src/Node.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { Module, ModuleResolver } from '@xyo-network/module-model'
|
|
|
2
2
|
import { Promisable } from '@xyo-network/promise'
|
|
3
3
|
|
|
4
4
|
export interface Node {
|
|
5
|
-
attach(address: string,
|
|
5
|
+
attach(address: string, external?: boolean): Promisable<void>
|
|
6
6
|
attached(): Promisable<string[]>
|
|
7
7
|
detach(address: string): Promisable<void>
|
|
8
8
|
registered(): Promisable<string[]>
|
package/src/NodeWrapper.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/assert'
|
|
1
2
|
import { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'
|
|
2
3
|
import { ArchivistWrapper } from '@xyo-network/archivist-wrapper'
|
|
3
|
-
import { ModuleFilter, ModuleWrapper } from '@xyo-network/module'
|
|
4
|
+
import { Module, ModuleFilter, ModuleWrapper } from '@xyo-network/module'
|
|
4
5
|
import { isXyoPayloadOfSchemaType } from '@xyo-network/payload-model'
|
|
5
6
|
import { PayloadWrapper } from '@xyo-network/payload-wrapper'
|
|
7
|
+
import { Promisable } from '@xyo-network/promise'
|
|
6
8
|
|
|
7
9
|
import { Node, NodeModule } from './Node'
|
|
8
10
|
import {
|
|
@@ -17,6 +19,8 @@ import {
|
|
|
17
19
|
} from './Queries'
|
|
18
20
|
|
|
19
21
|
export class NodeWrapper<TModule extends NodeModule = NodeModule> extends ModuleWrapper<TModule> implements Node, NodeModule {
|
|
22
|
+
static requiredQueries = [XyoNodeAttachQuerySchema, ...ModuleWrapper.requiredQueries]
|
|
23
|
+
|
|
20
24
|
public isModuleResolver = true
|
|
21
25
|
|
|
22
26
|
private _archivist?: ArchivistWrapper
|
|
@@ -26,8 +30,16 @@ export class NodeWrapper<TModule extends NodeModule = NodeModule> extends Module
|
|
|
26
30
|
return this._archivist
|
|
27
31
|
}
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
static tryWrap(module: Module): NodeWrapper | undefined {
|
|
34
|
+
return this.hasRequiredQueries(module) ? new NodeWrapper(module as NodeModule) : undefined
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
static wrap(module: Module): NodeWrapper {
|
|
38
|
+
return assertEx(this.tryWrap(module), 'Unable to wrap module as NodeWrapper')
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async attach(address: string, external?: boolean): Promise<void> {
|
|
42
|
+
const queryPayload = PayloadWrapper.parse<XyoNodeAttachQuery>({ address, external, schema: XyoNodeAttachQuerySchema })
|
|
31
43
|
await this.sendQuery(queryPayload)
|
|
32
44
|
}
|
|
33
45
|
|
|
@@ -48,10 +60,7 @@ export class NodeWrapper<TModule extends NodeModule = NodeModule> extends Module
|
|
|
48
60
|
return payloads.map((p) => p.address)
|
|
49
61
|
}
|
|
50
62
|
|
|
51
|
-
resolve(filter?: ModuleFilter) {
|
|
63
|
+
resolve(filter?: ModuleFilter): Promisable<Module[]> {
|
|
52
64
|
return this.module.resolve(filter)
|
|
53
65
|
}
|
|
54
|
-
tryResolve(filter?: ModuleFilter) {
|
|
55
|
-
return this.module.tryResolve(filter)
|
|
56
|
-
}
|
|
57
66
|
}
|
package/src/Queries/Attach.ts
CHANGED
|
@@ -10,11 +10,11 @@ import {
|
|
|
10
10
|
XyoHuriPayload,
|
|
11
11
|
XyoHuriSchema,
|
|
12
12
|
} from '@xyo-network/diviner'
|
|
13
|
-
import { AbstractModule, Module, ModuleDescription
|
|
13
|
+
import { AbstractModule, Module, ModuleDescription } from '@xyo-network/module'
|
|
14
14
|
import { Account, PayloadWrapper, XyoPayload, XyoPayloadBuilder, XyoPayloadSchema } from '@xyo-network/protocol'
|
|
15
15
|
|
|
16
16
|
import { NodeConfigSchema } from '../Config'
|
|
17
|
-
import { MemoryNode
|
|
17
|
+
import { MemoryNode } from '../MemoryNode'
|
|
18
18
|
|
|
19
19
|
describe('MemoryNode', () => {
|
|
20
20
|
const testAccount1 = new Account({ phrase: 'testPhrase1' })
|
|
@@ -34,7 +34,6 @@ describe('MemoryNode', () => {
|
|
|
34
34
|
const archivist = await XyoMemoryArchivist.create()
|
|
35
35
|
const diviner: AbstractModule = await ArchivistPayloadDiviner.create({
|
|
36
36
|
config: { archivist: archivist.address, schema: XyoArchivistPayloadDivinerConfigSchema },
|
|
37
|
-
resolver: new SimpleModuleResolver().add(archivist),
|
|
38
37
|
})
|
|
39
38
|
node.register(archivist)
|
|
40
39
|
node.attach(archivist.address)
|
|
@@ -61,7 +60,7 @@ describe('MemoryNode', () => {
|
|
|
61
60
|
if (payloads && payloads[0]) {
|
|
62
61
|
const huri = new PayloadWrapper(payloads[0]).hash
|
|
63
62
|
const huriPayload: XyoHuriPayload = { huri: [huri], schema: XyoHuriSchema }
|
|
64
|
-
const module = (await node.resolve({ address: [diviner.address] })).shift() as DivinerModule
|
|
63
|
+
const module = (await node.resolve({ address: [diviner.address] })).shift() as DivinerModule | undefined
|
|
65
64
|
const foundDiviner = module ? new DivinerWrapper(module) : null
|
|
66
65
|
expect(foundDiviner).toBeDefined()
|
|
67
66
|
if (foundDiviner) {
|
|
@@ -76,15 +75,14 @@ describe('MemoryNode', () => {
|
|
|
76
75
|
}
|
|
77
76
|
}
|
|
78
77
|
})
|
|
79
|
-
describe('with autoAttachExternallyResolved true', () => {
|
|
78
|
+
/*describe('with autoAttachExternallyResolved true', () => {
|
|
80
79
|
it('attaches external modules to internal resolver', async () => {
|
|
81
80
|
// Arrange
|
|
82
81
|
// Create a MemoryNode with no modules in the internal
|
|
83
82
|
// resolver and one module in the external resolver
|
|
84
|
-
const resolver = new
|
|
85
|
-
const internalResolver = new
|
|
83
|
+
const resolver = new CompositeModuleResolver()
|
|
84
|
+
const internalResolver = new CompositeModuleResolver()
|
|
86
85
|
const params: MemoryNodeParams = {
|
|
87
|
-
autoAttachExternallyResolved: true,
|
|
88
86
|
config: { schema: NodeConfigSchema },
|
|
89
87
|
internalResolver,
|
|
90
88
|
resolver,
|
|
@@ -93,9 +91,9 @@ describe('MemoryNode', () => {
|
|
|
93
91
|
const filter = { address: [module.address] }
|
|
94
92
|
resolver.add(module)
|
|
95
93
|
// No modules exist in internal resolver
|
|
96
|
-
expect(await internalResolver.
|
|
94
|
+
expect(await internalResolver.resolve(filter)).toBeArrayOfSize(0)
|
|
97
95
|
// Module exists in external resolver
|
|
98
|
-
expect(await resolver.
|
|
96
|
+
expect(await resolver.resolve(filter)).toBeArrayOfSize(1)
|
|
99
97
|
const node = await MemoryNode.create(params)
|
|
100
98
|
// No modules are attached
|
|
101
99
|
expect(await node.attached()).toBeArrayOfSize(0)
|
|
@@ -103,17 +101,17 @@ describe('MemoryNode', () => {
|
|
|
103
101
|
// Act
|
|
104
102
|
// Query for unattached module (by address) that exists in
|
|
105
103
|
// external resolver
|
|
106
|
-
expect(await node.
|
|
104
|
+
expect(await node.resolve(filter)).toBeArrayOfSize(1)
|
|
107
105
|
|
|
108
106
|
// Assert
|
|
109
107
|
// Module is now attached
|
|
110
108
|
expect(await node.attached()).toBeArrayOfSize(1)
|
|
111
109
|
// Module exists in internal resolver
|
|
112
|
-
expect(await internalResolver.
|
|
110
|
+
expect(await internalResolver.resolve(filter)).toBeArrayOfSize(1)
|
|
113
111
|
// Module still exists in external resolver
|
|
114
|
-
expect(await resolver.
|
|
112
|
+
expect(await resolver.resolve(filter)).toBeArrayOfSize(1)
|
|
115
113
|
})
|
|
116
|
-
})
|
|
114
|
+
})*/
|
|
117
115
|
})
|
|
118
116
|
describe('register', () => {
|
|
119
117
|
it('registers module', async () => {
|
|
@@ -151,16 +149,13 @@ describe('MemoryNode', () => {
|
|
|
151
149
|
node.attach(module.address)
|
|
152
150
|
})
|
|
153
151
|
it('emits event on module attach', (done) => {
|
|
154
|
-
const name = 'foo'
|
|
155
152
|
node.on('moduleAttached', (args) => {
|
|
156
153
|
expect(args.module).toBeObject()
|
|
157
154
|
expect(args.module.address).toBe(module.address)
|
|
158
|
-
expect(args.name).toBeDefined()
|
|
159
|
-
expect(args.name).toBe(name)
|
|
160
155
|
expect(args.module).toBe(module)
|
|
161
156
|
done()
|
|
162
157
|
})
|
|
163
|
-
node.attach(module.address
|
|
158
|
+
node.attach(module.address)
|
|
164
159
|
})
|
|
165
160
|
})
|
|
166
161
|
describe('attached', () => {
|
|
@@ -197,9 +192,9 @@ describe('MemoryNode', () => {
|
|
|
197
192
|
it('deregisters existing module', () => {
|
|
198
193
|
node.detach(module.address)
|
|
199
194
|
})
|
|
200
|
-
it('allows deregistering non-existent module', () => {
|
|
195
|
+
/*it('allows deregistering non-existent module', () => {
|
|
201
196
|
node.detach('4a15a6c96665931b76c1d2a587ea1132dbfdc266')
|
|
202
|
-
})
|
|
197
|
+
})*/
|
|
203
198
|
})
|
|
204
199
|
describe('registeredModules', () => {
|
|
205
200
|
let module: AbstractModule
|
|
@@ -360,7 +355,7 @@ describe('MemoryNode', () => {
|
|
|
360
355
|
})
|
|
361
356
|
})
|
|
362
357
|
})
|
|
363
|
-
describe('
|
|
358
|
+
describe('resolveWrapped', () => {
|
|
364
359
|
beforeEach(async () => {
|
|
365
360
|
const modules = await Promise.all([
|
|
366
361
|
await MemoryArchivist.create({ account: testAccount2, config: archivistConfig }),
|
|
@@ -373,7 +368,7 @@ describe('MemoryNode', () => {
|
|
|
373
368
|
})
|
|
374
369
|
it('resolves modules wrapped as the specified type', async () => {
|
|
375
370
|
const filter = { address: [testAccount2.addressValue.hex] }
|
|
376
|
-
const modules = await node.
|
|
371
|
+
const modules = await node.resolveWrapped(ArchivistWrapper, filter)
|
|
377
372
|
expect(modules.length).toBeGreaterThan(0)
|
|
378
373
|
modules.map((mod) => {
|
|
379
374
|
expect(mod.get).toBeFunction()
|
|
@@ -382,19 +377,6 @@ describe('MemoryNode', () => {
|
|
|
382
377
|
})
|
|
383
378
|
})
|
|
384
379
|
})
|
|
385
|
-
describe('resolver', () => {
|
|
386
|
-
it('emits event when resolver changes', (done) => {
|
|
387
|
-
const resolver = new SimpleModuleResolver()
|
|
388
|
-
node.on('moduleResolverChanged', (args) => {
|
|
389
|
-
expect(args).toBeObject()
|
|
390
|
-
expect(args.resolver).toBe(resolver)
|
|
391
|
-
done()
|
|
392
|
-
})
|
|
393
|
-
expect(node.resolver).toBeUndefined()
|
|
394
|
-
node.resolver = resolver
|
|
395
|
-
expect(node.resolver).toBe(resolver)
|
|
396
|
-
})
|
|
397
|
-
})
|
|
398
380
|
})
|
|
399
381
|
|
|
400
382
|
const prettyPrintDescription = (description: ModuleDescription) => {
|