@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.
@@ -1,96 +1,36 @@
1
- import { useAsyncEffect } from '@xylabs/react-async-effect';
2
- import { asModuleInstance, isModuleInstance } from '@xyo-network/module-model';
3
- import { useDataState } from '@xyo-network/react-shared';
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 [module, setModule] = useState();
9
- const [error, setError] = useState();
10
- const [configMemo, setConfigMemo] = useDataState(config);
11
- setConfigMemo(config);
12
- const address = useMemo(() => module?.address, [module]);
13
- useAsyncEffect(
14
- // eslint-disable-next-line react-hooks/exhaustive-deps
15
- async (mounted) => {
16
- const { logger, node, ...resolverConfig } = configMemo ?? {};
17
- const eventUnsubscribe = [];
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
- else {
75
- if (mounted()) {
76
- setModule(activeNode ? activeNode : undefined);
77
- setError(undefined);
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
- return () => {
81
- //remove the event handler on unmount
82
- eventUnsubscribe.forEach((func) => func());
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
- catch (ex) {
86
- if (mounted()) {
87
- const error = ex;
88
- logger?.error(error.message);
89
- setError(error);
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.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAG3D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAuC,MAAM,2BAA2B,CAAA;AAEnH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEzC,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,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAkB,CAAA;IACtD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAS,CAAA;IAC3C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IAExD,aAAa,CAAC,MAAM,CAAC,CAAA;IAErB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAExD,cAAc;IACZ,uDAAuD;IACvD,KAAK,EAAE,OAAO,EAAE,EAAE;QAChB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,GAAG,UAAU,IAAI,EAAE,CAAA;QAC5D,MAAM,gBAAgB,GAA+B,EAAE,CAAA;QACvD,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,IAAI,YAAY,CAAA;YACvC,IAAI,UAAU,EAAE;gBACd,MAAM,aAAa,GAAG,CAAC,IAA6B,EAAE,EAAE;oBACtD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAA;oBAC/B,IAAI,aAAa,IAAI,CAAC,WAAW,EAAE,OAAO,KAAK,aAAa,IAAI,WAAW,EAAE,MAAM,EAAE,IAAI,KAAK,aAAa,CAAC,EAAE;wBAC5G,MAAM,EAAE,KAAK,CAAC,0BAA0B,aAAa,GAAG,CAAC,CAAA;wBACzD,IAAI,WAAW,EAAE;4BACf,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE;gCACjC,SAAS,CAAC,WAAW,CAAC,CAAA;gCACtB,QAAQ,CAAC,SAAS,CAAC,CAAA;6BACpB;iCAAM;gCACL,MAAM,KAAK,GAAG,KAAK,CACjB,0CAA0C,WAAW,CAAC,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,IAAI,WAAW,CAAC,OAAO,GAAG,CAC3H,CAAA;gCACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gCAC5B,SAAS,CAAC,SAAS,CAAC,CAAA;gCACpB,QAAQ,CAAC,KAAK,CAAC,CAAA;6BAChB;yBACF;6BAAM;4BACL,SAAS,CAAC,SAAS,CAAC,CAAA;4BACpB,QAAQ,CAAC,SAAS,CAAC,CAAA;yBACpB;qBACF;gBACH,CAAC,CAAA;gBACD,MAAM,aAAa,GAAG,CAAC,IAA6B,EAAE,EAAE;oBACtD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAA;oBAC/B,IAAI,WAAW,CAAC,OAAO,KAAK,OAAO,EAAE;wBACnC,MAAM,EAAE,KAAK,CAAC,2BAA2B,OAAO,GAAG,CAAC,CAAA;wBACpD,SAAS,CAAC,SAAS,CAAC,CAAA;wBACpB,QAAQ,CAAC,SAAS,CAAC,CAAA;qBACpB;gBACH,CAAC,CAAA;gBACD,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;gBAClG,IAAI,OAAO,EAAE,EAAE;oBACb,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;oBACzC,IAAI,MAAM,EAAE;wBACV,IAAI,CAAC,QAAQ,EAAE;4BACb,MAAM,KAAK,GAAG,KAAK,CAAC,0CAA0C,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;4BAChI,SAAS,CAAC,SAAS,CAAC,CAAA;4BACpB,QAAQ,CAAC,KAAK,CAAC,CAAA;yBAChB;6BAAM;4BACL,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAA;4BACrE,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAA;4BACrE,MAAM,EAAE,KAAK,CAAC,aAAa,aAAa,GAAG,CAAC,CAAA;4BAC5C,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAA;4BAC3B,QAAQ,CAAC,SAAS,CAAC,CAAA;yBACpB;qBACF;yBAAM;wBACL,SAAS,CAAC,SAAS,CAAC,CAAA;wBACpB,QAAQ,CAAC,SAAS,CAAC,CAAA;qBACpB;iBACF;aACF;iBAAM;gBACL,IAAI,OAAO,EAAE,EAAE;oBACb,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;oBAC9C,QAAQ,CAAC,SAAS,CAAC,CAAA;iBACpB;aACF;YACD,OAAO,GAAG,EAAE;gBACV,qCAAqC;gBACrC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;YAC5C,CAAC,CAAA;SACF;QAAC,OAAO,EAAE,EAAE;YACX,IAAI,OAAO,EAAE,EAAE;gBACb,MAAM,KAAK,GAAG,EAAW,CAAA;gBACzB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gBAC5B,QAAQ,CAAC,KAAK,CAAC,CAAA;gBACf,SAAS,CAAC,SAAS,CAAC,CAAA;aACrB;SACF;IACH,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC,CACnD,CAAA;IAED,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACxB,CAAC,CAAA"}
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 { isModuleInstance } from '@xyo-network/module-model';
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 [configMemo, setConfigMemo] = useDataState(config);
11
- const [refreshed, refresh] = useRefresh();
12
- const [resolvedModules, setResolvedModules] = useState();
13
- setConfigMemo(config);
14
- //we store this to prevent the need of a deep compare to prevent re-render
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
- const allResolvedModules = compact((await activeNode.resolve(filter, resolverConfig)).map((module) => (isModuleInstance(module) ? module : undefined)));
22
- logger?.debug(`getModulesFromResolution:allResolvedModules [${allResolvedModules?.length}]`);
23
- if (allResolvedModules?.length !== modulesLength.current) {
24
- logger?.debug(`getModulesFromResolution-setting: [${allResolvedModules?.length}]`);
25
- modulesLength.current = allResolvedModules?.length;
26
- setResolvedModules(allResolvedModules);
27
- return allResolvedModules?.length;
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
- return modulesLength.current;
31
- }, [providedNode, filter, configMemo, refreshed]);
32
- useEffect(() => {
33
- const { logger, node } = configMemo ?? {};
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":"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"}
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.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,OAAO,EAAsC,mBAAmB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AACnH,OAAO,EAAoD,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAMlG,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,CA2FvI,CAAA"}
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, ModuleInstance } from '@xyo-network/module-model';
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[] | null | undefined, Error | undefined];
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":"AAEA,OAAO,EAAoB,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAO1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,eAAO,MAAM,kBAAkB,YACpB,YAAY,WACZ,oBAAoB,KAC5B,CAAC,cAAc,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CA8DzD,CAAA"}
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-module": "~2.59.0-rc.2",
25
- "@xyo-network/react-node-context": "~2.59.0-rc.2",
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-rc.2",
37
- "@xyo-network/react-wallet": "~2.59.0-rc.2",
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-rc.2",
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 { EventUnsubscribeFunction } from '@xyo-network/module-events'
3
- import { isModuleInstance, ModuleFilter, ModuleInstance } from '@xyo-network/module-model'
4
- import { useRefresh } from '@xyo-network/react-module'
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 [configMemo, setConfigMemo] = useDataState(config)
18
- const [refreshed, refresh] = useRefresh()
19
- const [resolvedModules, setResolvedModules] = useState<ModuleInstance[]>()
20
-
21
- setConfigMemo(config)
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
- while (eventUnsubscribe.length) {
51
- eventUnsubscribe.pop()?.()
52
- }
53
- eventUnsubscribe.push(
54
- activeNode.on('moduleAttached', ({ module }) => {
55
- logger?.debug(`moduleAttached: useModulesFromNode [${module.config.name ?? module.address}]`)
56
- refresh()
57
- }),
58
- )
59
- eventUnsubscribe.push(
60
- activeNode.on('moduleDetached', ({ module }) => {
61
- logger?.debug(`moduleDetached: useModulesFromNode [${module.config.name ?? module.address}]`)
62
- refresh()
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
- //unsubscribe events
69
- eventUnsubscribe.forEach((func) => func())
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
- }