@adobe/data 0.9.53 → 0.9.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +1 -1
  2. package/dist/cache/blob-store.browser.test.d.ts +1 -0
  3. package/dist/cache/blob-store.browser.test.js +122 -0
  4. package/dist/cache/blob-store.browser.test.js.map +1 -0
  5. package/dist/cache/data-cache.browser.test.d.ts +1 -0
  6. package/dist/cache/data-cache.browser.test.js +41 -0
  7. package/dist/cache/data-cache.browser.test.js.map +1 -0
  8. package/dist/cache/data-cache.js +26 -6
  9. package/dist/cache/data-cache.js.map +1 -1
  10. package/dist/cache/data-cache.test.js +12 -1
  11. package/dist/cache/data-cache.test.js.map +1 -1
  12. package/dist/cache/expiring-data-cache.browser.test.d.ts +1 -0
  13. package/dist/cache/expiring-data-cache.browser.test.js +42 -0
  14. package/dist/cache/expiring-data-cache.browser.test.js.map +1 -0
  15. package/dist/cache/functions/functions.browser.test.d.ts +1 -0
  16. package/dist/cache/functions/functions.browser.test.js +72 -0
  17. package/dist/cache/functions/functions.browser.test.js.map +1 -0
  18. package/dist/cache/managed-array.js +72 -68
  19. package/dist/cache/managed-array.js.map +1 -1
  20. package/dist/ecs/archetype/create-archetype.js +131 -7
  21. package/dist/ecs/archetype/create-archetype.js.map +1 -1
  22. package/dist/ecs/database/public/create-database-scheduler.browser.test.d.ts +1 -0
  23. package/dist/ecs/database/public/create-database-scheduler.browser.test.js +67 -0
  24. package/dist/ecs/database/public/create-database-scheduler.browser.test.js.map +1 -0
  25. package/dist/ecs/database/transactional-store/coalesce-actions.js +15 -41
  26. package/dist/ecs/database/transactional-store/coalesce-actions.js.map +1 -1
  27. package/dist/ecs/database/transactional-store/coalesce-actions.test.js +30 -1
  28. package/dist/ecs/database/transactional-store/coalesce-actions.test.js.map +1 -1
  29. package/dist/ecs/persistence-service/create-storage-persistence-service.browser.test.d.ts +1 -0
  30. package/dist/ecs/persistence-service/create-storage-persistence-service.browser.test.js +52 -0
  31. package/dist/ecs/persistence-service/create-storage-persistence-service.browser.test.js.map +1 -0
  32. package/dist/functions/serialization/serialize-to-storage.browser.test.d.ts +1 -0
  33. package/dist/functions/serialization/serialize-to-storage.browser.test.js +161 -0
  34. package/dist/functions/serialization/serialize-to-storage.browser.test.js.map +1 -0
  35. package/dist/math/aabb/face/all.d.ts +2 -0
  36. package/dist/math/aabb/face/all.js +10 -0
  37. package/dist/math/aabb/face/all.js.map +1 -0
  38. package/dist/math/aabb/face/face.d.ts +4 -0
  39. package/dist/math/aabb/face/face.js +3 -0
  40. package/dist/math/aabb/face/face.js.map +1 -0
  41. package/dist/math/aabb/face/from-position.d.ts +9 -0
  42. package/dist/math/aabb/face/from-position.js +32 -0
  43. package/dist/math/aabb/face/from-position.js.map +1 -0
  44. package/dist/math/aabb/face/from-position.test.d.ts +1 -0
  45. package/dist/math/aabb/face/from-position.test.js +21 -0
  46. package/dist/math/aabb/face/from-position.test.js.map +1 -0
  47. package/dist/math/aabb/face/get-adjacent.d.ts +3 -0
  48. package/dist/math/aabb/face/get-adjacent.js +24 -0
  49. package/dist/math/aabb/face/get-adjacent.js.map +1 -0
  50. package/dist/math/aabb/face/get-adjacent.test.d.ts +1 -0
  51. package/dist/math/aabb/face/get-adjacent.test.js +27 -0
  52. package/dist/math/aabb/face/get-adjacent.test.js.map +1 -0
  53. package/dist/math/aabb/face/get-faces.d.ts +3 -0
  54. package/dist/math/aabb/face/get-faces.js +11 -0
  55. package/dist/math/aabb/face/get-faces.js.map +1 -0
  56. package/dist/math/aabb/face/get-faces.test.d.ts +1 -0
  57. package/dist/math/aabb/face/get-faces.test.js +16 -0
  58. package/dist/math/aabb/face/get-faces.test.js.map +1 -0
  59. package/dist/math/aabb/face/get-name.d.ts +3 -0
  60. package/dist/math/aabb/face/get-name.js +7 -0
  61. package/dist/math/aabb/face/get-name.js.map +1 -0
  62. package/dist/math/aabb/face/get-name.test.d.ts +1 -0
  63. package/dist/math/aabb/face/get-name.test.js +13 -0
  64. package/dist/math/aabb/face/get-name.test.js.map +1 -0
  65. package/dist/math/aabb/face/get-normal.d.ts +4 -0
  66. package/dist/math/aabb/face/get-normal.js +11 -0
  67. package/dist/math/aabb/face/get-normal.js.map +1 -0
  68. package/dist/math/aabb/face/get-normal.test.d.ts +1 -0
  69. package/dist/math/aabb/face/get-normal.test.js +13 -0
  70. package/dist/math/aabb/face/get-normal.test.js.map +1 -0
  71. package/dist/math/aabb/face/get-opposite.d.ts +3 -0
  72. package/dist/math/aabb/face/get-opposite.js +27 -0
  73. package/dist/math/aabb/face/get-opposite.js.map +1 -0
  74. package/dist/math/aabb/face/get-opposite.test.d.ts +1 -0
  75. package/dist/math/aabb/face/get-opposite.test.js +20 -0
  76. package/dist/math/aabb/face/get-opposite.test.js.map +1 -0
  77. package/dist/math/aabb/face/internals.d.ts +6 -0
  78. package/dist/math/aabb/face/internals.js +34 -0
  79. package/dist/math/aabb/face/internals.js.map +1 -0
  80. package/dist/math/aabb/face/is-adjacent.d.ts +3 -0
  81. package/dist/math/aabb/face/is-adjacent.js +7 -0
  82. package/dist/math/aabb/face/is-adjacent.js.map +1 -0
  83. package/dist/math/aabb/face/is-adjacent.test.d.ts +1 -0
  84. package/dist/math/aabb/face/is-adjacent.test.js +15 -0
  85. package/dist/math/aabb/face/is-adjacent.test.js.map +1 -0
  86. package/dist/math/aabb/face/is-opposite.d.ts +3 -0
  87. package/dist/math/aabb/face/is-opposite.js +7 -0
  88. package/dist/math/aabb/face/is-opposite.js.map +1 -0
  89. package/dist/math/aabb/face/is-opposite.test.d.ts +1 -0
  90. package/dist/math/aabb/face/is-opposite.test.js +15 -0
  91. package/dist/math/aabb/face/is-opposite.test.js.map +1 -0
  92. package/dist/math/aabb/face/neg-x.d.ts +2 -0
  93. package/dist/math/aabb/face/neg-x.js +4 -0
  94. package/dist/math/aabb/face/neg-x.js.map +1 -0
  95. package/dist/math/aabb/face/neg-y.d.ts +2 -0
  96. package/dist/math/aabb/face/neg-y.js +4 -0
  97. package/dist/math/aabb/face/neg-y.js.map +1 -0
  98. package/dist/math/aabb/face/neg-z.d.ts +2 -0
  99. package/dist/math/aabb/face/neg-z.js +4 -0
  100. package/dist/math/aabb/face/neg-z.js.map +1 -0
  101. package/dist/math/aabb/face/none.d.ts +2 -0
  102. package/dist/math/aabb/face/none.js +4 -0
  103. package/dist/math/aabb/face/none.js.map +1 -0
  104. package/dist/math/aabb/face/pos-x.d.ts +2 -0
  105. package/dist/math/aabb/face/pos-x.js +4 -0
  106. package/dist/math/aabb/face/pos-x.js.map +1 -0
  107. package/dist/math/aabb/face/pos-y.d.ts +2 -0
  108. package/dist/math/aabb/face/pos-y.js +4 -0
  109. package/dist/math/aabb/face/pos-y.js.map +1 -0
  110. package/dist/math/aabb/face/pos-z.d.ts +2 -0
  111. package/dist/math/aabb/face/pos-z.js +4 -0
  112. package/dist/math/aabb/face/pos-z.js.map +1 -0
  113. package/dist/math/aabb/face/public.d.ts +16 -1
  114. package/dist/math/aabb/face/public.js +16 -1
  115. package/dist/math/aabb/face/public.js.map +1 -1
  116. package/dist/math/aabb/public.d.ts +1 -1
  117. package/dist/math/aabb/public.js +1 -1
  118. package/dist/math/aabb/public.js.map +1 -1
  119. package/dist/perftest/ecs1-perf.d.ts +54 -0
  120. package/dist/perftest/ecs1-perf.js +214 -0
  121. package/dist/perftest/ecs1-perf.js.map +1 -0
  122. package/dist/perftest/ecs2-perf.d.ts +5 -0
  123. package/dist/perftest/ecs2-perf.js +162 -0
  124. package/dist/perftest/ecs2-perf.js.map +1 -0
  125. package/dist/perftest/index.js +8 -3
  126. package/dist/perftest/index.js.map +1 -1
  127. package/dist/perftest/perf-test.d.ts +7 -0
  128. package/dist/perftest/perf-test.js +69 -7
  129. package/dist/perftest/perf-test.js.map +1 -1
  130. package/dist/perftest/typed-buffer-perf.d.ts +8 -0
  131. package/dist/perftest/typed-buffer-perf.js +133 -0
  132. package/dist/perftest/typed-buffer-perf.js.map +1 -0
  133. package/dist/service/agentic-service/action.d.ts +8 -4
  134. package/dist/service/agentic-service/create.d.ts +5 -1
  135. package/dist/service/agentic-service/create.js +1 -1
  136. package/dist/service/agentic-service/create.js.map +1 -1
  137. package/dist/service/agentic-service/create.test.js +1 -1
  138. package/dist/service/agentic-service/create.test.js.map +1 -1
  139. package/dist/service/agentic-service/create.type-test.js +23 -0
  140. package/dist/service/agentic-service/create.type-test.js.map +1 -1
  141. package/dist/tsconfig.tsbuildinfo +1 -1
  142. package/package.json +2 -2
  143. package/references/data-lit/package.json +1 -1
  144. package/references/data-lit-tictactoe/package.json +1 -1
  145. package/references/data-react/package.json +1 -1
  146. package/references/data-react-hello/package.json +1 -1
  147. package/references/data-react-pixie/package.json +1 -1
