@metamask/profile-sync-controller 0.0.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/dist/chunk-2XGRQBXI.mjs +70 -0
  3. package/dist/chunk-2XGRQBXI.mjs.map +1 -0
  4. package/dist/chunk-32HAX3MW.mjs +224 -0
  5. package/dist/chunk-32HAX3MW.mjs.map +1 -0
  6. package/dist/chunk-5SXXO4MV.js +70 -0
  7. package/dist/chunk-5SXXO4MV.js.map +1 -0
  8. package/dist/chunk-5TOWF6UW.mjs +11 -0
  9. package/dist/chunk-5TOWF6UW.mjs.map +1 -0
  10. package/dist/chunk-6P6CUKKI.mjs +30 -0
  11. package/dist/chunk-6P6CUKKI.mjs.map +1 -0
  12. package/dist/chunk-76VRE4BI.mjs +18 -0
  13. package/dist/chunk-76VRE4BI.mjs.map +1 -0
  14. package/dist/chunk-AARMY5TW.mjs +86 -0
  15. package/dist/chunk-AARMY5TW.mjs.map +1 -0
  16. package/dist/chunk-AK7OTIWA.js +11 -0
  17. package/dist/chunk-AK7OTIWA.js.map +1 -0
  18. package/dist/chunk-AUFUOKJW.mjs +25 -0
  19. package/dist/chunk-AUFUOKJW.mjs.map +1 -0
  20. package/dist/{chunk-OF3TQWGX.js → chunk-AVOOINGJ.js} +34 -34
  21. package/dist/chunk-AVOOINGJ.js.map +1 -0
  22. package/dist/{chunk-CZ7YK35S.mjs → chunk-AXWK4Y23.mjs} +7 -5
  23. package/dist/{chunk-CZ7YK35S.mjs.map → chunk-AXWK4Y23.mjs.map} +1 -1
  24. package/dist/{chunk-UMKBFFZ5.mjs → chunk-B5DBQDB3.mjs} +13 -4
  25. package/dist/chunk-B5DBQDB3.mjs.map +1 -0
  26. package/dist/chunk-B6CSNLGE.js +25 -0
  27. package/dist/chunk-B6CSNLGE.js.map +1 -0
  28. package/dist/{chunk-NRH6O4QZ.js → chunk-BOET676P.js} +45 -14
  29. package/dist/chunk-BOET676P.js.map +1 -0
  30. package/dist/{chunk-2FZSWVHT.mjs → chunk-CAIIVJAO.mjs} +1 -1
  31. package/dist/chunk-CAIIVJAO.mjs.map +1 -0
  32. package/dist/chunk-ELHJSRS2.js +98 -0
  33. package/dist/chunk-ELHJSRS2.js.map +1 -0
  34. package/dist/chunk-FCT2LIGH.mjs +106 -0
  35. package/dist/chunk-FCT2LIGH.mjs.map +1 -0
  36. package/dist/chunk-FQ5SDMRE.mjs +77 -0
  37. package/dist/chunk-FQ5SDMRE.mjs.map +1 -0
  38. package/dist/chunk-H25EBXG5.mjs +58 -0
  39. package/dist/chunk-H25EBXG5.mjs.map +1 -0
  40. package/dist/chunk-H4TDS65R.js +81 -0
  41. package/dist/chunk-H4TDS65R.js.map +1 -0
  42. package/dist/{chunk-Z4BLTVTB.js → chunk-IGY2S5BC.js} +9 -3
  43. package/dist/chunk-IPSBQ3MS.js +30 -0
  44. package/dist/chunk-IPSBQ3MS.js.map +1 -0
  45. package/dist/{chunk-4NGEEDGV.mjs → chunk-JLDFMYAH.mjs} +9 -9
  46. package/dist/chunk-JLDFMYAH.mjs.map +1 -0
  47. package/dist/chunk-K5UKU454.mjs +158 -0
  48. package/dist/chunk-K5UKU454.mjs.map +1 -0
  49. package/dist/chunk-KBCXN3YW.mjs +98 -0
  50. package/dist/chunk-KBCXN3YW.mjs.map +1 -0
  51. package/dist/chunk-LSVRA3X2.mjs +81 -0
  52. package/dist/chunk-LSVRA3X2.mjs.map +1 -0
  53. package/dist/{chunk-GQLHSQGZ.js → chunk-MBTBE4P5.js} +9 -2
  54. package/dist/chunk-MBTBE4P5.js.map +1 -0
  55. package/dist/chunk-NLHLVVOO.js +106 -0
  56. package/dist/chunk-NLHLVVOO.js.map +1 -0
  57. package/dist/{chunk-VZXD5DCQ.js → chunk-P4DUDLMY.js} +36 -27
  58. package/dist/chunk-P4DUDLMY.js.map +1 -0
  59. package/dist/{chunk-6X6I3HZU.js → chunk-P52TG263.js} +28 -26
  60. package/dist/chunk-P52TG263.js.map +1 -0
  61. package/dist/{chunk-CFST6GWE.js → chunk-PBRUOBEQ.js} +1 -1
  62. package/dist/chunk-PBRUOBEQ.js.map +1 -0
  63. package/dist/chunk-PCOIRDTO.js +18 -0
  64. package/dist/chunk-PCOIRDTO.js.map +1 -0
  65. package/dist/chunk-PTR4DAX6.js +79 -0
  66. package/dist/chunk-PTR4DAX6.js.map +1 -0
  67. package/dist/chunk-Q5WIUNX5.js +126 -0
  68. package/dist/chunk-Q5WIUNX5.js.map +1 -0
  69. package/dist/chunk-RX5R6BUI.js +86 -0
  70. package/dist/chunk-RX5R6BUI.js.map +1 -0
  71. package/dist/chunk-SMKTWM6I.js +77 -0
  72. package/dist/chunk-SMKTWM6I.js.map +1 -0
  73. package/dist/chunk-T3FNDVE3.js +158 -0
  74. package/dist/chunk-T3FNDVE3.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-TGFMKARH.mjs +274 -0
  78. package/dist/chunk-TGFMKARH.mjs.map +1 -0
  79. package/dist/{chunk-XUI43LEZ.mjs → chunk-U5UIDVOO.mjs} +7 -1
  80. package/dist/chunk-UAXWZN5J.js +58 -0
  81. package/dist/chunk-UAXWZN5J.js.map +1 -0
  82. package/dist/{chunk-CYGZ4WLJ.mjs → chunk-WB6MUIML.mjs} +36 -5
  83. package/dist/chunk-WB6MUIML.mjs.map +1 -0
  84. package/dist/chunk-WJCKQLKK.mjs +79 -0
  85. package/dist/chunk-WJCKQLKK.mjs.map +1 -0
  86. package/dist/{chunk-VXPVURGH.mjs → chunk-Y46NMA3V.mjs} +9 -9
  87. package/dist/chunk-Y46NMA3V.mjs.map +1 -0
  88. package/dist/chunk-YASNOFBV.js +274 -0
  89. package/dist/chunk-YASNOFBV.js.map +1 -0
  90. package/dist/chunk-YUXN5GSW.js +224 -0
  91. package/dist/chunk-YUXN5GSW.js.map +1 -0
  92. package/dist/controllers/authentication/AuthenticationController.js +24 -0
  93. package/dist/controllers/authentication/AuthenticationController.mjs +24 -0
  94. package/dist/controllers/authentication/auth-snap-requests.js +10 -0
  95. package/dist/controllers/authentication/auth-snap-requests.mjs +10 -0
  96. package/dist/controllers/authentication/index.js +28 -0
  97. package/dist/controllers/authentication/index.js.map +1 -0
  98. package/dist/controllers/authentication/index.mjs +28 -0
  99. package/dist/controllers/authentication/index.mjs.map +1 -0
  100. package/dist/controllers/authentication/services.js +32 -0
  101. package/dist/controllers/authentication/services.js.map +1 -0
  102. package/dist/controllers/authentication/services.mjs +32 -0
  103. package/dist/controllers/authentication/services.mjs.map +1 -0
  104. package/dist/controllers/index.js +34 -0
  105. package/dist/controllers/index.js.map +1 -0
  106. package/dist/controllers/index.mjs +34 -0
  107. package/dist/controllers/index.mjs.map +1 -0
  108. package/dist/controllers/user-storage/UserStorageController.js +29 -0
  109. package/dist/controllers/user-storage/UserStorageController.js.map +1 -0
  110. package/dist/controllers/user-storage/UserStorageController.mjs +29 -0
  111. package/dist/controllers/user-storage/UserStorageController.mjs.map +1 -0
  112. package/dist/controllers/user-storage/encryption/cache.js +13 -0
  113. package/dist/controllers/user-storage/encryption/cache.js.map +1 -0
  114. package/dist/controllers/user-storage/encryption/cache.mjs +13 -0
  115. package/dist/controllers/user-storage/encryption/cache.mjs.map +1 -0
  116. package/dist/controllers/user-storage/encryption/encryption.js +12 -0
  117. package/dist/controllers/user-storage/encryption/encryption.js.map +1 -0
  118. package/dist/controllers/user-storage/encryption/encryption.mjs +12 -0
  119. package/dist/controllers/user-storage/encryption/encryption.mjs.map +1 -0
  120. package/dist/controllers/user-storage/encryption/index.js +16 -0
  121. package/dist/controllers/user-storage/encryption/index.js.map +1 -0
  122. package/dist/controllers/user-storage/encryption/index.mjs +16 -0
  123. package/dist/controllers/user-storage/encryption/index.mjs.map +1 -0
  124. package/dist/controllers/user-storage/encryption/utils.js +12 -0
  125. package/dist/controllers/user-storage/encryption/utils.js.map +1 -0
  126. package/dist/controllers/user-storage/encryption/utils.mjs +12 -0
  127. package/dist/controllers/user-storage/encryption/utils.mjs.map +1 -0
  128. package/dist/controllers/user-storage/index.js +38 -0
  129. package/dist/controllers/user-storage/index.js.map +1 -0
  130. package/dist/controllers/user-storage/index.mjs +38 -0
  131. package/dist/controllers/user-storage/index.mjs.map +1 -0
  132. package/dist/controllers/user-storage/schema.js +14 -0
  133. package/dist/controllers/user-storage/schema.js.map +1 -0
  134. package/dist/controllers/user-storage/schema.mjs +14 -0
  135. package/dist/controllers/user-storage/schema.mjs.map +1 -0
  136. package/dist/controllers/user-storage/services.js +31 -0
  137. package/dist/controllers/user-storage/services.js.map +1 -0
  138. package/dist/controllers/user-storage/services.mjs +31 -0
  139. package/dist/controllers/user-storage/services.mjs.map +1 -0
  140. package/dist/index.js +31 -62
  141. package/dist/index.mjs +32 -63
  142. package/dist/sdk/authentication-jwt-bearer/flow-siwe.js +7 -8
  143. package/dist/sdk/authentication-jwt-bearer/flow-siwe.mjs +6 -7
  144. package/dist/sdk/authentication-jwt-bearer/flow-srp.js +7 -8
  145. package/dist/sdk/authentication-jwt-bearer/flow-srp.mjs +6 -7
  146. package/dist/sdk/authentication-jwt-bearer/services.js +10 -6
  147. package/dist/sdk/authentication-jwt-bearer/services.mjs +11 -7
  148. package/dist/sdk/authentication-jwt-bearer/types.js +3 -3
  149. package/dist/sdk/authentication-jwt-bearer/types.mjs +2 -2
  150. package/dist/sdk/authentication.js +9 -10
  151. package/dist/sdk/authentication.mjs +8 -9
  152. package/dist/sdk/encryption.js +5 -3
  153. package/dist/sdk/encryption.mjs +4 -2
  154. package/dist/sdk/env.js +5 -3
  155. package/dist/sdk/env.mjs +4 -2
  156. package/dist/sdk/errors.js +5 -3
  157. package/dist/sdk/errors.mjs +4 -2
  158. package/dist/sdk/index.js +18 -13
  159. package/dist/sdk/index.mjs +17 -12
  160. package/dist/sdk/user-storage.js +6 -6
  161. package/dist/sdk/user-storage.mjs +5 -5
  162. package/dist/sdk/utils/eip-6963-metamask-provider.js +1 -1
  163. package/dist/sdk/utils/eip-6963-metamask-provider.mjs +1 -1
  164. package/dist/sdk/utils/messaging-signing-snap-requests.js +1 -1
  165. package/dist/sdk/utils/messaging-signing-snap-requests.mjs +1 -1
  166. package/dist/tsconfig.build.tsbuildinfo +1 -1
  167. package/dist/types/controllers/authentication/AuthenticationController.d.ts +74 -0
  168. package/dist/types/controllers/authentication/AuthenticationController.d.ts.map +1 -0
  169. package/dist/types/controllers/authentication/__fixtures__/index.d.ts +2 -0
  170. package/dist/types/controllers/authentication/__fixtures__/index.d.ts.map +1 -0
  171. package/dist/types/controllers/authentication/__fixtures__/mockResponses.d.ts +23 -0
  172. package/dist/types/controllers/authentication/__fixtures__/mockResponses.d.ts.map +1 -0
  173. package/dist/types/controllers/authentication/__fixtures__/mockServices.d.ts +10 -0
  174. package/dist/types/controllers/authentication/__fixtures__/mockServices.d.ts.map +1 -0
  175. package/dist/types/controllers/authentication/auth-snap-requests.d.ts +17 -0
  176. package/dist/types/controllers/authentication/auth-snap-requests.d.ts.map +1 -0
  177. package/dist/types/controllers/authentication/index.d.ts +5 -0
  178. package/dist/types/controllers/authentication/index.d.ts.map +1 -0
  179. package/dist/types/controllers/authentication/services.d.ts +69 -0
  180. package/dist/types/controllers/authentication/services.d.ts.map +1 -0
  181. package/dist/types/controllers/index.d.ts +3 -0
  182. package/dist/types/controllers/index.d.ts.map +1 -0
  183. package/dist/types/controllers/user-storage/UserStorageController.d.ts +85 -0
  184. package/dist/types/controllers/user-storage/UserStorageController.d.ts.map +1 -0
  185. package/dist/types/controllers/user-storage/__fixtures__/index.d.ts +3 -0
  186. package/dist/types/controllers/user-storage/__fixtures__/index.d.ts.map +1 -0
  187. package/dist/types/controllers/user-storage/__fixtures__/mockResponses.d.ts +13 -0
  188. package/dist/types/controllers/user-storage/__fixtures__/mockResponses.d.ts.map +1 -0
  189. package/dist/types/controllers/user-storage/__fixtures__/mockServices.d.ts +9 -0
  190. package/dist/types/controllers/user-storage/__fixtures__/mockServices.d.ts.map +1 -0
  191. package/dist/types/controllers/user-storage/__fixtures__/mockStorage.d.ts +5 -0
  192. package/dist/types/controllers/user-storage/__fixtures__/mockStorage.d.ts.map +1 -0
  193. package/dist/types/controllers/user-storage/encryption/cache.d.ts +31 -0
  194. package/dist/types/controllers/user-storage/encryption/cache.d.ts.map +1 -0
  195. package/dist/types/controllers/user-storage/encryption/encryption.d.ts +26 -0
  196. package/dist/types/controllers/user-storage/encryption/encryption.d.ts.map +1 -0
  197. package/dist/types/controllers/user-storage/encryption/index.d.ts +5 -0
  198. package/dist/types/controllers/user-storage/encryption/index.d.ts.map +1 -0
  199. package/dist/types/controllers/user-storage/encryption/utils.d.ts +4 -0
  200. package/dist/types/controllers/user-storage/encryption/utils.d.ts.map +1 -0
  201. package/dist/types/controllers/user-storage/index.d.ts +6 -0
  202. package/dist/types/controllers/user-storage/index.d.ts.map +1 -0
  203. package/dist/types/controllers/user-storage/schema.d.ts +22 -0
  204. package/dist/types/controllers/user-storage/schema.d.ts.map +1 -0
  205. package/dist/types/controllers/user-storage/services.d.ts +30 -0
  206. package/dist/types/controllers/user-storage/services.d.ts.map +1 -0
  207. package/dist/types/index.d.ts +3 -1
  208. package/dist/types/index.d.ts.map +1 -1
  209. package/dist/types/sdk/__fixtures__/mock-auth.d.ts +3 -0
  210. package/dist/types/sdk/__fixtures__/mock-auth.d.ts.map +1 -1
  211. package/dist/types/sdk/__fixtures__/mock-userstorage.d.ts.map +1 -1
  212. package/dist/types/sdk/__fixtures__/test-utils.d.ts.map +1 -1
  213. package/dist/types/sdk/authentication-jwt-bearer/flow-siwe.d.ts.map +1 -1
  214. package/dist/types/sdk/authentication-jwt-bearer/flow-srp.d.ts.map +1 -1
  215. package/dist/types/sdk/authentication-jwt-bearer/services.d.ts +20 -2
  216. package/dist/types/sdk/authentication-jwt-bearer/services.d.ts.map +1 -1
  217. package/dist/types/sdk/authentication-jwt-bearer/types.d.ts +9 -2
  218. package/dist/types/sdk/authentication-jwt-bearer/types.d.ts.map +1 -1
  219. package/dist/types/sdk/authentication.d.ts +2 -1
  220. package/dist/types/sdk/authentication.d.ts.map +1 -1
  221. package/dist/types/sdk/encryption.d.ts +2 -2
  222. package/dist/types/sdk/encryption.d.ts.map +1 -1
  223. package/dist/types/sdk/env.d.ts +9 -2
  224. package/dist/types/sdk/env.d.ts.map +1 -1
  225. package/dist/types/sdk/errors.d.ts +3 -0
  226. package/dist/types/sdk/errors.d.ts.map +1 -1
  227. package/dist/types/sdk/user-storage.d.ts.map +1 -1
  228. package/package.json +15 -2
  229. package/dist/chunk-2FZSWVHT.mjs.map +0 -1
  230. package/dist/chunk-4NGEEDGV.mjs.map +0 -1
  231. package/dist/chunk-6X6I3HZU.js.map +0 -1
  232. package/dist/chunk-BARZBXO7.js +0 -7
  233. package/dist/chunk-BARZBXO7.js.map +0 -1
  234. package/dist/chunk-BHVT2QEA.mjs.map +0 -1
  235. package/dist/chunk-CFST6GWE.js.map +0 -1
  236. package/dist/chunk-CYGZ4WLJ.mjs.map +0 -1
  237. package/dist/chunk-DEATIRII.js +0 -1
  238. package/dist/chunk-GQLHSQGZ.js.map +0 -1
  239. package/dist/chunk-GVMIXMYB.mjs +0 -67
  240. package/dist/chunk-GVMIXMYB.mjs.map +0 -1
  241. package/dist/chunk-KHFPE566.js +0 -49
  242. package/dist/chunk-KHFPE566.js.map +0 -1
  243. package/dist/chunk-KKRIOEXD.mjs +0 -7
  244. package/dist/chunk-KKRIOEXD.mjs.map +0 -1
  245. package/dist/chunk-MKJYSWME.mjs +0 -1
  246. package/dist/chunk-NRH6O4QZ.js.map +0 -1
  247. package/dist/chunk-OF3TQWGX.js.map +0 -1
  248. package/dist/chunk-UMKBFFZ5.mjs.map +0 -1
  249. package/dist/chunk-UVJVONBF.js +0 -126
  250. package/dist/chunk-UVJVONBF.js.map +0 -1
  251. package/dist/chunk-VHUU4HEY.js +0 -67
  252. package/dist/chunk-VHUU4HEY.js.map +0 -1
  253. package/dist/chunk-VXPVURGH.mjs.map +0 -1
  254. package/dist/chunk-VZXD5DCQ.js.map +0 -1
  255. package/dist/chunk-WJRV2JCX.mjs +0 -49
  256. package/dist/chunk-WJRV2JCX.mjs.map +0 -1
  257. package/dist/sdk/authentication-jwt-bearer/constants.js +0 -8
  258. package/dist/sdk/authentication-jwt-bearer/constants.mjs +0 -8
  259. package/dist/types/sdk/authentication-jwt-bearer/constants.d.ts +0 -2
  260. package/dist/types/sdk/authentication-jwt-bearer/constants.d.ts.map +0 -1
  261. /package/dist/{chunk-DEATIRII.js.map → chunk-IGY2S5BC.js.map} +0 -0
  262. /package/dist/{chunk-MKJYSWME.mjs.map → chunk-U5UIDVOO.mjs.map} +0 -0
  263. /package/dist/{chunk-Z4BLTVTB.js.map → controllers/authentication/AuthenticationController.js.map} +0 -0
  264. /package/dist/{chunk-XUI43LEZ.mjs.map → controllers/authentication/AuthenticationController.mjs.map} +0 -0
  265. /package/dist/{sdk/authentication-jwt-bearer/constants.js.map → controllers/authentication/auth-snap-requests.js.map} +0 -0
  266. /package/dist/{sdk/authentication-jwt-bearer/constants.mjs.map → controllers/authentication/auth-snap-requests.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/controllers/user-storage/UserStorageController.ts"],"sourcesContent":["import type {\n RestrictedControllerMessenger,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { HandleSnapRequest } from '@metamask/snaps-controllers';\n\nimport { createSnapSignMessageRequest } from '../authentication/auth-snap-requests';\nimport type {\n AuthenticationControllerGetBearerToken,\n AuthenticationControllerGetSessionProfile,\n AuthenticationControllerIsSignedIn,\n AuthenticationControllerPerformSignIn,\n AuthenticationControllerPerformSignOut,\n} from '../authentication/AuthenticationController';\nimport { createSHA256Hash } from './encryption';\nimport type { UserStorageEntryKeys } from './schema';\nimport { getUserStorage, upsertUserStorage } from './services';\n\n// TODO: fix external dependencies\nexport declare type NotificationServicesControllerDisableNotificationServices =\n {\n type: `NotificationServicesController:disableNotificationServices`;\n handler: () => Promise<void>;\n };\n\nexport declare type NotificationServicesControllerSelectIsNotificationServicesEnabled =\n {\n type: `NotificationServicesController:selectIsNotificationServicesEnabled`;\n handler: () => boolean;\n };\n\nconst controllerName = 'UserStorageController';\n\n// State\nexport type UserStorageControllerState = {\n /**\n * Condition used by UI and to determine if we can use some of the User Storage methods.\n */\n isProfileSyncingEnabled: boolean;\n /**\n * Loading state for the profile syncing update\n */\n isProfileSyncingUpdateLoading: boolean;\n};\n\nexport const defaultState: UserStorageControllerState = {\n isProfileSyncingEnabled: true,\n isProfileSyncingUpdateLoading: false,\n};\n\nconst metadata: StateMetadata<UserStorageControllerState> = {\n isProfileSyncingEnabled: {\n persist: true,\n anonymous: true,\n },\n isProfileSyncingUpdateLoading: {\n persist: false,\n anonymous: false,\n },\n};\n\n// Messenger Actions\ntype CreateActionsObj<Controller extends keyof UserStorageController> = {\n [K in Controller]: {\n type: `${typeof controllerName}:${K}`;\n handler: UserStorageController[K];\n };\n};\ntype ActionsObj = CreateActionsObj<\n | 'performGetStorage'\n | 'performSetStorage'\n | 'getStorageKey'\n | 'enableProfileSyncing'\n | 'disableProfileSyncing'\n>;\nexport type Actions = ActionsObj[keyof ActionsObj];\nexport type UserStorageControllerPerformGetStorage =\n ActionsObj['performGetStorage'];\nexport type UserStorageControllerPerformSetStorage =\n ActionsObj['performSetStorage'];\nexport type UserStorageControllerGetStorageKey = ActionsObj['getStorageKey'];\nexport type UserStorageControllerEnableProfileSyncing =\n ActionsObj['enableProfileSyncing'];\nexport type UserStorageControllerDisableProfileSyncing =\n ActionsObj['disableProfileSyncing'];\n\n// Allowed Actions\nexport type AllowedActions =\n // Snap Requests\n | HandleSnapRequest\n // Auth Requests\n | AuthenticationControllerGetBearerToken\n | AuthenticationControllerGetSessionProfile\n | AuthenticationControllerPerformSignIn\n | AuthenticationControllerIsSignedIn\n | AuthenticationControllerPerformSignOut\n // Metamask Notifications\n | NotificationServicesControllerDisableNotificationServices\n | NotificationServicesControllerSelectIsNotificationServicesEnabled;\n\n// Messenger\nexport type UserStorageControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n never,\n AllowedActions['type'],\n never\n>;\n\n/**\n * Reusable controller that allows any team to store synchronized data for a given user.\n * These can be settings shared cross MetaMask clients, or data we want to persist when uninstalling/reinstalling.\n *\n * NOTE:\n * - data stored on UserStorage is FULLY encrypted, with the only keys stored/managed on the client.\n * - No one can access this data unless they are have the SRP and are able to run the signing snap.\n */\nexport default class UserStorageController extends BaseController<\n typeof controllerName,\n UserStorageControllerState,\n UserStorageControllerMessenger\n> {\n #auth = {\n getBearerToken: async () => {\n return await this.messagingSystem.call(\n 'AuthenticationController:getBearerToken',\n );\n },\n getProfileId: async () => {\n const sessionProfile = await this.messagingSystem.call(\n 'AuthenticationController:getSessionProfile',\n );\n return sessionProfile?.profileId;\n },\n isAuthEnabled: () => {\n return this.messagingSystem.call('AuthenticationController:isSignedIn');\n },\n signIn: async () => {\n return await this.messagingSystem.call(\n 'AuthenticationController:performSignIn',\n );\n },\n signOut: async () => {\n return this.messagingSystem.call(\n 'AuthenticationController:performSignOut',\n );\n },\n };\n\n #notificationServices = {\n disableNotificationServices: async () => {\n return await this.messagingSystem.call(\n 'NotificationServicesController:disableNotificationServices',\n );\n },\n selectIsNotificationServicesEnabled: async () => {\n return this.messagingSystem.call(\n 'NotificationServicesController:selectIsNotificationServicesEnabled',\n );\n },\n };\n\n getMetaMetricsState: () => boolean;\n\n constructor(params: {\n messenger: UserStorageControllerMessenger;\n state?: UserStorageControllerState;\n getMetaMetricsState: () => boolean;\n }) {\n super({\n messenger: params.messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...params.state },\n });\n\n this.getMetaMetricsState = params.getMetaMetricsState;\n this.#registerMessageHandlers();\n }\n\n /**\n * Constructor helper for registering this controller's messaging system\n * actions.\n */\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:performGetStorage',\n this.performGetStorage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:performSetStorage',\n this.performSetStorage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:getStorageKey',\n this.getStorageKey.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:enableProfileSyncing',\n this.enableProfileSyncing.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:disableProfileSyncing',\n this.disableProfileSyncing.bind(this),\n );\n }\n\n public async enableProfileSyncing(): Promise<void> {\n try {\n this.#setIsProfileSyncingUpdateLoading(true);\n\n const authEnabled = this.#auth.isAuthEnabled();\n if (!authEnabled) {\n await this.#auth.signIn();\n }\n\n this.update((state) => {\n state.isProfileSyncingEnabled = true;\n });\n\n this.#setIsProfileSyncingUpdateLoading(false);\n } catch (e) {\n this.#setIsProfileSyncingUpdateLoading(false);\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to enable profile syncing - ${errorMessage}`,\n );\n }\n }\n\n public async setIsProfileSyncingEnabled(\n isProfileSyncingEnabled: boolean,\n ): Promise<void> {\n this.update((state) => {\n state.isProfileSyncingEnabled = isProfileSyncingEnabled;\n });\n }\n\n public async disableProfileSyncing(): Promise<void> {\n const isAlreadyDisabled = !this.state.isProfileSyncingEnabled;\n if (isAlreadyDisabled) {\n return;\n }\n\n try {\n this.#setIsProfileSyncingUpdateLoading(true);\n\n const isNotificationServicesEnabled =\n await this.#notificationServices.selectIsNotificationServicesEnabled();\n\n if (isNotificationServicesEnabled) {\n await this.#notificationServices.disableNotificationServices();\n }\n\n const isMetaMetricsParticipation = this.getMetaMetricsState();\n\n if (!isMetaMetricsParticipation) {\n this.messagingSystem.call('AuthenticationController:performSignOut');\n }\n\n this.#setIsProfileSyncingUpdateLoading(false);\n\n this.update((state) => {\n state.isProfileSyncingEnabled = false;\n });\n } catch (e) {\n this.#setIsProfileSyncingUpdateLoading(false);\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to disable profile syncing - ${errorMessage}`,\n );\n }\n }\n\n /**\n * Allows retrieval of stored data. Data stored is string formatted.\n * Developers can extend the entry path and entry name through the `schema.ts` file.\n *\n * @param entryKey - entry key that matches schema\n * @returns the decrypted string contents found from user storage (or null if not found)\n */\n public async performGetStorage(\n entryKey: UserStorageEntryKeys,\n ): Promise<string | null> {\n this.#assertProfileSyncingEnabled();\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n const result = await getUserStorage({\n entryKey,\n bearerToken,\n storageKey,\n });\n\n return result;\n }\n\n /**\n * Allows storage of user data. Data stored must be string formatted.\n * Developers can extend the entry path and entry name through the `schema.ts` file.\n *\n * @param entryKey - entry key that matches schema\n * @param value - The string data you want to store.\n * @returns nothing. NOTE that an error is thrown if fails to store data.\n */\n public async performSetStorage(\n entryKey: UserStorageEntryKeys,\n value: string,\n ): Promise<void> {\n this.#assertProfileSyncingEnabled();\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n await upsertUserStorage(value, {\n entryKey,\n bearerToken,\n storageKey,\n });\n }\n\n /**\n * Retrieves the storage key, for internal use only!\n *\n * @returns the storage key\n */\n public async getStorageKey(): Promise<string> {\n this.#assertProfileSyncingEnabled();\n const storageKey = await this.#createStorageKey();\n return storageKey;\n }\n\n #assertProfileSyncingEnabled(): void {\n if (!this.state.isProfileSyncingEnabled) {\n throw new Error(\n `${controllerName}: Unable to call method, user is not authenticated`,\n );\n }\n }\n\n /**\n * Utility to get the bearer token and storage key\n */\n async #getStorageKeyAndBearerToken(): Promise<{\n bearerToken: string;\n storageKey: string;\n }> {\n const bearerToken = await this.#auth.getBearerToken();\n if (!bearerToken) {\n throw new Error('UserStorageController - unable to get bearer token');\n }\n const storageKey = await this.#createStorageKey();\n\n return { bearerToken, storageKey };\n }\n\n /**\n * Rather than storing the storage key, we can compute the storage key when needed.\n *\n * @returns the storage key\n */\n async #createStorageKey(): Promise<string> {\n const id: string = await this.#auth.getProfileId();\n if (!id) {\n throw new Error('UserStorageController - unable to create storage key');\n }\n\n const storageKeySignature = await this.#snapSignMessage(`metamask:${id}`);\n const storageKey = createSHA256Hash(storageKeySignature);\n return storageKey;\n }\n\n /**\n * Signs a specific message using an underlying auth snap.\n *\n * @param message - A specific tagged message to sign.\n * @returns A Signature created by the snap.\n */\n #snapSignMessage(message: `metamask:${string}`): Promise<string> {\n return this.messagingSystem.call(\n 'SnapController:handleRequest',\n createSnapSignMessageRequest(message),\n ) as Promise<string>;\n }\n\n #setIsProfileSyncingUpdateLoading(\n isProfileSyncingUpdateLoading: boolean,\n ): void {\n this.update((state) => {\n state.isProfileSyncingUpdateLoading = isProfileSyncingUpdateLoading;\n });\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,3 +1,8 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
1
6
  var __accessCheck = (obj, member, msg) => {
2
7
  if (!member.has(obj))
3
8
  throw TypeError("Cannot " + msg);
@@ -22,9 +27,10 @@ var __privateMethod = (obj, member, method) => {
22
27
  };
23
28
 
24
29
  export {
30
+ __export,
25
31
  __privateGet,
26
32
  __privateAdd,
27
33
  __privateSet,
28
34
  __privateMethod
29
35
  };
30
- //# sourceMappingURL=chunk-XUI43LEZ.mjs.map
36
+ //# sourceMappingURL=chunk-U5UIDVOO.mjs.map
@@ -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,15 +1,17 @@
1
1
  import {
2
2
  getEnvUrls,
3
3
  getOidcClientId
4
- } from "./chunk-WJRV2JCX.mjs";
4
+ } from "./chunk-FQ5SDMRE.mjs";
5
5
  import {
6
6
  NonceRetrievalError,
7
+ PairError,
7
8
  SignInError,
8
9
  ValidationError
9
- } from "./chunk-BHVT2QEA.mjs";
10
+ } from "./chunk-TFFQFIJV.mjs";
10
11
 
11
12
  // src/sdk/authentication-jwt-bearer/services.ts
12
13
  var NONCE_URL = (env) => `${getEnvUrls(env).authApiUrl}/api/v2/nonce`;
14
+ var PAIR_IDENTIFIERS = (env) => `${getEnvUrls(env).authApiUrl}/api/v2/identifiers/pair`;
13
15
  var OIDC_TOKEN_URL = (env) => `${getEnvUrls(env).oidcApiUrl}/oauth2/token`;
14
16
  var SRP_LOGIN_URL = (env) => `${getEnvUrls(env).authApiUrl}/api/v2/srp/login`;
15
17
  var SIWE_LOGIN_URL = (env) => `${getEnvUrls(env).authApiUrl}/api/v2/siwe/login`;
@@ -25,6 +27,31 @@ var getAuthenticationUrl = (authType, env) => {
25
27
  );
26
28
  }
