@volter/browser-wali 0.1.9 → 0.1.11

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 (113) hide show
  1. package/dist/bulk-memory.d.ts +23 -0
  2. package/dist/bulk-memory.d.ts.map +1 -0
  3. package/dist/bulk-memory.js +50 -0
  4. package/dist/bulk-memory.js.map +1 -0
  5. package/dist/coherent-file-locks.d.ts +4 -1
  6. package/dist/coherent-file-locks.d.ts.map +1 -1
  7. package/dist/coherent-file-locks.js +24 -1
  8. package/dist/coherent-file-locks.js.map +1 -1
  9. package/dist/descriptors.d.ts +18 -1
  10. package/dist/descriptors.d.ts.map +1 -1
  11. package/dist/descriptors.js +51 -6
  12. package/dist/descriptors.js.map +1 -1
  13. package/dist/filesystem-host.d.ts +81 -0
  14. package/dist/filesystem-host.d.ts.map +1 -0
  15. package/dist/filesystem-host.js +849 -0
  16. package/dist/filesystem-host.js.map +1 -0
  17. package/dist/filesystem-protocol.d.ts +49 -1
  18. package/dist/filesystem-protocol.d.ts.map +1 -1
  19. package/dist/filesystem-protocol.js +17 -0
  20. package/dist/filesystem-protocol.js.map +1 -1
  21. package/dist/filesystem-remote.d.ts +72 -18
  22. package/dist/filesystem-remote.d.ts.map +1 -1
  23. package/dist/filesystem-remote.js +271 -40
  24. package/dist/filesystem-remote.js.map +1 -1
  25. package/dist/filesystem-worker.js +8 -502
  26. package/dist/filesystem-worker.js.map +1 -1
  27. package/dist/filesystem.d.ts +9 -0
  28. package/dist/filesystem.d.ts.map +1 -1
  29. package/dist/filesystem.js +209 -61
  30. package/dist/filesystem.js.map +1 -1
  31. package/dist/host-idle.d.ts +29 -0
  32. package/dist/host-idle.d.ts.map +1 -0
  33. package/dist/host-idle.js +68 -0
  34. package/dist/host-idle.js.map +1 -0
  35. package/dist/host.d.ts +1 -0
  36. package/dist/host.d.ts.map +1 -1
  37. package/dist/host.js +1 -3
  38. package/dist/host.js.map +1 -1
  39. package/dist/memory.d.ts.map +1 -1
  40. package/dist/memory.js +79 -18
  41. package/dist/memory.js.map +1 -1
  42. package/dist/module-layout.d.ts +6 -0
  43. package/dist/module-layout.d.ts.map +1 -1
  44. package/dist/module-layout.js +26 -3
  45. package/dist/module-layout.js.map +1 -1
  46. package/dist/monotonic-clock.d.ts +9 -0
  47. package/dist/monotonic-clock.d.ts.map +1 -1
  48. package/dist/monotonic-clock.js +11 -0
  49. package/dist/monotonic-clock.js.map +1 -1
  50. package/dist/network-worker.js +7 -2
  51. package/dist/network-worker.js.map +1 -1
  52. package/dist/network.d.ts.map +1 -1
  53. package/dist/network.js +11 -8
  54. package/dist/network.js.map +1 -1
  55. package/dist/process-bridge.d.ts.map +1 -1
  56. package/dist/process-bridge.js +25 -5
  57. package/dist/process-bridge.js.map +1 -1
  58. package/dist/program.d.ts +5 -1
  59. package/dist/program.d.ts.map +1 -1
  60. package/dist/program.js +13 -12
  61. package/dist/program.js.map +1 -1
  62. package/dist/runtime.d.ts.map +1 -1
  63. package/dist/runtime.js +75 -9
  64. package/dist/runtime.js.map +1 -1
  65. package/dist/shared-file-layer.d.ts +69 -0
  66. package/dist/shared-file-layer.d.ts.map +1 -0
  67. package/dist/shared-file-layer.js +299 -0
  68. package/dist/shared-file-layer.js.map +1 -0
  69. package/dist/shared-pipes.d.ts +7 -0
  70. package/dist/shared-pipes.d.ts.map +1 -1
  71. package/dist/shared-pipes.js +56 -17
  72. package/dist/shared-pipes.js.map +1 -1
  73. package/dist/signals.d.ts +2 -0
  74. package/dist/signals.d.ts.map +1 -1
  75. package/dist/signals.js +5 -1
  76. package/dist/signals.js.map +1 -1
  77. package/dist/snapshot-filesystem.d.ts +36 -3
  78. package/dist/snapshot-filesystem.d.ts.map +1 -1
  79. package/dist/snapshot-filesystem.js +204 -19
  80. package/dist/snapshot-filesystem.js.map +1 -1
  81. package/dist/stdin.d.ts.map +1 -1
  82. package/dist/stdin.js +3 -2
  83. package/dist/stdin.js.map +1 -1
  84. package/dist/symlink.d.ts.map +1 -1
  85. package/dist/symlink.js +91 -1
  86. package/dist/symlink.js.map +1 -1
  87. package/dist/system.d.ts.map +1 -1
  88. package/dist/system.js +17 -6
  89. package/dist/system.js.map +1 -1
  90. package/dist/thread-coordinator-worker.d.ts +1 -25
  91. package/dist/thread-coordinator-worker.d.ts.map +1 -1
  92. package/dist/thread-coordinator-worker.js +29 -2
  93. package/dist/thread-coordinator-worker.js.map +1 -1
  94. package/dist/thread-worker.js +13 -8
  95. package/dist/thread-worker.js.map +1 -1
  96. package/dist/threads.d.ts +4 -0
  97. package/dist/threads.d.ts.map +1 -1
  98. package/dist/threads.js +72 -43
  99. package/dist/threads.js.map +1 -1
  100. package/dist/types.d.ts +10 -0
  101. package/dist/types.d.ts.map +1 -1
  102. package/dist/websocket-peer.d.ts.map +1 -1
  103. package/dist/websocket-peer.js +2 -1
  104. package/dist/websocket-peer.js.map +1 -1
  105. package/dist/worker-program-protocol.d.ts +26 -0
  106. package/dist/worker-program-protocol.d.ts.map +1 -1
  107. package/dist/worker-program-worker.js +26 -8
  108. package/dist/worker-program-worker.js.map +1 -1
  109. package/dist/worker-program.d.ts +43 -0
  110. package/dist/worker-program.d.ts.map +1 -1
  111. package/dist/worker-program.js +198 -24
  112. package/dist/worker-program.js.map +1 -1
  113. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgBpD,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,OAAuC,CAAC;AAE3F,wBAAgB,qBAAqB,IAAI,iBAAiB,CAEzD;AAED,2FAA2F;AAC3F,qBAAa,WAAW;IAEV,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAD9C,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;gBACN,MAAM,EAAE,iBAAiB;IAC9C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAKd,OAAO,IAAI,IAAI;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU;IAcrD;;;;;OAKG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAI,EAAE,MAAM,SAAI,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS;IAgB7E,OAAO,IAAI,MAAM;IAQjB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;CAepG;AAED,6FAA6F;AAC7F,qBAAa,cAAc;IAKvB,QAAQ,CAAC,OAAO,EAAE,WAAW;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAPlC,IAAI,SAAM;IACV,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAK;gBAET,OAAO,EAAE,WAAW,EACZ,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,EAChC,KAAK,EAAE,MAAM,WAAW,CAAC,KAAK,GAAG,SAAS,EAC1C,eAAe,EAAE,MAAM,MAAM;IAEhD,OAAO,CAAC,KAAK;IAGb,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAqC5C;;;;OAIG;IACH,OAAO,IAAI,OAAO;CAqCnB"}
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgBpD,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,OAAuC,CAAC;AAE3F,wBAAgB,qBAAqB,IAAI,iBAAiB,CAEzD;AAED,2FAA2F;AAC3F,qBAAa,WAAW;IAEV,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAD9C,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;gBACN,MAAM,EAAE,iBAAiB;IAC9C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAKd,OAAO,IAAI,IAAI;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU;IAcrD;;;;;OAKG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAI,EAAE,MAAM,SAAI,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS;IAgB7E,sGAAsG;IACtG,UAAU,IAAI,OAAO;IAGrB,OAAO,IAAI,MAAM;IAQjB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;CAepG;AAED,6FAA6F;AAC7F,qBAAa,cAAc;IAKvB,QAAQ,CAAC,OAAO,EAAE,WAAW;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAPlC,IAAI,SAAM;IACV,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAK;gBAET,OAAO,EAAE,WAAW,EACZ,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,EAChC,KAAK,EAAE,MAAM,WAAW,CAAC,KAAK,GAAG,SAAS,EAC1C,eAAe,EAAE,MAAM,MAAM;IAEhD,OAAO,CAAC,KAAK;IAGb,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAqC5C;;;;OAIG;IACH,OAAO,IAAI,OAAO;CAqCnB"}
package/dist/signals.js CHANGED
@@ -76,6 +76,10 @@ export class WaliSignals {
76
76
  return "handled";
77
77
  });
