velocious 1.0.474 → 1.0.476

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 (141) hide show
  1. package/README.md +10 -2
  2. package/build/configuration-types.js +39 -1
  3. package/build/configuration.js +46 -1
  4. package/build/database/drivers/base.js +67 -3
  5. package/build/database/drivers/mssql/index.js +13 -0
  6. package/build/database/drivers/mssql/sql/remove-index.js +6 -0
  7. package/build/database/drivers/mysql/index.js +87 -7
  8. package/build/database/drivers/mysql/sql/remove-index.js +6 -0
  9. package/build/database/drivers/pgsql/index.js +13 -0
  10. package/build/database/drivers/pgsql/sql/remove-index.js +6 -0
  11. package/build/database/drivers/sqlite/base.js +13 -0
  12. package/build/database/drivers/sqlite/connection-sql-js.js +16 -5
  13. package/build/database/drivers/sqlite/index.web.js +29 -15
  14. package/build/database/drivers/sqlite/sql/remove-index.js +6 -0
  15. package/build/database/drivers/sqlite/web-persistence.js +521 -0
  16. package/build/database/migration/index.js +44 -0
  17. package/build/database/pool/base-methods-forward.js +1 -0
  18. package/build/database/query/remove-index-base.js +39 -0
  19. package/build/database/record/index.js +25 -9
  20. package/build/environment-handlers/node/cli/commands/generate/base-models.js +36 -0
  21. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +63 -0
  22. package/build/frontend-model-controller.js +401 -4
  23. package/build/frontend-model-resource/base-resource.js +5 -1
  24. package/build/frontend-models/base.js +146 -2
  25. package/build/frontend-models/query.js +3 -3
  26. package/build/frontend-models/resource-definition.js +304 -2
  27. package/build/routes/hooks/frontend-model-command-route-hook.js +16 -0
  28. package/build/src/configuration-types.d.ts +118 -2
  29. package/build/src/configuration-types.d.ts.map +1 -1
  30. package/build/src/configuration-types.js +36 -2
  31. package/build/src/configuration.d.ts +18 -1
  32. package/build/src/configuration.d.ts.map +1 -1
  33. package/build/src/configuration.js +42 -2
  34. package/build/src/database/drivers/base.d.ts +50 -0
  35. package/build/src/database/drivers/base.d.ts.map +1 -1
  36. package/build/src/database/drivers/base.js +62 -4
  37. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  38. package/build/src/database/drivers/mssql/index.js +12 -1
  39. package/build/src/database/drivers/mssql/sql/remove-index.d.ts +4 -0
  40. package/build/src/database/drivers/mssql/sql/remove-index.d.ts.map +1 -0
  41. package/build/src/database/drivers/mssql/sql/remove-index.js +5 -0
  42. package/build/src/database/drivers/mysql/index.d.ts +32 -3
  43. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  44. package/build/src/database/drivers/mysql/index.js +76 -7
  45. package/build/src/database/drivers/mysql/sql/remove-index.d.ts +4 -0
  46. package/build/src/database/drivers/mysql/sql/remove-index.d.ts.map +1 -0
  47. package/build/src/database/drivers/mysql/sql/remove-index.js +5 -0
  48. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  49. package/build/src/database/drivers/pgsql/index.js +12 -1
  50. package/build/src/database/drivers/pgsql/sql/remove-index.d.ts +4 -0
  51. package/build/src/database/drivers/pgsql/sql/remove-index.d.ts.map +1 -0
  52. package/build/src/database/drivers/pgsql/sql/remove-index.js +5 -0
  53. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  54. package/build/src/database/drivers/sqlite/base.js +12 -1
  55. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts +8 -1
  56. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -1
  57. package/build/src/database/drivers/sqlite/connection-sql-js.js +15 -6
  58. package/build/src/database/drivers/sqlite/index.web.d.ts +5 -5
  59. package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
  60. package/build/src/database/drivers/sqlite/index.web.js +27 -13
  61. package/build/src/database/drivers/sqlite/sql/remove-index.d.ts +4 -0
  62. package/build/src/database/drivers/sqlite/sql/remove-index.d.ts.map +1 -0
  63. package/build/src/database/drivers/sqlite/sql/remove-index.js +5 -0
  64. package/build/src/database/drivers/sqlite/web-persistence.d.ts +77 -0
  65. package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -0
  66. package/build/src/database/drivers/sqlite/web-persistence.js +464 -0
  67. package/build/src/database/migration/index.d.ts +25 -0
  68. package/build/src/database/migration/index.d.ts.map +1 -1
  69. package/build/src/database/migration/index.js +39 -1
  70. package/build/src/database/pool/base-methods-forward.d.ts.map +1 -1
  71. package/build/src/database/pool/base-methods-forward.js +2 -1
  72. package/build/src/database/query/remove-index-base.d.ts +35 -0
  73. package/build/src/database/query/remove-index-base.d.ts.map +1 -0
  74. package/build/src/database/query/remove-index-base.js +34 -0
  75. package/build/src/database/record/index.d.ts +11 -0
  76. package/build/src/database/record/index.d.ts.map +1 -1
  77. package/build/src/database/record/index.js +26 -11
  78. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +15 -0
  79. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  80. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +33 -1
  81. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +30 -0
  82. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  83. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +53 -1
  84. package/build/src/frontend-model-controller.d.ts +96 -0
  85. package/build/src/frontend-model-controller.d.ts.map +1 -1
  86. package/build/src/frontend-model-controller.js +359 -5
  87. package/build/src/frontend-model-resource/base-resource.d.ts +4 -2
  88. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  89. package/build/src/frontend-model-resource/base-resource.js +7 -2
  90. package/build/src/frontend-models/base.d.ts +29 -0
  91. package/build/src/frontend-models/base.d.ts.map +1 -1
  92. package/build/src/frontend-models/base.js +131 -3
  93. package/build/src/frontend-models/query.js +4 -4
  94. package/build/src/frontend-models/resource-definition.d.ts +6 -0
  95. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  96. package/build/src/frontend-models/resource-definition.js +272 -3
  97. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts.map +1 -1
  98. package/build/src/routes/hooks/frontend-model-command-route-hook.js +15 -1
  99. package/build/src/sync/device-identity.d.ts +240 -0
  100. package/build/src/sync/device-identity.d.ts.map +1 -0
  101. package/build/src/sync/device-identity.js +454 -0
  102. package/build/src/sync/local-mutation-log.d.ts +212 -0
  103. package/build/src/sync/local-mutation-log.d.ts.map +1 -0
  104. package/build/src/sync/local-mutation-log.js +404 -0
  105. package/build/src/sync/offline-grant.d.ts +157 -0
  106. package/build/src/sync/offline-grant.d.ts.map +1 -0
  107. package/build/src/sync/offline-grant.js +292 -0
  108. package/build/sync/device-identity.js +503 -0
  109. package/build/sync/local-mutation-log.js +448 -0
  110. package/build/sync/offline-grant.js +327 -0
  111. package/build/tsconfig.tsbuildinfo +1 -1
  112. package/package.json +3 -3
  113. package/src/configuration-types.js +39 -1
  114. package/src/configuration.js +46 -1
  115. package/src/database/drivers/base.js +67 -3
  116. package/src/database/drivers/mssql/index.js +13 -0
  117. package/src/database/drivers/mssql/sql/remove-index.js +6 -0
  118. package/src/database/drivers/mysql/index.js +87 -7
  119. package/src/database/drivers/mysql/sql/remove-index.js +6 -0
  120. package/src/database/drivers/pgsql/index.js +13 -0
  121. package/src/database/drivers/pgsql/sql/remove-index.js +6 -0
  122. package/src/database/drivers/sqlite/base.js +13 -0
  123. package/src/database/drivers/sqlite/connection-sql-js.js +16 -5
  124. package/src/database/drivers/sqlite/index.web.js +29 -15
  125. package/src/database/drivers/sqlite/sql/remove-index.js +6 -0
  126. package/src/database/drivers/sqlite/web-persistence.js +521 -0
  127. package/src/database/migration/index.js +44 -0
  128. package/src/database/pool/base-methods-forward.js +1 -0
  129. package/src/database/query/remove-index-base.js +39 -0
  130. package/src/database/record/index.js +25 -9
  131. package/src/environment-handlers/node/cli/commands/generate/base-models.js +36 -0
  132. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +63 -0
  133. package/src/frontend-model-controller.js +401 -4
  134. package/src/frontend-model-resource/base-resource.js +5 -1
  135. package/src/frontend-models/base.js +146 -2
  136. package/src/frontend-models/query.js +3 -3
  137. package/src/frontend-models/resource-definition.js +304 -2
  138. package/src/routes/hooks/frontend-model-command-route-hook.js +16 -0
  139. package/src/sync/device-identity.js +503 -0
  140. package/src/sync/local-mutation-log.js +448 -0
  141. package/src/sync/offline-grant.js +327 -0
