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.
- package/README.md +25 -2
- package/build/authorization/base-resource.js +18 -5
- package/build/configuration-types.js +34 -2
- package/build/database/record/index.js +42 -11
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +17 -3
- package/build/frontend-model-controller.js +10 -5
- package/build/frontend-model-resource/base-resource.js +95 -41
- package/build/frontend-models/base.js +1 -1
- package/build/src/authorization/base-resource.d.ts +19 -6
- package/build/src/authorization/base-resource.d.ts.map +1 -1
- package/build/src/authorization/base-resource.js +16 -6
- package/build/src/configuration-types.d.ts +72 -5
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +31 -3
- package/build/src/database/record/index.d.ts +44 -46
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +39 -12
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +19 -4
- package/build/src/frontend-model-controller.d.ts +1 -1
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +9 -6
- package/build/src/frontend-model-resource/base-resource.d.ts +66 -32
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +89 -42
- package/build/src/frontend-models/base.d.ts +1 -0
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +2 -2
- package/build/src/sync/assets/cache.d.ts +288 -0
- package/build/src/sync/assets/cache.d.ts.map +1 -0
- package/build/src/sync/assets/cache.js +883 -0
- package/build/src/sync/assets/types.d.ts +199 -0
- package/build/src/sync/assets/types.d.ts.map +1 -0
- package/build/src/sync/assets/types.js +56 -0
- package/build/src/sync/sync-api-controller.d.ts.map +1 -1
- package/build/src/sync/sync-api-controller.js +6 -5
- package/build/src/sync/sync-envelope-replay-service.d.ts +1 -1
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +3 -2
- package/build/src/sync/sync-resource-base.d.ts +2 -0
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +3 -1
- package/build/src/testing/test-runner.d.ts +8 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +49 -548
- package/build/src/testing/velocious-attempt-executor.d.ts +69 -0
- package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-attempt-executor.js +402 -0
- package/build/src/testing/velocious-runner-reporter.d.ts +72 -0
- package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
- package/build/src/testing/velocious-runner-reporter.js +152 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts +37 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-suite-hook-executor.js +66 -0
- package/build/src/testing/velocious-test-arguments.d.ts +34 -0
- package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
- package/build/src/testing/velocious-test-arguments.js +47 -0
- package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
- package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
- package/build/src/utils/sha256-bytes-hex.js +117 -0
- package/build/src/utils/sha256-hex.d.ts +2 -4
- package/build/src/utils/sha256-hex.d.ts.map +1 -1
- package/build/src/utils/sha256-hex.js +6 -120
- package/build/sync/assets/cache.js +998 -0
- package/build/sync/assets/types.js +62 -0
- package/build/sync/sync-api-controller.js +5 -5
- package/build/sync/sync-envelope-replay-service.js +2 -1
- package/build/sync/sync-resource-base.js +3 -0
- package/build/testing/test-runner.js +46 -584
- package/build/testing/velocious-attempt-executor.js +431 -0
- package/build/testing/velocious-runner-reporter.js +166 -0
- package/build/testing/velocious-suite-hook-executor.js +71 -0
- package/build/testing/velocious-test-arguments.js +55 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/sha256-bytes-hex.js +132 -0
- package/build/utils/sha256-hex.js +7 -135
- package/package.json +1 -1
- package/src/authorization/base-resource.js +18 -5
- package/src/configuration-types.js +34 -2
- package/src/database/record/index.js +42 -11
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +17 -3
- package/src/frontend-model-controller.js +10 -5
- package/src/frontend-model-resource/base-resource.js +95 -41
- package/src/frontend-models/base.js +1 -1
- package/src/sync/assets/cache.js +998 -0
- package/src/sync/assets/types.js +62 -0
- package/src/sync/sync-api-controller.js +5 -5
- package/src/sync/sync-envelope-replay-service.js +2 -1
- package/src/sync/sync-resource-base.js +3 -0
- package/src/testing/test-runner.js +46 -584
- package/src/testing/velocious-attempt-executor.js +431 -0
- package/src/testing/velocious-runner-reporter.js +166 -0
- package/src/testing/velocious-suite-hook-executor.js +71 -0
- package/src/testing/velocious-test-arguments.js +55 -0
- package/src/utils/sha256-bytes-hex.js +132 -0
- 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
|
|
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 {
|
|
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}.
|