@@ -1,17 +1,134 @@
1
1
  // © 2026 Adobe. MIT License. See /LICENSE for details.
2
2
  import * as TABLE from "../../table/index.js";
3
- export const createArchetype = (components, id, entityLocationTable) => {
4
- const table = TABLE.createTable(components);
5
- const createEntity = (rowData) => {
6
- // add the row (excluding entity id)
3
+ import { ensureCapacity } from "../../table/ensure-capacity.js";
4
+ // ───────────────────────────────────────────────────────────────────────────
5
+ // Specialized insert function per archetype.
6
+ //
7
+ // Why: archetype.insert(rowData) is the hottest write path in the ECS. CPU
8
+ // profiling showed the previous implementation spending ~30 % self-time
9
+ // in the createEntity closure body and another ~10 % in addRow's
10
+ // `for (name in rowData)` loop, on what is logically a sequence of
11
+ // typed-array stores. V8 wasn't inlining because:
12
+ //
13
+ // (a) addRow iterated `rowData` keys with `for...in`, then did a
14
+ // polymorphic `cols[name]` lookup per field;
15
+ // (b) the column reference chain `archetype.columns.id.set(...)` was
16
+ // three property loads + a method call, all on closure-captured
17
+ // `archetype`;
18
+ // (c) entityLocationTable.create(...) took an `{ archetype, row }`
19
+ // object literal, allocated fresh per insert.
20
+ //
21
+ // What we do instead:
22
+ // 1. At archetype-creation time, build the per-component column refs
23
+ // once and bake them into a code-generated insert function as
24
+ // closure constants. The hot path then reads `_color.set(row, …)`
25
+ // where `_color` is a const slot the JIT can fold and inline —
26
+ // identical machine code to a hand-written straight-line insert.
27
+ // 2. The generated body unrolls every column.set call — no `for...in`,
28
+ // no string-keyed lookup, one inlinable typed-array store per
29
+ // component.
30
+ // 3. archetype.rowCount / rowCapacity stay dynamic (we read them off
31
+ // the archetype every call) because they DO change every insert and
32
+ // on grow. The COLUMN REFERENCES are baked because they don't —
33
+ // createTable allocates the column objects once and we never swap
34
+ // them. (TypedBuffer's internal `array` field can grow, but the
35
+ // column object itself is stable.)
36
+ // 4. fromData() Object.assigns over rowCount / rowCapacity / columns
37
+ // when restoring from serialized data. That replaces archetype.columns
38
+ // with the deserialized columns, invalidating the baked refs. We
39
+ // rebuild insertImpl in fromData so the baked refs are always
40
+ // current. In the steady-state hot path (no fromData), the rebuild
41
+ // never runs and the baked refs persist for the archetype's life.
42
+ // 5. SAFE_IDENT gates the codegen: a malformed component name could
43
+ // escape the template into syntax-error or code-injection territory,
44
+ // so any non-identifier name falls back to the generic for-in path.
45
+ // ───────────────────────────────────────────────────────────────────────────
46
+ const SAFE_IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
47
+ const buildSpecializedInsert = (archetypeId, columns, entityLocationTable) => {
48
+ const componentNames = Object.keys(columns);
49
+ if (componentNames.some((n) => !SAFE_IDENT.test(n))) {
50
+ return null;
51
+ }
52
+ // Build two parallel lists in matching order:
53
+ // componentParamNames: parameter names of the *factory* function
54
+ // we generate via `new Function`. Each becomes
55
+ // a local in the factory; the inner `insert`
56
+ // it returns sees them as fast closure
57
+ // constants — V8 treats these like
58
+ // const-folded values rather than property
59
+ // loads.
60
+ // componentParamValues: the actual column refs to hand the factory
61
+ // when we invoke it once per archetype.
62
+ // For non-id columns we prefix the local with `_` to avoid colliding
63
+ // with reserved words or shadowing globals (e.g. a component called
64
+ // `delete`).
65
+ const componentParamNames = [];
66
+ const componentParamValues = [];
67
+ const sets = [];
68
+ for (const name of componentNames) {
69
+ if (name === "id")
70
+ continue;
71
+ const local = `_${name}`;
72
+ componentParamNames.push(local);
73
+ componentParamValues.push(columns[name]);
74
+ sets.push(` ${local}.set(row, rowData.${name});`);
75
+ }
76
+ const factoryBody = `
77
+ // archetypeId, ensureCapacityFn, entityLocationTable, _id, and one
78
+ // _<name> per non-id component are captured here as closure
79
+ // constants. The returned insert function dereferences them as fast
80
+ // local context slots — no property chain on the hot path.
81
+ return function insert(archetype, rowData) {
82
+ // archetype.rowCount / rowCapacity *must* be read from the live
83
+ // archetype every call — both mutate on the hot path (rowCount
84
+ // every insert; rowCapacity on grow).
85
+ if (archetype.rowCapacity <= archetype.rowCount) {
86
+ ensureCapacityFn(archetype, archetype.rowCount + 1);
87
+ }
88
+ const row = archetype.rowCount;
89
+ ${sets.join("\n")}
90
+ // entityLocationTable.create takes an object today — the alloc
91
+ // is small and V8's escape analysis usually scalar-replaces it.
92
+ // If that ever surfaces in a future profile, change the
93
+ // EntityLocationTable.create signature to (archetypeId, row).
94
+ const entity = entityLocationTable.create({ archetype: archetypeId, row });
95
+ _id.set(row, entity);
96
+ archetype.rowCount = row + 1;
97
+ return entity;
98
+ };
99
+ `;
100
+ // eslint-disable-next-line no-new-func
101
+ const factory = new Function("archetypeId", "ensureCapacityFn", "entityLocationTable", "_id", ...componentParamNames, factoryBody);
102
+ return factory(archetypeId, ensureCapacity, entityLocationTable, columns.id, ...componentParamValues);
103
+ };
104
+ // Generic fallback for archetypes whose component names contain
105
+ // non-identifier characters (so we can't safely embed them into generated
106
+ // code). Same logic, just done via property-keyed access on the live
107
+ // archetype.
108
+ const buildGenericInsert = (archetypeId, entityLocationTable) => {
109
+ return (archetype, rowData) => {
7
110
  const row = TABLE.addRow(archetype, rowData);
8
- // create the entity lookup record
9
- const entity = entityLocationTable.create({ archetype: archetype.id, row });
10
- // set the entity id for the row (since it wasn't present in the row data)
111
+ const entity = entityLocationTable.create({ archetype: archetypeId, row });
11
112
  archetype.columns.id.set(row, entity);
12
113
  return entity;
13
114
  };
115
+ };
116
+ export const createArchetype = (components, id, entityLocationTable) => {
117
+ const table = TABLE.createTable(components);
14
118
  const componentSet = new Set(Object.keys(components));
119
+ // Mutable so we can rebuild it after fromData replaces columns. In the
120
+ // hot path (no fromData) this stays the value built once at creation.
121
+ let insertImpl;
122
+ const refreshInsertImpl = () => {
123
+ insertImpl =
124
+ buildSpecializedInsert(id, archetype.columns, entityLocationTable) ??
125
+ buildGenericInsert(id, entityLocationTable);
126
+ };
127
+ const createEntity = (rowData) => {
128
+ // archetype is closure-captured here. By the time createEntity
129
+ // actually runs the const has been initialized.
130
+ return insertImpl(archetype, rowData);
131
+ };
15
132
  const archetype = {
16
133
  id,
17
134
  ...table,
@@ -24,9 +141,16 @@ export const createArchetype = (components, id, entityLocationTable) => {
24
141
  }),
25
142
  fromData: (data) => {
26
143
  Object.assign(archetype, data);
144
+ // Restoring archetype state replaces archetype.columns with the
145
+ // deserialized columns object. Rebuild insertImpl so the baked
146
+ // column refs match the new live columns.
147
+ refreshInsertImpl();
27
148
  // component set cannot be changed by this as the archetype components should be the same.
28
149
  }
29
150
  };
151
+ // Initial build, after `archetype` is in scope so the specialized
152
+ // insert closes over the right columns.
153
+ refreshInsertImpl();
30
154
  return archetype;
31
155
  };
32
156
  //# sourceMappingURL=create-archetype.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-archetype.js","sourceRoot":"","sources":["../../../src/ecs/archetype/create-archetype.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;AAO9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAC3B,UAAa,EACb,EAAU,EACV,mBAAwC,EAC+B,EAAE;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,CAAC,OAA4D,EAAU,EAAE;QAC1F,oCAAoC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,SAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,kCAAkC;QAClC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5E,0EAA0E;QAC1E,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAa,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAClB,CAAC,CAAA;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAEtD,MAAM,SAAS,GAAG;QACd,EAAE;QACF,GAAG,KAAK;QACR,UAAU,EAAE,YAAmC;QAC/C,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACX,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,WAAW,EAAE,SAAS,CAAC,WAAW;SACrC,CAAC;QACF,QAAQ,EAAE,CAAC,IAAa,EAAE,EAAE;YACxB,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC/B,0FAA0F;QAC9F,CAAC;KAC6I,CAAC;IACnJ,OAAO,SAAS,CAAC;AACrB,CAAC,CAAA"}
1
+ {"version":3,"file":"create-archetype.js","sourceRoot":"","sources":["../../../src/ecs/archetype/create-archetype.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
3
+ import { Database } from "../database.js";
4
+ import { scheduler } from "../../plugins/scheduler/scheduler.js";
5
+ describe("createDatabase with scheduler plugin extension", () => {
6
+ beforeEach(() => {
7
+ vi.useFakeTimers();
8
+ });
9
+ afterEach(() => {
10
+ vi.restoreAllMocks();
11
+ });
12
+ it("should have all systems in functions when scheduler executes", async () => {
13
+ // This test reproduces the bug: when a plugin extends scheduler,
14
+ // the scheduler's executeFrame is called immediately during system creation,
15
+ // but db.system.functions is still empty at that point because it's only
16
+ // populated after all systems are created. This causes the error:
17
+ // "db.system.functions[name] is not a function"
18
+ const basePlugin = scheduler;
19
+ const extendedPlugin = Database.Plugin.create({
20
+ extends: basePlugin,
21
+ transactions: {
22
+ stopScheduler(store) {
23
+ store.resources.schedulerState = "disposed";
24
+ }
25
+ },
26
+ systems: {
27
+ testSystem: {
28
+ create: (db) => () => {
29
+ // Test system
30
+ }
31
+ }
32
+ },
33
+ });
34
+ // The bug: Database.create should not throw even though scheduler
35
+ // executeFrame is called during system initialization
36
+ const db = Database.create(extendedPlugin);
37
+ // Verify all systems are in functions (this should pass after fix)
38
+ const allSystemNames = new Set();
39
+ for (const tier of db.system.order) {
40
+ for (const name of tier) {
41
+ allSystemNames.add(name);
42
+ }
43
+ }
44
+ // Check that all systems in order exist in functions
45
+ for (const name of allSystemNames) {
46
+ expect(db.system.functions[name]).toBeDefined();
47
+ expect(typeof db.system.functions[name]).toBe("function");
48
+ }
49
+ // Also verify the reverse: all functions are in the order
50
+ const functionNames = new Set(Object.keys(db.system.functions));
51
+ const orderNames = new Set();
52
+ for (const tier of db.system.order) {
53
+ for (const name of tier) {
54
+ orderNames.add(name);
55
+ }
56
+ }
57
+ // All functions should be in order
58
+ for (const name of functionNames) {
59
+ expect(orderNames.has(name)).toBe(true);
60
+ }
61
+ // Stop the scheduler
62
+ db.transactions.stopScheduler();
63
+ // Advance timers to let any pending RAF callbacks execute
64
+ await vi.runAllTimersAsync();
65
+ });
66
+ });
67
+ //# sourceMappingURL=create-database-scheduler.browser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-database-scheduler.browser.test.js","sourceRoot":"","sources":["../../../../src/ecs/database/public/create-database-scheduler.browser.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAEjE,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC5D,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,EAAE,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC1E,iEAAiE;QACjE,6EAA6E;QAC7E,yEAAyE;QACzE,kEAAkE;QAClE,gDAAgD;QAEhD,MAAM,UAAU,GAAG,SAAS,CAAC;QAE7B,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1C,OAAO,EAAE,UAAU;YACnB,YAAY,EAAE;gBACV,aAAa,CAAC,KAAK;oBACf,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,CAAC;gBAChD,CAAC;aACJ;YACD,OAAO,EAAE;gBACL,UAAU,EAAE;oBACR,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE;wBACjB,cAAc;oBAClB,CAAC;iBACJ;aACJ;SACJ,CAAC,CAAC;QAEH,kEAAkE;QAClE,sDAAsD;QACtD,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE3C,mEAAmE;QACnE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACtB,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,qDAAqD;QACrD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAChC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAwC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACpF,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAwC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClG,CAAC;QAED,0DAA0D;QAC1D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACtB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QAED,mCAAmC;QACnC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YAC/B,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,qBAAqB;QACrB,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;QAEhC,0DAA0D;QAC1D,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -18,18 +18,15 @@ export function shouldCoalesceTransactions(previous, current) {
18
18
  export function coalesceWriteOperations(operations) {
19
19
  if (operations.length <= 1)
20
20
  return operations;
21
- // Simple approach: just merge consecutive update operations on the same entity
22
21
  const result = [];
22
+ const deletedEntities = new Set();
23
23
  let i = 0;
24
24
  while (i < operations.length) {
25
25
  const current = operations[i];
26
- // Look ahead to see if we can merge with next operations
27
26
  if (current.type === "update") {
28
27
  const mergedValues = { ...current.values };
29
28
  let j = i + 1;
30
- // Merge consecutive updates on the same entity
31
- while (j < operations.length &&
32
- operations[j].type === "update") {
29
+ while (j < operations.length && operations[j].type === "update") {
33
30
  const nextOp = operations[j];
34
31
  if (nextOp.type === "update" && nextOp.entity === current.entity) {
35
32
  Object.assign(mergedValues, nextOp.values);
@@ -39,49 +36,26 @@ export function coalesceWriteOperations(operations) {
39
36
  break;
40
37
  }
41
38
  }
42
- if (j > i + 1) {
43
- // We merged some operations
44
- result.push({
45
- type: "update",
46
- entity: current.entity,
47
- values: mergedValues
48
- });
49
- i = j;
50
- }
51
- else {
52
- // No merging possible
53
- result.push(current);
54
- i++;
55
- }
39
+ result.push(j > i + 1 ? { type: "update", entity: current.entity, values: mergedValues } : current);
40
+ i = j > i + 1 ? j : i + 1;
56
41
  }
57
- else if (current.type === "insert") {
58
- // Cannot safely merge insert + update since insert doesn't have an entity ID
59
- // to verify the update is on the same entity
42
+ else if (current.type === "delete") {
43
+ deletedEntities.add(current.entity);
60
44
  result.push(current);
61
45
  i++;
62
46
  }
63
47
  else {
64
- // For delete operations, remove any preceding update operations on the same entity
65
- if (current.type === "delete") {
66
- // Remove any preceding update operations on the same entity
67
- const deleteEntity = current.entity;
68
- for (let k = result.length - 1; k >= 0; k--) {
69
- const op = result[k];
70
- if (op.type === "update" && op.entity === deleteEntity) {
71
- result.splice(k, 1);
72
- }
73
- }
74
- // Add the delete operation
75
- result.push(current);
76
- i++;
77
- }
78
- else {
79
- result.push(current);
80
- i++;
81
- }
48
+ result.push(current);
49
+ i++;
82
50
  }
83
51
  }
84
- return result;
52
+ if (deletedEntities.size === 0)
53
+ return result;
54
+ // Single O(N) pass to strip updates for entities that were later deleted.
55
+ // An update-after-delete for the same entity is impossible in this codebase
56
+ // (updateEntity throws "Entity not found" after a delete), so filtering all
57
+ // updates whose entity appears in the delete set is semantics-preserving.
58
+ return result.filter(op => !(op.type === "update" && deletedEntities.has(op.entity)));
85
59
  }
86
60
  /**
87
61
  * Coalesces two adjacent transaction results into a single combined transaction.
@@ -1 +1 @@
1
- {"version":3,"file":"coalesce-actions.js","sourceRoot":"","sources":["../../../../src/ecs/database/transactional-store/coalesce-actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coalesce-actions.js","sourceRoot":"","sources":["../../../../src/ecs/database/transactional-store/coalesce-actions.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  // © 2026 Adobe. MIT License. See /LICENSE for details.
2
2
  import { describe, it, expect } from "vitest";
3
- import { shouldCoalesceTransactions, coalesceTransactions } from "./coalesce-actions.js";
3
+ import { shouldCoalesceTransactions, coalesceTransactions, coalesceWriteOperations } from "./coalesce-actions.js";
4
4
  describe("shouldCoalesceTransactions", () => {
5
5
  it("should return true for actions with same coalesce values", () => {
6
6
  const previous = {
@@ -438,4 +438,33 @@ describe("coalesceTransactions", () => {
438
438
  expect(result.redo[1]).toEqual({ type: "update", entity: 456, values: { position: { y: 2 } } });
439
439
  });
440
440
  });
441
+ describe("coalesceWriteOperations performance", () => {
442
+ it("should run in linear time (not quadratic) for N delete operations", () => {
443
+ // N delete ops produce O(N²) work in the buggy implementation because each
444
+ // delete scans all previously-built results. At N=25_000 the quadratic path
445
+ // takes ~450ms; the linear fix takes <20ms.
446
+ const N = 25_000;
447
+ const ops = Array.from({ length: N }, (_, i) => ({
448
+ type: "delete",
449
+ entity: i,
450
+ }));
451
+ const start = performance.now();
452
+ coalesceWriteOperations(ops);
453
+ const elapsed = performance.now() - start;
454
+ // 100ms budget: well above the linear path (~20ms) but well below the
455
+ // quadratic path (~450ms), making the regression unambiguous.
456
+ expect(elapsed).toBeLessThan(100);
457
+ });
458
+ it("should strip preceding updates for deleted entities", () => {
459
+ const ops = [
460
+ { type: "update", entity: 1, values: { x: 1 } },
461
+ { type: "update", entity: 2, values: { y: 2 } },
462
+ { type: "delete", entity: 1 },
463
+ ];
464
+ const result = coalesceWriteOperations(ops);
465
+ expect(result).toHaveLength(2);
466
+ expect(result[0]).toEqual({ type: "update", entity: 2, values: { y: 2 } });
467
+ expect(result[1]).toEqual({ type: "delete", entity: 1 });
468
+ });
469
+ });
441
470
  //# sourceMappingURL=coalesce-actions.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coalesce-actions.test.js","sourceRoot":"","sources":["../../../../src/ecs/database/transactional-store/coalesce-actions.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coalesce-actions.test.js","sourceRoot":"","sources":["../../../../src/ecs/database/transactional-store/coalesce-actions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
3
+ import { createStoragePersistenceService } from "./create-storage-persistence-service.js";
4
+ import { Database } from "../index.js";
5
+ function createMinimalDatabase() {
6
+ return Database.create(Database.Plugin.create({
7
+ components: {
8
+ n: { type: "number" },
9
+ },
10
+ archetypes: { N: ["n"] },
11
+ transactions: {
12
+ tick(t, _args) {
13
+ t.archetypes.N.insert({ n: 0 });
14
+ },
15
+ },
16
+ }));
17
+ }
18
+ describe("createStoragePersistenceService", () => {
19
+ describe("autoSaveOnChange with rapid transactions", () => {
20
+ beforeEach(() => {
21
+ vi.useFakeTimers();
22
+ });
23
+ afterEach(() => {
24
+ vi.useRealTimers();
25
+ });
26
+ it("given rapid non-transient transactions, invokes save once after debounce window (debounced)", async () => {
27
+ let saveInvokeCount = 0;
28
+ const database = createMinimalDatabase();
29
+ const service = await createStoragePersistenceService({
30
+ database,
31
+ defaultFileId: "test-id",
32
+ autoSaveOnChange: true,
33
+ autoLoadOnStart: false,
34
+ });
35
+ const originalSave = service.save;
36
+ Object.assign(service, {
37
+ save: async (fileId) => {
38
+ saveInvokeCount++;
39
+ return originalSave.call(service, fileId);
40
+ },
41
+ });
42
+ const transactionCount = 5;
43
+ for (let i = 0; i < transactionCount; i++) {
44
+ database.transactions.tick({});
45
+ }
46
+ vi.advanceTimersByTime(350);
47
+ await vi.runAllTimersAsync();
48
+ expect(saveInvokeCount).toBe(1);
49
+ });
50
+ });
51
+ });
52
+ //# sourceMappingURL=create-storage-persistence-service.browser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-storage-persistence-service.browser.test.js","sourceRoot":"","sources":["../../../src/ecs/persistence-service/create-storage-persistence-service.browser.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,yCAAyC,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,SAAS,qBAAqB;IAC1B,OAAO,QAAQ,CAAC,MAAM,CAClB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE;YACR,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SACxB;QACD,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;QACxB,YAAY,EAAE;YACV,IAAI,CAAC,CAAC,EAAE,KAA4B;gBAChC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;SACJ;KACJ,CAAC,CACL,CAAC;AACN,CAAC;AAED,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC7C,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACtD,UAAU,CAAC,GAAG,EAAE;YACZ,EAAE,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,GAAG,EAAE;YACX,EAAE,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;YACzG,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,+BAA+B,CAAC;gBAClD,QAAQ;gBACR,aAAa,EAAE,SAAS;gBACxB,gBAAgB,EAAE,IAAI;gBACtB,eAAe,EAAE,KAAK;aACzB,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;gBACnB,IAAI,EAAE,KAAK,EAAE,MAAe,EAAE,EAAE;oBAC5B,eAAe,EAAE,CAAC;oBAClB,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC9C,CAAC;aACJ,CAAC,CAAC;YAEH,MAAM,gBAAgB,GAAG,CAAC,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,CAAC;YAED,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAE7B,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}