unwallet-client-sdk 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,343 @@
1
+ // src/error.ts
2
+ var _UWError = class _UWError extends Error {
3
+ constructor(code, message) {
4
+ super(message !== void 0 ? `${code}: ${message}` : code);
5
+ this.code = code;
6
+ }
7
+ };
8
+ _UWError.prototype.name = "UWError";
9
+ var UWError = _UWError;
10
+
11
+ // src/unwallet.ts
12
+ import { ethers } from "ethers";
13
+
14
+ // src/config.ts
15
+ var UNWALLET_CONFIG_PROD = {
16
+ frontend: {
17
+ baseURL: "https://id.unwallet.world"
18
+ },
19
+ xapi: {
20
+ url: "wss://xapi.id.unwallet.world",
21
+ connectionTimeout: 1e4
22
+ }
23
+ };
24
+ var UNWALLET_CONFIG_DEV = {
25
+ frontend: {
26
+ baseURL: "http://localhost:4200"
27
+ },
28
+ xapi: {
29
+ url: "wss://xapi.id.test.unwallet.dev",
30
+ connectionTimeout: 1e4
31
+ }
32
+ };
33
+ function getUnWalletConfigByEnv(env) {
34
+ switch (env) {
35
+ case "prod":
36
+ return UNWALLET_CONFIG_PROD;
37
+ case "dev":
38
+ return UNWALLET_CONFIG_DEV;
39
+ }
40
+ }
41
+
42
+ // src/x.ts
43
+ import { z } from "zod";
44
+ var VALID_X_RESPONSE_TYPES = [
45
+ "connectionID",
46
+ "signature",
47
+ "transactionID",
48
+ "error"
49
+ ];
50
+ var XConnection = class _XConnection {
51
+ constructor(args) {
52
+ this.responseHandler = null;
53
+ this.socket = args.socket;
54
+ this.id = args.id;
55
+ this.initListeners();
56
+ }
57
+ initListeners() {
58
+ this.socket.onopen = null;
59
+ this.socket.onmessage = (event) => {
60
+ if (this.responseHandler === null) {
61
+ return;
62
+ }
63
+ let resp;
64
+ {
65
+ const result = safeParseMessageEventDataToXResponse(event.data);
66
+ if (!result.success) {
67
+ this.responseHandler.reject(result.error);
68
+ return;
69
+ }
70
+ resp = result.data;
71
+ }
72
+ switch (resp.type) {
73
+ case "error":
74
+ switch (resp.value) {
75
+ case "rejected":
76
+ this.responseHandler.reject(new UWError("REQUEST_REJECTED"));
77
+ break;
78
+ default:
79
+ this.responseHandler.reject(
80
+ new UWError(
81
+ "INVALID_RESPONSE",
82
+ `unexpected error response value: ${resp.value}`
83
+ )
84
+ );
85
+ }
86
+ break;
87
+ default:
88
+ this.responseHandler.resolve(resp);
89
+ }
90
+ };
91
+ this.socket.onerror = null;
92
+ this.socket.onclose = (event) => {
93
+ if (this.responseHandler === null) {
94
+ return;
95
+ }
96
+ this.responseHandler.reject(
97
+ new UWError("CONNECTION_CLOSED", event.reason)
98
+ );
99
+ };
100
+ }
101
+ get readyState() {
102
+ return this.socket.readyState;
103
+ }
104
+ get hasResponseHandler() {
105
+ return this.responseHandler !== null;
106
+ }
107
+ setResponseHandler(handler) {
108
+ this.responseHandler = handler;
109
+ }
110
+ static async init(config) {
111
+ const socket = new WebSocket(config.url);
112
+ const id = await new Promise((resolve, reject) => {
113
+ setInterval(
114
+ () => reject(new UWError("CONNECTION_TIMEOUT")),
115
+ config.connectionTimeout
116
+ );
117
+ socket.onopen = () => socket.send(JSON.stringify({ action: "getConnectionID" }));
118
+ socket.onmessage = (event) => {
119
+ let resp;
120
+ {
121
+ const result = safeParseMessageEventDataToXResponse(event.data);
122
+ if (!result.success) {
123
+ reject(result.error);
124
+ return;
125
+ }
126
+ resp = result.data;
127
+ }
128
+ if (resp.type !== "connectionID") {
129
+ reject(
130
+ new UWError(
131
+ "INVALID_RESPONSE",
132
+ `unexpected response type: ${resp.type}`
133
+ )
134
+ );
135
+ return;
136
+ }
137
+ resolve(resp.value);
138
+ };
139
+ socket.onerror = () => reject(new UWError("CONNECTION_FAILED"));
140
+ socket.onclose = (event) => reject(new UWError("CONNECTION_CLOSED", event.reason));
141
+ });
142
+ return new _XConnection({ socket, id });
143
+ }
144
+ };
145
+ function safeParseMessageEventDataToXResponse(data) {
146
+ let s;
147
+ {
148
+ const result = z.string().refine((val) => {
149
+ try {
150
+ JSON.parse(val);
151
+ } catch (e) {
152
+ return false;
153
+ }
154
+ return true;
155
+ }).safeParse(data);
156
+ if (!result.success) {
157
+ return {
158
+ success: false,
159
+ error: new UWError(
160
+ "INVALID_RESPONSE",
161
+ "message event data must be a json string"
162
+ )
163
+ };
164
+ }
165
+ s = result.data;
166
+ }
167
+ let parsed;
168
+ {
169
+ const result = z.object({
170
+ type: z.enum(VALID_X_RESPONSE_TYPES),
171
+ value: z.string()
172
+ }).safeParse(JSON.parse(s));
173
+ if (!result.success) {
174
+ return {
175
+ success: false,
176
+ error: new UWError(
177
+ "INVALID_RESPONSE",
178
+ `invalid message event data: ${result.error.message}`
179
+ )
180
+ };
181
+ }
182
+ parsed = result.data;
183
+ }
184
+ return {
185
+ success: true,
186
+ data: parsed
187
+ };
188
+ }
189
+
190
+ // src/unwallet.ts
191
+ var UnWallet = class _UnWallet {
192
+ constructor(args) {
193
+ this.env = args.env;
194
+ this.clientID = args.clientID;
195
+ this.xConnection = args.xConnection;
196
+ }
197
+ static async init(config) {
198
+ const env = config.env !== void 0 ? config.env : "prod";
199
+ return new _UnWallet({
200
+ env,
201
+ clientID: config.clientID,
202
+ xConnection: await XConnection.init(getUnWalletConfigByEnv(env).xapi)
203
+ });
204
+ }
205
+ get unWalletConfig() {
206
+ return getUnWalletConfigByEnv(this.env);
207
+ }
208
+ authorize(args) {
209
+ const url = new URL(
210
+ `${this.unWalletConfig.frontend.baseURL}/${args.isVirtual !== void 0 ? args.isVirtual ? "v" : "" : "v"}authorize`
211
+ );
212
+ {
213
+ url.searchParams.set("response_type", "id_token");
214
+ url.searchParams.set(
215
+ "response_mode",
216
+ args.responseMode !== void 0 ? args.responseMode : "fragment"
217
+ );
218
+ url.searchParams.set("client_id", this.clientID);
219
+ url.searchParams.set("scope", "openid");
220
+ url.searchParams.set("redirect_uri", args.redirectURL);
221
+ if (args.nonce !== void 0) {
222
+ url.searchParams.set("nonce", args.nonce);
223
+ }
224
+ if (args.chainID !== void 0) {
225
+ url.searchParams.set("chain_id", args.chainID.toString());
226
+ }
227
+ }
228
+ location.assign(url);
229
+ }
230
+ sign(args) {
231
+ return new Promise((resolve, reject) => {
232
+ if (this.xConnection.readyState !== WebSocket.OPEN) {
233
+ reject(new UWError("CONNECTION_NOT_OPENED"));
234
+ return;
235
+ }
236
+ if (this.xConnection.hasResponseHandler) {
237
+ reject(new UWError("REQUEST_IN_PROGRESS"));
238
+ return;
239
+ }
240
+ this.xConnection.setResponseHandler({
241
+ resolve: (resp) => {
242
+ this.xConnection.setResponseHandler(null);
243
+ if (resp.type !== "signature") {
244
+ reject(
245
+ new UWError(
246
+ "INVALID_RESPONSE",
247
+ `unexpected response type: ${resp.type}`
248
+ )
249
+ );
250
+ return;
251
+ }
252
+ resolve({
253
+ digest: ethers.sha256(ethers.toUtf8Bytes(args.message)),
254
+ signature: resp.value
255
+ });
256
+ },
257
+ reject: (err) => {
258
+ this.xConnection.setResponseHandler(null);
259
+ reject(err);
260
+ }
261
+ });
262
+ const url = new URL(`${this.unWalletConfig.frontend.baseURL}/x/sign`);
263
+ {
264
+ url.searchParams.set("connectionID", this.xConnection.id);
265
+ url.searchParams.set("clientID", this.clientID);
266
+ url.searchParams.set("message", args.message);
267
+ url.searchParams.set("ticketToken", args.ticketToken);
268
+ }
269
+ openWindow(url);
270
+ });
271
+ }
272
+ sendTransaction(args) {
273
+ return new Promise((resolve, reject) => {
274
+ if (this.xConnection.readyState !== WebSocket.OPEN) {
275
+ reject(new UWError("CONNECTION_NOT_OPENED"));
276
+ return;
277
+ }
278
+ if (this.xConnection.hasResponseHandler) {
279
+ reject(new UWError("REQUEST_IN_PROGRESS"));
280
+ return;
281
+ }
282
+ if (args.value === void 0 && args.data === void 0) {
283
+ reject(
284
+ new UWError("INVALID_REQUEST", "either value or data is required")
285
+ );
286
+ return;
287
+ }
288
+ this.xConnection.setResponseHandler({
289
+ resolve: (resp) => {
290
+ this.xConnection.setResponseHandler(null);
291
+ if (resp.type !== "transactionID") {
292
+ reject(
293
+ new UWError(
294
+ "INVALID_RESPONSE",
295
+ `unexpected response type: ${resp.type}`
296
+ )
297
+ );
298
+ return;
299
+ }
300
+ resolve({ transactionID: resp.value });
301
+ },
302
+ reject: (err) => {
303
+ this.xConnection.setResponseHandler(null);
304
+ reject(err);
305
+ }
306
+ });
307
+ const url = new URL(
308
+ `${this.unWalletConfig.frontend.baseURL}/x/sendTransaction`
309
+ );
310
+ {
311
+ url.searchParams.set("connectionID", this.xConnection.id);
312
+ url.searchParams.set("clientID", this.clientID);
313
+ url.searchParams.set("chainID", args.chainID.toString());
314
+ url.searchParams.set("toAddress", args.toAddress);
315
+ url.searchParams.set(
316
+ "value",
317
+ args.value !== void 0 ? args.value : "0x0"
318
+ );
319
+ url.searchParams.set(
320
+ "data",
321
+ args.data !== void 0 ? args.data : "0x"
322
+ );
323
+ url.searchParams.set("ticketToken", args.ticketToken);
324
+ }
325
+ openWindow(url);
326
+ });
327
+ }
328
+ };
329
+ function openWindow(url) {
330
+ const width = screen.width / 2;
331
+ const height = screen.height;
332
+ const left = screen.width / 4;
333
+ const top = 0;
334
+ window.open(
335
+ url.toString(),
336
+ "_blank",
337
+ `width=${width},height=${height},left=${left},top=${top}`
338
+ );
339
+ }
340
+ export {
341
+ UWError,
342
+ UnWallet
343
+ };
package/package.json CHANGED
@@ -1,32 +1,49 @@
1
1
  {
2
2
  "name": "unwallet-client-sdk",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "description": "unWallet client-side SDK",
5
5
  "license": "MIT",
6
6
  "author": "SIVIRA",
7
- "main": "dist/index.js",
8
- "repository": {
9
- "type": "git",
10
- "url": "git://github.com/SIVIRA/unwallet-client-sdk-js.git"
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "exports": {
11
+ ".": {
12
+ "require": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ },
16
+ "import": {
17
+ "types": "./dist/index.d.mts",
18
+ "default": "./dist/index.mjs"
19
+ }
20
+ }
11
21
  },
22
+ "main": "dist/index.js",
23
+ "module": "dist/index.mjs",
24
+ "types": "dist/index.d.ts",
25
+ "repository": "github:SIVIRA/unwallet-client-sdk-js",
12
26
  "config": {
13
27
  "commitizen": {
14
28
  "path": "./node_modules/cz-conventional-changelog"
15
29
  }
16
30
  },
17
31
  "dependencies": {
18
- "ethers": "6.13.5"
32
+ "ethers": "6.14.0",
33
+ "zod": "3.24.4"
19
34
  },
20
35
  "devDependencies": {
21
- "@commitlint/cli": "19.7.1",
22
- "@commitlint/config-conventional": "19.7.1",
36
+ "@commitlint/cli": "19.8.1",
37
+ "@commitlint/config-conventional": "19.8.1",
38
+ "@commitlint/types": "19.8.1",
39
+ "@tsconfig/strictest": "2.0.5",
23
40
  "commitizen": "4.3.1",
24
41
  "cz-conventional-changelog": "3.3.0",
25
42
  "husky": "9.1.7",
26
- "typescript": "5.7.3"
43
+ "tsup": "8.4.0"
27
44
  },
28
45
  "scripts": {
29
- "build": "tsc",
46
+ "build": "tsup",
30
47
  "commit": "cz"
31
48
  }
32
49
  }
