@xyo-network/node 2.44.0 → 2.45.0-rc.1

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.
@@ -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, TModule extends Module = Module> extends ModuleParams<TConfig> {
32
- internalResolver?: ModuleRepository<TModule>
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, TModule extends Module = Module>
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: ModuleRepository<TModule>
36
+ protected internalResolver = new CompositeModuleResolver()
42
37
 
43
- protected constructor(params: AbstractNodeParams<TConfig, TModule>) {
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<TModule[]> {
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: TModule): Promisable<void> {
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<TModule[]> {
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<TModule> = ModuleWrapper<TModule>>(
153
- wrapper: ModuleConstructable<TModule, T>,
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, TModule extends AbstractModule = AbstractModule> extends AbstractNode<
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
- name?: string
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, mixinResolverEventEmitter, Module, ModuleFilter, ModuleResolver } from '@xyo-network/module'
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 { ModuleAttachedEventArgs, ModuleAttachedEventEmitter, ModuleResolverChangedEventArgs, ResolverChangedEventEmitter } from './Events'
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 interface MemoryNodeParams<TConfig extends NodeConfig = NodeConfig, TModule extends Module = Module>
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, TModule extends Module = Module>
21
- extends AbstractNode<TConfig, TModule>
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 registeredModuleMap = new Map<string, TModule>()
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
- if (params?.resolver && params?.autoAttachExternallyResolved) {
42
- const resolver = mixinResolverEventEmitter(params?.resolver)
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, name?: string) {
60
+ override attach(address: string, external?: boolean) {
64
61
  const module = assertEx(this.registeredModuleMap.get(address), 'No module found at that address')
65
- this.internalResolver.add(module, name)
66
- const args = { module, name }
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.internalResolver.remove(address)
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: TModule) {
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<TModule[]> {
131
+ override async resolve(filter?: ModuleFilter): Promise<AbstractModule[]> {
105
132
  const internal = this.internalResolver.resolve(filter)
106
- const external = (this.resolver as ModuleResolver<TModule> | undefined)?.resolve(filter) || []
107
- const resolved = await Promise.all([internal, external])
108
- return resolved.flat().filter(exists).filter(duplicateModules)
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: TModule) {
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, name?: string): Promisable<void>
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[]>
@@ -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
- async attach(address: string, name?: string): Promise<void> {
30
- const queryPayload = PayloadWrapper.parse<XyoNodeAttachQuery>({ address, name, schema: XyoNodeAttachQuerySchema })
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
  }
@@ -5,6 +5,6 @@ export const XyoNodeAttachQuerySchema: XyoNodeAttachQuerySchema = 'network.xyo.q
5
5
 
6
6
  export type XyoNodeAttachQuery = XyoQuery<{
7
7
  address: string
8
- name?: string
8
+ external?: boolean
9
9
  schema: XyoNodeAttachQuerySchema
10
10
  }>
@@ -10,11 +10,11 @@ import {
10
10
  XyoHuriPayload,
11
11
  XyoHuriSchema,
12
12
  } from '@xyo-network/diviner'
13
- import { AbstractModule, Module, ModuleDescription, SimpleModuleResolver } from '@xyo-network/module'
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, MemoryNodeParams } from '../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 SimpleModuleResolver()
85
- const internalResolver = new SimpleModuleResolver()
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.tryResolve(filter)).toBeArrayOfSize(0)
94
+ expect(await internalResolver.resolve(filter)).toBeArrayOfSize(0)
97
95
  // Module exists in external resolver
98
- expect(await resolver.tryResolve(filter)).toBeArrayOfSize(1)
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.tryResolve(filter)).toBeArrayOfSize(1)
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.tryResolve(filter)).toBeArrayOfSize(1)
110
+ expect(await internalResolver.resolve(filter)).toBeArrayOfSize(1)
113
111
  // Module still exists in external resolver
114
- expect(await resolver.tryResolve(filter)).toBeArrayOfSize(1)
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, name)
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('tryResolveWrapped', () => {
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.tryResolveWrapped(ArchivistWrapper, filter)
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) => {