78
78
  }
79
+ /** Whether any signal is pending at all: a word, without the BigInt set every syscall would build. */
80
+ anyPending() {
81
+ return Atomics.load(this.words, 2) !== 0;
82
+ }
79
83
  pending() {
80
84
  if (Atomics.load(this.words, 2) === 0)
81
85
  return 0n;
@@ -177,7 +181,7 @@ export class WaliSignalHost {
177
181
  * again, as the kernel restarts it, instead of failing with EINTR.
178
182
  */
179
183
  deliver() {
180
- if (this.delivering || (this.signals.pending() & ~this.mask) === 0n)
184
+ if (this.delivering || !this.signals.anyPending() || (this.signals.pending() & ~this.mask) === 0n)
181
185
  return false;
182
186
  this.delivering = true;
183
187
  let ran = false;
@@ -1 +1 @@
1
- {"version":3,"file":"signals.js","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { BrowserFileSnapshotEntry, BrowserFileSystemSnapshot } from "@volter/browser-runtime/browser-filesystem.js";
2
- import { type PackStore } from "@volter/browser-runtime/browser-pack-store.js";
2
+ import type { LowerTree } from "./shared-file-layer.js";
3
3
  import type { WaliFileStat, WaliFileSystem } from "./types.js";
4
4
  /** Small transferable filesystem used inside WALI process workers. */
5
5
  export declare class SnapshotWaliFileSystem implements WaliFileSystem {
@@ -32,7 +32,7 @@ export declare class SnapshotWaliFileSystem implements WaliFileSystem {
32
32
  * is metadata, and the entries in it that carry content, a program's
33
33
  * private files, are written over the store's.
34
34
  */
35
- static fromStore(store: PackStore, snapshot: BrowserFileSystemSnapshot): SnapshotWaliFileSystem;
35
+ static fromStore(store: LowerTree, snapshot: BrowserFileSystemSnapshot): SnapshotWaliFileSystem;
36
36
  /** A path's node: one this tree holds, or the store's entry for it, made a node the first time it is asked for. */
37
37
  private node;
38
38
  private lowerNode;
@@ -82,7 +82,7 @@ export declare class SnapshotWaliFileSystem implements WaliFileSystem {
82
82
  * Always content-carrying, never sized -- the caller named this path
83
83
  * because it changed, so a size would be exactly the wrong answer.
84
84
  */
85
- writtenEntry(path: string): BrowserFileSnapshotEntry | undefined;
85
+ writtenEntry(path: string, raw?: boolean): BrowserFileSnapshotEntry | undefined;
86
86
  /**
87
87
  * The tree as a snapshot describes it. An entry with content is written;
88
88
  * an entry without keeps the bytes this tree already holds for that path,
@@ -130,8 +130,20 @@ export declare class SnapshotWaliFileSystem implements WaliFileSystem {
130
130
  lstatSync(path: string): WaliFileStat;
131
131
  readFile(path: string): Promise<Uint8Array>;
132
132
  readFileSync(path: string): Uint8Array;
133
+ /**
134
+ * A path's link target when it is a file-backed link (`symlink.ts`), found
135
+ * once per node. Every open, stat and access resolves each component of its
136
+ * path through this question, and asking it as exists + stat + a read of
137
+ * the head made a small file's `open` and `stat` several times what they
138
+ * cost in a filesystem with link nodes (measured 2026-09-28: 200 files
139
+ * written and stat-ed, 8-20 ms against WasmFS's 2.5-5). A file whose size
140
+ * lies outside [minimum, maximum] is answered without its bytes.
141
+ */
142
+ linkTargetSync(path: string, minimum: number, maximum: number, parse: (bytes: Uint8Array) => string | undefined, normal?: boolean): string | undefined;
133
143
  /** The file's bytes, read from the store the first time. */
134
144
  private bytesOf;
145
+ /** The range as a view of the file's own bytes: valid until the file is next written. */
146
+ viewRangeSync(path: string, offset: number, length: number): Uint8Array;
135
147
  readRangeSync(path: string, offset: number, length: number): Uint8Array;
136
148
  /**
137
149
  * Write in place, growing the backing buffer geometrically. `content` is a
@@ -141,6 +153,27 @@ export declare class SnapshotWaliFileSystem implements WaliFileSystem {
141
153
  * created; a gap past the old end is zero.
142
154
  */
143
155
  writeRangeSync(path: string, offset: number, data: Uint8Array): void;
156
+ /**
157
+ * A file cut or extended to `length`, in place where its bytes are this
158
+ * tree's own: a rewrite (`O_TRUNC`, then writes) keeps the buffer the file
159
+ * already grew, as a libc heap keeps what was freed, instead of faulting in
160
+ * a new one from nothing (measured 2026-09-28: most of an 8 MB rewrite was
161
+ * that allocation, and WasmFS's rewrite is a memcpy into warm pages). What
162
+ * lies past the new end stays unobservable -- every reader goes through the
163
+ * view -- and every extension zeroes what it exposes.
164
+ */
165
+ truncateSync(path: string, length: number): void;
166
+ /**
167
+ * Buffers of files this tree owned and dropped (replaced by a rename,
168
+ * unlinked, outgrown), which the next file to grow takes before it asks for
169
+ * new memory. A save that writes `name@` and renames it over `name` -- every
170
+ * Blender save -- otherwise grows a fresh buffer from 4 KB each time while
171
+ * the last save's lies unreferenced. Small and bounded: this is warm memory
172
+ * held back from the collector, so only a few recent large buffers.
173
+ */
174
+ private spares;
175
+ private release;
176
+ private takeSpare;
144
177
  writeFileSync(path: string, data: string | Uint8Array): void;
145
178
  mkdirSync(path: string, options?: {
146
179
  recursive?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-filesystem.d.ts","sourceRoot":"","sources":["../src/snapshot-filesystem.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshot-filesystem.d.ts","sourceRoot":"","sources":["../src/snapshot-filesystem.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { realtimeMilliseconds } from "./monotonic-clock.js";
1
2
  import { PROJECT_ROOTS } from "@volter/browser-runtime/browser-pack-store.js";
2
3
  import { encodeBase64, decodeBase64 } from "@volter/browser-runtime/browser-base64.js";
3
4
  /**
@@ -158,7 +159,8 @@ export class SnapshotWaliFileSystem {
158
159
  const store = this.lower;
159
160
  return entry.type === "directory"
160
161
  ? { type: "directory", fromStore: true, mode: entry.mode & 0o7777, atimeMs: entry.mtimeMs, mtimeMs: entry.mtimeMs, ino: this.nextInode++ }
161
- : { type: "file", fromStore: true, load: () => store.read(path), size: entry.length, mode: entry.mode & 0o7777, atimeMs: entry.mtimeMs, mtimeMs: entry.mtimeMs, ino: this.nextInode++ };
162
+ // A view where the lower tree gives one: the bytes stay the layer's until this tree writes them (`writeRangeSync`).
163
+ : { type: "file", fromStore: true, load: () => store.view ? store.view(path) : store.read(path), size: entry.length, mode: entry.mode & 0o7777, atimeMs: entry.mtimeMs, mtimeMs: entry.mtimeMs, ino: this.nextInode++ };
162
164
  }
163
165
  /**
164
166
  * The tree for a peer that reads the same store: only what differs from it.
@@ -260,7 +262,7 @@ export class SnapshotWaliFileSystem {
260
262
  * Always content-carrying, never sized -- the caller named this path
261
263
  * because it changed, so a size would be exactly the wrong answer.
262
264
  */
263
- writtenEntry(path) {
265
+ writtenEntry(path, raw = false) {
264
266
  const normalized = normalize(path);
265
267
  const node = this.node(normalized);
266
268
  if (!node)
@@ -268,6 +270,9 @@ export class SnapshotWaliFileSystem {
268
270
  const details = { mode: node.mode, mtimeMs: node.mtimeMs };
269
271
  if (node.type === "directory")
270
272
  return { path: normalized, type: "directory", ...details };
273
+ // Raw for the live channel to the page (ADR-0046): a copy, whose buffer the post transfers.
274
+ if (raw)
275
+ return { path: normalized, type: "file", bytes: this.bytesOf(node).slice(), ...details };
271
276
  return {
272
277
  path: normalized,
273
278
  type: "file",
@@ -433,6 +438,26 @@ export class SnapshotWaliFileSystem {
433
438
  throw new Error(`EISDIR: illegal operation on a directory, read '${normalized}'`);
434
439
  return this.bytesOf(node).slice();
435
440
  }
441
+ /**
442
+ * A path's link target when it is a file-backed link (`symlink.ts`), found
443
+ * once per node. Every open, stat and access resolves each component of its
444
+ * path through this question, and asking it as exists + stat + a read of
445
+ * the head made a small file's `open` and `stat` several times what they
446
+ * cost in a filesystem with link nodes (measured 2026-09-28: 200 files
447
+ * written and stat-ed, 8-20 ms against WasmFS's 2.5-5). A file whose size
448
+ * lies outside [minimum, maximum] is answered without its bytes.
449
+ */
450
+ linkTargetSync(path, minimum, maximum, parse, normal = false) {
451
+ // `normal`: the caller walked a normal path and asks of its prefixes, so each is normal already.
452
+ const node = this.node(normal ? path : normalize(path));
453
+ if (node?.type !== "file")
454
+ return undefined;
455
+ if (node.link === undefined) {
456
+ const size = node.content?.byteLength ?? node.size ?? 0;
457
+ node.link = size < minimum || size > maximum ? null : (parse(this.bytesOf(node)) ?? null);
458
+ }
459
+ return node.link ?? undefined;
460
+ }
436
461
  /** The file's bytes, read from the store the first time. */
437
462
  bytesOf(node) {
438
463
  if (node.content === undefined && node.load) {
@@ -441,6 +466,15 @@ export class SnapshotWaliFileSystem {
441
466
  }
442
467
  return node.content ?? new Uint8Array();
443
468
  }
469
+ /** The range as a view of the file's own bytes: valid until the file is next written. */
470
+ viewRangeSync(path, offset, length) {
471
+ const node = this.node(normalize(path));
472
+ if (!node)
473
+ throw new Error(`ENOENT: no such file, open '${normalize(path)}'`);
474
+ if (node.type !== "file")
475
+ throw new Error(`EISDIR: illegal operation on a directory, read '${normalize(path)}'`);
476
+ return this.bytesOf(node).subarray(offset, offset + length);
477
+ }
444
478
  readRangeSync(path, offset, length) {
445
479
  const normalized = normalize(path);
446
480
  const node = this.node(normalized);
@@ -461,15 +495,19 @@ export class SnapshotWaliFileSystem {
461
495
  this.mutate(() => {
462
496
  const normalized = normalize(path);
463
497
  this.mkdirSync(parent(normalized), { recursive: true });
498
+ // A path the program removed is new when written again: the store's file
499
+ // it once named stays gone, and its bytes do not come back.
500
+ const removed = this.isHidden(normalized);
464
501
  this.unhide(normalized);
465
- const existing = this.node(normalized);
502
+ const existing = removed ? this.nodes.get(normalized) : this.node(normalized);
466
503
  if (existing?.type === "directory")
467
504
  throw new Error(`EISDIR: illegal operation on a directory, write '${normalized}'`);
468
505
  const current = existing ? this.bytesOf(existing) : new Uint8Array();
469
506
  const end = offset + data.byteLength;
470
507
  let content;
471
508
  if (end <= current.byteLength) {
472
- content = current;
509
+ // In place only in bytes this tree owns: a loaded file's may be a view of a shared layer.
510
+ content = existing?.dirty ? current : current.slice();
473
511
  }
474
512
  else if (end <= current.buffer.byteLength - current.byteOffset && existing?.dirty) {
475
513
  // Room in a buffer this store already grew for the file (a dirty
@@ -478,8 +516,14 @@ export class SnapshotWaliFileSystem {
478
516
  content.fill(0, current.byteLength, offset);
479
517
  }
480
518
  else {
481
- content = new Uint8Array(new ArrayBuffer(Math.max(end, current.byteLength * 2, 4096)), 0, end);
519
+ const spare = this.takeSpare(end);
520
+ content = new Uint8Array(spare ?? new ArrayBuffer(Math.max(end, current.byteLength * 2, 4096)), 0, end);
482
521
  content.set(current);
522
+ // A spare buffer holds what its last file did; a new one is zero.
523
+ if (spare)
524
+ content.fill(0, current.byteLength, offset);
525
+ if (existing?.dirty)
526
+ this.release(current);
483
527
  }
484
528
  content.set(data, offset);
485
529
  this.nodes.set(normalized, {
@@ -487,26 +531,109 @@ export class SnapshotWaliFileSystem {
487
531
  content,
488
532
  dirty: true,
489
533
  mode: existing?.type === "file" ? existing.mode : 0o644,
490
- atimeMs: Date.now(),
491
- mtimeMs: Date.now(),
534
+ atimeMs: realtimeMilliseconds(),
535
+ mtimeMs: realtimeMilliseconds(),
492
536
  ino: existing?.type === "file" ? existing.ino : this.nextInode++,
493
537
  });
494
538
  this.markMutation(normalized);
495
539
  });
496
540
  }
541
+ /**
542
+ * A file cut or extended to `length`, in place where its bytes are this
543
+ * tree's own: a rewrite (`O_TRUNC`, then writes) keeps the buffer the file
544
+ * already grew, as a libc heap keeps what was freed, instead of faulting in
545
+ * a new one from nothing (measured 2026-09-28: most of an 8 MB rewrite was
546
+ * that allocation, and WasmFS's rewrite is a memcpy into warm pages). What
547
+ * lies past the new end stays unobservable -- every reader goes through the
548
+ * view -- and every extension zeroes what it exposes.
549
+ */
550
+ truncateSync(path, length) {
551
+ this.mutate(() => {
552
+ const normalized = normalize(path);
553
+ const existing = this.node(normalized);
554
+ if (!existing)
555
+ throw new Error(`ENOENT: no such file, truncate '${normalized}'`);
556
+ if (existing.type !== "file")
557
+ throw new Error(`EISDIR: illegal operation on a directory, truncate '${normalized}'`);
558
+ let content;
559
+ if (length === 0 && existing.content === undefined) {
560
+ // Emptied before it was ever read: the store's bytes are not needed at all.
561
+ content = new Uint8Array();
562
+ }
563
+ else {
564
+ const current = this.bytesOf(existing);
565
+ const capacity = current.buffer.byteLength - current.byteOffset;
566
+ if (existing.dirty && length <= capacity && (capacity <= SPARE_MINIMUM || length * 4 >= capacity)) {
567
+ content = new Uint8Array(current.buffer, current.byteOffset, length);
568
+ content.fill(0, current.byteLength);
569
+ }
570
+ else {
571
+ // Cut far below what the buffer holds: the file stops holding it, and
572
+ // it goes where the next file to grow may take it back (a rewrite's
573
+ // own writes, usually), within the spares' bound.
574
+ content = new Uint8Array(length);
575
+ content.set(current.subarray(0, length));
576
+ if (existing.dirty)
577
+ this.release(current);
578
+ }
579
+ }
580
+ this.nodes.set(normalized, {
581
+ type: "file",
582
+ content,
583
+ dirty: true,
584
+ mode: existing.mode,
585
+ atimeMs: realtimeMilliseconds(),
586
+ mtimeMs: realtimeMilliseconds(),
587
+ ino: existing.ino,
588
+ });
589
+ this.markMutation(normalized);
590
+ });
591
+ }
592
+ /**
593
+ * Buffers of files this tree owned and dropped (replaced by a rename,
594
+ * unlinked, outgrown), which the next file to grow takes before it asks for
595
+ * new memory. A save that writes `name@` and renames it over `name` -- every
596
+ * Blender save -- otherwise grows a fresh buffer from 4 KB each time while
597
+ * the last save's lies unreferenced. Small and bounded: this is warm memory
598
+ * held back from the collector, so only a few recent large buffers.
599
+ */
600
+ spares = [];
601
+ release(bytes) {
602
+ const buffer = bytes.buffer;
603
+ if (!(buffer instanceof ArrayBuffer) || buffer.byteLength < SPARE_MINIMUM || buffer.byteLength > SPARE_TOTAL)
604
+ return;
605
+ this.spares.push(buffer);
606
+ let total = this.spares.reduce((sum, spare) => sum + spare.byteLength, 0);
607
+ while (this.spares.length > SPARE_COUNT || total > SPARE_TOTAL)
608
+ total -= this.spares.shift().byteLength;
609
+ }
610
+ takeSpare(length) {
611
+ // Only a spare that fits: a small file handed a large buffer would hold it for its life.
612
+ const largest = Math.max(length * 4, SPARE_MINIMUM * 4);
613
+ let best = -1;
614
+ this.spares.forEach((spare, index) => {
615
+ if (spare.byteLength >= length && spare.byteLength <= largest
616
+ && (best < 0 || spare.byteLength < this.spares[best].byteLength))
617
+ best = index;
618
+ });
619
+ return best < 0 ? undefined : this.spares.splice(best, 1)[0];
620
+ }
497
621
  writeFileSync(path, data) {
498
622
  this.mutate(() => {
499
623
  const normalized = normalize(path);
500
624
  this.mkdirSync(parent(normalized), { recursive: true });
625
+ const removed = this.isHidden(normalized);
501
626
  this.unhide(normalized);
502
- const existing = this.node(normalized);
627
+ const existing = removed ? this.nodes.get(normalized) : this.node(normalized);
628
+ if (existing?.type === "file" && existing.dirty && existing.content)
629
+ this.release(existing.content);
503
630
  this.nodes.set(normalized, {
504
631
  type: "file",
505
632
  content: typeof data === "string" ? new TextEncoder().encode(data) : data.slice(),
506
633
  dirty: true,
507
634
  mode: existing?.type === "file" ? existing.mode : 0o644,
508
- atimeMs: Date.now(),
509
- mtimeMs: Date.now(),
635
+ atimeMs: realtimeMilliseconds(),
636
+ mtimeMs: realtimeMilliseconds(),
510
637
  ino: existing?.type === "file" ? existing.ino : this.nextInode++,
511
638
  });
512
639
  this.markMutation(normalized);
@@ -517,6 +644,18 @@ export class SnapshotWaliFileSystem {
517
644
  const normalized = normalize(path);
518
645
  if (normalized === "/")
519
646
  return;
647
+ // One directory under one that is there, as every directory of an import
648
+ // sorted by depth is: made alone, with no walk of its ancestors.
649
+ if (!this.node(normalized)) {
650
+ const above = this.node(parent(normalized));
651
+ if (above?.type === "directory") {
652
+ this.unhide(normalized);
653
+ const now = realtimeMilliseconds();
654
+ this.nodes.set(normalized, { type: "directory", mode: 0o755, atimeMs: now, mtimeMs: now, ino: this.nextInode++ });
655
+ this.markMutation(normalized);
656
+ return;
657
+ }
658
+ }
520
659
  const segments = normalized.slice(1).split("/");
521
660
  let current = "";
522
661
  for (let index = 0; index < segments.length; index += 1) {
@@ -529,7 +668,7 @@ export class SnapshotWaliFileSystem {
529
668
  if (!options?.recursive && index !== segments.length - 1)
530
669
  throw new Error(`ENOENT: no such directory, mkdir '${current}'`);
531
670
  this.unhide(current);
532
- const now = Date.now();
671
+ const now = realtimeMilliseconds();
533
672
  this.nodes.set(current, { type: "directory", mode: 0o755, atimeMs: now, mtimeMs: now, ino: this.nextInode++ });
534
673
  this.markMutation(current);
535
674
  }
@@ -544,9 +683,11 @@ export class SnapshotWaliFileSystem {
544
683
  throw new Error(`ENOTDIR: not a directory, scandir '${normalized}'`);
545
684
  const names = new Set(this.nodes.namesIn(normalized));
546
685
  if (this.lower && !this.isHidden(normalized)) {
547
- // The store's roots are its top: no entry of it names them as children of `/`.
686
+ // A store's roots are its top: no entry of it names them as children of
687
+ // `/`. A shared layer (ADR-0044 §6) holds the whole tree and lists them.
688
+ // Both, for a store under shared layers.
548
689
  const lowerNames = normalized === "/"
549
- ? PROJECT_ROOTS.filter((root) => this.lower.entries.has(root)).map((root) => root.slice(1))
690
+ ? [...new Set([...this.lower.childrenOf("/"), ...PROJECT_ROOTS.filter((root) => this.lower.entries.has(root)).map((root) => root.slice(1))])]
550
691
  : this.lower.childrenOf(normalized);
551
692
  for (const name of lowerNames) {
552
693
  if (!this.isHidden(normalized === "/" ? `/${name}` : `${normalized}/${name}`))
@@ -563,6 +704,8 @@ export class SnapshotWaliFileSystem {
563
704
  throw new Error(`ENOENT: no such file, unlink '${normalized}'`);
564
705
  if (node.type !== "file")
565
706
  throw new Error(`EISDIR: illegal operation on a directory, unlink '${normalized}'`);
707
+ if (node.dirty && node.content)
708
+ this.release(node.content);
566
709
  this.nodes.delete(normalized);
567
710
  this.hide(normalized);
568
711
  this.markMutation(normalized);
@@ -604,14 +747,22 @@ export class SnapshotWaliFileSystem {
604
747
  this.hide(source);
605
748
  this.unhide(destination);
606
749
  for (const [path, value] of moved) {
607
- // A file moved is a file the page must write at its new path: its bytes come along.
750
+ // A file moved is a file the page must write at its new path: its bytes
751
+ // come along, copied where they are not yet its own -- a store's file
752
+ // loads as a view of a shared layer, and a dirty buffer is written in place.
608
753
  if (value.type === "file") {
609
- this.bytesOf(value);
754
+ const bytes = this.bytesOf(value);
755
+ if (!value.dirty)
756
+ value.content = bytes.slice();
610
757
  value.dirty = true;
611
758
  }
612
- this.nodes.set(`${destination}${path.slice(source.length)}`, value);
759
+ const target = `${destination}${path.slice(source.length)}`;
760
+ const replaced = this.nodes.get(target);
761
+ if (replaced?.type === "file" && replaced.dirty && replaced.content && replaced !== value)
762
+ this.release(replaced.content);
763
+ this.nodes.set(target, value);
613
764
  this.markMutation(path);
614
- this.markMutation(`${destination}${path.slice(source.length)}`);
765
+ this.markMutation(target);
615
766
  }
616
767
  });
617
768
  }
@@ -654,11 +805,19 @@ export class SnapshotWaliFileSystem {
654
805
  this.changedPaths?.add(normalize(path));
655
806
  }
656
807
  }
808
+ /** The spare buffers a tree keeps (`release`): large enough to matter, few enough to cost little. */
809
+ const SPARE_MINIMUM = 64 * 1024;
810
+ const SPARE_COUNT = 2;
811
+ const SPARE_TOTAL = 32 * 1024 * 1024;
657
812
  function rootNode() {
658
- const now = Date.now();
813
+ const now = realtimeMilliseconds();
659
814
  return { type: "directory", mode: 0o755, atimeMs: now, mtimeMs: now, ino: 1 };
660
815
  }
661
816
  function normalize(path) {
817
+ // A path already normal is itself: every path of an image is, and a run's
818
+ // import normalized 41,000 of them by splitting each.
819
+ if (isNormal(path))
820
+ return path;
662
821
  const parts = [];
663
822
  for (const part of `/${path}`.split("/")) {
664
823
  if (!part || part === ".")
@@ -670,6 +829,32 @@ function normalize(path) {
670
829
  }
671
830
  return `/${parts.join("/")}`;
672
831
  }
832
+ /** Absolute, with no empty, `.` or `..` segment and no trailing slash; `/` itself. */
833
+ function isNormal(path) {
834
+ if (path.charCodeAt(0) !== 47)
835
+ return false;
836
+ if (path.length === 1)
837
+ return true;
838
+ let start = 1;
839
+ for (let index = 1; index <= path.length; index += 1) {
840
+ if (index < path.length && path.charCodeAt(index) !== 47)
841
+ continue;
842
+ const length = index - start;
843
+ if (length === 0)
844
+ return false;
845
+ if (path.charCodeAt(start) === 46 && (length === 1 || (length === 2 && path.charCodeAt(start + 1) === 46)))
846
+ return false;
847
+ start = index + 1;
848
+ }
849
+ return true;
850
+ }
673
851
  function parent(path) { return path.slice(0, path.lastIndexOf("/")) || "/"; }
674
- function depth(path) { return path.split("/").length; }
852
+ function depth(path) {
853
+ // Its segments, counted without splitting it: a sort of a whole tree asks this of every pair it compares.
854
+ let segments = 1;
855
+ for (let index = 0; index < path.length; index += 1)
856
+ if (path.charCodeAt(index) === 47)
857
+ segments += 1;
858
+ return segments;
859
+ }
675
860
  //# sourceMappingURL=snapshot-filesystem.js.map