@metamask/profile-sync-controller 27.1.0 → 28.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +41 -1
  2. package/dist/controllers/authentication/AuthenticationController-method-action-types.cjs +7 -0
  3. package/dist/controllers/authentication/AuthenticationController-method-action-types.cjs.map +1 -0
  4. package/dist/controllers/authentication/AuthenticationController-method-action-types.d.cts +48 -0
  5. package/dist/controllers/authentication/AuthenticationController-method-action-types.d.cts.map +1 -0
  6. package/dist/controllers/authentication/AuthenticationController-method-action-types.d.mts +48 -0
  7. package/dist/controllers/authentication/AuthenticationController-method-action-types.d.mts.map +1 -0
  8. package/dist/controllers/authentication/AuthenticationController-method-action-types.mjs +6 -0
  9. package/dist/controllers/authentication/AuthenticationController-method-action-types.mjs.map +1 -0
  10. package/dist/controllers/authentication/AuthenticationController.cjs +50 -37
  11. package/dist/controllers/authentication/AuthenticationController.cjs.map +1 -1
  12. package/dist/controllers/authentication/AuthenticationController.d.cts +4 -16
  13. package/dist/controllers/authentication/AuthenticationController.d.cts.map +1 -1
  14. package/dist/controllers/authentication/AuthenticationController.d.mts +4 -16
  15. package/dist/controllers/authentication/AuthenticationController.d.mts.map +1 -1
  16. package/dist/controllers/authentication/AuthenticationController.mjs +49 -37
  17. package/dist/controllers/authentication/AuthenticationController.mjs.map +1 -1
  18. package/dist/controllers/authentication/index.cjs +3 -7
  19. package/dist/controllers/authentication/index.cjs.map +1 -1
  20. package/dist/controllers/authentication/index.d.cts +3 -3
  21. package/dist/controllers/authentication/index.d.cts.map +1 -1
  22. package/dist/controllers/authentication/index.d.mts +3 -3
  23. package/dist/controllers/authentication/index.d.mts.map +1 -1
  24. package/dist/controllers/authentication/index.mjs +2 -3
  25. package/dist/controllers/authentication/index.mjs.map +1 -1
  26. package/dist/controllers/authentication/mocks/mockResponses.cjs +44 -5
  27. package/dist/controllers/authentication/mocks/mockResponses.cjs.map +1 -1
  28. package/dist/controllers/authentication/mocks/mockResponses.d.cts +9 -0
  29. package/dist/controllers/authentication/mocks/mockResponses.d.cts.map +1 -1
  30. package/dist/controllers/authentication/mocks/mockResponses.d.mts +9 -0
  31. package/dist/controllers/authentication/mocks/mockResponses.d.mts.map +1 -1
  32. package/dist/controllers/authentication/mocks/mockResponses.mjs +42 -4
  33. package/dist/controllers/authentication/mocks/mockResponses.mjs.map +1 -1
  34. package/dist/controllers/user-storage/UserStorageController-method-action-types.cjs +7 -0
  35. package/dist/controllers/user-storage/UserStorageController-method-action-types.cjs.map +1 -0
  36. package/dist/controllers/user-storage/UserStorageController-method-action-types.d.cts +137 -0
  37. package/dist/controllers/user-storage/UserStorageController-method-action-types.d.cts.map +1 -0
  38. package/dist/controllers/user-storage/UserStorageController-method-action-types.d.mts +137 -0
  39. package/dist/controllers/user-storage/UserStorageController-method-action-types.d.mts.map +1 -0
  40. package/dist/controllers/user-storage/UserStorageController-method-action-types.mjs +6 -0
  41. package/dist/controllers/user-storage/UserStorageController-method-action-types.mjs.map +1 -0
  42. package/dist/controllers/user-storage/UserStorageController.cjs +19 -13
  43. package/dist/controllers/user-storage/UserStorageController.cjs.map +1 -1
  44. package/dist/controllers/user-storage/UserStorageController.d.cts +6 -19
  45. package/dist/controllers/user-storage/UserStorageController.d.cts.map +1 -1
  46. package/dist/controllers/user-storage/UserStorageController.d.mts +6 -19
  47. package/dist/controllers/user-storage/UserStorageController.d.mts.map +1 -1
  48. package/dist/controllers/user-storage/UserStorageController.mjs +18 -13
  49. package/dist/controllers/user-storage/UserStorageController.mjs.map +1 -1
  50. package/dist/controllers/user-storage/contact-syncing/types.cjs.map +1 -1
  51. package/dist/controllers/user-storage/contact-syncing/types.d.cts +1 -1
  52. package/dist/controllers/user-storage/contact-syncing/types.d.cts.map +1 -1
  53. package/dist/controllers/user-storage/contact-syncing/types.d.mts +1 -1
  54. package/dist/controllers/user-storage/contact-syncing/types.d.mts.map +1 -1
  55. package/dist/controllers/user-storage/contact-syncing/types.mjs.map +1 -1
  56. package/dist/controllers/user-storage/index.cjs +3 -7
  57. package/dist/controllers/user-storage/index.cjs.map +1 -1
  58. package/dist/controllers/user-storage/index.d.cts +3 -3
  59. package/dist/controllers/user-storage/index.d.cts.map +1 -1
  60. package/dist/controllers/user-storage/index.d.mts +3 -3
  61. package/dist/controllers/user-storage/index.d.mts.map +1 -1
  62. package/dist/controllers/user-storage/index.mjs +2 -3
  63. package/dist/controllers/user-storage/index.mjs.map +1 -1
  64. package/dist/sdk/authentication-jwt-bearer/flow-srp.cjs +6 -9
  65. package/dist/sdk/authentication-jwt-bearer/flow-srp.cjs.map +1 -1
  66. package/dist/sdk/authentication-jwt-bearer/flow-srp.d.cts +1 -1
  67. package/dist/sdk/authentication-jwt-bearer/flow-srp.d.cts.map +1 -1
  68. package/dist/sdk/authentication-jwt-bearer/flow-srp.d.mts +1 -1
  69. package/dist/sdk/authentication-jwt-bearer/flow-srp.d.mts.map +1 -1
  70. package/dist/sdk/authentication-jwt-bearer/flow-srp.mjs +6 -9
  71. package/dist/sdk/authentication-jwt-bearer/flow-srp.mjs.map +1 -1
  72. package/dist/sdk/authentication.cjs +2 -2
  73. package/dist/sdk/authentication.cjs.map +1 -1
  74. package/dist/sdk/authentication.d.cts +1 -1
  75. package/dist/sdk/authentication.d.cts.map +1 -1
  76. package/dist/sdk/authentication.d.mts +1 -1
  77. package/dist/sdk/authentication.d.mts.map +1 -1
  78. package/dist/sdk/authentication.mjs +2 -2
  79. package/dist/sdk/authentication.mjs.map +1 -1
  80. package/dist/sdk/mocks/auth.cjs +1 -1
  81. package/dist/sdk/mocks/auth.cjs.map +1 -1
  82. package/dist/sdk/mocks/auth.d.cts +1 -1
  83. package/dist/sdk/mocks/auth.d.cts.map +1 -1
  84. package/dist/sdk/mocks/auth.d.mts +1 -1
  85. package/dist/sdk/mocks/auth.d.mts.map +1 -1
  86. package/dist/sdk/mocks/auth.mjs +1 -1
  87. package/dist/sdk/mocks/auth.mjs.map +1 -1
  88. package/dist/sdk/utils/validate-login-response.cjs +30 -3
  89. package/dist/sdk/utils/validate-login-response.cjs.map +1 -1
  90. package/dist/sdk/utils/validate-login-response.d.cts +7 -3
  91. package/dist/sdk/utils/validate-login-response.d.cts.map +1 -1
  92. package/dist/sdk/utils/validate-login-response.d.mts +7 -3
  93. package/dist/sdk/utils/validate-login-response.d.mts.map +1 -1
  94. package/dist/sdk/utils/validate-login-response.mjs +30 -3
  95. package/dist/sdk/utils/validate-login-response.mjs.map +1 -1
  96. package/package.json +16 -13
