@ai-ecoverse/slicc-kernel 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -3
- package/dist/index.js +43 -5
- package/dist/index.js.map +3 -3
- package/dist/kernel-worker.js +167 -69
- package/dist/kernel-worker.js.map +4 -4
- package/dist/process-worker.js +1 -0
- package/dist/process-worker.js.map +2 -2
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/fs/types.ts", "../src/fs/opfs.ts", "../src/commands.ts", "../src/fs/commands.ts", "../src/kernel/pipe.ts", "../src/kernel/fd-table.ts", "../src/kernel/children.ts", "../src/realm/sync-fs-token-registry.ts", "../src/realm/sync-fs-wire.ts", "../src/realm/sync-fs-dispatch.ts", "../src/realm/sync-sab-wire.ts", "../src/realm/sync-sab-responder.ts", "../src/kernel/
|
|
4
|
-
"sourcesContent": ["export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtime: Date;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n chmod(path: string, mode: number): Promise<void>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n}\n\nexport function fsError(code: string, path: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${path}`), { code });\n}\n\nexport function normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return `/${parts.join('/')}`;\n}\n\nexport function resolvePath(base: string, path: string): string {\n return normalizePath(path.startsWith('/') ? path : `${base}/${path}`);\n}\n", "import { type FsStat, fsError, type KernelFs, resolvePath } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst PERM_MASK = 0o7777;\nconst EXECUTABLE = /\\/node_modules\\/(?:@[^/]+\\/)?[^/]+\\/bin\\//;\n\ntype Handle = FileSystemFileHandle | FileSystemDirectoryHandle;\n\ninterface MovableHandle {\n move?(parent: FileSystemDirectoryHandle, name: string): Promise<void>;\n}\n\nconst ERRNO_BY_DOM_ERROR: Readonly<Record<string, string>> = {\n NotFoundError: 'ENOENT',\n TypeMismatchError: 'ENOTDIR',\n InvalidModificationError: 'ENOTEMPTY',\n NoModificationAllowedError: 'EBUSY',\n TypeError: 'EINVAL',\n};\n\nfunction translate(err: unknown, path: string): Error {\n if (typeof (err as { code?: unknown })?.code === 'string') return err as Error;\n const name = (err as { name?: unknown })?.name;\n return fsError((typeof name === 'string' && ERRNO_BY_DOM_ERROR[name]) || 'EIO', path);\n}\n\nfunction split(path: string): string[] {\n return path.split('/').filter(Boolean);\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport class OpfsFs implements KernelFs {\n private readonly modes = new Map<string, number>();\n private readonly times = new Map<string, number>();\n\n private readonly root: FileSystemDirectoryHandle;\n\n constructor(root: FileSystemDirectoryHandle) {\n this.root = root;\n }\n\n resolvePath(base: string, path: string): string {\n return resolvePath(base, path);\n }\n\n private async dir(path: string, create = false): Promise<FileSystemDirectoryHandle> {\n let dir = this.root;\n try {\n for (const part of split(path)) dir = await dir.getDirectoryHandle(part, { create });\n } catch (err) {\n throw translate(err, path);\n }\n return dir;\n }\n\n private async parent(path: string): Promise<[FileSystemDirectoryHandle, string]> {\n const parts = split(path);\n const name = parts.pop();\n if (name === undefined) throw fsError('EBUSY', path);\n return [await this.dir(`/${parts.join('/')}`), name];\n }\n\n private async handle(path: string): Promise<Handle> {\n if (split(path).length === 0) return this.root;\n const [dir, name] = await this.parent(path);\n try {\n return await dir.getFileHandle(name);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'TypeMismatchError') throw translate(err, path);\n }\n return dir.getDirectoryHandle(name);\n }\n\n private mode(path: string, directory: boolean): number {\n const fallback = directory || EXECUTABLE.test(path) ? 0o755 : 0o644;\n return (directory ? S_IFDIR : S_IFREG) | (this.modes.get(path) ?? fallback);\n }\n\n async stat(path: string): Promise<FsStat> {\n const handle = await this.handle(path);\n const directory = handle.kind === 'directory';\n const file = directory ? undefined : await (handle as FileSystemFileHandle).getFile();\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: file?.size ?? 0,\n mode: this.mode(path, directory),\n mtime: new Date(this.times.get(path) ?? file?.lastModified ?? 0),\n };\n }\n\n lstat(path: string): Promise<FsStat> {\n return this.stat(path);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.handle(path).then(\n () => true,\n () => false\n );\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const handle = await this.handle(path);\n if (handle.kind === 'directory') throw fsError('EISDIR', path);\n return new Uint8Array(await (await handle.getFile()).arrayBuffer());\n }\n\n async readFile(path: string): Promise<string> {\n return new TextDecoder().decode(await this.readFileBuffer(path));\n }\n\n async writeFile(path: string, content: Uint8Array | string): Promise<void> {\n const [dir, name] = await this.parent(path);\n let file: FileSystemFileHandle;\n try {\n file = await dir.getFileHandle(name, { create: true });\n } catch (err) {\n const code = (err as { name?: unknown })?.name === 'TypeMismatchError' ? 'EISDIR' : null;\n throw code ? fsError(code, path) : translate(err, path);\n }\n const writable = await file.createWritable();\n await writable.write(content as FileSystemWriteChunkType);\n await writable.close();\n this.times.delete(path);\n }\n\n async readdir(path: string): Promise<string[]> {\n const handle = await this.handle(path);\n if (handle.kind !== 'directory') throw fsError('ENOTDIR', path);\n const names: string[] = [];\n for await (const name of handle.keys()) names.push(name);\n return names.sort();\n }\n\n async mkdir(path: string, options: { recursive?: boolean } = {}): Promise<void> {\n if (options.recursive) {\n await this.dir(path, true);\n return;\n }\n if (await this.exists(path)) throw fsError('EEXIST', path);\n const [dir, name] = await this.parent(path);\n await dir.getDirectoryHandle(name, { create: true });\n }\n\n async rm(path: string, options: { recursive?: boolean; force?: boolean } = {}): Promise<void> {\n try {\n const [dir, name] = await this.parent(path);\n await dir.removeEntry(name, { recursive: options.recursive === true });\n } catch (err) {\n const error = translate(err, path) as Error & { code: string };\n if (options.force && error.code === 'ENOENT') return;\n throw error;\n }\n this.forget(path);\n }\n\n private forget(path: string): void {\n for (const map of [this.modes, this.times]) {\n for (const key of [...map.keys()]) if (within(key, path)) map.delete(key);\n }\n }\n\n private carry(from: string, to: string): void {\n for (const map of [this.modes, this.times]) {\n for (const [key, value] of [...map]) {\n if (!within(key, from)) continue;\n map.delete(key);\n map.set(to + key.slice(from.length), value);\n }\n }\n }\n\n async rename(from: string, to: string): Promise<void> {\n if (from === to) return;\n const source = await this.stat(from);\n if (source.isDirectory && within(to, from)) throw fsError('EINVAL', to);\n const target = await this.stat(to).catch(() => null);\n if (target?.isDirectory && !source.isDirectory) throw fsError('EISDIR', to);\n if (target && !target.isDirectory && source.isDirectory) throw fsError('ENOTDIR', to);\n if (target?.isDirectory && (await this.readdir(to)).length > 0) {\n throw fsError('ENOTEMPTY', to);\n }\n const [dir, name] = await this.parent(to);\n const handle = await this.handle(from);\n const swap = target?.isDirectory === true;\n const staging = swap ? `.${name}.${crypto.randomUUID()}` : name;\n const moved = await this.place(handle, dir, staging);\n if (swap) await this.rm(to, { recursive: true });\n this.carry(from, to);\n if (!moved) await this.rm(from, { recursive: true });\n if (!swap) return;\n const staged = await dir.getDirectoryHandle(staging);\n if (!(await this.place(staged, dir, name))) await dir.removeEntry(staging, { recursive: true });\n }\n\n private async place(handle: Handle, dir: FileSystemDirectoryHandle, name: string) {\n const moved = await (handle as Handle & MovableHandle).move?.(dir, name).then(\n () => true,\n () => false\n );\n if (moved) return true;\n try {\n await this.copy(handle, dir, name);\n } catch (err) {\n if (handle.kind === 'directory') await dir.removeEntry(name, { recursive: true });\n throw translate(err, name);\n }\n return false;\n }\n\n private async copy(handle: Handle, dir: FileSystemDirectoryHandle, name: string): Promise<void> {\n if (handle.kind === 'file') {\n const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();\n await writable.write(await handle.getFile());\n await writable.close();\n return;\n }\n const target = await dir.getDirectoryHandle(name, { create: true });\n for await (const child of handle.values()) await this.copy(child, target, child.name);\n }\n\n async symlink(_target: string, path: string): Promise<void> {\n throw fsError('ENOSYS', path);\n }\n\n async readlink(path: string): Promise<string> {\n await this.handle(path);\n throw fsError('EINVAL', path);\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n await this.handle(path);\n this.modes.set(path, mode & PERM_MASK);\n }\n\n async utimes(path: string, _atime: Date, mtime: Date): Promise<void> {\n await this.handle(path);\n this.times.set(path, mtime.getTime());\n }\n}\n", "import type { KernelFs } from './fs/types.ts';\n\nexport interface Command {\n name: string;\n glue: string;\n wasm: string;\n argv0: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\ninterface CommandEntry {\n abi?: unknown;\n glue?: unknown;\n wasm?: unknown;\n argv0?: unknown;\n args?: unknown;\n env?: unknown;\n}\n\ninterface Manifest {\n slicc?: { abi?: unknown; commands?: unknown; env?: unknown };\n}\n\nconst NAME = /^[A-Za-z0-9._+-]+$/;\nconst ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst PACKAGE = /\\$\\{package\\}/g;\n\nfunction inside(pkg: string, rel: unknown): string | undefined {\n if (typeof rel !== 'string' || rel === '') return undefined;\n const clean = rel.replace(/^\\.\\//, '');\n if (clean.startsWith('/') || clean.split('/').includes('..')) return undefined;\n return `${pkg}/${clean}`;\n}\n\nfunction envOf(pkg: string, raw: unknown): Record<string, string> {\n const env: Record<string, string> = {};\n if (!raw || typeof raw !== 'object') return env;\n for (const [key, value] of Object.entries(raw)) {\n if (ENV_KEY.test(key) && typeof value === 'string') env[key] = value.replace(PACKAGE, pkg);\n }\n return env;\n}\n\nfunction argsOf(pkg: string, raw: unknown): string[] | undefined {\n if (!Array.isArray(raw) || raw.length === 0) return undefined;\n if (!raw.every((arg) => typeof arg === 'string')) return undefined;\n return raw.map((arg) => arg.replace(PACKAGE, pkg));\n}\n\nexport function commandsOf(pkg: string, manifest: Manifest): Command[] {\n const slicc = manifest.slicc;\n if (!slicc || typeof slicc !== 'object' || (slicc.abi ?? 'emscripten') !== 'emscripten')\n return [];\n const entries = slicc.commands;\n if (!entries || typeof entries !== 'object') return [];\n const shared = envOf(pkg, slicc.env);\n const out: Command[] = [];\n for (const [name, raw] of Object.entries(entries as Record<string, CommandEntry>)) {\n if (!NAME.test(name) || name === '.' || name === '..' || !raw || typeof raw !== 'object') {\n continue;\n }\n const glue = inside(pkg, raw.glue);\n const wasm = inside(pkg, raw.wasm);\n if ((raw.abi ?? 'emscripten') !== 'emscripten' || !glue || !wasm) continue;\n const argv0 = typeof raw.argv0 === 'string' && raw.argv0 ? raw.argv0 : name;\n const args = argsOf(pkg, raw.args);\n const env = { ...shared, ...envOf(pkg, raw.env) };\n out.push({\n name,\n glue,\n wasm,\n argv0,\n ...(args ? { args } : {}),\n ...(Object.keys(env).length > 0 ? { env } : {}),\n });\n }\n return out;\n}\n\nasync function packages(fs: KernelFs, modules: string): Promise<string[]> {\n const names = await fs.readdir(modules).catch(() => []);\n const dirs: string[] = [];\n for (const name of names) {\n if (name.startsWith('.')) continue;\n if (!name.startsWith('@')) {\n dirs.push(`${modules}/${name}`);\n continue;\n }\n for (const inner of await fs.readdir(`${modules}/${name}`).catch(() => [])) {\n dirs.push(`${modules}/${name}/${inner}`);\n }\n }\n return dirs;\n}\n\nexport async function scanCommands(fs: KernelFs, modules: string): Promise<Map<string, Command>> {\n const found = new Map<string, Command>();\n for (const pkg of await packages(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n for (const command of commandsOf(pkg, manifest)) {\n if (!found.has(command.name)) found.set(command.name, command);\n }\n }\n if (!found.has('sh') && found.has('bash')) {\n found.set('sh', { ...(found.get('bash') as Command), name: 'sh', argv0: 'sh' });\n }\n return found;\n}\n", "import type { FsStat, KernelFs } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\n\nfunction missing(err: unknown): boolean {\n return (err as { code?: unknown })?.code === 'ENOENT';\n}\n\nfunction synthetic(directory: boolean): FsStat {\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: 0,\n mode: (directory ? S_IFDIR : S_IFREG) | 0o755,\n mtime: new Date(0),\n };\n}\n\nexport function withCommandDirs(fs: KernelFs, names: () => Promise<ReadonlySet<string>>): KernelFs {\n async function children(path: string): Promise<string[] | undefined> {\n if (path === '/') return ['bin', 'usr'];\n if (path === '/usr') return ['bin'];\n if (path === '/bin' || path === '/usr/bin') return [...(await names())];\n return undefined;\n }\n\n async function virtual(path: string): Promise<FsStat | undefined> {\n if (path === '/usr' || path === '/bin' || path === '/usr/bin') return synthetic(true);\n const name = COMMAND.exec(path)?.[1];\n return name !== undefined && (await names()).has(name) ? synthetic(false) : undefined;\n }\n\n async function stat(path: string, real: (path: string) => Promise<FsStat>): Promise<FsStat> {\n try {\n return await real(path);\n } catch (err) {\n const found = missing(err) ? await virtual(path) : undefined;\n if (found) return found;\n throw err;\n }\n }\n\n return {\n resolvePath: (base, path) => fs.resolvePath(base, path),\n readFile: (path) => fs.readFile(path),\n async readFileBuffer(path) {\n try {\n return await fs.readFileBuffer(path);\n } catch (err) {\n if (missing(err) && (await virtual(path))?.isFile) return new Uint8Array(0);\n throw err;\n }\n },\n writeFile: (path, content) => fs.writeFile(path, content),\n async exists(path) {\n return (await fs.exists(path)) || (await virtual(path)) !== undefined;\n },\n stat: (path) => stat(path, (p) => fs.stat(p)),\n lstat: (path) => stat(path, (p) => fs.lstat(p)),\n async readdir(path) {\n const extra = await children(path);\n if (!extra) return fs.readdir(path);\n const real = await fs.readdir(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n return [...new Set([...real, ...extra])].sort();\n },\n mkdir: (path, options) => fs.mkdir(path, options),\n rm: (path, options) => fs.rm(path, options),\n rename: (from, to) => fs.rename(from, to),\n symlink: (target, path) => fs.symlink(target, path),\n readlink: (path) => fs.readlink(path),\n chmod: (path, mode) => fs.chmod(path, mode),\n utimes: (path, atime, mtime) => fs.utimes(path, atime, mtime),\n };\n}\n", "export const PIPE_CAPACITY = 64 * 1024;\n\nexport class PipeError extends Error {\n readonly code: 'EPIPE' | 'EINTR';\n\n constructor(code: 'EPIPE' | 'EINTR') {\n super(code);\n this.code = code;\n }\n}\n\nexport class KernelPipe {\n private chunks: Uint8Array[] = [];\n private size = 0;\n private readers = 0;\n private writers = 0;\n private waiters: Array<() => void> = [];\n\n readonly capacity: number;\n\n constructor(capacity: number = PIPE_CAPACITY) {\n this.capacity = capacity;\n }\n\n get buffered(): number {\n return this.size;\n }\n\n get readReady(): boolean {\n return this.size > 0 || this.writers === 0;\n }\n\n get writeReady(): boolean {\n return this.size < this.capacity || this.readers === 0;\n }\n\n get writersGone(): boolean {\n return this.writers === 0;\n }\n\n get readersGone(): boolean {\n return this.readers === 0;\n }\n\n openRead(): void {\n this.readers += 1;\n }\n\n openWrite(): void {\n this.writers += 1;\n }\n\n closeRead(): void {\n if (this.readers > 0) this.readers -= 1;\n if (this.readers === 0) {\n this.chunks = [];\n this.size = 0;\n }\n this.wake();\n }\n\n closeWrite(): void {\n if (this.writers > 0) this.writers -= 1;\n this.wake();\n }\n\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = this.take(Math.min(max, this.size));\n this.wake();\n return out;\n }\n\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = new Uint8Array(Math.min(max, this.size));\n let filled = 0;\n for (const chunk of this.chunks) {\n if (filled === out.length) break;\n const count = Math.min(chunk.length, out.length - filled);\n out.set(chunk.subarray(0, count), filled);\n filled += count;\n }\n return out;\n }\n\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n let offset = 0;\n while (offset < bytes.length) {\n if (this.readers === 0) throw new PipeError('EPIPE');\n const room = this.capacity - this.size;\n if (room === 0) {\n try {\n await this.changed(signal);\n } catch (e) {\n if (offset > 0) return offset;\n throw e;\n }\n continue;\n }\n const n = Math.min(room, bytes.length - offset);\n this.chunks.push(bytes.slice(offset, offset + n));\n this.size += n;\n offset += n;\n this.wake();\n }\n return bytes.length;\n }\n\n private take(n: number): Uint8Array {\n const out = new Uint8Array(n);\n let filled = 0;\n while (filled < n) {\n const head = this.chunks[0];\n const count = Math.min(head.length, n - filled);\n out.set(head.subarray(0, count), filled);\n filled += count;\n if (count === head.length) this.chunks.shift();\n else this.chunks[0] = head.subarray(count);\n }\n this.size -= n;\n return out;\n }\n\n changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new PipeError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new PipeError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import { KernelPipe, type PipeError } from './pipe.ts';\nimport type { PtyPair } from './pty.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport type KernelErrno =\n | 'EBADF'\n | 'EPIPE'\n | 'EMFILE'\n | 'EINVAL'\n | 'ENOENT'\n | 'ECHILD'\n | 'ENOSYS'\n | 'ESPIPE'\n | 'EINTR'\n | 'ESRCH'\n | 'ENOTTY'\n | 'ENXIO'\n | 'EPERM'\n | 'EIO'\n | 'EACCES'\n | 'EAGAIN'\n | 'ENOTSOCK'\n | 'EAFNOSUPPORT'\n | 'EPROTONOSUPPORT'\n | 'EOPNOTSUPP'\n | 'EADDRINUSE'\n | 'EADDRNOTAVAIL'\n | 'ENETUNREACH'\n | 'ECONNREFUSED'\n | 'EINPROGRESS'\n | 'EISCONN'\n | 'ENOTCONN';\n\nexport class KernelError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport interface PollState {\n readable: boolean;\n\n writable: boolean;\n\n hangup: boolean;\n}\n\nexport interface KernelFile {\n read?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n peek?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n write?(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;\n\n close(): void | Promise<void>;\n\n poll?(): PollState;\n\n changed?(signal?: AbortSignal): Promise<void>;\n\n seek?(offset: number, whence: number): Promise<number>;\n\n flush?(): Promise<void>;\n\n pread?(max: number, at: number): Promise<Uint8Array>;\n pwrite?(bytes: Uint8Array, at: number): Promise<number>;\n\n resize?(size: number): Promise<void>;\n\n stat?(): Promise<{ path: string; size: number; orphan?: true }>;\n\n tty?: KernelTty;\n\n pty?: PtyPair;\n\n stat?(): Promise<{ size: number; path: string; orphan?: true }>;\n held?: true;\n\n heldMeta?: HeldMeta;\n}\n\nexport type HeldMeta = { dir: string; preopen?: string } | DeviceMeta;\n\nexport interface DeviceMeta {\n device: KernelDevice;\n access?: DeviceAccess;\n}\n\nexport type DeviceAccess = 'read' | 'write';\n\nexport type KernelDevice = 'null' | 'zero' | 'urandom';\n\nexport function pollFile(file: KernelFile): PollState {\n return file.poll?.() ?? { readable: !!file.read, writable: !!file.write, hangup: false };\n}\n\nexport class OpenFile {\n private refs = 1;\n\n readonly file: KernelFile;\n\n constructor(file: KernelFile) {\n this.file = file;\n }\n\n retain(): this {\n this.refs += 1;\n return this;\n }\n\n release(): void | Promise<void> {\n this.refs -= 1;\n if (this.refs === 0) return this.file.close();\n }\n}\n\nexport function openPipe(capacity?: number): { read: OpenFile; write: OpenFile } {\n const pipe = new KernelPipe(capacity);\n pipe.openRead();\n pipe.openWrite();\n return {\n read: new OpenFile({\n read: async (max, signal) => {\n try {\n return await pipe.read(max, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeRead(),\n poll: () => ({ readable: pipe.readReady, writable: false, hangup: pipe.writersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n write: new OpenFile({\n write: async (bytes, signal) => {\n try {\n return await pipe.write(bytes, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeWrite(),\n poll: () => ({ readable: false, writable: pipe.writeReady, hangup: pipe.readersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n };\n}\n\nexport function bytesSource(data: Uint8Array): OpenFile {\n let offset = 0;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n close: () => {},\n });\n}\n\nexport function sinkFile(onData: (bytes: Uint8Array) => void): OpenFile {\n return new OpenFile({\n write: async (bytes) => {\n onData(bytes.slice());\n return bytes.length;\n },\n close: () => {},\n });\n}\n\nexport function nullFile(): OpenFile {\n return new OpenFile({\n read: async () => new Uint8Array(0),\n write: async (bytes) => bytes.length,\n close: () => {},\n });\n}\n\nexport function deviceFile(device: KernelDevice, access?: DeviceAccess): OpenFile {\n const read = async (max: number): Promise<Uint8Array> => {\n if (device === 'null') return new Uint8Array(0);\n const out = new Uint8Array(max);\n if (device === 'urandom') {\n for (let at = 0; at < max; at += 65536) {\n crypto.getRandomValues(out.subarray(at, Math.min(max, at + 65536)));\n }\n }\n return out;\n };\n return new OpenFile({\n ...(access !== 'write' ? { read } : {}),\n ...(access !== 'read' ? { write: async (bytes: Uint8Array) => bytes.length } : {}),\n seek: async () => 0,\n heldMeta: { device, ...(access ? { access } : {}) },\n close: () => {},\n });\n}\n\nexport function heldFile(meta?: HeldMeta): OpenFile {\n return new OpenFile({ held: true, ...(meta ? { heldMeta: meta } : {}), close: () => {} });\n}\n\nexport type KernelFdKind = 'tty' | 'stream' | 'file' | 'socket' | 'held' | 'device';\n\nexport function kernelFdKind(file: KernelFile): Exclude<KernelFdKind, 'socket'> {\n if (file.held) return 'held';\n if (file.heldMeta && 'device' in file.heldMeta) return 'device';\n if (file.tty) return 'tty';\n return file.seek ? 'file' : 'stream';\n}\n\nexport class FdTable {\n static readonly MAX_FDS = 1024;\n private fds = new Map<number, OpenFile>();\n private readonly cloexec = new Set<number>();\n\n private readonly status = new Map<number, number>();\n\n get(fd: number): OpenFile {\n const file = this.fds.get(fd);\n if (!file) throw new KernelError('EBADF');\n return file;\n }\n\n stdioTerminal(): KernelTty | undefined {\n for (const fd of [0, 1, 2]) {\n const tty = this.fds.get(fd)?.file.tty;\n if (tty) return tty;\n }\n return undefined;\n }\n\n numbers(): number[] {\n return [...this.fds.keys()].sort((a, b) => a - b);\n }\n\n has(fd: number): boolean {\n return this.fds.has(fd);\n }\n\n setCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.add(fd);\n }\n\n clearCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.delete(fd);\n }\n\n closesOnExec(fd: number): boolean {\n return this.cloexec.has(fd);\n }\n\n setStatusFlags(fd: number, flags: number): void {\n this.get(fd);\n this.status.set(fd, flags);\n }\n\n statusFlags(fd: number): number | undefined {\n return this.status.get(fd);\n }\n\n install(file: OpenFile, min = 0): number {\n for (let fd = min; fd < FdTable.MAX_FDS; fd++) {\n if (!this.fds.has(fd)) {\n this.fds.set(fd, file);\n return fd;\n }\n }\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EMFILE');\n }\n\n installAt(fd: number, file: OpenFile): void {\n if (fd < 0 || fd >= FdTable.MAX_FDS) {\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EBADF');\n }\n const previous = this.fds.get(fd);\n this.fds.set(fd, file);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n void Promise.resolve(previous?.release()).catch(() => undefined);\n }\n\n dup(fd: number, min = 0): number {\n return this.install(this.get(fd).retain(), min);\n }\n\n dup2(oldFd: number, newFd: number): number {\n const file = this.get(oldFd);\n if (oldFd !== newFd) this.installAt(newFd, file.retain());\n return newFd;\n }\n\n close(fd: number): void | Promise<void> {\n const file = this.get(fd);\n this.fds.delete(fd);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n return file.release();\n }\n\n fork(): FdTable {\n const child = new FdTable();\n for (const [fd, file] of this.fds) child.fds.set(fd, file.retain());\n for (const fd of this.cloexec) child.cloexec.add(fd);\n for (const [fd, flags] of this.status) child.status.set(fd, flags);\n return child;\n }\n\n async closeAll(): Promise<void> {\n const files = [...this.fds.values()];\n this.fds.clear();\n this.cloexec.clear();\n this.status.clear();\n await Promise.allSettled(files.map((file) => Promise.resolve().then(() => file.release())));\n }\n}\n", "import {\n bytesSource,\n type DeviceMeta,\n deviceFile,\n FdTable,\n type KernelErrno,\n KernelError,\n nullFile,\n type OpenFile,\n sinkFile,\n} from './fd-table.ts';\nimport type { ForkState } from './protocol.ts';\n\nexport type ChildStdio =\n | { fd: number }\n | { input: Uint8Array }\n | { capture: true }\n | { none: true };\n\nexport type InheritedSlot =\n | { fd: number; kernel: number; flags?: number }\n | ({ fd: number } & DeviceMeta);\n\nexport interface ChildSpawnRequest {\n file: string;\n\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n}\n\nexport interface ChildHandle {\n pid: number;\n\n exited: Promise<number>;\n\n termsig?: () => number | undefined;\n\n onState?: (listener: ChildStateListener) => void;\n}\n\nexport type ChildStateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport interface WaitFlags {\n untraced?: boolean;\n\n continued?: boolean;\n\n inGroup?: (childPid: number) => boolean;\n}\n\nexport class SpawnError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport type ChildSpawner = (req: ChildSpawnRequest, fds: FdTable) => Promise<ChildHandle>;\n\nexport type ChildForker = (state: ForkState, fds: FdTable) => Promise<ChildHandle>;\n\ninterface Child {\n exited: Promise<number>;\n termsig?: () => number | undefined;\n\n code?: number;\n\n stopReport?: number;\n\n continueReport?: boolean;\n\n captured: Map<number, Uint8Array[]>;\n}\n\nfunction interrupted(signal: AbortSignal | undefined): {\n promise: Promise<never>;\n\n done(): void;\n} {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal?.aborted) fail();\n else signal?.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal?.removeEventListener('abort', fail) };\n}\n\nexport function stoppedStatus(sig: number): number {\n return ((sig & 0xff) << 8) | 0x7f;\n}\n\nexport const CONTINUED_STATUS = 0xffff;\n\nexport function waitStatus(code: number, termsig?: number): number {\n return termsig ? termsig & 0x7f : (code & 0xff) << 8;\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class ChildTable {\n private readonly children = new Map<number, Child>();\n\n private readonly leftovers = new Map<number, Map<number, Uint8Array[]>>();\n\n onChildState?: () => void;\n\n onReap?: (pid: number) => void;\n\n private stateChanged: Array<() => void> = [];\n\n private readonly watchers = new Map<number, ChildStateListener>();\n\n private readonly parentFds: FdTable;\n\n private readonly spawner: ChildSpawner | undefined;\n\n private readonly forker?: ChildForker;\n\n constructor(\n parentFds: FdTable,\n\n spawner: ChildSpawner | undefined,\n\n forker?: ChildForker\n ) {\n this.parentFds = parentFds;\n\n this.spawner = spawner;\n\n this.forker = forker;\n }\n\n async fork(state: ForkState): Promise<number> {\n if (!this.forker) throw new SpawnError('ENOSYS');\n return this.track(state, this.parentFds.fork(), new Map(), this.forker);\n }\n\n async spawn(\n req: ChildSpawnRequest,\n stdio: readonly ChildStdio[],\n inherit: readonly InheritedSlot[] = []\n ): Promise<number> {\n if (!this.spawner) throw new SpawnError('ENOSYS');\n const fds = new FdTable();\n const captured = new Map<number, Uint8Array[]>();\n try {\n for (const [n, slot] of stdio.entries()) fds.installAt(n, this.openSlot(slot, n, captured));\n\n for (const slot of inherit) {\n if (slot.fd <= 2) continue;\n if ('device' in slot) {\n fds.installAt(slot.fd, deviceFile(slot.device, slot.access));\n continue;\n }\n fds.installAt(slot.fd, this.parentFds.get(slot.kernel).retain());\n if (slot.flags !== undefined) fds.setStatusFlags(slot.fd, slot.flags);\n }\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n return this.track(req, fds, captured, this.spawner);\n }\n\n private async track<R>(\n req: R,\n fds: FdTable,\n captured: Map<number, Uint8Array[]>,\n start: (req: R, fds: FdTable) => Promise<ChildHandle>\n ): Promise<number> {\n let handle: ChildHandle;\n try {\n handle = await start(req, fds);\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n const child: Child = { exited: handle.exited, termsig: handle.termsig, captured };\n void handle.exited.then((code) => {\n child.code = code;\n this.watchers.delete(handle.pid);\n this.onChildState?.();\n });\n handle.onState?.((state, sig) => {\n child.stopReport = state === 'stopped' ? sig : undefined;\n child.continueReport = state === 'continued';\n this.watchers.get(handle.pid)?.(state, sig);\n const waiters = this.stateChanged;\n this.stateChanged = [];\n for (const wake of waiters) wake();\n this.onChildState?.();\n });\n this.children.set(handle.pid, child);\n return handle.pid;\n }\n\n watch(pid: number, listener: ChildStateListener): void {\n if (this.children.has(pid)) this.watchers.set(pid, listener);\n }\n\n private openSlot(slot: ChildStdio, n: number, captured: Map<number, Uint8Array[]>): OpenFile {\n if ('fd' in slot) return this.parentFds.get(slot.fd).retain();\n if ('input' in slot) return bytesSource(slot.input);\n if ('capture' in slot) {\n const chunks: Uint8Array[] = [];\n captured.set(n, chunks);\n return sinkFile((bytes) => chunks.push(bytes));\n }\n return nullFile();\n }\n\n async wait(\n pid: number,\n nohang: boolean,\n signal?: AbortSignal,\n flags: WaitFlags = {}\n ): Promise<[number, number]> {\n let interrupt: ReturnType<typeof interrupted> | undefined;\n try {\n for (;;) {\n const candidates = this.candidates(pid, flags);\n if (candidates.length === 0) throw new KernelError('ECHILD');\n const done = candidates.find(([, child]) => child.code !== undefined);\n if (done) return this.reap(done[0], done[1].code as number);\n const changed = this.stateReport(candidates, flags);\n if (changed) return changed;\n if (nohang) return [0, 0];\n interrupt ??= interrupted(signal);\n await this.nextChange(candidates, flags, interrupt.promise);\n }\n } finally {\n interrupt?.done();\n }\n }\n\n private candidates(pid: number, flags: WaitFlags): [number, Child][] {\n const all = [...this.children];\n if (pid > 0) return all.filter(([p]) => p === pid);\n const inGroup = flags.inGroup;\n return pid === -1 || !inGroup ? all : all.filter(([p]) => inGroup(p));\n }\n\n private async nextChange(\n candidates: [number, Child][],\n flags: WaitFlags,\n interrupt: Promise<never>\n ): Promise<void> {\n let wake: (() => void) | undefined;\n const stateChange = new Promise<void>((resolve) => (wake = resolve));\n const watching = flags.untraced || flags.continued;\n if (watching && wake) this.stateChanged.push(wake);\n try {\n await Promise.race([\n ...candidates.map(([, child]) => child.exited),\n ...(watching ? [stateChange] : []),\n interrupt,\n ]);\n } finally {\n this.stateChanged = this.stateChanged.filter((w) => w !== wake);\n }\n }\n\n private stateReport(candidates: [number, Child][], flags: WaitFlags): [number, number] | null {\n for (const [p, child] of candidates) {\n if (flags.untraced && child.stopReport !== undefined) {\n const sig = child.stopReport;\n child.stopReport = undefined;\n return [p, stoppedStatus(sig)];\n }\n if (flags.continued && child.continueReport) {\n child.continueReport = false;\n return [p, CONTINUED_STATUS];\n }\n }\n return null;\n }\n\n private reap(pid: number, code: number): [number, number] {\n const child = this.children.get(pid);\n this.children.delete(pid);\n this.onReap?.(pid);\n if (child && child.captured.size > 0) this.leftovers.set(pid, child.captured);\n return [pid, waitStatus(code, child?.termsig?.())];\n }\n\n pids(): number[] {\n return [...this.children.keys()];\n }\n\n captured(pid: number, slot: number): Uint8Array {\n const slots = this.leftovers.get(pid);\n const chunks = slots?.get(slot);\n if (!slots || !chunks) return new Uint8Array(0);\n slots.delete(slot);\n if (slots.size === 0) this.leftovers.delete(pid);\n return concat(chunks);\n }\n}\n", "import type { KernelFs } from '../fs/types.ts';\n\nexport interface SyncFsTokenEntry {\n fs: KernelFs;\n cwd: string;\n}\n\nconst registry = new Map<string, SyncFsTokenEntry>();\n\nexport function mintSyncFsToken(entry: SyncFsTokenEntry): string {\n const token = crypto.randomUUID();\n registry.set(token, entry);\n return token;\n}\n\nexport function resolveSyncFsToken(token: string): SyncFsTokenEntry | null {\n return registry.get(token) ?? null;\n}\n\nexport function revokeSyncFsToken(token: string): void {\n registry.delete(token);\n}\n", "export type SyncFsOp =\n | 'read'\n | 'write'\n | 'exists'\n | 'stat'\n | 'lstat'\n | 'readdir'\n | 'readdir-stat'\n | 'mkdir'\n | 'rm'\n | 'rename'\n | 'unlink'\n | 'rmdir'\n | 'symlink'\n | 'readlink'\n | 'chmod'\n | 'utimes';\n\nexport interface SyncFsRequest {\n token: string;\n op: SyncFsOp;\n path: string;\n body?: Uint8Array;\n arg2?: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n}\n\nexport type SyncFsResult =\n | { ok: true; kind: 'bytes'; bytes: Uint8Array }\n | { ok: true; kind: 'json'; json: unknown }\n | { ok: true; kind: 'void' }\n | { ok: false; errno: string; message: string };\n\nexport const SYNC_FS_REQUEST_TIMEOUT_MS = 25_000;\n\nexport interface SyncFsBridgeStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink?: boolean;\n size: number;\n mode?: number;\n mtimeMs?: number;\n ino?: number;\n}\n\nexport interface SyncFsPosixBridge {\n readFile(path: string): Uint8Array;\n writeFile(path: string, bytes: Uint8Array): void;\n stat(path: string): SyncFsBridgeStat;\n lstat(path: string): SyncFsBridgeStat;\n readdir(path: string): string[];\n exists(path: string): boolean;\n mkdir(path: string): void;\n rm(path: string): void;\n rename(from: string, to: string): void;\n unlink(path: string): void;\n rmdir(path: string): void;\n symlink(target: string, linkPath: string): void;\n readlink(path: string): string;\n chmod(path: string, mode: number): void;\n utimes(path: string, atimeMs: number, mtimeMs: number): void;\n readdirStat(path: string): Array<[string, SyncFsBridgeStat | null]>;\n}\n\nexport function syncError(code: string, label: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${label}`), { code });\n}\n\nexport function parseSyncFsStat(json: unknown): SyncFsBridgeStat | null {\n const s = json as Partial<SyncFsBridgeStat> | null;\n if (\n !s ||\n typeof s.isFile !== 'boolean' ||\n typeof s.isDirectory !== 'boolean' ||\n typeof s.size !== 'number'\n ) {\n return null;\n }\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n ...(typeof s.mode === 'number' ? { mode: s.mode } : {}),\n ...(typeof s.mtimeMs === 'number' ? { mtimeMs: s.mtimeMs } : {}),\n ...(typeof s.ino === 'number' ? { ino: s.ino } : {}),\n };\n}\n", "import type { FsStat, KernelFs } from '../fs/types.ts';\nimport { resolveSyncFsToken } from './sync-fs-token-registry.ts';\nimport { type SyncFsRequest, type SyncFsResult, syncError } from './sync-fs-wire.ts';\n\nexport function toErrno(err: unknown): SyncFsResult {\n const message = err instanceof Error ? err.message : String(err);\n const code = (err as { code?: unknown })?.code;\n if (typeof code === 'string' && /^E[A-Z]+$/.test(code)) {\n return { ok: false, errno: code, message };\n }\n return { ok: false, errno: 'EIO', message };\n}\n\nexport interface SyncFsStatJson {\n isDirectory: boolean;\n isFile: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtimeMs: number;\n}\n\nfunction statJson(s: FsStat): SyncFsStatJson {\n return {\n isDirectory: s.isDirectory,\n isFile: s.isFile,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mode: s.mode,\n mtimeMs: s.mtime.getTime(),\n };\n}\n\nasync function readdirStat(\n fs: KernelFs,\n dir: string\n): Promise<Array<[string, SyncFsStatJson | null]>> {\n const names = await fs.readdir(dir);\n const base = dir === '/' ? '' : dir;\n return Promise.all(\n names.map(async (name): Promise<[string, SyncFsStatJson | null]> => {\n try {\n return [name, statJson(await fs.lstat(`${base}/${name}`))];\n } catch {\n return [name, null];\n }\n })\n );\n}\n\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nfunction json(value: unknown): SyncFsResult {\n return { ok: true, kind: 'json', json: value };\n}\n\nasync function run(\n fs: KernelFs,\n path: string,\n req: SyncFsRequest,\n cwd: string\n): Promise<SyncFsResult> {\n switch (req.op) {\n case 'read':\n return { ok: true, kind: 'bytes', bytes: await fs.readFileBuffer(path) };\n case 'write':\n await fs.writeFile(path, req.body ?? new Uint8Array(0));\n return done;\n case 'exists':\n return json(await fs.exists(path));\n case 'stat':\n return json(statJson(await fs.stat(path)));\n case 'lstat':\n return json(statJson(await fs.lstat(path)));\n case 'readdir':\n return json(await fs.readdir(path));\n case 'readdir-stat':\n return json(await readdirStat(fs, path));\n case 'mkdir':\n await fs.mkdir(path, { recursive: true });\n return done;\n case 'rm':\n await fs.rm(path, { recursive: true });\n return done;\n case 'rename':\n await fs.rename(path, fs.resolvePath(cwd, req.arg2 ?? ''));\n return done;\n case 'unlink':\n if ((await fs.lstat(path)).isDirectory) throw syncError('EISDIR', path);\n await fs.rm(path);\n return done;\n case 'rmdir':\n if (!(await fs.lstat(path)).isDirectory) throw syncError('ENOTDIR', path);\n if ((await fs.readdir(path)).length > 0) throw syncError('ENOTEMPTY', path);\n await fs.rm(path, { recursive: true });\n return done;\n case 'symlink':\n await fs.symlink(req.arg2 ?? '', path);\n return done;\n case 'readlink':\n return json(await fs.readlink(path));\n case 'chmod':\n await fs.chmod(path, req.mode ?? 0);\n return done;\n case 'utimes':\n await fs.utimes(path, new Date(req.atimeMs ?? 0), new Date(req.mtimeMs ?? 0));\n return done;\n default:\n return { ok: false, errno: 'EINVAL', message: `sync-fs: unknown op '${req.op as string}'` };\n }\n}\n\nexport async function dispatchSyncFs(req: SyncFsRequest): Promise<SyncFsResult> {\n const entry = resolveSyncFsToken(req.token);\n if (!entry) return { ok: false, errno: 'EACCES', message: 'sync-fs: unknown or revoked token' };\n const { fs, cwd } = entry;\n try {\n return await run(fs, fs.resolvePath(cwd, req.path), req, cwd);\n } catch (err) {\n return toErrno(err);\n }\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport type { SyncFsRequest, SyncFsResult } from './sync-fs-wire.ts';\n\nexport const SAB_HEADER_I32 = 16;\nexport const SAB_HEADER_BYTES = SAB_HEADER_I32 * 4;\n\nexport const SAB_I_STATE = 0;\nexport const SAB_I_SEQ = 1;\nexport const SAB_I_STATUS = 2;\nexport const SAB_I_TOTAL = 3;\nexport const SAB_I_CHUNK = 4;\nexport const SAB_I_OFFSET = 5;\n\nexport const SAB_I_SIGNALS = 8;\n\nexport const SAB_I_TIMERS = 9;\n\nexport const SAB_STATE_IDLE = 0;\nexport const SAB_STATE_PENDING = 1;\nexport const SAB_STATE_READY = 2;\n\nexport const SAB_STATUS_BYTES = 1;\nexport const SAB_STATUS_JSON = 2;\nexport const SAB_STATUS_VOID = 3;\nexport const SAB_STATUS_ERRNO = 4;\n\nexport const SAB_DEFAULT_WINDOW_BYTES = 1024 * 1024;\n\nexport const SAB_MIN_BYTES = SAB_HEADER_BYTES + 4096;\n\nexport const SYNC_SAB_REQ_MSG = 'sync-sab-req';\n\nexport const SYNC_SAB_NEXT_MSG = 'sync-sab-next';\n\nexport type SyncSabRequestBody = Omit<SyncFsRequest, 'token'> | WasmSyscall;\n\nexport interface SyncSabReqMsg {\n type: typeof SYNC_SAB_REQ_MSG;\n id: number;\n req: SyncSabRequestBody;\n}\nexport interface SyncSabNextMsg {\n type: typeof SYNC_SAB_NEXT_MSG;\n id: number;\n offset: number;\n}\n\nexport interface SabEncodedResult {\n status: number;\n payload: Uint8Array;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function encodeSabResult(result: SyncFsResult): SabEncodedResult {\n if (!result.ok) {\n return {\n status: SAB_STATUS_ERRNO,\n payload: encoder.encode(JSON.stringify({ errno: result.errno, message: result.message })),\n };\n }\n switch (result.kind) {\n case 'bytes':\n return { status: SAB_STATUS_BYTES, payload: result.bytes };\n case 'json':\n return { status: SAB_STATUS_JSON, payload: encoder.encode(JSON.stringify(result.json)) };\n default:\n return { status: SAB_STATUS_VOID, payload: new Uint8Array(0) };\n }\n}\n\nexport function decodeSabResult(status: number, payload: Uint8Array): SyncFsResult {\n switch (status) {\n case SAB_STATUS_BYTES:\n return { ok: true, kind: 'bytes', bytes: payload };\n case SAB_STATUS_VOID:\n return { ok: true, kind: 'void' };\n case SAB_STATUS_JSON: {\n try {\n return { ok: true, kind: 'json', json: JSON.parse(decoder.decode(payload)) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed json payload' };\n }\n }\n case SAB_STATUS_ERRNO: {\n try {\n const parsed = JSON.parse(decoder.decode(payload)) as {\n errno?: unknown;\n message?: unknown;\n };\n const errno =\n typeof parsed.errno === 'string' && /^E[A-Z]+$/.test(parsed.errno) ? parsed.errno : 'EIO';\n return { ok: false, errno, message: String(parsed.message ?? errno) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed errno payload' };\n }\n }\n default:\n return { ok: false, errno: 'EIO', message: `sync-sab: unknown status ${status}` };\n }\n}\n\nexport interface SabViews {\n header: Int32Array;\n window: Uint8Array;\n}\n\nexport function sabViews(sab: SharedArrayBuffer): SabViews {\n if (sab.byteLength < SAB_MIN_BYTES) {\n throw new Error(`sync-sab: buffer too small (${sab.byteLength} < ${SAB_MIN_BYTES})`);\n }\n return {\n header: new Int32Array(sab, 0, SAB_HEADER_I32),\n window: new Uint8Array(sab, SAB_HEADER_BYTES),\n };\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport {\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsRequest,\n type SyncFsResult,\n} from './sync-fs-wire.ts';\nimport {\n encodeSabResult,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_SEQ,\n SAB_I_STATE,\n SAB_I_STATUS,\n SAB_I_TOTAL,\n SAB_STATE_READY,\n type SabViews,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabNextMsg,\n type SyncSabReqMsg,\n sabViews,\n} from './sync-sab-wire.ts';\n\nexport interface SabPortLike {\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface SyncSabResponderHandle {\n dispose(): void;\n}\n\ninterface PendingPayload {\n status: number;\n payload: Uint8Array;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst PENDING_TTL_MS = SYNC_FS_REQUEST_TIMEOUT_MS + 5_000;\n\nexport type SyncSabDispatchRequest = SyncFsRequest | (WasmSyscall & { token: string });\n\nexport interface SyncSabResponderOptions {\n dispatch: (req: SyncSabDispatchRequest) => Promise<SyncFsResult>;\n}\n\nexport function attachSyncSabResponder(\n port: SabPortLike,\n sab: SharedArrayBuffer,\n token: string,\n opts: SyncSabResponderOptions\n): SyncSabResponderHandle {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const pending = new Map<number, PendingPayload>();\n let disposed = false;\n\n const { dispatch } = opts;\n\n function drop(id: number): void {\n const entry = pending.get(id);\n if (!entry) return;\n clearTimeout(entry.timer);\n pending.delete(id);\n }\n\n function publish(id: number, entry: PendingPayload, offset: number): void {\n const chunk = Math.min(window.byteLength, entry.payload.byteLength - offset);\n if (chunk > 0) window.set(entry.payload.subarray(offset, offset + chunk));\n Atomics.store(header, SAB_I_STATUS, entry.status);\n Atomics.store(header, SAB_I_TOTAL, entry.payload.byteLength);\n Atomics.store(header, SAB_I_CHUNK, chunk);\n Atomics.store(header, SAB_I_OFFSET, offset);\n Atomics.store(header, SAB_I_SEQ, id);\n Atomics.store(header, SAB_I_STATE, SAB_STATE_READY);\n Atomics.notify(header, SAB_I_STATE);\n\n if (offset + chunk >= entry.payload.byteLength) drop(id);\n }\n\n function settle(id: number, result: SyncFsResult): void {\n if (disposed) return;\n const { status, payload } = encodeSabResult(result);\n\n drop(id);\n const entry: PendingPayload = {\n status,\n payload,\n timer: setTimeout(() => drop(id), PENDING_TTL_MS),\n };\n pending.set(id, entry);\n publish(id, entry, 0);\n }\n\n const handler = (event: MessageEvent): void => {\n const data = event.data as\n | { type?: unknown; id?: unknown; req?: unknown; offset?: unknown }\n | undefined;\n if (!data || typeof data.id !== 'number') return;\n if (data.type === SYNC_SAB_NEXT_MSG) {\n const entry = pending.get(data.id);\n const offset = (data as Partial<SyncSabNextMsg>).offset;\n if (\n !entry ||\n typeof offset !== 'number' ||\n !Number.isInteger(offset) ||\n offset < 0 ||\n offset > entry.payload.byteLength\n ) {\n settle(data.id, { ok: false, errno: 'EIO', message: 'sync-sab: bad continuation' });\n return;\n }\n publish(data.id, entry, offset);\n return;\n }\n if (data.type !== SYNC_SAB_REQ_MSG || !data.req || typeof data.req !== 'object') return;\n const id = data.id;\n\n const body = (data as SyncSabReqMsg).req;\n const req = { ...body, token } as SyncSabDispatchRequest;\n let dispatched: Promise<SyncFsResult>;\n try {\n dispatched = dispatch(req);\n } catch (err) {\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n void dispatched.then(\n (result) => settle(id, result),\n (err) =>\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n })\n );\n };\n\n port.addEventListener('message', handler);\n return {\n dispose: () => {\n if (disposed) return;\n disposed = true;\n port.removeEventListener('message', handler);\n for (const id of [...pending.keys()]) drop(id);\n },\n };\n}\n", "export const SIG = {\n HUP: 1,\n INT: 2,\n QUIT: 3,\n ILL: 4,\n TRAP: 5,\n ABRT: 6,\n BUS: 7,\n FPE: 8,\n KILL: 9,\n USR1: 10,\n SEGV: 11,\n USR2: 12,\n PIPE: 13,\n ALRM: 14,\n TERM: 15,\n STKFLT: 16,\n CHLD: 17,\n CONT: 18,\n STOP: 19,\n TSTP: 20,\n TTIN: 21,\n TTOU: 22,\n URG: 23,\n XCPU: 24,\n XFSZ: 25,\n VTALRM: 26,\n PROF: 27,\n WINCH: 28,\n POLL: 29,\n PWR: 30,\n SYS: 31,\n} as const;\n\nexport type DefaultAction = 'terminate' | 'ignore' | 'stop' | 'continue';\n\nconst IGNORED_BY_DEFAULT: ReadonlySet<number> = new Set([SIG.CHLD, SIG.URG, SIG.WINCH]);\nconst STOPPING: ReadonlySet<number> = new Set([SIG.STOP, SIG.TSTP, SIG.TTIN, SIG.TTOU]);\n\nexport function defaultAction(sig: number): DefaultAction {\n if (sig === SIG.CONT) return 'continue';\n if (STOPPING.has(sig)) return 'stop';\n return IGNORED_BY_DEFAULT.has(sig) ? 'ignore' : 'terminate';\n}\n\nexport function isSignal(sig: number): boolean {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31;\n}\n\nexport function sigbit(sig: number): number {\n return 1 << sig;\n}\n\nexport function signalsIn(mask: number): number[] {\n const out: number[] = [];\n for (let sig = 1; sig <= 31; sig++) if (mask & sigbit(sig)) out.push(sig);\n return out;\n}\n\nexport const SIGNAL_BY_NAME: Readonly<\n Record<'SIGINT' | 'SIGTERM' | 'SIGKILL' | 'SIGSTOP' | 'SIGCONT', number>\n> = {\n SIGINT: SIG.INT,\n SIGTERM: SIG.TERM,\n SIGKILL: SIG.KILL,\n SIGSTOP: SIG.STOP,\n SIGCONT: SIG.CONT,\n};\n", "import { KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport { SIG } from './signals.ts';\n\nexport interface Termios {\n c_iflag: number;\n c_oflag: number;\n c_cflag: number;\n c_lflag: number;\n c_cc: number[];\n}\n\nexport interface TtyScreen {\n write(bytes: Uint8Array): void;\n}\n\nconst ICRNL = 0o400;\nconst IUTF8 = 0o40000;\nconst OPOST = 0o1;\nconst ONLCR = 0o4;\nconst ISIG = 0o1;\nconst ICANON = 0o2;\nconst ECHO = 0o10;\nconst ECHOE = 0o20;\nconst ECHOCTL = 0o1000;\nconst NOFLSH = 0o200;\nconst IEXTEN = 0o100000;\nconst VINTR = 0;\nconst VQUIT = 1;\nconst VERASE = 2;\nconst VKILL = 3;\nconst VEOF = 4;\nconst VSUSP = 10;\nconst VWERASE = 14;\n\nexport function defaultTermios(): Termios {\n const cCc = new Array<number>(32).fill(0);\n Object.assign(cCc, { [VINTR]: 0x03, [VQUIT]: 0x1c, [VERASE]: 0x7f, [VKILL]: 0x15 });\n Object.assign(cCc, { [VEOF]: 0x04, 6: 1, 8: 0x11, 9: 0x13, [VSUSP]: 0x1a });\n Object.assign(cCc, { 12: 0x12, 13: 0x0f, [VWERASE]: 0x17, 15: 0x16 });\n return {\n c_iflag: ICRNL | 0o2000 | 0o20000 | IUTF8,\n c_oflag: OPOST | ONLCR,\n c_cflag: 0o17 | 0o60 | 0o200,\n c_lflag: ISIG | ICANON | ECHO | ECHOE | 0o40 | ECHOCTL | 0o4000 | IEXTEN,\n c_cc: cCc,\n };\n}\n\nconst encoder = new TextEncoder();\n\nfunction isContinuation(byte: number): boolean {\n return (byte & 0xc0) === 0x80;\n}\n\nexport class KernelTty {\n private termios = defaultTermios();\n private cols = 80;\n private rows = 24;\n\n private readable: Array<Uint8Array | null> = [];\n\n private line: number[] = [];\n private waiters: Array<() => void> = [];\n\n private hungUp = false;\n\n name?: string;\n\n private readonly screen: TtyScreen;\n\n private readonly signal: (sig: number) => void;\n\n constructor(\n screen: TtyScreen,\n\n signal: (sig: number) => void\n ) {\n this.screen = screen;\n\n this.signal = signal;\n }\n\n receive(bytes: Uint8Array): void {\n for (const byte of bytes) this.key(byte);\n this.wake();\n }\n\n resize(cols: number, rows: number): void {\n this.setSize(cols, rows);\n this.signal(SIG.WINCH);\n }\n\n hangup(): void {\n this.hungUp = true;\n this.wake();\n }\n\n signalHangup(): void {\n this.signal(SIG.HUP);\n }\n\n setSize(cols: number, rows: number): void {\n this.cols = cols;\n this.rows = rows;\n }\n\n tcgets(): Termios {\n return { ...this.termios, c_cc: [...this.termios.c_cc] };\n }\n\n tcsets(termios: Termios): void {\n const wasCanonical = this.canonical;\n this.termios = { ...termios, c_cc: [...termios.c_cc] };\n\n if (wasCanonical && !this.canonical && this.line.length > 0) {\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n this.wake();\n }\n }\n\n winsize(): [number, number] {\n return [this.rows, this.cols];\n }\n\n file(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.read(max, signal),\n write: async (bytes) => {\n if (this.hungUp) throw new KernelError('EIO');\n this.output(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.readable.length > 0 || this.hungUp,\n writable: true,\n hangup: this.hungUp,\n }),\n changed: (signal) => this.changed(signal),\n close: () => {},\n tty: this,\n });\n }\n\n private get canonical(): boolean {\n return (this.termios.c_lflag & ICANON) !== 0;\n }\n\n private cc(slot: number): number {\n return this.termios.c_cc[slot] ?? 0;\n }\n\n private key(input: number): void {\n const { c_iflag, c_lflag } = this.termios;\n const byte = input === 0x0d && c_iflag & ICRNL ? 0x0a : input;\n if (c_lflag & ISIG && this.signalKey(byte)) return;\n if (!this.canonical) {\n this.readable.push(Uint8Array.of(byte));\n if (c_lflag & ECHO) this.echo(byte);\n return;\n }\n this.edit(byte);\n }\n\n private signalKey(byte: number): boolean {\n const sig =\n byte === this.cc(VINTR)\n ? SIG.INT\n : byte === this.cc(VQUIT)\n ? SIG.QUIT\n : byte === this.cc(VSUSP)\n ? SIG.TSTP\n : 0;\n if (!sig || byte === 0) return false;\n if (this.termios.c_lflag & ECHO) this.echo(byte);\n if (!(this.termios.c_lflag & NOFLSH)) {\n this.line = [];\n this.readable = [];\n }\n this.signal(sig);\n return true;\n }\n\n private edit(byte: number): void {\n const echo = (this.termios.c_lflag & ECHO) !== 0;\n if (byte === this.cc(VERASE) || byte === 0x08) {\n this.rubOut(this.lastCharLength());\n } else if (byte === this.cc(VKILL)) {\n this.rubOut(this.line.length);\n } else if (byte === this.cc(VWERASE)) {\n this.rubOut(this.lastWordLength());\n } else if (byte === this.cc(VEOF)) {\n this.readable.push(this.line.length > 0 ? Uint8Array.from(this.line) : null);\n this.line = [];\n } else if (byte === 0x0a) {\n this.line.push(byte);\n if (echo) this.output(encoder.encode('\\n'));\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n } else {\n this.line.push(byte);\n if (echo) this.echo(byte);\n }\n }\n\n private lastWordLength(): number {\n let end = this.line.length;\n while (end > 0 && this.line[end - 1] === 0x20) end--;\n while (end > 0 && this.line[end - 1] !== 0x20) end--;\n return this.line.length - end;\n }\n\n private lastCharLength(): number {\n const { line } = this;\n let n = Math.min(1, line.length);\n if (this.termios.c_iflag & IUTF8) {\n while (n < line.length && isContinuation(line[line.length - n] ?? 0)) n++;\n }\n return n;\n }\n\n private rubOut(n: number): void {\n const dropped = this.line.splice(this.line.length - n, n);\n const utf8 = (this.termios.c_iflag & IUTF8) !== 0;\n const cells = utf8 ? dropped.filter((b) => !isContinuation(b)).length : dropped.length;\n if (cells > 0 && this.termios.c_lflag & ECHO) {\n this.output(encoder.encode('\\b \\b'.repeat(cells)), false);\n }\n }\n\n private echo(byte: number): void {\n if (byte < 0x20 && byte !== 0x0a && byte !== 0x09 && this.termios.c_lflag & ECHOCTL) {\n this.output(Uint8Array.of(0x5e, byte + 0x40), false);\n return;\n }\n this.output(Uint8Array.of(byte));\n }\n\n private output(bytes: Uint8Array, translate = true): void {\n const { c_oflag } = this.termios;\n if (!translate || !(c_oflag & OPOST && c_oflag & ONLCR) || !bytes.includes(0x0a)) {\n this.screen.write(bytes);\n return;\n }\n const out: number[] = [];\n for (const byte of bytes) {\n if (byte === 0x0a) out.push(0x0d);\n out.push(byte);\n }\n this.screen.write(Uint8Array.from(out));\n }\n\n private async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.readable.length === 0) {\n if (this.hungUp) return new Uint8Array(0);\n await this.changed(signal);\n }\n const head = this.readable[0];\n if (head === null) {\n this.readable.shift();\n return new Uint8Array(0);\n }\n if (head === undefined) return new Uint8Array(0);\n\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.readable.length > 0 && n < max) {\n const next = this.readable[0];\n if (next === null || next === undefined) break;\n const take = next.subarray(0, max - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.readable[0] = next.subarray(take.length);\n else this.readable.shift();\n if (this.canonical) break;\n }\n const out = new Uint8Array(n);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport { KernelTty } from './tty.ts';\n\nexport type PtySignal = (tty: KernelTty, sig: number) => void;\n\nexport class PtyPair {\n readonly slave: KernelTty;\n\n locked = true;\n\n packet = false;\n private queue: Uint8Array[] = [];\n private waiters: Array<() => void> = [];\n private masterOpen = true;\n private slaveRefs = 0;\n private slaveSeen = false;\n\n readonly index: number;\n\n private readonly onFree: (pair: PtyPair) => void;\n\n constructor(\n index: number,\n\n signal: PtySignal,\n\n onFree: (pair: PtyPair) => void\n ) {\n this.index = index;\n\n this.onFree = onFree;\n this.slave = new KernelTty({ write: (bytes) => this.fromSlave(bytes) }, (sig) =>\n signal(this.slave, sig)\n );\n this.slave.name = `/dev/pts/${index}`;\n }\n\n master(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.readMaster(max, signal),\n write: async (bytes) => {\n this.slave.receive(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.queue.length > 0 || this.slaveGone,\n writable: true,\n hangup: this.slaveGone,\n }),\n changed: (signal) => this.changed(signal),\n close: () => this.closeMaster(),\n pty: this,\n });\n }\n\n openSlave(): OpenFile {\n if (!this.masterOpen || this.locked) throw new KernelError('EIO');\n const file = this.slave.file().file;\n this.slaveRefs += 1;\n this.slaveSeen = true;\n return new OpenFile({ ...file, close: () => this.closeSlave() });\n }\n\n private get slaveGone(): boolean {\n return this.slaveSeen && this.slaveRefs === 0;\n }\n\n private fromSlave(bytes: Uint8Array): void {\n if (!this.masterOpen) return;\n this.queue.push(bytes.slice());\n this.wake();\n }\n\n private async readMaster(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.queue.length === 0) {\n if (this.slaveGone) throw new KernelError('EIO');\n await this.changed(signal);\n }\n\n const status = this.packet ? 1 : 0;\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.queue.length > 0 && n < max - status) {\n const next = this.queue[0] as Uint8Array;\n const take = next.subarray(0, max - status - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.queue[0] = next.subarray(take.length);\n else this.queue.shift();\n }\n const out = new Uint8Array(status + n);\n let at = status;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private closeMaster(): void {\n this.masterOpen = false;\n this.queue = [];\n\n this.slave.hangup();\n this.slave.signalHangup();\n this.freeIfUnused();\n }\n\n private closeSlave(): void {\n this.slaveRefs -= 1;\n this.wake();\n this.freeIfUnused();\n }\n\n private freeIfUnused(): void {\n if (!this.masterOpen && this.slaveRefs === 0) this.onFree(this);\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n\nexport class PtyTable {\n private readonly pairs = new Map<number, PtyPair>();\n\n private readonly signal: PtySignal;\n\n constructor(signal: PtySignal) {\n this.signal = signal;\n }\n\n open(): { pair: PtyPair; master: OpenFile } {\n let index = 0;\n while (this.pairs.has(index)) index += 1;\n const pair = new PtyPair(index, this.signal, (p) => this.pairs.delete(p.index));\n this.pairs.set(index, pair);\n return { pair, master: pair.master() };\n }\n\n get(index: number): PtyPair {\n const pair = this.pairs.get(index);\n if (!pair) throw new KernelError('ENOENT');\n return pair;\n }\n\n numbers(): number[] {\n return [...this.pairs.keys()].sort((a, b) => a - b);\n }\n}\n\nexport function ptsNumber(path: string): number | undefined {\n const m = /^\\/dev\\/pts\\/(\\d+)$/.exec(path);\n return m ? Number(m[1]) : undefined;\n}\n\nexport type PtySyscall =\n | { op: 'pty-open' }\n | { op: 'pty-slave-open'; n: number; noctty: boolean }\n | { op: 'pty-number'; fd: number }\n | { op: 'pty-lock'; fd: number; lock: boolean }\n | { op: 'pty-ctty'; fd: number }\n | { op: 'pty-packet'; fd: number; on: boolean }\n | { op: 'pty-list' }\n | { op: 'pty-winsz-set'; fd: number; rows: number; cols: number };\n\nexport const PTY_OPS: readonly PtySyscall['op'][] = [\n 'pty-open',\n 'pty-slave-open',\n 'pty-number',\n 'pty-lock',\n 'pty-ctty',\n 'pty-packet',\n 'pty-list',\n 'pty-winsz-set',\n];\n\nexport interface PtyContext {\n pid: number;\n fds: FdTable;\n ptys?: PtyTable;\n jobs?: JobTable;\n}\n\nfunction masterOf(ctx: PtyContext, fd: number): PtyPair {\n const pair = ctx.fds.get(fd).file.pty;\n if (!pair) throw new KernelError('ENOTTY');\n return pair;\n}\n\nfunction terminalOf(ctx: PtyContext, fd: number): KernelTty {\n const file = ctx.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n}\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nexport function ptySyscall(req: PtySyscall, ctx: PtyContext): SyncFsResult {\n switch (req.op) {\n case 'pty-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n return json(ctx.fds.install(ctx.ptys.open().master, 3));\n }\n case 'pty-slave-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n const pair = ctx.ptys.get(req.n);\n const fd = ctx.fds.install(pair.openSlave(), 3);\n\n if (!req.noctty) ctx.jobs?.acquireTerminal(ctx.pid, pair.slave);\n return json(fd);\n }\n case 'pty-number':\n return json(masterOf(ctx, req.fd).index);\n case 'pty-lock':\n masterOf(ctx, req.fd).locked = req.lock;\n return done;\n case 'pty-ctty': {\n const tty = terminalOf(ctx, req.fd);\n\n const leader = ctx.jobs?.getsid(ctx.pid, 0) === ctx.pid;\n if (leader && ctx.jobs?.controllingTerminal(ctx.pid) === tty) return done;\n if (!ctx.jobs?.acquireTerminal(ctx.pid, tty)) throw new KernelError('EPERM');\n return done;\n }\n case 'pty-list':\n return json(ctx.ptys?.numbers() ?? []);\n case 'pty-packet':\n masterOf(ctx, req.fd).packet = req.on;\n return done;\n case 'pty-winsz-set':\n terminalOf(ctx, req.fd).resize(req.cols, req.rows);\n return done;\n }\n}\n", "import { type FdTable, KernelError, pollFile } from './fd-table.ts';\n\nexport interface SelectResult {\n read: number[];\n write: number[];\n\n hangup?: number[];\n}\n\nfunction ready(fds: FdTable, read: readonly number[], write: readonly number[]): SelectResult {\n const hangup = new Set<number>();\n const pick = (list: readonly number[], dir: 'readable' | 'writable') =>\n list.filter((fd) => {\n const state = pollFile(fds.get(fd).file);\n if (state.hangup) hangup.add(fd);\n return state[dir] || state.hangup;\n });\n const out: SelectResult = { read: pick(read, 'readable'), write: pick(write, 'writable') };\n if (hangup.size > 0) out.hangup = [...hangup];\n return out;\n}\n\nfunction interruption(signal: AbortSignal): { promise: Promise<never>; done(): void } {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal.aborted) fail();\n else signal.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal.removeEventListener('abort', fail) };\n}\n\nexport async function selectFds(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n timeoutMs: number,\n interrupt: AbortSignal\n): Promise<SelectResult> {\n const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : Date.now() + timeoutMs;\n const interrupted = interruption(interrupt);\n interrupted.promise.catch(() => {});\n try {\n return await waitReady(fds, read, write, deadline, interrupted.promise);\n } finally {\n interrupted.done();\n }\n}\n\nasync function waitReady(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n deadline: number,\n interrupted: Promise<never>\n): Promise<SelectResult> {\n for (;;) {\n const now = ready(fds, read, write);\n if (now.read.length > 0 || now.write.length > 0 || Date.now() >= deadline) return now;\n\n const round = new AbortController();\n const changes = [...new Set([...read, ...write])].flatMap((fd) => {\n const file = fds.get(fd).file;\n return file.changed === undefined ? [] : [file.changed(round.signal).catch(() => undefined)];\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const expiry =\n deadline === Number.POSITIVE_INFINITY\n ? []\n : [new Promise<void>((resolve) => (timer = setTimeout(resolve, deadline - Date.now())))];\n try {\n await Promise.race([...changes, ...expiry, interrupted]);\n } finally {\n round.abort();\n clearTimeout(timer);\n }\n }\n}\n", "import { KernelError, OpenFile } from './fd-table.ts';\n\nexport interface VfsFileFs {\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array): Promise<void>;\n}\n\nconst O_ACCMODE = 0o3;\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\n\nconst SEEK_SET = 0;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\n\nexport interface VfsFileOptions {\n path: string;\n\n flags: number;\n\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n dirty?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n}\n\nexport const WRITEBACK_MS = 250;\n\nconst WRITEBACK_COST_FACTOR = 10;\n\nfunction isMissing(err: unknown): boolean {\n if ((err as { code?: unknown } | null)?.code === 'ENOENT') return true;\n return err instanceof Error && err.message.startsWith('ENOENT');\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(root.endsWith('/') ? root : `${root}/`);\n}\n\nexport class VfsNode {\n private data: Uint8Array | undefined;\n private length = 0;\n private dirty = false;\n private queue: Promise<unknown> = Promise.resolve();\n\n private writeBack: ReturnType<typeof setTimeout> | undefined;\n\n private writeBackCost = 0;\n\n opens = 0;\n\n private missing = false;\n\n private readonly fs: VfsFileFs;\n\n path: string;\n\n orphaned: boolean;\n\n constructor(\n fs: VfsFileFs,\n\n path: string,\n\n contents?: Uint8Array,\n\n orphaned: boolean = false,\n\n dirty = false\n ) {\n this.fs = fs;\n\n this.path = path;\n\n this.orphaned = orphaned;\n if (contents !== undefined) this.data = new Uint8Array(contents);\n else if (orphaned) this.data = new Uint8Array(0);\n this.length = this.data?.length ?? 0;\n if (dirty && contents !== undefined) this.markDirty();\n }\n\n serial<T>(op: () => Promise<T>): Promise<T> {\n const next = this.queue.then(op);\n this.queue = next.catch(() => undefined);\n return next;\n }\n\n async load(): Promise<Uint8Array> {\n if (!this.data) {\n try {\n this.data = await this.fs.readFileBuffer(this.path);\n } catch (err) {\n if (!isMissing(err)) throw err;\n this.data = new Uint8Array(0);\n this.missing = true;\n }\n this.length = this.data.length;\n }\n return this.data;\n }\n\n replace(contents: Uint8Array): void {\n this.data = new Uint8Array(contents);\n this.length = this.data.length;\n this.missing = false;\n this.markDirty();\n }\n\n async materialize(): Promise<void> {\n await this.load();\n if (!this.missing || this.orphaned) return;\n this.missing = false;\n await this.fs.writeFile(this.path, this.data?.slice(0, this.length) ?? new Uint8Array(0));\n }\n\n async size(): Promise<number> {\n await this.load();\n return this.length;\n }\n\n async pread(max: number, at: number): Promise<Uint8Array> {\n const bytes = await this.load();\n const n = Math.max(0, Math.min(max, this.length - at));\n return bytes.slice(at, at + n);\n }\n\n async pwrite(bytes: Uint8Array, at: number): Promise<number> {\n await this.load();\n const buf = this.ensure(at + bytes.length);\n if (at > this.length) buf.fill(0, this.length, at);\n buf.set(bytes, at);\n this.length = Math.max(this.length, at + bytes.length);\n this.markDirty();\n return bytes.length;\n }\n\n async truncate(size: number): Promise<void> {\n await this.load();\n const buf = this.ensure(size);\n if (size > this.length) buf.fill(0, this.length, size);\n this.length = size;\n this.markDirty();\n }\n\n private markDirty(): void {\n this.dirty = true;\n if (this.writeBack !== undefined || this.orphaned) return;\n const delay = Math.max(WRITEBACK_MS, this.writeBackCost * WRITEBACK_COST_FACTOR);\n this.writeBack = setTimeout(() => {\n this.writeBack = undefined;\n this.serial(() => this.flush()).catch(() => undefined);\n }, delay);\n }\n\n private ensure(need: number): Uint8Array {\n const cur = this.data ?? new Uint8Array(0);\n if (cur.length >= need) return cur;\n const grown = new Uint8Array(Math.max(need, cur.length * 2, 256));\n grown.set(cur.subarray(0, this.length));\n this.data = grown;\n return grown;\n }\n\n async flush(): Promise<void> {\n if (!this.dirty || !this.data || this.orphaned) return;\n this.dirty = false;\n const started = performance.now();\n try {\n await this.fs.writeFile(this.path, this.data.slice(0, this.length));\n } catch (err) {\n this.dirty = true;\n throw err;\n }\n this.writeBackCost = performance.now() - started;\n }\n}\n\nexport class VfsNodes {\n private readonly byPath = new Map<string, VfsNode>();\n\n private readonly fs: VfsFileFs;\n\n constructor(fs: VfsFileFs) {\n this.fs = fs;\n }\n\n open(path: string): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path);\n this.byPath.set(path, node);\n }\n node.opens++;\n return node;\n }\n\n adopt(path: string, contents: Uint8Array, dirty: boolean): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path, contents, false, dirty);\n this.byPath.set(path, node);\n } else if (dirty) {\n node.replace(contents);\n }\n node.opens++;\n return node;\n }\n\n closed(node: VfsNode): void {\n node.opens--;\n if (node.opens === 0 && this.byPath.get(node.path) === node) this.byPath.delete(node.path);\n }\n\n async flush(path: string): Promise<void> {\n for (const [p, node] of this.byPath) if (within(p, path)) await node.serial(() => node.flush());\n }\n\n async unlinking(path: string): Promise<void> {\n const node = this.byPath.get(path);\n if (node) await node.serial(() => node.load());\n }\n\n unlinked(path: string): void {\n const node = this.byPath.get(path);\n if (!node) return;\n node.orphaned = true;\n this.byPath.delete(path);\n }\n\n renamed(from: string, to: string): void {\n if (from === to) return;\n const moved: VfsNode[] = [];\n for (const [p, node] of this.byPath) {\n if (within(p, from)) moved.push(node);\n else if (within(p, to)) {\n node.orphaned = true;\n this.byPath.delete(p);\n }\n }\n for (const node of moved) {\n this.byPath.delete(node.path);\n node.path = to + node.path.slice(from.length);\n this.byPath.set(node.path, node);\n }\n }\n}\n\nexport function vfsFile(fs: VfsFileFs, opts: VfsFileOptions, nodes?: VfsNodes): OpenFile {\n const access = opts.flags & O_ACCMODE;\n const readable = access !== O_WRONLY;\n const writable = access === O_WRONLY || access === O_RDWR;\n\n const node =\n !nodes || opts.orphan\n ? new VfsNode(fs, opts.path, opts.contents, opts.orphan === true, opts.dirty === true)\n : opts.contents !== undefined\n ? nodes.adopt(opts.path, opts.contents, opts.dirty === true)\n : nodes.open(opts.path);\n\n let openError: { err: unknown } | undefined;\n const atOpen = (op: () => Promise<void>): void => {\n void node.serial(op).catch((err: unknown) => {\n openError ??= { err };\n });\n };\n if (opts.create) atOpen(() => node.materialize());\n if (opts.truncate) atOpen(() => node.truncate(0));\n const takeOpenError = (): void => {\n if (!openError) return;\n const { err } = openError;\n openError = undefined;\n throw err;\n };\n let offset = opts.position;\n const serial = <T>(op: () => Promise<T>) =>\n node.serial(() => {\n takeOpenError();\n return op();\n });\n\n return new OpenFile({\n read: readable\n ? (max) =>\n serial(async () => {\n const out = await node.pread(max, offset);\n offset += out.length;\n return out;\n })\n : undefined,\n write: writable\n ? (bytes) =>\n serial(async () => {\n if (opts.flags & O_APPEND) offset = await node.size();\n offset += await node.pwrite(bytes, offset);\n return bytes.length;\n })\n : undefined,\n seek: (to, whence) =>\n serial(async () => {\n let base = 0;\n if (whence === SEEK_CUR) base = offset;\n else if (whence === SEEK_END) base = await node.size();\n else if (whence !== SEEK_SET) throw new KernelError('EINVAL');\n if (base + to < 0) throw new KernelError('EINVAL');\n offset = base + to;\n return offset;\n }),\n pread: (max, at) =>\n serial(() => {\n if (!readable) throw new KernelError('EBADF');\n return node.pread(max, at);\n }),\n pwrite: (bytes, at) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.pwrite(bytes, at);\n }),\n resize: (size) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.truncate(size);\n }),\n stat: () =>\n serial(async () => ({\n path: node.path,\n size: await node.size(),\n ...(node.orphaned ? { orphan: true as const } : {}),\n })),\n flush: () => serial(() => node.flush()),\n\n close: () =>\n node.serial(async () => {\n try {\n takeOpenError();\n await node.flush();\n } finally {\n nodes?.closed(node);\n }\n }),\n });\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n type ChildForker,\n type ChildSpawner,\n type ChildStdio,\n ChildTable,\n type InheritedSlot,\n SpawnError,\n} from './children.ts';\nimport {\n type FdTable,\n type HeldMeta,\n heldFile,\n KernelError,\n type KernelFdKind,\n kernelFdKind,\n type OpenFile,\n openPipe,\n pollFile,\n} from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport type { ForkState } from './protocol.ts';\nimport { PTY_OPS, type PtySyscall, type PtyTable, ptySyscall } from './pty.ts';\nimport { selectFds } from './select.ts';\nimport { type DefaultAction, defaultAction, isSignal, SIG, sigbit } from './signals.ts';\nimport type { KernelTty, Termios } from './tty.ts';\nimport { type VfsFileFs, VfsNodes, vfsFile } from './vfs-file.ts';\n\nexport type WasmSyscall =\n | {\n op: 'fd-read';\n fd: number;\n max: number;\n\n nonblock?: boolean;\n\n peek?: boolean;\n }\n | { op: 'fd-write'; fd: number; body: Uint8Array; nonblock?: boolean }\n | { op: 'fd-close'; fd: number }\n | { op: 'fd-pipe' }\n | { op: 'fd-poll'; fd: number }\n | {\n op: 'fd-open-vfs';\n path: string;\n flags: number;\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n }\n | { op: 'fd-pread'; fd: number; offset: number; max: number }\n | { op: 'fd-pwrite'; fd: number; offset: number; body: Uint8Array }\n | { op: 'fd-resize'; fd: number; size: number }\n | { op: 'fd-vfs-stat'; fd: number }\n | { op: 'fd-path-flush'; path: string }\n | { op: 'fd-path-unlinking'; path: string }\n | { op: 'fd-path-unlinked'; path: string }\n | { op: 'fd-path-renamed'; from: string; to: string }\n | { op: 'fd-seek'; fd: number; offset: number; whence: number }\n | { op: 'fd-select'; read: number[]; write: number[]; timeoutMs: number }\n | { op: 'fd-info'; fd: number }\n | { op: 'fd-dup'; fd: number; min?: number }\n | { op: 'fd-reserve'; fd?: number; min?: number; meta?: HeldMeta }\n | { op: 'fd-meta'; fd: number; meta: HeldMeta }\n | { op: 'fd-setfl'; fd: number; flags: number }\n | { op: 'fd-cloexec'; fd: number; on: boolean }\n | { op: 'fd-list' }\n | {\n op: 'proc-alarm';\n sig: number;\n ms: number;\n firstMs?: number;\n repeat: boolean;\n\n timer?: number;\n }\n | { op: 'fd-renumber'; from: number; to: number; keep?: boolean }\n | {\n op: 'fd-promote';\n fd: number;\n share?: number;\n path?: string;\n flags?: number;\n position?: number;\n contents?: Uint8Array;\n orphan?: boolean;\n\n dirty?: boolean;\n }\n | { op: 'fd-open-tty'; name?: string }\n | { op: 'tty-get'; fd: number }\n | { op: 'tty-set'; fd: number; termios: Termios }\n | { op: 'tty-winsz'; fd: number }\n | { op: 'fd-flush'; fd: number }\n | {\n op: 'proc-spawn';\n file: string;\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n stdio: ChildStdio[];\n\n inherit?: InheritedSlot[];\n }\n | {\n op: 'proc-wait';\n pid: number;\n nohang: boolean;\n\n untraced?: boolean;\n continued?: boolean;\n }\n | { op: 'proc-captured'; pid: number; slot: number }\n | { op: 'proc-fork'; state: ForkState }\n | { op: 'proc-kill'; pid: number; sig: number }\n | { op: 'proc-exec'; pid: number }\n | { op: 'proc-setpgid'; pid: number; pgid: number }\n | { op: 'proc-getpgid'; pid: number }\n | { op: 'proc-getsid'; pid: number }\n | { op: 'proc-setsid' }\n | { op: 'tty-pgrp-get'; fd: number }\n | { op: 'tty-pgrp-set'; fd: number; pgrp: number }\n | { op: 'sig-mask'; caught: number; ignored: number }\n | { op: 'sig-pause' }\n | PtySyscall;\n\ntype FdSyscall = Extract<WasmSyscall, { op: `fd-${string}` }>;\n\ntype JobSyscall = Extract<\n WasmSyscall,\n { op: 'proc-setpgid' | 'proc-getpgid' | 'proc-getsid' | 'proc-setsid' }\n>;\n\nconst JOB_OPS: ReadonlySet<string> = new Set([\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n]);\n\nfunction isJobSyscall(req: WasmSyscall): req is JobSyscall {\n return JOB_OPS.has(req.op);\n}\n\nfunction isPtySyscall(req: WasmSyscall): req is PtySyscall {\n return req.op.startsWith('pty-');\n}\n\ntype VfsSyscall = Extract<\n FdSyscall,\n {\n op:\n | 'fd-pread'\n | 'fd-pwrite'\n | 'fd-resize'\n | 'fd-vfs-stat'\n | 'fd-path-flush'\n | 'fd-path-unlinking'\n | 'fd-path-unlinked'\n | 'fd-path-renamed';\n }\n>;\n\nfunction isVfsSyscall(req: FdSyscall): req is VfsSyscall {\n return (\n req.op.startsWith('fd-path-') ||\n req.op === 'fd-pread' ||\n req.op === 'fd-pwrite' ||\n req.op === 'fd-resize' ||\n req.op === 'fd-vfs-stat'\n );\n}\n\nfunction isFdSyscall(req: WasmSyscall): req is FdSyscall {\n return req.op.startsWith('fd-');\n}\n\nfunction isTtySyscall(req: WasmSyscall): req is TtySyscall {\n return req.op.startsWith('tty-');\n}\n\nexport interface FdInfo {\n tty: boolean;\n kind: KernelFdKind;\n meta?: HeldMeta;\n flags?: number;\n cloexec?: true;\n\n name?: string;\n}\n\nconst SYSCALL_OPS: ReadonlySet<string> = new Set([\n 'fd-read',\n 'fd-write',\n 'fd-close',\n 'fd-pipe',\n 'fd-poll',\n 'fd-open-vfs',\n 'fd-seek',\n 'fd-pread',\n 'fd-pwrite',\n 'fd-resize',\n 'fd-vfs-stat',\n 'fd-path-flush',\n 'fd-path-unlinking',\n 'fd-path-unlinked',\n 'fd-path-renamed',\n 'fd-select',\n 'fd-info',\n 'fd-dup',\n 'fd-reserve',\n 'fd-meta',\n 'fd-setfl',\n 'fd-cloexec',\n 'fd-list',\n 'proc-alarm',\n 'fd-renumber',\n 'fd-promote',\n 'fd-open-tty',\n 'tty-get',\n 'tty-set',\n 'tty-winsz',\n 'fd-flush',\n 'proc-spawn',\n 'proc-wait',\n 'proc-captured',\n 'proc-fork',\n 'proc-kill',\n 'proc-exec',\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n 'tty-pgrp-get',\n 'tty-pgrp-set',\n 'sig-mask',\n 'sig-pause',\n ...PTY_OPS,\n]);\n\ntype TtySyscall = Extract<WasmSyscall, { op: `tty-${string}` }>;\n\nexport function isWasmSyscall(req: object): req is WasmSyscall {\n const op = (req as { op?: unknown }).op;\n return typeof op === 'string' && SYSCALL_OPS.has(op);\n}\n\nconst MAX_READ = 1024 * 1024;\n\nexport interface WasmProcessOptions {\n spawner?: ChildSpawner;\n\n forker?: ChildForker;\n\n fs: VfsFileFs;\n\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n\n onPending?: (sig: number) => void;\n\n onTimer?: (which: number) => void;\n\n hasPending?: () => boolean;\n\n raise?: (sig: number) => void;\n\n onReap?: (pid: number) => void;\n\n jobs?: JobTable;\n\n ptys?: PtyTable;\n}\n\nexport type StateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport type SignalOutcome = DefaultAction | 'deliver' | 'forward';\n\nexport class WasmProcess {\n private exited = false;\n private readonly children: ChildTable;\n\n private caught = 0;\n private ignored = 0;\n\n private interrupt = new AbortController();\n\n private execChild: number | undefined;\n\n execTermsig: number | undefined;\n\n private stopped = 0;\n\n private stops = 0;\n private resumed: Promise<void> = Promise.resolve();\n private wake: (() => void) | undefined;\n private readonly stateListeners: StateListener[] = [];\n\n private readonly nodes: VfsNodes;\n\n readonly pid: number;\n\n readonly fds: FdTable;\n\n private readonly options: WasmProcessOptions;\n\n constructor(\n pid: number,\n\n fds: FdTable,\n\n options: WasmProcessOptions\n ) {\n this.pid = pid;\n\n this.fds = fds;\n\n this.options = options;\n this.children = new ChildTable(fds, options.spawner, options.forker);\n this.nodes = new VfsNodes(options.fs);\n this.children.onChildState = () => this.signal(SIG.CHLD);\n this.children.onReap = options.onReap;\n }\n\n signal(sig: number): SignalOutcome {\n if (this.execChild !== undefined) {\n void Promise.resolve(this.options.kill?.(this.execChild, sig)).catch(() => undefined);\n return sig === SIG.KILL ? 'terminate' : 'forward';\n }\n if (sig === SIG.KILL) return 'terminate';\n\n if (sig === SIG.CONT) this.cont();\n if (sig === SIG.STOP) return this.stop(sig);\n const bit = sigbit(sig);\n if (this.ignored & bit) return 'ignore';\n if (!(this.caught & bit)) {\n const action = defaultAction(sig);\n return action === 'stop' ? this.stop(sig) : action;\n }\n this.options.onPending?.(sig);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n return 'deliver';\n }\n\n onState(listener: StateListener): void {\n this.stateListeners.push(listener);\n }\n\n private stop(sig: number): 'stop' {\n if (this.stopped) return 'stop';\n this.stopped = sig;\n this.stops++;\n this.resumed = new Promise((resolve) => (this.wake = resolve));\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n for (const listener of this.stateListeners) listener('stopped', sig);\n return 'stop';\n }\n\n private cont(): void {\n if (!this.stopped) return;\n this.stopped = 0;\n this.wake?.();\n for (const listener of this.stateListeners) listener('continued', SIG.CONT);\n }\n\n async syscall(req: WasmSyscall): Promise<SyncFsResult> {\n for (;;) {\n await this.resumed;\n const stops = this.stops;\n const result = await this.dispatch(req);\n\n const restart = !result.ok && result.errno === 'EINTR' && this.stops !== stops;\n if (restart && !this.options.hasPending?.()) continue;\n\n await this.resumed;\n return result;\n }\n }\n\n private async dispatch(req: WasmSyscall): Promise<SyncFsResult> {\n try {\n if (isFdSyscall(req)) return await this.fdSyscall(req);\n if (isTtySyscall(req)) return this.ttySyscall(req);\n if (isJobSyscall(req)) return this.jobSyscall(req);\n if (isPtySyscall(req)) {\n const { ptys, jobs } = this.options;\n return ptySyscall(req, { pid: this.pid, fds: this.fds, ptys, jobs });\n }\n return await this.procSyscall(req);\n } catch (e) {\n if (e instanceof KernelError || e instanceof SpawnError) {\n return { ok: false, errno: e.code, message: e.code };\n }\n throw e;\n }\n }\n\n private blockingSignal(): AbortSignal {\n if (this.options.hasPending?.()) throw new KernelError('EINTR');\n return this.interrupt.signal;\n }\n\n private async read(req: Extract<WasmSyscall, { op: 'fd-read' }>): Promise<Uint8Array> {\n const file = this.fds.get(req.fd).file;\n const read = req.peek ? file.peek : file.read;\n if (!read) throw new KernelError(req.peek && file.read ? 'EOPNOTSUPP' : 'EBADF');\n if (file.tty) this.checkForeground(file.tty);\n\n if (req.max <= 0) return new Uint8Array(0);\n const ready = pollFile(file).readable;\n if (!ready && req.nonblock) throw new KernelError('EAGAIN');\n const signal = ready ? this.interrupt.signal : this.blockingSignal();\n return read.call(file, Math.max(0, Math.min(req.max, MAX_READ)), signal);\n }\n\n private async write(fd: number, body: Uint8Array, nonblock = false): Promise<number> {\n const file = this.fds.get(fd).file;\n if (!file.write) throw new KernelError('EBADF');\n if (!pollFile(file).writable) {\n if (nonblock) throw new KernelError('EAGAIN');\n return file.write(body, this.blockingSignal());\n }\n\n if (nonblock) return file.write(body, AbortSignal.abort());\n\n return file.write(\n body,\n this.options.hasPending?.() ? AbortSignal.abort() : this.interrupt.signal\n );\n }\n\n private openVfsFile(req: Extract<FdSyscall, { op: 'fd-open-vfs' }>): OpenFile {\n return vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags,\n position: req.position,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.truncate ? { truncate: true } : {}),\n ...(req.create ? { create: true } : {}),\n },\n this.nodes\n );\n }\n\n private async fdSyscall(req: FdSyscall): Promise<SyncFsResult> {\n if (isVfsSyscall(req)) return this.vfsSyscall(req);\n switch (req.op) {\n case 'fd-read':\n return { ok: true, kind: 'bytes', bytes: await this.read(req) };\n case 'fd-write':\n return { ok: true, kind: 'json', json: await this.write(req.fd, req.body, req.nonblock) };\n case 'fd-close':\n await Promise.resolve(this.fds.close(req.fd));\n return { ok: true, kind: 'void' };\n case 'fd-pipe': {\n const pipe = openPipe();\n const read = this.fds.install(pipe.read, 3);\n let write: number;\n try {\n write = this.fds.install(pipe.write, 3);\n } catch (e) {\n await Promise.resolve(this.fds.close(read));\n throw e;\n }\n return { ok: true, kind: 'json', json: [read, write] };\n }\n case 'fd-poll':\n return { ok: true, kind: 'json', json: pollFile(this.fds.get(req.fd).file) };\n case 'fd-open-vfs':\n return { ok: true, kind: 'json', json: this.fds.install(this.openVfsFile(req), 3) };\n case 'fd-info':\n return { ok: true, kind: 'json', json: this.fdInfo(req.fd) };\n case 'fd-list':\n return {\n ok: true,\n kind: 'json',\n json: this.fds.numbers().map((fd) => ({ fd, ...this.fdInfo(fd) })),\n };\n case 'fd-meta': {\n const file = this.fds.get(req.fd).file;\n if (!file.held) throw new KernelError('EBADF');\n file.heldMeta = req.meta;\n return { ok: true, kind: 'void' };\n }\n case 'fd-setfl':\n this.fds.setStatusFlags(req.fd, req.flags);\n return { ok: true, kind: 'void' };\n case 'fd-cloexec':\n if (req.on) this.fds.setCloseOnExec(req.fd);\n else this.fds.clearCloseOnExec(req.fd);\n return { ok: true, kind: 'void' };\n case 'fd-dup':\n return { ok: true, kind: 'json', json: this.fds.dup(req.fd, req.min ?? 3) };\n case 'fd-reserve':\n return { ok: true, kind: 'json', json: this.reserve(req.fd, req.min, req.meta) };\n case 'fd-promote':\n this.promote(req);\n return { ok: true, kind: 'void' };\n case 'fd-renumber':\n if (req.from !== req.to) {\n this.fds.dup2(req.from, req.to);\n if (!req.keep) await Promise.resolve(this.fds.close(req.from));\n }\n return { ok: true, kind: 'void' };\n case 'fd-open-tty': {\n const tty =\n req.name === undefined\n ? this.controllingTerminal()\n : this.options.jobs?.terminalNamed(req.name);\n if (!tty) throw new KernelError('ENXIO');\n return { ok: true, kind: 'json', json: this.fds.install(tty.file(), 3) };\n }\n case 'fd-select': {\n const { read, write, timeoutMs } = req;\n const signal = this.blockingSignal();\n const selected = await selectFds(this.fds, read, write, timeoutMs, signal);\n return { ok: true, kind: 'json', json: selected };\n }\n case 'fd-seek': {\n const file = this.fds.get(req.fd).file;\n if (!file.seek) throw new KernelError('ESPIPE');\n return { ok: true, kind: 'json', json: await file.seek(req.offset, req.whence) };\n }\n case 'fd-flush': {\n const file = this.fds.get(req.fd).file;\n if (file.flush) await file.flush();\n return { ok: true, kind: 'void' };\n }\n }\n }\n\n private async vfsSyscall(req: VfsSyscall): Promise<SyncFsResult> {\n if ('path' in req || 'from' in req) {\n const nodes = this.nodes;\n if (req.op === 'fd-path-flush') await nodes.flush(req.path);\n else if (req.op === 'fd-path-unlinking') await nodes.unlinking(req.path);\n else if (req.op === 'fd-path-unlinked') nodes.unlinked(req.path);\n else if (req.op === 'fd-path-renamed') nodes.renamed(req.from, req.to);\n return { ok: true, kind: 'void' };\n }\n const file = this.fds.get(req.fd).file;\n if (!file.pread || !file.pwrite || !file.resize || !file.stat) throw new KernelError('ESPIPE');\n switch (req.op) {\n case 'fd-pread':\n return {\n ok: true,\n kind: 'bytes',\n bytes: await file.pread(Math.min(req.max, MAX_READ), req.offset),\n };\n case 'fd-pwrite':\n return { ok: true, kind: 'json', json: await file.pwrite(req.body, req.offset) };\n case 'fd-resize':\n await file.resize(req.size);\n return { ok: true, kind: 'void' };\n case 'fd-vfs-stat':\n return { ok: true, kind: 'json', json: await file.stat() };\n }\n }\n\n private promote(req: Extract<WasmSyscall, { op: 'fd-promote' }>): void {\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n if (req.share !== undefined) {\n this.fds.dup2(req.share, req.fd);\n return;\n }\n if (req.path === undefined) throw new KernelError('EINVAL');\n const file = vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags ?? 0,\n position: req.position ?? 0,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.dirty ? { dirty: true } : {}),\n },\n this.nodes\n );\n this.fds.installAt(req.fd, file);\n }\n\n private reserve(fd: number | undefined, min = 3, meta?: HeldMeta): number {\n if (fd === undefined) return this.fds.install(heldFile(meta), Math.max(3, min));\n if (this.fds.has(fd)) throw new KernelError('EBADF');\n this.fds.installAt(fd, heldFile(meta));\n return fd;\n }\n\n private fdInfo(fd: number): FdInfo {\n const file = this.fds.get(fd).file;\n const flags = this.fds.statusFlags(fd);\n return {\n tty: file.tty !== undefined,\n kind: kernelFdKind(file),\n ...(file.heldMeta ? { meta: file.heldMeta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(this.fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(file.tty?.name ? { name: file.tty.name } : file.pty ? { name: '/dev/ptmx' } : {}),\n };\n }\n\n private ttySyscall(req: TtySyscall): SyncFsResult {\n const tty = this.tty(req.fd);\n const jobs = this.options.jobs;\n switch (req.op) {\n case 'tty-get':\n return { ok: true, kind: 'json', json: tty.tcgets() };\n case 'tty-set':\n tty.tcsets(req.termios);\n return { ok: true, kind: 'void' };\n case 'tty-winsz':\n return { ok: true, kind: 'json', json: tty.winsize() };\n case 'tty-pgrp-get':\n return { ok: true, kind: 'json', json: jobs ? jobs.tcgetpgrp(tty, this.sid()) : this.pid };\n case 'tty-pgrp-set':\n if (jobs) jobs.tcsetpgrp(this.pid, tty, req.pgrp);\n else if (req.pgrp !== this.pid) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n }\n }\n\n private checkForeground(tty: KernelTty): void {\n const jobs = this.options.jobs;\n if (!jobs) return;\n const session = jobs.controllingTerminal(this.pid);\n if (session !== undefined && session !== tty) return;\n const pgid = this.pgid();\n if (jobs.tcgetpgrp(tty, this.sid()) === pgid) return;\n if (this.ignored & sigbit(SIG.TTIN)) throw new KernelError('EIO');\n jobs.killGroup(pgid, SIG.TTIN);\n throw new KernelError('EINTR');\n }\n\n private waitGroup(pid: number): ((child: number) => boolean) | undefined {\n const jobs = this.options.jobs;\n if (!jobs || pid > 0 || pid === -1) return undefined;\n const group = pid === 0 ? this.pgid() : -pid;\n\n return (child) => (jobs.pgidOf(child) ?? this.pgid()) === group;\n }\n\n private pgid(): number {\n return this.options.jobs?.getpgid(this.pid, 0) ?? this.pid;\n }\n\n private sid(): number {\n return this.options.jobs?.getsid(this.pid, 0) ?? this.pid;\n }\n\n private controllingTerminal(): KernelTty | undefined {\n const session = this.options.jobs?.controllingTerminal(this.pid);\n return session === undefined ? this.fds.stdioTerminal() : (session ?? undefined);\n }\n\n private jobSyscall(req: JobSyscall): SyncFsResult {\n const jobs = this.options.jobs;\n const self = (pid: number): number => {\n if (pid !== 0 && pid !== this.pid) throw new KernelError('ESRCH');\n return this.pid;\n };\n switch (req.op) {\n case 'proc-setpgid':\n if (jobs) jobs.setpgid(this.pid, req.pid, req.pgid);\n else if (self(req.pid) !== (req.pgid || this.pid)) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n case 'proc-getpgid':\n return { ok: true, kind: 'json', json: jobs?.getpgid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-getsid':\n return { ok: true, kind: 'json', json: jobs?.getsid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-setsid':\n if (!jobs) throw new KernelError('EPERM');\n return { ok: true, kind: 'json', json: jobs.setsid(this.pid) };\n }\n }\n\n private tty(fd: number): KernelTty {\n const file = this.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n }\n\n private async procSyscall(\n req: Exclude<WasmSyscall, FdSyscall | TtySyscall | JobSyscall | PtySyscall>\n ): Promise<SyncFsResult> {\n switch (req.op) {\n case 'proc-fork':\n return { ok: true, kind: 'json', json: await this.children.fork(req.state) };\n case 'proc-spawn': {\n const { file, argv, env, cwd, stdio, inherit } = req;\n const pid = await this.children.spawn({ file, argv, env, cwd }, stdio, inherit);\n return { ok: true, kind: 'json', json: pid };\n }\n case 'proc-wait': {\n const signal = req.nohang ? this.interrupt.signal : this.blockingSignal();\n const flags = {\n untraced: req.untraced,\n continued: req.continued,\n inGroup: this.waitGroup(req.pid),\n };\n const waited = await this.children.wait(req.pid, req.nohang, signal, flags);\n return { ok: true, kind: 'json', json: waited };\n }\n case 'proc-exec': {\n this.execChild = req.pid;\n this.options.jobs?.exec(this.pid, req.pid);\n\n this.children.watch(req.pid, (state, sig) =>\n state === 'stopped' ? this.stop(sig) : this.cont()\n );\n\n await this.fds.closeAll();\n try {\n const waited = await this.children.wait(req.pid, false);\n const termsig = waited[1] & 0x7f;\n if (termsig) this.execTermsig = termsig;\n return { ok: true, kind: 'json', json: waited };\n } finally {\n this.execChild = undefined;\n }\n }\n case 'proc-kill':\n if (req.sig !== 0 && !isSignal(req.sig)) throw new KernelError('EINVAL');\n\n if (!(await this.options.kill?.(req.pid === 0 ? -this.pgid() : req.pid, req.sig))) {\n throw new KernelError('ESRCH');\n }\n return { ok: true, kind: 'void' };\n case 'proc-alarm':\n this.setAlarm(req.sig, req.firstMs ?? req.ms, req.repeat ? req.ms : 0, req.timer);\n return { ok: true, kind: 'void' };\n case 'sig-mask':\n this.caught = req.caught;\n this.ignored = req.ignored;\n return { ok: true, kind: 'void' };\n case 'sig-pause':\n return this.pause();\n case 'proc-captured':\n return { ok: true, kind: 'bytes', bytes: this.children.captured(req.pid, req.slot) };\n }\n }\n\n private pause(): Promise<never> {\n const signal = this.blockingSignal();\n return new Promise<never>((_, reject) => {\n signal.addEventListener('abort', () => reject(new KernelError('EINTR')), { once: true });\n });\n }\n\n private alarm: ReturnType<typeof setTimeout> | undefined;\n private alarmEvery: ReturnType<typeof setInterval> | undefined;\n\n private setAlarm(sig: number, first: number, every: number, timer?: number): void {\n if (!isSignal(sig)) throw new KernelError('EINVAL');\n this.clearAlarm();\n if (first <= 0) return;\n const fire =\n timer === undefined ? () => this.options.raise?.(sig) : () => this.timerExpired(timer);\n this.alarm = setTimeout(() => {\n this.alarm = undefined;\n fire();\n if (every > 0) this.alarmEvery = setInterval(fire, every);\n }, first);\n }\n\n private timerExpired(which: number): void {\n this.options.onTimer?.(which);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n }\n\n private clearAlarm(): void {\n clearTimeout(this.alarm);\n clearInterval(this.alarmEvery);\n this.alarm = undefined;\n this.alarmEvery = undefined;\n }\n\n async exit(): Promise<void> {\n if (this.exited) return;\n this.exited = true;\n this.clearAlarm();\n for (const pid of this.children.pids()) this.options.onReap?.(pid);\n await this.fds.closeAll();\n }\n}\n", "import type { DeviceMeta, KernelFdKind } from './fd-table.ts';\n\nexport const WASM_PROCESS_INIT = 'wasm-process-init';\nexport const WASM_PROCESS_EXIT = 'wasm-process-exit';\nexport const WASM_PROCESS_ERROR = 'wasm-process-error';\n\nexport interface WasmProgram {\n glue: string;\n module: WebAssembly.Module;\n}\n\nexport interface ForkState {\n memory: Uint8Array;\n currData: number;\n forkSp: number;\n callStackNames: Array<[number, string]>;\n ppid: number;\n streams?: ForkStream[];\n cwd?: string;\n}\n\nexport interface KernelStreamEntry {\n fd: number;\n kernel: number;\n kind: KernelFdKind;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport type ForkStream = KernelStreamEntry | { fd: number; path: string; flags: number };\n\nexport interface InheritedFd {\n fd: number;\n kind: KernelFdKind;\n device?: DeviceMeta;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport interface WasmProcessInitMsg {\n type: typeof WASM_PROCESS_INIT;\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n sab: SharedArrayBuffer;\n ppid?: number;\n fork?: ForkState;\n fds?: InheritedFd[];\n}\n\nexport interface WasmProcessExitMsg {\n type: typeof WASM_PROCESS_EXIT;\n code: number;\n}\n\nexport interface WasmProcessErrorMsg {\n type: typeof WASM_PROCESS_ERROR;\n message: string;\n}\n", "import { dispatchSyncFs } from '../realm/sync-fs-dispatch.ts';\nimport {\n mintSyncFsToken,\n revokeSyncFsToken,\n type SyncFsTokenEntry,\n} from '../realm/sync-fs-token-registry.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n attachSyncSabResponder,\n type SyncSabDispatchRequest,\n} from '../realm/sync-sab-responder.ts';\nimport {\n SAB_DEFAULT_WINDOW_BYTES,\n SAB_HEADER_BYTES,\n SAB_HEADER_I32,\n SAB_I_SIGNALS,\n SAB_I_TIMERS,\n} from '../realm/sync-sab-wire.ts';\nimport type { ChildForker, ChildSpawner } from './children.ts';\nimport { type FdTable, kernelFdKind, type OpenFile } from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport { isWasmSyscall, type StateListener, WasmProcess } from './process.ts';\nimport {\n type ForkState,\n type InheritedFd,\n WASM_PROCESS_ERROR,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_INIT,\n type WasmProcessInitMsg,\n type WasmProgram,\n} from './protocol.ts';\nimport type { PtyTable } from './pty.ts';\nimport { SIG, sigbit } from './signals.ts';\n\nexport interface WasmWorkerLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n terminate(): void;\n}\n\nexport interface SpawnWasmOptions {\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n fs: SyncFsTokenEntry['fs'];\n createWorker: () => WasmWorkerLike;\n onError?: (message: string) => void;\n spawner?: ChildSpawner;\n forker?: ChildForker;\n fork?: ForkState;\n ppid?: number;\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n jobs?: JobTable;\n ptys?: PtyTable;\n onReap?: (pid: number) => void;\n}\n\nexport interface WasmProcessHandle {\n pid: number;\n exited: Promise<number>;\n kill(code?: number): void;\n signal(sig: number): void;\n termsig(): number | undefined;\n onState(listener: StateListener): void;\n}\n\nconst CRASHED = 70;\n\nconst descIds = new WeakMap<OpenFile, number>();\nlet nextDescId = 1;\n\nfunction descId(file: OpenFile): number {\n const id = descIds.get(file) ?? nextDescId++;\n descIds.set(file, id);\n return id;\n}\n\nexport function inheritedFds(fds: FdTable): InheritedFd[] {\n return fds\n .numbers()\n .filter((fd) => fd > 2 && !fds.get(fd).file.held)\n .map((fd): InheritedFd => {\n const open = fds.get(fd);\n const flags = fds.statusFlags(fd);\n const kind = kernelFdKind(open.file);\n const meta = open.file.heldMeta;\n return {\n fd,\n kind,\n ...(kind === 'device' && meta && 'device' in meta ? { device: meta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(kind === 'stream' ? { desc: descId(open) } : {}),\n };\n });\n}\n\ninterface WorkerSays {\n type?: string;\n code?: unknown;\n message?: unknown;\n}\n\nexport function spawnWasmProcess(opts: SpawnWasmOptions): WasmProcessHandle {\n const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const header = new Int32Array(sab, 0, SAB_HEADER_I32);\n const process = new WasmProcess(opts.pid, opts.fds, {\n spawner: opts.spawner,\n forker: opts.forker,\n fs: opts.fs,\n kill: opts.kill,\n jobs: opts.jobs,\n ptys: opts.ptys,\n onReap: opts.onReap,\n onPending: (sig) => void Atomics.or(header, SAB_I_SIGNALS, sigbit(sig)),\n onTimer: (which) => void Atomics.or(header, SAB_I_TIMERS, 1 << which),\n hasPending: () =>\n Atomics.load(header, SAB_I_SIGNALS) !== 0 || Atomics.load(header, SAB_I_TIMERS) !== 0,\n raise: (sig) => signal(sig),\n });\n const token = mintSyncFsToken({ fs: opts.fs, cwd: opts.cwd });\n const worker = opts.createWorker();\n const dispatch = async (req: SyncSabDispatchRequest): Promise<SyncFsResult> => {\n if (isWasmSyscall(req)) return process.syscall(req);\n return dispatchSyncFs(req);\n };\n const responder = attachSyncSabResponder(worker, sab, token, { dispatch });\n\n let settle!: (code: number) => void;\n const exited = new Promise<number>((resolve) => (settle = resolve));\n let done = false;\n let endedBy: number | undefined;\n\n const finish = (code: number, sig?: number): void => {\n if (done) return;\n done = true;\n endedBy = sig ?? process.execTermsig;\n worker.removeEventListener('message', onMessage);\n worker.removeEventListener('error', onError);\n responder.dispose();\n revokeSyncFsToken(token);\n worker.terminate();\n void process.exit().then(\n () => settle(code),\n () => settle(code)\n );\n };\n\n const onMessage = (event: MessageEvent): void => {\n const data = event.data as WorkerSays | undefined;\n if (data?.type === WASM_PROCESS_EXIT) {\n finish(typeof data.code === 'number' ? data.code : CRASHED);\n } else if (data?.type === WASM_PROCESS_ERROR) {\n opts.onError?.(String(data.message));\n finish(CRASHED);\n }\n };\n const onError = (event: MessageEvent): void => {\n event.preventDefault();\n opts.onError?.(String((event as unknown as ErrorEvent).message ?? 'worker error'));\n finish(CRASHED);\n };\n worker.addEventListener('message', onMessage);\n worker.addEventListener('error', onError);\n\n const init: WasmProcessInitMsg = {\n type: WASM_PROCESS_INIT,\n pid: opts.pid,\n program: opts.program,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n ...(opts.fork ? { fork: opts.fork } : { fds: inheritedFds(opts.fds) }),\n };\n worker.postMessage(init, opts.fork ? [opts.fork.memory.buffer as ArrayBuffer] : []);\n\n const signal = (sig: number): void => {\n if (process.signal(sig) === 'terminate') finish(sig === SIG.KILL ? 137 : 128 + sig, sig);\n };\n const kill = (code = 137): void =>\n finish(code, code > 128 && code < 160 ? code - 128 : undefined);\n return {\n pid: opts.pid,\n exited,\n kill,\n signal,\n termsig: () => endedBy,\n onState: (listener) => process.onState(listener),\n };\n}\n", "import { KernelError } from './fd-table.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport interface JobMember {\n pid: number;\n pgid: number;\n sid: number;\n\n signal(sig: number): void;\n\n execParent?: number;\n\n ppid?: number;\n\n execed?: boolean;\n}\n\nexport class JobTable {\n private readonly members = new Map<number, JobMember>();\n private readonly foreground = new Map<KernelTty, number>();\n\n private readonly terminals = new Map<number, KernelTty>();\n\n add(\n pid: number,\n parentPid: number | undefined,\n signal: (sig: number) => void,\n terminal?: KernelTty\n ): JobMember {\n const parent = parentPid === undefined ? undefined : this.members.get(parentPid);\n if (!parent && terminal) this.terminals.set(pid, terminal);\n const member: JobMember = {\n pid,\n ppid: parent?.pid,\n pgid: parent?.pgid ?? pid,\n sid: parent?.sid ?? pid,\n signal,\n };\n this.members.set(pid, member);\n return member;\n }\n\n remove(pid: number): void {\n this.members.delete(pid);\n }\n\n exec(pid: number, child: number): void {\n const member = this.members.get(child);\n if (member) member.execParent = pid;\n const execer = this.members.get(pid);\n if (execer) execer.execed = true;\n }\n\n pgidOf(pid: number): number | undefined {\n return this.members.get(pid)?.pgid;\n }\n\n private member(pid: number): JobMember {\n const member = this.members.get(pid);\n if (!member) throw new KernelError('ESRCH');\n return member;\n }\n\n setpgid(caller: number, pid: number, pgid: number): void {\n const target = this.member(pid || caller);\n const group = pgid || target.pid;\n if (group < 0) throw new KernelError('EINVAL');\n const self = this.member(caller);\n if (target.pid !== caller) {\n if (target.ppid !== caller) throw new KernelError('ESRCH');\n if (target.execed) throw new KernelError('EACCES');\n }\n if (target.sid !== self.sid) throw new KernelError('EPERM');\n if (target.pid === target.sid) throw new KernelError('EPERM');\n\n const exists = [...this.members.values()].some((m) => m.pgid === group && m.sid === target.sid);\n if (group !== target.pid && !exists) throw new KernelError('EPERM');\n target.pgid = group;\n }\n\n getpgid(caller: number, pid: number): number {\n return this.member(pid || caller).pgid;\n }\n\n getsid(caller: number, pid: number): number {\n return this.member(pid || caller).sid;\n }\n\n setsid(pid: number): number {\n const member = this.member(pid);\n if (member.pgid === pid) throw new KernelError('EPERM');\n member.sid = pid;\n member.pgid = pid;\n this.terminals.delete(pid);\n return pid;\n }\n\n terminalNamed(name: string): KernelTty | undefined {\n const known = new Set([...this.terminals.values(), ...this.foreground.keys()]);\n return [...known].find((tty) => tty.name === name);\n }\n\n controllingTerminal(pid: number): KernelTty | null | undefined {\n const member = this.members.get(pid);\n return member && (this.terminals.get(member.sid) ?? null);\n }\n\n acquireTerminal(pid: number, tty: KernelTty): boolean {\n const member = this.members.get(pid);\n if (!member || member.sid !== pid || this.terminals.has(pid)) return false;\n if ([...this.terminals.values()].includes(tty)) return false;\n this.terminals.set(pid, tty);\n this.foreground.set(tty, member.pgid);\n return true;\n }\n\n killGroup(pgid: number, sig: number): boolean {\n const targets = [...this.members.values()].filter((m) => m.pgid === pgid);\n const pids = new Set(targets.map((m) => m.pid));\n if (sig !== 0) {\n for (const m of targets)\n if (m.execParent === undefined || !pids.has(m.execParent)) m.signal(sig);\n }\n return targets.length > 0;\n }\n\n tcgetpgrp(tty: KernelTty, fallback: number): number {\n return this.foreground.get(tty) ?? fallback;\n }\n\n tcsetpgrp(caller: number, tty: KernelTty, pgid: number): void {\n const self = this.member(caller);\n const inSession = [...this.members.values()].some((m) => m.pgid === pgid && m.sid === self.sid);\n if (!inSession) throw new KernelError('EPERM');\n this.foreground.set(tty, pgid);\n }\n\n signalOwnedForeground(tty: KernelTty, sig: number): void {\n const pgid = this.foreground.get(tty);\n if (pgid !== undefined) this.killGroup(pgid, sig);\n }\n\n signalForeground(tty: KernelTty, fallback: number, sig: number): void {\n this.killGroup(this.tcgetpgrp(tty, fallback), sig);\n }\n}\n", "import { type Command, scanCommands } from './commands.ts';\nimport { withCommandDirs } from './fs/commands.ts';\nimport type { KernelFs } from './fs/types.ts';\nimport {\n type ChildForker,\n type ChildHandle,\n type ChildSpawner,\n SpawnError,\n} from './kernel/children.ts';\nimport { bytesSource, FdTable, nullFile, sinkFile } from './kernel/fd-table.ts';\nimport { spawnWasmProcess, type WasmProcessHandle, type WasmWorkerLike } from './kernel/host.ts';\nimport { JobTable } from './kernel/jobs.ts';\nimport type { ForkState, WasmProgram } from './kernel/protocol.ts';\nimport { PtyTable } from './kernel/pty.ts';\n\nexport interface LauncherOptions {\n fs: KernelFs;\n createWorker: () => WasmWorkerLike;\n modules?: string;\n env?: Record<string, string>;\n}\n\nexport interface RunOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: Uint8Array;\n onStdout?: (bytes: Uint8Array) => void;\n onStderr?: (bytes: Uint8Array) => void;\n}\n\nexport interface RunResult {\n status: number;\n stdout: Uint8Array;\n stderr: Uint8Array;\n}\n\ninterface Target {\n glue: string;\n wasm: string;\n argv0: string;\n prefix?: string[];\n env?: Record<string, string>;\n}\n\ninterface Planned {\n target: Target;\n args: string[];\n}\n\ninterface StartRequest {\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n report: (message: string) => void;\n ppid?: number;\n fork?: ForkState;\n}\n\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst SHEBANG_MAX = 256;\nconst NOT_FOUND = 127;\nconst encoder = new TextEncoder();\n\nfunction baseName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction modulePath(glue: string): string {\n return glue.endsWith('.js') ? `${glue.slice(0, -3)}.wasm` : `${glue}.wasm`;\n}\n\nfunction targetOf(command: Command): Target {\n return {\n glue: command.glue,\n wasm: command.wasm,\n argv0: command.argv0,\n ...(command.args ? { prefix: command.args } : {}),\n ...(command.env ? { env: command.env } : {}),\n };\n}\n\nfunction childHandle(handle: WasmProcessHandle): ChildHandle {\n return {\n pid: handle.pid,\n exited: handle.exited,\n termsig: handle.termsig,\n onState: (listener) => handle.onState(listener),\n };\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, chunk) => n + chunk.length, 0));\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class Launcher {\n readonly fs: KernelFs;\n private readonly base: KernelFs;\n private readonly createWorker: () => WasmWorkerLike;\n private readonly modulesDir: string;\n private readonly env: Record<string, string>;\n private catalog: Promise<Map<string, Command>> | undefined;\n private readonly compiled = new Map<string, Promise<WebAssembly.Module>>();\n private readonly processes = new Map<number, WasmProcessHandle>();\n private readonly zombies = new Set<number>();\n private readonly orphans = new Set<number>();\n private readonly jobs = new JobTable();\n private readonly ptys = new PtyTable((tty, sig) => this.jobs.signalOwnedForeground(tty, sig));\n private nextPid = 1000;\n\n constructor(options: LauncherOptions) {\n this.base = options.fs;\n this.createWorker = options.createWorker;\n this.modulesDir = options.modules ?? '/node_modules';\n this.env = options.env ?? {};\n this.fs = withCommandDirs(options.fs, async () => new Set((await this.commands()).keys()));\n }\n\n commands(): Promise<Map<string, Command>> {\n this.catalog ??= scanCommands(this.base, this.modulesDir);\n return this.catalog;\n }\n\n async resolve(file: string, argv0: string, cwd: string): Promise<Target | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name !== undefined) {\n const command = (await this.commands()).get(name);\n return command && targetOf(command);\n }\n const glue = this.fs.resolvePath(cwd, file);\n const wasm = modulePath(glue);\n if (!(await this.base.exists(glue)) || !(await this.base.exists(wasm))) return undefined;\n return { glue, wasm, argv0: baseName(argv0 || file) };\n }\n\n private async interpreted(\n file: string,\n argv: string[],\n cwd: string\n ): Promise<Planned | undefined> {\n let head: Uint8Array;\n try {\n head = (await this.base.readFileBuffer(this.fs.resolvePath(cwd, file))).subarray(\n 0,\n SHEBANG_MAX\n );\n } catch {\n return undefined;\n }\n if (head[0] !== 0x23 || head[1] !== 0x21) return undefined;\n const words = new TextDecoder()\n .decode(head)\n .slice(2)\n .split('\\n')[0]\n .trim()\n .split(/[ \\t]+/);\n if (baseName(words[0]) === 'env') words.shift();\n const [interp, ...rest] = words;\n const target = interp ? await this.resolve(interp, interp, cwd) : undefined;\n if (!target) return undefined;\n const arg = rest.join(' ');\n return {\n target,\n args: [...(target.prefix ?? []), ...(arg ? [arg] : []), file, ...argv.slice(1)],\n };\n }\n\n private async plan(file: string, argv: string[], cwd: string): Promise<Planned | undefined> {\n const direct = await this.resolve(file, argv[0] ?? file, cwd);\n if (direct) return { target: direct, args: [...(direct.prefix ?? []), ...argv.slice(1)] };\n return this.interpreted(file, argv, cwd);\n }\n\n private module(path: string): Promise<WebAssembly.Module> {\n return this.base.stat(path).then((st) => {\n const key = `${path}:${st.size}:${st.mtime.getTime()}`;\n let module = this.compiled.get(key);\n if (!module) {\n module = this.base\n .readFileBuffer(path)\n .then((bytes) => WebAssembly.compile(bytes as BufferSource));\n this.compiled.set(key, module);\n module.catch(() => this.compiled.delete(key));\n }\n return module;\n });\n }\n\n private async launch(\n planned: Planned,\n req: Omit<StartRequest, 'program' | 'argv0' | 'args'>\n ): Promise<WasmProcessHandle> {\n const { target, args } = planned;\n let program: WasmProgram;\n try {\n const [glue, module] = await Promise.all([\n this.base.readFile(target.glue),\n this.module(target.wasm),\n ]);\n program = { glue, module };\n } catch (err) {\n await req.fds.closeAll();\n throw err;\n }\n return this.start({\n ...req,\n program,\n argv0: target.argv0,\n args,\n env: { ...target.env, ...req.env },\n });\n }\n\n private start(req: StartRequest): WasmProcessHandle {\n const pid = this.nextPid++;\n const terminal = req.fds.stdioTerminal();\n const handle = spawnWasmProcess({\n pid,\n program: req.program,\n argv0: req.argv0,\n args: req.args,\n env: req.env,\n cwd: req.cwd,\n fds: req.fds,\n fs: this.fs,\n createWorker: this.createWorker,\n onError: req.report,\n spawner: this.spawner(pid, req.report),\n forker: this.forker(pid, req),\n kill: (target, sig) => this.kill(target, sig),\n jobs: this.jobs,\n ptys: this.ptys,\n onReap: (child) => this.reaped(child),\n ...(req.fork ? { fork: req.fork } : {}),\n ...(req.ppid !== undefined ? { ppid: req.ppid } : {}),\n });\n this.processes.set(pid, handle);\n this.jobs.add(pid, req.ppid, (sig) => handle.signal(sig), terminal);\n void handle.exited.then(() => {\n this.processes.delete(pid);\n if (req.ppid === undefined || this.orphans.delete(pid)) this.jobs.remove(pid);\n else this.zombies.add(pid);\n });\n return handle;\n }\n\n private reaped(pid: number): void {\n if (this.zombies.delete(pid)) this.jobs.remove(pid);\n else this.orphans.add(pid);\n }\n\n private spawner(ppid: number, report: (message: string) => void): ChildSpawner {\n return async (req, fds) => {\n const planned = await this.plan(req.file, req.argv, req.cwd);\n if (!planned) {\n await fds.closeAll();\n throw new SpawnError('ENOENT');\n }\n const handle = await this.launch(planned, { env: req.env, cwd: req.cwd, fds, report, ppid });\n return childHandle(handle);\n };\n }\n\n private forker(ppid: number, parent: StartRequest): ChildForker {\n return async (state, fds) =>\n childHandle(this.start({ ...parent, cwd: state.cwd ?? parent.cwd, fds, ppid, fork: state }));\n }\n\n kill(pid: number, sig: number): boolean {\n if (pid < 0) return this.jobs.killGroup(-pid, sig);\n const handle = this.processes.get(pid);\n if (!handle) return false;\n if (sig !== 0) handle.signal(sig);\n return true;\n }\n\n async run(argv: string[], options: RunOptions = {}): Promise<RunResult> {\n this.catalog = undefined;\n const cwd = this.fs.resolvePath('/', options.cwd ?? '/');\n const env = { PATH: '/usr/bin:/bin', HOME: '/', ...this.env, PWD: cwd, ...options.env };\n const out: Uint8Array[] = [];\n const err: Uint8Array[] = [];\n const collect =\n (chunks: Uint8Array[], tee?: (bytes: Uint8Array) => void) => (bytes: Uint8Array) => {\n chunks.push(bytes);\n tee?.(bytes);\n };\n const stdout = collect(out, options.onStdout);\n const stderr = collect(err, options.onStderr);\n const report = (message: string) => stderr(encoder.encode(`${message}\\n`));\n const [file = ''] = argv;\n await this.base.mkdir(cwd, { recursive: true });\n const planned = await this.plan(file, argv, cwd);\n if (!planned) {\n report(`${file}: command not found`);\n return { status: NOT_FOUND, stdout: concat(out), stderr: concat(err) };\n }\n const fds = new FdTable();\n fds.installAt(0, options.stdin ? bytesSource(options.stdin) : nullFile());\n fds.installAt(1, sinkFile(stdout));\n fds.installAt(2, sinkFile(stderr));\n const handle = await this.launch(planned, { env, cwd, fds, report });\n const status = await handle.exited;\n return { status, stdout: concat(out), stderr: concat(err) };\n }\n}\n", "import { OpfsFs } from './fs/opfs.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport { Launcher, type RunOptions } from './launcher.ts';\n\nexport interface KernelPort {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface InitRequest {\n id: number;\n op: 'init';\n root?: FileSystemDirectoryHandle;\n modules?: string;\n env?: Record<string, string>;\n}\n\nexport interface RunRequest {\n id: number;\n op: 'run';\n argv: string[];\n options: Omit<RunOptions, 'onStdout' | 'onStderr'>;\n}\n\nexport type KernelRequest = InitRequest | RunRequest;\n\nexport type KernelCall = Omit<InitRequest, 'id'> | Omit<RunRequest, 'id'>;\n\nexport interface ServeDeps {\n storage: () => Promise<FileSystemDirectoryHandle>;\n createWorker: () => WasmWorkerLike;\n}\n\nexport function serveKernel(port: KernelPort, deps: ServeDeps): void {\n let launcher: Promise<Launcher> | undefined;\n const reply = (id: number, body: object) => port.postMessage({ id, ...body });\n\n async function handle(req: KernelRequest): Promise<unknown> {\n if (req.op === 'init') {\n launcher = (req.root ? Promise.resolve(req.root) : deps.storage()).then(\n (root) =>\n new Launcher({\n fs: new OpfsFs(root),\n createWorker: deps.createWorker,\n ...(req.modules ? { modules: req.modules } : {}),\n ...(req.env ? { env: req.env } : {}),\n })\n );\n await launcher;\n return true;\n }\n if (!launcher) throw new Error('the kernel is not initialized');\n return (await launcher).run(req.argv, {\n ...req.options,\n onStdout: (bytes) => reply(req.id, { fd: 1, bytes }),\n onStderr: (bytes) => reply(req.id, { fd: 2, bytes }),\n });\n }\n\n port.addEventListener('message', (event) => {\n const req = event.data as KernelRequest;\n handle(req).then(\n (result) => reply(req.id, { result }),\n (err) => reply(req.id, { error: err instanceof Error ? err.message : String(err) })\n );\n });\n}\n", "import type { WasmWorkerLike } from './kernel/host.ts';\nimport { type KernelPort, serveKernel } from './serve.ts';\n\nconst processWorker = new URL('./process-worker.js', import.meta.url);\n\nserveKernel(globalThis as unknown as KernelPort, {\n storage: () => navigator.storage.getDirectory(),\n createWorker: () => new Worker(processWorker, { type: 'module' }) as WasmWorkerLike,\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["S_IFDIR", "S_IFREG", "done", "encoder", "translate", "json", "done", "interrupted", "within", "ready", "done", "COMMAND", "encoder", "concat"]
|
|
3
|
+
"sources": ["../src/fs/types.ts", "../src/fs/opfs.ts", "../src/kernel/signals.ts", "../src/commands.ts", "../src/fs/commands.ts", "../src/kernel/pipe.ts", "../src/kernel/fd-table.ts", "../src/kernel/children.ts", "../src/realm/sync-fs-token-registry.ts", "../src/realm/sync-fs-wire.ts", "../src/realm/sync-fs-dispatch.ts", "../src/realm/sync-sab-wire.ts", "../src/realm/sync-sab-responder.ts", "../src/kernel/tty.ts", "../src/kernel/pty.ts", "../src/kernel/select.ts", "../src/kernel/vfs-file.ts", "../src/kernel/process.ts", "../src/kernel/protocol.ts", "../src/kernel/host.ts", "../src/kernel/jobs.ts", "../src/launcher.ts", "../src/serve.ts", "../src/kernel-worker.ts"],
|
|
4
|
+
"sourcesContent": ["export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtime: Date;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n chmod(path: string, mode: number): Promise<void>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n}\n\nexport function fsError(code: string, path: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${path}`), { code });\n}\n\nexport function normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return `/${parts.join('/')}`;\n}\n\nexport function resolvePath(base: string, path: string): string {\n return normalizePath(path.startsWith('/') ? path : `${base}/${path}`);\n}\n", "import { type FsStat, fsError, type KernelFs, resolvePath } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst PERM_MASK = 0o7777;\nconst READ_ATTEMPTS = 3;\nconst EXECUTABLE = /\\/node_modules\\/(?:@[^/]+\\/)?[^/]+\\/bin\\//;\n\ntype Handle = FileSystemFileHandle | FileSystemDirectoryHandle;\n\ninterface MovableHandle {\n move?(parent: FileSystemDirectoryHandle, name: string): Promise<void>;\n}\n\nconst ERRNO_BY_DOM_ERROR: Readonly<Record<string, string>> = {\n NotFoundError: 'ENOENT',\n TypeMismatchError: 'ENOTDIR',\n InvalidModificationError: 'ENOTEMPTY',\n NoModificationAllowedError: 'EBUSY',\n TypeError: 'EINVAL',\n};\n\nfunction translate(err: unknown, path: string): Error {\n if (typeof (err as { code?: unknown })?.code === 'string') return err as Error;\n const name = (err as { name?: unknown })?.name;\n return fsError((typeof name === 'string' && ERRNO_BY_DOM_ERROR[name]) || 'EIO', path);\n}\n\nfunction split(path: string): string[] {\n return path.split('/').filter(Boolean);\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport class OpfsFs implements KernelFs {\n private readonly modes = new Map<string, number>();\n private readonly times = new Map<string, number>();\n\n private readonly root: FileSystemDirectoryHandle;\n\n constructor(root: FileSystemDirectoryHandle) {\n this.root = root;\n }\n\n resolvePath(base: string, path: string): string {\n return resolvePath(base, path);\n }\n\n private async dir(path: string, create = false): Promise<FileSystemDirectoryHandle> {\n let dir = this.root;\n try {\n for (const part of split(path)) dir = await dir.getDirectoryHandle(part, { create });\n } catch (err) {\n throw translate(err, path);\n }\n return dir;\n }\n\n private async parent(path: string): Promise<[FileSystemDirectoryHandle, string]> {\n const parts = split(path);\n const name = parts.pop();\n if (name === undefined) throw fsError('EBUSY', path);\n return [await this.dir(`/${parts.join('/')}`), name];\n }\n\n private async handle(path: string): Promise<Handle> {\n if (split(path).length === 0) return this.root;\n const [dir, name] = await this.parent(path);\n try {\n return await dir.getFileHandle(name);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'TypeMismatchError') throw translate(err, path);\n }\n return dir.getDirectoryHandle(name);\n }\n\n private mode(path: string, directory: boolean): number {\n const fallback = directory || EXECUTABLE.test(path) ? 0o755 : 0o644;\n return (directory ? S_IFDIR : S_IFREG) | (this.modes.get(path) ?? fallback);\n }\n\n async stat(path: string): Promise<FsStat> {\n const handle = await this.handle(path);\n const directory = handle.kind === 'directory';\n const file = directory ? undefined : await (handle as FileSystemFileHandle).getFile();\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: file?.size ?? 0,\n mode: this.mode(path, directory),\n mtime: new Date(this.times.get(path) ?? file?.lastModified ?? 0),\n };\n }\n\n lstat(path: string): Promise<FsStat> {\n return this.stat(path);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.handle(path).then(\n () => true,\n () => false\n );\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const handle = await this.handle(path);\n if (handle.kind === 'directory') throw fsError('EISDIR', path);\n for (let attempt = 1; ; attempt++) {\n try {\n return new Uint8Array(await (await handle.getFile()).arrayBuffer());\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'NotReadableError' || attempt >= READ_ATTEMPTS) {\n throw translate(err, path);\n }\n await new Promise((resolve) => setTimeout(resolve, attempt * 10));\n }\n }\n }\n\n async readFile(path: string): Promise<string> {\n return new TextDecoder().decode(await this.readFileBuffer(path));\n }\n\n async writeFile(path: string, content: Uint8Array | string): Promise<void> {\n const [dir, name] = await this.parent(path);\n let file: FileSystemFileHandle;\n try {\n file = await dir.getFileHandle(name, { create: true });\n } catch (err) {\n const code = (err as { name?: unknown })?.name === 'TypeMismatchError' ? 'EISDIR' : null;\n throw code ? fsError(code, path) : translate(err, path);\n }\n const writable = await file.createWritable();\n await writable.write(content as FileSystemWriteChunkType);\n await writable.close();\n this.times.delete(path);\n }\n\n async readdir(path: string): Promise<string[]> {\n const handle = await this.handle(path);\n if (handle.kind !== 'directory') throw fsError('ENOTDIR', path);\n const names: string[] = [];\n for await (const name of handle.keys()) names.push(name);\n return names.sort();\n }\n\n async mkdir(path: string, options: { recursive?: boolean } = {}): Promise<void> {\n if (options.recursive) {\n await this.dir(path, true);\n return;\n }\n if (await this.exists(path)) throw fsError('EEXIST', path);\n const [dir, name] = await this.parent(path);\n await dir.getDirectoryHandle(name, { create: true });\n }\n\n async rm(path: string, options: { recursive?: boolean; force?: boolean } = {}): Promise<void> {\n try {\n const [dir, name] = await this.parent(path);\n await dir.removeEntry(name, { recursive: options.recursive === true });\n } catch (err) {\n const error = translate(err, path) as Error & { code: string };\n if (options.force && error.code === 'ENOENT') return;\n throw error;\n }\n this.forget(path);\n }\n\n private forget(path: string): void {\n for (const map of [this.modes, this.times]) {\n for (const key of [...map.keys()]) if (within(key, path)) map.delete(key);\n }\n }\n\n private carry(from: string, to: string): void {\n for (const map of [this.modes, this.times]) {\n for (const [key, value] of [...map]) {\n if (!within(key, from)) continue;\n map.delete(key);\n map.set(to + key.slice(from.length), value);\n }\n }\n }\n\n async rename(from: string, to: string): Promise<void> {\n if (from === to) return;\n const source = await this.stat(from);\n if (source.isDirectory && within(to, from)) throw fsError('EINVAL', to);\n const target = await this.stat(to).catch(() => null);\n if (target?.isDirectory && !source.isDirectory) throw fsError('EISDIR', to);\n if (target && !target.isDirectory && source.isDirectory) throw fsError('ENOTDIR', to);\n if (target?.isDirectory && (await this.readdir(to)).length > 0) {\n throw fsError('ENOTEMPTY', to);\n }\n const [dir, name] = await this.parent(to);\n const handle = await this.handle(from);\n const swap = target?.isDirectory === true;\n const staging = swap ? `.${name}.${crypto.randomUUID()}` : name;\n const moved = await this.place(handle, dir, staging);\n if (swap) await this.rm(to, { recursive: true });\n this.carry(from, to);\n if (!moved) await this.rm(from, { recursive: true });\n if (!swap) return;\n const staged = await dir.getDirectoryHandle(staging);\n if (!(await this.place(staged, dir, name))) await dir.removeEntry(staging, { recursive: true });\n }\n\n private async place(handle: Handle, dir: FileSystemDirectoryHandle, name: string) {\n const moved = await (handle as Handle & MovableHandle).move?.(dir, name).then(\n () => true,\n () => false\n );\n if (moved) return true;\n try {\n await this.copy(handle, dir, name);\n } catch (err) {\n if (handle.kind === 'directory') await dir.removeEntry(name, { recursive: true });\n throw translate(err, name);\n }\n return false;\n }\n\n private async copy(handle: Handle, dir: FileSystemDirectoryHandle, name: string): Promise<void> {\n if (handle.kind === 'file') {\n const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();\n await writable.write(await handle.getFile());\n await writable.close();\n return;\n }\n const target = await dir.getDirectoryHandle(name, { create: true });\n for await (const child of handle.values()) await this.copy(child, target, child.name);\n }\n\n async symlink(_target: string, path: string): Promise<void> {\n throw fsError('ENOSYS', path);\n }\n\n async readlink(path: string): Promise<string> {\n await this.handle(path);\n throw fsError('EINVAL', path);\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n await this.handle(path);\n this.modes.set(path, mode & PERM_MASK);\n }\n\n async utimes(path: string, _atime: Date, mtime: Date): Promise<void> {\n await this.handle(path);\n this.times.set(path, mtime.getTime());\n }\n}\n", "export const SIG = {\n HUP: 1,\n INT: 2,\n QUIT: 3,\n ILL: 4,\n TRAP: 5,\n ABRT: 6,\n BUS: 7,\n FPE: 8,\n KILL: 9,\n USR1: 10,\n SEGV: 11,\n USR2: 12,\n PIPE: 13,\n ALRM: 14,\n TERM: 15,\n STKFLT: 16,\n CHLD: 17,\n CONT: 18,\n STOP: 19,\n TSTP: 20,\n TTIN: 21,\n TTOU: 22,\n URG: 23,\n XCPU: 24,\n XFSZ: 25,\n VTALRM: 26,\n PROF: 27,\n WINCH: 28,\n POLL: 29,\n PWR: 30,\n SYS: 31,\n} as const;\n\nexport type DefaultAction = 'terminate' | 'ignore' | 'stop' | 'continue';\n\nconst IGNORED_BY_DEFAULT: ReadonlySet<number> = new Set([SIG.CHLD, SIG.URG, SIG.WINCH]);\nconst STOPPING: ReadonlySet<number> = new Set([SIG.STOP, SIG.TSTP, SIG.TTIN, SIG.TTOU]);\n\nexport function defaultAction(sig: number): DefaultAction {\n if (sig === SIG.CONT) return 'continue';\n if (STOPPING.has(sig)) return 'stop';\n return IGNORED_BY_DEFAULT.has(sig) ? 'ignore' : 'terminate';\n}\n\nexport function isSignal(sig: number): boolean {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31;\n}\n\nexport function sigbit(sig: number): number {\n return 1 << sig;\n}\n\nexport function signalsIn(mask: number): number[] {\n const out: number[] = [];\n for (let sig = 1; sig <= 31; sig++) if (mask & sigbit(sig)) out.push(sig);\n return out;\n}\n\nexport const SIGNAL_BY_NAME: Readonly<\n Record<'SIGINT' | 'SIGTERM' | 'SIGKILL' | 'SIGSTOP' | 'SIGCONT', number>\n> = {\n SIGINT: SIG.INT,\n SIGTERM: SIG.TERM,\n SIGKILL: SIG.KILL,\n SIGSTOP: SIG.STOP,\n SIGCONT: SIG.CONT,\n};\n", "import type { KernelFs } from './fs/types.ts';\n\nexport interface Command {\n name: string;\n glue: string;\n wasm: string;\n argv0: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\ninterface CommandEntry {\n abi?: unknown;\n glue?: unknown;\n wasm?: unknown;\n argv0?: unknown;\n args?: unknown;\n env?: unknown;\n}\n\ninterface Manifest {\n slicc?: { abi?: unknown; commands?: unknown; env?: unknown };\n}\n\nconst NAME = /^[A-Za-z0-9._+-]+$/;\nconst ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst PACKAGE = /\\$\\{package\\}/g;\n\nfunction inside(pkg: string, rel: unknown): string | undefined {\n if (typeof rel !== 'string' || rel === '') return undefined;\n const clean = rel.replace(/^\\.\\//, '');\n if (clean.startsWith('/') || clean.split('/').includes('..')) return undefined;\n return `${pkg}/${clean}`;\n}\n\nfunction envOf(pkg: string, raw: unknown): Record<string, string> {\n const env: Record<string, string> = {};\n if (!raw || typeof raw !== 'object') return env;\n for (const [key, value] of Object.entries(raw)) {\n if (ENV_KEY.test(key) && typeof value === 'string') env[key] = value.replace(PACKAGE, pkg);\n }\n return env;\n}\n\nfunction argsOf(pkg: string, raw: unknown): string[] | undefined {\n if (!Array.isArray(raw) || raw.length === 0) return undefined;\n if (!raw.every((arg) => typeof arg === 'string')) return undefined;\n return raw.map((arg) => arg.replace(PACKAGE, pkg));\n}\n\nexport function commandsOf(pkg: string, manifest: Manifest): Command[] {\n const slicc = manifest.slicc;\n if (!slicc || typeof slicc !== 'object' || (slicc.abi ?? 'emscripten') !== 'emscripten')\n return [];\n const entries = slicc.commands;\n if (!entries || typeof entries !== 'object') return [];\n const shared = envOf(pkg, slicc.env);\n const out: Command[] = [];\n for (const [name, raw] of Object.entries(entries as Record<string, CommandEntry>)) {\n if (!NAME.test(name) || name === '.' || name === '..' || !raw || typeof raw !== 'object') {\n continue;\n }\n const glue = inside(pkg, raw.glue);\n const wasm = inside(pkg, raw.wasm);\n if ((raw.abi ?? 'emscripten') !== 'emscripten' || !glue || !wasm) continue;\n const argv0 = typeof raw.argv0 === 'string' && raw.argv0 ? raw.argv0 : name;\n const args = argsOf(pkg, raw.args);\n const env = { ...shared, ...envOf(pkg, raw.env) };\n out.push({\n name,\n glue,\n wasm,\n argv0,\n ...(args ? { args } : {}),\n ...(Object.keys(env).length > 0 ? { env } : {}),\n });\n }\n return out;\n}\n\nasync function packages(fs: KernelFs, modules: string): Promise<string[]> {\n const names = await fs.readdir(modules).catch(() => []);\n const dirs: string[] = [];\n for (const name of names) {\n if (name.startsWith('.')) continue;\n if (!name.startsWith('@')) {\n dirs.push(`${modules}/${name}`);\n continue;\n }\n for (const inner of await fs.readdir(`${modules}/${name}`).catch(() => [])) {\n dirs.push(`${modules}/${name}/${inner}`);\n }\n }\n return dirs;\n}\n\nexport async function scanCommands(fs: KernelFs, modules: string): Promise<Map<string, Command>> {\n const found = new Map<string, Command>();\n for (const pkg of await packages(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n for (const command of commandsOf(pkg, manifest)) {\n if (!found.has(command.name)) found.set(command.name, command);\n }\n }\n if (!found.has('sh') && found.has('bash')) {\n found.set('sh', { ...(found.get('bash') as Command), name: 'sh', argv0: 'sh' });\n }\n return found;\n}\n", "import type { FsStat, KernelFs } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\n\nfunction missing(err: unknown): boolean {\n return (err as { code?: unknown })?.code === 'ENOENT';\n}\n\nfunction synthetic(directory: boolean): FsStat {\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: 0,\n mode: (directory ? S_IFDIR : S_IFREG) | 0o755,\n mtime: new Date(0),\n };\n}\n\nexport function withCommandDirs(fs: KernelFs, names: () => Promise<ReadonlySet<string>>): KernelFs {\n async function children(path: string): Promise<string[] | undefined> {\n if (path === '/') return ['bin', 'usr'];\n if (path === '/usr') return ['bin'];\n if (path === '/bin' || path === '/usr/bin') return [...(await names())];\n return undefined;\n }\n\n async function virtual(path: string): Promise<FsStat | undefined> {\n if (path === '/usr' || path === '/bin' || path === '/usr/bin') return synthetic(true);\n const name = COMMAND.exec(path)?.[1];\n return name !== undefined && (await names()).has(name) ? synthetic(false) : undefined;\n }\n\n async function stat(path: string, real: (path: string) => Promise<FsStat>): Promise<FsStat> {\n try {\n return await real(path);\n } catch (err) {\n const found = missing(err) ? await virtual(path) : undefined;\n if (found) return found;\n throw err;\n }\n }\n\n return {\n resolvePath: (base, path) => fs.resolvePath(base, path),\n readFile: (path) => fs.readFile(path),\n async readFileBuffer(path) {\n try {\n return await fs.readFileBuffer(path);\n } catch (err) {\n if (missing(err) && (await virtual(path))?.isFile) return new Uint8Array(0);\n throw err;\n }\n },\n writeFile: (path, content) => fs.writeFile(path, content),\n async exists(path) {\n return (await fs.exists(path)) || (await virtual(path)) !== undefined;\n },\n stat: (path) => stat(path, (p) => fs.stat(p)),\n lstat: (path) => stat(path, (p) => fs.lstat(p)),\n async readdir(path) {\n const extra = await children(path);\n if (!extra) return fs.readdir(path);\n const real = await fs.readdir(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n return [...new Set([...real, ...extra])].sort();\n },\n mkdir: (path, options) => fs.mkdir(path, options),\n rm: (path, options) => fs.rm(path, options),\n rename: (from, to) => fs.rename(from, to),\n symlink: (target, path) => fs.symlink(target, path),\n readlink: (path) => fs.readlink(path),\n chmod: (path, mode) => fs.chmod(path, mode),\n utimes: (path, atime, mtime) => fs.utimes(path, atime, mtime),\n };\n}\n", "export const PIPE_CAPACITY = 64 * 1024;\n\nexport class PipeError extends Error {\n readonly code: 'EPIPE' | 'EINTR';\n\n constructor(code: 'EPIPE' | 'EINTR') {\n super(code);\n this.code = code;\n }\n}\n\nexport class KernelPipe {\n private chunks: Uint8Array[] = [];\n private size = 0;\n private readers = 0;\n private writers = 0;\n private waiters: Array<() => void> = [];\n\n readonly capacity: number;\n\n constructor(capacity: number = PIPE_CAPACITY) {\n this.capacity = capacity;\n }\n\n get buffered(): number {\n return this.size;\n }\n\n get readReady(): boolean {\n return this.size > 0 || this.writers === 0;\n }\n\n get writeReady(): boolean {\n return this.size < this.capacity || this.readers === 0;\n }\n\n get writersGone(): boolean {\n return this.writers === 0;\n }\n\n get readersGone(): boolean {\n return this.readers === 0;\n }\n\n openRead(): void {\n this.readers += 1;\n }\n\n openWrite(): void {\n this.writers += 1;\n }\n\n closeRead(): void {\n if (this.readers > 0) this.readers -= 1;\n if (this.readers === 0) {\n this.chunks = [];\n this.size = 0;\n }\n this.wake();\n }\n\n closeWrite(): void {\n if (this.writers > 0) this.writers -= 1;\n this.wake();\n }\n\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = this.take(Math.min(max, this.size));\n this.wake();\n return out;\n }\n\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = new Uint8Array(Math.min(max, this.size));\n let filled = 0;\n for (const chunk of this.chunks) {\n if (filled === out.length) break;\n const count = Math.min(chunk.length, out.length - filled);\n out.set(chunk.subarray(0, count), filled);\n filled += count;\n }\n return out;\n }\n\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n let offset = 0;\n while (offset < bytes.length) {\n if (this.readers === 0) throw new PipeError('EPIPE');\n const room = this.capacity - this.size;\n if (room === 0) {\n try {\n await this.changed(signal);\n } catch (e) {\n if (offset > 0) return offset;\n throw e;\n }\n continue;\n }\n const n = Math.min(room, bytes.length - offset);\n this.chunks.push(bytes.slice(offset, offset + n));\n this.size += n;\n offset += n;\n this.wake();\n }\n return bytes.length;\n }\n\n private take(n: number): Uint8Array {\n const out = new Uint8Array(n);\n let filled = 0;\n while (filled < n) {\n const head = this.chunks[0];\n const count = Math.min(head.length, n - filled);\n out.set(head.subarray(0, count), filled);\n filled += count;\n if (count === head.length) this.chunks.shift();\n else this.chunks[0] = head.subarray(count);\n }\n this.size -= n;\n return out;\n }\n\n changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new PipeError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new PipeError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import { KernelPipe, type PipeError } from './pipe.ts';\nimport type { PtyPair } from './pty.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport type KernelErrno =\n | 'EBADF'\n | 'EPIPE'\n | 'EMFILE'\n | 'EINVAL'\n | 'ENOENT'\n | 'ENOEXEC'\n | 'ECHILD'\n | 'ENOSYS'\n | 'ESPIPE'\n | 'EINTR'\n | 'ESRCH'\n | 'ENOTTY'\n | 'ENXIO'\n | 'EPERM'\n | 'EIO'\n | 'EACCES'\n | 'EAGAIN'\n | 'ENOTSOCK'\n | 'EAFNOSUPPORT'\n | 'EPROTONOSUPPORT'\n | 'EOPNOTSUPP'\n | 'EADDRINUSE'\n | 'EADDRNOTAVAIL'\n | 'ENETUNREACH'\n | 'ECONNREFUSED'\n | 'EINPROGRESS'\n | 'EISCONN'\n | 'ENOTCONN';\n\nexport class KernelError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport interface PollState {\n readable: boolean;\n\n writable: boolean;\n\n hangup: boolean;\n}\n\nexport interface KernelFile {\n read?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n peek?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n write?(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;\n\n close(): void | Promise<void>;\n\n poll?(): PollState;\n\n changed?(signal?: AbortSignal): Promise<void>;\n\n seek?(offset: number, whence: number): Promise<number>;\n\n flush?(): Promise<void>;\n\n pread?(max: number, at: number): Promise<Uint8Array>;\n pwrite?(bytes: Uint8Array, at: number): Promise<number>;\n\n resize?(size: number): Promise<void>;\n\n stat?(): Promise<{ path: string; size: number; orphan?: true }>;\n\n tty?: KernelTty;\n\n pty?: PtyPair;\n\n stat?(): Promise<{ size: number; path: string; orphan?: true }>;\n held?: true;\n\n heldMeta?: HeldMeta;\n}\n\nexport type HeldMeta = { dir: string; preopen?: string } | DeviceMeta;\n\nexport interface DeviceMeta {\n device: KernelDevice;\n access?: DeviceAccess;\n}\n\nexport type DeviceAccess = 'read' | 'write';\n\nexport type KernelDevice = 'null' | 'zero' | 'urandom';\n\nexport function pollFile(file: KernelFile): PollState {\n return file.poll?.() ?? { readable: !!file.read, writable: !!file.write, hangup: false };\n}\n\nexport class OpenFile {\n private refs = 1;\n\n readonly file: KernelFile;\n\n constructor(file: KernelFile) {\n this.file = file;\n }\n\n retain(): this {\n this.refs += 1;\n return this;\n }\n\n release(): void | Promise<void> {\n this.refs -= 1;\n if (this.refs === 0) return this.file.close();\n }\n}\n\nexport function openPipe(capacity?: number): { read: OpenFile; write: OpenFile } {\n const pipe = new KernelPipe(capacity);\n pipe.openRead();\n pipe.openWrite();\n return {\n read: new OpenFile({\n read: async (max, signal) => {\n try {\n return await pipe.read(max, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeRead(),\n poll: () => ({ readable: pipe.readReady, writable: false, hangup: pipe.writersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n write: new OpenFile({\n write: async (bytes, signal) => {\n try {\n return await pipe.write(bytes, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeWrite(),\n poll: () => ({ readable: false, writable: pipe.writeReady, hangup: pipe.readersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n };\n}\n\nexport function bytesSource(data: Uint8Array): OpenFile {\n let offset = 0;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n close: () => {},\n });\n}\n\nexport function sinkFile(onData: (bytes: Uint8Array) => void): OpenFile {\n return new OpenFile({\n write: async (bytes) => {\n onData(bytes.slice());\n return bytes.length;\n },\n close: () => {},\n });\n}\n\nexport function nullFile(): OpenFile {\n return new OpenFile({\n read: async () => new Uint8Array(0),\n write: async (bytes) => bytes.length,\n close: () => {},\n });\n}\n\nexport function deviceFile(device: KernelDevice, access?: DeviceAccess): OpenFile {\n const read = async (max: number): Promise<Uint8Array> => {\n if (device === 'null') return new Uint8Array(0);\n const out = new Uint8Array(max);\n if (device === 'urandom') {\n for (let at = 0; at < max; at += 65536) {\n crypto.getRandomValues(out.subarray(at, Math.min(max, at + 65536)));\n }\n }\n return out;\n };\n return new OpenFile({\n ...(access !== 'write' ? { read } : {}),\n ...(access !== 'read' ? { write: async (bytes: Uint8Array) => bytes.length } : {}),\n seek: async () => 0,\n heldMeta: { device, ...(access ? { access } : {}) },\n close: () => {},\n });\n}\n\nexport function heldFile(meta?: HeldMeta): OpenFile {\n return new OpenFile({ held: true, ...(meta ? { heldMeta: meta } : {}), close: () => {} });\n}\n\nexport type KernelFdKind = 'tty' | 'stream' | 'file' | 'socket' | 'held' | 'device';\n\nexport function kernelFdKind(file: KernelFile): Exclude<KernelFdKind, 'socket'> {\n if (file.held) return 'held';\n if (file.heldMeta && 'device' in file.heldMeta) return 'device';\n if (file.tty) return 'tty';\n return file.seek ? 'file' : 'stream';\n}\n\nexport class FdTable {\n static readonly MAX_FDS = 1024;\n private fds = new Map<number, OpenFile>();\n private readonly cloexec = new Set<number>();\n\n private readonly status = new Map<number, number>();\n\n get(fd: number): OpenFile {\n const file = this.fds.get(fd);\n if (!file) throw new KernelError('EBADF');\n return file;\n }\n\n stdioTerminal(): KernelTty | undefined {\n for (const fd of [0, 1, 2]) {\n const tty = this.fds.get(fd)?.file.tty;\n if (tty) return tty;\n }\n return undefined;\n }\n\n numbers(): number[] {\n return [...this.fds.keys()].sort((a, b) => a - b);\n }\n\n has(fd: number): boolean {\n return this.fds.has(fd);\n }\n\n setCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.add(fd);\n }\n\n clearCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.delete(fd);\n }\n\n closesOnExec(fd: number): boolean {\n return this.cloexec.has(fd);\n }\n\n setStatusFlags(fd: number, flags: number): void {\n this.get(fd);\n this.status.set(fd, flags);\n }\n\n statusFlags(fd: number): number | undefined {\n return this.status.get(fd);\n }\n\n install(file: OpenFile, min = 0): number {\n for (let fd = min; fd < FdTable.MAX_FDS; fd++) {\n if (!this.fds.has(fd)) {\n this.fds.set(fd, file);\n return fd;\n }\n }\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EMFILE');\n }\n\n installAt(fd: number, file: OpenFile): void {\n if (fd < 0 || fd >= FdTable.MAX_FDS) {\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EBADF');\n }\n const previous = this.fds.get(fd);\n this.fds.set(fd, file);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n void Promise.resolve(previous?.release()).catch(() => undefined);\n }\n\n dup(fd: number, min = 0): number {\n return this.install(this.get(fd).retain(), min);\n }\n\n dup2(oldFd: number, newFd: number): number {\n const file = this.get(oldFd);\n if (oldFd !== newFd) this.installAt(newFd, file.retain());\n return newFd;\n }\n\n close(fd: number): void | Promise<void> {\n const file = this.get(fd);\n this.fds.delete(fd);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n return file.release();\n }\n\n fork(): FdTable {\n const child = new FdTable();\n for (const [fd, file] of this.fds) child.fds.set(fd, file.retain());\n for (const fd of this.cloexec) child.cloexec.add(fd);\n for (const [fd, flags] of this.status) child.status.set(fd, flags);\n return child;\n }\n\n async closeAll(): Promise<void> {\n const files = [...this.fds.values()];\n this.fds.clear();\n this.cloexec.clear();\n this.status.clear();\n await Promise.allSettled(files.map((file) => Promise.resolve().then(() => file.release())));\n }\n}\n", "import {\n bytesSource,\n type DeviceMeta,\n deviceFile,\n FdTable,\n type KernelErrno,\n KernelError,\n nullFile,\n type OpenFile,\n sinkFile,\n} from './fd-table.ts';\nimport type { ForkState } from './protocol.ts';\n\nexport type ChildStdio =\n | { fd: number }\n | { input: Uint8Array }\n | { capture: true }\n | { none: true };\n\nexport type InheritedSlot =\n | { fd: number; kernel: number; flags?: number }\n | ({ fd: number } & DeviceMeta);\n\nexport interface ChildSpawnRequest {\n file: string;\n\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n}\n\nexport interface ChildHandle {\n pid: number;\n\n exited: Promise<number>;\n\n termsig?: () => number | undefined;\n\n onState?: (listener: ChildStateListener) => void;\n}\n\nexport type ChildStateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport interface WaitFlags {\n untraced?: boolean;\n\n continued?: boolean;\n\n inGroup?: (childPid: number) => boolean;\n}\n\nexport class SpawnError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport type ChildSpawner = (req: ChildSpawnRequest, fds: FdTable) => Promise<ChildHandle>;\n\nexport type ChildForker = (state: ForkState, fds: FdTable) => Promise<ChildHandle>;\n\ninterface Child {\n exited: Promise<number>;\n termsig?: () => number | undefined;\n\n code?: number;\n\n stopReport?: number;\n\n continueReport?: boolean;\n\n captured: Map<number, Uint8Array[]>;\n}\n\nfunction interrupted(signal: AbortSignal | undefined): {\n promise: Promise<never>;\n\n done(): void;\n} {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal?.aborted) fail();\n else signal?.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal?.removeEventListener('abort', fail) };\n}\n\nexport function stoppedStatus(sig: number): number {\n return ((sig & 0xff) << 8) | 0x7f;\n}\n\nexport const CONTINUED_STATUS = 0xffff;\n\nexport function waitStatus(code: number, termsig?: number): number {\n return termsig ? termsig & 0x7f : (code & 0xff) << 8;\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class ChildTable {\n private readonly children = new Map<number, Child>();\n\n private readonly leftovers = new Map<number, Map<number, Uint8Array[]>>();\n\n onChildState?: () => void;\n\n onReap?: (pid: number) => void;\n\n private stateChanged: Array<() => void> = [];\n\n private readonly watchers = new Map<number, ChildStateListener>();\n\n private readonly parentFds: FdTable;\n\n private readonly spawner: ChildSpawner | undefined;\n\n private readonly forker?: ChildForker;\n\n constructor(\n parentFds: FdTable,\n\n spawner: ChildSpawner | undefined,\n\n forker?: ChildForker\n ) {\n this.parentFds = parentFds;\n\n this.spawner = spawner;\n\n this.forker = forker;\n }\n\n async fork(state: ForkState): Promise<number> {\n if (!this.forker) throw new SpawnError('ENOSYS');\n return this.track(state, this.parentFds.fork(), new Map(), this.forker);\n }\n\n async spawn(\n req: ChildSpawnRequest,\n stdio: readonly ChildStdio[],\n inherit: readonly InheritedSlot[] = []\n ): Promise<number> {\n if (!this.spawner) throw new SpawnError('ENOSYS');\n const fds = new FdTable();\n const captured = new Map<number, Uint8Array[]>();\n try {\n for (const [n, slot] of stdio.entries()) fds.installAt(n, this.openSlot(slot, n, captured));\n\n for (const slot of inherit) {\n if (slot.fd <= 2) continue;\n if ('device' in slot) {\n fds.installAt(slot.fd, deviceFile(slot.device, slot.access));\n continue;\n }\n fds.installAt(slot.fd, this.parentFds.get(slot.kernel).retain());\n if (slot.flags !== undefined) fds.setStatusFlags(slot.fd, slot.flags);\n }\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n return this.track(req, fds, captured, this.spawner);\n }\n\n private async track<R>(\n req: R,\n fds: FdTable,\n captured: Map<number, Uint8Array[]>,\n start: (req: R, fds: FdTable) => Promise<ChildHandle>\n ): Promise<number> {\n let handle: ChildHandle;\n try {\n handle = await start(req, fds);\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n const child: Child = { exited: handle.exited, termsig: handle.termsig, captured };\n void handle.exited.then((code) => {\n child.code = code;\n this.watchers.delete(handle.pid);\n this.onChildState?.();\n });\n handle.onState?.((state, sig) => {\n child.stopReport = state === 'stopped' ? sig : undefined;\n child.continueReport = state === 'continued';\n this.watchers.get(handle.pid)?.(state, sig);\n const waiters = this.stateChanged;\n this.stateChanged = [];\n for (const wake of waiters) wake();\n this.onChildState?.();\n });\n this.children.set(handle.pid, child);\n return handle.pid;\n }\n\n watch(pid: number, listener: ChildStateListener): void {\n if (this.children.has(pid)) this.watchers.set(pid, listener);\n }\n\n private openSlot(slot: ChildStdio, n: number, captured: Map<number, Uint8Array[]>): OpenFile {\n if ('fd' in slot) return this.parentFds.get(slot.fd).retain();\n if ('input' in slot) return bytesSource(slot.input);\n if ('capture' in slot) {\n const chunks: Uint8Array[] = [];\n captured.set(n, chunks);\n return sinkFile((bytes) => chunks.push(bytes));\n }\n return nullFile();\n }\n\n async wait(\n pid: number,\n nohang: boolean,\n signal?: AbortSignal,\n flags: WaitFlags = {}\n ): Promise<[number, number]> {\n let interrupt: ReturnType<typeof interrupted> | undefined;\n try {\n for (;;) {\n const candidates = this.candidates(pid, flags);\n if (candidates.length === 0) throw new KernelError('ECHILD');\n const done = candidates.find(([, child]) => child.code !== undefined);\n if (done) return this.reap(done[0], done[1].code as number);\n const changed = this.stateReport(candidates, flags);\n if (changed) return changed;\n if (nohang) return [0, 0];\n interrupt ??= interrupted(signal);\n await this.nextChange(candidates, flags, interrupt.promise);\n }\n } finally {\n interrupt?.done();\n }\n }\n\n private candidates(pid: number, flags: WaitFlags): [number, Child][] {\n const all = [...this.children];\n if (pid > 0) return all.filter(([p]) => p === pid);\n const inGroup = flags.inGroup;\n return pid === -1 || !inGroup ? all : all.filter(([p]) => inGroup(p));\n }\n\n private async nextChange(\n candidates: [number, Child][],\n flags: WaitFlags,\n interrupt: Promise<never>\n ): Promise<void> {\n let wake: (() => void) | undefined;\n const stateChange = new Promise<void>((resolve) => (wake = resolve));\n const watching = flags.untraced || flags.continued;\n if (watching && wake) this.stateChanged.push(wake);\n try {\n await Promise.race([\n ...candidates.map(([, child]) => child.exited),\n ...(watching ? [stateChange] : []),\n interrupt,\n ]);\n } finally {\n this.stateChanged = this.stateChanged.filter((w) => w !== wake);\n }\n }\n\n private stateReport(candidates: [number, Child][], flags: WaitFlags): [number, number] | null {\n for (const [p, child] of candidates) {\n if (flags.untraced && child.stopReport !== undefined) {\n const sig = child.stopReport;\n child.stopReport = undefined;\n return [p, stoppedStatus(sig)];\n }\n if (flags.continued && child.continueReport) {\n child.continueReport = false;\n return [p, CONTINUED_STATUS];\n }\n }\n return null;\n }\n\n private reap(pid: number, code: number): [number, number] {\n const child = this.children.get(pid);\n this.children.delete(pid);\n this.onReap?.(pid);\n if (child && child.captured.size > 0) this.leftovers.set(pid, child.captured);\n return [pid, waitStatus(code, child?.termsig?.())];\n }\n\n pids(): number[] {\n return [...this.children.keys()];\n }\n\n captured(pid: number, slot: number): Uint8Array {\n const slots = this.leftovers.get(pid);\n const chunks = slots?.get(slot);\n if (!slots || !chunks) return new Uint8Array(0);\n slots.delete(slot);\n if (slots.size === 0) this.leftovers.delete(pid);\n return concat(chunks);\n }\n}\n", "import type { KernelFs } from '../fs/types.ts';\n\nexport interface SyncFsTokenEntry {\n fs: KernelFs;\n cwd: string;\n}\n\nconst registry = new Map<string, SyncFsTokenEntry>();\n\nexport function mintSyncFsToken(entry: SyncFsTokenEntry): string {\n const token = crypto.randomUUID();\n registry.set(token, entry);\n return token;\n}\n\nexport function resolveSyncFsToken(token: string): SyncFsTokenEntry | null {\n return registry.get(token) ?? null;\n}\n\nexport function revokeSyncFsToken(token: string): void {\n registry.delete(token);\n}\n", "export type SyncFsOp =\n | 'read'\n | 'write'\n | 'exists'\n | 'stat'\n | 'lstat'\n | 'readdir'\n | 'readdir-stat'\n | 'mkdir'\n | 'rm'\n | 'rename'\n | 'unlink'\n | 'rmdir'\n | 'symlink'\n | 'readlink'\n | 'chmod'\n | 'utimes';\n\nexport interface SyncFsRequest {\n token: string;\n op: SyncFsOp;\n path: string;\n body?: Uint8Array;\n arg2?: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n}\n\nexport type SyncFsResult =\n | { ok: true; kind: 'bytes'; bytes: Uint8Array }\n | { ok: true; kind: 'json'; json: unknown }\n | { ok: true; kind: 'void' }\n | { ok: false; errno: string; message: string };\n\nexport const SYNC_FS_REQUEST_TIMEOUT_MS = 25_000;\n\nexport interface SyncFsBridgeStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink?: boolean;\n size: number;\n mode?: number;\n mtimeMs?: number;\n ino?: number;\n}\n\nexport interface SyncFsPosixBridge {\n readFile(path: string): Uint8Array;\n writeFile(path: string, bytes: Uint8Array): void;\n stat(path: string): SyncFsBridgeStat;\n lstat(path: string): SyncFsBridgeStat;\n readdir(path: string): string[];\n exists(path: string): boolean;\n mkdir(path: string): void;\n rm(path: string): void;\n rename(from: string, to: string): void;\n unlink(path: string): void;\n rmdir(path: string): void;\n symlink(target: string, linkPath: string): void;\n readlink(path: string): string;\n chmod(path: string, mode: number): void;\n utimes(path: string, atimeMs: number, mtimeMs: number): void;\n readdirStat(path: string): Array<[string, SyncFsBridgeStat | null]>;\n}\n\nexport function syncError(code: string, label: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${label}`), { code });\n}\n\nexport function parseSyncFsStat(json: unknown): SyncFsBridgeStat | null {\n const s = json as Partial<SyncFsBridgeStat> | null;\n if (\n !s ||\n typeof s.isFile !== 'boolean' ||\n typeof s.isDirectory !== 'boolean' ||\n typeof s.size !== 'number'\n ) {\n return null;\n }\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n ...(typeof s.mode === 'number' ? { mode: s.mode } : {}),\n ...(typeof s.mtimeMs === 'number' ? { mtimeMs: s.mtimeMs } : {}),\n ...(typeof s.ino === 'number' ? { ino: s.ino } : {}),\n };\n}\n", "import type { FsStat, KernelFs } from '../fs/types.ts';\nimport { resolveSyncFsToken } from './sync-fs-token-registry.ts';\nimport { type SyncFsRequest, type SyncFsResult, syncError } from './sync-fs-wire.ts';\n\nexport function toErrno(err: unknown): SyncFsResult {\n const message = err instanceof Error ? err.message : String(err);\n const code = (err as { code?: unknown })?.code;\n if (typeof code === 'string' && /^E[A-Z]+$/.test(code)) {\n return { ok: false, errno: code, message };\n }\n return { ok: false, errno: 'EIO', message };\n}\n\nexport interface SyncFsStatJson {\n isDirectory: boolean;\n isFile: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtimeMs: number;\n}\n\nfunction statJson(s: FsStat): SyncFsStatJson {\n return {\n isDirectory: s.isDirectory,\n isFile: s.isFile,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mode: s.mode,\n mtimeMs: s.mtime.getTime(),\n };\n}\n\nasync function readdirStat(\n fs: KernelFs,\n dir: string\n): Promise<Array<[string, SyncFsStatJson | null]>> {\n const names = await fs.readdir(dir);\n const base = dir === '/' ? '' : dir;\n return Promise.all(\n names.map(async (name): Promise<[string, SyncFsStatJson | null]> => {\n try {\n return [name, statJson(await fs.lstat(`${base}/${name}`))];\n } catch {\n return [name, null];\n }\n })\n );\n}\n\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nfunction json(value: unknown): SyncFsResult {\n return { ok: true, kind: 'json', json: value };\n}\n\nasync function run(\n fs: KernelFs,\n path: string,\n req: SyncFsRequest,\n cwd: string\n): Promise<SyncFsResult> {\n switch (req.op) {\n case 'read':\n return { ok: true, kind: 'bytes', bytes: await fs.readFileBuffer(path) };\n case 'write':\n await fs.writeFile(path, req.body ?? new Uint8Array(0));\n return done;\n case 'exists':\n return json(await fs.exists(path));\n case 'stat':\n return json(statJson(await fs.stat(path)));\n case 'lstat':\n return json(statJson(await fs.lstat(path)));\n case 'readdir':\n return json(await fs.readdir(path));\n case 'readdir-stat':\n return json(await readdirStat(fs, path));\n case 'mkdir':\n await fs.mkdir(path, { recursive: true });\n return done;\n case 'rm':\n await fs.rm(path, { recursive: true });\n return done;\n case 'rename':\n await fs.rename(path, fs.resolvePath(cwd, req.arg2 ?? ''));\n return done;\n case 'unlink':\n if ((await fs.lstat(path)).isDirectory) throw syncError('EISDIR', path);\n await fs.rm(path);\n return done;\n case 'rmdir':\n if (!(await fs.lstat(path)).isDirectory) throw syncError('ENOTDIR', path);\n if ((await fs.readdir(path)).length > 0) throw syncError('ENOTEMPTY', path);\n await fs.rm(path, { recursive: true });\n return done;\n case 'symlink':\n await fs.symlink(req.arg2 ?? '', path);\n return done;\n case 'readlink':\n return json(await fs.readlink(path));\n case 'chmod':\n await fs.chmod(path, req.mode ?? 0);\n return done;\n case 'utimes':\n await fs.utimes(path, new Date(req.atimeMs ?? 0), new Date(req.mtimeMs ?? 0));\n return done;\n default:\n return { ok: false, errno: 'EINVAL', message: `sync-fs: unknown op '${req.op as string}'` };\n }\n}\n\nexport async function dispatchSyncFs(req: SyncFsRequest): Promise<SyncFsResult> {\n const entry = resolveSyncFsToken(req.token);\n if (!entry) return { ok: false, errno: 'EACCES', message: 'sync-fs: unknown or revoked token' };\n const { fs, cwd } = entry;\n try {\n return await run(fs, fs.resolvePath(cwd, req.path), req, cwd);\n } catch (err) {\n return toErrno(err);\n }\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport type { SyncFsRequest, SyncFsResult } from './sync-fs-wire.ts';\n\nexport const SAB_HEADER_I32 = 16;\nexport const SAB_HEADER_BYTES = SAB_HEADER_I32 * 4;\n\nexport const SAB_I_STATE = 0;\nexport const SAB_I_SEQ = 1;\nexport const SAB_I_STATUS = 2;\nexport const SAB_I_TOTAL = 3;\nexport const SAB_I_CHUNK = 4;\nexport const SAB_I_OFFSET = 5;\n\nexport const SAB_I_SIGNALS = 8;\n\nexport const SAB_I_TIMERS = 9;\n\nexport const SAB_STATE_IDLE = 0;\nexport const SAB_STATE_PENDING = 1;\nexport const SAB_STATE_READY = 2;\n\nexport const SAB_STATUS_BYTES = 1;\nexport const SAB_STATUS_JSON = 2;\nexport const SAB_STATUS_VOID = 3;\nexport const SAB_STATUS_ERRNO = 4;\n\nexport const SAB_DEFAULT_WINDOW_BYTES = 1024 * 1024;\n\nexport const SAB_MIN_BYTES = SAB_HEADER_BYTES + 4096;\n\nexport const SYNC_SAB_REQ_MSG = 'sync-sab-req';\n\nexport const SYNC_SAB_NEXT_MSG = 'sync-sab-next';\n\nexport type SyncSabRequestBody = Omit<SyncFsRequest, 'token'> | WasmSyscall;\n\nexport interface SyncSabReqMsg {\n type: typeof SYNC_SAB_REQ_MSG;\n id: number;\n req: SyncSabRequestBody;\n}\nexport interface SyncSabNextMsg {\n type: typeof SYNC_SAB_NEXT_MSG;\n id: number;\n offset: number;\n}\n\nexport interface SabEncodedResult {\n status: number;\n payload: Uint8Array;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function encodeSabResult(result: SyncFsResult): SabEncodedResult {\n if (!result.ok) {\n return {\n status: SAB_STATUS_ERRNO,\n payload: encoder.encode(JSON.stringify({ errno: result.errno, message: result.message })),\n };\n }\n switch (result.kind) {\n case 'bytes':\n return { status: SAB_STATUS_BYTES, payload: result.bytes };\n case 'json':\n return { status: SAB_STATUS_JSON, payload: encoder.encode(JSON.stringify(result.json)) };\n default:\n return { status: SAB_STATUS_VOID, payload: new Uint8Array(0) };\n }\n}\n\nexport function decodeSabResult(status: number, payload: Uint8Array): SyncFsResult {\n switch (status) {\n case SAB_STATUS_BYTES:\n return { ok: true, kind: 'bytes', bytes: payload };\n case SAB_STATUS_VOID:\n return { ok: true, kind: 'void' };\n case SAB_STATUS_JSON: {\n try {\n return { ok: true, kind: 'json', json: JSON.parse(decoder.decode(payload)) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed json payload' };\n }\n }\n case SAB_STATUS_ERRNO: {\n try {\n const parsed = JSON.parse(decoder.decode(payload)) as {\n errno?: unknown;\n message?: unknown;\n };\n const errno =\n typeof parsed.errno === 'string' && /^E[A-Z]+$/.test(parsed.errno) ? parsed.errno : 'EIO';\n return { ok: false, errno, message: String(parsed.message ?? errno) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed errno payload' };\n }\n }\n default:\n return { ok: false, errno: 'EIO', message: `sync-sab: unknown status ${status}` };\n }\n}\n\nexport interface SabViews {\n header: Int32Array;\n window: Uint8Array;\n}\n\nexport function sabViews(sab: SharedArrayBuffer): SabViews {\n if (sab.byteLength < SAB_MIN_BYTES) {\n throw new Error(`sync-sab: buffer too small (${sab.byteLength} < ${SAB_MIN_BYTES})`);\n }\n return {\n header: new Int32Array(sab, 0, SAB_HEADER_I32),\n window: new Uint8Array(sab, SAB_HEADER_BYTES),\n };\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport {\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsRequest,\n type SyncFsResult,\n} from './sync-fs-wire.ts';\nimport {\n encodeSabResult,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_SEQ,\n SAB_I_STATE,\n SAB_I_STATUS,\n SAB_I_TOTAL,\n SAB_STATE_READY,\n type SabViews,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabNextMsg,\n type SyncSabReqMsg,\n sabViews,\n} from './sync-sab-wire.ts';\n\nexport interface SabPortLike {\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface SyncSabResponderHandle {\n dispose(): void;\n}\n\ninterface PendingPayload {\n status: number;\n payload: Uint8Array;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst PENDING_TTL_MS = SYNC_FS_REQUEST_TIMEOUT_MS + 5_000;\n\nexport type SyncSabDispatchRequest = SyncFsRequest | (WasmSyscall & { token: string });\n\nexport interface SyncSabResponderOptions {\n dispatch: (req: SyncSabDispatchRequest) => Promise<SyncFsResult>;\n}\n\nexport function attachSyncSabResponder(\n port: SabPortLike,\n sab: SharedArrayBuffer,\n token: string,\n opts: SyncSabResponderOptions\n): SyncSabResponderHandle {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const pending = new Map<number, PendingPayload>();\n let disposed = false;\n\n const { dispatch } = opts;\n\n function drop(id: number): void {\n const entry = pending.get(id);\n if (!entry) return;\n clearTimeout(entry.timer);\n pending.delete(id);\n }\n\n function publish(id: number, entry: PendingPayload, offset: number): void {\n const chunk = Math.min(window.byteLength, entry.payload.byteLength - offset);\n if (chunk > 0) window.set(entry.payload.subarray(offset, offset + chunk));\n Atomics.store(header, SAB_I_STATUS, entry.status);\n Atomics.store(header, SAB_I_TOTAL, entry.payload.byteLength);\n Atomics.store(header, SAB_I_CHUNK, chunk);\n Atomics.store(header, SAB_I_OFFSET, offset);\n Atomics.store(header, SAB_I_SEQ, id);\n Atomics.store(header, SAB_I_STATE, SAB_STATE_READY);\n Atomics.notify(header, SAB_I_STATE);\n\n if (offset + chunk >= entry.payload.byteLength) drop(id);\n }\n\n function settle(id: number, result: SyncFsResult): void {\n if (disposed) return;\n const { status, payload } = encodeSabResult(result);\n\n drop(id);\n const entry: PendingPayload = {\n status,\n payload,\n timer: setTimeout(() => drop(id), PENDING_TTL_MS),\n };\n pending.set(id, entry);\n publish(id, entry, 0);\n }\n\n const handler = (event: MessageEvent): void => {\n const data = event.data as\n | { type?: unknown; id?: unknown; req?: unknown; offset?: unknown }\n | undefined;\n if (!data || typeof data.id !== 'number') return;\n if (data.type === SYNC_SAB_NEXT_MSG) {\n const entry = pending.get(data.id);\n const offset = (data as Partial<SyncSabNextMsg>).offset;\n if (\n !entry ||\n typeof offset !== 'number' ||\n !Number.isInteger(offset) ||\n offset < 0 ||\n offset > entry.payload.byteLength\n ) {\n settle(data.id, { ok: false, errno: 'EIO', message: 'sync-sab: bad continuation' });\n return;\n }\n publish(data.id, entry, offset);\n return;\n }\n if (data.type !== SYNC_SAB_REQ_MSG || !data.req || typeof data.req !== 'object') return;\n const id = data.id;\n\n const body = (data as SyncSabReqMsg).req;\n const req = { ...body, token } as SyncSabDispatchRequest;\n let dispatched: Promise<SyncFsResult>;\n try {\n dispatched = dispatch(req);\n } catch (err) {\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n void dispatched.then(\n (result) => settle(id, result),\n (err) =>\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n })\n );\n };\n\n port.addEventListener('message', handler);\n return {\n dispose: () => {\n if (disposed) return;\n disposed = true;\n port.removeEventListener('message', handler);\n for (const id of [...pending.keys()]) drop(id);\n },\n };\n}\n", "import { KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport { SIG } from './signals.ts';\n\nexport interface Termios {\n c_iflag: number;\n c_oflag: number;\n c_cflag: number;\n c_lflag: number;\n c_cc: number[];\n}\n\nexport interface TtyScreen {\n write(bytes: Uint8Array): void;\n}\n\nconst ICRNL = 0o400;\nconst IUTF8 = 0o40000;\nconst OPOST = 0o1;\nconst ONLCR = 0o4;\nconst ISIG = 0o1;\nconst ICANON = 0o2;\nconst ECHO = 0o10;\nconst ECHOE = 0o20;\nconst ECHOCTL = 0o1000;\nconst NOFLSH = 0o200;\nconst IEXTEN = 0o100000;\nconst VINTR = 0;\nconst VQUIT = 1;\nconst VERASE = 2;\nconst VKILL = 3;\nconst VEOF = 4;\nconst VSUSP = 10;\nconst VWERASE = 14;\n\nexport function defaultTermios(): Termios {\n const cCc = new Array<number>(32).fill(0);\n Object.assign(cCc, { [VINTR]: 0x03, [VQUIT]: 0x1c, [VERASE]: 0x7f, [VKILL]: 0x15 });\n Object.assign(cCc, { [VEOF]: 0x04, 6: 1, 8: 0x11, 9: 0x13, [VSUSP]: 0x1a });\n Object.assign(cCc, { 12: 0x12, 13: 0x0f, [VWERASE]: 0x17, 15: 0x16 });\n return {\n c_iflag: ICRNL | 0o2000 | 0o20000 | IUTF8,\n c_oflag: OPOST | ONLCR,\n c_cflag: 0o17 | 0o60 | 0o200,\n c_lflag: ISIG | ICANON | ECHO | ECHOE | 0o40 | ECHOCTL | 0o4000 | IEXTEN,\n c_cc: cCc,\n };\n}\n\nconst encoder = new TextEncoder();\n\nfunction isContinuation(byte: number): boolean {\n return (byte & 0xc0) === 0x80;\n}\n\nexport class KernelTty {\n private termios = defaultTermios();\n private cols = 80;\n private rows = 24;\n\n private readable: Array<Uint8Array | null> = [];\n\n private line: number[] = [];\n private waiters: Array<() => void> = [];\n\n private hungUp = false;\n\n name?: string;\n\n private readonly screen: TtyScreen;\n\n private readonly signal: (sig: number) => void;\n\n constructor(\n screen: TtyScreen,\n\n signal: (sig: number) => void\n ) {\n this.screen = screen;\n\n this.signal = signal;\n }\n\n receive(bytes: Uint8Array): void {\n for (const byte of bytes) this.key(byte);\n this.wake();\n }\n\n resize(cols: number, rows: number): void {\n this.setSize(cols, rows);\n this.signal(SIG.WINCH);\n }\n\n hangup(): void {\n this.hungUp = true;\n this.wake();\n }\n\n signalHangup(): void {\n this.signal(SIG.HUP);\n }\n\n setSize(cols: number, rows: number): void {\n this.cols = cols;\n this.rows = rows;\n }\n\n tcgets(): Termios {\n return { ...this.termios, c_cc: [...this.termios.c_cc] };\n }\n\n tcsets(termios: Termios): void {\n const wasCanonical = this.canonical;\n this.termios = { ...termios, c_cc: [...termios.c_cc] };\n\n if (wasCanonical && !this.canonical && this.line.length > 0) {\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n this.wake();\n }\n }\n\n winsize(): [number, number] {\n return [this.rows, this.cols];\n }\n\n file(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.read(max, signal),\n write: async (bytes) => {\n if (this.hungUp) throw new KernelError('EIO');\n this.output(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.readable.length > 0 || this.hungUp,\n writable: true,\n hangup: this.hungUp,\n }),\n changed: (signal) => this.changed(signal),\n close: () => {},\n tty: this,\n });\n }\n\n private get canonical(): boolean {\n return (this.termios.c_lflag & ICANON) !== 0;\n }\n\n private cc(slot: number): number {\n return this.termios.c_cc[slot] ?? 0;\n }\n\n private key(input: number): void {\n const { c_iflag, c_lflag } = this.termios;\n const byte = input === 0x0d && c_iflag & ICRNL ? 0x0a : input;\n if (c_lflag & ISIG && this.signalKey(byte)) return;\n if (!this.canonical) {\n this.readable.push(Uint8Array.of(byte));\n if (c_lflag & ECHO) this.echo(byte);\n return;\n }\n this.edit(byte);\n }\n\n private signalKey(byte: number): boolean {\n const sig =\n byte === this.cc(VINTR)\n ? SIG.INT\n : byte === this.cc(VQUIT)\n ? SIG.QUIT\n : byte === this.cc(VSUSP)\n ? SIG.TSTP\n : 0;\n if (!sig || byte === 0) return false;\n if (this.termios.c_lflag & ECHO) this.echo(byte);\n if (!(this.termios.c_lflag & NOFLSH)) {\n this.line = [];\n this.readable = [];\n }\n this.signal(sig);\n return true;\n }\n\n private edit(byte: number): void {\n const echo = (this.termios.c_lflag & ECHO) !== 0;\n if (byte === this.cc(VERASE) || byte === 0x08) {\n this.rubOut(this.lastCharLength());\n } else if (byte === this.cc(VKILL)) {\n this.rubOut(this.line.length);\n } else if (byte === this.cc(VWERASE)) {\n this.rubOut(this.lastWordLength());\n } else if (byte === this.cc(VEOF)) {\n this.readable.push(this.line.length > 0 ? Uint8Array.from(this.line) : null);\n this.line = [];\n } else if (byte === 0x0a) {\n this.line.push(byte);\n if (echo) this.output(encoder.encode('\\n'));\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n } else {\n this.line.push(byte);\n if (echo) this.echo(byte);\n }\n }\n\n private lastWordLength(): number {\n let end = this.line.length;\n while (end > 0 && this.line[end - 1] === 0x20) end--;\n while (end > 0 && this.line[end - 1] !== 0x20) end--;\n return this.line.length - end;\n }\n\n private lastCharLength(): number {\n const { line } = this;\n let n = Math.min(1, line.length);\n if (this.termios.c_iflag & IUTF8) {\n while (n < line.length && isContinuation(line[line.length - n] ?? 0)) n++;\n }\n return n;\n }\n\n private rubOut(n: number): void {\n const dropped = this.line.splice(this.line.length - n, n);\n const utf8 = (this.termios.c_iflag & IUTF8) !== 0;\n const cells = utf8 ? dropped.filter((b) => !isContinuation(b)).length : dropped.length;\n if (cells > 0 && this.termios.c_lflag & ECHO) {\n this.output(encoder.encode('\\b \\b'.repeat(cells)), false);\n }\n }\n\n private echo(byte: number): void {\n if (byte < 0x20 && byte !== 0x0a && byte !== 0x09 && this.termios.c_lflag & ECHOCTL) {\n this.output(Uint8Array.of(0x5e, byte + 0x40), false);\n return;\n }\n this.output(Uint8Array.of(byte));\n }\n\n private output(bytes: Uint8Array, translate = true): void {\n const { c_oflag } = this.termios;\n if (!translate || !(c_oflag & OPOST && c_oflag & ONLCR) || !bytes.includes(0x0a)) {\n this.screen.write(bytes);\n return;\n }\n const out: number[] = [];\n for (const byte of bytes) {\n if (byte === 0x0a) out.push(0x0d);\n out.push(byte);\n }\n this.screen.write(Uint8Array.from(out));\n }\n\n private async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.readable.length === 0) {\n if (this.hungUp) return new Uint8Array(0);\n await this.changed(signal);\n }\n const head = this.readable[0];\n if (head === null) {\n this.readable.shift();\n return new Uint8Array(0);\n }\n if (head === undefined) return new Uint8Array(0);\n\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.readable.length > 0 && n < max) {\n const next = this.readable[0];\n if (next === null || next === undefined) break;\n const take = next.subarray(0, max - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.readable[0] = next.subarray(take.length);\n else this.readable.shift();\n if (this.canonical) break;\n }\n const out = new Uint8Array(n);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport { KernelTty } from './tty.ts';\n\nexport type PtySignal = (tty: KernelTty, sig: number) => void;\n\nexport class PtyPair {\n readonly slave: KernelTty;\n\n locked = true;\n\n packet = false;\n private queue: Uint8Array[] = [];\n private waiters: Array<() => void> = [];\n private masterOpen = true;\n private slaveRefs = 0;\n private slaveSeen = false;\n\n readonly index: number;\n\n private readonly onFree: (pair: PtyPair) => void;\n\n constructor(\n index: number,\n\n signal: PtySignal,\n\n onFree: (pair: PtyPair) => void\n ) {\n this.index = index;\n\n this.onFree = onFree;\n this.slave = new KernelTty({ write: (bytes) => this.fromSlave(bytes) }, (sig) =>\n signal(this.slave, sig)\n );\n this.slave.name = `/dev/pts/${index}`;\n }\n\n master(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.readMaster(max, signal),\n write: async (bytes) => {\n this.slave.receive(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.queue.length > 0 || this.slaveGone,\n writable: true,\n hangup: this.slaveGone,\n }),\n changed: (signal) => this.changed(signal),\n close: () => this.closeMaster(),\n pty: this,\n });\n }\n\n openSlave(): OpenFile {\n if (!this.masterOpen || this.locked) throw new KernelError('EIO');\n const file = this.slave.file().file;\n this.slaveRefs += 1;\n this.slaveSeen = true;\n return new OpenFile({ ...file, close: () => this.closeSlave() });\n }\n\n private get slaveGone(): boolean {\n return this.slaveSeen && this.slaveRefs === 0;\n }\n\n private fromSlave(bytes: Uint8Array): void {\n if (!this.masterOpen) return;\n this.queue.push(bytes.slice());\n this.wake();\n }\n\n private async readMaster(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.queue.length === 0) {\n if (this.slaveGone) throw new KernelError('EIO');\n await this.changed(signal);\n }\n\n const status = this.packet ? 1 : 0;\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.queue.length > 0 && n < max - status) {\n const next = this.queue[0] as Uint8Array;\n const take = next.subarray(0, max - status - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.queue[0] = next.subarray(take.length);\n else this.queue.shift();\n }\n const out = new Uint8Array(status + n);\n let at = status;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private closeMaster(): void {\n this.masterOpen = false;\n this.queue = [];\n\n this.slave.hangup();\n this.slave.signalHangup();\n this.freeIfUnused();\n }\n\n private closeSlave(): void {\n this.slaveRefs -= 1;\n this.wake();\n this.freeIfUnused();\n }\n\n private freeIfUnused(): void {\n if (!this.masterOpen && this.slaveRefs === 0) this.onFree(this);\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n\nexport class PtyTable {\n private readonly pairs = new Map<number, PtyPair>();\n\n private readonly signal: PtySignal;\n\n constructor(signal: PtySignal) {\n this.signal = signal;\n }\n\n open(): { pair: PtyPair; master: OpenFile } {\n let index = 0;\n while (this.pairs.has(index)) index += 1;\n const pair = new PtyPair(index, this.signal, (p) => this.pairs.delete(p.index));\n this.pairs.set(index, pair);\n return { pair, master: pair.master() };\n }\n\n get(index: number): PtyPair {\n const pair = this.pairs.get(index);\n if (!pair) throw new KernelError('ENOENT');\n return pair;\n }\n\n numbers(): number[] {\n return [...this.pairs.keys()].sort((a, b) => a - b);\n }\n}\n\nexport function ptsNumber(path: string): number | undefined {\n const m = /^\\/dev\\/pts\\/(\\d+)$/.exec(path);\n return m ? Number(m[1]) : undefined;\n}\n\nexport type PtySyscall =\n | { op: 'pty-open' }\n | { op: 'pty-slave-open'; n: number; noctty: boolean }\n | { op: 'pty-number'; fd: number }\n | { op: 'pty-lock'; fd: number; lock: boolean }\n | { op: 'pty-ctty'; fd: number }\n | { op: 'pty-packet'; fd: number; on: boolean }\n | { op: 'pty-list' }\n | { op: 'pty-winsz-set'; fd: number; rows: number; cols: number };\n\nexport const PTY_OPS: readonly PtySyscall['op'][] = [\n 'pty-open',\n 'pty-slave-open',\n 'pty-number',\n 'pty-lock',\n 'pty-ctty',\n 'pty-packet',\n 'pty-list',\n 'pty-winsz-set',\n];\n\nexport interface PtyContext {\n pid: number;\n fds: FdTable;\n ptys?: PtyTable;\n jobs?: JobTable;\n}\n\nfunction masterOf(ctx: PtyContext, fd: number): PtyPair {\n const pair = ctx.fds.get(fd).file.pty;\n if (!pair) throw new KernelError('ENOTTY');\n return pair;\n}\n\nfunction terminalOf(ctx: PtyContext, fd: number): KernelTty {\n const file = ctx.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n}\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nexport function ptySyscall(req: PtySyscall, ctx: PtyContext): SyncFsResult {\n switch (req.op) {\n case 'pty-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n return json(ctx.fds.install(ctx.ptys.open().master, 3));\n }\n case 'pty-slave-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n const pair = ctx.ptys.get(req.n);\n const fd = ctx.fds.install(pair.openSlave(), 3);\n\n if (!req.noctty) ctx.jobs?.acquireTerminal(ctx.pid, pair.slave);\n return json(fd);\n }\n case 'pty-number':\n return json(masterOf(ctx, req.fd).index);\n case 'pty-lock':\n masterOf(ctx, req.fd).locked = req.lock;\n return done;\n case 'pty-ctty': {\n const tty = terminalOf(ctx, req.fd);\n\n const leader = ctx.jobs?.getsid(ctx.pid, 0) === ctx.pid;\n if (leader && ctx.jobs?.controllingTerminal(ctx.pid) === tty) return done;\n if (!ctx.jobs?.acquireTerminal(ctx.pid, tty)) throw new KernelError('EPERM');\n return done;\n }\n case 'pty-list':\n return json(ctx.ptys?.numbers() ?? []);\n case 'pty-packet':\n masterOf(ctx, req.fd).packet = req.on;\n return done;\n case 'pty-winsz-set':\n terminalOf(ctx, req.fd).resize(req.cols, req.rows);\n return done;\n }\n}\n", "import { type FdTable, KernelError, pollFile } from './fd-table.ts';\n\nexport interface SelectResult {\n read: number[];\n write: number[];\n\n hangup?: number[];\n}\n\nfunction ready(fds: FdTable, read: readonly number[], write: readonly number[]): SelectResult {\n const hangup = new Set<number>();\n const pick = (list: readonly number[], dir: 'readable' | 'writable') =>\n list.filter((fd) => {\n const state = pollFile(fds.get(fd).file);\n if (state.hangup) hangup.add(fd);\n return state[dir] || state.hangup;\n });\n const out: SelectResult = { read: pick(read, 'readable'), write: pick(write, 'writable') };\n if (hangup.size > 0) out.hangup = [...hangup];\n return out;\n}\n\nfunction interruption(signal: AbortSignal): { promise: Promise<never>; done(): void } {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal.aborted) fail();\n else signal.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal.removeEventListener('abort', fail) };\n}\n\nexport async function selectFds(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n timeoutMs: number,\n interrupt: AbortSignal\n): Promise<SelectResult> {\n const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : Date.now() + timeoutMs;\n const interrupted = interruption(interrupt);\n interrupted.promise.catch(() => {});\n try {\n return await waitReady(fds, read, write, deadline, interrupted.promise);\n } finally {\n interrupted.done();\n }\n}\n\nasync function waitReady(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n deadline: number,\n interrupted: Promise<never>\n): Promise<SelectResult> {\n for (;;) {\n const now = ready(fds, read, write);\n if (now.read.length > 0 || now.write.length > 0 || Date.now() >= deadline) return now;\n\n const round = new AbortController();\n const changes = [...new Set([...read, ...write])].flatMap((fd) => {\n const file = fds.get(fd).file;\n return file.changed === undefined ? [] : [file.changed(round.signal).catch(() => undefined)];\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const expiry =\n deadline === Number.POSITIVE_INFINITY\n ? []\n : [new Promise<void>((resolve) => (timer = setTimeout(resolve, deadline - Date.now())))];\n try {\n await Promise.race([...changes, ...expiry, interrupted]);\n } finally {\n round.abort();\n clearTimeout(timer);\n }\n }\n}\n", "import { KernelError, OpenFile } from './fd-table.ts';\n\nexport interface VfsFileFs {\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array): Promise<void>;\n}\n\nconst O_ACCMODE = 0o3;\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\n\nconst SEEK_SET = 0;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\n\nexport interface VfsFileOptions {\n path: string;\n\n flags: number;\n\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n dirty?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n}\n\nexport const WRITEBACK_MS = 250;\n\nconst WRITEBACK_COST_FACTOR = 10;\n\nfunction isMissing(err: unknown): boolean {\n if ((err as { code?: unknown } | null)?.code === 'ENOENT') return true;\n return err instanceof Error && err.message.startsWith('ENOENT');\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(root.endsWith('/') ? root : `${root}/`);\n}\n\nexport class VfsNode {\n private data: Uint8Array | undefined;\n private length = 0;\n private dirty = false;\n private queue: Promise<unknown> = Promise.resolve();\n\n private writeBack: ReturnType<typeof setTimeout> | undefined;\n\n private writeBackCost = 0;\n\n opens = 0;\n\n private missing = false;\n\n private readonly fs: VfsFileFs;\n\n path: string;\n\n orphaned: boolean;\n\n constructor(\n fs: VfsFileFs,\n\n path: string,\n\n contents?: Uint8Array,\n\n orphaned: boolean = false,\n\n dirty = false\n ) {\n this.fs = fs;\n\n this.path = path;\n\n this.orphaned = orphaned;\n if (contents !== undefined) this.data = new Uint8Array(contents);\n else if (orphaned) this.data = new Uint8Array(0);\n this.length = this.data?.length ?? 0;\n if (dirty && contents !== undefined) this.markDirty();\n }\n\n serial<T>(op: () => Promise<T>): Promise<T> {\n const next = this.queue.then(op);\n this.queue = next.catch(() => undefined);\n return next;\n }\n\n async load(): Promise<Uint8Array> {\n if (!this.data) {\n try {\n this.data = await this.fs.readFileBuffer(this.path);\n } catch (err) {\n if (!isMissing(err)) throw err;\n this.data = new Uint8Array(0);\n this.missing = true;\n }\n this.length = this.data.length;\n }\n return this.data;\n }\n\n replace(contents: Uint8Array): void {\n this.data = new Uint8Array(contents);\n this.length = this.data.length;\n this.missing = false;\n this.markDirty();\n }\n\n async materialize(): Promise<void> {\n await this.load();\n if (!this.missing || this.orphaned) return;\n this.missing = false;\n await this.fs.writeFile(this.path, this.data?.slice(0, this.length) ?? new Uint8Array(0));\n }\n\n async size(): Promise<number> {\n await this.load();\n return this.length;\n }\n\n async pread(max: number, at: number): Promise<Uint8Array> {\n const bytes = await this.load();\n const n = Math.max(0, Math.min(max, this.length - at));\n return bytes.slice(at, at + n);\n }\n\n async pwrite(bytes: Uint8Array, at: number): Promise<number> {\n await this.load();\n const buf = this.ensure(at + bytes.length);\n if (at > this.length) buf.fill(0, this.length, at);\n buf.set(bytes, at);\n this.length = Math.max(this.length, at + bytes.length);\n this.markDirty();\n return bytes.length;\n }\n\n async truncate(size: number): Promise<void> {\n await this.load();\n const buf = this.ensure(size);\n if (size > this.length) buf.fill(0, this.length, size);\n this.length = size;\n this.markDirty();\n }\n\n private markDirty(): void {\n this.dirty = true;\n if (this.writeBack !== undefined || this.orphaned) return;\n const delay = Math.max(WRITEBACK_MS, this.writeBackCost * WRITEBACK_COST_FACTOR);\n this.writeBack = setTimeout(() => {\n this.writeBack = undefined;\n this.serial(() => this.flush()).catch(() => undefined);\n }, delay);\n }\n\n private ensure(need: number): Uint8Array {\n const cur = this.data ?? new Uint8Array(0);\n if (cur.length >= need) return cur;\n const grown = new Uint8Array(Math.max(need, cur.length * 2, 256));\n grown.set(cur.subarray(0, this.length));\n this.data = grown;\n return grown;\n }\n\n async flush(): Promise<void> {\n if (!this.dirty || !this.data || this.orphaned) return;\n this.dirty = false;\n const started = performance.now();\n try {\n await this.fs.writeFile(this.path, this.data.slice(0, this.length));\n } catch (err) {\n this.dirty = true;\n throw err;\n }\n this.writeBackCost = performance.now() - started;\n }\n}\n\nexport class VfsNodes {\n private readonly byPath = new Map<string, VfsNode>();\n\n private readonly fs: VfsFileFs;\n\n constructor(fs: VfsFileFs) {\n this.fs = fs;\n }\n\n open(path: string): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path);\n this.byPath.set(path, node);\n }\n node.opens++;\n return node;\n }\n\n adopt(path: string, contents: Uint8Array, dirty: boolean): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path, contents, false, dirty);\n this.byPath.set(path, node);\n } else if (dirty) {\n node.replace(contents);\n }\n node.opens++;\n return node;\n }\n\n closed(node: VfsNode): void {\n node.opens--;\n if (node.opens === 0 && this.byPath.get(node.path) === node) this.byPath.delete(node.path);\n }\n\n async flush(path: string): Promise<void> {\n for (const [p, node] of this.byPath) if (within(p, path)) await node.serial(() => node.flush());\n }\n\n async unlinking(path: string): Promise<void> {\n const node = this.byPath.get(path);\n if (node) await node.serial(() => node.load());\n }\n\n unlinked(path: string): void {\n const node = this.byPath.get(path);\n if (!node) return;\n node.orphaned = true;\n this.byPath.delete(path);\n }\n\n renamed(from: string, to: string): void {\n if (from === to) return;\n const moved: VfsNode[] = [];\n for (const [p, node] of this.byPath) {\n if (within(p, from)) moved.push(node);\n else if (within(p, to)) {\n node.orphaned = true;\n this.byPath.delete(p);\n }\n }\n for (const node of moved) {\n this.byPath.delete(node.path);\n node.path = to + node.path.slice(from.length);\n this.byPath.set(node.path, node);\n }\n }\n}\n\nexport function vfsFile(fs: VfsFileFs, opts: VfsFileOptions, nodes?: VfsNodes): OpenFile {\n const access = opts.flags & O_ACCMODE;\n const readable = access !== O_WRONLY;\n const writable = access === O_WRONLY || access === O_RDWR;\n\n const node =\n !nodes || opts.orphan\n ? new VfsNode(fs, opts.path, opts.contents, opts.orphan === true, opts.dirty === true)\n : opts.contents !== undefined\n ? nodes.adopt(opts.path, opts.contents, opts.dirty === true)\n : nodes.open(opts.path);\n\n let openError: { err: unknown } | undefined;\n const atOpen = (op: () => Promise<void>): void => {\n void node.serial(op).catch((err: unknown) => {\n openError ??= { err };\n });\n };\n if (opts.create) atOpen(() => node.materialize());\n if (opts.truncate) atOpen(() => node.truncate(0));\n const takeOpenError = (): void => {\n if (!openError) return;\n const { err } = openError;\n openError = undefined;\n throw err;\n };\n let offset = opts.position;\n const serial = <T>(op: () => Promise<T>) =>\n node.serial(() => {\n takeOpenError();\n return op();\n });\n\n return new OpenFile({\n read: readable\n ? (max) =>\n serial(async () => {\n const out = await node.pread(max, offset);\n offset += out.length;\n return out;\n })\n : undefined,\n write: writable\n ? (bytes) =>\n serial(async () => {\n if (opts.flags & O_APPEND) offset = await node.size();\n offset += await node.pwrite(bytes, offset);\n return bytes.length;\n })\n : undefined,\n seek: (to, whence) =>\n serial(async () => {\n let base = 0;\n if (whence === SEEK_CUR) base = offset;\n else if (whence === SEEK_END) base = await node.size();\n else if (whence !== SEEK_SET) throw new KernelError('EINVAL');\n if (base + to < 0) throw new KernelError('EINVAL');\n offset = base + to;\n return offset;\n }),\n pread: (max, at) =>\n serial(() => {\n if (!readable) throw new KernelError('EBADF');\n return node.pread(max, at);\n }),\n pwrite: (bytes, at) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.pwrite(bytes, at);\n }),\n resize: (size) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.truncate(size);\n }),\n stat: () =>\n serial(async () => ({\n path: node.path,\n size: await node.size(),\n ...(node.orphaned ? { orphan: true as const } : {}),\n })),\n flush: () => serial(() => node.flush()),\n\n close: () =>\n node.serial(async () => {\n try {\n takeOpenError();\n await node.flush();\n } finally {\n nodes?.closed(node);\n }\n }),\n });\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n type ChildForker,\n type ChildSpawner,\n type ChildStdio,\n ChildTable,\n type InheritedSlot,\n SpawnError,\n} from './children.ts';\nimport {\n type FdTable,\n type HeldMeta,\n heldFile,\n KernelError,\n type KernelFdKind,\n kernelFdKind,\n type OpenFile,\n openPipe,\n pollFile,\n} from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport type { ForkState } from './protocol.ts';\nimport { PTY_OPS, type PtySyscall, type PtyTable, ptySyscall } from './pty.ts';\nimport { selectFds } from './select.ts';\nimport { type DefaultAction, defaultAction, isSignal, SIG, sigbit } from './signals.ts';\nimport type { KernelTty, Termios } from './tty.ts';\nimport { type VfsFileFs, VfsNodes, vfsFile } from './vfs-file.ts';\n\nexport type WasmSyscall =\n | {\n op: 'fd-read';\n fd: number;\n max: number;\n\n nonblock?: boolean;\n\n peek?: boolean;\n }\n | { op: 'fd-write'; fd: number; body: Uint8Array; nonblock?: boolean }\n | { op: 'fd-close'; fd: number }\n | { op: 'fd-pipe' }\n | { op: 'fd-poll'; fd: number }\n | {\n op: 'fd-open-vfs';\n path: string;\n flags: number;\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n }\n | { op: 'fd-pread'; fd: number; offset: number; max: number }\n | { op: 'fd-pwrite'; fd: number; offset: number; body: Uint8Array }\n | { op: 'fd-resize'; fd: number; size: number }\n | { op: 'fd-vfs-stat'; fd: number }\n | { op: 'fd-path-flush'; path: string }\n | { op: 'fd-path-unlinking'; path: string }\n | { op: 'fd-path-unlinked'; path: string }\n | { op: 'fd-path-renamed'; from: string; to: string }\n | { op: 'fd-seek'; fd: number; offset: number; whence: number }\n | { op: 'fd-select'; read: number[]; write: number[]; timeoutMs: number }\n | { op: 'fd-info'; fd: number }\n | { op: 'fd-dup'; fd: number; min?: number }\n | { op: 'fd-reserve'; fd?: number; min?: number; meta?: HeldMeta }\n | { op: 'fd-meta'; fd: number; meta: HeldMeta }\n | { op: 'fd-setfl'; fd: number; flags: number }\n | { op: 'fd-cloexec'; fd: number; on: boolean }\n | { op: 'fd-list' }\n | {\n op: 'proc-alarm';\n sig: number;\n ms: number;\n firstMs?: number;\n repeat: boolean;\n\n timer?: number;\n }\n | { op: 'fd-renumber'; from: number; to: number; keep?: boolean }\n | {\n op: 'fd-promote';\n fd: number;\n share?: number;\n path?: string;\n flags?: number;\n position?: number;\n contents?: Uint8Array;\n orphan?: boolean;\n\n dirty?: boolean;\n }\n | { op: 'fd-open-tty'; name?: string }\n | { op: 'tty-get'; fd: number }\n | { op: 'tty-set'; fd: number; termios: Termios }\n | { op: 'tty-winsz'; fd: number }\n | { op: 'fd-flush'; fd: number }\n | {\n op: 'proc-spawn';\n file: string;\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n stdio: ChildStdio[];\n\n inherit?: InheritedSlot[];\n }\n | {\n op: 'proc-wait';\n pid: number;\n nohang: boolean;\n\n untraced?: boolean;\n continued?: boolean;\n }\n | { op: 'proc-captured'; pid: number; slot: number }\n | { op: 'proc-fork'; state: ForkState }\n | { op: 'proc-kill'; pid: number; sig: number }\n | { op: 'proc-exec'; pid: number }\n | { op: 'proc-setpgid'; pid: number; pgid: number }\n | { op: 'proc-getpgid'; pid: number }\n | { op: 'proc-getsid'; pid: number }\n | { op: 'proc-setsid' }\n | { op: 'tty-pgrp-get'; fd: number }\n | { op: 'tty-pgrp-set'; fd: number; pgrp: number }\n | { op: 'sig-mask'; caught: number; ignored: number }\n | { op: 'sig-pause' }\n | PtySyscall;\n\ntype FdSyscall = Extract<WasmSyscall, { op: `fd-${string}` }>;\n\ntype JobSyscall = Extract<\n WasmSyscall,\n { op: 'proc-setpgid' | 'proc-getpgid' | 'proc-getsid' | 'proc-setsid' }\n>;\n\nconst JOB_OPS: ReadonlySet<string> = new Set([\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n]);\n\nfunction isJobSyscall(req: WasmSyscall): req is JobSyscall {\n return JOB_OPS.has(req.op);\n}\n\nfunction isPtySyscall(req: WasmSyscall): req is PtySyscall {\n return req.op.startsWith('pty-');\n}\n\ntype VfsSyscall = Extract<\n FdSyscall,\n {\n op:\n | 'fd-pread'\n | 'fd-pwrite'\n | 'fd-resize'\n | 'fd-vfs-stat'\n | 'fd-path-flush'\n | 'fd-path-unlinking'\n | 'fd-path-unlinked'\n | 'fd-path-renamed';\n }\n>;\n\nfunction isVfsSyscall(req: FdSyscall): req is VfsSyscall {\n return (\n req.op.startsWith('fd-path-') ||\n req.op === 'fd-pread' ||\n req.op === 'fd-pwrite' ||\n req.op === 'fd-resize' ||\n req.op === 'fd-vfs-stat'\n );\n}\n\nfunction isFdSyscall(req: WasmSyscall): req is FdSyscall {\n return req.op.startsWith('fd-');\n}\n\nfunction isTtySyscall(req: WasmSyscall): req is TtySyscall {\n return req.op.startsWith('tty-');\n}\n\nexport interface FdInfo {\n tty: boolean;\n kind: KernelFdKind;\n meta?: HeldMeta;\n flags?: number;\n cloexec?: true;\n\n name?: string;\n}\n\nconst SYSCALL_OPS: ReadonlySet<string> = new Set([\n 'fd-read',\n 'fd-write',\n 'fd-close',\n 'fd-pipe',\n 'fd-poll',\n 'fd-open-vfs',\n 'fd-seek',\n 'fd-pread',\n 'fd-pwrite',\n 'fd-resize',\n 'fd-vfs-stat',\n 'fd-path-flush',\n 'fd-path-unlinking',\n 'fd-path-unlinked',\n 'fd-path-renamed',\n 'fd-select',\n 'fd-info',\n 'fd-dup',\n 'fd-reserve',\n 'fd-meta',\n 'fd-setfl',\n 'fd-cloexec',\n 'fd-list',\n 'proc-alarm',\n 'fd-renumber',\n 'fd-promote',\n 'fd-open-tty',\n 'tty-get',\n 'tty-set',\n 'tty-winsz',\n 'fd-flush',\n 'proc-spawn',\n 'proc-wait',\n 'proc-captured',\n 'proc-fork',\n 'proc-kill',\n 'proc-exec',\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n 'tty-pgrp-get',\n 'tty-pgrp-set',\n 'sig-mask',\n 'sig-pause',\n ...PTY_OPS,\n]);\n\ntype TtySyscall = Extract<WasmSyscall, { op: `tty-${string}` }>;\n\nexport function isWasmSyscall(req: object): req is WasmSyscall {\n const op = (req as { op?: unknown }).op;\n return typeof op === 'string' && SYSCALL_OPS.has(op);\n}\n\nconst MAX_READ = 1024 * 1024;\n\nexport interface WasmProcessOptions {\n spawner?: ChildSpawner;\n\n forker?: ChildForker;\n\n fs: VfsFileFs;\n\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n\n onPending?: (sig: number) => void;\n\n onTimer?: (which: number) => void;\n\n hasPending?: () => boolean;\n\n raise?: (sig: number) => void;\n\n onReap?: (pid: number) => void;\n\n jobs?: JobTable;\n\n ptys?: PtyTable;\n}\n\nexport type StateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport type SignalOutcome = DefaultAction | 'deliver' | 'forward';\n\nexport class WasmProcess {\n private exited = false;\n private readonly children: ChildTable;\n\n private caught = 0;\n private ignored = 0;\n\n private interrupt = new AbortController();\n\n private execChild: number | undefined;\n\n execTermsig: number | undefined;\n\n private stopped = 0;\n\n private stops = 0;\n private resumed: Promise<void> = Promise.resolve();\n private wake: (() => void) | undefined;\n private readonly stateListeners: StateListener[] = [];\n\n private readonly nodes: VfsNodes;\n\n readonly pid: number;\n\n readonly fds: FdTable;\n\n private readonly options: WasmProcessOptions;\n\n constructor(\n pid: number,\n\n fds: FdTable,\n\n options: WasmProcessOptions\n ) {\n this.pid = pid;\n\n this.fds = fds;\n\n this.options = options;\n this.children = new ChildTable(fds, options.spawner, options.forker);\n this.nodes = new VfsNodes(options.fs);\n this.children.onChildState = () => this.signal(SIG.CHLD);\n this.children.onReap = options.onReap;\n }\n\n signal(sig: number): SignalOutcome {\n if (this.execChild !== undefined) {\n void Promise.resolve(this.options.kill?.(this.execChild, sig)).catch(() => undefined);\n return sig === SIG.KILL ? 'terminate' : 'forward';\n }\n if (sig === SIG.KILL) return 'terminate';\n\n if (sig === SIG.CONT) this.cont();\n if (sig === SIG.STOP) return this.stop(sig);\n const bit = sigbit(sig);\n if (this.ignored & bit) return 'ignore';\n if (!(this.caught & bit)) {\n const action = defaultAction(sig);\n return action === 'stop' ? this.stop(sig) : action;\n }\n this.options.onPending?.(sig);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n return 'deliver';\n }\n\n onState(listener: StateListener): void {\n this.stateListeners.push(listener);\n }\n\n private stop(sig: number): 'stop' {\n if (this.stopped) return 'stop';\n this.stopped = sig;\n this.stops++;\n this.resumed = new Promise((resolve) => (this.wake = resolve));\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n for (const listener of this.stateListeners) listener('stopped', sig);\n return 'stop';\n }\n\n private cont(): void {\n if (!this.stopped) return;\n this.stopped = 0;\n this.wake?.();\n for (const listener of this.stateListeners) listener('continued', SIG.CONT);\n }\n\n async syscall(req: WasmSyscall): Promise<SyncFsResult> {\n for (;;) {\n await this.resumed;\n const stops = this.stops;\n const result = await this.dispatch(req);\n\n const restart = !result.ok && result.errno === 'EINTR' && this.stops !== stops;\n if (restart && !this.options.hasPending?.()) continue;\n\n await this.resumed;\n return result;\n }\n }\n\n private async dispatch(req: WasmSyscall): Promise<SyncFsResult> {\n try {\n if (isFdSyscall(req)) return await this.fdSyscall(req);\n if (isTtySyscall(req)) return this.ttySyscall(req);\n if (isJobSyscall(req)) return this.jobSyscall(req);\n if (isPtySyscall(req)) {\n const { ptys, jobs } = this.options;\n return ptySyscall(req, { pid: this.pid, fds: this.fds, ptys, jobs });\n }\n return await this.procSyscall(req);\n } catch (e) {\n if (e instanceof KernelError || e instanceof SpawnError) {\n return { ok: false, errno: e.code, message: e.code };\n }\n throw e;\n }\n }\n\n private blockingSignal(): AbortSignal {\n if (this.options.hasPending?.()) throw new KernelError('EINTR');\n return this.interrupt.signal;\n }\n\n private async read(req: Extract<WasmSyscall, { op: 'fd-read' }>): Promise<Uint8Array> {\n const file = this.fds.get(req.fd).file;\n const read = req.peek ? file.peek : file.read;\n if (!read) throw new KernelError(req.peek && file.read ? 'EOPNOTSUPP' : 'EBADF');\n if (file.tty) this.checkForeground(file.tty);\n\n if (req.max <= 0) return new Uint8Array(0);\n const ready = pollFile(file).readable;\n if (!ready && req.nonblock) throw new KernelError('EAGAIN');\n const signal = ready ? this.interrupt.signal : this.blockingSignal();\n return read.call(file, Math.max(0, Math.min(req.max, MAX_READ)), signal);\n }\n\n private async write(fd: number, body: Uint8Array, nonblock = false): Promise<number> {\n const file = this.fds.get(fd).file;\n if (!file.write) throw new KernelError('EBADF');\n if (!pollFile(file).writable) {\n if (nonblock) throw new KernelError('EAGAIN');\n return file.write(body, this.blockingSignal());\n }\n\n if (nonblock) return file.write(body, AbortSignal.abort());\n\n return file.write(\n body,\n this.options.hasPending?.() ? AbortSignal.abort() : this.interrupt.signal\n );\n }\n\n private openVfsFile(req: Extract<FdSyscall, { op: 'fd-open-vfs' }>): OpenFile {\n return vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags,\n position: req.position,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.truncate ? { truncate: true } : {}),\n ...(req.create ? { create: true } : {}),\n },\n this.nodes\n );\n }\n\n private async fdSyscall(req: FdSyscall): Promise<SyncFsResult> {\n if (isVfsSyscall(req)) return this.vfsSyscall(req);\n switch (req.op) {\n case 'fd-read':\n return { ok: true, kind: 'bytes', bytes: await this.read(req) };\n case 'fd-write':\n return { ok: true, kind: 'json', json: await this.write(req.fd, req.body, req.nonblock) };\n case 'fd-close':\n await Promise.resolve(this.fds.close(req.fd));\n return { ok: true, kind: 'void' };\n case 'fd-pipe': {\n const pipe = openPipe();\n const read = this.fds.install(pipe.read, 3);\n let write: number;\n try {\n write = this.fds.install(pipe.write, 3);\n } catch (e) {\n await Promise.resolve(this.fds.close(read));\n throw e;\n }\n return { ok: true, kind: 'json', json: [read, write] };\n }\n case 'fd-poll':\n return { ok: true, kind: 'json', json: pollFile(this.fds.get(req.fd).file) };\n case 'fd-open-vfs':\n return { ok: true, kind: 'json', json: this.fds.install(this.openVfsFile(req), 3) };\n case 'fd-info':\n return { ok: true, kind: 'json', json: this.fdInfo(req.fd) };\n case 'fd-list':\n return {\n ok: true,\n kind: 'json',\n json: this.fds.numbers().map((fd) => ({ fd, ...this.fdInfo(fd) })),\n };\n case 'fd-meta': {\n const file = this.fds.get(req.fd).file;\n if (!file.held) throw new KernelError('EBADF');\n file.heldMeta = req.meta;\n return { ok: true, kind: 'void' };\n }\n case 'fd-setfl':\n this.fds.setStatusFlags(req.fd, req.flags);\n return { ok: true, kind: 'void' };\n case 'fd-cloexec':\n if (req.on) this.fds.setCloseOnExec(req.fd);\n else this.fds.clearCloseOnExec(req.fd);\n return { ok: true, kind: 'void' };\n case 'fd-dup':\n return { ok: true, kind: 'json', json: this.fds.dup(req.fd, req.min ?? 3) };\n case 'fd-reserve':\n return { ok: true, kind: 'json', json: this.reserve(req.fd, req.min, req.meta) };\n case 'fd-promote':\n this.promote(req);\n return { ok: true, kind: 'void' };\n case 'fd-renumber':\n if (req.from !== req.to) {\n this.fds.dup2(req.from, req.to);\n if (!req.keep) await Promise.resolve(this.fds.close(req.from));\n }\n return { ok: true, kind: 'void' };\n case 'fd-open-tty': {\n const tty =\n req.name === undefined\n ? this.controllingTerminal()\n : this.options.jobs?.terminalNamed(req.name);\n if (!tty) throw new KernelError('ENXIO');\n return { ok: true, kind: 'json', json: this.fds.install(tty.file(), 3) };\n }\n case 'fd-select': {\n const { read, write, timeoutMs } = req;\n const signal = this.blockingSignal();\n const selected = await selectFds(this.fds, read, write, timeoutMs, signal);\n return { ok: true, kind: 'json', json: selected };\n }\n case 'fd-seek': {\n const file = this.fds.get(req.fd).file;\n if (!file.seek) throw new KernelError('ESPIPE');\n return { ok: true, kind: 'json', json: await file.seek(req.offset, req.whence) };\n }\n case 'fd-flush': {\n const file = this.fds.get(req.fd).file;\n if (file.flush) await file.flush();\n return { ok: true, kind: 'void' };\n }\n }\n }\n\n private async vfsSyscall(req: VfsSyscall): Promise<SyncFsResult> {\n if ('path' in req || 'from' in req) {\n const nodes = this.nodes;\n if (req.op === 'fd-path-flush') await nodes.flush(req.path);\n else if (req.op === 'fd-path-unlinking') await nodes.unlinking(req.path);\n else if (req.op === 'fd-path-unlinked') nodes.unlinked(req.path);\n else if (req.op === 'fd-path-renamed') nodes.renamed(req.from, req.to);\n return { ok: true, kind: 'void' };\n }\n const file = this.fds.get(req.fd).file;\n if (!file.pread || !file.pwrite || !file.resize || !file.stat) throw new KernelError('ESPIPE');\n switch (req.op) {\n case 'fd-pread':\n return {\n ok: true,\n kind: 'bytes',\n bytes: await file.pread(Math.min(req.max, MAX_READ), req.offset),\n };\n case 'fd-pwrite':\n return { ok: true, kind: 'json', json: await file.pwrite(req.body, req.offset) };\n case 'fd-resize':\n await file.resize(req.size);\n return { ok: true, kind: 'void' };\n case 'fd-vfs-stat':\n return { ok: true, kind: 'json', json: await file.stat() };\n }\n }\n\n private promote(req: Extract<WasmSyscall, { op: 'fd-promote' }>): void {\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n if (req.share !== undefined) {\n this.fds.dup2(req.share, req.fd);\n return;\n }\n if (req.path === undefined) throw new KernelError('EINVAL');\n const file = vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags ?? 0,\n position: req.position ?? 0,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.dirty ? { dirty: true } : {}),\n },\n this.nodes\n );\n this.fds.installAt(req.fd, file);\n }\n\n private reserve(fd: number | undefined, min = 3, meta?: HeldMeta): number {\n if (fd === undefined) return this.fds.install(heldFile(meta), Math.max(3, min));\n if (this.fds.has(fd)) throw new KernelError('EBADF');\n this.fds.installAt(fd, heldFile(meta));\n return fd;\n }\n\n private fdInfo(fd: number): FdInfo {\n const file = this.fds.get(fd).file;\n const flags = this.fds.statusFlags(fd);\n return {\n tty: file.tty !== undefined,\n kind: kernelFdKind(file),\n ...(file.heldMeta ? { meta: file.heldMeta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(this.fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(file.tty?.name ? { name: file.tty.name } : file.pty ? { name: '/dev/ptmx' } : {}),\n };\n }\n\n private ttySyscall(req: TtySyscall): SyncFsResult {\n const tty = this.tty(req.fd);\n const jobs = this.options.jobs;\n switch (req.op) {\n case 'tty-get':\n return { ok: true, kind: 'json', json: tty.tcgets() };\n case 'tty-set':\n tty.tcsets(req.termios);\n return { ok: true, kind: 'void' };\n case 'tty-winsz':\n return { ok: true, kind: 'json', json: tty.winsize() };\n case 'tty-pgrp-get':\n return { ok: true, kind: 'json', json: jobs ? jobs.tcgetpgrp(tty, this.sid()) : this.pid };\n case 'tty-pgrp-set':\n if (jobs) jobs.tcsetpgrp(this.pid, tty, req.pgrp);\n else if (req.pgrp !== this.pid) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n }\n }\n\n private checkForeground(tty: KernelTty): void {\n const jobs = this.options.jobs;\n if (!jobs) return;\n const session = jobs.controllingTerminal(this.pid);\n if (session !== undefined && session !== tty) return;\n const pgid = this.pgid();\n if (jobs.tcgetpgrp(tty, this.sid()) === pgid) return;\n if (this.ignored & sigbit(SIG.TTIN)) throw new KernelError('EIO');\n jobs.killGroup(pgid, SIG.TTIN);\n throw new KernelError('EINTR');\n }\n\n private waitGroup(pid: number): ((child: number) => boolean) | undefined {\n const jobs = this.options.jobs;\n if (!jobs || pid > 0 || pid === -1) return undefined;\n const group = pid === 0 ? this.pgid() : -pid;\n\n return (child) => (jobs.pgidOf(child) ?? this.pgid()) === group;\n }\n\n private pgid(): number {\n return this.options.jobs?.getpgid(this.pid, 0) ?? this.pid;\n }\n\n private sid(): number {\n return this.options.jobs?.getsid(this.pid, 0) ?? this.pid;\n }\n\n private controllingTerminal(): KernelTty | undefined {\n const session = this.options.jobs?.controllingTerminal(this.pid);\n return session === undefined ? this.fds.stdioTerminal() : (session ?? undefined);\n }\n\n private jobSyscall(req: JobSyscall): SyncFsResult {\n const jobs = this.options.jobs;\n const self = (pid: number): number => {\n if (pid !== 0 && pid !== this.pid) throw new KernelError('ESRCH');\n return this.pid;\n };\n switch (req.op) {\n case 'proc-setpgid':\n if (jobs) jobs.setpgid(this.pid, req.pid, req.pgid);\n else if (self(req.pid) !== (req.pgid || this.pid)) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n case 'proc-getpgid':\n return { ok: true, kind: 'json', json: jobs?.getpgid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-getsid':\n return { ok: true, kind: 'json', json: jobs?.getsid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-setsid':\n if (!jobs) throw new KernelError('EPERM');\n return { ok: true, kind: 'json', json: jobs.setsid(this.pid) };\n }\n }\n\n private tty(fd: number): KernelTty {\n const file = this.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n }\n\n private async procSyscall(\n req: Exclude<WasmSyscall, FdSyscall | TtySyscall | JobSyscall | PtySyscall>\n ): Promise<SyncFsResult> {\n switch (req.op) {\n case 'proc-fork':\n return { ok: true, kind: 'json', json: await this.children.fork(req.state) };\n case 'proc-spawn': {\n const { file, argv, env, cwd, stdio, inherit } = req;\n const pid = await this.children.spawn({ file, argv, env, cwd }, stdio, inherit);\n return { ok: true, kind: 'json', json: pid };\n }\n case 'proc-wait': {\n const signal = req.nohang ? this.interrupt.signal : this.blockingSignal();\n const flags = {\n untraced: req.untraced,\n continued: req.continued,\n inGroup: this.waitGroup(req.pid),\n };\n const waited = await this.children.wait(req.pid, req.nohang, signal, flags);\n return { ok: true, kind: 'json', json: waited };\n }\n case 'proc-exec': {\n this.execChild = req.pid;\n this.options.jobs?.exec(this.pid, req.pid);\n\n this.children.watch(req.pid, (state, sig) =>\n state === 'stopped' ? this.stop(sig) : this.cont()\n );\n\n await this.fds.closeAll();\n try {\n const waited = await this.children.wait(req.pid, false);\n const termsig = waited[1] & 0x7f;\n if (termsig) this.execTermsig = termsig;\n return { ok: true, kind: 'json', json: waited };\n } finally {\n this.execChild = undefined;\n }\n }\n case 'proc-kill':\n if (req.sig !== 0 && !isSignal(req.sig)) throw new KernelError('EINVAL');\n\n if (!(await this.options.kill?.(req.pid === 0 ? -this.pgid() : req.pid, req.sig))) {\n throw new KernelError('ESRCH');\n }\n return { ok: true, kind: 'void' };\n case 'proc-alarm':\n this.setAlarm(req.sig, req.firstMs ?? req.ms, req.repeat ? req.ms : 0, req.timer);\n return { ok: true, kind: 'void' };\n case 'sig-mask':\n this.caught = req.caught;\n this.ignored = req.ignored;\n return { ok: true, kind: 'void' };\n case 'sig-pause':\n return this.pause();\n case 'proc-captured':\n return { ok: true, kind: 'bytes', bytes: this.children.captured(req.pid, req.slot) };\n }\n }\n\n private pause(): Promise<never> {\n const signal = this.blockingSignal();\n return new Promise<never>((_, reject) => {\n signal.addEventListener('abort', () => reject(new KernelError('EINTR')), { once: true });\n });\n }\n\n private alarm: ReturnType<typeof setTimeout> | undefined;\n private alarmEvery: ReturnType<typeof setInterval> | undefined;\n\n private setAlarm(sig: number, first: number, every: number, timer?: number): void {\n if (!isSignal(sig)) throw new KernelError('EINVAL');\n this.clearAlarm();\n if (first <= 0) return;\n const fire =\n timer === undefined ? () => this.options.raise?.(sig) : () => this.timerExpired(timer);\n this.alarm = setTimeout(() => {\n this.alarm = undefined;\n fire();\n if (every > 0) this.alarmEvery = setInterval(fire, every);\n }, first);\n }\n\n private timerExpired(which: number): void {\n this.options.onTimer?.(which);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n }\n\n private clearAlarm(): void {\n clearTimeout(this.alarm);\n clearInterval(this.alarmEvery);\n this.alarm = undefined;\n this.alarmEvery = undefined;\n }\n\n async exit(): Promise<void> {\n if (this.exited) return;\n this.exited = true;\n this.clearAlarm();\n for (const pid of this.children.pids()) this.options.onReap?.(pid);\n await this.fds.closeAll();\n }\n}\n", "import type { DeviceMeta, KernelFdKind } from './fd-table.ts';\n\nexport const WASM_PROCESS_INIT = 'wasm-process-init';\nexport const WASM_PROCESS_EXIT = 'wasm-process-exit';\nexport const WASM_PROCESS_ERROR = 'wasm-process-error';\n\nexport interface WasmProgram {\n glue: string;\n module: WebAssembly.Module;\n}\n\nexport interface ForkState {\n memory: Uint8Array;\n currData: number;\n forkSp: number;\n callStackNames: Array<[number, string]>;\n ppid: number;\n streams?: ForkStream[];\n cwd?: string;\n}\n\nexport interface KernelStreamEntry {\n fd: number;\n kernel: number;\n kind: KernelFdKind;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport type ForkStream = KernelStreamEntry | { fd: number; path: string; flags: number };\n\nexport interface InheritedFd {\n fd: number;\n kind: KernelFdKind;\n device?: DeviceMeta;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport interface WasmProcessInitMsg {\n type: typeof WASM_PROCESS_INIT;\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n sab: SharedArrayBuffer;\n ppid?: number;\n fork?: ForkState;\n fds?: InheritedFd[];\n}\n\nexport interface WasmProcessExitMsg {\n type: typeof WASM_PROCESS_EXIT;\n code: number;\n}\n\nexport interface WasmProcessErrorMsg {\n type: typeof WASM_PROCESS_ERROR;\n message: string;\n}\n", "import { dispatchSyncFs } from '../realm/sync-fs-dispatch.ts';\nimport {\n mintSyncFsToken,\n revokeSyncFsToken,\n type SyncFsTokenEntry,\n} from '../realm/sync-fs-token-registry.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n attachSyncSabResponder,\n type SyncSabDispatchRequest,\n} from '../realm/sync-sab-responder.ts';\nimport {\n SAB_DEFAULT_WINDOW_BYTES,\n SAB_HEADER_BYTES,\n SAB_HEADER_I32,\n SAB_I_SIGNALS,\n SAB_I_TIMERS,\n} from '../realm/sync-sab-wire.ts';\nimport type { ChildForker, ChildSpawner } from './children.ts';\nimport { type FdTable, kernelFdKind, type OpenFile } from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport { isWasmSyscall, type StateListener, WasmProcess } from './process.ts';\nimport {\n type ForkState,\n type InheritedFd,\n WASM_PROCESS_ERROR,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_INIT,\n type WasmProcessInitMsg,\n type WasmProgram,\n} from './protocol.ts';\nimport type { PtyTable } from './pty.ts';\nimport { SIG, sigbit } from './signals.ts';\n\nexport interface WasmWorkerLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n terminate(): void;\n}\n\nexport interface SpawnWasmOptions {\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n fs: SyncFsTokenEntry['fs'];\n createWorker: () => WasmWorkerLike;\n onError?: (message: string) => void;\n spawner?: ChildSpawner;\n forker?: ChildForker;\n fork?: ForkState;\n ppid?: number;\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n jobs?: JobTable;\n ptys?: PtyTable;\n onReap?: (pid: number) => void;\n}\n\nexport interface WasmProcessHandle {\n pid: number;\n exited: Promise<number>;\n kill(code?: number): void;\n signal(sig: number): void;\n termsig(): number | undefined;\n onState(listener: StateListener): void;\n}\n\nconst CRASHED = 70;\n\nconst descIds = new WeakMap<OpenFile, number>();\nlet nextDescId = 1;\n\nfunction descId(file: OpenFile): number {\n const id = descIds.get(file) ?? nextDescId++;\n descIds.set(file, id);\n return id;\n}\n\nexport function inheritedFds(fds: FdTable): InheritedFd[] {\n return fds\n .numbers()\n .filter((fd) => fd > 2 && !fds.get(fd).file.held)\n .map((fd): InheritedFd => {\n const open = fds.get(fd);\n const flags = fds.statusFlags(fd);\n const kind = kernelFdKind(open.file);\n const meta = open.file.heldMeta;\n return {\n fd,\n kind,\n ...(kind === 'device' && meta && 'device' in meta ? { device: meta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(kind === 'stream' ? { desc: descId(open) } : {}),\n };\n });\n}\n\ninterface WorkerSays {\n type?: string;\n code?: unknown;\n message?: unknown;\n}\n\nexport function spawnWasmProcess(opts: SpawnWasmOptions): WasmProcessHandle {\n const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const header = new Int32Array(sab, 0, SAB_HEADER_I32);\n const process = new WasmProcess(opts.pid, opts.fds, {\n spawner: opts.spawner,\n forker: opts.forker,\n fs: opts.fs,\n kill: opts.kill,\n jobs: opts.jobs,\n ptys: opts.ptys,\n onReap: opts.onReap,\n onPending: (sig) => void Atomics.or(header, SAB_I_SIGNALS, sigbit(sig)),\n onTimer: (which) => void Atomics.or(header, SAB_I_TIMERS, 1 << which),\n hasPending: () =>\n Atomics.load(header, SAB_I_SIGNALS) !== 0 || Atomics.load(header, SAB_I_TIMERS) !== 0,\n raise: (sig) => signal(sig),\n });\n const token = mintSyncFsToken({ fs: opts.fs, cwd: opts.cwd });\n const worker = opts.createWorker();\n const dispatch = async (req: SyncSabDispatchRequest): Promise<SyncFsResult> => {\n if (isWasmSyscall(req)) return process.syscall(req);\n return dispatchSyncFs(req);\n };\n const responder = attachSyncSabResponder(worker, sab, token, { dispatch });\n\n let settle!: (code: number) => void;\n const exited = new Promise<number>((resolve) => (settle = resolve));\n let done = false;\n let endedBy: number | undefined;\n\n const finish = (code: number, sig?: number): void => {\n if (done) return;\n done = true;\n endedBy = sig ?? process.execTermsig;\n worker.removeEventListener('message', onMessage);\n worker.removeEventListener('error', onError);\n responder.dispose();\n revokeSyncFsToken(token);\n worker.terminate();\n void process.exit().then(\n () => settle(code),\n () => settle(code)\n );\n };\n\n const onMessage = (event: MessageEvent): void => {\n const data = event.data as WorkerSays | undefined;\n if (data?.type === WASM_PROCESS_EXIT) {\n finish(typeof data.code === 'number' ? data.code : CRASHED);\n } else if (data?.type === WASM_PROCESS_ERROR) {\n opts.onError?.(String(data.message));\n finish(CRASHED);\n }\n };\n const onError = (event: MessageEvent): void => {\n event.preventDefault();\n opts.onError?.(String((event as unknown as ErrorEvent).message ?? 'worker error'));\n finish(CRASHED);\n };\n worker.addEventListener('message', onMessage);\n worker.addEventListener('error', onError);\n\n const init: WasmProcessInitMsg = {\n type: WASM_PROCESS_INIT,\n pid: opts.pid,\n program: opts.program,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n ...(opts.fork ? { fork: opts.fork } : { fds: inheritedFds(opts.fds) }),\n };\n worker.postMessage(init, opts.fork ? [opts.fork.memory.buffer as ArrayBuffer] : []);\n\n const signal = (sig: number): void => {\n if (process.signal(sig) === 'terminate') finish(sig === SIG.KILL ? 137 : 128 + sig, sig);\n };\n const kill = (code = 137): void =>\n finish(code, code > 128 && code < 160 ? code - 128 : undefined);\n return {\n pid: opts.pid,\n exited,\n kill,\n signal,\n termsig: () => endedBy,\n onState: (listener) => process.onState(listener),\n };\n}\n", "import { KernelError } from './fd-table.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport interface JobMember {\n pid: number;\n pgid: number;\n sid: number;\n\n signal(sig: number): void;\n\n execParent?: number;\n\n ppid?: number;\n\n execed?: boolean;\n}\n\nexport class JobTable {\n private readonly members = new Map<number, JobMember>();\n private readonly foreground = new Map<KernelTty, number>();\n\n private readonly terminals = new Map<number, KernelTty>();\n\n add(\n pid: number,\n parentPid: number | undefined,\n signal: (sig: number) => void,\n terminal?: KernelTty\n ): JobMember {\n const parent = parentPid === undefined ? undefined : this.members.get(parentPid);\n if (!parent && terminal) this.terminals.set(pid, terminal);\n const member: JobMember = {\n pid,\n ppid: parent?.pid,\n pgid: parent?.pgid ?? pid,\n sid: parent?.sid ?? pid,\n signal,\n };\n this.members.set(pid, member);\n return member;\n }\n\n remove(pid: number): void {\n this.members.delete(pid);\n }\n\n exec(pid: number, child: number): void {\n const member = this.members.get(child);\n if (member) member.execParent = pid;\n const execer = this.members.get(pid);\n if (execer) execer.execed = true;\n }\n\n pgidOf(pid: number): number | undefined {\n return this.members.get(pid)?.pgid;\n }\n\n private member(pid: number): JobMember {\n const member = this.members.get(pid);\n if (!member) throw new KernelError('ESRCH');\n return member;\n }\n\n setpgid(caller: number, pid: number, pgid: number): void {\n const target = this.member(pid || caller);\n const group = pgid || target.pid;\n if (group < 0) throw new KernelError('EINVAL');\n const self = this.member(caller);\n if (target.pid !== caller) {\n if (target.ppid !== caller) throw new KernelError('ESRCH');\n if (target.execed) throw new KernelError('EACCES');\n }\n if (target.sid !== self.sid) throw new KernelError('EPERM');\n if (target.pid === target.sid) throw new KernelError('EPERM');\n\n const exists = [...this.members.values()].some((m) => m.pgid === group && m.sid === target.sid);\n if (group !== target.pid && !exists) throw new KernelError('EPERM');\n target.pgid = group;\n }\n\n getpgid(caller: number, pid: number): number {\n return this.member(pid || caller).pgid;\n }\n\n getsid(caller: number, pid: number): number {\n return this.member(pid || caller).sid;\n }\n\n setsid(pid: number): number {\n const member = this.member(pid);\n if (member.pgid === pid) throw new KernelError('EPERM');\n member.sid = pid;\n member.pgid = pid;\n this.terminals.delete(pid);\n return pid;\n }\n\n terminalNamed(name: string): KernelTty | undefined {\n const known = new Set([...this.terminals.values(), ...this.foreground.keys()]);\n return [...known].find((tty) => tty.name === name);\n }\n\n controllingTerminal(pid: number): KernelTty | null | undefined {\n const member = this.members.get(pid);\n return member && (this.terminals.get(member.sid) ?? null);\n }\n\n acquireTerminal(pid: number, tty: KernelTty): boolean {\n const member = this.members.get(pid);\n if (!member || member.sid !== pid || this.terminals.has(pid)) return false;\n if ([...this.terminals.values()].includes(tty)) return false;\n this.terminals.set(pid, tty);\n this.foreground.set(tty, member.pgid);\n return true;\n }\n\n killGroup(pgid: number, sig: number): boolean {\n const targets = [...this.members.values()].filter((m) => m.pgid === pgid);\n const pids = new Set(targets.map((m) => m.pid));\n if (sig !== 0) {\n for (const m of targets)\n if (m.execParent === undefined || !pids.has(m.execParent)) m.signal(sig);\n }\n return targets.length > 0;\n }\n\n tcgetpgrp(tty: KernelTty, fallback: number): number {\n return this.foreground.get(tty) ?? fallback;\n }\n\n tcsetpgrp(caller: number, tty: KernelTty, pgid: number): void {\n const self = this.member(caller);\n const inSession = [...this.members.values()].some((m) => m.pgid === pgid && m.sid === self.sid);\n if (!inSession) throw new KernelError('EPERM');\n this.foreground.set(tty, pgid);\n }\n\n signalOwnedForeground(tty: KernelTty, sig: number): void {\n const pgid = this.foreground.get(tty);\n if (pgid !== undefined) this.killGroup(pgid, sig);\n }\n\n signalForeground(tty: KernelTty, fallback: number, sig: number): void {\n this.killGroup(this.tcgetpgrp(tty, fallback), sig);\n }\n}\n", "import { type Command, scanCommands } from './commands.ts';\nimport { withCommandDirs } from './fs/commands.ts';\nimport type { KernelFs } from './fs/types.ts';\nimport {\n type ChildForker,\n type ChildHandle,\n type ChildSpawner,\n SpawnError,\n} from './kernel/children.ts';\nimport { bytesSource, FdTable, nullFile, sinkFile } from './kernel/fd-table.ts';\nimport { spawnWasmProcess, type WasmProcessHandle, type WasmWorkerLike } from './kernel/host.ts';\nimport { JobTable } from './kernel/jobs.ts';\nimport type { ForkState, WasmProgram } from './kernel/protocol.ts';\nimport { PtyTable } from './kernel/pty.ts';\nimport { KernelTty } from './kernel/tty.ts';\n\nexport interface LauncherOptions {\n fs: KernelFs;\n createWorker: () => WasmWorkerLike;\n modules?: string;\n env?: Record<string, string>;\n}\n\nexport interface RunOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: Uint8Array;\n onStdout?: (bytes: Uint8Array) => void;\n onStderr?: (bytes: Uint8Array) => void;\n}\n\nexport interface TerminalOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n onData: (bytes: Uint8Array) => void;\n}\n\nexport interface TerminalSession {\n pid: number;\n exited: Promise<number>;\n write(bytes: Uint8Array): void;\n resize(cols: number, rows: number): void;\n signal(sig: number): void;\n close(): void;\n}\n\nexport interface RunResult {\n status: number;\n stdout: Uint8Array;\n stderr: Uint8Array;\n}\n\ninterface Target {\n glue: string;\n wasm: string;\n argv0: string;\n prefix?: string[];\n env?: Record<string, string>;\n}\n\ninterface Planned {\n target: Target;\n args: string[];\n}\n\ninterface StartRequest {\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n report: (message: string) => void;\n ppid?: number;\n fork?: ForkState;\n}\n\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst SHEBANG_MAX = 256;\nconst NOT_FOUND = 127;\nconst SHARED_DIRS = ['/tmp', '/home'];\nconst encoder = new TextEncoder();\n\nfunction baseName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction modulePath(glue: string): string {\n return glue.endsWith('.js') ? `${glue.slice(0, -3)}.wasm` : `${glue}.wasm`;\n}\n\nfunction targetOf(command: Command): Target {\n return {\n glue: command.glue,\n wasm: command.wasm,\n argv0: command.argv0,\n ...(command.args ? { prefix: command.args } : {}),\n ...(command.env ? { env: command.env } : {}),\n };\n}\n\nfunction childHandle(handle: WasmProcessHandle): ChildHandle {\n return {\n pid: handle.pid,\n exited: handle.exited,\n termsig: handle.termsig,\n onState: (listener) => handle.onState(listener),\n };\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, chunk) => n + chunk.length, 0));\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class Launcher {\n readonly fs: KernelFs;\n private readonly base: KernelFs;\n private readonly createWorker: () => WasmWorkerLike;\n private readonly modulesDir: string;\n private readonly env: Record<string, string>;\n private catalog: Promise<Map<string, Command>> | undefined;\n private readonly compiled = new Map<string, Promise<WebAssembly.Module>>();\n private readonly processes = new Map<number, WasmProcessHandle>();\n private readonly zombies = new Set<number>();\n private readonly orphans = new Set<number>();\n private readonly jobs = new JobTable();\n private readonly ptys = new PtyTable((tty, sig) => this.jobs.signalOwnedForeground(tty, sig));\n private nextPid = 1000;\n private terminals = 0;\n\n constructor(options: LauncherOptions) {\n this.base = options.fs;\n this.createWorker = options.createWorker;\n this.modulesDir = options.modules ?? '/node_modules';\n this.env = options.env ?? {};\n this.fs = withCommandDirs(options.fs, async () => new Set((await this.commands()).keys()));\n }\n\n commands(): Promise<Map<string, Command>> {\n this.catalog ??= scanCommands(this.base, this.modulesDir);\n return this.catalog;\n }\n\n async resolve(file: string, argv0: string, cwd: string): Promise<Target | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name !== undefined) {\n const command = (await this.commands()).get(name);\n return command && targetOf(command);\n }\n const glue = this.fs.resolvePath(cwd, file);\n const wasm = modulePath(glue);\n if (!(await this.base.exists(glue)) || !(await this.base.exists(wasm))) return undefined;\n return { glue, wasm, argv0: baseName(argv0 || file) };\n }\n\n private async interpreted(\n file: string,\n argv: string[],\n cwd: string\n ): Promise<Planned | undefined> {\n let head: Uint8Array;\n try {\n head = (await this.base.readFileBuffer(this.fs.resolvePath(cwd, file))).subarray(\n 0,\n SHEBANG_MAX\n );\n } catch {\n return undefined;\n }\n if (head[0] !== 0x23 || head[1] !== 0x21) return undefined;\n const words = new TextDecoder()\n .decode(head)\n .slice(2)\n .split('\\n')[0]\n .trim()\n .split(/[ \\t]+/);\n if (baseName(words[0]) === 'env') words.shift();\n const [interp, ...rest] = words;\n const target = interp ? await this.resolve(interp, interp, cwd) : undefined;\n if (!target) return undefined;\n const arg = rest.join(' ');\n return {\n target,\n args: [...(target.prefix ?? []), ...(arg ? [arg] : []), file, ...argv.slice(1)],\n };\n }\n\n private async plan(file: string, argv: string[], cwd: string): Promise<Planned | undefined> {\n const direct = await this.resolve(file, argv[0] ?? file, cwd);\n if (direct) return { target: direct, args: [...(direct.prefix ?? []), ...argv.slice(1)] };\n return this.interpreted(file, argv, cwd);\n }\n\n private async unrunnable(file: string, cwd: string): Promise<'ENOEXEC' | 'ENOENT'> {\n const head = await this.base.readFileBuffer(this.fs.resolvePath(cwd, file)).catch(() => null);\n return head && !(head[0] === 0x23 && head[1] === 0x21) ? 'ENOEXEC' : 'ENOENT';\n }\n\n private module(path: string): Promise<WebAssembly.Module> {\n return this.base.stat(path).then((st) => {\n const key = `${path}:${st.size}:${st.mtime.getTime()}`;\n let module = this.compiled.get(key);\n if (!module) {\n module = this.base\n .readFileBuffer(path)\n .then((bytes) => WebAssembly.compile(bytes as BufferSource));\n this.compiled.set(key, module);\n module.catch(() => this.compiled.delete(key));\n }\n return module;\n });\n }\n\n private async launch(\n planned: Planned,\n req: Omit<StartRequest, 'program' | 'argv0' | 'args'>\n ): Promise<WasmProcessHandle> {\n const { target, args } = planned;\n let program: WasmProgram;\n try {\n const [glue, module] = await Promise.all([\n this.base.readFile(target.glue),\n this.module(target.wasm),\n ]);\n program = { glue, module };\n } catch (err) {\n await req.fds.closeAll();\n throw err;\n }\n return this.start({\n ...req,\n program,\n argv0: target.argv0,\n args,\n env: { ...target.env, ...req.env },\n });\n }\n\n private start(req: StartRequest): WasmProcessHandle {\n const pid = this.nextPid++;\n const terminal = req.fds.stdioTerminal();\n const handle = spawnWasmProcess({\n pid,\n program: req.program,\n argv0: req.argv0,\n args: req.args,\n env: req.env,\n cwd: req.cwd,\n fds: req.fds,\n fs: this.fs,\n createWorker: this.createWorker,\n onError: req.report,\n spawner: this.spawner(pid, req.report),\n forker: this.forker(pid, req),\n kill: (target, sig) => this.kill(target, sig),\n jobs: this.jobs,\n ptys: this.ptys,\n onReap: (child) => this.reaped(child),\n ...(req.fork ? { fork: req.fork } : {}),\n ...(req.ppid !== undefined ? { ppid: req.ppid } : {}),\n });\n this.processes.set(pid, handle);\n this.jobs.add(pid, req.ppid, (sig) => handle.signal(sig), terminal);\n void handle.exited.then(() => {\n this.processes.delete(pid);\n if (req.ppid === undefined || this.orphans.delete(pid)) this.jobs.remove(pid);\n else this.zombies.add(pid);\n });\n return handle;\n }\n\n private reaped(pid: number): void {\n if (this.zombies.delete(pid)) this.jobs.remove(pid);\n else this.orphans.add(pid);\n }\n\n private spawner(ppid: number, report: (message: string) => void): ChildSpawner {\n return async (req, fds) => {\n const planned = await this.plan(req.file, req.argv, req.cwd);\n if (!planned) {\n await fds.closeAll();\n throw new SpawnError(await this.unrunnable(req.file, req.cwd));\n }\n const handle = await this.launch(planned, { env: req.env, cwd: req.cwd, fds, report, ppid });\n return childHandle(handle);\n };\n }\n\n private forker(ppid: number, parent: StartRequest): ChildForker {\n return async (state, fds) =>\n childHandle(this.start({ ...parent, cwd: state.cwd ?? parent.cwd, fds, ppid, fork: state }));\n }\n\n kill(pid: number, sig: number): boolean {\n if (pid < 0) return this.jobs.killGroup(-pid, sig);\n const handle = this.processes.get(pid);\n if (!handle) return false;\n if (sig !== 0) handle.signal(sig);\n return true;\n }\n\n async prepare(): Promise<void> {\n for (const dir of SHARED_DIRS) await this.base.mkdir(dir, { recursive: true });\n }\n\n private environment(cwd: string, extra: Record<string, string> | undefined) {\n return { PATH: '/usr/bin:/bin', HOME: '/home', ...this.env, PWD: cwd, ...extra };\n }\n\n private async starting(argv: string[], dir: string | undefined) {\n this.catalog = undefined;\n const cwd = this.fs.resolvePath('/', dir ?? '/');\n const [file = ''] = argv;\n await this.base.mkdir(cwd, { recursive: true });\n return { cwd, file, planned: await this.plan(file, argv, cwd) };\n }\n\n async openTerminal(argv: string[], options: TerminalOptions): Promise<TerminalSession> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n if (!planned) throw new Error(`${file}: command not found`);\n let leader = 0;\n const tty: KernelTty = new KernelTty(\n { write: (bytes) => options.onData(bytes.slice()) },\n (sig) => this.jobs.signalForeground(tty, leader, sig)\n );\n tty.name = `/dev/tty${++this.terminals}`;\n tty.setSize(options.cols ?? 80, options.rows ?? 24);\n const fds = new FdTable();\n const stdio = tty.file();\n fds.installAt(0, stdio);\n fds.installAt(1, stdio.retain());\n fds.installAt(2, stdio.retain());\n const env = this.environment(cwd, {\n TERM: 'xterm-256color',\n COLORTERM: 'truecolor',\n ...options.env,\n });\n const report = (message: string) => options.onData(encoder.encode(`${message}\\r\\n`));\n const handle = await this.launch(planned, { env, cwd, fds, report });\n leader = handle.pid;\n void handle.exited.then(() => tty.hangup());\n return {\n pid: handle.pid,\n exited: handle.exited,\n write: (bytes) => tty.receive(bytes),\n resize: (cols, rows) => tty.resize(cols, rows),\n signal: (sig) => this.jobs.signalForeground(tty, leader, sig),\n close: () => {\n tty.signalHangup();\n tty.hangup();\n },\n };\n }\n\n async run(argv: string[], options: RunOptions = {}): Promise<RunResult> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n const env = this.environment(cwd, options.env);\n const out: Uint8Array[] = [];\n const err: Uint8Array[] = [];\n const collect =\n (chunks: Uint8Array[], tee?: (bytes: Uint8Array) => void) => (bytes: Uint8Array) => {\n chunks.push(bytes);\n tee?.(bytes);\n };\n const stdout = collect(out, options.onStdout);\n const stderr = collect(err, options.onStderr);\n const report = (message: string) => stderr(encoder.encode(`${message}\\n`));\n if (!planned) {\n report(`${file}: command not found`);\n return { status: NOT_FOUND, stdout: concat(out), stderr: concat(err) };\n }\n const fds = new FdTable();\n fds.installAt(0, options.stdin ? bytesSource(options.stdin) : nullFile());\n fds.installAt(1, sinkFile(stdout));\n fds.installAt(2, sinkFile(stderr));\n const handle = await this.launch(planned, { env, cwd, fds, report });\n const status = await handle.exited;\n return { status, stdout: concat(out), stderr: concat(err) };\n }\n}\n", "import { OpfsFs } from './fs/opfs.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport { SIG } from './kernel/signals.ts';\nimport {\n Launcher,\n type RunOptions,\n type TerminalOptions,\n type TerminalSession,\n} from './launcher.ts';\n\nexport interface KernelPort {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface InitRequest {\n id: number;\n op: 'init';\n root?: FileSystemDirectoryHandle;\n modules?: string;\n env?: Record<string, string>;\n}\n\nexport interface RunRequest {\n id: number;\n op: 'run';\n argv: string[];\n options: Omit<RunOptions, 'onStdout' | 'onStderr'>;\n}\n\nexport interface OpenTerminalRequest {\n id: number;\n op: 'open-terminal';\n argv: string[];\n options: Omit<TerminalOptions, 'onData'>;\n}\n\nexport type TerminalAction =\n | { action: 'write'; bytes: Uint8Array }\n | { action: 'resize'; cols: number; rows: number }\n | { action: 'signal'; signal: string }\n | { action: 'close' };\n\nexport type TerminalRequest = { id: number; op: 'terminal'; terminal: number } & TerminalAction;\n\nexport type KernelRequest = InitRequest | RunRequest | OpenTerminalRequest | TerminalRequest;\n\ntype WithoutId<T> = T extends unknown ? Omit<T, 'id'> : never;\n\nexport type KernelCall = WithoutId<KernelRequest>;\n\nexport interface ServeDeps {\n storage: () => Promise<FileSystemDirectoryHandle>;\n createWorker: () => WasmWorkerLike;\n}\n\nfunction signalNumber(name: string): number {\n const key = name.slice(3);\n if (!name.startsWith('SIG') || !Object.hasOwn(SIG, key))\n throw new Error(`unknown signal ${name}`);\n return (SIG as Record<string, number>)[key];\n}\n\nfunction act(session: TerminalSession, req: TerminalAction): void {\n if (req.action === 'write') session.write(req.bytes);\n else if (req.action === 'resize') session.resize(req.cols, req.rows);\n else if (req.action === 'signal') session.signal(signalNumber(req.signal));\n else session.close();\n}\n\nexport function serveKernel(port: KernelPort, deps: ServeDeps): void {\n let launcher: Promise<Launcher> | undefined;\n const terminals = new Map<number, TerminalSession>();\n const reply = (id: number, body: object) => port.postMessage({ id, ...body });\n\n async function ready(): Promise<Launcher> {\n if (!launcher) throw new Error('the kernel is not initialized');\n return launcher;\n }\n\n async function terminal(req: OpenTerminalRequest): Promise<number> {\n const onData = (bytes: Uint8Array) => reply(req.id, { fd: 1, bytes });\n const session = await (await ready()).openTerminal(req.argv, { ...req.options, onData });\n terminals.set(req.id, session);\n reply(req.id, { started: session.pid });\n try {\n return await session.exited;\n } finally {\n terminals.delete(req.id);\n }\n }\n\n async function handle(req: KernelRequest): Promise<unknown> {\n if (req.op === 'init') {\n launcher = (req.root ? Promise.resolve(req.root) : deps.storage()).then(async (root) => {\n const started = new Launcher({\n fs: new OpfsFs(root),\n createWorker: deps.createWorker,\n ...(req.modules ? { modules: req.modules } : {}),\n ...(req.env ? { env: req.env } : {}),\n });\n await started.prepare();\n return started;\n });\n await launcher;\n return true;\n }\n if (req.op === 'open-terminal') return terminal(req);\n if (req.op === 'terminal') {\n const session = terminals.get(req.terminal);\n if (!session) throw new Error(`no terminal ${req.terminal}`);\n act(session, req);\n return true;\n }\n return (await ready()).run(req.argv, {\n ...req.options,\n onStdout: (bytes) => reply(req.id, { fd: 1, bytes }),\n onStderr: (bytes) => reply(req.id, { fd: 2, bytes }),\n });\n }\n\n port.addEventListener('message', (event) => {\n const req = event.data as KernelRequest;\n handle(req).then(\n (result) => reply(req.id, { result }),\n (err) => reply(req.id, { error: err instanceof Error ? err.message : String(err) })\n );\n });\n}\n", "import type { WasmWorkerLike } from './kernel/host.ts';\nimport { type KernelPort, serveKernel } from './serve.ts';\n\nconst processWorker = new URL('./process-worker.js', import.meta.url);\n\nserveKernel(globalThis as unknown as KernelPort, {\n storage: () => navigator.storage.getDirectory(),\n createWorker: () => new Worker(processWorker, { type: 'module' }) as WasmWorkerLike,\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["S_IFDIR", "S_IFREG", "done", "encoder", "translate", "json", "done", "interrupted", "within", "ready", "done", "COMMAND", "encoder", "concat", "ready"]
|
|
7
7
|
}
|