velocious 1.0.643 → 1.0.645

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 (279) hide show
  1. package/README.md +21 -10
  2. package/build/authorization/ability.js +36 -13
  3. package/build/background-jobs/adapter.js +9 -0
  4. package/build/background-jobs/main.js +35 -10
  5. package/build/background-jobs/store.js +217 -38
  6. package/build/background-jobs/types.js +15 -0
  7. package/build/configuration-types.js +1 -1
  8. package/build/configuration.js +45 -9
  9. package/build/database/drivers/base-column.js +8 -0
  10. package/build/database/drivers/mssql/sql/update.js +1 -3
  11. package/build/database/drivers/mysql/sql/update.js +1 -3
  12. package/build/database/drivers/pgsql/column.js +22 -0
  13. package/build/database/drivers/pgsql/sql/update.js +1 -3
  14. package/build/database/drivers/sqlite/sql/alter-table.js +11 -1
  15. package/build/database/drivers/sqlite/sql/update.js +1 -3
  16. package/build/database/query/index.js +2 -2
  17. package/build/database/query/model-class-query.js +26 -10
  18. package/build/database/query/preloader/has-many.js +4 -1
  19. package/build/database/query/query-data.js +2 -1
  20. package/build/database/query/update-base.js +14 -0
  21. package/build/database/query/with-count.js +3 -1
  22. package/build/database/record/acts-as-list.js +37 -13
  23. package/build/database/record/attachments/store.js +336 -26
  24. package/build/database/record/auditing.js +6 -3
  25. package/build/database/record/index.js +197 -42
  26. package/build/database/record/instance-relationships/belongs-to.js +2 -1
  27. package/build/database/record/validators/uniqueness.js +8 -5
  28. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
  29. package/build/frontend-model-controller.js +136 -53
  30. package/build/frontend-model-resource/base-resource.js +87 -37
  31. package/build/frontend-model-resource/velocious-attachment-resource.js +98 -31
  32. package/build/frontend-models/base.js +307 -59
  33. package/build/frontend-models/preloader.js +6 -3
  34. package/build/frontend-models/query.js +15 -6
  35. package/build/frontend-models/resource-definition.js +21 -2
  36. package/build/frontend-models/use-destroyed-event.js +1 -1
  37. package/build/frontend-models/use-model-class-event.js +2 -2
  38. package/build/frontend-models/use-updated-event.js +1 -1
  39. package/build/frontend-models/websocket-channel.js +256 -93
  40. package/build/frontend-models/websocket-publishers.js +218 -18
  41. package/build/http-server/client/websocket-session.js +13 -1
  42. package/build/http-server/websocket-channel.js +15 -2
  43. package/build/src/authorization/ability.d.ts +9 -3
  44. package/build/src/authorization/ability.d.ts.map +1 -1
  45. package/build/src/authorization/ability.js +33 -14
  46. package/build/src/background-jobs/adapter.d.ts +6 -0
  47. package/build/src/background-jobs/adapter.d.ts.map +1 -1
  48. package/build/src/background-jobs/adapter.js +9 -1
  49. package/build/src/background-jobs/main.d.ts +6 -0
  50. package/build/src/background-jobs/main.d.ts.map +1 -1
  51. package/build/src/background-jobs/main.js +34 -11
  52. package/build/src/background-jobs/store.d.ts +66 -12
  53. package/build/src/background-jobs/store.d.ts.map +1 -1
  54. package/build/src/background-jobs/store.js +191 -35
  55. package/build/src/background-jobs/types.d.ts +55 -0
  56. package/build/src/background-jobs/types.d.ts.map +1 -1
  57. package/build/src/background-jobs/types.js +16 -1
  58. package/build/src/configuration-types.d.ts +3 -3
  59. package/build/src/configuration-types.d.ts.map +1 -1
  60. package/build/src/configuration-types.js +2 -2
  61. package/build/src/configuration.d.ts +18 -8
  62. package/build/src/configuration.d.ts.map +1 -1
  63. package/build/src/configuration.js +38 -7
  64. package/build/src/database/drivers/base-column.d.ts +5 -0
  65. package/build/src/database/drivers/base-column.d.ts.map +1 -1
  66. package/build/src/database/drivers/base-column.js +8 -1
  67. package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
  68. package/build/src/database/drivers/mssql/sql/update.js +2 -4
  69. package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
  70. package/build/src/database/drivers/mysql/sql/update.js +2 -4
  71. package/build/src/database/drivers/pgsql/column.d.ts +5 -0
  72. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  73. package/build/src/database/drivers/pgsql/column.js +19 -1
  74. package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
  75. package/build/src/database/drivers/pgsql/sql/update.js +2 -4
  76. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  77. package/build/src/database/drivers/sqlite/sql/alter-table.js +6 -2
  78. package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
  79. package/build/src/database/drivers/sqlite/sql/update.js +2 -4
  80. package/build/src/database/query/index.d.ts +4 -4
  81. package/build/src/database/query/index.d.ts.map +1 -1
  82. package/build/src/database/query/index.js +3 -3
  83. package/build/src/database/query/model-class-query.d.ts +8 -2
  84. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  85. package/build/src/database/query/model-class-query.js +25 -11
  86. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  87. package/build/src/database/query/preloader/has-many.js +4 -2
  88. package/build/src/database/query/query-data.d.ts.map +1 -1
  89. package/build/src/database/query/query-data.js +3 -2
  90. package/build/src/database/query/update-base.d.ts +7 -0
  91. package/build/src/database/query/update-base.d.ts.map +1 -1
  92. package/build/src/database/query/update-base.js +13 -1
  93. package/build/src/database/query/with-count.d.ts.map +1 -1
  94. package/build/src/database/query/with-count.js +3 -2
  95. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  96. package/build/src/database/record/acts-as-list.js +35 -14
  97. package/build/src/database/record/attachments/store.d.ts +67 -0
  98. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  99. package/build/src/database/record/attachments/store.js +301 -25
  100. package/build/src/database/record/auditing.d.ts.map +1 -1
  101. package/build/src/database/record/auditing.js +7 -4
  102. package/build/src/database/record/index.d.ts +78 -26
  103. package/build/src/database/record/index.d.ts.map +1 -1
  104. package/build/src/database/record/index.js +171 -42
  105. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  106. package/build/src/database/record/instance-relationships/belongs-to.js +3 -2
  107. package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
  108. package/build/src/database/record/validators/uniqueness.js +8 -6
  109. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +4 -4
  110. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  111. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -12
  112. package/build/src/frontend-model-controller.d.ts +29 -8
  113. package/build/src/frontend-model-controller.d.ts.map +1 -1
  114. package/build/src/frontend-model-controller.js +122 -51
  115. package/build/src/frontend-model-resource/base-resource.d.ts +51 -24
  116. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  117. package/build/src/frontend-model-resource/base-resource.js +83 -37
  118. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +45 -26
  119. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
  120. package/build/src/frontend-model-resource/velocious-attachment-resource.js +89 -31
  121. package/build/src/frontend-models/base.d.ts +53 -20
  122. package/build/src/frontend-models/base.d.ts.map +1 -1
  123. package/build/src/frontend-models/base.js +275 -59
  124. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  125. package/build/src/frontend-models/preloader.js +6 -4
  126. package/build/src/frontend-models/query.d.ts +2 -2
  127. package/build/src/frontend-models/query.d.ts.map +1 -1
  128. package/build/src/frontend-models/query.js +14 -7
  129. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  130. package/build/src/frontend-models/resource-definition.js +20 -3
  131. package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
  132. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
  133. package/build/src/frontend-models/use-destroyed-event.js +2 -2
  134. package/build/src/frontend-models/use-model-class-event.d.ts +2 -2
  135. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
  136. package/build/src/frontend-models/use-model-class-event.js +3 -3
  137. package/build/src/frontend-models/use-updated-event.d.ts +1 -1
  138. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
  139. package/build/src/frontend-models/use-updated-event.js +2 -2
  140. package/build/src/frontend-models/websocket-channel.d.ts +60 -41
  141. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  142. package/build/src/frontend-models/websocket-channel.js +225 -85
  143. package/build/src/frontend-models/websocket-publishers.d.ts +9 -0
  144. package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
  145. package/build/src/frontend-models/websocket-publishers.js +190 -19
  146. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  147. package/build/src/http-server/client/websocket-session.js +11 -2
  148. package/build/src/http-server/websocket-channel.d.ts +20 -8
  149. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  150. package/build/src/http-server/websocket-channel.js +15 -3
  151. package/build/src/sync/assets/cache.d.ts +288 -0
  152. package/build/src/sync/assets/cache.d.ts.map +1 -0
  153. package/build/src/sync/assets/cache.js +883 -0
  154. package/build/src/sync/assets/types.d.ts +199 -0
  155. package/build/src/sync/assets/types.d.ts.map +1 -0
  156. package/build/src/sync/assets/types.js +56 -0
  157. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  158. package/build/src/sync/sync-api-client.js +4 -3
  159. package/build/src/sync/sync-client.d.ts.map +1 -1
  160. package/build/src/sync/sync-client.js +3 -2
  161. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  162. package/build/src/sync/sync-envelope-replay-service.js +6 -5
  163. package/build/src/sync/sync-publisher.d.ts.map +1 -1
  164. package/build/src/sync/sync-publisher.js +4 -3
  165. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +2 -2
  166. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
  167. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +3 -3
  168. package/build/src/testing/test-profiler.d.ts +4 -4
  169. package/build/src/testing/test-profiler.d.ts.map +1 -1
  170. package/build/src/testing/test-profiler.js +3 -3
  171. package/build/src/testing/test-runner.d.ts +279 -117
  172. package/build/src/testing/test-runner.d.ts.map +1 -1
  173. package/build/src/testing/test-runner.js +503 -933
  174. package/build/src/testing/test.d.ts +11 -72
  175. package/build/src/testing/test.d.ts.map +1 -1
  176. package/build/src/testing/test.js +131 -284
  177. package/build/src/testing/velocious-attempt-executor.d.ts +54 -0
  178. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
  179. package/build/src/testing/velocious-attempt-executor.js +408 -0
  180. package/build/src/testing/velocious-runner-reporter.d.ts +67 -0
  181. package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
  182. package/build/src/testing/velocious-runner-reporter.js +240 -0
  183. package/build/src/testing/velocious-suite-hook-executor.d.ts +19 -0
  184. package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
  185. package/build/src/testing/velocious-suite-hook-executor.js +41 -0
  186. package/build/src/testing/velocious-test-arguments.d.ts +39 -0
  187. package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
  188. package/build/src/testing/velocious-test-arguments.js +55 -0
  189. package/build/src/utils/model-primary-key.d.ts +73 -0
  190. package/build/src/utils/model-primary-key.d.ts.map +1 -0
  191. package/build/src/utils/model-primary-key.js +144 -0
  192. package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
  193. package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
  194. package/build/src/utils/sha256-bytes-hex.js +117 -0
  195. package/build/src/utils/sha256-hex.d.ts +2 -4
  196. package/build/src/utils/sha256-hex.d.ts.map +1 -1
  197. package/build/src/utils/sha256-hex.js +6 -120
  198. package/build/sync/assets/cache.js +998 -0
  199. package/build/sync/assets/types.js +62 -0
  200. package/build/sync/sync-api-client.js +3 -2
  201. package/build/sync/sync-client.js +2 -1
  202. package/build/sync/sync-envelope-replay-service.js +5 -4
  203. package/build/sync/sync-publisher.js +3 -2
  204. package/build/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
  205. package/build/testing/test-profiler.js +2 -2
  206. package/build/testing/test-runner.js +496 -990
  207. package/build/testing/test.js +164 -306
  208. package/build/testing/velocious-attempt-executor.js +441 -0
  209. package/build/testing/velocious-runner-reporter.js +264 -0
  210. package/build/testing/velocious-suite-hook-executor.js +43 -0
  211. package/build/testing/velocious-test-arguments.js +64 -0
  212. package/build/tsconfig.tsbuildinfo +1 -1
  213. package/build/utils/model-primary-key.js +171 -0
  214. package/build/utils/sha256-bytes-hex.js +132 -0
  215. package/build/utils/sha256-hex.js +7 -135
  216. package/package.json +5 -4
  217. package/src/authorization/ability.js +36 -13
  218. package/src/background-jobs/adapter.js +9 -0
  219. package/src/background-jobs/main.js +35 -10
  220. package/src/background-jobs/store.js +217 -38
  221. package/src/background-jobs/types.js +15 -0
  222. package/src/configuration-types.js +1 -1
  223. package/src/configuration.js +45 -9
  224. package/src/database/drivers/base-column.js +8 -0
  225. package/src/database/drivers/mssql/sql/update.js +1 -3
  226. package/src/database/drivers/mysql/sql/update.js +1 -3
  227. package/src/database/drivers/pgsql/column.js +22 -0
  228. package/src/database/drivers/pgsql/sql/update.js +1 -3
  229. package/src/database/drivers/sqlite/sql/alter-table.js +11 -1
  230. package/src/database/drivers/sqlite/sql/update.js +1 -3
  231. package/src/database/query/index.js +2 -2
  232. package/src/database/query/model-class-query.js +26 -10
  233. package/src/database/query/preloader/has-many.js +4 -1
  234. package/src/database/query/query-data.js +2 -1
  235. package/src/database/query/update-base.js +14 -0
  236. package/src/database/query/with-count.js +3 -1
  237. package/src/database/record/acts-as-list.js +37 -13
  238. package/src/database/record/attachments/store.js +336 -26
  239. package/src/database/record/auditing.js +6 -3
  240. package/src/database/record/index.js +197 -42
  241. package/src/database/record/instance-relationships/belongs-to.js +2 -1
  242. package/src/database/record/validators/uniqueness.js +8 -5
  243. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
  244. package/src/frontend-model-controller.js +136 -53
  245. package/src/frontend-model-resource/base-resource.js +87 -37
  246. package/src/frontend-model-resource/velocious-attachment-resource.js +98 -31
  247. package/src/frontend-models/base.js +307 -59
  248. package/src/frontend-models/preloader.js +6 -3
  249. package/src/frontend-models/query.js +15 -6
  250. package/src/frontend-models/resource-definition.js +21 -2
  251. package/src/frontend-models/use-destroyed-event.js +1 -1
  252. package/src/frontend-models/use-model-class-event.js +2 -2
  253. package/src/frontend-models/use-updated-event.js +1 -1
  254. package/src/frontend-models/websocket-channel.js +256 -93
  255. package/src/frontend-models/websocket-publishers.js +218 -18
  256. package/src/http-server/client/websocket-session.js +13 -1
  257. package/src/http-server/websocket-channel.js +15 -2
  258. package/src/sync/assets/cache.js +998 -0
  259. package/src/sync/assets/types.js +62 -0
  260. package/src/sync/sync-api-client.js +3 -2
  261. package/src/sync/sync-client.js +2 -1
  262. package/src/sync/sync-envelope-replay-service.js +5 -4
  263. package/src/sync/sync-publisher.js +3 -2
  264. package/src/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
  265. package/src/testing/test-profiler.js +2 -2
  266. package/src/testing/test-runner.js +496 -990
  267. package/src/testing/test.js +164 -306
  268. package/src/testing/velocious-attempt-executor.js +441 -0
  269. package/src/testing/velocious-runner-reporter.js +264 -0
  270. package/src/testing/velocious-suite-hook-executor.js +43 -0
  271. package/src/testing/velocious-test-arguments.js +64 -0
  272. package/src/utils/model-primary-key.js +171 -0
  273. package/src/utils/sha256-bytes-hex.js +132 -0
  274. package/src/utils/sha256-hex.js +7 -135
  275. package/build/src/testing/testing-package-adapter.d.ts +0 -9
  276. package/build/src/testing/testing-package-adapter.d.ts.map +0 -1
  277. package/build/src/testing/testing-package-adapter.js +0 -69
  278. package/build/testing/testing-package-adapter.js +0 -76
  279. package/src/testing/testing-package-adapter.js +0 -76
