@metamask/profile-sync-controller 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/dist/chunk-26CCETCM.mjs +70 -0
  3. package/dist/chunk-2MVOZPBN.js +98 -0
  4. package/dist/chunk-2MVOZPBN.js.map +1 -0
  5. package/dist/chunk-3FJQHCCQ.mjs +106 -0
  6. package/dist/chunk-3FJQHCCQ.mjs.map +1 -0
  7. package/dist/chunk-4OMJ7A6A.js +77 -0
  8. package/dist/chunk-4OMJ7A6A.js.map +1 -0
  9. package/dist/chunk-6P6CUKKI.mjs +30 -0
  10. package/dist/chunk-6P6CUKKI.mjs.map +1 -0
  11. package/dist/{chunk-OF3TQWGX.js → chunk-6TK7544L.js} +34 -34
  12. package/dist/chunk-6TK7544L.js.map +1 -0
  13. package/dist/chunk-76VRE4BI.mjs +18 -0
  14. package/dist/chunk-76VRE4BI.mjs.map +1 -0
  15. package/dist/chunk-772MKTIO.mjs +25 -0
  16. package/dist/chunk-772MKTIO.mjs.map +1 -0
  17. package/dist/chunk-7FCK4BY3.js +25 -0
  18. package/dist/chunk-7FCK4BY3.js.map +1 -0
  19. package/dist/{chunk-CYGZ4WLJ.mjs → chunk-7VMXBDXN.mjs} +36 -5
  20. package/dist/chunk-7VMXBDXN.mjs.map +1 -0
  21. package/dist/chunk-ARWL2LBB.js +273 -0
  22. package/dist/chunk-ARWL2LBB.js.map +1 -0
  23. package/dist/chunk-BFE6TB7Y.mjs +11 -0
  24. package/dist/chunk-BFE6TB7Y.mjs.map +1 -0
  25. package/dist/chunk-BVM4HBM4.js +112 -0
  26. package/dist/chunk-BVM4HBM4.js.map +1 -0
  27. package/dist/chunk-DHHBHLVN.mjs +70 -0
  28. package/dist/chunk-DHHBHLVN.mjs.map +1 -0
  29. package/dist/chunk-DLXLU44Z.js +106 -0
  30. package/dist/chunk-DLXLU44Z.js.map +1 -0
  31. package/dist/chunk-GJJT2CAL.js +3342 -0
  32. package/dist/chunk-GJJT2CAL.js.map +1 -0
  33. package/dist/{chunk-VZXD5DCQ.js → chunk-GLDUXN2T.js} +36 -27
  34. package/dist/chunk-GLDUXN2T.js.map +1 -0
  35. package/dist/chunk-GLS4QZF6.mjs +77 -0
  36. package/dist/chunk-GLS4QZF6.mjs.map +1 -0
  37. package/dist/chunk-H25EBXG5.mjs +58 -0
  38. package/dist/chunk-H25EBXG5.mjs.map +1 -0
  39. package/dist/chunk-IPSBQ3MS.js +30 -0
  40. package/dist/chunk-IPSBQ3MS.js.map +1 -0
  41. package/dist/chunk-IZHWP5VW.mjs +79 -0
  42. package/dist/chunk-IZHWP5VW.mjs.map +1 -0
  43. package/dist/chunk-JAGWB4JI.mjs +102 -0
  44. package/dist/chunk-JAGWB4JI.mjs.map +1 -0
  45. package/dist/chunk-JMU3OVPK.mjs +3342 -0
  46. package/dist/chunk-JMU3OVPK.mjs.map +1 -0
  47. package/dist/chunk-JTDFOATG.js +11 -0
  48. package/dist/chunk-JTDFOATG.js.map +1 -0
  49. package/dist/chunk-JWTNHCVG.js +158 -0
  50. package/dist/chunk-JWTNHCVG.js.map +1 -0
  51. package/dist/chunk-K6G7X6PX.js +70 -0
  52. package/dist/chunk-K6G7X6PX.js.map +1 -0
  53. package/dist/chunk-LHDVZNW5.js +126 -0
  54. package/dist/chunk-LHDVZNW5.js.map +1 -0
  55. package/dist/{chunk-VXPVURGH.mjs → chunk-LN2BY2QF.mjs} +9 -9
  56. package/dist/chunk-LN2BY2QF.mjs.map +1 -0
  57. package/dist/{chunk-6X6I3HZU.js → chunk-LUKNP4HM.js} +28 -26
  58. package/dist/chunk-LUKNP4HM.js.map +1 -0
  59. package/dist/{chunk-GQLHSQGZ.js → chunk-MBTBE4P5.js} +9 -2
  60. package/dist/chunk-MBTBE4P5.js.map +1 -0
  61. package/dist/chunk-PCOIRDTO.js +18 -0
  62. package/dist/chunk-PCOIRDTO.js.map +1 -0
  63. package/dist/chunk-PNZGAAT4.mjs +273 -0
  64. package/dist/chunk-PNZGAAT4.mjs.map +1 -0
  65. package/dist/chunk-PRDECQM6.mjs +221 -0
  66. package/dist/chunk-PRDECQM6.mjs.map +1 -0
  67. package/dist/chunk-QE2F5AZL.mjs +158 -0
  68. package/dist/chunk-QE2F5AZL.mjs.map +1 -0
  69. package/dist/chunk-QHL6SQTC.mjs +112 -0
  70. package/dist/chunk-QHL6SQTC.mjs.map +1 -0
  71. package/dist/chunk-QILE6KIE.js +79 -0
  72. package/dist/chunk-QILE6KIE.js.map +1 -0
  73. package/dist/{chunk-CFST6GWE.js → chunk-T77FC4PB.js} +1 -1
  74. package/dist/chunk-T77FC4PB.js.map +1 -0
  75. package/dist/{chunk-BHVT2QEA.mjs → chunk-TFFQFIJV.mjs} +8 -1
  76. package/dist/chunk-TFFQFIJV.mjs.map +1 -0
  77. package/dist/chunk-UAXWZN5J.js +58 -0
  78. package/dist/chunk-UAXWZN5J.js.map +1 -0
  79. package/dist/{chunk-CZ7YK35S.mjs → chunk-UEZI2POO.mjs} +7 -5
  80. package/dist/{chunk-CZ7YK35S.mjs.map → chunk-UEZI2POO.mjs.map} +1 -1
  81. package/dist/{chunk-4NGEEDGV.mjs → chunk-UWRKMJBI.mjs} +9 -9
  82. package/dist/chunk-UWRKMJBI.mjs.map +1 -0
  83. package/dist/chunk-V46WVGWN.js +70 -0
  84. package/dist/{chunk-UMKBFFZ5.mjs → chunk-VTM5T7Y4.mjs} +13 -4
  85. package/dist/chunk-VTM5T7Y4.mjs.map +1 -0
  86. package/dist/chunk-VYE2DKST.js +102 -0
  87. package/dist/chunk-VYE2DKST.js.map +1 -0
  88. package/dist/chunk-W7JFFMEZ.mjs +98 -0
  89. package/dist/chunk-W7JFFMEZ.mjs.map +1 -0
  90. package/dist/chunk-WAS6V24H.js +221 -0
  91. package/dist/chunk-WAS6V24H.js.map +1 -0
  92. package/dist/{chunk-NRH6O4QZ.js → chunk-XUPRRLBI.js} +45 -14
  93. package/dist/chunk-XUPRRLBI.js.map +1 -0
  94. package/dist/{chunk-2FZSWVHT.mjs → chunk-YWA77VMP.mjs} +1 -1
  95. package/dist/chunk-YWA77VMP.mjs.map +1 -0
  96. package/dist/controllers/authentication/AuthenticationController.js +22 -0
  97. package/dist/controllers/authentication/AuthenticationController.mjs +22 -0
  98. package/dist/controllers/authentication/auth-snap-requests.js +10 -0
  99. package/dist/controllers/authentication/auth-snap-requests.mjs +10 -0
  100. package/dist/controllers/authentication/index.js +27 -0
  101. package/dist/controllers/authentication/index.js.map +1 -0
  102. package/dist/controllers/authentication/index.mjs +27 -0
  103. package/dist/controllers/authentication/index.mjs.map +1 -0
  104. package/dist/controllers/authentication/services.js +32 -0
  105. package/dist/controllers/authentication/services.js.map +1 -0
  106. package/dist/controllers/authentication/services.mjs +32 -0
  107. package/dist/controllers/authentication/services.mjs.map +1 -0
  108. package/dist/controllers/index.js +35 -0
  109. package/dist/controllers/index.js.map +1 -0
  110. package/dist/controllers/index.mjs +35 -0
  111. package/dist/controllers/index.mjs.map +1 -0
  112. package/dist/controllers/user-storage/UserStorageController.js +27 -0
  113. package/dist/controllers/user-storage/UserStorageController.js.map +1 -0
  114. package/dist/controllers/user-storage/UserStorageController.mjs +27 -0
  115. package/dist/controllers/user-storage/UserStorageController.mjs.map +1 -0
  116. package/dist/controllers/user-storage/encryption/cache.js +13 -0
  117. package/dist/controllers/user-storage/encryption/cache.js.map +1 -0
  118. package/dist/controllers/user-storage/encryption/cache.mjs +13 -0
  119. package/dist/controllers/user-storage/encryption/cache.mjs.map +1 -0
  120. package/dist/controllers/user-storage/encryption/encryption.js +12 -0
  121. package/dist/controllers/user-storage/encryption/encryption.js.map +1 -0
  122. package/dist/controllers/user-storage/encryption/encryption.mjs +12 -0
  123. package/dist/controllers/user-storage/encryption/encryption.mjs.map +1 -0
  124. package/dist/controllers/user-storage/encryption/index.js +16 -0
  125. package/dist/controllers/user-storage/encryption/index.js.map +1 -0
  126. package/dist/controllers/user-storage/encryption/index.mjs +16 -0
  127. package/dist/controllers/user-storage/encryption/index.mjs.map +1 -0
  128. package/dist/controllers/user-storage/encryption/utils.js +12 -0
  129. package/dist/controllers/user-storage/encryption/utils.js.map +1 -0
  130. package/dist/controllers/user-storage/encryption/utils.mjs +12 -0
  131. package/dist/controllers/user-storage/encryption/utils.mjs.map +1 -0
  132. package/dist/controllers/user-storage/index.js +37 -0
  133. package/dist/controllers/user-storage/index.js.map +1 -0
  134. package/dist/controllers/user-storage/index.mjs +37 -0
  135. package/dist/controllers/user-storage/index.mjs.map +1 -0
  136. package/dist/controllers/user-storage/schema.js +14 -0
  137. package/dist/controllers/user-storage/schema.js.map +1 -0
  138. package/dist/controllers/user-storage/schema.mjs +14 -0
  139. package/dist/controllers/user-storage/schema.mjs.map +1 -0
  140. package/dist/controllers/user-storage/services.js +31 -0
  141. package/dist/controllers/user-storage/services.js.map +1 -0
  142. package/dist/controllers/user-storage/services.mjs +31 -0
  143. package/dist/controllers/user-storage/services.mjs.map +1 -0
  144. package/dist/index.js +32 -62
  145. package/dist/index.mjs +33 -63
  146. package/dist/sdk/authentication-jwt-bearer/flow-siwe.js +7 -8
  147. package/dist/sdk/authentication-jwt-bearer/flow-siwe.mjs +6 -7
  148. package/dist/sdk/authentication-jwt-bearer/flow-srp.js +7 -8
  149. package/dist/sdk/authentication-jwt-bearer/flow-srp.mjs +6 -7
  150. package/dist/sdk/authentication-jwt-bearer/services.js +10 -6
  151. package/dist/sdk/authentication-jwt-bearer/services.mjs +11 -7
  152. package/dist/sdk/authentication-jwt-bearer/types.js +3 -3
  153. package/dist/sdk/authentication-jwt-bearer/types.mjs +2 -2
  154. package/dist/sdk/authentication.js +9 -10
  155. package/dist/sdk/authentication.mjs +8 -9
  156. package/dist/sdk/encryption.js +5 -3
  157. package/dist/sdk/encryption.mjs +4 -2
  158. package/dist/sdk/env.js +5 -3
  159. package/dist/sdk/env.mjs +4 -2
  160. package/dist/sdk/errors.js +5 -3
  161. package/dist/sdk/errors.mjs +4 -2
  162. package/dist/sdk/index.js +18 -13
  163. package/dist/sdk/index.mjs +17 -12
  164. package/dist/sdk/user-storage.js +6 -6
  165. package/dist/sdk/user-storage.mjs +5 -5
  166. package/dist/sdk/utils/eip-6963-metamask-provider.js +1 -1
  167. package/dist/sdk/utils/eip-6963-metamask-provider.mjs +1 -1
  168. package/dist/sdk/utils/messaging-signing-snap-requests.js +1 -1
  169. package/dist/sdk/utils/messaging-signing-snap-requests.mjs +1 -1
  170. package/dist/tsconfig.build.tsbuildinfo +1 -1
  171. package/dist/types/controllers/authentication/AuthenticationController.d.ts +73 -0
  172. package/dist/types/controllers/authentication/AuthenticationController.d.ts.map +1 -0
  173. package/dist/types/controllers/authentication/__fixtures__/index.d.ts +3 -0
  174. package/dist/types/controllers/authentication/__fixtures__/index.d.ts.map +1 -0
  175. package/dist/types/controllers/authentication/__fixtures__/mockResponses.d.ts +23 -0
  176. package/dist/types/controllers/authentication/__fixtures__/mockResponses.d.ts.map +1 -0
  177. package/dist/types/controllers/authentication/__fixtures__/mockServices.d.ts +10 -0
  178. package/dist/types/controllers/authentication/__fixtures__/mockServices.d.ts.map +1 -0
  179. package/dist/types/controllers/authentication/auth-snap-requests.d.ts +17 -0
  180. package/dist/types/controllers/authentication/auth-snap-requests.d.ts.map +1 -0
  181. package/dist/types/controllers/authentication/index.d.ts +5 -0
  182. package/dist/types/controllers/authentication/index.d.ts.map +1 -0
  183. package/dist/types/controllers/authentication/services.d.ts +69 -0
  184. package/dist/types/controllers/authentication/services.d.ts.map +1 -0
  185. package/dist/types/controllers/index.d.ts +3 -0
  186. package/dist/types/controllers/index.d.ts.map +1 -0
  187. package/dist/types/controllers/user-storage/UserStorageController.d.ts +84 -0
  188. package/dist/types/controllers/user-storage/UserStorageController.d.ts.map +1 -0
  189. package/dist/types/controllers/user-storage/__fixtures__/index.d.ts +4 -0
  190. package/dist/types/controllers/user-storage/__fixtures__/index.d.ts.map +1 -0
  191. package/dist/types/controllers/user-storage/__fixtures__/mockResponses.d.ts +13 -0
  192. package/dist/types/controllers/user-storage/__fixtures__/mockResponses.d.ts.map +1 -0
  193. package/dist/types/controllers/user-storage/__fixtures__/mockServices.d.ts +9 -0
  194. package/dist/types/controllers/user-storage/__fixtures__/mockServices.d.ts.map +1 -0
  195. package/dist/types/controllers/user-storage/__fixtures__/mockStorage.d.ts +5 -0
  196. package/dist/types/controllers/user-storage/__fixtures__/mockStorage.d.ts.map +1 -0
  197. package/dist/types/controllers/user-storage/encryption/cache.d.ts +31 -0
  198. package/dist/types/controllers/user-storage/encryption/cache.d.ts.map +1 -0
  199. package/dist/types/controllers/user-storage/encryption/encryption.d.ts +26 -0
  200. package/dist/types/controllers/user-storage/encryption/encryption.d.ts.map +1 -0
  201. package/dist/types/controllers/user-storage/encryption/index.d.ts +5 -0
  202. package/dist/types/controllers/user-storage/encryption/index.d.ts.map +1 -0
  203. package/dist/types/controllers/user-storage/encryption/utils.d.ts +4 -0
  204. package/dist/types/controllers/user-storage/encryption/utils.d.ts.map +1 -0
  205. package/dist/types/controllers/user-storage/index.d.ts +6 -0
  206. package/dist/types/controllers/user-storage/index.d.ts.map +1 -0
  207. package/dist/types/controllers/user-storage/schema.d.ts +22 -0
  208. package/dist/types/controllers/user-storage/schema.d.ts.map +1 -0
  209. package/dist/types/controllers/user-storage/services.d.ts +30 -0
  210. package/dist/types/controllers/user-storage/services.d.ts.map +1 -0
  211. package/dist/types/index.d.ts +3 -1
  212. package/dist/types/index.d.ts.map +1 -1
  213. package/dist/types/sdk/__fixtures__/mock-auth.d.ts +3 -0
  214. package/dist/types/sdk/__fixtures__/mock-auth.d.ts.map +1 -1
  215. package/dist/types/sdk/__fixtures__/mock-userstorage.d.ts.map +1 -1
  216. package/dist/types/sdk/__fixtures__/test-utils.d.ts.map +1 -1
  217. package/dist/types/sdk/authentication-jwt-bearer/flow-siwe.d.ts.map +1 -1
  218. package/dist/types/sdk/authentication-jwt-bearer/flow-srp.d.ts.map +1 -1
  219. package/dist/types/sdk/authentication-jwt-bearer/services.d.ts +20 -2
  220. package/dist/types/sdk/authentication-jwt-bearer/services.d.ts.map +1 -1
  221. package/dist/types/sdk/authentication-jwt-bearer/types.d.ts +8 -1
  222. package/dist/types/sdk/authentication-jwt-bearer/types.d.ts.map +1 -1
  223. package/dist/types/sdk/authentication.d.ts +2 -1
  224. package/dist/types/sdk/authentication.d.ts.map +1 -1
  225. package/dist/types/sdk/encryption.d.ts +2 -2
  226. package/dist/types/sdk/encryption.d.ts.map +1 -1
  227. package/dist/types/sdk/env.d.ts +8 -1
  228. package/dist/types/sdk/env.d.ts.map +1 -1
  229. package/dist/types/sdk/errors.d.ts +3 -0
  230. package/dist/types/sdk/errors.d.ts.map +1 -1
  231. package/dist/types/sdk/user-storage.d.ts.map +1 -1
  232. package/package.json +15 -2
  233. package/dist/chunk-2FZSWVHT.mjs.map +0 -1
  234. package/dist/chunk-4NGEEDGV.mjs.map +0 -1
  235. package/dist/chunk-6X6I3HZU.js.map +0 -1
  236. package/dist/chunk-BARZBXO7.js +0 -7
  237. package/dist/chunk-BARZBXO7.js.map +0 -1
  238. package/dist/chunk-BHVT2QEA.mjs.map +0 -1
  239. package/dist/chunk-CFST6GWE.js.map +0 -1
  240. package/dist/chunk-CYGZ4WLJ.mjs.map +0 -1
  241. package/dist/chunk-DEATIRII.js +0 -1
  242. package/dist/chunk-GQLHSQGZ.js.map +0 -1
  243. package/dist/chunk-GVMIXMYB.mjs +0 -67
  244. package/dist/chunk-GVMIXMYB.mjs.map +0 -1
  245. package/dist/chunk-KHFPE566.js +0 -49
  246. package/dist/chunk-KHFPE566.js.map +0 -1
  247. package/dist/chunk-KKRIOEXD.mjs +0 -7
  248. package/dist/chunk-KKRIOEXD.mjs.map +0 -1
  249. package/dist/chunk-MKJYSWME.mjs +0 -1
  250. package/dist/chunk-NRH6O4QZ.js.map +0 -1
  251. package/dist/chunk-OF3TQWGX.js.map +0 -1
  252. package/dist/chunk-UMKBFFZ5.mjs.map +0 -1
  253. package/dist/chunk-UVJVONBF.js +0 -126
  254. package/dist/chunk-UVJVONBF.js.map +0 -1
  255. package/dist/chunk-VHUU4HEY.js +0 -67
  256. package/dist/chunk-VHUU4HEY.js.map +0 -1
  257. package/dist/chunk-VXPVURGH.mjs.map +0 -1
  258. package/dist/chunk-VZXD5DCQ.js.map +0 -1
  259. package/dist/chunk-WJRV2JCX.mjs +0 -49
  260. package/dist/chunk-WJRV2JCX.mjs.map +0 -1
  261. package/dist/chunk-XUI43LEZ.mjs +0 -30
  262. package/dist/chunk-Z4BLTVTB.js +0 -30
  263. package/dist/sdk/authentication-jwt-bearer/constants.js +0 -8
  264. package/dist/sdk/authentication-jwt-bearer/constants.mjs +0 -8
  265. package/dist/types/sdk/authentication-jwt-bearer/constants.d.ts +0 -2
  266. package/dist/types/sdk/authentication-jwt-bearer/constants.d.ts.map +0 -1
  267. /package/dist/{chunk-MKJYSWME.mjs.map → chunk-26CCETCM.mjs.map} +0 -0
  268. /package/dist/{chunk-DEATIRII.js.map → chunk-V46WVGWN.js.map} +0 -0
  269. /package/dist/{chunk-Z4BLTVTB.js.map → controllers/authentication/AuthenticationController.js.map} +0 -0
  270. /package/dist/{chunk-XUI43LEZ.mjs.map → controllers/authentication/AuthenticationController.mjs.map} +0 -0
  271. /package/dist/{sdk/authentication-jwt-bearer/constants.js.map → controllers/authentication/auth-snap-requests.js.map} +0 -0
  272. /package/dist/{sdk/authentication-jwt-bearer/constants.mjs.map → controllers/authentication/auth-snap-requests.mjs.map} +0 -0