27
29
  };
30
+ async function pairIdentifiers(nonce, logins, accessToken, env) {
31
+ const pairUrl = new URL(PAIR_IDENTIFIERS(env));
32
+ try {
33
+ const response = await fetch(pairUrl, {
34
+ method: "POST",
35
+ headers: {
36
+ "Content-Type": "application/json",
37
+ Authorization: `Bearer ${accessToken}`
38
+ },
39
+ body: JSON.stringify({
40
+ nonce,
41
+ logins
42
+ })
43
+ });
44
+ if (!response.ok) {
45
+ const responseBody = await response.json();
46
+ throw new Error(
47
+ `HTTP error message: ${responseBody.message}, error: ${responseBody.error}`
48
+ );
49
+ }
50
+ } catch (e) {
51
+ const errorMessage = e instanceof Error ? e.message : JSON.stringify(e ?? "");
52
+ throw new PairError(`unable to pair identifiers: ${errorMessage}`);
53
+ }
54
+ }
28
55
  async function getNonce(id, env) {
29
56
  const nonceUrl = new URL(NONCE_URL(env));
30
57
  nonceUrl.searchParams.set("identifier", id);
@@ -47,14 +74,14 @@ async function getNonce(id, env) {
47
74
  throw new NonceRetrievalError(`failed to generate nonce: ${errorMessage}`);
48
75
  }
49
76
  }
