@xyo-network/node 2.43.4 → 2.43.6

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,5 +1,5 @@
1
1
  import { Account } from '@xyo-network/account';
2
- import { AbstractModule, Module, ModuleDescription, ModuleFilter, ModuleParams, ModuleQueryResult, ModuleRepository, XyoQueryBoundWitness } from '@xyo-network/module';
2
+ import { AbstractModule, Module, ModuleConstructable, ModuleDescription, ModuleFilter, ModuleParams, ModuleQueryResult, ModuleRepository, ModuleWrapper, XyoQueryBoundWitness } from '@xyo-network/module';
3
3
  import { XyoPayload } from '@xyo-network/payload-model';
4
4
  import { Promisable } from '@xyo-network/promise';
5
5
  import { NodeConfig } from './Config';
@@ -22,7 +22,31 @@ export declare abstract class AbstractNode<TConfig extends NodeConfig = NodeConf
22
22
  register(_module: TModule): Promisable<void>;
23
23
  registered(): Promisable<string[]>;
24
24
  registeredModules(): Promisable<TModule[]>;
25
+ /**
26
+ * Resolves the supplied filter into wrapped modules
27
+ * @example <caption>Example using ArchivistWrapper</caption>
28
+ * const filter = { address: [address] }
29
+ * const mods: ArchivistWrapper[] = await node.resolveWrapped(ArchivistWrapper, filter)
30
+ * @param wrapper The ModuleWrapper class (ArchivistWrapper,
31
+ * DivinerWrapper, etc.)
32
+ * @param filter The ModuleFilter
33
+ * @returns An array of ModuleWrapper instances corresponding to
34
+ * the underlying modules matching the supplied filter
35
+ */
36
+ resolveWrapped<T extends ModuleWrapper<TModule> = ModuleWrapper<TModule>>(wrapper: ModuleConstructable<TModule, T>, filter?: ModuleFilter): Promise<T[]>;
25
37
  start(): Promise<this>;
38
+ /**
39
+ * Tries to resolve the supplied filter into wrapped modules
40
+ * @example <caption>Example using ArchivistWrapper</caption>
41
+ * const filter = { address: [address] }
42
+ * const mods: ArchivistWrapper[] = await node.tryResolveWrapped(ArchivistWrapper, filter)
43
+ * @param wrapper The ModuleWrapper class (ArchivistWrapper,
44
+ * DivinerWrapper, etc.)
45
+ * @param filter The ModuleFilter
46
+ * @returns An array of ModuleWrapper instances corresponding to
47
+ * the underlying modules matching the supplied filter
48
+ */
49
+ tryResolveWrapped<T extends ModuleWrapper<TModule> = ModuleWrapper<TModule>>(wrapper: ModuleConstructable<TModule, T>, filter?: ModuleFilter): Promise<T[]>;
26
50
  unregister(_module: TModule): Promisable<void>;
27
51
  abstract attach(address: string): Promisable<void>;
28
52
  abstract detach(address: string): Promisable<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractNode.d.ts","sourceRoot":"","sources":["../../src/AbstractNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE9C,OAAO,EACL,cAAc,EACd,MAAM,EACN,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAIhB,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,EAAE,UAAU,EAAoB,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAKnC,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,OAAO,CAAC;IACzI,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;CAC7C;AAED,8BAAsB,YAAY,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,CACzG,SAAQ,cAAc,CAAC,OAAO,CAC9B,YAAW,UAAU;IAErB,MAAM,CAAC,QAAQ,CAAC,YAAY,4BAAmB;IAE/C,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAErD,SAAS,aAAa,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;IAKlE,IAAI,gBAAgB,IAAI,OAAO,CAE9B;WAEqB,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAInF,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI7B,eAAe,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAI5B,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAKzC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAyBnE,OAAO;IAIR,KAAK,CAAC,CAAC,SAAS,oBAAoB,GAAG,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2C1I,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC;IAI5C,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;IAIlC,iBAAiB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;IAI3B,KAAK;IAKpB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC;IAI9C,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;IAClD,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;IAC9D,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;CAClE;AAED,2CAA2C;AAC3C,8BAAsB,OAAO,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,SAAS,cAAc,GAAG,cAAc,CAAE,SAAQ,YAAY,CAC1I,OAAO,EACP,OAAO,CACR;CAAG"}
