@0xsequence/dapp-client 0.0.0-20250910142613

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 (43) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +11 -0
  3. package/LICENSE +202 -0
  4. package/README.md +238 -0
  5. package/dist/ChainSessionManager.d.ts +203 -0
  6. package/dist/ChainSessionManager.d.ts.map +1 -0
  7. package/dist/ChainSessionManager.js +742 -0
  8. package/dist/DappClient.d.ts +409 -0
  9. package/dist/DappClient.d.ts.map +1 -0
  10. package/dist/DappClient.js +667 -0
  11. package/dist/DappTransport.d.ts +47 -0
  12. package/dist/DappTransport.d.ts.map +1 -0
  13. package/dist/DappTransport.js +443 -0
  14. package/dist/index.d.ts +11 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +7 -0
  17. package/dist/types/index.d.ts +168 -0
  18. package/dist/types/index.d.ts.map +1 -0
  19. package/dist/types/index.js +25 -0
  20. package/dist/utils/constants.d.ts +6 -0
  21. package/dist/utils/constants.d.ts.map +1 -0
  22. package/dist/utils/constants.js +5 -0
  23. package/dist/utils/errors.d.ts +28 -0
  24. package/dist/utils/errors.d.ts.map +1 -0
  25. package/dist/utils/errors.js +54 -0
  26. package/dist/utils/index.d.ts +11 -0
  27. package/dist/utils/index.d.ts.map +1 -0
  28. package/dist/utils/index.js +135 -0
  29. package/dist/utils/storage.d.ts +64 -0
  30. package/dist/utils/storage.d.ts.map +1 -0
  31. package/dist/utils/storage.js +196 -0
  32. package/eslint.config.mjs +4 -0
  33. package/package.json +38 -0
  34. package/src/ChainSessionManager.ts +978 -0
  35. package/src/DappClient.ts +801 -0
  36. package/src/DappTransport.ts +518 -0
  37. package/src/index.ts +47 -0
  38. package/src/types/index.ts +218 -0
  39. package/src/utils/constants.ts +5 -0
  40. package/src/utils/errors.ts +62 -0
  41. package/src/utils/index.ts +158 -0
  42. package/src/utils/storage.ts +272 -0
  43. package/tsconfig.json +10 -0