50
- async function authorizeOIDC(jwtToken, env) {
77
+ async function authorizeOIDC(jwtToken, env, platform) {
51
78
  const grantType = "urn:ietf:params:oauth:grant-type:jwt-bearer";
52
79
  const headers = new Headers({
53
80
  "Content-Type": "application/x-www-form-urlencoded"
54
81
  });
55
82
  const urlEncodedBody = new URLSearchParams();
56
83
  urlEncodedBody.append("grant_type", grantType);
57
- urlEncodedBody.append("client_id", getOidcClientId(env));
84
+ urlEncodedBody.append("client_id", getOidcClientId(env, platform));
58
85
  urlEncodedBody.append("assertion", jwtToken);
59
86
  try {
60
87
  const response = await fetch(OIDC_TOKEN_URL(env), {
@@ -89,6 +116,8 @@ async function authenticate(rawMessage, signature, authType, env) {
89
116
  },
90
117
  body: JSON.stringify({
91
118
  signature,
119
+ // TODO: Either fix this lint violation or explain why it's necessary to ignore.
120
+ // eslint-disable-next-line @typescript-eslint/naming-convention
92
121
  raw_message: rawMessage
93
122
  })
94
123
  });
@@ -116,11 +145,13 @@ async function authenticate(rawMessage, signature, authType, env) {
116
145
 
117
146
  export {
118
147
  NONCE_URL,
148
+ PAIR_IDENTIFIERS,
119
149
  OIDC_TOKEN_URL,
120
150
  SRP_LOGIN_URL,
121
151
  SIWE_LOGIN_URL,
152
+ pairIdentifiers,
122
153
  getNonce,
123
154
  authorizeOIDC,
124
155
  authenticate
125
156
  };
126
- //# sourceMappingURL=chunk-CYGZ4WLJ.mjs.map
157
+ //# sourceMappingURL=chunk-WB6MUIML.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/authentication-jwt-bearer/services.ts"],"sourcesContent":["import type { Env, Platform } from '../env';\nimport { getEnvUrls, getOidcClientId } from '../env';\nimport {\n NonceRetrievalError,\n PairError,\n SignInError,\n ValidationError,\n} from '../errors';\nimport type { AccessToken, ErrorMessage, UserProfile } from './types';\nimport { AuthType } from './types';\n\nexport const NONCE_URL = (env: Env) =>\n `${getEnvUrls(env).authApiUrl}/api/v2/nonce`;\n\nexport const PAIR_IDENTIFIERS = (env: Env) =>\n `${getEnvUrls(env).authApiUrl}/api/v2/identifiers/pair`;\n\nexport const OIDC_TOKEN_URL = (env: Env) =>\n `${getEnvUrls(env).oidcApiUrl}/oauth2/token`;\n\nexport const SRP_LOGIN_URL = (env: Env) =>\n `${getEnvUrls(env).authApiUrl}/api/v2/srp/login`;\n\nexport const SIWE_LOGIN_URL = (env: Env) =>\n `${getEnvUrls(env).authApiUrl}/api/v2/siwe/login`;\n\nconst getAuthenticationUrl = (authType: AuthType, env: Env): string => {\n switch (authType) {\n case AuthType.SRP:\n return SRP_LOGIN_URL(env);\n case AuthType.SiWE:\n return SIWE_LOGIN_URL(env);\n /* istanbul ignore next */\n default:\n throw new ValidationError(\n `Invalid AuthType: ${authType as number} - unable to create Auth URL`,\n );\n }\n};\n\ntype NonceResponse = {\n nonce: string;\n identifier: string;\n expiresIn: number;\n};\n\ntype PairRequest = {\n signature: string;\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 raw_message: string;\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 encrypted_storage_key: string;\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 identifier_type: 'SIWE' | 'SRP';\n};\n\n/**\n * Pair multiple identifiers under a single profile\n *\n * @param nonce - session nonce\n * @param logins - pairing request payload\n * @param accessToken - JWT access token used to access protected resources\n * @param env - server environment\n * @returns void.\n */\nexport async function pairIdentifiers(\n nonce: string,\n logins: PairRequest[],\n accessToken: string,\n env: Env,\n): Promise<void> {\n const pairUrl = new URL(PAIR_IDENTIFIERS(env));\n\n try {\n const response = await fetch(pairUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({\n nonce,\n logins,\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 } catch (e) {\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n throw new PairError(`unable to pair identifiers: ${errorMessage}`);\n }\n}\n\n/**\n * Service to Get Nonce for JWT Bearer Flow\n *\n * @param id - identifier ID\n * @param env - server environment\n * @returns the nonce.\n */\nexport async function getNonce(id: string, env: Env): Promise<NonceResponse> {\n const nonceUrl = new URL(NONCE_URL(env));\n nonceUrl.searchParams.set('identifier', id);\n\n try {\n const nonceResponse = await fetch(nonceUrl.toString());\n if (!nonceResponse.ok) {\n const responseBody = (await nonceResponse.json()) as ErrorMessage;\n throw new Error(\n `HTTP error message: ${responseBody.message}, error: ${responseBody.error}`,\n );\n }\n\n const nonceJson = await nonceResponse.json();\n return {\n nonce: nonceJson.nonce,\n identifier: nonceJson.identifier,\n expiresIn: nonceJson.expires_in,\n };\n } catch (e) {\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n throw new NonceRetrievalError(`failed to generate nonce: ${errorMessage}`);\n }\n}\n\n/**\n * Service to Authorize And perform OIDC Flow to get the Access Token\n *\n * @param jwtToken - The original token received from Authentication. This is traded for the Access Token. (the authentication token is single-use)\n * @param env - server environment\n * @param platform - SDK platform\n * @returns Access Token from Authorization server\n */\nexport async function authorizeOIDC(\n jwtToken: string,\n env: Env,\n platform: Platform,\n): Promise<AccessToken> {\n const grantType = 'urn:ietf:params:oauth:grant-type:jwt-bearer';\n const headers = new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded',\n });\n\n const urlEncodedBody = new URLSearchParams();\n urlEncodedBody.append('grant_type', grantType);\n urlEncodedBody.append('client_id', getOidcClientId(env, platform));\n urlEncodedBody.append('assertion', jwtToken);\n\n try {\n const response = await fetch(OIDC_TOKEN_URL(env), {\n method: 'POST',\n headers,\n body: urlEncodedBody.toString(),\n });\n\n if (!response.ok) {\n const responseBody = (await response.json()) as {\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 error_description: string;\n error: string;\n };\n throw new Error(\n `HTTP error: ${responseBody.error_description}, error code: ${responseBody.error}`,\n );\n }\n\n const accessTokenResponse = await response.json();\n return {\n accessToken: accessTokenResponse.access_token,\n expiresIn: accessTokenResponse.expires_in,\n obtainedAt: Date.now(),\n };\n } catch (e) {\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n throw new SignInError(`unable to get access token: ${errorMessage}`);\n }\n}\n\ntype Authentication = {\n token: string;\n expiresIn: number;\n profile: UserProfile;\n};\n/**\n * Service to Authenticate/Login a user via SIWE or SRP derived key.\n *\n * @param rawMessage - raw message for validation when authenticating\n * @param signature - signed raw message\n * @param authType - authentication type/flow used\n * @param env - server environment\n * @returns Authentication Token\n */\nexport async function authenticate(\n rawMessage: string,\n signature: string,\n authType: AuthType,\n env: Env,\n): Promise<Authentication> {\n const authenticationUrl = getAuthenticationUrl(authType, env);\n\n try {\n const response = await fetch(authenticationUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n signature,\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 raw_message: rawMessage,\n }),\n });\n\n if (!response.ok) {\n const responseBody = (await response.json()) as ErrorMessage;\n throw new Error(\n `${authType} login HTTP error: ${responseBody.message}, error code: ${responseBody.error}`,\n );\n }\n\n const loginResponse = await response.json();\n return {\n token: loginResponse.token,\n expiresIn: loginResponse.expires_in,\n profile: {\n identifierId: loginResponse.profile.identifier_id,\n metaMetricsId: loginResponse.profile.metametrics_id,\n profileId: loginResponse.profile.profile_id,\n },\n };\n } catch (e) {\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n throw new SignInError(`unable to perform SRP login: ${errorMessage}`);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,79 @@
1
+ import {
2
+ JwtBearerAuth
3
+ } from "./chunk-FCT2LIGH.mjs";
4
+ import {
5
+ SIWEJwtBearerAuth
6
+ } from "./chunk-JLDFMYAH.mjs";
7
+ import {
8
+ SRPJwtBearerAuth
9
+ } from "./chunk-Y46NMA3V.mjs";
10
+ import {
11
+ AuthType
12
+ } from "./chunk-CAIIVJAO.mjs";
13
+ import {
14
+ MESSAGE_SIGNING_SNAP,
15
+ SNAP_ORIGIN,
16
+ connectSnap,
17
+ getSnap,
18
+ getSnaps
19
+ } from "./chunk-5EBUFNAN.mjs";
20
+ import {
21
+ STORAGE_URL,
22
+ UserStorage
23
+ } from "./chunk-AXWK4Y23.mjs";
24
+ import {
25
+ Encryption,
26
+ createSHA256Hash
27
+ } from "./chunk-B5DBQDB3.mjs";
28
+ import {
29
+ Env,
30
+ Platform,
31
+ getEnvUrls,
32
+ getOidcClientId
33
+ } from "./chunk-FQ5SDMRE.mjs";
34
+ import {
35
+ NonceRetrievalError,
36
+ NotFoundError,
37
+ PairError,
38
+ SignInError,
39
+ UnsupportedAuthTypeError,
40
+ UserStorageError,
41
+ ValidationError
42
+ } from "./chunk-TFFQFIJV.mjs";
43
+ import {
44
+ __export
45
+ } from "./chunk-U5UIDVOO.mjs";
46
+
47
+ // src/sdk/index.ts
48
+ var sdk_exports = {};
49
+ __export(sdk_exports, {
50
+ AuthType: () => AuthType,
51
+ Encryption: () => Encryption,
52
+ Env: () => Env,
53
+ JwtBearerAuth: () => JwtBearerAuth,
54
+ MESSAGE_SIGNING_SNAP: () => MESSAGE_SIGNING_SNAP,
55
+ NonceRetrievalError: () => NonceRetrievalError,
56
+ NotFoundError: () => NotFoundError,
57
+ PairError: () => PairError,
58
+ Platform: () => Platform,
59
+ SIWEJwtBearerAuth: () => SIWEJwtBearerAuth,
60
+ SNAP_ORIGIN: () => SNAP_ORIGIN,
61
+ SRPJwtBearerAuth: () => SRPJwtBearerAuth,
62
+ STORAGE_URL: () => STORAGE_URL,
63
+ SignInError: () => SignInError,
64
+ UnsupportedAuthTypeError: () => UnsupportedAuthTypeError,
65
+ UserStorage: () => UserStorage,
66
+ UserStorageError: () => UserStorageError,
67
+ ValidationError: () => ValidationError,
68
+ connectSnap: () => connectSnap,
69
+ createSHA256Hash: () => createSHA256Hash,
70
+ getEnvUrls: () => getEnvUrls,
71
+ getOidcClientId: () => getOidcClientId,
72
+ getSnap: () => getSnap,
73
+ getSnaps: () => getSnaps
74
+ });
75
+
76
+ export {
77
+ sdk_exports
78
+ };
79
+ //# sourceMappingURL=chunk-WJCKQLKK.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/index.ts"],"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"],"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;","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  authenticate,
3
3
  authorizeOIDC,
4
4
  getNonce
5
- } from "./chunk-CYGZ4WLJ.mjs";
5
+ } from "./chunk-WB6MUIML.mjs";
6
6
  import {
7
7
  getMetaMaskProviderEIP6963
8
8
  } from "./chunk-5XSXZTED.mjs";
@@ -11,16 +11,13 @@ import {
11
11
  } from "./chunk-5EBUFNAN.mjs";
12
12
  import {
13
13
  ValidationError
14
- } from "./chunk-BHVT2QEA.mjs";
15
- import {
16
- SESSION_LIFETIME_MS
17
- } from "./chunk-KKRIOEXD.mjs";
14
+ } from "./chunk-TFFQFIJV.mjs";
18
15
  import {
19
16
  __privateAdd,
20
17
  __privateGet,
21
18
  __privateMethod,
22
19
  __privateSet
23
- } from "./chunk-XUI43LEZ.mjs";
20
+ } from "./chunk-U5UIDVOO.mjs";
24
21
 