1
+ {"version":3,"file":"AbstractNode.d.ts","sourceRoot":"","sources":["../../src/AbstractNode.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { assertEx } from '@xylabs/assert';
2
+ import { exists } from '@xylabs/exists';
2
3
  import { Account } from '@xyo-network/account';
3
4
  import { AddressSchema } from '@xyo-network/address-payload-plugin';
4
5
  import { AbstractModule, QueryBoundWitnessWrapper, SimpleModuleResolver, XyoErrorBuilder, } from '@xyo-network/module';
@@ -49,7 +50,7 @@ export class AbstractNode extends AbstractModule {
49
50
  // const [bw, payloads] = result
50
51
  // return [bw, ...payloads]
51
52
  // })
52
- // .flatMap((x) => x)
53
+ // .flat()
53
54
  // return [...parent, ...children]
54
55
  return parent;
55
56
  }
@@ -107,10 +108,47 @@ export class AbstractNode extends AbstractModule {
107
108
  registeredModules() {
108
109
  throw new Error('Method not implemented.');
109
110
  }
111
+ /**
112
+ * Resolves the supplied filter into wrapped modules
113
+ * @example <caption>Example using ArchivistWrapper</caption>
114
+ * const filter = { address: [address] }
115
+ * const mods: ArchivistWrapper[] = await node.resolveWrapped(ArchivistWrapper, filter)
116
+ * @param wrapper The ModuleWrapper class (ArchivistWrapper,
117
+ * DivinerWrapper, etc.)
118
+ * @param filter The ModuleFilter
119
+ * @returns An array of ModuleWrapper instances corresponding to
120
+ * the underlying modules matching the supplied filter
121
+ */
122
+ async resolveWrapped(wrapper, filter) {
123
+ return (await this.resolve(filter)).map((mod) => new wrapper(mod));
124
+ }
110
125
  async start() {
111
126
  await super.start();
112
127
  return this;
113
128
  }
129
+ /**
130
+ * Tries to resolve the supplied filter into wrapped modules
131
+ * @example <caption>Example using ArchivistWrapper</caption>
132
+ * const filter = { address: [address] }
133
+ * const mods: ArchivistWrapper[] = await node.tryResolveWrapped(ArchivistWrapper, filter)
134
+ * @param wrapper The ModuleWrapper class (ArchivistWrapper,
135
+ * DivinerWrapper, etc.)
136
+ * @param filter The ModuleFilter
137
+ * @returns An array of ModuleWrapper instances corresponding to
138
+ * the underlying modules matching the supplied filter
139
+ */
140
+ async tryResolveWrapped(wrapper, filter) {
141
+ return (await this.tryResolve(filter))
142
+ .map((mod) => {
143
+ try {
144
+ return new wrapper(mod);
145
+ }
146
+ catch (_err) {
147
+ return undefined;
148
+ }
149
+ })
150
+ .filter(exists);
151
+ }
114
152
  unregister(_module) {
115
153
  throw new Error('Method not implemented.');
116
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractNode.js","sourceRoot":"","sources":["../../src/AbstractNode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AbstractNode.js","sourceRoot":"","sources":["../../src/AbstractNode.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,13 @@
1
1
  import { Module, ModuleFilter } from '@xyo-network/module';
2
2
  import { AbstractNode, AbstractNodeParams } from './AbstractNode';
3
3
  import { NodeConfig } from './Config';
4
+ export interface MemoryNodeParams<TConfig extends NodeConfig = NodeConfig, TModule extends Module = Module> extends AbstractNodeParams<TConfig, TModule> {
5
+ autoAttachExternallyResolved?: boolean;
6
+ }
4
7
  export declare class MemoryNode<TConfig extends NodeConfig = NodeConfig, TModule extends Module = Module> extends AbstractNode<TConfig, TModule> {
5
8
  static configSchema: "network.xyo.node.config";
6
9
  private registeredModuleMap;
7
- static create(params?: Partial<AbstractNodeParams>): Promise<MemoryNode>;
10
+ static create(params?: Partial<MemoryNodeParams>): Promise<MemoryNode>;
8
11
  attach(address: string, name?: string): void;
9
12
  detach(address: string): void;
10
13
  register(module: TModule): void;
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryNode.d.ts","sourceRoot":"","sources":["../../src/MemoryNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAkB,MAAM,qBAAqB,CAAA;AAE1E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAoB,MAAM,UAAU,CAAA;AAEvD,qBAAa,UAAU,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;IACtI,MAAM,CAAC,YAAY,4BAAmB;IACtC,OAAO,CAAC,mBAAmB,CAA6B;WAElC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAI9E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAKrC,MAAM,CAAC,OAAO,EAAE,MAAM;IAItB,QAAQ,CAAC,MAAM,EAAE,OAAO;IAIxB,UAAU;IAMV,iBAAiB;IAMX,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAOlD,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAO3D,UAAU,CAAC,MAAM,EAAE,OAAO;CAGpC"}
1
+ {"version":3,"file":"MemoryNode.d.ts","sourceRoot":"","sources":["../../src/MemoryNode.ts"],"names":[],"mappings":"AAGA,OAAO,EAA+C,MAAM,EAAE,YAAY,EAAkB,MAAM,qBAAqB,CAAA;AAEvH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAoB,MAAM,UAAU,CAAA;AAEvD,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,CACxG,SAAQ,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;IAC5C,4BAA4B,CAAC,EAAE,OAAO,CAAA;CACvC;AAED,qBAAa,UAAU,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;IACtI,MAAM,CAAC,YAAY,4BAAmB;IACtC,OAAO,CAAC,mBAAmB,CAA6B;WAElC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAwB5E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAKrC,MAAM,CAAC,OAAO,EAAE,MAAM;IAItB,QAAQ,CAAC,MAAM,EAAE,OAAO;IAIxB,UAAU;IAMV,iBAAiB;IAMX,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAOlD,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAY3D,UAAU,CAAC,MAAM,EAAE,OAAO;CAGpC"}
@@ -1,11 +1,36 @@
1
1
  import { assertEx } from '@xylabs/assert';
2
+ import { exists } from '@xylabs/exists';
3
+ import { fulfilled } from '@xylabs/promise';
4
+ import { duplicateModules, mixinResolverEventEmitter } from '@xyo-network/module';
2
5
  import { AbstractNode } from './AbstractNode';
3
6
  import { NodeConfigSchema } from './Config';
4
7
  export class MemoryNode extends AbstractNode {
5
8
  static configSchema = NodeConfigSchema;
6
9
  registeredModuleMap = new Map();
7
10
  static async create(params) {
8
- return (await super.create(params));
11
+ const instance = (await super.create(params));
12
+ if (params?.resolver && params?.autoAttachExternallyResolved) {
13
+ const resolver = mixinResolverEventEmitter(params?.resolver);
14
+ resolver.on('moduleResolved', (args) => {
15
+ const { module, filter } = args;
16
+ try {
17
+ instance.register(module);
18
+ if (filter?.name?.length) {
19
+ filter.name.map((name) => {
20
+ instance.attach(module.address, name);
21
+ });
22
+ }
23
+ else {
24
+ instance.attach(module.address);
25
+ }
26
+ }
27
+ catch (err) {
28
+ params.logger?.error(`Error attaching externally resolved module: 0x${module.address}`);
29
+ }
30
+ });
31
+ instance.resolver = resolver;
32
+ }
33
+ return instance;
9
34
  }
10
35
  attach(address, name) {
11
36
  const module = assertEx(this.registeredModuleMap.get(address), 'No module found at that address');
@@ -31,13 +56,18 @@ export class MemoryNode extends AbstractNode {
31
56
  const internal = this.internalResolver.resolve(filter);
32
57
  const external = this.resolver?.resolve(filter) || [];
33
58
  const resolved = await Promise.all([internal, external]);
34
- return resolved.flatMap((mod) => mod);
59
+ return resolved.flat().filter(exists).filter(duplicateModules);
35
60
  }
36
61
  async tryResolve(filter) {
37
62
  const internal = this.internalResolver.tryResolve(filter);
38
63
  const external = this.resolver?.tryResolve(filter) || [];
39
- const resolved = await Promise.all([internal, external]);
40
- return resolved.flatMap((mod) => mod);
64
+ const resolved = await Promise.allSettled([internal, external]);
65
+ return resolved
66
+ .filter(fulfilled)
67
+ .map((r) => r.value)
68
+ .flat()
69
+ .filter(exists)
70
+ .filter(duplicateModules);
41
71
  }
42
72
  unregister(module) {
43
73
  this.registeredModuleMap.delete(module.address);
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryNode.js","sourceRoot":"","sources":["../../src/MemoryNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAGzC,OAAO,EAAE,YAAY,EAAsB,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAc,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEvD,MAAM,OAAO,UAAqF,SAAQ,YAA8B;IACtI,MAAM,CAAC,YAAY,GAAG,gBAAgB,CAAA;IAC9B,mBAAmB,GAAG,IAAI,GAAG,EAAmB,CAAA;IAExD,MAAM,CAAU,KAAK,CAAC,MAAM,CAAC,MAAoC;QAC/D,OAAO,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAe,CAAA;IACnD,CAAC;IAEQ,MAAM,CAAC,OAAe,EAAE,IAAa;QAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,iCAAiC,CAAC,CAAA;QACjG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACzC,CAAC;IAEQ,MAAM,CAAC,OAAe;QAC7B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAEQ,QAAQ,CAAC,MAAe;QAC/B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACtD,CAAC;IAEQ,UAAU;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7D,OAAO,GAAG,CAAA;QACZ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEQ,iBAAiB;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACjE,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC;IAEQ,KAAK,CAAC,OAAO,CAAC,MAAqB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAI,IAAI,CAAC,QAAgD,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAC9F,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;QACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IACvC,CAAC;IAEQ,KAAK,CAAC,UAAU,CAAC,MAAqB;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QACzD,MAAM,QAAQ,GAAI,IAAI,CAAC,QAAgD,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QACjG,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;QACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IACvC,CAAC;IAEQ,UAAU,CAAC,MAAe;QACjC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACjD,CAAC"}
1
+ {"version":3,"file":"MemoryNode.js","sourceRoot":"","sources":["../../src/MemoryNode.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -11,15 +11,17 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@xylabs/assert": "^2.6.15",
14
- "@xyo-network/account": "^2.43.4",
15
- "@xyo-network/address-payload-plugin": "^2.43.4",
16
- "@xyo-network/archivist-wrapper": "^2.43.4",
17
- "@xyo-network/module": "^2.43.4",
18
- "@xyo-network/module-model": "^2.43.4",
19
- "@xyo-network/payload-builder": "^2.43.4",
20
- "@xyo-network/payload-model": "^2.43.4",
21
- "@xyo-network/payload-wrapper": "^2.43.4",
22
- "@xyo-network/promise": "^2.43.4"
14
+ "@xylabs/exists": "^2.6.15",
15
+ "@xylabs/promise": "^2.6.15",
16
+ "@xyo-network/account": "^2.43.6",
17
+ "@xyo-network/address-payload-plugin": "^2.43.6",
18
+ "@xyo-network/archivist-wrapper": "^2.43.6",
19
+ "@xyo-network/module": "^2.43.6",
20
+ "@xyo-network/module-model": "^2.43.6",
21
+ "@xyo-network/payload-builder": "^2.43.6",
22
+ "@xyo-network/payload-model": "^2.43.6",
23
+ "@xyo-network/payload-wrapper": "^2.43.6",
24
+ "@xyo-network/promise": "^2.43.6"
23
25
  },
24
26
  "devDependencies": {
25
27
  "@xylabs/ts-scripts-yarn3": "^2.12.0"
@@ -57,5 +59,5 @@
57
59
  },
58
60
  "sideEffects": false,
59
61
  "types": "dist/esm/index.d.ts",
60
- "version": "2.43.4"
62
+ "version": "2.43.6"
61
63
  }
@@ -1,14 +1,17 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
+ import { exists } from '@xylabs/exists'
2
3
  import { Account } from '@xyo-network/account'
3
4
  import { AddressSchema } from '@xyo-network/address-payload-plugin'
4
5
  import {
5
6
  AbstractModule,
6
7
  Module,
8
+ ModuleConstructable,
7
9
  ModuleDescription,
8
10
  ModuleFilter,
9
11
  ModuleParams,
10
12
  ModuleQueryResult,
11
13
  ModuleRepository,
14
+ ModuleWrapper,
12
15
  QueryBoundWitnessWrapper,
13
16
  SimpleModuleResolver,
14
17
  XyoErrorBuilder,
@@ -82,7 +85,7 @@ export abstract class AbstractNode<TConfig extends NodeConfig = NodeConfig, TMod
82
85
  // const [bw, payloads] = result
83
86
  // return [bw, ...payloads]
84
87
  // })
85
- // .flatMap((x) => x)
88
+ // .flat()
86
89
  // return [...parent, ...children]
87
90
  return parent
88
91
  }
@@ -146,11 +149,55 @@ export abstract class AbstractNode<TConfig extends NodeConfig = NodeConfig, TMod
146
149
  throw new Error('Method not implemented.')
147
150
  }
148
151
 
152
+ /**
153
+ * Resolves the supplied filter into wrapped modules
154
+ * @example <caption>Example using ArchivistWrapper</caption>
155
+ * const filter = { address: [address] }
156
+ * const mods: ArchivistWrapper[] = await node.resolveWrapped(ArchivistWrapper, filter)
157
+ * @param wrapper The ModuleWrapper class (ArchivistWrapper,
158
+ * DivinerWrapper, etc.)
159
+ * @param filter The ModuleFilter
160
+ * @returns An array of ModuleWrapper instances corresponding to
161
+ * the underlying modules matching the supplied filter
162
+ */
163
+ async resolveWrapped<T extends ModuleWrapper<TModule> = ModuleWrapper<TModule>>(
164
+ wrapper: ModuleConstructable<TModule, T>,
165
+ filter?: ModuleFilter,
166
+ ): Promise<T[]> {
167
+ return (await this.resolve(filter)).map((mod) => new wrapper(mod))
168
+ }
169
+
149
170
  override async start() {
150
171
  await super.start()
151
172
  return this
152
173
  }
153
174
 
175
+ /**
176
+ * Tries to resolve the supplied filter into wrapped modules
177
+ * @example <caption>Example using ArchivistWrapper</caption>
178
+ * const filter = { address: [address] }
179
+ * const mods: ArchivistWrapper[] = await node.tryResolveWrapped(ArchivistWrapper, filter)
180
+ * @param wrapper The ModuleWrapper class (ArchivistWrapper,
181
+ * DivinerWrapper, etc.)
182
+ * @param filter The ModuleFilter
183
+ * @returns An array of ModuleWrapper instances corresponding to
184
+ * the underlying modules matching the supplied filter
185
+ */
186
+ async tryResolveWrapped<T extends ModuleWrapper<TModule> = ModuleWrapper<TModule>>(
187
+ wrapper: ModuleConstructable<TModule, T>,
188
+ filter?: ModuleFilter,
189
+ ): Promise<T[]> {
190
+ return (await this.tryResolve(filter))
191
+ .map((mod) => {
192
+ try {
193
+ return new wrapper(mod)
194
+ } catch (_err) {
195
+ return undefined
196
+ }
197
+ })
198
+ .filter(exists)
199
+ }
200
+
154
201
  unregister(_module: TModule): Promisable<void> {
155
202
  throw new Error('Method not implemented.')
156
203
  }
@@ -14,13 +14,14 @@ import { AbstractModule, Module, ModuleDescription, SimpleModuleResolver } from
14
14
  import { Account, PayloadWrapper, XyoPayload, XyoPayloadBuilder, XyoPayloadSchema } from '@xyo-network/protocol'
15
15
 
16
16
  import { NodeConfigSchema } from './Config'
17
- import { MemoryNode } from './MemoryNode'
17
+ import { MemoryNode, MemoryNodeParams } from './MemoryNode'
18
18
 
19
19
  describe('MemoryNode', () => {
20
20
  const testAccount1 = new Account({ phrase: 'testPhrase1' })
21
21
  const testAccount2 = new Account({ phrase: 'testPhrase2' })
22
22
  const testAccount3 = new Account({ phrase: 'testPhrase3' })
23
23
  const testAccount4 = new Account({ phrase: 'testPhrase4' })
24
+ const archivistConfig = { schema: MemoryArchivistConfigSchema }
24
25
  const nodeConfig = { schema: NodeConfigSchema }
25
26
  let node: MemoryNode
26
27
  beforeEach(async () => {
@@ -75,6 +76,44 @@ describe('MemoryNode', () => {
75
76
  }
76
77
  }
77
78
  })
79
+ describe('with autoAttachExternallyResolved true', () => {
80
+ it('attaches external modules to internal resolver', async () => {
81
+ // Arrange
82
+ // Create a MemoryNode with no modules in the internal
83
+ // resolver and one module in the external resolver
84
+ const resolver = new SimpleModuleResolver()
85
+ const internalResolver = new SimpleModuleResolver()
86
+ const params: MemoryNodeParams = {
87
+ autoAttachExternallyResolved: true,
88
+ config: { schema: NodeConfigSchema },
89
+ internalResolver,
90
+ resolver,
91
+ }
92
+ const module = await MemoryArchivist.create()
93
+ const filter = { address: [module.address] }
94
+ resolver.add(module)
95
+ // No modules exist in internal resolver
96
+ expect(await internalResolver.tryResolve(filter)).toBeArrayOfSize(0)
97
+ // Module exists in external resolver
98
+ expect(await resolver.tryResolve(filter)).toBeArrayOfSize(1)
99
+ const node = await MemoryNode.create(params)
100
+ // No modules are attached
101
+ expect(await node.attached()).toBeArrayOfSize(0)
102
+
103
+ // Act
104
+ // Query for unattached module (by address) that exists in
105
+ // external resolver
106
+ expect(await node.tryResolve(filter)).toBeArrayOfSize(1)
107
+
108
+ // Assert
109
+ // Module is now attached
110
+ expect(await node.attached()).toBeArrayOfSize(1)
111
+ // Module exists in internal resolver
112
+ expect(await internalResolver.tryResolve(filter)).toBeArrayOfSize(1)
113
+ // Module still exists in external resolver
114
+ expect(await resolver.tryResolve(filter)).toBeArrayOfSize(1)
115
+ })
116
+ })
78
117
  })
79
118
  describe('register', () => {
80
119
  it('registers module', async () => {
@@ -180,7 +219,6 @@ describe('MemoryNode', () => {
180
219
  })
181
220
  })
182
221
  describe('description', () => {
183
- const archivistConfig = { schema: MemoryArchivistConfigSchema }
184
222
  const validateModuleDescription = (description: ModuleDescription) => {
185
223
  expect(description).toBeObject()
186
224
  expect(description.address).toBeString()
@@ -308,6 +346,28 @@ describe('MemoryNode', () => {
308
346
  })
309
347
  })
310
348
  })
349
+ describe('tryResolveWrapped', () => {
350
+ beforeEach(async () => {
351
+ const modules = await Promise.all([
352
+ await MemoryArchivist.create({ account: testAccount2, config: archivistConfig }),
353
+ await MemoryArchivist.create({ account: testAccount3, config: archivistConfig }),
354
+ ])
355
+ modules.map((mod) => {
356
+ node.register(mod)
357
+ node.attach(mod.address)
358
+ })
359
+ })
360
+ it('resolves modules wrapped as the specified type', async () => {
361
+ const filter = { address: [testAccount2.addressValue.hex] }
362
+ const modules = await node.tryResolveWrapped(ArchivistWrapper, filter)
363
+ expect(modules.length).toBeGreaterThan(0)
364
+ modules.map((mod) => {
365
+ expect(mod.get).toBeFunction()
366
+ expect(mod.find).toBeFunction()
367
+ expect(mod.insert).toBeFunction()
368
+ })
369
+ })
370
+ })
311
371
  })
312
372
 
313
373
  const prettyPrintDescription = (description: ModuleDescription) => {
package/src/MemoryNode.ts CHANGED
@@ -1,15 +1,42 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
- import { Module, ModuleFilter, ModuleResolver } from '@xyo-network/module'
2
+ import { exists } from '@xylabs/exists'
3
+ import { fulfilled } from '@xylabs/promise'
4
+ import { duplicateModules, mixinResolverEventEmitter, Module, ModuleFilter, ModuleResolver } from '@xyo-network/module'
3
5
 
4
6
  import { AbstractNode, AbstractNodeParams } from './AbstractNode'
5
7
  import { NodeConfig, NodeConfigSchema } from './Config'
6
8
 
9
+ export interface MemoryNodeParams<TConfig extends NodeConfig = NodeConfig, TModule extends Module = Module>
10
+ extends AbstractNodeParams<TConfig, TModule> {
11
+ autoAttachExternallyResolved?: boolean
12
+ }
13
+
7
14
  export class MemoryNode<TConfig extends NodeConfig = NodeConfig, TModule extends Module = Module> extends AbstractNode<TConfig, TModule> {
8
15
  static configSchema = NodeConfigSchema
9
16
  private registeredModuleMap = new Map<string, TModule>()
10
17
 
11
- static override async create(params?: Partial<AbstractNodeParams>): Promise<MemoryNode> {
12
- return (await super.create(params)) as MemoryNode
18
+ static override async create(params?: Partial<MemoryNodeParams>): Promise<MemoryNode> {
19
+ const instance = (await super.create(params)) as MemoryNode
20
+ if (params?.resolver && params?.autoAttachExternallyResolved) {
21
+ const resolver = mixinResolverEventEmitter(params?.resolver)
22
+ resolver.on('moduleResolved', (args) => {
23
+ const { module, filter } = args
24
+ try {
25
+ instance.register(module)
26
+ if (filter?.name?.length) {
27
+ filter.name.map((name) => {
28
+ instance.attach(module.address, name)
29
+ })
30
+ } else {
31
+ instance.attach(module.address)
32
+ }
33
+ } catch (err) {
34
+ params.logger?.error(`Error attaching externally resolved module: 0x${module.address}`)
35
+ }
36
+ })
37
+ instance.resolver = resolver
38
+ }
39
+ return instance
13
40
  }
14
41
 
15
42
  override attach(address: string, name?: string) {
@@ -41,14 +68,19 @@ export class MemoryNode<TConfig extends NodeConfig = NodeConfig, TModule extends
41
68
  const internal = this.internalResolver.resolve(filter)
42
69
  const external = (this.resolver as ModuleResolver<TModule> | undefined)?.resolve(filter) || []
43
70
  const resolved = await Promise.all([internal, external])
44
- return resolved.flatMap((mod) => mod)
71
+ return resolved.flat().filter(exists).filter(duplicateModules)
45
72
  }
46
73
 
47
74
  override async tryResolve(filter?: ModuleFilter): Promise<TModule[]> {
48
75
  const internal = this.internalResolver.tryResolve(filter)
49
76
  const external = (this.resolver as ModuleResolver<TModule> | undefined)?.tryResolve(filter) || []
50
- const resolved = await Promise.all([internal, external])
51
- return resolved.flatMap((mod) => mod)
77
+ const resolved = await Promise.allSettled([internal, external])
78
+ return resolved
79
+ .filter(fulfilled)
80
+ .map((r) => r.value)
81
+ .flat()
82
+ .filter(exists)
83
+ .filter(duplicateModules)
52
84
  }
53
85
 
54
86
  override unregister(module: TModule) {