@@ -0,0 +1,158 @@
1
+ import {
2
+ getAnyCachedKey,
3
+ getCachedKeyBySalt,
4
+ setCachedKey
5
+ } from "./chunk-H25EBXG5.mjs";
6
+ import {
7
+ base64ToByteArray,
8
+ byteArrayToBase64,
9
+ bytesToUtf8
10
+ } from "./chunk-76VRE4BI.mjs";
11
+ import {
12
+ __privateAdd,
13
+ __privateMethod
14
+ } from "./chunk-26CCETCM.mjs";
15
+
16
+ // src/controllers/user-storage/encryption/encryption.ts
17
+ import { gcm } from "@noble/ciphers/aes";
18
+ import { randomBytes } from "@noble/ciphers/webcrypto";
19
+ import { scrypt } from "@noble/hashes/scrypt";
20
+ import { sha256 } from "@noble/hashes/sha256";
21
+ import { utf8ToBytes, concatBytes, bytesToHex } from "@noble/hashes/utils";
22
+ var ALGORITHM_NONCE_SIZE = 12;
23
+ var ALGORITHM_KEY_SIZE = 16;
24
+ var SCRYPT_SALT_SIZE = 16;
25
+ var SCRYPT_N = 2 ** 17;
26
+ var SCRYPT_r = 8;
27
+ var SCRYPT_p = 1;
28
+ var _encryptStringV1, encryptStringV1_fn, _decryptStringV1, decryptStringV1_fn, _encrypt, encrypt_fn, _decrypt, decrypt_fn, _getOrGenerateScryptKey, getOrGenerateScryptKey_fn;
29
+ var EncryptorDecryptor = class {
30
+ constructor() {
31
+ __privateAdd(this, _encryptStringV1);
32
+ __privateAdd(this, _decryptStringV1);
33
+ __privateAdd(this, _encrypt);
34
+ __privateAdd(this, _decrypt);
35
+ __privateAdd(this, _getOrGenerateScryptKey);
36
+ }
37
+ encryptString(plaintext, password) {
38
+ try {
39
+ return __privateMethod(this, _encryptStringV1, encryptStringV1_fn).call(this, plaintext, password);
40
+ } catch (e) {
41
+ const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);
42
+ throw new Error(`Unable to encrypt string - ${errorMessage}`);
43
+ }
44
+ }
45
+ decryptString(encryptedDataStr, password) {
46
+ try {
47
+ const encryptedData = JSON.parse(encryptedDataStr);
48
+ if (encryptedData.v === "1") {
49
+ if (encryptedData.t === "scrypt") {
50
+ return __privateMethod(this, _decryptStringV1, decryptStringV1_fn).call(this, encryptedData, password);
51
+ }
52
+ }
53
+ throw new Error(
54
+ `Unsupported encrypted data payload - ${encryptedDataStr}`
55
+ );
56
+ } catch (e) {
57
+ const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);
58
+ throw new Error(`Unable to decrypt string - ${errorMessage}`);
59
+ }
60
+ }
61
+ };
62
+ _encryptStringV1 = new WeakSet();
63
+ encryptStringV1_fn = function(plaintext, password) {
64
+ const { key, salt } = __privateMethod(this, _getOrGenerateScryptKey, getOrGenerateScryptKey_fn).call(this, password, {
65
+ N: SCRYPT_N,
66
+ r: SCRYPT_r,
67
+ p: SCRYPT_p,
68
+ dkLen: ALGORITHM_KEY_SIZE
69
+ });
70
+ const plaintextRaw = utf8ToBytes(plaintext);
71
+ const ciphertextAndNonceAndSalt = concatBytes(
72
+ salt,
73
+ __privateMethod(this, _encrypt, encrypt_fn).call(this, plaintextRaw, key)
74
+ );
75
+ const encryptedData = byteArrayToBase64(ciphertextAndNonceAndSalt);
76
+ const encryptedPayload = {
77
+ v: "1",
78
+ t: "scrypt",
79
+ d: encryptedData,
80
+ o: {
81
+ N: SCRYPT_N,
82
+ r: SCRYPT_r,
83
+ p: SCRYPT_p,
84
+ dkLen: ALGORITHM_KEY_SIZE
85
+ },
86
+ saltLen: SCRYPT_SALT_SIZE
87
+ };
88
+ return JSON.stringify(encryptedPayload);
89
+ };
90
+ _decryptStringV1 = new WeakSet();
91
+ decryptStringV1_fn = function(data, password) {
92
+ const { o, d: base64CiphertextAndNonceAndSalt, saltLen } = data;
93
+ const ciphertextAndNonceAndSalt = base64ToByteArray(
94
+ base64CiphertextAndNonceAndSalt
95
+ );
96
+ const salt = ciphertextAndNonceAndSalt.slice(0, saltLen);
97
+ const ciphertextAndNonce = ciphertextAndNonceAndSalt.slice(
98
+ saltLen,
99
+ ciphertextAndNonceAndSalt.length
100
+ );
101
+ const { key } = __privateMethod(this, _getOrGenerateScryptKey, getOrGenerateScryptKey_fn).call(this, password, {
102
+ N: o.N,
103
+ r: o.r,
104
+ p: o.p,
105
+ dkLen: o.dkLen
106
+ }, salt);
107
+ return bytesToUtf8(__privateMethod(this, _decrypt, decrypt_fn).call(this, ciphertextAndNonce, key));
108
+ };
109
+ _encrypt = new WeakSet();
110
+ encrypt_fn = function(plaintext, key) {
111
+ const nonce = randomBytes(ALGORITHM_NONCE_SIZE);
112
+ const ciphertext = gcm(key, nonce).encrypt(plaintext);
113
+ return concatBytes(nonce, ciphertext);
114
+ };
115
+ _decrypt = new WeakSet();
116
+ decrypt_fn = function(ciphertextAndNonce, key) {
117
+ const nonce = ciphertextAndNonce.slice(0, ALGORITHM_NONCE_SIZE);
118
+ const ciphertext = ciphertextAndNonce.slice(
119
+ ALGORITHM_NONCE_SIZE,
120
+ ciphertextAndNonce.length
121
+ );
122
+ return gcm(key, nonce).decrypt(ciphertext);
123
+ };
124
+ _getOrGenerateScryptKey = new WeakSet();
125
+ getOrGenerateScryptKey_fn = function(password, o, salt) {
126
+ const hashedPassword = createSHA256Hash(password);
127
+ const cachedKey = salt ? getCachedKeyBySalt(hashedPassword, salt) : getAnyCachedKey(hashedPassword);
128
+ if (cachedKey) {
129
+ return {
130
+ key: cachedKey.key,
131
+ salt: cachedKey.salt
132
+ };
133
+ }
134
+ const newSalt = salt ?? randomBytes(SCRYPT_SALT_SIZE);
135
+ const newKey = scrypt(password, newSalt, {
136
+ N: o.N,
137
+ r: o.r,
138
+ p: o.p,
139
+ dkLen: o.dkLen
140
+ });
141
+ setCachedKey(hashedPassword, newSalt, newKey);
142
+ return {
143
+ key: newKey,
144
+ salt: newSalt
145
+ };
146
+ };
147
+ var encryption = new EncryptorDecryptor();
148
+ var encryption_default = encryption;
149
+ function createSHA256Hash(data) {
150
+ const hashedData = sha256(data);
151
+ return bytesToHex(hashedData);
152
+ }
153
+
154
+ export {
155
+ encryption_default,
156
+ createSHA256Hash
157
+ };
158
+ //# sourceMappingURL=chunk-QE2F5AZL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/controllers/user-storage/encryption/encryption.ts"],"sourcesContent":["import { gcm } from '@noble/ciphers/aes';\nimport { randomBytes } from '@noble/ciphers/webcrypto';\nimport { scrypt } from '@noble/hashes/scrypt';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { utf8ToBytes, concatBytes, bytesToHex } from '@noble/hashes/utils';\n\nimport { getAnyCachedKey, getCachedKeyBySalt, setCachedKey } from './cache';\nimport { base64ToByteArray, byteArrayToBase64, bytesToUtf8 } from './utils';\n\nexport type EncryptedPayload = {\n // version\n v: '1';\n\n // key derivation function algorithm - scrypt\n t: 'scrypt';\n\n // data\n d: string;\n\n // encryption options - scrypt\n o: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n N: number;\n r: number;\n p: number;\n dkLen: number;\n };\n\n // Salt options\n saltLen: number;\n};\n\n// Nonce/Key Sizes\nconst ALGORITHM_NONCE_SIZE = 12; // 12 bytes\nconst ALGORITHM_KEY_SIZE = 16; // 16 bytes\n\n// Scrypt settings\n// see: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#scrypt\nconst SCRYPT_SALT_SIZE = 16; // 16 bytes\nconst SCRYPT_N = 2 ** 17; // CPU/memory cost parameter (must be a power of 2, > 1)\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst SCRYPT_r = 8; // Block size parameter\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst SCRYPT_p = 1; // Parallelization parameter\n\nclass EncryptorDecryptor {\n encryptString(plaintext: string, password: string): string {\n try {\n return this.#encryptStringV1(plaintext, password);\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(`Unable to encrypt string - ${errorMessage}`);\n }\n }\n\n decryptString(encryptedDataStr: string, password: string): string {\n try {\n const encryptedData: EncryptedPayload = JSON.parse(encryptedDataStr);\n if (encryptedData.v === '1') {\n if (encryptedData.t === 'scrypt') {\n return this.#decryptStringV1(encryptedData, password);\n }\n }\n throw new Error(\n `Unsupported encrypted data payload - ${encryptedDataStr}`,\n );\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(`Unable to decrypt string - ${errorMessage}`);\n }\n }\n\n #encryptStringV1(plaintext: string, password: string): string {\n const { key, salt } = this.#getOrGenerateScryptKey(password, {\n N: SCRYPT_N,\n r: SCRYPT_r,\n p: SCRYPT_p,\n dkLen: ALGORITHM_KEY_SIZE,\n });\n\n // Encrypt and prepend salt.\n const plaintextRaw = utf8ToBytes(plaintext);\n const ciphertextAndNonceAndSalt = concatBytes(\n salt,\n this.#encrypt(plaintextRaw, key),\n );\n\n // Convert to Base64\n const encryptedData = byteArrayToBase64(ciphertextAndNonceAndSalt);\n\n const encryptedPayload: EncryptedPayload = {\n v: '1',\n t: 'scrypt',\n d: encryptedData,\n o: {\n N: SCRYPT_N,\n r: SCRYPT_r,\n p: SCRYPT_p,\n dkLen: ALGORITHM_KEY_SIZE,\n },\n saltLen: SCRYPT_SALT_SIZE,\n };\n\n return JSON.stringify(encryptedPayload);\n }\n\n #decryptStringV1(data: EncryptedPayload, password: string): string {\n const { o, d: base64CiphertextAndNonceAndSalt, saltLen } = data;\n\n // Decode the base64.\n const ciphertextAndNonceAndSalt = base64ToByteArray(\n base64CiphertextAndNonceAndSalt,\n );\n\n // Create buffers of salt and ciphertextAndNonce.\n const salt = ciphertextAndNonceAndSalt.slice(0, saltLen);\n const ciphertextAndNonce = ciphertextAndNonceAndSalt.slice(\n saltLen,\n ciphertextAndNonceAndSalt.length,\n );\n\n // Derive the key.\n const { key } = this.#getOrGenerateScryptKey(\n password,\n {\n N: o.N,\n r: o.r,\n p: o.p,\n dkLen: o.dkLen,\n },\n salt,\n );\n\n // Decrypt and return result.\n return bytesToUtf8(this.#decrypt(ciphertextAndNonce, key));\n }\n\n #encrypt(plaintext: Uint8Array, key: Uint8Array): Uint8Array {\n const nonce = randomBytes(ALGORITHM_NONCE_SIZE);\n\n // Encrypt and prepend nonce.\n const ciphertext = gcm(key, nonce).encrypt(plaintext);\n\n return concatBytes(nonce, ciphertext);\n }\n\n #decrypt(ciphertextAndNonce: Uint8Array, key: Uint8Array): Uint8Array {\n // Create buffers of nonce and ciphertext.\n const nonce = ciphertextAndNonce.slice(0, ALGORITHM_NONCE_SIZE);\n const ciphertext = ciphertextAndNonce.slice(\n ALGORITHM_NONCE_SIZE,\n ciphertextAndNonce.length,\n );\n\n // Decrypt and return result.\n return gcm(key, nonce).decrypt(ciphertext);\n }\n\n #getOrGenerateScryptKey(\n password: string,\n o: EncryptedPayload['o'],\n salt?: Uint8Array,\n ) {\n const hashedPassword = createSHA256Hash(password);\n const cachedKey = salt\n ? getCachedKeyBySalt(hashedPassword, salt)\n : getAnyCachedKey(hashedPassword);\n\n if (cachedKey) {\n return {\n key: cachedKey.key,\n salt: cachedKey.salt,\n };\n }\n\n const newSalt = salt ?? randomBytes(SCRYPT_SALT_SIZE);\n const newKey = scrypt(password, newSalt, {\n N: o.N,\n r: o.r,\n p: o.p,\n dkLen: o.dkLen,\n });\n setCachedKey(hashedPassword, newSalt, newKey);\n\n return {\n key: newKey,\n salt: newSalt,\n };\n }\n}\n\nconst encryption = new EncryptorDecryptor();\nexport default encryption;\n\n/**\n * Receive a SHA256 hash from a given string\n * @param data - input\n * @returns sha256 hash\n */\nexport function createSHA256Hash(data: string): string {\n const hashedData = sha256(data);\n return bytesToHex(hashedData);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,112 @@
1
+ import {
2
+ AuthenticationController
3
+ } from "./chunk-PRDECQM6.mjs";
4
+ import {
5
+ AUTH_LOGIN_ENDPOINT,
6
+ AUTH_NONCE_ENDPOINT,
7
+ OIDC_TOKENS_ENDPOINT
8
+ } from "./chunk-W7JFFMEZ.mjs";
9
+ import {
10
+ require_nock
11
+ } from "./chunk-JMU3OVPK.mjs";
12
+ import {
13
+ __export,
14
+ __toESM
15
+ } from "./chunk-26CCETCM.mjs";
16
+
17
+ // src/controllers/authentication/index.ts
18
+ var authentication_exports = {};
19
+ __export(authentication_exports, {
20
+ Controller: () => AuthenticationController,
21
+ Mocks: () => fixtures_exports
22
+ });
23
+
24
+ // src/controllers/authentication/__fixtures__/index.ts
25
+ var fixtures_exports = {};
26
+ __export(fixtures_exports, {
27
+ MOCK_ACCESS_TOKEN: () => MOCK_ACCESS_TOKEN,
28
+ MOCK_JWT: () => MOCK_JWT,
29
+ MOCK_LOGIN_RESPONSE: () => MOCK_LOGIN_RESPONSE,
30
+ MOCK_NONCE: () => MOCK_NONCE,
31
+ MOCK_NONCE_RESPONSE: () => MOCK_NONCE_RESPONSE,
32
+ MOCK_OATH_TOKEN_RESPONSE: () => MOCK_OATH_TOKEN_RESPONSE,
33
+ getMockAuthAccessTokenResponse: () => getMockAuthAccessTokenResponse,
34
+ getMockAuthLoginResponse: () => getMockAuthLoginResponse,
35
+ getMockAuthNonceResponse: () => getMockAuthNonceResponse,
36
+ mockEndpointAccessToken: () => mockEndpointAccessToken,
37
+ mockEndpointGetNonce: () => mockEndpointGetNonce,
38
+ mockEndpointLogin: () => mockEndpointLogin
39
+ });
40
+
41
+ // src/controllers/authentication/__fixtures__/mockResponses.ts
42
+ var MOCK_NONCE = "4cbfqzoQpcNxVImGv";
43
+ var MOCK_NONCE_RESPONSE = {
44
+ nonce: MOCK_NONCE
45
+ };
46
+ var getMockAuthNonceResponse = () => {
47
+ return {
48
+ url: AUTH_NONCE_ENDPOINT,
49
+ requestMethod: "GET",
50
+ response: MOCK_NONCE_RESPONSE
51
+ };
52
+ };
53
+ var MOCK_JWT = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
54
+ var MOCK_LOGIN_RESPONSE = {
55
+ token: MOCK_JWT,
56
+ // eslint-disable-next-line @typescript-eslint/naming-convention
57
+ expires_in: (/* @__PURE__ */ new Date()).toString(),
58
+ profile: {
59
+ // eslint-disable-next-line @typescript-eslint/naming-convention
60
+ identifier_id: "MOCK_IDENTIFIER",
61
+ // eslint-disable-next-line @typescript-eslint/naming-convention
62
+ profile_id: "MOCK_PROFILE_ID"
63
+ }
64
+ };
65
+ var getMockAuthLoginResponse = () => {
66
+ return {
67
+ url: AUTH_LOGIN_ENDPOINT,
68
+ requestMethod: "POST",
69
+ response: MOCK_LOGIN_RESPONSE
70
+ };
71
+ };
72
+ var MOCK_ACCESS_TOKEN = `MOCK_ACCESS_TOKEN-${MOCK_JWT}`;
73
+ var MOCK_OATH_TOKEN_RESPONSE = {
74
+ // eslint-disable-next-line @typescript-eslint/naming-convention
75
+ access_token: MOCK_ACCESS_TOKEN,
76
+ // eslint-disable-next-line @typescript-eslint/naming-convention
77
+ expires_in: (/* @__PURE__ */ new Date()).getTime()
78
+ };
79
+ var getMockAuthAccessTokenResponse = () => {
80
+ return {
81
+ url: OIDC_TOKENS_ENDPOINT,
82
+ requestMethod: "POST",
83
+ response: MOCK_OATH_TOKEN_RESPONSE
84
+ };
85
+ };
86
+
87
+ // src/controllers/authentication/__fixtures__/mockServices.ts
88
+ var import_nock = __toESM(require_nock());
89
+ var mockEndpointGetNonce = (mockReply) => {
90
+ const mockResponse = getMockAuthNonceResponse();
91
+ const reply = mockReply ?? { status: 200, body: mockResponse.response };
92
+ const mockNonceEndpoint = (0, import_nock.default)(mockResponse.url).get("").query(true).reply(reply.status, reply.body);
93
+ return mockNonceEndpoint;
94
+ };
95
+ var mockEndpointLogin = (mockReply) => {
96
+ const mockResponse = getMockAuthLoginResponse();
97
+ const reply = mockReply ?? { status: 200, body: mockResponse.response };
98
+ const mockLoginEndpoint = (0, import_nock.default)(mockResponse.url).post("").reply(reply.status, reply.body);
99
+ return mockLoginEndpoint;
100
+ };
101
+ var mockEndpointAccessToken = (mockReply) => {
102
+ const mockResponse = getMockAuthAccessTokenResponse();
103
+ const reply = mockReply ?? { status: 200, body: mockResponse.response };
104
+ const mockOidcTokensEndpoint = (0, import_nock.default)(mockResponse.url).post("").reply(reply.status, reply.body);
105
+ return mockOidcTokensEndpoint;
106
+ };
107
+
108
+ export {
109
+ fixtures_exports,
110
+ authentication_exports
111
+ };
112
+ //# sourceMappingURL=chunk-QHL6SQTC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/controllers/authentication/index.ts","../src/controllers/authentication/__fixtures__/index.ts","../src/controllers/authentication/__fixtures__/mockResponses.ts","../src/controllers/authentication/__fixtures__/mockServices.ts"],"sourcesContent":["import Controller from './AuthenticationController';\n\nexport { Controller };\nexport * from './AuthenticationController';\nexport * as Mocks from './__fixtures__';\n","export * from './mockResponses';\nexport * from './mockServices';\n","import type {\n LoginResponse,\n NonceResponse,\n OAuthTokenResponse,\n} from '../services';\nimport {\n AUTH_LOGIN_ENDPOINT,\n AUTH_NONCE_ENDPOINT,\n OIDC_TOKENS_ENDPOINT,\n} from '../services';\n\ntype MockResponse = {\n url: string;\n requestMethod: 'GET' | 'POST' | 'PUT';\n response: unknown;\n};\n\nexport const MOCK_NONCE = '4cbfqzoQpcNxVImGv';\nexport const MOCK_NONCE_RESPONSE: NonceResponse = {\n nonce: MOCK_NONCE,\n};\n\nexport const getMockAuthNonceResponse = () => {\n return {\n url: AUTH_NONCE_ENDPOINT,\n requestMethod: 'GET',\n response: MOCK_NONCE_RESPONSE,\n } satisfies MockResponse;\n};\n\nexport const MOCK_JWT =\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';\nexport const MOCK_LOGIN_RESPONSE: LoginResponse = {\n token: MOCK_JWT,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n expires_in: new Date().toString(),\n profile: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n identifier_id: 'MOCK_IDENTIFIER',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n profile_id: 'MOCK_PROFILE_ID',\n },\n};\n\nexport const getMockAuthLoginResponse = () => {\n return {\n url: AUTH_LOGIN_ENDPOINT,\n requestMethod: 'POST',\n response: MOCK_LOGIN_RESPONSE,\n } satisfies MockResponse;\n};\n\nexport const MOCK_ACCESS_TOKEN = `MOCK_ACCESS_TOKEN-${MOCK_JWT}`;\nexport const MOCK_OATH_TOKEN_RESPONSE: OAuthTokenResponse = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n access_token: MOCK_ACCESS_TOKEN,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n expires_in: new Date().getTime(),\n};\n\nexport const getMockAuthAccessTokenResponse = () => {\n return {\n url: OIDC_TOKENS_ENDPOINT,\n requestMethod: 'POST',\n response: MOCK_OATH_TOKEN_RESPONSE,\n } satisfies MockResponse;\n};\n","import nock from 'nock';\n\nimport {\n getMockAuthAccessTokenResponse,\n getMockAuthLoginResponse,\n getMockAuthNonceResponse,\n} from './mockResponses';\n\ntype MockReply = {\n status: nock.StatusCode;\n body?: nock.Body;\n};\n\nexport const mockEndpointGetNonce = (mockReply?: MockReply) => {\n const mockResponse = getMockAuthNonceResponse();\n const reply = mockReply ?? { status: 200, body: mockResponse.response };\n const mockNonceEndpoint = nock(mockResponse.url)\n .get('')\n .query(true)\n .reply(reply.status, reply.body);\n\n return mockNonceEndpoint;\n};\n\nexport const mockEndpointLogin = (mockReply?: MockReply) => {\n const mockResponse = getMockAuthLoginResponse();\n const reply = mockReply ?? { status: 200, body: mockResponse.response };\n const mockLoginEndpoint = nock(mockResponse.url)\n .post('')\n .reply(reply.status, reply.body);\n\n return mockLoginEndpoint;\n};\n\nexport const mockEndpointAccessToken = (mockReply?: MockReply) => {\n const mockResponse = getMockAuthAccessTokenResponse();\n const reply = mockReply ?? { status: 200, body: mockResponse.response };\n const mockOidcTokensEndpoint = nock(mockResponse.url)\n .post('')\n .reply(reply.status, reply.body);\n\n return mockOidcTokensEndpoint;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACiBO,IAAM,aAAa;AACnB,IAAM,sBAAqC;AAAA,EAChD,OAAO;AACT;AAEO,IAAM,2BAA2B,MAAM;AAC5C,SAAO;AAAA,IACL,KAAK;AAAA,IACL,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AACF;AAEO,IAAM,WACX;AACK,IAAM,sBAAqC;AAAA,EAChD,OAAO;AAAA;AAAA,EAEP,aAAY,oBAAI,KAAK,GAAE,SAAS;AAAA,EAChC,SAAS;AAAA;AAAA,IAEP,eAAe;AAAA;AAAA,IAEf,YAAY;AAAA,EACd;AACF;AAEO,IAAM,2BAA2B,MAAM;AAC5C,SAAO;AAAA,IACL,KAAK;AAAA,IACL,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AACF;AAEO,IAAM,oBAAoB,qBAAqB,QAAQ;AACvD,IAAM,2BAA+C;AAAA;AAAA,EAE1D,cAAc;AAAA;AAAA,EAEd,aAAY,oBAAI,KAAK,GAAE,QAAQ;AACjC;AAEO,IAAM,iCAAiC,MAAM;AAClD,SAAO;AAAA,IACL,KAAK;AAAA,IACL,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AACF;;;AClEA,kBAAiB;AAaV,IAAM,uBAAuB,CAAC,cAA0B;AAC7D,QAAM,eAAe,yBAAyB;AAC9C,QAAM,QAAQ,aAAa,EAAE,QAAQ,KAAK,MAAM,aAAa,SAAS;AACtE,QAAM,wBAAoB,YAAAA,SAAK,aAAa,GAAG,EAC5C,IAAI,EAAE,EACN,MAAM,IAAI,EACV,MAAM,MAAM,QAAQ,MAAM,IAAI;AAEjC,SAAO;AACT;AAEO,IAAM,oBAAoB,CAAC,cAA0B;AAC1D,QAAM,eAAe,yBAAyB;AAC9C,QAAM,QAAQ,aAAa,EAAE,QAAQ,KAAK,MAAM,aAAa,SAAS;AACtE,QAAM,wBAAoB,YAAAA,SAAK,aAAa,GAAG,EAC5C,KAAK,EAAE,EACP,MAAM,MAAM,QAAQ,MAAM,IAAI;AAEjC,SAAO;AACT;AAEO,IAAM,0BAA0B,CAAC,cAA0B;AAChE,QAAM,eAAe,+BAA+B;AACpD,QAAM,QAAQ,aAAa,EAAE,QAAQ,KAAK,MAAM,aAAa,SAAS;AACtE,QAAM,6BAAyB,YAAAA,SAAK,aAAa,GAAG,EACjD,KAAK,EAAE,EACP,MAAM,MAAM,QAAQ,MAAM,IAAI;AAEjC,SAAO;AACT;","names":["nock"]}
@@ -0,0 +1,79 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkDLXLU44Zjs = require('./chunk-DLXLU44Z.js');
4
+
5
+
6
+ var _chunkLHDVZNW5js = require('./chunk-LHDVZNW5.js');
7
+
8
+
9
+ var _chunk6TK7544Ljs = require('./chunk-6TK7544L.js');
10
+
11
+
12
+ var _chunkT77FC4PBjs = require('./chunk-T77FC4PB.js');
13
+
14
+
15
+
16
+
17
+
18
+
19
+ var _chunkPQ5T4GHYjs = require('./chunk-PQ5T4GHY.js');
20
+
21
+
22
+
23
+ var _chunkLUKNP4HMjs = require('./chunk-LUKNP4HM.js');
24
+
25
+
26
+
27
+ var _chunkGLDUXN2Tjs = require('./chunk-GLDUXN2T.js');
28
+
29
+
30
+
31
+
32
+
33
+ var _chunk4OMJ7A6Ajs = require('./chunk-4OMJ7A6A.js');
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+ var _chunkMBTBE4P5js = require('./chunk-MBTBE4P5.js');
43
+
44
+
45
+ var _chunkV46WVGWNjs = require('./chunk-V46WVGWN.js');
46
+
47
+ // src/sdk/index.ts
48
+ var sdk_exports = {};
49
+ _chunkV46WVGWNjs.__export.call(void 0, sdk_exports, {
50
+ AuthType: () => _chunkT77FC4PBjs.AuthType,
51
+ Encryption: () => _chunkGLDUXN2Tjs.Encryption,
52
+ Env: () => _chunk4OMJ7A6Ajs.Env,
53
+ JwtBearerAuth: () => _chunkDLXLU44Zjs.JwtBearerAuth,
54
+ MESSAGE_SIGNING_SNAP: () => _chunkPQ5T4GHYjs.MESSAGE_SIGNING_SNAP,
55
+ NonceRetrievalError: () => _chunkMBTBE4P5js.NonceRetrievalError,
56
+ NotFoundError: () => _chunkMBTBE4P5js.NotFoundError,
57
+ PairError: () => _chunkMBTBE4P5js.PairError,
58
+ Platform: () => _chunk4OMJ7A6Ajs.Platform,
59
+ SIWEJwtBearerAuth: () => _chunkLHDVZNW5js.SIWEJwtBearerAuth,
60
+ SNAP_ORIGIN: () => _chunkPQ5T4GHYjs.SNAP_ORIGIN,
61
+ SRPJwtBearerAuth: () => _chunk6TK7544Ljs.SRPJwtBearerAuth,
62
+ STORAGE_URL: () => _chunkLUKNP4HMjs.STORAGE_URL,
63
+ SignInError: () => _chunkMBTBE4P5js.SignInError,
64
+ UnsupportedAuthTypeError: () => _chunkMBTBE4P5js.UnsupportedAuthTypeError,
65
+ UserStorage: () => _chunkLUKNP4HMjs.UserStorage,
66
+ UserStorageError: () => _chunkMBTBE4P5js.UserStorageError,
67
+ ValidationError: () => _chunkMBTBE4P5js.ValidationError,
68
+ connectSnap: () => _chunkPQ5T4GHYjs.connectSnap,
69
+ createSHA256Hash: () => _chunkGLDUXN2Tjs.createSHA256Hash,
70
+ getEnvUrls: () => _chunk4OMJ7A6Ajs.getEnvUrls,
71
+ getOidcClientId: () => _chunk4OMJ7A6Ajs.getOidcClientId,
72
+ getSnap: () => _chunkPQ5T4GHYjs.getSnap,
73
+ getSnaps: () => _chunkPQ5T4GHYjs.getSnaps
74
+ });
75
+
76
+
77
+
78
+ exports.sdk_exports = sdk_exports;
79
+ //# sourceMappingURL=chunk-QILE6KIE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","sourcesContent":["export * from './authentication';\nexport * from './user-storage';\nexport * from './env';\nexport * from './errors';\nexport * from './encryption';\nexport * from './utils/messaging-signing-snap-requests';\n"]}
@@ -8,4 +8,4 @@ var AuthType = /* @__PURE__ */ ((AuthType2) => {
8
8
 
9
9
 
10
10
  exports.AuthType = AuthType;
11
- //# sourceMappingURL=chunk-CFST6GWE.js.map
11
+ //# sourceMappingURL=chunk-T77FC4PB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/authentication-jwt-bearer/types.ts"],"names":["AuthType"],"mappings":";AAEO,IAAW,WAAX,kBAAWA,cAAX;AAGL,EAAAA,UAAA,SAAM;AAGN,EAAAA,UAAA,UAAO;AANS,SAAAA;AAAA,GAAA","sourcesContent":["import type { Env, Platform } from '../env';\n\nexport const enum AuthType {\n /* sign in using a private key derived from your secret recovery phrase (SRP). \n Uses message signing snap to perform this operation */\n SRP = 'SRP',\n\n /* sign in with Ethereum */\n SiWE = 'SiWE',\n}\n\nexport type AuthConfig = {\n env: Env;\n platform: Platform;\n type: AuthType;\n};\n\nexport type AccessToken = {\n /**\n * The JWT Access Token\n */\n accessToken: string;\n /**\n * Expiration in seconds\n */\n expiresIn: number;\n /**\n * Date in milliseconds\n */\n obtainedAt: number;\n};\n\nexport type UserProfile = {\n /**\n * The \"Identifier\" used to log in with.\n */\n identifierId: string;\n /**\n * The Unique profile for a logged in user. A Profile can be logged in via multiple Identifiers\n */\n profileId: string;\n /**\n * Server MetaMetrics ID. Allows grouping of user events cross platform.\n */\n metaMetricsId: string;\n};\n\nexport type LoginResponse = {\n token: AccessToken;\n profile: UserProfile;\n};\n\nexport type IBaseAuth = {\n getAccessToken: () => Promise<string>;\n getUserProfile: () => Promise<UserProfile>;\n getIdentifier: () => Promise<string>;\n signMessage: (message: string) => Promise<string>;\n};\n\nexport type AuthStorageOptions = {\n getLoginResponse: () => Promise<LoginResponse | null>;\n setLoginResponse: (val: LoginResponse) => Promise<void>;\n};\n\nexport type AuthSigningOptions = {\n signMessage: (message: string) => Promise<string>;\n getIdentifier: () => Promise<string>;\n};\n\nexport type ErrorMessage = {\n message: string;\n error: string;\n};\n\nexport type Pair = {\n identifier: string;\n encryptedStorageKey: string;\n identifierType: 'SIWE' | 'SRP';\n signMessage: (message: string) => Promise<string>;\n};\n"]}
@@ -11,6 +11,12 @@ var SignInError = class extends Error {
11
11
  this.name = "SignInError";
12
12
  }
13
13
  };
14
+ var PairError = class extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = "PairError";
18
+ }
19
+ };
14
20
  var UserStorageError = class extends Error {
15
21
  constructor(message) {
16
22
  super(message);
@@ -39,9 +45,10 @@ var NotFoundError = class extends Error {
39
45
  export {
40
46
  NonceRetrievalError,
41
47
  SignInError,
48
+ PairError,
42
49
  UserStorageError,
43
50
  ValidationError,
44
51
  UnsupportedAuthTypeError,
45
52
  NotFoundError
46
53
  };
47
- //# sourceMappingURL=chunk-BHVT2QEA.mjs.map
54
+ //# sourceMappingURL=chunk-TFFQFIJV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/errors.ts"],"sourcesContent":["export class NonceRetrievalError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NonceRetrievalError';\n }\n}\n\nexport class SignInError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SignInError';\n }\n}\n\nexport class PairError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PairError';\n }\n}\n\nexport class UserStorageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UserStorageError';\n }\n}\n\nexport class ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\nexport class UnsupportedAuthTypeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UnsupportedAuthTypeError';\n }\n}\n\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NotFoundError';\n }\n}\n"],"mappings":";AAAO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+ var _chunkPCOIRDTOjs = require('./chunk-PCOIRDTO.js');
5
+
6
+ // src/controllers/user-storage/encryption/cache.ts
7
+ var MAX_PASSWORD_CACHES = 3;
8
+ var MAX_SALT_CACHES = 10;
9
+ var inMemCachedKDF = {};
10
+ var getPasswordCache = (hashedPassword) => {
11
+ inMemCachedKDF[hashedPassword] ?? (inMemCachedKDF[hashedPassword] = /* @__PURE__ */ new Map());
12
+ return inMemCachedKDF[hashedPassword];
13
+ };
14
+ function getCachedKeyBySalt(hashedPassword, salt) {
15
+ const cache = getPasswordCache(hashedPassword);
16
+ const base64Salt = _chunkPCOIRDTOjs.byteArrayToBase64.call(void 0, salt);
17
+ const cachedKey = cache.get(base64Salt);
18
+ if (!cachedKey) {
19
+ return void 0;
20
+ }
21
+ return {
22
+ salt,
23
+ base64Salt,
24
+ key: cachedKey
25
+ };
26
+ }
27
+ function getAnyCachedKey(hashedPassword) {
28
+ const cache = getPasswordCache(hashedPassword);
29
+ const cachedEntry = cache.entries().next().value;
30
+ if (!cachedEntry) {
31
+ return void 0;
32
+ }
33
+ const base64Salt = cachedEntry[0];
34
+ const bytesSalt = _chunkPCOIRDTOjs.base64ToByteArray.call(void 0, base64Salt);
35
+ return {
36
+ salt: bytesSalt,
37
+ base64Salt,
38
+ key: cachedEntry[1]
39
+ };
40
+ }
41
+ function setCachedKey(hashedPassword, salt, key) {
42
+ if (Object.keys(inMemCachedKDF).length > MAX_PASSWORD_CACHES) {
43
+ inMemCachedKDF = {};
44
+ }
45
+ const cache = getPasswordCache(hashedPassword);
46
+ const base64Salt = _chunkPCOIRDTOjs.byteArrayToBase64.call(void 0, salt);
47
+ if (cache.size > MAX_SALT_CACHES) {
48
+ cache.clear();
49
+ }
50
+ cache.set(base64Salt, key);
51
+ }
52
+
53
+
54
+
55
+
56
+
57
+ exports.getCachedKeyBySalt = getCachedKeyBySalt; exports.getAnyCachedKey = getAnyCachedKey; exports.setCachedKey = setCachedKey;
58
+ //# sourceMappingURL=chunk-UAXWZN5J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/controllers/user-storage/encryption/cache.ts"],"names":[],"mappings":";;;;;;AAQA,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB;AAQxB,IAAI,iBAAuC,CAAC;AAC5C,IAAM,mBAAmB,CAAC,mBAA2B;AACnD,sEAAmC,oBAAI,IAAI;AAC3C,SAAO,eAAe,cAAc;AACtC;AASO,SAAS,mBACd,gBACA,MACyB;AACzB,QAAM,QAAQ,iBAAiB,cAAc;AAC7C,QAAM,aAAa,kBAAkB,IAAI;AACzC,QAAM,YAAY,MAAM,IAAI,UAAU;AACtC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AACF;AAQO,SAAS,gBACd,gBACyB;AACzB,QAAM,QAAQ,iBAAiB,cAAc;AAG7C,QAAM,cAAgD,MACnD,QAAQ,EACR,KAAK,EAAE;AAEV,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,YAAY,CAAC;AAChC,QAAM,YAAY,kBAAkB,UAAU;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,KAAK,YAAY,CAAC;AAAA,EACpB;AACF;AAUO,SAAS,aACd,gBACA,MACA,KACM;AAEN,MAAI,OAAO,KAAK,cAAc,EAAE,SAAS,qBAAqB;AAC5D,qBAAiB,CAAC;AAAA,EACpB;AAEA,QAAM,QAAQ,iBAAiB,cAAc;AAC7C,QAAM,aAAa,kBAAkB,IAAI;AAGzC,MAAI,MAAM,OAAO,iBAAiB;AAChC,UAAM,MAAM;AAAA,EACd;AAEA,QAAM,IAAI,YAAY,GAAG;AAC3B","sourcesContent":["import { base64ToByteArray, byteArrayToBase64 } from './utils';\n\ntype CachedEntry = {\n salt: Uint8Array;\n base64Salt: string;\n key: Uint8Array;\n};\n\nconst MAX_PASSWORD_CACHES = 3;\nconst MAX_SALT_CACHES = 10;\n\n/**\n * In-Memory Caching derived keys based from a given salt and password.\n */\ntype PasswordMemCachedKDF = {\n [hashedPassword: string]: Map<string, Uint8Array>;\n};\nlet inMemCachedKDF: PasswordMemCachedKDF = {};\nconst getPasswordCache = (hashedPassword: string) => {\n inMemCachedKDF[hashedPassword] ??= new Map();\n return inMemCachedKDF[hashedPassword];\n};\n\n/**\n * Returns a given cached derived key from a hashed password and salt\n *\n * @param hashedPassword - hashed password for cache lookup\n * @param salt - provide salt to receive cached key\n * @returns cached key\n */\nexport function getCachedKeyBySalt(\n hashedPassword: string,\n salt: Uint8Array,\n): CachedEntry | undefined {\n const cache = getPasswordCache(hashedPassword);\n const base64Salt = byteArrayToBase64(salt);\n const cachedKey = cache.get(base64Salt);\n if (!cachedKey) {\n return undefined;\n }\n\n return {\n salt,\n base64Salt,\n key: cachedKey,\n };\n}\n\n/**\n * Gets any cached key for a given hashed password\n *\n * @param hashedPassword - hashed password for cache lookup\n * @returns any (the first) cached key\n */\nexport function getAnyCachedKey(\n hashedPassword: string,\n): CachedEntry | undefined {\n const cache = getPasswordCache(hashedPassword);\n\n // Takes 1 item from an Iterator via Map.entries()\n const cachedEntry: [string, Uint8Array] | undefined = cache\n .entries()\n .next().value;\n\n if (!cachedEntry) {\n return undefined;\n }\n\n const base64Salt = cachedEntry[0];\n const bytesSalt = base64ToByteArray(base64Salt);\n return {\n salt: bytesSalt,\n base64Salt,\n key: cachedEntry[1],\n };\n}\n\n/**\n * Sets a key to the in memory cache.\n * We have set an arbitrary size of 10 cached keys per hashed password.\n *\n * @param hashedPassword - hashed password for cache lookup\n * @param salt - salt to set new derived key\n * @param key - derived key we are setting\n */\nexport function setCachedKey(\n hashedPassword: string,\n salt: Uint8Array,\n key: Uint8Array,\n): void {\n // Max password caches\n if (Object.keys(inMemCachedKDF).length > MAX_PASSWORD_CACHES) {\n inMemCachedKDF = {};\n }\n\n const cache = getPasswordCache(hashedPassword);\n const base64Salt = byteArrayToBase64(salt);\n\n // Max salt caches\n if (cache.size > MAX_SALT_CACHES) {\n cache.clear();\n }\n\n cache.set(base64Salt, key);\n}\n"]}
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  createSHA256Hash,
3
3
  encryption_default
4
- } from "./chunk-UMKBFFZ5.mjs";
4
+ } from "./chunk-VTM5T7Y4.mjs";
5
5
  import {
6
6
  getEnvUrls
7
- } from "./chunk-WJRV2JCX.mjs";
7
+ } from "./chunk-GLS4QZF6.mjs";
8
8
  import {
9
9
  NotFoundError,
10
10
  UserStorageError,
11
11
  ValidationError
12
- } from "./chunk-BHVT2QEA.mjs";
12
+ } from "./chunk-TFFQFIJV.mjs";
13
13
  import {
14
14
  __privateAdd,
15
15
  __privateMethod
16
- } from "./chunk-XUI43LEZ.mjs";
16
+ } from "./chunk-26CCETCM.mjs";
17
17
 
