@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.
- package/dist/browser/hooks/client/helpers/findCaveat.d.ts +3 -0
- package/dist/browser/hooks/client/helpers/findCaveat.d.ts.map +1 -0
- package/dist/browser/hooks/client/helpers/index.d.ts +2 -0
- package/dist/browser/hooks/client/helpers/index.d.ts.map +1 -0
- package/dist/browser/hooks/client/index.d.ts +5 -0
- package/dist/browser/hooks/client/index.d.ts.map +1 -0
- package/dist/browser/hooks/client/permissions/index.d.ts +3 -0
- package/dist/browser/hooks/client/permissions/index.d.ts.map +1 -0
- package/dist/browser/hooks/client/permissions/usePermissions.d.ts +7 -0
- package/dist/browser/hooks/client/permissions/usePermissions.d.ts.map +1 -0
- package/dist/browser/hooks/client/permissions/usePermissionsAccounts.d.ts +2 -0
- package/dist/browser/hooks/client/permissions/usePermissionsAccounts.d.ts.map +1 -0
- package/dist/browser/hooks/client/useClientFromWallet.d.ts +12 -0
- package/dist/browser/hooks/client/useClientFromWallet.d.ts.map +1 -0
- package/dist/browser/hooks/client/useGatewayFromWallet.d.ts +6 -0
- package/dist/browser/hooks/client/useGatewayFromWallet.d.ts.map +1 -0
- package/dist/browser/hooks/helpers/getXyoClient.d.ts +6 -0
- package/dist/browser/hooks/helpers/getXyoClient.d.ts.map +1 -0
- package/dist/browser/hooks/helpers/index.d.ts +2 -0
- package/dist/browser/hooks/helpers/index.d.ts.map +1 -0
- package/dist/browser/hooks/index.d.ts +3 -0
- package/dist/browser/hooks/index.d.ts.map +1 -0
- package/dist/browser/index.d.ts +3 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.mjs +209 -0
- package/dist/browser/index.mjs.map +1 -0
- package/dist/browser/types/GatewayFromWallet.d.ts +8 -0
- package/dist/browser/types/GatewayFromWallet.d.ts.map +1 -0
- package/dist/browser/types/index.d.ts +2 -0
- package/dist/browser/types/index.d.ts.map +1 -0
- package/package.json +75 -0
- package/src/global.d.ts +9 -0
- package/src/hooks/client/helpers/findCaveat.ts +20 -0
- package/src/hooks/client/helpers/index.ts +1 -0
- package/src/hooks/client/index.ts +4 -0
- package/src/hooks/client/permissions/index.ts +2 -0
- package/src/hooks/client/permissions/usePermissions.ts +14 -0
- package/src/hooks/client/permissions/usePermissionsAccounts.ts +38 -0
- package/src/hooks/client/useClientFromWallet.ts +98 -0
- package/src/hooks/client/useGatewayFromWallet.ts +30 -0
- package/src/hooks/helpers/getXyoClient.ts +46 -0
- package/src/hooks/helpers/index.ts +1 -0
- package/src/hooks/index.ts +2 -0
- package/src/index.ts +2 -0
- package/src/types/GatewayFromWallet.ts +8 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/client/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|
package/src/global.d.ts
ADDED
|
@@ -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,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'
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './GatewayFromWallet.ts'
|