@melra/file-runtime 0.3.0-alpha.14 → 0.3.0-alpha.16

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/dist/index.d.ts CHANGED
@@ -12,14 +12,23 @@ export interface FileRuntimeOptions {
12
12
  * directory still reaches the same refusal.
13
13
  */
14
14
  reserved?: string[];
15
+ /**
16
+ * Directories inside a reserved one whose contents may still be read
17
+ * (`isReserved` with `reading`), recognised the same way: MELRA's artifacts.
18
+ * Nothing may change them, or the directory itself.
19
+ */
20
+ readable?: string[];
15
21
  }
16
22
  export declare class FileRuntime {
17
23
  readonly root: string;
18
24
  readonly maxFileBytes: number;
19
25
  readonly maxEntries: number;
26
+ private readonly lexicalRoot;
20
27
  private readonly reserved;
28
+ private readonly readable;
21
29
  private constructor();
22
30
  static create(options: FileRuntimeOptions): Promise<FileRuntime>;
31
+ private inputPath;
23
32
  /**
24
33
  * `creating` refuses a path that is, or is inside, a git directory: a
25
34
  * repository's config, attributes and hooks name programs git runs while
@@ -31,9 +40,26 @@ export declare class FileRuntime {
31
40
  * ponytail: by name, so an NTFS stream spelling of `.git` is not caught; the
32
41
  * reserved-file check has the same Windows follow-up.
33
42
  */
34
- resolvePath(input: string, allowRoot?: boolean, creating?: boolean): Promise<string>;
35
- /** Whether `path` is, or is inside, one of the reserved entries. */
36
- isReserved(path: string): Promise<boolean>;
43
+ resolvePath(input: string, allowRoot?: boolean, creating?: boolean, changing?: boolean): Promise<string>;
44
+ /**
45
+ * Whether `path` is one of `entries`: by a case-insensitive name and the
46
+ * identity of the directory holding it. On a case-sensitive filesystem a
47
+ * sibling whose name differs from an entry only in case, such as a twin of
48
+ * the data directory, is matched too; that refuses more, never less.
49
+ */
50
+ private named;
51
+ /**
52
+ * Whether `path` is, or is inside, one of the reserved entries. `reading`
53
+ * says nothing will change it, so the contents of a readable directory are
54
+ * judged only below that directory, where a link to reserved data is still
55
+ * refused. Judged as spelled and again with the part that exists resolved
56
+ * through links: a link may lead below a reserved directory, where neither
57
+ * the names nor the identities compared here would recognise the path. A
58
+ * link whose target does not exist is followed too, so a link to a missing
59
+ * reserved name is refused like one to a present name.
60
+ */
61
+ isReserved(path: string, reading?: boolean): Promise<boolean>;
62
+ private reservedAsSpelled;
37
63
  /** Whether `path` is a directory holding a reserved entry at any depth: a recursive reader given it reaches them unnamed. */
38
64
  holdsReserved(path: string): Promise<boolean>;
39
65
  execute(operation: FileOperation): Promise<Record<string, unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAmCD,qBAAa,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC,OAAO;WAOM,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAatE;;;;;;;;;;OAUG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,UAAQ,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAmCtF,oEAAoE;IAC9D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiDhD,6HAA6H;IACvH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB7C,OAAO,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAkH1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAqID,qBAAa,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC,OAAO;WASM,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAatE,OAAO,CAAC,SAAS;IAQjB;;;;;;;;;;OAUG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,UAAQ,EAAE,QAAQ,UAAQ,EAAE,QAAQ,UAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IA0C3G;;;;;OAKG;YACW,KAAK;IASnB;;;;;;;;;OASG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAwCnD,iBAAiB;IAwC/B,6HAA6H;IACvH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B7C,OAAO,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAoJ1E"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Copyright 2026 XAGI Labs Private Limited
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { createHash, randomUUID } from "node:crypto";
4
- import { lstat, mkdir, readFile, readdir, realpath, rename, rm, stat, writeFile, } from "node:fs/promises";
3
+ import { createHash, randomBytes } from "node:crypto";
4
+ import { lstat, mkdir, open, readFile, readdir, readlink, realpath, rename, rm, stat, } from "node:fs/promises";
5
5
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
6
6
  function inside(root, candidate) {
7
7
  const rel = relative(root, candidate);
@@ -35,14 +35,118 @@ async function sameEntry(left, right) {
35
35
  return false;
36
36
  }
37
37
  }
38
+ /** `look`, asked once per path for as long as `answers` is kept. */
39
+ function remembered(answers, look) {
40
+ return (at) => {
41
+ const answer = answers.get(at) ?? look(at);
42
+ answers.set(at, answer);
43
+ return answer;
44
+ };
45
+ }
46
+ /**
47
+ * More links than the kernel follows in one lookup (40 on Linux, 32 on
48
+ * macOS): a path that needs them opens nothing.
49
+ */
50
+ const MAX_LINKS = 40;
51
+ /**
52
+ * `real`: `path` with the deepest part of it that exists resolved through
53
+ * links, and the rest as written. `next`: when the first part that does not
54
+ * exist is a link, `path` with that link replaced by its target, where the
55
+ * kernel would go on. `resolved` keeps each lookup's answer, or why it failed,
56
+ * for the next spelling of a chain.
57
+ */
58
+ async function realSpelling(path, resolved = new Map()) {
59
+ const resolveLinks = remembered(resolved, (at) => realpath(at).catch((error) => error));
60
+ const whole = await resolveLinks(path);
61
+ if (typeof whole === "string")
62
+ return { real: whole };
63
+ // A part resolves only if every part above it does, so the deepest one that
64
+ // does is found by halving: about log2(depth) lookups, not one per part.
65
+ // ponytail: each realpath still walks its whole prefix, so 100 arguments 300
66
+ // parts deep cost ~1 s here (12 s at one lookup per part). Memoise resolved
67
+ // prefixes across a call's arguments if that ever shows up.
68
+ const chain = [];
69
+ for (let probe = path;; probe = dirname(probe)) {
70
+ chain.unshift(probe);
71
+ if (dirname(probe) === probe)
72
+ break;
73
+ }
74
+ let real = path;
75
+ let parent;
76
+ let [resolves, fails] = [-1, chain.length - 1];
77
+ while (fails - resolves > 1) {
78
+ const middle = (resolves + fails) >> 1;
79
+ const probe = chain[middle];
80
+ const actual = await resolveLinks(probe);
81
+ if (typeof actual !== "string")
82
+ fails = middle;
83
+ else
84
+ [resolves, real, parent] = [middle, join(actual, relative(probe, path)), actual];
85
+ }
86
+ if (parent === undefined)
87
+ return { real };
88
+ // By its bare name in its resolved directory: a trailing separator would
89
+ // follow the link instead of naming it.
90
+ const link = chain[fails];
91
+ const at = join(parent, basename(link));
92
+ if ((await lstat(at).catch(() => undefined))?.isSymbolicLink() !== true)
93
+ return { real };
94
+ const target = await readlink(at).catch(() => undefined);
95
+ if (target === undefined)
96
+ return { real };
97
+ // Joined as written, not normalised: the kernel takes a `..` in it after
98
+ // following the links before it. ponytail: judged where it leads, not at
99
+ // each part it passes on the way; judge those as the terminal judges its
100
+ // arguments (`climbedFrom`) to answer the same there too.
101
+ const joined = isAbsolute(target) ? target : `${parent}${sep}${target}`;
102
+ const next = `${joined}${path.slice(link.length)}`;
103
+ // Nothing through a part that does not resolve does, so the next spelling
104
+ // need not ask again; each ask follows the rest of the chain. The target of
105
+ // a link to a missing name is missing too; after too many links, one fewer
106
+ // may resolve, so that is asked once.
107
+ const failure = await resolveLinks(link);
108
+ const missing = typeof failure !== "string" && (failure.code === "ENOENT" || failure.code === "ENOTDIR");
109
+ const onward = missing ? failure : await resolveLinks(joined);
110
+ if (typeof onward !== "string") {
111
+ for (let through = next; through.length >= joined.length; through = dirname(through)) {
112
+ resolved.set(through, Promise.resolve(onward));
113
+ if (dirname(through) === through)
114
+ break;
115
+ }
116
+ }
117
+ return { real, next };
118
+ }
119
+ /**
120
+ * The bytes a write's content stands for. Node's base64 decoder is lenient: it
121
+ * stops at the first padding, skips what is not base64, and decoded two joined
122
+ * chunks as the first, plain text as noise and "!!!!" as nothing, each written
123
+ * as a success. So base64 is checked to be canonical first; line breaks and
124
+ * spaces are allowed, as MIME wraps it.
125
+ */
126
+ function decodeContent(content, encoding) {
127
+ if (encoding !== "base64")
128
+ return Buffer.from(content, encoding);
129
+ // The URL-safe alphabet too, which Node always decoded the same way.
130
+ const compact = content.replace(/\s+/g, "").replaceAll("-", "+").replaceAll("_", "/");
131
+ const decoded = Buffer.from(compact, "base64");
132
+ const padded = compact.padEnd(Math.ceil(compact.length / 4) * 4, "=");
133
+ if (!/^[A-Za-z0-9+/]*={0,2}$/.test(compact) || decoded.toString("base64") !== padded) {
134
+ throw new Error("file_content_invalid_base64");
135
+ }
136
+ return decoded;
137
+ }
38
138
  export class FileRuntime {
39
139
  root;
40
140
  maxFileBytes;
41
141
  maxEntries;
142
+ lexicalRoot;
42
143
  reserved;
144
+ readable;
43
145
  constructor(options, root) {
44
146
  this.root = root;
147
+ this.lexicalRoot = resolve(options.root);
45
148
  this.reserved = (options.reserved ?? []).map((path) => resolve(path));
149
+ this.readable = (options.readable ?? []).map((path) => resolve(path));
46
150
  this.maxFileBytes = options.maxFileBytes ?? 10 * 1024 * 1024;
47
151
  this.maxEntries = options.maxEntries ?? 1_000;
48
152
  }
@@ -56,6 +160,14 @@ export class FileRuntime {
56
160
  await mkdir(options.root, { recursive: true });
57
161
  return new FileRuntime(options, await realpath(options.root));
58
162
  }
163
+ inputPath(input) {
164
+ if (!isAbsolute(input))
165
+ return input;
166
+ const candidate = resolve(input);
167
+ return inside(this.lexicalRoot, candidate)
168
+ ? resolve(this.root, relative(this.lexicalRoot, candidate))
169
+ : input;
170
+ }
59
171
  /**
60
172
  * `creating` refuses a path that is, or is inside, a git directory: a
61
173
  * repository's config, attributes and hooks name programs git runs while
@@ -67,7 +179,7 @@ export class FileRuntime {
67
179
  * ponytail: by name, so an NTFS stream spelling of `.git` is not caught; the
68
180
  * reserved-file check has the same Windows follow-up.
69
181
  */
70
- async resolvePath(input, allowRoot = false, creating = false) {
182
+ async resolvePath(input, allowRoot = false, creating = false, changing = creating) {
71
183
  const lexical = resolve(this.root, input);
72
184
  // "Is it the root" asked the way `inside` asks "is it within": through
73
185
  // `relative`, which ignores case on Windows. A string compare let `..\\WS`
@@ -75,6 +187,11 @@ export class FileRuntime {
75
187
  if (!inside(this.root, lexical) || (!allowRoot && relative(this.root, lexical) === "")) {
76
188
  throw new Error("path_outside_workspace");
77
189
  }
190
+ // Before following links, so every reserved name gets the same answer,
191
+ // wherever a link inside it leads. `isReserved` follows them itself, the
192
+ // same way as below, so the path found there needs no second judgement.
193
+ if (await this.isReserved(lexical, !changing))
194
+ throw new Error("path_reserved");
78
195
  let probe = lexical;
79
196
  let real = lexical;
80
197
  while (true) {
@@ -96,67 +213,124 @@ export class FileRuntime {
96
213
  probe = parent;
97
214
  }
98
215
  }
99
- if (await this.isReserved(real))
216
+ // A directory holding reserved data takes it along when it is moved or
217
+ // removed, so neither may happen to it. Making it again changes nothing,
218
+ // and nothing can be renamed onto it while it holds anything.
219
+ if (changing && !creating && (await this.holdsReserved(real)))
100
220
  throw new Error("path_reserved");
101
221
  if (creating && relative(this.root, real).split(sep).some((part) => spelling(part) === ".git")) {
102
222
  throw new Error("path_git_metadata");
103
223
  }
104
224
  return lexical;
105
225
  }
106
- /** Whether `path` is, or is inside, one of the reserved entries. */
107
- async isReserved(path) {
108
- // A descriptor path names whatever this process has open, MELRA's locked
109
- // files included, and on macOS realpath leaves it under /dev/fd.
110
- if (process.platform !== "win32" && inside("/dev/fd", resolve(path)))
111
- return true;
112
- // ponytail: one stat per name match, so `payload.key/` repeated 340 times
113
- // across 100 arguments still costs about 0.9 s. Cache the reserved
114
- // identities if that ever shows up.
115
- for (let current = resolve(path);; current = dirname(current)) {
116
- const name = spelling(basename(current));
117
- for (const entry of this.reserved) {
118
- // Only a matching name costs a stat, so ordinary paths cost nothing.
119
- if (spelling(basename(entry)) === name && (await sameEntry(dirname(current), dirname(entry)))) {
120
- return true;
121
- }
122
- }
123
- if (dirname(current) === current)
124
- break;
226
+ /**
227
+ * Whether `path` is one of `entries`: by a case-insensitive name and the
228
+ * identity of the directory holding it. On a case-sensitive filesystem a
229
+ * sibling whose name differs from an entry only in case, such as a twin of
230
+ * the data directory, is matched too; that refuses more, never less.
231
+ */
232
+ async named(path, entries) {
233
+ const name = spelling(basename(path));
234
+ for (const entry of entries) {
235
+ // Only a matching name costs a stat, so ordinary paths cost nothing.
236
+ if (spelling(basename(entry)) === name && (await sameEntry(dirname(path), dirname(entry))))
237
+ return true;
125
238
  }
126
- // The same thing under another name: a hard link, or macOS's
127
- // /.vol/<dev>/<ino>, which names a file or directory by its inode alone.
128
- // So the target and each directory above it are compared by identity with
129
- // every reserved entry and every file inside a reserved directory.
239
+ return false;
240
+ }
241
+ /**
242
+ * Whether `path` is, or is inside, one of the reserved entries. `reading`
243
+ * says nothing will change it, so the contents of a readable directory are
244
+ * judged only below that directory, where a link to reserved data is still
245
+ * refused. Judged as spelled and again with the part that exists resolved
246
+ * through links: a link may lead below a reserved directory, where neither
247
+ * the names nor the identities compared here would recognise the path. A
248
+ * link whose target does not exist is followed too, so a link to a missing
249
+ * reserved name is refused like one to a present name.
250
+ */
251
+ async isReserved(path, reading = false) {
252
+ const spelled = resolve(path);
253
+ // Each part looked up once per call: the spellings a chain of links
254
+ // passes through share most of their parts.
255
+ const lookup = remembered(new Map(), (at) => stat(at, { bigint: true }).catch(() => undefined));
256
+ const resolved = new Map();
257
+ // The same thing under another name, a hard link: so the target and each
258
+ // directory above it are compared by identity with every reserved entry
259
+ // and every file inside a reserved directory.
130
260
  const identities = new Set();
131
261
  for (const entry of this.reserved) {
132
- const found = await stat(entry, { bigint: true }).catch(() => undefined);
133
- if (found === undefined)
262
+ const held = await lookup(entry);
263
+ if (held === undefined)
134
264
  continue;
135
- identities.add(identity(found));
136
- if (!found.isDirectory())
265
+ identities.add(identity(held));
266
+ if (!held.isDirectory())
137
267
  continue;
138
268
  for (const name of await readdir(entry).catch(() => [])) {
139
- const file = await stat(join(entry, name), { bigint: true }).catch(() => undefined);
269
+ const file = await lookup(join(entry, name));
140
270
  if (file !== undefined)
141
271
  identities.add(identity(file));
142
272
  }
143
273
  }
274
+ const judge = (at) => this.reservedAsSpelled(at, reading, identities, lookup);
275
+ if (await judge(spelled))
276
+ return true;
277
+ const seen = new Set();
278
+ for (let next = spelled; next !== undefined && !seen.has(next);) {
279
+ // No lookup follows a chain this long, but the answer would still tell
280
+ // where it ends: refused, whatever is there. ponytail: deleting or moving
281
+ // the link itself is refused too; allowing that needs a chain to a
282
+ // present name refused at the same length first.
283
+ if (seen.size > MAX_LINKS)
284
+ return true;
285
+ seen.add(next);
286
+ const step = await realSpelling(next, resolved);
287
+ if (step.real !== spelled && (await judge(step.real)))
288
+ return true;
289
+ next = step.next;
290
+ }
291
+ // Every spelling on the way judged, or a loop, which opens nothing.
292
+ return false;
293
+ }
294
+ async reservedAsSpelled(path, reading, identities, lookup) {
295
+ // A descriptor path names whatever this process has open, MELRA's locked
296
+ // files included, and on macOS realpath leaves it under /dev/fd.
297
+ if (process.platform !== "win32" && inside("/dev/fd", resolve(path)))
298
+ return true;
299
+ // macOS's /.vol/<dev>/<ino> names any file or directory by its inode
300
+ // alone, so below it no name or identity compared here need match.
301
+ if (process.platform === "darwin" && inside("/.vol", resolve(path)))
302
+ return true;
303
+ let above;
304
+ for (let current = resolve(path); reading && above === undefined; current = dirname(current)) {
305
+ if (await this.named(current, this.readable))
306
+ above = current;
307
+ if (dirname(current) === current)
308
+ break;
309
+ }
310
+ // ponytail: one stat per name match, so `payload.key/` repeated 340 times
311
+ // across 100 arguments still costs about 0.9 s. Cache the reserved
312
+ // identities if that ever shows up.
313
+ for (let current = resolve(path); current !== above; current = dirname(current)) {
314
+ if (await this.named(current, this.reserved))
315
+ return true;
316
+ if (dirname(current) === current)
317
+ break;
318
+ }
144
319
  if (identities.size === 0)
145
320
  return false;
146
321
  // Root first, stopping at the first missing directory: nothing below it
147
322
  // exists, and a 4 KB argument would otherwise cost thousands of failed stats.
148
323
  const chain = [];
149
- for (let current = resolve(path);; current = dirname(current)) {
324
+ for (let current = resolve(path); current !== above; current = dirname(current)) {
150
325
  chain.unshift(current);
151
326
  if (dirname(current) === current)
152
327
  break;
153
328
  }
154
329
  for (const current of chain) {
155
- const found = await stat(current, { bigint: true }).catch(() => undefined);
330
+ const found = await lookup(current);
156
331
  if (found !== undefined && identities.has(identity(found)))
157
332
  return true;
158
- // Except /.vol/<dev>, which never stats though /.vol/<dev>/<ino> below it does.
159
- if (found === undefined && dirname(current) !== "/.vol")
333
+ if (found === undefined)
160
334
  return false;
161
335
  }
162
336
  return false;
@@ -167,8 +341,18 @@ export class FileRuntime {
167
341
  if (target?.isDirectory() !== true)
168
342
  return false;
169
343
  for (const holder of new Set(this.reserved.map((entry) => dirname(entry)))) {
170
- // Lexically and through links, so a holder under a symlinked home is still found.
171
- for (const start of new Set([holder, await realpath(holder).catch(() => holder)])) {
344
+ // Lexically and through links, so a holder under a symlinked home is
345
+ // still found, even before the holder itself exists.
346
+ const { real } = await realSpelling(holder);
347
+ // macOS also mounts the data volume whole at /System/Volumes/Data, so a
348
+ // directory there, or above it, holds what a firmlinked directory such as
349
+ // /Users or /private holds, though no `..` from those leads to it. For
350
+ // data on another volume this may count those system directories as
351
+ // holders too, which only refuses more.
352
+ const firmlinked = process.platform === "darwin" ? [join("/System/Volumes/Data", real)] : [];
353
+ // ponytail: a second bind mount of an ancestor placed inside the target
354
+ // is on none of these chains; reading the mount table would find it.
355
+ for (const start of new Set([holder, real, ...firmlinked])) {
172
356
  for (let current = start;; current = dirname(current)) {
173
357
  const found = await stat(current, { bigint: true }).catch(() => undefined);
174
358
  if (found !== undefined && identity(found) === identity(target))
@@ -181,7 +365,10 @@ export class FileRuntime {
181
365
  return false;
182
366
  }
183
367
  async execute(operation) {
184
- const path = await this.resolvePath(operation.path, operation.action === "list" && operation.path === ".", operation.action === "write" || operation.action === "mkdir");
368
+ const path = await this.resolvePath(this.inputPath(operation.path),
369
+ // The root however it is spelled ("./", its absolute path), not only
370
+ // ".": the others were refused as outside the workspace.
371
+ operation.action === "list", operation.action === "write" || operation.action === "mkdir", !["list", "read", "stat", "hash"].includes(operation.action));
185
372
  switch (operation.action) {
186
373
  case "list": {
187
374
  const entries = await readdir(path, { withFileTypes: true });
@@ -252,19 +439,53 @@ export class FileRuntime {
252
439
  case "write": {
253
440
  if (operation.content === undefined)
254
441
  throw new Error("file_write_requires_content");
255
- const buffer = Buffer.from(operation.content, operation.encoding);
442
+ const buffer = decodeContent(operation.content, operation.encoding);
256
443
  if (buffer.byteLength > this.maxFileBytes)
257
444
  throw new Error("file_size_limit_exceeded");
258
- await mkdir(dirname(path), { recursive: true });
259
- const temporary = `${path}.melra-${randomUUID()}.tmp`;
260
- await writeFile(temporary, buffer, { flag: "wx" });
445
+ // A link inside the workspace is written through, as `read` reads
446
+ // through it: renaming onto the link replaced it with a plain file and
447
+ // left its target as it was. A dangling one has no target to check.
448
+ const target = (await lstat(path).catch(() => undefined))?.isSymbolicLink() === true
449
+ ? await realpath(path).catch(() => {
450
+ throw new Error("file_write_dangling_symlink");
451
+ })
452
+ : path;
453
+ // Checked again as it is now, not as resolvePath found it: the link may
454
+ // have changed since. The rename below replaces whatever is at the
455
+ // checked target without following it.
456
+ if (target !== path)
457
+ await this.resolvePath(target, false, true);
458
+ await mkdir(dirname(target), { recursive: true });
459
+ // A short name beside it, not one built from it: the target's own name
460
+ // may already be as long as the file system allows.
461
+ const temporary = join(dirname(target), `.melra-${randomBytes(6).toString("hex")}.tmp`);
462
+ // The file it replaces keeps its permissions: a private one stays
463
+ // private and a script stays executable. Written private, then set
464
+ // exactly, past the umask; the setuid, setgid and sticky bits are not
465
+ // carried over. A new file gets the default mode, as before.
466
+ const replaced = await stat(target).catch(() => undefined);
467
+ const kept = replaced?.isFile() === true ? replaced.mode & 0o777 : undefined;
468
+ // Only the exclusive create is outside the cleanup: a name already
469
+ // taken is not ours to remove.
470
+ const handle = await open(temporary, "wx", kept === undefined ? 0o666 : 0o600);
261
471
  try {
262
- await rename(temporary, path);
472
+ try {
473
+ await handle.writeFile(buffer);
474
+ // Through the descriptor: nothing after the create looks the
475
+ // name up again, so a link put in its place is never followed.
476
+ if (kept !== undefined)
477
+ await handle.chmod(kept);
478
+ }
479
+ finally {
480
+ await handle.close();
481
+ }
482
+ await rename(temporary, target);
263
483
  }
264
484
  catch (error) {
265
- // A rename that failed (the target is a directory, or held open on
266
- // Windows) would otherwise leave the content, secrets and all,
267
- // beside it in the workspace, one copy per retry.
485
+ // A write that failed partway (a full disk), or a rename that failed
486
+ // (the target is a directory, or held open on Windows), would
487
+ // otherwise leave the content, secrets and all, beside it in the
488
+ // workspace, one copy per retry.
268
489
  await rm(temporary, { force: true });
269
490
  throw error;
270
491
  }
@@ -279,7 +500,7 @@ export class FileRuntime {
279
500
  if (operation.destination === undefined) {
280
501
  throw new Error("file_move_requires_destination");
281
502
  }
282
- const destination = await this.resolvePath(operation.destination, false, true);
503
+ const destination = await this.resolvePath(this.inputPath(operation.destination), false, true);
283
504
  await mkdir(dirname(destination), { recursive: true });
284
505
  await rename(path, destination);
285
506
  return {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@melra/file-runtime",
3
- "version": "0.3.0-alpha.14",
3
+ "version": "0.3.0-alpha.16",
4
4
  "description": "Workspace-confined file reference effect adapter for the MELRA kernel.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -21,7 +21,7 @@
21
21
  "dist"
22
22
  ],
23
23
  "dependencies": {
24
- "@melra/protocol": "0.3.0-alpha.14"
24
+ "@melra/protocol": "0.3.0-alpha.16"
25
25
  },
26
26
  "scripts": {
27
27
  "build": "tsc -p tsconfig.json",