18
18
  // src/sdk/user-storage.ts
19
19
  var STORAGE_URL = (env, feature, entry) => `${getEnvUrls(env).userStorageApiUrl}/api/v1/userstorage/${feature}/${entry}`;
@@ -23,6 +23,8 @@ var UserStorage = class {
23
23
  __privateAdd(this, _upsertUserStorage);
24
24
  __privateAdd(this, _getUserStorage);
25
25
  __privateAdd(this, _createEntryKey);
26
+ // TODO: Either fix this lint violation or explain why it's necessary to ignore.
27
+ // eslint-disable-next-line @typescript-eslint/naming-convention
26
28
  __privateAdd(this, _getAuthorizationHeader);
27
29
  this.env = config.env;
28
30
  this.config = config;
@@ -139,4 +141,4 @@ export {
139
141
  STORAGE_URL,
140
142
  UserStorage
141
143
  };
142
- //# sourceMappingURL=chunk-CZ7YK35S.mjs.map
144
+ //# sourceMappingURL=chunk-UEZI2POO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sdk/user-storage.ts"],"sourcesContent":["import type { IBaseAuth } from './authentication-jwt-bearer/types';\nimport encryption, { createSHA256Hash } from './encryption';\nimport type { Env } from './env';\nimport { getEnvUrls } from './env';\nimport { NotFoundError, UserStorageError, ValidationError } from './errors';\n\nexport const STORAGE_URL = (env: Env, feature: string, entry: string) =>\n `${getEnvUrls(env).userStorageApiUrl}/api/v1/userstorage/${feature}/${entry}`;\n\nexport type UserStorageConfig = {\n env: Env;\n auth: Pick<IBaseAuth, 'getAccessToken' | 'getUserProfile' | 'signMessage'>;\n};\n\nexport type StorageOptions = {\n getStorageKey: () => Promise<string | null>;\n setStorageKey: (val: string) => Promise<void>;\n};\n\nexport type UserStorageOptions = {\n storage?: StorageOptions;\n};\n\ntype ErrorMessage = {\n message: string;\n error: string;\n};\n\nexport class UserStorage {\n protected config: UserStorageConfig;\n\n protected options: UserStorageOptions;\n\n protected env: Env;\n\n constructor(config: UserStorageConfig, options: UserStorageOptions) {\n this.env = config.env;\n this.config = config;\n this.options = options;\n }\n\n async setItem(feature: string, key: string, value: string): Promise<void> {\n if (!feature.trim() || !key.trim()) {\n throw new ValidationError('feature or key cannot be empty strings');\n }\n await this.#upsertUserStorage(feature, key, value);\n }\n\n async getItem(feature: string, key: string): Promise<string> {\n if (!feature.trim() || !key.trim()) {\n throw new ValidationError('feature or key cannot be empty strings');\n }\n return this.#getUserStorage(feature, key);\n }\n\n async getStorageKey(): Promise<string> {\n const storageKey = await this.options.storage?.getStorageKey();\n if (storageKey) {\n return storageKey;\n }\n\n const userProfile = await this.config.auth.getUserProfile();\n const storageKeySignature = await this.config.auth.signMessage(\n `metamask:${userProfile.profileId}`,\n );\n const hashedStorageKeySignature = createSHA256Hash(storageKeySignature);\n await this.options.storage?.setStorageKey(hashedStorageKeySignature);\n return hashedStorageKeySignature;\n }\n\n async #upsertUserStorage(\n feature: string,\n key: string,\n data: string,\n ): Promise<void> {\n try {\n const headers = await this.#getAuthorizationHeader();\n const storageKey = await this.getStorageKey();\n const encryptedData = encryption.encryptString(data, storageKey);\n const url = new URL(\n STORAGE_URL(this.env, feature, this.#createEntryKey(key, storageKey)),\n );\n\n const response = await fetch(url.toString(), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({ data: encryptedData }),\n });\n\n if (!response.ok) {\n const responseBody: ErrorMessage = await response.json().catch(() => ({\n message: 'unknown',\n error: 'unknown',\n }));\n throw new Error(\n `HTTP error message: ${responseBody.message}, error: ${responseBody.error}`,\n );\n }\n } catch (e) {\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n throw new UserStorageError(\n `failed to upsert user storage for feature '${feature}' and key '${key}'. ${errorMessage}`,\n );\n }\n }\n\n async #getUserStorage(feature: string, key: string): Promise<string> {\n try {\n const headers = await this.#getAuthorizationHeader();\n const storageKey = await this.getStorageKey();\n const url = new URL(\n STORAGE_URL(this.env, feature, this.#createEntryKey(key, storageKey)),\n );\n\n const response = await fetch(url.toString(), {\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n\n if (response.status === 404) {\n throw new NotFoundError(\n `feature/key set not found for feature '${feature}' and key '${key}'.`,\n );\n }\n\n if (!response.ok) {\n const responseBody = (await response.json()) as ErrorMessage;\n throw new Error(\n `HTTP error message: ${responseBody.message}, error: ${responseBody.error}`,\n );\n }\n\n const { Data: encryptedData } = await response.json();\n return encryption.decryptString(encryptedData, storageKey);\n } catch (e) {\n if (e instanceof NotFoundError) {\n throw e;\n }\n\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n\n throw new UserStorageError(\n `failed to get user storage for feature '${feature}' and key '${key}'. ${errorMessage}`,\n );\n }\n }\n\n #createEntryKey(key: string, storageKey: string): string {\n const hashedKey = createSHA256Hash(key + storageKey);\n return hashedKey;\n }\n\n async #getAuthorizationHeader(): Promise<{ Authorization: string }> {\n const accessToken = await this.config.auth.getAccessToken();\n return { Authorization: `Bearer ${accessToken}` };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/sdk/user-storage.ts"],"sourcesContent":["import type { IBaseAuth } from './authentication-jwt-bearer/types';\nimport encryption, { createSHA256Hash } from './encryption';\nimport type { Env } from './env';\nimport { getEnvUrls } from './env';\nimport { NotFoundError, UserStorageError, ValidationError } from './errors';\n\nexport const STORAGE_URL = (env: Env, feature: string, entry: string) =>\n `${getEnvUrls(env).userStorageApiUrl}/api/v1/userstorage/${feature}/${entry}`;\n\nexport type UserStorageConfig = {\n env: Env;\n auth: Pick<IBaseAuth, 'getAccessToken' | 'getUserProfile' | 'signMessage'>;\n};\n\nexport type StorageOptions = {\n getStorageKey: () => Promise<string | null>;\n setStorageKey: (val: string) => Promise<void>;\n};\n\nexport type UserStorageOptions = {\n storage?: StorageOptions;\n};\n\ntype ErrorMessage = {\n message: string;\n error: string;\n};\n\nexport class UserStorage {\n protected config: UserStorageConfig;\n\n protected options: UserStorageOptions;\n\n protected env: Env;\n\n constructor(config: UserStorageConfig, options: UserStorageOptions) {\n this.env = config.env;\n this.config = config;\n this.options = options;\n }\n\n async setItem(feature: string, key: string, value: string): Promise<void> {\n if (!feature.trim() || !key.trim()) {\n throw new ValidationError('feature or key cannot be empty strings');\n }\n await this.#upsertUserStorage(feature, key, value);\n }\n\n async getItem(feature: string, key: string): Promise<string> {\n if (!feature.trim() || !key.trim()) {\n throw new ValidationError('feature or key cannot be empty strings');\n }\n return this.#getUserStorage(feature, key);\n }\n\n async getStorageKey(): Promise<string> {\n const storageKey = await this.options.storage?.getStorageKey();\n if (storageKey) {\n return storageKey;\n }\n\n const userProfile = await this.config.auth.getUserProfile();\n const storageKeySignature = await this.config.auth.signMessage(\n `metamask:${userProfile.profileId}`,\n );\n const hashedStorageKeySignature = createSHA256Hash(storageKeySignature);\n await this.options.storage?.setStorageKey(hashedStorageKeySignature);\n return hashedStorageKeySignature;\n }\n\n async #upsertUserStorage(\n feature: string,\n key: string,\n data: string,\n ): Promise<void> {\n try {\n const headers = await this.#getAuthorizationHeader();\n const storageKey = await this.getStorageKey();\n const encryptedData = encryption.encryptString(data, storageKey);\n const url = new URL(\n STORAGE_URL(this.env, feature, this.#createEntryKey(key, storageKey)),\n );\n\n const response = await fetch(url.toString(), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({ data: encryptedData }),\n });\n\n if (!response.ok) {\n const responseBody: ErrorMessage = await response.json().catch(() => ({\n message: 'unknown',\n error: 'unknown',\n }));\n throw new Error(\n `HTTP error message: ${responseBody.message}, error: ${responseBody.error}`,\n );\n }\n } catch (e) {\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n throw new UserStorageError(\n `failed to upsert user storage for feature '${feature}' and key '${key}'. ${errorMessage}`,\n );\n }\n }\n\n async #getUserStorage(feature: string, key: string): Promise<string> {\n try {\n const headers = await this.#getAuthorizationHeader();\n const storageKey = await this.getStorageKey();\n const url = new URL(\n STORAGE_URL(this.env, feature, this.#createEntryKey(key, storageKey)),\n );\n\n const response = await fetch(url.toString(), {\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n\n if (response.status === 404) {\n throw new NotFoundError(\n `feature/key set not found for feature '${feature}' and key '${key}'.`,\n );\n }\n\n if (!response.ok) {\n const responseBody = (await response.json()) as ErrorMessage;\n throw new Error(\n `HTTP error message: ${responseBody.message}, error: ${responseBody.error}`,\n );\n }\n\n const { Data: encryptedData } = await response.json();\n return encryption.decryptString(encryptedData, storageKey);\n } catch (e) {\n if (e instanceof NotFoundError) {\n throw e;\n }\n\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n\n throw new UserStorageError(\n `failed to get user storage for feature '${feature}' and key '${key}'. ${errorMessage}`,\n );\n }\n }\n\n #createEntryKey(key: string, storageKey: string): string {\n const hashedKey = createSHA256Hash(key + storageKey);\n return hashedKey;\n }\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n async #getAuthorizationHeader(): Promise<{ Authorization: string }> {\n const accessToken = await this.config.auth.getAccessToken();\n return { Authorization: `Bearer ${accessToken}` };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAMO,IAAM,cAAc,CAAC,KAAU,SAAiB,UACrD,GAAG,WAAW,GAAG,EAAE,iBAAiB,uBAAuB,OAAO,IAAI,KAAK;AAP7E;AA4BO,IAAM,cAAN,MAAkB;AAAA,EAOvB,YAAY,QAA2B,SAA6B;AAmCpE,uBAAM;AAyCN,uBAAM;AA6CN;AAOA;AAAA;AAAA,uBAAM;AA/HJ,SAAK,MAAM,OAAO;AAClB,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,QAAQ,SAAiB,KAAa,OAA8B;AACxE,QAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,KAAK,GAAG;AAClC,YAAM,IAAI,gBAAgB,wCAAwC;AAAA,IACpE;AACA,UAAM,sBAAK,0CAAL,WAAwB,SAAS,KAAK;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAQ,SAAiB,KAA8B;AAC3D,QAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,KAAK,GAAG;AAClC,YAAM,IAAI,gBAAgB,wCAAwC;AAAA,IACpE;AACA,WAAO,sBAAK,oCAAL,WAAqB,SAAS;AAAA,EACvC;AAAA,EAEA,MAAM,gBAAiC;AACrC,UAAM,aAAa,MAAM,KAAK,QAAQ,SAAS,cAAc;AAC7D,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,MAAM,KAAK,OAAO,KAAK,eAAe;AAC1D,UAAM,sBAAsB,MAAM,KAAK,OAAO,KAAK;AAAA,MACjD,YAAY,YAAY,SAAS;AAAA,IACnC;AACA,UAAM,4BAA4B,iBAAiB,mBAAmB;AACtE,UAAM,KAAK,QAAQ,SAAS,cAAc,yBAAyB;AACnE,WAAO;AAAA,EACT;AAmGF;AAjGQ;AAAA,uBAAkB,eACtB,SACA,KACA,MACe;AACf,MAAI;AACF,UAAM,UAAU,MAAM,sBAAK,oDAAL;AACtB,UAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,UAAM,gBAAgB,mBAAW,cAAc,MAAM,UAAU;AAC/D,UAAM,MAAM,IAAI;AAAA,MACd,YAAY,KAAK,KAAK,SAAS,sBAAK,oCAAL,WAAqB,KAAK,WAAW;AAAA,IACtE;AAEA,UAAM,WAAW,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MAC3C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACL;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAAA,IAC9C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,eAA6B,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO;AAAA,QACpE,SAAS;AAAA,QACT,OAAO;AAAA,MACT,EAAE;AACF,YAAM,IAAI;AAAA,QACR,uBAAuB,aAAa,OAAO,YAAY,aAAa,KAAK;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AAEV,UAAM,eACJ,aAAa,QAAQ,EAAE,UAAU,KAAK,UAAU,KAAK,EAAE;AACzD,UAAM,IAAI;AAAA,MACR,8CAA8C,OAAO,cAAc,GAAG,MAAM,YAAY;AAAA,IAC1F;AAAA,EACF;AACF;AAEM;AAAA,oBAAe,eAAC,SAAiB,KAA8B;AACnE,MAAI;AACF,UAAM,UAAU,MAAM,sBAAK,oDAAL;AACtB,UAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,UAAM,MAAM,IAAI;AAAA,MACd,YAAY,KAAK,KAAK,SAAS,sBAAK,oCAAL,WAAqB,KAAK,WAAW;AAAA,IACtE;AAEA,UAAM,WAAW,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MAC3C,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAED,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI;AAAA,QACR,0CAA0C,OAAO,cAAc,GAAG;AAAA,MACpE;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,eAAgB,MAAM,SAAS,KAAK;AAC1C,YAAM,IAAI;AAAA,QACR,uBAAuB,aAAa,OAAO,YAAY,aAAa,KAAK;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,EAAE,MAAM,cAAc,IAAI,MAAM,SAAS,KAAK;AACpD,WAAO,mBAAW,cAAc,eAAe,UAAU;AAAA,EAC3D,SAAS,GAAG;AACV,QAAI,aAAa,eAAe;AAC9B,YAAM;AAAA,IACR;AAGA,UAAM,eACJ,aAAa,QAAQ,EAAE,UAAU,KAAK,UAAU,KAAK,EAAE;AAEzD,UAAM,IAAI;AAAA,MACR,2CAA2C,OAAO,cAAc,GAAG,MAAM,YAAY;AAAA,IACvF;AAAA,EACF;AACF;AAEA;AAAA,oBAAe,SAAC,KAAa,YAA4B;AACvD,QAAM,YAAY,iBAAiB,MAAM,UAAU;AACnD,SAAO;AACT;AAIM;AAAA,4BAAuB,iBAAuC;AAClE,QAAM,cAAc,MAAM,KAAK,OAAO,KAAK,eAAe;AAC1D,SAAO,EAAE,eAAe,UAAU,WAAW,GAAG;AAClD;","names":[]}
@@ -3,25 +3,23 @@ import {
3
3
  authenticate,
4
4
  authorizeOIDC,
5
5
  getNonce
6
- } from "./chunk-CYGZ4WLJ.mjs";
6
+ } from "./chunk-7VMXBDXN.mjs";
7
7
  import {
8
8
  ValidationError
9
- } from "./chunk-BHVT2QEA.mjs";
10
- import {
11
- SESSION_LIFETIME_MS
12
- } from "./chunk-KKRIOEXD.mjs";
9
+ } from "./chunk-TFFQFIJV.mjs";
13
10
  import {
14
11
  __privateAdd,
15
12
  __privateGet,
16
13
  __privateMethod,
17
14
  __privateSet
18
- } from "./chunk-XUI43LEZ.mjs";
15
+ } from "./chunk-26CCETCM.mjs";
19
16
 
