@adobe/data-persistence 0.9.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +258 -0
  3. package/dist/backend/memory-backend.d.ts +6 -0
  4. package/dist/backend/memory-backend.js +92 -0
  5. package/dist/backend/memory-backend.js.map +1 -0
  6. package/dist/backend/memory-backend.test.d.ts +1 -0
  7. package/dist/backend/memory-backend.test.js +7 -0
  8. package/dist/backend/memory-backend.test.js.map +1 -0
  9. package/dist/backend/memory-file.d.ts +7 -0
  10. package/dist/backend/memory-file.js +90 -0
  11. package/dist/backend/memory-file.js.map +1 -0
  12. package/dist/backend/memory-file.test.d.ts +1 -0
  13. package/dist/backend/memory-file.test.js +5 -0
  14. package/dist/backend/memory-file.test.js.map +1 -0
  15. package/dist/backend/persistence-backend.conformance.d.ts +10 -0
  16. package/dist/backend/persistence-backend.conformance.js +104 -0
  17. package/dist/backend/persistence-backend.conformance.js.map +1 -0
  18. package/dist/backend/persistence-backend.d.ts +54 -0
  19. package/dist/backend/persistence-backend.js +3 -0
  20. package/dist/backend/persistence-backend.js.map +1 -0
  21. package/dist/backend/random-access-file.conformance.d.ts +20 -0
  22. package/dist/backend/random-access-file.conformance.js +156 -0
  23. package/dist/backend/random-access-file.conformance.js.map +1 -0
  24. package/dist/backend/random-access-file.d.ts +39 -0
  25. package/dist/backend/random-access-file.js +3 -0
  26. package/dist/backend/random-access-file.js.map +1 -0
  27. package/dist/backend/validate-rel-path.d.ts +14 -0
  28. package/dist/backend/validate-rel-path.js +44 -0
  29. package/dist/backend/validate-rel-path.js.map +1 -0
  30. package/dist/backend/validate-rel-path.test.d.ts +1 -0
  31. package/dist/backend/validate-rel-path.test.js +37 -0
  32. package/dist/backend/validate-rel-path.test.js.map +1 -0
  33. package/dist/browser/browser-worker-bootstrap.d.ts +1 -0
  34. package/dist/browser/browser-worker-bootstrap.js +97 -0
  35. package/dist/browser/browser-worker-bootstrap.js.map +1 -0
  36. package/dist/browser/browser-worker-transport.browser.test.d.ts +1 -0
  37. package/dist/browser/browser-worker-transport.browser.test.js +156 -0
  38. package/dist/browser/browser-worker-transport.browser.test.js.map +1 -0
  39. package/dist/browser/browser-worker-transport.d.ts +33 -0
  40. package/dist/browser/browser-worker-transport.js +120 -0
  41. package/dist/browser/browser-worker-transport.js.map +1 -0
  42. package/dist/browser/create-opfs-provider.d.ts +23 -0
  43. package/dist/browser/create-opfs-provider.js +49 -0
  44. package/dist/browser/create-opfs-provider.js.map +1 -0
  45. package/dist/browser/index.d.ts +6 -0
  46. package/dist/browser/index.js +12 -0
  47. package/dist/browser/index.js.map +1 -0
  48. package/dist/browser/mount-opfs.d.ts +12 -0
  49. package/dist/browser/mount-opfs.js +15 -0
  50. package/dist/browser/mount-opfs.js.map +1 -0
  51. package/dist/browser/opfs-backend-lock.browser.test.d.ts +1 -0
  52. package/dist/browser/opfs-backend-lock.browser.test.js +127 -0
  53. package/dist/browser/opfs-backend-lock.browser.test.js.map +1 -0
  54. package/dist/browser/opfs-backend.d.ts +6 -0
  55. package/dist/browser/opfs-backend.js +162 -0
  56. package/dist/browser/opfs-backend.js.map +1 -0
  57. package/dist/browser/opfs-lock-test-worker.d.ts +1 -0
  58. package/dist/browser/opfs-lock-test-worker.js +50 -0
  59. package/dist/browser/opfs-lock-test-worker.js.map +1 -0
  60. package/dist/browser/opfs-sync-file.d.ts +10 -0
  61. package/dist/browser/opfs-sync-file.js +58 -0
  62. package/dist/browser/opfs-sync-file.js.map +1 -0
  63. package/dist/encoder/create-column-encoder.d.ts +15 -0
  64. package/dist/encoder/create-column-encoder.js +110 -0
  65. package/dist/encoder/create-column-encoder.js.map +1 -0
  66. package/dist/encoder/journal-snapshot-codec.d.ts +21 -0
  67. package/dist/encoder/journal-snapshot-codec.js +103 -0
  68. package/dist/encoder/journal-snapshot-codec.js.map +1 -0
  69. package/dist/encoder/journal-snapshot-codec.test.d.ts +1 -0
  70. package/dist/encoder/journal-snapshot-codec.test.js +96 -0
  71. package/dist/encoder/journal-snapshot-codec.test.js.map +1 -0
  72. package/dist/encoder/types.d.ts +72 -0
  73. package/dist/encoder/types.js +3 -0
  74. package/dist/encoder/types.js.map +1 -0
  75. package/dist/index.d.ts +24 -0
  76. package/dist/index.js +15 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/journal/journal-codec.d.ts +28 -0
  79. package/dist/journal/journal-codec.js +82 -0
  80. package/dist/journal/journal-codec.js.map +1 -0
  81. package/dist/journal/journal-codec.test.d.ts +1 -0
  82. package/dist/journal/journal-codec.test.js +106 -0
  83. package/dist/journal/journal-codec.test.js.map +1 -0
  84. package/dist/journal/journal-entry.d.ts +63 -0
  85. package/dist/journal/journal-entry.js +28 -0
  86. package/dist/journal/journal-entry.js.map +1 -0
  87. package/dist/node/create-node-fs-provider.d.ts +34 -0
  88. package/dist/node/create-node-fs-provider.js +48 -0
  89. package/dist/node/create-node-fs-provider.js.map +1 -0
  90. package/dist/node/index.d.ts +6 -0
  91. package/dist/node/index.js +10 -0
  92. package/dist/node/index.js.map +1 -0
  93. package/dist/node/mount-node-fs.d.ts +12 -0
  94. package/dist/node/mount-node-fs.js +15 -0
  95. package/dist/node/mount-node-fs.js.map +1 -0
  96. package/dist/node/node-fs-backend-lock.node.test.d.ts +1 -0
  97. package/dist/node/node-fs-backend-lock.node.test.js +160 -0
  98. package/dist/node/node-fs-backend-lock.node.test.js.map +1 -0
  99. package/dist/node/node-fs-backend.d.ts +21 -0
  100. package/dist/node/node-fs-backend.js +186 -0
  101. package/dist/node/node-fs-backend.js.map +1 -0
  102. package/dist/node/node-fs-backend.node.test.d.ts +1 -0
  103. package/dist/node/node-fs-backend.node.test.js +17 -0
  104. package/dist/node/node-fs-backend.node.test.js.map +1 -0
  105. package/dist/node/node-fs-file.d.ts +6 -0
  106. package/dist/node/node-fs-file.js +57 -0
  107. package/dist/node/node-fs-file.js.map +1 -0
  108. package/dist/node/node-fs-file.node.test.d.ts +1 -0
  109. package/dist/node/node-fs-file.node.test.js +13 -0
  110. package/dist/node/node-fs-file.node.test.js.map +1 -0
  111. package/dist/node/node-fs-provider.node.test.d.ts +1 -0
  112. package/dist/node/node-fs-provider.node.test.js +119 -0
  113. package/dist/node/node-fs-provider.node.test.js.map +1 -0
  114. package/dist/node/node-worker-bootstrap.d.ts +1 -0
  115. package/dist/node/node-worker-bootstrap.js +104 -0
  116. package/dist/node/node-worker-bootstrap.js.map +1 -0
  117. package/dist/node/node-worker-transport.d.ts +27 -0
  118. package/dist/node/node-worker-transport.js +152 -0
  119. package/dist/node/node-worker-transport.js.map +1 -0
  120. package/dist/node/node-worker-transport.node.test.d.ts +1 -0
  121. package/dist/node/node-worker-transport.node.test.js +147 -0
  122. package/dist/node/node-worker-transport.node.test.js.map +1 -0
  123. package/dist/perftest/perf-harness.d.ts +74 -0
  124. package/dist/perftest/perf-harness.js +147 -0
  125. package/dist/perftest/perf-harness.js.map +1 -0
  126. package/dist/perftest/persistence-perf.d.ts +2 -0
  127. package/dist/perftest/persistence-perf.js +290 -0
  128. package/dist/perftest/persistence-perf.js.map +1 -0
  129. package/dist/perftest/run.d.ts +1 -0
  130. package/dist/perftest/run.js +28 -0
  131. package/dist/perftest/run.js.map +1 -0
  132. package/dist/provider/create-memory-provider.d.ts +16 -0
  133. package/dist/provider/create-memory-provider.js +44 -0
  134. package/dist/provider/create-memory-provider.js.map +1 -0
  135. package/dist/provider/mount.d.ts +20 -0
  136. package/dist/provider/mount.js +20 -0
  137. package/dist/provider/mount.js.map +1 -0
  138. package/dist/provider/persistence-provider.d.ts +63 -0
  139. package/dist/provider/persistence-provider.js +3 -0
  140. package/dist/provider/persistence-provider.js.map +1 -0
  141. package/dist/provider/persistence-provider.test.d.ts +9 -0
  142. package/dist/provider/persistence-provider.test.js +139 -0
  143. package/dist/provider/persistence-provider.test.js.map +1 -0
  144. package/dist/service/component-nonpersistent-durability.test.d.ts +1 -0
  145. package/dist/service/component-nonpersistent-durability.test.js +57 -0
  146. package/dist/service/component-nonpersistent-durability.test.js.map +1 -0
  147. package/dist/service/create-incremental-persistence-service.d.ts +7 -0
  148. package/dist/service/create-incremental-persistence-service.js +960 -0
  149. package/dist/service/create-incremental-persistence-service.js.map +1 -0
  150. package/dist/service/create-worker-persistence-service.d.ts +1 -0
  151. package/dist/service/create-worker-persistence-service.js +7 -0
  152. package/dist/service/create-worker-persistence-service.js.map +1 -0
  153. package/dist/service/create-worker-persistence-service.test.d.ts +1 -0
  154. package/dist/service/create-worker-persistence-service.test.js +291 -0
  155. package/dist/service/create-worker-persistence-service.test.js.map +1 -0
  156. package/dist/service/entity-location-cache.d.ts +15 -0
  157. package/dist/service/entity-location-cache.js +75 -0
  158. package/dist/service/entity-location-cache.js.map +1 -0
  159. package/dist/service/entity-location-density.test.d.ts +1 -0
  160. package/dist/service/entity-location-density.test.js +42 -0
  161. package/dist/service/entity-location-density.test.js.map +1 -0
  162. package/dist/service/incremental-persistence-service.d.ts +57 -0
  163. package/dist/service/incremental-persistence-service.js +3 -0
  164. package/dist/service/incremental-persistence-service.js.map +1 -0
  165. package/dist/service/intermediate-relocation-durability.test.d.ts +1 -0
  166. package/dist/service/intermediate-relocation-durability.test.js +89 -0
  167. package/dist/service/intermediate-relocation-durability.test.js.map +1 -0
  168. package/dist/service/internal-access.d.ts +34 -0
  169. package/dist/service/internal-access.js +43 -0
  170. package/dist/service/internal-access.js.map +1 -0
  171. package/dist/service/journal-replay.test.d.ts +1 -0
  172. package/dist/service/journal-replay.test.js +424 -0
  173. package/dist/service/journal-replay.test.js.map +1 -0
  174. package/dist/service/journal-storage-durability.test.d.ts +1 -0
  175. package/dist/service/journal-storage-durability.test.js +171 -0
  176. package/dist/service/journal-storage-durability.test.js.map +1 -0
  177. package/dist/service/load-roundtrip.test.d.ts +1 -0
  178. package/dist/service/load-roundtrip.test.js +224 -0
  179. package/dist/service/load-roundtrip.test.js.map +1 -0
  180. package/dist/service/persistence-complexity.test.d.ts +1 -0
  181. package/dist/service/persistence-complexity.test.js +275 -0
  182. package/dist/service/persistence-complexity.test.js.map +1 -0
  183. package/dist/service/worker-persistence-service.d.ts +24 -0
  184. package/dist/service/worker-persistence-service.js +8 -0
  185. package/dist/service/worker-persistence-service.js.map +1 -0
  186. package/dist/transport/inprocess-transport.d.ts +15 -0
  187. package/dist/transport/inprocess-transport.js +64 -0
  188. package/dist/transport/inprocess-transport.js.map +1 -0
  189. package/dist/transport/inprocess-transport.test.d.ts +1 -0
  190. package/dist/transport/inprocess-transport.test.js +100 -0
  191. package/dist/transport/inprocess-transport.test.js.map +1 -0
  192. package/dist/transport/router.d.ts +12 -0
  193. package/dist/transport/router.js +146 -0
  194. package/dist/transport/router.js.map +1 -0
  195. package/dist/transport/transport.d.ts +105 -0
  196. package/dist/transport/transport.js +3 -0
  197. package/dist/transport/transport.js.map +1 -0
  198. package/package.json +59 -0