@@ -1,10 +1,14 @@
1
1
  import type { LoginResponse } from "../authentication.mjs";
2
2
  /**
3
- * Validates Shape is LoginResponse
4
- * NOTE - validation is pretty loose, we can improve this by using external libs like Zod for improved/tighter validation
3
+ * Validates that the input is a well-formed, non-expired LoginResponse.
4
+ *
5
+ * Checks structural shape (token + profile objects exist) and verifies
6
+ * the JWT access token's `exp` claim is still in the future. This acts
7
+ * as a hard guard against stale cached tokens regardless of client-side
8
+ * TTL tracking (obtainedAt / expiresIn), which can be corrupted.
5
9
  *
6
10
  * @param input - unknown/untyped input
7
- * @returns boolean if input is LoginResponse
11
+ * @returns boolean if input is a valid, non-expired LoginResponse
8
12
  */
9
13
  export declare function validateLoginResponse(input: unknown): input is LoginResponse;
10
14
  //# sourceMappingURL=validate-login-response.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-login-response.d.mts","sourceRoot":"","sources":["../../../src/sdk/utils/validate-login-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA0B;AAEvD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAY5E"}
1
+ {"version":3,"file":"validate-login-response.d.mts","sourceRoot":"","sources":["../../../src/sdk/utils/validate-login-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA0B;AAEvD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAgB5E"}
@@ -1,9 +1,13 @@
1
1
  /**
2
- * Validates Shape is LoginResponse
3
- * NOTE - validation is pretty loose, we can improve this by using external libs like Zod for improved/tighter validation
2
+ * Validates that the input is a well-formed, non-expired LoginResponse.
3
+ *
4
+ * Checks structural shape (token + profile objects exist) and verifies
5
+ * the JWT access token's `exp` claim is still in the future. This acts
6
+ * as a hard guard against stale cached tokens regardless of client-side
7
+ * TTL tracking (obtainedAt / expiresIn), which can be corrupted.
4
8
  *
5
9
  * @param input - unknown/untyped input
6
- * @returns boolean if input is LoginResponse
10
+ * @returns boolean if input is a valid, non-expired LoginResponse
7
11
  */
8
12
  export function validateLoginResponse(input) {
9
13
  const assumedInput = input;
@@ -13,6 +17,29 @@ export function validateLoginResponse(input) {
13
17
  if (!assumedInput?.token || !assumedInput?.profile) {
14
18
  return false;
15
19
  }
20
+ if (isJwtExpired(assumedInput.token.accessToken)) {
21
+ return false;
22
+ }
16
23
  return true;
17
24
  }
25
+ /**
26
+ * Checks whether a JWT has expired by decoding its `exp` claim.
27
+ *
28
+ * @param token - A JWT string.
29
+ * @returns true if the token is expired or cannot be decoded; false if still valid.
30
+ */
31
+ function isJwtExpired(token) {
32
+ try {
33
+ const parts = token.split('.');
34
+ if (parts.length !== 3) {
35
+ return true;
36
+ }
37
+ const base64 = parts[1].replace(/-/gu, '+').replace(/_/gu, '/');
38
+ const { exp } = JSON.parse(atob(base64));
39
+ return !Number.isInteger(exp) || exp * 1000 <= Date.now();
40
+ }
41
+ catch {
42
+ return true;
43
+ }
44
+ }
18
45
  //# sourceMappingURL=validate-login-response.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-login-response.mjs","sourceRoot":"","sources":["../../../src/sdk/utils/validate-login-response.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,YAAY,GAAG,KAAsB,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import type { LoginResponse } from '../authentication';\n\n/**\n * Validates Shape is LoginResponse\n * NOTE - validation is pretty loose, we can improve this by using external libs like Zod for improved/tighter validation\n *\n * @param input - unknown/untyped input\n * @returns boolean if input is LoginResponse\n */\nexport function validateLoginResponse(input: unknown): input is LoginResponse {\n const assumedInput = input as LoginResponse;\n\n if (!assumedInput) {\n return false;\n }\n\n if (!assumedInput?.token || !assumedInput?.profile) {\n return false;\n }\n\n return true;\n}\n"]}
1
+ {"version":3,"file":"validate-login-response.mjs","sourceRoot":"","sources":["../../../src/sdk/utils/validate-login-response.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,YAAY,GAAG,KAAsB,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import type { LoginResponse } from '../authentication';\n\n/**\n * Validates that the input is a well-formed, non-expired LoginResponse.\n *\n * Checks structural shape (token + profile objects exist) and verifies\n * the JWT access token's `exp` claim is still in the future. This acts\n * as a hard guard against stale cached tokens regardless of client-side\n * TTL tracking (obtainedAt / expiresIn), which can be corrupted.\n *\n * @param input - unknown/untyped input\n * @returns boolean if input is a valid, non-expired LoginResponse\n */\nexport function validateLoginResponse(input: unknown): input is LoginResponse {\n const assumedInput = input as LoginResponse;\n\n if (!assumedInput) {\n return false;\n }\n\n if (!assumedInput?.token || !assumedInput?.profile) {\n return false;\n }\n\n if (isJwtExpired(assumedInput.token.accessToken)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Checks whether a JWT has expired by decoding its `exp` claim.\n *\n * @param token - A JWT string.\n * @returns true if the token is expired or cannot be decoded; false if still valid.\n */\nfunction isJwtExpired(token: string): boolean {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) {\n return true;\n }\n const base64 = parts[1].replace(/-/gu, '+').replace(/_/gu, '/');\n const { exp } = JSON.parse(atob(base64));\n return !Number.isInteger(exp) || exp * 1000 <= Date.now();\n } catch {\n return true;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/profile-sync-controller",
3
- "version": "27.1.0",
3
+ "version": "28.0.1",
4
4
  "description": "The profile sync helps developers synchronize data across multiple clients and devices in a privacy-preserving way. All data saved in the user storage database is encrypted client-side to preserve privacy. The user storage provides a modular design, giving developers the flexibility to construct and manage their storage spaces in a way that best suits their needs",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -93,7 +93,9 @@
93
93
  "build:docs": "typedoc",
94
94
  "changelog:update": "../../scripts/update-changelog.sh @metamask/profile-sync-controller",
95
95
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/profile-sync-controller",
96
- "publish:preview": "yarn npm publish --tag preview",
96
+ "generate-method-action-types": "yarn generate-method-action-types:authentication \"$@\" && yarn generate-method-action-types:user-storage \"$@\"",
97
+ "generate-method-action-types:authentication": "tsx ../../scripts/generate-method-action-types.ts src/controllers/authentication",
98
+ "generate-method-action-types:user-storage": "tsx ../../scripts/generate-method-action-types.ts src/controllers/user-storage",
97
99
  "since-latest-release": "../../scripts/since-latest-release.sh",
98
100
  "test": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter",
99
101
  "test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache",
@@ -101,10 +103,10 @@
101
103
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
102
104
  },
103
105
  "dependencies": {
104
- "@metamask/address-book-controller": "^7.0.1",
105
- "@metamask/base-controller": "^9.0.0",
106
- "@metamask/keyring-controller": "^25.1.0",
107
- "@metamask/messenger": "^0.3.0",
106
+ "@metamask/address-book-controller": "^7.1.1",
107
+ "@metamask/base-controller": "^9.0.1",
108
+ "@metamask/keyring-controller": "^25.1.1",
109
+ "@metamask/messenger": "^1.0.0",
108
110
  "@metamask/snaps-controllers": "^17.2.0",
109
111
  "@metamask/snaps-sdk": "^10.3.0",
110
112
  "@metamask/snaps-utils": "^11.7.0",
@@ -119,18 +121,19 @@
119
121
  "@lavamoat/allow-scripts": "^3.0.4",
120
122
  "@lavamoat/preinstall-always-fail": "^2.1.0",
121
123
  "@metamask/auto-changelog": "^3.4.4",
122
- "@metamask/keyring-api": "^21.0.0",
123
- "@metamask/keyring-internal-api": "^9.0.0",
124
+ "@metamask/keyring-api": "^21.6.0",
125
+ "@metamask/keyring-internal-api": "^10.0.0",
124
126
  "@metamask/providers": "^22.1.0",
125
127
  "@ts-bridge/cli": "^0.6.4",
126
- "@types/jest": "^27.5.2",
128
+ "@types/jest": "^29.5.14",
127
129
  "deepmerge": "^4.2.2",
128
130
  "ethers": "^6.12.0",
129
- "jest": "^27.5.1",
130
- "jest-environment-jsdom": "^27.5.1",
131
+ "jest": "^29.7.0",
132
+ "jest-environment-jsdom": "^29.7.0",
131
133
  "nock": "^13.3.1",
132
- "ts-jest": "^27.1.5",
133
- "typedoc": "^0.24.8",
134
+ "ts-jest": "^29.2.5",
135
+ "tsx": "^4.20.5",
136
+ "typedoc": "^0.25.13",
134
137
  "typedoc-plugin-missing-exports": "^2.0.0",
135
138
  "typescript": "~5.3.3",
136
139
  "webextension-polyfill": "^0.12.0"