@xyo-network/react-chain-client 1.20.8

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 (46) hide show
  1. package/dist/browser/hooks/client/helpers/findCaveat.d.ts +3 -0
  2. package/dist/browser/hooks/client/helpers/findCaveat.d.ts.map +1 -0
  3. package/dist/browser/hooks/client/helpers/index.d.ts +2 -0
  4. package/dist/browser/hooks/client/helpers/index.d.ts.map +1 -0
  5. package/dist/browser/hooks/client/index.d.ts +5 -0
  6. package/dist/browser/hooks/client/index.d.ts.map +1 -0
  7. package/dist/browser/hooks/client/permissions/index.d.ts +3 -0
  8. package/dist/browser/hooks/client/permissions/index.d.ts.map +1 -0
  9. package/dist/browser/hooks/client/permissions/usePermissions.d.ts +7 -0
  10. package/dist/browser/hooks/client/permissions/usePermissions.d.ts.map +1 -0
  11. package/dist/browser/hooks/client/permissions/usePermissionsAccounts.d.ts +2 -0
  12. package/dist/browser/hooks/client/permissions/usePermissionsAccounts.d.ts.map +1 -0
  13. package/dist/browser/hooks/client/useClientFromWallet.d.ts +12 -0
  14. package/dist/browser/hooks/client/useClientFromWallet.d.ts.map +1 -0
  15. package/dist/browser/hooks/client/useGatewayFromWallet.d.ts +6 -0
  16. package/dist/browser/hooks/client/useGatewayFromWallet.d.ts.map +1 -0
  17. package/dist/browser/hooks/helpers/getXyoClient.d.ts +6 -0
  18. package/dist/browser/hooks/helpers/getXyoClient.d.ts.map +1 -0
  19. package/dist/browser/hooks/helpers/index.d.ts +2 -0
  20. package/dist/browser/hooks/helpers/index.d.ts.map +1 -0
  21. package/dist/browser/hooks/index.d.ts +3 -0
  22. package/dist/browser/hooks/index.d.ts.map +1 -0
  23. package/dist/browser/index.d.ts +3 -0
  24. package/dist/browser/index.d.ts.map +1 -0
  25. package/dist/browser/index.mjs +209 -0
  26. package/dist/browser/index.mjs.map +1 -0
  27. package/dist/browser/types/GatewayFromWallet.d.ts +8 -0
  28. package/dist/browser/types/GatewayFromWallet.d.ts.map +1 -0
  29. package/dist/browser/types/index.d.ts +2 -0
  30. package/dist/browser/types/index.d.ts.map +1 -0
  31. package/package.json +75 -0
  32. package/src/global.d.ts +9 -0
  33. package/src/hooks/client/helpers/findCaveat.ts +20 -0
  34. package/src/hooks/client/helpers/index.ts +1 -0
  35. package/src/hooks/client/index.ts +4 -0
  36. package/src/hooks/client/permissions/index.ts +2 -0
  37. package/src/hooks/client/permissions/usePermissions.ts +14 -0
  38. package/src/hooks/client/permissions/usePermissionsAccounts.ts +38 -0
  39. package/src/hooks/client/useClientFromWallet.ts +98 -0
  40. package/src/hooks/client/useGatewayFromWallet.ts +30 -0
  41. package/src/hooks/helpers/getXyoClient.ts +46 -0
  42. package/src/hooks/helpers/index.ts +1 -0
  43. package/src/hooks/index.ts +2 -0
  44. package/src/index.ts +2 -0
  45. package/src/types/GatewayFromWallet.ts +8 -0
  46. package/src/types/index.ts +1 -0
