velocious 1.0.642 → 1.0.644

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/README.md +25 -2
  2. package/build/authorization/base-resource.js +18 -5
  3. package/build/configuration-types.js +34 -2
  4. package/build/database/record/index.js +42 -11
  5. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +17 -3
  6. package/build/frontend-model-controller.js +10 -5
  7. package/build/frontend-model-resource/base-resource.js +95 -41
  8. package/build/frontend-models/base.js +1 -1
  9. package/build/src/authorization/base-resource.d.ts +19 -6
  10. package/build/src/authorization/base-resource.d.ts.map +1 -1
  11. package/build/src/authorization/base-resource.js +16 -6
  12. package/build/src/configuration-types.d.ts +72 -5
  13. package/build/src/configuration-types.d.ts.map +1 -1
  14. package/build/src/configuration-types.js +31 -3
  15. package/build/src/database/record/index.d.ts +44 -46
  16. package/build/src/database/record/index.d.ts.map +1 -1
  17. package/build/src/database/record/index.js +39 -12
  18. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  19. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +19 -4
  20. package/build/src/frontend-model-controller.d.ts +1 -1
  21. package/build/src/frontend-model-controller.d.ts.map +1 -1
  22. package/build/src/frontend-model-controller.js +9 -6
  23. package/build/src/frontend-model-resource/base-resource.d.ts +66 -32
  24. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  25. package/build/src/frontend-model-resource/base-resource.js +89 -42
  26. package/build/src/frontend-models/base.d.ts +1 -0
  27. package/build/src/frontend-models/base.d.ts.map +1 -1
  28. package/build/src/frontend-models/base.js +2 -2
  29. package/build/src/sync/assets/cache.d.ts +288 -0
  30. package/build/src/sync/assets/cache.d.ts.map +1 -0
  31. package/build/src/sync/assets/cache.js +883 -0
  32. package/build/src/sync/assets/types.d.ts +199 -0
  33. package/build/src/sync/assets/types.d.ts.map +1 -0
  34. package/build/src/sync/assets/types.js +56 -0
  35. package/build/src/sync/sync-api-controller.d.ts.map +1 -1
  36. package/build/src/sync/sync-api-controller.js +6 -5
  37. package/build/src/sync/sync-envelope-replay-service.d.ts +1 -1
  38. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  39. package/build/src/sync/sync-envelope-replay-service.js +3 -2
  40. package/build/src/sync/sync-resource-base.d.ts +2 -0
  41. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  42. package/build/src/sync/sync-resource-base.js +3 -1
  43. package/build/src/testing/test-runner.d.ts +8 -0
  44. package/build/src/testing/test-runner.d.ts.map +1 -1
  45. package/build/src/testing/test-runner.js +49 -548
  46. package/build/src/testing/velocious-attempt-executor.d.ts +69 -0
  47. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
  48. package/build/src/testing/velocious-attempt-executor.js +402 -0
  49. package/build/src/testing/velocious-runner-reporter.d.ts +72 -0
  50. package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
  51. package/build/src/testing/velocious-runner-reporter.js +152 -0
  52. package/build/src/testing/velocious-suite-hook-executor.d.ts +37 -0
  53. package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
  54. package/build/src/testing/velocious-suite-hook-executor.js +66 -0
  55. package/build/src/testing/velocious-test-arguments.d.ts +34 -0
  56. package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
  57. package/build/src/testing/velocious-test-arguments.js +47 -0
  58. package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
  59. package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
  60. package/build/src/utils/sha256-bytes-hex.js +117 -0
  61. package/build/src/utils/sha256-hex.d.ts +2 -4
  62. package/build/src/utils/sha256-hex.d.ts.map +1 -1
  63. package/build/src/utils/sha256-hex.js +6 -120
  64. package/build/sync/assets/cache.js +998 -0
  65. package/build/sync/assets/types.js +62 -0
  66. package/build/sync/sync-api-controller.js +5 -5
  67. package/build/sync/sync-envelope-replay-service.js +2 -1
  68. package/build/sync/sync-resource-base.js +3 -0
  69. package/build/testing/test-runner.js +46 -584
  70. package/build/testing/velocious-attempt-executor.js +431 -0
  71. package/build/testing/velocious-runner-reporter.js +166 -0
  72. package/build/testing/velocious-suite-hook-executor.js +71 -0
  73. package/build/testing/velocious-test-arguments.js +55 -0
  74. package/build/tsconfig.tsbuildinfo +1 -1
  75. package/build/utils/sha256-bytes-hex.js +132 -0
  76. package/build/utils/sha256-hex.js +7 -135
  77. package/package.json +1 -1
  78. package/src/authorization/base-resource.js +18 -5
  79. package/src/configuration-types.js +34 -2
  80. package/src/database/record/index.js +42 -11
  81. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +17 -3
  82. package/src/frontend-model-controller.js +10 -5
  83. package/src/frontend-model-resource/base-resource.js +95 -41
  84. package/src/frontend-models/base.js +1 -1
  85. package/src/sync/assets/cache.js +998 -0
  86. package/src/sync/assets/types.js +62 -0
  87. package/src/sync/sync-api-controller.js +5 -5
  88. package/src/sync/sync-envelope-replay-service.js +2 -1
  89. package/src/sync/sync-resource-base.js +3 -0
  90. package/src/testing/test-runner.js +46 -584
  91. package/src/testing/velocious-attempt-executor.js +431 -0
  92. package/src/testing/velocious-runner-reporter.js +166 -0
  93. package/src/testing/velocious-suite-hook-executor.js +71 -0
  94. package/src/testing/velocious-test-arguments.js +55 -0
  95. package/src/utils/sha256-bytes-hex.js +132 -0
  96. package/src/utils/sha256-hex.js +7 -135
