@adobe/data 0.8.6 → 0.9.0
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/ecs/database/calculate-system-order.d.ts +18 -0
- package/dist/ecs/database/calculate-system-order.js +113 -0
- package/dist/ecs/database/calculate-system-order.js.map +1 -0
- package/dist/ecs/database/calculate-system-order.test.d.ts +1 -0
- package/dist/ecs/database/calculate-system-order.test.js +168 -0
- package/dist/ecs/database/calculate-system-order.test.js.map +1 -0
- package/dist/ecs/database/create-plugin.d.ts +67 -0
- package/dist/ecs/database/create-plugin.js +47 -0
- package/dist/ecs/database/create-plugin.js.map +1 -0
- package/dist/ecs/database/create-plugin.test.d.ts +1 -0
- package/dist/ecs/database/create-plugin.test.js +435 -0
- package/dist/ecs/database/create-plugin.test.js.map +1 -0
- package/dist/ecs/database/database-schema/create-database-schema.d.ts +3 -3
- package/dist/ecs/database/database-schema/database-schema.d.ts +4 -3
- package/dist/ecs/database/database.d.ts +56 -18
- package/dist/ecs/database/database.js +42 -0
- package/dist/ecs/database/database.js.map +1 -1
- package/dist/ecs/database/database.test.d.ts +1 -0
- package/dist/ecs/database/database.test.js +200 -0
- package/dist/ecs/database/database.test.js.map +1 -0
- package/dist/ecs/database/observe-select-entities.test.js +3 -3
- package/dist/ecs/database/observe-select-entities.test.js.map +1 -1
- package/dist/ecs/database/observed/create-observed-database.js +6 -1
- package/dist/ecs/database/observed/create-observed-database.js.map +1 -1
- package/dist/ecs/database/observed/create-observed-database.test.js +105 -49
- package/dist/ecs/database/observed/create-observed-database.test.js.map +1 -1
- package/dist/ecs/database/observed/observed-database.d.ts +3 -0
- package/dist/ecs/database/public/create-database-from-schema.test.d.ts +1 -0
- package/dist/ecs/database/public/create-database-from-schema.test.js +153 -0
- package/dist/ecs/database/public/create-database-from-schema.test.js.map +1 -0
- package/dist/ecs/database/public/create-database.d.ts +17 -2
- package/dist/ecs/database/public/create-database.js +283 -79
- package/dist/ecs/database/public/create-database.js.map +1 -1
- package/dist/ecs/database/public/create-database.test.js +178 -47
- package/dist/ecs/database/public/create-database.test.js.map +1 -1
- package/dist/ecs/database/reconciling/create-reconciling-database.d.ts +2 -2
- package/dist/ecs/database/reconciling/create-reconciling-database.js +7 -2
- package/dist/ecs/database/reconciling/create-reconciling-database.js.map +1 -1
- package/dist/ecs/database/reconciling/create-reconciling-database.test.js +18 -9
- package/dist/ecs/database/reconciling/create-reconciling-database.test.js.map +1 -1
- package/dist/ecs/database/reconciling/reconciling-database.d.ts +5 -3
- package/dist/ecs/database/transactional-store/coalesce-actions.d.ts +16 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.js +140 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.js.map +1 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.test.d.ts +1 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.test.js +433 -0
- package/dist/ecs/database/transactional-store/coalesce-actions.test.js.map +1 -0
- package/dist/ecs/database/transactional-store/create-transactional-store.js +18 -2
- package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js +13 -3
- package/dist/ecs/database/transactional-store/create-transactional-store.test.js.map +1 -1
- package/dist/ecs/database/transactional-store/transactional-store.d.ts +2 -0
- package/dist/ecs/database/type-inference-example.d.ts +1 -0
- package/dist/ecs/database/type-inference-example.js +2 -0
- package/dist/ecs/database/type-inference-example.js.map +1 -0
- package/dist/ecs/plugins/index.d.ts +1 -0
- package/dist/ecs/plugins/index.js +23 -0
- package/dist/ecs/plugins/index.js.map +1 -0
- package/dist/ecs/plugins/scheduler/index.d.ts +1 -0
- package/dist/ecs/plugins/scheduler/index.js +23 -0
- package/dist/ecs/plugins/scheduler/index.js.map +1 -0
- package/dist/ecs/plugins/scheduler/scheduler.d.ts +8 -0
- package/dist/ecs/plugins/scheduler/scheduler.js +52 -0
- package/dist/ecs/plugins/scheduler/scheduler.js.map +1 -0
- package/dist/ecs/store/action-functions.d.ts +21 -0
- package/dist/ecs/store/action-functions.js +2 -0
- package/dist/ecs/store/action-functions.js.map +1 -0
- package/dist/ecs/store/create-store-schema-test.js +70 -8
- package/dist/ecs/store/create-store-schema-test.js.map +1 -1
- package/dist/ecs/store/public/create-store.js +9 -8
- package/dist/ecs/store/public/create-store.js.map +1 -1
- package/dist/ecs/store/public/create-store.test.js +5 -0
- package/dist/ecs/store/public/create-store.test.js.map +1 -1
- package/dist/ecs/store/store.d.ts +46 -13
- package/dist/ecs/store/store.js +35 -2
- package/dist/ecs/store/store.js.map +1 -1
- package/dist/ecs/store/store.test.d.ts +1 -0
- package/dist/ecs/store/store.test.js +211 -0
- package/dist/ecs/store/store.test.js.map +1 -0
- 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/lit/hooks/use-drag-transaction.d.ts +1 -1
- package/dist/samples/todo/services/main-service/todo-main-service.d.ts +1 -1
- package/dist/samples/todo/services/state-service/create-todo-database.d.ts +3 -3
- package/dist/samples/todo/services/state-service/create-todo-database.js +2 -2
- package/dist/samples/todo/services/state-service/create-todo-database.js.map +1 -1
- package/dist/samples/todo/services/state-service/create-todo-store.d.ts +1 -1
- package/dist/samples/todo/services/state-service/transactions/toggle-complete.js +1 -1
- package/dist/samples/todo/services/state-service/transactions/toggle-complete.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/types.d.ts +2 -0
- package/dist/types/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.*/
|
|
22
|
+
import { describe, it, expect } from "vitest";
|
|
23
|
+
import { Database } from "../database.js";
|
|
24
|
+
import { F32 } from "../../../math/f32/index.js";
|
|
25
|
+
describe("Database.create from plugin", () => {
|
|
26
|
+
it("should create and use database from Database.Plugin", () => {
|
|
27
|
+
const databasePlugin = Database.Plugin.create({
|
|
28
|
+
components: {
|
|
29
|
+
position: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
x: F32.schema,
|
|
33
|
+
y: F32.schema,
|
|
34
|
+
z: F32.schema,
|
|
35
|
+
},
|
|
36
|
+
required: ["x", "y", "z"],
|
|
37
|
+
additionalProperties: false,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
resources: {
|
|
41
|
+
time: { default: { delta: 0.016, elapsed: 0 } },
|
|
42
|
+
},
|
|
43
|
+
archetypes: {
|
|
44
|
+
PositionEntity: ["position"],
|
|
45
|
+
},
|
|
46
|
+
transactions: {
|
|
47
|
+
createPositionEntity(t, args) {
|
|
48
|
+
return t.archetypes.PositionEntity.insert(args);
|
|
49
|
+
},
|
|
50
|
+
updateTime(t, args) {
|
|
51
|
+
t.resources.time = args;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
const database = Database.create(databasePlugin);
|
|
56
|
+
const entity = database.transactions.createPositionEntity({
|
|
57
|
+
position: { x: 1, y: 2, z: 3 },
|
|
58
|
+
});
|
|
59
|
+
expect(entity).toBeDefined();
|
|
60
|
+
expect(typeof entity).toBe("number");
|
|
61
|
+
const entityData = database.read(entity);
|
|
62
|
+
expect(entityData).toEqual({
|
|
63
|
+
id: entity,
|
|
64
|
+
position: { x: 1, y: 2, z: 3 },
|
|
65
|
+
});
|
|
66
|
+
database.transactions.updateTime({ delta: 0.033, elapsed: 1.5 });
|
|
67
|
+
expect(database.resources.time).toEqual({ delta: 0.033, elapsed: 1.5 });
|
|
68
|
+
const entities = database.select(["position"]);
|
|
69
|
+
expect(entities).toHaveLength(1);
|
|
70
|
+
expect(entities[0]).toBe(entity);
|
|
71
|
+
});
|
|
72
|
+
it("should extend database with new actions", () => {
|
|
73
|
+
const databasePlugin = Database.Plugin.create({
|
|
74
|
+
components: {
|
|
75
|
+
position: {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
x: F32.schema,
|
|
79
|
+
y: F32.schema,
|
|
80
|
+
z: F32.schema,
|
|
81
|
+
},
|
|
82
|
+
required: ["x", "y", "z"],
|
|
83
|
+
additionalProperties: false,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
resources: {
|
|
87
|
+
foo: { default: 0 }
|
|
88
|
+
},
|
|
89
|
+
archetypes: {
|
|
90
|
+
PositionEntity: ["position"]
|
|
91
|
+
},
|
|
92
|
+
transactions: {
|
|
93
|
+
createPositionEntity(t, args) {
|
|
94
|
+
return t.archetypes.PositionEntity.insert(args);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
const database = Database.create(databasePlugin);
|
|
99
|
+
const extensionPlugin = Database.Plugin.create({
|
|
100
|
+
components: {
|
|
101
|
+
velocity: {
|
|
102
|
+
type: "object",
|
|
103
|
+
properties: {
|
|
104
|
+
x: F32.schema,
|
|
105
|
+
y: F32.schema,
|
|
106
|
+
z: F32.schema,
|
|
107
|
+
},
|
|
108
|
+
required: ["x", "y", "z"],
|
|
109
|
+
additionalProperties: false,
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
archetypes: {
|
|
113
|
+
MovingEntity: ["position", "velocity"]
|
|
114
|
+
},
|
|
115
|
+
transactions: {
|
|
116
|
+
createMovingEntity(t, args) {
|
|
117
|
+
return t.archetypes.MovingEntity.insert(args);
|
|
118
|
+
},
|
|
119
|
+
updatePosition(t, args) {
|
|
120
|
+
t.update(args.entity, { position: args.position });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
const extendedDatabase = database.extend(extensionPlugin);
|
|
125
|
+
// Verify original transaction still exists
|
|
126
|
+
const staticEntity = extendedDatabase.transactions.createPositionEntity({
|
|
127
|
+
position: { x: 1, y: 2, z: 3 },
|
|
128
|
+
});
|
|
129
|
+
expect(staticEntity).toBeDefined();
|
|
130
|
+
expect(typeof staticEntity).toBe("number");
|
|
131
|
+
// Verify new transaction exists and works
|
|
132
|
+
const movingEntity = extendedDatabase.transactions.createMovingEntity({
|
|
133
|
+
position: { x: 10, y: 20, z: 30 },
|
|
134
|
+
velocity: { x: 1, y: 2, z: 3 },
|
|
135
|
+
});
|
|
136
|
+
expect(movingEntity).toBeDefined();
|
|
137
|
+
expect(typeof movingEntity).toBe("number");
|
|
138
|
+
const movingEntityData = extendedDatabase.read(movingEntity);
|
|
139
|
+
expect(movingEntityData).toEqual({
|
|
140
|
+
id: movingEntity,
|
|
141
|
+
position: { x: 10, y: 20, z: 30 },
|
|
142
|
+
velocity: { x: 1, y: 2, z: 3 },
|
|
143
|
+
});
|
|
144
|
+
// Verify extended updatePosition transaction works
|
|
145
|
+
extendedDatabase.transactions.updatePosition({
|
|
146
|
+
entity: movingEntity,
|
|
147
|
+
position: { x: 15, y: 25, z: 35 },
|
|
148
|
+
});
|
|
149
|
+
const updatedEntityData = extendedDatabase.read(movingEntity);
|
|
150
|
+
expect(updatedEntityData?.position).toEqual({ x: 15, y: 25, z: 35 });
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=create-database-from-schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-database-from-schema.test.js","sourceRoot":"","sources":["../../../../src/ecs/database/public/create-database-from-schema.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,22 @@
|
|
|
1
1
|
import { ResourceComponents } from "../../store/resource-components.js";
|
|
2
2
|
import { Store } from "../../store/index.js";
|
|
3
|
-
import
|
|
3
|
+
import { Database } from "../database.js";
|
|
4
|
+
import type { ToActionFunctions, ActionDeclarations } from "../../store/action-functions.js";
|
|
4
5
|
import { StringKeyof } from "../../../types/types.js";
|
|
5
6
|
import { Components } from "../../store/components.js";
|
|
6
7
|
import { ArchetypeComponents } from "../../store/archetype-components.js";
|
|
7
|
-
|
|
8
|
+
import { ComponentSchemas } from "../../component-schemas.js";
|
|
9
|
+
import { ResourceSchemas } from "../../resource-schemas.js";
|
|
10
|
+
import { FromSchemas } from "../../../schema/from-schemas.js";
|
|
11
|
+
export declare function createDatabase(): Database<{}, {}, {}, {}, never>;
|
|
12
|
+
export declare function createDatabase<CS extends ComponentSchemas, RS extends ResourceSchemas, A extends ArchetypeComponents<StringKeyof<CS>>, TD extends ActionDeclarations<FromSchemas<CS>, FromSchemas<RS>, A>, S extends string>(plugin: Database.Plugin<CS, RS, A, TD, S>): Database<FromSchemas<CS>, FromSchemas<RS>, A, ToActionFunctions<TD>, S>;
|
|
13
|
+
export declare function createDatabase<const C extends Components, const R extends ResourceComponents, const A extends ArchetypeComponents<StringKeyof<C>>, const TD extends ActionDeclarations<C, R, A>>(store: Store<C, R, A>, transactionDeclarations: TD): Database<C, R, A, ToActionFunctions<TD>, never>;
|
|
14
|
+
export declare function createDatabase<const C extends Components, const R extends ResourceComponents, const A extends ArchetypeComponents<StringKeyof<C>>, const TD extends ActionDeclarations<C, R, A>, const S extends string>(store: Store<C, R, A>, transactionDeclarations: TD, systemDeclarations: {
|
|
15
|
+
readonly [K in S]: {
|
|
16
|
+
readonly create: (db: Database<C, R, A, ToActionFunctions<TD>, S>) => () => void | Promise<void>;
|
|
17
|
+
readonly schedule?: {
|
|
18
|
+
readonly before?: readonly S[];
|
|
19
|
+
readonly after?: readonly S[];
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
}): Database<C, R, A, ToActionFunctions<TD>, S>;
|
|
@@ -18,113 +18,317 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
18
18
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
19
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
20
|
SOFTWARE.*/
|
|
21
|
+
import { Store } from "../../store/index.js";
|
|
22
|
+
import { Database } from "../database.js";
|
|
21
23
|
import { isPromise } from "../../../internal/promise/is-promise.js";
|
|
22
24
|
import { isAsyncGenerator } from "../../../internal/async-generator/is-async-generator.js";
|
|
23
25
|
import { createReconcilingDatabase } from "../reconciling/create-reconciling-database.js";
|
|
24
|
-
|
|
26
|
+
import { calculateSystemOrder } from "../calculate-system-order.js";
|
|
27
|
+
export function createDatabase(storeOrPlugin, transactionDeclarations, systemDeclarations) {
|
|
28
|
+
if (!storeOrPlugin) {
|
|
29
|
+
return createDatabaseFromPlugin(Database.Plugin.create({}));
|
|
30
|
+
}
|
|
31
|
+
if (systemDeclarations) {
|
|
32
|
+
return createDatabaseFromStoreTransactionsAndSystems(storeOrPlugin, transactionDeclarations, systemDeclarations);
|
|
33
|
+
}
|
|
34
|
+
if (transactionDeclarations) {
|
|
35
|
+
return createDatabaseFromStoreAndTransactions(storeOrPlugin, transactionDeclarations);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// It's a Plugin
|
|
39
|
+
return createDatabaseFromPlugin(storeOrPlugin);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function createDatabaseFromPlugin(plugin) {
|
|
43
|
+
const systems = plugin.systems ?? {};
|
|
44
|
+
const transactions = plugin.transactions ?? {};
|
|
45
|
+
const storeSchema = {
|
|
46
|
+
components: plugin.components ?? {},
|
|
47
|
+
resources: plugin.resources ?? {},
|
|
48
|
+
archetypes: plugin.archetypes ?? {},
|
|
49
|
+
};
|
|
50
|
+
return createDatabase(Store.create(storeSchema), transactions, systems);
|
|
51
|
+
}
|
|
52
|
+
function createDatabaseFromStoreTransactionsAndSystems(store, transactionDeclarations, systemDeclarations) {
|
|
25
53
|
const reconcilingDatabase = createReconcilingDatabase(store, transactionDeclarations);
|
|
26
54
|
let nextTransactionId = 1;
|
|
27
55
|
const applyEnvelope = (envelope) => reconcilingDatabase.apply(envelope);
|
|
56
|
+
const createTransactionWrapper = (name) => (args) => {
|
|
57
|
+
const transactionId = nextTransactionId;
|
|
58
|
+
nextTransactionId += 1;
|
|
59
|
+
let hasTransient = false;
|
|
60
|
+
const applyTransient = (payload) => {
|
|
61
|
+
hasTransient = true;
|
|
62
|
+
const timestamp = Date.now();
|
|
63
|
+
applyEnvelope({
|
|
64
|
+
id: transactionId,
|
|
65
|
+
name,
|
|
66
|
+
args: payload,
|
|
67
|
+
time: -timestamp,
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
const applyCommit = (payload) => {
|
|
71
|
+
const timestamp = Date.now();
|
|
72
|
+
const result = applyEnvelope({
|
|
73
|
+
id: transactionId,
|
|
74
|
+
name,
|
|
75
|
+
args: payload,
|
|
76
|
+
time: timestamp,
|
|
77
|
+
});
|
|
78
|
+
hasTransient = false;
|
|
79
|
+
return result;
|
|
80
|
+
};
|
|
81
|
+
const cancelPending = () => {
|
|
82
|
+
if (!hasTransient) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
applyEnvelope({
|
|
86
|
+
id: transactionId,
|
|
87
|
+
name,
|
|
88
|
+
args: undefined,
|
|
89
|
+
time: 0,
|
|
90
|
+
});
|
|
91
|
+
hasTransient = false;
|
|
92
|
+
};
|
|
93
|
+
if (typeof args === "function") {
|
|
94
|
+
const asyncArgsProvider = args;
|
|
95
|
+
const providerResult = asyncArgsProvider();
|
|
96
|
+
if (isAsyncGenerator(providerResult)) {
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
(async () => {
|
|
99
|
+
let lastArgs;
|
|
100
|
+
try {
|
|
101
|
+
let iteration = await providerResult.next();
|
|
102
|
+
while (!iteration.done) {
|
|
103
|
+
lastArgs = iteration.value;
|
|
104
|
+
applyTransient(iteration.value);
|
|
105
|
+
iteration = await providerResult.next();
|
|
106
|
+
}
|
|
107
|
+
const finalArgs = iteration.value !== undefined ? iteration.value : lastArgs;
|
|
108
|
+
if (finalArgs !== undefined) {
|
|
109
|
+
const commitResult = applyCommit(finalArgs);
|
|
110
|
+
resolve(commitResult?.value);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
cancelPending();
|
|
114
|
+
resolve(undefined);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
cancelPending();
|
|
119
|
+
reject(error);
|
|
120
|
+
}
|
|
121
|
+
})();
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
if (isPromise(providerResult)) {
|
|
125
|
+
return (async () => {
|
|
126
|
+
try {
|
|
127
|
+
const resolved = await providerResult;
|
|
128
|
+
const commitResult = applyCommit(resolved);
|
|
129
|
+
return commitResult?.value;
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
cancelPending();
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
})();
|
|
136
|
+
}
|
|
137
|
+
const syncResult = applyCommit(providerResult);
|
|
138
|
+
return syncResult?.value;
|
|
139
|
+
}
|
|
140
|
+
const result = applyCommit(args);
|
|
141
|
+
return result?.value;
|
|
142
|
+
};
|
|
28
143
|
const transactions = {
|
|
29
144
|
serviceName: "ecs-database-transactions-service",
|
|
30
145
|
};
|
|
146
|
+
// Create unwrapped actions that execute directly on the store
|
|
147
|
+
const actions = {};
|
|
31
148
|
for (const name of Object.keys(transactionDeclarations)) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
149
|
+
actions[name] = transactionDeclarations[name].bind(null, store);
|
|
150
|
+
}
|
|
151
|
+
// Assign unwrapped actions to store
|
|
152
|
+
store.actions = actions;
|
|
153
|
+
const addTransactionWrappers = (transactionDecls) => {
|
|
154
|
+
for (const name of Object.keys(transactionDecls)) {
|
|
155
|
+
transactions[name] = createTransactionWrapper(name);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
addTransactionWrappers(transactionDeclarations);
|
|
159
|
+
// Calculate system execution order
|
|
160
|
+
const systemOrder = calculateSystemOrder(systemDeclarations);
|
|
161
|
+
// Create partial database for system initialization (two-phase)
|
|
162
|
+
const partialDatabase = {
|
|
163
|
+
serviceName: "ecs-database-service",
|
|
164
|
+
...reconcilingDatabase,
|
|
165
|
+
store: store,
|
|
166
|
+
transactions,
|
|
167
|
+
system: {
|
|
168
|
+
functions: {}, // Empty initially
|
|
169
|
+
order: systemOrder
|
|
170
|
+
},
|
|
171
|
+
extend: undefined // Will be set later
|
|
172
|
+
};
|
|
173
|
+
// Instantiate system functions with partial database
|
|
174
|
+
const systemFunctions = {};
|
|
175
|
+
for (const name in systemDeclarations) {
|
|
176
|
+
systemFunctions[name] = systemDeclarations[name].create(partialDatabase);
|
|
177
|
+
}
|
|
178
|
+
partialDatabase.system.functions = systemFunctions;
|
|
179
|
+
const extend = (plugin) => {
|
|
180
|
+
// Delegate to reconcilingDatabase which handles store/transactionalStore extension
|
|
181
|
+
reconcilingDatabase.extend(plugin);
|
|
182
|
+
const pluginTransactions = plugin.transactions ?? {};
|
|
183
|
+
// Add transaction wrappers for the new transactions
|
|
184
|
+
addTransactionWrappers(pluginTransactions);
|
|
185
|
+
// Add unwrapped actions to store.actions
|
|
186
|
+
for (const name of Object.keys(pluginTransactions)) {
|
|
187
|
+
store.actions[name] = pluginTransactions[name].bind(null, store);
|
|
188
|
+
}
|
|
189
|
+
// If plugin has new systems, we need to recreate the database with merged systems
|
|
190
|
+
if (plugin.systems && Object.keys(plugin.systems).length > 0) {
|
|
191
|
+
// Merge system declarations
|
|
192
|
+
const mergedSystemDeclarations = {
|
|
193
|
+
...systemDeclarations,
|
|
194
|
+
...plugin.systems
|
|
68
195
|
};
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
196
|
+
// Create new database with merged systems
|
|
197
|
+
return createDatabaseFromStoreTransactionsAndSystems(store, { ...transactionDeclarations, ...pluginTransactions }, mergedSystemDeclarations);
|
|
198
|
+
}
|
|
199
|
+
// No new systems, return the same database instance
|
|
200
|
+
return partialDatabase;
|
|
201
|
+
};
|
|
202
|
+
partialDatabase.extend = extend;
|
|
203
|
+
return partialDatabase;
|
|
204
|
+
}
|
|
205
|
+
function createDatabaseFromStoreAndTransactions(store, transactionDeclarations) {
|
|
206
|
+
const reconcilingDatabase = createReconcilingDatabase(store, transactionDeclarations);
|
|
207
|
+
let nextTransactionId = 1;
|
|
208
|
+
const applyEnvelope = (envelope) => reconcilingDatabase.apply(envelope);
|
|
209
|
+
const createTransactionWrapper = (name) => (args) => {
|
|
210
|
+
const transactionId = nextTransactionId;
|
|
211
|
+
nextTransactionId += 1;
|
|
212
|
+
let hasTransient = false;
|
|
213
|
+
const applyTransient = (payload) => {
|
|
214
|
+
hasTransient = true;
|
|
215
|
+
const timestamp = Date.now();
|
|
216
|
+
applyEnvelope({
|
|
217
|
+
id: transactionId,
|
|
218
|
+
name,
|
|
219
|
+
args: payload,
|
|
220
|
+
time: -timestamp,
|
|
221
|
+
});
|
|
222
|
+
};
|
|
223
|
+
const applyCommit = (payload) => {
|
|
224
|
+
const timestamp = Date.now();
|
|
225
|
+
const result = applyEnvelope({
|
|
226
|
+
id: transactionId,
|
|
227
|
+
name,
|
|
228
|
+
args: payload,
|
|
229
|
+
time: timestamp,
|
|
230
|
+
});
|
|
231
|
+
hasTransient = false;
|
|
232
|
+
return result;
|
|
233
|
+
};
|
|
234
|
+
const cancelPending = () => {
|
|
235
|
+
if (!hasTransient) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
applyEnvelope({
|
|
239
|
+
id: transactionId,
|
|
240
|
+
name,
|
|
241
|
+
args: undefined,
|
|
242
|
+
time: 0,
|
|
243
|
+
});
|
|
244
|
+
hasTransient = false;
|
|
245
|
+
};
|
|
246
|
+
if (typeof args === "function") {
|
|
247
|
+
const asyncArgsProvider = args;
|
|
248
|
+
const providerResult = asyncArgsProvider();
|
|
249
|
+
if (isAsyncGenerator(providerResult)) {
|
|
250
|
+
return new Promise((resolve, reject) => {
|
|
251
|
+
(async () => {
|
|
252
|
+
let lastArgs;
|
|
253
|
+
try {
|
|
254
|
+
let iteration = await providerResult.next();
|
|
255
|
+
while (!iteration.done) {
|
|
256
|
+
lastArgs = iteration.value;
|
|
257
|
+
applyTransient(iteration.value);
|
|
258
|
+
iteration = await providerResult.next();
|
|
259
|
+
}
|
|
260
|
+
const finalArgs = iteration.value !== undefined ? iteration.value : lastArgs;
|
|
261
|
+
if (finalArgs !== undefined) {
|
|
262
|
+
const commitResult = applyCommit(finalArgs);
|
|
263
|
+
resolve(commitResult?.value);
|
|
92
264
|
}
|
|
93
|
-
|
|
265
|
+
else {
|
|
94
266
|
cancelPending();
|
|
95
|
-
|
|
267
|
+
resolve(undefined);
|
|
96
268
|
}
|
|
97
|
-
})();
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
if (isPromise(providerResult)) {
|
|
101
|
-
return (async () => {
|
|
102
|
-
try {
|
|
103
|
-
const resolved = await providerResult;
|
|
104
|
-
const commitResult = applyCommit(resolved);
|
|
105
|
-
return commitResult?.value;
|
|
106
269
|
}
|
|
107
270
|
catch (error) {
|
|
108
271
|
cancelPending();
|
|
109
|
-
|
|
272
|
+
reject(error);
|
|
110
273
|
}
|
|
111
274
|
})();
|
|
112
|
-
}
|
|
113
|
-
const syncResult = applyCommit(providerResult);
|
|
114
|
-
return syncResult?.value;
|
|
275
|
+
});
|
|
115
276
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
277
|
+
if (isPromise(providerResult)) {
|
|
278
|
+
return (async () => {
|
|
279
|
+
try {
|
|
280
|
+
const resolved = await providerResult;
|
|
281
|
+
const commitResult = applyCommit(resolved);
|
|
282
|
+
return commitResult?.value;
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
cancelPending();
|
|
286
|
+
throw error;
|
|
287
|
+
}
|
|
288
|
+
})();
|
|
289
|
+
}
|
|
290
|
+
const syncResult = applyCommit(providerResult);
|
|
291
|
+
return syncResult?.value;
|
|
292
|
+
}
|
|
293
|
+
const result = applyCommit(args);
|
|
294
|
+
return result?.value;
|
|
295
|
+
};
|
|
296
|
+
const transactions = {
|
|
297
|
+
serviceName: "ecs-database-transactions-service",
|
|
298
|
+
};
|
|
299
|
+
// Create unwrapped actions that execute directly on the store
|
|
300
|
+
const actions = {};
|
|
301
|
+
for (const name of Object.keys(transactionDeclarations)) {
|
|
302
|
+
actions[name] = transactionDeclarations[name].bind(null, store);
|
|
119
303
|
}
|
|
304
|
+
// Assign unwrapped actions to store
|
|
305
|
+
store.actions = actions;
|
|
306
|
+
const addTransactionWrappers = (transactionDecls) => {
|
|
307
|
+
for (const name of Object.keys(transactionDecls)) {
|
|
308
|
+
transactions[name] = createTransactionWrapper(name);
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
addTransactionWrappers(transactionDeclarations);
|
|
120
312
|
const extend = (schema) => {
|
|
121
|
-
store
|
|
313
|
+
// Delegate to reconcilingDatabase which handles store/transactionalStore extension
|
|
314
|
+
reconcilingDatabase.extend(schema);
|
|
315
|
+
// Add transaction wrappers for the new transactions
|
|
316
|
+
addTransactionWrappers(schema.transactions);
|
|
317
|
+
// Add unwrapped actions to store.actions
|
|
318
|
+
for (const name of Object.keys(schema.transactions)) {
|
|
319
|
+
store.actions[name] = schema.transactions[name].bind(null, store);
|
|
320
|
+
}
|
|
122
321
|
return database;
|
|
123
322
|
};
|
|
124
323
|
const database = {
|
|
125
324
|
serviceName: "ecs-database-service",
|
|
126
325
|
...reconcilingDatabase,
|
|
326
|
+
store: store,
|
|
127
327
|
transactions,
|
|
328
|
+
system: {
|
|
329
|
+
functions: {},
|
|
330
|
+
order: []
|
|
331
|
+
},
|
|
128
332
|
extend,
|
|
129
333
|
};
|
|
130
334
|
return database;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-database.js","sourceRoot":"","sources":["../../../../src/ecs/database/public/create-database.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;WAmBW;
|
|
1
|
+
{"version":3,"file":"create-database.js","sourceRoot":"","sources":["../../../../src/ecs/database/public/create-database.ts"],"names":[],"mappings":"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"}
|