@reverbia/sdk 1.0.0 → 1.1.0-next.20251230221037

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 (110) hide show
  1. package/README.md +290 -45
  2. package/dist/expo/index.cjs +3428 -0
  3. package/dist/expo/index.d.mts +1217 -0
  4. package/dist/expo/index.d.ts +1217 -0
  5. package/dist/expo/index.mjs +3395 -0
  6. package/dist/index.cjs +972 -0
  7. package/dist/index.d.mts +1514 -0
  8. package/dist/index.d.ts +1514 -0
  9. package/dist/index.mjs +934 -0
  10. package/dist/next/index.cjs +64 -0
  11. package/dist/next/index.d.mts +23 -0
  12. package/dist/next/index.d.ts +23 -0
  13. package/dist/next/index.mjs +39 -0
  14. package/dist/polyfills/index.cjs +61 -0
  15. package/dist/polyfills/index.d.mts +9 -0
  16. package/dist/polyfills/index.d.ts +9 -0
  17. package/dist/polyfills/index.mjs +34 -0
  18. package/dist/react/chunk-KUFGQF6E.mjs +290 -0
  19. package/dist/react/chunk-T56Y62G7.mjs +410 -0
  20. package/dist/react/index.cjs +7982 -0
  21. package/dist/react/index.d.mts +3139 -0
  22. package/dist/react/index.d.ts +3139 -0
  23. package/dist/react/index.mjs +7209 -0
  24. package/dist/react/storage-Z2NBANCK.mjs +29 -0
  25. package/dist/react/useEncryption-5RTXKDNZ.mjs +31 -0
  26. package/dist/vercel/index.cjs +86 -0
  27. package/dist/vercel/index.d.mts +119 -0
  28. package/dist/vercel/index.d.ts +119 -0
  29. package/dist/vercel/index.mjs +57 -0
  30. package/package.json +91 -16
  31. package/dist/cjs/client/client/client.gen.d.ts +0 -2
  32. package/dist/cjs/client/client/client.gen.js +0 -203
  33. package/dist/cjs/client/client/index.d.ts +0 -8
  34. package/dist/cjs/client/client/index.js +0 -16
  35. package/dist/cjs/client/client/types.gen.d.ts +0 -99
  36. package/dist/cjs/client/client/types.gen.js +0 -3
  37. package/dist/cjs/client/client/utils.gen.d.ts +0 -40
  38. package/dist/cjs/client/client/utils.gen.js +0 -314
  39. package/dist/cjs/client/client.gen.d.ts +0 -12
  40. package/dist/cjs/client/client.gen.js +0 -6
  41. package/dist/cjs/client/core/auth.gen.d.ts +0 -18
  42. package/dist/cjs/client/core/auth.gen.js +0 -18
  43. package/dist/cjs/client/core/bodySerializer.gen.d.ts +0 -25
  44. package/dist/cjs/client/core/bodySerializer.gen.js +0 -60
  45. package/dist/cjs/client/core/params.gen.d.ts +0 -43
  46. package/dist/cjs/client/core/params.gen.js +0 -104
  47. package/dist/cjs/client/core/pathSerializer.gen.d.ts +0 -33
  48. package/dist/cjs/client/core/pathSerializer.gen.js +0 -123
  49. package/dist/cjs/client/core/queryKeySerializer.gen.d.ts +0 -18
  50. package/dist/cjs/client/core/queryKeySerializer.gen.js +0 -105
  51. package/dist/cjs/client/core/serverSentEvents.gen.d.ts +0 -71
  52. package/dist/cjs/client/core/serverSentEvents.gen.js +0 -139
  53. package/dist/cjs/client/core/types.gen.d.ts +0 -78
  54. package/dist/cjs/client/core/types.gen.js +0 -3
  55. package/dist/cjs/client/core/utils.gen.d.ts +0 -19
  56. package/dist/cjs/client/core/utils.gen.js +0 -93
  57. package/dist/cjs/client/index.d.ts +0 -2
  58. package/dist/cjs/client/index.js +0 -18
  59. package/dist/cjs/client/sdk.gen.d.ts +0 -27
  60. package/dist/cjs/client/sdk.gen.js +0 -33
  61. package/dist/cjs/client/types.gen.d.ts +0 -120
  62. package/dist/cjs/client/types.gen.js +0 -3
  63. package/dist/esm/client/client/client.gen.d.ts +0 -2
  64. package/dist/esm/client/client/client.gen.js +0 -199
  65. package/dist/esm/client/client/index.d.ts +0 -8
  66. package/dist/esm/client/client/index.js +0 -6
  67. package/dist/esm/client/client/types.gen.d.ts +0 -99
  68. package/dist/esm/client/client/types.gen.js +0 -2
  69. package/dist/esm/client/client/utils.gen.d.ts +0 -40
  70. package/dist/esm/client/client/utils.gen.js +0 -302
  71. package/dist/esm/client/client.gen.d.ts +0 -12
  72. package/dist/esm/client/client.gen.js +0 -3
  73. package/dist/esm/client/core/auth.gen.d.ts +0 -18
  74. package/dist/esm/client/core/auth.gen.js +0 -14
  75. package/dist/esm/client/core/bodySerializer.gen.d.ts +0 -25
  76. package/dist/esm/client/core/bodySerializer.gen.js +0 -57
  77. package/dist/esm/client/core/params.gen.d.ts +0 -43
  78. package/dist/esm/client/core/params.gen.js +0 -100
  79. package/dist/esm/client/core/pathSerializer.gen.d.ts +0 -33
  80. package/dist/esm/client/core/pathSerializer.gen.js +0 -114
  81. package/dist/esm/client/core/queryKeySerializer.gen.d.ts +0 -18
  82. package/dist/esm/client/core/queryKeySerializer.gen.js +0 -99
  83. package/dist/esm/client/core/serverSentEvents.gen.d.ts +0 -71
  84. package/dist/esm/client/core/serverSentEvents.gen.js +0 -135
  85. package/dist/esm/client/core/types.gen.d.ts +0 -78
  86. package/dist/esm/client/core/types.gen.js +0 -2
  87. package/dist/esm/client/core/utils.gen.d.ts +0 -19
  88. package/dist/esm/client/core/utils.gen.js +0 -87
  89. package/dist/esm/client/index.d.ts +0 -2
  90. package/dist/esm/client/index.js +0 -2
  91. package/dist/esm/client/sdk.gen.d.ts +0 -27
  92. package/dist/esm/client/sdk.gen.js +0 -28
  93. package/dist/esm/client/types.gen.d.ts +0 -120
  94. package/dist/esm/client/types.gen.js +0 -2
  95. package/dist/types/client/client/client.gen.d.ts +0 -2
  96. package/dist/types/client/client/index.d.ts +0 -8
  97. package/dist/types/client/client/types.gen.d.ts +0 -99
  98. package/dist/types/client/client/utils.gen.d.ts +0 -40
  99. package/dist/types/client/client.gen.d.ts +0 -12
  100. package/dist/types/client/core/auth.gen.d.ts +0 -18
  101. package/dist/types/client/core/bodySerializer.gen.d.ts +0 -25
  102. package/dist/types/client/core/params.gen.d.ts +0 -43
  103. package/dist/types/client/core/pathSerializer.gen.d.ts +0 -33
  104. package/dist/types/client/core/queryKeySerializer.gen.d.ts +0 -18
  105. package/dist/types/client/core/serverSentEvents.gen.d.ts +0 -71
  106. package/dist/types/client/core/types.gen.d.ts +0 -78
  107. package/dist/types/client/core/utils.gen.d.ts +0 -19
  108. package/dist/types/client/index.d.ts +0 -2
  109. package/dist/types/client/sdk.gen.d.ts +0 -27
  110. package/dist/types/client/types.gen.d.ts +0 -120
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/next/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ withReverbia: () => withReverbia
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+ var withReverbia = (nextConfig = {}) => {
27
+ return {
28
+ ...nextConfig,
29
+ serverExternalPackages: [
30
+ ...nextConfig.serverExternalPackages || [],
31
+ "sharp"
32
+ ],
33
+ webpack: (config, options) => {
34
+ const { isServer } = options;
35
+ if (!isServer) {
36
+ config.resolve.alias = {
37
+ ...config.resolve.alias,
38
+ sharp: false
39
+ };
40
+ }
41
+ config.module.rules.push({
42
+ test: /\.node$/,
43
+ type: "asset/resource"
44
+ });
45
+ config.resolve.fallback = {
46
+ ...config.resolve.fallback,
47
+ fs: false,
48
+ net: false,
49
+ tls: false,
50
+ child_process: false,
51
+ "node:fs": false,
52
+ "node:path": false
53
+ };
54
+ if (typeof nextConfig.webpack === "function") {
55
+ return nextConfig.webpack(config, options);
56
+ }
57
+ return config;
58
+ }
59
+ };
60
+ };
61
+ // Annotate the CommonJS export names for ESM import in node:
62
+ 0 && (module.exports = {
63
+ withReverbia
64
+ });
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Next.js configuration plugin for @reverbia/sdk
3
+ *
4
+ * Use this to automatically configure Webpack aliases and server exclusions
5
+ * needed for the SDK's dependencies.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // next.config.ts
10
+ * import { withReverbia } from "@reverbia/sdk/next";
11
+ *
12
+ * const nextConfig = {
13
+ * // your config...
14
+ * };
15
+ *
16
+ * export default withReverbia(nextConfig);
17
+ * ```
18
+ *
19
+ * @module
20
+ */
21
+ declare const withReverbia: (nextConfig?: any) => any;
22
+
23
+ export { withReverbia };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Next.js configuration plugin for @reverbia/sdk
3
+ *
4
+ * Use this to automatically configure Webpack aliases and server exclusions
5
+ * needed for the SDK's dependencies.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // next.config.ts
10
+ * import { withReverbia } from "@reverbia/sdk/next";
11
+ *
12
+ * const nextConfig = {
13
+ * // your config...
14
+ * };
15
+ *
16
+ * export default withReverbia(nextConfig);
17
+ * ```
18
+ *
19
+ * @module
20
+ */
21
+ declare const withReverbia: (nextConfig?: any) => any;
22
+
23
+ export { withReverbia };
@@ -0,0 +1,39 @@
1
+ // src/next/index.ts
2
+ var withReverbia = (nextConfig = {}) => {
3
+ return {
4
+ ...nextConfig,
5
+ serverExternalPackages: [
6
+ ...nextConfig.serverExternalPackages || [],
7
+ "sharp"
8
+ ],
9
+ webpack: (config, options) => {
10
+ const { isServer } = options;
11
+ if (!isServer) {
12
+ config.resolve.alias = {
13
+ ...config.resolve.alias,
14
+ sharp: false
15
+ };
16
+ }
17
+ config.module.rules.push({
18
+ test: /\.node$/,
19
+ type: "asset/resource"
20
+ });
21
+ config.resolve.fallback = {
22
+ ...config.resolve.fallback,
23
+ fs: false,
24
+ net: false,
25
+ tls: false,
26
+ child_process: false,
27
+ "node:fs": false,
28
+ "node:path": false
29
+ };
30
+ if (typeof nextConfig.webpack === "function") {
31
+ return nextConfig.webpack(config, options);
32
+ }
33
+ return config;
34
+ }
35
+ };
36
+ };
37
+ export {
38
+ withReverbia
39
+ };
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/lib/polyfills/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ needsTextDecoderStreamPolyfill: () => needsPolyfill
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+
27
+ // src/lib/polyfills/textDecoderStream.ts
28
+ var needsPolyfill = typeof globalThis.TextDecoderStream === "undefined";
29
+ if (needsPolyfill && typeof globalThis.TransformStream !== "undefined") {
30
+ class TextDecoderStreamPolyfill {
31
+ constructor(label = "utf-8", options) {
32
+ this.decoder = new TextDecoder(label, options);
33
+ const decoder = this.decoder;
34
+ this.transform = new TransformStream({
35
+ transform(chunk, controller) {
36
+ const text = decoder.decode(chunk, { stream: true });
37
+ if (text) {
38
+ controller.enqueue(text);
39
+ }
40
+ },
41
+ flush(controller) {
42
+ const text = decoder.decode();
43
+ if (text) {
44
+ controller.enqueue(text);
45
+ }
46
+ }
47
+ });
48
+ }
49
+ get readable() {
50
+ return this.transform.readable;
51
+ }
52
+ get writable() {
53
+ return this.transform.writable;
54
+ }
55
+ }
56
+ globalThis.TextDecoderStream = TextDecoderStreamPolyfill;
57
+ }
58
+ // Annotate the CommonJS export names for ESM import in node:
59
+ 0 && (module.exports = {
60
+ needsTextDecoderStreamPolyfill
61
+ });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * TextDecoderStream polyfill for React Native compatibility.
3
+ *
4
+ * React Native doesn't have TextDecoderStream, but it does have TextDecoder.
5
+ * This polyfill creates a TransformStream that uses TextDecoder internally.
6
+ */
7
+ declare const needsPolyfill: boolean;
8
+
9
+ export { needsPolyfill as needsTextDecoderStreamPolyfill };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * TextDecoderStream polyfill for React Native compatibility.
3
+ *
4
+ * React Native doesn't have TextDecoderStream, but it does have TextDecoder.
5
+ * This polyfill creates a TransformStream that uses TextDecoder internally.
6
+ */
7
+ declare const needsPolyfill: boolean;
8
+
9
+ export { needsPolyfill as needsTextDecoderStreamPolyfill };
@@ -0,0 +1,34 @@
1
+ // src/lib/polyfills/textDecoderStream.ts
2
+ var needsPolyfill = typeof globalThis.TextDecoderStream === "undefined";
3
+ if (needsPolyfill && typeof globalThis.TransformStream !== "undefined") {
4
+ class TextDecoderStreamPolyfill {
5
+ constructor(label = "utf-8", options) {
6
+ this.decoder = new TextDecoder(label, options);
7
+ const decoder = this.decoder;
8
+ this.transform = new TransformStream({
9
+ transform(chunk, controller) {
10
+ const text = decoder.decode(chunk, { stream: true });
11
+ if (text) {
12
+ controller.enqueue(text);
13
+ }
14
+ },
15
+ flush(controller) {
16
+ const text = decoder.decode();
17
+ if (text) {
18
+ controller.enqueue(text);
19
+ }
20
+ }
21
+ });
22
+ }
23
+ get readable() {
24
+ return this.transform.readable;
25
+ }
26
+ get writable() {
27
+ return this.transform.writable;
28
+ }
29
+ }
30
+ globalThis.TextDecoderStream = TextDecoderStreamPolyfill;
31
+ }
32
+ export {
33
+ needsPolyfill as needsTextDecoderStreamPolyfill
34
+ };
@@ -0,0 +1,290 @@
1
+ import {
2
+ decryptData,
3
+ encryptData,
4
+ hasEncryptionKey
5
+ } from "./chunk-T56Y62G7.mjs";
6
+
7
+ // src/lib/backup/oauth/storage.ts
8
+ var STORAGE_KEY_PREFIX = "oauth_token_";
9
+ var ENCRYPTION_PREFIX = "enc:";
10
+ var SESSION_KEY_STORAGE_KEY = "oauth_session_encryption_key";
11
+ function getStorageKey(provider) {
12
+ return `${STORAGE_KEY_PREFIX}${provider}`;
13
+ }
14
+ function isEncrypted(value) {
15
+ return value.startsWith(ENCRYPTION_PREFIX);
16
+ }
17
+ async function getOrCreateSessionKey() {
18
+ if (typeof window === "undefined") {
19
+ throw new Error("Session key generation requires browser environment");
20
+ }
21
+ let sessionKey = sessionStorage.getItem(SESSION_KEY_STORAGE_KEY);
22
+ if (sessionKey) {
23
+ return sessionKey;
24
+ }
25
+ const keyBytes = crypto.getRandomValues(new Uint8Array(32));
26
+ sessionKey = Array.from(keyBytes).map((b) => b.toString(16).padStart(2, "0")).join("");
27
+ sessionStorage.setItem(SESSION_KEY_STORAGE_KEY, sessionKey);
28
+ return sessionKey;
29
+ }
30
+ async function encryptWithSessionKey(plaintext) {
31
+ const sessionKeyHex = await getOrCreateSessionKey();
32
+ const keyBytes = hexToBytes(sessionKeyHex);
33
+ const key = await crypto.subtle.importKey(
34
+ "raw",
35
+ keyBytes.buffer,
36
+ { name: "AES-GCM" },
37
+ false,
38
+ ["encrypt", "decrypt"]
39
+ );
40
+ const iv = crypto.getRandomValues(new Uint8Array(12));
41
+ const plaintextBytes = new TextEncoder().encode(plaintext);
42
+ const encryptedData = await crypto.subtle.encrypt(
43
+ { name: "AES-GCM", iv },
44
+ key,
45
+ plaintextBytes.buffer
46
+ );
47
+ const encryptedBytes = new Uint8Array(encryptedData);
48
+ const combined = new Uint8Array(iv.length + encryptedBytes.length);
49
+ combined.set(iv, 0);
50
+ combined.set(encryptedBytes, iv.length);
51
+ return Array.from(combined).map((b) => b.toString(16).padStart(2, "0")).join("");
52
+ }
53
+ async function decryptWithSessionKey(encryptedHex) {
54
+ const sessionKeyHex = sessionStorage.getItem(SESSION_KEY_STORAGE_KEY);
55
+ if (!sessionKeyHex) {
56
+ throw new Error("Session key not found");
57
+ }
58
+ const keyBytes = hexToBytes(sessionKeyHex);
59
+ const key = await crypto.subtle.importKey(
60
+ "raw",
61
+ keyBytes.buffer,
62
+ { name: "AES-GCM" },
63
+ false,
64
+ ["encrypt", "decrypt"]
65
+ );
66
+ const combined = hexToBytes(encryptedHex);
67
+ const iv = combined.slice(0, 12);
68
+ const encryptedData = combined.slice(12);
69
+ const decryptedData = await crypto.subtle.decrypt(
70
+ { name: "AES-GCM", iv },
71
+ key,
72
+ encryptedData
73
+ );
74
+ return new TextDecoder().decode(decryptedData);
75
+ }
76
+ function hexToBytes(hex) {
77
+ const cleanHex = hex.startsWith("0x") ? hex.slice(2) : hex;
78
+ const bytes = new Uint8Array(cleanHex.length / 2);
79
+ for (let i = 0; i < cleanHex.length; i += 2) {
80
+ bytes[i / 2] = parseInt(cleanHex.slice(i, i + 2), 16);
81
+ }
82
+ return bytes;
83
+ }
84
+ async function reEncryptUnencryptedTokens(walletAddress) {
85
+ if (typeof window === "undefined") return;
86
+ if (!hasEncryptionKey(walletAddress)) return;
87
+ const providers = ["google-drive", "dropbox"];
88
+ for (const provider of providers) {
89
+ try {
90
+ const stored = localStorage.getItem(getStorageKey(provider));
91
+ if (!stored) continue;
92
+ if (!isEncrypted(stored)) {
93
+ try {
94
+ const data = JSON.parse(stored);
95
+ if (data.accessToken) {
96
+ await storeTokenData(provider, data, walletAddress);
97
+ }
98
+ } catch {
99
+ continue;
100
+ }
101
+ } else {
102
+ const encryptedPayload = stored.slice(ENCRYPTION_PREFIX.length);
103
+ try {
104
+ const decrypted = await decryptWithSessionKey(encryptedPayload);
105
+ const data = JSON.parse(decrypted);
106
+ if (data.accessToken) {
107
+ await storeTokenData(provider, data, walletAddress);
108
+ }
109
+ } catch {
110
+ continue;
111
+ }
112
+ }
113
+ } catch {
114
+ continue;
115
+ }
116
+ }
117
+ }
118
+ async function getStoredTokenData(provider, walletAddress) {
119
+ if (typeof window === "undefined") return null;
120
+ try {
121
+ const stored = localStorage.getItem(getStorageKey(provider));
122
+ if (!stored) return null;
123
+ if (isEncrypted(stored)) {
124
+ const encryptedPayload = stored.slice(ENCRYPTION_PREFIX.length);
125
+ if (walletAddress && hasEncryptionKey(walletAddress)) {
126
+ try {
127
+ const decrypted = await decryptData(encryptedPayload, walletAddress);
128
+ const data = JSON.parse(decrypted);
129
+ if (!data.accessToken) return null;
130
+ return data;
131
+ } catch {
132
+ }
133
+ }
134
+ try {
135
+ const decrypted = await decryptWithSessionKey(encryptedPayload);
136
+ const data = JSON.parse(decrypted);
137
+ if (!data.accessToken) return null;
138
+ if (walletAddress && hasEncryptionKey(walletAddress)) {
139
+ try {
140
+ await storeTokenData(provider, data, walletAddress);
141
+ } catch {
142
+ console.error(`Failed to re-encrypt OAuth token for ${provider}`);
143
+ }
144
+ }
145
+ return data;
146
+ } catch {
147
+ return null;
148
+ }
149
+ } else {
150
+ try {
151
+ const data = JSON.parse(stored);
152
+ if (!data.accessToken) return null;
153
+ if (walletAddress && hasEncryptionKey(walletAddress)) {
154
+ try {
155
+ await storeTokenData(provider, data, walletAddress);
156
+ } catch {
157
+ console.error(`Failed to re-encrypt OAuth token for ${provider}`);
158
+ }
159
+ } else {
160
+ try {
161
+ await storeTokenData(provider, data);
162
+ } catch {
163
+ console.error(`Failed to encrypt OAuth token for ${provider}`);
164
+ }
165
+ }
166
+ return data;
167
+ } catch {
168
+ return null;
169
+ }
170
+ }
171
+ } catch {
172
+ return null;
173
+ }
174
+ }
175
+ function getStoredTokenDataSync(provider) {
176
+ if (typeof window === "undefined") return null;
177
+ try {
178
+ const stored = localStorage.getItem(getStorageKey(provider));
179
+ if (!stored) return null;
180
+ if (isEncrypted(stored)) {
181
+ return null;
182
+ }
183
+ const data = JSON.parse(stored);
184
+ if (!data.accessToken) return null;
185
+ return data;
186
+ } catch {
187
+ return null;
188
+ }
189
+ }
190
+ async function storeTokenData(provider, data, walletAddress) {
191
+ if (typeof window === "undefined") return;
192
+ const jsonData = JSON.stringify(data);
193
+ if (walletAddress && hasEncryptionKey(walletAddress)) {
194
+ try {
195
+ const encrypted = await encryptData(jsonData, walletAddress);
196
+ localStorage.setItem(getStorageKey(provider), `${ENCRYPTION_PREFIX}${encrypted}`);
197
+ return;
198
+ } catch (error) {
199
+ const message = error instanceof Error ? error.message : "Unknown encryption error";
200
+ throw new Error(`OAuth token encryption failed: ${message}`);
201
+ }
202
+ }
203
+ try {
204
+ const encrypted = await encryptWithSessionKey(jsonData);
205
+ localStorage.setItem(getStorageKey(provider), `${ENCRYPTION_PREFIX}${encrypted}`);
206
+ } catch (error) {
207
+ const sessionStorageAvailable = typeof window !== "undefined" && typeof window.sessionStorage !== "undefined" && typeof window.sessionStorage.getItem === "function" && typeof window.sessionStorage.setItem === "function";
208
+ if (!sessionStorageAvailable) {
209
+ localStorage.setItem(getStorageKey(provider), jsonData);
210
+ } else {
211
+ const message = error instanceof Error ? error.message : "Unknown encryption error";
212
+ throw new Error(`OAuth token encryption failed: ${message}`);
213
+ }
214
+ }
215
+ }
216
+ function clearTokenData(provider) {
217
+ if (typeof window === "undefined") return;
218
+ localStorage.removeItem(getStorageKey(provider));
219
+ }
220
+ function isTokenExpired(data, bufferSeconds = 60) {
221
+ if (!data) return true;
222
+ if (!data.expiresAt) return false;
223
+ const now = Date.now();
224
+ const bufferMs = bufferSeconds * 1e3;
225
+ return data.expiresAt - bufferMs <= now;
226
+ }
227
+ async function getValidAccessToken(provider, walletAddress) {
228
+ const data = await getStoredTokenData(provider, walletAddress);
229
+ if (!data) return null;
230
+ if (data.expiresAt && isTokenExpired(data)) {
231
+ return null;
232
+ }
233
+ return data.accessToken;
234
+ }
235
+ function getValidAccessTokenSync(provider) {
236
+ const data = getStoredTokenDataSync(provider);
237
+ if (!data) return null;
238
+ if (data.expiresAt && isTokenExpired(data)) {
239
+ return null;
240
+ }
241
+ return data.accessToken;
242
+ }
243
+ async function getRefreshToken(provider, walletAddress) {
244
+ const data = await getStoredTokenData(provider, walletAddress);
245
+ return data?.refreshToken ?? null;
246
+ }
247
+ function getRefreshTokenSync(provider) {
248
+ const data = getStoredTokenDataSync(provider);
249
+ return data?.refreshToken ?? null;
250
+ }
251
+ function hasStoredCredentialsSync(provider) {
252
+ if (typeof window === "undefined") return false;
253
+ const stored = localStorage.getItem(getStorageKey(provider));
254
+ if (!stored) return false;
255
+ if (isEncrypted(stored)) {
256
+ return true;
257
+ }
258
+ try {
259
+ const data = JSON.parse(stored);
260
+ return !!(data?.accessToken || data?.refreshToken);
261
+ } catch {
262
+ return false;
263
+ }
264
+ }
265
+ function tokenResponseToStoredData(accessToken, expiresIn, refreshToken, scope) {
266
+ const data = {
267
+ accessToken,
268
+ refreshToken,
269
+ scope
270
+ };
271
+ if (expiresIn) {
272
+ data.expiresAt = Date.now() + expiresIn * 1e3;
273
+ }
274
+ return data;
275
+ }
276
+
277
+ export {
278
+ reEncryptUnencryptedTokens,
279
+ getStoredTokenData,
280
+ getStoredTokenDataSync,
281
+ storeTokenData,
282
+ clearTokenData,
283
+ isTokenExpired,
284
+ getValidAccessToken,
285
+ getValidAccessTokenSync,
286
+ getRefreshToken,
287
+ getRefreshTokenSync,
288
+ hasStoredCredentialsSync,
289
+ tokenResponseToStoredData
290
+ };