@adobe/data 0.9.56 → 0.9.58
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/blob-store.js +12 -7
- package/dist/cache/blob-store.js.map +1 -1
- package/dist/ecs/database/database.d.ts +59 -2
- package/dist/ecs/database/database.js.map +1 -1
- package/dist/ecs/database/database.reset.test.js +200 -0
- package/dist/ecs/database/database.reset.test.js.map +1 -0
- package/dist/ecs/database/deep-extends-chain.type-test.d.ts +208 -208
- package/dist/ecs/database/observed/create-observed-database.js +4 -0
- package/dist/ecs/database/observed/create-observed-database.js.map +1 -1
- package/dist/ecs/database/observed/observed-database.d.ts +5 -3
- package/dist/ecs/database/public/create-database.d.ts +32 -3
- package/dist/ecs/database/public/create-database.js +12 -69
- package/dist/ecs/database/public/create-database.js.map +1 -1
- package/dist/ecs/database/public/create-database.test.js +86 -4
- package/dist/ecs/database/public/create-database.test.js.map +1 -1
- package/dist/ecs/database/public/create-transaction-dispatcher.d.ts +60 -0
- package/dist/ecs/database/public/create-transaction-dispatcher.js +119 -0
- package/dist/ecs/database/public/create-transaction-dispatcher.js.map +1 -0
- package/dist/ecs/database/reconciling/create-reconciling-database.js +52 -18
- package/dist/ecs/database/reconciling/create-reconciling-database.js.map +1 -1
- package/dist/ecs/database/reconciling/create-reconciling-database.test.js +144 -0
- package/dist/ecs/database/reconciling/create-reconciling-database.test.js.map +1 -1
- package/dist/ecs/database/reconciling/reconciling-database.d.ts +8 -1
- package/dist/ecs/database/reconciling/reconciling-entry.d.ts +9 -3
- package/dist/ecs/database/reconciling/reconciling-entry.js.map +1 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.js +3 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
- package/dist/ecs/database/transactional-store/transactional-store.d.ts +14 -1
- package/dist/ecs/entity-location-table/create-entity-location-table.js +6 -1
- package/dist/ecs/entity-location-table/create-entity-location-table.js.map +1 -1
- package/dist/ecs/entity-location-table/entity-location-table.d.ts +2 -0
- package/dist/ecs/store/core/core.d.ts +2 -0
- package/dist/ecs/store/core/create-core.js +8 -0
- package/dist/ecs/store/core/create-core.js.map +1 -1
- package/dist/ecs/store/public/create-store.js +6 -0
- package/dist/ecs/store/public/create-store.js.map +1 -1
- package/dist/ecs/store/store.d.ts +2 -0
- package/dist/ecs/store/store.js.map +1 -1
- package/dist/ecs/store/transaction-functions.d.ts +36 -4
- package/dist/ecs/store/transaction-functions.type-test.js +50 -0
- package/dist/ecs/store/transaction-functions.type-test.js.map +1 -0
- package/dist/observe/to-async-generator.js +18 -8
- package/dist/observe/to-async-generator.js.map +1 -1
- package/dist/observe/to-async-generator.test.js +24 -0
- package/dist/observe/to-async-generator.test.js.map +1 -1
- package/dist/service/async-data-service/async-data-service.d.ts +1 -0
- package/dist/service/async-data-service/async-data-service.js +3 -0
- package/dist/service/async-data-service/async-data-service.js.map +1 -0
- package/dist/service/async-data-service/example.js +1 -1
- package/dist/service/async-data-service/example.js.map +1 -1
- package/dist/service/index.d.ts +2 -1
- package/dist/service/index.js +2 -1
- package/dist/service/index.js.map +1 -1
- package/dist/service/{agentic-service/link.js → ui-service/example.js} +1 -1
- package/dist/service/ui-service/example.js.map +1 -0
- package/dist/service/ui-service/from-service.d.ts +35 -0
- package/dist/service/{async-data-service/is-valid.type-test.js → ui-service/from-service.js} +1 -1
- package/dist/service/ui-service/from-service.js.map +1 -0
- package/dist/service/ui-service/is-valid.d.ts +11 -0
- package/dist/service/ui-service/is-valid.js +3 -0
- package/dist/service/ui-service/is-valid.js.map +1 -0
- package/dist/service/ui-service/public.d.ts +2 -0
- package/dist/service/ui-service/public.js +4 -0
- package/dist/service/ui-service/public.js.map +1 -0
- package/dist/service/ui-service/ui-service.d.ts +1 -0
- package/dist/service/ui-service/ui-service.js +3 -0
- package/dist/service/ui-service/ui-service.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/references/data-lit/package.json +1 -1
- package/references/data-lit/src/elements/application-element.ts +11 -1
- package/references/data-lit/src/elements/database-element.ts +3 -2
- package/references/data-lit/src/elements/database-element.type-test.ts +85 -0
- package/references/data-lit/src/hooks/index.ts +2 -0
- package/references/data-lit/src/hooks/use-drag-generator.ts +43 -0
- package/references/data-lit/src/hooks/use-drag-observe.ts +8 -2
- package/references/data-lit/src/hooks/use-pointer-observe.ts +79 -0
- package/references/data-lit-tictactoe/package.json +4 -1
- package/references/data-lit-tictactoe/src/elements/tictactoe-app/tictactoe-app-element.ts +23 -0
- package/references/data-lit-tictactoe/src/elements/tictactoe-app/tictactoe-app-presentation.ts +12 -0
- package/references/data-lit-tictactoe/src/elements/tictactoe-app/tictactoe-app.ts +14 -18
- package/references/data-lit-tictactoe/src/elements/tictactoe-board/tictactoe-board-element.ts +23 -0
- package/references/data-lit-tictactoe/src/elements/tictactoe-board/tictactoe-board-presentation.ts +6 -7
- package/references/data-lit-tictactoe/src/elements/tictactoe-board/tictactoe-board.ts +5 -15
- package/references/data-lit-tictactoe/src/elements/tictactoe-cell/tictactoe-cell-element.ts +45 -0
- package/references/data-lit-tictactoe/src/elements/tictactoe-cell/tictactoe-cell-presentation.ts +2 -1
- package/references/data-lit-tictactoe/src/elements/tictactoe-cell/tictactoe-cell.ts +5 -38
- package/references/data-lit-tictactoe/src/elements/tictactoe-hud/tictactoe-hud-element.ts +57 -0
- package/references/data-lit-tictactoe/src/elements/tictactoe-hud/tictactoe-hud-presentation.ts +10 -2
- package/references/data-lit-tictactoe/src/elements/tictactoe-hud/tictactoe-hud.css.ts +36 -1
- package/references/data-lit-tictactoe/src/elements/tictactoe-hud/tictactoe-hud.ts +5 -41
- package/references/data-lit-tictactoe/src/index.ts +16 -0
- package/references/data-lit-tictactoe/src/main.ts +9 -3
- package/references/data-lit-tictactoe/src/state/tictactoe-plugin.ts +18 -10
- package/references/data-lit-tictactoe/src/tictactoe-element.ts +8 -3
- package/references/data-lit-tictactoe/src/types/board-state/current-player.ts +2 -2
- package/references/data-lit-tictactoe/src/types/player-mark/is.ts +8 -0
- package/references/data-lit-tictactoe/src/types/player-mark/mark-color.ts +12 -0
- package/references/data-lit-tictactoe/src/types/player-mark/opponent.ts +12 -0
- package/references/data-lit-tictactoe/src/types/player-mark/public.ts +4 -0
- package/references/data-lit-tictactoe/src/types/player-mark/values.ts +6 -0
- 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
- package/dist/cache/blob-store.test.js +0 -122
- package/dist/cache/blob-store.test.js.map +0 -1
- package/dist/cache/data-cache.test.js +0 -41
- package/dist/cache/data-cache.test.js.map +0 -1
- package/dist/cache/expiring-data-cache.test.js +0 -42
- package/dist/cache/expiring-data-cache.test.js.map +0 -1
- package/dist/cache/functions/functions.test.d.ts +0 -1
- package/dist/cache/functions/functions.test.js +0 -72
- package/dist/cache/functions/functions.test.js.map +0 -1
- package/dist/ecs/database/observe-select-deep.d.ts +0 -23
- package/dist/ecs/database/observe-select-deep.js +0 -15
- package/dist/ecs/database/observe-select-deep.js.map +0 -1
- package/dist/ecs/database/observe-select-deep.type-test.d.ts +0 -1
- package/dist/ecs/database/observe-select-deep.type-test.js +0 -111
- package/dist/ecs/database/observe-select-deep.type-test.js.map +0 -1
- package/dist/ecs/database/public/create-database-scheduler.test.d.ts +0 -1
- package/dist/ecs/database/public/create-database-scheduler.test.js +0 -67
- package/dist/ecs/database/public/create-database-scheduler.test.js.map +0 -1
- package/dist/ecs/database/public/create-database.type-test.d.ts +0 -1
- package/dist/ecs/database/public/create-database.type-test.js +0 -52
- package/dist/ecs/database/public/create-database.type-test.js.map +0 -1
- package/dist/ecs/entity.d.ts +0 -11
- package/dist/ecs/entity.js +0 -7
- package/dist/ecs/entity.js.map +0 -1
- package/dist/ecs/persistence-service/create-storage-persistence-service.test.d.ts +0 -1
- package/dist/ecs/persistence-service/create-storage-persistence-service.test.js +0 -52
- package/dist/ecs/persistence-service/create-storage-persistence-service.test.js.map +0 -1
- package/dist/functions/serialization/serialize-to-storage.test.d.ts +0 -1
- package/dist/functions/serialization/serialize-to-storage.test.js +0 -161
- package/dist/functions/serialization/serialize-to-storage.test.js.map +0 -1
- package/dist/math/aabb/face/aabb-face.test.d.ts +0 -1
- package/dist/math/aabb/face/aabb-face.test.js +0 -35
- package/dist/math/aabb/face/aabb-face.test.js.map +0 -1
- package/dist/math/aabb/face/functions.d.ts +0 -47
- package/dist/math/aabb/face/functions.js +0 -142
- package/dist/math/aabb/face/functions.js.map +0 -1
- package/dist/math/aabb/face/index.d.ts +0 -4
- package/dist/math/aabb/face/index.js +0 -3
- package/dist/math/aabb/face/index.js.map +0 -1
- package/dist/perftest/ecs-perf.d.ts +0 -49
- package/dist/perftest/ecs-perf.js +0 -210
- package/dist/perftest/ecs-perf.js.map +0 -1
- package/dist/service/agentic-service/link.d.ts +0 -15
- package/dist/service/agentic-service/link.js.map +0 -1
- package/dist/service/async-data-service/is-valid.type-test.d.ts +0 -1
- package/dist/service/async-data-service/is-valid.type-test.js.map +0 -1
- package/dist/service/dynamic-service/create-from-ecs.d.ts +0 -17
- package/dist/service/dynamic-service/create-from-ecs.js +0 -56
- package/dist/service/dynamic-service/create-from-ecs.js.map +0 -1
- package/dist/service/dynamic-service/create-from-ecs.test.d.ts +0 -1
- package/dist/service/dynamic-service/create-from-ecs.test.js +0 -636
- package/dist/service/dynamic-service/create-from-ecs.test.js.map +0 -1
- package/dist/service/dynamic-service/create.d.ts +0 -84
- package/dist/service/dynamic-service/create.js +0 -97
- package/dist/service/dynamic-service/create.js.map +0 -1
- package/dist/service/dynamic-service/create.test.d.ts +0 -1
- package/dist/service/dynamic-service/create.test.js +0 -688
- package/dist/service/dynamic-service/create.test.js.map +0 -1
- package/dist/service/dynamic-service/dynamic-service.d.ts +0 -29
- package/dist/service/dynamic-service/dynamic-service.js +0 -2
- package/dist/service/dynamic-service/dynamic-service.js.map +0 -1
- package/dist/service/dynamic-service/index.d.ts +0 -1
- package/dist/service/dynamic-service/index.js +0 -3
- package/dist/service/dynamic-service/index.js.map +0 -1
- package/dist/service/dynamic-service/public.d.ts +0 -2
- package/dist/service/dynamic-service/public.js +0 -3
- package/dist/service/dynamic-service/public.js.map +0 -1
- package/dist/service/dynamic-service/semantic-service.d.ts +0 -19
- package/dist/service/dynamic-service/semantic-service.js +0 -2
- package/dist/service/dynamic-service/semantic-service.js.map +0 -1
- package/dist/service/semantic-service/semantic-service.d.ts +0 -19
- package/dist/service/semantic-service/semantic-service.js +0 -2
- package/dist/service/semantic-service/semantic-service.js.map +0 -1
- /package/dist/{cache/blob-store.test.d.ts → ecs/database/database.reset.test.d.ts} +0 -0
- /package/dist/{cache/data-cache.test.d.ts → ecs/store/transaction-functions.type-test.d.ts} +0 -0
- /package/dist/{cache/expiring-data-cache.test.d.ts → service/ui-service/example.d.ts} +0 -0
|
@@ -142,6 +142,10 @@ export function createObservedDatabase(store) {
|
|
|
142
142
|
resources,
|
|
143
143
|
observe,
|
|
144
144
|
execute,
|
|
145
|
+
reset: () => {
|
|
146
|
+
store.reset();
|
|
147
|
+
notifyAllObserversStoreReloaded();
|
|
148
|
+
},
|
|
145
149
|
toData: () => store.toData(),
|
|
146
150
|
fromData: (data) => {
|
|
147
151
|
store.fromData(data);
|
|
@@ -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":"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"}
|
|
@@ -3,9 +3,9 @@ import { Components } from "../../store/components.js";
|
|
|
3
3
|
import { ResourceComponents } from "../../store/resource-components.js";
|
|
4
4
|
import { ArchetypeComponents } from "../../store/archetype-components.js";
|
|
5
5
|
import { StringKeyof } from "../../../types/types.js";
|
|
6
|
-
import { ReadonlyStore
|
|
6
|
+
import { ReadonlyStore } from "../../store/index.js";
|
|
7
7
|
import { Observe } from "../../../observe/index.js";
|
|
8
|
-
import { TransactionResult } from "../transactional-store/index.js";
|
|
8
|
+
import { TransactionContext, TransactionResult } from "../transactional-store/index.js";
|
|
9
9
|
import { RequiredComponents } from "../../required-components.js";
|
|
10
10
|
import { Entity } from "../../entity/entity.js";
|
|
11
11
|
import { EntityReadValues } from "../../store/core/index.js";
|
|
@@ -28,9 +28,11 @@ export interface ObservedDatabase<C extends Components, R extends ResourceCompon
|
|
|
28
28
|
archetype(id: ArchetypeId): Observe<void>;
|
|
29
29
|
select<Include extends StringKeyof<C>, T extends Include>(include: readonly Include[] | ReadonlySet<string>, options?: any): Observe<readonly Entity[]>;
|
|
30
30
|
};
|
|
31
|
-
readonly execute: (handler: (
|
|
31
|
+
readonly execute: (handler: (ctx: TransactionContext<C, R, A>) => Entity | void, options?: {
|
|
32
32
|
transient?: boolean;
|
|
33
|
+
userId?: number | string;
|
|
33
34
|
}) => TransactionResult<C>;
|
|
35
|
+
readonly reset: () => void;
|
|
34
36
|
readonly toData: () => unknown;
|
|
35
37
|
readonly fromData: (data: unknown) => void;
|
|
36
38
|
readonly extend: <P extends Database.Plugin<any, any, any, any, any>>(plugin: P) => ObservedDatabase<C & (P extends Database.Plugin<infer XC, infer XR, infer XA, infer XTD, any> ? FromSchemas<XC> : never), R & (P extends Database.Plugin<infer XC, infer XR, infer XA, infer XTD, any> ? FromSchemas<XR> : never), A & (P extends Database.Plugin<infer XC, infer XR, infer XA, infer XTD, any> ? XA : never)>;
|
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import { Database, FromServiceFactories } from "../database.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Sync-related options. Presence of `sync` means "this database is going to
|
|
4
|
+
* be attached to a sync service", which has two consequences:
|
|
5
|
+
*
|
|
6
|
+
* 1. Every locally-generated `TransactionEnvelope` is stamped with
|
|
7
|
+
* `userId`, and the reconciler keys its transient queue by the
|
|
8
|
+
* compound `(userId, id)` so two peers' independent local id counters
|
|
9
|
+
* cannot collide.
|
|
10
|
+
* 2. The transaction wrapper enters deferred-commit mode: calls to
|
|
11
|
+
* `db.transactions.X(args)` apply locally as transients (negative
|
|
12
|
+
* time) and wait for the server's echoed `committed` envelope to
|
|
13
|
+
* promote them via the reconciler's rebase-replay. This is required
|
|
14
|
+
* for cross-peer entity-id determinism under concurrent edits.
|
|
15
|
+
*
|
|
16
|
+
* If `sync` is omitted the database operates in local-only mode: commits
|
|
17
|
+
* apply immediately with positive time, no envelope stamping, no deferred
|
|
18
|
+
* promotion.
|
|
19
|
+
*/
|
|
20
|
+
export interface DatabaseSyncOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Stable peer/session identifier. Must be unique across all peers
|
|
23
|
+
* sharing the same sync server.
|
|
24
|
+
*/
|
|
25
|
+
readonly userId: number | string;
|
|
26
|
+
}
|
|
27
|
+
interface CreateDatabaseOptions<P extends Database.Plugin<any, any, any, any, any, any, any, any>> {
|
|
4
28
|
/**
|
|
5
29
|
* Optional services overrides to use.
|
|
6
30
|
* For each service injected here, we will use it and not call the normal service factory function.
|
|
@@ -8,4 +32,9 @@ export declare function createDatabase<P extends Database.Plugin<{}, {}, {}, {},
|
|
|
8
32
|
services?: {
|
|
9
33
|
[K in keyof FromServiceFactories<P['services']>]?: FromServiceFactories<P['services']>[K];
|
|
10
34
|
};
|
|
11
|
-
}
|
|
35
|
+
/** See {@link DatabaseSyncOptions}. */
|
|
36
|
+
sync?: DatabaseSyncOptions;
|
|
37
|
+
}
|
|
38
|
+
export declare function createDatabase(): Database<{}, {}, {}, {}, never, {}, {}, {}>;
|
|
39
|
+
export declare function createDatabase<P extends Database.Plugin<{}, {}, {}, {}, never, {}, any, any>>(plugin: P, options?: CreateDatabaseOptions<P>): Database.FromPlugin<P>;
|
|
40
|
+
export {};
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
2
|
import { Store } from "../../store/index.js";
|
|
3
|
-
import { isPromise } from "../../../internal/promise/is-promise.js";
|
|
4
|
-
import { isAsyncGenerator } from "../../../internal/async-generator/is-async-generator.js";
|
|
5
3
|
import { createReconcilingDatabase } from "../reconciling/create-reconciling-database.js";
|
|
6
4
|
import { calculateSystemOrder } from "../calculate-system-order.js";
|
|
5
|
+
import { createTransactionDispatcher } from "./create-transaction-dispatcher.js";
|
|
7
6
|
/**
|
|
8
7
|
* For each system in newDeclarations that is not yet in systemFunctions: call create(db),
|
|
9
8
|
* store the returned value in systemFunctions, and assign by name. Uses natural declaration order.
|
|
@@ -18,7 +17,7 @@ function createAndAssignSystems(db, systemFunctions, newDeclarations) {
|
|
|
18
17
|
}
|
|
19
18
|
}
|
|
20
19
|
export function createDatabase(plugin, options) {
|
|
21
|
-
const db = createEmptyDatabase();
|
|
20
|
+
const db = createEmptyDatabase(options?.sync);
|
|
22
21
|
if (plugin === undefined) {
|
|
23
22
|
return db;
|
|
24
23
|
}
|
|
@@ -31,81 +30,24 @@ export function createDatabase(plugin, options) {
|
|
|
31
30
|
* Creates a database with empty store, no transactions, actions, services, computed, or systems.
|
|
32
31
|
* All content is added via .extend(plugin). Single code path for extension.
|
|
33
32
|
*/
|
|
34
|
-
function createEmptyDatabase() {
|
|
33
|
+
function createEmptyDatabase(sync) {
|
|
35
34
|
const store = Store.create({
|
|
36
35
|
components: {},
|
|
37
36
|
resources: {},
|
|
38
37
|
archetypes: {},
|
|
39
38
|
});
|
|
40
39
|
const reconcilingDatabase = createReconcilingDatabase(store, {});
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
hasTransient = true;
|
|
49
|
-
applyEnvelope({ id: transactionId, name, args: payload, time: -Date.now() });
|
|
50
|
-
};
|
|
51
|
-
const applyCommit = (payload) => {
|
|
52
|
-
const result = applyEnvelope({ id: transactionId, name, args: payload, time: Date.now() });
|
|
53
|
-
hasTransient = false;
|
|
54
|
-
return result?.value;
|
|
55
|
-
};
|
|
56
|
-
const cancelPending = () => {
|
|
57
|
-
if (!hasTransient)
|
|
58
|
-
return;
|
|
59
|
-
applyEnvelope({ id: transactionId, name, args: undefined, time: 0 });
|
|
60
|
-
hasTransient = false;
|
|
61
|
-
};
|
|
62
|
-
if (typeof args === "function") {
|
|
63
|
-
const providerResult = args();
|
|
64
|
-
if (isAsyncGenerator(providerResult)) {
|
|
65
|
-
return new Promise((resolve, reject) => {
|
|
66
|
-
(async () => {
|
|
67
|
-
let lastArgs;
|
|
68
|
-
try {
|
|
69
|
-
let iteration = await providerResult.next();
|
|
70
|
-
while (!iteration.done) {
|
|
71
|
-
lastArgs = iteration.value;
|
|
72
|
-
applyTransient(iteration.value);
|
|
73
|
-
iteration = await providerResult.next();
|
|
74
|
-
}
|
|
75
|
-
const finalArgs = iteration.value !== undefined ? iteration.value : lastArgs;
|
|
76
|
-
if (finalArgs !== undefined)
|
|
77
|
-
resolve(applyCommit(finalArgs));
|
|
78
|
-
else {
|
|
79
|
-
cancelPending();
|
|
80
|
-
resolve(undefined);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
catch (e) {
|
|
84
|
-
cancelPending();
|
|
85
|
-
reject(e);
|
|
86
|
-
}
|
|
87
|
-
})();
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
if (isPromise(providerResult)) {
|
|
91
|
-
return (async () => {
|
|
92
|
-
try {
|
|
93
|
-
return applyCommit(await providerResult);
|
|
94
|
-
}
|
|
95
|
-
catch (e) {
|
|
96
|
-
cancelPending();
|
|
97
|
-
throw e;
|
|
98
|
-
}
|
|
99
|
-
})();
|
|
100
|
-
}
|
|
101
|
-
return applyCommit(providerResult);
|
|
102
|
-
}
|
|
103
|
-
return applyCommit(args);
|
|
104
|
-
};
|
|
40
|
+
// The dispatcher owns everything envelope-related: id allocation,
|
|
41
|
+
// commit/transient/cancel intent decisions, the deferred-commit
|
|
42
|
+
// behaviour implied by sync mode, and resolving plain/promise/async-
|
|
43
|
+
// generator argument shapes. We just plug its outputs into the
|
|
44
|
+
// database surface.
|
|
45
|
+
const dispatcher = createTransactionDispatcher(reconcilingDatabase.apply, sync);
|
|
46
|
+
reconcilingDatabase.observe.envelopes = dispatcher.envelopes;
|
|
105
47
|
const transactions = { serviceName: "ecs-database-transactions-service" };
|
|
106
48
|
const addTransactionWrappers = (transactionDecls) => {
|
|
107
49
|
for (const name of Object.keys(transactionDecls)) {
|
|
108
|
-
transactions[name] =
|
|
50
|
+
transactions[name] = dispatcher.wrap(name);
|
|
109
51
|
}
|
|
110
52
|
};
|
|
111
53
|
const actions = { serviceName: "ecs-database-actions-service" };
|
|
@@ -124,6 +66,7 @@ function createEmptyDatabase() {
|
|
|
124
66
|
const partialDatabase = {
|
|
125
67
|
serviceName: "ecs-database-service",
|
|
126
68
|
...reconcilingDatabase,
|
|
69
|
+
sync,
|
|
127
70
|
transactions,
|
|
128
71
|
actions,
|
|
129
72
|
services,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-database.js","sourceRoot":"","sources":["../../../../src/ecs/database/public/create-database.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create-database.js","sourceRoot":"","sources":["../../../../src/ecs/database/public/create-database.ts"],"names":[],"mappings":"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"}
|
|
@@ -403,10 +403,12 @@ describe("createDatabase", () => {
|
|
|
403
403
|
await new Promise(resolve => setTimeout(resolve, 1));
|
|
404
404
|
}
|
|
405
405
|
}
|
|
406
|
-
// Execute transaction with conditional async generator wrapped in function
|
|
407
|
-
|
|
408
|
-
//
|
|
409
|
-
|
|
406
|
+
// Execute transaction with conditional async generator wrapped in function.
|
|
407
|
+
// Capture the promise so we can await actual completion rather than
|
|
408
|
+
// relying on a fixed wait (the inner generator does 5 setTimeout(1)
|
|
409
|
+
// cycles which under load can exceed any short fixed wait).
|
|
410
|
+
const txPromise = store.transactions.createPositionNameEntity(() => conditionalStream());
|
|
411
|
+
await txPromise;
|
|
410
412
|
// Verify only the final entity was created (each yield replaces the previous)
|
|
411
413
|
// Now that rollback is working correctly and observably, we should see only the final entity
|
|
412
414
|
const entities = store.select(["position", "name"]);
|
|
@@ -1348,4 +1350,84 @@ describe("database.transactions", () => {
|
|
|
1348
1350
|
unsubscribe();
|
|
1349
1351
|
});
|
|
1350
1352
|
});
|
|
1353
|
+
// ---------------------------------------------------------------------------
|
|
1354
|
+
// userId threading tests
|
|
1355
|
+
// ---------------------------------------------------------------------------
|
|
1356
|
+
describe("userId in transaction context", () => {
|
|
1357
|
+
const makePlugin = () => Database.Plugin.create({
|
|
1358
|
+
components: {},
|
|
1359
|
+
resources: {
|
|
1360
|
+
seen: { default: undefined },
|
|
1361
|
+
},
|
|
1362
|
+
transactions: {
|
|
1363
|
+
capture(t) {
|
|
1364
|
+
t.resources.seen = t.userId;
|
|
1365
|
+
},
|
|
1366
|
+
},
|
|
1367
|
+
});
|
|
1368
|
+
it("t.userId is undefined for a local-only database (no sync)", () => {
|
|
1369
|
+
const db = Database.create(makePlugin());
|
|
1370
|
+
db.transactions.capture();
|
|
1371
|
+
expect(db.resources.seen).toBeUndefined();
|
|
1372
|
+
});
|
|
1373
|
+
it("t.userId matches sync.userId for locally-initiated transactions", () => {
|
|
1374
|
+
const db = Database.create(makePlugin(), { sync: { userId: "alice" } });
|
|
1375
|
+
db.transactions.capture();
|
|
1376
|
+
expect(db.resources.seen).toBe("alice");
|
|
1377
|
+
});
|
|
1378
|
+
it("t.userId matches the envelope userId for inbound db.apply(envelope) calls", () => {
|
|
1379
|
+
const plugin = makePlugin();
|
|
1380
|
+
const db = Database.create(plugin, { sync: { userId: "alice" } });
|
|
1381
|
+
// Build a committed envelope that looks like it came from "bob"
|
|
1382
|
+
const envelope = { id: 1, userId: "bob", name: "capture", args: undefined, time: 1 };
|
|
1383
|
+
db.apply(envelope);
|
|
1384
|
+
expect(db.resources.seen).toBe("bob");
|
|
1385
|
+
});
|
|
1386
|
+
});
|
|
1387
|
+
// ---------------------------------------------------------------------------
|
|
1388
|
+
// No-op envelope suppression tests
|
|
1389
|
+
// ---------------------------------------------------------------------------
|
|
1390
|
+
describe("no-op envelope suppression", () => {
|
|
1391
|
+
const makeGatedPlugin = () => Database.Plugin.create({
|
|
1392
|
+
components: {},
|
|
1393
|
+
resources: {
|
|
1394
|
+
value: { default: 0 },
|
|
1395
|
+
},
|
|
1396
|
+
transactions: {
|
|
1397
|
+
setIfX(t, args) {
|
|
1398
|
+
// Only applies when the calling user is "X"
|
|
1399
|
+
if (t.userId !== "X")
|
|
1400
|
+
return;
|
|
1401
|
+
t.resources.value = args.v;
|
|
1402
|
+
},
|
|
1403
|
+
},
|
|
1404
|
+
});
|
|
1405
|
+
it("a no-op commit (wrong userId) does not fire observe.envelopes", () => {
|
|
1406
|
+
const db = Database.create(makeGatedPlugin(), { sync: { userId: "O" } });
|
|
1407
|
+
const listener = vi.fn();
|
|
1408
|
+
db.observe.envelopes(listener);
|
|
1409
|
+
db.transactions.setIfX({ v: 99 });
|
|
1410
|
+
expect(listener).not.toHaveBeenCalled();
|
|
1411
|
+
expect(db.resources.value).toBe(0);
|
|
1412
|
+
});
|
|
1413
|
+
it("an effective commit (correct userId) does fire observe.envelopes", () => {
|
|
1414
|
+
const db = Database.create(makeGatedPlugin(), { sync: { userId: "X" } });
|
|
1415
|
+
const listener = vi.fn();
|
|
1416
|
+
db.observe.envelopes(listener);
|
|
1417
|
+
db.transactions.setIfX({ v: 99 });
|
|
1418
|
+
expect(listener).toHaveBeenCalledOnce();
|
|
1419
|
+
// In deferred-commit mode the local apply is transient (time < 0)
|
|
1420
|
+
// and the value is visible immediately.
|
|
1421
|
+
expect(db.resources.value).toBe(99);
|
|
1422
|
+
});
|
|
1423
|
+
it("a no-op in local-only mode does not fire observe.envelopes", () => {
|
|
1424
|
+
const db = Database.create(makeGatedPlugin()); // no sync
|
|
1425
|
+
const listener = vi.fn();
|
|
1426
|
+
db.observe.envelopes(listener);
|
|
1427
|
+
// userId is undefined in local-only mode, so setIfX is always a no-op
|
|
1428
|
+
db.transactions.setIfX({ v: 42 });
|
|
1429
|
+
expect(listener).not.toHaveBeenCalled();
|
|
1430
|
+
expect(db.resources.value).toBe(0);
|
|
1431
|
+
});
|
|
1432
|
+
});
|
|
1351
1433
|
//# sourceMappingURL=create-database.test.js.map
|