@xyo-network/react-standard-node 2.45.2

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.
Files changed (123) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +13 -0
  3. package/dist/cjs/components/ActiveStandardNode.js +50 -0
  4. package/dist/cjs/components/ActiveStandardNode.js.map +1 -0
  5. package/dist/cjs/components/index.js +5 -0
  6. package/dist/cjs/components/index.js.map +1 -0
  7. package/dist/cjs/contexts/StandardRemoteNodes/Context.js +6 -0
  8. package/dist/cjs/contexts/StandardRemoteNodes/Context.js.map +1 -0
  9. package/dist/cjs/contexts/StandardRemoteNodes/Providers.js +43 -0
  10. package/dist/cjs/contexts/StandardRemoteNodes/Providers.js.map +1 -0
  11. package/dist/cjs/contexts/StandardRemoteNodes/State.js +3 -0
  12. package/dist/cjs/contexts/StandardRemoteNodes/State.js.map +1 -0
  13. package/dist/cjs/contexts/StandardRemoteNodes/index.js +8 -0
  14. package/dist/cjs/contexts/StandardRemoteNodes/index.js.map +1 -0
  15. package/dist/cjs/contexts/StandardRemoteNodes/use.js +8 -0
  16. package/dist/cjs/contexts/StandardRemoteNodes/use.js.map +1 -0
  17. package/dist/cjs/contexts/index.js +5 -0
  18. package/dist/cjs/contexts/index.js.map +1 -0
  19. package/dist/cjs/index.js +7 -0
  20. package/dist/cjs/index.js.map +1 -0
  21. package/dist/cjs/lib/Builders/MemoryNodeBuilder.js +97 -0
  22. package/dist/cjs/lib/Builders/MemoryNodeBuilder.js.map +1 -0
  23. package/dist/cjs/lib/Builders/SentinelBuilder.js +34 -0
  24. package/dist/cjs/lib/Builders/SentinelBuilder.js.map +1 -0
  25. package/dist/cjs/lib/Builders/StorageArchivistBuilder.js +62 -0
  26. package/dist/cjs/lib/Builders/StorageArchivistBuilder.js.map +1 -0
  27. package/dist/cjs/lib/Builders/index.js +7 -0
  28. package/dist/cjs/lib/Builders/index.js.map +1 -0
  29. package/dist/cjs/lib/ModuleAccountPaths.js +25 -0
  30. package/dist/cjs/lib/ModuleAccountPaths.js.map +1 -0
  31. package/dist/cjs/lib/ModuleNames.js +6 -0
  32. package/dist/cjs/lib/ModuleNames.js.map +1 -0
  33. package/dist/cjs/lib/buildNodes.js +43 -0
  34. package/dist/cjs/lib/buildNodes.js.map +1 -0
  35. package/dist/cjs/lib/index.js +8 -0
  36. package/dist/cjs/lib/index.js.map +1 -0
  37. package/dist/docs.json +3862 -0
  38. package/dist/esm/components/ActiveStandardNode.js +44 -0
  39. package/dist/esm/components/ActiveStandardNode.js.map +1 -0
  40. package/dist/esm/components/index.js +2 -0
  41. package/dist/esm/components/index.js.map +1 -0
  42. package/dist/esm/contexts/StandardRemoteNodes/Context.js +3 -0
  43. package/dist/esm/contexts/StandardRemoteNodes/Context.js.map +1 -0
  44. package/dist/esm/contexts/StandardRemoteNodes/Providers.js +36 -0
  45. package/dist/esm/contexts/StandardRemoteNodes/Providers.js.map +1 -0
  46. package/dist/esm/contexts/StandardRemoteNodes/State.js +2 -0
  47. package/dist/esm/contexts/StandardRemoteNodes/State.js.map +1 -0
  48. package/dist/esm/contexts/StandardRemoteNodes/index.js +5 -0
  49. package/dist/esm/contexts/StandardRemoteNodes/index.js.map +1 -0
  50. package/dist/esm/contexts/StandardRemoteNodes/use.js +4 -0
  51. package/dist/esm/contexts/StandardRemoteNodes/use.js.map +1 -0
  52. package/dist/esm/contexts/index.js +2 -0
  53. package/dist/esm/contexts/index.js.map +1 -0
  54. package/dist/esm/index.js +4 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/lib/Builders/MemoryNodeBuilder.js +80 -0
  57. package/dist/esm/lib/Builders/MemoryNodeBuilder.js.map +1 -0
  58. package/dist/esm/lib/Builders/SentinelBuilder.js +35 -0
  59. package/dist/esm/lib/Builders/SentinelBuilder.js.map +1 -0
  60. package/dist/esm/lib/Builders/StorageArchivistBuilder.js +54 -0
  61. package/dist/esm/lib/Builders/StorageArchivistBuilder.js.map +1 -0
  62. package/dist/esm/lib/Builders/index.js +4 -0
  63. package/dist/esm/lib/Builders/index.js.map +1 -0
  64. package/dist/esm/lib/ModuleAccountPaths.js +22 -0
  65. package/dist/esm/lib/ModuleAccountPaths.js.map +1 -0
  66. package/dist/esm/lib/ModuleNames.js +3 -0
  67. package/dist/esm/lib/ModuleNames.js.map +1 -0
  68. package/dist/esm/lib/buildNodes.js +37 -0
  69. package/dist/esm/lib/buildNodes.js.map +1 -0
  70. package/dist/esm/lib/index.js +5 -0
  71. package/dist/esm/lib/index.js.map +1 -0
  72. package/dist/types/components/ActiveStandardNode.d.ts +7 -0
  73. package/dist/types/components/ActiveStandardNode.d.ts.map +1 -0
  74. package/dist/types/components/index.d.ts +2 -0
  75. package/dist/types/components/index.d.ts.map +1 -0
  76. package/dist/types/contexts/StandardRemoteNodes/Context.d.ts +4 -0
  77. package/dist/types/contexts/StandardRemoteNodes/Context.d.ts.map +1 -0
  78. package/dist/types/contexts/StandardRemoteNodes/Providers.d.ts +11 -0
  79. package/dist/types/contexts/StandardRemoteNodes/Providers.d.ts.map +1 -0
  80. package/dist/types/contexts/StandardRemoteNodes/State.d.ts +7 -0
  81. package/dist/types/contexts/StandardRemoteNodes/State.d.ts.map +1 -0
  82. package/dist/types/contexts/StandardRemoteNodes/index.d.ts +5 -0
  83. package/dist/types/contexts/StandardRemoteNodes/index.d.ts.map +1 -0
  84. package/dist/types/contexts/StandardRemoteNodes/use.d.ts +2 -0
  85. package/dist/types/contexts/StandardRemoteNodes/use.d.ts.map +1 -0
  86. package/dist/types/contexts/index.d.ts +2 -0
  87. package/dist/types/contexts/index.d.ts.map +1 -0
  88. package/dist/types/index.d.ts +4 -0
  89. package/dist/types/index.d.ts.map +1 -0
  90. package/dist/types/lib/Builders/MemoryNodeBuilder.d.ts +50 -0
  91. package/dist/types/lib/Builders/MemoryNodeBuilder.d.ts.map +1 -0
  92. package/dist/types/lib/Builders/SentinelBuilder.d.ts +48 -0
  93. package/dist/types/lib/Builders/SentinelBuilder.d.ts.map +1 -0
  94. package/dist/types/lib/Builders/StorageArchivistBuilder.d.ts +21 -0
  95. package/dist/types/lib/Builders/StorageArchivistBuilder.d.ts.map +1 -0
  96. package/dist/types/lib/Builders/index.d.ts +4 -0
  97. package/dist/types/lib/Builders/index.d.ts.map +1 -0
  98. package/dist/types/lib/ModuleAccountPaths.d.ts +4 -0
  99. package/dist/types/lib/ModuleAccountPaths.d.ts.map +1 -0
  100. package/dist/types/lib/ModuleNames.d.ts +3 -0
  101. package/dist/types/lib/ModuleNames.d.ts.map +1 -0
  102. package/dist/types/lib/buildNodes.d.ts +4 -0
  103. package/dist/types/lib/buildNodes.d.ts.map +1 -0
  104. package/dist/types/lib/index.d.ts +5 -0
  105. package/dist/types/lib/index.d.ts.map +1 -0
  106. package/package.json +88 -0
  107. package/src/components/ActiveStandardNode.tsx +53 -0
  108. package/src/components/index.ts +1 -0
  109. package/src/contexts/StandardRemoteNodes/Context.ts +5 -0
  110. package/src/contexts/StandardRemoteNodes/Providers.tsx +59 -0
  111. package/src/contexts/StandardRemoteNodes/State.ts +7 -0
  112. package/src/contexts/StandardRemoteNodes/index.ts +4 -0
  113. package/src/contexts/StandardRemoteNodes/use.tsx +5 -0
  114. package/src/contexts/index.ts +1 -0
  115. package/src/index.ts +3 -0
  116. package/src/lib/Builders/MemoryNodeBuilder.ts +98 -0
  117. package/src/lib/Builders/SentinelBuilder.ts +44 -0
  118. package/src/lib/Builders/StorageArchivistBuilder.ts +57 -0
  119. package/src/lib/Builders/index.ts +3 -0
  120. package/src/lib/ModuleAccountPaths.ts +24 -0
  121. package/src/lib/ModuleNames.ts +3 -0
  122. package/src/lib/buildNodes.ts +46 -0
  123. package/src/lib/index.ts +4 -0
