@adobe/data 0.9.69 → 0.9.70
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/dist/cache/functions/hashing/blob-to-hash.js +59 -11
- package/dist/cache/functions/hashing/blob-to-hash.js.map +1 -1
- package/dist/cache/functions/hashing/hashing.test.js +59 -0
- package/dist/cache/functions/hashing/hashing.test.js.map +1 -1
- package/dist/ecs/database/concurrency/concurrency-strategy.d.ts +10 -10
- package/dist/ecs/database/concurrency/immediate-concurrency.d.ts +3 -3
- package/dist/ecs/database/concurrency/immediate-concurrency.js +9 -9
- package/dist/ecs/database/concurrency/immediate-concurrency.js.map +1 -1
- package/dist/ecs/database/concurrency/roll-forward-concurrency.js +4 -4
- package/dist/ecs/database/concurrency/roll-forward-concurrency.js.map +1 -1
- package/dist/ecs/database/database.d.ts +5 -5
- package/dist/ecs/database/observed/create-observed-database.js +5 -5
- package/dist/ecs/database/observed/create-observed-database.js.map +1 -1
- package/dist/ecs/database/public/create-transaction-dispatcher.d.ts +4 -4
- package/dist/ecs/database/public/create-transaction-dispatcher.js +15 -15
- package/dist/ecs/database/public/create-transaction-dispatcher.js.map +1 -1
- package/dist/ecs/database/reconciling/create-rebase-replay-applier.js +3 -3
- package/dist/ecs/database/reconciling/create-rebase-replay-applier.js.map +1 -1
- package/dist/ecs/database/transactional-store/coalesce-actions.js +2 -2
- package/dist/ecs/database/transactional-store/coalesce-actions.js.map +1 -1
- package/dist/ecs/database/transactional-store/coalesce-actions.test.js +57 -57
- package/dist/ecs/database/transactional-store/coalesce-actions.test.js.map +1 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.js +13 -13
- package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js +51 -51
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js.map +1 -1
- package/dist/ecs/database/transactional-store/transaction-options.d.ts +3 -3
- package/dist/ecs/database/transactional-store/transactional-store.d.ts +4 -4
- package/dist/ecs/entity/is-ephemeral.d.ts +3 -0
- package/dist/ecs/entity/is-ephemeral.js +4 -1
- package/dist/ecs/entity/is-ephemeral.js.map +1 -1
- package/dist/ecs/entity/is-ephemeral.test.js +22 -5
- package/dist/ecs/entity/is-ephemeral.test.js.map +1 -1
- package/dist/ecs/entity/public.d.ts +1 -1
- package/dist/ecs/entity/public.js +1 -1
- package/dist/ecs/entity/public.js.map +1 -1
- package/dist/ecs/optional-components.d.ts +3 -1
- package/dist/ecs/persistence-service/create-storage-persistence-service.js +1 -1
- package/dist/ecs/persistence-service/create-storage-persistence-service.js.map +1 -1
- package/dist/ecs/store/archetype-row.d.ts +16 -0
- package/dist/ecs/store/archetype-row.js +2 -0
- package/dist/ecs/store/archetype-row.js.map +1 -0
- package/dist/ecs/store/core/create-core.js +15 -10
- package/dist/ecs/store/core/create-core.js.map +1 -1
- package/dist/ecs/store/index.d.ts +1 -0
- package/dist/ecs/store/index.js.map +1 -1
- package/dist/ecs/store/public/create-store.js +5 -5
- package/dist/ecs/store/public/create-store.js.map +1 -1
- package/dist/ecs/store/store.js +6 -0
- package/dist/ecs/store/store.js.map +1 -1
- package/dist/ecs/undo-redo-service/create-undo-redo-service.js +1 -1
- package/dist/ecs/undo-redo-service/create-undo-redo-service.js.map +1 -1
- package/dist/observe/with-batch.js +7 -6
- package/dist/observe/with-batch.js.map +1 -1
- package/dist/observe/with-batch.test.js +11 -0
- package/dist/observe/with-batch.test.js.map +1 -1
- package/dist/observe/with-deduplicate-data.js +4 -2
- package/dist/observe/with-deduplicate-data.js.map +1 -1
- package/dist/observe/with-deduplicate-data.test.d.ts +1 -0
- package/dist/observe/with-deduplicate-data.test.js +39 -0
- package/dist/observe/with-deduplicate-data.test.js.map +1 -0
- package/dist/observe/with-filter.d.ts +4 -3
- package/dist/observe/with-filter.js +3 -2
- package/dist/observe/with-filter.js.map +1 -1
- package/dist/observe/with-filter.type-test.d.ts +1 -0
- package/dist/observe/with-filter.type-test.js +14 -0
- package/dist/observe/with-filter.type-test.js.map +1 -0
- package/dist/schema/schema.d.ts +2 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/typed-buffer/register-typed-buffer-codecs.js +4 -4
- package/dist/typed-buffer/register-typed-buffer-codecs.js.map +1 -1
- package/dist/typed-buffer/structs/index.d.ts +1 -0
- package/dist/typed-buffer/structs/index.js +1 -0
- package/dist/typed-buffer/structs/index.js.map +1 -1
- package/package.json +2 -1
- package/references/data-lit/package.json +1 -1
- package/references/data-lit/src/hooks/use-drag-transaction.ts +2 -2
- package/references/data-lit/src/hooks/use-pointer-observe.ts +2 -2
- package/references/data-lit-tictactoe/package.json +1 -1
- package/references/data-react/package.json +1 -1
- package/references/data-react-hello/package.json +1 -1
- package/references/data-react-pixie/package.json +1 -1
|
@@ -1,23 +1,71 @@
|
|
|
1
1
|
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
// Performance assumptions
|
|
3
|
+
// -----------------------
|
|
4
|
+
// Blobs hashed here are frequently NOT fully in memory (disk- or
|
|
5
|
+
// stream-backed), so each `reader.read()` is genuine I/O latency, not a
|
|
6
|
+
// microtask hop over resident bytes. This makes the path I/O-bound, and the
|
|
7
|
+
// design optimizes for overlapping those waits across concurrent calls:
|
|
8
|
+
//
|
|
9
|
+
// - A single WASM hasher instance is reused for every call (instantiation
|
|
10
|
+
// is not free, and we don't want one per call).
|
|
11
|
+
// - Concurrency is achieved via hash-wasm's resumable save()/load() rather
|
|
12
|
+
// than a pool of instances: each call keeps its own `state` and only
|
|
13
|
+
// touches the shared instance in synchronous critical sections, so calls
|
|
14
|
+
// interleave at `read()` without serializing or corrupting each other.
|
|
15
|
+
//
|
|
16
|
+
// The trade-off is a save()/load() pair per chunk (cheap for SHA-256). If
|
|
17
|
+
// blobs were instead known to be fully in memory, this would be compute-bound,
|
|
18
|
+
// the I/O overlap would buy nothing, and buffering then hashing synchronously
|
|
19
|
+
// (one init→update→digest block, no await) would suffice.
|
|
20
|
+
//
|
|
21
|
+
// Note on the "single global hasher" decision: even compute-bound, extra
|
|
22
|
+
// instances would NOT help on this thread. WASM has no threads of its own and
|
|
23
|
+
// hasher.update() is synchronous, so on one JS thread only one hash advances
|
|
24
|
+
// at a time regardless of how many instances exist — a pool buys nothing here.
|
|
25
|
+
// Servicing multiple CPU-bound hashes truly in parallel requires Web Workers,
|
|
26
|
+
// each with its OWN instance on its OWN thread. That is the only thing a second
|
|
27
|
+
// instance is ever good for, and it lives at the worker boundary, not here. So
|
|
28
|
+
// within this thread, one global hasher is strictly correct and loses nothing.
|
|
2
29
|
import { createSHA256 } from "hash-wasm";
|
|
30
|
+
let hasherPromise;
|
|
3
31
|
export async function blobToHash(blob) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
32
|
+
if (hasherPromise === undefined) {
|
|
33
|
+
hasherPromise = createSHA256();
|
|
34
|
+
// Allow a later call to retry if instantiation failed, rather than
|
|
35
|
+
// poisoning the module with a permanently-rejected promise.
|
|
36
|
+
hasherPromise.catch(() => {
|
|
37
|
+
hasherPromise = undefined;
|
|
38
|
+
});
|
|
10
39
|
}
|
|
11
|
-
hasher
|
|
40
|
+
const hasher = await hasherPromise;
|
|
41
|
+
// One shared WASM instance serves all concurrent calls. The instance is
|
|
42
|
+
// touched only in synchronous init→…→save / load→update→save sequences,
|
|
43
|
+
// never held across an `await`, so each call carries its own `state` and
|
|
44
|
+
// their `reader.read()` I/O waits overlap freely without corrupting one
|
|
45
|
+
// another. See hash-wasm save()/load() resumable hashing.
|
|
46
|
+
hasher.init();
|
|
47
|
+
hasher.update(mimeTypeBytes(blob.type));
|
|
48
|
+
let state = hasher.save();
|
|
12
49
|
const reader = blob.stream().getReader();
|
|
13
50
|
let done = false;
|
|
14
51
|
while (!done) {
|
|
15
|
-
const
|
|
16
|
-
done =
|
|
17
|
-
if (!done &&
|
|
18
|
-
hasher.
|
|
52
|
+
const chunk = await reader.read();
|
|
53
|
+
done = chunk.done === true;
|
|
54
|
+
if (!done && chunk.value != null) {
|
|
55
|
+
hasher.load(state);
|
|
56
|
+
hasher.update(chunk.value);
|
|
57
|
+
state = hasher.save();
|
|
19
58
|
}
|
|
20
59
|
}
|
|
60
|
+
hasher.load(state);
|
|
21
61
|
return hasher.digest("hex");
|
|
22
62
|
}
|
|
63
|
+
function mimeTypeBytes(type) {
|
|
64
|
+
// Encode MIME type as UTF-16LE
|
|
65
|
+
const codes = new Uint16Array(type.length);
|
|
66
|
+
for (let i = 0; i < type.length; i++) {
|
|
67
|
+
codes[i] = type.charCodeAt(i);
|
|
68
|
+
}
|
|
69
|
+
return new Uint8Array(codes.buffer);
|
|
70
|
+
}
|
|
23
71
|
//# sourceMappingURL=blob-to-hash.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob-to-hash.js","sourceRoot":"","sources":["../../../../src/cache/functions/hashing/blob-to-hash.ts"],"names":[],"mappings":"AAAA,uDAAuD;
|
|
1
|
+
{"version":3,"file":"blob-to-hash.js","sourceRoot":"","sources":["../../../../src/cache/functions/hashing/blob-to-hash.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,0BAA0B;AAC1B,0BAA0B;AAC1B,iEAAiE;AACjE,wEAAwE;AACxE,4EAA4E;AAC5E,wEAAwE;AACxE,EAAE;AACF,4EAA4E;AAC5E,oDAAoD;AACpD,6EAA6E;AAC7E,yEAAyE;AACzE,6EAA6E;AAC7E,2EAA2E;AAC3E,EAAE;AACF,0EAA0E;AAC1E,+EAA+E;AAC/E,8EAA8E;AAC9E,0DAA0D;AAC1D,EAAE;AACF,yEAAyE;AACzE,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,OAAO,EAAgB,YAAY,EAAE,MAAM,WAAW,CAAC;AAEvD,IAAI,aAA2C,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAU;IACzC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,aAAa,GAAG,YAAY,EAAE,CAAC;QAC/B,mEAAmE;QACnE,4DAA4D;QAC5D,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE;YACvB,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;IAEnC,wEAAwE;IACxE,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IACxE,0DAA0D;IAC1D,MAAM,CAAC,IAAI,EAAE,CAAC;IACd,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;IACzC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,OAAO,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAC3B,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,+BAA+B;IAC/B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -2,6 +2,35 @@
|
|
|
2
2
|
import { blobToHash } from "./blob-to-hash.js";
|
|
3
3
|
import { jsonToHash } from "./json-to-hash.js";
|
|
4
4
|
import { describe, expect, it } from "vitest";
|
|
5
|
+
const bytes = (s) => new TextEncoder().encode(s);
|
|
6
|
+
// Lets all pending microtasks (and the WASM-instantiation promise) settle, so
|
|
7
|
+
// each in-flight blobToHash call advances to its next `await reader.read()`.
|
|
8
|
+
const flush = () => new Promise((resolve) => setTimeout(resolve, 0));
|
|
9
|
+
// A stand-in Blob whose stream yields `chunks` one `read()` at a time, but only
|
|
10
|
+
// when the test releases each gate. This hands the test control of the exact
|
|
11
|
+
// interleaving across concurrent calls — impossible with a real in-memory Blob,
|
|
12
|
+
// whose reads resolve on their own schedule.
|
|
13
|
+
function gatedBlob(type, chunks) {
|
|
14
|
+
const gates = [];
|
|
15
|
+
let i = 0;
|
|
16
|
+
const reader = {
|
|
17
|
+
read: () => new Promise((resolve) => {
|
|
18
|
+
gates.push(() => resolve(i < chunks.length
|
|
19
|
+
? { done: false, value: chunks[i++] }
|
|
20
|
+
: { done: true, value: undefined }));
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
// Case 1 cast: this implements the only members blobToHash reads off a
|
|
25
|
+
// Blob — `type` and `stream().getReader().read()`.
|
|
26
|
+
blob: { type, stream: () => ({ getReader: () => reader }) },
|
|
27
|
+
releaseNext: () => {
|
|
28
|
+
const gate = gates.shift();
|
|
29
|
+
gate?.();
|
|
30
|
+
return gate !== undefined;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
5
34
|
describe("test hashing", () => {
|
|
6
35
|
describe("blobToHash", () => {
|
|
7
36
|
it("should avoid collisions based on content and type", async () => {
|
|
@@ -100,6 +129,36 @@ describe("test hashing", () => {
|
|
|
100
129
|
expect(hash).toMatch(/^[a-f0-9]{64}$/);
|
|
101
130
|
}
|
|
102
131
|
});
|
|
132
|
+
it("interleaved concurrent reads match serial hashes", async () => {
|
|
133
|
+
const inputs = [
|
|
134
|
+
{ type: "text/plain", chunks: ["alpha-", "one-", "end"] },
|
|
135
|
+
{ type: "application/octet-stream", chunks: ["BETA-", "two-", "END"] },
|
|
136
|
+
{ type: "", chunks: ["g", "amma", "!!!"] },
|
|
137
|
+
];
|
|
138
|
+
// Oracle: hash each input serially. SHA-256 is over the byte stream, so a
|
|
139
|
+
// real Blob of the concatenated chunks yields the same digest the gated
|
|
140
|
+
// blob must produce regardless of chunk boundaries.
|
|
141
|
+
const oracle = [];
|
|
142
|
+
for (const { type, chunks } of inputs) {
|
|
143
|
+
oracle.push(await blobToHash(new Blob(chunks, { type })));
|
|
144
|
+
}
|
|
145
|
+
// Concurrent: start every call, then drive the gates round-robin so the
|
|
146
|
+
// calls interleave between chunks — the exact pattern that corrupts a
|
|
147
|
+
// naively shared hasher.
|
|
148
|
+
const gated = inputs.map(({ type, chunks }) => gatedBlob(type, chunks.map(bytes)));
|
|
149
|
+
const results = gated.map((g) => blobToHash(g.blob));
|
|
150
|
+
let progressed = true;
|
|
151
|
+
while (progressed) {
|
|
152
|
+
await flush();
|
|
153
|
+
progressed = false;
|
|
154
|
+
for (const g of gated) {
|
|
155
|
+
if (g.releaseNext())
|
|
156
|
+
progressed = true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
await flush();
|
|
160
|
+
expect(await Promise.all(results)).toEqual(oracle);
|
|
161
|
+
});
|
|
103
162
|
});
|
|
104
163
|
describe("jsonToHash", () => {
|
|
105
164
|
it("should avoid collisions", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashing.test.js","sourceRoot":"","sources":["../../../../src/cache/functions/hashing/hashing.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hashing.test.js","sourceRoot":"","sources":["../../../../src/cache/functions/hashing/hashing.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,12 +15,12 @@ import type { TransactionEnvelope } from "../reconciling/reconciling-database.js
|
|
|
15
15
|
* (e.g. a collaborative-editing layer that manages its own replay buffer).
|
|
16
16
|
*
|
|
17
17
|
* - `createRebaseReplayConcurrency(userId)` — commits apply locally as
|
|
18
|
-
*
|
|
18
|
+
* intermediate steps and wait for the sync server's echoed committed envelope to
|
|
19
19
|
* promote them. Full rollback-and-replay queue, cross-peer id-determinism.
|
|
20
20
|
*/
|
|
21
21
|
export interface ConcurrencyStrategy {
|
|
22
22
|
/**
|
|
23
|
-
* When true, the dispatcher applies "commit" intents as
|
|
23
|
+
* When true, the dispatcher applies "commit" intents as intermediate steps
|
|
24
24
|
* (negative time) and waits for a server echo to promote them.
|
|
25
25
|
* When false, commits apply immediately with positive time.
|
|
26
26
|
*/
|
|
@@ -37,18 +37,18 @@ export interface ConcurrencyStrategy {
|
|
|
37
37
|
*/
|
|
38
38
|
readonly apply: (envelope: TransactionEnvelope) => TransactionResult<unknown> | undefined;
|
|
39
39
|
/**
|
|
40
|
-
* Cancel a pending
|
|
41
|
-
* No-op for strategies that have no
|
|
40
|
+
* Cancel a pending intermediate step by compound (userId, id) key.
|
|
41
|
+
* No-op for strategies that have no intermediate queue.
|
|
42
42
|
*/
|
|
43
43
|
readonly cancel: (id: number, userId?: number | string) => void;
|
|
44
44
|
/**
|
|
45
45
|
* Called by `db.reset()` before the store is cleared.
|
|
46
|
-
* Strategies with
|
|
46
|
+
* Strategies with an intermediate queue should clear it here.
|
|
47
47
|
*/
|
|
48
48
|
readonly onReset: () => void;
|
|
49
49
|
/**
|
|
50
50
|
* Called immediately before `db.toData()` serializes the store.
|
|
51
|
-
* Strategies with
|
|
51
|
+
* Strategies with an intermediate queue should roll back intermediate steps here so
|
|
52
52
|
* the snapshot contains only committed state.
|
|
53
53
|
*
|
|
54
54
|
* When this hook (together with `onAfterToData`) is present, `db.toData()`
|
|
@@ -60,13 +60,13 @@ export interface ConcurrencyStrategy {
|
|
|
60
60
|
/**
|
|
61
61
|
* Called immediately after `db.toData()` serializes the store.
|
|
62
62
|
* Strategies that roll back in `onBeforeToData` should replay here to
|
|
63
|
-
* restore the in-progress
|
|
63
|
+
* restore the in-progress intermediate state.
|
|
64
64
|
*/
|
|
65
65
|
readonly onAfterToData?: () => void;
|
|
66
66
|
/**
|
|
67
67
|
* Called immediately after `db.fromData()` loads a snapshot into the
|
|
68
|
-
* store. Strategies with
|
|
69
|
-
*
|
|
68
|
+
* store. Strategies with an intermediate queue should replay pending
|
|
69
|
+
* intermediate steps here so in-progress work is visible after a data load.
|
|
70
70
|
*/
|
|
71
71
|
readonly onAfterFromData?: () => void;
|
|
72
72
|
}
|
|
@@ -81,6 +81,6 @@ export interface ConcurrencyStrategy {
|
|
|
81
81
|
* returning undefined when the name has not yet been registered via extend.
|
|
82
82
|
*/
|
|
83
83
|
export type ConcurrencyStrategyFactory = (execute: (fn: (ctx: TransactionContext<any, any, any>) => void | Entity, options?: {
|
|
84
|
-
|
|
84
|
+
intermediate?: boolean;
|
|
85
85
|
userId?: number | string;
|
|
86
86
|
}) => TransactionResult<unknown>, getTransaction: (name: string) => ((ctx: TransactionContext<any, any, any>, args: unknown) => void | Entity) | undefined) => ConcurrencyStrategy;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ConcurrencyStrategyFactory } from "./concurrency-strategy.js";
|
|
2
2
|
/**
|
|
3
|
-
* Lighter-weight concurrency strategy that applies commits and
|
|
3
|
+
* Lighter-weight concurrency strategy that applies commits and intermediate steps
|
|
4
4
|
* immediately with no global rollback-and-replay cycle.
|
|
5
5
|
*
|
|
6
6
|
* Key differences from {@link createRebaseReplayConcurrency}:
|
|
@@ -13,10 +13,10 @@ import type { ConcurrencyStrategyFactory } from "./concurrency-strategy.js";
|
|
|
13
13
|
* concurrent edits — use this only when there is a single writer or
|
|
14
14
|
* when an external layer manages replay (e.g. a collaborative-editing
|
|
15
15
|
* wrapper).
|
|
16
|
-
* - Async generator
|
|
16
|
+
* - Async generator intermediate steps are still supported: each yield applies
|
|
17
17
|
* the intermediate state immediately and rolls it back when the next
|
|
18
18
|
* yield or the final commit arrives. Cancel rolls back the last
|
|
19
|
-
* applied
|
|
19
|
+
* applied intermediate step for that transaction. Intermediate steps from different
|
|
20
20
|
* concurrent transactions do NOT interact (no cross-transaction rebase).
|
|
21
21
|
*/
|
|
22
22
|
export declare const createImmediateConcurrency: () => ConcurrencyStrategyFactory;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
2
|
import { applyOperations } from "../transactional-store/apply-operations.js";
|
|
3
3
|
/**
|
|
4
|
-
* Lighter-weight concurrency strategy that applies commits and
|
|
4
|
+
* Lighter-weight concurrency strategy that applies commits and intermediate steps
|
|
5
5
|
* immediately with no global rollback-and-replay cycle.
|
|
6
6
|
*
|
|
7
7
|
* Key differences from {@link createRebaseReplayConcurrency}:
|
|
@@ -14,23 +14,23 @@ import { applyOperations } from "../transactional-store/apply-operations.js";
|
|
|
14
14
|
* concurrent edits — use this only when there is a single writer or
|
|
15
15
|
* when an external layer manages replay (e.g. a collaborative-editing
|
|
16
16
|
* wrapper).
|
|
17
|
-
* - Async generator
|
|
17
|
+
* - Async generator intermediate steps are still supported: each yield applies
|
|
18
18
|
* the intermediate state immediately and rolls it back when the next
|
|
19
19
|
* yield or the final commit arrives. Cancel rolls back the last
|
|
20
|
-
* applied
|
|
20
|
+
* applied intermediate step for that transaction. Intermediate steps from different
|
|
21
21
|
* concurrent transactions do NOT interact (no cross-transaction rebase).
|
|
22
22
|
*/
|
|
23
23
|
export const createImmediateConcurrency = () => (execute, getTransaction) => {
|
|
24
|
-
// Per-transaction store of the last-applied
|
|
25
|
-
// by compound `"userId:id"`. Used to roll back
|
|
26
|
-
// newer
|
|
24
|
+
// Per-transaction store of the last-applied intermediate result, keyed
|
|
25
|
+
// by compound `"userId:id"`. Used to roll back an intermediate step when a
|
|
26
|
+
// newer intermediate step, commit, or cancel arrives for the same transaction.
|
|
27
27
|
const pending = new Map();
|
|
28
28
|
const key = (id, userId) => `${userId}:${id}`;
|
|
29
29
|
const rollbackPending = (id, userId) => {
|
|
30
30
|
const k = key(id, userId);
|
|
31
31
|
const prior = pending.get(k);
|
|
32
32
|
if (prior) {
|
|
33
|
-
execute(t => applyOperations(t, prior.undo), {
|
|
33
|
+
execute(t => applyOperations(t, prior.undo), { intermediate: true, userId: undefined });
|
|
34
34
|
pending.delete(k);
|
|
35
35
|
}
|
|
36
36
|
};
|
|
@@ -49,7 +49,7 @@ export const createImmediateConcurrency = () => (execute, getTransaction) => {
|
|
|
49
49
|
const fn = getTransaction(envelope.name);
|
|
50
50
|
if (!fn)
|
|
51
51
|
throw new Error(`Unknown transaction: ${envelope.name}`);
|
|
52
|
-
const result = execute(t => fn(t, args), {
|
|
52
|
+
const result = execute(t => fn(t, args), { intermediate: true, userId });
|
|
53
53
|
const isNoOp = result.redo.length === 0 && result.undo.length === 0;
|
|
54
54
|
if (!isNoOp)
|
|
55
55
|
pending.set(key(id, userId), result);
|
|
@@ -61,7 +61,7 @@ export const createImmediateConcurrency = () => (execute, getTransaction) => {
|
|
|
61
61
|
const fn = getTransaction(envelope.name);
|
|
62
62
|
if (!fn)
|
|
63
63
|
throw new Error(`Unknown transaction: ${envelope.name}`);
|
|
64
|
-
return execute(t => fn(t, args), {
|
|
64
|
+
return execute(t => fn(t, args), { intermediate: false, userId });
|
|
65
65
|
},
|
|
66
66
|
cancel(id, userId) {
|
|
67
67
|
rollbackPending(id, userId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"immediate-concurrency.js","sourceRoot":"","sources":["../../../../src/ecs/database/concurrency/immediate-concurrency.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAI7E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAA+B,EAAE,CACvE,CAAC,OAAO,EAAE,cAAc,EAAuB,EAAE;IAC7C,
|
|
1
|
+
{"version":3,"file":"immediate-concurrency.js","sourceRoot":"","sources":["../../../../src/ecs/database/concurrency/immediate-concurrency.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,14 +36,14 @@ export const createRollForwardConcurrency = (userId) => (execute, getTransaction
|
|
|
36
36
|
const indexOfEntry = (id, entryUserId) => pending.findIndex(e => e.id === id && e.userId === entryUserId);
|
|
37
37
|
const rollbackAll = () => {
|
|
38
38
|
for (let i = pending.length - 1; i >= 0; i--) {
|
|
39
|
-
execute(t => applyOperations(t, pending[i].undo), {
|
|
39
|
+
execute(t => applyOperations(t, pending[i].undo), { intermediate: true, userId: undefined });
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
42
|
// Roll-forward: re-apply each pending entry's captured post-image
|
|
43
43
|
// tuples and recapture fresh undo against the (possibly changed) base.
|
|
44
44
|
const replayAll = () => {
|
|
45
45
|
for (const entry of pending) {
|
|
46
|
-
const result = execute(t => applyOperations(t, entry.redo), {
|
|
46
|
+
const result = execute(t => applyOperations(t, entry.redo), { intermediate: true, userId: entry.userId });
|
|
47
47
|
entry.undo = result.undo;
|
|
48
48
|
}
|
|
49
49
|
};
|
|
@@ -54,7 +54,7 @@ export const createRollForwardConcurrency = (userId) => (execute, getTransaction
|
|
|
54
54
|
const fn = getTransaction(envelope.name);
|
|
55
55
|
if (!fn)
|
|
56
56
|
throw new Error(`Unknown transaction: ${envelope.name}`);
|
|
57
|
-
return execute(t => fn(t, envelope.args), {
|
|
57
|
+
return execute(t => fn(t, envelope.args), { intermediate: envelope.time < 0, userId: envelope.userId });
|
|
58
58
|
};
|
|
59
59
|
const removeAndRebuild = (id, entryUserId) => {
|
|
60
60
|
const idx = indexOfEntry(id, entryUserId);
|
|
@@ -74,7 +74,7 @@ export const createRollForwardConcurrency = (userId) => (execute, getTransaction
|
|
|
74
74
|
removeAndRebuild(id, envelopeUserId);
|
|
75
75
|
return undefined;
|
|
76
76
|
}
|
|
77
|
-
// Optimistic local
|
|
77
|
+
// Optimistic local intermediate: roll back, drop any prior version
|
|
78
78
|
// of this transaction, replay the survivors, then run the fn on
|
|
79
79
|
// top and capture its post-image tuples.
|
|
80
80
|
if (time < 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roll-forward-concurrency.js","sourceRoot":"","sources":["../../../../src/ecs/database/concurrency/roll-forward-concurrency.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AA4B7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,MAAuB,EAA8B,EAAE,CAChG,CAAC,OAAO,EAAE,cAAc,EAAuB,EAAE;IAC7C,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,WAAwC,EAAE,EAAE,CAC1E,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,GAAG,EAAE;QACrB,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"roll-forward-concurrency.js","sourceRoot":"","sources":["../../../../src/ecs/database/concurrency/roll-forward-concurrency.ts"],"names":[],"mappings":"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"}
|
|
@@ -120,18 +120,18 @@ export interface Database<C extends Components = {}, R extends ResourceComponent
|
|
|
120
120
|
* transaction wrappers (`db.transactions.X(args)`). Replays inside the
|
|
121
121
|
* reconciler and inbound `db.apply()` calls do NOT fire it. The
|
|
122
122
|
* `intent` reflects the wrapper's decision regardless of whether the
|
|
123
|
-
* envelope was applied locally as
|
|
123
|
+
* envelope was applied locally as an intermediate step (deferred-commit / sync
|
|
124
124
|
* mode) or as a commit (local-only mode).
|
|
125
125
|
*
|
|
126
126
|
* Sync services route forwarding by `intent`:
|
|
127
|
-
* - `"commit"`
|
|
128
|
-
* - `"
|
|
129
|
-
* - `"cancel"`
|
|
127
|
+
* - `"commit"` → propose to the server (reliable)
|
|
128
|
+
* - `"intermediate"` → relay to peers (lossy)
|
|
129
|
+
* - `"cancel"` → cancel a pending intermediate step (reliable)
|
|
130
130
|
*/
|
|
131
131
|
readonly envelopes: Observe<{
|
|
132
132
|
envelope: TransactionEnvelope;
|
|
133
133
|
result: TransactionResult<C> | undefined;
|
|
134
|
-
intent: "commit" | "
|
|
134
|
+
intent: "commit" | "intermediate" | "cancel";
|
|
135
135
|
}>;
|
|
136
136
|
entity<T extends RequiredComponents>(id: Entity, minArchetype?: ReadonlyArchetype<T> | Archetype<T>): Observe<Readonly<T> & EntityReadValues<C> | null>;
|
|
137
137
|
entity(id: Entity): Observe<EntityReadValues<C> | null>;
|
|
@@ -88,9 +88,9 @@ export function createObservedDatabase(store) {
|
|
|
88
88
|
const observeArchetype = (archetype) => addToMapSet(archetype, archetypeObservers);
|
|
89
89
|
const observeComponent = mapEntries(store.componentSchemas, ([component]) => addToMapSet(component, componentObservers));
|
|
90
90
|
const resourceArchetypeComponents = (resource) => {
|
|
91
|
-
const
|
|
92
|
-
return
|
|
93
|
-
? ["id", resource, "
|
|
91
|
+
const isNonPersistent = store.componentSchemas[resource]?.nonPersistent ?? store.componentSchemas[resource]?.ephemeral;
|
|
92
|
+
return isNonPersistent
|
|
93
|
+
? ["id", resource, "nonPersistent"]
|
|
94
94
|
: ["id", resource];
|
|
95
95
|
};
|
|
96
96
|
const observeResource = Object.fromEntries(Object.entries(store.resources).map(([resource]) => {
|
|
@@ -128,8 +128,8 @@ export function createObservedDatabase(store) {
|
|
|
128
128
|
updateValues
|
|
129
129
|
];
|
|
130
130
|
})),
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
intermediate: false,
|
|
132
|
+
persistent: true,
|
|
133
133
|
value: undefined,
|
|
134
134
|
undo: [],
|
|
135
135
|
redo: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-observed-database.js","sourceRoot":"","sources":["../../../../src/ecs/database/observed/create-observed-database.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"create-observed-database.js","sourceRoot":"","sources":["../../../../src/ecs/database/observed/create-observed-database.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAQpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAC;AAMhG,MAAM,WAAW,GAAG,CAAO,GAAM,EAAE,GAAmB,EAAE,EAAE,CAAC,CAAC,KAAQ,EAAE,EAAE;IACpE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,IAAI,GAAG,EAAE,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACJ,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,EAAE;QACR,GAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAKlC,KAAqB;IAErB,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,kBAAkB,CAAC;IAEjF,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAmC,CAAC;IACtE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAgC,CAAC;IACnE,MAAM,eAAe,GAAG,IAAI,GAAG,EAA6D,CAAC;IAC7F,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAA+C,CAAC;IAEpF,MAAM,eAAe,GAAG,CAAC,MAA4B,EAAE,EAAE;QACrD,0DAA0D;QAC1D,qEAAqE;QACrE,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC;YAC9C,MAAM,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC;YACjC,MAAM,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC;QAEtC,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO;QACX,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,oBAAoB,EAAE,CAAC;YAC1C,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QACD,KAAK,MAAM,gBAAgB,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACtD,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,gBAAkC,CAAC,CAAC;YAC7E,IAAI,SAAS,EAAE,CAAC;gBACZ,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBAC/B,QAAQ,EAAE,CAAC;gBACf,CAAC;YACL,CAAC;QACL,CAAC;QACD,KAAK,MAAM,gBAAgB,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACtD,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC3D,IAAI,SAAS,EAAE,CAAC;gBACZ,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBAC/B,QAAQ,EAAE,CAAC;gBACf,CAAC;YACL,CAAC;QACL,CAAC;QACD,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;YACxD,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,SAAS,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBAC/B,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,OAAO,GAAyC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QACvE,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAA+B,MAAc,EAAE,YAAkD,EAAE,EAAE,CAAC,CAAC,QAAsD,EAAE,EAAE;QACnL,IAAI,YAAY,EAAE,CAAC;YACf,MAAM,gBAAgB,GAAG,QAAQ,CAAC;YAClC,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE;gBAClB,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACtC,IAAI,QAAQ,EAAE,CAAC;wBACX,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;wBAC/B,IAAI,SAAS,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;4BAClG,MAAM,GAAG,IAAI,CAAC;wBAClB,CAAC;oBACL,CAAC;gBACL,CAAC;gBACD,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC,CAAC;QACN,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,OAAO,OAAO,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,SAAsB,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAChG,MAAM,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEzH,MAAM,2BAA2B,GAAG,CAAC,QAAgB,EAAoB,EAAE;QACvE,MAAM,eAAe,GAAI,KAAK,CAAC,gBAAwB,CAAC,QAAQ,CAAC,EAAE,aAAa,IAAK,KAAK,CAAC,gBAAwB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;QACzI,OAAO,eAAe;YAClB,CAAC,CAAC,CAAC,IAAsB,EAAE,QAAqC,EAAE,eAAiC,CAAC;YACpG,CAAC,CAAC,CAAC,IAAsB,EAAE,QAAqC,CAAC,CAAC;IAC1E,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CACtC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/E,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAE,MAAc,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACnH,CAAC,CAAC,CACwC,CAAC;IAE/C,MAAM,kBAAkB,GAAkC,CAAC,MAAmD,EAAE,EAAE;QAC9G,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,GAAG,EAAE;YACR,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,MAAM,OAAO,GAAyC;QAClD,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,eAAe;QAC1B,YAAY,EAAE,kBAAkB;QAChC,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE,gBAAgB;QAC3B,MAAM,EAAE,qBAAqB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;KACxE,CAAC;IAEF,MAAM,+BAA+B,GAAG,GAAG,EAAE;QACzC,MAAM,YAAY,GAAyB;YACvC,iBAAiB,EAAE,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;YACrD,iBAAiB,EAAE,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;YACrD,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBAChE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,YAAY,GAAiC,IAAI,CAAC;gBACtD,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC;oBACrC,YAAY,GAAG,UAAmC,CAAC;gBACvD,CAAC;gBACD,OAAO;oBACH,MAAM;oBACN,YAAY;iBACf,CAAC;YACN,CAAC,CAAC,CAAC;YACH,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,IAAI;SACjB,CAAC;QACF,eAAe,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAA8B;QAChD,GAAG,IAAI;QACP,SAAS;QACT,OAAO;QACP,OAAO;QACP,KAAK,EAAE,GAAG,EAAE;YACR,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,+BAA+B,EAAE,CAAC;QACtC,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5C,QAAQ,EAAE,CAAC,IAAa,EAAE,EAAE;YACxB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrB,+BAA+B,EAAE,CAAC;QACtC,CAAC;QACD,MAAM,EAAE,CAAC,MAAW,EAAE,EAAE;YACpB,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,0GAA0G;YACzG,OAAe,CAAC,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;YAC7H,OAAe,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAC3C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC/E,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAE,MAAc,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACnH,CAAC,CAAC,CACL,CAAC;YACF,+BAA+B,EAAE,CAAC;YAClC,OAAO,gBAAuB,CAAC;QACnC,CAAC;KACJ,CAAC;IAEF,OAAO,gBAAgB,CAAC;AAC5B,CAAC"}
|
|
@@ -6,9 +6,9 @@ import { TransactionResult } from "../transactional-store/index.js";
|
|
|
6
6
|
* commit and an async-generator yield apply locally with `time < 0`. The
|
|
7
7
|
* intent records the wrapper's reason for emitting the envelope so a sync
|
|
8
8
|
* service can route each one correctly without re-deriving it from the time
|
|
9
|
-
* sign.
|
|
9
|
+
* sign. `"intermediate"` means a non-final step in an async sequence.
|
|
10
10
|
*/
|
|
11
|
-
export type TransactionIntent = "commit" | "
|
|
11
|
+
export type TransactionIntent = "commit" | "intermediate" | "cancel";
|
|
12
12
|
export type TransactionEnvelopeEvent = {
|
|
13
13
|
readonly envelope: TransactionEnvelope;
|
|
14
14
|
readonly result: TransactionResult<unknown> | undefined;
|
|
@@ -29,10 +29,10 @@ export type DispatcherTarget = (envelope: TransactionEnvelope<string>) => Transa
|
|
|
29
29
|
*
|
|
30
30
|
* - The per-database transaction id counter.
|
|
31
31
|
* - Resolving the `args` argument shape (plain value, promise, or
|
|
32
|
-
* async-generator factory) into a sequence of `
|
|
32
|
+
* async-generator factory) into a sequence of `applyIntermediate` /
|
|
33
33
|
* `applyCommit` / `cancelPending` calls.
|
|
34
34
|
* - Whether a "commit" intent should be applied as a positive-time commit
|
|
35
|
-
* (local-only mode) or a negative-time
|
|
35
|
+
* (local-only mode) or a negative-time intermediate step pending server echo
|
|
36
36
|
* (sync mode). Decided once at construction by the presence of
|
|
37
37
|
* `sync` — never mutated at runtime.
|
|
38
38
|
* - Stamping `userId` onto every envelope (sync mode only).
|
|
@@ -19,38 +19,38 @@ export const createTransactionDispatcher = (apply, options) => {
|
|
|
19
19
|
};
|
|
20
20
|
const wrap = (name) => (args) => {
|
|
21
21
|
const transactionId = nextTransactionId++;
|
|
22
|
-
let
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
dispatchEnvelope({ id: transactionId, userId, name, args: payload, time: -Date.now() }, "
|
|
22
|
+
let hasIntermediate = false;
|
|
23
|
+
const applyIntermediate = (payload) => {
|
|
24
|
+
hasIntermediate = true;
|
|
25
|
+
dispatchEnvelope({ id: transactionId, userId, name, args: payload, time: -Date.now() }, "intermediate");
|
|
26
26
|
};
|
|
27
27
|
const applyCommit = (payload) => {
|
|
28
|
-
// In sync mode the commit is applied locally as
|
|
28
|
+
// In sync mode the commit is applied locally as an intermediate step
|
|
29
29
|
// and the server's echoed `committed` envelope will promote it.
|
|
30
30
|
// In local-only mode it commits immediately with positive time.
|
|
31
31
|
const time = deferredCommit ? -Date.now() : Date.now();
|
|
32
32
|
const result = dispatchEnvelope({ id: transactionId, userId, name, args: payload, time }, "commit");
|
|
33
|
-
// Only mark a pending
|
|
33
|
+
// Only mark a pending intermediate if the envelope was effective (not
|
|
34
34
|
// a no-op). A no-op envelope is suppressed by dispatchEnvelope and
|
|
35
35
|
// will never receive a server promotion, so we must not set
|
|
36
|
-
//
|
|
36
|
+
// hasIntermediate — doing so would cause a spurious cancel later.
|
|
37
37
|
const effective = result === undefined || result.redo.length > 0 || result.undo.length > 0;
|
|
38
|
-
|
|
38
|
+
hasIntermediate = deferredCommit && effective;
|
|
39
39
|
return result?.value;
|
|
40
40
|
};
|
|
41
41
|
const cancelPending = () => {
|
|
42
|
-
if (!
|
|
42
|
+
if (!hasIntermediate)
|
|
43
43
|
return;
|
|
44
44
|
dispatchEnvelope({ id: transactionId, userId, name, args: undefined, time: 0 }, "cancel");
|
|
45
|
-
|
|
45
|
+
hasIntermediate = false;
|
|
46
46
|
};
|
|
47
|
-
return runTransaction(args,
|
|
47
|
+
return runTransaction(args, applyIntermediate, applyCommit, cancelPending);
|
|
48
48
|
};
|
|
49
49
|
return { wrap, envelopes };
|
|
50
50
|
};
|
|
51
51
|
/**
|
|
52
52
|
* Resolves the `args` shape passed to `db.transactions.X(args)` into the
|
|
53
|
-
* appropriate `
|
|
53
|
+
* appropriate `applyIntermediate` / `applyCommit` / `cancelPending` sequence.
|
|
54
54
|
*
|
|
55
55
|
* Three argument shapes are supported:
|
|
56
56
|
*
|
|
@@ -58,14 +58,14 @@ export const createTransactionDispatcher = (apply, options) => {
|
|
|
58
58
|
* - Function returning a `Promise`: `applyCommit(await promise)`, with
|
|
59
59
|
* `cancelPending` on rejection.
|
|
60
60
|
* - Function returning an `AsyncGenerator`: each yielded value becomes an
|
|
61
|
-
* `
|
|
61
|
+
* `applyIntermediate`; on `done`, the final yielded value (or the explicit
|
|
62
62
|
* return value if defined) becomes `applyCommit`. If no value was ever
|
|
63
63
|
* yielded and none returned, `cancelPending` runs instead. A thrown
|
|
64
64
|
* iterator results in `cancelPending` plus a rejected promise — this is
|
|
65
65
|
* how never-ending transactions (e.g. presence streams) cleanly tear
|
|
66
66
|
* down without promoting their last sample to a commit.
|
|
67
67
|
*/
|
|
68
|
-
const runTransaction = (args,
|
|
68
|
+
const runTransaction = (args, applyIntermediate, applyCommit, cancelPending) => {
|
|
69
69
|
if (typeof args !== "function") {
|
|
70
70
|
return applyCommit(args);
|
|
71
71
|
}
|
|
@@ -78,7 +78,7 @@ const runTransaction = (args, applyTransient, applyCommit, cancelPending) => {
|
|
|
78
78
|
let iteration = await providerResult.next();
|
|
79
79
|
while (!iteration.done) {
|
|
80
80
|
lastArgs = iteration.value;
|
|
81
|
-
|
|
81
|
+
applyIntermediate(iteration.value);
|
|
82
82
|
iteration = await providerResult.next();
|
|
83
83
|
}
|
|
84
84
|
const finalArgs = iteration.value !== undefined ? iteration.value : lastArgs;
|