velocious 1.0.643 → 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 (48) hide show
  1. package/README.md +10 -1
  2. package/build/src/sync/assets/cache.d.ts +288 -0
  3. package/build/src/sync/assets/cache.d.ts.map +1 -0
  4. package/build/src/sync/assets/cache.js +883 -0
  5. package/build/src/sync/assets/types.d.ts +199 -0
  6. package/build/src/sync/assets/types.d.ts.map +1 -0
  7. package/build/src/sync/assets/types.js +56 -0
  8. package/build/src/testing/test-runner.d.ts +8 -0
  9. package/build/src/testing/test-runner.d.ts.map +1 -1
  10. package/build/src/testing/test-runner.js +49 -548
  11. package/build/src/testing/velocious-attempt-executor.d.ts +69 -0
  12. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
  13. package/build/src/testing/velocious-attempt-executor.js +402 -0
  14. package/build/src/testing/velocious-runner-reporter.d.ts +72 -0
  15. package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
  16. package/build/src/testing/velocious-runner-reporter.js +152 -0
  17. package/build/src/testing/velocious-suite-hook-executor.d.ts +37 -0
  18. package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
  19. package/build/src/testing/velocious-suite-hook-executor.js +66 -0
  20. package/build/src/testing/velocious-test-arguments.d.ts +34 -0
  21. package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
  22. package/build/src/testing/velocious-test-arguments.js +47 -0
  23. package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
  24. package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
  25. package/build/src/utils/sha256-bytes-hex.js +117 -0
  26. package/build/src/utils/sha256-hex.d.ts +2 -4
  27. package/build/src/utils/sha256-hex.d.ts.map +1 -1
  28. package/build/src/utils/sha256-hex.js +6 -120
  29. package/build/sync/assets/cache.js +998 -0
  30. package/build/sync/assets/types.js +62 -0
  31. package/build/testing/test-runner.js +46 -584
  32. package/build/testing/velocious-attempt-executor.js +431 -0
  33. package/build/testing/velocious-runner-reporter.js +166 -0
  34. package/build/testing/velocious-suite-hook-executor.js +71 -0
  35. package/build/testing/velocious-test-arguments.js +55 -0
  36. package/build/tsconfig.tsbuildinfo +1 -1
  37. package/build/utils/sha256-bytes-hex.js +132 -0
  38. package/build/utils/sha256-hex.js +7 -135
  39. package/package.json +1 -1
  40. package/src/sync/assets/cache.js +998 -0
  41. package/src/sync/assets/types.js +62 -0
  42. package/src/testing/test-runner.js +46 -584
  43. package/src/testing/velocious-attempt-executor.js +431 -0
  44. package/src/testing/velocious-runner-reporter.js +166 -0
  45. package/src/testing/velocious-suite-hook-executor.js +71 -0
  46. package/src/testing/velocious-test-arguments.js +55 -0
  47. package/src/utils/sha256-bytes-hex.js +132 -0
  48. package/src/utils/sha256-hex.js +7 -135
