@bjornpagen/bumbledb-log 0.20.0 → 0.20.2

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 (76) hide show
  1. package/dist/braids.d.ts +28 -0
  2. package/dist/braids.d.ts.map +1 -0
  3. package/{src/braids.ts → dist/braids.js} +22 -29
  4. package/dist/braids.js.map +1 -0
  5. package/dist/bytes.d.ts +26 -0
  6. package/dist/bytes.d.ts.map +1 -0
  7. package/dist/bytes.js +86 -0
  8. package/dist/bytes.js.map +1 -0
  9. package/dist/chain.d.ts +56 -0
  10. package/dist/chain.d.ts.map +1 -0
  11. package/dist/chain.js +137 -0
  12. package/dist/chain.js.map +1 -0
  13. package/dist/codec.d.ts +71 -0
  14. package/dist/codec.d.ts.map +1 -0
  15. package/dist/codec.js +179 -0
  16. package/dist/codec.js.map +1 -0
  17. package/dist/descriptor.d.ts +61 -0
  18. package/dist/descriptor.d.ts.map +1 -0
  19. package/dist/descriptor.js +160 -0
  20. package/dist/descriptor.js.map +1 -0
  21. package/dist/errors.d.ts +202 -0
  22. package/dist/errors.d.ts.map +1 -0
  23. package/dist/errors.js +122 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/index.d.ts +34 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +24 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/keys.d.ts +52 -0
  30. package/dist/keys.d.ts.map +1 -0
  31. package/dist/keys.js +166 -0
  32. package/dist/keys.js.map +1 -0
  33. package/dist/manifest.d.ts +42 -0
  34. package/dist/manifest.d.ts.map +1 -0
  35. package/dist/manifest.js +116 -0
  36. package/dist/manifest.js.map +1 -0
  37. package/dist/replica.d.ts +154 -0
  38. package/dist/replica.d.ts.map +1 -0
  39. package/dist/replica.js +820 -0
  40. package/dist/replica.js.map +1 -0
  41. package/dist/store-s3.d.ts +31 -0
  42. package/dist/store-s3.d.ts.map +1 -0
  43. package/dist/store-s3.js +299 -0
  44. package/dist/store-s3.js.map +1 -0
  45. package/dist/store.d.ts +129 -0
  46. package/dist/store.d.ts.map +1 -0
  47. package/dist/store.js +577 -0
  48. package/dist/store.js.map +1 -0
  49. package/dist/tenants.d.ts +56 -0
  50. package/dist/tenants.d.ts.map +1 -0
  51. package/dist/tenants.js +333 -0
  52. package/dist/tenants.js.map +1 -0
  53. package/dist/tilde-family.json +21 -0
  54. package/dist/vector.d.ts +31 -0
  55. package/dist/vector.d.ts.map +1 -0
  56. package/dist/vector.js +87 -0
  57. package/dist/vector.js.map +1 -0
  58. package/dist/writer.d.ts +106 -0
  59. package/dist/writer.d.ts.map +1 -0
  60. package/dist/writer.js +677 -0
  61. package/dist/writer.js.map +1 -0
  62. package/package.json +12 -7
  63. package/src/bytes.ts +0 -115
  64. package/src/chain.ts +0 -181
  65. package/src/codec.ts +0 -252
  66. package/src/descriptor.ts +0 -240
  67. package/src/errors.ts +0 -309
  68. package/src/index.ts +0 -57
  69. package/src/keys.ts +0 -218
  70. package/src/manifest.ts +0 -161
  71. package/src/replica.ts +0 -1061
  72. package/src/store-s3.ts +0 -377
  73. package/src/store.ts +0 -727
  74. package/src/tenants.ts +0 -414
  75. package/src/vector.ts +0 -103
  76. package/src/writer.ts +0 -977
