@earendil-works/pi-env 1.1.0 → 1.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"remote-env.js","sourceRoot":"","sources":["../src/remote-env.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { type PlatformPath, posix, win32 } from \"node:path\";\nimport { StringDecoder } from \"node:string_decoder\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Context } from \"@earendil-works/chord\";\nimport {\n\ttype BinaryReader,\n\ttype DirReader,\n\ttype ExecutionEnv,\n\tExecutionError,\n\terr,\n\tFileError,\n\ttype FileInfo,\n\ttype FileKind,\n\ttype FileWatcher,\n\ttype LineScan,\n\tok,\n\ttype Result,\n\ttype ShellExecOptions,\n\ttype ShellExecResult,\n\ttype ShellOutputInfo,\n\ttype ShellOutputSkip,\n\tStreamDecoder,\n\ttype TextLine,\n\ttype TextLineReader,\n\ttype WatchChange,\n\ttype WatchTarget,\n} from \"@earendil-works/pi-durable/env\";\nimport { type Connection, type Json, RemoteError, type RemoteInfo } from \"./connection.ts\";\nimport { abortResult, toFileError } from \"./errors.ts\";\nimport { RemoteWatcher, type RemoteWatchOptions } from \"./watch.ts\";\n\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nconst MAX_TIMEOUT_SECONDS = MAX_TIMEOUT_MS / 1000;\n/** Bytes per `pread` request of a binary reader; several are in flight at once. */\nconst READ_CHUNK = 256 * 1024;\nconst READ_DEPTH = 8;\n/** Node's `writeFile` writes at most this much per call and checks for an abort before each. */\nconst WRITE_CHUNK = 512 * 1024;\nconst WRITE_DEPTH = 8;\n/** Node's `readFile`: chunk of known-size reads, chunk of unknown-size reads, and the largest file it reads. */\nconst READ_FILE_CHUNK = 512 * 1024;\nconst READ_FILE_UNKNOWN_CHUNK = 64 * 1024;\nconst READ_FILE_MAX = 2 ** 31 - 1;\n/** `NodeTextLineReader`'s read size. */\nconst LINE_CHUNK = 64 * 1024;\n\nexport interface RemoteExecutionEnvOptions {\n\tconnection: Connection;\n\t/** The file namespace: equal ids see the same files (`FileSystem.id`), e.g. `pi-env:<env name>`. */\n\tid: string;\n\tcwd: string;\n\tshellPath?: string;\n\t/** Added to the remote environment of every command that inherits it, like `NodeExecutionEnv`'s `shellEnv`. */\n\tshellEnv?: Record<string, string>;\n\t/** How the daemon watches, like `NodeExecutionEnv`'s `watch` option. */\n\twatch?: RemoteWatchOptions;\n}\n\n/** An info record from the daemon. */\ntype RemoteFileInfo = { name: string; kind: FileKind | \"other\"; size: number; mtimeSec: number; mtimeNsec: number };\ntype RemoteDirEntry = { name: string; raw?: number[]; info?: RemoteFileInfo; error?: Json };\n\n/** Node's path rules of the remote system. */\nexport async function remotePath(connection: Connection): Promise<PlatformPath> {\n\treturn (await connection.info()).os === \"windows\" ? win32 : posix;\n}\n\nfunction toInfo(path: string, remote: RemoteFileInfo, paths: PlatformPath): Result<FileInfo, FileError> {\n\tif (remote.kind === \"other\") return err(new FileError(\"invalid\", \"Unsupported file type\", path));\n\treturn ok({\n\t\tname: paths.basename(path),\n\t\tpath,\n\t\tkind: remote.kind,\n\t\tsize: remote.size,\n\t\tmtimeMs: remote.mtimeSec * 1000 + remote.mtimeNsec / 1e6,\n\t});\n}\n\nfunction concat(chunks: readonly Uint8Array[], total: number): Uint8Array {\n\tif (chunks.length === 1) return chunks[0]!;\n\tconst bytes = new Uint8Array(total);\n\tlet position = 0;\n\tfor (const chunk of chunks) {\n\t\tbytes.set(chunk, position);\n\t\tposition += chunk.length;\n\t}\n\treturn bytes;\n}\n\n/**\n * Read `length` bytes from `offset` as consecutive reads of at most `chunk` bytes, several in flight. Ends early at\n * the end of the file. A short read continues from where it ended, as sequential reads would. `aborted` is checked\n * after each read; `undefined` means aborted.\n */\nasync function readRange(\n\tread: (offset: number, length: number) => Promise<Uint8Array>,\n\toffset: number,\n\tlength: number,\n\tchunk: number,\n\taborted: () => boolean,\n): Promise<{ chunks: Uint8Array[]; total: number } | undefined> {\n\tconst chunks: Uint8Array[] = [];\n\tlet total = 0;\n\tlet next = offset;\n\tconst inFlight: { length: number; bytes: Promise<Uint8Array> }[] = [];\n\twhile (total < length) {\n\t\twhile (inFlight.length < READ_DEPTH && next < offset + length) {\n\t\t\tconst size = Math.min(offset + length - next, chunk);\n\t\t\tconst bytes = read(next, size);\n\t\t\tbytes.catch(() => {});\n\t\t\tinFlight.push({ length: size, bytes });\n\t\t\tnext += size;\n\t\t}\n\t\tconst head = inFlight.shift()!;\n\t\tconst bytes = await head.bytes;\n\t\tif (aborted()) return undefined;\n\t\tif (bytes.length === 0) break;\n\t\tchunks.push(bytes);\n\t\ttotal += bytes.length;\n\t\tif (bytes.length < head.length) {\n\t\t\t// Reads already in flight assumed a full read; continue right after this one.\n\t\t\tinFlight.length = 0;\n\t\t\tnext = offset + total;\n\t\t}\n\t}\n\treturn { chunks, total };\n}\n\n/** A daemon handle: valid only in the session that opened it. */\nclass Handle {\n\treadonly env: RemoteExecutionEnv;\n\treadonly id: number;\n\treadonly session: number;\n\treadonly path: string;\n\n\tconstructor(env: RemoteExecutionEnv, id: number, session: number, path: string) {\n\t\tthis.env = env;\n\t\tthis.id = id;\n\t\tthis.session = session;\n\t\tthis.path = path;\n\t}\n\n\trequest(op: string, json: Json = {}, options: { signal?: AbortSignal; payload?: Uint8Array } = {}) {\n\t\treturn this.env.connection.request(op, { ...json, handle: this.id }, { ...options, session: this.session });\n\t}\n\n\tasync pread(offset: number | undefined, length: number): Promise<Uint8Array> {\n\t\treturn (await this.request(\"pread\", { ...(offset === undefined ? {} : { offset }), length })).payload;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tawait this.request(\"close\").catch(() => undefined);\n\t}\n}\n\nclass RemoteBinaryReader implements BinaryReader {\n\treadonly #handle: Handle;\n\t#closed = false;\n\n\tconstructor(handle: Handle) {\n\t\tthis.#handle = handle;\n\t}\n\n\tget #path(): string {\n\t\treturn this.#handle.path;\n\t}\n\n\t#closedResult<T>(): Result<T, FileError> | undefined {\n\t\treturn this.#closed ? err(new FileError(\"invalid\", \"Binary reader is closed\", this.#path)) : undefined;\n\t}\n\n\tasync info(context: Context): Promise<Result<FileInfo, FileError>> {\n\t\tconst early = abortResult<FileInfo>(context.abortSignal, this.#path) ?? this.#closedResult<FileInfo>();\n\t\tif (early) return early;\n\t\ttry {\n\t\t\tconst { json } = await this.#handle.request(\"fstat\");\n\t\t\treturn toInfo(this.#path, json as unknown as RemoteFileInfo, await remotePath(this.#handle.env.connection));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, this.#path));\n\t\t}\n\t}\n\n\tasync read(offset: number, length: number, context: Context): Promise<Result<Uint8Array, FileError>> {\n\t\tconst early = abortResult<Uint8Array>(context.abortSignal, this.#path) ?? this.#closedResult<Uint8Array>();\n\t\tif (early) return early;\n\t\tif (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(length) || length < 0) {\n\t\t\treturn err(new FileError(\"invalid\", \"Offset and length must be non-negative safe integers\", this.#path));\n\t\t}\n\t\ttry {\n\t\t\tconst read = await readRange(\n\t\t\t\t(at, size) => this.#handle.pread(at, size),\n\t\t\t\toffset,\n\t\t\t\tlength,\n\t\t\t\tREAD_CHUNK,\n\t\t\t\t() => context.abortSignal?.aborted === true,\n\t\t\t);\n\t\t\tif (read === undefined) return err(new FileError(\"aborted\", \"aborted\", this.#path));\n\t\t\treturn ok(concat(read.chunks, read.total));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, this.#path));\n\t\t}\n\t}\n\n\tasync scanLines(\n\t\toptions: { startLine: number; endLine?: number },\n\t\tcontext: Context,\n\t): Promise<Result<LineScan, FileError>> {\n\t\tconst early = abortResult<LineScan>(context.abortSignal, this.#path) ?? this.#closedResult<LineScan>();\n\t\tif (early) return early;\n\t\tconst { startLine, endLine } = options;\n\t\tif (\n\t\t\t!Number.isSafeInteger(startLine) ||\n\t\t\tstartLine < 0 ||\n\t\t\t(endLine !== undefined && (!Number.isSafeInteger(endLine) || endLine <= startLine))\n\t\t) {\n\t\t\treturn err(new FileError(\"invalid\", \"Invalid line range\", this.#path));\n\t\t}\n\t\ttry {\n\t\t\tconst { json } = await this.#handle.request(\n\t\t\t\t\"scanLines\",\n\t\t\t\t{ startLine, ...(endLine === undefined ? {} : { endLine }) },\n\t\t\t\tcontext.abortSignal ? { signal: context.abortSignal } : {},\n\t\t\t);\n\t\t\treturn ok(json as unknown as LineScan);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, this.#path));\n\t\t}\n\t}\n\n\tasync close(_context: Context): Promise<void> {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tawait this.#handle.close();\n\t}\n}\n\nclass RemoteDirReader implements DirReader {\n\treadonly #handle: Handle;\n\t#done = false;\n\t#closed = false;\n\n\tconstructor(handle: Handle) {\n\t\tthis.#handle = handle;\n\t}\n\n\tasync next(\n\t\tmaxEntries: number,\n\t\tcontext: Context,\n\t): Promise<Result<{ entries: FileInfo[]; done: boolean }, FileError>> {\n\t\tconst path = this.#handle.path;\n\t\tconst aborted = abortResult<{ entries: FileInfo[]; done: boolean }>(context.abortSignal, path);\n\t\tif (aborted) return aborted;\n\t\tif (this.#closed) return err(new FileError(\"invalid\", \"Directory reader is closed\", path));\n\t\tif (!Number.isSafeInteger(maxEntries) || maxEntries <= 0) {\n\t\t\treturn err(new FileError(\"invalid\", \"maxEntries must be a positive safe integer\", path));\n\t\t}\n\t\tconst entries: FileInfo[] = [];\n\t\ttry {\n\t\t\tconst paths = await remotePath(this.#handle.env.connection);\n\t\t\t// Like `NodeDirReader`, count only entries that are part of the listing.\n\t\t\twhile (!this.#done && entries.length < maxEntries) {\n\t\t\t\tconst { json } = await this.#handle.request(\"readdir\", { max: maxEntries - entries.length });\n\t\t\t\tconst loopAbort = abortResult<{ entries: FileInfo[]; done: boolean }>(context.abortSignal, path);\n\t\t\t\tif (loopAbort) return loopAbort;\n\t\t\t\tfor (const entry of json.entries as RemoteDirEntry[]) {\n\t\t\t\t\tconst entryPath = paths.resolve(path, entry.name);\n\t\t\t\t\tif (entry.error !== undefined) {\n\t\t\t\t\t\t// Removed between enumeration and lstat: not part of the listing any more.\n\t\t\t\t\t\tif (entry.error.code === \"ENOENT\") continue;\n\t\t\t\t\t\treturn err(toFileError(new RemoteError(entry.error), entryPath));\n\t\t\t\t\t}\n\t\t\t\t\tconst info = toInfo(entryPath, entry.info!, paths);\n\t\t\t\t\tif (info.ok) entries.push(info.value);\n\t\t\t\t}\n\t\t\t\tthis.#done = json.done === true;\n\t\t\t}\n\t\t\treturn ok({ entries, done: this.#done });\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, path));\n\t\t}\n\t}\n\n\tasync close(_context: Context): Promise<void> {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tawait this.#handle.close();\n\t}\n}\n\n/** `NodeTextLineReader`: positional reads of a file opened like `open(path, \"r\")`. */\nclass RemoteTextLineReader implements TextLineReader {\n\treadonly #handle: Handle;\n\treadonly #decoder = new StreamDecoder();\n\t#offset = 0;\n\t#buffered = \"\";\n\t#ended = false;\n\t#closed = false;\n\n\tconstructor(handle: Handle) {\n\t\tthis.#handle = handle;\n\t}\n\n\tasync readLine(context: Context): Promise<Result<TextLine | undefined, FileError>> {\n\t\tconst path = this.#handle.path;\n\t\tconst aborted = abortResult<TextLine | undefined>(context.abortSignal, path);\n\t\tif (aborted) return aborted;\n\t\tif (this.#closed) return err(new FileError(\"invalid\", \"Text line reader is closed\", path));\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst newline = this.#buffered.indexOf(\"\\n\");\n\t\t\t\tif (newline !== -1) {\n\t\t\t\t\tconst text = this.#buffered.slice(0, newline);\n\t\t\t\t\tthis.#buffered = this.#buffered.slice(newline + 1);\n\t\t\t\t\treturn ok({ text, terminated: true });\n\t\t\t\t}\n\t\t\t\tif (this.#ended) {\n\t\t\t\t\tif (this.#buffered.length === 0) return ok(undefined);\n\t\t\t\t\tconst text = this.#buffered;\n\t\t\t\t\tthis.#buffered = \"\";\n\t\t\t\t\treturn ok({ text, terminated: false });\n\t\t\t\t}\n\t\t\t\tconst bytes = await this.#handle.pread(this.#offset, LINE_CHUNK);\n\t\t\t\tconst afterReadAbort = abortResult<TextLine | undefined>(context.abortSignal, path);\n\t\t\t\tif (afterReadAbort) return afterReadAbort;\n\t\t\t\tthis.#offset += bytes.length;\n\t\t\t\tif (bytes.length === 0) {\n\t\t\t\t\tthis.#buffered += this.#decoder.decode();\n\t\t\t\t\tthis.#ended = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.#buffered += this.#decoder.decode(bytes);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, path));\n\t\t}\n\t}\n\n\tasync close(_context: Context): Promise<void> {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tthis.#buffered = \"\";\n\t\tawait this.#handle.close();\n\t}\n}\n\n/**\n * An `ExecutionEnv` on another machine, reached through a pi-env daemon. Results match `NodeExecutionEnv` running on\n * that machine: the daemon performs the system calls, and this class applies Node's path, error, and result rules.\n */\nexport class RemoteExecutionEnv implements ExecutionEnv {\n\treadonly id: string;\n\tcwd: string;\n\treadonly connection: Connection;\n\treadonly #shellPath: string | undefined;\n\treadonly #shellEnv: Record<string, string> | undefined;\n\treadonly #watchOptions: RemoteWatchOptions;\n\t/** Running commands this environment started, for `cleanup()`. */\n\treadonly #running = new Map<number, number>();\n\n\tconstructor(options: RemoteExecutionEnvOptions) {\n\t\tthis.id = options.id;\n\t\tthis.cwd = options.cwd;\n\t\tthis.connection = options.connection;\n\t\tthis.#shellPath = options.shellPath;\n\t\tthis.#shellEnv = options.shellEnv;\n\t\tthis.#watchOptions = options.watch ?? {};\n\t}\n\n\t/** Node's `resolvePath` on the remote system, with its home directory and working directories. */\n\tasync #resolve(path: string): Promise<string> {\n\t\tconst info = await this.connection.info();\n\t\tconst windows = info.os === \"windows\";\n\t\tconst paths = windows ? win32 : posix;\n\t\tlet normalized = path;\n\t\tif (normalized === \"~\") {\n\t\t\tnormalized = info.home;\n\t\t} else if (normalized.startsWith(\"~/\") || (windows && normalized.startsWith(\"~\\\\\"))) {\n\t\t\tnormalized = paths.join(info.home, normalized.slice(2));\n\t\t} else if (normalized.startsWith(\"file://\")) {\n\t\t\ttry {\n\t\t\t\tnormalized = fileURLToPath(normalized, { windows });\n\t\t\t} catch {\n\t\t\t\t// Keep malformed URLs as ordinary paths, as Node does.\n\t\t\t}\n\t\t}\n\t\tif (paths.isAbsolute(normalized)) return paths.resolve(normalized);\n\t\tif (windows) {\n\t\t\t// A drive-relative path on another drive: Node on Windows resolves it against that drive's working directory\n\t\t\t// (`=D:`), else its own working directory if on that drive, else the drive's root.\n\t\t\tconst drive = /^([a-zA-Z]:)(?![\\\\/])/.exec(normalized)?.[1];\n\t\t\tif (drive !== undefined && drive.toLowerCase() !== this.cwd.slice(0, 2).toLowerCase()) {\n\t\t\t\tlet base = info.driveCwds[drive.toUpperCase()] ?? info.cwd;\n\t\t\t\tif (base.slice(0, 2).toLowerCase() !== drive.toLowerCase() && base[2] === \"\\\\\") base = `${drive}\\\\`;\n\t\t\t\treturn win32.resolve(base, normalized);\n\t\t\t}\n\t\t}\n\t\treturn paths.resolve(this.cwd, normalized);\n\t}\n\n\tasync #fileOp<T>(\n\t\tpath: string,\n\t\tcontext: Context,\n\t\trun: (resolved: string) => Promise<T>,\n\t\tcheck: \"before\" | \"both\" = \"before\",\n\t): Promise<Result<T, FileError>> {\n\t\tlet resolved: string;\n\t\ttry {\n\t\t\tresolved = await this.#resolve(path);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, path));\n\t\t}\n\t\tconst aborted = abortResult<T>(context.abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tconst value = await run(resolved);\n\t\t\tif (check === \"both\") {\n\t\t\t\tconst after = abortResult<T>(context.abortSignal, resolved);\n\t\t\t\tif (after) return after;\n\t\t\t}\n\t\t\treturn ok(value);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync #open(resolved: string, json: Json): Promise<{ handle: Handle; json: Json }> {\n\t\tconst reply = await this.connection.request(\"open\", { path: resolved, ...json });\n\t\treturn { handle: new Handle(this, reply.json.handle as number, reply.session, resolved), json: reply.json };\n\t}\n\n\tasync absolutePath(path: string, _context: Context): Promise<Result<string, FileError>> {\n\t\ttry {\n\t\t\treturn ok(await this.#resolve(path));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, path));\n\t\t}\n\t}\n\n\tasync joinPath(parts: string[], _context: Context): Promise<Result<string, FileError>> {\n\t\ttry {\n\t\t\treturn ok((await remotePath(this.connection)).join(...parts));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error));\n\t\t}\n\t}\n\n\t/** Node's `readFile`, with or without UTF-8 decoding, over a file opened like `open(path, \"r\")`. */\n\tasync #readFile(path: string, encoding: boolean, context: Context): Promise<Result<Uint8Array | string, FileError>> {\n\t\tconst signal = context.abortSignal;\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tconst { handle, json } = await this.#open(resolved, { mode: \"read\" });\n\t\t\tconst aborted = () => signal?.aborted === true;\n\t\t\tconst abort = () => new FileError(\"aborted\", \"The operation was aborted\", resolved);\n\t\t\ttry {\n\t\t\t\tif (json.statError !== undefined) throw new RemoteError(json.statError as Json);\n\t\t\t\tif (aborted()) throw abort();\n\t\t\t\tconst stat = json.stat as RemoteFileInfo;\n\t\t\t\tconst size = stat.kind === \"file\" ? stat.size : 0;\n\t\t\t\tif (size > READ_FILE_MAX) {\n\t\t\t\t\tthrow new FileError(\"unknown\", `File size (${size}) is greater than 2 GiB`, resolved);\n\t\t\t\t}\n\t\t\t\tif (size === 0) {\n\t\t\t\t\t// Unknown size: sequential reads until the end, as for FIFOs and devices.\n\t\t\t\t\tconst decoder = new StringDecoder(\"utf8\");\n\t\t\t\t\tconst chunks: Uint8Array[] = [];\n\t\t\t\t\tlet total = 0;\n\t\t\t\t\tlet text = \"\";\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tif (aborted()) throw abort();\n\t\t\t\t\t\tconst bytes = await handle.pread(undefined, READ_FILE_UNKNOWN_CHUNK);\n\t\t\t\t\t\tif (bytes.length === 0) break;\n\t\t\t\t\t\ttotal += bytes.length;\n\t\t\t\t\t\tchunks.push(bytes);\n\t\t\t\t\t\tif (encoding) text += decoder.write(bytes);\n\t\t\t\t\t}\n\t\t\t\t\tif (!encoding) return Buffer.concat(chunks, total);\n\t\t\t\t\treturn total === 0 ? \"\" : text + decoder.end();\n\t\t\t\t}\n\t\t\t\tif (!encoding) {\n\t\t\t\t\t// A single read of the whole size, or reads of 512 KiB until the size or the end of the file.\n\t\t\t\t\tif (size <= READ_FILE_CHUNK) return Buffer.from(await handle.pread(0, size));\n\t\t\t\t\tconst read = await readRange(\n\t\t\t\t\t\t(at, length) => handle.pread(at, length),\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tsize,\n\t\t\t\t\t\tREAD_FILE_CHUNK,\n\t\t\t\t\t\taborted,\n\t\t\t\t\t);\n\t\t\t\t\tif (read === undefined) throw abort();\n\t\t\t\t\treturn Buffer.concat(read.chunks, read.total);\n\t\t\t\t}\n\t\t\t\t// Decoding: reads of min(size, 512 KiB) until the size, a short read, or the end of the file.\n\t\t\t\tconst length = Math.min(size, READ_FILE_CHUNK);\n\t\t\t\tconst decoder = new StringDecoder(\"utf8\");\n\t\t\t\tlet text = \"\";\n\t\t\t\tlet total = 0;\n\t\t\t\tlet first = true;\n\t\t\t\tconst inFlight: Promise<Uint8Array>[] = [];\n\t\t\t\tlet next = 0;\n\t\t\t\twhile (true) {\n\t\t\t\t\twhile (inFlight.length < READ_DEPTH) {\n\t\t\t\t\t\tconst bytes = handle.pread(next, length);\n\t\t\t\t\t\tbytes.catch(() => {});\n\t\t\t\t\t\tinFlight.push(bytes);\n\t\t\t\t\t\tnext += length;\n\t\t\t\t\t}\n\t\t\t\t\tconst bytes = await inFlight.shift()!;\n\t\t\t\t\tif (aborted()) throw abort();\n\t\t\t\t\ttotal += bytes.length;\n\t\t\t\t\tif (bytes.length === 0 || total === size || bytes.length !== length) {\n\t\t\t\t\t\treturn first ? Buffer.from(bytes).toString(\"utf8\") : text + decoder.end(Buffer.from(bytes));\n\t\t\t\t\t}\n\t\t\t\t\ttext += decoder.write(Buffer.from(bytes));\n\t\t\t\t\tfirst = false;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait handle.close();\n\t\t\t}\n\t\t});\n\t}\n\n\tasync readTextFile(path: string, context: Context): Promise<Result<string, FileError>> {\n\t\treturn (await this.#readFile(path, true, context)) as Result<string, FileError>;\n\t}\n\n\tasync readBinaryFile(path: string, context: Context): Promise<Result<Uint8Array, FileError>> {\n\t\treturn (await this.#readFile(path, false, context)) as Result<Uint8Array, FileError>;\n\t}\n\n\tasync openBinaryReader(\n\t\tpath: string,\n\t\toptions: { noFollow?: boolean } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<BinaryReader, FileError>> {\n\t\tconst opened = await this.#fileOp(path, context, async (resolved) => {\n\t\t\treturn (await this.#open(resolved, { noFollow: options?.noFollow === true })).handle;\n\t\t});\n\t\tif (!opened.ok) return opened;\n\t\tconst aborted = abortResult<BinaryReader>(context.abortSignal, opened.value.path);\n\t\tif (aborted) {\n\t\t\tawait opened.value.close();\n\t\t\treturn aborted;\n\t\t}\n\t\treturn ok(new RemoteBinaryReader(opened.value));\n\t}\n\n\tasync openTextLineReader(path: string, context: Context): Promise<Result<TextLineReader, FileError>> {\n\t\tconst opened = await this.#fileOp(path, context, async (resolved) => {\n\t\t\treturn (await this.#open(resolved, { mode: \"read\" })).handle;\n\t\t});\n\t\tif (!opened.ok) return opened;\n\t\tconst aborted = abortResult<TextLineReader>(context.abortSignal, opened.value.path);\n\t\tif (aborted) {\n\t\t\tawait opened.value.close();\n\t\t\treturn aborted;\n\t\t}\n\t\treturn ok(new RemoteTextLineReader(opened.value));\n\t}\n\n\tasync readTextLines(\n\t\tpath: string,\n\t\toptions: { maxLines?: number } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<string[], FileError>> {\n\t\tif (options?.maxLines !== undefined && options.maxLines <= 0) return ok([]);\n\t\tconst opened = await this.openTextLineReader(path, context);\n\t\tif (!opened.ok) return opened;\n\t\tconst lines: string[] = [];\n\t\ttry {\n\t\t\twhile (options?.maxLines === undefined || lines.length < options.maxLines) {\n\t\t\t\tconst line = await opened.value.readLine(context);\n\t\t\t\tif (!line.ok) return line;\n\t\t\t\tif (line.value === undefined) break;\n\t\t\t\tlines.push(line.value.text);\n\t\t\t}\n\t\t\treturn ok(lines);\n\t\t} finally {\n\t\t\tawait opened.value.close(context);\n\t\t}\n\t}\n\n\t/**\n\t * Node's `writeFile` (abort checked before each 512 KiB write) or `appendFile` (no checks, one after): the first\n\t * request creates parents, opens, and writes the first chunk; later chunks go to the same open file.\n\t */\n\tasync #write(path: string, content: string | Uint8Array, append: boolean, context: Context) {\n\t\tconst bytes = typeof content === \"string\" ? Buffer.from(content, \"utf8\") : content;\n\t\tconst signal = append ? undefined : context.abortSignal;\n\t\treturn this.#fileOp(\n\t\t\tpath,\n\t\t\tcontext,\n\t\t\tasync (resolved) => {\n\t\t\t\tconst first = bytes.subarray(0, WRITE_CHUNK);\n\t\t\t\tconst keep = bytes.length > WRITE_CHUNK;\n\t\t\t\tconst reply = await this.connection.request(\"write\", { path: resolved, append, keep }, { payload: first });\n\t\t\t\tif (!keep) return;\n\t\t\t\tconst handle = new Handle(this, reply.json.handle as number, reply.session, resolved);\n\t\t\t\tconst inFlight: Promise<unknown>[] = [];\n\t\t\t\ttry {\n\t\t\t\t\tfor (let offset = WRITE_CHUNK; offset < bytes.length; offset += WRITE_CHUNK) {\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t// A chunk that failed before this check fails the write, as it would have in sequence.\n\t\t\t\t\t\t\tconst failed = (await Promise.allSettled(inFlight)).find((result) => result.status === \"rejected\");\n\t\t\t\t\t\t\tif (failed !== undefined) throw failed.reason;\n\t\t\t\t\t\t\tthrow new FileError(\"aborted\", \"The operation was aborted\", resolved);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst written = handle.request(\n\t\t\t\t\t\t\t\"writeChunk\",\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\t{ payload: bytes.subarray(offset, offset + WRITE_CHUNK) },\n\t\t\t\t\t\t);\n\t\t\t\t\t\twritten.catch(() => {});\n\t\t\t\t\t\tinFlight.push(written);\n\t\t\t\t\t\tif (inFlight.length >= WRITE_DEPTH) await inFlight.shift();\n\t\t\t\t\t}\n\t\t\t\t\t// The first failure; later chunks are refused by the daemon, so the file has no gaps.\n\t\t\t\t\tfor (const written of inFlight) await written;\n\t\t\t\t} finally {\n\t\t\t\t\tawait Promise.allSettled(inFlight);\n\t\t\t\t\tawait handle.close();\n\t\t\t\t}\n\t\t\t},\n\t\t\tappend ? \"both\" : \"before\",\n\t\t);\n\t}\n\n\twriteFile(path: string, content: string | Uint8Array, context: Context): Promise<Result<void, FileError>> {\n\t\treturn this.#write(path, content, false, context);\n\t}\n\n\tappendFile(path: string, content: string | Uint8Array, context: Context): Promise<Result<void, FileError>> {\n\t\treturn this.#write(path, content, true, context);\n\t}\n\n\tasync truncateFile(path: string, size: number, context: Context): Promise<Result<void, FileError>> {\n\t\treturn this.#fileOp(\n\t\t\tpath,\n\t\t\tcontext,\n\t\t\tasync (resolved) => {\n\t\t\t\tif (!Number.isSafeInteger(size) || size < 0) {\n\t\t\t\t\tthrow new FileError(\"invalid\", \"File size must be a non-negative safe integer\", resolved);\n\t\t\t\t}\n\t\t\t\tawait this.connection.request(\"truncate\", { path: resolved, size });\n\t\t\t},\n\t\t\t\"both\",\n\t\t);\n\t}\n\n\tflushFile(path: string, context: Context): Promise<Result<void, FileError>> {\n\t\treturn this.#fileOp(\n\t\t\tpath,\n\t\t\tcontext,\n\t\t\tasync (resolved) => {\n\t\t\t\tawait this.connection.request(\"fsync\", { path: resolved });\n\t\t\t},\n\t\t\t\"both\",\n\t\t);\n\t}\n\n\tasync renameFile(sourcePath: string, destinationPath: string, context: Context): Promise<Result<void, FileError>> {\n\t\tlet source: string;\n\t\tlet destination: string;\n\t\ttry {\n\t\t\tsource = await this.#resolve(sourcePath);\n\t\t\tdestination = await this.#resolve(destinationPath);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, sourcePath));\n\t\t}\n\t\tconst aborted = abortResult<void>(context.abortSignal, destination);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tawait this.connection.request(\"rename\", { path: source, to: destination });\n\t\t\treturn ok(undefined);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, source));\n\t\t}\n\t}\n\n\tasync fileInfo(path: string, context: Context): Promise<Result<FileInfo, FileError>> {\n\t\tconst result = await this.#fileOp(path, context, async (resolved) => {\n\t\t\tconst { json } = await this.connection.request(\"lstat\", { path: resolved });\n\t\t\treturn toInfo(resolved, json as unknown as RemoteFileInfo, await remotePath(this.connection));\n\t\t});\n\t\treturn result.ok ? result.value : result;\n\t}\n\n\tlistDir(path: string, context: Context): Promise<Result<FileInfo[], FileError>> {\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tconst { handle } = await this.#openDir(resolved);\n\t\t\tconst entries: RemoteDirEntry[] = [];\n\t\t\ttry {\n\t\t\t\tfor (let done = false; !done; ) {\n\t\t\t\t\tconst { json } = await handle.request(\"readdir\", { max: 1000 });\n\t\t\t\t\tentries.push(...(json.entries as RemoteDirEntry[]));\n\t\t\t\t\tdone = json.done === true;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait handle.close();\n\t\t\t}\n\t\t\t// Node's `readdir` fails on any entry it cannot lstat. libuv sorts names by their bytes on POSIX; on Windows it\n\t\t\t// keeps the file system's order, which the daemon reports.\n\t\t\tconst paths = await remotePath(this.connection);\n\t\t\tif (paths === posix) {\n\t\t\t\tconst key = (entry: RemoteDirEntry) => Buffer.from(entry.raw ?? Buffer.from(entry.name, \"utf8\"));\n\t\t\t\tentries.sort((a, b) => Buffer.compare(key(a), key(b)));\n\t\t\t}\n\t\t\tconst infos: FileInfo[] = [];\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (context.abortSignal?.aborted) throw new FileError(\"aborted\", \"aborted\", resolved);\n\t\t\t\tconst entryPath = paths.resolve(resolved, entry.name);\n\t\t\t\tif (entry.error !== undefined) throw toFileError(new RemoteError(entry.error), entryPath);\n\t\t\t\tconst info = toInfo(entryPath, entry.info!, paths);\n\t\t\t\tif (info.ok) infos.push(info.value);\n\t\t\t}\n\t\t\treturn infos;\n\t\t});\n\t}\n\n\tasync #openDir(resolved: string): Promise<{ handle: Handle }> {\n\t\tconst reply = await this.connection.request(\"opendir\", { path: resolved });\n\t\treturn { handle: new Handle(this, reply.json.handle as number, reply.session, resolved) };\n\t}\n\n\tasync openDirReader(path: string, context: Context): Promise<Result<DirReader, FileError>> {\n\t\tconst opened = await this.#fileOp(path, context, async (resolved) => (await this.#openDir(resolved)).handle);\n\t\tif (!opened.ok) return opened;\n\t\tconst aborted = abortResult<DirReader>(context.abortSignal, opened.value.path);\n\t\tif (aborted) {\n\t\t\tawait opened.value.close();\n\t\t\treturn aborted;\n\t\t}\n\t\treturn ok(new RemoteDirReader(opened.value));\n\t}\n\n\tcanonicalPath(path: string, context: Context): Promise<Result<string, FileError>> {\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tconst { json } = await this.connection.request(\"realpath\", { path: resolved });\n\t\t\treturn json.path as string;\n\t\t});\n\t}\n\n\tasync exists(path: string, context: Context): Promise<Result<boolean, FileError>> {\n\t\tconst result = await this.fileInfo(path, context);\n\t\tif (result.ok) return ok(true);\n\t\tif (result.error.code === \"not_found\") return ok(false);\n\t\treturn err(result.error);\n\t}\n\n\tcreateDir(\n\t\tpath: string,\n\t\toptions: { recursive?: boolean } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<void, FileError>> {\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tawait this.connection.request(\"mkdir\", { path: resolved, recursive: options?.recursive ?? true });\n\t\t});\n\t}\n\n\tremove(\n\t\tpath: string,\n\t\toptions: { recursive?: boolean; force?: boolean } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<void, FileError>> {\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tawait this.connection.request(\"rm\", {\n\t\t\t\tpath: resolved,\n\t\t\t\trecursive: options?.recursive ?? false,\n\t\t\t\tforce: options?.force ?? false,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync createTempDir(prefix: string | undefined, context: Context): Promise<Result<string, FileError>> {\n\t\tconst aborted = abortResult<string>(context.abortSignal);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tconst { tmpdir } = await this.connection.info();\n\t\t\tconst paths = await remotePath(this.connection);\n\t\t\tconst { json } = await this.connection.request(\"mkdtemp\", { path: paths.join(tmpdir, prefix ?? \"tmp-\") });\n\t\t\treturn ok(json.path as string);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error));\n\t\t}\n\t}\n\n\tasync createTempFile(\n\t\toptions: { prefix?: string; suffix?: string } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<string, FileError>> {\n\t\tconst dir = await this.createTempDir(\"tmp-\", context);\n\t\tif (!dir.ok) return dir;\n\t\tlet filePath = \"\";\n\t\ttry {\n\t\t\tconst paths = await remotePath(this.connection);\n\t\t\tfilePath = paths.join(dir.value, `${options?.prefix ?? \"\"}${randomUUID()}${options?.suffix ?? \"\"}`);\n\t\t\t// Node's `writeFile(filePath, \"\")`, which does not create parents.\n\t\t\tawait this.connection.request(\n\t\t\t\t\"write\",\n\t\t\t\t{ path: filePath, append: false, parents: false },\n\t\t\t\t{ payload: new Uint8Array(0) },\n\t\t\t);\n\t\t\treturn ok(filePath);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, filePath));\n\t\t}\n\t}\n\n\tasync watch(\n\t\ttargets: readonly WatchTarget[],\n\t\tonChange: (change: WatchChange) => void,\n\t\tcontext: Context,\n\t): Promise<Result<FileWatcher, FileError>> {\n\t\tconst aborted = abortResult<FileWatcher>(context.abortSignal);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tconst resolved = await Promise.all(\n\t\t\t\ttargets.map(async (target) => ({ ...target, path: await this.#resolve(target.path) })),\n\t\t\t);\n\t\t\tconst afterResolve = abortResult<FileWatcher>(context.abortSignal);\n\t\t\tif (afterResolve) return afterResolve;\n\t\t\tconst watcher = await RemoteWatcher.open(this.connection, resolved, onChange, this.#watchOptions);\n\t\t\tconst afterOpen = abortResult<FileWatcher>(context.abortSignal);\n\t\t\tif (afterOpen) {\n\t\t\t\tawait watcher.close(context);\n\t\t\t\treturn afterOpen;\n\t\t\t}\n\t\t\treturn ok(watcher);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error));\n\t\t}\n\t}\n\n\tasync exec(\n\t\tcommand: string | readonly string[],\n\t\toptions: ShellExecOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<ShellExecResult, ExecutionError>> {\n\t\tconst signal = context.abortSignal;\n\t\tif (signal?.aborted) return err(new ExecutionError(\"aborted\", \"aborted\"));\n\t\tconst timeout = options?.timeout;\n\t\tif (timeout !== undefined) {\n\t\t\tif (!Number.isFinite(timeout) || timeout <= 0) {\n\t\t\t\treturn err(new ExecutionError(\"timeout\", \"Invalid timeout: must be a finite number of seconds\"));\n\t\t\t}\n\t\t\tif (timeout * 1000 > MAX_TIMEOUT_MS) {\n\t\t\t\treturn err(new ExecutionError(\"timeout\", `Invalid timeout: maximum is ${MAX_TIMEOUT_SECONDS} seconds`));\n\t\t\t}\n\t\t}\n\t\tconst inheritEnv = options?.inheritEnv ?? true;\n\t\tlet cwd: string;\n\t\ttry {\n\t\t\tcwd = options?.cwd ? await this.#resolve(options.cwd) : this.cwd;\n\t\t} catch (error) {\n\t\t\treturn err(new ExecutionError(\"unknown\", error instanceof Error ? error.message : String(error)));\n\t\t}\n\t\tif (signal?.aborted) return err(new ExecutionError(\"aborted\", \"aborted\"));\n\t\tconst env: Record<string, string> = {};\n\t\tfor (const [key, value] of Object.entries(\n\t\t\tinheritEnv ? { ...this.#shellEnv, ...options?.env } : { ...options?.env },\n\t\t)) {\n\t\t\tif (value !== undefined) env[key.toWellFormed()] = value;\n\t\t}\n\t\tlet callbackError: ExecutionError | undefined;\n\t\tlet settled = false;\n\t\tlet running: number | undefined;\n\t\tconst controller = new AbortController();\n\t\tconst onAbort = () => controller.abort();\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\ttry {\n\t\t\tconst { json } = await this.connection.request(\n\t\t\t\t\"exec\",\n\t\t\t\t{\n\t\t\t\t\t...(typeof command === \"string\" ? { command } : { argv: [...command] }),\n\t\t\t\t\tcwd,\n\t\t\t\t\tenv,\n\t\t\t\t\tinheritEnv,\n\t\t\t\t\t...(this.#shellPath === undefined ? {} : { shellPath: this.#shellPath }),\n\t\t\t\t\t...(timeout === undefined ? {} : { timeoutMs: timeout * 1000 }),\n\t\t\t\t\t...(options?.spill === undefined ? {} : { spill: options.spill }),\n\t\t\t\t\t...(options?.window === undefined ? {} : { window: options.window }),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tonStart: (requestId, session) => {\n\t\t\t\t\t\trunning = requestId;\n\t\t\t\t\t\tthis.#running.set(requestId, session);\n\t\t\t\t\t},\n\t\t\t\t\tonEvent: (event, payload) => {\n\t\t\t\t\t\tif (settled || callbackError !== undefined || event.kind !== \"output\") return;\n\t\t\t\t\t\tconst text = Buffer.from(payload.buffer, payload.byteOffset, payload.length).toString(\"utf8\");\n\t\t\t\t\t\tif (text === \"\" || options?.onOutput === undefined) return;\n\t\t\t\t\t\tconst info: ShellOutputInfo = { stream: event.stream === \"stderr\" ? \"stderr\" : \"stdout\" };\n\t\t\t\t\t\tif (event.skipped !== undefined) info.skipped = event.skipped as ShellOutputSkip;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\toptions.onOutput(text, context, info);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconst cause = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\tcallbackError = new ExecutionError(\"callback_error\", cause.message, cause);\n\t\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (callbackError) return err(callbackError);\n\t\t\treturn ok({\n\t\t\t\texitCode: json.exitCode as number,\n\t\t\t\t...(typeof json.spillPath === \"string\" ? { spillPath: json.spillPath } : {}),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (callbackError) return err(callbackError);\n\t\t\tif (!(error instanceof RemoteError)) {\n\t\t\t\treturn err(new ExecutionError(\"unknown\", error instanceof Error ? error.message : String(error)));\n\t\t\t}\n\t\t\tconst failure =\n\t\t\t\terror.code === \"timeout\"\n\t\t\t\t\t? new ExecutionError(\"timeout\", `timeout:${timeout}`)\n\t\t\t\t\t: error.code === \"aborted\"\n\t\t\t\t\t\t? new ExecutionError(\"aborted\", \"aborted\")\n\t\t\t\t\t\t: error.code === \"shell_unavailable\" || error.code === \"spawn_error\"\n\t\t\t\t\t\t\t? new ExecutionError(error.code, error.message)\n\t\t\t\t\t\t\t: new ExecutionError(\"unknown\", error.message);\n\t\t\tif (typeof error.fields.spillPath === \"string\") failure.spillPath = error.fields.spillPath;\n\t\t\treturn err(failure);\n\t\t} finally {\n\t\t\tsettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tif (running !== undefined) this.#running.delete(running);\n\t\t}\n\t}\n\n\tasync cleanup(_context: Context): Promise<void> {\n\t\t// Kill without aborting, so the commands settle with their killed status, as `NodeExecutionEnv` does.\n\t\tfor (const [id, session] of this.#running) this.connection.kill(id, session);\n\t\tthis.#running.clear();\n\t}\n}\n\nexport type { RemoteInfo };\n"]}
1
+ {"version":3,"file":"remote-env.js","sourceRoot":"","sources":["../src/remote-env.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { type PlatformPath, posix, win32 } from \"node:path\";\nimport { StringDecoder } from \"node:string_decoder\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Context } from \"@earendil-works/chord\";\nimport {\n\ttype BinaryReader,\n\ttype DirReader,\n\ttype ExecutionEnv,\n\tExecutionError,\n\terr,\n\tFileError,\n\ttype FileInfo,\n\ttype FileKind,\n\ttype FileListing,\n\ttype FileWatcher,\n\ttype LineScan,\n\ttype ListFilesOptions,\n\tok,\n\ttype Result,\n\ttype ShellExecOptions,\n\ttype ShellExecResult,\n\ttype ShellOutputInfo,\n\ttype ShellOutputSkip,\n\tStreamDecoder,\n\ttype TextLine,\n\ttype TextLineReader,\n\ttype WatchChange,\n\ttype WatchTarget,\n} from \"@earendil-works/pi-durable/env\";\nimport { type Connection, type Json, nodePlatform, RemoteError, type RemoteInfo } from \"./connection.ts\";\nimport { abortResult, toFileError } from \"./errors.ts\";\nimport { listFilesOver } from \"./list-files.ts\";\nimport { RemoteWatcher, type RemoteWatchOptions } from \"./watch.ts\";\n\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nconst MAX_TIMEOUT_SECONDS = MAX_TIMEOUT_MS / 1000;\n/** Bytes per `pread` request of a binary reader; several are in flight at once. */\nconst READ_CHUNK = 256 * 1024;\nconst READ_DEPTH = 8;\n/** Node's `writeFile` writes at most this much per call and checks for an abort before each. */\nconst WRITE_CHUNK = 512 * 1024;\nconst WRITE_DEPTH = 8;\n/** Node's `readFile`: chunk of known-size reads, chunk of unknown-size reads, and the largest file it reads. */\nconst READ_FILE_CHUNK = 512 * 1024;\nconst READ_FILE_UNKNOWN_CHUNK = 64 * 1024;\nconst READ_FILE_MAX = 2 ** 31 - 1;\n/** `NodeTextLineReader`'s read size. */\nconst LINE_CHUNK = 64 * 1024;\n\nexport interface RemoteExecutionEnvOptions {\n\tconnection: Connection;\n\t/** The file namespace: equal ids see the same files (`FileSystem.id`), e.g. `pi-env:<env name>`. */\n\tid: string;\n\tcwd: string;\n\tshellPath?: string;\n\t/** Added to the remote environment of every command that inherits it, like `NodeExecutionEnv`'s `shellEnv`. */\n\tshellEnv?: Record<string, string>;\n\t/** How the daemon watches, like `NodeExecutionEnv`'s `watch` option. */\n\twatch?: RemoteWatchOptions;\n}\n\n/** An info record from the daemon. */\ntype RemoteFileInfo = { name: string; kind: FileKind | \"other\"; size: number; mtimeSec: number; mtimeNsec: number };\ntype RemoteDirEntry = { name: string; raw?: number[]; info?: RemoteFileInfo; error?: Json };\n\n/** Node's path rules of the remote system. */\nexport async function remotePath(connection: Connection): Promise<PlatformPath> {\n\treturn nodePlatform(await connection.info()).platform === \"win32\" ? win32 : posix;\n}\n\nfunction toInfo(path: string, remote: RemoteFileInfo, paths: PlatformPath): Result<FileInfo, FileError> {\n\tif (remote.kind === \"other\") return err(new FileError(\"invalid\", \"Unsupported file type\", path));\n\treturn ok({\n\t\tname: paths.basename(path),\n\t\tpath,\n\t\tkind: remote.kind,\n\t\tsize: remote.size,\n\t\tmtimeMs: remote.mtimeSec * 1000 + remote.mtimeNsec / 1e6,\n\t});\n}\n\nfunction concat(chunks: readonly Uint8Array[], total: number): Uint8Array {\n\tif (chunks.length === 1) return chunks[0]!;\n\tconst bytes = new Uint8Array(total);\n\tlet position = 0;\n\tfor (const chunk of chunks) {\n\t\tbytes.set(chunk, position);\n\t\tposition += chunk.length;\n\t}\n\treturn bytes;\n}\n\n/**\n * Read `length` bytes from `offset` as consecutive reads of at most `chunk` bytes, several in flight. Ends early at\n * the end of the file. A short read continues from where it ended, as sequential reads would. `aborted` is checked\n * after each read; `undefined` means aborted.\n */\nasync function readRange(\n\tread: (offset: number, length: number) => Promise<Uint8Array>,\n\toffset: number,\n\tlength: number,\n\tchunk: number,\n\taborted: () => boolean,\n): Promise<{ chunks: Uint8Array[]; total: number } | undefined> {\n\tconst chunks: Uint8Array[] = [];\n\tlet total = 0;\n\tlet next = offset;\n\tconst inFlight: { length: number; bytes: Promise<Uint8Array> }[] = [];\n\twhile (total < length) {\n\t\twhile (inFlight.length < READ_DEPTH && next < offset + length) {\n\t\t\tconst size = Math.min(offset + length - next, chunk);\n\t\t\tconst bytes = read(next, size);\n\t\t\tbytes.catch(() => {});\n\t\t\tinFlight.push({ length: size, bytes });\n\t\t\tnext += size;\n\t\t}\n\t\tconst head = inFlight.shift()!;\n\t\tconst bytes = await head.bytes;\n\t\tif (aborted()) return undefined;\n\t\tif (bytes.length === 0) break;\n\t\tchunks.push(bytes);\n\t\ttotal += bytes.length;\n\t\tif (bytes.length < head.length) {\n\t\t\t// Reads already in flight assumed a full read; continue right after this one.\n\t\t\tinFlight.length = 0;\n\t\t\tnext = offset + total;\n\t\t}\n\t}\n\treturn { chunks, total };\n}\n\n/** A daemon handle: valid only in the session that opened it. */\nclass Handle {\n\treadonly env: RemoteExecutionEnv;\n\treadonly id: number;\n\treadonly session: number;\n\treadonly path: string;\n\n\tconstructor(env: RemoteExecutionEnv, id: number, session: number, path: string) {\n\t\tthis.env = env;\n\t\tthis.id = id;\n\t\tthis.session = session;\n\t\tthis.path = path;\n\t}\n\n\trequest(op: string, json: Json = {}, options: { signal?: AbortSignal; payload?: Uint8Array } = {}) {\n\t\treturn this.env.connection.request(op, { ...json, handle: this.id }, { ...options, session: this.session });\n\t}\n\n\tasync pread(offset: number | undefined, length: number): Promise<Uint8Array> {\n\t\treturn (await this.request(\"pread\", { ...(offset === undefined ? {} : { offset }), length })).payload;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tawait this.request(\"close\").catch(() => undefined);\n\t}\n}\n\nclass RemoteBinaryReader implements BinaryReader {\n\treadonly #handle: Handle;\n\t#closed = false;\n\n\tconstructor(handle: Handle) {\n\t\tthis.#handle = handle;\n\t}\n\n\tget #path(): string {\n\t\treturn this.#handle.path;\n\t}\n\n\t#closedResult<T>(): Result<T, FileError> | undefined {\n\t\treturn this.#closed ? err(new FileError(\"invalid\", \"Binary reader is closed\", this.#path)) : undefined;\n\t}\n\n\tasync info(context: Context): Promise<Result<FileInfo, FileError>> {\n\t\tconst early = abortResult<FileInfo>(context.abortSignal, this.#path) ?? this.#closedResult<FileInfo>();\n\t\tif (early) return early;\n\t\ttry {\n\t\t\tconst { json } = await this.#handle.request(\"fstat\");\n\t\t\treturn toInfo(this.#path, json as unknown as RemoteFileInfo, await remotePath(this.#handle.env.connection));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, this.#path));\n\t\t}\n\t}\n\n\tasync read(offset: number, length: number, context: Context): Promise<Result<Uint8Array, FileError>> {\n\t\tconst early = abortResult<Uint8Array>(context.abortSignal, this.#path) ?? this.#closedResult<Uint8Array>();\n\t\tif (early) return early;\n\t\tif (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(length) || length < 0) {\n\t\t\treturn err(new FileError(\"invalid\", \"Offset and length must be non-negative safe integers\", this.#path));\n\t\t}\n\t\ttry {\n\t\t\tconst read = await readRange(\n\t\t\t\t(at, size) => this.#handle.pread(at, size),\n\t\t\t\toffset,\n\t\t\t\tlength,\n\t\t\t\tREAD_CHUNK,\n\t\t\t\t() => context.abortSignal?.aborted === true,\n\t\t\t);\n\t\t\tif (read === undefined) return err(new FileError(\"aborted\", \"aborted\", this.#path));\n\t\t\treturn ok(concat(read.chunks, read.total));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, this.#path));\n\t\t}\n\t}\n\n\tasync scanLines(\n\t\toptions: { startLine: number; endLine?: number },\n\t\tcontext: Context,\n\t): Promise<Result<LineScan, FileError>> {\n\t\tconst early = abortResult<LineScan>(context.abortSignal, this.#path) ?? this.#closedResult<LineScan>();\n\t\tif (early) return early;\n\t\tconst { startLine, endLine } = options;\n\t\tif (\n\t\t\t!Number.isSafeInteger(startLine) ||\n\t\t\tstartLine < 0 ||\n\t\t\t(endLine !== undefined && (!Number.isSafeInteger(endLine) || endLine <= startLine))\n\t\t) {\n\t\t\treturn err(new FileError(\"invalid\", \"Invalid line range\", this.#path));\n\t\t}\n\t\ttry {\n\t\t\tconst { json } = await this.#handle.request(\n\t\t\t\t\"scanLines\",\n\t\t\t\t{ startLine, ...(endLine === undefined ? {} : { endLine }) },\n\t\t\t\tcontext.abortSignal ? { signal: context.abortSignal } : {},\n\t\t\t);\n\t\t\treturn ok(json as unknown as LineScan);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, this.#path));\n\t\t}\n\t}\n\n\tasync close(_context: Context): Promise<void> {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tawait this.#handle.close();\n\t}\n}\n\nclass RemoteDirReader implements DirReader {\n\treadonly #handle: Handle;\n\t#done = false;\n\t#closed = false;\n\n\tconstructor(handle: Handle) {\n\t\tthis.#handle = handle;\n\t}\n\n\tasync next(\n\t\tmaxEntries: number,\n\t\tcontext: Context,\n\t): Promise<Result<{ entries: FileInfo[]; done: boolean }, FileError>> {\n\t\tconst path = this.#handle.path;\n\t\tconst aborted = abortResult<{ entries: FileInfo[]; done: boolean }>(context.abortSignal, path);\n\t\tif (aborted) return aborted;\n\t\tif (this.#closed) return err(new FileError(\"invalid\", \"Directory reader is closed\", path));\n\t\tif (!Number.isSafeInteger(maxEntries) || maxEntries <= 0) {\n\t\t\treturn err(new FileError(\"invalid\", \"maxEntries must be a positive safe integer\", path));\n\t\t}\n\t\tconst entries: FileInfo[] = [];\n\t\ttry {\n\t\t\tconst paths = await remotePath(this.#handle.env.connection);\n\t\t\t// Like `NodeDirReader`, count only entries that are part of the listing.\n\t\t\twhile (!this.#done && entries.length < maxEntries) {\n\t\t\t\tconst { json } = await this.#handle.request(\"readdir\", { max: maxEntries - entries.length });\n\t\t\t\tconst loopAbort = abortResult<{ entries: FileInfo[]; done: boolean }>(context.abortSignal, path);\n\t\t\t\tif (loopAbort) return loopAbort;\n\t\t\t\tfor (const entry of json.entries as RemoteDirEntry[]) {\n\t\t\t\t\tconst entryPath = paths.resolve(path, entry.name);\n\t\t\t\t\tif (entry.error !== undefined) {\n\t\t\t\t\t\t// Removed between enumeration and lstat: not part of the listing any more.\n\t\t\t\t\t\tif (entry.error.code === \"ENOENT\") continue;\n\t\t\t\t\t\treturn err(toFileError(new RemoteError(entry.error), entryPath));\n\t\t\t\t\t}\n\t\t\t\t\tconst info = toInfo(entryPath, entry.info!, paths);\n\t\t\t\t\tif (info.ok) entries.push(info.value);\n\t\t\t\t}\n\t\t\t\tthis.#done = json.done === true;\n\t\t\t}\n\t\t\treturn ok({ entries, done: this.#done });\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, path));\n\t\t}\n\t}\n\n\tasync close(_context: Context): Promise<void> {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tawait this.#handle.close();\n\t}\n}\n\n/** `NodeTextLineReader`: positional reads of a file opened like `open(path, \"r\")`. */\nclass RemoteTextLineReader implements TextLineReader {\n\treadonly #handle: Handle;\n\treadonly #decoder = new StreamDecoder();\n\t#offset = 0;\n\t#buffered = \"\";\n\t#ended = false;\n\t#closed = false;\n\n\tconstructor(handle: Handle) {\n\t\tthis.#handle = handle;\n\t}\n\n\tasync readLine(context: Context): Promise<Result<TextLine | undefined, FileError>> {\n\t\tconst path = this.#handle.path;\n\t\tconst aborted = abortResult<TextLine | undefined>(context.abortSignal, path);\n\t\tif (aborted) return aborted;\n\t\tif (this.#closed) return err(new FileError(\"invalid\", \"Text line reader is closed\", path));\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst newline = this.#buffered.indexOf(\"\\n\");\n\t\t\t\tif (newline !== -1) {\n\t\t\t\t\tconst text = this.#buffered.slice(0, newline);\n\t\t\t\t\tthis.#buffered = this.#buffered.slice(newline + 1);\n\t\t\t\t\treturn ok({ text, terminated: true });\n\t\t\t\t}\n\t\t\t\tif (this.#ended) {\n\t\t\t\t\tif (this.#buffered.length === 0) return ok(undefined);\n\t\t\t\t\tconst text = this.#buffered;\n\t\t\t\t\tthis.#buffered = \"\";\n\t\t\t\t\treturn ok({ text, terminated: false });\n\t\t\t\t}\n\t\t\t\tconst bytes = await this.#handle.pread(this.#offset, LINE_CHUNK);\n\t\t\t\tconst afterReadAbort = abortResult<TextLine | undefined>(context.abortSignal, path);\n\t\t\t\tif (afterReadAbort) return afterReadAbort;\n\t\t\t\tthis.#offset += bytes.length;\n\t\t\t\tif (bytes.length === 0) {\n\t\t\t\t\tthis.#buffered += this.#decoder.decode();\n\t\t\t\t\tthis.#ended = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.#buffered += this.#decoder.decode(bytes);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, path));\n\t\t}\n\t}\n\n\tasync close(_context: Context): Promise<void> {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tthis.#buffered = \"\";\n\t\tawait this.#handle.close();\n\t}\n}\n\n/**\n * An `ExecutionEnv` on another machine, reached through a pi-env daemon. Results match `NodeExecutionEnv` running on\n * that machine: the daemon performs the system calls, and this class applies Node's path, error, and result rules.\n */\nexport class RemoteExecutionEnv implements ExecutionEnv {\n\treadonly id: string;\n\tcwd: string;\n\treadonly connection: Connection;\n\treadonly #shellPath: string | undefined;\n\treadonly #shellEnv: Record<string, string> | undefined;\n\treadonly #watchOptions: RemoteWatchOptions;\n\t/** Running commands this environment started, for `cleanup()`. */\n\treadonly #running = new Map<number, number>();\n\n\tconstructor(options: RemoteExecutionEnvOptions) {\n\t\tthis.id = options.id;\n\t\tthis.cwd = options.cwd;\n\t\tthis.connection = options.connection;\n\t\tthis.#shellPath = options.shellPath;\n\t\tthis.#shellEnv = options.shellEnv;\n\t\tthis.#watchOptions = options.watch ?? {};\n\t}\n\n\t/** Node's `resolvePath` on the remote system, with its home directory and working directories. */\n\tasync #resolve(path: string): Promise<string> {\n\t\tconst info = await this.connection.info();\n\t\tconst windows = nodePlatform(info).platform === \"win32\";\n\t\tconst paths = windows ? win32 : posix;\n\t\tlet normalized = path;\n\t\tif (normalized === \"~\") {\n\t\t\tnormalized = info.home;\n\t\t} else if (normalized.startsWith(\"~/\") || (windows && normalized.startsWith(\"~\\\\\"))) {\n\t\t\tnormalized = paths.join(info.home, normalized.slice(2));\n\t\t} else if (normalized.startsWith(\"file://\")) {\n\t\t\ttry {\n\t\t\t\tnormalized = fileURLToPath(normalized, { windows });\n\t\t\t} catch {\n\t\t\t\t// Keep malformed URLs as ordinary paths, as Node does.\n\t\t\t}\n\t\t}\n\t\tif (paths.isAbsolute(normalized)) return paths.resolve(normalized);\n\t\tif (windows) {\n\t\t\t// A drive-relative path on another drive: Node on Windows resolves it against that drive's working directory\n\t\t\t// (`=D:`), else its own working directory if on that drive, else the drive's root.\n\t\t\tconst drive = /^([a-zA-Z]:)(?![\\\\/])/.exec(normalized)?.[1];\n\t\t\tif (drive !== undefined && drive.toLowerCase() !== this.cwd.slice(0, 2).toLowerCase()) {\n\t\t\t\tlet base = info.driveCwds[drive.toUpperCase()] ?? info.cwd;\n\t\t\t\tif (base.slice(0, 2).toLowerCase() !== drive.toLowerCase() && base[2] === \"\\\\\") base = `${drive}\\\\`;\n\t\t\t\treturn win32.resolve(base, normalized);\n\t\t\t}\n\t\t}\n\t\treturn paths.resolve(this.cwd, normalized);\n\t}\n\n\tasync #fileOp<T>(\n\t\tpath: string,\n\t\tcontext: Context,\n\t\trun: (resolved: string) => Promise<T>,\n\t\tcheck: \"before\" | \"both\" = \"before\",\n\t): Promise<Result<T, FileError>> {\n\t\tlet resolved: string;\n\t\ttry {\n\t\t\tresolved = await this.#resolve(path);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, path));\n\t\t}\n\t\tconst aborted = abortResult<T>(context.abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tconst value = await run(resolved);\n\t\t\tif (check === \"both\") {\n\t\t\t\tconst after = abortResult<T>(context.abortSignal, resolved);\n\t\t\t\tif (after) return after;\n\t\t\t}\n\t\t\treturn ok(value);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync #open(resolved: string, json: Json): Promise<{ handle: Handle; json: Json }> {\n\t\tconst reply = await this.connection.request(\"open\", { path: resolved, ...json });\n\t\treturn { handle: new Handle(this, reply.json.handle as number, reply.session, resolved), json: reply.json };\n\t}\n\n\tasync absolutePath(path: string, _context: Context): Promise<Result<string, FileError>> {\n\t\ttry {\n\t\t\treturn ok(await this.#resolve(path));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, path));\n\t\t}\n\t}\n\n\tasync joinPath(parts: string[], _context: Context): Promise<Result<string, FileError>> {\n\t\ttry {\n\t\t\treturn ok((await remotePath(this.connection)).join(...parts));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error));\n\t\t}\n\t}\n\n\t/** Node's `readFile`, with or without UTF-8 decoding, over a file opened like `open(path, \"r\")`. */\n\tasync #readFile(path: string, encoding: boolean, context: Context): Promise<Result<Uint8Array | string, FileError>> {\n\t\tconst signal = context.abortSignal;\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tconst { handle, json } = await this.#open(resolved, { mode: \"read\" });\n\t\t\tconst aborted = () => signal?.aborted === true;\n\t\t\tconst abort = () => new FileError(\"aborted\", \"The operation was aborted\", resolved);\n\t\t\ttry {\n\t\t\t\tif (json.statError !== undefined) throw new RemoteError(json.statError as Json);\n\t\t\t\tif (aborted()) throw abort();\n\t\t\t\tconst stat = json.stat as RemoteFileInfo;\n\t\t\t\tconst size = stat.kind === \"file\" ? stat.size : 0;\n\t\t\t\tif (size > READ_FILE_MAX) {\n\t\t\t\t\tthrow new FileError(\"unknown\", `File size (${size}) is greater than 2 GiB`, resolved);\n\t\t\t\t}\n\t\t\t\tif (size === 0) {\n\t\t\t\t\t// Unknown size: sequential reads until the end, as for FIFOs and devices.\n\t\t\t\t\tconst decoder = new StringDecoder(\"utf8\");\n\t\t\t\t\tconst chunks: Uint8Array[] = [];\n\t\t\t\t\tlet total = 0;\n\t\t\t\t\tlet text = \"\";\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tif (aborted()) throw abort();\n\t\t\t\t\t\tconst bytes = await handle.pread(undefined, READ_FILE_UNKNOWN_CHUNK);\n\t\t\t\t\t\tif (bytes.length === 0) break;\n\t\t\t\t\t\ttotal += bytes.length;\n\t\t\t\t\t\tchunks.push(bytes);\n\t\t\t\t\t\tif (encoding) text += decoder.write(bytes);\n\t\t\t\t\t}\n\t\t\t\t\tif (!encoding) return Buffer.concat(chunks, total);\n\t\t\t\t\treturn total === 0 ? \"\" : text + decoder.end();\n\t\t\t\t}\n\t\t\t\tif (!encoding) {\n\t\t\t\t\t// A single read of the whole size, or reads of 512 KiB until the size or the end of the file.\n\t\t\t\t\tif (size <= READ_FILE_CHUNK) return Buffer.from(await handle.pread(0, size));\n\t\t\t\t\tconst read = await readRange(\n\t\t\t\t\t\t(at, length) => handle.pread(at, length),\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tsize,\n\t\t\t\t\t\tREAD_FILE_CHUNK,\n\t\t\t\t\t\taborted,\n\t\t\t\t\t);\n\t\t\t\t\tif (read === undefined) throw abort();\n\t\t\t\t\treturn Buffer.concat(read.chunks, read.total);\n\t\t\t\t}\n\t\t\t\t// Decoding: reads of min(size, 512 KiB) until the size, a short read, or the end of the file.\n\t\t\t\tconst length = Math.min(size, READ_FILE_CHUNK);\n\t\t\t\tconst decoder = new StringDecoder(\"utf8\");\n\t\t\t\tlet text = \"\";\n\t\t\t\tlet total = 0;\n\t\t\t\tlet first = true;\n\t\t\t\tconst inFlight: Promise<Uint8Array>[] = [];\n\t\t\t\tlet next = 0;\n\t\t\t\twhile (true) {\n\t\t\t\t\twhile (inFlight.length < READ_DEPTH) {\n\t\t\t\t\t\tconst bytes = handle.pread(next, length);\n\t\t\t\t\t\tbytes.catch(() => {});\n\t\t\t\t\t\tinFlight.push(bytes);\n\t\t\t\t\t\tnext += length;\n\t\t\t\t\t}\n\t\t\t\t\tconst bytes = await inFlight.shift()!;\n\t\t\t\t\tif (aborted()) throw abort();\n\t\t\t\t\ttotal += bytes.length;\n\t\t\t\t\tif (bytes.length === 0 || total === size || bytes.length !== length) {\n\t\t\t\t\t\treturn first ? Buffer.from(bytes).toString(\"utf8\") : text + decoder.end(Buffer.from(bytes));\n\t\t\t\t\t}\n\t\t\t\t\ttext += decoder.write(Buffer.from(bytes));\n\t\t\t\t\tfirst = false;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait handle.close();\n\t\t\t}\n\t\t});\n\t}\n\n\tasync readTextFile(path: string, context: Context): Promise<Result<string, FileError>> {\n\t\treturn (await this.#readFile(path, true, context)) as Result<string, FileError>;\n\t}\n\n\tasync readBinaryFile(path: string, context: Context): Promise<Result<Uint8Array, FileError>> {\n\t\treturn (await this.#readFile(path, false, context)) as Result<Uint8Array, FileError>;\n\t}\n\n\tasync openBinaryReader(\n\t\tpath: string,\n\t\toptions: { noFollow?: boolean } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<BinaryReader, FileError>> {\n\t\tconst opened = await this.#fileOp(path, context, async (resolved) => {\n\t\t\treturn (await this.#open(resolved, { noFollow: options?.noFollow === true })).handle;\n\t\t});\n\t\tif (!opened.ok) return opened;\n\t\tconst aborted = abortResult<BinaryReader>(context.abortSignal, opened.value.path);\n\t\tif (aborted) {\n\t\t\tawait opened.value.close();\n\t\t\treturn aborted;\n\t\t}\n\t\treturn ok(new RemoteBinaryReader(opened.value));\n\t}\n\n\tasync openTextLineReader(path: string, context: Context): Promise<Result<TextLineReader, FileError>> {\n\t\tconst opened = await this.#fileOp(path, context, async (resolved) => {\n\t\t\treturn (await this.#open(resolved, { mode: \"read\" })).handle;\n\t\t});\n\t\tif (!opened.ok) return opened;\n\t\tconst aborted = abortResult<TextLineReader>(context.abortSignal, opened.value.path);\n\t\tif (aborted) {\n\t\t\tawait opened.value.close();\n\t\t\treturn aborted;\n\t\t}\n\t\treturn ok(new RemoteTextLineReader(opened.value));\n\t}\n\n\tasync readTextLines(\n\t\tpath: string,\n\t\toptions: { maxLines?: number } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<string[], FileError>> {\n\t\tif (options?.maxLines !== undefined && options.maxLines <= 0) return ok([]);\n\t\tconst opened = await this.openTextLineReader(path, context);\n\t\tif (!opened.ok) return opened;\n\t\tconst lines: string[] = [];\n\t\ttry {\n\t\t\twhile (options?.maxLines === undefined || lines.length < options.maxLines) {\n\t\t\t\tconst line = await opened.value.readLine(context);\n\t\t\t\tif (!line.ok) return line;\n\t\t\t\tif (line.value === undefined) break;\n\t\t\t\tlines.push(line.value.text);\n\t\t\t}\n\t\t\treturn ok(lines);\n\t\t} finally {\n\t\t\tawait opened.value.close(context);\n\t\t}\n\t}\n\n\t/**\n\t * Node's `writeFile` (abort checked before each 512 KiB write) or `appendFile` (no checks, one after): the first\n\t * request creates parents, opens, and writes the first chunk; later chunks go to the same open file.\n\t */\n\tasync #write(path: string, content: string | Uint8Array, append: boolean, context: Context) {\n\t\tconst bytes = typeof content === \"string\" ? Buffer.from(content, \"utf8\") : content;\n\t\tconst signal = append ? undefined : context.abortSignal;\n\t\treturn this.#fileOp(\n\t\t\tpath,\n\t\t\tcontext,\n\t\t\tasync (resolved) => {\n\t\t\t\tconst first = bytes.subarray(0, WRITE_CHUNK);\n\t\t\t\tconst keep = bytes.length > WRITE_CHUNK;\n\t\t\t\tconst reply = await this.connection.request(\"write\", { path: resolved, append, keep }, { payload: first });\n\t\t\t\tif (!keep) return;\n\t\t\t\tconst handle = new Handle(this, reply.json.handle as number, reply.session, resolved);\n\t\t\t\tconst inFlight: Promise<unknown>[] = [];\n\t\t\t\ttry {\n\t\t\t\t\tfor (let offset = WRITE_CHUNK; offset < bytes.length; offset += WRITE_CHUNK) {\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\t// A chunk that failed before this check fails the write, as it would have in sequence.\n\t\t\t\t\t\t\tconst failed = (await Promise.allSettled(inFlight)).find((result) => result.status === \"rejected\");\n\t\t\t\t\t\t\tif (failed !== undefined) throw failed.reason;\n\t\t\t\t\t\t\tthrow new FileError(\"aborted\", \"The operation was aborted\", resolved);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst written = handle.request(\n\t\t\t\t\t\t\t\"writeChunk\",\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\t{ payload: bytes.subarray(offset, offset + WRITE_CHUNK) },\n\t\t\t\t\t\t);\n\t\t\t\t\t\twritten.catch(() => {});\n\t\t\t\t\t\tinFlight.push(written);\n\t\t\t\t\t\tif (inFlight.length >= WRITE_DEPTH) await inFlight.shift();\n\t\t\t\t\t}\n\t\t\t\t\t// The first failure; later chunks are refused by the daemon, so the file has no gaps.\n\t\t\t\t\tfor (const written of inFlight) await written;\n\t\t\t\t} finally {\n\t\t\t\t\tawait Promise.allSettled(inFlight);\n\t\t\t\t\tawait handle.close();\n\t\t\t\t}\n\t\t\t},\n\t\t\tappend ? \"both\" : \"before\",\n\t\t);\n\t}\n\n\twriteFile(path: string, content: string | Uint8Array, context: Context): Promise<Result<void, FileError>> {\n\t\treturn this.#write(path, content, false, context);\n\t}\n\n\tappendFile(path: string, content: string | Uint8Array, context: Context): Promise<Result<void, FileError>> {\n\t\treturn this.#write(path, content, true, context);\n\t}\n\n\tasync truncateFile(path: string, size: number, context: Context): Promise<Result<void, FileError>> {\n\t\treturn this.#fileOp(\n\t\t\tpath,\n\t\t\tcontext,\n\t\t\tasync (resolved) => {\n\t\t\t\tif (!Number.isSafeInteger(size) || size < 0) {\n\t\t\t\t\tthrow new FileError(\"invalid\", \"File size must be a non-negative safe integer\", resolved);\n\t\t\t\t}\n\t\t\t\tawait this.connection.request(\"truncate\", { path: resolved, size });\n\t\t\t},\n\t\t\t\"both\",\n\t\t);\n\t}\n\n\tflushFile(path: string, context: Context): Promise<Result<void, FileError>> {\n\t\treturn this.#fileOp(\n\t\t\tpath,\n\t\t\tcontext,\n\t\t\tasync (resolved) => {\n\t\t\t\tawait this.connection.request(\"fsync\", { path: resolved });\n\t\t\t},\n\t\t\t\"both\",\n\t\t);\n\t}\n\n\tasync renameFile(sourcePath: string, destinationPath: string, context: Context): Promise<Result<void, FileError>> {\n\t\tlet source: string;\n\t\tlet destination: string;\n\t\ttry {\n\t\t\tsource = await this.#resolve(sourcePath);\n\t\t\tdestination = await this.#resolve(destinationPath);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, sourcePath));\n\t\t}\n\t\tconst aborted = abortResult<void>(context.abortSignal, destination);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tawait this.connection.request(\"rename\", { path: source, to: destination });\n\t\t\treturn ok(undefined);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, source));\n\t\t}\n\t}\n\n\tasync fileInfo(path: string, context: Context): Promise<Result<FileInfo, FileError>> {\n\t\tconst result = await this.#fileOp(path, context, async (resolved) => {\n\t\t\tconst { json } = await this.connection.request(\"lstat\", { path: resolved });\n\t\t\treturn toInfo(resolved, json as unknown as RemoteFileInfo, await remotePath(this.connection));\n\t\t});\n\t\treturn result.ok ? result.value : result;\n\t}\n\n\tlistDir(path: string, context: Context): Promise<Result<FileInfo[], FileError>> {\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tconst { handle } = await this.#openDir(resolved);\n\t\t\tconst entries: RemoteDirEntry[] = [];\n\t\t\ttry {\n\t\t\t\tfor (let done = false; !done; ) {\n\t\t\t\t\tconst { json } = await handle.request(\"readdir\", { max: 1000 });\n\t\t\t\t\tentries.push(...(json.entries as RemoteDirEntry[]));\n\t\t\t\t\tdone = json.done === true;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait handle.close();\n\t\t\t}\n\t\t\t// Node's `readdir` fails on any entry it cannot lstat. libuv sorts names by their bytes on POSIX; on Windows it\n\t\t\t// keeps the file system's order, which the daemon reports.\n\t\t\tconst paths = await remotePath(this.connection);\n\t\t\tif (paths === posix) {\n\t\t\t\tconst key = (entry: RemoteDirEntry) => Buffer.from(entry.raw ?? Buffer.from(entry.name, \"utf8\"));\n\t\t\t\tentries.sort((a, b) => Buffer.compare(key(a), key(b)));\n\t\t\t}\n\t\t\tconst infos: FileInfo[] = [];\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (context.abortSignal?.aborted) throw new FileError(\"aborted\", \"aborted\", resolved);\n\t\t\t\tconst entryPath = paths.resolve(resolved, entry.name);\n\t\t\t\tif (entry.error !== undefined) throw toFileError(new RemoteError(entry.error), entryPath);\n\t\t\t\tconst info = toInfo(entryPath, entry.info!, paths);\n\t\t\t\tif (info.ok) infos.push(info.value);\n\t\t\t}\n\t\t\treturn infos;\n\t\t});\n\t}\n\n\t/** Through the daemon; `not_supported` with a daemon released before `listFiles`. */\n\tasync listFiles(\n\t\tpath: string,\n\t\toptions: ListFilesOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<FileListing, FileError>> {\n\t\tlet resolved: string;\n\t\ttry {\n\t\t\tresolved = await this.#resolve(path);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, path));\n\t\t}\n\t\treturn listFilesOver(this.connection, resolved, options, context);\n\t}\n\n\tasync #openDir(resolved: string): Promise<{ handle: Handle }> {\n\t\tconst reply = await this.connection.request(\"opendir\", { path: resolved });\n\t\treturn { handle: new Handle(this, reply.json.handle as number, reply.session, resolved) };\n\t}\n\n\tasync openDirReader(path: string, context: Context): Promise<Result<DirReader, FileError>> {\n\t\tconst opened = await this.#fileOp(path, context, async (resolved) => (await this.#openDir(resolved)).handle);\n\t\tif (!opened.ok) return opened;\n\t\tconst aborted = abortResult<DirReader>(context.abortSignal, opened.value.path);\n\t\tif (aborted) {\n\t\t\tawait opened.value.close();\n\t\t\treturn aborted;\n\t\t}\n\t\treturn ok(new RemoteDirReader(opened.value));\n\t}\n\n\tcanonicalPath(path: string, context: Context): Promise<Result<string, FileError>> {\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tconst { json } = await this.connection.request(\"realpath\", { path: resolved });\n\t\t\treturn json.path as string;\n\t\t});\n\t}\n\n\tasync exists(path: string, context: Context): Promise<Result<boolean, FileError>> {\n\t\tconst result = await this.fileInfo(path, context);\n\t\tif (result.ok) return ok(true);\n\t\tif (result.error.code === \"not_found\") return ok(false);\n\t\treturn err(result.error);\n\t}\n\n\tcreateDir(\n\t\tpath: string,\n\t\toptions: { recursive?: boolean } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<void, FileError>> {\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tawait this.connection.request(\"mkdir\", { path: resolved, recursive: options?.recursive ?? true });\n\t\t});\n\t}\n\n\tremove(\n\t\tpath: string,\n\t\toptions: { recursive?: boolean; force?: boolean } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<void, FileError>> {\n\t\treturn this.#fileOp(path, context, async (resolved) => {\n\t\t\tawait this.connection.request(\"rm\", {\n\t\t\t\tpath: resolved,\n\t\t\t\trecursive: options?.recursive ?? false,\n\t\t\t\tforce: options?.force ?? false,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync createTempDir(prefix: string | undefined, context: Context): Promise<Result<string, FileError>> {\n\t\tconst aborted = abortResult<string>(context.abortSignal);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tconst { tmpdir } = await this.connection.info();\n\t\t\tconst paths = await remotePath(this.connection);\n\t\t\tconst { json } = await this.connection.request(\"mkdtemp\", { path: paths.join(tmpdir, prefix ?? \"tmp-\") });\n\t\t\treturn ok(json.path as string);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error));\n\t\t}\n\t}\n\n\tasync createTempFile(\n\t\toptions: { prefix?: string; suffix?: string } | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<string, FileError>> {\n\t\tconst dir = await this.createTempDir(\"tmp-\", context);\n\t\tif (!dir.ok) return dir;\n\t\tlet filePath = \"\";\n\t\ttry {\n\t\t\tconst paths = await remotePath(this.connection);\n\t\t\tfilePath = paths.join(dir.value, `${options?.prefix ?? \"\"}${randomUUID()}${options?.suffix ?? \"\"}`);\n\t\t\t// Node's `writeFile(filePath, \"\")`, which does not create parents.\n\t\t\tawait this.connection.request(\n\t\t\t\t\"write\",\n\t\t\t\t{ path: filePath, append: false, parents: false },\n\t\t\t\t{ payload: new Uint8Array(0) },\n\t\t\t);\n\t\t\treturn ok(filePath);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, filePath));\n\t\t}\n\t}\n\n\tasync watch(\n\t\ttargets: readonly WatchTarget[],\n\t\tonChange: (change: WatchChange) => void,\n\t\tcontext: Context,\n\t): Promise<Result<FileWatcher, FileError>> {\n\t\tconst aborted = abortResult<FileWatcher>(context.abortSignal);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tconst resolved = await Promise.all(\n\t\t\t\ttargets.map(async (target) => ({ ...target, path: await this.#resolve(target.path) })),\n\t\t\t);\n\t\t\tconst afterResolve = abortResult<FileWatcher>(context.abortSignal);\n\t\t\tif (afterResolve) return afterResolve;\n\t\t\tconst watcher = await RemoteWatcher.open(this.connection, resolved, onChange, this.#watchOptions);\n\t\t\tconst afterOpen = abortResult<FileWatcher>(context.abortSignal);\n\t\t\tif (afterOpen) {\n\t\t\t\tawait watcher.close(context);\n\t\t\t\treturn afterOpen;\n\t\t\t}\n\t\t\treturn ok(watcher);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error));\n\t\t}\n\t}\n\n\tasync exec(\n\t\tcommand: string | readonly string[],\n\t\toptions: ShellExecOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<Result<ShellExecResult, ExecutionError>> {\n\t\tconst signal = context.abortSignal;\n\t\tif (signal?.aborted) return err(new ExecutionError(\"aborted\", \"aborted\"));\n\t\tconst timeout = options?.timeout;\n\t\tif (timeout !== undefined) {\n\t\t\tif (!Number.isFinite(timeout) || timeout <= 0) {\n\t\t\t\treturn err(new ExecutionError(\"timeout\", \"Invalid timeout: must be a finite number of seconds\"));\n\t\t\t}\n\t\t\tif (timeout * 1000 > MAX_TIMEOUT_MS) {\n\t\t\t\treturn err(new ExecutionError(\"timeout\", `Invalid timeout: maximum is ${MAX_TIMEOUT_SECONDS} seconds`));\n\t\t\t}\n\t\t}\n\t\tconst inheritEnv = options?.inheritEnv ?? true;\n\t\tlet cwd: string;\n\t\ttry {\n\t\t\tcwd = options?.cwd ? await this.#resolve(options.cwd) : this.cwd;\n\t\t} catch (error) {\n\t\t\treturn err(new ExecutionError(\"unknown\", error instanceof Error ? error.message : String(error)));\n\t\t}\n\t\tif (signal?.aborted) return err(new ExecutionError(\"aborted\", \"aborted\"));\n\t\tconst env: Record<string, string> = {};\n\t\tfor (const [key, value] of Object.entries(\n\t\t\tinheritEnv ? { ...this.#shellEnv, ...options?.env } : { ...options?.env },\n\t\t)) {\n\t\t\tif (value !== undefined) env[key.toWellFormed()] = value;\n\t\t}\n\t\tlet callbackError: ExecutionError | undefined;\n\t\tlet settled = false;\n\t\tlet running: number | undefined;\n\t\tconst controller = new AbortController();\n\t\tconst onAbort = () => controller.abort();\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\ttry {\n\t\t\tconst { json } = await this.connection.request(\n\t\t\t\t\"exec\",\n\t\t\t\t{\n\t\t\t\t\t...(typeof command === \"string\" ? { command } : { argv: [...command] }),\n\t\t\t\t\tcwd,\n\t\t\t\t\tenv,\n\t\t\t\t\tinheritEnv,\n\t\t\t\t\t...(this.#shellPath === undefined ? {} : { shellPath: this.#shellPath }),\n\t\t\t\t\t...(timeout === undefined ? {} : { timeoutMs: timeout * 1000 }),\n\t\t\t\t\t...(options?.spill === undefined ? {} : { spill: options.spill }),\n\t\t\t\t\t...(options?.window === undefined ? {} : { window: options.window }),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tonStart: (requestId, session) => {\n\t\t\t\t\t\trunning = requestId;\n\t\t\t\t\t\tthis.#running.set(requestId, session);\n\t\t\t\t\t},\n\t\t\t\t\tonEvent: (event, payload) => {\n\t\t\t\t\t\tif (settled || callbackError !== undefined || event.kind !== \"output\") return;\n\t\t\t\t\t\tconst text = Buffer.from(payload.buffer, payload.byteOffset, payload.length).toString(\"utf8\");\n\t\t\t\t\t\tif (text === \"\" || options?.onOutput === undefined) return;\n\t\t\t\t\t\tconst info: ShellOutputInfo = { stream: event.stream === \"stderr\" ? \"stderr\" : \"stdout\" };\n\t\t\t\t\t\tif (event.skipped !== undefined) info.skipped = event.skipped as ShellOutputSkip;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\toptions.onOutput(text, context, info);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconst cause = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\tcallbackError = new ExecutionError(\"callback_error\", cause.message, cause);\n\t\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (callbackError) return err(callbackError);\n\t\t\treturn ok({\n\t\t\t\texitCode: json.exitCode as number,\n\t\t\t\t...(typeof json.spillPath === \"string\" ? { spillPath: json.spillPath } : {}),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (callbackError) return err(callbackError);\n\t\t\tif (!(error instanceof RemoteError)) {\n\t\t\t\treturn err(new ExecutionError(\"unknown\", error instanceof Error ? error.message : String(error)));\n\t\t\t}\n\t\t\tconst failure =\n\t\t\t\terror.code === \"timeout\"\n\t\t\t\t\t? new ExecutionError(\"timeout\", `timeout:${timeout}`)\n\t\t\t\t\t: error.code === \"aborted\"\n\t\t\t\t\t\t? new ExecutionError(\"aborted\", \"aborted\")\n\t\t\t\t\t\t: error.code === \"shell_unavailable\" || error.code === \"spawn_error\"\n\t\t\t\t\t\t\t? new ExecutionError(error.code, error.message)\n\t\t\t\t\t\t\t: new ExecutionError(\"unknown\", error.message);\n\t\t\tif (typeof error.fields.spillPath === \"string\") failure.spillPath = error.fields.spillPath;\n\t\t\treturn err(failure);\n\t\t} finally {\n\t\t\tsettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tif (running !== undefined) this.#running.delete(running);\n\t\t}\n\t}\n\n\tasync cleanup(_context: Context): Promise<void> {\n\t\t// Kill without aborting, so the commands settle with their killed status, as `NodeExecutionEnv` does.\n\t\tfor (const [id, session] of this.#running) this.connection.kill(id, session);\n\t\tthis.#running.clear();\n\t}\n}\n\nexport type { RemoteInfo };\n"]}
package/dist/ssh.d.ts CHANGED
@@ -65,6 +65,8 @@ export declare function forgetHostKey(target: SshTarget): Promise<void>;
65
65
  export declare function detectPlatform(target: SshTarget): Promise<RemotePlatform>;
