@xyo-network/node 2.51.4 → 2.51.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.
- package/dist/cjs/MemoryNode.js +75 -17
- package/dist/cjs/MemoryNode.js.map +1 -1
- package/dist/cjs/NodeWrapper.js +5 -1
- package/dist/cjs/NodeWrapper.js.map +1 -1
- package/dist/docs.json +1094 -761
- package/dist/esm/MemoryNode.js +58 -6
- package/dist/esm/MemoryNode.js.map +1 -1
- package/dist/esm/NodeWrapper.js +5 -1
- package/dist/esm/NodeWrapper.js.map +1 -1
- package/dist/types/MemoryNode.d.ts +2 -2
- package/dist/types/MemoryNode.d.ts.map +1 -1
- package/dist/types/NodeWrapper.d.ts +2 -1
- package/dist/types/NodeWrapper.d.ts.map +1 -1
- package/package.json +11 -11
- package/src/MemoryNode.ts +67 -6
- package/src/NodeWrapper.ts +7 -2
package/dist/esm/MemoryNode.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert';
|
|
2
2
|
import { exists } from '@xylabs/exists';
|
|
3
3
|
import { fulfilled, rejected } from '@xylabs/promise';
|
|
4
|
-
import { duplicateModules } from '@xyo-network/module';
|
|
4
|
+
import { duplicateModules, ModuleWrapper } from '@xyo-network/module';
|
|
5
5
|
import { AbstractNode } from './AbstractNode';
|
|
6
6
|
import { NodeConfigSchema } from './Config';
|
|
7
|
+
import { NodeWrapper } from './NodeWrapper';
|
|
7
8
|
export class MemoryNode extends AbstractNode {
|
|
8
9
|
static configSchema = NodeConfigSchema;
|
|
9
10
|
registeredModuleMap = {};
|
|
@@ -14,6 +15,28 @@ export class MemoryNode extends AbstractNode {
|
|
|
14
15
|
const existingModule = (await this.resolve({ address: [address] })).pop();
|
|
15
16
|
assertEx(!existingModule, `Module [${existingModule?.config.name ?? existingModule?.address}] already attached at address [${address}]`);
|
|
16
17
|
const module = assertEx(this.registeredModuleMap[address], 'No module registered at that address');
|
|
18
|
+
const wrapper = ModuleWrapper.wrap(module);
|
|
19
|
+
const notifiedAddresses = [];
|
|
20
|
+
const notifyOfExistingModules = async (node) => {
|
|
21
|
+
//send attach events for all existing attached modules
|
|
22
|
+
const childModules = await node.resolve();
|
|
23
|
+
childModules.map((child) => {
|
|
24
|
+
//don't report self
|
|
25
|
+
if (node.address === child.address) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
//prevent loop
|
|
29
|
+
if (notifiedAddresses.includes(child.address)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
notifiedAddresses.push(child.address);
|
|
33
|
+
const args = { module: child, name: child.config.name };
|
|
34
|
+
this.moduleAttachedEventListeners?.map((listener) => listener(args));
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
await notifyOfExistingModules(wrapper);
|
|
38
|
+
const args = { module, name: module.config.name };
|
|
39
|
+
this.moduleAttachedEventListeners?.map((listener) => listener(args));
|
|
17
40
|
this.privateResolver.addResolver(module.downResolver);
|
|
18
41
|
//give it inside access
|
|
19
42
|
module.upResolver.addResolver?.(this.privateResolver);
|
|
@@ -23,10 +46,17 @@ export class MemoryNode extends AbstractNode {
|
|
|
23
46
|
//expose it externally
|
|
24
47
|
this.downResolver.addResolver(module.downResolver);
|
|
25
48
|
}
|
|
26
|
-
|
|
27
|
-
|
|
49
|
+
if (NodeWrapper.isNodeModule(module)) {
|
|
50
|
+
if (external) {
|
|
51
|
+
const wrappedAsNode = NodeWrapper.wrap(module);
|
|
52
|
+
const attachEmitter = wrappedAsNode.module;
|
|
53
|
+
const detachEmitter = wrappedAsNode.module;
|
|
54
|
+
attachEmitter.on('moduleAttached', (args) => this.moduleAttachedEventListeners?.map((listener) => listener(args)));
|
|
55
|
+
detachEmitter.on('moduleDetached', (args) => this.moduleDetachedEventListeners?.map((listener) => listener(args)));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
28
58
|
}
|
|
29
|
-
detach(address) {
|
|
59
|
+
async detach(address) {
|
|
30
60
|
const module = assertEx(this.registeredModuleMap[address], 'No module found at that address');
|
|
31
61
|
this.privateResolver.removeResolver(module.downResolver);
|
|
32
62
|
//remove inside access
|
|
@@ -37,6 +67,28 @@ export class MemoryNode extends AbstractNode {
|
|
|
37
67
|
this.downResolver.removeResolver(module.downResolver);
|
|
38
68
|
const args = { module, name: module.config.name };
|
|
39
69
|
this.moduleDetachedEventListeners?.map((listener) => listener(args));
|
|
70
|
+
//notify of all sub node children detach
|
|
71
|
+
const wrapper = ModuleWrapper.tryWrap(module);
|
|
72
|
+
const notifiedAddresses = [];
|
|
73
|
+
if (wrapper) {
|
|
74
|
+
const notifyOfExistingModules = async (node) => {
|
|
75
|
+
//send attach events for all existing attached modules
|
|
76
|
+
const childModules = await node.resolve();
|
|
77
|
+
childModules.map((child) => {
|
|
78
|
+
//don't report self
|
|
79
|
+
if (node.address === child.address) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
//prevent loop
|
|
83
|
+
if (notifiedAddresses.includes(child.address)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
notifiedAddresses.push(child.address);
|
|
87
|
+
this.moduleDetachedEventListeners?.map((listener) => listener({ module: child }));
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
await notifyOfExistingModules(wrapper);
|
|
91
|
+
}
|
|
40
92
|
}
|
|
41
93
|
register(module) {
|
|
42
94
|
assertEx(!this.registeredModuleMap[module.address], `Module already registered at that address[${module.address}]`);
|
|
@@ -53,8 +105,8 @@ export class MemoryNode extends AbstractNode {
|
|
|
53
105
|
return value;
|
|
54
106
|
});
|
|
55
107
|
}
|
|
56
|
-
unregister(module) {
|
|
57
|
-
this.detach(module.address);
|
|
108
|
+
async unregister(module) {
|
|
109
|
+
await this.detach(module.address);
|
|
58
110
|
delete this.registeredModuleMap[module.address];
|
|
59
111
|
return this;
|
|
60
112
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryNode.js","sourceRoot":"","sources":["../../src/MemoryNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAwB,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"MemoryNode.js","sourceRoot":"","sources":["../../src/MemoryNode.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/NodeWrapper.js
CHANGED
|
@@ -12,11 +12,15 @@ export class NodeWrapper extends ModuleWrapper {
|
|
|
12
12
|
this._archivist = this._archivist ?? new ArchivistWrapper(this.module);
|
|
13
13
|
return this._archivist;
|
|
14
14
|
}
|
|
15
|
+
static isNodeModule(module) {
|
|
16
|
+
const missingRequiredQueries = this.missingRequiredQueries(module);
|
|
17
|
+
return missingRequiredQueries.length === 0;
|
|
18
|
+
}
|
|
15
19
|
static tryWrap(module, account) {
|
|
16
20
|
if (module) {
|
|
17
21
|
const missingRequiredQueries = this.missingRequiredQueries(module);
|
|
18
22
|
if (missingRequiredQueries.length > 0) {
|
|
19
|
-
console.warn(`Missing queries: ${JSON.stringify(missingRequiredQueries, null, 2)}`)
|
|
23
|
+
//console.warn(`Missing queries: ${JSON.stringify(missingRequiredQueries, null, 2)}`)
|
|
20
24
|
}
|
|
21
25
|
else {
|
|
22
26
|
return new NodeWrapper(module, account);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeWrapper.js","sourceRoot":"","sources":["../../src/NodeWrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAkB,aAAa,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,
|
|
1
|
+
{"version":3,"file":"NodeWrapper.js","sourceRoot":"","sources":["../../src/NodeWrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ export declare class MemoryNode<TParams extends MemoryNodeParams = MemoryNodePar
|
|
|
7
7
|
private registeredModuleMap;
|
|
8
8
|
static create(params?: Partial<MemoryNodeParams>): Promise<MemoryNode>;
|
|
9
9
|
attach(address: string, external?: boolean): Promise<void>;
|
|
10
|
-
detach(address: string): void
|
|
10
|
+
detach(address: string): Promise<void>;
|
|
11
11
|
register(module: Module): this;
|
|
12
12
|
registered(): string[];
|
|
13
13
|
registeredModules(): Module<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & {
|
|
@@ -21,7 +21,7 @@ export declare class MemoryNode<TParams extends MemoryNodeParams = MemoryNodePar
|
|
|
21
21
|
} & {
|
|
22
22
|
schema: string;
|
|
23
23
|
}>[];
|
|
24
|
-
unregister(module: Module): this
|
|
24
|
+
unregister(module: Module): Promise<this>;
|
|
25
25
|
protected resolve<TModule extends Module = Module>(filter?: ModuleFilter): Promise<TModule[]>;
|
|
26
26
|
}
|
|
27
27
|
//# sourceMappingURL=MemoryNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryNode.d.ts","sourceRoot":"","sources":["../../src/MemoryNode.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,MAAM,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"MemoryNode.d.ts","sourceRoot":"","sources":["../../src/MemoryNode.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,MAAM,EAAE,YAAY,EAAiB,MAAM,qBAAqB,CAAA;AAE3F,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAoB,MAAM,UAAU,CAAA;AAKvD,MAAM,MAAM,gBAAgB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAEnG,qBAAa,UAAU,CAAC,OAAO,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,YAAY,CAAC,OAAO,CAAC;IACxG,OAAgB,YAAY,4BAAmB;IAE/C,OAAO,CAAC,mBAAmB,CAA6B;WAElC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAItE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO;IAwD1C,MAAM,CAAC,OAAO,EAAE,MAAM;IA0C5B,QAAQ,CAAC,MAAM,EAAE,MAAM;IAMvB,UAAU;IAMV,iBAAiB;;;;;;;;;;;IAMX,UAAU,CAAC,MAAM,EAAE,MAAM;cAMf,OAAO,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAmB7G"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { AccountInstance } from '@xyo-network/account-model';
|
|
2
2
|
import { ArchivistWrapper } from '@xyo-network/archivist-wrapper';
|
|
3
|
-
import { ModuleWrapper } from '@xyo-network/module';
|
|
3
|
+
import { Module, ModuleWrapper } from '@xyo-network/module';
|
|
4
4
|
import { NodeModule } from './Node';
|
|
5
5
|
export declare class NodeWrapper extends ModuleWrapper<NodeModule> implements NodeModule {
|
|
6
6
|
static requiredQueries: string[];
|
|
7
7
|
private _archivist?;
|
|
8
8
|
get archivist(): ArchivistWrapper;
|
|
9
|
+
static isNodeModule(module: Module): boolean;
|
|
9
10
|
static tryWrap<TModule extends NodeModule = NodeModule>(module?: TModule, account?: AccountInstance): NodeWrapper | undefined;
|
|
10
11
|
static wrap<TModule extends NodeModule = NodeModule>(module?: TModule, account?: AccountInstance): NodeWrapper;
|
|
11
12
|
attach(address: string, external?: boolean): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeWrapper.d.ts","sourceRoot":"","sources":["../../src/NodeWrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"NodeWrapper.d.ts","sourceRoot":"","sources":["../../src/NodeWrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAI3D,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAYnC,qBAAa,WAAY,SAAQ,aAAa,CAAC,UAAU,CAAE,YAAW,UAAU;IAC9E,OAAgB,eAAe,WAA+D;IAE9F,OAAO,CAAC,UAAU,CAAC,CAAkB;IAErC,IAAI,SAAS,qBAGZ;IAED,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM;WAKlB,OAAO,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,WAAW,GAAG,SAAS;WAWtH,IAAI,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,WAAW;IAIjH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1D,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAM7B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtC,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAKtC"}
|
package/package.json
CHANGED
|
@@ -13,16 +13,16 @@
|
|
|
13
13
|
"@xylabs/assert": "^2.7.4",
|
|
14
14
|
"@xylabs/exists": "^2.7.4",
|
|
15
15
|
"@xylabs/promise": "^2.7.4",
|
|
16
|
-
"@xyo-network/account": "^2.51.
|
|
17
|
-
"@xyo-network/account-model": "^2.51.
|
|
18
|
-
"@xyo-network/address-payload-plugin": "^2.51.
|
|
19
|
-
"@xyo-network/archivist-wrapper": "^2.51.
|
|
20
|
-
"@xyo-network/module": "^2.51.
|
|
21
|
-
"@xyo-network/module-model": "^2.51.
|
|
22
|
-
"@xyo-network/payload-builder": "^2.51.
|
|
23
|
-
"@xyo-network/payload-model": "^2.51.
|
|
24
|
-
"@xyo-network/payload-wrapper": "^2.51.
|
|
25
|
-
"@xyo-network/promise": "^2.51.
|
|
16
|
+
"@xyo-network/account": "^2.51.6",
|
|
17
|
+
"@xyo-network/account-model": "^2.51.6",
|
|
18
|
+
"@xyo-network/address-payload-plugin": "^2.51.6",
|
|
19
|
+
"@xyo-network/archivist-wrapper": "^2.51.6",
|
|
20
|
+
"@xyo-network/module": "^2.51.6",
|
|
21
|
+
"@xyo-network/module-model": "^2.51.6",
|
|
22
|
+
"@xyo-network/payload-builder": "^2.51.6",
|
|
23
|
+
"@xyo-network/payload-model": "^2.51.6",
|
|
24
|
+
"@xyo-network/payload-wrapper": "^2.51.6",
|
|
25
|
+
"@xyo-network/promise": "^2.51.6"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@xylabs/ts-scripts-yarn3": "^2.16.1",
|
|
@@ -62,5 +62,5 @@
|
|
|
62
62
|
},
|
|
63
63
|
"sideEffects": false,
|
|
64
64
|
"types": "dist/types/index.d.ts",
|
|
65
|
-
"version": "2.51.
|
|
65
|
+
"version": "2.51.6"
|
|
66
66
|
}
|
package/src/MemoryNode.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
2
|
import { exists } from '@xylabs/exists'
|
|
3
3
|
import { fulfilled, rejected } from '@xylabs/promise'
|
|
4
|
-
import { duplicateModules, Module, ModuleFilter } from '@xyo-network/module'
|
|
4
|
+
import { duplicateModules, Module, ModuleFilter, ModuleWrapper } from '@xyo-network/module'
|
|
5
5
|
|
|
6
6
|
import { AbstractNode, AbstractNodeParams } from './AbstractNode'
|
|
7
7
|
import { NodeConfig, NodeConfigSchema } from './Config'
|
|
8
|
+
import { ModuleAttachedEventArgs, ModuleAttachedEventEmitter, ModuleDetachedEventArgs, ModuleDetachedEventEmitter } from './Events'
|
|
9
|
+
import { NodeModule } from './Node'
|
|
10
|
+
import { NodeWrapper } from './NodeWrapper'
|
|
8
11
|
|
|
9
12
|
export type MemoryNodeParams<TConfig extends NodeConfig = NodeConfig> = AbstractNodeParams<TConfig>
|
|
10
13
|
|
|
@@ -22,6 +25,32 @@ export class MemoryNode<TParams extends MemoryNodeParams = MemoryNodeParams> ext
|
|
|
22
25
|
assertEx(!existingModule, `Module [${existingModule?.config.name ?? existingModule?.address}] already attached at address [${address}]`)
|
|
23
26
|
const module = assertEx(this.registeredModuleMap[address], 'No module registered at that address')
|
|
24
27
|
|
|
28
|
+
const wrapper = ModuleWrapper.wrap(module)
|
|
29
|
+
const notifiedAddresses: string[] = []
|
|
30
|
+
const notifyOfExistingModules = async (node: ModuleWrapper) => {
|
|
31
|
+
//send attach events for all existing attached modules
|
|
32
|
+
const childModules = await node.resolve()
|
|
33
|
+
childModules.map((child) => {
|
|
34
|
+
//don't report self
|
|
35
|
+
if (node.address === child.address) {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//prevent loop
|
|
40
|
+
if (notifiedAddresses.includes(child.address)) {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
notifiedAddresses.push(child.address)
|
|
44
|
+
const args = { module: child, name: child.config.name }
|
|
45
|
+
this.moduleAttachedEventListeners?.map((listener) => listener(args))
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
await notifyOfExistingModules(wrapper)
|
|
50
|
+
|
|
51
|
+
const args = { module, name: module.config.name }
|
|
52
|
+
this.moduleAttachedEventListeners?.map((listener) => listener(args))
|
|
53
|
+
|
|
25
54
|
this.privateResolver.addResolver(module.downResolver)
|
|
26
55
|
|
|
27
56
|
//give it inside access
|
|
@@ -35,11 +64,19 @@ export class MemoryNode<TParams extends MemoryNodeParams = MemoryNodeParams> ext
|
|
|
35
64
|
this.downResolver.addResolver(module.downResolver)
|
|
36
65
|
}
|
|
37
66
|
|
|
38
|
-
|
|
39
|
-
|
|
67
|
+
if (NodeWrapper.isNodeModule(module)) {
|
|
68
|
+
if (external) {
|
|
69
|
+
const wrappedAsNode = NodeWrapper.wrap(module as NodeModule)
|
|
70
|
+
const attachEmitter = wrappedAsNode.module as ModuleAttachedEventEmitter
|
|
71
|
+
const detachEmitter = wrappedAsNode.module as ModuleDetachedEventEmitter
|
|
72
|
+
|
|
73
|
+
attachEmitter.on('moduleAttached', (args: ModuleAttachedEventArgs) => this.moduleAttachedEventListeners?.map((listener) => listener(args)))
|
|
74
|
+
detachEmitter.on('moduleDetached', (args: ModuleDetachedEventArgs) => this.moduleDetachedEventListeners?.map((listener) => listener(args)))
|
|
75
|
+
}
|
|
76
|
+
}
|
|
40
77
|
}
|
|
41
78
|
|
|
42
|
-
override detach(address: string) {
|
|
79
|
+
override async detach(address: string) {
|
|
43
80
|
const module = assertEx(this.registeredModuleMap[address], 'No module found at that address')
|
|
44
81
|
|
|
45
82
|
this.privateResolver.removeResolver(module.downResolver)
|
|
@@ -55,6 +92,30 @@ export class MemoryNode<TParams extends MemoryNodeParams = MemoryNodeParams> ext
|
|
|
55
92
|
|
|
56
93
|
const args = { module, name: module.config.name }
|
|
57
94
|
this.moduleDetachedEventListeners?.map((listener) => listener(args))
|
|
95
|
+
|
|
96
|
+
//notify of all sub node children detach
|
|
97
|
+
const wrapper = ModuleWrapper.tryWrap(module as NodeModule)
|
|
98
|
+
const notifiedAddresses: string[] = []
|
|
99
|
+
if (wrapper) {
|
|
100
|
+
const notifyOfExistingModules = async (node: ModuleWrapper) => {
|
|
101
|
+
//send attach events for all existing attached modules
|
|
102
|
+
const childModules = await node.resolve()
|
|
103
|
+
childModules.map((child) => {
|
|
104
|
+
//don't report self
|
|
105
|
+
if (node.address === child.address) {
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//prevent loop
|
|
110
|
+
if (notifiedAddresses.includes(child.address)) {
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
notifiedAddresses.push(child.address)
|
|
114
|
+
this.moduleDetachedEventListeners?.map((listener) => listener({ module: child }))
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
await notifyOfExistingModules(wrapper)
|
|
118
|
+
}
|
|
58
119
|
}
|
|
59
120
|
|
|
60
121
|
override register(module: Module) {
|
|
@@ -75,8 +136,8 @@ export class MemoryNode<TParams extends MemoryNodeParams = MemoryNodeParams> ext
|
|
|
75
136
|
})
|
|
76
137
|
}
|
|
77
138
|
|
|
78
|
-
override unregister(module: Module) {
|
|
79
|
-
this.detach(module.address)
|
|
139
|
+
override async unregister(module: Module) {
|
|
140
|
+
await this.detach(module.address)
|
|
80
141
|
delete this.registeredModuleMap[module.address]
|
|
81
142
|
return this
|
|
82
143
|
}
|
package/src/NodeWrapper.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { assertEx } from '@xylabs/assert'
|
|
|
2
2
|
import { AccountInstance } from '@xyo-network/account-model'
|
|
3
3
|
import { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'
|
|
4
4
|
import { ArchivistWrapper } from '@xyo-network/archivist-wrapper'
|
|
5
|
-
import { ModuleWrapper } from '@xyo-network/module'
|
|
5
|
+
import { Module, ModuleWrapper } from '@xyo-network/module'
|
|
6
6
|
import { isXyoPayloadOfSchemaType } from '@xyo-network/payload-model'
|
|
7
7
|
import { PayloadWrapper } from '@xyo-network/payload-wrapper'
|
|
8
8
|
|
|
@@ -28,11 +28,16 @@ export class NodeWrapper extends ModuleWrapper<NodeModule> implements NodeModule
|
|
|
28
28
|
return this._archivist
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
static isNodeModule(module: Module) {
|
|
32
|
+
const missingRequiredQueries = this.missingRequiredQueries(module)
|
|
33
|
+
return missingRequiredQueries.length === 0
|
|
34
|
+
}
|
|
35
|
+
|
|
31
36
|
static override tryWrap<TModule extends NodeModule = NodeModule>(module?: TModule, account?: AccountInstance): NodeWrapper | undefined {
|
|
32
37
|
if (module) {
|
|
33
38
|
const missingRequiredQueries = this.missingRequiredQueries(module)
|
|
34
39
|
if (missingRequiredQueries.length > 0) {
|
|
35
|
-
console.warn(`Missing queries: ${JSON.stringify(missingRequiredQueries, null, 2)}`)
|
|
40
|
+
//console.warn(`Missing queries: ${JSON.stringify(missingRequiredQueries, null, 2)}`)
|
|
36
41
|
} else {
|
|
37
42
|
return new NodeWrapper(module as TModule, account)
|
|
38
43
|
}
|