@@ -1,29 +0,0 @@
1
- name: publish
2
- on:
3
- release:
4
- types: [published]
5
- jobs:
6
- publish:
7
- runs-on: ubuntu-latest
8
- steps:
9
- - name: Checkout
10
- uses: actions/checkout@v4
11
- - name: Set up pnpm
12
- uses: pnpm/action-setup@v4
13
- - name: Prepare to cache dependencies
14
- shell: bash
15
- run: |
16
- echo "PNPM_STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
17
- - name: Cache dependencies
18
- uses: actions/cache@v4
19
- with:
20
- path: ${{ env.PNPM_STORE_PATH }}
21
- key: pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
22
- - name: Install dependencies
23
- run: pnpm install
24
- - name: Build
25
- run: pnpm build
26
- - name: Prepare to publish
27
- run: pnpm config set '//registry.npmjs.org/:_authToken' "${{ secrets.NPM_TOKEN }}"
28
- - name: Publish
29
- run: pnpm publish --access public --no-git-checks
package/.husky/commit-msg DELETED
@@ -1 +0,0 @@
1
- pnpm --no -- commitlint --edit $1
@@ -1 +0,0 @@
1
- module.exports = { extends: ["@commitlint/config-conventional"] };
package/dist/configs.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import { UnWalletConfig } from "./types";
2
- export declare const unWalletConfigs: {
3
- [env: string]: UnWalletConfig;
4
- };
5
- //# sourceMappingURL=configs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../src/configs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;CAiB5D,CAAC"}
package/dist/configs.js DELETED
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.unWalletConfigs = void 0;
4
- exports.unWalletConfigs = {
5
- prod: {
6
- frontend: {
7
- baseURL: "https://id.unwallet.world",
8
- },
9
- xapi: {
10
- url: "wss://xapi.id.unwallet.world",
11
- },
12
- },
13
- dev: {
14
- frontend: {
15
- baseURL: "http://localhost:4200",
16
- },
17
- xapi: {
18
- url: "wss://xapi.id.test.unwallet.dev",
19
- },
20
- },
21
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
package/dist/types.d.ts DELETED
@@ -1,22 +0,0 @@
1
- export interface Config {
2
- clientID: string;
3
- env?: string;
4
- }
5
- export interface UnWalletConfig {
6
- frontend: UnWalletFrontendConfig;
7
- xapi: UnWalletXAPIConfig;
8
- }
9
- export interface UnWalletFrontendConfig {
10
- baseURL: string;
11
- }
12
- export interface UnWalletXAPIConfig {
13
- url: string;
14
- }
15
- export interface SignResult {
16
- digest: string;
17
- signature: string;
18
- }
19
- export interface SendTransactionResult {
20
- transactionID: string;
21
- }
22
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,sBAAsB,CAAC;IACjC,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;CACvB"}
package/dist/types.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,35 +0,0 @@
1
- import { Config, UnWalletConfig, SignResult, SendTransactionResult } from "./types";
2
- export declare class UnWallet {
3
- private config;
4
- private unWalletConfig;
5
- private ws;
6
- private connectionID;
7
- private resolve;
8
- private reject;
9
- constructor(config: Config, unWalletConfig: UnWalletConfig, ws: WebSocket);
10
- private initPromiseArgs;
11
- static init(config: Config): Promise<UnWallet>;
12
- authorize(args: {
13
- responseMode?: string;
14
- redirectURL: string;
15
- nonce?: string;
16
- isVirtual?: boolean;
17
- chainID?: number;
18
- }): void;
19
- sign(args: {
20
- message: string;
21
- ticketToken: string;
22
- }): Promise<SignResult>;
23
- sendTransaction(args: {
24
- chainID: number;
25
- toAddress: string;
26
- value?: string;
27
- data?: string;
28
- ticketToken: string;
29
- }): Promise<SendTransactionResult>;
30
- private getConnectionID;
31
- private sendWSMessage;
32
- private handleWSMessage;
33
- private openWindow;
34
- }
35
- //# sourceMappingURL=unwallet.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unwallet.d.ts","sourceRoot":"","sources":["../src/unwallet.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,MAAM,EACN,cAAc,EACd,UAAU,EACV,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAEjB,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAiB;IAEvC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,MAAM,CAAwC;gBAE1C,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,EAAE,SAAS;IAUzE,OAAO,CAAC,eAAe;WAKT,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsC9C,SAAS,CAAC,IAAI,EAAE;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;IA2BD,IAAI,CAAC,IAAI,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,UAAU,CAAC;IAsBhB,eAAe,CAAC,IAAI,EAAE;QAC3B,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkClC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,UAAU;CAYnB"}