@@ -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 {}
@@ -1,7 +1,7 @@
1
1
  // @ts-check
2
2
 
3
3
  import Controller from "../controller.js"
4
- import FrontendModelBaseResource from "../frontend-model-resource/base-resource.js"
4
+ import FrontendModelBaseResource, {frontendModelResourceInternalConstructor} from "../frontend-model-resource/base-resource.js"
5
5
 
6
6
  /** Configurations whose sync.api routes have already been mounted. */
7
7
  const mountedConfigurations = new WeakSet()
@@ -41,9 +41,10 @@ export default class SyncApiController extends Controller {
41
41
  */
42
42
  syncResource(params) {
43
43
  const ResourceClass = this.syncResourceClass()
44
+ const ResourceConstructor = frontendModelResourceInternalConstructor(ResourceClass)
44
45
  const ability = this.currentAbility()
45
46
 
46
- return new ResourceClass({
47
+ return new ResourceConstructor({
47
48
  ability,
48
49
  controller: /** @type {import("../frontend-model-resource/base-resource.js").FrontendModelResourceController} */ (/** @type {unknown} */ (this)),
49
50
  context: {
@@ -137,7 +138,7 @@ export default class SyncApiController extends Controller {
137
138
  * @returns {import("../configuration-types.js").FrontendModelResourceClassType} Sync resource class.
138
139
  */
139
140
  missingSyncResourceClass() {
140
- return /** @type {typeof FrontendModelBaseResource} */ (/** @type {unknown} */ (this.raiseMissingSyncResourceClass()))
141
+ return /** @type {import("../configuration-types.js").FrontendModelResourceClassType} */ (/** @type {unknown} */ (this.raiseMissingSyncResourceClass()))
141
142
  }
142
143
 
143
144
  /** Raises a configuration error for subclasses that do not provide a resource. */
@@ -155,7 +156,7 @@ export default class SyncApiController extends Controller {
155
156
 
156
157
  if (!modelClass) throw new Error("Sync resource class must define static ModelClass")
157
158
 
158
- return modelClass
159
+ return /** @type {typeof import("../database/record/index.js").default} */ (/** @type {unknown} */ (modelClass))
159
160
  }
160
161
 
161
162
  /**
@@ -178,4 +179,3 @@ export default class SyncApiController extends Controller {
178
179
  })
179
180
  }
180
181
  }
181
-
@@ -1,6 +1,7 @@
1
1
  // @ts-check
2
2
 
3
3
  import {deliverDeclaredBroadcasts, upsertSyncRow} from "./sync-change-fanout.js"
4
+ import {frontendModelResourceInternalConstructor} from "../frontend-model-resource/base-resource.js"
4
5
  import {markServerApply} from "./sync-publish-suppression.js"
5
6
  import {resolveFrontendModelResourceClass} from "../frontend-models/resource-definition.js"
6
7
  import {resolveSyncConflict} from "./conflict-strategy.js"
@@ -567,7 +568,7 @@ export default class SyncEnvelopeReplayService {
567
568
  * @returns {Promise<import("../frontend-model-resource/base-resource.js").default>} Routed resource instance.
568
569
  */
569
570
  async buildReplayResource({actor, context, mutation, registration}) {
570
- const ResourceClass = registration.resourceClass
571
+ const ResourceClass = frontendModelResourceInternalConstructor(registration.resourceClass)
571
572
  const {ability, abilityContext} = await this.replayAbilityFor({actor, context})
572
573
 
573
574
  return new ResourceClass({
@@ -38,6 +38,9 @@ const QUICK_SEARCH_COLUMN = "quickSearch"
38
38
  * @augments {FrontendModelBaseResource<TModelClass>}
39
39
  */
40
40
  export default class SyncResourceBase extends FrontendModelBaseResource {
41
+ /** @type {typeof import("../database/record/index.js").default | undefined} */
42
+ static ModelClass = undefined
43
+
41
44
  /**
42
45
  * Replay service class handling replay mutations for this resource,
43
46
  * declared instead of overriding {@link SyncResourceBase#replayServiceClass}.