@bananalink-sdk/protocol 1.2.7

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 (158) hide show
  1. package/README.md +604 -0
  2. package/dist/chunk-32OWUOZ3.js +308 -0
  3. package/dist/chunk-32OWUOZ3.js.map +1 -0
  4. package/dist/chunk-65HNHRJK.cjs +123 -0
  5. package/dist/chunk-65HNHRJK.cjs.map +1 -0
  6. package/dist/chunk-7KYDLL3B.js +480 -0
  7. package/dist/chunk-7KYDLL3B.js.map +1 -0
  8. package/dist/chunk-A6FLEJ7R.cjs +62 -0
  9. package/dist/chunk-A6FLEJ7R.cjs.map +1 -0
  10. package/dist/chunk-CUJK7ZTS.js +217 -0
  11. package/dist/chunk-CUJK7ZTS.js.map +1 -0
  12. package/dist/chunk-GI3BUPIH.cjs +236 -0
  13. package/dist/chunk-GI3BUPIH.cjs.map +1 -0
  14. package/dist/chunk-JXHV66Q4.js +106 -0
  15. package/dist/chunk-JXHV66Q4.js.map +1 -0
  16. package/dist/chunk-KNGZKGRS.cjs +552 -0
  17. package/dist/chunk-KNGZKGRS.cjs.map +1 -0
  18. package/dist/chunk-LELPCIE7.js +840 -0
  19. package/dist/chunk-LELPCIE7.js.map +1 -0
  20. package/dist/chunk-MCZG7QEM.cjs +310 -0
  21. package/dist/chunk-MCZG7QEM.cjs.map +1 -0
  22. package/dist/chunk-TCVKC227.js +56 -0
  23. package/dist/chunk-TCVKC227.js.map +1 -0
  24. package/dist/chunk-VXLUSU5B.cjs +856 -0
  25. package/dist/chunk-VXLUSU5B.cjs.map +1 -0
  26. package/dist/chunk-WCQVDF3K.js +12 -0
  27. package/dist/chunk-WCQVDF3K.js.map +1 -0
  28. package/dist/chunk-WGEGR3DF.cjs +15 -0
  29. package/dist/chunk-WGEGR3DF.cjs.map +1 -0
  30. package/dist/client-session-claim-3QF3noOr.d.ts +197 -0
  31. package/dist/client-session-claim-C4lUik3b.d.cts +197 -0
  32. package/dist/core-DMhuNfoz.d.cts +62 -0
  33. package/dist/core-DMhuNfoz.d.ts +62 -0
  34. package/dist/crypto/providers/noble-provider.cjs +14 -0
  35. package/dist/crypto/providers/noble-provider.cjs.map +1 -0
  36. package/dist/crypto/providers/noble-provider.d.cts +30 -0
  37. package/dist/crypto/providers/noble-provider.d.ts +30 -0
  38. package/dist/crypto/providers/noble-provider.js +5 -0
  39. package/dist/crypto/providers/noble-provider.js.map +1 -0
  40. package/dist/crypto/providers/node-provider.cjs +308 -0
  41. package/dist/crypto/providers/node-provider.cjs.map +1 -0
  42. package/dist/crypto/providers/node-provider.d.cts +32 -0
  43. package/dist/crypto/providers/node-provider.d.ts +32 -0
  44. package/dist/crypto/providers/node-provider.js +306 -0
  45. package/dist/crypto/providers/node-provider.js.map +1 -0
  46. package/dist/crypto/providers/quickcrypto-provider.cjs +339 -0
  47. package/dist/crypto/providers/quickcrypto-provider.cjs.map +1 -0
  48. package/dist/crypto/providers/quickcrypto-provider.d.cts +34 -0
  49. package/dist/crypto/providers/quickcrypto-provider.d.ts +34 -0
  50. package/dist/crypto/providers/quickcrypto-provider.js +337 -0
  51. package/dist/crypto/providers/quickcrypto-provider.js.map +1 -0
  52. package/dist/crypto/providers/webcrypto-provider.cjs +310 -0
  53. package/dist/crypto/providers/webcrypto-provider.cjs.map +1 -0
  54. package/dist/crypto/providers/webcrypto-provider.d.cts +30 -0
  55. package/dist/crypto/providers/webcrypto-provider.d.ts +30 -0
  56. package/dist/crypto/providers/webcrypto-provider.js +308 -0
  57. package/dist/crypto/providers/webcrypto-provider.js.map +1 -0
  58. package/dist/crypto-BUS06Qz-.d.cts +40 -0
  59. package/dist/crypto-BUS06Qz-.d.ts +40 -0
  60. package/dist/crypto-export.cjs +790 -0
  61. package/dist/crypto-export.cjs.map +1 -0
  62. package/dist/crypto-export.d.cts +257 -0
  63. package/dist/crypto-export.d.ts +257 -0
  64. package/dist/crypto-export.js +709 -0
  65. package/dist/crypto-export.js.map +1 -0
  66. package/dist/crypto-provider-deYoVIxi.d.cts +36 -0
  67. package/dist/crypto-provider-deYoVIxi.d.ts +36 -0
  68. package/dist/index.cjs +615 -0
  69. package/dist/index.cjs.map +1 -0
  70. package/dist/index.d.cts +379 -0
  71. package/dist/index.d.ts +379 -0
  72. package/dist/index.js +504 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/schemas-export.cjs +294 -0
  75. package/dist/schemas-export.cjs.map +1 -0
  76. package/dist/schemas-export.d.cts +1598 -0
  77. package/dist/schemas-export.d.ts +1598 -0
  78. package/dist/schemas-export.js +5 -0
  79. package/dist/schemas-export.js.map +1 -0
  80. package/dist/siwe-export.cjs +237 -0
  81. package/dist/siwe-export.cjs.map +1 -0
  82. package/dist/siwe-export.d.cts +27 -0
  83. package/dist/siwe-export.d.ts +27 -0
  84. package/dist/siwe-export.js +228 -0
  85. package/dist/siwe-export.js.map +1 -0
  86. package/dist/testing.cjs +54 -0
  87. package/dist/testing.cjs.map +1 -0
  88. package/dist/testing.d.cts +20 -0
  89. package/dist/testing.d.ts +20 -0
  90. package/dist/testing.js +51 -0
  91. package/dist/testing.js.map +1 -0
  92. package/dist/validation-export.cjs +359 -0
  93. package/dist/validation-export.cjs.map +1 -0
  94. package/dist/validation-export.d.cts +3 -0
  95. package/dist/validation-export.d.ts +3 -0
  96. package/dist/validation-export.js +6 -0
  97. package/dist/validation-export.js.map +1 -0
  98. package/dist/validators-export.cjs +73 -0
  99. package/dist/validators-export.cjs.map +1 -0
  100. package/dist/validators-export.d.cts +37 -0
  101. package/dist/validators-export.d.ts +37 -0
  102. package/dist/validators-export.js +4 -0
  103. package/dist/validators-export.js.map +1 -0
  104. package/package.json +140 -0
  105. package/src/constants/index.ts +205 -0
  106. package/src/crypto/context.ts +228 -0
  107. package/src/crypto/diagnostics.ts +772 -0
  108. package/src/crypto/errors.ts +114 -0
  109. package/src/crypto/index.ts +89 -0
  110. package/src/crypto/payload-handler.ts +102 -0
  111. package/src/crypto/providers/compliance-provider.ts +579 -0
  112. package/src/crypto/providers/factory.ts +204 -0
  113. package/src/crypto/providers/index.ts +44 -0
  114. package/src/crypto/providers/noble-provider.ts +392 -0
  115. package/src/crypto/providers/node-provider.ts +433 -0
  116. package/src/crypto/providers/quickcrypto-provider.ts +483 -0
  117. package/src/crypto/providers/registry.ts +129 -0
  118. package/src/crypto/providers/webcrypto-provider.ts +364 -0
  119. package/src/crypto/session-security.ts +185 -0
  120. package/src/crypto/types.ts +93 -0
  121. package/src/crypto/utils.ts +190 -0
  122. package/src/crypto-export.ts +21 -0
  123. package/src/index.ts +38 -0
  124. package/src/schemas/auth.ts +60 -0
  125. package/src/schemas/client-messages.ts +57 -0
  126. package/src/schemas/core.ts +144 -0
  127. package/src/schemas/crypto.ts +65 -0
  128. package/src/schemas/discovery.ts +79 -0
  129. package/src/schemas/index.ts +239 -0
  130. package/src/schemas/relay-messages.ts +45 -0
  131. package/src/schemas/wallet-messages.ts +177 -0
  132. package/src/schemas-export.ts +23 -0
  133. package/src/siwe-export.ts +27 -0
  134. package/src/testing.ts +71 -0
  135. package/src/types/auth.ts +60 -0
  136. package/src/types/client-messages.ts +84 -0
  137. package/src/types/core.ts +131 -0
  138. package/src/types/crypto-provider.ts +264 -0
  139. package/src/types/crypto.ts +90 -0
  140. package/src/types/discovery.ts +50 -0
  141. package/src/types/errors.ts +87 -0
  142. package/src/types/index.ts +197 -0
  143. package/src/types/post-auth-operations.ts +363 -0
  144. package/src/types/providers.ts +72 -0
  145. package/src/types/relay-messages.ts +60 -0
  146. package/src/types/request-lifecycle.ts +161 -0
  147. package/src/types/signing-operations.ts +99 -0
  148. package/src/types/wallet-messages.ts +251 -0
  149. package/src/utils/client-session-claim.ts +188 -0
  150. package/src/utils/index.ts +54 -0
  151. package/src/utils/public-keys.ts +49 -0
  152. package/src/utils/siwe.ts +362 -0
  153. package/src/utils/url-decoding.ts +126 -0
  154. package/src/utils/url-encoding.ts +144 -0
  155. package/src/utils/wallet-session-claim.ts +188 -0
  156. package/src/validation-export.ts +32 -0
  157. package/src/validators/index.ts +222 -0
  158. package/src/validators-export.ts +8 -0
