@nifrajs/storage 4.0.2 → 5.0.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/README.md +1 -1
- package/dist/file.d.ts +18 -1
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +182 -42
- package/dist/file.js.map +1 -1
- package/package.json +1 -1
- package/src/file.ts +210 -39
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
|
|
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
|
|
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
|
package/dist/file.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"
|
|
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
|
|
5
|
-
*
|
|
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
|
-
|
|
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(
|
|
48
|
-
if (!full.startsWith(
|
|
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
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
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
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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
|
-
|
|
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
|
-
|
|
384
|
-
|
|
385
|
-
const
|
|
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
|
-
|
|
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": "
|
|
3
|
+
"version": "5.0.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
|
|
5
|
-
*
|
|
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 {
|
|
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
|
-
|
|
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(
|
|
60
|
-
if (!full.startsWith(
|
|
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
|
|
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
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
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
|
-
|
|
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
|
-
|
|
414
|
-
|
|
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
|
-
|
|
419
|
-
|
|
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
|
}
|