@xyo-network/react-node 2.59.0-rc.2 → 2.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/hooks/useModuleFromNode.js +29 -89
- package/dist/cjs/hooks/useModuleFromNode.js.map +1 -1
- package/dist/cjs/hooks/useModulesFromNode.js +23 -51
- package/dist/cjs/hooks/useModulesFromNode.js.map +1 -1
- package/dist/docs.json +2844 -0
- package/dist/esm/hooks/useModuleFromNode.js +28 -88
- package/dist/esm/hooks/useModuleFromNode.js.map +1 -1
- package/dist/esm/hooks/useModulesFromNode.js +24 -50
- package/dist/esm/hooks/useModulesFromNode.js.map +1 -1
- package/dist/types/hooks/useModuleFromNode.d.ts.map +1 -1
- package/dist/types/hooks/useModulesFromNode.d.ts +3 -2
- package/dist/types/hooks/useModulesFromNode.d.ts.map +1 -1
- package/package.json +5 -11
- package/src/hooks/useModuleFromNode.ts +45 -0
- package/src/hooks/useModulesFromNode.ts +27 -68
- package/src/hooks/useModuleFromNode.tsx +0 -107
|
@@ -1,96 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { asModuleInstance
|
|
3
|
-
import {
|
|
4
|
-
import { useMemo, useState } from 'react';
|
|
1
|
+
import { usePromise } from '@xylabs/react-promise';
|
|
2
|
+
import { asModuleInstance } from '@xyo-network/module';
|
|
3
|
+
import { useState } from 'react';
|
|
5
4
|
import { useProvidedNode } from './provided';
|
|
6
5
|
export const useModuleFromNode = (nameOrAddress, config) => {
|
|
7
6
|
const [providedNode] = useProvidedNode();
|
|
8
|
-
const
|
|
9
|
-
const [
|
|
10
|
-
const [
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
const activeNode = node ?? providedNode;
|
|
20
|
-
if (activeNode) {
|
|
21
|
-
const attachHandler = (args) => {
|
|
22
|
-
const eventModule = args.module;
|
|
23
|
-
if (nameOrAddress && (eventModule?.address === nameOrAddress || eventModule?.config?.name === nameOrAddress)) {
|
|
24
|
-
logger?.debug(`attachHandler-setting [${nameOrAddress}]`);
|
|
25
|
-
if (eventModule) {
|
|
26
|
-
if (isModuleInstance(eventModule)) {
|
|
27
|
-
setModule(eventModule);
|
|
28
|
-
setError(undefined);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
const error = Error(`Attached module failed identity check [${eventModule.config?.schema}:${eventModule.config?.name}:${eventModule.address}]`);
|
|
32
|
-
console.error(error.message);
|
|
33
|
-
setModule(undefined);
|
|
34
|
-
setError(error);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
setModule(undefined);
|
|
39
|
-
setError(undefined);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
const detachHandler = (args) => {
|
|
44
|
-
const eventModule = args.module;
|
|
45
|
-
if (eventModule.address === address) {
|
|
46
|
-
logger?.debug(`detachHandler-clearing [${address}]`);
|
|
47
|
-
setModule(undefined);
|
|
48
|
-
setError(undefined);
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
const module = nameOrAddress ? await activeNode.resolve(nameOrAddress, resolverConfig) : undefined;
|
|
52
|
-
if (mounted()) {
|
|
53
|
-
const instance = asModuleInstance(module);
|
|
54
|
-
if (module) {
|
|
55
|
-
if (!instance) {
|
|
56
|
-
const error = Error(`Attached module failed identity check [${module.config?.schema}:${module.config?.name}:${module.address}]`);
|
|
57
|
-
setModule(undefined);
|
|
58
|
-
setError(error);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
eventUnsubscribe.push(activeNode.on('moduleAttached', attachHandler));
|
|
62
|
-
eventUnsubscribe.push(activeNode.on('moduleDetached', detachHandler));
|
|
63
|
-
logger?.debug(`resolved [${nameOrAddress}]`);
|
|
64
|
-
setModule(instance ?? null);
|
|
65
|
-
setError(undefined);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
setModule(undefined);
|
|
70
|
-
setError(undefined);
|
|
71
|
-
}
|
|
7
|
+
const { logger, node: paramNode, ...resolveConfig } = config ?? {};
|
|
8
|
+
const [result, setResult] = useState();
|
|
9
|
+
const [, error] = usePromise(async () => {
|
|
10
|
+
logger?.debug('useModuleFromNode: resolving');
|
|
11
|
+
const activeNode = paramNode ?? providedNode;
|
|
12
|
+
if (activeNode && nameOrAddress) {
|
|
13
|
+
activeNode.on('moduleAttached', ({ module }) => {
|
|
14
|
+
logger?.debug(`useModuleFromNode: moduleAttached [${module.config.name ?? module.address}]`);
|
|
15
|
+
if (module.address === nameOrAddress || module.config?.name === nameOrAddress) {
|
|
16
|
+
setResult(asModuleInstance(module));
|
|
72
17
|
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
18
|
+
});
|
|
19
|
+
activeNode.on('moduleDetached', ({ module }) => {
|
|
20
|
+
logger?.debug(`useModuleFromNode: moduleDetached [${module.config.name ?? module.address}]`);
|
|
21
|
+
if (module.address === nameOrAddress || module.config?.name === nameOrAddress) {
|
|
22
|
+
setResult(undefined);
|
|
78
23
|
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
24
|
+
});
|
|
25
|
+
const result = await activeNode.resolve(nameOrAddress, resolveConfig);
|
|
26
|
+
console.log(`Result: ${result?.address}`);
|
|
27
|
+
setResult(result);
|
|
28
|
+
return result;
|
|
84
29
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
setModule(undefined);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}, [nameOrAddress, providedNode, address, configMemo]);
|
|
94
|
-
return [module, error];
|
|
30
|
+
console.log('Result: No Node');
|
|
31
|
+
return undefined;
|
|
32
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
33
|
+
}, [paramNode, providedNode, nameOrAddress]);
|
|
34
|
+
return [result, error];
|
|
95
35
|
};
|
|
96
36
|
//# sourceMappingURL=useModuleFromNode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModuleFromNode.js","sourceRoot":"","sources":["../../../src/hooks/useModuleFromNode.
|
|
1
|
+
{"version":3,"file":"useModuleFromNode.js","sourceRoot":"","sources":["../../../src/hooks/useModuleFromNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAGtD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAO5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,aAAsB,EAAE,MAA6B,EAAmD,EAAE;IAC1I,MAAM,CAAC,YAAY,CAAC,GAAG,eAAe,EAAE,CAAA;IACxC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAClE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAA8B,CAAA;IAClE,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAC7C,MAAM,UAAU,GAAG,SAAS,IAAI,YAAY,CAAA;QAC5C,IAAI,UAAU,IAAI,aAAa,EAAE;YAC/B,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC7C,MAAM,EAAE,KAAK,CAAC,sCAAsC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;gBAC5F,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,aAAa,EAAE;oBAC7E,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAA;iBACpC;YACH,CAAC,CAAC,CAAA;YACF,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC7C,MAAM,EAAE,KAAK,CAAC,sCAAsC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;gBAC5F,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,aAAa,EAAE;oBAC7E,SAAS,CAAC,SAAS,CAAC,CAAA;iBACrB;YACH,CAAC,CAAC,CAAA;YACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA;YACrE,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;YACzC,SAAS,CAAC,MAAM,CAAC,CAAA;YACjB,OAAO,MAAM,CAAA;SACd;QACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC9B,OAAO,SAAS,CAAA;QAChB,uDAAuD;IACzD,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAA;IAC5C,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACxB,CAAC,CAAA"}
|
|
@@ -1,58 +1,32 @@
|
|
|
1
1
|
import { usePromise } from '@xylabs/react-promise';
|
|
2
|
-
import {
|
|
3
|
-
import { useRefresh } from '@xyo-network/react-module';
|
|
4
|
-
import { useDataState } from '@xyo-network/react-shared';
|
|
5
|
-
import compact from 'lodash/compact';
|
|
6
|
-
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { useState } from 'react';
|
|
7
3
|
import { useProvidedNode } from './provided';
|
|
8
4
|
export const useModulesFromNode = (filter, config) => {
|
|
9
5
|
const [providedNode] = useProvidedNode();
|
|
10
|
-
const
|
|
11
|
-
const [
|
|
12
|
-
const [
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const modulesLength = useRef();
|
|
16
|
-
const eventUnsubscribe = [];
|
|
17
|
-
const [, resolvedModulesError] = usePromise(async () => {
|
|
18
|
-
const { logger, ...resolverConfig } = configMemo ?? {};
|
|
19
|
-
const activeNode = configMemo?.node ?? providedNode;
|
|
6
|
+
const { logger, node: paramNode, ...resolveConfig } = config ?? {};
|
|
7
|
+
const [result, setResult] = useState();
|
|
8
|
+
const [, error] = usePromise(async () => {
|
|
9
|
+
logger?.debug('useModuleFromNode: resolving');
|
|
10
|
+
const activeNode = paramNode ?? providedNode;
|
|
20
11
|
if (activeNode) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
12
|
+
activeNode.on('moduleAttached', async ({ module }) => {
|
|
13
|
+
logger?.debug(`useModuleFromNode: moduleAttached [${module.config.name ?? module.address}]`);
|
|
14
|
+
const moduleInstances = await activeNode.resolve(filter, resolveConfig);
|
|
15
|
+
setResult(moduleInstances);
|
|
16
|
+
});
|
|
17
|
+
activeNode.on('moduleDetached', async ({ module }) => {
|
|
18
|
+
logger?.debug(`useModuleFromNode: moduleDetached [${module.config.name ?? module.address}]`);
|
|
19
|
+
const moduleInstances = await activeNode.resolve(filter, resolveConfig);
|
|
20
|
+
setResult(moduleInstances);
|
|
21
|
+
});
|
|
22
|
+
const moduleInstances = await activeNode.resolve(filter, resolveConfig);
|
|
23
|
+
setResult(moduleInstances);
|
|
24
|
+
setResult(moduleInstances);
|
|
25
|
+
return moduleInstances;
|
|
29
26
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const activeNode = node ?? providedNode;
|
|
35
|
-
if (activeNode) {
|
|
36
|
-
while (eventUnsubscribe.length) {
|
|
37
|
-
eventUnsubscribe.pop()?.();
|
|
38
|
-
}
|
|
39
|
-
eventUnsubscribe.push(activeNode.on('moduleAttached', ({ module }) => {
|
|
40
|
-
logger?.debug(`moduleAttached: useModulesFromNode [${module.config.name ?? module.address}]`);
|
|
41
|
-
refresh();
|
|
42
|
-
}));
|
|
43
|
-
eventUnsubscribe.push(activeNode.on('moduleDetached', ({ module }) => {
|
|
44
|
-
logger?.debug(`moduleDetached: useModulesFromNode [${module.config.name ?? module.address}]`);
|
|
45
|
-
refresh();
|
|
46
|
-
}));
|
|
47
|
-
}
|
|
48
|
-
return () => {
|
|
49
|
-
//unsubscribe events
|
|
50
|
-
eventUnsubscribe.forEach((func) => func());
|
|
51
|
-
while (eventUnsubscribe.length) {
|
|
52
|
-
eventUnsubscribe.pop();
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
}, [providedNode, configMemo]);
|
|
56
|
-
return [resolvedModules, resolvedModulesError];
|
|
27
|
+
console.log('Result: No Node');
|
|
28
|
+
return undefined;
|
|
29
|
+
}, [paramNode, providedNode, filter]);
|
|
30
|
+
return [result, error];
|
|
57
31
|
};
|
|
58
32
|
//# sourceMappingURL=useModulesFromNode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModulesFromNode.js","sourceRoot":"","sources":["../../../src/hooks/useModulesFromNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"useModulesFromNode.js","sourceRoot":"","sources":["../../../src/hooks/useModulesFromNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGlD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAG5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAqB,EAAE,MAA6B,EAAqD,EAAE;IAC5I,MAAM,CAAC,YAAY,CAAC,GAAG,eAAe,EAAE,CAAA;IACxC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAClE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAgC,CAAA;IACpE,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAC7C,MAAM,UAAU,GAAG,SAAS,IAAI,YAAY,CAAA;QAC5C,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;gBACnD,MAAM,EAAE,KAAK,CAAC,sCAAsC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;gBAC5F,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;gBACvE,SAAS,CAAC,eAAe,CAAC,CAAA;YAC5B,CAAC,CAAC,CAAA;YACF,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;gBACnD,MAAM,EAAE,KAAK,CAAC,sCAAsC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;gBAC5F,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;gBACvE,SAAS,CAAC,eAAe,CAAC,CAAA;YAC5B,CAAC,CAAC,CAAA;YACF,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;YACvE,SAAS,CAAC,eAAe,CAAC,CAAA;YAC1B,SAAS,CAAC,eAAe,CAAC,CAAA;YAC1B,OAAO,eAAe,CAAA;SACvB;QACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC9B,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;IACrC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACxB,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModuleFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useModuleFromNode.
|
|
1
|
+
{"version":3,"file":"useModuleFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useModuleFromNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKhD,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,iBAAiB,mBAAoB,MAAM,WAAW,oBAAoB,KAAG,CAAC,cAAc,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CA8BvI,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ModuleFilter
|
|
1
|
+
import { ModuleFilter } from '@xyo-network/module';
|
|
2
|
+
import { ModuleInstance } from '@xyo-network/module-model';
|
|
2
3
|
import { ModuleFromNodeConfig } from './useModuleFromNode';
|
|
3
|
-
export declare const useModulesFromNode: (filter?: ModuleFilter, config?: ModuleFromNodeConfig) => [ModuleInstance[] |
|
|
4
|
+
export declare const useModulesFromNode: (filter?: ModuleFilter, config?: ModuleFromNodeConfig) => [ModuleInstance[] | undefined, Error | undefined];
|
|
4
5
|
//# sourceMappingURL=useModulesFromNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModulesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useModulesFromNode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useModulesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useModulesFromNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAI1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,eAAO,MAAM,kBAAkB,YAAa,YAAY,WAAW,oBAAoB,KAAG,CAAC,cAAc,EAAE,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CA2BzI,CAAA"}
|
package/package.json
CHANGED
|
@@ -17,24 +17,19 @@
|
|
|
17
17
|
"@xylabs/react-shared": "~2.17.7",
|
|
18
18
|
"@xyo-network/logger": "^2.67.0",
|
|
19
19
|
"@xyo-network/module": "^2.67.0",
|
|
20
|
-
"@xyo-network/module-events": "^2.67.0",
|
|
21
20
|
"@xyo-network/module-model": "^2.67.0",
|
|
22
21
|
"@xyo-network/node": "^2.67.0",
|
|
23
22
|
"@xyo-network/node-model": "^2.67.0",
|
|
24
|
-
"@xyo-network/react-
|
|
25
|
-
"@xyo-network/react-node-
|
|
26
|
-
"@xyo-network/react-node-provider": "~2.59.0-rc.2",
|
|
27
|
-
"@xyo-network/react-shared": "~2.59.0-rc.2",
|
|
28
|
-
"lodash": "^4.17.21"
|
|
23
|
+
"@xyo-network/react-node-context": "~2.59.0",
|
|
24
|
+
"@xyo-network/react-node-provider": "~2.59.0"
|
|
29
25
|
},
|
|
30
26
|
"devDependencies": {
|
|
31
27
|
"@storybook/react": "^7.1.1",
|
|
32
|
-
"@types/lodash": "^4.14.196",
|
|
33
28
|
"@xylabs/ts-scripts-yarn3": "^2.19.0",
|
|
34
29
|
"@xylabs/tsconfig-react": "^2.19.0",
|
|
35
30
|
"@xyo-network/payload-model": "^2.67.0",
|
|
36
|
-
"@xyo-network/react-storybook": "~2.59.0
|
|
37
|
-
"@xyo-network/react-wallet": "~2.59.0
|
|
31
|
+
"@xyo-network/react-storybook": "~2.59.0",
|
|
32
|
+
"@xyo-network/react-wallet": "~2.59.0",
|
|
38
33
|
"typescript": "^5.1.6"
|
|
39
34
|
},
|
|
40
35
|
"peerDependencies": {
|
|
@@ -89,6 +84,5 @@
|
|
|
89
84
|
},
|
|
90
85
|
"sideEffects": false,
|
|
91
86
|
"types": "dist/types/index.d.ts",
|
|
92
|
-
"version": "2.59.0
|
|
93
|
-
"stableVersion": "2.58.0"
|
|
87
|
+
"version": "2.59.0"
|
|
94
88
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { usePromise } from '@xylabs/react-promise'
|
|
2
|
+
import { Logger } from '@xyo-network/logger'
|
|
3
|
+
import { asModuleInstance } from '@xyo-network/module'
|
|
4
|
+
import { ModuleFilterOptions, ModuleInstance } from '@xyo-network/module-model'
|
|
5
|
+
import { NodeInstance } from '@xyo-network/node'
|
|
6
|
+
import { useState } from 'react'
|
|
7
|
+
|
|
8
|
+
import { useProvidedNode } from './provided'
|
|
9
|
+
|
|
10
|
+
export type ModuleFromNodeConfig = ModuleFilterOptions & {
|
|
11
|
+
logger?: Logger
|
|
12
|
+
node?: NodeInstance
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const useModuleFromNode = (nameOrAddress?: string, config?: ModuleFromNodeConfig): [ModuleInstance | undefined, Error | undefined] => {
|
|
16
|
+
const [providedNode] = useProvidedNode()
|
|
17
|
+
const { logger, node: paramNode, ...resolveConfig } = config ?? {}
|
|
18
|
+
const [result, setResult] = useState<ModuleInstance | undefined>()
|
|
19
|
+
const [, error] = usePromise(async () => {
|
|
20
|
+
logger?.debug('useModuleFromNode: resolving')
|
|
21
|
+
const activeNode = paramNode ?? providedNode
|
|
22
|
+
if (activeNode && nameOrAddress) {
|
|
23
|
+
activeNode.on('moduleAttached', ({ module }) => {
|
|
24
|
+
logger?.debug(`useModuleFromNode: moduleAttached [${module.config.name ?? module.address}]`)
|
|
25
|
+
if (module.address === nameOrAddress || module.config?.name === nameOrAddress) {
|
|
26
|
+
setResult(asModuleInstance(module))
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
activeNode.on('moduleDetached', ({ module }) => {
|
|
30
|
+
logger?.debug(`useModuleFromNode: moduleDetached [${module.config.name ?? module.address}]`)
|
|
31
|
+
if (module.address === nameOrAddress || module.config?.name === nameOrAddress) {
|
|
32
|
+
setResult(undefined)
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
const result = await activeNode.resolve(nameOrAddress, resolveConfig)
|
|
36
|
+
console.log(`Result: ${result?.address}`)
|
|
37
|
+
setResult(result)
|
|
38
|
+
return result
|
|
39
|
+
}
|
|
40
|
+
console.log('Result: No Node')
|
|
41
|
+
return undefined
|
|
42
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
43
|
+
}, [paramNode, providedNode, nameOrAddress])
|
|
44
|
+
return [result, error]
|
|
45
|
+
}
|
|
@@ -1,77 +1,36 @@
|
|
|
1
1
|
import { usePromise } from '@xylabs/react-promise'
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { useDataState } from '@xyo-network/react-shared'
|
|
6
|
-
import compact from 'lodash/compact'
|
|
7
|
-
import { useEffect, useRef, useState } from 'react'
|
|
2
|
+
import { ModuleFilter } from '@xyo-network/module'
|
|
3
|
+
import { ModuleInstance } from '@xyo-network/module-model'
|
|
4
|
+
import { useState } from 'react'
|
|
8
5
|
|
|
9
6
|
import { useProvidedNode } from './provided'
|
|
10
7
|
import { ModuleFromNodeConfig } from './useModuleFromNode'
|
|
11
8
|
|
|
12
|
-
export const useModulesFromNode = (
|
|
13
|
-
filter?: ModuleFilter,
|
|
14
|
-
config?: ModuleFromNodeConfig,
|
|
15
|
-
): [ModuleInstance[] | null | undefined, Error | undefined] => {
|
|
9
|
+
export const useModulesFromNode = (filter?: ModuleFilter, config?: ModuleFromNodeConfig): [ModuleInstance[] | undefined, Error | undefined] => {
|
|
16
10
|
const [providedNode] = useProvidedNode()
|
|
17
|
-
const
|
|
18
|
-
const [
|
|
19
|
-
const [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//we store this to prevent the need of a deep compare to prevent re-render
|
|
24
|
-
const modulesLength = useRef<number>()
|
|
25
|
-
|
|
26
|
-
const eventUnsubscribe: EventUnsubscribeFunction[] = []
|
|
27
|
-
|
|
28
|
-
const [, resolvedModulesError] = usePromise<number | null | undefined>(async () => {
|
|
29
|
-
const { logger, ...resolverConfig } = configMemo ?? {}
|
|
30
|
-
const activeNode = configMemo?.node ?? providedNode
|
|
31
|
-
if (activeNode) {
|
|
32
|
-
const allResolvedModules = compact(
|
|
33
|
-
(await activeNode.resolve(filter, resolverConfig)).map((module) => (isModuleInstance(module) ? module : undefined)),
|
|
34
|
-
)
|
|
35
|
-
logger?.debug(`getModulesFromResolution:allResolvedModules [${allResolvedModules?.length}]`)
|
|
36
|
-
if (allResolvedModules?.length !== modulesLength.current) {
|
|
37
|
-
logger?.debug(`getModulesFromResolution-setting: [${allResolvedModules?.length}]`)
|
|
38
|
-
modulesLength.current = allResolvedModules?.length
|
|
39
|
-
setResolvedModules(allResolvedModules)
|
|
40
|
-
return allResolvedModules?.length
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return modulesLength.current
|
|
44
|
-
}, [providedNode, filter, configMemo, refreshed])
|
|
45
|
-
|
|
46
|
-
useEffect(() => {
|
|
47
|
-
const { logger, node } = configMemo ?? {}
|
|
48
|
-
const activeNode = node ?? providedNode
|
|
11
|
+
const { logger, node: paramNode, ...resolveConfig } = config ?? {}
|
|
12
|
+
const [result, setResult] = useState<ModuleInstance[] | undefined>()
|
|
13
|
+
const [, error] = usePromise(async () => {
|
|
14
|
+
logger?.debug('useModuleFromNode: resolving')
|
|
15
|
+
const activeNode = paramNode ?? providedNode
|
|
49
16
|
if (activeNode) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
)
|
|
17
|
+
activeNode.on('moduleAttached', async ({ module }) => {
|
|
18
|
+
logger?.debug(`useModuleFromNode: moduleAttached [${module.config.name ?? module.address}]`)
|
|
19
|
+
const moduleInstances = await activeNode.resolve(filter, resolveConfig)
|
|
20
|
+
setResult(moduleInstances)
|
|
21
|
+
})
|
|
22
|
+
activeNode.on('moduleDetached', async ({ module }) => {
|
|
23
|
+
logger?.debug(`useModuleFromNode: moduleDetached [${module.config.name ?? module.address}]`)
|
|
24
|
+
const moduleInstances = await activeNode.resolve(filter, resolveConfig)
|
|
25
|
+
setResult(moduleInstances)
|
|
26
|
+
})
|
|
27
|
+
const moduleInstances = await activeNode.resolve(filter, resolveConfig)
|
|
28
|
+
setResult(moduleInstances)
|
|
29
|
+
setResult(moduleInstances)
|
|
30
|
+
return moduleInstances
|
|
65
31
|
}
|
|
66
|
-
|
|
67
|
-
return
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
while (eventUnsubscribe.length) {
|
|
71
|
-
eventUnsubscribe.pop()
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}, [providedNode, configMemo])
|
|
75
|
-
|
|
76
|
-
return [resolvedModules, resolvedModulesError]
|
|
32
|
+
console.log('Result: No Node')
|
|
33
|
+
return undefined
|
|
34
|
+
}, [paramNode, providedNode, filter])
|
|
35
|
+
return [result, error]
|
|
77
36
|
}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { useAsyncEffect } from '@xylabs/react-async-effect'
|
|
2
|
-
import { Logger } from '@xyo-network/logger'
|
|
3
|
-
import { EventUnsubscribeFunction } from '@xyo-network/module-events'
|
|
4
|
-
import { asModuleInstance, isModuleInstance, ModuleFilterOptions, ModuleInstance } from '@xyo-network/module-model'
|
|
5
|
-
import { ModuleAttachedEventArgs, ModuleDetachedEventArgs, NodeInstance } from '@xyo-network/node'
|
|
6
|
-
import { useDataState } from '@xyo-network/react-shared'
|
|
7
|
-
import { useMemo, useState } from 'react'
|
|
8
|
-
|
|
9
|
-
import { useProvidedNode } from './provided'
|
|
10
|
-
|
|
11
|
-
export type ModuleFromNodeConfig = ModuleFilterOptions & {
|
|
12
|
-
logger?: Logger
|
|
13
|
-
node?: NodeInstance
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const useModuleFromNode = (nameOrAddress?: string, config?: ModuleFromNodeConfig): [ModuleInstance | undefined, Error | undefined] => {
|
|
17
|
-
const [providedNode] = useProvidedNode()
|
|
18
|
-
const [module, setModule] = useState<ModuleInstance>()
|
|
19
|
-
const [error, setError] = useState<Error>()
|
|
20
|
-
const [configMemo, setConfigMemo] = useDataState(config)
|
|
21
|
-
|
|
22
|
-
setConfigMemo(config)
|
|
23
|
-
|
|
24
|
-
const address = useMemo(() => module?.address, [module])
|
|
25
|
-
|
|
26
|
-
useAsyncEffect(
|
|
27
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
28
|
-
async (mounted) => {
|
|
29
|
-
const { logger, node, ...resolverConfig } = configMemo ?? {}
|
|
30
|
-
const eventUnsubscribe: EventUnsubscribeFunction[] = []
|
|
31
|
-
try {
|
|
32
|
-
const activeNode = node ?? providedNode
|
|
33
|
-
if (activeNode) {
|
|
34
|
-
const attachHandler = (args: ModuleAttachedEventArgs) => {
|
|
35
|
-
const eventModule = args.module
|
|
36
|
-
if (nameOrAddress && (eventModule?.address === nameOrAddress || eventModule?.config?.name === nameOrAddress)) {
|
|
37
|
-
logger?.debug(`attachHandler-setting [${nameOrAddress}]`)
|
|
38
|
-
if (eventModule) {
|
|
39
|
-
if (isModuleInstance(eventModule)) {
|
|
40
|
-
setModule(eventModule)
|
|
41
|
-
setError(undefined)
|
|
42
|
-
} else {
|
|
43
|
-
const error = Error(
|
|
44
|
-
`Attached module failed identity check [${eventModule.config?.schema}:${eventModule.config?.name}:${eventModule.address}]`,
|
|
45
|
-
)
|
|
46
|
-
console.error(error.message)
|
|
47
|
-
setModule(undefined)
|
|
48
|
-
setError(error)
|
|
49
|
-
}
|
|
50
|
-
} else {
|
|
51
|
-
setModule(undefined)
|
|
52
|
-
setError(undefined)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const detachHandler = (args: ModuleDetachedEventArgs) => {
|
|
57
|
-
const eventModule = args.module
|
|
58
|
-
if (eventModule.address === address) {
|
|
59
|
-
logger?.debug(`detachHandler-clearing [${address}]`)
|
|
60
|
-
setModule(undefined)
|
|
61
|
-
setError(undefined)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
const module = nameOrAddress ? await activeNode.resolve(nameOrAddress, resolverConfig) : undefined
|
|
65
|
-
if (mounted()) {
|
|
66
|
-
const instance = asModuleInstance(module)
|
|
67
|
-
if (module) {
|
|
68
|
-
if (!instance) {
|
|
69
|
-
const error = Error(`Attached module failed identity check [${module.config?.schema}:${module.config?.name}:${module.address}]`)
|
|
70
|
-
setModule(undefined)
|
|
71
|
-
setError(error)
|
|
72
|
-
} else {
|
|
73
|
-
eventUnsubscribe.push(activeNode.on('moduleAttached', attachHandler))
|
|
74
|
-
eventUnsubscribe.push(activeNode.on('moduleDetached', detachHandler))
|
|
75
|
-
logger?.debug(`resolved [${nameOrAddress}]`)
|
|
76
|
-
setModule(instance ?? null)
|
|
77
|
-
setError(undefined)
|
|
78
|
-
}
|
|
79
|
-
} else {
|
|
80
|
-
setModule(undefined)
|
|
81
|
-
setError(undefined)
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
} else {
|
|
85
|
-
if (mounted()) {
|
|
86
|
-
setModule(activeNode ? activeNode : undefined)
|
|
87
|
-
setError(undefined)
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return () => {
|
|
91
|
-
//remove the event handler on unmount
|
|
92
|
-
eventUnsubscribe.forEach((func) => func())
|
|
93
|
-
}
|
|
94
|
-
} catch (ex) {
|
|
95
|
-
if (mounted()) {
|
|
96
|
-
const error = ex as Error
|
|
97
|
-
logger?.error(error.message)
|
|
98
|
-
setError(error)
|
|
99
|
-
setModule(undefined)
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
[nameOrAddress, providedNode, address, configMemo],
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
return [module, error]
|
|
107
|
-
}
|