package/dist/store.js ADDED
@@ -0,0 +1,577 @@
1
+ /**
2
+ * The object-store capability: exactly five verbs, outcomes as sums,
3
+ * infrastructure failures on the ErrStore channel. `fsStore` is tier-1,
4
+ * not a dev double — deployment case 5's production backend.
5
+ *
6
+ * The one on-disk protocol, shared with the Rust driver and pinned by
7
+ * the `lease/` corpus goldens: create-only publishes an exclusive
8
+ * synced temp (under the reserved `~tmp` namespace) with link(2), where
9
+ * EEXIST is the honest exists; the etag is the blake3 of the content,
10
+ * lowercase hex, computed on every read and never stored. The mutation
11
+ * lock is a fenced CAS lease: a versioned `LEASE/1` body whose identity
12
+ * is a monotonic token file `{root}/~lease/{key}/{n}`, with `~head`
13
+ * naming the current token. A contender mints the next token iff the
14
+ * current lease's own bytes are expired — expiry is the only break.
15
+ * Release rewrites the held token with an already-expired body so the
16
+ * next acquirer does not wait us out. `created` and `swapped` resolve
17
+ * only after fsync of the object file and its parent directory,
18
+ * including newly created ancestors. Stale temps are swept at open.
19
+ */
20
+ import * as fs from "node:fs/promises";
21
+ import * as path from "node:path";
22
+ import { internalBlake3 } from "@bjornpagen/bumbledb";
23
+ import * as errors from "@superbuilders/errors";
24
+ import { regex } from "arkregex";
25
+ import { bytesEqual, toHex, U64_MAX } from "#bytes.ts";
26
+ import { wrapStore } from "#errors.ts";
27
+ import { LEASE_NAMESPACE, reservedLease, reservedTemp, TEMP_NAMESPACE } from "#keys.ts";
28
+ function etag(raw) {
29
+ return raw;
30
+ }
31
+ /** Ceiling of the jittered wait between probes of an unexpired lease. */
32
+ const LOCK_RETRY_MS = 10;
33
+ /** How long a mutation lease stays current, in milliseconds. */
34
+ const MUTATION_TTL_MS = 5_000;
35
+ /** A live temp under `~tmp` exists only for write-then-link. Anything
36
+ * older than this is crash litter the open sweep deletes. */
37
+ const TEMP_STALE_MS = 30_000;
38
+ /** `~head` is not a StoreKey. It names the current token so a
39
+ * successor reads `{dir}/{n}` without listing. */
40
+ const HEAD = "~head";
41
+ function ourHolder() {
42
+ return BigInt(process.pid);
43
+ }
44
+ function contentEtag(bytes) {
45
+ return etag(toHex(new Uint8Array(internalBlake3(bytes))));
46
+ }
47
+ function codeOf(error) {
48
+ return error.code;
49
+ }
50
+ /** The lease body's magic first line. Version 1 of the one lock protocol. */
51
+ const LEASE_MAGIC = "LEASE/1";
52
+ function encodeLease(lease) {
53
+ return new TextEncoder().encode(`${LEASE_MAGIC}\n${lease.holder}\n${lease.token}\n${lease.expires}\n`);
54
+ }
55
+ const U64_DECIMAL = regex("^\\d+$");
56
+ function u64Line(line) {
57
+ if (!U64_DECIMAL.test(line)) {
58
+ return null;
59
+ }
60
+ const value = BigInt(line);
61
+ if (value > U64_MAX) {
62
+ return null;
63
+ }
64
+ return value;
65
+ }
66
+ /** Lines as Rust `str::lines`: split on `\n`, one trailing terminator
67
+ * unyielded, a trailing `\r` stripped per line. */
68
+ function leaseLines(raw) {
69
+ const parts = raw.split("\n");
70
+ if (parts.length > 0 && parts[parts.length - 1] === "") {
71
+ parts.pop();
72
+ }
73
+ return parts.map((line) => (line.endsWith("\r") ? line.slice(0, -1) : line));
74
+ }
75
+ /** The `LEASE/1` body: magic line, then holder, token, expires as
76
+ * decimal u64 lines, and nothing after. Anything else is not a lease
77
+ * and never breakable. */
78
+ function parseLease(raw) {
79
+ const lines = leaseLines(raw);
80
+ if (lines.length !== 4) {
81
+ return null;
82
+ }
83
+ const [magic, holderLine, tokenLine, expiresLine] = lines;
84
+ if (magic !== LEASE_MAGIC || holderLine === undefined || tokenLine === undefined || expiresLine === undefined) {
85
+ return null;
86
+ }
87
+ const holder = u64Line(holderLine);
88
+ const token = u64Line(tokenLine);
89
+ const expires = u64Line(expiresLine);
90
+ if (holder === null || token === null || expires === null) {
91
+ return null;
92
+ }
93
+ return { holder, token, expires };
94
+ }
95
+ /** Expiry of the lease's own bytes: the only break. */
96
+ function leaseExpired(lease, nowMs) {
97
+ return lease.expires <= BigInt(nowMs);
98
+ }
99
+ function isUnproved(error) {
100
+ const code = codeOf(error);
101
+ return code === "EIO" || code === "EINTR" || code === "ETIMEDOUT" || code === "EAGAIN" || code === "EBUSY";
102
+ }
103
+ /** A temp or parent that vanished mid-link is not Exists and not Created. */
104
+ function isVanished(error) {
105
+ return codeOf(error) === "ENOENT";
106
+ }
107
+ async function fsyncDir(dir) {
108
+ const handle = await fs.open(dir, "r");
109
+ const synced = await errors.try(handle.sync());
110
+ await handle.close();
111
+ if (synced.error) {
112
+ throw errors.wrap(synced.error, `fsync directory ${dir}`);
113
+ }
114
+ }
115
+ async function ensureParent(target, root) {
116
+ const dir = path.dirname(target);
117
+ const resolvedRoot = path.resolve(root);
118
+ const ancestors = [];
119
+ let cursor = dir;
120
+ while (cursor.startsWith(resolvedRoot) && cursor !== resolvedRoot) {
121
+ ancestors.push(cursor);
122
+ cursor = path.dirname(cursor);
123
+ }
124
+ const missing = [];
125
+ for (const ancestor of ancestors.reverse()) {
126
+ const st = await errors.try(fs.stat(ancestor));
127
+ if (st.error) {
128
+ if (codeOf(st.error) === "ENOENT") {
129
+ missing.push(ancestor);
130
+ continue;
131
+ }
132
+ throw st.error;
133
+ }
134
+ }
135
+ await fs.mkdir(dir, { recursive: true });
136
+ for (const created of missing) {
137
+ await fsyncDir(path.dirname(created));
138
+ }
139
+ }
140
+ let tempSeq = 0;
141
+ /** Write `bytes` to a fresh `wx` temp under `{root}/~tmp` and fsync it.
142
+ * The caller publishes the synced temp atomically. */
143
+ async function syncedTemp(root, bytes) {
144
+ tempSeq += 1;
145
+ const temp = path.join(root, ...reservedTemp(process.pid, tempSeq).split("/"));
146
+ await fs.mkdir(path.dirname(temp), { recursive: true });
147
+ const handle = await fs.open(temp, "wx");
148
+ const written = await errors.try((async function writeAll() {
149
+ await handle.writeFile(bytes);
150
+ await handle.sync();
151
+ })());
152
+ await handle.close();
153
+ if (written.error) {
154
+ await fs.rm(temp, { force: true });
155
+ throw errors.wrap(written.error, `write temp for ${root}`);
156
+ }
157
+ return temp;
158
+ }
159
+ /** link(2) is the exclusivity primitive: rename replaces an existing
160
+ * destination, so it cannot arbitrate create-only, while link fails
161
+ * atomically with EEXIST across processes — exactly the
162
+ * If-None-Match: * contract. */
163
+ async function publishLink(temp, dest) {
164
+ const linked = await errors.try(fs.link(temp, dest));
165
+ if (linked.error === undefined) {
166
+ return "linked";
167
+ }
168
+ if (codeOf(linked.error) === "EEXIST") {
169
+ return "occupied";
170
+ }
171
+ throw linked.error;
172
+ }
173
+ /** The lease directory for `key`: `{root}/~lease/{key}`. */
174
+ function leaseDir(root, key) {
175
+ return path.join(root, LEASE_NAMESPACE, ...key.split("/"));
176
+ }
177
+ function tokenPath(dir, token) {
178
+ return path.join(dir, String(token));
179
+ }
180
+ function headPath(dir) {
181
+ return path.join(dir, HEAD);
182
+ }
183
+ async function readHead(dir) {
184
+ const read = await errors.try(fs.readFile(headPath(dir), "utf8"));
185
+ if (read.error) {
186
+ if (codeOf(read.error) === "ENOENT") {
187
+ return null;
188
+ }
189
+ throw read.error;
190
+ }
191
+ const token = u64Line(read.data.trim());
192
+ if (token === null || token < 1n) {
193
+ return null;
194
+ }
195
+ return token;
196
+ }
197
+ async function writeHead(root, dir, token) {
198
+ const dest = headPath(dir);
199
+ const temp = await syncedTemp(root, new TextEncoder().encode(String(token)));
200
+ const replaced = await errors.try(fs.rename(temp, dest));
201
+ if (replaced.error) {
202
+ await fs.rm(temp, { force: true });
203
+ throw replaced.error;
204
+ }
205
+ await fsyncDir(dir);
206
+ }
207
+ /** Removes `{dir}/{1..=current-1}` after `~head` names `current`. */
208
+ async function forgetPredecessors(dir, current) {
209
+ for (let token = current - 1n; token >= 1n; token -= 1n) {
210
+ await fs.rm(tokenPath(dir, token), { force: true });
211
+ }
212
+ }
213
+ function probeFrom(dir, start) {
214
+ return (async function probe() {
215
+ let best = null;
216
+ let token = start;
217
+ while (token <= U64_MAX) {
218
+ const read = await errors.try(fs.readFile(tokenPath(dir, token), "utf8"));
219
+ if (read.error) {
220
+ if (codeOf(read.error) === "ENOENT") {
221
+ break;
222
+ }
223
+ token += 1n;
224
+ continue;
225
+ }
226
+ const lease = parseLease(read.data);
227
+ if (lease !== null) {
228
+ best = { token, lease };
229
+ }
230
+ token += 1n;
231
+ }
232
+ return best;
233
+ })();
234
+ }
235
+ /** The current lease is `{dir}/{n}` for the token `~head` names, or
236
+ * the highest `{dir}/{n}` at or after that hint. A mint past a stale
237
+ * head is still visible: the probe opens `n`, `n+1`, … until a gap. */
238
+ async function currentLease(dir) {
239
+ const start = (await readHead(dir)) ?? 1n;
240
+ const found = await probeFrom(dir, start);
241
+ if (found === null && start > 1n) {
242
+ return await probeFrom(dir, 1n);
243
+ }
244
+ return found;
245
+ }
246
+ async function tryMint(root, dir, key, token, holder, ttlMs) {
247
+ await fs.mkdir(dir, { recursive: true });
248
+ const body = encodeLease({ holder, token, expires: BigInt(Date.now() + ttlMs) });
249
+ const dest = path.join(root, ...reservedLease(key, token).split("/"));
250
+ const temp = await syncedTemp(root, body);
251
+ const published = await errors.try(publishLink(temp, dest));
252
+ await fs.rm(temp, { force: true });
253
+ if (published.error) {
254
+ throw published.error;
255
+ }
256
+ if (published.data === "occupied") {
257
+ return false;
258
+ }
259
+ await fsyncDir(dir);
260
+ const headed = await errors.try(writeHead(root, dir, token));
261
+ if (headed.error === undefined) {
262
+ await forgetPredecessors(dir, token);
263
+ }
264
+ return true;
265
+ }
266
+ /** Acquire the fenced lease on `{root}/~lease/{key}`: mint the next
267
+ * monotonic token iff the current lease's own bytes are expired.
268
+ * `wait` sleeps out a live holder; `refuse` throws. */
269
+ async function acquireFsLease(root, key, ttlMs, contend = "wait") {
270
+ const dir = leaseDir(root, key);
271
+ const holder = ourHolder();
272
+ for (;;) {
273
+ const current = await currentLease(dir);
274
+ if (current !== null && !leaseExpired(current.lease, Date.now())) {
275
+ if (contend === "refuse") {
276
+ throw errors.new("replica directory has an owner");
277
+ }
278
+ await new Promise(function later(resolve) {
279
+ setTimeout(resolve, Math.random() * LOCK_RETRY_MS);
280
+ });
281
+ continue;
282
+ }
283
+ const token = current === null ? 1n : current.token + 1n;
284
+ const minted = await tryMint(root, dir, key, token, holder, ttlMs);
285
+ if (!minted) {
286
+ continue;
287
+ }
288
+ return { root, dir, holder, token, path: tokenPath(dir, token) };
289
+ }
290
+ }
291
+ /** True iff this token is still the max — a stale holder lost the CAS
292
+ * and must not publish. */
293
+ async function stillCurrent(held) {
294
+ const current = await currentLease(held.dir);
295
+ return current !== null && current.token === held.token;
296
+ }
297
+ /** Release by rewriting the held token with an already-expired body so
298
+ * the next acquirer does not wait us out. */
299
+ async function releaseFsLease(held) {
300
+ const body = encodeLease({ holder: held.holder, token: held.token, expires: 0n });
301
+ const wrote = await errors.try(syncedTemp(held.root, body));
302
+ if (wrote.error) {
303
+ return;
304
+ }
305
+ const replaced = await errors.try(fs.rename(wrote.data, held.path));
306
+ if (replaced.error) {
307
+ await fs.rm(wrote.data, { force: true });
308
+ return;
309
+ }
310
+ const synced = await errors.try(fsyncDir(held.dir));
311
+ if (synced.error) {
312
+ return;
313
+ }
314
+ }
315
+ async function sweepStaleTemps(dir) {
316
+ const listed = await errors.try(fs.readdir(dir, { withFileTypes: true }));
317
+ if (listed.error) {
318
+ if (codeOf(listed.error) === "ENOENT") {
319
+ return;
320
+ }
321
+ throw listed.error;
322
+ }
323
+ const now = Date.now();
324
+ for (const entry of listed.data) {
325
+ if (!entry.isFile()) {
326
+ continue;
327
+ }
328
+ const full = path.join(dir, entry.name);
329
+ const st = await errors.try(fs.stat(full));
330
+ if (st.error) {
331
+ continue;
332
+ }
333
+ if (now - st.data.mtimeMs > TEMP_STALE_MS) {
334
+ await fs.rm(full, { force: true });
335
+ }
336
+ }
337
+ }
338
+ /** Sweep crash litter: stale temps under `~tmp`, and superseded tokens
339
+ * directly under `~lease` once `~head` names the current one. */
340
+ async function sweepReserved(root) {
341
+ await sweepStaleTemps(path.join(root, TEMP_NAMESPACE));
342
+ const dir = path.join(root, LEASE_NAMESPACE);
343
+ const current = await currentLease(dir);
344
+ if (current !== null) {
345
+ await forgetPredecessors(dir, current.token);
346
+ }
347
+ }
348
+ async function resolveAmbiguousCreate(store, key, attempted) {
349
+ const fetched = await store.get(key);
350
+ if (fetched === null) {
351
+ return { tag: "absent" };
352
+ }
353
+ if (bytesEqual(fetched.bytes, attempted)) {
354
+ return { tag: "landed", etag: fetched.etag };
355
+ }
356
+ return { tag: "lost", fetched };
357
+ }
358
+ async function resolveAmbiguousSwap(store, key, attempted) {
359
+ const fetched = await store.get(key);
360
+ if (fetched === null) {
361
+ return { tag: "absent" };
362
+ }
363
+ if (bytesEqual(fetched.bytes, attempted)) {
364
+ return { tag: "landed", etag: fetched.etag };
365
+ }
366
+ return { tag: "lost", fetched };
367
+ }
368
+ function cloneFetched(fetched) {
369
+ return { bytes: new Uint8Array(fetched.bytes), etag: fetched.etag };
370
+ }
371
+ /** The five verbs over one local directory. One machine is load-bearing. */
372
+ function fsStore(root) {
373
+ const rootPath = path.resolve(root);
374
+ const swept = (async function open() {
375
+ await sweepReserved(rootPath);
376
+ await fs.mkdir(path.join(rootPath, TEMP_NAMESPACE), { recursive: true });
377
+ await fs.mkdir(path.join(rootPath, LEASE_NAMESPACE), { recursive: true });
378
+ })();
379
+ function objectPath(key) {
380
+ return path.join(rootPath, ...key.split("/"));
381
+ }
382
+ async function readFetched(target) {
383
+ const read = await errors.try(fs.readFile(target));
384
+ if (read.error) {
385
+ if (codeOf(read.error) === "ENOENT") {
386
+ return null;
387
+ }
388
+ throw read.error;
389
+ }
390
+ const bytes = new Uint8Array(read.data);
391
+ return { bytes, etag: contentEtag(bytes) };
392
+ }
393
+ async function withKeyLease(key, body) {
394
+ const held = await acquireFsLease(rootPath, key, MUTATION_TTL_MS);
395
+ const ran = await errors.try(body(held));
396
+ await releaseFsLease(held);
397
+ if (ran.error) {
398
+ throw ran.error;
399
+ }
400
+ return ran.data;
401
+ }
402
+ return {
403
+ async get(key) {
404
+ await swept;
405
+ const target = objectPath(key);
406
+ const read = await errors.try(readFetched(target));
407
+ if (read.error) {
408
+ throw wrapStore(read.error, `get ${key}`);
409
+ }
410
+ return read.data;
411
+ },
412
+ async getIfChanged(key, etag) {
413
+ await swept;
414
+ const target = objectPath(key);
415
+ const read = await errors.try(readFetched(target));
416
+ if (read.error) {
417
+ throw wrapStore(read.error, `getIfChanged ${key}`);
418
+ }
419
+ if (read.data === null) {
420
+ throw wrapStore(errors.new("poll target absent"), `getIfChanged ${key}`);
421
+ }
422
+ if (read.data.etag === etag) {
423
+ return { tag: "unchanged" };
424
+ }
425
+ return { tag: "changed", fetched: read.data };
426
+ },
427
+ async putCreate(key, bytes) {
428
+ await swept;
429
+ const target = objectPath(key);
430
+ const ran = await errors.try((async function createBody() {
431
+ return await withKeyLease(key, async function underLease(held) {
432
+ if (!(await stillCurrent(held))) {
433
+ return { tag: "ambiguous" };
434
+ }
435
+ await ensureParent(target, rootPath);
436
+ const temp = await syncedTemp(rootPath, bytes);
437
+ const published = await errors.try(publishLink(temp, target));
438
+ await fs.rm(temp, { force: true });
439
+ if (published.error) {
440
+ if (isUnproved(published.error) || isVanished(published.error)) {
441
+ return { tag: "ambiguous" };
442
+ }
443
+ throw published.error;
444
+ }
445
+ if (published.data === "occupied") {
446
+ const st = await errors.try(fs.stat(target));
447
+ if (st.error) {
448
+ if (codeOf(st.error) === "ENOENT" || isUnproved(st.error)) {
449
+ return { tag: "ambiguous" };
450
+ }
451
+ throw st.error;
452
+ }
453
+ if (st.data.isDirectory()) {
454
+ throw errors.new("key path is a directory");
455
+ }
456
+ return { tag: "exists" };
457
+ }
458
+ const synced = await errors.try(fsyncDir(path.dirname(target)));
459
+ if (synced.error) {
460
+ return { tag: "ambiguous" };
461
+ }
462
+ return { tag: "created", etag: contentEtag(bytes) };
463
+ });
464
+ })());
465
+ if (ran.error) {
466
+ if (isUnproved(ran.error) || isVanished(ran.error)) {
467
+ return { tag: "ambiguous" };
468
+ }
469
+ throw wrapStore(ran.error, `putCreate ${key}`);
470
+ }
471
+ return ran.data;
472
+ },
473
+ async putSwap(key, bytes, etag) {
474
+ await swept;
475
+ const target = objectPath(key);
476
+ const ran = await errors.try((async function swapBody() {
477
+ return await withKeyLease(key, async function underLease(held) {
478
+ if (!(await stillCurrent(held))) {
479
+ return { tag: "ambiguous" };
480
+ }
481
+ const current = await readFetched(target);
482
+ if (current === null || current.etag !== etag) {
483
+ return { tag: "moved" };
484
+ }
485
+ const temp = await syncedTemp(rootPath, bytes);
486
+ const renamed = await errors.try(fs.rename(temp, target));
487
+ if (renamed.error) {
488
+ await fs.rm(temp, { force: true });
489
+ if (isUnproved(renamed.error)) {
490
+ return { tag: "ambiguous" };
491
+ }
492
+ throw renamed.error;
493
+ }
494
+ const synced = await errors.try(fsyncDir(path.dirname(target)));
495
+ if (synced.error) {
496
+ return { tag: "ambiguous" };
497
+ }
498
+ return { tag: "swapped", etag: contentEtag(bytes) };
499
+ });
500
+ })());
501
+ if (ran.error) {
502
+ if (isUnproved(ran.error)) {
503
+ return { tag: "ambiguous" };
504
+ }
505
+ throw wrapStore(ran.error, `putSwap ${key}`);
506
+ }
507
+ return ran.data;
508
+ },
509
+ async delete(key) {
510
+ await swept;
511
+ const target = objectPath(key);
512
+ const ran = await errors.try((async function deleteBody() {
513
+ await withKeyLease(key, async function underLease(held) {
514
+ if (!(await stillCurrent(held))) {
515
+ return;
516
+ }
517
+ await fs.rm(target, { force: true });
518
+ await fsyncDir(path.dirname(target));
519
+ });
520
+ })());
521
+ if (ran.error) {
522
+ throw wrapStore(ran.error, `delete ${key}`);
523
+ }
524
+ }
525
+ };
526
+ }
527
+ /**
528
+ * The five verbs over one in-process Map. Single-process only: tests
529
+ * and ephemeral dev inside this process, no persistence, no
530
+ * cross-process claim, no configuration. Third `Etag` producer beside
531
+ * `fsStore` and `s3Store`: blake3 of the content, `fsStore`'s mint,
532
+ * carried as the same opaque brand. Every read returns a fresh buffer.
533
+ */
534
+ function memStore() {
535
+ const objects = new Map();
536
+ return {
537
+ async get(key) {
538
+ const current = objects.get(key);
539
+ return current === undefined ? null : cloneFetched(current);
540
+ },
541
+ async getIfChanged(key, etag) {
542
+ const current = objects.get(key);
543
+ if (current === undefined) {
544
+ throw wrapStore(errors.new("poll target absent"), `getIfChanged ${key}`);
545
+ }
546
+ if (current.etag === etag) {
547
+ return { tag: "unchanged" };
548
+ }
549
+ return { tag: "changed", fetched: cloneFetched(current) };
550
+ },
551
+ async putCreate(key, bytes) {
552
+ if (objects.has(key)) {
553
+ return { tag: "exists" };
554
+ }
555
+ const copy = new Uint8Array(bytes);
556
+ const tag = contentEtag(copy);
557
+ objects.set(key, { bytes: copy, etag: tag });
558
+ return { tag: "created", etag: tag };
559
+ },
560
+ async putSwap(key, bytes, etag) {
561
+ const current = objects.get(key);
562
+ if (current === undefined || current.etag !== etag) {
563
+ return { tag: "moved" };
564
+ }
565
+ const copy = new Uint8Array(bytes);
566
+ const tag = contentEtag(copy);
567
+ objects.set(key, { bytes: copy, etag: tag });
568
+ return { tag: "swapped", etag: tag };
569
+ },
570
+ async delete(key) {
571
+ objects.delete(key);
572
+ }
573
+ };
574
+ }
575
+ export { s3Store } from "#store-s3.ts";
576
+ export { acquireFsLease, encodeLease, etag, fsStore, MUTATION_TTL_MS, memStore, parseLease, releaseFsLease, resolveAmbiguousCreate, resolveAmbiguousSwap, sweepStaleTemps, syncedTemp };
577
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Per-tenant replicas (50, case 4): an LRU of replicas keyed by tenant
3
+ * id — a tenant is a prefix (`<root>/t/<tenant>`), eviction closes and
4
+ * deletes the local dir (the disposable law), and `t/_shared` is
5
+ * pinned. Braids shard within a tenant; tenants shard the world. A
6
+ * tenant id is one StoreKey segment. `get` returns a live handle whose
7
+ * refcount pins it against eviction for the duration of the borrow
8
+ * (findings 38, 71) — the pin outlives `get` and drops only on
9
+ * `release`; a disposed handle is a distinct type. One fenced lease
10
+ * owns each replica directory and is CAS-renewed while the slot is
11
+ * open, so a second live replica on that dir is unrepresentable
12
+ * (findings 39, 48).
13
+ */
14
+ import type { Schema, SchemaRelations } from "@bjornpagen/bumbledb";
15
+ import type { Replica } from "./replica.js";
16
+ import type { ObjectStore } from "./store.js";
17
+ interface OpenTenantsOptions<Rels extends SchemaRelations> {
18
+ readonly store: ObjectStore;
19
+ readonly root: string;
20
+ readonly dir: string;
21
+ readonly theory: Schema<Rels>;
22
+ /** 50's 400 MB gate: checkpoint + working set per instance. Advisory,
23
+ * measured once at each tenant's open — a replica that grows after
24
+ * admission is not re-weighed until it is evicted and re-opened. */
25
+ readonly budgetBytes?: number;
26
+ readonly maxOpen?: number;
27
+ /** Directory-lease TTL. Renewed at one-third this value while the
28
+ * replica is open. Default 300_000. */
29
+ readonly dirLeaseMs?: number;
30
+ }
31
+ declare const liveHandleBrand: unique symbol;
32
+ declare const disposedHandleBrand: unique symbol;
33
+ type LiveHandle<Rels extends SchemaRelations> = Replica<Rels> & {
34
+ readonly [liveHandleBrand]: typeof liveHandleBrand;
35
+ /** Drop one borrow. LRU and `evict` become legal only when `refs`
36
+ * reaches 0 — not when `get` returns. */
37
+ release(): void;
38
+ };
39
+ /** A handle whose replica is gone. Every verb is a compile-time
40
+ * refusal — there is no replica field to call, so `waitFor` into a
41
+ * disposed replica is a type error. */
42
+ type DisposedHandle = {
43
+ readonly [disposedHandleBrand]: typeof disposedHandleBrand;
44
+ };
45
+ interface Tenants<Rels extends SchemaRelations> extends AsyncDisposable {
46
+ get(tenant: string): Promise<LiveHandle<Rels>>;
47
+ /** Evicts one tenant: closes the replica and deletes its directory.
48
+ * `_shared` and a still-pinned borrow refuse by doing nothing. */
49
+ evict(tenant: string): Promise<DisposedHandle | null>;
50
+ /** Drop one `get` borrow for `tenant`. */
51
+ release(tenant: string): void;
52
+ }
53
+ declare function openTenants<Rels extends SchemaRelations>(options: OpenTenantsOptions<Rels>): Tenants<Rels>;
54
+ export type { OpenTenantsOptions, Tenants };
55
+ export { openTenants };
56
+ //# sourceMappingURL=tenants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenants.d.ts","sourceRoot":"","sources":["../src/tenants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAInE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,WAAW,CAAA;AAWrD,UAAU,kBAAkB,CAAC,IAAI,SAAS,eAAe;IACxD,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7B;;yEAEqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB;4CACwC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,QAAA,MAAM,eAAe,EAAE,OAAO,MAA6B,CAAA;AAC3D,QAAA,MAAM,mBAAmB,EAAE,OAAO,MAAiC,CAAA;AAEnE,KAAK,UAAU,CAAC,IAAI,SAAS,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG;IAC/D,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,eAAe,CAAA;IAClD;8CAC0C;IAC1C,OAAO,IAAI,IAAI,CAAA;CACf,CAAA;AAED;;wCAEwC;AACxC,KAAK,cAAc,GAAG;IACrB,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,OAAO,mBAAmB,CAAA;CAC1D,CAAA;AAED,UAAU,OAAO,CAAC,IAAI,SAAS,eAAe,CAAE,SAAQ,eAAe;IACtE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IAC9C;uEACmE;IACnE,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IACrD,0CAA0C;IAC1C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAwFD,iBAAS,WAAW,CAAC,IAAI,SAAS,eAAe,EAAE,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0PnG;AAED,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,CAAA"}