@nifrajs/storage 4.0.2 → 5.1.0

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nifra Authors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -20,7 +20,7 @@ const keys = await storage.list({ prefix: "avatars/" })
20
20
  | Adapter | Use | Notes |
21
21
  |---|---|---|
22
22
  | `MemoryStorage` | dev / tests | not durable, not shared across instances |
23
- | `FileStorage(root)` | a long-running server (Bun/Node/Deno) | persists content type + custom metadata in an adjacent sidecar tree; legacy objects still infer MIME from extension |
23
+ | `FileStorage(root)` | a long-running server (Bun/Node/Deno) | writes each object whole (staged in `<root>.nifra-state`, then renamed into place); persists content type + custom metadata in a sidecar tree there; reads older `<root>.nifra-metadata` sidecars; objects with none infer MIME from extension |
24
24
  | `R2Storage(env.BUCKET)` | the edge (Cloudflare R2) | round-trips `contentType` + metadata; binding typed structurally (no `@cloudflare/workers-types`) |
25
25
 
26
26
  Implement `StorageAdapter` (`put` / `get` / `delete` / `exists` / `list`) for **S3 / GCS / anything else** -
package/dist/file.d.ts CHANGED
@@ -2,8 +2,13 @@ import { type ListOptions, type PutOptions, type StorageAdapter, type StorageDat
2
2
  export declare class FileStorage implements StorageAdapter {
3
3
  private readonly root;
4
4
  private readonly metadataRoot;
5
+ private readonly legacyMetadataRoot;
6
+ private readonly stagingRoot;
5
7
  constructor(root: string);
6
8
  private metadataPathFor;
9
+ /** `<key>.json`, where earlier versions kept a sidecar: `a.json` there is also key `a.json`'s parent. */
10
+ private legacyMetadataPathFor;
11
+ private containedPath;
7
12
  /** Resolve `key` to an absolute path, asserting it stays inside `root` (defense-in-depth on top of `assertSafeKey`). */
8
13
  private pathFor;
9
14
  private symlinkError;
@@ -25,18 +30,30 @@ export declare class FileStorage implements StorageAdapter {
25
30
  */
26
31
  private openContained;
27
32
  private assertOpenedContained;
33
+ /**
34
+ * Write `data` whole or not at all: staged in a sibling directory, then renamed over `path`, so a
35
+ * reader never sees a half-written object and a failed write leaves the previous one. The renamed
36
+ * inode is then proven to be the staged one, reachable beneath the same root.
37
+ */
38
+ private writeContained;
39
+ /** A new, exclusively created file in the staging directory holding `data`. */
40
+ private stage;
28
41
  /**
29
42
  * Create parents and open without truncating. The opened inode is validated against the current,
30
43
  * fully resolved path before any caller data is written, closing the check/open symlink race.
31
44
  */
32
- private writeContained;
45
+ private writeInPlace;
33
46
  put(key: string, data: StorageData, options?: PutOptions): Promise<void>;
34
47
  get(key: string): Promise<StorageObject | null>;
35
48
  delete(key: string): Promise<void>;
49
+ private readMetadata;
50
+ private removeLegacyMetadata;
36
51
  exists(key: string): Promise<boolean>;
37
52
  /** Revalidate an opened inode immediately before unlinking its pathname. */
38
53
  private removeContained;
39
54
  list(options?: ListOptions): Promise<string[]>;
55
+ /** The directory for key prefix `dirKey`, or `undefined` when no plain directory chain leads there. */
56
+ private listingDirectory;
40
57
  private walk;
41
58
  }
42
59
  //# sourceMappingURL=file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAA;AA4BnB,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;gBAEzB,IAAI,EAAE,MAAM;IAOxB,OAAO,CAAC,eAAe;IAWvB,wHAAwH;IACxH,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,sBAAsB;IAsB9B;;;;OAIG;YACW,0BAA0B;IAuBxC,iGAAiG;YACnF,mBAAmB;IA0BjC,sGAAsG;YACxF,UAAU;IAOxB;;;;OAIG;YACW,aAAa;YA6Bb,qBAAqB;IA2BnC;;;OAGG;YACW,cAAc;IA8CtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAqC/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3C,4EAA4E;YAC9D,eAAe;IAsCvB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAU1C,IAAI;CAiBnB"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAA;AA6CnB,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAExB,IAAI,EAAE,MAAM;IAWxB,OAAO,CAAC,eAAe;IAIvB,yGAAyG;IACzG,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,aAAa;IAWrB,wHAAwH;IACxH,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,sBAAsB;IAsB9B;;;;OAIG;YACW,0BAA0B;IAuBxC,iGAAiG;YACnF,mBAAmB;IA0BjC,sGAAsG;YACxF,UAAU;IAOxB;;;;OAIG;YACW,aAAa;YA6Bb,qBAAqB;IA2BnC;;;;OAIG;YACW,cAAc;IAqC5B,+EAA+E;YACjE,KAAK;IA8BnB;;;OAGG;YACW,YAAY;IA8CpB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB5E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAwB/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAU1B,YAAY;YAoBZ,oBAAoB;IAQ5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3C,4EAA4E;YAC9D,eAAe;IAsCvB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcxD,uGAAuG;YACzF,gBAAgB;YAmBhB,IAAI;CA+BnB"}
package/dist/file.js CHANGED
@@ -1,11 +1,13 @@
1
1
  /**
2
2
  * Local-filesystem {@link StorageAdapter} for long-running servers (Bun/Node/Deno). Keys map to paths
3
3
  * under `root`; `assertSafeKey` plus a resolved-path containment check keep writes inside `root` (no
4
- * traversal). Explicit content type and custom metadata are persisted in an adjacent sidecar tree;
5
- * objects created before sidecar support still infer content type from their extension.
4
+ * traversal). Explicit content type and custom metadata are persisted in a sidecar tree beside the
5
+ * root that mirrors the object paths; sidecars written by earlier versions (`<key>.json` in
6
+ * `<root>.nifra-metadata`) are still read, and objects with none infer content type from their extension.
7
+ * Every write is staged beside the root and renamed into place, so a reader sees an object whole.
6
8
  */
7
9
  import { constants } from "node:fs";
8
- import { lstat, mkdir, open, readdir, realpath, unlink } from "node:fs/promises";
10
+ import { lstat, mkdir, open, readdir, realpath, rename, unlink, } from "node:fs/promises";
9
11
  import { basename, dirname, join, posix, resolve, sep } from "node:path";
10
12
  import { assertSafeKey, StorageKeyError } from "./key.js";
11
13
  import { toBytes, } from "./types.js";
@@ -33,19 +35,40 @@ function inferContentType(key) {
33
35
  const ext = key.slice(key.lastIndexOf(".") + 1).toLowerCase();
34
36
  return CONTENT_TYPES[ext];
35
37
  }
38
+ const errorCode = (error) => error instanceof Error && "code" in error ? error.code : undefined;
39
+ // ENOTDIR: a legacy `a.json` sidecar file sits where key `a.json/b`'s sidecar would need a directory.
40
+ const isMissing = (error) => {
41
+ const code = errorCode(error);
42
+ return code === "ENOENT" || code === "ENOTDIR";
43
+ };
44
+ /** Remove a staging file that may already be gone. */
45
+ const discardStaged = (path) => unlink(path).catch(() => { });
36
46
  export class FileStorage {
37
47
  root;
38
48
  metadataRoot;
49
+ legacyMetadataRoot;
50
+ stagingRoot;
39
51
  constructor(root) {
40
52
  this.root = resolve(root);
41
53
  // Keep bookkeeping outside the object tree so every otherwise-safe key remains usable, including
42
- // `.nifra-metadata/*`, and list() never needs a reserved-prefix exception.
43
- this.metadataRoot = `${this.root}.nifra-metadata`;
54
+ // `.nifra-metadata/*`, and list() never needs a reserved-prefix exception. Sidecars mirror the
55
+ // object paths exactly, so two keys clash there only where their objects would clash anyway.
56
+ const state = `${this.root}.nifra-state`;
57
+ this.metadataRoot = join(state, "metadata");
58
+ this.stagingRoot = join(state, "staging");
59
+ this.legacyMetadataRoot = `${this.root}.nifra-metadata`;
44
60
  }
45
61
  metadataPathFor(key) {
62
+ return this.containedPath(this.metadataRoot, key, key);
63
+ }
64
+ /** `<key>.json`, where earlier versions kept a sidecar: `a.json` there is also key `a.json`'s parent. */
65
+ legacyMetadataPathFor(key) {
66
+ return this.containedPath(this.legacyMetadataRoot, `${key}.json`, key);
67
+ }
68
+ containedPath(base, relative, key) {
46
69
  assertSafeKey(key);
47
- const full = resolve(this.metadataRoot, `${key}.json`);
48
- if (!full.startsWith(this.metadataRoot + sep)) {
70
+ const full = resolve(base, relative);
71
+ if (!full.startsWith(base + sep)) {
49
72
  throw new StorageKeyError(`storage metadata key ${JSON.stringify(key)} escapes the storage root`);
50
73
  }
51
74
  return full;
@@ -204,11 +227,77 @@ export class FileStorage {
204
227
  throw error;
205
228
  }
206
229
  }
230
+ /**
231
+ * Write `data` whole or not at all: staged in a sibling directory, then renamed over `path`, so a
232
+ * reader never sees a half-written object and a failed write leaves the previous one. The renamed
233
+ * inode is then proven to be the staged one, reachable beneath the same root.
234
+ */
235
+ async writeContained(base, path, key, data) {
236
+ await this.assertNoSymlinkPath(base, path, key);
237
+ await mkdir(dirname(path), { recursive: true, mode: 0o755 });
238
+ const staged = await this.stage(key, data);
239
+ try {
240
+ await this.assertNoSymlinkPath(base, path, key);
241
+ const baseBefore = await lstat(base);
242
+ try {
243
+ await rename(staged.path, path);
244
+ }
245
+ catch (error) {
246
+ // A root that is its own mount point cannot take a rename from beside it.
247
+ if (errorCode(error) !== "EXDEV")
248
+ throw error;
249
+ await this.writeInPlace(base, path, key, data);
250
+ return;
251
+ }
252
+ const [current, baseAfter, resolvedBase, resolvedPath] = await Promise.all([
253
+ lstat(path),
254
+ lstat(base),
255
+ realpath(base),
256
+ realpath(path),
257
+ ]);
258
+ const baseChanged = baseBefore.dev !== baseAfter.dev || baseBefore.ino !== baseAfter.ino;
259
+ const targetChanged = current.isSymbolicLink() || staged.dev !== current.dev || staged.ino !== current.ino;
260
+ const escaped = resolvedPath !== resolvedBase && !resolvedPath.startsWith(resolvedBase + sep);
261
+ if (baseChanged || targetChanged || escaped)
262
+ throw this.symlinkError(key);
263
+ }
264
+ finally {
265
+ // Gone already once the rename landed; this clears a staged file the write abandoned.
266
+ await discardStaged(staged.path);
267
+ }
268
+ }
269
+ /** A new, exclusively created file in the staging directory holding `data`. */
270
+ async stage(key, data) {
271
+ await mkdir(this.stagingRoot, { recursive: true, mode: 0o755 });
272
+ const path = join(this.stagingRoot, `${crypto.randomUUID()}.tmp`);
273
+ await this.assertNoSymlinkPath(this.stagingRoot, path, key);
274
+ let handle;
275
+ try {
276
+ handle = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o666);
277
+ }
278
+ catch (error) {
279
+ if (errorCode(error) === "ELOOP")
280
+ throw this.symlinkError(key);
281
+ throw error;
282
+ }
283
+ try {
284
+ await handle.writeFile(data);
285
+ const info = await handle.stat();
286
+ return { path, dev: info.dev, ino: info.ino };
287
+ }
288
+ catch (error) {
289
+ await discardStaged(path);
290
+ throw error;
291
+ }
292
+ finally {
293
+ await handle.close();
294
+ }
295
+ }
207
296
  /**
208
297
  * Create parents and open without truncating. The opened inode is validated against the current,
209
298
  * fully resolved path before any caller data is written, closing the check/open symlink race.
210
299
  */
211
- async writeContained(base, path, key, data) {
300
+ async writeInPlace(base, path, key, data) {
212
301
  await this.assertNoSymlinkPath(base, path, key);
213
302
  // 0o755 whatever the umask: a group-writable directory (umask 002) would fail the trust check above.
214
303
  await mkdir(dirname(path), { recursive: true, mode: 0o755 });
@@ -249,6 +338,7 @@ export class FileStorage {
249
338
  const path = this.pathFor(key);
250
339
  await this.writeContained(this.root, path, key, toBytes(data));
251
340
  const metadataPath = this.metadataPathFor(key);
341
+ await this.removeLegacyMetadata(key);
252
342
  if (options.contentType !== undefined || options.metadata !== undefined) {
253
343
  await this.writeContained(this.metadataRoot, metadataPath, key, JSON.stringify({
254
344
  ...(options.contentType !== undefined ? { contentType: options.contentType } : {}),
@@ -271,27 +361,10 @@ export class FileStorage {
271
361
  finally {
272
362
  await bodyHandle.close();
273
363
  }
274
- let stored = {};
275
- try {
276
- const metadataPath = this.metadataPathFor(key);
277
- const metadataHandle = await this.openObject(this.metadataRoot, metadataPath, key);
278
- if (metadataHandle !== null) {
279
- try {
280
- stored = JSON.parse(await metadataHandle.readFile({ encoding: "utf8" }));
281
- }
282
- finally {
283
- await metadataHandle.close();
284
- }
285
- }
286
- }
287
- catch (error) {
288
- if (error instanceof StorageKeyError)
289
- throw error;
290
- if (error.code !== "ENOENT" && !(error instanceof SyntaxError)) {
291
- throw error;
292
- }
293
- // Objects created before sidecar support still infer a useful MIME type from their extension.
294
- }
364
+ const stored = (await this.readMetadata(this.metadataRoot, this.metadataPathFor(key), key)) ??
365
+ (await this.readMetadata(this.legacyMetadataRoot, this.legacyMetadataPathFor(key), key)) ??
366
+ {};
367
+ // Objects with no sidecar still infer a useful MIME type from their extension.
295
368
  const contentType = stored.contentType ?? inferContentType(key);
296
369
  return {
297
370
  body,
@@ -306,8 +379,38 @@ export class FileStorage {
306
379
  await Promise.all([
307
380
  this.removeContained(this.root, path, key),
308
381
  this.removeContained(this.metadataRoot, metadataPath, key),
382
+ this.removeLegacyMetadata(key),
309
383
  ]);
310
384
  }
385
+ async readMetadata(base, path, key) {
386
+ try {
387
+ const handle = await this.openObject(base, path, key);
388
+ if (handle === null)
389
+ return undefined;
390
+ try {
391
+ return JSON.parse(await handle.readFile({ encoding: "utf8" }));
392
+ }
393
+ finally {
394
+ await handle.close();
395
+ }
396
+ }
397
+ catch (error) {
398
+ if (error instanceof StorageKeyError)
399
+ throw error;
400
+ if (!isMissing(error) && !(error instanceof SyntaxError))
401
+ throw error;
402
+ return undefined;
403
+ }
404
+ }
405
+ async removeLegacyMetadata(key) {
406
+ try {
407
+ await this.removeContained(this.legacyMetadataRoot, this.legacyMetadataPathFor(key), key);
408
+ }
409
+ catch (error) {
410
+ if (!isMissing(error))
411
+ throw error;
412
+ }
413
+ }
311
414
  async exists(key) {
312
415
  const path = this.pathFor(key);
313
416
  const handle = await this.openObject(this.root, path, key);
@@ -362,16 +465,41 @@ export class FileStorage {
362
465
  }
363
466
  }
364
467
  async list(options = {}) {
365
- const keys = [];
366
- await this.walk(this.root, "", keys);
367
- let out = keys.sort();
368
- if (options.prefix !== undefined)
369
- out = out.filter((k) => k.startsWith(options.prefix));
370
- if (options.limit !== undefined)
371
- out = out.slice(0, options.limit);
468
+ const prefix = options.prefix ?? "";
469
+ const limit = options.limit ?? Number.POSITIVE_INFINITY;
470
+ // Start below the directories the prefix already names, and stop once `limit` keys are found:
471
+ // the walk visits entries in key order, so the first keys found are the first keys sorted.
472
+ const slash = prefix.lastIndexOf("/");
473
+ const dirKey = slash === -1 ? "" : prefix.slice(0, slash);
474
+ const start = slash === -1 ? this.root : await this.listingDirectory(dirKey);
475
+ const out = [];
476
+ if (start !== undefined && limit > 0)
477
+ await this.walk(start, dirKey, prefix.slice(slash + 1), limit, out);
372
478
  return out;
373
479
  }
374
- async walk(dir, prefix, out) {
480
+ /** The directory for key prefix `dirKey`, or `undefined` when no plain directory chain leads there. */
481
+ async listingDirectory(dirKey) {
482
+ try {
483
+ assertSafeKey(dirKey);
484
+ }
485
+ catch {
486
+ return undefined; // no safe key lies beneath an unsafe prefix
487
+ }
488
+ let current = this.root;
489
+ for (const segment of dirKey.split("/")) {
490
+ current = join(current, segment);
491
+ try {
492
+ const info = await lstat(current);
493
+ if (info.isSymbolicLink() || !info.isDirectory())
494
+ return undefined;
495
+ }
496
+ catch {
497
+ return undefined;
498
+ }
499
+ }
500
+ return current;
501
+ }
502
+ async walk(dir, prefix, namePrefix, limit, out) {
375
503
  let names;
376
504
  try {
377
505
  names = await readdir(dir);
@@ -379,16 +507,28 @@ export class FileStorage {
379
507
  catch {
380
508
  return; // missing root → empty listing
381
509
  }
510
+ const entries = [];
382
511
  for (const name of names) {
383
- const full = join(dir, name);
384
- // POSIX-join the key segments so listed keys are portable regardless of the host separator.
385
- const key = prefix === "" ? name : posix.join(prefix, name);
386
- const info = await lstat(full);
512
+ if (!name.startsWith(namePrefix))
513
+ continue;
514
+ const info = await lstat(join(dir, name));
387
515
  if (info.isSymbolicLink())
388
516
  continue;
517
+ // A directory's keys all start with `name/`, so it sorts there among its siblings.
389
518
  if (info.isDirectory())
390
- await this.walk(full, key, out);
519
+ entries.push({ name, order: `${name}/`, kind: "dir" });
391
520
  else if (info.isFile())
521
+ entries.push({ name, order: name, kind: "file" });
522
+ }
523
+ entries.sort((a, b) => (a.order < b.order ? -1 : a.order > b.order ? 1 : 0));
524
+ for (const entry of entries) {
525
+ if (out.length >= limit)
526
+ return;
527
+ // POSIX-join the key segments so listed keys are portable regardless of the host separator.
528
+ const key = prefix === "" ? entry.name : posix.join(prefix, entry.name);
529
+ if (entry.kind === "dir")
530
+ await this.walk(join(dir, entry.name), key, "", limit, out);
531
+ else
392
532
  out.push(key);
393
533
  }
394
534
  }
package/dist/file.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/storage",
3
- "version": "4.0.2",
3
+ "version": "5.1.0",
4
4
  "description": "Blob storage mechanics for nifra - traversal-safe memory, filesystem, and R2 adapters, optional provider capabilities, and executable adapter conformance.",
5
5
  "keywords": [
6
6
  "bun",
package/src/file.ts CHANGED
@@ -1,11 +1,22 @@
1
1
  /**
2
2
  * Local-filesystem {@link StorageAdapter} for long-running servers (Bun/Node/Deno). Keys map to paths
3
3
  * under `root`; `assertSafeKey` plus a resolved-path containment check keep writes inside `root` (no
4
- * traversal). Explicit content type and custom metadata are persisted in an adjacent sidecar tree;
5
- * objects created before sidecar support still infer content type from their extension.
4
+ * traversal). Explicit content type and custom metadata are persisted in a sidecar tree beside the
5
+ * root that mirrors the object paths; sidecars written by earlier versions (`<key>.json` in
6
+ * `<root>.nifra-metadata`) are still read, and objects with none infer content type from their extension.
7
+ * Every write is staged beside the root and renamed into place, so a reader sees an object whole.
6
8
  */
7
9
  import { constants } from "node:fs"
8
- import { type FileHandle, lstat, mkdir, open, readdir, realpath, unlink } from "node:fs/promises"
10
+ import {
11
+ type FileHandle,
12
+ lstat,
13
+ mkdir,
14
+ open,
15
+ readdir,
16
+ realpath,
17
+ rename,
18
+ unlink,
19
+ } from "node:fs/promises"
9
20
  import { basename, dirname, join, posix, resolve, sep } from "node:path"
10
21
  import { assertSafeKey, StorageKeyError } from "./key.ts"
11
22
  import {
@@ -43,21 +54,53 @@ function inferContentType(key: string): string | undefined {
43
54
  return CONTENT_TYPES[ext]
44
55
  }
45
56
 
57
+ interface StoredMetadata {
58
+ readonly contentType?: string
59
+ readonly metadata?: Readonly<Record<string, string>>
60
+ }
61
+
62
+ const errorCode = (error: unknown): unknown =>
63
+ error instanceof Error && "code" in error ? error.code : undefined
64
+
65
+ // ENOTDIR: a legacy `a.json` sidecar file sits where key `a.json/b`'s sidecar would need a directory.
66
+ const isMissing = (error: unknown): boolean => {
67
+ const code = errorCode(error)
68
+ return code === "ENOENT" || code === "ENOTDIR"
69
+ }
70
+
71
+ /** Remove a staging file that may already be gone. */
72
+ const discardStaged = (path: string): Promise<void> => unlink(path).catch(() => {})
73
+
46
74
  export class FileStorage implements StorageAdapter {
47
75
  private readonly root: string
48
76
  private readonly metadataRoot: string
77
+ private readonly legacyMetadataRoot: string
78
+ private readonly stagingRoot: string
49
79
 
50
80
  constructor(root: string) {
51
81
  this.root = resolve(root)
52
82
  // Keep bookkeeping outside the object tree so every otherwise-safe key remains usable, including
53
- // `.nifra-metadata/*`, and list() never needs a reserved-prefix exception.
54
- this.metadataRoot = `${this.root}.nifra-metadata`
83
+ // `.nifra-metadata/*`, and list() never needs a reserved-prefix exception. Sidecars mirror the
84
+ // object paths exactly, so two keys clash there only where their objects would clash anyway.
85
+ const state = `${this.root}.nifra-state`
86
+ this.metadataRoot = join(state, "metadata")
87
+ this.stagingRoot = join(state, "staging")
88
+ this.legacyMetadataRoot = `${this.root}.nifra-metadata`
55
89
  }
56
90
 
57
91
  private metadataPathFor(key: string): string {
92
+ return this.containedPath(this.metadataRoot, key, key)
93
+ }
94
+
95
+ /** `<key>.json`, where earlier versions kept a sidecar: `a.json` there is also key `a.json`'s parent. */
96
+ private legacyMetadataPathFor(key: string): string {
97
+ return this.containedPath(this.legacyMetadataRoot, `${key}.json`, key)
98
+ }
99
+
100
+ private containedPath(base: string, relative: string, key: string): string {
58
101
  assertSafeKey(key)
59
- const full = resolve(this.metadataRoot, `${key}.json`)
60
- if (!full.startsWith(this.metadataRoot + sep)) {
102
+ const full = resolve(base, relative)
103
+ if (!full.startsWith(base + sep)) {
61
104
  throw new StorageKeyError(
62
105
  `storage metadata key ${JSON.stringify(key)} escapes the storage root`,
63
106
  )
@@ -227,11 +270,84 @@ export class FileStorage implements StorageAdapter {
227
270
  }
228
271
  }
229
272
 
273
+ /**
274
+ * Write `data` whole or not at all: staged in a sibling directory, then renamed over `path`, so a
275
+ * reader never sees a half-written object and a failed write leaves the previous one. The renamed
276
+ * inode is then proven to be the staged one, reachable beneath the same root.
277
+ */
278
+ private async writeContained(
279
+ base: string,
280
+ path: string,
281
+ key: string,
282
+ data: Uint8Array | string,
283
+ ): Promise<void> {
284
+ await this.assertNoSymlinkPath(base, path, key)
285
+ await mkdir(dirname(path), { recursive: true, mode: 0o755 })
286
+ const staged = await this.stage(key, data)
287
+ try {
288
+ await this.assertNoSymlinkPath(base, path, key)
289
+ const baseBefore = await lstat(base)
290
+ try {
291
+ await rename(staged.path, path)
292
+ } catch (error) {
293
+ // A root that is its own mount point cannot take a rename from beside it.
294
+ if (errorCode(error) !== "EXDEV") throw error
295
+ await this.writeInPlace(base, path, key, data)
296
+ return
297
+ }
298
+ const [current, baseAfter, resolvedBase, resolvedPath] = await Promise.all([
299
+ lstat(path),
300
+ lstat(base),
301
+ realpath(base),
302
+ realpath(path),
303
+ ])
304
+ const baseChanged = baseBefore.dev !== baseAfter.dev || baseBefore.ino !== baseAfter.ino
305
+ const targetChanged =
306
+ current.isSymbolicLink() || staged.dev !== current.dev || staged.ino !== current.ino
307
+ const escaped = resolvedPath !== resolvedBase && !resolvedPath.startsWith(resolvedBase + sep)
308
+ if (baseChanged || targetChanged || escaped) throw this.symlinkError(key)
309
+ } finally {
310
+ // Gone already once the rename landed; this clears a staged file the write abandoned.
311
+ await discardStaged(staged.path)
312
+ }
313
+ }
314
+
315
+ /** A new, exclusively created file in the staging directory holding `data`. */
316
+ private async stage(
317
+ key: string,
318
+ data: Uint8Array | string,
319
+ ): Promise<{ readonly path: string; readonly dev: number; readonly ino: number }> {
320
+ await mkdir(this.stagingRoot, { recursive: true, mode: 0o755 })
321
+ const path = join(this.stagingRoot, `${crypto.randomUUID()}.tmp`)
322
+ await this.assertNoSymlinkPath(this.stagingRoot, path, key)
323
+ let handle: FileHandle
324
+ try {
325
+ handle = await open(
326
+ path,
327
+ constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW,
328
+ 0o666,
329
+ )
330
+ } catch (error) {
331
+ if (errorCode(error) === "ELOOP") throw this.symlinkError(key)
332
+ throw error
333
+ }
334
+ try {
335
+ await handle.writeFile(data)
336
+ const info = await handle.stat()
337
+ return { path, dev: info.dev, ino: info.ino }
338
+ } catch (error) {
339
+ await discardStaged(path)
340
+ throw error
341
+ } finally {
342
+ await handle.close()
343
+ }
344
+ }
345
+
230
346
  /**
231
347
  * Create parents and open without truncating. The opened inode is validated against the current,
232
348
  * fully resolved path before any caller data is written, closing the check/open symlink race.
233
349
  */
234
- private async writeContained(
350
+ private async writeInPlace(
235
351
  base: string,
236
352
  path: string,
237
353
  key: string,
@@ -281,6 +397,7 @@ export class FileStorage implements StorageAdapter {
281
397
  const path = this.pathFor(key)
282
398
  await this.writeContained(this.root, path, key, toBytes(data))
283
399
  const metadataPath = this.metadataPathFor(key)
400
+ await this.removeLegacyMetadata(key)
284
401
  if (options.contentType !== undefined || options.metadata !== undefined) {
285
402
  await this.writeContained(
286
403
  this.metadataRoot,
@@ -306,24 +423,11 @@ export class FileStorage implements StorageAdapter {
306
423
  } finally {
307
424
  await bodyHandle.close()
308
425
  }
309
- let stored: { contentType?: string; metadata?: Readonly<Record<string, string>> } = {}
310
- try {
311
- const metadataPath = this.metadataPathFor(key)
312
- const metadataHandle = await this.openObject(this.metadataRoot, metadataPath, key)
313
- if (metadataHandle !== null) {
314
- try {
315
- stored = JSON.parse(await metadataHandle.readFile({ encoding: "utf8" })) as typeof stored
316
- } finally {
317
- await metadataHandle.close()
318
- }
319
- }
320
- } catch (error) {
321
- if (error instanceof StorageKeyError) throw error
322
- if ((error as NodeJS.ErrnoException).code !== "ENOENT" && !(error instanceof SyntaxError)) {
323
- throw error
324
- }
325
- // Objects created before sidecar support still infer a useful MIME type from their extension.
326
- }
426
+ const stored =
427
+ (await this.readMetadata(this.metadataRoot, this.metadataPathFor(key), key)) ??
428
+ (await this.readMetadata(this.legacyMetadataRoot, this.legacyMetadataPathFor(key), key)) ??
429
+ {}
430
+ // Objects with no sidecar still infer a useful MIME type from their extension.
327
431
  const contentType = stored.contentType ?? inferContentType(key)
328
432
  return {
329
433
  body,
@@ -339,9 +443,38 @@ export class FileStorage implements StorageAdapter {
339
443
  await Promise.all([
340
444
  this.removeContained(this.root, path, key),
341
445
  this.removeContained(this.metadataRoot, metadataPath, key),
446
+ this.removeLegacyMetadata(key),
342
447
  ])
343
448
  }
344
449
 
450
+ private async readMetadata(
451
+ base: string,
452
+ path: string,
453
+ key: string,
454
+ ): Promise<StoredMetadata | undefined> {
455
+ try {
456
+ const handle = await this.openObject(base, path, key)
457
+ if (handle === null) return undefined
458
+ try {
459
+ return JSON.parse(await handle.readFile({ encoding: "utf8" })) as StoredMetadata
460
+ } finally {
461
+ await handle.close()
462
+ }
463
+ } catch (error) {
464
+ if (error instanceof StorageKeyError) throw error
465
+ if (!isMissing(error) && !(error instanceof SyntaxError)) throw error
466
+ return undefined
467
+ }
468
+ }
469
+
470
+ private async removeLegacyMetadata(key: string): Promise<void> {
471
+ try {
472
+ await this.removeContained(this.legacyMetadataRoot, this.legacyMetadataPathFor(key), key)
473
+ } catch (error) {
474
+ if (!isMissing(error)) throw error
475
+ }
476
+ }
477
+
345
478
  async exists(key: string): Promise<boolean> {
346
479
  const path = this.pathFor(key)
347
480
  const handle = await this.openObject(this.root, path, key)
@@ -393,30 +526,68 @@ export class FileStorage implements StorageAdapter {
393
526
  }
394
527
 
395
528
  async list(options: ListOptions = {}): Promise<string[]> {
396
- const keys: string[] = []
397
- await this.walk(this.root, "", keys)
398
- let out = keys.sort()
399
- if (options.prefix !== undefined)
400
- out = out.filter((k) => k.startsWith(options.prefix as string))
401
- if (options.limit !== undefined) out = out.slice(0, options.limit)
529
+ const prefix = options.prefix ?? ""
530
+ const limit = options.limit ?? Number.POSITIVE_INFINITY
531
+ // Start below the directories the prefix already names, and stop once `limit` keys are found:
532
+ // the walk visits entries in key order, so the first keys found are the first keys sorted.
533
+ const slash = prefix.lastIndexOf("/")
534
+ const dirKey = slash === -1 ? "" : prefix.slice(0, slash)
535
+ const start = slash === -1 ? this.root : await this.listingDirectory(dirKey)
536
+ const out: string[] = []
537
+ if (start !== undefined && limit > 0)
538
+ await this.walk(start, dirKey, prefix.slice(slash + 1), limit, out)
402
539
  return out
403
540
  }
404
541
 
405
- private async walk(dir: string, prefix: string, out: string[]): Promise<void> {
542
+ /** The directory for key prefix `dirKey`, or `undefined` when no plain directory chain leads there. */
543
+ private async listingDirectory(dirKey: string): Promise<string | undefined> {
544
+ try {
545
+ assertSafeKey(dirKey)
546
+ } catch {
547
+ return undefined // no safe key lies beneath an unsafe prefix
548
+ }
549
+ let current = this.root
550
+ for (const segment of dirKey.split("/")) {
551
+ current = join(current, segment)
552
+ try {
553
+ const info = await lstat(current)
554
+ if (info.isSymbolicLink() || !info.isDirectory()) return undefined
555
+ } catch {
556
+ return undefined
557
+ }
558
+ }
559
+ return current
560
+ }
561
+
562
+ private async walk(
563
+ dir: string,
564
+ prefix: string,
565
+ namePrefix: string,
566
+ limit: number,
567
+ out: string[],
568
+ ): Promise<void> {
406
569
  let names: string[]
407
570
  try {
408
571
  names = await readdir(dir)
409
572
  } catch {
410
573
  return // missing root → empty listing
411
574
  }
575
+ const entries: { readonly name: string; readonly order: string; readonly kind: string }[] = []
412
576
  for (const name of names) {
413
- const full = join(dir, name)
414
- // POSIX-join the key segments so listed keys are portable regardless of the host separator.
415
- const key = prefix === "" ? name : posix.join(prefix, name)
416
- const info = await lstat(full)
577
+ if (!name.startsWith(namePrefix)) continue
578
+ const info = await lstat(join(dir, name))
417
579
  if (info.isSymbolicLink()) continue
418
- if (info.isDirectory()) await this.walk(full, key, out)
419
- else if (info.isFile()) out.push(key)
580
+ // A directory's keys all start with `name/`, so it sorts there among its siblings.
581
+ if (info.isDirectory()) entries.push({ name, order: `${name}/`, kind: "dir" })
582
+ else if (info.isFile()) entries.push({ name, order: name, kind: "file" })
583
+ }
584
+ entries.sort((a, b) => (a.order < b.order ? -1 : a.order > b.order ? 1 : 0))
585
+ for (const entry of entries) {
586
+ if (out.length >= limit) return
587
+ // POSIX-join the key segments so listed keys are portable regardless of the host separator.
588
+ const key = prefix === "" ? entry.name : posix.join(prefix, entry.name)
589
+ if (entry.kind === "dir") await this.walk(join(dir, entry.name), key, "", limit, out)
590
+ else out.push(key)
420
591
  }
421
592
  }
422
593
  }