@@ -0,0 +1,3 @@
1
+ import type { CaveatTypes, ParentCapability, XyoPermissions } from '@xyo-network/xl1-sdk';
2
+ export declare const findCaveat: (permissions: XyoPermissions, targetCapability: ParentCapability, targetCaveatType: CaveatTypes) => Promise<{}>;
3
+ //# sourceMappingURL=findCaveat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findCaveat.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/client/helpers/findCaveat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAC9C,MAAM,sBAAsB,CAAA;AAE7B,eAAO,MAAM,UAAU,GACrB,aAAa,cAAc,EAC3B,kBAAkB,gBAAgB,EAClC,kBAAkB,WAAW,gBAW9B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './findCaveat.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/client/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './helpers/index.ts';
2
+ export * from './permissions/index.ts';
3
+ export * from './useClientFromWallet.ts';
4
+ export * from './useGatewayFromWallet.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,wBAAwB,CAAA;AACtC,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './usePermissions.ts';
2
+ export * from './usePermissionsAccounts.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/client/permissions/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,6BAA6B,CAAA"}
@@ -0,0 +1,7 @@
1
+ export declare const usePermissions: () => {
2
+ permissions: import("@xyo-network/xl1-protocol").XyoPermissions | undefined;
3
+ isLoading: boolean;
4
+ error: Error | null;
5
+ timedout: boolean;
6
+ };
7
+ //# sourceMappingURL=usePermissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePermissions.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/client/permissions/usePermissions.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;CAW1B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const useAccountPermissions: () => [readonly string[] | undefined, Error | undefined, import("@xylabs/react-promise").UsePromiseState | undefined];
2
+ //# sourceMappingURL=usePermissionsAccounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePermissionsAccounts.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/client/permissions/usePermissionsAccounts.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,qBAAqB,uHAejC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { XyoClient } from '@xyo-network/xl1-sdk';
2
+ interface ClientState {
3
+ client?: XyoClient | null;
4
+ error: Error | null;
5
+ isLoading: boolean;
6
+ timedout: boolean;
7
+ }
8
+ export declare const useClientFromWallet: (timeout?: number) => ClientState;
9
+ /** @deprecated - use useClientFromWallet instead */
10
+ export declare const useClient: (timeout?: number) => ClientState;
11
+ export {};
12
+ //# sourceMappingURL=useClientFromWallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClientFromWallet.d.ts","sourceRoot":"","sources":["../../../../src/hooks/client/useClientFromWallet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAOrD,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACzB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAsDD,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,gBA2BnD,CAAA;AAED,oDAAoD;AACpD,eAAO,MAAM,SAAS,aA9BwB,MAAM,gBA8BR,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { GatewayName } from '@xyo-network/xl1-sdk';
2
+ import type { GatewayFromWallet } from '../../types/index.ts';
3
+ export declare const useGatewayFromWallet: (gatewayName?: GatewayName, timeout?: number) => GatewayFromWallet;
4
+ /** @deprecated - useGatewayFromWallet */
5
+ export declare const useGateway: (gatewayName?: GatewayName, timeout?: number) => GatewayFromWallet;
6
+ //# sourceMappingURL=useGatewayFromWallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGatewayFromWallet.d.ts","sourceRoot":"","sources":["../../../../src/hooks/client/useGatewayFromWallet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAG7D,eAAO,MAAM,oBAAoB,GAAI,cAAc,WAAW,EAAE,UAAU,MAAM,KAAG,iBAoBlF,CAAA;AAED,yCAAyC;AACzC,eAAO,MAAM,UAAU,iBAvB4B,WAAW,YAAY,MAAM,KAAG,iBAuBrC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { XyoClient } from '@xyo-network/xl1-sdk';
2
+ export declare const listenForClientInjection: (onClientReady: () => void, timeout: number, onTimeout: () => void) => void;
3
+ type ReturnType = XyoClient | undefined | null;
4
+ export declare function getXyoClient(timeout?: number): Promise<ReturnType>;
5
+ export {};
6
+ //# sourceMappingURL=getXyoClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getXyoClient.d.ts","sourceRoot":"","sources":["../../../../src/hooks/helpers/getXyoClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAQrD,eAAO,MAAM,wBAAwB,GAAI,eAAe,MAAM,IAAI,EAAE,SAAS,MAAM,EAAE,WAAW,MAAM,IAAI,SAazG,CAAA;AAED,KAAK,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAA;AAE9C,wBAAsB,YAAY,CAAC,OAAO,SAA0B,GAAG,OAAO,CAAC,UAAU,CAAC,CAmBzF"}
@@ -0,0 +1,2 @@
1
+ export * from './getXyoClient.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './client/index.ts';
2
+ export * from './helpers/index.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './hooks/index.ts';
2
+ export * from './types/index.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
@@ -0,0 +1,209 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/hooks/client/helpers/findCaveat.ts
5
+ import { isDefined } from "@xylabs/sdk-js";
6
+ var findCaveat = /* @__PURE__ */ __name(async (permissions, targetCapability, targetCaveatType) => {
7
+ const existingPermissions = await permissions.getPermissions();
8
+ if (isDefined(existingPermissions) && existingPermissions.length > 0) {
9
+ const foundPermissions = existingPermissions.find((p) => p.parentCapability === targetCapability);
10
+ if (isDefined(foundPermissions)) {
11
+ return foundPermissions.caveats?.find((caveat) => caveat.type === targetCaveatType)?.value ?? [];
12
+ }
13
+ }
14
+ return existingPermissions;
15
+ }, "findCaveat");
16
+
17
+ // src/hooks/client/useClientFromWallet.ts
18
+ import { isNull } from "@xylabs/sdk-js";
19
+ import { useCallback, useEffect, useSyncExternalStore } from "react";
20
+
21
+ // src/hooks/helpers/getXyoClient.ts
22
+ import { isUndefined } from "@xylabs/sdk-js";
23
+ var CLIENT_LISTENER_TIMEOUT = 500;
24
+ var hasXyoClient = /* @__PURE__ */ __name(() => {
25
+ return "client" in globalThis.xyo;
26
+ }, "hasXyoClient");
27
+ var listenForClientInjection = /* @__PURE__ */ __name((onClientReady, timeout, onTimeout) => {
28
+ let resolved = false;
29
+ const listener = /* @__PURE__ */ __name(() => {
30
+ onClientReady();
31
+ resolved = true;
32
+ }, "listener");
33
+ globalThis.addEventListener("xyo:plugin-ready", listener);
34
+ setTimeout(() => {
35
+ if (!resolved) {
36
+ globalThis.removeEventListener("xyo:plugin-ready", listener);
37
+ onTimeout();
38
+ }
39
+ }, timeout);
40
+ }, "listenForClientInjection");
41
+ async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT) {
42
+ if (isUndefined(globalThis.xyo)) {
43
+ return null;
44
+ }
45
+ return hasXyoClient() ? globalThis.xyo.client : await new Promise((resolve) => {
46
+ listenForClientInjection(() => {
47
+ resolve(globalThis.xyo.client);
48
+ }, timeout, () => {
49
+ resolve(null);
50
+ });
51
+ });
52
+ }
53
+ __name(getXyoClient, "getXyoClient");
54
+
55
+ // src/hooks/client/useClientFromWallet.ts
56
+ var currentState = {
57
+ client: void 0,
58
+ error: null,
59
+ isLoading: false,
60
+ timedout: false
61
+ };
62
+ var listeners = /* @__PURE__ */ new Set();
63
+ var emitChange = /* @__PURE__ */ __name(() => {
64
+ for (const listener of listeners) listener();
65
+ }, "emitChange");
66
+ var updateState = /* @__PURE__ */ __name((newState) => {
67
+ currentState = {
68
+ ...currentState,
69
+ ...newState
70
+ };
71
+ emitChange();
72
+ }, "updateState");
73
+ var initializeClient = /* @__PURE__ */ __name(async (timeout) => {
74
+ if (currentState.isLoading || currentState.client) return;
75
+ updateState({
76
+ isLoading: true,
77
+ error: null
78
+ });
79
+ try {
80
+ const client = await getXyoClient(timeout);
81
+ if (client === null) {
82
+ updateState({
83
+ client: null,
84
+ timedout: true,
85
+ isLoading: false
86
+ });
87
+ return;
88
+ }
89
+ updateState({
90
+ client,
91
+ isLoading: false,
92
+ error: null
93
+ });
94
+ } catch (error) {
95
+ console.error("Error initializing XyoClient", error);
96
+ updateState({
97
+ error,
98
+ isLoading: false
99
+ });
100
+ }
101
+ }, "initializeClient");
102
+ var subscribe = /* @__PURE__ */ __name((listener, timeout) => {
103
+ listeners.add(listener);
104
+ void initializeClient(timeout);
105
+ return () => {
106
+ listeners.delete(listener);
107
+ };
108
+ }, "subscribe");
109
+ var getSnapshot = /* @__PURE__ */ __name(() => currentState, "getSnapshot");
110
+ var useClientFromWallet = /* @__PURE__ */ __name((timeout) => {
111
+ const subscribeWithTimeout = useCallback((listener) => subscribe(listener, timeout), [
112
+ timeout
113
+ ]);
114
+ const clientState = useSyncExternalStore(subscribeWithTimeout, getSnapshot);
115
+ useEffect(() => {
116
+ let listener = /* @__PURE__ */ __name(() => {
117
+ updateState({
118
+ client: globalThis.xyo?.client,
119
+ isLoading: false,
120
+ error: null
121
+ });
122
+ emitChange();
123
+ }, "listener");
124
+ if (clientState.timedout && isNull(clientState.client) && !clientState.isLoading) {
125
+ globalThis.addEventListener("xyo:plugin-ready", listener);
126
+ }
127
+ return () => {
128
+ globalThis.removeEventListener("xyo:plugin-ready", listener);
129
+ };
130
+ });
131
+ return clientState;
132
+ }, "useClientFromWallet");
133
+ var useClient = useClientFromWallet;
134
+
135
+ // src/hooks/client/permissions/usePermissions.ts
136
+ var usePermissions = /* @__PURE__ */ __name(() => {
137
+ const { client, isLoading, error, timedout } = useClientFromWallet();
138
+ const permissions = client?.permissions;
139
+ return {
140
+ permissions,
141
+ isLoading,
142
+ error,
143
+ timedout
144
+ };
145
+ }, "usePermissions");
146
+
147
+ // src/hooks/client/permissions/usePermissionsAccounts.ts
148
+ import { usePromise } from "@xylabs/react-promise";
149
+ import { isArray, isDefined as isDefined2, isDefinedNotNull, isString } from "@xylabs/sdk-js";
150
+ var validateRestrictedAccounts = /* @__PURE__ */ __name((restrictedAccounts) => {
151
+ if (isDefined2(restrictedAccounts)) {
152
+ if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {
153
+ return restrictedAccounts;
154
+ }
155
+ throw new Error(`Unrecognized format for restrictReturnedAccounts caveat found on permissions.
156
+
157
+ Should be an array of strings: ${JSON.stringify(restrictedAccounts)}`);
158
+ }
159
+ return [];
160
+ }, "validateRestrictedAccounts");
161
+ var useAccountPermissions = /* @__PURE__ */ __name(() => {
162
+ const { permissions, error } = usePermissions();
163
+ return usePromise(async () => {
164
+ if (isDefinedNotNull(error)) throw error;
165
+ if (isDefined2(permissions)) {
166
+ const restrictedAccounts = await findCaveat(
167
+ permissions,
168
+ // TODO - extract to constant in protocol package
169
+ "xyoWallet_getAccounts",
170
+ "restrictReturnedAccounts"
171
+ );
172
+ return validateRestrictedAccounts(restrictedAccounts);
173
+ }
174
+ }, [
175
+ permissions
176
+ ]);
177
+ }, "useAccountPermissions");
178
+
179
+ // src/hooks/client/useGatewayFromWallet.ts
180
+ import { isDefined as isDefined3, isNull as isNull2 } from "@xylabs/sdk-js";
181
+ var useGatewayFromWallet = /* @__PURE__ */ __name((gatewayName, timeout) => {
182
+ const { client, isLoading, error, timedout } = useClientFromWallet(timeout);
183
+ const resolveGateway = /* @__PURE__ */ __name(() => {
184
+ if (isNull2(client)) return null;
185
+ if (timedout && !isLoading && isDefined3(gatewayName)) {
186
+ return null;
187
+ }
188
+ return client?.gateways?.[gatewayName];
189
+ }, "resolveGateway");
190
+ return {
191
+ gateway: gatewayName ? resolveGateway() : void 0,
192
+ isLoading,
193
+ error,
194
+ timedout
195
+ };
196
+ }, "useGatewayFromWallet");
197
+ var useGateway = useGatewayFromWallet;
198
+ export {
199
+ findCaveat,
200
+ getXyoClient,
201
+ listenForClientInjection,
202
+ useAccountPermissions,
203
+ useClient,
204
+ useClientFromWallet,
205
+ useGateway,
206
+ useGatewayFromWallet,
207
+ usePermissions
208
+ };
209
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/client/helpers/findCaveat.ts","../../src/hooks/client/useClientFromWallet.ts","../../src/hooks/helpers/getXyoClient.ts","../../src/hooks/client/permissions/usePermissions.ts","../../src/hooks/client/permissions/usePermissionsAccounts.ts","../../src/hooks/client/useGatewayFromWallet.ts"],"sourcesContent":["import { isDefined } from '@xylabs/sdk-js'\nimport type {\n CaveatTypes, ParentCapability, XyoPermissions,\n} from '@xyo-network/xl1-sdk'\n\nexport const findCaveat = async (\n permissions: XyoPermissions,\n targetCapability: ParentCapability,\n targetCaveatType: CaveatTypes,\n) => {\n const existingPermissions = await permissions.getPermissions()\n if (isDefined(existingPermissions) && existingPermissions.length > 0) {\n const foundPermissions = existingPermissions\n .find(p => p.parentCapability === targetCapability)\n if (isDefined(foundPermissions)) {\n return foundPermissions.caveats?.find(caveat => caveat.type === targetCaveatType)?.value ?? []\n }\n }\n return existingPermissions\n}\n","import { isNull } from '@xylabs/sdk-js'\nimport type { XyoClient } from '@xyo-network/xl1-sdk'\nimport {\n useCallback, useEffect, useSyncExternalStore,\n} from 'react'\n\nimport { getXyoClient } from '../helpers/index.ts'\n\ninterface ClientState {\n client?: XyoClient | null\n error: Error | null\n isLoading: boolean\n timedout: boolean\n}\n\nlet currentState: ClientState = {\n client: undefined,\n error: null,\n isLoading: false,\n timedout: false,\n}\n\nconst listeners = new Set<() => void>()\n\nconst emitChange = () => {\n for (const listener of listeners) listener()\n}\n\nconst updateState = (newState: Partial<ClientState>) => {\n currentState = { ...currentState, ...newState }\n emitChange()\n}\n\nconst initializeClient = async (timeout?: number) => {\n if (currentState.isLoading || currentState.client) return\n\n updateState({ isLoading: true, error: null })\n\n try {\n const client = await getXyoClient(timeout)\n if (client === null) {\n updateState({\n client: null, timedout: true, isLoading: false,\n })\n return\n }\n updateState({\n client, isLoading: false, error: null,\n })\n } catch (error) {\n console.error('Error initializing XyoClient', error)\n updateState({ error: error as Error, isLoading: false })\n }\n}\n\nconst subscribe = (listener: () => void, timeout?: number) => {\n listeners.add(listener)\n\n void initializeClient(timeout)\n\n return () => {\n listeners.delete(listener)\n }\n}\n\nconst getSnapshot = (): ClientState => currentState\n\nexport const useClientFromWallet = (timeout?: number) => {\n const subscribeWithTimeout = useCallback((listener: () => void) => subscribe(listener, timeout), [timeout])\n const clientState = useSyncExternalStore(subscribeWithTimeout, getSnapshot)\n\n useEffect(() => {\n // if client appears after timeout\n let listener = () => {\n // Update state when client becomes available\n updateState({\n client: globalThis.xyo?.client,\n isLoading: false,\n error: null,\n })\n // Notify listeners of the change\n emitChange()\n }\n // If we have timed out and still no client, listen for the plugin-ready event\n if (clientState.timedout && isNull(clientState.client) && !clientState.isLoading) {\n globalThis.addEventListener('xyo:plugin-ready', listener)\n }\n\n return () => {\n globalThis.removeEventListener('xyo:plugin-ready', listener)\n }\n })\n\n return clientState\n}\n\n/** @deprecated - use useClientFromWallet instead */\nexport const useClient = useClientFromWallet\n","import { isUndefined } from '@xylabs/sdk-js'\nimport type { XyoClient } from '@xyo-network/xl1-sdk'\n\nconst CLIENT_LISTENER_TIMEOUT = 500\n\nconst hasXyoClient = () => {\n return 'client' in globalThis.xyo\n}\n\nexport const listenForClientInjection = (onClientReady: () => void, timeout: number, onTimeout: () => void) => {\n let resolved = false\n const listener: EventListener = () => {\n onClientReady()\n resolved = true\n }\n globalThis.addEventListener('xyo:plugin-ready', listener)\n setTimeout(() => {\n if (!resolved) {\n globalThis.removeEventListener('xyo:plugin-ready', listener)\n onTimeout()\n }\n }, timeout)\n}\n\ntype ReturnType = XyoClient | undefined | null\n\nexport async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT): Promise<ReturnType> {\n // if no xyo object, we can bail early\n if (isUndefined(globalThis.xyo)) {\n return null\n }\n return hasXyoClient()\n ? globalThis.xyo.client\n // listen for the XyoWallet to be injected\n : await new Promise<ReturnType>((resolve) => {\n listenForClientInjection(\n () => {\n resolve(globalThis.xyo.client)\n },\n timeout,\n () => {\n resolve(null)\n },\n )\n })\n}\n","import { useClientFromWallet } from '../useClientFromWallet.ts'\n\nexport const usePermissions = () => {\n const {\n client, isLoading, error, timedout,\n } = useClientFromWallet()\n const permissions = client?.permissions\n return {\n permissions,\n isLoading,\n error,\n timedout,\n }\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { JsonValue } from '@xylabs/sdk-js'\nimport {\n isArray, isDefined, isDefinedNotNull, isString,\n} from '@xylabs/sdk-js'\n\nimport { findCaveat } from '../helpers/index.ts'\nimport { usePermissions } from './usePermissions.ts'\n\nconst validateRestrictedAccounts = (restrictedAccounts: JsonValue): readonly string [] => {\n if (isDefined(restrictedAccounts)) {\n if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {\n return restrictedAccounts\n }\n throw new Error(\n `Unrecognized format for restrictReturnedAccounts caveat found on permissions. \\n\n Should be an array of strings: ${JSON.stringify(restrictedAccounts)}`,\n )\n }\n return []\n}\n\nexport const useAccountPermissions = () => {\n const { permissions, error } = usePermissions()\n\n return usePromise(async () => {\n if (isDefinedNotNull(error)) throw error\n if (isDefined(permissions)) {\n const restrictedAccounts = await findCaveat(\n permissions,\n // TODO - extract to constant in protocol package\n 'xyoWallet_getAccounts',\n 'restrictReturnedAccounts',\n )\n return validateRestrictedAccounts(restrictedAccounts)\n }\n }, [permissions])\n}\n","import { isDefined, isNull } from '@xylabs/sdk-js'\nimport type { GatewayName } from '@xyo-network/xl1-sdk'\n\nimport type { GatewayFromWallet } from '../../types/index.ts'\nimport { useClientFromWallet } from './useClientFromWallet.ts'\n\nexport const useGatewayFromWallet = (gatewayName?: GatewayName, timeout?: number): GatewayFromWallet => {\n const {\n client, isLoading, error, timedout,\n } = useClientFromWallet(timeout)\n\n const resolveGateway = () => {\n // null client means we do not have to wait for timedout\n if (isNull(client)) return null\n if (timedout && !isLoading && isDefined(gatewayName)) {\n return null\n }\n return client?.gateways?.[gatewayName!]\n }\n\n return {\n gateway: gatewayName ? resolveGateway() : undefined,\n isLoading,\n error,\n timedout,\n }\n}\n\n/** @deprecated - useGatewayFromWallet */\nexport const useGateway = useGatewayFromWallet\n"],"mappings":"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","names":["isDefined","findCaveat","permissions","targetCapability","targetCaveatType","existingPermissions","getPermissions","isDefined","length","foundPermissions","find","p","parentCapability","caveats","caveat","type","value","isNull","useCallback","useEffect","useSyncExternalStore","isUndefined","CLIENT_LISTENER_TIMEOUT","hasXyoClient","globalThis","xyo","listenForClientInjection","onClientReady","timeout","onTimeout","resolved","listener","addEventListener","setTimeout","removeEventListener","getXyoClient","isUndefined","client","Promise","resolve","currentState","client","undefined","error","isLoading","timedout","listeners","Set","emitChange","listener","updateState","newState","initializeClient","timeout","getXyoClient","console","subscribe","add","delete","getSnapshot","useClientFromWallet","subscribeWithTimeout","useCallback","clientState","useSyncExternalStore","useEffect","globalThis","xyo","isNull","addEventListener","removeEventListener","useClient","usePermissions","client","isLoading","error","timedout","useClientFromWallet","permissions","usePromise","isArray","isDefined","isDefinedNotNull","isString","validateRestrictedAccounts","restrictedAccounts","isDefined","isArray","every","isString","Error","JSON","stringify","useAccountPermissions","permissions","error","usePermissions","usePromise","isDefinedNotNull","findCaveat","isDefined","isNull","useGatewayFromWallet","gatewayName","timeout","client","isLoading","error","timedout","useClientFromWallet","resolveGateway","isNull","isDefined","gateways","gateway","undefined","useGateway"]}
@@ -0,0 +1,8 @@
1
+ import type { XyoGatewayRunner } from '@xyo-network/xl1-sdk';
2
+ export type GatewayFromWallet = {
3
+ error?: Error | null;
4
+ gateway: XyoGatewayRunner | null | undefined;
5
+ isLoading: boolean;
6
+ timedout: boolean;
7
+ };
8
+ //# sourceMappingURL=GatewayFromWallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GatewayFromWallet.d.ts","sourceRoot":"","sources":["../../../src/types/GatewayFromWallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAA;IAC5C,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './GatewayFromWallet.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@xyo-network/react-chain-client",
3
+ "version": "1.20.8",
4
+ "description": "XYO Layer One React SDK - Client/Wallet Hooks",
5
+ "homepage": "https://xylabs.com",
6
+ "bugs": {
7
+ "url": "git+https://github.com/xylabs/xyo-chain/issues",
8
+ "email": "support@xylabs.com"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/xylabs/xyo-chain.git"
13
+ },
14
+ "license": "LGPL-3.0-only",
15
+ "author": {
16
+ "name": "XY Labs Development Team",
17
+ "email": "support@xylabs.com",
18
+ "url": "https://xylabs.com"
19
+ },
20
+ "sideEffects": false,
21
+ "type": "module",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/browser/index.d.ts",
25
+ "browser": {
26
+ "types": "./dist/browser/index.d.ts",
27
+ "source": "./src/index.ts",
28
+ "default": "./dist/browser/index.mjs"
29
+ },
30
+ "source": "./src/index.ts",
31
+ "default": "./dist/browser/index.mjs"
32
+ },
33
+ "./package.json": "./package.json"
34
+ },
35
+ "module": "./dist/browser/index.mjs",
36
+ "source": "./src/index.ts",
37
+ "types": "./dist/browser/index.d.ts",
38
+ "files": [
39
+ "dist",
40
+ "src",
41
+ "!**/*.bench.*",
42
+ "!**/*.spec.*",
43
+ "!**/*.test.*"
44
+ ],
45
+ "dependencies": {
46
+ "@xylabs/react-promise": "~7.1.17"
47
+ },
48
+ "devDependencies": {
49
+ "@types/react": "~19.2.14",
50
+ "@xylabs/sdk-js": "~5.0.86",
51
+ "@xylabs/ts-scripts-yarn3": "~7.4.25",
52
+ "@xylabs/tsconfig": "~7.4.25",
53
+ "@xylabs/tsconfig-dom": "~7.4.25",
54
+ "@xylabs/tsconfig-react": "~7.4.25",
55
+ "@xyo-network/react-chain-model": "~1.20.10",
56
+ "@xyo-network/sdk-js": "~5.3.16",
57
+ "@xyo-network/xl1-sdk": "~1.25.27",
58
+ "axios": "^1.13.6",
59
+ "ethers": "^6.16.0",
60
+ "react": "~19.2.4",
61
+ "typescript": "~5.9.3",
62
+ "zod": "~4.3.6"
63
+ },
64
+ "peerDependencies": {
65
+ "@xylabs/sdk-js": "^5",
66
+ "@xyo-network/xl1-sdk": "^1",
67
+ "react": "^19"
68
+ },
69
+ "engines": {
70
+ "node": ">=22"
71
+ },
72
+ "publishConfig": {
73
+ "access": "public"
74
+ }
75
+ }
@@ -0,0 +1,9 @@
1
+ import type { XyoGlobal } from '@xyo-network/react-chain-model'
2
+
3
+ export declare global {
4
+ interface Window {
5
+ xyo: XyoGlobal
6
+ }
7
+
8
+ var xyo: XyoGlobal
9
+ }
@@ -0,0 +1,20 @@
1
+ import { isDefined } from '@xylabs/sdk-js'
2
+ import type {
3
+ CaveatTypes, ParentCapability, XyoPermissions,
4
+ } from '@xyo-network/xl1-sdk'
5
+
6
+ export const findCaveat = async (
7
+ permissions: XyoPermissions,
8
+ targetCapability: ParentCapability,
9
+ targetCaveatType: CaveatTypes,
10
+ ) => {
11
+ const existingPermissions = await permissions.getPermissions()
12
+ if (isDefined(existingPermissions) && existingPermissions.length > 0) {
13
+ const foundPermissions = existingPermissions
14
+ .find(p => p.parentCapability === targetCapability)
15
+ if (isDefined(foundPermissions)) {
16
+ return foundPermissions.caveats?.find(caveat => caveat.type === targetCaveatType)?.value ?? []
17
+ }
18
+ }
19
+ return existingPermissions
20
+ }
@@ -0,0 +1 @@
1
+ export * from './findCaveat.ts'
@@ -0,0 +1,4 @@
1
+ export * from './helpers/index.ts'
2
+ export * from './permissions/index.ts'
3
+ export * from './useClientFromWallet.ts'
4
+ export * from './useGatewayFromWallet.ts'
@@ -0,0 +1,2 @@
1
+ export * from './usePermissions.ts'
2
+ export * from './usePermissionsAccounts.ts'
@@ -0,0 +1,14 @@
1
+ import { useClientFromWallet } from '../useClientFromWallet.ts'
2
+
3
+ export const usePermissions = () => {
4
+ const {
5
+ client, isLoading, error, timedout,
6
+ } = useClientFromWallet()
7
+ const permissions = client?.permissions
8
+ return {
9
+ permissions,
10
+ isLoading,
11
+ error,
12
+ timedout,
13
+ }
14
+ }
@@ -0,0 +1,38 @@
1
+ import { usePromise } from '@xylabs/react-promise'
2
+ import type { JsonValue } from '@xylabs/sdk-js'
3
+ import {
4
+ isArray, isDefined, isDefinedNotNull, isString,
5
+ } from '@xylabs/sdk-js'
6
+
7
+ import { findCaveat } from '../helpers/index.ts'
8
+ import { usePermissions } from './usePermissions.ts'
9
+
10
+ const validateRestrictedAccounts = (restrictedAccounts: JsonValue): readonly string [] => {
11
+ if (isDefined(restrictedAccounts)) {
12
+ if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {
13
+ return restrictedAccounts
14
+ }
15
+ throw new Error(
16
+ `Unrecognized format for restrictReturnedAccounts caveat found on permissions. \n
17
+ Should be an array of strings: ${JSON.stringify(restrictedAccounts)}`,
18
+ )
19
+ }
20
+ return []
21
+ }
22
+
23
+ export const useAccountPermissions = () => {
24
+ const { permissions, error } = usePermissions()
25
+
26
+ return usePromise(async () => {
27
+ if (isDefinedNotNull(error)) throw error
28
+ if (isDefined(permissions)) {
29
+ const restrictedAccounts = await findCaveat(
30
+ permissions,
31
+ // TODO - extract to constant in protocol package
32
+ 'xyoWallet_getAccounts',
33
+ 'restrictReturnedAccounts',
34
+ )
35
+ return validateRestrictedAccounts(restrictedAccounts)
36
+ }
37
+ }, [permissions])
38
+ }
@@ -0,0 +1,98 @@
1
+ import { isNull } from '@xylabs/sdk-js'
2
+ import type { XyoClient } from '@xyo-network/xl1-sdk'
3
+ import {
4
+ useCallback, useEffect, useSyncExternalStore,
5
+ } from 'react'
6
+
7
+ import { getXyoClient } from '../helpers/index.ts'
8
+
9
+ interface ClientState {
10
+ client?: XyoClient | null
11
+ error: Error | null
12
+ isLoading: boolean
13
+ timedout: boolean
14
+ }
15
+
16
+ let currentState: ClientState = {
17
+ client: undefined,
18
+ error: null,
19
+ isLoading: false,
20
+ timedout: false,
21
+ }
22
+
23
+ const listeners = new Set<() => void>()
24
+
25
+ const emitChange = () => {
26
+ for (const listener of listeners) listener()
27
+ }
28
+
29
+ const updateState = (newState: Partial<ClientState>) => {
30
+ currentState = { ...currentState, ...newState }
31
+ emitChange()
32
+ }
33
+
34
+ const initializeClient = async (timeout?: number) => {
35
+ if (currentState.isLoading || currentState.client) return
36
+
37
+ updateState({ isLoading: true, error: null })
38
+
39
+ try {
40
+ const client = await getXyoClient(timeout)
41
+ if (client === null) {
42
+ updateState({
43
+ client: null, timedout: true, isLoading: false,
44
+ })
45
+ return
46
+ }
47
+ updateState({
48
+ client, isLoading: false, error: null,
49
+ })
50
+ } catch (error) {
51
+ console.error('Error initializing XyoClient', error)
52
+ updateState({ error: error as Error, isLoading: false })
53
+ }
54
+ }
55
+
56
+ const subscribe = (listener: () => void, timeout?: number) => {
57
+ listeners.add(listener)
58
+
59
+ void initializeClient(timeout)
60
+
61
+ return () => {
62
+ listeners.delete(listener)
63
+ }
64
+ }
65
+
66
+ const getSnapshot = (): ClientState => currentState
67
+
68
+ export const useClientFromWallet = (timeout?: number) => {
69
+ const subscribeWithTimeout = useCallback((listener: () => void) => subscribe(listener, timeout), [timeout])
70
+ const clientState = useSyncExternalStore(subscribeWithTimeout, getSnapshot)
71
+
72
+ useEffect(() => {
73
+ // if client appears after timeout
74
+ let listener = () => {
75
+ // Update state when client becomes available
76
+ updateState({
77
+ client: globalThis.xyo?.client,
78
+ isLoading: false,
79
+ error: null,
80
+ })
81
+ // Notify listeners of the change
82
+ emitChange()
83
+ }
84
+ // If we have timed out and still no client, listen for the plugin-ready event
85
+ if (clientState.timedout && isNull(clientState.client) && !clientState.isLoading) {
86
+ globalThis.addEventListener('xyo:plugin-ready', listener)
87
+ }
88
+
89
+ return () => {
90
+ globalThis.removeEventListener('xyo:plugin-ready', listener)
91
+ }
92
+ })
93
+
94
+ return clientState
95
+ }
96
+
97
+ /** @deprecated - use useClientFromWallet instead */
98
+ export const useClient = useClientFromWallet
@@ -0,0 +1,30 @@
1
+ import { isDefined, isNull } from '@xylabs/sdk-js'
2
+ import type { GatewayName } from '@xyo-network/xl1-sdk'
3
+
4
+ import type { GatewayFromWallet } from '../../types/index.ts'
5
+ import { useClientFromWallet } from './useClientFromWallet.ts'
6
+
7
+ export const useGatewayFromWallet = (gatewayName?: GatewayName, timeout?: number): GatewayFromWallet => {
8
+ const {
9
+ client, isLoading, error, timedout,
10
+ } = useClientFromWallet(timeout)
11
+
12
+ const resolveGateway = () => {
13
+ // null client means we do not have to wait for timedout
14
+ if (isNull(client)) return null
15
+ if (timedout && !isLoading && isDefined(gatewayName)) {
16
+ return null
17
+ }
18
+ return client?.gateways?.[gatewayName!]
19
+ }
20
+
21
+ return {
22
+ gateway: gatewayName ? resolveGateway() : undefined,
23
+ isLoading,
24
+ error,
25
+ timedout,
26
+ }
27
+ }
28
+
29
+ /** @deprecated - useGatewayFromWallet */
30
+ export const useGateway = useGatewayFromWallet
@@ -0,0 +1,46 @@
1
+ import { isUndefined } from '@xylabs/sdk-js'
2
+ import type { XyoClient } from '@xyo-network/xl1-sdk'
3
+
4
+ const CLIENT_LISTENER_TIMEOUT = 500
5
+
6
+ const hasXyoClient = () => {
7
+ return 'client' in globalThis.xyo
8
+ }
9
+
10
+ export const listenForClientInjection = (onClientReady: () => void, timeout: number, onTimeout: () => void) => {
11
+ let resolved = false
12
+ const listener: EventListener = () => {
13
+ onClientReady()
14
+ resolved = true
15
+ }
16
+ globalThis.addEventListener('xyo:plugin-ready', listener)
17
+ setTimeout(() => {
18
+ if (!resolved) {
19
+ globalThis.removeEventListener('xyo:plugin-ready', listener)
20
+ onTimeout()
21
+ }
22
+ }, timeout)
23
+ }
24
+
25
+ type ReturnType = XyoClient | undefined | null
26
+
27
+ export async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT): Promise<ReturnType> {
28
+ // if no xyo object, we can bail early
29
+ if (isUndefined(globalThis.xyo)) {
30
+ return null
31
+ }
32
+ return hasXyoClient()
33
+ ? globalThis.xyo.client
34
+ // listen for the XyoWallet to be injected
35
+ : await new Promise<ReturnType>((resolve) => {
36
+ listenForClientInjection(
37
+ () => {
38
+ resolve(globalThis.xyo.client)
39
+ },
40
+ timeout,
41
+ () => {
42
+ resolve(null)
43
+ },
44
+ )
45
+ })
46
+ }
@@ -0,0 +1 @@
1
+ export * from './getXyoClient.ts'
@@ -0,0 +1,2 @@
1
+ export * from './client/index.ts'
2
+ export * from './helpers/index.ts'
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './hooks/index.ts'
2
+ export * from './types/index.ts'
@@ -0,0 +1,8 @@
1
+ import type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'
2
+
3
+ export type GatewayFromWallet = {
4
+ error?: Error | null
5
+ gateway: XyoGatewayRunner | null | undefined
6
+ isLoading: boolean
7
+ timedout: boolean
8
+ }
@@ -0,0 +1 @@
1
+ export * from './GatewayFromWallet.ts'