@@ -0,0 +1,62 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * Immutable attachment descriptor synchronized separately from its bytes.
5
+ * @typedef {object} SynchronizedAssetCacheDescriptor
6
+ * @property {number} byteSize - Expected byte count.
7
+ * @property {string | null} contentType - Media type.
8
+ * @property {string} digest - Expected `sha256-<hex>` content digest.
9
+ * @property {"eager" | "on-demand"} fetch - Download timing policy.
10
+ * @property {string} filename - Original filename.
11
+ * @property {string} id - Immutable attachment id.
12
+ * @property {string} name - Attachment declaration name.
13
+ * @property {"optional" | "required"} offlineRequirement - Whether offline readiness requires the bytes.
14
+ * @property {string} recordId - Owner record id.
15
+ * @property {string} recordType - Owner model name.
16
+ * @property {"durable" | "evictable"} retention - Storage-pressure policy.
17
+ */
18
+
19
+ /**
20
+ * Persisted state for one synchronized attachment descriptor.
21
+ * @typedef {object} SynchronizedAssetCacheEntry
22
+ * @property {number} attempts - Consecutive failed download count.
23
+ * @property {SynchronizedAssetCacheDescriptor} descriptor - Current immutable descriptor.
24
+ * @property {number} lastAccessedAt - Millisecond LRU timestamp.
25
+ * @property {number | null} nextRetryAt - Earliest automatic retry time.
26
+ * @property {string[]} scopeKeys - Synchronized scopes referencing the descriptor.
27
+ * @property {"cached" | "downloading" | "failed" | "missing"} status - Local byte state.
28
+ */
29
+
30
+ /**
31
+ * Versioned persistent cache metadata owned by a platform adapter.
32
+ * @typedef {object} SynchronizedAssetCacheState
33
+ * @property {SynchronizedAssetCacheEntry[]} assets - Descriptor entries.
34
+ * @property {string[]} pendingDeletionDigests - Unreferenced blobs awaiting confirmed deletion.
35
+ * @property {1} version - State schema version.
36
+ */
37
+
38
+ /**
39
+ * Platform storage adapter. `writeBlob` must make bytes visible atomically.
40
+ * @typedef {object} SynchronizedAssetCacheAdapter
41
+ * @property {(args: {accountId: string, digest: string}) => Promise<string | null>} blobUri - Resolves a locally stored blob URI.
42
+ * @property {(args: {accountId: string, digest: string}) => Promise<void>} deleteBlob - Deletes one local blob.
43
+ * @property {(args: {accountId: string}) => Promise<SynchronizedAssetCacheState | null>} loadState - Loads account-scoped metadata.
44
+ * @property {(args: {accountId: string, state: SynchronizedAssetCacheState}) => Promise<void>} saveState - Atomically saves account-scoped metadata.
45
+ * @property {(args: {accountId: string, bytes: Uint8Array, contentType: string | null, digest: string}) => Promise<string>} writeBlob - Atomically stores verified bytes.
46
+ */
47
+
48
+ /**
49
+ * Failed asset result surfaced to the sync coordinator.
50
+ * @typedef {object} SynchronizedAssetCacheFailure
51
+ * @property {string} assetId - Descriptor id.
52
+ * @property {Error} error - Download or verification error.
53
+ */
54
+
55
+ /**
56
+ * Descriptor reconciliation result.
57
+ * @typedef {object} SynchronizedAssetCacheSynchronizationResult
58
+ * @property {SynchronizedAssetCacheFailure[]} failures - Failed eligible eager downloads.
59
+ * @property {string[]} missingRequiredAssetIds - Required descriptors without cached bytes.
60
+ */
61
+
62
+ export {}
@@ -3,6 +3,7 @@
3
3
  import {optionalBoolean, optionalInteger} from "typanic"