@@ -0,0 +1,48 @@
1
+ import { AccountInstance } from '@xyo-network/account-model';
2
+ import { MemorySentinel, SentinelParams } from '@xyo-network/sentinel';
3
+ export type SentinelCallbacks = Pick<SentinelParams, 'onReportEnd' | 'onReportStart' | 'onWitnessReportStart' | 'onWitnessReportEnd'>;
4
+ export interface SentinelBuilderConfig {
5
+ name: string;
6
+ witnesses: string[];
7
+ }
8
+ export declare class SentinelBuilder {
9
+ private config;
10
+ private account;
11
+ private _sentinel;
12
+ protected constructor(config: SentinelBuilderConfig, account: AccountInstance);
13
+ get sentinel(): MemorySentinel<import("@xyo-network/sentinel").MemorySentinelParams<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & {
14
+ name?: string | undefined;
15
+ security?: {
16
+ allowAnonymous?: boolean | undefined;
17
+ allowed?: Record<string, (string | import("@xyo-network/module-model").CosigningAddressSet)[]> | undefined;
18
+ disallowed?: Record<string, string[]> | undefined;
19
+ } | undefined;
20
+ storeQueries?: boolean | undefined;
21
+ } & {
22
+ archivists?: string[] | undefined;
23
+ schema: string;
24
+ } & {
25
+ witnesses?: string[] | undefined;
26
+ } & {
27
+ schema: string;
28
+ }>>;
29
+ static create(config: SentinelBuilderConfig, account: AccountInstance, callbacks: SentinelCallbacks): Promise<SentinelBuilder>;
30
+ buildSentinel(callbacks: SentinelCallbacks): Promise<MemorySentinel<import("@xyo-network/sentinel").MemorySentinelParams<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & {
31
+ name?: string | undefined;
32
+ security?: {
33
+ allowAnonymous?: boolean | undefined;
34
+ allowed?: Record<string, (string | import("@xyo-network/module-model").CosigningAddressSet)[]> | undefined;
35
+ disallowed?: Record<string, string[]> | undefined;
36
+ } | undefined;
37
+ storeQueries?: boolean | undefined;
38
+ } & {
39
+ archivists?: string[] | undefined;
40
+ schema: string;
41
+ } & {
42
+ witnesses?: string[] | undefined;
43
+ } & {
44
+ schema: string;
45
+ }>>>;
46
+ private buildParams;
47
+ }
48
+ //# sourceMappingURL=SentinelBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentinelBuilder.d.ts","sourceRoot":"","sources":["../../../../src/lib/Builders/SentinelBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,EAAE,cAAc,EAAwB,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAE5F,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,eAAe,GAAG,sBAAsB,GAAG,oBAAoB,CAAC,CAAA;AAErI,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,qBAAa,eAAe;IAGJ,OAAO,CAAC,MAAM;IAAyB,OAAO,CAAC,OAAO;IAF5E,OAAO,CAAC,SAAS,CAA4B;IAE7C,SAAS,aAAqB,MAAM,EAAE,qBAAqB,EAAU,OAAO,EAAE,eAAe;IAI7F,IAAI,QAAQ;;;;;;;;;;;;;;;QAEX;WAEY,MAAM,CAAC,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;IAM9H,aAAa,CAAC,SAAS,EAAE,iBAAiB;;;;;;;;;;;;;;;;IAKhD,OAAO,CAAC,WAAW;CAUpB"}
@@ -0,0 +1,21 @@
1
+ import { AccountInstance } from '@xyo-network/account-model';
2
+ import { ArchivistModule, StorageArchivistConfig, XyoStorageArchivist } from '@xyo-network/archivist';
3
+ import { MemoryNode } from '@xyo-network/node';
4
+ export interface ArchivistBuilderConfig {
5
+ name: string;
6
+ namespace: string;
7
+ }
8
+ export declare class StorageArchivistBuilder {
9
+ private config;
10
+ private account;
11
+ private node;
12
+ private _archivist;
13
+ private remoteArchivist;
14
+ protected constructor(config: ArchivistBuilderConfig, account: AccountInstance, node: MemoryNode);
15
+ get archivist(): XyoStorageArchivist;
16
+ static create(config: ArchivistBuilderConfig, account: AccountInstance, node: MemoryNode): Promise<StorageArchivistBuilder>;
17
+ buildArchivist(): Promise<XyoStorageArchivist>;
18
+ buildConfig(): StorageArchivistConfig;
19
+ findParentArchivist(): Promise<ArchivistModule | undefined>;
20
+ }
21
+ //# sourceMappingURL=StorageArchivistBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageArchivistBuilder.d.ts","sourceRoot":"","sources":["../../../../src/lib/Builders/StorageArchivistBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAgC,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACnI,OAAO,EAAE,UAAU,EAAe,MAAM,mBAAmB,CAAA;AAG3D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AACD,qBAAa,uBAAuB;IAIZ,OAAO,CAAC,MAAM;IAA0B,OAAO,CAAC,OAAO;IAAmB,OAAO,CAAC,IAAI;IAH5G,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,eAAe,CAA6B;IAEpD,SAAS,aAAqB,MAAM,EAAE,sBAAsB,EAAU,OAAO,EAAE,eAAe,EAAU,IAAI,EAAE,UAAU;IAExH,IAAI,SAAS,wBAEZ;WAEY,MAAM,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAO3H,cAAc;IAKpB,WAAW,IAAI,sBAAsB;IAa/B,mBAAmB;CAY1B"}
@@ -0,0 +1,4 @@
1
+ export * from './MemoryNodeBuilder';
2
+ export * from './SentinelBuilder';
3
+ export * from './StorageArchivistBuilder';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/Builders/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA"}
@@ -0,0 +1,4 @@
1
+ export declare const GlobalNodeOffsetPath = "15";
2
+ export declare const RemoteNodeOffsetPaths: Record<string, string>;
3
+ export declare const RemoteNodeArchivistOffsetPaths: Record<string, Record<string, string>>;
4
+ //# sourceMappingURL=ModuleAccountPaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModuleAccountPaths.d.ts","sourceRoot":"","sources":["../../../src/lib/ModuleAccountPaths.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,OAAO,CAAA;AAExC,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIxD,CAAA;AAED,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAajF,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const GlobalNode = "GlobalNode";
2
+ export declare const RootStorageArchivist = "RootStorageArchivist";
3
+ //# sourceMappingURL=ModuleNames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModuleNames.d.ts","sourceRoot":"","sources":["../../../src/lib/ModuleNames.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,eAAe,CAAA;AAEtC,eAAO,MAAM,oBAAoB,yBAAyB,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { MemoryNode } from '@xyo-network/node';
2
+ import { HDWallet } from '@xyo-network/protocol';
3
+ export declare const BuildStandardNodes: (wallet: HDWallet) => Promise<MemoryNode[]>;
4
+ //# sourceMappingURL=buildNodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildNodes.d.ts","sourceRoot":"","sources":["../../../src/lib/buildNodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAwBhD,eAAO,MAAM,kBAAkB,WAAkB,QAAQ,KAAG,QAAQ,UAAU,EAAE,CAoB/E,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './Builders';
2
+ export * from './buildNodes';
3
+ export * from './ModuleAccountPaths';
4
+ export * from './ModuleNames';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA"}
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "@xyo-network/react-standard-node",
3
+ "author": {
4
+ "email": "support@xyo.network",
5
+ "name": "XYO Development Team",
6
+ "url": "https://xyo.network"
7
+ },
8
+ "bugs": {
9
+ "email": "support@xyo.network",
10
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-react-js/issues"
11
+ },
12
+ "dependencies": {
13
+ "@xylabs/react-shared": "^2.16.11",
14
+ "@xyo-network/account-model": "^2.51.9",
15
+ "@xyo-network/archivist": "^2.51.9",
16
+ "@xyo-network/bridge": "^2.51.9",
17
+ "@xyo-network/module": "^2.51.9",
18
+ "@xyo-network/node": "^2.51.9",
19
+ "@xyo-network/payloadset-plugin": "^2.51.9",
20
+ "@xyo-network/protocol": "^2.51.9",
21
+ "@xyo-network/react-network": "^2.45.2",
22
+ "@xyo-network/react-node": "^2.45.2",
23
+ "@xyo-network/react-shared": "^2.45.2",
24
+ "@xyo-network/react-wallet": "^2.45.2",
25
+ "@xyo-network/sentinel": "^2.51.9",
26
+ "@xyo-network/witness": "^2.51.9"
27
+ },
28
+ "devDependencies": {
29
+ "@storybook/react": "^6.5.16",
30
+ "@xylabs/ts-scripts-yarn3": "^2.16.1",
31
+ "@xylabs/tsconfig-react": "^2.16.1",
32
+ "require-from-string": "^2.0.2",
33
+ "typescript": "^4.9.5"
34
+ },
35
+ "peerDependencies": {
36
+ "@mui/icons-material": "^5",
37
+ "@mui/material": "^5",
38
+ "@mui/styles": "^5",
39
+ "axios": "^1",
40
+ "react": "^18",
41
+ "react-dom": "^18",
42
+ "react-router-dom": "^6"
43
+ },
44
+ "description": "Common React library for all XYO projects that use React",
45
+ "browser": "dist/esm/index.js",
46
+ "docs": "dist/docs.json",
47
+ "exports": {
48
+ ".": {
49
+ "node": {
50
+ "import": "./dist/esm/index.js",
51
+ "require": "./dist/cjs/index.js"
52
+ },
53
+ "browser": {
54
+ "import": "./dist/esm/index.js",
55
+ "require": "./dist/cjs/index.js"
56
+ },
57
+ "default": "./dist/esm/index.js"
58
+ },
59
+ "./dist/docs.json": {
60
+ "default": "./dist/docs.json"
61
+ },
62
+ "./package.json": "./package.json"
63
+ },
64
+ "main": "dist/cjs/index.js",
65
+ "module": "dist/esm/index.js",
66
+ "homepage": "https://xyo.network",
67
+ "keywords": [
68
+ "xyo",
69
+ "utility",
70
+ "typescript",
71
+ "react"
72
+ ],
73
+ "license": "LGPL-3.0",
74
+ "publishConfig": {
75
+ "access": "public"
76
+ },
77
+ "repository": {
78
+ "type": "git",
79
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-react-js.git"
80
+ },
81
+ "scripts": {
82
+ "lint-pkg": "npmPkgJsonLint .",
83
+ "license": "yarn license-checker --exclude \"MIT, ISC, Apache-2.0, BSD, BSD-2-Clause, CC-BY-4.0, Unlicense, CC-BY-3.0, CC0-1.0\""
84
+ },
85
+ "sideEffects": false,
86
+ "types": "dist/types/index.d.ts",
87
+ "version": "2.45.2"
88
+ }
@@ -0,0 +1,53 @@
1
+ import { useAsyncEffect, WithChildren } from '@xylabs/react-shared'
2
+ import { useNetwork } from '@xyo-network/react-network'
3
+ import { useNode } from '@xyo-network/react-node'
4
+ import { assertDefinedEx } from '@xyo-network/react-shared'
5
+ import { useMemo, useState } from 'react'
6
+
7
+ import { useStandardNodes } from '../contexts'
8
+
9
+ export interface ActiveStandardNodeProps extends WithChildren {
10
+ nodeNameOrAddress?: string
11
+ }
12
+
13
+ export const ActiveStandardNode: React.FC<ActiveStandardNodeProps> = ({ children, nodeNameOrAddress }) => {
14
+ const { network } = useNetwork(true)
15
+ const [node] = useNode(nodeNameOrAddress)
16
+ const [activeRemoteNodeAddress, setActiveRemoteNodeAddress] = useState<string>()
17
+ const { nodes, findAddressByName } = useStandardNodes()
18
+
19
+ const selectedNodeAddress = useMemo(() => {
20
+ if (node && nodes && findAddressByName && network) {
21
+ const selectedNodeAddress = findAddressByName(network.name)
22
+ return assertDefinedEx(selectedNodeAddress, `${network.name} was not found in known remote nodes`)
23
+ }
24
+ }, [findAddressByName, network, node, nodes])
25
+
26
+ // Probably needs to rely on node events rather than provider values to ensure its registered
27
+ useAsyncEffect(
28
+ // eslint-disable-next-line react-hooks/exhaustive-deps
29
+ async (mounted) => {
30
+ if (node && selectedNodeAddress) {
31
+ try {
32
+ if ((await node?.attached())?.includes(selectedNodeAddress)) {
33
+ return
34
+ }
35
+ await node?.attach(selectedNodeAddress, true)
36
+
37
+ if (mounted()) {
38
+ // cleanup
39
+ if (activeRemoteNodeAddress) {
40
+ await node?.detach(activeRemoteNodeAddress)
41
+ }
42
+ setActiveRemoteNodeAddress(selectedNodeAddress)
43
+ }
44
+ } catch (e) {
45
+ console.error('Error Attaching Selected Node Address', e)
46
+ }
47
+ }
48
+ },
49
+ [activeRemoteNodeAddress, node, selectedNodeAddress, nodes],
50
+ )
51
+
52
+ return <>{children}</>
53
+ }
@@ -0,0 +1 @@
1
+ export * from './ActiveStandardNode'
@@ -0,0 +1,5 @@
1
+ import { createContextEx } from '@xyo-network/react-shared'
2
+
3
+ import { StandardNodesState } from './State'
4
+
5
+ export const StandardNodesContext = createContextEx<StandardNodesState>()
@@ -0,0 +1,59 @@
1
+ import { useAsyncEffect, WithChildren } from '@xylabs/react-shared'
2
+ import { HDWallet } from '@xyo-network/protocol'
3
+ import { assertDefinedEx } from '@xyo-network/react-shared'
4
+ import { useWallet } from '@xyo-network/react-wallet'
5
+ import { useEffect, useMemo, useState } from 'react'
6
+
7
+ import { BuildStandardNodes } from '../../lib'
8
+ import { StandardNodesContext } from './Context'
9
+ import { StandardNodesState } from './State'
10
+
11
+ export interface StandardNodesProviderProps extends WithChildren {
12
+ defaultRemoteNodes?: StandardNodesState['nodes']
13
+ wallet?: HDWallet
14
+ }
15
+
16
+ export const StandardNodesProvider: React.FC<StandardNodesProviderProps> = ({ children, defaultRemoteNodes, wallet }) => {
17
+ const [nodes, setNodes] = useState<StandardNodesState['nodes']>(defaultRemoteNodes)
18
+
19
+ useEffect(() => {
20
+ setNodes(defaultRemoteNodes)
21
+ }, [defaultRemoteNodes])
22
+
23
+ useAsyncEffect(
24
+ // eslint-disable-next-line react-hooks/exhaustive-deps
25
+ async () => {
26
+ if (wallet) {
27
+ const builtNodes = await BuildStandardNodes(wallet)
28
+ setNodes(builtNodes)
29
+ }
30
+ },
31
+ [wallet],
32
+ )
33
+
34
+ const findAddressByName = (name?: string) => {
35
+ const validNetworkName = assertDefinedEx(name, 'name was not defined')
36
+ return nodes?.find((node) => node.config.name === validNetworkName)?.address
37
+ }
38
+
39
+ return (
40
+ <StandardNodesContext.Provider
41
+ value={{
42
+ findAddressByName,
43
+ nodes,
44
+ provided: true,
45
+ }}
46
+ >
47
+ {children}
48
+ </StandardNodesContext.Provider>
49
+ )
50
+ }
51
+
52
+ export const StandardNodesProviderWithWallet: React.FC<Omit<StandardNodesProviderProps, 'wallet'>> = (props) => {
53
+ const { wallet: walletFromCtx, activeAccountIndex } = useWallet()
54
+ const wallet = useMemo(
55
+ () => (walletFromCtx && activeAccountIndex !== undefined ? walletFromCtx.derivePath(activeAccountIndex.toString()) : undefined),
56
+ [activeAccountIndex, walletFromCtx],
57
+ )
58
+ return <StandardNodesProvider wallet={wallet} {...props} />
59
+ }
@@ -0,0 +1,7 @@
1
+ import { MemoryNode } from '@xyo-network/node'
2
+ import { ContextExState } from '@xyo-network/react-shared'
3
+
4
+ export interface StandardNodesState extends ContextExState {
5
+ findAddressByName?: (name?: string) => string | undefined
6
+ nodes?: MemoryNode[]
7
+ }
@@ -0,0 +1,4 @@
1
+ export * from './Context'
2
+ export * from './Providers'
3
+ export * from './State'
4
+ export * from './use'
@@ -0,0 +1,5 @@
1
+ import { useContextEx } from '@xyo-network/react-shared'
2
+
3
+ import { StandardNodesContext } from './Context'
4
+
5
+ export const useStandardNodes = (required = false) => useContextEx(StandardNodesContext, 'StandardNodes', required)
@@ -0,0 +1 @@
1
+ export * from './StandardRemoteNodes'
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './components'
2
+ export * from './contexts'
3
+ export * from './lib'
@@ -0,0 +1,98 @@
1
+ import { AccountInstance } from '@xyo-network/account-model'
2
+ import { HttpBridge, HttpBridgeConfigSchema } from '@xyo-network/bridge'
3
+ import { Module } from '@xyo-network/module'
4
+ import { MemoryNode, NodeConfigSchema, NodeWrapper } from '@xyo-network/node'
5
+ import { PayloadSetPluginResolver } from '@xyo-network/payloadset-plugin'
6
+ import { assertDefinedEx } from '@xyo-network/react-shared'
7
+ import { WitnessModule } from '@xyo-network/witness'
8
+
9
+ import { SentinelBuilder, SentinelBuilderConfig, SentinelCallbacks } from './SentinelBuilder'
10
+ import { StorageArchivistBuilder } from './StorageArchivistBuilder'
11
+
12
+ interface MemoryNodeBuilderConfig {
13
+ name?: string
14
+ node?: MemoryNode
15
+ }
16
+
17
+ export class MemoryNodeBuilder {
18
+ private _node: MemoryNode | undefined
19
+ private _wrappedNode: NodeWrapper | undefined
20
+
21
+ get node() {
22
+ return assertDefinedEx(this._node, 'this._node was not defined upon create')
23
+ }
24
+
25
+ get wrappedNode() {
26
+ return assertDefinedEx(this._wrappedNode, 'this._wrappedNode was not defined upon create')
27
+ }
28
+
29
+ static async create({ name, node }: MemoryNodeBuilderConfig, account?: AccountInstance): Promise<MemoryNodeBuilder> {
30
+ const instance = new this()
31
+
32
+ let memoryNode: MemoryNode
33
+ if (node) {
34
+ memoryNode = node
35
+ } else {
36
+ memoryNode = await MemoryNode.create({ account, config: { name, schema: NodeConfigSchema } })
37
+ }
38
+ instance._node = memoryNode
39
+ instance._wrappedNode = NodeWrapper.wrap(memoryNode)
40
+ return instance
41
+ }
42
+
43
+ async addArchivist(account: AccountInstance, moduleName: string, namespace: string) {
44
+ const config = { name: moduleName, namespace }
45
+ const { archivist } = await StorageArchivistBuilder.create(config, account, this.node)
46
+
47
+ await this.attach(archivist, true)
48
+ }
49
+
50
+ async addBridge(apiDomain: string) {
51
+ try {
52
+ const bridge = await HttpBridge.create({
53
+ config: { name: 'RemoteNodeBridge', nodeUri: `${apiDomain}/node`, schema: HttpBridgeConfigSchema, security: { allowAnonymous: true } },
54
+ })
55
+ await this.attach(bridge, true)
56
+ } catch (e) {
57
+ console.error('Error Creating Bridge', e)
58
+ }
59
+ }
60
+
61
+ async addSentinel(config: SentinelBuilderConfig, account: AccountInstance, callbacks: SentinelCallbacks) {
62
+ const { sentinel } = await SentinelBuilder.create(config, account, callbacks)
63
+ await this.attach(sentinel, true, true)
64
+ return sentinel
65
+ }
66
+
67
+ async addWitnesses(pluginSetResolver: PayloadSetPluginResolver, witnesses: (() => Promise<WitnessModule>)[] = []) {
68
+ await Promise.all(
69
+ pluginSetResolver.witnesses().map(async (pluginSet, index) => {
70
+ // Pass the prebuilt witness at the same index
71
+ const witness = await witnesses?.[index]?.()
72
+ if (witness) {
73
+ try {
74
+ await this.node.register(witness).attach(witness.address, true)
75
+ } catch (e) {
76
+ console.error('Error attaching witness', JSON.stringify(pluginSet, null, 2), e)
77
+ }
78
+ }
79
+ }),
80
+ )
81
+ }
82
+
83
+ private async attach(module: Module, external?: boolean, safeAttach?: boolean) {
84
+ try {
85
+ if (safeAttach) {
86
+ const existingModule = await this.wrappedNode.resolve(module.address)
87
+ if (existingModule) {
88
+ await this.node.detach(existingModule.address)
89
+ await this.node.unregister(existingModule)
90
+ }
91
+ }
92
+ this.node.register(module)
93
+ await this.node.attach(module.address, external)
94
+ } catch (e) {
95
+ throw Error(`Error adding ${module.config.name ?? module.address} to MemoryNode: ${e}`)
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,44 @@
1
+ import { AccountInstance } from '@xyo-network/account-model'
2
+ import { assertDefinedEx } from '@xyo-network/react-shared'
3
+ import { MemorySentinel, SentinelConfigSchema, SentinelParams } from '@xyo-network/sentinel'
4
+
5
+ export type SentinelCallbacks = Pick<SentinelParams, 'onReportEnd' | 'onReportStart' | 'onWitnessReportStart' | 'onWitnessReportEnd'>
6
+
7
+ export interface SentinelBuilderConfig {
8
+ name: string
9
+ witnesses: string[]
10
+ }
11
+
12
+ export class SentinelBuilder {
13
+ private _sentinel: MemorySentinel | undefined
14
+
15
+ protected constructor(private config: SentinelBuilderConfig, private account: AccountInstance) {
16
+ assertDefinedEx(config, 'config was not defined')
17
+ }
18
+
19
+ get sentinel() {
20
+ return assertDefinedEx(this._sentinel, 'this._sentinel not defined upon create')
21
+ }
22
+
23
+ static async create(config: SentinelBuilderConfig, account: AccountInstance, callbacks: SentinelCallbacks): Promise<SentinelBuilder> {
24
+ const instance = new this(config, account)
25
+ instance._sentinel = await instance.buildSentinel(callbacks)
26
+ return instance
27
+ }
28
+
29
+ async buildSentinel(callbacks: SentinelCallbacks) {
30
+ const params = this.buildParams(callbacks)
31
+ return await MemorySentinel.create(params)
32
+ }
33
+
34
+ private buildParams(callbacks: SentinelCallbacks): SentinelParams {
35
+ return {
36
+ config: {
37
+ ...this.config,
38
+ schema: SentinelConfigSchema,
39
+ },
40
+ ...callbacks,
41
+ account: this.account,
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,57 @@
1
+ import { AccountInstance } from '@xyo-network/account-model'
2
+ import { ArchivistModule, StorageArchivistConfig, StorageArchivistConfigSchema, XyoStorageArchivist } from '@xyo-network/archivist'
3
+ import { MemoryNode, NodeWrapper } from '@xyo-network/node'
4
+ import { assertDefinedEx } from '@xyo-network/react-shared'
5
+
6
+ export interface ArchivistBuilderConfig {
7
+ name: string
8
+ namespace: string
9
+ }
10
+ export class StorageArchivistBuilder {
11
+ private _archivist: XyoStorageArchivist | undefined
12
+ private remoteArchivist: ArchivistModule | undefined
13
+
14
+ protected constructor(private config: ArchivistBuilderConfig, private account: AccountInstance, private node: MemoryNode) {}
15
+
16
+ get archivist() {
17
+ return assertDefinedEx(this._archivist, 'archivist was not defined upon create')
18
+ }
19
+
20
+ static async create(config: ArchivistBuilderConfig, account: AccountInstance, node: MemoryNode): Promise<StorageArchivistBuilder> {
21
+ const instance = new this(config, account, node)
22
+ instance.remoteArchivist = await instance.findParentArchivist()
23
+ instance._archivist = await instance.buildArchivist()
24
+ return instance
25
+ }
26
+
27
+ async buildArchivist() {
28
+ const config = this.buildConfig()
29
+ return await XyoStorageArchivist.create({ account: this.account, config })
30
+ }
31
+
32
+ buildConfig(): StorageArchivistConfig {
33
+ return {
34
+ name: this.config.name,
35
+ namespace: this.config.namespace,
36
+ parents: {
37
+ commit: this.remoteArchivist ? [this.remoteArchivist?.address] : undefined,
38
+ read: this.remoteArchivist ? [this.remoteArchivist?.address] : undefined,
39
+ },
40
+ schema: StorageArchivistConfigSchema,
41
+ type: 'local',
42
+ }
43
+ }
44
+
45
+ async findParentArchivist() {
46
+ const wrappedNode = new NodeWrapper(assertDefinedEx(this.node, 'node not defined'), this.account)
47
+ const [bridge] = (await wrappedNode.resolve({ name: ['RemoteNodeBridge'] })) ?? []
48
+ if (bridge) {
49
+ try {
50
+ const [archivist] = (await bridge.downResolver.resolve({ name: ['Archivist'] })) ?? []
51
+ return archivist as ArchivistModule
52
+ } catch (e) {
53
+ console.error('Error Resolving Parent Archivist', this.node?.config.name, this.config)
54
+ }
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,3 @@
1
+ export * from './MemoryNodeBuilder'
2
+ export * from './SentinelBuilder'
3
+ export * from './StorageArchivistBuilder'
@@ -0,0 +1,24 @@
1
+ import { RootStorageArchivist } from './ModuleNames'
2
+
3
+ export const GlobalNodeOffsetPath = '15'
4
+
5
+ export const RemoteNodeOffsetPaths: Record<string, string> = {
6
+ Kerplunk: '112',
7
+ Local: '111',
8
+ Main: '113',
9
+ }
10
+
11
+ export const RemoteNodeArchivistOffsetPaths: Record<string, Record<string, string>> = {
12
+ Kerplunk: {
13
+ MemoryNode: '117',
14
+ [RootStorageArchivist]: '119',
15
+ },
16
+ Local: {
17
+ MemoryNode: '114',
18
+ [RootStorageArchivist]: '116',
19
+ },
20
+ Main: {
21
+ MemoryNode: '120',
22
+ [RootStorageArchivist]: '122',
23
+ },
24
+ }
@@ -0,0 +1,3 @@
1
+ export const GlobalNode = 'GlobalNode'
2
+
3
+ export const RootStorageArchivist = 'RootStorageArchivist'
@@ -0,0 +1,46 @@
1
+ import { MemoryNode } from '@xyo-network/node'
2
+ import { HDWallet } from '@xyo-network/protocol'
3
+ import { defaultNetworkConfigs } from '@xyo-network/react-network'
4
+ import { assertDefinedEx } from '@xyo-network/react-shared'
5
+
6
+ import { MemoryNodeBuilder } from './Builders'
7
+ import { RemoteNodeArchivistOffsetPaths, RemoteNodeOffsetPaths } from './ModuleAccountPaths'
8
+ import { RootStorageArchivist } from './ModuleNames'
9
+
10
+ const MainApiUrlFallback = 'https://beta.api.archivist.xyo.network'
11
+
12
+ const knownRemoteNodes = (): { apiDomain: string; name: string }[] => {
13
+ const networkNames = defaultNetworkConfigs.map((config) => config.name)
14
+ return networkNames.map((networkName) => {
15
+ const name = assertDefinedEx<string>(networkName, 'missing name in network config')
16
+ const uri = defaultNetworkConfigs.filter((config) => config.name === networkName)[0].nodes?.filter((node) => node.type === 'archivist')[0].uri
17
+ const apiDomain = assertDefinedEx<string>(uri, 'missing node type "archivist" in network config')
18
+ return {
19
+ // Temporary till main is compatible with /node endpoint
20
+ apiDomain: name === 'Main' ? MainApiUrlFallback : apiDomain,
21
+ name,
22
+ }
23
+ })
24
+ }
25
+
26
+ export const BuildStandardNodes = async (wallet: HDWallet): Promise<MemoryNode[]> => {
27
+ try {
28
+ return await Promise.all(
29
+ knownRemoteNodes().map(async ({ apiDomain, name }) => {
30
+ const remoteNodeOffset = RemoteNodeOffsetPaths[name]
31
+ const remoteNodeWallet = wallet.derivePath(remoteNodeOffset)
32
+
33
+ const memoryNodeBuilder = await MemoryNodeBuilder.create({ name }, remoteNodeWallet.deriveAccount('0'))
34
+ await memoryNodeBuilder.addBridge(apiDomain)
35
+
36
+ const rootArchivistPath = `${remoteNodeOffset}/${RemoteNodeArchivistOffsetPaths[name][RootStorageArchivist]}`
37
+ const rootArchivistAccount = wallet.deriveAccount(rootArchivistPath)
38
+ await memoryNodeBuilder.addArchivist(rootArchivistAccount, RootStorageArchivist, 'root')
39
+
40
+ return assertDefinedEx(memoryNodeBuilder.node, 'Memory Node was not built successfully')
41
+ }),
42
+ )
43
+ } catch (e) {
44
+ throw new Error(`Error Creating Known Remote Nodes: ${e}`)
45
+ }
46
+ }