@@ -0,0 +1,196 @@
1
+ import { Address } from 'ox';
2
+ import { jsonReplacers, jsonRevivers } from './index.js';
3
+ const DB_NAME = 'SequenceDappStorage';
4
+ const DB_VERSION = 1;
5
+ const STORE_NAME = 'userKeys';
6
+ const IMPLICIT_SESSIONS_IDB_KEY = 'SequenceImplicitSession';
7
+ const EXPLICIT_SESSIONS_IDB_KEY = 'SequenceExplicitSession';
8
+ const PENDING_REDIRECT_REQUEST_KEY = 'SequencePendingRedirect';
9
+ const TEMP_SESSION_PK_KEY = 'SequencePendingTempSessionPk';
10
+ const PENDING_REQUEST_CONTEXT_KEY = 'SequencePendingRequestContext';
11
+ export class WebStorage {
12
+ openDB() {
13
+ return new Promise((resolve, reject) => {
14
+ const request = indexedDB.open(DB_NAME, DB_VERSION);
15
+ request.onerror = (event) => reject(`IndexedDB error: ${event.target.error}`);
16
+ request.onsuccess = (event) => resolve(event.target.result);
17
+ request.onupgradeneeded = (event) => {
18
+ const db = event.target.result;
19
+ if (!db.objectStoreNames.contains(STORE_NAME)) {
20
+ db.createObjectStore(STORE_NAME);
21
+ }
22
+ };
23
+ });
24
+ }
25
+ async getIDBItem(key) {
26
+ const db = await this.openDB();
27
+ return new Promise((resolve, reject) => {
28
+ const request = db.transaction(STORE_NAME, 'readonly').objectStore(STORE_NAME).get(key);
29
+ request.onerror = (event) => reject(`Failed to retrieve item: ${event.target.error}`);
30
+ request.onsuccess = (event) => resolve(event.target.result);
31
+ });
32
+ }
33
+ async setIDBItem(key, value) {
34
+ const db = await this.openDB();
35
+ return new Promise((resolve, reject) => {
36
+ const request = db.transaction(STORE_NAME, 'readwrite').objectStore(STORE_NAME).put(value, key);
37
+ request.onerror = (event) => reject(`Failed to save item: ${event.target.error}`);
38
+ request.onsuccess = () => resolve();
39
+ });
40
+ }
41
+ async deleteIDBItem(key) {
42
+ const db = await this.openDB();
43
+ return new Promise((resolve, reject) => {
44
+ const request = db.transaction(STORE_NAME, 'readwrite').objectStore(STORE_NAME).delete(key);
45
+ request.onerror = (event) => reject(`Failed to delete item: ${event.target.error}`);
46
+ request.onsuccess = () => resolve();
47
+ });
48
+ }
49
+ async setPendingRedirectRequest(isPending) {
50
+ try {
51
+ if (isPending) {
52
+ sessionStorage.setItem(PENDING_REDIRECT_REQUEST_KEY, 'true');
53
+ }
54
+ else {
55
+ sessionStorage.removeItem(PENDING_REDIRECT_REQUEST_KEY);
56
+ }
57
+ }
58
+ catch (error) {
59
+ console.error('Failed to set pending redirect flag:', error);
60
+ }
61
+ }
62
+ async isRedirectRequestPending() {
63
+ try {
64
+ return sessionStorage.getItem(PENDING_REDIRECT_REQUEST_KEY) === 'true';
65
+ }
66
+ catch (error) {
67
+ console.error('Failed to check pending redirect flag:', error);
68
+ return false;
69
+ }
70
+ }
71
+ async saveTempSessionPk(pk) {
72
+ try {
73
+ sessionStorage.setItem(TEMP_SESSION_PK_KEY, pk);
74
+ }
75
+ catch (error) {
76
+ console.error('Failed to save temp session PK:', error);
77
+ }
78
+ }
79
+ async getAndClearTempSessionPk() {
80
+ try {
81
+ const pk = sessionStorage.getItem(TEMP_SESSION_PK_KEY);
82
+ sessionStorage.removeItem(TEMP_SESSION_PK_KEY);
83
+ return pk;
84
+ }
85
+ catch (error) {
86
+ console.error('Failed to retrieve temp session PK:', error);
87
+ return null;
88
+ }
89
+ }
90
+ async savePendingRequest(context) {
91
+ try {
92
+ sessionStorage.setItem(PENDING_REQUEST_CONTEXT_KEY, JSON.stringify(context, jsonReplacers));
93
+ }
94
+ catch (error) {
95
+ console.error('Failed to save pending request context:', error);
96
+ }
97
+ }
98
+ async getAndClearPendingRequest() {
99
+ try {
100
+ const context = sessionStorage.getItem(PENDING_REQUEST_CONTEXT_KEY);
101
+ if (!context)
102
+ return null;
103
+ sessionStorage.removeItem(PENDING_REQUEST_CONTEXT_KEY);
104
+ return JSON.parse(context, jsonRevivers);
105
+ }
106
+ catch (error) {
107
+ console.error('Failed to retrieve pending request context:', error);
108
+ return null;
109
+ }
110
+ }
111
+ async peekPendingRequest() {
112
+ try {
113
+ const context = sessionStorage.getItem(PENDING_REQUEST_CONTEXT_KEY);
114
+ if (!context)
115
+ return null;
116
+ return JSON.parse(context, jsonRevivers);
117
+ }
118
+ catch (error) {
119
+ console.error('Failed to peek at pending request context:', error);
120
+ return null;
121
+ }
122
+ }
123
+ async saveExplicitSession(sessionData) {
124
+ try {
125
+ const existingSessions = (await this.getExplicitSessions()).filter((s) => !(Address.isEqual(s.walletAddress, sessionData.walletAddress) &&
126
+ s.pk === sessionData.pk &&
127
+ s.chainId === sessionData.chainId));
128
+ await this.setIDBItem(EXPLICIT_SESSIONS_IDB_KEY, [...existingSessions, sessionData]);
129
+ }
130
+ catch (error) {
131
+ console.error('Failed to save explicit session:', error);
132
+ throw error;
133
+ }
134
+ }
135
+ async getExplicitSessions() {
136
+ try {
137
+ const sessions = await this.getIDBItem(EXPLICIT_SESSIONS_IDB_KEY);
138
+ return sessions && Array.isArray(sessions) ? sessions : [];
139
+ }
140
+ catch (error) {
141
+ console.error('Failed to retrieve explicit sessions:', error);
142
+ return [];
143
+ }
144
+ }
145
+ async clearExplicitSessions() {
146
+ try {
147
+ await this.deleteIDBItem(EXPLICIT_SESSIONS_IDB_KEY);
148
+ }
149
+ catch (error) {
150
+ console.error('Failed to clear explicit sessions:', error);
151
+ throw error;
152
+ }
153
+ }
154
+ async saveImplicitSession(sessionData) {
155
+ try {
156
+ await this.setIDBItem(IMPLICIT_SESSIONS_IDB_KEY, sessionData);
157
+ }
158
+ catch (error) {
159
+ console.error('Failed to save implicit session:', error);
160
+ throw error;
161
+ }
162
+ }
163
+ async getImplicitSession() {
164
+ try {
165
+ return (await this.getIDBItem(IMPLICIT_SESSIONS_IDB_KEY)) ?? null;
166
+ }
167
+ catch (error) {
168
+ console.error('Failed to retrieve implicit session:', error);
169
+ return null;
170
+ }
171
+ }
172
+ async clearImplicitSession() {
173
+ try {
174
+ await this.deleteIDBItem(IMPLICIT_SESSIONS_IDB_KEY);
175
+ }
176
+ catch (error) {
177
+ console.error('Failed to clear implicit session:', error);
178
+ throw error;
179
+ }
180
+ }
181
+ async clearAllData() {
182
+ try {
183
+ // Clear all session storage items
184
+ sessionStorage.removeItem(PENDING_REDIRECT_REQUEST_KEY);
185
+ sessionStorage.removeItem(TEMP_SESSION_PK_KEY);
186
+ sessionStorage.removeItem(PENDING_REQUEST_CONTEXT_KEY);
187
+ // Clear all IndexedDB items
188
+ await this.clearExplicitSessions();
189
+ await this.clearImplicitSession();
190
+ }
191
+ catch (error) {
192
+ console.error('Failed to clear all data:', error);
193
+ throw error;
194
+ }
195
+ }
196
+ }
@@ -0,0 +1,4 @@
1
+ import { config } from "@repo/eslint-config/react-internal";
2
+
3
+ /** @type {import("eslint").Linter.Config} */
4
+ export default config;
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@0xsequence/dapp-client",
3
+ "version": "0.0.0-20250910142613",
4
+ "license": "Apache-2.0",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "private": false,
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ }
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^22.15.29",
18
+ "@vitest/coverage-v8": "^3.2.4",
19
+ "dotenv": "^16.5.0",
20
+ "fake-indexeddb": "^6.0.1",
21
+ "happy-dom": "^17.2.2",
22
+ "typescript": "^5.8.3",
23
+ "vitest": "^3.2.1",
24
+ "@repo/typescript-config": "^0.0.0-20250910142613"
25
+ },
26
+ "dependencies": {
27
+ "ox": "^0.7.2",
28
+ "@0xsequence/wallet-primitives": "^0.0.0-20250910142613",
29
+ "@0xsequence/guard": "^0.0.0-20250910142613",
30
+ "@0xsequence/wallet-core": "^0.0.0-20250910142613"
31
+ },
32
+ "scripts": {
33
+ "build": "tsc",
34
+ "dev": "tsc --watch",
35
+ "typecheck": "tsc --noEmit",
36
+ "clean": "rimraf dist"
37
+ }
38
+ }