4
4
 
5
5
  import recordChanges from "../database/record-changes.js"
6
+ import {scalarModelPrimaryKeyValue} from "../utils/model-primary-key.js"
6
7
  import {applySyncReplayResultToLocalMutationLog} from "./conflict-strategy.js"
7
8
 
8
9
  /** @typedef {import("./sync-api-client-types.js").SyncChangeApplyResult} SyncChangeApplyResult */
@@ -35,7 +36,7 @@ export default class SyncApiClient {
35
36
  * @returns {Promise<import("./local-mutation-log.js").LocalMutationLogRecord>} Appended intent.
36
37
  */
37
38
  static async queueConflictTrackedSync({baseVersion, conflictTracking, data, operation, resource, resourceType, syncType}) {
38
- const resourceId = String(resource.id())
39
+ const resourceId = String(scalarModelPrimaryKeyValue(resource.id(), `Conflict-tracked sync for ${resourceType}`))
39
40
  const records = await conflictTracking.mutationLog.records()
40
41
  const predecessor = records
41
42
  .filter((record) => record.mutation.model === resourceType && record.mutation.payload?.resourceId === resourceId)
@@ -675,7 +676,7 @@ export default class SyncApiClient {
675
676
  * @returns {Promise<ReturnType<typeof JSON.parse>>} Local sync row.
676
677
  */
677
678
  static async queueLocalSync(args) {
678
- const resourceRecordId = args.resource.id()
679
+ const resourceRecordId = scalarModelPrimaryKeyValue(args.resource.id(), "Local sync queueing")
679
680
  const modelClass = args.resource.constructor
680
681
 
681
682
  if (typeof modelClass.getModelName !== "function") {
@@ -4,6 +4,7 @@ import Configuration from "../configuration.js"
4
4
  import {isBooleanColumnType} from "../database/column-types.js"
5
5
  import Logger from "../logger.js"
6
6
  import {captureRemoteRequestContext, mergeRemoteRequestContext} from "../remote-request-context.js"
7
+ import {scalarModelPrimaryKey} from "../utils/model-primary-key.js"
7
8
  import restArgsError from "../utils/rest-args-error.js"
8
9
  import VelociousWebsocketClient from "../http-client/websocket-client.js"
9
10
 
@@ -1243,7 +1244,7 @@ function derivedSyncAttributes({modelClass, resourceType}) {
1243
1244
  const localOnlyAttributes = []
1244
1245
 
1245
1246
  if (modelClass.hasPrimaryKey()) {
1246
- const primaryKeyColumn = modelClass.primaryKey()
1247
+ const primaryKeyColumn = scalarModelPrimaryKey(modelClass.primaryKey(), `Derived sync attributes for ${resourceType}`)
1247
1248
 
1248
1249
  localOnlyAttributes.push(columnNameToAttributeName[primaryKeyColumn] || primaryKeyColumn)
1249
1250
  }
@@ -11,6 +11,7 @@ import sha256Hex from "../utils/sha256-hex.js"
11
11
  import {decodeReplayPersistedData, serializeReplayPersistedData} from "./sync-replay-persisted-data.js"
12
12
  import {ValidationError} from "../database/record/index.js"
13
13
  import VelociousError from "../velocious-error.js"
14
+ import {scalarModelPrimaryKey, scalarModelPrimaryKeyValue} from "../utils/model-primary-key.js"
14
15
 
15
16
  /**
16
17
  * Resolved routed-resource registration for one replay resource type.
@@ -800,7 +801,7 @@ export default class SyncEnvelopeReplayService {
800
801
  if (mutation.baseVersion === undefined || mutation.baseVersion === null) return null
801
802
 
802
803
  const ModelClass = resource.modelClass()
803
- const primaryKey = ModelClass.primaryKey()
804
+ const primaryKey = scalarModelPrimaryKey(ModelClass.primaryKey(), `Offline sync conflict handling for ${ModelClass.name}`)
804
805
  const primaryKeyAttribute = ModelClass.resolveAttributeName(primaryKey)
805
806
  const versionAttribute = this.conflictStrategy.versionAttribute
806
807
  const versionAttributeName = ModelClass.resolveAttributeName(versionAttribute)
@@ -944,7 +945,7 @@ export default class SyncEnvelopeReplayService {
944
945
  if (columnName) allowedKeys.add(columnName)
945
946
  }
946
947
 
947
- const primaryKey = ModelClass.primaryKey()
948
+ const primaryKey = scalarModelPrimaryKey(ModelClass.primaryKey(), `Offline sync attribute filtering for ${ModelClass.name}`)
948
949
  const primaryKeyAttribute = ModelClass.getColumnNameToAttributeNameMap()[primaryKey]
949
950
 
950
951
  /** @type {Record<string, ReturnType<typeof JSON.parse>>} */
@@ -981,7 +982,7 @@ export default class SyncEnvelopeReplayService {
981
982
  */
982
983
  async createRoutedReplayRecord({attributes, mutation, resource}) {
983
984
  const ModelClass = resource.modelClass()
984
- const primaryKey = ModelClass.primaryKey()
985
+ const primaryKey = scalarModelPrimaryKey(ModelClass.primaryKey(), `Offline sync create for ${ModelClass.name}`)
985
986
  const conflictingIds = await ModelClass.where({[primaryKey]: mutation.resourceId}).pluck(primaryKey)
986
987
 
987
988
  if (conflictingIds.length > 0) {
@@ -1007,7 +1008,7 @@ export default class SyncEnvelopeReplayService {
1007
1008
  if (ability) {
1008
1009
  const memberIds = await ModelClass
1009
1010
  .accessibleFor(resource.syncAbilityAction("create"), ability)
1010
- .where({[primaryKey]: record.id()})
1011
+ .where({[primaryKey]: scalarModelPrimaryKeyValue(record.id(), `Offline sync create authorization for ${ModelClass.name}`)})
1011
1012
  .pluck(primaryKey)
1012
1013
 
1013
1014
  if (memberIds.length === 0) {
@@ -2,6 +2,7 @@
2
2
 
3
3
  import Configuration from "../configuration.js"
4
4
  import Logger from "../logger.js"
5
+ import {scalarModelPrimaryKeyValue} from "../utils/model-primary-key.js"
5
6
  import restArgsError from "../utils/rest-args-error.js"
6
7
 
7
8
  import {declaredSyncScopeAttributes} from "./sync-scope-attributes.js"
@@ -190,7 +191,7 @@ export default class SyncPublisher {
190
191
  if (isPublishingSuppressed(record)) return
191
192
 
192
193
  const data = await resourceConfig.serialize(record)
193
- const resourceId = String(record.id())
194
+ const resourceId = String(scalarModelPrimaryKeyValue(record.id(), `Sync publishing for ${resourceConfig.resourceType}`))
194
195
  const syncType = operation === "destroy" ? "delete" : "update"
195
196
  const scopeValues = await this.publishedScopeValues({record, resourceConfig})
196
197
  /** @type {Record<string, ReturnType<typeof JSON.parse>>} */
@@ -259,7 +260,7 @@ export default class SyncPublisher {
259
260
  } else if (scopePlanEntry.recordAttribute) {
260
261
  rawValue = record.readAttribute(scopePlanEntry.recordAttribute)
261
262
  } else {
262
- rawValue = record.id()
263
+ rawValue = scalarModelPrimaryKeyValue(record.id(), `Sync scope publishing for ${resourceConfig.resourceType}`)
263
264
  }
264
265
 
265
266
  const value = rawValue === undefined || rawValue === null ? null : String(rawValue)
@@ -15,10 +15,10 @@ import wait from "awaitery/build/wait.js"
15
15
  * @typedef {import("../frontend-models/base.js").FrontendModelResourceConfig} FrontendModelResourceConfig */
16
16
  /**
17
17
  * Defines this typedef.
18
- * @typedef {{id: string, model: FrontendModelBase}} FrontendModelHookTestCreateUpdatePayload */
18
+ * @typedef {{id: string | import("../utils/model-primary-key.js").CompositeModelPrimaryKeyValue, model: FrontendModelBase}} FrontendModelHookTestCreateUpdatePayload */
19
19
  /**
20
20
  * Defines this typedef.
21
- * @typedef {{id: string}} FrontendModelHookTestDestroyPayload */
21
+ * @typedef {{id: string | import("../utils/model-primary-key.js").CompositeModelPrimaryKeyValue}} FrontendModelHookTestDestroyPayload */
22
22
  /**
23
23
  * FakeSubscriptions type.
24
24
  * @typedef {object} FakeSubscriptions
@@ -172,7 +172,7 @@ export default class TestProfiler {
172
172
  this._spans = []
173
173
  /** @type {Array<{id: string, parentId: string | undefined, file: string, line: number | undefined}>} */
174
174
  this._scopes = []
175
- /** @type {WeakMap<import("./test-runner.js").TestsArgument, string>} */
175
+ /** @type {WeakMap<import("./test-runner.js").TestsArgument | import("@velocious/testing/runner").SuiteDeclaration, string>} */
176
176
  this._scopeIds = new WeakMap()
177
177
  /** @type {Set<string>} */
178
178
  this._customActivityNames = new Set()
@@ -243,7 +243,7 @@ export default class TestProfiler {
243
243
 
244
244
  /**
245
245
  * Registers and returns a deterministic scope identifier.
246
- * @param {import("./test-runner.js").TestsArgument} scope - Scope object.
246
+ * @param {import("./test-runner.js").TestsArgument | import("@velocious/testing/runner").SuiteDeclaration} scope - Scope object.
247
247
  * @param {object} args - Scope metadata.
248
248
  * @param {string[]} args.descriptions - Scope description path.
249
249
  * @param {string | undefined} args.filePath - Scope source path.