25
22
  // src/sdk/authentication-jwt-bearer/flow-srp.ts
26
23
  var defaultEIP6963SigningOptions = {
@@ -46,6 +43,7 @@ var defaultEIP6963SigningOptions = {
46
43
  var _config, _options, _getAuthSession, getAuthSession_fn, _login, login_fn, _createSrpLoginRawMessage, createSrpLoginRawMessage_fn;
47
44
  var SRPJwtBearerAuth = class {
48
45
  constructor(config, options) {
46
+ // convert expiresIn from seconds to milliseconds and use 90% of expiresIn
49
47
  __privateAdd(this, _getAuthSession);
50
48
  __privateAdd(this, _login);
51
49
  __privateAdd(this, _createSrpLoginRawMessage);
@@ -90,7 +88,8 @@ getAuthSession_fn = async function() {
90
88
  }
91
89
  const currentTime = Date.now();
92
90
  const sessionAge = currentTime - auth.token.obtainedAt;
93
- if (sessionAge < SESSION_LIFETIME_MS) {
91
+ const refreshThreshold = auth.token.expiresIn * 1e3 * 0.9;
92
+ if (sessionAge < refreshThreshold) {
94
93
  return auth;
95
94
  }
96
95
  return null;
@@ -110,7 +109,8 @@ login_fn = async function() {
110
109
  );
111
110
  const tokenResponse = await authorizeOIDC(
112
111
  authResponse.token,
113
- __privateGet(this, _config).env
112
+ __privateGet(this, _config).env,
113
+ __privateGet(this, _config).platform
114
114
  );
115
115
  const result = {
116
116
  profile: authResponse.profile,
@@ -127,4 +127,4 @@ createSrpLoginRawMessage_fn = function(nonce, publicKey) {
127
127
  export {
128
128
  SRPJwtBearerAuth
129
129
  };
130
- //# sourceMappingURL=chunk-VXPVURGH.mjs.map
130
+ //# sourceMappingURL=chunk-Y46NMA3V.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/authentication-jwt-bearer/flow-srp.ts"],"sourcesContent":["import { ValidationError } from '../errors';\nimport { getMetaMaskProviderEIP6963 } from '../utils/eip-6963-metamask-provider';\nimport { MESSAGE_SIGNING_SNAP } from '../utils/messaging-signing-snap-requests';\nimport { authenticate, authorizeOIDC, getNonce } from './services';\nimport type {\n AuthConfig,\n AuthSigningOptions,\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_SRP_Options = {\n storage: AuthStorageOptions;\n signing?: AuthSigningOptions;\n};\n\nconst defaultEIP6963SigningOptions: AuthSigningOptions = {\n getIdentifier: async (): Promise<string> => {\n const provider = await getMetaMaskProviderEIP6963();\n if (!provider) {\n throw new ValidationError('No MetaMask wallet connected');\n }\n return await MESSAGE_SIGNING_SNAP.getPublicKey(provider);\n },\n signMessage: async (message: string): Promise<string> => {\n const provider = await getMetaMaskProviderEIP6963();\n if (!provider) {\n throw new ValidationError('No MetaMask wallet connected');\n }\n if (!message.startsWith('metamask:')) {\n throw new ValidationError('message must start with \"metamask:\"');\n }\n const formattedMessage = message as `metamask:${string}`;\n return await MESSAGE_SIGNING_SNAP.signMessage(provider, formattedMessage);\n },\n};\n\nexport class SRPJwtBearerAuth implements IBaseAuth {\n #config: AuthConfig;\n\n #options: Required<JwtBearerAuth_SRP_Options>;\n\n constructor(\n config: AuthConfig & { type: AuthType.SRP },\n options: JwtBearerAuth_SRP_Options,\n ) {\n this.#config = config;\n this.#options = {\n storage: options.storage,\n signing: options.signing ?? defaultEIP6963SigningOptions,\n };\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 return await this.#options.signing.getIdentifier();\n }\n\n async signMessage(message: string): Promise<string> {\n return await this.#options.signing.signMessage(message);\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 // Nonce\n const address = await this.getIdentifier();\n const nonceRes = await getNonce(address, this.#config.env);\n const publicKey = await this.#options.signing.getIdentifier();\n const rawMessage = this.#createSrpLoginRawMessage(\n nonceRes.nonce,\n publicKey,\n );\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 #createSrpLoginRawMessage(\n nonce: string,\n publicKey: string,\n ): `metamask:${string}:${string}` {\n return `metamask:${nonce}:${publicKey}` as const;\n }\n}\n"],"mappings":"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","names":[]}