20
17
  // src/sdk/authentication-jwt-bearer/flow-siwe.ts
21
18
  import { SiweMessage } from "siwe";
22
19
  var _config, _options, _signer, _getAuthSession, getAuthSession_fn, _login, login_fn, _createSiWELoginRawMessage, createSiWELoginRawMessage_fn, _assertSigner, assertSigner_fn;
23
20
  var SIWEJwtBearerAuth = class {
24
21
  constructor(config, options) {
22
+ // convert expiresIn from seconds to milliseconds and use 90% of expiresIn
25
23
  __privateAdd(this, _getAuthSession);
26
24
  __privateAdd(this, _login);
27
25
  __privateAdd(this, _createSiWELoginRawMessage);
@@ -71,7 +69,8 @@ getAuthSession_fn = async function() {
71
69
  }
72
70
  const currentTime = Date.now();
73
71
  const sessionAge = currentTime - auth.token.obtainedAt;
74
- if (sessionAge < SESSION_LIFETIME_MS) {
72
+ const refreshThreshold = auth.token.expiresIn * 1e3 * 0.9;
73
+ if (sessionAge < refreshThreshold) {
75
74
  return auth;
76
75
  }
77
76
  return null;
@@ -91,7 +90,8 @@ login_fn = async function() {
91
90
  );
92
91
  const tokenResponse = await authorizeOIDC(
93
92
  authResponse.token,
94
- __privateGet(this, _config).env
93
+ __privateGet(this, _config).env,
94
+ __privateGet(this, _config).platform
95
95
  );
96
96
  const result = {
97
97
  profile: authResponse.profile,
@@ -123,4 +123,4 @@ assertSigner_fn = function(signer) {
123
123
  export {
124
124
  SIWEJwtBearerAuth
125
125
  };
126
- //# sourceMappingURL=chunk-4NGEEDGV.mjs.map
126
+ //# sourceMappingURL=chunk-UWRKMJBI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/authentication-jwt-bearer/flow-siwe.ts"],"sourcesContent":["import { SiweMessage } from 'siwe';\n\nimport { ValidationError } from '../errors';\nimport {\n SIWE_LOGIN_URL,\n authenticate,\n authorizeOIDC,\n getNonce,\n} from './services';\nimport type {\n AuthConfig,\n AuthStorageOptions,\n AuthType,\n IBaseAuth,\n LoginResponse,\n UserProfile,\n} from './types';\n\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype JwtBearerAuth_SIWE_Options = {\n storage: AuthStorageOptions;\n};\n\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype JwtBearerAuth_SIWE_Signer = {\n address: string;\n chainId: number;\n signMessage: (message: string) => Promise<string>;\n domain: string;\n};\n\nexport class SIWEJwtBearerAuth implements IBaseAuth {\n #config: AuthConfig;\n\n #options: JwtBearerAuth_SIWE_Options;\n\n #signer: JwtBearerAuth_SIWE_Signer | undefined;\n\n constructor(\n config: AuthConfig & { type: AuthType.SiWE },\n options: JwtBearerAuth_SIWE_Options,\n ) {\n this.#config = config;\n this.#options = options;\n }\n\n async getAccessToken(): Promise<string> {\n const session = await this.#getAuthSession();\n if (session) {\n return session.token.accessToken;\n }\n\n const loginResponse = await this.#login();\n return loginResponse.token.accessToken;\n }\n\n async getUserProfile(): Promise<UserProfile> {\n const session = await this.#getAuthSession();\n if (session) {\n return session.profile;\n }\n\n const loginResponse = await this.#login();\n return loginResponse.profile;\n }\n\n async getIdentifier(): Promise<string> {\n this.#assertSigner(this.#signer);\n return this.#signer.address;\n }\n\n async signMessage(message: string): Promise<string> {\n this.#assertSigner(this.#signer);\n return await this.#signer.signMessage(message);\n }\n\n prepare(signer: JwtBearerAuth_SIWE_Signer) {\n this.#signer = signer;\n }\n\n // convert expiresIn from seconds to milliseconds and use 90% of expiresIn\n async #getAuthSession(): Promise<LoginResponse | null> {\n const auth = await this.#options.storage.getLoginResponse();\n if (!auth) {\n return null;\n }\n\n const currentTime = Date.now();\n const sessionAge = currentTime - auth.token.obtainedAt;\n const refreshThreshold = auth.token.expiresIn * 1000 * 0.9;\n\n if (sessionAge < refreshThreshold) {\n return auth;\n }\n return null;\n }\n\n async #login(): Promise<LoginResponse> {\n this.#assertSigner(this.#signer);\n\n // Nonce\n const address = await this.getIdentifier();\n const nonceRes = await getNonce(address, this.#config.env);\n const rawMessage = this.#createSiWELoginRawMessage(nonceRes.nonce);\n const signature = await this.signMessage(rawMessage);\n\n // Authenticate\n const authResponse = await authenticate(\n rawMessage,\n signature,\n this.#config.type,\n this.#config.env,\n );\n\n // Authorize\n const tokenResponse = await authorizeOIDC(\n authResponse.token,\n this.#config.env,\n this.#config.platform,\n );\n\n // Save\n const result: LoginResponse = {\n profile: authResponse.profile,\n token: tokenResponse,\n };\n\n await this.#options.storage.setLoginResponse(result);\n\n return result;\n }\n\n #createSiWELoginRawMessage(nonce: string): string {\n this.#assertSigner(this.#signer);\n\n return new SiweMessage({\n domain: this.#signer?.domain,\n address: this.#signer?.address,\n uri: SIWE_LOGIN_URL(this.#config.env),\n version: '1',\n chainId: this.#signer?.chainId,\n nonce,\n issuedAt: new Date().toISOString(),\n }).prepareMessage();\n }\n\n #assertSigner(\n signer?: JwtBearerAuth_SIWE_Signer,\n ): asserts signer is JwtBearerAuth_SIWE_Signer {\n if (!signer) {\n throw new ValidationError(`you must call 'prepare()' before logging in`);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAS,mBAAmB;AAA5B;AAiCO,IAAM,oBAAN,MAA6C;AAAA,EAOlD,YACE,QACA,SACA;AAwCF;AAAA,uBAAM;AAgBN,uBAAM;AAmCN;AAcA;AAlHA;AAEA;AAEA;AAME,uBAAK,SAAU;AACf,uBAAK,UAAW;AAAA,EAClB;AAAA,EAEA,MAAM,iBAAkC;AACtC,UAAM,UAAU,MAAM,sBAAK,oCAAL;AACtB,QAAI,SAAS;AACX,aAAO,QAAQ,MAAM;AAAA,IACvB;AAEA,UAAM,gBAAgB,MAAM,sBAAK,kBAAL;AAC5B,WAAO,cAAc,MAAM;AAAA,EAC7B;AAAA,EAEA,MAAM,iBAAuC;AAC3C,UAAM,UAAU,MAAM,sBAAK,oCAAL;AACtB,QAAI,SAAS;AACX,aAAO,QAAQ;AAAA,IACjB;AAEA,UAAM,gBAAgB,MAAM,sBAAK,kBAAL;AAC5B,WAAO,cAAc;AAAA,EACvB;AAAA,EAEA,MAAM,gBAAiC;AACrC,0BAAK,gCAAL,WAAmB,mBAAK;AACxB,WAAO,mBAAK,SAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,YAAY,SAAkC;AAClD,0BAAK,gCAAL,WAAmB,mBAAK;AACxB,WAAO,MAAM,mBAAK,SAAQ,YAAY,OAAO;AAAA,EAC/C;AAAA,EAEA,QAAQ,QAAmC;AACzC,uBAAK,SAAU;AAAA,EACjB;AA2EF;AAzHE;AAEA;AAEA;AA6CM;AAAA,oBAAe,iBAAkC;AACrD,QAAM,OAAO,MAAM,mBAAK,UAAS,QAAQ,iBAAiB;AAC1D,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,IAAI;AAC7B,QAAM,aAAa,cAAc,KAAK,MAAM;AAC5C,QAAM,mBAAmB,KAAK,MAAM,YAAY,MAAO;AAEvD,MAAI,aAAa,kBAAkB;AACjC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEM;AAAA,WAAM,iBAA2B;AACrC,wBAAK,gCAAL,WAAmB,mBAAK;AAGxB,QAAM,UAAU,MAAM,KAAK,cAAc;AACzC,QAAM,WAAW,MAAM,SAAS,SAAS,mBAAK,SAAQ,GAAG;AACzD,QAAM,aAAa,sBAAK,0DAAL,WAAgC,SAAS;AAC5D,QAAM,YAAY,MAAM,KAAK,YAAY,UAAU;AAGnD,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACA;AAAA,IACA,mBAAK,SAAQ;AAAA,IACb,mBAAK,SAAQ;AAAA,EACf;AAGA,QAAM,gBAAgB,MAAM;AAAA,IAC1B,aAAa;AAAA,IACb,mBAAK,SAAQ;AAAA,IACb,mBAAK,SAAQ;AAAA,EACf;AAGA,QAAM,SAAwB;AAAA,IAC5B,SAAS,aAAa;AAAA,IACtB,OAAO;AAAA,EACT;AAEA,QAAM,mBAAK,UAAS,QAAQ,iBAAiB,MAAM;AAEnD,SAAO;AACT;AAEA;AAAA,+BAA0B,SAAC,OAAuB;AAChD,wBAAK,gCAAL,WAAmB,mBAAK;AAExB,SAAO,IAAI,YAAY;AAAA,IACrB,QAAQ,mBAAK,UAAS;AAAA,IACtB,SAAS,mBAAK,UAAS;AAAA,IACvB,KAAK,eAAe,mBAAK,SAAQ,GAAG;AAAA,IACpC,SAAS;AAAA,IACT,SAAS,mBAAK,UAAS;AAAA,IACvB;AAAA,IACA,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,EACnC,CAAC,EAAE,eAAe;AACpB;AAEA;AAAA,kBAAa,SACX,QAC6C;AAC7C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,gBAAgB,6CAA6C;AAAA,EACzE;AACF;","names":[]}