66
66
  /** The daemon binary this package ships for a remote system. */
67
67
  export declare function packagedDaemon(remote: Pick<RemotePlatform, "platform" | "arch">): string;
68
+ /** The daemon this package ships for the machine it runs on, e.g. for terminals of local sessions. */
69
+ export declare function localDaemon(): string;
68
70
  /**
69
71
  * Make sure the daemon is on the remote machine, verified by its SHA-256 before it ever runs, and remove daemons of
70
72
  * other contents. The upload goes to a new temporary file and is renamed into place only once its hash matches.
package/dist/ssh.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
package/dist/ssh.js CHANGED
@@ -298,6 +298,14 @@ export function packagedDaemon(remote) {
298
298
  const name = `pi-env-${remote.platform}-${remote.arch}`;
299
299
  return join(packageRoot, "bin", name, remote.platform === "windows" ? "pi-env.exe" : "pi-env");
300
300
  }
301
+ /** The daemon this package ships for the machine it runs on, e.g. for terminals of local sessions. */
302
+ export function localDaemon() {
303
+ const platform = process.platform === "win32" ? "windows" : process.platform;
304
+ if (platform !== "linux" && platform !== "android" && platform !== "darwin" && platform !== "windows") {
305
+ throw new Error(`No pi-env daemon for ${process.platform}`);
306
+ }
307
+ return packagedDaemon({ platform, arch: normalizeArch(process.arch) });
308
+ }
301
309
  function quotePosix(text) {
302
310
  return `'${text.replaceAll("'", "'\\''")}'`;
303
311
  }