@@ -13,6 +13,20 @@ const FRONTEND_MODEL_CONTROLLER_PATH = new URL("../../frontend-model-controller.
13
13
  */
14
14
  export default async function frontendModelCommandRouteHook({ configuration, currentPath, hasMatchingCustomRoute }) {
15
15
  const normalizedCurrentPath = normalizePath(currentPath);
16
+ if (normalizedCurrentPath === "/frontend-models/sync/bootstrap") {
17
+ return {
18
+ action: "frontend-sync-bootstrap",
19
+ controller: "velocious/api",
20
+ controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
21
+ };
22
+ }
23
+ if (normalizedCurrentPath === "/frontend-models/sync/replay") {
24
+ return {
25
+ action: "frontend-sync-replay",
26
+ controller: "velocious/api",
27
+ controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
28
+ };
29
+ }
16
30
  if (normalizedCurrentPath === SHARED_FRONTEND_MODEL_API_PATH) {
17
31
  return {
18
32
  action: "frontend-api",
@@ -84,4 +98,4 @@ function normalizePath(path) {
84
98
  }
85
99
  return withLeadingSlash;
86
100
  }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29tbWFuZC1yb3V0ZS1ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JvdXRlcy9ob29rcy9mcm9udGVuZC1tb2RlbC1jb21tYW5kLXJvdXRlLWhvb2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxtREFBbUQsRUFBQyxNQUFNLDZDQUE2QyxDQUFBO0FBQy9HLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxpQ0FBaUMsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFBO0FBRXhKLE1BQU0sOEJBQThCLEdBQUcsa0JBQWtCLENBQUE7QUFDekQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUUxRzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFDO0lBQzlHLE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRXhELElBQUkscUJBQXFCLEtBQUssOEJBQThCLEVBQUUsQ0FBQztRQUM3RCxPQUFPO1lBQ0wsTUFBTSxFQUFFLGNBQWM7WUFDdEIsVUFBVSxFQUFFLGVBQWU7WUFDM0IsY0FBYyxFQUFFLDhCQUE4QjtTQUMvQyxDQUFBO0lBQ0gsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSxJQUFJLHNCQUFzQjtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRXZDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO0lBQzFELE1BQU0sa0JBQWtCLEdBQUcsaUNBQWlDLENBQUM7UUFDM0QsZUFBZTtRQUNmLFdBQVcsRUFBRSxxQkFBcUI7S0FDbkMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZCOzt1Q0FFK0I7UUFDL0IsTUFBTSxNQUFNLEdBQUc7WUFDYixvQ0FBb0MsRUFBRSxrQkFBa0IsQ0FBQyxVQUFVO1lBQ25FLCtCQUErQixFQUFFLGtCQUFrQixDQUFDLEtBQUs7WUFDekQsS0FBSyxFQUFFLGtCQUFrQixDQUFDLFNBQVM7U0FDcEMsQ0FBQTtRQUVELElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUE7UUFDekMsQ0FBQztRQUVELE9BQU87WUFDTCxNQUFNLEVBQUUseUJBQXlCO1lBQ2pDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDL0QsY0FBYyxFQUFFLDhCQUE4QjtZQUM5QyxNQUFNO1NBQ1AsQ0FBQTtJQUNILENBQUM7SUFFRCxLQUFLLE1BQU0sY0FBYyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLG1EQUFtRCxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRXJGLEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDL0MsTUFBTSxZQUFZLEdBQUcseUJBQXlCLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLENBQUE7WUFDN0UsTUFBTSxzQkFBc0IsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDMUQsTUFBTSxjQUFjLEdBQUcsR0FBRyxzQkFBc0IsR0FBRyxDQUFBO1lBRW5ELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO2dCQUFFLFNBQVE7WUFFL0QsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN0RSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVE7WUFFdkMsTUFBTSxNQUFNLEdBQUcsNkJBQTZCLENBQUMsRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQTtZQUMxRixJQUFJLENBQUMsTUFBTTtnQkFBRSxTQUFRO1lBQ3JCLE1BQU0sVUFBVSxHQUFHLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFFN0QsT0FBTztnQkFDTCxNQUFNLEVBQUUsWUFBWSxNQUFNLEVBQUU7Z0JBQzVCLFVBQVU7Z0JBQ1YsY0FBYyxFQUFFLDhCQUE4QjthQUMvQyxDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsSUFBSTtJQUN6QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUVqRSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELE9BQU8sZ0JBQWdCLENBQUE7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxSZXNvdXJjZXNXaXRoQnVpbHRJbnNGb3JCYWNrZW5kUHJvamVjdH0gZnJvbSBcIi4uLy4uL2Zyb250ZW5kLW1vZGVscy9idWlsdC1pbi1yZXNvdXJjZXMuanNcIlxuaW1wb3J0IHtmcm9udGVuZE1vZGVsQWN0aW9uRm9yQ29tbWFuZCwgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRGb3JQYXRoLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRofSBmcm9tIFwiLi4vLi4vZnJvbnRlbmQtbW9kZWxzL3Jlc291cmNlLWRlZmluaXRpb24uanNcIlxuXG5jb25zdCBTSEFSRURfRlJPTlRFTkRfTU9ERUxfQVBJX1BBVEggPSBcIi9mcm9udGVuZC1tb2RlbHNcIlxuY29uc3QgRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRIID0gbmV3IFVSTChcIi4uLy4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIiwgaW1wb3J0Lm1ldGEudXJsKS5ocmVmXG5cbi8qKlxuICogUnVucyBmcm9udGVuZCBtb2RlbCBjb21tYW5kIHJvdXRlIGhvb2suXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEhvb2sgYXJncy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY3VycmVudFBhdGggLSBSZXF1ZXN0IHBhdGggd2l0aG91dCBxdWVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZV0gLSBTZXQgd2hlbiB0aGUgcmVxdWVzdCBwYXRoIG1hdGNoZXMgYW4gZXhwbGljaXQgY3VzdG9tIHJvdXRlLlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Sb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSAtIFJvdXRlIG92ZXJyaWRlIG9yIG51bGwuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxDb21tYW5kUm91dGVIb29rKHtjb25maWd1cmF0aW9uLCBjdXJyZW50UGF0aCwgaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEN1cnJlbnRQYXRoID0gbm9ybWFsaXplUGF0aChjdXJyZW50UGF0aClcblxuICBpZiAobm9ybWFsaXplZEN1cnJlbnRQYXRoID09PSBTSEFSRURfRlJPTlRFTkRfTU9ERUxfQVBJX1BBVEgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLWFwaVwiLFxuICAgICAgY29udHJvbGxlcjogXCJ2ZWxvY2lvdXMvYXBpXCIsXG4gICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRIXG4gICAgfVxuICB9XG5cbiAgLy8gRG9uJ3QgaW50ZXJjZXB0IHBhdGhzIHRoYXQgbWF0Y2ggZXhwbGljaXRseSBkZWZpbmVkIGN1c3RvbSByb3V0ZXNcbiAgaWYgKGhhc01hdGNoaW5nQ3VzdG9tUm91dGUpIHJldHVybiBudWxsXG5cbiAgY29uc3QgYmFja2VuZFByb2plY3RzID0gY29uZmlndXJhdGlvbi5nZXRCYWNrZW5kUHJvamVjdHMoKVxuICBjb25zdCBjdXN0b21Db21tYW5kTWF0Y2ggPSBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEZvclBhdGgoe1xuICAgIGJhY2tlbmRQcm9qZWN0cyxcbiAgICBjdXJyZW50UGF0aDogbm9ybWFsaXplZEN1cnJlbnRQYXRoXG4gIH0pXG5cbiAgaWYgKGN1c3RvbUNvbW1hbmRNYXRjaCkge1xuICAgIC8qKlxuICAgICAqIFBhcmFtcy5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRNZXRob2ROYW1lOiBjdXN0b21Db21tYW5kTWF0Y2gubWV0aG9kTmFtZSxcbiAgICAgIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kU2NvcGU6IGN1c3RvbUNvbW1hbmRNYXRjaC5zY29wZSxcbiAgICAgIG1vZGVsOiBjdXN0b21Db21tYW5kTWF0Y2gubW9kZWxOYW1lXG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbUNvbW1hbmRNYXRjaC5tZW1iZXJJZCkge1xuICAgICAgcGFyYW1zLmlkID0gY3VzdG9tQ29tbWFuZE1hdGNoLm1lbWJlcklkXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZC1jdXN0b20tY29tbWFuZFwiLFxuICAgICAgY29udHJvbGxlcjogY3VzdG9tQ29tbWFuZE1hdGNoLnJlc291cmNlUGF0aC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpLFxuICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSCxcbiAgICAgIHBhcmFtc1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuXG4gICAgZm9yIChjb25zdCBtb2RlbE5hbWUgaW4gcmVzb3VyY2VzKSB7XG4gICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgcmVzb3VyY2VQYXRoID0gZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aChtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbilcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGggPSBub3JtYWxpemVQYXRoKHJlc291cmNlUGF0aClcbiAgICAgIGNvbnN0IGV4cGVjdGVkUHJlZml4ID0gYCR7bm9ybWFsaXplZFJlc291cmNlUGF0aH0vYFxuXG4gICAgICBpZiAoIW5vcm1hbGl6ZWRDdXJyZW50UGF0aC5zdGFydHNXaXRoKGV4cGVjdGVkUHJlZml4KSkgY29udGludWVcblxuICAgICAgY29uc3QgY29tbWFuZE5hbWUgPSBub3JtYWxpemVkQ3VycmVudFBhdGguc2xpY2UoZXhwZWN0ZWRQcmVmaXgubGVuZ3RoKVxuICAgICAgaWYgKGNvbW1hbmROYW1lLmluY2x1ZGVzKFwiL1wiKSkgY29udGludWVcblxuICAgICAgY29uc3QgYWN0aW9uID0gZnJvbnRlbmRNb2RlbEFjdGlvbkZvckNvbW1hbmQoe2NvbW1hbmROYW1lLCBtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbn0pXG4gICAgICBpZiAoIWFjdGlvbikgY29udGludWVcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBub3JtYWxpemVkUmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8rLywgXCJcIilcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uOiBgZnJvbnRlbmQtJHthY3Rpb259YCxcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9ybWFsaXplZCBwYXRoIHdpdGggbGVhZGluZyBzbGFzaCBhbmQgbm8gdHJhaWxpbmcgc2xhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICBjb25zdCB3aXRoTGVhZGluZ1NsYXNoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gXG5cbiAgaWYgKHdpdGhMZWFkaW5nU2xhc2gubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiB3aXRoTGVhZGluZ1NsYXNoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgfVxuXG4gIHJldHVybiB3aXRoTGVhZGluZ1NsYXNoXG59XG4iXX0=
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29tbWFuZC1yb3V0ZS1ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JvdXRlcy9ob29rcy9mcm9udGVuZC1tb2RlbC1jb21tYW5kLXJvdXRlLWhvb2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxtREFBbUQsRUFBQyxNQUFNLDZDQUE2QyxDQUFBO0FBQy9HLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxpQ0FBaUMsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFBO0FBRXhKLE1BQU0sOEJBQThCLEdBQUcsa0JBQWtCLENBQUE7QUFDekQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUUxRzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFDO0lBQzlHLE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRXhELElBQUkscUJBQXFCLEtBQUssaUNBQWlDLEVBQUUsQ0FBQztRQUNoRSxPQUFPO1lBQ0wsTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxVQUFVLEVBQUUsZUFBZTtZQUMzQixjQUFjLEVBQUUsOEJBQThCO1NBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxxQkFBcUIsS0FBSyw4QkFBOEIsRUFBRSxDQUFDO1FBQzdELE9BQU87WUFDTCxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFVBQVUsRUFBRSxlQUFlO1lBQzNCLGNBQWMsRUFBRSw4QkFBOEI7U0FDL0MsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLHFCQUFxQixLQUFLLDhCQUE4QixFQUFFLENBQUM7UUFDN0Qs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QixDQUFBO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3R9IGZyb20gXCIuLi8uLi9mcm9udGVuZC1tb2RlbHMvYnVpbHQtaW4tcmVzb3VyY2VzLmpzXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbEFjdGlvbkZvckNvbW1hbmQsIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRm9yUGF0aCwgZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aH0gZnJvbSBcIi4uLy4uL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcblxuY29uc3QgU0hBUkVEX0ZST05URU5EX01PREVMX0FQSV9QQVRIID0gXCIvZnJvbnRlbmQtbW9kZWxzXCJcbmNvbnN0IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSCA9IG5ldyBVUkwoXCIuLi8uLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCIsIGltcG9ydC5tZXRhLnVybCkuaHJlZlxuXG4vKipcbiAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY29tbWFuZCByb3V0ZSBob29rLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBIb29rIGFyZ3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmhhc01hdGNoaW5nQ3VzdG9tUm91dGVdIC0gU2V0IHdoZW4gdGhlIHJlcXVlc3QgcGF0aCBtYXRjaGVzIGFuIGV4cGxpY2l0IGN1c3RvbSByb3V0ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuUm91dGVSZXNvbHZlckhvb2tSZXN1bHQgfCBudWxsPn0gLSBSb3V0ZSBvdmVycmlkZSBvciBudWxsLlxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmcm9udGVuZE1vZGVsQ29tbWFuZFJvdXRlSG9vayh7Y29uZmlndXJhdGlvbiwgY3VycmVudFBhdGgsIGhhc01hdGNoaW5nQ3VzdG9tUm91dGV9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9IG5vcm1hbGl6ZVBhdGgoY3VycmVudFBhdGgpXG5cbiAgaWYgKG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9PT0gXCIvZnJvbnRlbmQtbW9kZWxzL3N5bmMvYm9vdHN0cmFwXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLXN5bmMtYm9vdHN0cmFwXCIsXG4gICAgICBjb250cm9sbGVyOiBcInZlbG9jaW91cy9hcGlcIixcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICB9XG4gIH1cblxuICBpZiAobm9ybWFsaXplZEN1cnJlbnRQYXRoID09PSBcIi9mcm9udGVuZC1tb2RlbHMvc3luYy9yZXBsYXlcIikge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZnJvbnRlbmQtc3luYy1yZXBsYXlcIixcbiAgICAgIGNvbnRyb2xsZXI6IFwidmVsb2Npb3VzL2FwaVwiLFxuICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSFxuICAgIH1cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkQ3VycmVudFBhdGggPT09IFNIQVJFRF9GUk9OVEVORF9NT0RFTF9BUElfUEFUSCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZnJvbnRlbmQtYXBpXCIsXG4gICAgICBjb250cm9sbGVyOiBcInZlbG9jaW91cy9hcGlcIixcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICB9XG4gIH1cblxuICAvLyBEb24ndCBpbnRlcmNlcHQgcGF0aHMgdGhhdCBtYXRjaCBleHBsaWNpdGx5IGRlZmluZWQgY3VzdG9tIHJvdXRlc1xuICBpZiAoaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBiYWNrZW5kUHJvamVjdHMgPSBjb25maWd1cmF0aW9uLmdldEJhY2tlbmRQcm9qZWN0cygpXG4gIGNvbnN0IGN1c3RvbUNvbW1hbmRNYXRjaCA9IGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRm9yUGF0aCh7XG4gICAgYmFja2VuZFByb2plY3RzLFxuICAgIGN1cnJlbnRQYXRoOiBub3JtYWxpemVkQ3VycmVudFBhdGhcbiAgfSlcblxuICBpZiAoY3VzdG9tQ29tbWFuZE1hdGNoKSB7XG4gICAgLyoqXG4gICAgICogUGFyYW1zLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZE1ldGhvZE5hbWU6IGN1c3RvbUNvbW1hbmRNYXRjaC5tZXRob2ROYW1lLFxuICAgICAgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRTY29wZTogY3VzdG9tQ29tbWFuZE1hdGNoLnNjb3BlLFxuICAgICAgbW9kZWw6IGN1c3RvbUNvbW1hbmRNYXRjaC5tb2RlbE5hbWVcbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tQ29tbWFuZE1hdGNoLm1lbWJlcklkKSB7XG4gICAgICBwYXJhbXMuaWQgPSBjdXN0b21Db21tYW5kTWF0Y2gubWVtYmVySWRcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLWN1c3RvbS1jb21tYW5kXCIsXG4gICAgICBjb250cm9sbGVyOiBjdXN0b21Db21tYW5kTWF0Y2gucmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8rLywgXCJcIiksXG4gICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRILFxuICAgICAgcGFyYW1zXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBpbiByZXNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHJlc291cmNlc1ttb2RlbE5hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZVBhdGggPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uKVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc291cmNlUGF0aCA9IG5vcm1hbGl6ZVBhdGgocmVzb3VyY2VQYXRoKVxuICAgICAgY29uc3QgZXhwZWN0ZWRQcmVmaXggPSBgJHtub3JtYWxpemVkUmVzb3VyY2VQYXRofS9gXG5cbiAgICAgIGlmICghbm9ybWFsaXplZEN1cnJlbnRQYXRoLnN0YXJ0c1dpdGgoZXhwZWN0ZWRQcmVmaXgpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjb21tYW5kTmFtZSA9IG5vcm1hbGl6ZWRDdXJyZW50UGF0aC5zbGljZShleHBlY3RlZFByZWZpeC5sZW5ndGgpXG4gICAgICBpZiAoY29tbWFuZE5hbWUuaW5jbHVkZXMoXCIvXCIpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBhY3Rpb24gPSBmcm9udGVuZE1vZGVsQWN0aW9uRm9yQ29tbWFuZCh7Y29tbWFuZE5hbWUsIG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9ufSlcbiAgICAgIGlmICghYWN0aW9uKSBjb250aW51ZVxuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLysvLCBcIlwiKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IGBmcm9udGVuZC0ke2FjdGlvbn1gLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRIXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIHBhdGggd2l0aCBsZWFkaW5nIHNsYXNoIGFuZCBubyB0cmFpbGluZyBzbGFzaC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gIGNvbnN0IHdpdGhMZWFkaW5nU2xhc2ggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWBcblxuICBpZiAod2l0aExlYWRpbmdTbGFzaC5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2gucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICB9XG5cbiAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2hcbn1cbiJdfQ==
@@ -0,0 +1,240 @@
1
+ /**
2
+ * JSON Web Key used by the sync signing helpers.
3
+ * @typedef {JsonWebKey} SyncJsonWebKey
4
+ */
5
+ /**
6
+ * Backend-signed device certificate payload.
7
+ * @typedef {object} DeviceCertificatePayload
8
+ * @property {string} actorDeviceId - Device id allowed to sign mutations.
9
+ * @property {string} actorUserId - User id represented by the device.
10
+ * @property {string} certificateId - Certificate id.
11
+ * @property {SyncJsonWebKey} devicePublicKey - Device public key peers/backends use to verify mutations.
12
+ * @property {string} expiresAt - ISO timestamp after which the certificate is invalid.
13
+ * @property {string} issuedAt - ISO timestamp when the backend issued the certificate.
14
+ */
15
+ /**
16
+ * Backend-signed device certificate envelope.
17
+ * @typedef {object} DeviceCertificate
18
+ * @property {"ECDSA-P256-SHA256"} algorithm - Signature algorithm.
19
+ * @property {DeviceCertificatePayload} certificate - Certificate payload.
20
+ * @property {string} signature - Backend signature over the certificate payload.
21
+ */
22
+ /**
23
+ * Sync mutation payload signed by a device.
24
+ * @typedef {object} SyncMutation
25
+ * @property {string} actorDeviceId - Device that signed the mutation.
26
+ * @property {string} actorUserId - User represented by the signing device.
27
+ * @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} [attributes] - Model attributes for CRUD mutations.
28
+ * @property {string | number | null} [baseVersion] - Base server/client version.
29
+ * @property {string} clientMutationId - Device-local idempotency id.
30
+ * @property {string} [command] - Domain command name for command mutations.
31
+ * @property {string} model - Sync model/resource name.
32
+ * @property {string} occurredAt - ISO timestamp when the mutation occurred.
33
+ * @property {string} offlineGrantId - Offline grant id authorizing the mutation.
34
+ * @property {string} operation - CRUD operation or command operation.
35
+ * @property {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} [payload] - Domain command payload.
36
+ * @property {string} policyHash - Sync policy hash the mutation was checked against.
37
+ */
38
+ /**
39
+ * Device-signed mutation envelope.
40
+ * @typedef {object} SignedSyncMutation
41
+ * @property {"ECDSA-P256-SHA256"} algorithm - Signature algorithm.
42
+ * @property {DeviceCertificate} deviceCertificate - Backend-signed device certificate.
43
+ * @property {SyncMutation} mutation - Mutation payload.
44
+ * @property {string} signature - Device signature over the mutation envelope.
45
+ */
46
+ /**
47
+ * Generates an ECDSA P-256 keypair exported as JWKs.
48
+ * @returns {Promise<{privateKey: SyncJsonWebKey, publicKey: SyncJsonWebKey}>} - Exported keypair.
49
+ */
50
+ export function generateSyncSigningKeyPair(): Promise<{
51
+ privateKey: SyncJsonWebKey;
52
+ publicKey: SyncJsonWebKey;
53
+ }>;
54
+ /**
55
+ * Creates a backend-signed device certificate.
56
+ * @param {object} args - Arguments.
57
+ * @param {SyncJsonWebKey} args.backendPrivateKey - Backend private signing key.
58
+ * @param {DeviceCertificatePayload} args.certificate - Certificate payload.
59
+ * @returns {Promise<DeviceCertificate>} - Signed certificate.
60
+ */
61
+ export function createDeviceCertificate({ backendPrivateKey, certificate }: {
62
+ backendPrivateKey: SyncJsonWebKey;
63
+ certificate: DeviceCertificatePayload;
64
+ }): Promise<DeviceCertificate>;
65
+ /**
66
+ * Verifies a backend-signed device certificate.
67
+ * @param {object} args - Arguments.
68
+ * @param {SyncJsonWebKey} args.backendPublicKey - Backend public key.
69
+ * @param {DeviceCertificate} args.certificate - Signed certificate.
70
+ * @param {Date} [args.now] - Verification time. Defaults to current time.
71
+ * @returns {Promise<DeviceCertificatePayload>} - Verified certificate payload.
72
+ */
73
+ export function verifyDeviceCertificate({ backendPublicKey, certificate, now }: {
74
+ backendPublicKey: SyncJsonWebKey;
75
+ certificate: DeviceCertificate;
76
+ now?: Date | undefined;
77
+ }): Promise<DeviceCertificatePayload>;
78
+ /**
79
+ * Creates a device-signed mutation envelope.
80
+ * @param {object} args - Arguments.
81
+ * @param {DeviceCertificate} args.deviceCertificate - Backend-signed device certificate.
82
+ * @param {SyncJsonWebKey} args.devicePrivateKey - Device private signing key.
83
+ * @param {SyncMutation} args.mutation - Mutation payload.
84
+ * @returns {Promise<SignedSyncMutation>} - Signed mutation.
85
+ */
86
+ export function createSignedMutation({ deviceCertificate, devicePrivateKey, mutation }: {
87
+ deviceCertificate: DeviceCertificate;
88
+ devicePrivateKey: SyncJsonWebKey;
89
+ mutation: SyncMutation;
90
+ }): Promise<SignedSyncMutation>;
91
+ /**
92
+ * Verifies a signed sync mutation and its device certificate.
93
+ * @param {object} args - Arguments.
94
+ * @param {SyncJsonWebKey} args.backendPublicKey - Backend public key used to verify the device certificate.
95
+ * @param {Date} [args.now] - Verification time. Defaults to current time.
96
+ * @param {SignedSyncMutation} args.signedMutation - Signed mutation envelope.
97
+ * @returns {Promise<SyncMutation>} - Verified mutation payload.
98
+ */
99
+ export function verifySignedMutation({ backendPublicKey, now, signedMutation }: {
100
+ backendPublicKey: SyncJsonWebKey;
101
+ now?: Date | undefined;
102
+ signedMutation: SignedSyncMutation;
103
+ }): Promise<SyncMutation>;
104
+ /**
105
+ * Returns the replay/idempotency key for a signed mutation.
106
+ * @param {{mutation: {actorDeviceId?: unknown, actorUserId?: unknown, clientMutationId?: unknown}}} signedMutation - Signed mutation-like object.
107
+ * @returns {string} - Idempotency key.
108
+ */
109
+ export function mutationIdempotencyKey(signedMutation: {
110
+ mutation: {
111
+ actorDeviceId?: unknown;
112
+ actorUserId?: unknown;
113
+ clientMutationId?: unknown;
114
+ };
115
+ }): string;
116
+ /**
117
+ * JSON Web Key used by the sync signing helpers.
118
+ */
119
+ export type SyncJsonWebKey = JsonWebKey;
120
+ /**
121
+ * Backend-signed device certificate payload.
122
+ */
123
+ export type DeviceCertificatePayload = {
124
+ /**
125
+ * - Device id allowed to sign mutations.
126
+ */
127
+ actorDeviceId: string;
128
+ /**
129
+ * - User id represented by the device.
130
+ */
131
+ actorUserId: string;
132
+ /**
133
+ * - Certificate id.
134
+ */
135
+ certificateId: string;
136
+ /**
137
+ * - Device public key peers/backends use to verify mutations.
138
+ */
139
+ devicePublicKey: SyncJsonWebKey;
140
+ /**
141
+ * - ISO timestamp after which the certificate is invalid.
142
+ */
143
+ expiresAt: string;
144
+ /**
145
+ * - ISO timestamp when the backend issued the certificate.
146
+ */
147
+ issuedAt: string;
148
+ };
149
+ /**
150
+ * Backend-signed device certificate envelope.
151
+ */
152
+ export type DeviceCertificate = {
153
+ /**
154
+ * - Signature algorithm.
155
+ */
156
+ algorithm: "ECDSA-P256-SHA256";
157
+ /**
158
+ * - Certificate payload.
159
+ */
160
+ certificate: DeviceCertificatePayload;
161
+ /**
162
+ * - Backend signature over the certificate payload.
163
+ */
164
+ signature: string;
165
+ };
166
+ /**
167
+ * Sync mutation payload signed by a device.
168
+ */
169
+ export type SyncMutation = {
170
+ /**
171
+ * - Device that signed the mutation.
172
+ */
173
+ actorDeviceId: string;
174
+ /**
175
+ * - User represented by the signing device.
176
+ */
177
+ actorUserId: string;
178
+ /**
179
+ * - Model attributes for CRUD mutations.
180
+ */
181
+ attributes?: Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue> | undefined;
182
+ /**
183
+ * - Base server/client version.
184
+ */
185
+ baseVersion?: string | number | null | undefined;
186
+ /**
187
+ * - Device-local idempotency id.
188
+ */
189
+ clientMutationId: string;
190
+ /**
191
+ * - Domain command name for command mutations.
192
+ */
193
+ command?: string | undefined;
194
+ /**
195
+ * - Sync model/resource name.
196
+ */
197
+ model: string;
198
+ /**
199
+ * - ISO timestamp when the mutation occurred.
200
+ */
201
+ occurredAt: string;
202
+ /**
203
+ * - Offline grant id authorizing the mutation.
204
+ */
205
+ offlineGrantId: string;
206
+ /**
207
+ * - CRUD operation or command operation.
208
+ */
209
+ operation: string;
210
+ /**
211
+ * - Domain command payload.
212
+ */
213
+ payload?: Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue> | undefined;
214
+ /**
215
+ * - Sync policy hash the mutation was checked against.
216
+ */
217
+ policyHash: string;
218
+ };
219
+ /**
220
+ * Device-signed mutation envelope.
221
+ */
222
+ export type SignedSyncMutation = {
223
+ /**
224
+ * - Signature algorithm.
225
+ */
226
+ algorithm: "ECDSA-P256-SHA256";
227
+ /**
228
+ * - Backend-signed device certificate.
229
+ */
230
+ deviceCertificate: DeviceCertificate;
231
+ /**
232
+ * - Mutation payload.
233
+ */
234
+ mutation: SyncMutation;
235
+ /**
236
+ * - Device signature over the mutation envelope.
237
+ */
238
+ signature: string;
239
+ };
240
+ //# sourceMappingURL=device-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-identity.d.ts","sourceRoot":"","sources":["../../../src/sync/device-identity.js"],"names":[],"mappings":"AAKA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;GAOG;AAEH;;;GAGG;AACH,8CAFa,OAAO,CAAC;IAAC,UAAU,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAC,CAAC,CAa5E;AAED;;;;;;GAMG;AACH,4EAJG;IAA6B,iBAAiB,EAAtC,cAAc;IACiB,WAAW,EAA1C,wBAAwB;CAChC,GAAU,OAAO,CAAC,iBAAiB,CAAC,CAatC;AAED;;;;;;;GAOG;AACH,gFALG;IAA6B,gBAAgB,EAArC,cAAc;IACU,WAAW,EAAnC,iBAAiB;IACL,GAAG;CACvB,GAAU,OAAO,CAAC,wBAAwB,CAAC,CAc7C;AAED;;;;;;;GAOG;AACH,wFALG;IAAgC,iBAAiB,EAAzC,iBAAiB;IACI,gBAAgB,EAArC,cAAc;IACK,QAAQ,EAA3B,YAAY;CACpB,GAAU,OAAO,CAAC,kBAAkB,CAAC,CAoBvC;AAED;;;;;;;GAOG;AACH,gFALG;IAA6B,gBAAgB,EAArC,cAAc;IACF,GAAG;IACU,cAAc,EAAvC,kBAAkB;CAC1B,GAAU,OAAO,CAAC,YAAY,CAAC,CAwBjC;AAED;;;;GAIG;AACH,uDAHW;IAAC,QAAQ,EAAE;QAAC,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAC,CAAA;CAAC,GACtF,MAAM,CAUlB;;;;6BApLY,UAAU;;;;;;;;mBAMT,MAAM;;;;iBACN,MAAM;;;;mBACN,MAAM;;;;qBACN,cAAc;;;;eACd,MAAM;;;;cACN,MAAM;;;;;;;;;eAMN,mBAAmB;;;;iBACnB,wBAAwB;;;;eACxB,MAAM;;;;;;;;;mBAMN,MAAM;;;;iBACN,MAAM;;;;;;;;;;;;sBAGN,MAAM;;;;;;;;WAEN,MAAM;;;;gBACN,MAAM;;;;oBACN,MAAM;;;;eACN,MAAM;;;;;;;;gBAEN,MAAM;;;;;;;;;eAMN,mBAAmB;;;;uBACnB,iBAAiB;;;;cACjB,YAAY;;;;eACZ,MAAM"}