@adobe/data-persistence 0.9.90
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/LICENSE +21 -0
- package/README.md +258 -0
- package/dist/backend/memory-backend.d.ts +6 -0
- package/dist/backend/memory-backend.js +92 -0
- package/dist/backend/memory-backend.js.map +1 -0
- package/dist/backend/memory-backend.test.d.ts +1 -0
- package/dist/backend/memory-backend.test.js +7 -0
- package/dist/backend/memory-backend.test.js.map +1 -0
- package/dist/backend/memory-file.d.ts +7 -0
- package/dist/backend/memory-file.js +90 -0
- package/dist/backend/memory-file.js.map +1 -0
- package/dist/backend/memory-file.test.d.ts +1 -0
- package/dist/backend/memory-file.test.js +5 -0
- package/dist/backend/memory-file.test.js.map +1 -0
- package/dist/backend/persistence-backend.conformance.d.ts +10 -0
- package/dist/backend/persistence-backend.conformance.js +104 -0
- package/dist/backend/persistence-backend.conformance.js.map +1 -0
- package/dist/backend/persistence-backend.d.ts +54 -0
- package/dist/backend/persistence-backend.js +3 -0
- package/dist/backend/persistence-backend.js.map +1 -0
- package/dist/backend/random-access-file.conformance.d.ts +20 -0
- package/dist/backend/random-access-file.conformance.js +156 -0
- package/dist/backend/random-access-file.conformance.js.map +1 -0
- package/dist/backend/random-access-file.d.ts +39 -0
- package/dist/backend/random-access-file.js +3 -0
- package/dist/backend/random-access-file.js.map +1 -0
- package/dist/backend/validate-rel-path.d.ts +14 -0
- package/dist/backend/validate-rel-path.js +44 -0
- package/dist/backend/validate-rel-path.js.map +1 -0
- package/dist/backend/validate-rel-path.test.d.ts +1 -0
- package/dist/backend/validate-rel-path.test.js +37 -0
- package/dist/backend/validate-rel-path.test.js.map +1 -0
- package/dist/browser/browser-worker-bootstrap.d.ts +1 -0
- package/dist/browser/browser-worker-bootstrap.js +97 -0
- package/dist/browser/browser-worker-bootstrap.js.map +1 -0
- package/dist/browser/browser-worker-transport.browser.test.d.ts +1 -0
- package/dist/browser/browser-worker-transport.browser.test.js +156 -0
- package/dist/browser/browser-worker-transport.browser.test.js.map +1 -0
- package/dist/browser/browser-worker-transport.d.ts +33 -0
- package/dist/browser/browser-worker-transport.js +120 -0
- package/dist/browser/browser-worker-transport.js.map +1 -0
- package/dist/browser/create-opfs-provider.d.ts +23 -0
- package/dist/browser/create-opfs-provider.js +49 -0
- package/dist/browser/create-opfs-provider.js.map +1 -0
- package/dist/browser/index.d.ts +6 -0
- package/dist/browser/index.js +12 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/mount-opfs.d.ts +12 -0
- package/dist/browser/mount-opfs.js +15 -0
- package/dist/browser/mount-opfs.js.map +1 -0
- package/dist/browser/opfs-backend-lock.browser.test.d.ts +1 -0
- package/dist/browser/opfs-backend-lock.browser.test.js +127 -0
- package/dist/browser/opfs-backend-lock.browser.test.js.map +1 -0
- package/dist/browser/opfs-backend.d.ts +6 -0
- package/dist/browser/opfs-backend.js +162 -0
- package/dist/browser/opfs-backend.js.map +1 -0
- package/dist/browser/opfs-lock-test-worker.d.ts +1 -0
- package/dist/browser/opfs-lock-test-worker.js +50 -0
- package/dist/browser/opfs-lock-test-worker.js.map +1 -0
- package/dist/browser/opfs-sync-file.d.ts +10 -0
- package/dist/browser/opfs-sync-file.js +58 -0
- package/dist/browser/opfs-sync-file.js.map +1 -0
- package/dist/encoder/create-column-encoder.d.ts +15 -0
- package/dist/encoder/create-column-encoder.js +110 -0
- package/dist/encoder/create-column-encoder.js.map +1 -0
- package/dist/encoder/journal-snapshot-codec.d.ts +21 -0
- package/dist/encoder/journal-snapshot-codec.js +103 -0
- package/dist/encoder/journal-snapshot-codec.js.map +1 -0
- package/dist/encoder/journal-snapshot-codec.test.d.ts +1 -0
- package/dist/encoder/journal-snapshot-codec.test.js +96 -0
- package/dist/encoder/journal-snapshot-codec.test.js.map +1 -0
- package/dist/encoder/types.d.ts +72 -0
- package/dist/encoder/types.js +3 -0
- package/dist/encoder/types.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/journal/journal-codec.d.ts +28 -0
- package/dist/journal/journal-codec.js +82 -0
- package/dist/journal/journal-codec.js.map +1 -0
- package/dist/journal/journal-codec.test.d.ts +1 -0
- package/dist/journal/journal-codec.test.js +106 -0
- package/dist/journal/journal-codec.test.js.map +1 -0
- package/dist/journal/journal-entry.d.ts +63 -0
- package/dist/journal/journal-entry.js +28 -0
- package/dist/journal/journal-entry.js.map +1 -0
- package/dist/node/create-node-fs-provider.d.ts +34 -0
- package/dist/node/create-node-fs-provider.js +48 -0
- package/dist/node/create-node-fs-provider.js.map +1 -0
- package/dist/node/index.d.ts +6 -0
- package/dist/node/index.js +10 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/mount-node-fs.d.ts +12 -0
- package/dist/node/mount-node-fs.js +15 -0
- package/dist/node/mount-node-fs.js.map +1 -0
- package/dist/node/node-fs-backend-lock.node.test.d.ts +1 -0
- package/dist/node/node-fs-backend-lock.node.test.js +160 -0
- package/dist/node/node-fs-backend-lock.node.test.js.map +1 -0
- package/dist/node/node-fs-backend.d.ts +21 -0
- package/dist/node/node-fs-backend.js +186 -0
- package/dist/node/node-fs-backend.js.map +1 -0
- package/dist/node/node-fs-backend.node.test.d.ts +1 -0
- package/dist/node/node-fs-backend.node.test.js +17 -0
- package/dist/node/node-fs-backend.node.test.js.map +1 -0
- package/dist/node/node-fs-file.d.ts +6 -0
- package/dist/node/node-fs-file.js +57 -0
- package/dist/node/node-fs-file.js.map +1 -0
- package/dist/node/node-fs-file.node.test.d.ts +1 -0
- package/dist/node/node-fs-file.node.test.js +13 -0
- package/dist/node/node-fs-file.node.test.js.map +1 -0
- package/dist/node/node-fs-provider.node.test.d.ts +1 -0
- package/dist/node/node-fs-provider.node.test.js +119 -0
- package/dist/node/node-fs-provider.node.test.js.map +1 -0
- package/dist/node/node-worker-bootstrap.d.ts +1 -0
- package/dist/node/node-worker-bootstrap.js +104 -0
- package/dist/node/node-worker-bootstrap.js.map +1 -0
- package/dist/node/node-worker-transport.d.ts +27 -0
- package/dist/node/node-worker-transport.js +152 -0
- package/dist/node/node-worker-transport.js.map +1 -0
- package/dist/node/node-worker-transport.node.test.d.ts +1 -0
- package/dist/node/node-worker-transport.node.test.js +147 -0
- package/dist/node/node-worker-transport.node.test.js.map +1 -0
- package/dist/perftest/perf-harness.d.ts +74 -0
- package/dist/perftest/perf-harness.js +147 -0
- package/dist/perftest/perf-harness.js.map +1 -0
- package/dist/perftest/persistence-perf.d.ts +2 -0
- package/dist/perftest/persistence-perf.js +290 -0
- package/dist/perftest/persistence-perf.js.map +1 -0
- package/dist/perftest/run.d.ts +1 -0
- package/dist/perftest/run.js +28 -0
- package/dist/perftest/run.js.map +1 -0
- package/dist/provider/create-memory-provider.d.ts +16 -0
- package/dist/provider/create-memory-provider.js +44 -0
- package/dist/provider/create-memory-provider.js.map +1 -0
- package/dist/provider/mount.d.ts +20 -0
- package/dist/provider/mount.js +20 -0
- package/dist/provider/mount.js.map +1 -0
- package/dist/provider/persistence-provider.d.ts +63 -0
- package/dist/provider/persistence-provider.js +3 -0
- package/dist/provider/persistence-provider.js.map +1 -0
- package/dist/provider/persistence-provider.test.d.ts +9 -0
- package/dist/provider/persistence-provider.test.js +139 -0
- package/dist/provider/persistence-provider.test.js.map +1 -0
- package/dist/service/component-nonpersistent-durability.test.d.ts +1 -0
- package/dist/service/component-nonpersistent-durability.test.js +57 -0
- package/dist/service/component-nonpersistent-durability.test.js.map +1 -0
- package/dist/service/create-incremental-persistence-service.d.ts +7 -0
- package/dist/service/create-incremental-persistence-service.js +960 -0
- package/dist/service/create-incremental-persistence-service.js.map +1 -0
- package/dist/service/create-worker-persistence-service.d.ts +1 -0
- package/dist/service/create-worker-persistence-service.js +7 -0
- package/dist/service/create-worker-persistence-service.js.map +1 -0
- package/dist/service/create-worker-persistence-service.test.d.ts +1 -0
- package/dist/service/create-worker-persistence-service.test.js +291 -0
- package/dist/service/create-worker-persistence-service.test.js.map +1 -0
- package/dist/service/entity-location-cache.d.ts +15 -0
- package/dist/service/entity-location-cache.js +75 -0
- package/dist/service/entity-location-cache.js.map +1 -0
- package/dist/service/entity-location-density.test.d.ts +1 -0
- package/dist/service/entity-location-density.test.js +42 -0
- package/dist/service/entity-location-density.test.js.map +1 -0
- package/dist/service/incremental-persistence-service.d.ts +57 -0
- package/dist/service/incremental-persistence-service.js +3 -0
- package/dist/service/incremental-persistence-service.js.map +1 -0
- package/dist/service/intermediate-relocation-durability.test.d.ts +1 -0
- package/dist/service/intermediate-relocation-durability.test.js +89 -0
- package/dist/service/intermediate-relocation-durability.test.js.map +1 -0
- package/dist/service/internal-access.d.ts +34 -0
- package/dist/service/internal-access.js +43 -0
- package/dist/service/internal-access.js.map +1 -0
- package/dist/service/journal-replay.test.d.ts +1 -0
- package/dist/service/journal-replay.test.js +424 -0
- package/dist/service/journal-replay.test.js.map +1 -0
- package/dist/service/journal-storage-durability.test.d.ts +1 -0
- package/dist/service/journal-storage-durability.test.js +171 -0
- package/dist/service/journal-storage-durability.test.js.map +1 -0
- package/dist/service/load-roundtrip.test.d.ts +1 -0
- package/dist/service/load-roundtrip.test.js +224 -0
- package/dist/service/load-roundtrip.test.js.map +1 -0
- package/dist/service/persistence-complexity.test.d.ts +1 -0
- package/dist/service/persistence-complexity.test.js +275 -0
- package/dist/service/persistence-complexity.test.js.map +1 -0
- package/dist/service/worker-persistence-service.d.ts +24 -0
- package/dist/service/worker-persistence-service.js +8 -0
- package/dist/service/worker-persistence-service.js.map +1 -0
- package/dist/transport/inprocess-transport.d.ts +15 -0
- package/dist/transport/inprocess-transport.js +64 -0
- package/dist/transport/inprocess-transport.js.map +1 -0
- package/dist/transport/inprocess-transport.test.d.ts +1 -0
- package/dist/transport/inprocess-transport.test.js +100 -0
- package/dist/transport/inprocess-transport.test.js.map +1 -0
- package/dist/transport/router.d.ts +12 -0
- package/dist/transport/router.js +146 -0
- package/dist/transport/router.js.map +1 -0
- package/dist/transport/transport.d.ts +105 -0
- package/dist/transport/transport.js +3 -0
- package/dist/transport/transport.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
/**
|
|
3
|
+
* Mount a persistence session using the supplied provider.
|
|
4
|
+
*
|
|
5
|
+
* This is the single entry point for all persistence. The provider
|
|
6
|
+
* encapsulates the storage strategy — Node.js `fs`, OPFS, in-memory, or
|
|
7
|
+
* a custom cloud implementation.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { mount } from "@adobe/data-persistence";
|
|
11
|
+
* import { createNodeFsProvider } from "@adobe/data-persistence/node";
|
|
12
|
+
*
|
|
13
|
+
* const m = await mount(createNodeFsProvider("/tmp/my-db"), database);
|
|
14
|
+
* await m.service.load();
|
|
15
|
+
* // ...run app...
|
|
16
|
+
* await m.dispose();
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const mount = (provider, database, options) => provider.mount(database, options);
|
|
20
|
+
//# sourceMappingURL=mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/provider/mount.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAKvD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CACjB,QAA6B,EAC7B,QAA0D,EAC1D,OAA8B,EACL,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Database } from "@adobe/data/ecs";
|
|
2
|
+
import type { IncrementalPersistenceService } from "../service/incremental-persistence-service.js";
|
|
3
|
+
/**
|
|
4
|
+
* Options common to all persistence provider mounts.
|
|
5
|
+
*/
|
|
6
|
+
export interface ProviderMountOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Automatically persist every non-transient, persistent transaction.
|
|
9
|
+
* Defaults to `true`.
|
|
10
|
+
*/
|
|
11
|
+
readonly autoPersist?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Checkpoint cadence. The first condition that fires triggers a checkpoint.
|
|
14
|
+
*/
|
|
15
|
+
readonly checkpoint?: {
|
|
16
|
+
readonly everyNTransactions?: number;
|
|
17
|
+
readonly idleMs?: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A fully-wired persistence session returned by a `PersistenceProvider`.
|
|
22
|
+
*
|
|
23
|
+
* Obtained via `mount(provider, database, opts)`. Call `dispose()` to
|
|
24
|
+
* tear everything down in the correct order — do not call
|
|
25
|
+
* `service.dispose()` directly.
|
|
26
|
+
*/
|
|
27
|
+
export interface PersistenceMount {
|
|
28
|
+
/** The ready-to-use persistence service. */
|
|
29
|
+
readonly service: IncrementalPersistenceService;
|
|
30
|
+
/**
|
|
31
|
+
* Tear down the session: flushes in-flight writes, stops observers,
|
|
32
|
+
* releases worker/file handles. After this resolves the mount is
|
|
33
|
+
* unusable.
|
|
34
|
+
*/
|
|
35
|
+
dispose(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Pluggable persistence back-end.
|
|
39
|
+
*
|
|
40
|
+
* Implementers fall into two patterns:
|
|
41
|
+
*
|
|
42
|
+
* **Pattern A — byte-range storage** (OPFS, `node:fs`, byte-range capable
|
|
43
|
+
* cloud): Implement `PersistenceBackend` + `RandomAccessFile` and build a
|
|
44
|
+
* provider that wraps them with `createInprocessTransport` +
|
|
45
|
+
* `createIncrementalPersistenceService`. Reuses the full journal/manifest
|
|
46
|
+
* machinery.
|
|
47
|
+
*
|
|
48
|
+
* **Pattern B — whole-file storage** (object-storage blobs, cloud APIs
|
|
49
|
+
* without byte-range support): Implement `PersistenceProvider` directly.
|
|
50
|
+
* Override `mount()` to observe `database.observe.transactions`, accumulate
|
|
51
|
+
* deltas, and push a complete blob on `flush`/`checkpoint`. The journal and
|
|
52
|
+
* manifest logic are entirely provider-owned.
|
|
53
|
+
*/
|
|
54
|
+
export interface PersistenceProvider {
|
|
55
|
+
/** Human-readable identifier used in diagnostics. */
|
|
56
|
+
readonly providerName: string;
|
|
57
|
+
/**
|
|
58
|
+
* Build a fully-wired persistence mount for `database`. The returned
|
|
59
|
+
* `PersistenceMount` owns the full lifecycle; call `mount.dispose()`
|
|
60
|
+
* when done.
|
|
61
|
+
*/
|
|
62
|
+
mount(database: Database<any, any, any, any, any, any, any, any>, options?: ProviderMountOptions): Promise<PersistenceMount>;
|
|
63
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence-provider.js","sourceRoot":"","sources":["../../src/provider/persistence-provider.ts"],"names":[],"mappings":"AAAA,uDAAuD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PersistenceProvider } from "./persistence-provider.js";
|
|
2
|
+
/**
|
|
3
|
+
* Run the full provider lifecycle contract against any provider.
|
|
4
|
+
* Call this from environment-specific test files to validate new providers.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: the provider must support creating a fresh, empty persistence root
|
|
7
|
+
* on each call to `mount` (or accept a factory so each test gets isolation).
|
|
8
|
+
*/
|
|
9
|
+
export declare const runProviderContractTests: (providerName: string, makeProvider: () => PersistenceProvider) => void;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
//
|
|
3
|
+
// Provider-contract conformance tests.
|
|
4
|
+
//
|
|
5
|
+
// The `runProviderContractTests` helper exercises the full
|
|
6
|
+
// mount → write → flush → checkpoint → dispose → reload lifecycle against
|
|
7
|
+
// any PersistenceProvider. This file drives it against the MemoryProvider
|
|
8
|
+
// (node-only, no I/O). The node-fs and OPFS providers are exercised by
|
|
9
|
+
// their own environment-specific test files.
|
|
10
|
+
import { Database } from "@adobe/data/ecs";
|
|
11
|
+
import { F32 } from "@adobe/data/math";
|
|
12
|
+
import { describe, expect, it } from "vitest";
|
|
13
|
+
import { mount } from "./mount.js";
|
|
14
|
+
import { createMemoryProvider } from "./create-memory-provider.js";
|
|
15
|
+
// ─── Shared schema ────────────────────────────────────────────────────────────
|
|
16
|
+
const entityPlugin = Database.Plugin.create({
|
|
17
|
+
components: {
|
|
18
|
+
x: F32.schema,
|
|
19
|
+
y: F32.schema,
|
|
20
|
+
label: { type: "string" },
|
|
21
|
+
},
|
|
22
|
+
archetypes: {
|
|
23
|
+
Point: ["x", "y", "label"],
|
|
24
|
+
},
|
|
25
|
+
transactions: {
|
|
26
|
+
createPoint(t, args) {
|
|
27
|
+
return t.archetypes.Point.insert(args);
|
|
28
|
+
},
|
|
29
|
+
movePoint(t, args) {
|
|
30
|
+
t.update(args.entity, { x: args.x, y: args.y });
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const noCheckpoint = { everyNTransactions: 0, idleMs: 0 };
|
|
35
|
+
// ─── Contract test suite (provider-agnostic) ──────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Run the full provider lifecycle contract against any provider.
|
|
38
|
+
* Call this from environment-specific test files to validate new providers.
|
|
39
|
+
*
|
|
40
|
+
* NOTE: the provider must support creating a fresh, empty persistence root
|
|
41
|
+
* on each call to `mount` (or accept a factory so each test gets isolation).
|
|
42
|
+
*/
|
|
43
|
+
export const runProviderContractTests = (providerName, makeProvider) => {
|
|
44
|
+
describe(`${providerName} — provider contract`, () => {
|
|
45
|
+
it("mount returns a service with the expected methods", async () => {
|
|
46
|
+
const provider = makeProvider();
|
|
47
|
+
const db = Database.create(entityPlugin);
|
|
48
|
+
const m = await mount(provider, db, { checkpoint: noCheckpoint });
|
|
49
|
+
expect(typeof m.service.save).toBe("function");
|
|
50
|
+
expect(typeof m.service.load).toBe("function");
|
|
51
|
+
expect(typeof m.service.flush).toBe("function");
|
|
52
|
+
expect(typeof m.service.checkpoint).toBe("function");
|
|
53
|
+
expect(typeof m.service.dispose).toBe("function");
|
|
54
|
+
expect(typeof m.dispose).toBe("function");
|
|
55
|
+
await m.dispose();
|
|
56
|
+
});
|
|
57
|
+
it("persists an entity across dispose → re-mount → load", async () => {
|
|
58
|
+
const provider = makeProvider();
|
|
59
|
+
const db1 = Database.create(entityPlugin);
|
|
60
|
+
const m1 = await mount(provider, db1, { checkpoint: noCheckpoint });
|
|
61
|
+
const entity = db1.transactions.createPoint({ x: 1, y: 2, label: "A" });
|
|
62
|
+
await m1.service.flush();
|
|
63
|
+
await m1.service.checkpoint();
|
|
64
|
+
await m1.dispose();
|
|
65
|
+
const db2 = Database.create(entityPlugin);
|
|
66
|
+
const m2 = await mount(provider, db2, { checkpoint: noCheckpoint });
|
|
67
|
+
await m2.service.load();
|
|
68
|
+
await m2.dispose();
|
|
69
|
+
const view = db2.read(entity);
|
|
70
|
+
expect(view).not.toBeNull();
|
|
71
|
+
expect(view.label).toBe("A");
|
|
72
|
+
expect(view.x).toBeCloseTo(1);
|
|
73
|
+
expect(view.y).toBeCloseTo(2);
|
|
74
|
+
});
|
|
75
|
+
it("persists multiple entities with correct values", async () => {
|
|
76
|
+
const provider = makeProvider();
|
|
77
|
+
const db1 = Database.create(entityPlugin);
|
|
78
|
+
const m1 = await mount(provider, db1, { checkpoint: noCheckpoint });
|
|
79
|
+
const e1 = db1.transactions.createPoint({ x: 10, y: 20, label: "P1" });
|
|
80
|
+
const e2 = db1.transactions.createPoint({ x: 30, y: 40, label: "P2" });
|
|
81
|
+
await m1.service.flush();
|
|
82
|
+
await m1.service.checkpoint();
|
|
83
|
+
await m1.dispose();
|
|
84
|
+
const db2 = Database.create(entityPlugin);
|
|
85
|
+
const m2 = await mount(provider, db2, { checkpoint: noCheckpoint });
|
|
86
|
+
await m2.service.load();
|
|
87
|
+
await m2.dispose();
|
|
88
|
+
expect(db2.read(e1)?.label).toBe("P1");
|
|
89
|
+
expect(db2.read(e2)?.label).toBe("P2");
|
|
90
|
+
expect(db2.read(e1)?.x).toBeCloseTo(10);
|
|
91
|
+
expect(db2.read(e2)?.y).toBeCloseTo(40);
|
|
92
|
+
});
|
|
93
|
+
it("reflects updates made after the initial checkpoint via journal replay", async () => {
|
|
94
|
+
const provider = makeProvider();
|
|
95
|
+
const db1 = Database.create(entityPlugin);
|
|
96
|
+
const m1 = await mount(provider, db1, { checkpoint: noCheckpoint });
|
|
97
|
+
const entity = db1.transactions.createPoint({ x: 0, y: 0, label: "Origin" });
|
|
98
|
+
await m1.service.flush();
|
|
99
|
+
await m1.service.checkpoint();
|
|
100
|
+
// Write after checkpoint — lives only in the journal.
|
|
101
|
+
db1.transactions.movePoint({ entity: entity, x: 99, y: 88 });
|
|
102
|
+
await m1.service.flush();
|
|
103
|
+
// Intentionally no second checkpoint.
|
|
104
|
+
await m1.dispose();
|
|
105
|
+
const db2 = Database.create(entityPlugin);
|
|
106
|
+
const m2 = await mount(provider, db2, { checkpoint: noCheckpoint });
|
|
107
|
+
await m2.service.load();
|
|
108
|
+
await m2.dispose();
|
|
109
|
+
const view = db2.read(entity);
|
|
110
|
+
expect(view).not.toBeNull();
|
|
111
|
+
expect(view.x).toBeCloseTo(99);
|
|
112
|
+
expect(view.y).toBeCloseTo(88);
|
|
113
|
+
});
|
|
114
|
+
it("dispose can be called multiple times without error", async () => {
|
|
115
|
+
const provider = makeProvider();
|
|
116
|
+
const db = Database.create(entityPlugin);
|
|
117
|
+
const m = await mount(provider, db, { checkpoint: noCheckpoint });
|
|
118
|
+
await m.dispose();
|
|
119
|
+
// Second dispose should be a safe no-op.
|
|
120
|
+
await m.dispose();
|
|
121
|
+
});
|
|
122
|
+
it("mount.service.serviceName is a non-empty string", async () => {
|
|
123
|
+
const provider = makeProvider();
|
|
124
|
+
const db = Database.create(entityPlugin);
|
|
125
|
+
const m = await mount(provider, db, { checkpoint: noCheckpoint });
|
|
126
|
+
expect(typeof m.service.serviceName).toBe("string");
|
|
127
|
+
expect(m.service.serviceName.length).toBeGreaterThan(0);
|
|
128
|
+
await m.dispose();
|
|
129
|
+
});
|
|
130
|
+
it("provider.providerName is a non-empty string", () => {
|
|
131
|
+
const provider = makeProvider();
|
|
132
|
+
expect(typeof provider.providerName).toBe("string");
|
|
133
|
+
expect(provider.providerName.length).toBeGreaterThan(0);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
// ─── Run against MemoryProvider ───────────────────────────────────────────────
|
|
138
|
+
runProviderContractTests("MemoryProvider", createMemoryProvider);
|
|
139
|
+
//# sourceMappingURL=persistence-provider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence-provider.test.js","sourceRoot":"","sources":["../../src/provider/persistence-provider.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
//
|
|
3
|
+
// A component whose schema is marked `nonPersistent: true` must not be saved.
|
|
4
|
+
// On load it is reconstructed via the hybrid rule: a defaulted one is reset to
|
|
5
|
+
// its default (present); a no-default one is stripped (the entity restores into
|
|
6
|
+
// the reduced archetype). This exercises the full worker/checkpoint/reload path.
|
|
7
|
+
import { Database } from "@adobe/data/ecs";
|
|
8
|
+
import { F32 } from "@adobe/data/math";
|
|
9
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
10
|
+
import { createMemoryBackend } from "../backend/memory-backend.js";
|
|
11
|
+
import { createWorkerPersistenceService } from "./create-worker-persistence-service.js";
|
|
12
|
+
const plugin = Database.Plugin.create({
|
|
13
|
+
components: {
|
|
14
|
+
value: F32.schema,
|
|
15
|
+
// Defaulted nonPersistent component → reset to default on load.
|
|
16
|
+
cache: { type: "number", default: 7, nonPersistent: true },
|
|
17
|
+
// No-default nonPersistent component → stripped on load.
|
|
18
|
+
derived: { type: "number", nonPersistent: true },
|
|
19
|
+
// undefined-default (type-only placeholder, e.g. a GPUBuffer handle) →
|
|
20
|
+
// treated as no default → stripped on load.
|
|
21
|
+
gpuRef: { default: undefined, nonPersistent: true },
|
|
22
|
+
},
|
|
23
|
+
archetypes: {
|
|
24
|
+
Item: ["value", "cache", "derived", "gpuRef"],
|
|
25
|
+
},
|
|
26
|
+
transactions: {
|
|
27
|
+
spawn(t, args) {
|
|
28
|
+
return t.archetypes.Item.insert(args);
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
const noCheckpoint = { everyNTransactions: 0, idleMs: 0 };
|
|
33
|
+
describe("component-level nonPersistent durability", () => {
|
|
34
|
+
let backend;
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
backend = createMemoryBackend();
|
|
37
|
+
});
|
|
38
|
+
it("does not persist nonPersistent columns: defaulted resets, no-default strips", async () => {
|
|
39
|
+
const db1 = Database.create(plugin);
|
|
40
|
+
const svc1 = await createWorkerPersistenceService({ database: db1, backend, checkpoint: noCheckpoint });
|
|
41
|
+
const e = db1.transactions.spawn({ value: 5, cache: 99, derived: 42, gpuRef: 12345 });
|
|
42
|
+
await svc1.flush();
|
|
43
|
+
await svc1.checkpoint();
|
|
44
|
+
await svc1.dispose();
|
|
45
|
+
const db2 = Database.create(plugin);
|
|
46
|
+
const svc2 = await createWorkerPersistenceService({ database: db2, backend, checkpoint: noCheckpoint });
|
|
47
|
+
await svc2.load();
|
|
48
|
+
await svc2.dispose();
|
|
49
|
+
const view = db2.read(e);
|
|
50
|
+
expect(view).not.toBeNull();
|
|
51
|
+
expect(view.value).toBe(5); // persistent component preserved
|
|
52
|
+
expect(view.cache).toBe(7); // defaulted nonPersistent → reset to default
|
|
53
|
+
expect("derived" in view).toBe(false); // no-default nonPersistent → stripped
|
|
54
|
+
expect("gpuRef" in view).toBe(false); // null-default nonPersistent → stripped
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=component-nonpersistent-durability.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-nonpersistent-durability.test.js","sourceRoot":"","sources":["../../src/service/component-nonpersistent-durability.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IncrementalPersistenceService, IncrementalPersistenceServiceOptions } from "./incremental-persistence-service.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create an {@link IncrementalPersistenceService}. The service subscribes
|
|
4
|
+
* to the database's transaction observer and writes changes incrementally
|
|
5
|
+
* via the configured backend / transport.
|
|
6
|
+
*/
|
|
7
|
+
export declare const createIncrementalPersistenceService: (options: IncrementalPersistenceServiceOptions) => Promise<IncrementalPersistenceService>;
|