@@ -0,0 +1,337 @@
1
+ import { NobleCryptoProvider } from '../../chunk-32OWUOZ3.js';
2
+ import { registerCryptoProvider } from '../../chunk-TCVKC227.js';
3
+ import { __name } from '../../chunk-WCQVDF3K.js';
4
+
5
+ // src/crypto/providers/quickcrypto-provider.ts
6
+ function hasKeyData(key) {
7
+ return "data" in key && key.data instanceof Uint8Array;
8
+ }
9
+ __name(hasKeyData, "hasKeyData");
10
+ var _QuickCryptoKey = class _QuickCryptoKey {
11
+ constructor(data, type, algorithm, extractable = true, usages = []) {
12
+ this.data = data;
13
+ this.type = type;
14
+ this.algorithm = algorithm;
15
+ this.extractable = extractable;
16
+ this.usages = usages;
17
+ }
18
+ };
19
+ __name(_QuickCryptoKey, "QuickCryptoKey");
20
+ var QuickCryptoKey = _QuickCryptoKey;
21
+ function isQuickCryptoAvailable() {
22
+ try {
23
+ const global = globalThis;
24
+ if (!global.require) return false;
25
+ const quickCrypto = global.require("react-native-quick-crypto");
26
+ if (!quickCrypto) return false;
27
+ return typeof quickCrypto.randomBytes === "function" && typeof quickCrypto.createHash === "function" && typeof quickCrypto.createHmac === "function" && typeof quickCrypto.createCipheriv === "function";
28
+ } catch {
29
+ return false;
30
+ }
31
+ }
32
+ __name(isQuickCryptoAvailable, "isQuickCryptoAvailable");
33
+ var _QuickCryptoProvider = class _QuickCryptoProvider {
34
+ constructor(logger) {
35
+ this.name = "QuickCrypto";
36
+ this.logger = logger?.child({ component: "QuickCryptoProvider" });
37
+ this.isAvailable = isQuickCryptoAvailable();
38
+ if (this.isAvailable) {
39
+ try {
40
+ const global = globalThis;
41
+ this.quickCrypto = global.require?.("react-native-quick-crypto");
42
+ if (this.quickCrypto) {
43
+ this.logger?.debug("QuickCrypto initialized successfully");
44
+ } else {
45
+ this.logger?.warn("QuickCrypto require returned undefined");
46
+ this.isAvailable = false;
47
+ }
48
+ } catch (error) {
49
+ this.logger?.error("Failed to initialize QuickCrypto", {
50
+ error: {
51
+ message: error instanceof Error ? error.message : String(error),
52
+ stack: error instanceof Error ? error.stack : void 0
53
+ }
54
+ });
55
+ this.isAvailable = false;
56
+ }
57
+ }
58
+ this.nobleProvider = new NobleCryptoProvider(logger);
59
+ }
60
+ /**
61
+ * Generate ECDH P-256 key pair using Noble (QuickCrypto doesn't support P-256 ECDH)
62
+ */
63
+ async generateKeyPair() {
64
+ this.logger?.debug("Generating ECDH P-256 key pair using Noble (fallback)");
65
+ const nobleKeyPair = await this.nobleProvider.generateKeyPair();
66
+ if (!hasKeyData(nobleKeyPair.privateKey) || !hasKeyData(nobleKeyPair.publicKey)) {
67
+ throw new Error("Noble keys missing required data property");
68
+ }
69
+ return {
70
+ privateKey: new QuickCryptoKey(
71
+ nobleKeyPair.privateKey.data,
72
+ "private",
73
+ "ECDH-P256",
74
+ true,
75
+ ["deriveKey"]
76
+ ),
77
+ publicKey: new QuickCryptoKey(
78
+ nobleKeyPair.publicKey.data,
79
+ "public",
80
+ "ECDH-P256",
81
+ true,
82
+ []
83
+ )
84
+ };
85
+ }
86
+ /**
87
+ * Export public key to ArrayBuffer (delegate to Noble)
88
+ */
89
+ exportPublicKey(publicKey) {
90
+ return this.nobleProvider.exportPublicKey(publicKey);
91
+ }
92
+ /**
93
+ * Export private key to ArrayBuffer (delegate to Noble)
94
+ */
95
+ exportPrivateKey(privateKey) {
96
+ return this.nobleProvider.exportPrivateKey(privateKey);
97
+ }
98
+ /**
99
+ * Import public key from ArrayBuffer (delegate to Noble)
100
+ */
101
+ async importPublicKey(keyData) {
102
+ const nobleKey = await this.nobleProvider.importPublicKey(keyData);
103
+ if (!hasKeyData(nobleKey)) {
104
+ throw new Error("Noble public key missing required data property");
105
+ }
106
+ return new QuickCryptoKey(
107
+ nobleKey.data,
108
+ "public",
109
+ "ECDH-P256",
110
+ true,
111
+ []
112
+ );
113
+ }
114
+ /**
115
+ * Import private key from ArrayBuffer (delegate to Noble)
116
+ */
117
+ async importPrivateKey(keyData) {
118
+ const nobleKey = await this.nobleProvider.importPrivateKey(keyData);
119
+ if (!hasKeyData(nobleKey)) {
120
+ throw new Error("Noble private key missing required data property");
121
+ }
122
+ return new QuickCryptoKey(
123
+ nobleKey.data,
124
+ "private",
125
+ "ECDH-P256",
126
+ true,
127
+ ["deriveKey"]
128
+ );
129
+ }
130
+ /**
131
+ * Derive shared secret from ECDH key agreement (delegate to Noble)
132
+ */
133
+ async deriveSharedSecret(privateKey, publicKey) {
134
+ this.logger?.debug("Deriving shared secret using Noble (fallback)");
135
+ const sharedSecret = await this.nobleProvider.deriveSharedSecret(privateKey, publicKey);
136
+ if (!hasKeyData(sharedSecret)) {
137
+ throw new Error("Noble shared secret missing required data property");
138
+ }
139
+ return new QuickCryptoKey(
140
+ sharedSecret.data,
141
+ "secret",
142
+ "AES-GCM",
143
+ true,
144
+ ["encrypt", "decrypt"]
145
+ );
146
+ }
147
+ /**
148
+ * Derive AES-GCM key from shared secret using HKDF (delegate to Noble)
149
+ */
150
+ async deriveEncryptionKey(sharedSecret, salt, info) {
151
+ const encryptionKey = await this.nobleProvider.deriveEncryptionKey(sharedSecret, salt, info);
152
+ if (!hasKeyData(encryptionKey)) {
153
+ throw new Error("Noble encryption key missing required data property");
154
+ }
155
+ return new QuickCryptoKey(
156
+ encryptionKey.data,
157
+ "secret",
158
+ "AES-GCM",
159
+ true,
160
+ ["encrypt", "decrypt"]
161
+ );
162
+ }
163
+ /**
164
+ * Generate random bytes using QuickCrypto (58x faster than crypto-browserify)
165
+ */
166
+ randomBytes(length) {
167
+ if (!this.quickCrypto || !this.isAvailable) {
168
+ this.logger?.debug("QuickCrypto not available, falling back to Noble for randomBytes");
169
+ return this.nobleProvider.randomBytes(length);
170
+ }
171
+ try {
172
+ const bytes = this.quickCrypto.randomBytes(length);
173
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
174
+ } catch (error) {
175
+ this.logger?.error("QuickCrypto randomBytes failed, falling back to Noble", {
176
+ error: {
177
+ message: error instanceof Error ? error.message : String(error)
178
+ }
179
+ });
180
+ return this.nobleProvider.randomBytes(length);
181
+ }
182
+ }
183
+ /**
184
+ * Encrypt data using AES-GCM with QuickCrypto (much faster than Noble)
185
+ */
186
+ async encrypt(key, data, iv) {
187
+ if (!this.quickCrypto || !this.isAvailable) {
188
+ this.logger?.debug("QuickCrypto not available, falling back to Noble for encryption");
189
+ return this.nobleProvider.encrypt(key, data, iv);
190
+ }
191
+ this.logger?.debug("Encrypting data with AES-GCM using QuickCrypto", {
192
+ dataSize: data.byteLength,
193
+ ivSize: iv.byteLength
194
+ });
195
+ const secretKey = key;
196
+ if (secretKey.type !== "secret") {
197
+ const error = new Error("Expected secret key");
198
+ this.logger?.error("Encryption failed - invalid key type", {
199
+ actualType: secretKey.type
200
+ });
201
+ throw error;
202
+ }
203
+ try {
204
+ const cipher = this.quickCrypto.createCipheriv("aes-256-gcm", secretKey.data, new Uint8Array(iv));
205
+ const encrypted = cipher.update(new Uint8Array(data));
206
+ const final = cipher.final();
207
+ const authTag = cipher.getAuthTag?.() || new Uint8Array(16);
208
+ const result = new Uint8Array(encrypted.length + final.length + authTag.length);
209
+ result.set(encrypted, 0);
210
+ result.set(final, encrypted.length);
211
+ result.set(authTag, encrypted.length + final.length);
212
+ this.logger?.debug("Encryption completed using QuickCrypto", {
213
+ ciphertextSize: result.byteLength
214
+ });
215
+ return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);
216
+ } catch (error) {
217
+ this.logger?.error("QuickCrypto encryption failed, falling back to Noble", {
218
+ error: {
219
+ message: error instanceof Error ? error.message : String(error),
220
+ stack: error instanceof Error ? error.stack : void 0
221
+ }
222
+ });
223
+ return this.nobleProvider.encrypt(key, data, iv);
224
+ }
225
+ }
226
+ /**
227
+ * Decrypt data using AES-GCM with QuickCrypto (much faster than Noble)
228
+ */
229
+ async decrypt(key, data, iv) {
230
+ if (!this.quickCrypto || !this.isAvailable) {
231
+ this.logger?.debug("QuickCrypto not available, falling back to Noble for decryption");
232
+ return this.nobleProvider.decrypt(key, data, iv);
233
+ }
234
+ this.logger?.debug("Decrypting data with AES-GCM using QuickCrypto", {
235
+ dataSize: data.byteLength,
236
+ ivSize: iv.byteLength
237
+ });
238
+ const secretKey = key;
239
+ if (secretKey.type !== "secret") {
240
+ const error = new Error("Expected secret key");
241
+ this.logger?.error("Decryption failed - invalid key type", {
242
+ actualType: secretKey.type
243
+ });
244
+ throw error;
245
+ }
246
+ try {
247
+ const dataBytes = new Uint8Array(data);
248
+ const authTagLength = 16;
249
+ if (dataBytes.length < authTagLength) {
250
+ throw new Error("Data too short to contain auth tag");
251
+ }
252
+ const ciphertext = dataBytes.slice(0, -authTagLength);
253
+ const authTag = dataBytes.slice(-authTagLength);
254
+ const decipher = this.quickCrypto.createDecipheriv("aes-256-gcm", secretKey.data, new Uint8Array(iv));
255
+ decipher.setAuthTag?.(authTag);
256
+ const decrypted = decipher.update(ciphertext);
257
+ const final = decipher.final();
258
+ const result = new Uint8Array(decrypted.length + final.length);
259
+ result.set(decrypted, 0);
260
+ result.set(final, decrypted.length);
261
+ this.logger?.debug("Decryption completed using QuickCrypto", {
262
+ plaintextSize: result.byteLength
263
+ });
264
+ return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);
265
+ } catch (error) {
266
+ this.logger?.error("QuickCrypto decryption failed, falling back to Noble", {
267
+ error: {
268
+ message: error instanceof Error ? error.message : String(error),
269
+ stack: error instanceof Error ? error.stack : void 0
270
+ }
271
+ });
272
+ return this.nobleProvider.decrypt(key, data, iv);
273
+ }
274
+ }
275
+ /**
276
+ * Generate HMAC-SHA256 using QuickCrypto (faster than Noble)
277
+ */
278
+ async generateHMAC(key, data) {
279
+ if (!this.quickCrypto || !this.isAvailable) {
280
+ this.logger?.debug("QuickCrypto not available, falling back to Noble for HMAC");
281
+ return this.nobleProvider.generateHMAC(key, data);
282
+ }
283
+ const secretKey = key;
284
+ if (secretKey.type !== "secret") {
285
+ throw new Error("Expected secret key");
286
+ }
287
+ try {
288
+ const hmac = this.quickCrypto.createHmac("sha256", secretKey.data);
289
+ hmac.update(new Uint8Array(data));
290
+ const mac = hmac.digest();
291
+ return mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength);
292
+ } catch (error) {
293
+ this.logger?.error("QuickCrypto HMAC failed, falling back to Noble", {
294
+ error: {
295
+ message: error instanceof Error ? error.message : String(error)
296
+ }
297
+ });
298
+ return this.nobleProvider.generateHMAC(key, data);
299
+ }
300
+ }
301
+ /**
302
+ * Verify HMAC-SHA256 using QuickCrypto (faster than Noble)
303
+ */
304
+ async verifyHMAC(key, data, mac) {
305
+ if (!this.quickCrypto || !this.isAvailable) {
306
+ this.logger?.debug("QuickCrypto not available, falling back to Noble for HMAC verification");
307
+ return this.nobleProvider.verifyHMAC(key, data, mac);
308
+ }
309
+ try {
310
+ const expectedMac = await this.generateHMAC(key, data);
311
+ const providedMac = new Uint8Array(mac);
312
+ const expectedMacBytes = new Uint8Array(expectedMac);
313
+ if (expectedMacBytes.length !== providedMac.length) {
314
+ return false;
315
+ }
316
+ let result = 0;
317
+ for (let i = 0; i < expectedMacBytes.length; i++) {
318
+ result |= expectedMacBytes[i] ^ providedMac[i];
319
+ }
320
+ return result === 0;
321
+ } catch (error) {
322
+ this.logger?.error("QuickCrypto HMAC verification failed, falling back to Noble", {
323
+ error: {
324
+ message: error instanceof Error ? error.message : String(error)
325
+ }
326
+ });
327
+ return this.nobleProvider.verifyHMAC(key, data, mac);
328
+ }
329
+ }
330
+ };
331
+ __name(_QuickCryptoProvider, "QuickCryptoProvider");
332
+ var QuickCryptoProvider = _QuickCryptoProvider;
333
+ registerCryptoProvider("quickcrypto", (logger) => new QuickCryptoProvider(logger));
334
+
335
+ export { QuickCryptoProvider };
336
+ //# sourceMappingURL=quickcrypto-provider.js.map
337
+ //# sourceMappingURL=quickcrypto-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/crypto/providers/quickcrypto-provider.ts"],"names":[],"mappings":";;;;;AAcA,SAAS,WAAW,GAAA,EAAiE;AACnF,EAAA,OAAO,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,IAAA,YAAgB,UAAA;AAC9C;AAFS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAiCT,IAAM,eAAA,GAAN,MAAM,eAAA,CAAwC;AAAA,EAC5C,WAAA,CACkB,MACA,IAAA,EACA,SAAA,EACA,cAAuB,IAAA,EACvB,MAAA,GAA4B,EAAC,EAC7C;AALgB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACf;AACL,CAAA;AAR8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAA9C,IAAM,cAAA,GAAN,eAAA;AAaA,SAAS,sBAAA,GAAkC;AACzC,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,UAAA;AACf,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,KAAA;AAE5B,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,2BAA2B,CAAA;AAC9D,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAEzB,IAAA,OACE,OAAO,WAAA,CAAY,WAAA,KAAgB,UAAA,IACnC,OAAO,WAAA,CAAY,UAAA,KAAe,UAAA,IAClC,OAAO,WAAA,CAAY,UAAA,KAAe,UAAA,IAClC,OAAO,YAAY,cAAA,KAAmB,UAAA;AAAA,EAE1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAlBS,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAyBF,IAAM,oBAAA,GAAN,MAAM,oBAAA,CAA8C;AAAA,EAQzD,YAAY,MAAA,EAAiB;AAP7B,IAAA,IAAA,CAAgB,IAAA,GAAO,aAAA;AAQrB,IAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,KAAA,CAAM,EAAE,SAAA,EAAW,uBAAuB,CAAA;AAChE,IAAA,IAAA,CAAK,cAAc,sBAAA,EAAuB;AAE1C,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,UAAA;AACf,QAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,OAAA,GAAU,2BAA2B,CAAA;AAC/D,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sCAAsC,CAAA;AAAA,QAC3D,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,wCAAwC,CAAA;AAE1D,UAAC,KAAkC,WAAA,GAAc,KAAA;AAAA,QACnD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,kCAAA,EAAoC;AAAA,UACrD,KAAA,EAAO;AAAA,YACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,YAC9D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA;AAChD,SACD,CAAA;AAED,QAAC,KAAkC,WAAA,GAAc,KAAA;AAAA,MACnD;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAA4C;AAChD,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,uDAAuD,CAAA;AAG1E,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,aAAA,CAAc,eAAA,EAAgB;AAG9D,IAAA,IAAI,CAAC,WAAW,YAAA,CAAa,UAAU,KAAK,CAAC,UAAA,CAAW,YAAA,CAAa,SAAS,CAAA,EAAG;AAC/E,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO;AAAA,MACL,YAAY,IAAI,cAAA;AAAA,QACd,aAAa,UAAA,CAAW,IAAA;AAAA,QACxB,SAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA;AAAA,QACA,CAAC,WAAW;AAAA,OACd;AAAA,MACA,WAAW,IAAI,cAAA;AAAA,QACb,aAAa,SAAA,CAAU,IAAA;AAAA,QACvB,QAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAC;AACH,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,SAAA,EAAgD;AAC9D,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,SAAS,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAAA,EAAiD;AAChE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,UAAU,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAA8C;AAClE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,gBAAgB,OAAO,CAAA;AAEjE,IAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AAGA,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,QAAA,CAAS,IAAA;AAAA,MACT,QAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAC,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAAA,EAA8C;AACnE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,iBAAiB,OAAO,CAAA;AAElE,IAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,IACpE;AAGA,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,QAAA,CAAS,IAAA;AAAA,MACT,SAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,UAAA,EAA2B,SAAA,EAAkD;AACpG,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,+CAA+C,CAAA;AAElE,IAAA,MAAM,eAAe,MAAM,IAAA,CAAK,aAAA,CAAc,kBAAA,CAAmB,YAAY,SAAS,CAAA;AAEtF,IAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AAGA,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,YAAA,CAAa,IAAA;AAAA,MACb,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,CAAC,WAAW,SAAS;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CAAoB,YAAA,EAA6B,IAAA,EAAmB,IAAA,EAA2C;AACnH,IAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,cAAc,mBAAA,CAAoB,YAAA,EAAc,MAAM,IAAI,CAAA;AAE3F,IAAA,IAAI,CAAC,UAAA,CAAW,aAAa,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAGA,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,aAAA,CAAc,IAAA;AAAA,MACd,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,CAAC,WAAW,SAAS;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,kEAAkE,CAAA;AACrF,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,MAAM,CAAA;AACjD,MAAA,OAAO,KAAA,CAAM,OAAO,KAAA,CAAM,KAAA,CAAM,YAAY,KAAA,CAAM,UAAA,GAAa,MAAM,UAAU,CAAA;AAAA,IACjF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,uDAAA,EAAyD;AAAA,QAC1E,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,GAAA,EAAoB,IAAA,EAAmB,EAAA,EAAuC;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,iEAAiE,CAAA;AACpF,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,gDAAA,EAAkD;AAAA,MACnE,UAAU,IAAA,CAAK,UAAA;AAAA,MACf,QAAQ,EAAA,CAAG;AAAA,KACZ,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,GAAA;AAElB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,qBAAqB,CAAA;AAC7C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sCAAA,EAAwC;AAAA,QACzD,YAAY,SAAA,CAAU;AAAA,OACvB,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,cAAA,CAAe,aAAA,EAAe,UAAU,IAAA,EAAM,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAEhG,MAAA,MAAM,YAAY,MAAA,CAAO,MAAA,CAAO,IAAI,UAAA,CAAW,IAAI,CAAC,CAAA;AACpD,MAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAG3B,MAAA,MAAM,UAAU,MAAA,CAAO,UAAA,IAAa,IAAK,IAAI,WAAW,EAAE,CAAA;AAG1D,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,SAAA,CAAU,SAAS,KAAA,CAAM,MAAA,GAAS,QAAQ,MAAM,CAAA;AAC9E,MAAA,MAAA,CAAO,GAAA,CAAI,WAAW,CAAC,CAAA;AACvB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,SAAA,CAAU,MAAM,CAAA;AAClC,MAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,SAAA,CAAU,MAAA,GAAS,MAAM,MAAM,CAAA;AAEnD,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,wCAAA,EAA0C;AAAA,QAC3D,gBAAgB,MAAA,CAAO;AAAA,OACxB,CAAA;AAED,MAAA,OAAO,MAAA,CAAO,OAAO,KAAA,CAAM,MAAA,CAAO,YAAY,MAAA,CAAO,UAAA,GAAa,OAAO,UAAU,CAAA;AAAA,IACrF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sDAAA,EAAwD;AAAA,QACzE,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UAC9D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA;AAChD,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,GAAA,EAAoB,IAAA,EAAmB,EAAA,EAAuC;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,iEAAiE,CAAA;AACpF,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,gDAAA,EAAkD;AAAA,MACnE,UAAU,IAAA,CAAK,UAAA;AAAA,MACf,QAAQ,EAAA,CAAG;AAAA,KACZ,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,GAAA;AAElB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,qBAAqB,CAAA;AAC7C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sCAAA,EAAwC;AAAA,QACzD,YAAY,SAAA,CAAU;AAAA,OACvB,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,IAAI,CAAA;AAGrC,MAAA,MAAM,aAAA,GAAgB,EAAA;AACtB,MAAA,IAAI,SAAA,CAAU,SAAS,aAAA,EAAe;AACpC,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,aAAa,CAAA;AACpD,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,KAAA,CAAM,CAAC,aAAa,CAAA;AAE9C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,gBAAA,CAAiB,aAAA,EAAe,UAAU,IAAA,EAAM,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAGpG,MAAA,QAAA,CAAS,aAAa,OAAO,CAAA;AAE7B,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC5C,MAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,EAAM;AAG7B,MAAA,MAAM,SAAS,IAAI,UAAA,CAAW,SAAA,CAAU,MAAA,GAAS,MAAM,MAAM,CAAA;AAC7D,MAAA,MAAA,CAAO,GAAA,CAAI,WAAW,CAAC,CAAA;AACvB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,SAAA,CAAU,MAAM,CAAA;AAElC,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,wCAAA,EAA0C;AAAA,QAC3D,eAAe,MAAA,CAAO;AAAA,OACvB,CAAA;AAED,MAAA,OAAO,MAAA,CAAO,OAAO,KAAA,CAAM,MAAA,CAAO,YAAY,MAAA,CAAO,UAAA,GAAa,OAAO,UAAU,CAAA;AAAA,IACrF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sDAAA,EAAwD;AAAA,QACzE,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UAC9D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA;AAChD,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,GAAA,EAAoB,IAAA,EAAyC;AAC9E,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,2DAA2D,CAAA;AAC9E,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,SAAA,GAAY,GAAA;AAElB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,QAAA,EAAU,UAAU,IAAI,CAAA;AACjE,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,UAAA,CAAW,IAAI,CAAC,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,EAAO;AAExB,MAAA,OAAO,GAAA,CAAI,OAAO,KAAA,CAAM,GAAA,CAAI,YAAY,GAAA,CAAI,UAAA,GAAa,IAAI,UAAU,CAAA;AAAA,IACzE,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,gDAAA,EAAkD;AAAA,QACnE,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,GAAA,EAAoB,IAAA,EAAmB,GAAA,EAAoC;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,wEAAwE,CAAA;AAC3F,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,IAAI,CAAA;AACrD,MAAA,MAAM,WAAA,GAAc,IAAI,UAAA,CAAW,GAAG,CAAA;AACtC,MAAA,MAAM,gBAAA,GAAmB,IAAI,UAAA,CAAW,WAAW,CAAA;AAGnD,MAAA,IAAI,gBAAA,CAAiB,MAAA,KAAW,WAAA,CAAY,MAAA,EAAQ;AAClD,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,gBAAA,CAAiB,QAAQ,CAAA,EAAA,EAAK;AAChD,QAAA,MAAA,IAAU,gBAAA,CAAiB,CAAC,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA;AAAA,MAC/C;AAEA,MAAA,OAAO,MAAA,KAAW,CAAA;AAAA,IACpB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,6DAAA,EAA+D;AAAA,QAChF,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,IACrD;AAAA,EACF;AACF,CAAA;AAvX2D,MAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAApD,IAAM,mBAAA,GAAN;AAmYP,sBAAA,CAAuB,eAAe,CAAC,MAAA,KAAW,IAAI,mBAAA,CAAoB,MAAM,CAAC,CAAA","file":"quickcrypto-provider.js","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\nimport { NobleCryptoProvider } from './noble-provider';\nimport { registerCryptoProvider } from './registry';\n\n// Global require function type for React Native environments\ntype RequireFunction = (id: string) => unknown;\ntype GlobalWithRequire = typeof globalThis & {\n require?: RequireFunction;\n};\n\n/**\n * Type guard to check if a key has a data property (from Noble provider)\n */\nfunction hasKeyData(key: CryptoKeyLike): key is CryptoKeyLike & { data: Uint8Array } {\n return 'data' in key && key.data instanceof Uint8Array;\n}\n\n// Type definitions for react-native-quick-crypto Node.js-like API\ninterface QuickCryptoHash {\n update(data: Uint8Array): void;\n digest(): Uint8Array;\n}\n\ninterface QuickCryptoCipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n getAuthTag?(): Uint8Array;\n}\n\ninterface QuickCryptoDecipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n setAuthTag?(authTag: Uint8Array): void;\n}\n\ninterface QuickCrypto {\n randomBytes(size: number): Uint8Array;\n createHash(algorithm: string): QuickCryptoHash;\n createHmac(algorithm: string, key: Uint8Array): QuickCryptoHash;\n createCipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoCipher;\n createDecipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoDecipher;\n}\n\n/**\n * QuickCrypto key wrapper to implement CryptoKeyLike interface\n */\nclass QuickCryptoKey implements CryptoKeyLike {\n constructor(\n public readonly data: Uint8Array,\n public readonly type: 'public' | 'private' | 'secret',\n public readonly algorithm: string,\n public readonly extractable: boolean = true,\n public readonly usages: readonly string[] = []\n ) {}\n}\n\n/**\n * Check if react-native-quick-crypto is available\n */\nfunction isQuickCryptoAvailable(): boolean {\n try {\n // Use globalThis.require for React Native compatibility\n const global = globalThis as GlobalWithRequire;\n if (!global.require) return false;\n\n const quickCrypto = global.require('react-native-quick-crypto') as QuickCrypto | undefined;\n if (!quickCrypto) return false;\n\n return (\n typeof quickCrypto.randomBytes === 'function' &&\n typeof quickCrypto.createHash === 'function' &&\n typeof quickCrypto.createHmac === 'function' &&\n typeof quickCrypto.createCipheriv === 'function'\n );\n } catch {\n return false;\n }\n}\n\n/**\n * React Native QuickCrypto implementation of CryptoProvider\n * Hybrid approach: uses Noble for ECDH operations and QuickCrypto for AES/HMAC/hashing\n * This provides optimal performance while maintaining full compatibility\n */\nexport class QuickCryptoProvider implements CryptoProvider {\n public readonly name = 'QuickCrypto';\n public readonly isAvailable: boolean;\n\n private readonly logger?: Logger;\n private readonly quickCrypto?: QuickCrypto;\n private readonly nobleProvider: NobleCryptoProvider;\n\n constructor(logger?: Logger) {\n this.logger = logger?.child({ component: 'QuickCryptoProvider' });\n this.isAvailable = isQuickCryptoAvailable();\n\n if (this.isAvailable) {\n try {\n const global = globalThis as GlobalWithRequire;\n this.quickCrypto = global.require?.('react-native-quick-crypto') as QuickCrypto | undefined;\n if (this.quickCrypto) {\n this.logger?.debug('QuickCrypto initialized successfully');\n } else {\n this.logger?.warn('QuickCrypto require returned undefined');\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n } catch (error) {\n this.logger?.error('Failed to initialize QuickCrypto', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n }\n\n // Always initialize Noble provider as fallback for ECDH operations\n this.nobleProvider = new NobleCryptoProvider(logger);\n }\n\n /**\n * Generate ECDH P-256 key pair using Noble (QuickCrypto doesn't support P-256 ECDH)\n */\n async generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair using Noble (fallback)');\n\n // Use Noble for key generation as QuickCrypto doesn't support P-256 ECDH\n const nobleKeyPair = await this.nobleProvider.generateKeyPair();\n\n // Wrap in QuickCryptoKey for consistency\n if (!hasKeyData(nobleKeyPair.privateKey) || !hasKeyData(nobleKeyPair.publicKey)) {\n throw new Error('Noble keys missing required data property');\n }\n\n return {\n privateKey: new QuickCryptoKey(\n nobleKeyPair.privateKey.data,\n 'private',\n 'ECDH-P256',\n true,\n ['deriveKey']\n ),\n publicKey: new QuickCryptoKey(\n nobleKeyPair.publicKey.data,\n 'public',\n 'ECDH-P256',\n true,\n []\n )\n };\n }\n\n /**\n * Export public key to ArrayBuffer (delegate to Noble)\n */\n exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPublicKey(publicKey);\n }\n\n /**\n * Export private key to ArrayBuffer (delegate to Noble)\n */\n exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPrivateKey(privateKey);\n }\n\n /**\n * Import public key from ArrayBuffer (delegate to Noble)\n */\n async importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPublicKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble public key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n nobleKey.data,\n 'public',\n 'ECDH-P256',\n true,\n []\n );\n }\n\n /**\n * Import private key from ArrayBuffer (delegate to Noble)\n */\n async importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPrivateKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble private key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n nobleKey.data,\n 'private',\n 'ECDH-P256',\n true,\n ['deriveKey']\n );\n }\n\n /**\n * Derive shared secret from ECDH key agreement (delegate to Noble)\n */\n async deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret using Noble (fallback)');\n\n const sharedSecret = await this.nobleProvider.deriveSharedSecret(privateKey, publicKey);\n\n if (!hasKeyData(sharedSecret)) {\n throw new Error('Noble shared secret missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n sharedSecret.data,\n 'secret',\n 'AES-GCM',\n true,\n ['encrypt', 'decrypt']\n );\n }\n\n /**\n * Derive AES-GCM key from shared secret using HKDF (delegate to Noble)\n */\n async deriveEncryptionKey(sharedSecret: CryptoKeyLike, salt: ArrayBuffer, info: ArrayBuffer): Promise<CryptoKeyLike> {\n const encryptionKey = await this.nobleProvider.deriveEncryptionKey(sharedSecret, salt, info);\n\n if (!hasKeyData(encryptionKey)) {\n throw new Error('Noble encryption key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n encryptionKey.data,\n 'secret',\n 'AES-GCM',\n true,\n ['encrypt', 'decrypt']\n );\n }\n\n /**\n * Generate random bytes using QuickCrypto (58x faster than crypto-browserify)\n */\n randomBytes(length: number): ArrayBuffer {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for randomBytes');\n return this.nobleProvider.randomBytes(length);\n }\n\n try {\n const bytes = this.quickCrypto.randomBytes(length);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto randomBytes failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error)\n }\n });\n return this.nobleProvider.randomBytes(length);\n }\n }\n\n /**\n * Encrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for encryption');\n return this.nobleProvider.encrypt(key, data, iv);\n }\n\n this.logger?.debug('Encrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Encryption failed - invalid key type', {\n actualType: secretKey.type\n });\n throw error;\n }\n\n try {\n // Use QuickCrypto's Node.js-compatible AES-GCM implementation\n const cipher = this.quickCrypto.createCipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n const encrypted = cipher.update(new Uint8Array(data));\n const final = cipher.final();\n\n // Get authentication tag (GCM mode)\n const authTag = cipher.getAuthTag?.() || new Uint8Array(16);\n\n // Combine encrypted data + auth tag (standard AES-GCM format)\n const result = new Uint8Array(encrypted.length + final.length + authTag.length);\n result.set(encrypted, 0);\n result.set(final, encrypted.length);\n result.set(authTag, encrypted.length + final.length);\n\n this.logger?.debug('Encryption completed using QuickCrypto', {\n ciphertextSize: result.byteLength\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto encryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n return this.nobleProvider.encrypt(key, data, iv);\n }\n }\n\n /**\n * Decrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for decryption');\n return this.nobleProvider.decrypt(key, data, iv);\n }\n\n this.logger?.debug('Decrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Decryption failed - invalid key type', {\n actualType: secretKey.type\n });\n throw error;\n }\n\n try {\n const dataBytes = new Uint8Array(data);\n\n // Extract auth tag from end of data (last 16 bytes for GCM)\n const authTagLength = 16;\n if (dataBytes.length < authTagLength) {\n throw new Error('Data too short to contain auth tag');\n }\n\n const ciphertext = dataBytes.slice(0, -authTagLength);\n const authTag = dataBytes.slice(-authTagLength);\n\n const decipher = this.quickCrypto.createDecipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n // Set auth tag for verification\n decipher.setAuthTag?.(authTag);\n\n const decrypted = decipher.update(ciphertext);\n const final = decipher.final();\n\n // Combine decrypted chunks\n const result = new Uint8Array(decrypted.length + final.length);\n result.set(decrypted, 0);\n result.set(final, decrypted.length);\n\n this.logger?.debug('Decryption completed using QuickCrypto', {\n plaintextSize: result.byteLength\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto decryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n return this.nobleProvider.decrypt(key, data, iv);\n }\n }\n\n /**\n * Generate HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC');\n return this.nobleProvider.generateHMAC(key, data);\n }\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n throw new Error('Expected secret key');\n }\n\n try {\n const hmac = this.quickCrypto.createHmac('sha256', secretKey.data);\n hmac.update(new Uint8Array(data));\n const mac = hmac.digest();\n\n return mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error)\n }\n });\n return this.nobleProvider.generateHMAC(key, data);\n }\n }\n\n /**\n * Verify HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC verification');\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n\n try {\n const expectedMac = await this.generateHMAC(key, data);\n const providedMac = new Uint8Array(mac);\n const expectedMacBytes = new Uint8Array(expectedMac);\n\n // Constant-time comparison\n if (expectedMacBytes.length !== providedMac.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < expectedMacBytes.length; i++) {\n result |= expectedMacBytes[i] ^ providedMac[i];\n }\n\n return result === 0;\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC verification failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error)\n }\n });\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n }\n}\n\n/**\n * Self-register QuickCrypto provider on import\n * This allows the provider to be available when explicitly imported\n *\n * Note: QuickCrypto depends on Noble for ECDH operations, so we auto-register\n * Noble as well to ensure all required functionality is available.\n */\n// Auto-register noble as a dependency (QuickCrypto delegates ECDH to Noble)\nimport './noble-provider';\n\nregisterCryptoProvider('quickcrypto', (logger) => new QuickCryptoProvider(logger));\n\n// TypeScript module augmentation to track this provider is available\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace BananaLink {\n interface RegisteredCryptoProviders {\n quickcrypto: true;\n }\n }\n}\n"]}