signer-test-sdk-core 0.0.1

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 (63) hide show
  1. package/README.md +81 -0
  2. package/dist/src/components/OnboardingUI/auth.d.ts +158 -0
  3. package/dist/src/components/OnboardingUI/auth.js +230 -0
  4. package/dist/src/components/OnboardingUI/auth.js.map +1 -0
  5. package/dist/src/components/OnboardingUI/index.d.ts +9 -0
  6. package/dist/src/components/OnboardingUI/index.js +9 -0
  7. package/dist/src/components/OnboardingUI/index.js.map +1 -0
  8. package/dist/src/components/OnboardingUI/types.d.ts +159 -0
  9. package/dist/src/components/OnboardingUI/types.js +5 -0
  10. package/dist/src/components/OnboardingUI/types.js.map +1 -0
  11. package/dist/src/core/AbstraxnWallet.d.ts +162 -0
  12. package/dist/src/core/AbstraxnWallet.js +593 -0
  13. package/dist/src/core/AbstraxnWallet.js.map +1 -0
  14. package/dist/src/core/AuthManager.d.ts +112 -0
  15. package/dist/src/core/AuthManager.js +685 -0
  16. package/dist/src/core/AuthManager.js.map +1 -0
  17. package/dist/src/core/Signer.d.ts +35 -0
  18. package/dist/src/core/Signer.js +156 -0
  19. package/dist/src/core/Signer.js.map +1 -0
  20. package/dist/src/index.d.ts +17 -0
  21. package/dist/src/index.js +19 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/interfaces/IAuth.d.ts +26 -0
  24. package/dist/src/interfaces/IAuth.js +2 -0
  25. package/dist/src/interfaces/IAuth.js.map +1 -0
  26. package/dist/src/interfaces/ISigner.d.ts +14 -0
  27. package/dist/src/interfaces/ISigner.js +2 -0
  28. package/dist/src/interfaces/ISigner.js.map +1 -0
  29. package/dist/src/interfaces/IStorage.d.ts +15 -0
  30. package/dist/src/interfaces/IStorage.js +2 -0
  31. package/dist/src/interfaces/IStorage.js.map +1 -0
  32. package/dist/src/interfaces/IWallet.d.ts +45 -0
  33. package/dist/src/interfaces/IWallet.js +2 -0
  34. package/dist/src/interfaces/IWallet.js.map +1 -0
  35. package/dist/src/services/ApiService.d.ts +131 -0
  36. package/dist/src/services/ApiService.js +626 -0
  37. package/dist/src/services/ApiService.js.map +1 -0
  38. package/dist/src/services/TokenService.d.ts +29 -0
  39. package/dist/src/services/TokenService.js +40 -0
  40. package/dist/src/services/TokenService.js.map +1 -0
  41. package/dist/src/services/TurnkeyService.d.ts +54 -0
  42. package/dist/src/services/TurnkeyService.js +91 -0
  43. package/dist/src/services/TurnkeyService.js.map +1 -0
  44. package/dist/src/storage/IndexedDBStorage.d.ts +39 -0
  45. package/dist/src/storage/IndexedDBStorage.js +280 -0
  46. package/dist/src/storage/IndexedDBStorage.js.map +1 -0
  47. package/dist/src/utils/constants.d.ts +52 -0
  48. package/dist/src/utils/constants.js +78 -0
  49. package/dist/src/utils/constants.js.map +1 -0
  50. package/dist/src/utils/errors.d.ts +23 -0
  51. package/dist/src/utils/errors.js +48 -0
  52. package/dist/src/utils/errors.js.map +1 -0
  53. package/dist/src/utils/helpers.d.ts +12 -0
  54. package/dist/src/utils/helpers.js +30 -0
  55. package/dist/src/utils/helpers.js.map +1 -0
  56. package/dist/src/utils/passkey.d.ts +33 -0
  57. package/dist/src/utils/passkey.js +122 -0
  58. package/dist/src/utils/passkey.js.map +1 -0
  59. package/dist/src/utils/types.d.ts +182 -0
  60. package/dist/src/utils/types.js +5 -0
  61. package/dist/src/utils/types.js.map +1 -0
  62. package/dist/tsconfig.tsbuildinfo +1 -0
  63. package/package.json +49 -0
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Token Service - Manages JWT tokens
3
+ */
4
+ import { AuthTokens } from '../utils/types';
5
+ import { IStorage } from '../interfaces/IStorage';
6
+ export declare class TokenService {
7
+ private storage;
8
+ constructor(storage: IStorage);
9
+ /**
10
+ * Get access token
11
+ */
12
+ getAccessToken(): Promise<string | null>;
13
+ /**
14
+ * Get refresh token
15
+ */
16
+ getRefreshToken(): Promise<string | null>;
17
+ /**
18
+ * Set tokens
19
+ */
20
+ setTokens(tokens: AuthTokens): Promise<void>;
21
+ /**
22
+ * Clear tokens
23
+ */
24
+ clearTokens(): Promise<void>;
25
+ /**
26
+ * Check if tokens exist
27
+ */
28
+ hasTokens(): Promise<boolean>;
29
+ }
@@ -0,0 +1,40 @@
1
+ import { STORAGE_KEYS } from '../utils/constants';
2
+ export class TokenService {
3
+ constructor(storage) {
4
+ this.storage = storage;
5
+ }
6
+ /**
7
+ * Get access token
8
+ */
9
+ async getAccessToken() {
10
+ return await this.storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);
11
+ }
12
+ /**
13
+ * Get refresh token
14
+ */
15
+ async getRefreshToken() {
16
+ return await this.storage.getItem(STORAGE_KEYS.REFRESH_TOKEN);
17
+ }
18
+ /**
19
+ * Set tokens
20
+ */
21
+ async setTokens(tokens) {
22
+ await this.storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, tokens.accessToken);
23
+ await this.storage.setItem(STORAGE_KEYS.REFRESH_TOKEN, tokens.refreshToken);
24
+ }
25
+ /**
26
+ * Clear tokens
27
+ */
28
+ async clearTokens() {
29
+ await this.storage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);
30
+ await this.storage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);
31
+ }
32
+ /**
33
+ * Check if tokens exist
34
+ */
35
+ async hasTokens() {
36
+ const accessToken = await this.getAccessToken();
37
+ return accessToken !== null;
38
+ }
39
+ }
40
+ //# sourceMappingURL=TokenService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenService.js","sourceRoot":"","sources":["../../../src/services/TokenService.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,OAAO,YAAY;IACvB,YAAoB,OAAiB;QAAjB,YAAO,GAAP,OAAO,CAAU;IAAG,CAAC;IAEzC;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAS,YAAY,CAAC,YAAY,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAS,YAAY,CAAC,aAAa,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,MAAkB;QAChC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1E,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,OAAO,WAAW,KAAK,IAAI,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Internal Service - Handles key management and signing
3
+ * ⚠️ This is INTERNAL - users never interact with this directly
4
+ * All infrastructure details are abstracted away
5
+ */
6
+ import { TurnkeyClient } from '@turnkey/http';
7
+ import type { TGetWhoamiResponse } from '@turnkey/http/dist/__generated__/services/coordinator/public/v1/public_api.fetcher';
8
+ import { IndexedDBStorage } from '../storage/IndexedDBStorage';
9
+ export declare class TurnkeyService {
10
+ private client;
11
+ private storage;
12
+ constructor();
13
+ /**
14
+ * Reset the service state
15
+ * Clears IndexedDB and resets client
16
+ * Internal use only
17
+ */
18
+ reset(): Promise<void>;
19
+ /**
20
+ * Initialize client with IndexedDB storage
21
+ * This is called internally - users don't need to know about it
22
+ */
23
+ init(): Promise<void>;
24
+ /**
25
+ * Get client
26
+ * Internal use only
27
+ */
28
+ getClient(): TurnkeyClient;
29
+ /**
30
+ * Get public key from storage
31
+ * Used internally for authentication
32
+ * @param forceRefresh - If true, forces re-initialization to get fresh public key from IndexedDB
33
+ */
34
+ getPublicKey(forceRefresh?: boolean): Promise<string | null>;
35
+ /**
36
+ * Create stamp for request
37
+ * Used internally for signing requests
38
+ */
39
+ createStamp(body: string): Promise<{
40
+ stampHeaderName: string;
41
+ stampHeaderValue: string;
42
+ }>;
43
+ /**
44
+ * Get storage instance
45
+ * Internal use only
46
+ */
47
+ getStorage(): IndexedDBStorage;
48
+ /**
49
+ * Get whoami information directly from Turnkey (without PROXY)
50
+ * This is used when isPolicy is true
51
+ * Returns the actual Turnkey response which has limited fields
52
+ */
53
+ getWhoami(organizationId: string): Promise<TGetWhoamiResponse>;
54
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Internal Service - Handles key management and signing
3
+ * ⚠️ This is INTERNAL - users never interact with this directly
4
+ * All infrastructure details are abstracted away
5
+ */
6
+ import { TurnkeyClient } from '@turnkey/http';
7
+ import { IndexedDBStorage } from '../storage/IndexedDBStorage';
8
+ import { TURNKEY_CONFIG } from '../utils/constants';
9
+ export class TurnkeyService {
10
+ constructor() {
11
+ this.client = null;
12
+ this.storage = new IndexedDBStorage();
13
+ }
14
+ /**
15
+ * Reset the service state
16
+ * Clears IndexedDB and resets client
17
+ * Internal use only
18
+ */
19
+ async reset() {
20
+ // Reset client first to close any open connections
21
+ this.client = null;
22
+ // Clear IndexedDB through storage (this includes a delay)
23
+ await this.storage.clearIndexedDB();
24
+ // Additional delay to ensure IndexedDB is fully cleared
25
+ await new Promise(resolve => setTimeout(resolve, 300));
26
+ }
27
+ /**
28
+ * Initialize client with IndexedDB storage
29
+ * This is called internally - users don't need to know about it
30
+ */
31
+ async init() {
32
+ await this.storage.init();
33
+ const stamper = this.storage;
34
+ this.client = new TurnkeyClient({
35
+ baseUrl: TURNKEY_CONFIG.BASE_URL,
36
+ }, stamper);
37
+ }
38
+ /**
39
+ * Get client
40
+ * Internal use only
41
+ */
42
+ getClient() {
43
+ if (!this.client) {
44
+ throw new Error('Client not initialized. Call init() first.');
45
+ }
46
+ return this.client;
47
+ }
48
+ /**
49
+ * Get public key from storage
50
+ * Used internally for authentication
51
+ * @param forceRefresh - If true, forces re-initialization to get fresh public key from IndexedDB
52
+ */
53
+ async getPublicKey(forceRefresh = false) {
54
+ return await this.storage.getPublicKey(forceRefresh);
55
+ }
56
+ /**
57
+ * Create stamp for request
58
+ * Used internally for signing requests
59
+ */
60
+ async createStamp(body) {
61
+ // Ensure storage is initialized
62
+ // The stamp() method will handle retries if needed
63
+ if (!this.client) {
64
+ await this.init();
65
+ }
66
+ return await this.storage.stamp(body);
67
+ }
68
+ /**
69
+ * Get storage instance
70
+ * Internal use only
71
+ */
72
+ getStorage() {
73
+ return this.storage;
74
+ }
75
+ /**
76
+ * Get whoami information directly from Turnkey (without PROXY)
77
+ * This is used when isPolicy is true
78
+ * Returns the actual Turnkey response which has limited fields
79
+ */
80
+ async getWhoami(organizationId) {
81
+ if (!this.client) {
82
+ await this.init();
83
+ }
84
+ const client = this.getClient();
85
+ const response = await client.getWhoami({
86
+ organizationId,
87
+ });
88
+ return response;
89
+ }
90
+ }
91
+ //# sourceMappingURL=TurnkeyService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnkeyService.js","sourceRoot":"","sources":["../../../src/services/TurnkeyService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,MAAM,OAAO,cAAc;IAIzB;QAHQ,WAAM,GAAyB,IAAI,CAAC;QAI1C,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,mDAAmD;QACnD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,0DAA0D;QAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACpC,wDAAwD;QACxD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiH,CAAC;QAEvI,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAC7B;YACE,OAAO,EAAE,cAAc,CAAC,QAAQ;SACjC,EACD,OAAc,CACf,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,eAAwB,KAAK;QAC9C,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,gCAAgC;QAChC,mDAAmD;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,cAAsB;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACtC,cAAc;SACf,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ import { IStorage } from '../interfaces/IStorage';
2
+ export declare class IndexedDBStorage implements IStorage {
3
+ private stamper;
4
+ private initialized;
5
+ /**
6
+ * Check if IndexedDB is available in the browser
7
+ */
8
+ private isIndexedDBAvailable;
9
+ /**
10
+ * Initialize the IndexedDB stamper
11
+ * This uses Turnkey's IndexedDbStamper internally
12
+ * @param forceReinit - If true, forces re-initialization even if already initialized
13
+ */
14
+ init(forceReinit?: boolean): Promise<void>;
15
+ /**
16
+ * Get public key from stamper
17
+ * This is used internally for authentication
18
+ * @param forceRefresh - If true, forces re-initialization to get fresh public key from IndexedDB
19
+ */
20
+ getPublicKey(forceRefresh?: boolean): Promise<string | null>;
21
+ /**
22
+ * Create stamp for request body
23
+ * This is used internally for signing requests
24
+ */
25
+ stamp(body: string): Promise<{
26
+ stampHeaderName: string;
27
+ stampHeaderValue: string;
28
+ }>;
29
+ getItem<T>(key: string): Promise<T | null>;
30
+ setItem<T>(key: string, value: T): Promise<void>;
31
+ removeItem(key: string): Promise<void>;
32
+ clear(): Promise<void>;
33
+ /**
34
+ * Clear IndexedDB database used by Turnkey
35
+ * This deletes the IndexedDB database that stores Turnkey keys
36
+ */
37
+ clearIndexedDB(): Promise<void>;
38
+ keys(): Promise<string[]>;
39
+ }
@@ -0,0 +1,280 @@
1
+ /**
2
+ * IndexedDB Storage implementation
3
+ * This is the internal storage mechanism - users don't interact with it directly
4
+ * Uses secure browser storage for key management
5
+ */
6
+ import { IndexedDbStamper } from '@turnkey/indexed-db-stamper';
7
+ import { StorageError } from '../utils/errors';
8
+ export class IndexedDBStorage {
9
+ constructor() {
10
+ this.stamper = null;
11
+ this.initialized = false;
12
+ }
13
+ /**
14
+ * Check if IndexedDB is available in the browser
15
+ */
16
+ isIndexedDBAvailable() {
17
+ try {
18
+ // Check if IndexedDB is available
19
+ if (typeof window === 'undefined' || !window.indexedDB) {
20
+ return false;
21
+ }
22
+ // Try to open a test database to verify it's actually functional
23
+ // We'll do this asynchronously in init() to avoid blocking
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ /**
31
+ * Initialize the IndexedDB stamper
32
+ * This uses Turnkey's IndexedDbStamper internally
33
+ * @param forceReinit - If true, forces re-initialization even if already initialized
34
+ */
35
+ async init(forceReinit = false) {
36
+ if (this.initialized && !forceReinit) {
37
+ return;
38
+ }
39
+ // If forcing reinit, reset the stamper first
40
+ if (forceReinit) {
41
+ this.stamper = null;
42
+ this.initialized = false;
43
+ }
44
+ // Check if IndexedDB is available
45
+ if (!this.isIndexedDBAvailable()) {
46
+ throw new StorageError('IndexedDB is not available in this browser. ' +
47
+ 'Please ensure you are not in private/incognito mode and that IndexedDB is enabled in your browser settings.');
48
+ }
49
+ try {
50
+ // IndexedDbStamper constructor takes no arguments
51
+ this.stamper = new IndexedDbStamper();
52
+ await this.stamper.init();
53
+ this.initialized = true;
54
+ }
55
+ catch (error) {
56
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
57
+ // Provide more helpful error messages based on common issues
58
+ let userFriendlyMessage = 'Failed to initialize IndexedDB storage';
59
+ if (errorMessage.includes('backing store') || errorMessage.includes('Internal error')) {
60
+ userFriendlyMessage =
61
+ 'IndexedDB initialization failed. This may occur if:\n' +
62
+ '• You are in private/incognito browsing mode\n' +
63
+ '• IndexedDB is disabled in your browser settings\n' +
64
+ '• You are in an iframe with restrictive permissions\n' +
65
+ '• Your browser storage quota has been exceeded\n\n' +
66
+ `Technical error: ${errorMessage}`;
67
+ }
68
+ else if (errorMessage.includes('quota') || errorMessage.includes('QuotaExceeded')) {
69
+ userFriendlyMessage =
70
+ 'Browser storage quota exceeded. Please clear some storage space and try again.';
71
+ }
72
+ else {
73
+ userFriendlyMessage = `Failed to initialize IndexedDB storage: ${errorMessage}`;
74
+ }
75
+ throw new StorageError(userFriendlyMessage);
76
+ }
77
+ }
78
+ /**
79
+ * Get public key from stamper
80
+ * This is used internally for authentication
81
+ * @param forceRefresh - If true, forces re-initialization to get fresh public key from IndexedDB
82
+ */
83
+ async getPublicKey(forceRefresh = false) {
84
+ // If force refresh is requested, re-initialize to get fresh public key
85
+ if (forceRefresh) {
86
+ await this.init(true);
87
+ }
88
+ else if (!this.stamper) {
89
+ await this.init();
90
+ }
91
+ if (!this.stamper) {
92
+ return null;
93
+ }
94
+ try {
95
+ return this.stamper.getPublicKey() || null;
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Create stamp for request body
103
+ * This is used internally for signing requests
104
+ */
105
+ async stamp(body) {
106
+ if (!this.stamper || !this.initialized) {
107
+ await this.init();
108
+ }
109
+ if (!this.stamper) {
110
+ throw new Error('Stamper not initialized');
111
+ }
112
+ // Retry logic: if stamper throws "Key not initialized", retry initialization
113
+ const stamper = this.stamper;
114
+ try {
115
+ return await stamper.stamp(body);
116
+ }
117
+ catch (error) {
118
+ const errorMessage = error instanceof Error ? error.message : String(error);
119
+ // If we get "Key not initialized" error, the stamper might not be fully ready
120
+ // Retry initialization and stamping
121
+ if (errorMessage.includes('Key not initialized') || errorMessage.includes('init()')) {
122
+ // Reset and reinitialize
123
+ this.stamper = null;
124
+ this.initialized = false;
125
+ await this.init();
126
+ // Get the newly initialized stamper
127
+ if (!this.stamper) {
128
+ throw new Error('Stamper not initialized after retry');
129
+ }
130
+ // Retry stamping with the reinitialized stamper
131
+ const retryStamper = this.stamper;
132
+ return await retryStamper.stamp(body);
133
+ }
134
+ // Re-throw other errors
135
+ throw error;
136
+ }
137
+ }
138
+ async getItem(key) {
139
+ try {
140
+ const value = localStorage.getItem(key);
141
+ return value ? JSON.parse(value) : null;
142
+ }
143
+ catch {
144
+ return null;
145
+ }
146
+ }
147
+ async setItem(key, value) {
148
+ try {
149
+ localStorage.setItem(key, JSON.stringify(value));
150
+ }
151
+ catch (error) {
152
+ throw new Error(`Failed to set item: ${error instanceof Error ? error.message : 'Unknown error'}`);
153
+ }
154
+ }
155
+ async removeItem(key) {
156
+ try {
157
+ localStorage.removeItem(key);
158
+ }
159
+ catch (error) {
160
+ throw new Error(`Failed to remove item: ${error instanceof Error ? error.message : 'Unknown error'}`);
161
+ }
162
+ }
163
+ async clear() {
164
+ try {
165
+ localStorage.clear();
166
+ // Reset stamper state
167
+ if (this.stamper) {
168
+ this.stamper = null;
169
+ this.initialized = false;
170
+ }
171
+ }
172
+ catch (error) {
173
+ throw new Error(`Failed to clear storage: ${error instanceof Error ? error.message : 'Unknown error'}`);
174
+ }
175
+ }
176
+ /**
177
+ * Clear IndexedDB database used by Turnkey
178
+ * This deletes the IndexedDB database that stores Turnkey keys
179
+ */
180
+ async clearIndexedDB() {
181
+ try {
182
+ if (typeof window === 'undefined' || !window.indexedDB) {
183
+ return;
184
+ }
185
+ // Reset stamper state first to close any open connections
186
+ this.stamper = null;
187
+ this.initialized = false;
188
+ // Try to delete common IndexedDB database names used by Turnkey
189
+ // IndexedDbStamper may use different database names, so we try multiple
190
+ const dbNames = [
191
+ 'turnkey-stamper',
192
+ '@turnkey/indexed-db-stamper',
193
+ 'turnkey',
194
+ 'abstraxn-turnkey-stamper',
195
+ 'turnkey-indexed-db-stamper',
196
+ // Also try to get all database names and delete any that look like Turnkey databases
197
+ ];
198
+ // Try to get all database names (if supported by browser)
199
+ try {
200
+ if ('databases' in indexedDB && indexedDB.databases) {
201
+ const allDatabases = await indexedDB.databases();
202
+ allDatabases.forEach((db) => {
203
+ if (db.name && (db.name.toLowerCase().includes('turnkey') ||
204
+ db.name.toLowerCase().includes('stamper'))) {
205
+ if (!dbNames.includes(db.name)) {
206
+ dbNames.push(db.name);
207
+ }
208
+ }
209
+ });
210
+ }
211
+ }
212
+ catch {
213
+ // browsers that don't support databases() API
214
+ }
215
+ // Delete all possible database names
216
+ // We need to wait for deletion to complete, even if blocked
217
+ const deletePromises = dbNames.map((dbName) => {
218
+ return new Promise((resolve) => {
219
+ try {
220
+ const deleteRequest = indexedDB.deleteDatabase(dbName);
221
+ deleteRequest.onsuccess = () => {
222
+ resolve();
223
+ };
224
+ deleteRequest.onerror = () => {
225
+ // Database might not exist, that's okay
226
+ resolve();
227
+ };
228
+ deleteRequest.onblocked = () => {
229
+ // Database is in use - wait a bit and try to close connections
230
+ // The database will be deleted once all connections are closed
231
+ setTimeout(() => {
232
+ // Try to trigger connection close by attempting to open the database
233
+ try {
234
+ const openRequest = indexedDB.open(dbName);
235
+ openRequest.onsuccess = () => {
236
+ const db = openRequest.result;
237
+ db.close();
238
+ // Wait a bit more for deletion to complete
239
+ setTimeout(resolve, 200);
240
+ };
241
+ openRequest.onerror = () => {
242
+ // If we can't open it, it might already be deleted
243
+ setTimeout(resolve, 200);
244
+ };
245
+ }
246
+ catch {
247
+ setTimeout(resolve, 200);
248
+ }
249
+ }, 100);
250
+ };
251
+ }
252
+ catch {
253
+ // Ignore errors for non-existent databases
254
+ resolve();
255
+ }
256
+ });
257
+ });
258
+ // Wait for all deletion attempts to complete
259
+ await Promise.all(deletePromises);
260
+ // Add additional delay to ensure IndexedDB deletion is fully processed
261
+ await new Promise(resolve => setTimeout(resolve, 200));
262
+ }
263
+ catch (error) {
264
+ // Reset stamper state even if deletion fails
265
+ this.stamper = null;
266
+ this.initialized = false;
267
+ // Don't throw error, just log it
268
+ console.warn('Failed to clear IndexedDB:', error);
269
+ }
270
+ }
271
+ async keys() {
272
+ try {
273
+ return Object.keys(localStorage);
274
+ }
275
+ catch {
276
+ return [];
277
+ }
278
+ }
279
+ }
280
+ //# sourceMappingURL=IndexedDBStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexedDBStorage.js","sourceRoot":"","sources":["../../../src/storage/IndexedDBStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Constants for Abstraxn Wallet SDK
3
+ */
4
+ export declare const DEFAULT_CHAIN_ID = 1;
5
+ export declare const SUPPORTED_CHAINS: {
6
+ id: number;
7
+ name: string;
8
+ rpcUrl: string;
9
+ nativeCurrency: {
10
+ name: string;
11
+ symbol: string;
12
+ decimals: number;
13
+ };
14
+ }[];
15
+ export declare const STORAGE_KEYS: {
16
+ readonly ACCESS_TOKEN: "abstraxn_access_token";
17
+ readonly REFRESH_TOKEN: "abstraxn_refresh_token";
18
+ readonly USER: "abstraxn_user";
19
+ readonly WALLET_CONFIG: "abstraxn_wallet_config";
20
+ readonly VERIFY_RESPONSE: "abstraxn_verify_response";
21
+ readonly WHOAMI: "abstraxn_whoami";
22
+ };
23
+ export declare const API_BASE_URL: string;
24
+ export declare const API_ENDPOINTS: {
25
+ readonly INIT_OTP: "/login/otp/init";
26
+ readonly VERIFY_OTP: "/login/otp/verify";
27
+ readonly GOOGLE_AUTH: "/login/google";
28
+ readonly GOOGLE_CALLBACK: "/login/google/callback";
29
+ readonly DISCORD_AUTH: "/login/discord";
30
+ readonly DISCORD_CALLBACK: "/login/discord/callback";
31
+ readonly X_AUTH: "/login/x";
32
+ readonly X_CALLBACK: "/login/x/callback";
33
+ readonly PASSKEY_SIGNUP: "/login/passkey/signup";
34
+ readonly PASSKEY_LOGIN: "/login/passkey/login";
35
+ readonly REFRESH_TOKEN: "/auth/refresh";
36
+ readonly SIGN_TRANSACTION: "/sign/transaction";
37
+ readonly PROXY: "/proxy/";
38
+ readonly WHOAMI: "/whoami";
39
+ readonly EXPORT_WALLET: "/export-wallet";
40
+ };
41
+ export declare const TURNKEY_CONFIG: {
42
+ readonly BASE_URL: "https://api.turnkey.com";
43
+ readonly STAMPER_DB_NAME: "abstraxn-turnkey-stamper";
44
+ };
45
+ export declare const TURNKEY_ENDPOINTS: {
46
+ readonly CREATE_POLICY: "/public/v1/submit/create_policy";
47
+ readonly SIGN_TRANSACTION: "/public/v1/submit/sign_transaction";
48
+ readonly SIGN_MESSAGE: "/public/v1/submit/sign_message";
49
+ readonly SIGN_TYPED_DATA: "/public/v1/submit/sign_typed_data";
50
+ readonly GET_WHOAMI: "/public/v1/query/whoami";
51
+ readonly STAMP_EXPORT_WALLET_ACCOUNT: "/public/v1/submit/export_wallet_account";
52
+ };