@minnowdb/core 0.0.1 → 0.1.1

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 (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -1
  3. package/dist/block-format/block.d.ts +46 -0
  4. package/dist/block-format/block.d.ts.map +1 -0
  5. package/dist/block-format/block.js +244 -0
  6. package/dist/block-format/block.js.map +1 -0
  7. package/dist/block-format/checksum.d.ts +7 -0
  8. package/dist/block-format/checksum.d.ts.map +1 -0
  9. package/dist/block-format/checksum.js +56 -0
  10. package/dist/block-format/checksum.js.map +1 -0
  11. package/dist/block-format/codecs.d.ts +24 -0
  12. package/dist/block-format/codecs.d.ts.map +1 -0
  13. package/dist/block-format/codecs.js +102 -0
  14. package/dist/block-format/codecs.js.map +1 -0
  15. package/dist/block-format/column.d.ts +8 -0
  16. package/dist/block-format/column.d.ts.map +1 -0
  17. package/dist/block-format/column.js +166 -0
  18. package/dist/block-format/column.js.map +1 -0
  19. package/dist/block-format/index.d.ts +7 -0
  20. package/dist/block-format/index.d.ts.map +1 -0
  21. package/dist/block-format/index.js +7 -0
  22. package/dist/block-format/index.js.map +1 -0
  23. package/dist/block-format/physical.d.ts +20 -0
  24. package/dist/block-format/physical.d.ts.map +1 -0
  25. package/dist/block-format/physical.js +439 -0
  26. package/dist/block-format/physical.js.map +1 -0
  27. package/dist/block-format/types.d.ts +93 -0
  28. package/dist/block-format/types.d.ts.map +1 -0
  29. package/dist/block-format/types.js +2 -0
  30. package/dist/block-format/types.js.map +1 -0
  31. package/dist/engine/artifact-cache.d.ts +22 -0
  32. package/dist/engine/artifact-cache.d.ts.map +1 -0
  33. package/dist/engine/artifact-cache.js +68 -0
  34. package/dist/engine/artifact-cache.js.map +1 -0
  35. package/dist/engine/batch.d.ts +28 -0
  36. package/dist/engine/batch.d.ts.map +1 -0
  37. package/dist/engine/batch.js +38 -0
  38. package/dist/engine/batch.js.map +1 -0
  39. package/dist/engine/buffered-writer.d.ts +43 -0
  40. package/dist/engine/buffered-writer.d.ts.map +1 -0
  41. package/dist/engine/buffered-writer.js +158 -0
  42. package/dist/engine/buffered-writer.js.map +1 -0
  43. package/dist/engine/catalog.d.ts +82 -0
  44. package/dist/engine/catalog.d.ts.map +1 -0
  45. package/dist/engine/catalog.js +47 -0
  46. package/dist/engine/catalog.js.map +1 -0
  47. package/dist/engine/client.d.ts +211 -0
  48. package/dist/engine/client.d.ts.map +1 -0
  49. package/dist/engine/client.js +538 -0
  50. package/dist/engine/client.js.map +1 -0
  51. package/dist/engine/coordinator.d.ts +17 -0
  52. package/dist/engine/coordinator.d.ts.map +1 -0
  53. package/dist/engine/coordinator.js +60 -0
  54. package/dist/engine/coordinator.js.map +1 -0
  55. package/dist/engine/database.d.ts +661 -0
  56. package/dist/engine/database.d.ts.map +1 -0
  57. package/dist/engine/database.js +10313 -0
  58. package/dist/engine/database.js.map +1 -0
  59. package/dist/engine/defaults.d.ts +33 -0
  60. package/dist/engine/defaults.d.ts.map +1 -0
  61. package/dist/engine/defaults.js +87 -0
  62. package/dist/engine/defaults.js.map +1 -0
  63. package/dist/engine/errors.d.ts +55 -0
  64. package/dist/engine/errors.d.ts.map +1 -0
  65. package/dist/engine/errors.js +81 -0
  66. package/dist/engine/errors.js.map +1 -0
  67. package/dist/engine/fts.d.ts +93 -0
  68. package/dist/engine/fts.d.ts.map +1 -0
  69. package/dist/engine/fts.js +273 -0
  70. package/dist/engine/fts.js.map +1 -0
  71. package/dist/engine/group-index.d.ts +32 -0
  72. package/dist/engine/group-index.d.ts.map +1 -0
  73. package/dist/engine/group-index.js +366 -0
  74. package/dist/engine/group-index.js.map +1 -0
  75. package/dist/engine/index.d.ts +13 -0
  76. package/dist/engine/index.d.ts.map +1 -0
  77. package/dist/engine/index.js +12 -0
  78. package/dist/engine/index.js.map +1 -0
  79. package/dist/engine/join-index.d.ts +12 -0
  80. package/dist/engine/join-index.d.ts.map +1 -0
  81. package/dist/engine/join-index.js +217 -0
  82. package/dist/engine/join-index.js.map +1 -0
  83. package/dist/engine/live.d.ts +86 -0
  84. package/dist/engine/live.d.ts.map +1 -0
  85. package/dist/engine/live.js +289 -0
  86. package/dist/engine/live.js.map +1 -0
  87. package/dist/engine/memory.d.ts +37 -0
  88. package/dist/engine/memory.d.ts.map +1 -0
  89. package/dist/engine/memory.js +119 -0
  90. package/dist/engine/memory.js.map +1 -0
  91. package/dist/engine/optimizer.d.ts +20 -0
  92. package/dist/engine/optimizer.d.ts.map +1 -0
  93. package/dist/engine/optimizer.js +1170 -0
  94. package/dist/engine/optimizer.js.map +1 -0
  95. package/dist/engine/query-cache.d.ts +10 -0
  96. package/dist/engine/query-cache.d.ts.map +1 -0
  97. package/dist/engine/query-cache.js +58 -0
  98. package/dist/engine/query-cache.js.map +1 -0
  99. package/dist/engine/query.d.ts +844 -0
  100. package/dist/engine/query.d.ts.map +1 -0
  101. package/dist/engine/query.js +7450 -0
  102. package/dist/engine/query.js.map +1 -0
  103. package/dist/engine/schema-wire.d.ts +92 -0
  104. package/dist/engine/schema-wire.d.ts.map +1 -0
  105. package/dist/engine/schema-wire.js +115 -0
  106. package/dist/engine/schema-wire.js.map +1 -0
  107. package/dist/engine/schema.d.ts +394 -0
  108. package/dist/engine/schema.d.ts.map +1 -0
  109. package/dist/engine/schema.js +709 -0
  110. package/dist/engine/schema.js.map +1 -0
  111. package/dist/engine/sort-keys.d.ts +36 -0
  112. package/dist/engine/sort-keys.d.ts.map +1 -0
  113. package/dist/engine/sort-keys.js +60 -0
  114. package/dist/engine/sort-keys.js.map +1 -0
  115. package/dist/engine/sql-json.d.ts +30 -0
  116. package/dist/engine/sql-json.d.ts.map +1 -0
  117. package/dist/engine/sql-json.js +120 -0
  118. package/dist/engine/sql-json.js.map +1 -0
  119. package/dist/engine/sql-semantics.d.ts +31 -0
  120. package/dist/engine/sql-semantics.d.ts.map +1 -0
  121. package/dist/engine/sql-semantics.js +121 -0
  122. package/dist/engine/sql-semantics.js.map +1 -0
  123. package/dist/engine/vector.d.ts +87 -0
  124. package/dist/engine/vector.d.ts.map +1 -0
  125. package/dist/engine/vector.js +4227 -0
  126. package/dist/engine/vector.js.map +1 -0
  127. package/dist/engine/worker-host.d.ts +48 -0
  128. package/dist/engine/worker-host.d.ts.map +1 -0
  129. package/dist/engine/worker-host.js +501 -0
  130. package/dist/engine/worker-host.js.map +1 -0
  131. package/dist/engine/worker.d.ts +2 -0
  132. package/dist/engine/worker.d.ts.map +1 -0
  133. package/dist/engine/worker.js +14 -0
  134. package/dist/engine/worker.js.map +1 -0
  135. package/dist/index.d.ts +2 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +2 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/plan/index.d.ts +17 -0
  140. package/dist/plan/index.d.ts.map +1 -0
  141. package/dist/plan/index.js +17 -0
  142. package/dist/plan/index.js.map +1 -0
  143. package/dist/storage/fixture-shape.d.ts +42 -0
  144. package/dist/storage/fixture-shape.d.ts.map +1 -0
  145. package/dist/storage/fixture-shape.js +146 -0
  146. package/dist/storage/fixture-shape.js.map +1 -0
  147. package/dist/storage/index.d.ts +5 -0
  148. package/dist/storage/index.d.ts.map +1 -0
  149. package/dist/storage/index.js +5 -0
  150. package/dist/storage/index.js.map +1 -0
  151. package/dist/storage/indexeddb.d.ts +139 -0
  152. package/dist/storage/indexeddb.d.ts.map +1 -0
  153. package/dist/storage/indexeddb.js +3161 -0
  154. package/dist/storage/indexeddb.js.map +1 -0
  155. package/dist/storage/memory.d.ts +121 -0
  156. package/dist/storage/memory.d.ts.map +1 -0
  157. package/dist/storage/memory.js +1455 -0
  158. package/dist/storage/memory.js.map +1 -0
  159. package/dist/storage/snapshot.d.ts +108 -0
  160. package/dist/storage/snapshot.d.ts.map +1 -0
  161. package/dist/storage/snapshot.js +276 -0
  162. package/dist/storage/snapshot.js.map +1 -0
  163. package/dist/storage/types.d.ts +895 -0
  164. package/dist/storage/types.d.ts.map +1 -0
  165. package/dist/storage/types.js +1549 -0
  166. package/dist/storage/types.js.map +1 -0
  167. package/dist/testing/index.d.ts +76 -0
  168. package/dist/testing/index.d.ts.map +1 -0
  169. package/dist/testing/index.js +233 -0
  170. package/dist/testing/index.js.map +1 -0
  171. package/dist/testing/seeds.d.ts +11 -0
  172. package/dist/testing/seeds.d.ts.map +1 -0
  173. package/dist/testing/seeds.js +50 -0
  174. package/dist/testing/seeds.js.map +1 -0
  175. package/dist/transactions/index.d.ts +148 -0
  176. package/dist/transactions/index.d.ts.map +1 -0
  177. package/dist/transactions/index.js +662 -0
  178. package/dist/transactions/index.js.map +1 -0
  179. package/dist/worker-protocol/index.d.ts +84 -0
  180. package/dist/worker-protocol/index.d.ts.map +1 -0
  181. package/dist/worker-protocol/index.js +117 -0
  182. package/dist/worker-protocol/index.js.map +1 -0
  183. package/package.json +66 -16
  184. package/sql-feature-matrix.json +1275 -0
  185. package/index.d.ts +0 -1
  186. package/index.js +0 -1
@@ -0,0 +1,538 @@
1
+ import { CompactionJobConflictError, GarbageCollectionJobConflictError, LeaseConflictError, SnapshotManifestMissingError, TableRecordConflictError, TempOwnerConflictError, TransactionRecordConflictError, UniqueKeyConflictError, WriteConflictError, } from "../storage/index.js";
2
+ import { parseRpcResponse, protocolVersion, } from "../worker-protocol/index.js";
3
+ import { toColumnarBatch } from "./batch.js";
4
+ import { CompactionJobCancelledError, CompactionMemoryBudgetError, CompactionWriteAmplificationError, MissingKeyError, SqlCompileError, UniqueConstraintError, } from "./errors.js";
5
+ import { QueryMemoryBudgetError } from "./memory.js";
6
+ import { serializeSchema } from "./schema-wire.js";
7
+ /**
8
+ * Bytes per slice when a snapshot crosses the channel. Large enough that a hundred-megabyte
9
+ * database is tens of round trips, small enough that no single structured clone is long enough
10
+ * to be felt as a dropped frame.
11
+ */
12
+ const SNAPSHOT_CHUNK_BYTES = 4 * 1024 * 1024;
13
+ const errorRegistry = new Map([
14
+ UniqueConstraintError,
15
+ MissingKeyError,
16
+ CompactionMemoryBudgetError,
17
+ CompactionWriteAmplificationError,
18
+ CompactionJobCancelledError,
19
+ SqlCompileError,
20
+ QueryMemoryBudgetError,
21
+ WriteConflictError,
22
+ UniqueKeyConflictError,
23
+ TableRecordConflictError,
24
+ CompactionJobConflictError,
25
+ GarbageCollectionJobConflictError,
26
+ SnapshotManifestMissingError,
27
+ TransactionRecordConflictError,
28
+ LeaseConflictError,
29
+ TempOwnerConflictError,
30
+ ].map((constructor) => [constructor.name, constructor]));
31
+ function rehydrateError(serialized) {
32
+ const constructor = errorRegistry.get(serialized.name);
33
+ const error = constructor === undefined
34
+ ? new Error(serialized.message)
35
+ : Object.create(constructor.prototype);
36
+ Object.defineProperty(error, "message", {
37
+ value: serialized.message,
38
+ writable: true,
39
+ configurable: true,
40
+ });
41
+ Object.defineProperty(error, "name", {
42
+ value: serialized.name,
43
+ writable: true,
44
+ configurable: true,
45
+ });
46
+ if (serialized.stack !== undefined) {
47
+ Object.defineProperty(error, "stack", {
48
+ value: serialized.stack,
49
+ writable: true,
50
+ configurable: true,
51
+ });
52
+ }
53
+ if (serialized.props !== undefined)
54
+ Object.assign(error, serialized.props);
55
+ return error;
56
+ }
57
+ export class MinnowDatabaseClient {
58
+ #transport;
59
+ #pending = new Map();
60
+ #events = new Map();
61
+ #ready;
62
+ #fatal;
63
+ #closed = false;
64
+ constructor(transport, options = {}) {
65
+ this.#transport = transport;
66
+ transport.addEventListener("message", (event) => {
67
+ this.#receive(event.data);
68
+ });
69
+ transport.addEventListener("error", () => {
70
+ this.#fail(new Error("The database worker failed; see the worker's own error output"));
71
+ });
72
+ transport.addEventListener("messageerror", () => {
73
+ this.#fail(new Error("A database worker message could not be deserialized"));
74
+ });
75
+ const payload = {
76
+ store: options.store ?? { kind: "indexeddb", name: "minnow" },
77
+ ...(options.databaseOptions === undefined ? {} : { options: options.databaseOptions }),
78
+ };
79
+ this.#ready = this.#post("rpc-init", null, "init", [payload]).then(() => undefined);
80
+ // Callers may rely on call ordering instead of awaiting ready(); keep its rejection observed.
81
+ this.#ready.catch(() => undefined);
82
+ }
83
+ /** Resolves once the worker has opened the store and constructed the database. */
84
+ async ready() {
85
+ return this.#ready;
86
+ }
87
+ // --- Catalog and writes -----------------------------------------------------------------------
88
+ async createTable(input) {
89
+ await this.#call("createTable", [input]);
90
+ }
91
+ /** The published catalog; see `MinnowDatabase.introspect()`. */
92
+ async introspect() {
93
+ return (await this.#call("introspect", []));
94
+ }
95
+ async listTables() {
96
+ return (await this.#call("listTables", []));
97
+ }
98
+ async migrate(definition, options = {}) {
99
+ return (await this.#call("migrate", [
100
+ serializeSchema(definition),
101
+ options,
102
+ ]));
103
+ }
104
+ async insertBatch(tableName, input) {
105
+ // Pivoted here rather than in the worker: the columnar form is the cheaper structured clone,
106
+ // and it keeps the worker protocol's payload shape the same whichever form the caller used.
107
+ const batch = toColumnarBatch(input);
108
+ return (await this.#call("insertBatch", [tableName, batch]));
109
+ }
110
+ async insert(tableName, row) {
111
+ return (await this.#call("insert", [tableName, row]));
112
+ }
113
+ async upsertBatch(tableName, input) {
114
+ const batch = toColumnarBatch(input);
115
+ return (await this.#call("upsertBatch", [tableName, batch]));
116
+ }
117
+ async upsert(tableName, row) {
118
+ return (await this.#call("upsert", [tableName, row]));
119
+ }
120
+ async updateBatch(tableName, input) {
121
+ return (await this.#call("updateBatch", [tableName, input]));
122
+ }
123
+ async update(tableName, key, changes) {
124
+ return (await this.#call("update", [tableName, key, changes]));
125
+ }
126
+ async deleteBatch(tableName, input) {
127
+ return (await this.#call("deleteBatch", [tableName, input]));
128
+ }
129
+ bufferedWriter(tableName, options = {}) {
130
+ const handleId = crypto.randomUUID();
131
+ const { onError, ...wireOptions } = options;
132
+ this.#events.set(handleId, {
133
+ ...(onError === undefined ? {} : { onError }),
134
+ });
135
+ const created = this.#call("bufferedWriter", [handleId, tableName, wireOptions]);
136
+ return new ClientBufferedWriter(this, handleId, created);
137
+ }
138
+ // --- Reads ------------------------------------------------------------------------------------
139
+ async readTable(tableName, versionOrOptions) {
140
+ return (await this.#call("readTable", versionOrOptions === undefined ? [tableName] : [tableName, versionOrOptions]));
141
+ }
142
+ async query(sql, options) {
143
+ return (await this.#call("query", options === undefined ? [sql] : [sql, options]));
144
+ }
145
+ async run(query) {
146
+ return (await this.#call("run", [query]));
147
+ }
148
+ async explain(sql) {
149
+ return (await this.#call("explain", [sql]));
150
+ }
151
+ async execute(sql, params) {
152
+ return (await this.#call("execute", params === undefined ? [sql] : [sql, params]));
153
+ }
154
+ /** Executes a compiled statement from the typed mutation builders in the worker. */
155
+ async runStatement(statement, options) {
156
+ return (await this.#call("runStatement", options === undefined ? [statement] : [statement, options]));
157
+ }
158
+ /**
159
+ * Runs the callback against one pinned manifest version, exactly like the in-worker
160
+ * `MinnowDatabase.snapshot()`: the worker holds the version's reader lease until the
161
+ * callback settles, and every session query crosses the channel pinned to that version.
162
+ */
163
+ async snapshot(action) {
164
+ const opened = (await this.#call("snapshotOpen", []));
165
+ try {
166
+ const session = {
167
+ version: opened.version,
168
+ query: (sql, options = {}) => this.query(sql, {
169
+ ...options,
170
+ ...(opened.version === null ? {} : { version: opened.version }),
171
+ }),
172
+ };
173
+ return await action(session);
174
+ }
175
+ finally {
176
+ await this._invoke(opened.handleId, "close", []);
177
+ }
178
+ }
179
+ /**
180
+ * Runs the callback against one worker-side write transaction, exactly like the in-worker
181
+ * `MinnowDatabase.write()`: every staged mutation crosses the channel into the shared
182
+ * transaction and publishes as one atomic commit when the callback returns; an error
183
+ * aborts the scope with nothing published.
184
+ */
185
+ async write(action) {
186
+ const opened = (await this.#call("writeOpen", []));
187
+ const stage = (op, tableName, input) => this._invoke(opened.handleId, "stage", [op, tableName, input]);
188
+ const session = {
189
+ query: (sql, options) => this._invoke(opened.handleId, "query", [sql, options]),
190
+ insertBatch: (tableName, input) => stage("insertBatch", tableName, input),
191
+ upsertBatch: (tableName, input) => stage("upsertBatch", tableName, input),
192
+ updateBatch: (tableName, input) => stage("updateBatch", tableName, input),
193
+ deleteBatch: (tableName, input) => stage("deleteBatch", tableName, input),
194
+ };
195
+ try {
196
+ const result = await action(session);
197
+ const committed = (await this._invoke(opened.handleId, "commit", []));
198
+ return { result, version: committed.version };
199
+ }
200
+ catch (error) {
201
+ await this._invoke(opened.handleId, "abort", []).catch(() => undefined);
202
+ throw error;
203
+ }
204
+ }
205
+ /**
206
+ * Copies the database out as a portable snapshot file, exactly like the in-worker
207
+ * `MinnowDatabase.exportSnapshot()`. The worker encodes it and hands it back in slices, so the
208
+ * main thread copies a few megabytes at a time instead of stalling on one clone of the whole
209
+ * database; `onProgress` reports each slice as it lands.
210
+ */
211
+ async exportSnapshot(options = {}) {
212
+ options.onProgress?.({ phase: "reading", transferredBytes: 0, totalBytes: 0 });
213
+ const opened = (await this.#call("exportSnapshotOpen", []));
214
+ const totalBytes = opened.byteLength;
215
+ const bytes = new Uint8Array(totalBytes);
216
+ try {
217
+ let offset = 0;
218
+ while (offset < totalBytes) {
219
+ const chunk = (await this._invoke(opened.handleId, "read", [
220
+ offset,
221
+ Math.min(SNAPSHOT_CHUNK_BYTES, totalBytes - offset),
222
+ ]));
223
+ // A slice that came back empty would loop forever; the export is over either way.
224
+ if (chunk.byteLength === 0)
225
+ throw new Error("Snapshot transfer returned no bytes");
226
+ bytes.set(chunk, offset);
227
+ offset += chunk.byteLength;
228
+ options.onProgress?.({ phase: "transfer", transferredBytes: offset, totalBytes });
229
+ }
230
+ }
231
+ finally {
232
+ await this._invoke(opened.handleId, "close", []).catch(() => undefined);
233
+ }
234
+ options.onProgress?.({ phase: "done", transferredBytes: totalBytes, totalBytes });
235
+ return bytes;
236
+ }
237
+ /**
238
+ * Loads a snapshot file into the worker's store, which must be empty. The bytes go over in the
239
+ * same slices the export comes back in, and the worker's load progress arrives as events, so a
240
+ * multi-megabyte restore can be shown moving rather than as a frozen tab.
241
+ */
242
+ async importSnapshot(bytes, options = {}) {
243
+ const handleId = crypto.randomUUID();
244
+ const { onProgress } = options;
245
+ this.#events.set(handleId, {
246
+ ...(onProgress === undefined
247
+ ? {}
248
+ : {
249
+ onProgress: (progress) => {
250
+ onProgress(progress);
251
+ },
252
+ }),
253
+ });
254
+ try {
255
+ await this.#call("importSnapshotOpen", [handleId]);
256
+ for (let offset = 0; offset < bytes.byteLength; offset += SNAPSHOT_CHUNK_BYTES) {
257
+ // Copied, not viewed: structured clone copies the buffer behind a typed array, so a
258
+ // subarray would post the whole file on every write.
259
+ await this._invoke(handleId, "write", [bytes.slice(offset, offset + SNAPSHOT_CHUNK_BYTES)]);
260
+ }
261
+ await this._invoke(handleId, "finish", []);
262
+ }
263
+ catch (error) {
264
+ // The handle survives a failed write; drop it rather than leaving the chunks in the worker.
265
+ await this._invoke(handleId, "close", []).catch(() => undefined);
266
+ throw error;
267
+ }
268
+ finally {
269
+ this.#events.delete(handleId);
270
+ }
271
+ }
272
+ /** The worker-side buffer pool's byte budget, residency, and lifetime counters. */
273
+ async bufferPoolStats() {
274
+ return (await this.#call("bufferPoolStats", []));
275
+ }
276
+ liveQueries(options = {}) {
277
+ const handleId = crypto.randomUUID();
278
+ const created = this.#call("liveQueries", [handleId, options]);
279
+ return new ClientLiveQuerySet(this, handleId, created);
280
+ }
281
+ // --- Maintenance ------------------------------------------------------------------------------
282
+ async listVisibleSegments(tableName, version) {
283
+ return (await this.#call("listVisibleSegments", version === undefined ? [tableName] : [tableName, version]));
284
+ }
285
+ async cleanupQuerySpill(options) {
286
+ return (await this.#call("cleanupQuerySpill", options === undefined ? [] : [options]));
287
+ }
288
+ async compactTable(tableName, options) {
289
+ return (await this.#call("compactTable", options === undefined ? [tableName] : [tableName, options]));
290
+ }
291
+ async compactTableStep(tableName, options) {
292
+ return (await this.#call("compactTableStep", options === undefined ? [tableName] : [tableName, options]));
293
+ }
294
+ async resumeCompactionJob(jobId, options) {
295
+ return (await this.#call("resumeCompactionJob", options === undefined ? [jobId] : [jobId, options]));
296
+ }
297
+ async listCompactionJobs(tableName) {
298
+ return (await this.#call("listCompactionJobs", tableName === undefined ? [] : [tableName]));
299
+ }
300
+ async cancelCompactionJob(jobId) {
301
+ return (await this.#call("cancelCompactionJob", [jobId]));
302
+ }
303
+ async collectGarbage(options) {
304
+ return (await this.#call("collectGarbage", options === undefined ? [] : [options]));
305
+ }
306
+ async collectGarbageStep(options) {
307
+ return (await this.#call("collectGarbageStep", options === undefined ? [] : [options]));
308
+ }
309
+ async resumeGarbageCollectionJob(jobId, options) {
310
+ return (await this.#call("resumeGarbageCollectionJob", options === undefined ? [jobId] : [jobId, options]));
311
+ }
312
+ async listGarbageCollectionJobs() {
313
+ return (await this.#call("listGarbageCollectionJobs", []));
314
+ }
315
+ // --- Lifecycle --------------------------------------------------------------------------------
316
+ /** Disposes every worker-side handle, closes the store, and optionally terminates the worker. */
317
+ async close(options = {}) {
318
+ if (this.#closed)
319
+ return;
320
+ this.#closed = true;
321
+ try {
322
+ await this.#post("rpc-call", null, "dispose", []);
323
+ }
324
+ finally {
325
+ this.#events.clear();
326
+ if (options.terminateWorker === true)
327
+ this.#transport.terminate?.();
328
+ }
329
+ }
330
+ // --- Channel internals ------------------------------------------------------------------------
331
+ /** @internal */
332
+ async _invoke(handleId, method, args) {
333
+ return this.#post("rpc-call", handleId, method, args);
334
+ }
335
+ /** @internal */
336
+ _routeEvents(handleId, route) {
337
+ this.#events.set(handleId, route);
338
+ }
339
+ /** @internal */
340
+ _unrouteEvents(handleId) {
341
+ this.#events.delete(handleId);
342
+ }
343
+ async #call(method, args) {
344
+ if (this.#closed)
345
+ throw new Error("Database client is closed");
346
+ return this.#post("rpc-call", null, method, args);
347
+ }
348
+ async #post(kind, handleId, method, args) {
349
+ if (this.#fatal !== undefined)
350
+ throw this.#fatal;
351
+ const requestId = crypto.randomUUID();
352
+ return new Promise((resolve, reject) => {
353
+ this.#pending.set(requestId, { resolve, reject });
354
+ this.#transport.postMessage(kind === "rpc-init"
355
+ ? { version: protocolVersion, requestId, kind, payload: args[0] }
356
+ : { version: protocolVersion, requestId, kind, handleId, method, args });
357
+ });
358
+ }
359
+ #receive(message) {
360
+ const response = parseRpcResponse(message);
361
+ if (response === null)
362
+ return;
363
+ if (response.kind === "rpc-event") {
364
+ const route = this.#events.get(response.handleId);
365
+ if (route === undefined)
366
+ return;
367
+ if (response.event === "change")
368
+ route.onChange?.(response.payload);
369
+ else if (response.event === "error") {
370
+ route.onError?.(rehydrateError(response.payload));
371
+ }
372
+ else if (response.event === "progress")
373
+ route.onProgress?.(response.payload);
374
+ else if (response.event === "complete") {
375
+ this.#events.delete(response.handleId);
376
+ route.onComplete?.();
377
+ }
378
+ return;
379
+ }
380
+ const pending = this.#pending.get(response.requestId);
381
+ if (pending === undefined)
382
+ return;
383
+ this.#pending.delete(response.requestId);
384
+ if (response.kind === "rpc-result")
385
+ pending.resolve(response.result);
386
+ else
387
+ pending.reject(rehydrateError(response.error));
388
+ }
389
+ #fail(error) {
390
+ this.#fatal = error;
391
+ const pending = [...this.#pending.values()];
392
+ this.#pending.clear();
393
+ for (const call of pending)
394
+ call.reject(error);
395
+ }
396
+ }
397
+ /**
398
+ * Proxy of a worker-side BufferedTableWriter. The age timer runs on the worker's clock, and
399
+ * onError fires for background flush failures exactly as in-worker — delivered as an event.
400
+ */
401
+ export class ClientBufferedWriter {
402
+ client;
403
+ handleId;
404
+ constructor(client, handleId, created) {
405
+ this.client = client;
406
+ this.handleId = handleId;
407
+ this.#created = created;
408
+ // The creation result also arrives through the first chained call; keep it observed.
409
+ created.catch(() => undefined);
410
+ }
411
+ #created;
412
+ async add(row) {
413
+ await this.#created;
414
+ return (await this.client._invoke(this.handleId, "add", [row]));
415
+ }
416
+ async flush() {
417
+ await this.#created;
418
+ return (await this.client._invoke(this.handleId, "flush", []));
419
+ }
420
+ /** Fire-and-forget: flush failures surface through onError, matching the in-worker contract. */
421
+ requestFlush() {
422
+ void this.#created
423
+ .then(() => this.client._invoke(this.handleId, "requestFlush", []))
424
+ .catch(() => undefined);
425
+ }
426
+ async stats() {
427
+ await this.#created;
428
+ return (await this.client._invoke(this.handleId, "stats", []));
429
+ }
430
+ async discard() {
431
+ await this.#created;
432
+ return (await this.client._invoke(this.handleId, "discard", []));
433
+ }
434
+ async close() {
435
+ await this.#created;
436
+ try {
437
+ return (await this.client._invoke(this.handleId, "close", []));
438
+ }
439
+ finally {
440
+ this.client._unrouteEvents(this.handleId);
441
+ }
442
+ }
443
+ }
444
+ /** Proxy of a worker-side LiveQuerySet; onChange/onError arrive as events from the worker. */
445
+ export class ClientLiveQuerySet {
446
+ client;
447
+ handleId;
448
+ #subscriptionIds = new Set();
449
+ constructor(client, handleId, created) {
450
+ this.client = client;
451
+ this.handleId = handleId;
452
+ this.#created = created;
453
+ created.catch(() => undefined);
454
+ }
455
+ #created;
456
+ /** Registers a query (SQL or a compiled-plan envelope) and re-runs it on relevant changes. */
457
+ async subscribe(query, options) {
458
+ await this.#created;
459
+ const subscriptionId = crypto.randomUUID();
460
+ // The worker tears down its handle when the subscription completes (set closed there);
461
+ // closing the client wrapper afterwards must not call into the vanished handle.
462
+ const state = { completed: false };
463
+ this.client._routeEvents(subscriptionId, {
464
+ onChange: options.onChange.bind(options),
465
+ ...(options.onError === undefined ? {} : { onError: options.onError.bind(options) }),
466
+ onComplete: () => {
467
+ state.completed = true;
468
+ this.#subscriptionIds.delete(subscriptionId);
469
+ options.onComplete?.();
470
+ },
471
+ });
472
+ try {
473
+ const created = (await this.client._invoke(this.handleId, "subscribe", [
474
+ subscriptionId,
475
+ query,
476
+ ]));
477
+ this.#subscriptionIds.add(subscriptionId);
478
+ return new ClientLiveSubscription(this.client, subscriptionId, created.dependencyTableIds, () => this.#subscriptionIds.delete(subscriptionId), state);
479
+ }
480
+ catch (error) {
481
+ this.client._unrouteEvents(subscriptionId);
482
+ throw error;
483
+ }
484
+ }
485
+ async stats() {
486
+ await this.#created;
487
+ return (await this.client._invoke(this.handleId, "stats", []));
488
+ }
489
+ /** Hints the worker that this tab committed elsewhere (e.g. through another client). */
490
+ notifyLocalCommit() {
491
+ void this.#created
492
+ .then(() => this.client._invoke(this.handleId, "notifyLocalCommit", []))
493
+ .catch(() => undefined);
494
+ }
495
+ /** Runs one authoritative version check and selective re-execution sweep. */
496
+ async refresh() {
497
+ await this.#created;
498
+ await this.client._invoke(this.handleId, "refresh", []);
499
+ }
500
+ async close() {
501
+ await this.#created;
502
+ try {
503
+ await this.client._invoke(this.handleId, "close", []);
504
+ }
505
+ finally {
506
+ for (const subscriptionId of this.#subscriptionIds) {
507
+ this.client._unrouteEvents(subscriptionId);
508
+ }
509
+ this.#subscriptionIds.clear();
510
+ }
511
+ }
512
+ }
513
+ export class ClientLiveSubscription {
514
+ client;
515
+ handleId;
516
+ dependencyTableIds;
517
+ onClosed;
518
+ state;
519
+ constructor(client, handleId, dependencyTableIds, onClosed, state = { completed: false }) {
520
+ this.client = client;
521
+ this.handleId = handleId;
522
+ this.dependencyTableIds = dependencyTableIds;
523
+ this.onClosed = onClosed;
524
+ this.state = state;
525
+ }
526
+ async close() {
527
+ try {
528
+ // A completed subscription no longer exists worker-side; only clean up locally.
529
+ if (!this.state.completed)
530
+ await this.client._invoke(this.handleId, "close", []);
531
+ }
532
+ finally {
533
+ this.client._unrouteEvents(this.handleId);
534
+ this.onClosed();
535
+ }
536
+ }
537
+ }
538
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/engine/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { BlockStore } from "../storage/index.js";
2
+ export interface WorkerReply {
3
+ message: unknown;
4
+ transfer?: Transferable[];
5
+ }
6
+ export declare function createCoordinator(store: BlockStore): (rawRequest: unknown) => Promise<WorkerReply>;
7
+ /**
8
+ * The slice of DedicatedWorkerGlobalScope the coordinator drives. Structural (not
9
+ * `Pick<DedicatedWorkerGlobalScope, ...>`) so the shipped declarations type-check for consumers
10
+ * without the WebWorker lib under `skipLibCheck: false`.
11
+ */
12
+ export interface CoordinatorScope {
13
+ addEventListener(type: "message", listener: (event: MessageEvent<unknown>) => void): void;
14
+ postMessage(message: unknown, transfer?: Transferable[]): void;
15
+ }
16
+ export declare function attachCoordinator(scope: CoordinatorScope, store: BlockStore): void;
17
+ //# sourceMappingURL=coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/engine/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,qBAAqB,CAAC;AAG5E,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,IACnC,YAAY,OAAO,KAAG,OAAO,CAAC,WAAW,CAAC,CAwCzD;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1F,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;CAChE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAOlF"}
@@ -0,0 +1,60 @@
1
+ import { failure, parseRequest, success } from "../worker-protocol/index.js";
2
+ export function createCoordinator(store) {
3
+ return async (rawRequest) => {
4
+ let request;
5
+ try {
6
+ request = parseRequest(rawRequest);
7
+ }
8
+ catch (error) {
9
+ const requestId = getRequestId(rawRequest);
10
+ return { message: failure(requestId, error) };
11
+ }
12
+ try {
13
+ switch (request.operation) {
14
+ case "ping":
15
+ return { message: success(request.requestId, { ready: true }) };
16
+ case "writeBlock": {
17
+ const payload = request.payload;
18
+ await store.addBlock(payload.id, payload.bytes);
19
+ return { message: success(request.requestId, { stored: payload.bytes.byteLength }) };
20
+ }
21
+ case "readBlock": {
22
+ const payload = request.payload;
23
+ const bytes = await store.getBlock(payload.id);
24
+ if (bytes === undefined)
25
+ throw new Error(`Block not found: ${payload.id}`);
26
+ return {
27
+ message: success(request.requestId, { bytes }),
28
+ transfer: [bytes.buffer],
29
+ };
30
+ }
31
+ case "publishManifest": {
32
+ const manifest = await store.publishManifest(request.payload);
33
+ return { message: success(request.requestId, manifest) };
34
+ }
35
+ default:
36
+ throw new Error(`Operation "${request.operation}" must be supplied by the benchmark worker`);
37
+ }
38
+ }
39
+ catch (error) {
40
+ return { message: failure(request.requestId, error) };
41
+ }
42
+ };
43
+ }
44
+ export function attachCoordinator(scope, store) {
45
+ const coordinate = createCoordinator(store);
46
+ scope.addEventListener("message", (event) => {
47
+ void coordinate(event.data).then((reply) => {
48
+ scope.postMessage(reply.message, reply.transfer ?? []);
49
+ });
50
+ });
51
+ }
52
+ function getRequestId(value) {
53
+ if (typeof value === "object" && value !== null && "requestId" in value) {
54
+ const requestId = value.requestId;
55
+ if (typeof requestId === "string")
56
+ return requestId;
57
+ }
58
+ return "unknown";
59
+ }
60
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/engine/coordinator.ts"],"names":[],"mappings":"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"}