package/README.md CHANGED
@@ -713,6 +713,9 @@ User.hasOneAttachment("profilePicture", {
713
713
  `db:migrate` provisions the framework-owned attachment table before runtime
714
714
  attachment work begins. See [Backend record attachments](docs/attachments.md)
715
715
  for the complete input, storage-driver, lifecycle, and path-security contracts.
716
+ Offline-capable clients can apply synchronized attachment descriptors through
717
+ the platform-neutral [Synchronized asset cache](docs/synchronized-assets.md),
718
+ while Expo and web packages own their respective byte-storage adapters.
716
719
 
717
720
  You can also pass a driver class or instance directly on the attachment:
718
721
 
@@ -841,7 +844,13 @@ The optional model-level `sync` block is client-safe policy metadata for asset
841
844
  cache adapters. It distinguishes eager/on-demand fetching,
842
845
  durable/evictable retention, and optional/required offline availability.
843
846
  Required offline assets must be durable. Backend driver configuration never
844
- appears in generated frontend models or API manifests.
847
+ appears in generated frontend models or API manifests. A descriptor ID keeps
848
+ its digest, byte size, and content type immutably. Cache descriptors that share
849
+ a digest must agree on byte size and content type, and eager synchronization
850
+ attempts each shared digest only once per reconciliation. On-demand resolution
851
+ rechecks the backing blob after cleanup and returns `null` instead of a stale
852
+ local URI when concurrent eviction removed it. Cleanup deferred by an active
853
+ cached resolution runs again after that digest's final guard releases.
845
854
  Attachment metadata is exposed through the built-in `VelociousAttachment` frontend model with safe fields only: `id`, `recordType`, `recordId`, `name`, `position`, `filename`, `contentType`, `byteSize`, `createdAt`, and `updatedAt`. Storage internals such as `driver`, `storageKey`, and `contentBase64` remain hidden and non-queryable. Direct metadata queries require owner filters: `recordType`, `recordId`, and `name`.
846
855
 
847
856
  When your frontend app calls a backend on another host/port (or under a path prefix), configure transport once:
@@ -0,0 +1,288 @@
1
+ export type SynchronizedAssetDownloadFlight = {
2
+ byteSize: number;
3
+ contentType: string | null;
4
+ promise: Promise<{
5
+ error: Error;
6
+ uri: null;
7
+ } | {
8
+ error: null;
9
+ uri: string;
10
+ }>;
11
+ };
12
+ /**
13
+ * Core synchronized asset cache. Platform packages own byte and metadata
14
+ * persistence while this class owns policy, integrity, and lifecycle.
15
+ */
16
+ export default class SynchronizedAssetCache {
17
+ accountId: string;
18
+ adapter: import("./types.js").SynchronizedAssetCacheAdapter;
19
+ download: (descriptor: import("./types.js").SynchronizedAssetCacheDescriptor) => Promise<Uint8Array>;
20
+ maxBytes: number;
21
+ now: () => Date;
22
+ retryBaseDelayMs: number;
23
+ retryMaxDelayMs: number;
24
+ /** @type {Map<string, number>} */
25
+ activeDigestCounts: Map<string, number>;
26
+ /** @type {Map<string, Promise<void>>} */
27
+ deletionPromises: Map<string, Promise<void>>;
28
+ /** @type {Set<string>} */
29
+ cleanupRequiredAfterReleaseDigests: Set<string>;
30
+ /** @type {Promise<number>} */
31
+ cleanupPromise: Promise<number>;
32
+ /** @type {Map<string, SynchronizedAssetDownloadFlight>} */
33
+ downloadPromises: Map<string, SynchronizedAssetDownloadFlight>;
34
+ /** @type {import("./types.js").SynchronizedAssetCacheState | null} */
35
+ state: import("./types.js").SynchronizedAssetCacheState | null;
36
+ /** @type {Promise<import("./types.js").SynchronizedAssetCacheState> | null} */
37
+ statePromise: Promise<import("./types.js").SynchronizedAssetCacheState> | null;
38
+ /** @type {Promise<void>} */
39
+ saveStatePromise: Promise<void>;
40
+ /** @type {Map<string, Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>>} */
41
+ synchronizePromises: Map<string, Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>>;
42
+ /**
43
+ * Creates a synchronized asset cache.
44
+ * @param {object} args Options.
45
+ * @param {string} args.accountId Authenticated account namespace.
46
+ * @param {import("./types.js").SynchronizedAssetCacheAdapter} args.adapter Platform storage adapter.
47
+ * @param {(descriptor: import("./types.js").SynchronizedAssetCacheDescriptor) => Promise<Uint8Array>} args.download Authenticated byte downloader.
48
+ * @param {number} args.maxBytes Maximum evictable cache size.
49
+ * @param {() => Date} [args.now] Clock.
50
+ * @param {number} [args.retryBaseDelayMs] Initial retry delay.
51
+ * @param {number} [args.retryMaxDelayMs] Maximum retry delay.
52
+ */
53
+ constructor({ accountId, adapter, download, maxBytes, now, retryBaseDelayMs, retryMaxDelayMs }: {
54
+ accountId: string;
55
+ adapter: import("./types.js").SynchronizedAssetCacheAdapter;
56
+ download: (descriptor: import("./types.js").SynchronizedAssetCacheDescriptor) => Promise<Uint8Array>;
57
+ maxBytes: number;
58
+ now?: () => Date;
59
+ retryBaseDelayMs?: number;
60
+ retryMaxDelayMs?: number;
61
+ });
62
+ /**
63
+ * Reconciles the immutable descriptors for one synchronized scope and
64
+ * downloads eligible eager assets.
65
+ * @param {object} args Reconciliation inputs.
66
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor[]} args.descriptors Current descriptors in the scope.
67
+ * @param {boolean} args.online Whether authenticated downloads are available.
68
+ * @param {string} args.scopeKey Stable synchronized scope key.
69
+ * @returns {Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>} Synchronization result.
70
+ */
71
+ synchronize({ descriptors, online, scopeKey }: {
72
+ descriptors: import("./types.js").SynchronizedAssetCacheDescriptor[];
73
+ online: boolean;
74
+ scopeKey: string;
75
+ }): Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>;
76
+ /**
77
+ * Runs one scope synchronization after prior calls for that scope finish.
78
+ * @param {object} args Reconciliation inputs.
79
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor[]} args.descriptors Current descriptors in the scope.
80
+ * @param {boolean} args.online Whether authenticated downloads are available.
81
+ * @param {string} args.scopeKey Stable synchronized scope key.
82
+ * @returns {Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>} Synchronization result.
83
+ */
84
+ synchronizeScope({ descriptors, online, scopeKey }: {
85
+ descriptors: import("./types.js").SynchronizedAssetCacheDescriptor[];
86
+ online: boolean;
87
+ scopeKey: string;
88
+ }): Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>;
89
+ /**
90
+ * Resolves a cached asset URI, downloading it on demand when allowed.
91
+ * @param {object} args Resolution inputs.
92
+ * @param {string} args.assetId Attachment descriptor id.
93
+ * @param {boolean} args.online Whether authenticated downloads are available.
94
+ * @returns {Promise<string | null>} Cached asset URI.
95
+ */
96
+ resolve({ assetId, online }: {
97
+ assetId: string;
98
+ online: boolean;
99
+ }): Promise<string | null>;
100
+ /**
101
+ * Evicts least-recently-used blobs until the unique cached byte total is
102
+ * within the configured budget. A blob stays durable when any live
103
+ * descriptor reference declares durable retention.
104
+ * @param {Set<string>} [protectedDigests] Digests needed by the active caller.
105
+ * @returns {Promise<number>} Bytes removed.
106
+ */
107
+ cleanup(protectedDigests?: Set<string>): Promise<number>;
108
+ /**
109
+ * Performs one serialized eviction pass.
110
+ * @param {Set<string>} protectedDigests Digests needed by the active caller.
111
+ * @returns {Promise<number>} Bytes removed.
112
+ */
113
+ performCleanup(protectedDigests: Set<string>): Promise<number>;
114
+ /**
115
+ * Loads cache state once for this cache instance.
116
+ * @returns {Promise<import("./types.js").SynchronizedAssetCacheState>} Loaded state.
117
+ */
118
+ loadState(): Promise<import("./types.js").SynchronizedAssetCacheState>;
119
+ /**
120
+ * Loads and recovers persisted cache state.
121
+ * @returns {Promise<import("./types.js").SynchronizedAssetCacheState>} Loaded state.
122
+ */
123
+ loadStateFromAdapter(): Promise<import("./types.js").SynchronizedAssetCacheState>;
124
+ /**
125
+ * Persists the current cache state.
126
+ * @returns {Promise<void>} Resolves after state persistence.
127
+ */
128
+ saveState(): Promise<void>;
129
+ /**
130
+ * Persists a detached reconciliation before exposing it through shared state.
131
+ * @param {object} args Reconciliation inputs.
132
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor[]} args.descriptors Current descriptors in the scope.
133
+ * @param {string} args.scopeKey Stable synchronized scope key.
134
+ * @returns {Promise<Map<string, import("./types.js").SynchronizedAssetCacheEntry>>} Reconciled live entries by id.
135
+ */
136
+ reconcileDescriptors({ descriptors, scopeKey }: {
137
+ descriptors: import("./types.js").SynchronizedAssetCacheDescriptor[];
138
+ scopeKey: string;
139
+ }): Promise<Map<string, import("./types.js").SynchronizedAssetCacheEntry>>;
140
+ /**
141
+ * Applies one scope's descriptor set to cache state.
142
+ * @param {object} args Reconciliation inputs.
143
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor[]} args.descriptors Current descriptors in the scope.
144
+ * @param {number} args.newEntryLastAccessedAt Initial LRU timestamp for new entries.
145
+ * @param {string} args.scopeKey Stable synchronized scope key.
146
+ * @param {import("./types.js").SynchronizedAssetCacheState} args.state State to reconcile.
147
+ * @returns {Map<string, import("./types.js").SynchronizedAssetCacheEntry>} Live entries by id.
148
+ */
149
+ applyDescriptorReconciliation({ descriptors, newEntryLastAccessedAt, scopeKey, state }: {
150
+ descriptors: import("./types.js").SynchronizedAssetCacheDescriptor[];
151
+ newEntryLastAccessedAt: number;
152
+ scopeKey: string;
153
+ state: import("./types.js").SynchronizedAssetCacheState;
154
+ }): Map<string, import("./types.js").SynchronizedAssetCacheEntry>;
155
+ /**
156
+ * Copies metadata into a detached persistence candidate.
157
+ * @param {import("./types.js").SynchronizedAssetCacheState} state State to copy.
158
+ * @returns {import("./types.js").SynchronizedAssetCacheState} Detached state.
159
+ */
160
+ copyState(state: import("./types.js").SynchronizedAssetCacheState): import("./types.js").SynchronizedAssetCacheState;
161
+ /**
162
+ * Serializes one metadata persistence operation after prior failures or successes.
163
+ * @param {() => Promise<void>} persist Persistence operation.
164
+ * @returns {Promise<void>} Resolves after persistence.
165
+ */
166
+ serializeStatePersistence(persist: () => Promise<void>): Promise<void>;
167
+ /**
168
+ * Ensures one descriptor has verified local bytes.
169
+ * @param {import("./types.js").SynchronizedAssetCacheEntry} entry Descriptor state.
170
+ * @returns {Promise<{error: Error | null, uri: string | null}>} Cache result.
171
+ */
172
+ ensureCached(entry: import("./types.js").SynchronizedAssetCacheEntry): Promise<{
173
+ error: Error | null;
174
+ uri: string | null;
175
+ }>;
176
+ /**
177
+ * Resolves or downloads descriptors sharing one protected digest.
178
+ * @param {import("./types.js").SynchronizedAssetCacheEntry[]} entries Descriptor states.
179
+ * @returns {Promise<{error: Error | null, uri: string | null}>} Cache result.
180
+ */
181
+ ensureCachedWhileActive(entries: import("./types.js").SynchronizedAssetCacheEntry[]): Promise<{
182
+ error: Error | null;
183
+ uri: string | null;
184
+ }>;
185
+ /**
186
+ * Records one cached digest result for every participating descriptor.
187
+ * @param {import("./types.js").SynchronizedAssetCacheEntry[]} entries Descriptor states.
188
+ * @returns {Promise<void>} Resolves after persistence.
189
+ */
190
+ recordCachedEntries(entries: import("./types.js").SynchronizedAssetCacheEntry[]): Promise<void>;
191
+ /**
192
+ * Persists download intent, then downloads one digest and records a shared failure once.
193
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor} descriptor Asset descriptor.
194
+ * @returns {Promise<{error: Error, uri: null} | {error: null, uri: string}>} Shared cache result.
195
+ */
196
+ downloadAfterPersistingState(descriptor: import("./types.js").SynchronizedAssetCacheDescriptor): Promise<{
197
+ error: Error;
198
+ uri: null;
199
+ } | {
200
+ error: null;
201
+ uri: string;
202
+ }>;
203
+ /**
204
+ * Advances retry metadata for every live descriptor sharing one failed digest.
205
+ * @param {string} digest Content digest.
206
+ * @returns {Promise<void>} Resolves after persistence.
207
+ */
208
+ recordDownloadFailure(digest: string): Promise<void>;
209
+ /**
210
+ * Downloads, verifies, and atomically persists one content digest.
211
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor} descriptor Asset descriptor.
212
+ * @returns {Promise<string>} Adapter URI.
213
+ */
214
+ downloadVerified(descriptor: import("./types.js").SynchronizedAssetCacheDescriptor): Promise<string>;
215
+ /**
216
+ * Resolves an existing local URI after waiting for deletion work.
217
+ * @param {import("./types.js").SynchronizedAssetCacheEntry} entry Descriptor state.
218
+ * @returns {Promise<string | null>} Existing URI.
219
+ */
220
+ cachedUri(entry: import("./types.js").SynchronizedAssetCacheEntry): Promise<string | null>;
221
+ /**
222
+ * Resolves an existing local URI while its digest is protected.
223
+ * @param {import("./types.js").SynchronizedAssetCacheEntry} entry Descriptor state.
224
+ * @returns {Promise<string | null>} Existing URI.
225
+ */
226
+ cachedUriWhileActive(entry: import("./types.js").SynchronizedAssetCacheEntry): Promise<string | null>;
227
+ /**
228
+ * Waits for deletion and protects a digest for one active cache operation.
229
+ * @param {string} digest Content digest.
230
+ * @returns {Promise<void>} Resolves after protection is registered.
231
+ */
232
+ beginActiveDigest(digest: string): Promise<void>;
233
+ /**
234
+ * Releases one cache operation and processes deferred deletion after the last.
235
+ * @param {string} digest Content digest.
236
+ * @param {Set<string>} [protectedCleanupDigests] Digests needed by the resolving caller.
237
+ * @returns {Promise<boolean>} Whether finalization requires URI revalidation.
238
+ */
239
+ finishActiveDigest(digest: string, protectedCleanupDigests?: Set<string>): Promise<boolean>;
240
+ /**
241
+ * Releases every acquired digest before propagating finalization failures.
242
+ * @param {string[]} digests Content digests.
243
+ * @returns {Promise<void>} Resolves after every digest is released.
244
+ */
245
+ finishActiveDigests(digests: string[]): Promise<void>;
246
+ /**
247
+ * Deletes blobs that lost their final descriptor reference.
248
+ * @returns {Promise<void>} Resolves after deletion.
249
+ */
250
+ deleteUnreferencedDigests(): Promise<void>;
251
+ /**
252
+ * Deletes one persisted pending digest when no descriptor or active operation owns it.
253
+ * @param {string} digest Content digest.
254
+ * @returns {Promise<boolean>} Whether the blob was deleted.
255
+ */
256
+ deletePendingDigestIfUnreferenced(digest: string): Promise<boolean>;
257
+ /**
258
+ * Runs one deletion only after earlier deletion work and when no cache operation owns the digest.
259
+ * @param {string} digest Content digest.
260
+ * @param {() => Promise<boolean>} callback Protected deletion callback.
261
+ * @returns {Promise<boolean>} Whether the callback deleted the blob.
262
+ */
263
+ deleteDigestIfInactive(digest: string, callback: () => Promise<boolean>): Promise<boolean>;
264
+ /**
265
+ * Finds required assets without locally cached bytes.
266
+ * @param {string} scopeKey Synchronized scope to inspect.
267
+ * @returns {Promise<string[]>} Missing required descriptor ids.
268
+ */
269
+ missingRequiredAssetIds(scopeKey: string): Promise<string[]>;
270
+ /**
271
+ * Checks whether a failed or missing entry may be downloaded now.
272
+ * @param {import("./types.js").SynchronizedAssetCacheEntry} entry Descriptor state.
273
+ * @returns {boolean} Whether the retry deadline has passed.
274
+ */
275
+ retryEligible(entry: import("./types.js").SynchronizedAssetCacheEntry): boolean;
276
+ /**
277
+ * Calculates bounded exponential retry delay.
278
+ * @param {number} attempts Consecutive failures.
279
+ * @returns {number} Retry delay.
280
+ */
281
+ retryDelay(attempts: number): number;
282
+ /**
283
+ * Reads the injectable wall clock.
284
+ * @returns {number} Current epoch milliseconds.
285
+ */
286
+ nowMilliseconds(): number;
287
+ }
288
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../src/sync/assets/cache.js"],"names":[],"mappings":"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"}