@ultraos/wallet-sdk 0.0.9 → 0.0.10
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/package.json +1 -1
- package/src/lib/common/client-messenger.d.ts +10 -1
- package/src/lib/common/client-messenger.d.ts.map +1 -1
- package/src/lib/common/client-messenger.js +85 -55
- package/src/lib/common/client-messenger.js.map +1 -1
- package/src/lib/common/window-manager.js +1 -1
- package/src/lib/common/window-manager.js.map +1 -1
- package/src/lib/config/ultra-wallet-sdk.config.js +2 -2
- package/src/lib/config/ultra-wallet-sdk.config.js.map +1 -1
- package/src/lib/providers/web-provider/web.provider.d.ts.map +1 -1
- package/src/lib/providers/web-provider/web.provider.js +19 -2
- package/src/lib/providers/web-provider/web.provider.js.map +1 -1
- /package/{dist/libs/wallet-sdk/libs/wallet-sdk/README.md → README.md} +0 -0
package/package.json
CHANGED
|
@@ -5,6 +5,15 @@ export declare class ClientMessenger {
|
|
|
5
5
|
private rpcClient;
|
|
6
6
|
private pendingRequest;
|
|
7
7
|
constructor(windowManager: WindowManager);
|
|
8
|
-
|
|
8
|
+
private initializeRpcClient;
|
|
9
|
+
private setupMessageListener;
|
|
10
|
+
sendRequest<T>(requestMethod: string, requestParams: Record<string, unknown>): Promise<UltraResponse<T>>;
|
|
11
|
+
private isWalletWindowClosed;
|
|
12
|
+
private ensureWalletWindow;
|
|
13
|
+
private executeRequest;
|
|
14
|
+
private isValidReadyMessage;
|
|
15
|
+
private processRpcRequest;
|
|
16
|
+
private rejectWithError;
|
|
17
|
+
private createErrorResponse;
|
|
9
18
|
}
|
|
10
19
|
//# sourceMappingURL=client-messenger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-messenger.d.ts","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/common/client-messenger.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgD,aAAa,EAAE,MAAM,eAAe,CAAC;AAG5F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,cAAc,CAAS;gBAEnB,aAAa,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"client-messenger.d.ts","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/common/client-messenger.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgD,aAAa,EAAE,MAAM,eAAe,CAAC;AAG5F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,cAAc,CAAS;gBAEnB,aAAa,EAAE,aAAa;IAMxC,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,oBAAoB;IAQtB,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAiB9G,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,kBAAkB;YAQZ,cAAc;IAgD5B,OAAO,CAAC,mBAAmB;YAOb,iBAAiB;IAuB/B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,mBAAmB;CAI5B"}
|
|
@@ -6,6 +6,10 @@ export class ClientMessenger {
|
|
|
6
6
|
constructor(windowManager) {
|
|
7
7
|
this.pendingRequest = false;
|
|
8
8
|
this.windowManager = windowManager;
|
|
9
|
+
this.initializeRpcClient();
|
|
10
|
+
this.setupMessageListener();
|
|
11
|
+
}
|
|
12
|
+
initializeRpcClient() {
|
|
9
13
|
this.rpcClient = new JSONRPCClient((request) => {
|
|
10
14
|
const walletWindow = this.windowManager.getWalletWindow();
|
|
11
15
|
if (!walletWindow) {
|
|
@@ -14,6 +18,8 @@ export class ClientMessenger {
|
|
|
14
18
|
walletWindow.postMessage(request, this.windowManager.walletUrl);
|
|
15
19
|
return Promise.resolve();
|
|
16
20
|
});
|
|
21
|
+
}
|
|
22
|
+
setupMessageListener() {
|
|
17
23
|
window.addEventListener('message', (event) => {
|
|
18
24
|
if (event.origin === this.windowManager.walletUrl && event.data?.jsonrpc === '2.0') {
|
|
19
25
|
this.rpcClient.receive(event.data);
|
|
@@ -21,73 +27,97 @@ export class ClientMessenger {
|
|
|
21
27
|
});
|
|
22
28
|
}
|
|
23
29
|
async sendRequest(requestMethod, requestParams) {
|
|
24
|
-
if (this.pendingRequest && this.
|
|
25
|
-
|
|
26
|
-
return Promise.reject({ status: ResponseStatus.ERROR, code, message });
|
|
30
|
+
if (this.pendingRequest && !this.isWalletWindowClosed()) {
|
|
31
|
+
throw this.createErrorResponse(SdkErrorCode.REQUESTED_RESOURCE_NOT_AVAILABLE);
|
|
27
32
|
}
|
|
28
33
|
this.pendingRequest = true;
|
|
29
|
-
|
|
34
|
+
try {
|
|
35
|
+
this.windowManager.openOrReuseWallet();
|
|
36
|
+
const walletWindow = this.ensureWalletWindow();
|
|
37
|
+
return await this.executeRequest(walletWindow, requestMethod, requestParams);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
this.pendingRequest = false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
isWalletWindowClosed() {
|
|
44
|
+
return this.windowManager.getWalletWindow()?.closed === true;
|
|
45
|
+
}
|
|
46
|
+
ensureWalletWindow() {
|
|
30
47
|
const walletWindow = this.windowManager.getWalletWindow();
|
|
31
48
|
if (!walletWindow) {
|
|
32
|
-
|
|
33
|
-
return Promise.reject({ status: ResponseStatus.ERROR, code, message });
|
|
49
|
+
throw this.createErrorResponse(SdkErrorCode.WALLET_WINDOW_UNAVAILABLE);
|
|
34
50
|
}
|
|
35
|
-
|
|
36
|
-
|
|
51
|
+
return walletWindow;
|
|
52
|
+
}
|
|
53
|
+
async executeRequest(walletWindow, requestMethod, requestParams) {
|
|
37
54
|
return new Promise((resolve, reject) => {
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
let isResolved = false;
|
|
56
|
+
let timeoutId;
|
|
57
|
+
let intervalId;
|
|
58
|
+
const cleanupResources = () => {
|
|
59
|
+
if (isResolved)
|
|
40
60
|
return;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
window.removeEventListener('message', handleReady);
|
|
46
|
-
walletWindow.close();
|
|
61
|
+
isResolved = true;
|
|
62
|
+
clearTimeout(timeoutId);
|
|
63
|
+
clearInterval(intervalId);
|
|
64
|
+
window.removeEventListener('message', handleWalletHandshake);
|
|
47
65
|
};
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
66
|
+
const handleWalletHandshake = (event) => {
|
|
67
|
+
if (!this.isValidReadyMessage(event))
|
|
50
68
|
return;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
window.removeEventListener('message', handleReady);
|
|
55
|
-
Promise.resolve(this.rpcClient.request(requestMethod, requestParams))
|
|
56
|
-
.then((result) => {
|
|
57
|
-
cleanup();
|
|
58
|
-
if (result.status === ResponseStatus.SUCCESS) {
|
|
59
|
-
resolve(result);
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
reject(result);
|
|
63
|
-
}
|
|
64
|
-
})
|
|
65
|
-
.catch((error) => {
|
|
66
|
-
cleanup();
|
|
67
|
-
const clientError = new ClientError(SdkErrorCode.UNKNOWN_ERROR, error);
|
|
68
|
-
reject({
|
|
69
|
-
status: ResponseStatus.ERROR,
|
|
70
|
-
...clientError,
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
}
|
|
69
|
+
cleanupResources();
|
|
70
|
+
// Once the wallet is ready, we can send the request to the wallet
|
|
71
|
+
this.processRpcRequest(requestMethod, requestParams, resolve, reject);
|
|
74
72
|
};
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
cleanup();
|
|
85
|
-
const { code, message } = new ClientError(SdkErrorCode.USER_REJECTED_REQUEST);
|
|
86
|
-
reject({ status: ResponseStatus.ERROR, code, message });
|
|
73
|
+
const handleTimeout = () => {
|
|
74
|
+
cleanupResources();
|
|
75
|
+
walletWindow.close();
|
|
76
|
+
this.rejectWithError(SdkErrorCode.WALLET_HANDSHAKE_TIMEOUT, reject);
|
|
77
|
+
};
|
|
78
|
+
const handleWindowClose = () => {
|
|
79
|
+
if (walletWindow.closed && !isResolved) {
|
|
80
|
+
cleanupResources();
|
|
81
|
+
this.rejectWithError(SdkErrorCode.USER_REJECTED_REQUEST, reject);
|
|
87
82
|
}
|
|
88
|
-
}
|
|
89
|
-
|
|
83
|
+
};
|
|
84
|
+
// Set up event listeners and timers
|
|
85
|
+
window.addEventListener('message', handleWalletHandshake);
|
|
86
|
+
timeoutId = setTimeout(handleTimeout, UltraWalletSdkConfig.handshakeTimeout);
|
|
87
|
+
intervalId = setInterval(handleWindowClose, UltraWalletSdkConfig.checkWindowInterval);
|
|
90
88
|
});
|
|
91
89
|
}
|
|
90
|
+
isValidReadyMessage(event) {
|
|
91
|
+
if (event.origin !== this.windowManager.walletUrl)
|
|
92
|
+
return false;
|
|
93
|
+
const msg = event.data;
|
|
94
|
+
return msg?.jsonrpc === '2.0' && msg.method === 'ready';
|
|
95
|
+
}
|
|
96
|
+
async processRpcRequest(requestMethod, requestParams, resolve, reject) {
|
|
97
|
+
try {
|
|
98
|
+
const result = await this.rpcClient.request(requestMethod, requestParams);
|
|
99
|
+
if (result.status === ResponseStatus.SUCCESS) {
|
|
100
|
+
resolve(result);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
reject(result);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const clientError = new ClientError(SdkErrorCode.UNKNOWN_ERROR, error);
|
|
108
|
+
reject({
|
|
109
|
+
status: ResponseStatus.ERROR,
|
|
110
|
+
...clientError,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
rejectWithError(errorCode, reject) {
|
|
115
|
+
const errorResponse = this.createErrorResponse(errorCode);
|
|
116
|
+
reject(errorResponse);
|
|
117
|
+
}
|
|
118
|
+
createErrorResponse(errorCode) {
|
|
119
|
+
const { code, message } = new ClientError(errorCode);
|
|
120
|
+
return { status: ResponseStatus.ERROR, code, message, data: null };
|
|
121
|
+
}
|
|
92
122
|
}
|
|
93
123
|
//# sourceMappingURL=client-messenger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-messenger.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/common/client-messenger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,oBAAoB,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAkB,cAAc,EAAE,YAAY,EAAiB,MAAM,eAAe,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,MAAM,OAAO,eAAe;IAK1B,YAAY,aAA4B;QAFhC,mBAAc,GAAG,KAAK,CAAC;QAG7B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client-messenger.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/common/client-messenger.ts"],"names":[],"mappings":"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","sourcesContent":["import { JSONRPCClient } from 'json-rpc-2.0';\n\nimport UltraWalletSdkConfig from '../config/ultra-wallet-sdk.config';\nimport { JsonRpcMessage, ResponseStatus, SdkErrorCode, UltraResponse } from '../interfaces';\n\nimport { ClientError } from './client-error';\nimport { WindowManager } from './window-manager';\n\nexport class ClientMessenger {\n private windowManager: WindowManager;\n private rpcClient: JSONRPCClient;\n private pendingRequest = false;\n\n constructor(windowManager: WindowManager) {\n this.windowManager = windowManager;\n this.initializeRpcClient();\n this.setupMessageListener();\n }\n\n private initializeRpcClient(): void {\n this.rpcClient = new JSONRPCClient((request) => {\n const walletWindow = this.windowManager.getWalletWindow();\n if (!walletWindow) {\n return Promise.reject(new ClientError(SdkErrorCode.WALLET_WINDOW_UNAVAILABLE));\n }\n walletWindow.postMessage(request, this.windowManager.walletUrl);\n return Promise.resolve();\n });\n }\n\n private setupMessageListener(): void {\n window.addEventListener('message', (event) => {\n if (event.origin === this.windowManager.walletUrl && event.data?.jsonrpc === '2.0') {\n this.rpcClient.receive(event.data);\n }\n });\n }\n\n async sendRequest<T>(requestMethod: string, requestParams: Record<string, unknown>): Promise<UltraResponse<T>> {\n if (this.pendingRequest && !this.isWalletWindowClosed()) {\n throw this.createErrorResponse(SdkErrorCode.REQUESTED_RESOURCE_NOT_AVAILABLE);\n }\n\n this.pendingRequest = true;\n\n try {\n this.windowManager.openOrReuseWallet();\n const walletWindow = this.ensureWalletWindow();\n\n return await this.executeRequest<T>(walletWindow, requestMethod, requestParams);\n } finally {\n this.pendingRequest = false;\n }\n }\n\n private isWalletWindowClosed(): boolean {\n return this.windowManager.getWalletWindow()?.closed === true;\n }\n\n private ensureWalletWindow(): Window {\n const walletWindow = this.windowManager.getWalletWindow();\n if (!walletWindow) {\n throw this.createErrorResponse(SdkErrorCode.WALLET_WINDOW_UNAVAILABLE);\n }\n return walletWindow;\n }\n\n private async executeRequest<T>(\n walletWindow: Window,\n requestMethod: string,\n requestParams: Record<string, unknown>,\n ): Promise<UltraResponse<T>> {\n return new Promise<UltraResponse<T>>((resolve, reject) => {\n let isResolved = false;\n let timeoutId: any;\n let intervalId: any;\n\n const cleanupResources = () => {\n if (isResolved) return;\n isResolved = true;\n\n clearTimeout(timeoutId);\n clearInterval(intervalId);\n window.removeEventListener('message', handleWalletHandshake);\n };\n\n const handleWalletHandshake = (event: MessageEvent) => {\n if (!this.isValidReadyMessage(event)) return;\n\n cleanupResources();\n\n // Once the wallet is ready, we can send the request to the wallet\n this.processRpcRequest<T>(requestMethod, requestParams, resolve, reject);\n };\n\n const handleTimeout = () => {\n cleanupResources();\n walletWindow.close();\n this.rejectWithError(SdkErrorCode.WALLET_HANDSHAKE_TIMEOUT, reject);\n };\n\n const handleWindowClose = () => {\n if (walletWindow.closed && !isResolved) {\n cleanupResources();\n this.rejectWithError(SdkErrorCode.USER_REJECTED_REQUEST, reject);\n }\n };\n\n // Set up event listeners and timers\n window.addEventListener('message', handleWalletHandshake);\n timeoutId = setTimeout(handleTimeout, UltraWalletSdkConfig.handshakeTimeout);\n intervalId = setInterval(handleWindowClose, UltraWalletSdkConfig.checkWindowInterval);\n });\n }\n\n private isValidReadyMessage(event: MessageEvent): boolean {\n if (event.origin !== this.windowManager.walletUrl) return false;\n\n const msg: JsonRpcMessage = event.data;\n return msg?.jsonrpc === '2.0' && msg.method === 'ready';\n }\n\n private async processRpcRequest<T>(\n requestMethod: string,\n requestParams: Record<string, unknown>,\n resolve: (value: UltraResponse<T>) => void,\n reject: (reason: any) => void,\n ): Promise<void> {\n try {\n const result = await this.rpcClient.request(requestMethod, requestParams);\n\n if (result.status === ResponseStatus.SUCCESS) {\n resolve(result);\n } else {\n reject(result);\n }\n } catch (error) {\n const clientError = new ClientError(SdkErrorCode.UNKNOWN_ERROR, error);\n reject({\n status: ResponseStatus.ERROR,\n ...clientError,\n });\n }\n }\n\n private rejectWithError(errorCode: SdkErrorCode, reject: (reason: any) => void): void {\n const errorResponse = this.createErrorResponse(errorCode);\n reject(errorResponse);\n }\n\n private createErrorResponse(errorCode: SdkErrorCode): UltraResponse<never> {\n const { code, message } = new ClientError(errorCode);\n return { status: ResponseStatus.ERROR, code, message, data: null as never };\n }\n}\n"]}
|
|
@@ -11,7 +11,7 @@ export class WindowManager {
|
|
|
11
11
|
const width = UltraWalletSdkConfig.width;
|
|
12
12
|
const top = this.currentWindow.top;
|
|
13
13
|
const left = this.currentWindow.screenLeft + this.currentWindow.innerWidth - width;
|
|
14
|
-
this.walletWindow = window.open(this.walletUrl, '_blank', `width=${width},height=${height},top=${top},left=${left}`);
|
|
14
|
+
this.walletWindow = window.open(this.walletUrl, '_blank', `width=${width},height=${height},top=${top},left=${left},resizable=0`);
|
|
15
15
|
}
|
|
16
16
|
else {
|
|
17
17
|
this.walletWindow.focus();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window-manager.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/common/window-manager.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,mCAAmC,CAAC;AAErE,MAAM,OAAO,aAAa;IAKxB,YAAY,SAAiB;QAHrB,iBAAY,GAAkB,IAAI,CAAC;QAIzC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC;YAC3C,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,KAAK,CAAC;YAEnF,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAC7B,IAAI,CAAC,SAAS,EACd,QAAQ,EACR,SAAS,KAAK,WAAW,MAAM,QAAQ,GAAG,SAAS,IAAI,
|
|
1
|
+
{"version":3,"file":"window-manager.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/common/window-manager.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,mCAAmC,CAAC;AAErE,MAAM,OAAO,aAAa;IAKxB,YAAY,SAAiB;QAHrB,iBAAY,GAAkB,IAAI,CAAC;QAIzC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC;YAC3C,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,KAAK,CAAC;YAEnF,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAC7B,IAAI,CAAC,SAAS,EACd,QAAQ,EACR,SAAS,KAAK,WAAW,MAAM,QAAQ,GAAG,SAAS,IAAI,cAAc,CACtE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF","sourcesContent":["import UltraWalletSdkConfig from '../config/ultra-wallet-sdk.config';\n\nexport class WindowManager {\n private currentWindow: Window;\n private walletWindow: Window | null = null;\n public readonly walletUrl: string;\n\n constructor(walletUrl: string) {\n this.currentWindow = window;\n this.walletUrl = walletUrl;\n }\n\n openOrReuseWallet() {\n if (this.walletWindow == null || this.walletWindow.closed) {\n const height = UltraWalletSdkConfig.height;\n const width = UltraWalletSdkConfig.width;\n const top = this.currentWindow.top;\n const left = this.currentWindow.screenLeft + this.currentWindow.innerWidth - width;\n\n this.walletWindow = window.open(\n this.walletUrl,\n '_blank',\n `width=${width},height=${height},top=${top},left=${left},resizable=0`,\n );\n } else {\n this.walletWindow.focus();\n }\n }\n\n // Provides a reference to the wallet window\n getWalletWindow(): Window | null {\n return this.walletWindow;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ultra-wallet-sdk.config.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/config/ultra-wallet-sdk.config.ts"],"names":[],"mappings":"AAiBA,MAAM,oBAAoB,GAAyB,MAAM,CAAC,MAAM,CAAC;IAC/D,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,UAAU,EAAE;QACV,OAAO,EAAE,6BAA6B;QACtC,OAAO,EAAE,qCAAqC;KAC/C;IACD,WAAW,EAAE;QACX,OAAO,EAAE;YACP,OAAO,EAAE,kEAAkE;SAC5E;QACD,OAAO,EAAE;YACP,OAAO,EAAE,kEAAkE;SAC5E;KACF;IACD,mBAAmB,EAAE,GAAG;IACxB,gBAAgB,EAAE,KAAM;CACzB,CAAC,CAAC;AAEH,eAAe,oBAAoB,CAAC","sourcesContent":["interface UltraWalletSdkConfig {\n width: number;\n height: number;\n walletUrls: {\n mainnet: string;\n testnet: string;\n };\n checkWindowInterval: number;\n handshakeTimeout: number;\n networkInfo: Record<\n 'mainnet' | 'testnet',\n {\n chainId: string;\n }\n >;\n}\n\nconst UltraWalletSdkConfig: UltraWalletSdkConfig = Object.freeze({\n width:
|
|
1
|
+
{"version":3,"file":"ultra-wallet-sdk.config.js","sourceRoot":"","sources":["../../../../../../libs/wallet-sdk/src/lib/config/ultra-wallet-sdk.config.ts"],"names":[],"mappings":"AAiBA,MAAM,oBAAoB,GAAyB,MAAM,CAAC,MAAM,CAAC;IAC/D,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,UAAU,EAAE;QACV,OAAO,EAAE,6BAA6B;QACtC,OAAO,EAAE,qCAAqC;KAC/C;IACD,WAAW,EAAE;QACX,OAAO,EAAE;YACP,OAAO,EAAE,kEAAkE;SAC5E;QACD,OAAO,EAAE;YACP,OAAO,EAAE,kEAAkE;SAC5E;KACF;IACD,mBAAmB,EAAE,GAAG;IACxB,gBAAgB,EAAE,KAAM;CACzB,CAAC,CAAC;AAEH,eAAe,oBAAoB,CAAC","sourcesContent":["interface UltraWalletSdkConfig {\n width: number;\n height: number;\n walletUrls: {\n mainnet: string;\n testnet: string;\n };\n checkWindowInterval: number;\n handshakeTimeout: number;\n networkInfo: Record<\n 'mainnet' | 'testnet',\n {\n chainId: string;\n }\n >;\n}\n\nconst UltraWalletSdkConfig: UltraWalletSdkConfig = Object.freeze({\n width: 420,\n height: 815,\n walletUrls: {\n mainnet: 'https://web-wallet.ultra.io',\n testnet: 'https://web-wallet.staging.ultra.io',\n },\n networkInfo: {\n mainnet: {\n chainId: 'a9c481dfbc7d9506dc7e87e9a137c931b0a9303f64fd7a1d08b8230133920097',\n },\n testnet: {\n chainId: '7fc56be645bb76ab9d747b53089f132dcb7681db06f0852cfa03eaf6f7ac80e9',\n },\n },\n checkWindowInterval: 500,\n handshakeTimeout: 10_000,\n});\n\nexport default UltraWalletSdkConfig;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.provider.d.ts","sourceRoot":"","sources":["../../../../../../../libs/wallet-sdk/src/lib/providers/web-provider/web.provider.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"web.provider.d.ts","sourceRoot":"","sources":["../../../../../../../libs/wallet-sdk/src/lib/providers/web-provider/web.provider.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAEhB,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,WAAY,YAAW,mBAAmB;IAIzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAHrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAErB,OAAO,CAAC,EAAE,qBAAqB;IAK5D,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAIjE,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAI7C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAIvE,eAAe,CACb,WAAW,EAAE,qBAAqB,GAAG,qBAAqB,EAAE,GAC3D,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAI1C,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAuBlD,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAOpG,OAAO,CAAC,gBAAgB;CAIzB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ClientMessenger } from '../../common/client-messenger';
|
|
2
2
|
import { WindowManager } from '../../common/window-manager';
|
|
3
3
|
import UltraWalletSdkConfig from '../../config/ultra-wallet-sdk.config';
|
|
4
|
+
import { ResponseStatus, } from '../../interfaces';
|
|
4
5
|
export class WebProvider {
|
|
5
6
|
constructor(options) {
|
|
6
7
|
this.options = options;
|
|
@@ -19,8 +20,24 @@ export class WebProvider {
|
|
|
19
20
|
signTransaction(transaction) {
|
|
20
21
|
return this.clientMessenger.sendRequest('signTransaction', { transaction });
|
|
21
22
|
}
|
|
22
|
-
getChainId() {
|
|
23
|
-
|
|
23
|
+
async getChainId() {
|
|
24
|
+
const environment = this.options?.environment || 'mainnet';
|
|
25
|
+
switch (environment) {
|
|
26
|
+
case 'mainnet':
|
|
27
|
+
const mainnetChainId = UltraWalletSdkConfig.networkInfo.mainnet.chainId;
|
|
28
|
+
return {
|
|
29
|
+
status: ResponseStatus.SUCCESS,
|
|
30
|
+
data: mainnetChainId,
|
|
31
|
+
};
|
|
32
|
+
case 'testnet':
|
|
33
|
+
const testnetChainId = UltraWalletSdkConfig.networkInfo.testnet.chainId;
|
|
34
|
+
return {
|
|
35
|
+
status: ResponseStatus.SUCCESS,
|
|
36
|
+
data: testnetChainId,
|
|
37
|
+
};
|
|
38
|
+
default:
|
|
39
|
+
return this.clientMessenger.sendRequest('getChainId', {});
|
|
40
|
+
}
|
|
24
41
|
}
|
|
25
42
|
purchaseItem(itemType, itemId) {
|
|
26
43
|
return this.clientMessenger.sendRequest('purchaseItem', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.provider.js","sourceRoot":"","sources":["../../../../../../../libs/wallet-sdk/src/lib/providers/web-provider/web.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,oBAAoB,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"web.provider.js","sourceRoot":"","sources":["../../../../../../../libs/wallet-sdk/src/lib/providers/web-provider/web.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,oBAAoB,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAML,cAAc,GAMf,MAAM,kBAAkB,CAAC;AAE1B,MAAM,OAAO,WAAW;IAItB,YAA6B,OAA+B;QAA/B,YAAO,GAAP,OAAO,CAAwB;QAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,CAAC,CAAiB;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAgB,SAAS,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAU,YAAY,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,WAAW,CAAC,OAAe;QACzB,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAoB,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,eAAe,CACb,WAA4D;QAE5D,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAwB,iBAAiB,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,SAAS,CAAC;QAE3D,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,SAAS;gBACZ,MAAM,cAAc,GAAG,oBAAoB,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;gBACxE,OAAO;oBACL,MAAM,EAAE,cAAc,CAAC,OAAO;oBAC9B,IAAI,EAAE,cAAc;iBACrB,CAAC;YAEJ,KAAK,SAAS;gBACZ,MAAM,cAAc,GAAG,oBAAoB,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;gBACxE,OAAO;oBACL,MAAM,EAAE,cAAc,CAAC,OAAO;oBAC9B,IAAI,EAAE,cAAc;iBACrB,CAAC;YAEJ;gBACE,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAS,YAAY,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,YAAY,CAAC,QAA0B,EAAE,MAAc;QACrD,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAqB,cAAc,EAAE;YAC1E,QAAQ;YACR,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB;QACtB,MAAM,GAAG,GAAG,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,SAAS,CAAC,CAAC;QACpF,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;CACF","sourcesContent":["import { ClientMessenger } from '../../common/client-messenger';\nimport { WindowManager } from '../../common/window-manager';\nimport UltraWalletSdkConfig from '../../config/ultra-wallet-sdk.config';\nimport {\n BlockchainTransaction,\n ConnectParams,\n ConnectResult,\n PurchaseItemResult,\n PurchaseItemType,\n ResponseStatus,\n SignMessageResult,\n SignTransactionResult,\n UltraResponse,\n UltraWalletProvider,\n UltraWalletSdkOptions,\n} from '../../interfaces';\n\nexport class WebProvider implements UltraWalletProvider {\n private readonly windowManager: WindowManager;\n private readonly clientMessenger: ClientMessenger;\n\n constructor(private readonly options?: UltraWalletSdkOptions) {\n this.windowManager = new WindowManager(this.resolveWalletUrl());\n this.clientMessenger = new ClientMessenger(this.windowManager);\n }\n\n connect(_?: ConnectParams): Promise<UltraResponse<ConnectResult>> {\n return this.clientMessenger.sendRequest<ConnectResult>('connect', {});\n }\n\n disconnect(): Promise<UltraResponse<boolean>> {\n return this.clientMessenger.sendRequest<boolean>('disconnect', {});\n }\n\n signMessage(message: string): Promise<UltraResponse<SignMessageResult>> {\n return this.clientMessenger.sendRequest<SignMessageResult>('signMessage', { message });\n }\n\n signTransaction(\n transaction: BlockchainTransaction | BlockchainTransaction[],\n ): Promise<UltraResponse<SignTransactionResult>> {\n return this.clientMessenger.sendRequest<SignTransactionResult>('signTransaction', { transaction });\n }\n\n async getChainId(): Promise<UltraResponse<string>> {\n const environment = this.options?.environment || 'mainnet';\n\n switch (environment) {\n case 'mainnet':\n const mainnetChainId = UltraWalletSdkConfig.networkInfo.mainnet.chainId;\n return {\n status: ResponseStatus.SUCCESS,\n data: mainnetChainId,\n };\n\n case 'testnet':\n const testnetChainId = UltraWalletSdkConfig.networkInfo.testnet.chainId;\n return {\n status: ResponseStatus.SUCCESS,\n data: testnetChainId,\n };\n\n default:\n return this.clientMessenger.sendRequest<string>('getChainId', {});\n }\n }\n\n purchaseItem(itemType: PurchaseItemType, itemId: string): Promise<UltraResponse<PurchaseItemResult>> {\n return this.clientMessenger.sendRequest<PurchaseItemResult>('purchaseItem', {\n itemType,\n itemId,\n });\n }\n\n private resolveWalletUrl(): string {\n const env = UltraWalletSdkConfig.walletUrls[this.options?.environment || 'mainnet'];\n return env || this.options.environment;\n }\n}\n"]}
|
|
File without changes
|