@@ -0,0 +1,171 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ //
3
+ // RED-then-GREEN durability tests for journal-storage ("array") columns.
4
+ //
5
+ // The bug being closed: "array" typed components have no snapshot file —
6
+ // their values ride in journal entries only. When a checkpoint runs it
7
+ // truncates the journal, permanently losing any value that was last
8
+ // written before the checkpoint. These tests expose the hole first
9
+ // (they must FAIL before the fix lands) then pass once the fix is in.
10
+ import { Database } from "@adobe/data/ecs";
11
+ import { F32 } from "@adobe/data/math";
12
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
13
+ import { createMemoryBackend } from "../backend/memory-backend.js";
14
+ import { createWorkerPersistenceService } from "./create-worker-persistence-service.js";
15
+ // Schema with both a fixed-stride column (mass: F32) and a variable-length
16
+ // "array" column (tags: string[]). The tags column uses the "array" typed
17
+ // buffer, which is what JournalColumnEncoder handles.
18
+ const tagsPlugin = Database.Plugin.create({
19
+ components: {
20
+ mass: F32.schema,
21
+ tags: {
22
+ type: "array",
23
+ items: { type: "string" },
24
+ default: [],
25
+ },
26
+ },
27
+ archetypes: {
28
+ Item: ["mass", "tags"],
29
+ },
30
+ transactions: {
31
+ spawn(t, args) {
32
+ return t.archetypes.Item.insert({
33
+ mass: args.mass,
34
+ tags: args.tags,
35
+ });
36
+ },
37
+ updateTags(t, args) {
38
+ t.update(args.entity, { tags: args.tags });
39
+ },
40
+ },
41
+ });
42
+ const makeBackend = createMemoryBackend;
43
+ const noCheckpoint = { everyNTransactions: 0, idleMs: 0 };
44
+ describe("journal-storage column durability", () => {
45
+ let backend;
46
+ beforeEach(() => {
47
+ backend = makeBackend();
48
+ });
49
+ afterEach(async () => {
50
+ // nothing to clean up for memory backend
51
+ });
52
+ it("array column value survives save → checkpoint → dispose → load", async () => {
53
+ const db1 = Database.create(tagsPlugin);
54
+ const svc1 = await createWorkerPersistenceService({
55
+ database: db1,
56
+ backend,
57
+ checkpoint: noCheckpoint,
58
+ });
59
+ const entity = db1.transactions.spawn({ mass: 1.5, tags: ["alpha", "beta"] });
60
+ await svc1.flush();
61
+ await svc1.checkpoint();
62
+ await svc1.dispose();
63
+ // Fresh database, same backend → load should recover the tags.
64
+ const db2 = Database.create(tagsPlugin);
65
+ const svc2 = await createWorkerPersistenceService({
66
+ database: db2,
67
+ backend,
68
+ checkpoint: noCheckpoint,
69
+ });
70
+ await svc2.load();
71
+ await svc2.dispose();
72
+ const view = db2.read(entity);
73
+ expect(view).not.toBeNull();
74
+ expect(view.mass).toBe(1.5);
75
+ expect(view.tags).toEqual(["alpha", "beta"]);
76
+ });
77
+ it("array column value written after a checkpoint is recovered via journal replay", async () => {
78
+ // Scenario: a prior checkpoint creates the manifest (so load() can
79
+ // bootstrap). New entities are inserted AFTER the checkpoint and
80
+ // flush()ed to the journal but never checkpointed. On reload the
81
+ // journal replay must recover those post-checkpoint journal values.
82
+ const db1 = Database.create(tagsPlugin);
83
+ const svc1 = await createWorkerPersistenceService({
84
+ database: db1,
85
+ backend,
86
+ checkpoint: noCheckpoint,
87
+ });
88
+ // First entity: lands in checkpoint (creates the manifest).
89
+ const entityA = db1.transactions.spawn({ mass: 1, tags: ["before"] });
90
+ await svc1.flush();
91
+ await svc1.checkpoint();
92
+ // Second entity: written after the checkpoint — lives only in the journal.
93
+ const entityB = db1.transactions.spawn({ mass: 2, tags: ["gamma"] });
94
+ await svc1.flush();
95
+ // Intentionally no second checkpoint — simulate "crash after journal write".
96
+ await svc1.dispose();
97
+ const db2 = Database.create(tagsPlugin);
98
+ const svc2 = await createWorkerPersistenceService({
99
+ database: db2,
100
+ backend,
101
+ checkpoint: noCheckpoint,
102
+ });
103
+ await svc2.load();
104
+ await svc2.dispose();
105
+ // Entity A: restored from snapshot.
106
+ const viewA = db2.read(entityA);
107
+ expect(viewA).not.toBeNull();
108
+ expect(viewA.tags).toEqual(["before"]);
109
+ // Entity B: restored via journal replay — the journal-column value
110
+ // must be present even though no second checkpoint was done.
111
+ const viewB = db2.read(entityB);
112
+ expect(viewB).not.toBeNull();
113
+ expect(viewB.tags).toEqual(["gamma"]);
114
+ });
115
+ it("post-checkpoint update wins over snapshot value", async () => {
116
+ const db1 = Database.create(tagsPlugin);
117
+ const svc1 = await createWorkerPersistenceService({
118
+ database: db1,
119
+ backend,
120
+ checkpoint: noCheckpoint,
121
+ });
122
+ const entity = db1.transactions.spawn({ mass: 1, tags: ["before-checkpoint"] });
123
+ await svc1.flush();
124
+ await svc1.checkpoint(); // snapshot writes ["before-checkpoint"]
125
+ db1.transactions.updateTags({ entity: entity, tags: ["after-checkpoint"] });
126
+ await svc1.flush(); // this lands in the (fresh, post-truncation) journal
127
+ await svc1.dispose();
128
+ const db2 = Database.create(tagsPlugin);
129
+ const svc2 = await createWorkerPersistenceService({
130
+ database: db2,
131
+ backend,
132
+ checkpoint: noCheckpoint,
133
+ });
134
+ await svc2.load();
135
+ await svc2.dispose();
136
+ const view = db2.read(entity);
137
+ expect(view).not.toBeNull();
138
+ // Journal replay runs AFTER snapshot restore, so "after-checkpoint" wins.
139
+ expect(view.tags).toEqual(["after-checkpoint"]);
140
+ });
141
+ it("multiple entities all have their array columns restored after checkpoint", async () => {
142
+ const db1 = Database.create(tagsPlugin);
143
+ const svc1 = await createWorkerPersistenceService({
144
+ database: db1,
145
+ backend,
146
+ checkpoint: noCheckpoint,
147
+ });
148
+ const ids = [];
149
+ for (let i = 0; i < 5; i++) {
150
+ const id = db1.transactions.spawn({ mass: i, tags: [`tag-${i}-a`, `tag-${i}-b`] });
151
+ ids.push(id);
152
+ }
153
+ await svc1.flush();
154
+ await svc1.checkpoint();
155
+ await svc1.dispose();
156
+ const db2 = Database.create(tagsPlugin);
157
+ const svc2 = await createWorkerPersistenceService({
158
+ database: db2,
159
+ backend,
160
+ checkpoint: noCheckpoint,
161
+ });
162
+ await svc2.load();
163
+ await svc2.dispose();
164
+ for (let i = 0; i < ids.length; i++) {
165
+ const view = db2.read(ids[i]);
166
+ expect(view).not.toBeNull();
167
+ expect(view.tags).toEqual([`tag-${i}-a`, `tag-${i}-b`]);
168
+ }
169
+ });
170
+ });
171
+ //# sourceMappingURL=journal-storage-durability.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-storage-durability.test.js","sourceRoot":"","sources":["../../src/service/journal-storage-durability.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,224 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { Database } from "@adobe/data/ecs";
3
+ import { F32, Vec3 } from "@adobe/data/math";
4
+ import { describe, expect, it } from "vitest";
5
+ import { createMemoryBackend } from "../backend/memory-backend.js";
6
+ import { createWorkerPersistenceService } from "./create-worker-persistence-service.js";
7
+ /**
8
+ * Round-trip tests: save the world via `WorkerPersistenceService`,
9
+ * then build a fresh database with the same plugin and call `load()`,
10
+ * and verify that the entity contents (positions, masses, etc.) are
11
+ * recovered byte-for-byte.
12
+ *
13
+ * Uses an in-memory backend so the same backend instance backs both
14
+ * the saving and loading service.
15
+ */
16
+ const particlePlugin = Database.Plugin.create({
17
+ components: {
18
+ position: Vec3.schema,
19
+ velocity: Vec3.schema,
20
+ mass: F32.schema,
21
+ },
22
+ archetypes: {
23
+ Particle: ["position", "velocity", "mass"],
24
+ },
25
+ transactions: {
26
+ spawn(t, args) {
27
+ return t.archetypes.Particle.insert({
28
+ position: [args.x, args.y, args.z],
29
+ velocity: [0, 0, 0],
30
+ mass: args.mass,
31
+ });
32
+ },
33
+ move(t, args) {
34
+ t.update(args.entity, { position: [args.x, args.y, args.z] });
35
+ },
36
+ kill(t, entity) {
37
+ t.delete(entity);
38
+ },
39
+ },
40
+ });
41
+ const createDb = () => Database.create(particlePlugin);
42
+ const expectEntity = (db, entity, expected) => {
43
+ const view = db.read(entity);
44
+ expect(view).not.toBeNull();
45
+ if (view === null)
46
+ return;
47
+ expect(Array.from(view.position)).toEqual([...expected.position]);
48
+ expect(Array.from(view.velocity)).toEqual([...expected.velocity]);
49
+ expect(view.mass).toBe(expected.mass);
50
+ };
51
+ describe("WorkerPersistenceService.load (round-trip)", () => {
52
+ it("returns silently when no snapshot exists", async () => {
53
+ const db = createDb();
54
+ const backend = createMemoryBackend();
55
+ const service = await createWorkerPersistenceService({
56
+ database: db,
57
+ backend,
58
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
59
+ });
60
+ await expect(service.load()).resolves.toBeUndefined();
61
+ await service.dispose();
62
+ });
63
+ it("recovers a single inserted entity after checkpoint", async () => {
64
+ const backend = createMemoryBackend();
65
+ const dbA = createDb();
66
+ const svcA = await createWorkerPersistenceService({
67
+ database: dbA,
68
+ backend,
69
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
70
+ });
71
+ const e = dbA.transactions.spawn({ x: 1, y: 2, z: 3, mass: 10 });
72
+ await svcA.flush();
73
+ await svcA.checkpoint();
74
+ await svcA.dispose();
75
+ const dbB = createDb();
76
+ const svcB = await createWorkerPersistenceService({
77
+ database: dbB,
78
+ backend,
79
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
80
+ });
81
+ await svcB.load();
82
+ expectEntity(dbB, e, { position: [1, 2, 3], velocity: [0, 0, 0], mass: 10 });
83
+ await svcB.dispose();
84
+ });
85
+ it("recovers multiple entities and preserves ids", async () => {
86
+ const backend = createMemoryBackend();
87
+ const dbA = createDb();
88
+ const svcA = await createWorkerPersistenceService({
89
+ database: dbA,
90
+ backend,
91
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
92
+ });
93
+ const e0 = dbA.transactions.spawn({ x: 1, y: 2, z: 3, mass: 10 });
94
+ const e1 = dbA.transactions.spawn({ x: 4, y: 5, z: 6, mass: 20 });
95
+ const e2 = dbA.transactions.spawn({ x: 7, y: 8, z: 9, mass: 30 });
96
+ await svcA.flush();
97
+ await svcA.checkpoint();
98
+ await svcA.dispose();
99
+ const dbB = createDb();
100
+ const svcB = await createWorkerPersistenceService({
101
+ database: dbB,
102
+ backend,
103
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
104
+ });
105
+ await svcB.load();
106
+ expectEntity(dbB, e0, { position: [1, 2, 3], velocity: [0, 0, 0], mass: 10 });
107
+ expectEntity(dbB, e1, { position: [4, 5, 6], velocity: [0, 0, 0], mass: 20 });
108
+ expectEntity(dbB, e2, { position: [7, 8, 9], velocity: [0, 0, 0], mass: 30 });
109
+ await svcB.dispose();
110
+ });
111
+ it("recovers updates (move) made before checkpoint", async () => {
112
+ const backend = createMemoryBackend();
113
+ const dbA = createDb();
114
+ const svcA = await createWorkerPersistenceService({
115
+ database: dbA,
116
+ backend,
117
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
118
+ });
119
+ const e = dbA.transactions.spawn({ x: 1, y: 2, z: 3, mass: 10 });
120
+ dbA.transactions.move({ entity: e, x: 100, y: 200, z: 300 });
121
+ await svcA.flush();
122
+ await svcA.checkpoint();
123
+ await svcA.dispose();
124
+ const dbB = createDb();
125
+ const svcB = await createWorkerPersistenceService({
126
+ database: dbB,
127
+ backend,
128
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
129
+ });
130
+ await svcB.load();
131
+ expectEntity(dbB, e, { position: [100, 200, 300], velocity: [0, 0, 0], mass: 10 });
132
+ await svcB.dispose();
133
+ });
134
+ it("recovers deletes: deleted entities are not present after load", async () => {
135
+ const backend = createMemoryBackend();
136
+ const dbA = createDb();
137
+ const svcA = await createWorkerPersistenceService({
138
+ database: dbA,
139
+ backend,
140
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
141
+ });
142
+ const e0 = dbA.transactions.spawn({ x: 1, y: 2, z: 3, mass: 10 });
143
+ const e1 = dbA.transactions.spawn({ x: 4, y: 5, z: 6, mass: 20 });
144
+ dbA.transactions.kill(e0);
145
+ await svcA.flush();
146
+ await svcA.checkpoint();
147
+ await svcA.dispose();
148
+ const dbB = createDb();
149
+ const svcB = await createWorkerPersistenceService({
150
+ database: dbB,
151
+ backend,
152
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
153
+ });
154
+ await svcB.load();
155
+ expect(dbB.read(e0)).toBeNull();
156
+ expectEntity(dbB, e1, { position: [4, 5, 6], velocity: [0, 0, 0], mass: 20 });
157
+ await svcB.dispose();
158
+ });
159
+ it("after load, new transactions allocate fresh ids without colliding", async () => {
160
+ const backend = createMemoryBackend();
161
+ const dbA = createDb();
162
+ const svcA = await createWorkerPersistenceService({
163
+ database: dbA,
164
+ backend,
165
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
166
+ });
167
+ const e0 = dbA.transactions.spawn({ x: 1, y: 1, z: 1, mass: 1 });
168
+ const e1 = dbA.transactions.spawn({ x: 2, y: 2, z: 2, mass: 2 });
169
+ dbA.transactions.kill(e0);
170
+ await svcA.flush();
171
+ await svcA.checkpoint();
172
+ await svcA.dispose();
173
+ const dbB = createDb();
174
+ const svcB = await createWorkerPersistenceService({
175
+ database: dbB,
176
+ backend,
177
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
178
+ });
179
+ await svcB.load();
180
+ // The deleted slot should be recycled by the free list.
181
+ const eNew = dbB.transactions.spawn({ x: 9, y: 9, z: 9, mass: 9 });
182
+ expect(eNew).toBe(e0);
183
+ expectEntity(dbB, eNew, { position: [9, 9, 9], velocity: [0, 0, 0], mass: 9 });
184
+ // The pre-existing entity is still there.
185
+ expectEntity(dbB, e1, { position: [2, 2, 2], velocity: [0, 0, 0], mass: 2 });
186
+ await svcB.dispose();
187
+ });
188
+ it("recovers a larger world (forces capacity growth)", async () => {
189
+ const backend = createMemoryBackend();
190
+ const dbA = createDb();
191
+ const svcA = await createWorkerPersistenceService({
192
+ database: dbA,
193
+ backend,
194
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
195
+ });
196
+ // 100 entities, well above the default rowCapacity of 16, so
197
+ // load() must grow the column buffers to fit.
198
+ const ids = [];
199
+ for (let i = 0; i < 100; i++) {
200
+ const id = dbA.transactions.spawn({ x: i, y: i * 2, z: i * 3, mass: i * 0.5 });
201
+ if (id !== undefined)
202
+ ids.push(id);
203
+ }
204
+ await svcA.flush();
205
+ await svcA.checkpoint();
206
+ await svcA.dispose();
207
+ const dbB = createDb();
208
+ const svcB = await createWorkerPersistenceService({
209
+ database: dbB,
210
+ backend,
211
+ checkpoint: { everyNTransactions: 0, idleMs: 0 },
212
+ });
213
+ await svcB.load();
214
+ for (let i = 0; i < ids.length; i++) {
215
+ expectEntity(dbB, ids[i], {
216
+ position: [i, i * 2, i * 3],
217
+ velocity: [0, 0, 0],
218
+ mass: i * 0.5,
219
+ });
220
+ }
221
+ await svcB.dispose();
222
+ });
223
+ });
224
+ //# sourceMappingURL=load-roundtrip.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-roundtrip.test.js","sourceRoot":"","sources":["../../src/service/load-roundtrip.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAExF;;;;;;;;GAQG;AAEH,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,UAAU,EAAE;QACR,QAAQ,EAAE,IAAI,CAAC,MAAM;QACrB,QAAQ,EAAE,IAAI,CAAC,MAAM;QACrB,IAAI,EAAE,GAAG,CAAC,MAAM;KACnB;IACD,UAAU,EAAE;QACR,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC;KAC7C;IACD,YAAY,EAAE;QACV,KAAK,CAAC,CAAC,EAAE,IAAuD;YAC5D,OAAO,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAChC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAClC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;aAClB,CAAC,CAAC;QACP,CAAC;QACD,IAAI,CAAC,CAAC,EAAE,IAAyD;YAC7D,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,CAAC,EAAE,MAAc;YAClB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;KACJ;CACJ,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAEvD,MAAM,YAAY,GAAG,CACjB,EAA+B,EAC/B,MAAc,EACd,QAAoF,EAChF,EAAE;IACN,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAEjB,CAAC;IACX,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC5B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO;IAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAAC;YACjD,QAAQ,EAAE,EAAE;YACZ,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,YAAY,CAAC,GAAG,EAAE,CAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,YAAY,CAAC,GAAG,EAAE,EAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,YAAY,CAAC,GAAG,EAAE,EAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,YAAY,CAAC,GAAG,EAAE,EAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACjE,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,YAAY,CAAC,GAAG,EAAE,CAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACpF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,YAAY,CAAC,GAAG,EAAE,EAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,wDAAwD;QACxD,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtB,YAAY,CAAC,GAAG,EAAE,IAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAChF,0CAA0C;QAC1C,YAAY,CAAC,GAAG,EAAE,EAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,6DAA6D;QAC7D,8CAA8C;QAC9C,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YAC/E,IAAI,EAAE,KAAK,SAAS;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC;YAC9C,QAAQ,EAAE,GAAG;YACb,OAAO;YACP,UAAU,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAE,EAAE;gBACvB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC3B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnB,IAAI,EAAE,CAAC,GAAG,GAAG;aAChB,CAAC,CAAC;QACP,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};