@ai-ecoverse/slicc-kernel 1.2.0 → 1.3.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 +22 -1
- package/dist/index.js +150 -2
- package/dist/index.js.map +3 -3
- package/dist/kernel-worker.js +2400 -419
- package/dist/kernel-worker.js.map +4 -4
- package/dist/process-worker.js +249 -12
- package/dist/process-worker.js.map +4 -4
- package/package.json +6 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/kernel/protocol.ts", "../src/kernel/signals.ts", "../src/fs/types.ts", "../src/realm/live-vfs-fs.ts", "../src/realm/emscripten-vfs-hook.ts", "../src/realm/sync-fs-wire.ts", "../src/realm/sync-sab-wire.ts", "../src/realm/sync-sab-bridge.ts", "../src/process/wasi-errno.ts", "../src/process/kernel-streams.ts", "../src/process/process-children.ts", "../src/process/process-pty.ts", "../src/process/process-fds.ts", "../src/process/process-fork.ts", "../src/process/process-signals.ts", "../src/process/realm-user.ts", "../src/process/process-runtime.ts", "../src/process/process-entry.ts", "../src/process-worker.ts"],
|
|
4
|
-
"sourcesContent": ["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", "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", "export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtime: Date;\n atime: Date;\n ctime: Date;\n ino: number;\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 readdirStat(path: string): Promise<Array<[string, FsStat | null]>>;\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\nexport function inodeOf(path: string): number {\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < path.length; i++) {\n const c = path.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 2654435761);\n h2 = Math.imul(h2 ^ c, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0) || 1;\n}\n", "import { inodeOf } from '../fs/types.ts';\nimport type { SyncFsBridgeStat, SyncFsPosixBridge } from './sync-fs-wire.ts';\n\nconst ERRNO_BY_CODE: Readonly<Record<string, number>> = {\n EACCES: 2,\n EBADF: 8,\n EBUSY: 10,\n EEXIST: 20,\n EINVAL: 28,\n EIO: 29,\n EISDIR: 31,\n ELOOP: 32,\n ENAMETOOLONG: 37,\n ENOENT: 44,\n ENOSPC: 51,\n ENOSYS: 52,\n ENOTDIR: 54,\n ENOTEMPTY: 55,\n EPERM: 63,\n EROFS: 69,\n ETIMEDOUT: 73,\n EXDEV: 75,\n};\nconst EIO = 29;\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\nconst PERM_MASK = 0o7777;\n\nconst DEFAULT_DIR_PERM = 0o755;\n\nconst UMASK = 0o022;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\n\ninterface LiveNodeState {\n stat?: SyncFsBridgeStat;\n\n data?: Uint8Array;\n len: number;\n loaded: boolean;\n dirty: boolean;\n openCount: number;\n\n orphan?: boolean;\n\n listed?: Map<string, SyncFsBridgeStat>;\n}\n\nexport interface LiveFsNode {\n id: number;\n name: string;\n mode: number;\n parent: LiveFsNode;\n mount: LiveFsMount;\n node_ops: LiveNodeOps;\n stream_ops: LiveStreamOps;\n live: LiveNodeState;\n}\n\nexport interface LiveFsStream {\n node: LiveFsNode;\n position: number;\n flags: number;\n}\n\nexport interface LiveFsMount {\n opts: LiveFsMountOpts;\n mountpoint: string;\n root: LiveFsNode;\n}\n\nexport interface LiveFsMountOpts {\n root: string;\n bridge: SyncFsPosixBridge;\n}\n\ninterface LiveAttr {\n dev: number;\n ino: number;\n mode: number;\n nlink: number;\n uid: number;\n gid: number;\n rdev: number;\n size: number;\n atime: Date;\n mtime: Date;\n ctime: Date;\n blksize: number;\n blocks: number;\n}\n\ninterface LiveSetAttr {\n mode?: number;\n size?: number;\n atime?: number | Date;\n mtime?: number | Date;\n timestamp?: number;\n}\n\nexport interface LiveNodeOps {\n getattr(node: LiveFsNode): LiveAttr;\n setattr(node: LiveFsNode, attr: LiveSetAttr): void;\n lookup(parent: LiveFsNode, name: string): LiveFsNode;\n mknod(parent: LiveFsNode, name: string, mode: number, dev: number): LiveFsNode;\n rename(oldNode: LiveFsNode, newDir: LiveFsNode, newName: string): void;\n unlink(parent: LiveFsNode, name: string): void;\n rmdir(parent: LiveFsNode, name: string): void;\n readdir(node: LiveFsNode): string[];\n symlink(parent: LiveFsNode, newName: string, target: string): LiveFsNode;\n readlink(node: LiveFsNode): string;\n}\n\nexport interface LiveStreamOps {\n open(stream: LiveFsStream): void;\n\n dup(stream: LiveFsStream): void;\n close(stream: LiveFsStream): void;\n read(\n stream: LiveFsStream,\n buffer: ArrayBufferView,\n offset: number,\n length: number,\n position: number\n ): number;\n write(\n stream: LiveFsStream,\n buffer: ArrayBufferView,\n offset: number,\n length: number,\n position: number\n ): number;\n llseek(stream: LiveFsStream, offset: number, whence: number): number;\n fsync(stream: LiveFsStream): void;\n}\n\nexport interface LiveFsApi {\n createNode(parent: LiveFsNode | null, name: string, mode: number, dev?: number): LiveFsNode;\n isDir(mode: number): boolean;\n isFile(mode: number): boolean;\n isLink(mode: number): boolean;\n ErrnoError: new (errno: number) => Error & { errno: number };\n\n nameTable?: (LiveFsNode | null)[] | null;\n hashRemoveNode?(node: LiveFsNode): void;\n lookupNode?(parent: LiveFsNode, name: string): LiveFsNode;\n}\n\nexport interface LiveVfsPlugin {\n mount(mount: LiveFsMount): LiveFsNode;\n node_ops: LiveNodeOps;\n stream_ops: LiveStreamOps;\n\n mounts: Set<LiveFsMount>;\n}\n\nfunction toErrno(Fs: LiveFsApi, err: unknown): Error {\n if ((err as { errno?: unknown })?.errno !== undefined && err instanceof Fs.ErrnoError) {\n return err;\n }\n const code = (err as { code?: unknown })?.code;\n const errno = typeof code === 'string' ? (ERRNO_BY_CODE[code] ?? EIO) : EIO;\n return new Fs.ErrnoError(errno);\n}\n\nexport function liveNodePath(node: LiveFsNode): string {\n const parts: string[] = [];\n let cur = node;\n while (cur !== cur.mount.root) {\n parts.push(cur.name);\n cur = cur.parent;\n }\n const root = node.mount.opts.root.replace(/\\/+$/, '');\n return parts.length === 0 ? root || '/' : `${root}/${parts.reverse().join('/')}`;\n}\n\nfunction modeFromStat(st: SyncFsBridgeStat): number {\n const type = st.isSymbolicLink ? S_IFLNK : st.isDirectory ? S_IFDIR : S_IFREG;\n const fallback = st.isDirectory || st.isSymbolicLink ? 0o777 : 0o666;\n return type | ((st.mode ?? fallback) & PERM_MASK || fallback);\n}\n\nfunction toMs(v: number | Date | undefined): number | undefined {\n if (v === undefined || v === null) return undefined;\n return v instanceof Date ? v.getTime() : v;\n}\n\ninterface LiveOpsTables {\n node?: LiveNodeOps;\n stream?: LiveStreamOps;\n}\n\nfunction createHelpers(Fs: LiveFsApi, ops: LiveOpsTables) {\n const bridgeOf = (node: LiveFsNode): SyncFsPosixBridge => node.mount.opts.bridge;\n\n function call<T>(fn: () => T): T {\n try {\n return fn();\n } catch (err) {\n throw toErrno(Fs, err);\n }\n }\n\n function metadataCall(fn: () => void): void {\n try {\n call(fn);\n } catch (err) {\n if ((err as { errno?: number }).errno !== ERRNO_BY_CODE.ENOSYS) throw err;\n }\n }\n\n function freshState(stat?: SyncFsBridgeStat): LiveNodeState {\n return { ...(stat ? { stat } : {}), len: 0, loaded: false, dirty: false, openCount: 0 };\n }\n\n function makeNode(parent: LiveFsNode | null, name: string, st: SyncFsBridgeStat): LiveFsNode {\n const node = Fs.createNode(parent, name, modeFromStat(st), 0);\n node.node_ops = ops.node as LiveNodeOps;\n node.stream_ops = ops.stream as LiveStreamOps;\n node.live = freshState(st);\n return node;\n }\n\n function statOf(node: LiveFsNode): SyncFsBridgeStat {\n if (node.live.orphan) {\n return { ...(node.live.stat as SyncFsBridgeStat), size: node.live.len };\n }\n if (!node.live.stat) {\n const st = call(() => bridgeOf(node).lstat(liveNodePath(node)));\n node.live.stat = st;\n node.mode = modeFromStat(st);\n }\n return node.live.stat;\n }\n\n function childPath(parent: LiveFsNode, name: string): string {\n const base = liveNodePath(parent);\n return base === '/' ? `/${name}` : `${base}/${name}`;\n }\n\n function ensureLoaded(node: LiveFsNode): void {\n const s = node.live;\n if (s.loaded) return;\n const bytes = call(() => bridgeOf(node).readFile(liveNodePath(node)));\n s.data = bytes;\n s.len = bytes.length;\n s.loaded = true;\n }\n\n function ensureCapacity(node: LiveFsNode, need: number): Uint8Array {\n const s = node.live;\n const cur = s.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, s.len));\n s.data = grown;\n return grown;\n }\n\n function flushNode(node: LiveFsNode): void {\n const s = node.live;\n if (!s.dirty || !s.data || s.orphan) return;\n const bytes = s.data.slice(0, s.len);\n call(() => bridgeOf(node).writeFile(liveNodePath(node), bytes));\n s.dirty = false;\n s.stat = undefined;\n }\n\n function truncate(node: LiveFsNode, size: number): void {\n const s = node.live;\n if (s.openCount > 0) {\n if (size > 0) ensureLoaded(node);\n else s.loaded = true;\n const buf = ensureCapacity(node, size);\n if (size > s.len) buf.fill(0, s.len, size);\n s.len = size;\n s.dirty = true;\n return;\n }\n\n const path = liveNodePath(node);\n const bytes = new Uint8Array(size);\n if (size > 0) {\n const cur = call(() => bridgeOf(node).readFile(path));\n bytes.set(cur.subarray(0, Math.min(size, cur.length)));\n }\n call(() => bridgeOf(node).writeFile(path, bytes));\n s.stat = undefined;\n }\n\n return {\n Fs,\n bridgeOf,\n call,\n metadataCall,\n makeNode,\n statOf,\n childPath,\n ensureLoaded,\n ensureCapacity,\n flushNode,\n truncate,\n };\n}\n\ntype LiveHelpers = ReturnType<typeof createHelpers>;\n\nfunction createNodeOps(h: LiveHelpers): LiveNodeOps {\n const { Fs, bridgeOf, call, metadataCall, makeNode, statOf, childPath, flushNode, truncate } = h;\n const { ensureLoaded } = h;\n return {\n getattr(node) {\n const st = statOf(node);\n const s = node.live;\n const size = Fs.isDir(node.mode) ? 4096 : s.loaded ? s.len : st.size;\n const mtime = new Date(st.mtimeMs ?? 0);\n return {\n dev: 1,\n ino: st.ino ?? inodeOf(liveNodePath(node)),\n mode: node.mode,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n size,\n atime: new Date(st.atimeMs ?? mtime.getTime()),\n mtime,\n ctime: new Date(st.ctimeMs ?? mtime.getTime()),\n blksize: 4096,\n blocks: Math.ceil(size / 4096),\n };\n },\n setattr(node, attr) {\n if (node.live.orphan) {\n if (attr.mode !== undefined && attr.mode !== null) {\n node.mode = (node.mode & ~PERM_MASK) | (attr.mode & PERM_MASK);\n }\n if (attr.size !== undefined && attr.size !== null) truncate(node, attr.size);\n return;\n }\n const path = liveNodePath(node);\n if (attr.mode !== undefined && attr.mode !== null) {\n const perm = attr.mode & PERM_MASK;\n if (perm !== (node.mode & PERM_MASK)) {\n metadataCall(() => bridgeOf(node).chmod(path, perm));\n node.mode = (node.mode & ~PERM_MASK) | perm;\n }\n }\n if (attr.size !== undefined && attr.size !== null && Fs.isFile(node.mode)) {\n truncate(node, attr.size);\n }\n const mtime = toMs(attr.mtime) ?? attr.timestamp;\n if (mtime !== undefined) {\n const atime = toMs(attr.atime) ?? mtime;\n flushNode(node);\n metadataCall(() => bridgeOf(node).utimes(path, atime, mtime));\n }\n node.live.stat = undefined;\n },\n lookup(parent, name) {\n const listed = parent.live.listed?.get(name);\n parent.live.listed?.delete(name);\n const st = listed ?? call(() => bridgeOf(parent).lstat(childPath(parent, name)));\n return makeNode(parent, name, st);\n },\n mknod(parent, name, mode) {\n parent.live.listed = undefined;\n const path = childPath(parent, name);\n if (Fs.isDir(mode)) {\n call(() => bridgeOf(parent).mkdir(path));\n\n const perm = mode & PERM_MASK & ~UMASK;\n if (perm !== DEFAULT_DIR_PERM) metadataCall(() => bridgeOf(parent).chmod(path, perm));\n } else if (Fs.isFile(mode)) {\n call(() => bridgeOf(parent).writeFile(path, new Uint8Array(0)));\n } else {\n throw new Fs.ErrnoError(ERRNO_BY_CODE.EPERM);\n }\n const node = makeNode(parent, name, {\n isFile: Fs.isFile(mode),\n isDirectory: Fs.isDir(mode),\n isSymbolicLink: false,\n size: 0,\n mode,\n mtimeMs: Date.now(),\n });\n\n node.live.stat = undefined;\n return node;\n },\n rename(oldNode, newDir, newName) {\n oldNode.parent.live.listed = undefined;\n newDir.live.listed = undefined;\n const from = liveNodePath(oldNode);\n const to = childPath(newDir, newName);\n flushNode(oldNode);\n call(() => bridgeOf(oldNode).rename(from, to));\n\n try {\n const existing = Fs.lookupNode?.(newDir, newName);\n if (existing && existing !== oldNode) Fs.hashRemoveNode?.(existing);\n } catch {}\n oldNode.name = newName;\n oldNode.parent = newDir;\n oldNode.live.stat = undefined;\n },\n unlink(parent, name) {\n parent.live.listed = undefined;\n let open: LiveFsNode | undefined;\n try {\n const node = Fs.lookupNode?.(parent, name);\n if (node && node.live?.openCount > 0 && Fs.isFile(node.mode)) open = node;\n } catch {}\n if (open) {\n statOf(open);\n ensureLoaded(open);\n }\n call(() => bridgeOf(parent).unlink(childPath(parent, name)));\n if (open) open.live.orphan = true;\n },\n rmdir(parent, name) {\n parent.live.listed = undefined;\n call(() => bridgeOf(parent).rmdir(childPath(parent, name)));\n },\n readdir(node) {\n const listed = call(() => bridgeOf(node).readdirStat(liveNodePath(node)));\n node.live.listed = new Map();\n for (const [name, st] of listed) if (st) node.live.listed.set(name, st);\n return ['.', '..', ...listed.map(([name]) => name)];\n },\n symlink(parent, newName, target) {\n parent.live.listed = undefined;\n const path = childPath(parent, newName);\n call(() => bridgeOf(parent).symlink(target, path));\n return makeNode(parent, newName, {\n isFile: false,\n isDirectory: false,\n isSymbolicLink: true,\n size: new TextEncoder().encode(target).length,\n });\n },\n readlink(node) {\n if (!Fs.isLink(node.mode)) throw new Fs.ErrnoError(ERRNO_BY_CODE.EINVAL);\n return call(() => bridgeOf(node).readlink(liveNodePath(node)));\n },\n };\n}\n\nfunction createStreamOps(h: LiveHelpers): LiveStreamOps {\n const { Fs, statOf, ensureLoaded, ensureCapacity, flushNode } = h;\n return {\n open(stream) {\n if (!Fs.isFile(stream.node.mode)) return;\n stream.node.live.openCount++;\n },\n\n dup(stream) {\n if (!Fs.isFile(stream.node.mode)) return;\n stream.node.live.openCount++;\n },\n close(stream) {\n const node = stream.node;\n if (!Fs.isFile(node.mode)) return;\n const s = node.live;\n s.openCount = Math.max(0, s.openCount - 1);\n if (s.openCount > 0) return;\n try {\n flushNode(node);\n } finally {\n s.data = undefined;\n s.len = 0;\n s.loaded = false;\n }\n },\n read(stream, buffer, offset, length, position) {\n const node = stream.node;\n if (Fs.isDir(node.mode)) throw new Fs.ErrnoError(ERRNO_BY_CODE.EISDIR);\n ensureLoaded(node);\n const s = node.live;\n if (position >= s.len || length <= 0) return 0;\n const n = Math.min(length, s.len - position);\n const out = new Uint8Array(buffer.buffer, buffer.byteOffset + offset, n);\n out.set((s.data as Uint8Array).subarray(position, position + n));\n return n;\n },\n write(stream, buffer, offset, length, position) {\n const node = stream.node;\n if (Fs.isDir(node.mode)) throw new Fs.ErrnoError(ERRNO_BY_CODE.EISDIR);\n if (length <= 0) return 0;\n ensureLoaded(node);\n const s = node.live;\n const end = position + length;\n const buf = ensureCapacity(node, end);\n if (position > s.len) buf.fill(0, s.len, position);\n buf.set(new Uint8Array(buffer.buffer, buffer.byteOffset + offset, length), position);\n s.len = Math.max(s.len, end);\n s.dirty = true;\n return length;\n },\n llseek(stream, offset, whence) {\n let pos = offset;\n if (whence === SEEK_CUR) pos += stream.position;\n else if (whence === SEEK_END && Fs.isFile(stream.node.mode)) {\n const s = stream.node.live;\n pos += s.loaded ? s.len : statOf(stream.node).size;\n }\n if (pos < 0) throw new Fs.ErrnoError(ERRNO_BY_CODE.EINVAL);\n return pos;\n },\n fsync(stream) {\n flushNode(stream.node);\n },\n };\n}\n\nexport function createLiveVfsPlugin(Fs: LiveFsApi): LiveVfsPlugin {\n const mounts = new Set<LiveFsMount>();\n const ops: LiveOpsTables = {};\n const h = createHelpers(Fs, ops);\n const nodeOps = createNodeOps(h);\n const streamOps = createStreamOps(h);\n ops.node = nodeOps;\n ops.stream = streamOps;\n return {\n mounts,\n node_ops: nodeOps,\n stream_ops: streamOps,\n mount(mount) {\n const st = h.call(() => mount.opts.bridge.stat(mount.opts.root));\n if (!st.isDirectory) throw new Fs.ErrnoError(ERRNO_BY_CODE.ENOTDIR);\n const root = h.makeNode(null, '/', st);\n mounts.add(mount);\n return root;\n },\n };\n}\n\nfunction ownedBy(plugin: LiveVfsPlugin, node: LiveFsNode | null | undefined): node is LiveFsNode {\n return !!node && plugin.mounts.has(node.mount);\n}\n\nexport function flushLiveVfs(Fs: LiveFsApi, plugin: LiveVfsPlugin): void {\n for (const head of Fs.nameTable ?? []) {\n for (let node = head; node; node = (node as { name_next?: LiveFsNode }).name_next ?? null) {\n if (!ownedBy(plugin, node) || !node.live.dirty || !node.live.data) continue;\n try {\n const bytes = node.live.data.slice(0, node.live.len);\n node.mount.opts.bridge.writeFile(liveNodePath(node), bytes);\n node.live.dirty = false;\n } catch (err) {\n throw toErrno(Fs, err);\n }\n }\n }\n}\n\nexport function invalidateLiveVfs(Fs: LiveFsApi, plugin: LiveVfsPlugin): void {\n const table = Fs.nameTable ?? [];\n const drop: LiveFsNode[] = [];\n for (const head of table) {\n for (let node = head; node; node = (node as { name_next?: LiveFsNode }).name_next ?? null) {\n if (!ownedBy(plugin, node)) continue;\n const s = node.live;\n s.stat = undefined;\n s.listed = undefined;\n if (s.openCount === 0) {\n if (node !== node.mount.root) drop.push(node);\n } else if (s.loaded && !s.dirty) {\n s.data = undefined;\n s.len = 0;\n s.loaded = false;\n }\n }\n }\n if (!Fs.hashRemoveNode) return;\n for (const node of drop) Fs.hashRemoveNode(node);\n}\n\nexport interface LiveMountFsApi extends LiveFsApi {\n filesystems: { SLICC_LIVE_FS?: LiveVfsPlugin };\n mkdirTree(path: string): void;\n mount(type: LiveVfsPlugin, opts: LiveFsMountOpts, mountpoint: string): unknown;\n}\n\nfunction outermostDirs(dirs: readonly string[]): string[] {\n const norm = [...new Set(dirs.map((d) => d.replace(/\\/+$/, '') || '/'))].sort();\n return norm.filter((d) => !norm.some((o) => o !== d && (o === '/' || d.startsWith(`${o}/`))));\n}\n\nfunction describeMountError(err: unknown): string {\n if (err instanceof Error) return err.message;\n const errno = (err as { errno?: unknown } | null)?.errno;\n return typeof errno === 'number' ? `errno ${errno}` : String(err);\n}\n\nexport function mountLiveVfsDirs(\n Fs: LiveMountFsApi,\n bridge: SyncFsPosixBridge,\n dirs: readonly string[],\n warn: (message: string) => void\n): { plugin: LiveVfsPlugin; mounted: string[] } {\n if (typeof Fs.filesystems !== 'object' || !Fs.filesystems) {\n throw new Error(\n 'the module was linked without filesystem support, so the VFS cannot be mounted ' +\n '(link it with -sFORCE_FILESYSTEM=1)'\n );\n }\n const plugin = Fs.filesystems.SLICC_LIVE_FS ?? createLiveVfsPlugin(Fs);\n Fs.filesystems.SLICC_LIVE_FS = plugin;\n const mounted: string[] = [];\n for (const dir of outermostDirs(dirs)) {\n if (dir === '/') continue;\n try {\n Fs.mkdirTree(dir);\n Fs.mount(plugin, { root: dir, bridge }, dir);\n mounted.push(dir);\n } catch (err) {\n warn(`live VFS mount of ${dir} failed: ${describeMountError(err)}`);\n }\n }\n return { plugin, mounted };\n}\n", "import {\n flushLiveVfs,\n invalidateLiveVfs,\n type LiveMountFsApi,\n mountLiveVfsDirs,\n} from './live-vfs-fs.ts';\nimport type { SyncFsPosixBridge } from './sync-fs-wire.ts';\n\nconst MODULE_OWNED_DIRS = new Set(['dev', 'proc']);\n\nconst SYNTHETIC_DIRS = ['/usr', '/bin'];\n\nexport interface EmscriptenFsForHook extends LiveMountFsApi {\n chdir(path: string): void;\n}\n\nexport interface EmscriptenVfsHandle {\n mounted: string[];\n flush(): void;\n invalidate(): void;\n}\n\nexport interface EmscriptenVfsHookDeps {\n bridge: SyncFsPosixBridge;\n cwd: string;\n warn: (message: string) => void;\n}\n\nfunction topLevelDirs(bridge: SyncFsPosixBridge, warn: (message: string) => void): string[] {\n let names: string[];\n try {\n names = bridge.readdir('/');\n } catch (err) {\n warn(`cannot list the VFS root, nothing mounted: ${String(err)}`);\n return [];\n }\n const candidates = names\n .filter((name) => name && !name.includes('/') && !MODULE_OWNED_DIRS.has(name))\n .map((name) => `/${name}`);\n for (const dir of SYNTHETIC_DIRS) if (!candidates.includes(dir)) candidates.push(dir);\n const dirs: string[] = [];\n for (const dir of candidates) {\n try {\n if (bridge.stat(dir).isDirectory) dirs.push(dir);\n } catch {}\n }\n return dirs;\n}\n\nexport function mountVfsIntoEmscripten(\n Fs: EmscriptenFsForHook,\n deps: EmscriptenVfsHookDeps\n): EmscriptenVfsHandle {\n const { bridge, warn } = deps;\n const { plugin, mounted } = mountLiveVfsDirs(Fs, bridge, topLevelDirs(bridge, warn), warn);\n try {\n Fs.chdir(deps.cwd);\n } catch (err) {\n warn(`cannot chdir to ${deps.cwd}: ${String(err)}`);\n }\n return {\n mounted,\n flush: () => flushLiveVfs(Fs, plugin),\n invalidate: () => invalidateLiveVfs(Fs, plugin),\n };\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 atimeMs?: number;\n ctimeMs?: 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.atimeMs === 'number' ? { atimeMs: s.atimeMs } : {}),\n ...(typeof s.ctimeMs === 'number' ? { ctimeMs: s.ctimeMs } : {}),\n ...(typeof s.ino === 'number' ? { ino: s.ino } : {}),\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 {\n parseSyncFsStat,\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsBridgeStat,\n type SyncFsPosixBridge,\n type SyncFsResult,\n syncError,\n} from './sync-fs-wire.ts';\nimport {\n decodeSabResult,\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_IDLE,\n SAB_STATE_PENDING,\n SAB_STATE_READY,\n type SabViews,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabNextMsg,\n type SyncSabReqMsg,\n type SyncSabRequestBody,\n sabViews,\n} from './sync-sab-wire.ts';\n\nexport interface SabPostLike {\n postMessage(message: unknown): void;\n}\n\nexport interface SyncSabTransport {\n call(req: SyncSabRequestBody, timeoutMs: number, label: string): SyncFsResult;\n}\n\nexport type AtomicsWaitLike = (\n typedArray: Int32Array,\n index: number,\n value: number,\n timeout?: number\n) => 'ok' | 'not-equal' | 'timed-out';\n\nexport function createSyncSabTransport(\n sab: SharedArrayBuffer,\n port: SabPostLike,\n deps: { wait?: AtomicsWaitLike; now?: () => number } = {}\n): SyncSabTransport {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const wait: AtomicsWaitLike = deps.wait ?? ((a, i, v, t) => Atomics.wait(a, i, v, t));\n const now = deps.now ?? (() => performance.now());\n let seq = 0;\n\n function awaitReady(id: number, deadline: number, label: string): void {\n for (;;) {\n const remaining = deadline - now();\n if (remaining <= 0) throw syncError('ETIMEDOUT', label);\n\n wait(header, SAB_I_STATE, SAB_STATE_PENDING, remaining);\n if (\n Atomics.load(header, SAB_I_STATE) === SAB_STATE_READY &&\n Atomics.load(header, SAB_I_SEQ) === id\n ) {\n return;\n }\n if (Atomics.load(header, SAB_I_STATE) === SAB_STATE_READY) {\n Atomics.store(header, SAB_I_STATE, SAB_STATE_PENDING);\n }\n }\n }\n\n return {\n call(req, timeoutMs, label): SyncFsResult {\n const id = ++seq;\n const deadline = now() + timeoutMs;\n let out: Uint8Array | null = null;\n let status = 0;\n let offset = 0;\n try {\n for (;;) {\n Atomics.store(header, SAB_I_STATE, SAB_STATE_PENDING);\n const msg: SyncSabReqMsg | SyncSabNextMsg =\n offset === 0\n ? { type: SYNC_SAB_REQ_MSG, id, req }\n : { type: SYNC_SAB_NEXT_MSG, id, offset };\n try {\n port.postMessage(msg);\n } catch {\n throw syncError('EIO', label);\n }\n awaitReady(id, deadline, label);\n const total = Atomics.load(header, SAB_I_TOTAL);\n const chunk = Atomics.load(header, SAB_I_CHUNK);\n const at = Atomics.load(header, SAB_I_OFFSET);\n if (at !== offset || chunk < 0 || total < 0 || offset + chunk > total) {\n throw syncError('EIO', label);\n }\n if (out === null) {\n status = Atomics.load(header, SAB_I_STATUS);\n out = new Uint8Array(total);\n }\n out.set(window.subarray(0, chunk), offset);\n offset += chunk;\n if (offset >= total) break;\n\n if (chunk === 0) throw syncError('EIO', label);\n }\n } finally {\n Atomics.store(header, SAB_I_STATE, SAB_STATE_IDLE);\n }\n return decodeSabResult(status, out);\n },\n };\n}\n\nfunction errnoError(code: string, path: string): Error & { code: string } {\n return syncError(code, `sync-sab bridge, '${path}'`);\n}\n\nexport function createSyncFsSabBridge(\n transport: SyncSabTransport,\n opts: { timeoutMs?: number } = {}\n): SyncFsPosixBridge {\n const timeoutMs = opts.timeoutMs ?? SYNC_FS_REQUEST_TIMEOUT_MS;\n\n function run(req: SyncSabRequestBody, path: string): SyncFsResult {\n const result = transport.call(req, timeoutMs, `sync-sab bridge, '${path}'`);\n if (!result.ok) throw errnoError(result.errno, path);\n return result;\n }\n function bytes(req: SyncSabRequestBody, path: string): Uint8Array {\n const r = run(req, path);\n if (r.ok && r.kind === 'bytes') return r.bytes;\n throw errnoError('EIO', path);\n }\n function json(req: SyncSabRequestBody, path: string): unknown {\n const r = run(req, path);\n if (r.ok && r.kind === 'json') return r.json;\n throw errnoError('EIO', path);\n }\n\n return {\n readFile: (path) => bytes({ op: 'read', path }, path),\n writeFile: (path, data) => {\n run({ op: 'write', path, body: data }, path);\n },\n stat: (path) => {\n const s = parseSyncFsStat(json({ op: 'stat', path }, path));\n if (!s) throw errnoError('EIO', path);\n return s;\n },\n lstat: (path) => {\n const s = parseSyncFsStat(json({ op: 'lstat', path }, path));\n if (!s) throw errnoError('EIO', path);\n return s;\n },\n readdir: (path) => {\n const list = json({ op: 'readdir', path }, path);\n if (!Array.isArray(list) || !list.every((s) => typeof s === 'string')) {\n throw errnoError('EIO', path);\n }\n return list as string[];\n },\n readdirStat: (path) => {\n const list = json({ op: 'readdir-stat', path }, path);\n if (!Array.isArray(list)) throw errnoError('EIO', path);\n return list.map((entry): [string, SyncFsBridgeStat | null] => {\n if (!Array.isArray(entry) || typeof entry[0] !== 'string') throw errnoError('EIO', path);\n\n if (entry[1] === null) return [entry[0], null];\n const stat = parseSyncFsStat(entry[1]);\n if (!stat) throw errnoError('EIO', path);\n return [entry[0], stat];\n });\n },\n exists: (path) => {\n const v = json({ op: 'exists', path }, path);\n if (typeof v !== 'boolean') throw errnoError('EIO', path);\n return v;\n },\n mkdir: (path) => {\n run({ op: 'mkdir', path }, path);\n },\n rm: (path) => {\n run({ op: 'rm', path }, path);\n },\n rename: (from, to) => {\n run({ op: 'rename', path: from, arg2: to }, from);\n },\n unlink: (path) => {\n run({ op: 'unlink', path }, path);\n },\n rmdir: (path) => {\n run({ op: 'rmdir', path }, path);\n },\n symlink: (target, linkPath) => {\n run({ op: 'symlink', path: linkPath, arg2: target }, linkPath);\n },\n readlink: (path) => {\n const target = json({ op: 'readlink', path }, path);\n if (typeof target !== 'string') throw errnoError('EIO', path);\n return target;\n },\n chmod: (path, mode) => {\n run({ op: 'chmod', path, mode }, path);\n },\n utimes: (path, atimeMs, mtimeMs) => {\n run({ op: 'utimes', path, atimeMs, mtimeMs }, path);\n },\n };\n}\n", "const WASI_ERRNO: Readonly<Partial<Record<string, number>>> = {\n EACCES: 2,\n EADDRINUSE: 3,\n EADDRNOTAVAIL: 4,\n EAFNOSUPPORT: 5,\n EAGAIN: 6,\n ECONNREFUSED: 14,\n EINPROGRESS: 26,\n EISCONN: 30,\n ENETUNREACH: 40,\n ENOTCONN: 53,\n ENOTSOCK: 57,\n EPROTONOSUPPORT: 66,\n\n EOPNOTSUPP: 138,\n EBADF: 8,\n ECHILD: 12,\n EFAULT: 21,\n EINTR: 27,\n EINVAL: 28,\n EIO: 29,\n EMFILE: 33,\n ENOENT: 44,\n ENOEXEC: 45,\n ENOSYS: 52,\n ENOTTY: 59,\n ENXIO: 60,\n EPERM: 63,\n EPIPE: 64,\n ESPIPE: 70,\n ESRCH: 71,\n};\n\nconst EIO = 29;\n\nexport function wasiErrno(code: string): number {\n return WASI_ERRNO[code] ?? EIO;\n}\n", "import type { PollState } from '../kernel/fd-table.ts';\nimport type { Termios } from '../kernel/tty.ts';\nimport type { EmscriptenFsForHook } from '../realm/emscripten-vfs-hook.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nconst POLLIN = 0x001;\nconst POLLOUT = 0x004;\nconst POLLERR = 0x008;\nconst POLLHUP = 0x010;\nconst POLLRDNORM = 0x040;\nconst POLLWRNORM = 0x100;\n\nexport const O_NONBLOCK = 0o4000;\n\ninterface PtyPathFs {\n chown?: (path: string, ...rest: number[]) => void;\n lchown?: (path: string, ...rest: number[]) => void;\n chmod?: (path: string, ...rest: number[]) => void;\n lchmod?: (path: string, ...rest: number[]) => void;\n stat?: (path: string, ...rest: unknown[]) => unknown;\n lstat?: (path: string, ...rest: unknown[]) => unknown;\n}\n\nconst PTY_PATH = /^\\/dev\\/(?:ptmx|pts\\/(\\d+))$/;\n\nfunction isPtyPath(path: string): boolean {\n return PTY_PATH.test(path);\n}\n\nfunction ptyStat(path: string): object {\n const n = PTY_PATH.exec(path)?.[1];\n const now = new Date();\n return {\n dev: 0x16,\n ino: n === undefined ? 2 : 3 + Number(n),\n mode: n === undefined ? 0o20666 : 0o20620,\n nlink: 1,\n uid: 1000,\n gid: 1000,\n rdev: n === undefined ? (5 << 8) | 2 : (136 << 8) | Number(n),\n size: 0,\n blksize: 4096,\n blocks: 0,\n atime: now,\n mtime: now,\n ctime: now,\n };\n}\n\nconst O_CREAT = 0o100;\nconst O_EXCL = 0o200;\nconst O_NOCTTY = 0o400;\nconst O_TRUNC = 0o1000;\n\nconst KILLED_BY_SIGPIPE = 128 + 13;\n\nexport class ProcessExit extends Error {\n readonly status: number;\n\n constructor(status: number) {\n super(`exit ${status}`);\n this.status = status;\n }\n}\n\nexport class SyscallError extends Error {\n readonly code: string;\n\n constructor(code: string) {\n super(code);\n this.code = code;\n }\n}\n\nexport interface ReadOptions {\n nonblock?: boolean;\n peek?: boolean;\n}\n\nexport interface ProcessSys {\n read(fd: number, max: number, opts?: ReadOptions): Uint8Array;\n\n write(fd: number, bytes: Uint8Array, opts?: { nonblock?: boolean }): number;\n close(fd: number): void;\n\n pipe(): [number, number];\n poll(fd: number): PollState;\n\n openVfs(\n path: string,\n flags: number,\n position: number,\n opts?: { contents?: Uint8Array; orphan?: boolean; truncate?: boolean; create?: boolean }\n ): number;\n\n seek(fd: number, offset: number, whence: number): number;\n\n flush(fd: number): void;\n\n pread?(fd: number, max: number, at: number): Uint8Array;\n\n isatty?(fd: number): boolean;\n\n ttyName?(fd: number): string | undefined;\n\n openTty?(name?: string): number;\n\n tcgets?(fd: number): Termios;\n tcsets?(fd: number, termios: Termios): void;\n winsize?(fd: number): [number, number];\n\n openPty?(): number;\n openPts?(n: number, noctty: boolean): number;\n\n ptyNumbers?(): number[];\n}\n\nexport interface StreamOps {\n getattr?: (stream: ProcessStream) => object;\n llseek?: (stream: ProcessStream, offset: number, whence: number) => number;\n read?: (stream: ProcessStream, buffer: Uint8Array, offset: number, length: number) => number;\n write?: (stream: ProcessStream, buffer: Uint8Array, offset: number, length: number) => number;\n close?: (stream: ProcessStream) => void;\n dup?: (stream: ProcessStream) => void;\n poll?: (stream: ProcessStream) => number;\n fsync?: () => number;\n}\n\nexport interface ProcessStream {\n fd: number;\n stream_ops: StreamOps;\n sliccKernelFd?: number;\n\n sliccKernelFile?: boolean;\n\n sliccCloexec?: boolean;\n path?: string;\n flags: number;\n position: number;\n tty?: unknown;\n node: {\n mode: number;\n mount?: { type?: unknown };\n node_ops?: { getattr?: (node: ProcessStream['node']) => object };\n };\n\n shared: object;\n}\n\nexport interface ProcessFs extends EmscriptenFsForHook {\n streams: (ProcessStream | null | undefined)[];\n getStream(fd: number): ProcessStream | null;\n open(path: string, flags: number, mode?: number): ProcessStream;\n dupStream(stream: ProcessStream, fd: number): ProcessStream;\n closeStream(fd: number): void;\n\n close?(stream: ProcessStream): void;\n isFile(mode: number): boolean;\n mkdirTree(path: string): void;\n cwd(): string;\n read(stream: ProcessStream, buffer: Uint8Array, offset: number, length: number): number;\n write(stream: ProcessStream, buffer: Uint8Array, offset: number, length: number): number;\n\n stat?(path: string, dontFollow?: boolean): object;\n fstat?(fd: number): object;\n symlink?(target: string, path: string): void;\n lookupPath?(path: string, opts?: { follow?: boolean }): { node: object };\n}\n\nexport interface ProcessPipeFs {\n createPipe(): { readable_fd: number; writable_fd: number };\n}\n\nexport interface KernelStreamOptions {\n sigpipe?: () => boolean;\n\n restartable?: () => boolean;\n}\n\nfunction nonblocking(stream: ProcessStream): { nonblock: true } | undefined {\n return (stream.flags & O_NONBLOCK) !== 0 ? { nonblock: true } : undefined;\n}\n\nexport class KernelStreams {\n private readonly refs = new Map<number, number>();\n\n private readonly Fs: ProcessFs;\n\n private readonly sys: ProcessSys;\n\n private readonly options: KernelStreamOptions;\n\n constructor(\n Fs: ProcessFs,\n\n sys: ProcessSys,\n\n options: KernelStreamOptions = {}\n ) {\n this.Fs = Fs;\n\n this.sys = sys;\n\n this.options = options;\n }\n\n attach(stream: ProcessStream, kfd: number, terminal?: boolean): void {\n this.refs.set(kfd, (this.refs.get(kfd) ?? 0) + 1);\n\n stream.sliccKernelFd = kfd;\n stream.stream_ops = this.ops(kfd, stream.stream_ops);\n if (terminal ?? this.sys.isatty?.(kfd) ?? false) stream.tty = this.ttyOps(kfd);\n else delete stream.tty;\n }\n\n nameTerminal(stream: ProcessStream): void {\n const kfd = stream.sliccKernelFd;\n if (!stream.tty || kfd === undefined) return;\n const name = this.sys.ttyName?.(kfd);\n if (name) this.nameStream(stream, name);\n }\n\n private nameStream(stream: ProcessStream, name: string): void {\n stream.path = name;\n if (typeof this.Fs.stat !== 'function') return;\n\n stream.stream_ops = { ...stream.stream_ops, getattr: () => this.Fs.stat?.(name) ?? {} };\n }\n\n private ttyOps(kfd: number): object {\n return {\n ops: {\n ioctl_tcgets: () => this.call(() => this.sys.tcgets?.(kfd)),\n ioctl_tcsets: (_tty: unknown, _op: number, termios: Termios) =>\n this.call(() => {\n this.sys.tcsets?.(kfd, termios);\n return 0;\n }),\n ioctl_tiocgwinsz: () => this.call(() => this.sys.winsize?.(kfd) ?? [24, 80]),\n fsync: () => {},\n },\n };\n }\n\n attachFile(stream: ProcessStream, kfd: number): void {\n this.attach(stream, kfd, false);\n stream.sliccKernelFile = true;\n stream.stream_ops = {\n ...stream.stream_ops,\n llseek: (_s, offset, whence) => this.call(() => this.sys.seek(kfd, offset, whence)),\n\n fsync: () =>\n this.call(() => {\n this.sys.flush(kfd);\n return 0;\n }),\n };\n }\n\n useControllingTerminal(): void {\n if (typeof this.Fs.open !== 'function') return;\n this.usePtyPaths();\n const open = this.Fs.open.bind(this.Fs);\n this.Fs.open = (path, flags, mode) => {\n const pty = this.openPty(open, path, flags, mode);\n if (pty) return pty;\n const stream = open(path, flags, mode);\n\n if (!stream.tty) return stream;\n if (stream.path === '/dev/tty' && this.sys.openTty) {\n let kfd: number;\n try {\n kfd = this.call(() => this.sys.openTty?.() as number);\n } catch (e) {\n this.Fs.closeStream(stream.fd);\n throw e;\n }\n this.attach(stream, kfd, true);\n return stream;\n }\n\n let named: number | undefined;\n try {\n named = stream.path ? this.openNamedTerminal(stream.path) : undefined;\n } catch (e) {\n this.Fs.closeStream(stream.fd);\n throw e;\n }\n if (named !== undefined) {\n this.attach(stream, named, true);\n return stream;\n }\n\n const terminal = this.stdioTerminal();\n if (terminal !== undefined) this.attach(stream, terminal, true);\n return stream;\n };\n }\n\n private openPty(\n open: NonNullable<ProcessFs['open']>,\n path: string,\n flags: number,\n mode?: number\n ): ProcessStream | undefined {\n const pts = /^\\/dev\\/pts\\/(\\d+)$/.exec(path);\n if (path !== '/dev/ptmx' && !pts) return undefined;\n const { openPty, openPts } = this.sys;\n if (!openPty || !openPts) return undefined;\n const kfd = this.call(() =>\n pts ? openPts(Number(pts[1]), (flags & O_NOCTTY) !== 0) : openPty()\n ) as number;\n let stream: ProcessStream;\n try {\n stream = open('/dev/null', flags & ~(O_CREAT | O_EXCL | O_TRUNC), mode);\n } catch (e) {\n this.sys.close(kfd);\n throw e;\n }\n\n this.attach(stream, kfd, true);\n\n this.nameStream(stream, path);\n return stream;\n }\n\n private usePtyPaths(): void {\n const fs = this.Fs as unknown as PtyPathFs;\n for (const name of ['chown', 'lchown', 'chmod', 'lchmod'] as const) {\n const original = fs[name];\n if (typeof original !== 'function') continue;\n fs[name] = (path: string, ...rest: number[]) =>\n isPtyPath(path) ? this.existingPty(path) : original.call(fs, path, ...rest);\n }\n for (const name of ['stat', 'lstat'] as const) {\n const original = fs[name];\n if (typeof original !== 'function') continue;\n fs[name] = (path: string, ...rest: unknown[]) => {\n if (!isPtyPath(path)) return original.call(fs, path, ...rest);\n this.existingPty(path);\n return ptyStat(path);\n };\n }\n }\n\n private existingPty(path: string): void {\n const n = PTY_PATH.exec(path)?.[1];\n const exists =\n n === undefined\n ? this.sys.openPty !== undefined\n : (this.sys.ptyNumbers?.().includes(Number(n)) ?? false);\n if (!exists) throw new this.Fs.ErrnoError(wasiErrno('ENOENT'));\n }\n\n private openNamedTerminal(path: string): number | undefined {\n const { openTty } = this.sys;\n if (!openTty) return undefined;\n try {\n return openTty.call(this.sys, path);\n } catch (e) {\n if (e instanceof SyscallError && e.code === 'ENXIO') return undefined;\n return this.call(() => {\n throw e;\n });\n }\n }\n\n private stdioTerminal(): number | undefined {\n for (const fd of [0, 1, 2]) {\n const stream = this.Fs.getStream(fd);\n if (stream?.sliccKernelFd !== undefined && stream.tty) return stream.sliccKernelFd;\n }\n return undefined;\n }\n\n usePipes(pipefs: ProcessPipeFs): void {\n const createPipe = pipefs.createPipe.bind(pipefs);\n pipefs.createPipe = () => {\n const [read, write] = this.call(() => this.sys.pipe());\n\n let fds: ReturnType<ProcessPipeFs['createPipe']>;\n try {\n fds = createPipe();\n } catch (e) {\n for (const kfd of [read, write]) {\n try {\n this.sys.close(kfd);\n } catch {}\n }\n throw e;\n }\n this.attach(this.Fs.getStream(fds.readable_fd) as ProcessStream, read, false);\n this.attach(this.Fs.getStream(fds.writable_fd) as ProcessStream, write, false);\n return fds;\n };\n }\n\n private restarting<T>(syscall: () => T): T {\n for (;;) {\n try {\n return syscall();\n } catch (e) {\n if (!(e instanceof SyscallError && e.code === 'EINTR' && this.options.restartable?.())) {\n throw e;\n }\n }\n }\n }\n\n private call<T>(syscall: () => T): T {\n try {\n return syscall();\n } catch (e) {\n if (e instanceof SyscallError) throw new this.Fs.ErrnoError(wasiErrno(e.code));\n throw e;\n }\n }\n\n private ops(kfd: number, base: StreamOps): StreamOps {\n return {\n ...base,\n\n llseek: () =>\n this.call(() => {\n throw new SyscallError('ESPIPE');\n }),\n read: (s, buffer, offset, length) =>\n this.call(() => {\n const bytes = this.restarting(() => this.sys.read(kfd, length, nonblocking(s)));\n buffer.set(bytes, offset);\n return bytes.length;\n }),\n write: (s, buffer, offset, length) => {\n try {\n const bytes = buffer.slice(offset, offset + length);\n return this.restarting(() => this.sys.write(kfd, bytes, nonblocking(s)));\n } catch (e) {\n if (e instanceof SyscallError && e.code === 'EPIPE' && !this.options.sigpipe?.()) {\n throw new ProcessExit(KILLED_BY_SIGPIPE);\n }\n return this.call(() => {\n throw e;\n });\n }\n },\n fsync: () => 0,\n poll: () => {\n const state = this.call(() => this.sys.poll(kfd));\n let mask = 0;\n if (state.readable) mask |= POLLIN | POLLRDNORM;\n if (state.writable) mask |= POLLOUT | POLLWRNORM;\n\n if (state.hangup) mask |= state.readable ? POLLHUP : POLLERR;\n return mask;\n },\n dup: (stream) => {\n base.dup?.(stream);\n this.refs.set(kfd, (this.refs.get(kfd) ?? 0) + 1);\n },\n close: (stream) => {\n try {\n base.close?.(stream);\n } catch {}\n const left = (this.refs.get(kfd) ?? 1) - 1;\n if (left > 0) {\n this.refs.set(kfd, left);\n return;\n }\n this.refs.delete(kfd);\n try {\n this.sys.close(kfd);\n } catch {}\n },\n };\n }\n}\n", "import type { ChildStdio, InheritedSlot } from '../kernel/children.ts';\nimport type { WasmSyscall } from '../kernel/process.ts';\nimport type { ForkState, ForkStream } from '../kernel/protocol.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport type { SyncSabTransport } from '../realm/sync-sab-bridge.ts';\nimport type { ProcessFs, ProcessStream } from './kernel-streams.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nconst POLLIN = 0x001;\nconst POLLOUT = 0x004;\nconst POLLERR = 0x008;\nconst POLLHUP = 0x010;\nconst POLLNVAL = 0x020;\n\nconst SELECT_SLICE_MS = 20;\n\nconst WUNTRACED = 2;\nconst WCONTINUED = 8;\n\nfunction status(r: SyncFsResult): number {\n return r.ok ? 0 : -wasiErrno(r.errno);\n}\n\nfunction number(r: SyncFsResult): number {\n if (!r.ok) return -wasiErrno(r.errno);\n return r.kind === 'json' && typeof r.json === 'number' ? r.json : -wasiErrno('EIO');\n}\n\nexport interface ProcessKernel {\n spawn(\n file: string,\n argv: string[],\n env: Record<string, string> | null,\n cwd: string | null,\n stdio: number[],\n actions?: ReadonlyArray<readonly [number, number]>\n ): number;\n\n wait(pid: number, nohang: boolean, options?: number): [number, number] | number;\n\n fork(state: ForkState): number;\n\n kill(pid: number, sig: number): number;\n\n pause(): number;\n\n setpgid(pid: number, pgid: number): number;\n setsid(): number;\n\n getpgid(pid: number): number;\n getsid(pid: number): number;\n\n tcgetpgrp(fd: number): number;\n\n tcsetpgrp(fd: number, pgrp: number): number;\n\n execWait(pid: number): number;\n\n select(\n read: number[],\n write: number[],\n timeoutMs: number\n ): { read: number[]; write: number[] } | number;\n}\n\nexport interface ProcessKernelDeps {\n transport: SyncSabTransport;\n Fs: ProcessFs;\n\n env: Record<string, string>;\n\n beforeSpawn(): void;\n\n afterChild(): void;\n\n describeFork(): ForkStream[];\n\n inherit?(actions?: ReadonlyArray<readonly [number, number]>): InheritedSlot[];\n\n stdioPromoter?(): (stream: ProcessStream) => void;\n\n pid?: number;\n\n raise?(sig: number): void;\n\n restartable?(): boolean;\n}\n\nfunction drain(Fs: ProcessFs, stream: ProcessStream): Uint8Array {\n const chunks: Uint8Array[] = [];\n const buffer = new Uint8Array(65536);\n try {\n for (let n = Fs.read(stream, buffer, 0, buffer.length); n > 0; ) {\n chunks.push(buffer.slice(0, n));\n n = Fs.read(stream, buffer, 0, buffer.length);\n }\n } catch {}\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\nfunction kernelSelect(\n Fs: ProcessFs,\n transport: SyncSabTransport,\n read: number[],\n write: number[],\n timeoutMs: number\n): { read: number[]; write: number[] } | number {\n const kernel = (fd: number) => Fs.getStream(fd)?.sliccKernelFd as number;\n const kr = read.map(kernel);\n const kw = write.map(kernel);\n const r = transport.call({ op: 'fd-select', read: kr, write: kw, timeoutMs }, Infinity, 'select');\n if (!r.ok) return -wasiErrno(r.errno);\n const got = (r.kind === 'json' ? r.json : { read: [], write: [] }) as {\n read: number[];\n write: number[];\n };\n return {\n read: read.filter((_, i) => got.read.includes(kr[i] as number)),\n write: write.filter((_, i) => got.write.includes(kw[i] as number)),\n };\n}\n\nfunction ownReady(\n Fs: ProcessFs,\n read: number[],\n write: number[]\n): { read: number[]; write: number[] } {\n const flags = (fd: number): number => {\n const stream = Fs.getStream(fd);\n if (!stream) return POLLNVAL;\n return stream.stream_ops.poll ? stream.stream_ops.poll(stream) : POLLIN | POLLOUT;\n };\n return {\n read: read.filter((fd) => flags(fd) & (POLLIN | POLLHUP | POLLERR | POLLNVAL)),\n write: write.filter((fd) => flags(fd) & (POLLOUT | POLLERR | POLLNVAL)),\n };\n}\n\nexport function createProcessKernel(deps: ProcessKernelDeps): ProcessKernel {\n const { transport, Fs } = deps;\n\n const reaped = new Map<number, number>();\n\n const call = (req: WasmSyscall, label: string): SyncFsResult =>\n transport.call(req, Infinity, label);\n\n const slot = (fd: number, n: number, promote?: (stream: ProcessStream) => void): ChildStdio => {\n const stream = fd >= 0 ? Fs.getStream(fd) : null;\n if (!stream) return { none: true };\n promote?.(stream);\n if (stream.sliccKernelFd !== undefined) return { fd: stream.sliccKernelFd };\n\n if (stream.path === '/dev/null') return { none: true };\n return n === 0 ? { input: drain(Fs, stream) } : { capture: true };\n };\n\n const kernelWait = (pid: number, nohang: boolean, options = 0): [number, number] | number => {\n const req = {\n op: 'proc-wait' as const,\n pid,\n nohang,\n ...(options & WUNTRACED ? { untraced: true } : {}),\n ...(options & WCONTINUED ? { continued: true } : {}),\n };\n let r = transport.call(req, Infinity, `proc-wait ${pid}`);\n\n while (!r.ok && r.errno === 'EINTR' && deps.restartable?.()) {\n r = transport.call(req, Infinity, `proc-wait ${pid}`);\n }\n if (!r.ok) return -wasiErrno(r.errno);\n const waited = r.kind === 'json' ? (r.json as [number, number]) : [0, 0];\n if (waited[0] > 0) deps.afterChild();\n return [waited[0], waited[1]];\n };\n\n const deliver = (pid: number, n: number, fd: number): void => {\n const r = transport.call(\n { op: 'proc-captured', pid, slot: n },\n Infinity,\n `proc-captured ${pid}`\n );\n const stream = Fs.getStream(fd);\n if (r.ok && r.kind === 'bytes' && r.bytes.length > 0 && stream) {\n Fs.write(stream, r.bytes, 0, r.bytes.length);\n }\n };\n\n return {\n spawn(file, argv, env, cwd, fds, actions) {\n deps.beforeSpawn();\n const promote = deps.stdioPromoter?.();\n const stdio = [0, 1, 2].map((n) => slot(fds[n] ?? -1, n, promote));\n const inherit = deps.inherit?.(actions) ?? [];\n const r = transport.call(\n {\n op: 'proc-spawn',\n file,\n argv,\n env: env ?? deps.env,\n cwd: cwd ?? Fs.cwd(),\n stdio,\n ...(inherit.length > 0 ? { inherit } : {}),\n },\n Infinity,\n `proc-spawn ${file}`\n );\n if (!r.ok) return -wasiErrno(r.errno);\n const pid = r.kind === 'json' ? (r.json as number) : 0;\n const captures = [1, 2].filter((n) => 'capture' in (stdio[n] as ChildStdio));\n if (captures.length === 0) return pid;\n const waited = kernelWait(pid, false);\n if (typeof waited === 'number') return waited;\n for (const n of captures) deliver(pid, n, fds[n] as number);\n reaped.set(pid, waited[1]);\n return pid;\n },\n fork(state) {\n deps.beforeSpawn();\n const streams = deps.describeFork();\n const r = transport.call(\n { op: 'proc-fork', state: { ...state, streams, cwd: Fs.cwd() } },\n Infinity,\n 'proc-fork'\n );\n if (!r.ok) return -wasiErrno(r.errno);\n return r.kind === 'json' ? (r.json as number) : -wasiErrno('EIO');\n },\n select(read, write, timeoutMs) {\n const kernel = (fd: number) => Fs.getStream(fd)?.sliccKernelFd;\n const own = (fd: number) => kernel(fd) === undefined;\n if (![...read, ...write].some(own))\n return kernelSelect(Fs, transport, read, write, timeoutMs);\n const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : Date.now() + timeoutMs;\n const kernelRead = read.filter((fd) => !own(fd));\n const kernelWrite = write.filter((fd) => !own(fd));\n for (;;) {\n const local = ownReady(Fs, read.filter(own), write.filter(own));\n const pending = local.read.length > 0 || local.write.length > 0;\n const slice = pending ? 0 : Math.min(SELECT_SLICE_MS, Math.max(0, deadline - Date.now()));\n const got = kernelSelect(Fs, transport, kernelRead, kernelWrite, slice);\n if (typeof got === 'number') return got;\n const ready = { read: [...local.read, ...got.read], write: [...local.write, ...got.write] };\n if (ready.read.length > 0 || ready.write.length > 0 || Date.now() >= deadline) {\n return ready;\n }\n }\n },\n execWait(pid) {\n const r = transport.call({ op: 'proc-exec', pid }, Infinity, `exec ${pid}`);\n if (!r.ok) return -wasiErrno(r.errno);\n deps.afterChild();\n return r.kind === 'json' ? (r.json as [number, number])[1] : 0;\n },\n pause() {\n return status(call({ op: 'sig-pause' }, 'pause'));\n },\n kill(pid, sig) {\n if (pid === deps.pid) {\n if (sig !== 0) deps.raise?.(sig);\n return 0;\n }\n return status(call({ op: 'proc-kill', pid, sig }, `kill ${pid}`));\n },\n setpgid: (pid, pgid) => status(call({ op: 'proc-setpgid', pid, pgid }, 'setpgid')),\n setsid: () => number(call({ op: 'proc-setsid' }, 'setsid')),\n getpgid: (pid) => number(call({ op: 'proc-getpgid', pid }, 'getpgid')),\n getsid: (pid) => number(call({ op: 'proc-getsid', pid }, 'getsid')),\n tcgetpgrp(fd) {\n const kfd = Fs.getStream(fd)?.sliccKernelFd;\n if (kfd === undefined) return -wasiErrno('ENOTTY');\n return number(call({ op: 'tty-pgrp-get', fd: kfd }, 'tcgetpgrp'));\n },\n tcsetpgrp(fd, pgrp) {\n const kfd = Fs.getStream(fd)?.sliccKernelFd;\n if (kfd === undefined) return -wasiErrno('ENOTTY');\n return status(call({ op: 'tty-pgrp-set', fd: kfd, pgrp }, 'tcsetpgrp'));\n },\n wait(pid, nohang, options) {\n const key = pid > 0 ? (reaped.has(pid) ? pid : undefined) : reaped.keys().next().value;\n if (key !== undefined) {\n const status = reaped.get(key) as number;\n reaped.delete(key);\n return [key, status];\n }\n return kernelWait(pid, nohang, options);\n },\n };\n}\n", "import type { ProcessFs } from './kernel-streams.ts';\nimport type { GlueSyscall } from './process-fds.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nexport const TIOCGPTN = 0x80045430;\nexport const TIOCSPTLCK = 0x40045431;\nexport const TIOCSCTTY = 0x540e;\nexport const TIOCSWINSZ = 0x5414;\nexport const TIOCPKT = 0x5420;\n\nexport interface PtyKernel {\n ptyNumber(kfd: number): number;\n\n ptyLock(kfd: number, lock: boolean): void;\n\n setControllingTerminal(kfd: number): void;\n\n setPacketMode(kfd: number, on: boolean): void;\n\n setWinsize(kfd: number, rows: number, cols: number): void;\n}\n\nexport interface PtyIoctlDeps {\n fs(): ProcessFs | undefined;\n\n heap(): Int32Array | undefined;\n kernel: PtyKernel;\n}\n\nfunction failed(e: unknown): number {\n const code = (e as { code?: unknown } | null)?.code;\n if (typeof code === 'string') return -wasiErrno(code);\n throw e;\n}\n\nexport function ptyIoctl(ioctl: GlueSyscall, deps: PtyIoctlDeps): GlueSyscall {\n return (fd, op, varargs) => {\n const request = op >>> 0;\n if (\n request !== TIOCGPTN &&\n request !== TIOCSPTLCK &&\n request !== TIOCSCTTY &&\n request !== TIOCSWINSZ &&\n request !== TIOCPKT\n ) {\n return ioctl(fd, op, varargs);\n }\n const stream = deps.fs()?.getStream(fd);\n const kfd = (stream as { sliccKernelFd?: number } | undefined)?.sliccKernelFd;\n\n if (kfd === undefined) return ioctl(fd, op, varargs);\n const heap = deps.heap();\n if (!heap) return -wasiErrno('EFAULT');\n const argp = (heap[varargs >> 2] ?? 0) >>> 0;\n try {\n return answer(request, kfd, argp, heap, deps.kernel);\n } catch (e) {\n return failed(e);\n }\n };\n}\n\nfunction answer(\n request: number,\n kfd: number,\n argp: number,\n heap: Int32Array,\n kernel: PtyKernel\n): number {\n switch (request) {\n case TIOCGPTN:\n heap[argp >> 2] = kernel.ptyNumber(kfd);\n return 0;\n case TIOCSPTLCK:\n kernel.ptyLock(kfd, (heap[argp >> 2] ?? 0) !== 0);\n return 0;\n case TIOCSCTTY:\n kernel.setControllingTerminal(kfd);\n return 0;\n case TIOCPKT:\n kernel.setPacketMode(kfd, (heap[argp >> 2] ?? 0) !== 0);\n return 0;\n default: {\n const word = heap[argp >> 2] ?? 0;\n kernel.setWinsize(kfd, word & 0xffff, (word >>> 16) & 0xffff);\n return 0;\n }\n }\n}\n", "import type { ProcessFs, ProcessStream } from './kernel-streams.ts';\nimport { type PtyKernel, ptyIoctl } from './process-pty.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nexport const O_CLOEXEC = 0o2000000;\n\nconst FD_CLOEXEC = 1;\nconst F_DUPFD = 0;\nconst F_GETFD = 1;\nconst F_SETFD = 2;\nconst F_GETFL = 3;\nconst F_DUPFD_CLOEXEC = 1030;\n\ntype CloexecStream = Pick<ProcessStream, 'sliccCloexec'>;\n\nexport function closesOnExec(stream: CloexecStream): boolean {\n return stream.sliccCloexec === true;\n}\n\nexport function setCloseOnExec(stream: CloexecStream, on: boolean): void {\n if (on) stream.sliccCloexec = true;\n else delete stream.sliccCloexec;\n}\n\nconst tracked = new WeakSet<ProcessFs>();\n\nexport function trackCloseOnExec(Fs: ProcessFs): void {\n if (tracked.has(Fs)) return;\n tracked.add(Fs);\n if (typeof Fs.dupStream === 'function') {\n const dupStream = Fs.dupStream.bind(Fs);\n Fs.dupStream = (stream, fd) => {\n const copy = dupStream(stream, fd);\n setCloseOnExec(copy, false);\n return copy;\n };\n }\n if (typeof Fs.open === 'function') {\n const open = Fs.open.bind(Fs);\n Fs.open = (path, flags, mode) => {\n const cloexec = typeof flags === 'number' && (flags & O_CLOEXEC) !== 0;\n const stream = open(path, cloexec ? flags & ~O_CLOEXEC : flags, mode);\n setCloseOnExec(stream, cloexec);\n return stream;\n };\n }\n}\n\nexport type GlueSyscall = (...args: number[]) => number;\n\nexport interface GlueSyscalls {\n fcntl?: GlueSyscall;\n pipe2?: GlueSyscall;\n dup3?: GlueSyscall;\n socket?: GlueSyscall;\n accept4?: GlueSyscall;\n\n ioctl?: GlueSyscall;\n\n setitimer?: GlueSyscall;\n}\n\nexport interface CloexecDeps {\n fs(): ProcessFs | undefined;\n\n heap(): Int32Array | undefined;\n\n pty?: PtyKernel;\n\n timer?: { arm(ms: number): void };\n}\n\nfunction marker(deps: CloexecDeps): (fd: number, on: boolean) => void {\n return (fd, on) => {\n const stream = deps.fs()?.getStream(fd);\n if (stream) setCloseOnExec(stream, on);\n };\n}\n\nfunction cloexecFcntl(fcntl: GlueSyscall, deps: CloexecDeps): GlueSyscall {\n const mark = marker(deps);\n return (fd, cmd, varargs) => {\n if (cmd === F_DUPFD_CLOEXEC) {\n const copy = fcntl(fd, F_DUPFD, varargs);\n if (copy >= 0) mark(copy, true);\n return copy;\n }\n if (cmd === F_GETFL) {\n const flags = fcntl(fd, cmd, varargs);\n return flags < 0 ? flags : flags & ~O_CLOEXEC;\n }\n if (cmd !== F_GETFD && cmd !== F_SETFD) return fcntl(fd, cmd, varargs);\n const stream = deps.fs()?.getStream(fd);\n if (!stream) return -wasiErrno('EBADF');\n if (cmd === F_GETFD) return closesOnExec(stream) ? FD_CLOEXEC : 0;\n const arg = deps.heap()?.[varargs >> 2];\n if (arg === undefined) return -wasiErrno('EINVAL');\n setCloseOnExec(stream, (arg & FD_CLOEXEC) !== 0);\n return 0;\n };\n}\n\nfunction cloexecPipe2(pipe2: GlueSyscall, deps: CloexecDeps): GlueSyscall {\n const mark = marker(deps);\n return (fdPtr, flags) => {\n const r = pipe2(fdPtr, flags & ~O_CLOEXEC);\n const heap = deps.heap();\n if (r === 0 && flags & O_CLOEXEC && heap) {\n mark(heap[fdPtr >> 2] as number, true);\n mark(heap[(fdPtr >> 2) + 1] as number, true);\n }\n return r;\n };\n}\n\nfunction cloexecByFlag(syscall: GlueSyscall, flagArg: number, deps: CloexecDeps): GlueSyscall {\n const mark = marker(deps);\n return (...args) => {\n const cloexec = ((args[flagArg] ?? 0) & O_CLOEXEC) !== 0;\n if (cloexec) args[flagArg] = (args[flagArg] as number) & ~O_CLOEXEC;\n const fd = syscall(...args);\n if (fd >= 0) mark(fd, cloexec);\n return fd;\n };\n}\n\ntype SyscallName = keyof GlueSyscalls;\n\nconst IMPORT_NAMES: Readonly<Record<SyscallName, string>> = {\n fcntl: '__syscall_fcntl64',\n pipe2: '__syscall_pipe2',\n dup3: '__syscall_dup3',\n socket: '__syscall_socket',\n accept4: '__syscall_accept4',\n ioctl: '__syscall_ioctl',\n setitimer: '_setitimer_js',\n};\n\nfunction wrapperFactories(\n deps: CloexecDeps\n): Partial<Record<SyscallName, (syscall: GlueSyscall) => GlueSyscall>> {\n const { pty, timer } = deps;\n return {\n ...(timer ? { setitimer: (f: GlueSyscall) => kernelTimer(f, timer) } : {}),\n fcntl: (f) => cloexecFcntl(f, deps),\n pipe2: (f) => cloexecPipe2(f, deps),\n\n dup3: (f) => cloexecByFlag(f, 2, deps),\n socket: (f) => cloexecByFlag(f, 1, deps),\n accept4: (f) => cloexecByFlag(f, 3, deps),\n ...(pty\n ? { ioctl: (f: GlueSyscall) => ptyIoctl(f, { fs: deps.fs, heap: deps.heap, kernel: pty }) }\n : {}),\n };\n}\n\nfunction kernelTimer(setitimer: GlueSyscall, timer: { arm(ms: number): void }): GlueSyscall {\n return (which, ms) => {\n if (which !== 0) return setitimer(which, ms);\n timer.arm(ms ?? 0);\n return 0;\n };\n}\n\nfunction syscallOf(glue: GlueSyscalls, name: string, value: unknown): SyscallName | undefined {\n const names = Object.keys(IMPORT_NAMES) as SyscallName[];\n const own = names.find((key) => glue[key] !== undefined && glue[key] === value);\n if (own) return own;\n\n return typeof value === 'function'\n ? names.find((key) => glue[key] !== undefined && IMPORT_NAMES[key] === name)\n : undefined;\n}\n\nexport function wrapCloexecSyscalls(\n imports: WebAssembly.Imports,\n glue: GlueSyscalls | undefined,\n deps: CloexecDeps\n): void {\n if (!glue) return;\n const factories = wrapperFactories(deps);\n const seen = new Set<object>();\n for (const namespace of Object.values(imports)) {\n if (!namespace || typeof namespace !== 'object' || seen.has(namespace)) continue;\n seen.add(namespace);\n for (const [name, value] of Object.entries(namespace)) {\n const key = syscallOf(glue, name, value);\n const wrap = key && factories[key];\n if (wrap) namespace[name] = wrap(value as GlueSyscall);\n }\n }\n}\n\nexport function wasmMemory(\n instance: WebAssembly.Instance,\n imports: WebAssembly.Imports\n): WebAssembly.Memory | undefined {\n const isMemory = (v: unknown): v is WebAssembly.Memory => v instanceof WebAssembly.Memory;\n const exported = Object.values(instance.exports).find(isMemory);\n if (exported) return exported;\n for (const namespace of Object.values(imports)) {\n const found = Object.values(namespace ?? {}).find(isMemory);\n if (found) return found;\n }\n return undefined;\n}\n\nexport function fdOfPath(path: string, cwd: string): number | undefined {\n const parts: string[] = [];\n for (const part of `${path.startsWith('/') ? '' : cwd}/${path}`.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n const abs = `/${parts.join('/')}`;\n const std = ['/dev/stdin', '/dev/stdout', '/dev/stderr'].indexOf(abs);\n if (std >= 0) return std;\n const m = /^\\/(?:dev|proc\\/self)\\/fd\\/(\\d+)$/.exec(abs);\n return m ? Number(m[1]) : undefined;\n}\n\nconst DIR_MODE = 0o040555;\nconst LINK_MODE = 0o120700;\n\nfunction syntheticAttr(mode: number, ino: number): object {\n const now = new Date();\n return {\n dev: 1,\n ino,\n mode,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n size: 0,\n atime: now,\n mtime: now,\n ctime: now,\n blksize: 4096,\n blocks: 0,\n };\n}\n\ninterface FdDirNode {\n id?: number;\n node_ops?: {\n lookup?: (parent: FdDirNode, name: string) => FdDirNode;\n getattr?: (node: FdDirNode) => object;\n };\n}\n\nfunction describeFdDir(Fs: ProcessFs): void {\n let dir: FdDirNode | undefined;\n try {\n dir = Fs.lookupPath?.('/proc/self/fd', { follow: true })?.node as FdDirNode | undefined;\n } catch {\n return;\n }\n const ops = dir?.node_ops;\n const lookup = ops?.lookup;\n if (!dir || !lookup || ops.getattr) return;\n dir.node_ops = {\n ...ops,\n getattr: () => syntheticAttr(DIR_MODE, 1),\n lookup: (parent, name) => {\n const entry = lookup(parent, name);\n entry.node_ops = {\n ...entry.node_ops,\n getattr: () => syntheticAttr(LINK_MODE, entry.id ?? 0),\n };\n return entry;\n },\n };\n}\n\nexport function useDevFd(Fs: ProcessFs): void {\n if (typeof Fs.open !== 'function') return;\n try {\n Fs.symlink?.('/proc/self/fd', '/dev/fd');\n } catch {}\n describeFdDir(Fs);\n const fdOf = (path: unknown): number | undefined =>\n typeof path === 'string' ? fdOfPath(path, Fs.cwd()) : undefined;\n const target = (fd: number): ProcessStream => {\n const stream = Fs.getStream(fd);\n if (!stream) throw new Fs.ErrnoError(wasiErrno('EBADF'));\n return stream;\n };\n const open = Fs.open.bind(Fs);\n Fs.open = (path, flags, mode) => {\n const fd = fdOf(path);\n if (fd === undefined) return open(path, flags, mode);\n const copy = Fs.dupStream(target(fd), -1);\n setCloseOnExec(copy, typeof flags === 'number' && (flags & O_CLOEXEC) !== 0);\n return copy;\n };\n const { stat, fstat } = Fs;\n if (typeof stat !== 'function' || typeof fstat !== 'function') return;\n Fs.stat = (path, dontFollow) => {\n const fd = dontFollow ? undefined : fdOf(path);\n if (fd === undefined) return stat.call(Fs, path, dontFollow);\n target(fd);\n return fstat.call(Fs, fd);\n };\n}\n", "import type { InheritedSlot } from '../kernel/children.ts';\nimport type { DeviceAccess, KernelDevice } from '../kernel/fd-table.ts';\nimport type { ForkStream, KernelStreamEntry } from '../kernel/protocol.ts';\nimport type { KernelStreams, ProcessFs, ProcessStream, ProcessSys } from './kernel-streams.ts';\nimport { closesOnExec, O_CLOEXEC, setCloseOnExec } from './process-fds.ts';\n\nconst O_RDWR = 0o2;\nconst O_ACCMODE = 0o3;\nconst O_CREAT = 0o100;\nconst O_EXCL = 0o200;\nconst O_TRUNC = 0o1000;\n\nconst PLACEHOLDER_DIR = '/dev/slicc-fd';\n\ninterface LiveNodeBag {\n live?: { orphan?: boolean; data?: Uint8Array; len?: number };\n mode: number;\n}\n\nfunction isVfsFile(Fs: ProcessFs, stream: ProcessStream): boolean {\n const node = stream.node as LiveNodeBag;\n return node.live !== undefined && Fs.isFile(node.mode);\n}\n\nfunction orphanContents(stream: ProcessStream): Uint8Array | undefined {\n const live = (stream.node as LiveNodeBag).live;\n if (!live?.orphan) return undefined;\n return live.data?.slice(0, live.len ?? live.data.length) ?? new Uint8Array(0);\n}\n\nexport function vfsPromoter(\n Fs: ProcessFs,\n sys: ProcessSys,\n streams: KernelStreams,\n livePath: (stream: ProcessStream) => string\n): (stream: ProcessStream) => void {\n const promoted = new Map<object, number>();\n return (stream) => {\n if (stream.sliccKernelFd !== undefined || !isVfsFile(Fs, stream)) return;\n let kfd = promoted.get(stream.shared);\n if (kfd === undefined) {\n const contents = orphanContents(stream);\n kfd = sys.openVfs(\n livePath(stream),\n stream.flags,\n stream.position,\n contents !== undefined ? { contents, orphan: true } : undefined\n );\n promoted.set(stream.shared, kfd);\n }\n streams.attachFile(stream, kfd);\n };\n}\n\nexport function describeForFork(\n Fs: ProcessFs,\n sys: ProcessSys,\n streams: KernelStreams,\n livePath: (stream: ProcessStream) => string\n): ForkStream[] {\n const promote = vfsPromoter(Fs, sys, streams, livePath);\n const out: ForkStream[] = [];\n for (const stream of Fs.streams) {\n if (!stream) continue;\n promote(stream);\n if (stream.sliccKernelFd !== undefined) {\n out.push(kernelEntry(stream, stream.sliccKernelFd));\n } else if (stream.path) {\n const flags = stream.flags | (closesOnExec(stream) ? O_CLOEXEC : 0);\n out.push({ fd: stream.fd, path: stream.path, flags });\n }\n }\n return out;\n}\n\nfunction kernelEntry(stream: ProcessStream, kernel: number): ForkStream {\n const cloexec = closesOnExec(stream) ? { cloexec: true } : {};\n const kind = stream.sliccKernelFile ? 'file' : stream.tty ? 'tty' : 'stream';\n return { fd: stream.fd, kernel, kind, ...cloexec };\n}\n\nconst ACCESS: Readonly<Record<number, DeviceAccess>> = { 0: 'read', 1: 'write' };\n\nconst DEVICES: Readonly<Record<string, KernelDevice>> = {\n '/dev/null': 'null',\n '/dev/zero': 'zero',\n '/dev/urandom': 'urandom',\n '/dev/random': 'urandom',\n};\n\nexport function describeInherited(\n Fs: ProcessFs,\n sys: ProcessSys,\n streams: KernelStreams,\n livePath: (stream: ProcessStream) => string,\n actions: ReadonlyArray<readonly [number, number]> = []\n): InheritedSlot[] {\n const table = new Map<number, { stream: ProcessStream; cloexec: boolean }>();\n for (const stream of Fs.streams) {\n if (stream) table.set(stream.fd, { stream, cloexec: closesOnExec(stream) });\n }\n for (const [target, source] of actions) {\n if (target <= 2) continue;\n const from = source >= 0 ? table.get(source) : undefined;\n if (from) table.set(target, { stream: from.stream, cloexec: false });\n else table.delete(target);\n }\n const slots = new Map<number, ProcessStream>();\n for (const [fd, { stream, cloexec }] of table) {\n if (fd > 2 && !cloexec) slots.set(fd, stream);\n }\n const promote = vfsPromoter(Fs, sys, streams, livePath);\n const out: InheritedSlot[] = [];\n for (const [fd, stream] of slots) {\n promote(stream);\n const slot = inheritedSlot(fd, stream);\n if (slot) out.push(slot);\n }\n return out;\n}\n\nfunction inheritedSlot(fd: number, stream: ProcessStream): InheritedSlot | undefined {\n if (stream.sliccKernelFd === undefined) {\n const device = stream.path === undefined ? undefined : DEVICES[stream.path];\n if (!device) return undefined;\n const access = ACCESS[stream.flags & O_ACCMODE];\n return { fd, device, ...(access ? { access } : {}) };\n }\n return { fd, kernel: stream.sliccKernelFd };\n}\n\nfunction place(Fs: ProcessFs, stream: ProcessStream, fd: number): ProcessStream {\n if (stream.fd === fd) return stream;\n const moved = Fs.dupStream(stream, fd);\n Fs.closeStream(stream.fd);\n return moved;\n}\n\nfunction placeholder(Fs: ProcessFs, entry: { fd: number; kind: string }): ProcessStream {\n if (entry.kind === 'tty') return Fs.open('/dev/tty', O_RDWR);\n if (entry.kind === 'stream') return Fs.open('/dev/null', O_RDWR);\n Fs.mkdirTree(PLACEHOLDER_DIR);\n return Fs.open(`${PLACEHOLDER_DIR}/${entry.fd}`, O_RDWR | O_CREAT);\n}\n\nconst FIFO_MODE = 0o010600;\n\nlet nextStreamIno = 0x40000000;\n\nconst streamInos = new WeakMap<KernelStreams, Map<string, number>>();\n\nfunction asFifo(stream: ProcessStream, streams: KernelStreams, identity: string): void {\n const inos = streamInos.get(streams) ?? new Map<string, number>();\n streamInos.set(streams, inos);\n const fixed = inos.get(identity) ?? nextStreamIno++;\n inos.set(identity, fixed);\n const node = stream.node;\n stream.stream_ops = {\n ...stream.stream_ops,\n getattr: () => ({ ...node.node_ops?.getattr?.(node), mode: FIFO_MODE, ino: fixed, size: 0 }),\n };\n}\n\nexport function placeKernelStream(\n Fs: ProcessFs,\n streams: KernelStreams,\n entry: KernelStreamEntry\n): ProcessStream {\n const stream = place(Fs, placeholder(Fs, entry), entry.fd);\n if (entry.kind === 'file') streams.attachFile(stream, entry.kernel);\n else streams.attach(stream, entry.kernel, entry.kind === 'tty');\n if (entry.kind === 'tty') streams.nameTerminal(stream);\n if (entry.kind === 'stream') {\n asFifo(stream, streams, entry.desc !== undefined ? `d${entry.desc}` : `k${entry.kernel}`);\n }\n setCloseOnExec(stream, entry.cloexec === true);\n return stream;\n}\n\nexport function restoreForkedStreams(\n Fs: ProcessFs,\n streams: KernelStreams,\n table: readonly ForkStream[]\n): void {\n for (const stream of Fs.streams) if (stream) Fs.closeStream(stream.fd);\n for (const entry of table) {\n try {\n if ('kernel' in entry) {\n placeKernelStream(Fs, streams, entry);\n } else {\n const placed = place(\n Fs,\n Fs.open(entry.path, entry.flags & ~(O_CREAT | O_EXCL | O_TRUNC)),\n entry.fd\n );\n\n setCloseOnExec(placed, (entry.flags & O_CLOEXEC) !== 0);\n }\n } catch {}\n }\n}\n", "import { SIG, sigbit, signalsIn } from '../kernel/signals.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport type { SyncSabTransport } from '../realm/sync-sab-bridge.ts';\nimport { SAB_I_SIGNALS, SAB_I_TIMERS } from '../realm/sync-sab-wire.ts';\n\nexport interface SignalHooks {\n masks(): { caught: number; ignored: number; restart: number } | null;\n\n raise(sig: number): void;\n\n timer?(which: number): void;\n}\n\nexport class SignalGate {\n private reported = { caught: 0, ignored: 0 };\n private restart = 0;\n\n private lastDelivered = 0;\n\n private depth = 0;\n\n private reporting = false;\n\n private readonly raw: SyncSabTransport;\n\n private readonly header: Int32Array;\n\n private readonly hooks: SignalHooks;\n\n constructor(\n raw: SyncSabTransport,\n\n header: Int32Array,\n\n hooks: SignalHooks\n ) {\n this.raw = raw;\n\n this.header = header;\n\n this.hooks = hooks;\n }\n\n transport(): SyncSabTransport {\n return {\n call: (req, timeoutMs, label): SyncFsResult => {\n this.report();\n this.depth++;\n try {\n const result = this.raw.call(req, timeoutMs, label);\n this.deliver();\n return result;\n } finally {\n this.depth--;\n }\n },\n };\n }\n\n restartable(): boolean {\n return this.lastDelivered !== 0 && (this.lastDelivered & ~this.restart) === 0;\n }\n\n private report(): void {\n if (this.reporting) return;\n this.reporting = true;\n let masks: ReturnType<SignalHooks['masks']>;\n try {\n masks = this.hooks.masks();\n } catch {\n masks = null;\n } finally {\n this.reporting = false;\n }\n if (!masks) return;\n this.restart = masks.restart;\n const { caught, ignored } = masks;\n if (caught === this.reported.caught && ignored === this.reported.ignored) return;\n this.reported = { caught, ignored };\n this.raw.call({ op: 'sig-mask', caught, ignored }, Number.POSITIVE_INFINITY, 'sig-mask');\n }\n\n deliver(): void {\n const timers = Atomics.exchange(this.header, SAB_I_TIMERS, 0);\n const pending = Atomics.exchange(this.header, SAB_I_SIGNALS, 0);\n\n if (this.depth <= 1) this.lastDelivered = pending | (timers & 1 ? sigbit(SIG.ALRM) : 0);\n for (let which = 0; which < 3; which++) {\n if (timers & (1 << which)) this.hooks.timer?.(which);\n }\n for (const sig of signalsIn(pending)) this.hooks.raise(sig);\n }\n}\n", "import type { ProcessFs } from './kernel-streams.ts';\n\nexport const REALM_UID = 1000;\nexport const REALM_GID = 1000;\n\nexport function ownByRealmUser(Fs: ProcessFs): void {\n const { stat, fstat } = Fs;\n const owned = (attr: object): object => ({ ...attr, uid: REALM_UID, gid: REALM_GID });\n if (typeof stat === 'function') {\n Fs.stat = (path, dontFollow) => owned(stat.call(Fs, path, dontFollow));\n }\n if (typeof fstat === 'function') Fs.fstat = (fd) => owned(fstat.call(Fs, fd));\n}\n", "import type { DeviceMeta, PollState } from '../kernel/fd-table.ts';\nimport type { ForkState, InheritedFd, WasmProcessInitMsg } from '../kernel/protocol.ts';\nimport { SIG } from '../kernel/signals.ts';\nimport type { Termios } from '../kernel/tty.ts';\nimport { mountVfsIntoEmscripten } from '../realm/emscripten-vfs-hook.ts';\nimport { type LiveFsNode, liveNodePath } from '../realm/live-vfs-fs.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n createSyncFsSabBridge,\n createSyncSabTransport,\n type SabPostLike,\n type SyncSabTransport,\n} from '../realm/sync-sab-bridge.ts';\nimport { SAB_HEADER_I32, type SyncSabRequestBody } from '../realm/sync-sab-wire.ts';\nimport {\n KernelStreams,\n type ProcessFs,\n type ProcessPipeFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n} from './kernel-streams.ts';\nimport { createProcessKernel, type ProcessKernel } from './process-children.ts';\nimport {\n type GlueSyscalls,\n trackCloseOnExec,\n useDevFd,\n wasmMemory,\n wrapCloexecSyscalls,\n} from './process-fds.ts';\nimport {\n describeForFork,\n describeInherited,\n placeKernelStream,\n restoreForkedStreams,\n vfsPromoter,\n} from './process-fork.ts';\nimport type { PtyKernel } from './process-pty.ts';\nimport { SignalGate } from './process-signals.ts';\nimport { ownByRealmUser } from './realm-user.ts';\n\nexport {\n type ProcessFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n} from './kernel-streams.ts';\n\nexport function kernelSys(transport: SyncSabTransport): ProcessSys & PtyKernel {\n const call = (req: SyncSabRequestBody, label: string): SyncFsResult => {\n const r = transport.call(req, Number.POSITIVE_INFINITY, label);\n if (!r.ok) throw new SyscallError(r.errno);\n return r;\n };\n const json = (r: SyncFsResult): unknown => (r.ok && r.kind === 'json' ? r.json : undefined);\n return {\n read(fd, max, opts) {\n const flags = {\n ...(opts?.nonblock ? { nonblock: true } : {}),\n ...(opts?.peek ? { peek: true } : {}),\n };\n const r = call({ op: 'fd-read', fd, max, ...flags }, `fd-read ${fd}`);\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n },\n write(fd, bytes, opts) {\n const req = {\n op: 'fd-write' as const,\n fd,\n body: bytes,\n ...(opts?.nonblock ? { nonblock: true } : {}),\n };\n const n = json(call(req, `fd-write ${fd}`));\n return typeof n === 'number' ? n : bytes.length;\n },\n close(fd) {\n call({ op: 'fd-close', fd }, `fd-close ${fd}`);\n },\n pipe() {\n return json(call({ op: 'fd-pipe' }, 'fd-pipe')) as [number, number];\n },\n poll(fd) {\n return json(call({ op: 'fd-poll', fd }, `fd-poll ${fd}`)) as PollState;\n },\n openVfs(path, flags, position, opts) {\n return json(\n call(\n {\n op: 'fd-open-vfs',\n path,\n flags,\n position,\n ...(opts?.contents !== undefined ? { contents: opts.contents } : {}),\n ...(opts?.orphan ? { orphan: true } : {}),\n ...(opts?.truncate ? { truncate: true } : {}),\n ...(opts?.create ? { create: true } : {}),\n },\n `fd-open-vfs ${path}`\n )\n ) as number;\n },\n seek(fd, offset, whence) {\n return json(call({ op: 'fd-seek', fd, offset, whence }, `fd-seek ${fd}`)) as number;\n },\n flush(fd) {\n call({ op: 'fd-flush', fd }, `fd-flush ${fd}`);\n },\n pread(fd, max, at) {\n const r = call({ op: 'fd-pread', fd, max, offset: at }, `fd-pread ${fd}`);\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n },\n isatty(fd) {\n return (\n (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { tty?: boolean })?.tty === true\n );\n },\n ttyName(fd) {\n return (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { name?: string })?.name;\n },\n openTty(name) {\n const req =\n name === undefined ? { op: 'fd-open-tty' as const } : { op: 'fd-open-tty' as const, name };\n return json(call(req, `fd-open-tty ${name ?? ''}`)) as number;\n },\n tcgets(fd) {\n return json(call({ op: 'tty-get', fd }, `tty-get ${fd}`)) as Termios;\n },\n tcsets(fd, termios) {\n call({ op: 'tty-set', fd, termios }, `tty-set ${fd}`);\n },\n winsize(fd) {\n return json(call({ op: 'tty-winsz', fd }, `tty-winsz ${fd}`)) as [number, number];\n },\n openPty() {\n return json(call({ op: 'pty-open' }, 'pty-open')) as number;\n },\n openPts(n, noctty) {\n return json(call({ op: 'pty-slave-open', n, noctty }, `pty-slave-open ${n}`)) as number;\n },\n ptyNumbers() {\n return json(call({ op: 'pty-list' }, 'pty-list')) as number[];\n },\n ptyNumber(fd) {\n return json(call({ op: 'pty-number', fd }, `pty-number ${fd}`)) as number;\n },\n ptyLock(fd, lock) {\n call({ op: 'pty-lock', fd, lock }, `pty-lock ${fd}`);\n },\n setControllingTerminal(fd) {\n call({ op: 'pty-ctty', fd }, `pty-ctty ${fd}`);\n },\n setPacketMode(fd, on) {\n call({ op: 'pty-packet', fd, on }, `pty-packet ${fd}`);\n },\n setWinsize(fd, rows, cols) {\n call({ op: 'pty-winsz-set', fd, rows, cols }, `pty-winsz-set ${fd}`);\n },\n };\n}\n\nexport function wireKernelFd(Fs: ProcessFs, streams: KernelStreams, entry: InheritedFd): void {\n if (entry.device && openDevice(Fs, entry.fd, entry.device)) return;\n\n placeKernelStream(Fs, streams, {\n ...entry,\n kind: entry.device ? 'stream' : entry.kind,\n kernel: entry.fd,\n });\n}\n\nconst O_RDONLY = 0;\nconst O_WRONLY = 1;\nconst O_RDWR = 2;\n\nfunction openDevice(Fs: ProcessFs, fd: number, meta: DeviceMeta): boolean {\n const flags = meta.access === 'read' ? O_RDONLY : meta.access === 'write' ? O_WRONLY : O_RDWR;\n let stream: ProcessStream;\n try {\n stream = Fs.open(`/dev/${meta.device}`, flags);\n } catch {\n return false;\n }\n if (stream.fd !== fd) {\n Fs.dupStream(stream, fd);\n Fs.closeStream(stream.fd);\n }\n return true;\n}\n\nexport function wireKernelStdio(Fs: ProcessFs, streams: KernelStreams): void {\n for (const fd of [0, 1, 2]) {\n const stream = Fs.getStream(fd);\n if (!stream) continue;\n streams.attach(stream, fd);\n streams.nameTerminal(stream);\n }\n}\n\ninterface RunningModule {\n FS: ProcessFs;\n callMain(args: string[]): number | undefined;\n sliccRunMain?: (args: string[]) => number | undefined;\n sliccForkChild?: (state: ForkState & { pid: number }) => number | undefined;\n PIPEFS?: ProcessPipeFs;\n\n sliccSigpipe?: () => number;\n\n sliccSigMask?: (which: number) => number;\n\n sliccRaise?: (sig: number) => void;\n\n sliccTimerFire?: (which: number) => boolean;\n\n sliccKernel?: ProcessKernel;\n\n sliccSyscalls?: GlueSyscalls;\n}\n\nexport type GlueEvaluator = (glue: string, module: object) => void;\n\nexport function glueBody(glue: string): string {\n return glue.startsWith('#!') ? glue.slice(glue.indexOf('\\n') + 1) : glue;\n}\n\nconst GLUE_TRAILER = [\n \"if (typeof ENV !== 'undefined') Object.assign(ENV, Module.sliccEnv);\",\n 'const __sliccTake = (name, value) => {',\n ' const own = Object.getOwnPropertyDescriptor(Module, name);',\n \" if (own && 'value' in own && own.value != null) return;\",\n ' Object.defineProperty(Module, name, { value, writable: true, configurable: true, enumerable: true });',\n '};',\n \"if (typeof FS !== 'undefined') __sliccTake('FS', FS);\",\n \"if (typeof callMain === 'function') __sliccTake('callMain', callMain);\",\n \"if (typeof sliccRunMain === 'function') __sliccTake('sliccRunMain', sliccRunMain);\",\n \"if (typeof sliccForkChild === 'function') __sliccTake('sliccForkChild', sliccForkChild);\",\n \"if (typeof PIPEFS !== 'undefined') __sliccTake('PIPEFS', PIPEFS);\",\n\n 'Module.sliccSyscalls ??= {',\n \" fcntl: typeof ___syscall_fcntl64 === 'function' ? ___syscall_fcntl64 : undefined,\",\n \" pipe2: typeof ___syscall_pipe2 === 'function' ? ___syscall_pipe2 : undefined,\",\n \" dup3: typeof ___syscall_dup3 === 'function' ? ___syscall_dup3 : undefined,\",\n \" socket: typeof ___syscall_socket === 'function' ? ___syscall_socket : undefined,\",\n \" accept4: typeof ___syscall_accept4 === 'function' ? ___syscall_accept4 : undefined,\",\n \" ioctl: typeof ___syscall_ioctl === 'function' ? ___syscall_ioctl : undefined,\",\n \" setitimer: typeof __setitimer_js === 'function' ? __setitimer_js : undefined,\",\n '};',\n\n 'const __sliccUp = () =>',\n \" (typeof runtimeInitialized === 'undefined' || runtimeInitialized) &&\",\n \" !(typeof runtimeExited !== 'undefined' && runtimeExited) &&\",\n \" !(typeof ABORT !== 'undefined' && ABORT);\",\n \"Module.sliccSigpipe ??= () => (__sliccUp() && typeof _slicc_sigpipe === 'function' ? _slicc_sigpipe() : -1);\",\n\n \"Module.sliccSigMask ??= (w) => (__sliccUp() && typeof _slicc_sig_mask === 'function' ? _slicc_sig_mask(w) : -1);\",\n \"Module.sliccRaise ??= (sig) => { if (__sliccUp() && typeof _slicc_raise === 'function') _slicc_raise(sig); };\",\n\n 'Module.sliccTimerFire ??= (which) => {',\n \" if (!__sliccUp() || typeof __emscripten_timeout !== 'function') return false;\",\n \" __emscripten_timeout(which, typeof _emscripten_get_now === 'function' ? _emscripten_get_now() : performance.now());\",\n ' return true;',\n '};',\n\n \"if (typeof SliccFork !== 'undefined' && !SliccFork.balancesKeepalive && typeof runtimeKeepalivePop === 'function') {\",\n ' let __sliccForking = SliccFork.forking === true;',\n \" Object.defineProperty(SliccFork, 'forking', {\",\n ' get: () => __sliccForking,',\n ' set: (on) => { if (__sliccForking && !on) runtimeKeepalivePop(); __sliccForking = on; },',\n ' configurable: true,',\n ' });',\n '}',\n].join('\\n');\n\nexport function ownValue<T>(module: object, name: string): T | undefined {\n const own = Object.getOwnPropertyDescriptor(module, name);\n return own && 'value' in own ? (own.value as T | undefined) : undefined;\n}\n\nexport const evaluateGlue: GlueEvaluator = (glue, module) => {\n let run: (module: object) => void;\n try {\n run = new Function('Module', `${glueBody(glue)}\\n;${GLUE_TRAILER}`) as (module: object) => void;\n } catch (e) {\n throw e instanceof EvalError ? new Error(EVAL_BLOCKED) : e;\n }\n run(module);\n};\n\nexport const EVAL_BLOCKED =\n \"the wasm realm evaluates the program's Emscripten glue, and this page's CSP forbids eval \" +\n \"(no 'unsafe-eval')\";\n\nexport function signalMasks(\n m: Pick<RunningModule, 'sliccSigMask'>\n): { caught: number; ignored: number; restart: number } | null {\n const mask = m.sliccSigMask;\n const caught = mask?.(0) ?? -1;\n if (!mask || caught === -1) return null;\n return { caught, ignored: mask(1), restart: mask(2) };\n}\n\nexport async function runWasmProcess(\n init: WasmProcessInitMsg,\n port: SabPostLike,\n deps: { evaluate?: GlueEvaluator; warn?: (message: string) => void } = {}\n): Promise<number> {\n const signals = new SignalGate(\n createSyncSabTransport(init.sab, port),\n new Int32Array(init.sab, 0, SAB_HEADER_I32),\n {\n masks: () => signalMasks(module as unknown as RunningModule),\n raise: (sig) => (module as unknown as RunningModule).sliccRaise?.(sig),\n\n timer: (which) => {\n const running = module as unknown as RunningModule;\n if (!running.sliccTimerFire?.(which)) running.sliccRaise?.(SIG.ALRM);\n },\n }\n );\n const transport = signals.transport();\n const sys = kernelSys(transport);\n const encoder = new TextEncoder();\n const say = (fd: number) => (text: string) => sys.write(fd, encoder.encode(`${text}\\n`));\n let ready!: () => void;\n let failed!: (error: unknown) => void;\n let memory: WebAssembly.Memory | undefined;\n const initialized = new Promise<void>((resolve, reject) => {\n ready = resolve;\n failed = reject;\n });\n const module = {\n noInitialRun: true,\n thisProgram: init.argv0,\n sliccPid: init.pid,\n\n ...(init.ppid !== undefined ? { sliccPpid: init.ppid } : {}),\n sliccEnv: init.env,\n print: say(1),\n printErr: say(2),\n instantiateWasm(\n imports: WebAssembly.Imports,\n done: (instance: WebAssembly.Instance, module: WebAssembly.Module) => void\n ): object {\n Promise.resolve()\n .then(() => {\n wrapCloexecSyscalls(imports, ownValue<GlueSyscalls>(module, 'sliccSyscalls'), {\n fs: () => ownValue<ProcessFs>(module, 'FS'),\n heap: () => (memory ? new Int32Array(memory.buffer) : undefined),\n pty: sys,\n\n timer: {\n arm: (ms) => {\n transport.call(\n { op: 'proc-alarm', sig: SIG.ALRM, ms, repeat: false, timer: 0 },\n Number.POSITIVE_INFINITY,\n 'alarm'\n );\n },\n },\n });\n return WebAssembly.instantiate(init.program.module, imports);\n })\n .then((instance) => {\n memory = wasmMemory(instance, imports);\n done(instance, init.program.module);\n }, failed);\n return {};\n },\n\n preRun: [\n (m: object) => {\n if (!hasStreams(m)) return;\n const fs = (m as RunningModule).FS;\n\n trackCloseOnExec(fs);\n try {\n fs.mkdirTree(init.cwd);\n fs.chdir(init.cwd);\n } catch {}\n },\n ],\n onRuntimeInitialized: () => ready(),\n };\n (deps.evaluate ?? evaluateGlue)(init.program.glue, module);\n await initialized;\n const running = module as unknown as RunningModule;\n if (!hasStreams(running)) return runStdioOnly(running, init);\n const vfs = mountVfsIntoEmscripten(running.FS, {\n bridge: createSyncFsSabBridge(transport),\n cwd: init.cwd,\n warn: deps.warn ?? say(2),\n });\n const sigpipe = (): boolean => running.sliccSigpipe?.() === 1;\n const restartable = (): boolean => signals.restartable();\n const streams = new KernelStreams(running.FS, sys, { sigpipe, restartable });\n trackCloseOnExec(running.FS);\n if (init.fork) restoreForkedStreams(running.FS, streams, init.fork.streams ?? []);\n else {\n wireKernelStdio(running.FS, streams);\n for (const entry of init.fds ?? []) wireKernelFd(running.FS, streams, entry);\n }\n const pipefs = ownValue<ProcessPipeFs>(running, 'PIPEFS');\n if (pipefs) streams.usePipes(pipefs);\n streams.useControllingTerminal();\n useDevFd(running.FS);\n ownByRealmUser(running.FS);\n const livePath = (s: ProcessStream) => liveNodePath(s.node as unknown as LiveFsNode);\n running.sliccKernel = createProcessKernel({\n transport,\n Fs: running.FS,\n env: init.env,\n beforeSpawn: () => vfs.flush(),\n afterChild: () => vfs.invalidate(),\n pid: init.pid,\n raise: (sig) => running.sliccRaise?.(sig),\n restartable,\n describeFork: () => describeForFork(running.FS, sys, streams, livePath),\n inherit: (actions) => describeInherited(running.FS, sys, streams, livePath, actions),\n stdioPromoter: () => vfsPromoter(running.FS, sys, streams, livePath),\n });\n try {\n return runMain(running, init);\n } finally {\n vfs.flush();\n }\n}\n\nfunction hasStreams(module: object): boolean {\n return typeof ownValue<Partial<ProcessFs>>(module, 'FS')?.getStream === 'function';\n}\n\nfunction runStdioOnly(running: RunningModule, init: WasmProcessInitMsg): number {\n if (init.fork) throw new Error(`${init.argv0} cannot resume a fork: it has no filesystem`);\n return runMain(running, init);\n}\n\nfunction runMain(running: RunningModule, init: WasmProcessInitMsg): number {\n try {\n if (init.fork) {\n if (!running.sliccForkChild) throw new Error(`${init.argv0} cannot resume a fork`);\n return running.sliccForkChild({ ...init.fork, pid: init.pid }) ?? 0;\n }\n\n return (running.sliccRunMain ?? running.callMain)(init.args) ?? 0;\n } catch (e) {\n const status = (e as { status?: unknown })?.status;\n if (typeof status !== 'number') throw e;\n return status;\n }\n}\n", "import {\n WASM_PROCESS_ERROR,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_INIT,\n type WasmProcessErrorMsg,\n type WasmProcessExitMsg,\n type WasmProcessInitMsg,\n} from '../kernel/protocol.ts';\nimport type { SabPostLike } from '../realm/sync-sab-bridge.ts';\nimport { runWasmProcess } from './process-runtime.ts';\n\nexport type ProcessRunner = (init: WasmProcessInitMsg, port: SabPostLike) => Promise<number>;\n\nexport function processEntry(\n port: SabPostLike,\n run: ProcessRunner = runWasmProcess\n): (data: unknown) => void {\n return (data) => {\n if ((data as { type?: string } | undefined)?.type !== WASM_PROCESS_INIT) return;\n run(data as WasmProcessInitMsg, port).then(\n (code) => port.postMessage({ type: WASM_PROCESS_EXIT, code } satisfies WasmProcessExitMsg),\n (err) =>\n port.postMessage({\n type: WASM_PROCESS_ERROR,\n message: err instanceof Error ? (err.stack ?? err.message) : String(err),\n } satisfies WasmProcessErrorMsg)\n );\n };\n}\n", "import { processEntry } from './process/process-entry.ts';\n\ninterface WorkerScope {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nconst scope = globalThis as unknown as WorkerScope;\nconst onMessage = processEntry({ postMessage: (message) => scope.postMessage(message) });\nscope.addEventListener('message', (event) => onMessage(event.data));\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["status", "status", "EIO", "status", "POLLIN", "POLLOUT", "POLLERR", "POLLHUP", "status", "O_CREAT", "O_EXCL", "O_TRUNC", "O_RDWR", "running", "encoder", "failed", "status"]
|
|
3
|
+
"sources": ["../src/kernel/protocol.ts", "../src/kernel/signals.ts", "../src/fs/types.ts", "../src/realm/live-vfs-fs.ts", "../src/realm/emscripten-vfs-hook.ts", "../src/realm/sync-fs-wire.ts", "../src/realm/sync-sab-wire.ts", "../src/realm/sync-sab-bridge.ts", "../src/process/wasi-errno.ts", "../src/process/kernel-streams.ts", "../src/process/process-children.ts", "../src/process/process-pty.ts", "../src/process/process-fds.ts", "../src/process/process-fork.ts", "../src/process/process-http.ts", "../src/process/process-signals.ts", "../src/process/process-sockets.ts", "../src/process/realm-user.ts", "../src/process/process-runtime.ts", "../src/process/process-entry.ts", "../src/process-worker.ts"],
|
|
4
|
+
"sourcesContent": ["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", "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", "export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtime: Date;\n atime: Date;\n ctime: Date;\n ino: number;\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 readdirStat(path: string): Promise<Array<[string, FsStat | null]>>;\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\nexport function inodeOf(path: string): number {\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < path.length; i++) {\n const c = path.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 2654435761);\n h2 = Math.imul(h2 ^ c, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0) || 1;\n}\n", "import { inodeOf } from '../fs/types.ts';\nimport type { SyncFsBridgeStat, SyncFsPosixBridge } from './sync-fs-wire.ts';\n\nconst ERRNO_BY_CODE: Readonly<Record<string, number>> = {\n EACCES: 2,\n EBADF: 8,\n EBUSY: 10,\n EEXIST: 20,\n EINVAL: 28,\n EIO: 29,\n EISDIR: 31,\n ELOOP: 32,\n ENAMETOOLONG: 37,\n ENOENT: 44,\n ENOSPC: 51,\n ENOSYS: 52,\n ENOTDIR: 54,\n ENOTEMPTY: 55,\n EPERM: 63,\n EROFS: 69,\n ETIMEDOUT: 73,\n EXDEV: 75,\n};\nconst EIO = 29;\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\nconst PERM_MASK = 0o7777;\n\nconst DEFAULT_DIR_PERM = 0o755;\n\nconst UMASK = 0o022;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\n\ninterface LiveNodeState {\n stat?: SyncFsBridgeStat;\n\n data?: Uint8Array;\n len: number;\n loaded: boolean;\n dirty: boolean;\n openCount: number;\n\n orphan?: boolean;\n\n listed?: Map<string, SyncFsBridgeStat>;\n}\n\nexport interface LiveFsNode {\n id: number;\n name: string;\n mode: number;\n parent: LiveFsNode;\n mount: LiveFsMount;\n node_ops: LiveNodeOps;\n stream_ops: LiveStreamOps;\n live: LiveNodeState;\n}\n\nexport interface LiveFsStream {\n node: LiveFsNode;\n position: number;\n flags: number;\n}\n\nexport interface LiveFsMount {\n opts: LiveFsMountOpts;\n mountpoint: string;\n root: LiveFsNode;\n}\n\nexport interface LiveFsMountOpts {\n root: string;\n bridge: SyncFsPosixBridge;\n}\n\ninterface LiveAttr {\n dev: number;\n ino: number;\n mode: number;\n nlink: number;\n uid: number;\n gid: number;\n rdev: number;\n size: number;\n atime: Date;\n mtime: Date;\n ctime: Date;\n blksize: number;\n blocks: number;\n}\n\ninterface LiveSetAttr {\n mode?: number;\n size?: number;\n atime?: number | Date;\n mtime?: number | Date;\n timestamp?: number;\n}\n\nexport interface LiveNodeOps {\n getattr(node: LiveFsNode): LiveAttr;\n setattr(node: LiveFsNode, attr: LiveSetAttr): void;\n lookup(parent: LiveFsNode, name: string): LiveFsNode;\n mknod(parent: LiveFsNode, name: string, mode: number, dev: number): LiveFsNode;\n rename(oldNode: LiveFsNode, newDir: LiveFsNode, newName: string): void;\n unlink(parent: LiveFsNode, name: string): void;\n rmdir(parent: LiveFsNode, name: string): void;\n readdir(node: LiveFsNode): string[];\n symlink(parent: LiveFsNode, newName: string, target: string): LiveFsNode;\n readlink(node: LiveFsNode): string;\n}\n\nexport interface LiveStreamOps {\n open(stream: LiveFsStream): void;\n\n dup(stream: LiveFsStream): void;\n close(stream: LiveFsStream): void;\n read(\n stream: LiveFsStream,\n buffer: ArrayBufferView,\n offset: number,\n length: number,\n position: number\n ): number;\n write(\n stream: LiveFsStream,\n buffer: ArrayBufferView,\n offset: number,\n length: number,\n position: number\n ): number;\n llseek(stream: LiveFsStream, offset: number, whence: number): number;\n fsync(stream: LiveFsStream): void;\n}\n\nexport interface LiveFsApi {\n createNode(parent: LiveFsNode | null, name: string, mode: number, dev?: number): LiveFsNode;\n isDir(mode: number): boolean;\n isFile(mode: number): boolean;\n isLink(mode: number): boolean;\n ErrnoError: new (errno: number) => Error & { errno: number };\n\n nameTable?: (LiveFsNode | null)[] | null;\n hashRemoveNode?(node: LiveFsNode): void;\n lookupNode?(parent: LiveFsNode, name: string): LiveFsNode;\n}\n\nexport interface LiveVfsPlugin {\n mount(mount: LiveFsMount): LiveFsNode;\n node_ops: LiveNodeOps;\n stream_ops: LiveStreamOps;\n\n mounts: Set<LiveFsMount>;\n}\n\nfunction toErrno(Fs: LiveFsApi, err: unknown): Error {\n if ((err as { errno?: unknown })?.errno !== undefined && err instanceof Fs.ErrnoError) {\n return err;\n }\n const code = (err as { code?: unknown })?.code;\n const errno = typeof code === 'string' ? (ERRNO_BY_CODE[code] ?? EIO) : EIO;\n return new Fs.ErrnoError(errno);\n}\n\nexport function liveNodePath(node: LiveFsNode): string {\n const parts: string[] = [];\n let cur = node;\n while (cur !== cur.mount.root) {\n parts.push(cur.name);\n cur = cur.parent;\n }\n const root = node.mount.opts.root.replace(/\\/+$/, '');\n return parts.length === 0 ? root || '/' : `${root}/${parts.reverse().join('/')}`;\n}\n\nfunction modeFromStat(st: SyncFsBridgeStat): number {\n const type = st.isSymbolicLink ? S_IFLNK : st.isDirectory ? S_IFDIR : S_IFREG;\n const fallback = st.isDirectory || st.isSymbolicLink ? 0o777 : 0o666;\n return type | ((st.mode ?? fallback) & PERM_MASK || fallback);\n}\n\nfunction toMs(v: number | Date | undefined): number | undefined {\n if (v === undefined || v === null) return undefined;\n return v instanceof Date ? v.getTime() : v;\n}\n\ninterface LiveOpsTables {\n node?: LiveNodeOps;\n stream?: LiveStreamOps;\n}\n\nfunction createHelpers(Fs: LiveFsApi, ops: LiveOpsTables) {\n const bridgeOf = (node: LiveFsNode): SyncFsPosixBridge => node.mount.opts.bridge;\n\n function call<T>(fn: () => T): T {\n try {\n return fn();\n } catch (err) {\n throw toErrno(Fs, err);\n }\n }\n\n function metadataCall(fn: () => void): void {\n try {\n call(fn);\n } catch (err) {\n if ((err as { errno?: number }).errno !== ERRNO_BY_CODE.ENOSYS) throw err;\n }\n }\n\n function freshState(stat?: SyncFsBridgeStat): LiveNodeState {\n return { ...(stat ? { stat } : {}), len: 0, loaded: false, dirty: false, openCount: 0 };\n }\n\n function makeNode(parent: LiveFsNode | null, name: string, st: SyncFsBridgeStat): LiveFsNode {\n const node = Fs.createNode(parent, name, modeFromStat(st), 0);\n node.node_ops = ops.node as LiveNodeOps;\n node.stream_ops = ops.stream as LiveStreamOps;\n node.live = freshState(st);\n return node;\n }\n\n function statOf(node: LiveFsNode): SyncFsBridgeStat {\n if (node.live.orphan) {\n return { ...(node.live.stat as SyncFsBridgeStat), size: node.live.len };\n }\n if (!node.live.stat) {\n const st = call(() => bridgeOf(node).lstat(liveNodePath(node)));\n node.live.stat = st;\n node.mode = modeFromStat(st);\n }\n return node.live.stat;\n }\n\n function childPath(parent: LiveFsNode, name: string): string {\n const base = liveNodePath(parent);\n return base === '/' ? `/${name}` : `${base}/${name}`;\n }\n\n function ensureLoaded(node: LiveFsNode): void {\n const s = node.live;\n if (s.loaded) return;\n const bytes = call(() => bridgeOf(node).readFile(liveNodePath(node)));\n s.data = bytes;\n s.len = bytes.length;\n s.loaded = true;\n }\n\n function ensureCapacity(node: LiveFsNode, need: number): Uint8Array {\n const s = node.live;\n const cur = s.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, s.len));\n s.data = grown;\n return grown;\n }\n\n function flushNode(node: LiveFsNode): void {\n const s = node.live;\n if (!s.dirty || !s.data || s.orphan) return;\n const bytes = s.data.slice(0, s.len);\n call(() => bridgeOf(node).writeFile(liveNodePath(node), bytes));\n s.dirty = false;\n s.stat = undefined;\n }\n\n function truncate(node: LiveFsNode, size: number): void {\n const s = node.live;\n if (s.openCount > 0) {\n if (size > 0) ensureLoaded(node);\n else s.loaded = true;\n const buf = ensureCapacity(node, size);\n if (size > s.len) buf.fill(0, s.len, size);\n s.len = size;\n s.dirty = true;\n return;\n }\n\n const path = liveNodePath(node);\n const bytes = new Uint8Array(size);\n if (size > 0) {\n const cur = call(() => bridgeOf(node).readFile(path));\n bytes.set(cur.subarray(0, Math.min(size, cur.length)));\n }\n call(() => bridgeOf(node).writeFile(path, bytes));\n s.stat = undefined;\n }\n\n return {\n Fs,\n bridgeOf,\n call,\n metadataCall,\n makeNode,\n statOf,\n childPath,\n ensureLoaded,\n ensureCapacity,\n flushNode,\n truncate,\n };\n}\n\ntype LiveHelpers = ReturnType<typeof createHelpers>;\n\nfunction createNodeOps(h: LiveHelpers): LiveNodeOps {\n const { Fs, bridgeOf, call, metadataCall, makeNode, statOf, childPath, flushNode, truncate } = h;\n const { ensureLoaded } = h;\n return {\n getattr(node) {\n const st = statOf(node);\n const s = node.live;\n const size = Fs.isDir(node.mode) ? 4096 : s.loaded ? s.len : st.size;\n const mtime = new Date(st.mtimeMs ?? 0);\n return {\n dev: 1,\n ino: st.ino ?? inodeOf(liveNodePath(node)),\n mode: node.mode,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n size,\n atime: new Date(st.atimeMs ?? mtime.getTime()),\n mtime,\n ctime: new Date(st.ctimeMs ?? mtime.getTime()),\n blksize: 4096,\n blocks: Math.ceil(size / 4096),\n };\n },\n setattr(node, attr) {\n if (node.live.orphan) {\n if (attr.mode !== undefined && attr.mode !== null) {\n node.mode = (node.mode & ~PERM_MASK) | (attr.mode & PERM_MASK);\n }\n if (attr.size !== undefined && attr.size !== null) truncate(node, attr.size);\n return;\n }\n const path = liveNodePath(node);\n if (attr.mode !== undefined && attr.mode !== null) {\n const perm = attr.mode & PERM_MASK;\n if (perm !== (node.mode & PERM_MASK)) {\n metadataCall(() => bridgeOf(node).chmod(path, perm));\n node.mode = (node.mode & ~PERM_MASK) | perm;\n }\n }\n if (attr.size !== undefined && attr.size !== null && Fs.isFile(node.mode)) {\n truncate(node, attr.size);\n }\n const mtime = toMs(attr.mtime) ?? attr.timestamp;\n if (mtime !== undefined) {\n const atime = toMs(attr.atime) ?? mtime;\n flushNode(node);\n metadataCall(() => bridgeOf(node).utimes(path, atime, mtime));\n }\n node.live.stat = undefined;\n },\n lookup(parent, name) {\n const listed = parent.live.listed?.get(name);\n parent.live.listed?.delete(name);\n const st = listed ?? call(() => bridgeOf(parent).lstat(childPath(parent, name)));\n return makeNode(parent, name, st);\n },\n mknod(parent, name, mode) {\n parent.live.listed = undefined;\n const path = childPath(parent, name);\n if (Fs.isDir(mode)) {\n call(() => bridgeOf(parent).mkdir(path));\n\n const perm = mode & PERM_MASK & ~UMASK;\n if (perm !== DEFAULT_DIR_PERM) metadataCall(() => bridgeOf(parent).chmod(path, perm));\n } else if (Fs.isFile(mode)) {\n call(() => bridgeOf(parent).writeFile(path, new Uint8Array(0)));\n } else {\n throw new Fs.ErrnoError(ERRNO_BY_CODE.EPERM);\n }\n const node = makeNode(parent, name, {\n isFile: Fs.isFile(mode),\n isDirectory: Fs.isDir(mode),\n isSymbolicLink: false,\n size: 0,\n mode,\n mtimeMs: Date.now(),\n });\n\n node.live.stat = undefined;\n return node;\n },\n rename(oldNode, newDir, newName) {\n oldNode.parent.live.listed = undefined;\n newDir.live.listed = undefined;\n const from = liveNodePath(oldNode);\n const to = childPath(newDir, newName);\n flushNode(oldNode);\n call(() => bridgeOf(oldNode).rename(from, to));\n\n try {\n const existing = Fs.lookupNode?.(newDir, newName);\n if (existing && existing !== oldNode) Fs.hashRemoveNode?.(existing);\n } catch {}\n oldNode.name = newName;\n oldNode.parent = newDir;\n oldNode.live.stat = undefined;\n },\n unlink(parent, name) {\n parent.live.listed = undefined;\n let open: LiveFsNode | undefined;\n try {\n const node = Fs.lookupNode?.(parent, name);\n if (node && node.live?.openCount > 0 && Fs.isFile(node.mode)) open = node;\n } catch {}\n if (open) {\n statOf(open);\n ensureLoaded(open);\n }\n call(() => bridgeOf(parent).unlink(childPath(parent, name)));\n if (open) open.live.orphan = true;\n },\n rmdir(parent, name) {\n parent.live.listed = undefined;\n call(() => bridgeOf(parent).rmdir(childPath(parent, name)));\n },\n readdir(node) {\n const listed = call(() => bridgeOf(node).readdirStat(liveNodePath(node)));\n node.live.listed = new Map();\n for (const [name, st] of listed) if (st) node.live.listed.set(name, st);\n return ['.', '..', ...listed.map(([name]) => name)];\n },\n symlink(parent, newName, target) {\n parent.live.listed = undefined;\n const path = childPath(parent, newName);\n call(() => bridgeOf(parent).symlink(target, path));\n return makeNode(parent, newName, {\n isFile: false,\n isDirectory: false,\n isSymbolicLink: true,\n size: new TextEncoder().encode(target).length,\n });\n },\n readlink(node) {\n if (!Fs.isLink(node.mode)) throw new Fs.ErrnoError(ERRNO_BY_CODE.EINVAL);\n return call(() => bridgeOf(node).readlink(liveNodePath(node)));\n },\n };\n}\n\nfunction createStreamOps(h: LiveHelpers): LiveStreamOps {\n const { Fs, statOf, ensureLoaded, ensureCapacity, flushNode } = h;\n return {\n open(stream) {\n if (!Fs.isFile(stream.node.mode)) return;\n stream.node.live.openCount++;\n },\n\n dup(stream) {\n if (!Fs.isFile(stream.node.mode)) return;\n stream.node.live.openCount++;\n },\n close(stream) {\n const node = stream.node;\n if (!Fs.isFile(node.mode)) return;\n const s = node.live;\n s.openCount = Math.max(0, s.openCount - 1);\n if (s.openCount > 0) return;\n try {\n flushNode(node);\n } finally {\n s.data = undefined;\n s.len = 0;\n s.loaded = false;\n }\n },\n read(stream, buffer, offset, length, position) {\n const node = stream.node;\n if (Fs.isDir(node.mode)) throw new Fs.ErrnoError(ERRNO_BY_CODE.EISDIR);\n ensureLoaded(node);\n const s = node.live;\n if (position >= s.len || length <= 0) return 0;\n const n = Math.min(length, s.len - position);\n const out = new Uint8Array(buffer.buffer, buffer.byteOffset + offset, n);\n out.set((s.data as Uint8Array).subarray(position, position + n));\n return n;\n },\n write(stream, buffer, offset, length, position) {\n const node = stream.node;\n if (Fs.isDir(node.mode)) throw new Fs.ErrnoError(ERRNO_BY_CODE.EISDIR);\n if (length <= 0) return 0;\n ensureLoaded(node);\n const s = node.live;\n const end = position + length;\n const buf = ensureCapacity(node, end);\n if (position > s.len) buf.fill(0, s.len, position);\n buf.set(new Uint8Array(buffer.buffer, buffer.byteOffset + offset, length), position);\n s.len = Math.max(s.len, end);\n s.dirty = true;\n return length;\n },\n llseek(stream, offset, whence) {\n let pos = offset;\n if (whence === SEEK_CUR) pos += stream.position;\n else if (whence === SEEK_END && Fs.isFile(stream.node.mode)) {\n const s = stream.node.live;\n pos += s.loaded ? s.len : statOf(stream.node).size;\n }\n if (pos < 0) throw new Fs.ErrnoError(ERRNO_BY_CODE.EINVAL);\n return pos;\n },\n fsync(stream) {\n flushNode(stream.node);\n },\n };\n}\n\nexport function createLiveVfsPlugin(Fs: LiveFsApi): LiveVfsPlugin {\n const mounts = new Set<LiveFsMount>();\n const ops: LiveOpsTables = {};\n const h = createHelpers(Fs, ops);\n const nodeOps = createNodeOps(h);\n const streamOps = createStreamOps(h);\n ops.node = nodeOps;\n ops.stream = streamOps;\n return {\n mounts,\n node_ops: nodeOps,\n stream_ops: streamOps,\n mount(mount) {\n const st = h.call(() => mount.opts.bridge.stat(mount.opts.root));\n if (!st.isDirectory) throw new Fs.ErrnoError(ERRNO_BY_CODE.ENOTDIR);\n const root = h.makeNode(null, '/', st);\n mounts.add(mount);\n return root;\n },\n };\n}\n\nfunction ownedBy(plugin: LiveVfsPlugin, node: LiveFsNode | null | undefined): node is LiveFsNode {\n return !!node && plugin.mounts.has(node.mount);\n}\n\nexport function flushLiveVfs(Fs: LiveFsApi, plugin: LiveVfsPlugin): void {\n for (const head of Fs.nameTable ?? []) {\n for (let node = head; node; node = (node as { name_next?: LiveFsNode }).name_next ?? null) {\n if (!ownedBy(plugin, node) || !node.live.dirty || !node.live.data) continue;\n try {\n const bytes = node.live.data.slice(0, node.live.len);\n node.mount.opts.bridge.writeFile(liveNodePath(node), bytes);\n node.live.dirty = false;\n } catch (err) {\n throw toErrno(Fs, err);\n }\n }\n }\n}\n\nexport function invalidateLiveVfs(Fs: LiveFsApi, plugin: LiveVfsPlugin): void {\n const table = Fs.nameTable ?? [];\n const drop: LiveFsNode[] = [];\n for (const head of table) {\n for (let node = head; node; node = (node as { name_next?: LiveFsNode }).name_next ?? null) {\n if (!ownedBy(plugin, node)) continue;\n const s = node.live;\n s.stat = undefined;\n s.listed = undefined;\n if (s.openCount === 0) {\n if (node !== node.mount.root) drop.push(node);\n } else if (s.loaded && !s.dirty) {\n s.data = undefined;\n s.len = 0;\n s.loaded = false;\n }\n }\n }\n if (!Fs.hashRemoveNode) return;\n for (const node of drop) Fs.hashRemoveNode(node);\n}\n\nexport interface LiveMountFsApi extends LiveFsApi {\n filesystems: { SLICC_LIVE_FS?: LiveVfsPlugin };\n mkdirTree(path: string): void;\n mount(type: LiveVfsPlugin, opts: LiveFsMountOpts, mountpoint: string): unknown;\n}\n\nfunction outermostDirs(dirs: readonly string[]): string[] {\n const norm = [...new Set(dirs.map((d) => d.replace(/\\/+$/, '') || '/'))].sort();\n return norm.filter((d) => !norm.some((o) => o !== d && (o === '/' || d.startsWith(`${o}/`))));\n}\n\nfunction describeMountError(err: unknown): string {\n if (err instanceof Error) return err.message;\n const errno = (err as { errno?: unknown } | null)?.errno;\n return typeof errno === 'number' ? `errno ${errno}` : String(err);\n}\n\nexport function mountLiveVfsDirs(\n Fs: LiveMountFsApi,\n bridge: SyncFsPosixBridge,\n dirs: readonly string[],\n warn: (message: string) => void\n): { plugin: LiveVfsPlugin; mounted: string[] } {\n if (typeof Fs.filesystems !== 'object' || !Fs.filesystems) {\n throw new Error(\n 'the module was linked without filesystem support, so the VFS cannot be mounted ' +\n '(link it with -sFORCE_FILESYSTEM=1)'\n );\n }\n const plugin = Fs.filesystems.SLICC_LIVE_FS ?? createLiveVfsPlugin(Fs);\n Fs.filesystems.SLICC_LIVE_FS = plugin;\n const mounted: string[] = [];\n for (const dir of outermostDirs(dirs)) {\n if (dir === '/') continue;\n try {\n Fs.mkdirTree(dir);\n Fs.mount(plugin, { root: dir, bridge }, dir);\n mounted.push(dir);\n } catch (err) {\n warn(`live VFS mount of ${dir} failed: ${describeMountError(err)}`);\n }\n }\n return { plugin, mounted };\n}\n", "import {\n flushLiveVfs,\n invalidateLiveVfs,\n type LiveMountFsApi,\n mountLiveVfsDirs,\n} from './live-vfs-fs.ts';\nimport type { SyncFsPosixBridge } from './sync-fs-wire.ts';\n\nconst MODULE_OWNED_DIRS = new Set(['dev', 'proc']);\n\nconst SYNTHETIC_DIRS = ['/usr', '/bin'];\n\nexport interface EmscriptenFsForHook extends LiveMountFsApi {\n chdir(path: string): void;\n}\n\nexport interface EmscriptenVfsHandle {\n mounted: string[];\n flush(): void;\n invalidate(): void;\n}\n\nexport interface EmscriptenVfsHookDeps {\n bridge: SyncFsPosixBridge;\n cwd: string;\n warn: (message: string) => void;\n}\n\nfunction topLevelDirs(bridge: SyncFsPosixBridge, warn: (message: string) => void): string[] {\n let names: string[];\n try {\n names = bridge.readdir('/');\n } catch (err) {\n warn(`cannot list the VFS root, nothing mounted: ${String(err)}`);\n return [];\n }\n const candidates = names\n .filter((name) => name && !name.includes('/') && !MODULE_OWNED_DIRS.has(name))\n .map((name) => `/${name}`);\n for (const dir of SYNTHETIC_DIRS) if (!candidates.includes(dir)) candidates.push(dir);\n const dirs: string[] = [];\n for (const dir of candidates) {\n try {\n if (bridge.stat(dir).isDirectory) dirs.push(dir);\n } catch {}\n }\n return dirs;\n}\n\nexport function mountVfsIntoEmscripten(\n Fs: EmscriptenFsForHook,\n deps: EmscriptenVfsHookDeps\n): EmscriptenVfsHandle {\n const { bridge, warn } = deps;\n const { plugin, mounted } = mountLiveVfsDirs(Fs, bridge, topLevelDirs(bridge, warn), warn);\n try {\n Fs.chdir(deps.cwd);\n } catch (err) {\n warn(`cannot chdir to ${deps.cwd}: ${String(err)}`);\n }\n return {\n mounted,\n flush: () => flushLiveVfs(Fs, plugin),\n invalidate: () => invalidateLiveVfs(Fs, plugin),\n };\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 atimeMs?: number;\n ctimeMs?: 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.atimeMs === 'number' ? { atimeMs: s.atimeMs } : {}),\n ...(typeof s.ctimeMs === 'number' ? { ctimeMs: s.ctimeMs } : {}),\n ...(typeof s.ino === 'number' ? { ino: s.ino } : {}),\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 {\n parseSyncFsStat,\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsBridgeStat,\n type SyncFsPosixBridge,\n type SyncFsResult,\n syncError,\n} from './sync-fs-wire.ts';\nimport {\n decodeSabResult,\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_IDLE,\n SAB_STATE_PENDING,\n SAB_STATE_READY,\n type SabViews,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabNextMsg,\n type SyncSabReqMsg,\n type SyncSabRequestBody,\n sabViews,\n} from './sync-sab-wire.ts';\n\nexport interface SabPostLike {\n postMessage(message: unknown): void;\n}\n\nexport interface SyncSabTransport {\n call(req: SyncSabRequestBody, timeoutMs: number, label: string): SyncFsResult;\n}\n\nexport type AtomicsWaitLike = (\n typedArray: Int32Array,\n index: number,\n value: number,\n timeout?: number\n) => 'ok' | 'not-equal' | 'timed-out';\n\nexport function createSyncSabTransport(\n sab: SharedArrayBuffer,\n port: SabPostLike,\n deps: { wait?: AtomicsWaitLike; now?: () => number } = {}\n): SyncSabTransport {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const wait: AtomicsWaitLike = deps.wait ?? ((a, i, v, t) => Atomics.wait(a, i, v, t));\n const now = deps.now ?? (() => performance.now());\n let seq = 0;\n\n function awaitReady(id: number, deadline: number, label: string): void {\n for (;;) {\n const remaining = deadline - now();\n if (remaining <= 0) throw syncError('ETIMEDOUT', label);\n\n wait(header, SAB_I_STATE, SAB_STATE_PENDING, remaining);\n if (\n Atomics.load(header, SAB_I_STATE) === SAB_STATE_READY &&\n Atomics.load(header, SAB_I_SEQ) === id\n ) {\n return;\n }\n if (Atomics.load(header, SAB_I_STATE) === SAB_STATE_READY) {\n Atomics.store(header, SAB_I_STATE, SAB_STATE_PENDING);\n }\n }\n }\n\n return {\n call(req, timeoutMs, label): SyncFsResult {\n const id = ++seq;\n const deadline = now() + timeoutMs;\n let out: Uint8Array | null = null;\n let status = 0;\n let offset = 0;\n try {\n for (;;) {\n Atomics.store(header, SAB_I_STATE, SAB_STATE_PENDING);\n const msg: SyncSabReqMsg | SyncSabNextMsg =\n offset === 0\n ? { type: SYNC_SAB_REQ_MSG, id, req }\n : { type: SYNC_SAB_NEXT_MSG, id, offset };\n try {\n port.postMessage(msg);\n } catch {\n throw syncError('EIO', label);\n }\n awaitReady(id, deadline, label);\n const total = Atomics.load(header, SAB_I_TOTAL);\n const chunk = Atomics.load(header, SAB_I_CHUNK);\n const at = Atomics.load(header, SAB_I_OFFSET);\n if (at !== offset || chunk < 0 || total < 0 || offset + chunk > total) {\n throw syncError('EIO', label);\n }\n if (out === null) {\n status = Atomics.load(header, SAB_I_STATUS);\n out = new Uint8Array(total);\n }\n out.set(window.subarray(0, chunk), offset);\n offset += chunk;\n if (offset >= total) break;\n\n if (chunk === 0) throw syncError('EIO', label);\n }\n } finally {\n Atomics.store(header, SAB_I_STATE, SAB_STATE_IDLE);\n }\n return decodeSabResult(status, out);\n },\n };\n}\n\nfunction errnoError(code: string, path: string): Error & { code: string } {\n return syncError(code, `sync-sab bridge, '${path}'`);\n}\n\nexport function createSyncFsSabBridge(\n transport: SyncSabTransport,\n opts: { timeoutMs?: number } = {}\n): SyncFsPosixBridge {\n const timeoutMs = opts.timeoutMs ?? SYNC_FS_REQUEST_TIMEOUT_MS;\n\n function run(req: SyncSabRequestBody, path: string): SyncFsResult {\n const result = transport.call(req, timeoutMs, `sync-sab bridge, '${path}'`);\n if (!result.ok) throw errnoError(result.errno, path);\n return result;\n }\n function bytes(req: SyncSabRequestBody, path: string): Uint8Array {\n const r = run(req, path);\n if (r.ok && r.kind === 'bytes') return r.bytes;\n throw errnoError('EIO', path);\n }\n function json(req: SyncSabRequestBody, path: string): unknown {\n const r = run(req, path);\n if (r.ok && r.kind === 'json') return r.json;\n throw errnoError('EIO', path);\n }\n\n return {\n readFile: (path) => bytes({ op: 'read', path }, path),\n writeFile: (path, data) => {\n run({ op: 'write', path, body: data }, path);\n },\n stat: (path) => {\n const s = parseSyncFsStat(json({ op: 'stat', path }, path));\n if (!s) throw errnoError('EIO', path);\n return s;\n },\n lstat: (path) => {\n const s = parseSyncFsStat(json({ op: 'lstat', path }, path));\n if (!s) throw errnoError('EIO', path);\n return s;\n },\n readdir: (path) => {\n const list = json({ op: 'readdir', path }, path);\n if (!Array.isArray(list) || !list.every((s) => typeof s === 'string')) {\n throw errnoError('EIO', path);\n }\n return list as string[];\n },\n readdirStat: (path) => {\n const list = json({ op: 'readdir-stat', path }, path);\n if (!Array.isArray(list)) throw errnoError('EIO', path);\n return list.map((entry): [string, SyncFsBridgeStat | null] => {\n if (!Array.isArray(entry) || typeof entry[0] !== 'string') throw errnoError('EIO', path);\n\n if (entry[1] === null) return [entry[0], null];\n const stat = parseSyncFsStat(entry[1]);\n if (!stat) throw errnoError('EIO', path);\n return [entry[0], stat];\n });\n },\n exists: (path) => {\n const v = json({ op: 'exists', path }, path);\n if (typeof v !== 'boolean') throw errnoError('EIO', path);\n return v;\n },\n mkdir: (path) => {\n run({ op: 'mkdir', path }, path);\n },\n rm: (path) => {\n run({ op: 'rm', path }, path);\n },\n rename: (from, to) => {\n run({ op: 'rename', path: from, arg2: to }, from);\n },\n unlink: (path) => {\n run({ op: 'unlink', path }, path);\n },\n rmdir: (path) => {\n run({ op: 'rmdir', path }, path);\n },\n symlink: (target, linkPath) => {\n run({ op: 'symlink', path: linkPath, arg2: target }, linkPath);\n },\n readlink: (path) => {\n const target = json({ op: 'readlink', path }, path);\n if (typeof target !== 'string') throw errnoError('EIO', path);\n return target;\n },\n chmod: (path, mode) => {\n run({ op: 'chmod', path, mode }, path);\n },\n utimes: (path, atimeMs, mtimeMs) => {\n run({ op: 'utimes', path, atimeMs, mtimeMs }, path);\n },\n };\n}\n", "const WASI_ERRNO: Readonly<Partial<Record<string, number>>> = {\n EACCES: 2,\n EADDRINUSE: 3,\n EADDRNOTAVAIL: 4,\n EAFNOSUPPORT: 5,\n EAGAIN: 6,\n ECONNREFUSED: 14,\n EEXIST: 20,\n EINPROGRESS: 26,\n EISCONN: 30,\n ENETUNREACH: 40,\n ENOTCONN: 53,\n ENOTSOCK: 57,\n EPROTONOSUPPORT: 66,\n\n EOPNOTSUPP: 138,\n EBADF: 8,\n ECHILD: 12,\n EFAULT: 21,\n EINTR: 27,\n EINVAL: 28,\n EIO: 29,\n EMFILE: 33,\n ENOENT: 44,\n ENOEXEC: 45,\n ENOSYS: 52,\n ENOTTY: 59,\n ENXIO: 60,\n EPERM: 63,\n EPIPE: 64,\n ESPIPE: 70,\n ESRCH: 71,\n};\n\nconst EIO = 29;\n\nexport function wasiErrno(code: string): number {\n return WASI_ERRNO[code] ?? EIO;\n}\n", "import type { PollState } from '../kernel/fd-table.ts';\nimport type { Termios } from '../kernel/tty.ts';\nimport type { EmscriptenFsForHook } from '../realm/emscripten-vfs-hook.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nconst POLLIN = 0x001;\nconst POLLOUT = 0x004;\nconst POLLERR = 0x008;\nconst POLLHUP = 0x010;\nconst POLLRDNORM = 0x040;\nconst POLLWRNORM = 0x100;\n\nexport const O_NONBLOCK = 0o4000;\nconst SOCKET_MODE = 0o140777;\n\ninterface PtyPathFs {\n chown?: (path: string, ...rest: number[]) => void;\n lchown?: (path: string, ...rest: number[]) => void;\n chmod?: (path: string, ...rest: number[]) => void;\n lchmod?: (path: string, ...rest: number[]) => void;\n stat?: (path: string, ...rest: unknown[]) => unknown;\n lstat?: (path: string, ...rest: unknown[]) => unknown;\n}\n\nconst PTY_PATH = /^\\/dev\\/(?:ptmx|pts\\/(\\d+))$/;\n\nfunction isPtyPath(path: string): boolean {\n return PTY_PATH.test(path);\n}\n\nfunction ptyStat(path: string): object {\n const n = PTY_PATH.exec(path)?.[1];\n const now = new Date();\n return {\n dev: 0x16,\n ino: n === undefined ? 2 : 3 + Number(n),\n mode: n === undefined ? 0o20666 : 0o20620,\n nlink: 1,\n uid: 1000,\n gid: 1000,\n rdev: n === undefined ? (5 << 8) | 2 : (136 << 8) | Number(n),\n size: 0,\n blksize: 4096,\n blocks: 0,\n atime: now,\n mtime: now,\n ctime: now,\n };\n}\n\nconst O_CREAT = 0o100;\nconst O_EXCL = 0o200;\nconst O_NOCTTY = 0o400;\nconst O_TRUNC = 0o1000;\n\nconst KILLED_BY_SIGPIPE = 128 + 13;\n\nexport class ProcessExit extends Error {\n readonly status: number;\n\n constructor(status: number) {\n super(`exit ${status}`);\n this.status = status;\n }\n}\n\nexport class SyscallError extends Error {\n readonly code: string;\n\n constructor(code: string) {\n super(code);\n this.code = code;\n }\n}\n\nexport interface ReadOptions {\n nonblock?: boolean;\n peek?: boolean;\n}\n\nexport interface ProcessSys {\n read(fd: number, max: number, opts?: ReadOptions): Uint8Array;\n\n write(fd: number, bytes: Uint8Array, opts?: { nonblock?: boolean }): number;\n close(fd: number): void;\n\n pipe(): [number, number];\n poll(fd: number): PollState;\n\n openVfs(\n path: string,\n flags: number,\n position: number,\n opts?: { contents?: Uint8Array; orphan?: boolean; truncate?: boolean; create?: boolean }\n ): number;\n\n seek(fd: number, offset: number, whence: number): number;\n\n flush(fd: number): void;\n\n pread?(fd: number, max: number, at: number): Uint8Array;\n\n isatty?(fd: number): boolean;\n\n ttyName?(fd: number): string | undefined;\n\n openTty?(name?: string): number;\n\n tcgets?(fd: number): Termios;\n tcsets?(fd: number, termios: Termios): void;\n winsize?(fd: number): [number, number];\n\n openPty?(): number;\n openPts?(n: number, noctty: boolean): number;\n\n ptyNumbers?(): number[];\n}\n\nexport interface StreamOps {\n getattr?: (stream: ProcessStream) => object;\n llseek?: (stream: ProcessStream, offset: number, whence: number) => number;\n read?: (stream: ProcessStream, buffer: Uint8Array, offset: number, length: number) => number;\n write?: (stream: ProcessStream, buffer: Uint8Array, offset: number, length: number) => number;\n close?: (stream: ProcessStream) => void;\n dup?: (stream: ProcessStream) => void;\n poll?: (stream: ProcessStream) => number;\n fsync?: () => number;\n}\n\nexport interface ProcessStream {\n fd: number;\n stream_ops: StreamOps;\n sliccKernelFd?: number;\n\n sliccKernelFile?: boolean;\n\n sliccCloexec?: boolean;\n\n sliccKernelSocket?: boolean;\n path?: string;\n flags: number;\n position: number;\n tty?: unknown;\n node: {\n mode: number;\n mount?: { type?: unknown };\n node_ops?: { getattr?: (node: ProcessStream['node']) => object };\n };\n\n shared: object;\n}\n\nexport interface ProcessFs extends EmscriptenFsForHook {\n streams: (ProcessStream | null | undefined)[];\n getStream(fd: number): ProcessStream | null;\n open(path: string, flags: number, mode?: number): ProcessStream;\n dupStream(stream: ProcessStream, fd: number): ProcessStream;\n closeStream(fd: number): void;\n\n close?(stream: ProcessStream): void;\n isFile(mode: number): boolean;\n mkdirTree(path: string): void;\n cwd(): string;\n read(stream: ProcessStream, buffer: Uint8Array, offset: number, length: number): number;\n write(stream: ProcessStream, buffer: Uint8Array, offset: number, length: number): number;\n\n stat?(path: string, dontFollow?: boolean): object;\n fstat?(fd: number): object;\n symlink?(target: string, path: string): void;\n lookupPath?(path: string, opts?: { follow?: boolean }): { node: object };\n}\n\ninterface FsNode {\n mode: number;\n node_ops: object;\n}\n\ninterface SocketNodeFs {\n mount(type: { mount(): FsNode }, opts: object, mountpoint: null): FsNode;\n createNode(parent: FsNode | null, name: string, mode: number, rdev: number): FsNode;\n createStream(stream: object, fd?: number): ProcessStream;\n}\n\nexport interface ProcessPipeFs {\n createPipe(): { readable_fd: number; writable_fd: number };\n}\n\nexport interface KernelStreamOptions {\n sigpipe?: () => boolean;\n\n restartable?: () => boolean;\n}\n\nfunction nonblocking(stream: ProcessStream): { nonblock: true } | undefined {\n return (stream.flags & O_NONBLOCK) !== 0 ? { nonblock: true } : undefined;\n}\n\nexport class KernelStreams {\n private readonly refs = new Map<number, number>();\n\n private socketRoot: FsNode | undefined;\n\n private sockets = 0;\n\n private readonly Fs: ProcessFs;\n\n private readonly sys: ProcessSys;\n\n private readonly options: KernelStreamOptions;\n\n constructor(\n Fs: ProcessFs,\n\n sys: ProcessSys,\n\n options: KernelStreamOptions = {}\n ) {\n this.Fs = Fs;\n\n this.sys = sys;\n\n this.options = options;\n }\n\n attach(stream: ProcessStream, kfd: number, terminal?: boolean): void {\n this.refs.set(kfd, (this.refs.get(kfd) ?? 0) + 1);\n\n stream.sliccKernelFd = kfd;\n stream.stream_ops = this.ops(kfd, stream.stream_ops);\n if (terminal ?? this.sys.isatty?.(kfd) ?? false) stream.tty = this.ttyOps(kfd);\n else delete stream.tty;\n }\n\n attachSocket(stream: ProcessStream, kfd: number): void {\n this.attach(stream, kfd, false);\n stream.sliccKernelSocket = true;\n }\n\n socketStream(flags: number): ProcessStream {\n const fs = this.Fs as unknown as Partial<SocketNodeFs>;\n if (!fs.mount || !fs.createNode || !fs.createStream) {\n const stream = this.Fs.open('/dev/null', 2);\n stream.flags = flags;\n return stream;\n }\n const createNode = fs.createNode;\n this.socketRoot ??= fs.mount({ mount: () => createNode(null, '/', 0o40777, 0) }, {}, null);\n const ino = ++this.sockets;\n const node = fs.createNode(this.socketRoot, `socket:${ino}`, SOCKET_MODE, 0);\n const now = new Date();\n const stat = { dev: 0, ino, mode: SOCKET_MODE, nlink: 1, uid: 0, gid: 0, rdev: 0, size: 0 };\n const times = { atime: now, mtime: now, ctime: now, blksize: 4096, blocks: 0 };\n node.node_ops = { getattr: () => ({ ...stat, ...times }) };\n return fs.createStream({ node, flags, seekable: false, position: 0, stream_ops: {} });\n }\n\n nameTerminal(stream: ProcessStream): void {\n const kfd = stream.sliccKernelFd;\n if (!stream.tty || kfd === undefined) return;\n const name = this.sys.ttyName?.(kfd);\n if (name) this.nameStream(stream, name);\n }\n\n private nameStream(stream: ProcessStream, name: string): void {\n stream.path = name;\n if (typeof this.Fs.stat !== 'function') return;\n\n stream.stream_ops = { ...stream.stream_ops, getattr: () => this.Fs.stat?.(name) ?? {} };\n }\n\n private ttyOps(kfd: number): object {\n return {\n ops: {\n ioctl_tcgets: () => this.call(() => this.sys.tcgets?.(kfd)),\n ioctl_tcsets: (_tty: unknown, _op: number, termios: Termios) =>\n this.call(() => {\n this.sys.tcsets?.(kfd, termios);\n return 0;\n }),\n ioctl_tiocgwinsz: () => this.call(() => this.sys.winsize?.(kfd) ?? [24, 80]),\n fsync: () => {},\n },\n };\n }\n\n attachFile(stream: ProcessStream, kfd: number): void {\n this.attach(stream, kfd, false);\n stream.sliccKernelFile = true;\n stream.stream_ops = {\n ...stream.stream_ops,\n llseek: (_s, offset, whence) => this.call(() => this.sys.seek(kfd, offset, whence)),\n\n fsync: () =>\n this.call(() => {\n this.sys.flush(kfd);\n return 0;\n }),\n };\n }\n\n useControllingTerminal(): void {\n if (typeof this.Fs.open !== 'function') return;\n this.usePtyPaths();\n const open = this.Fs.open.bind(this.Fs);\n this.Fs.open = (path, flags, mode) => {\n const pty = this.openPty(open, path, flags, mode);\n if (pty) return pty;\n const stream = open(path, flags, mode);\n\n if (!stream.tty) return stream;\n if (stream.path === '/dev/tty' && this.sys.openTty) {\n let kfd: number;\n try {\n kfd = this.call(() => this.sys.openTty?.() as number);\n } catch (e) {\n this.Fs.closeStream(stream.fd);\n throw e;\n }\n this.attach(stream, kfd, true);\n return stream;\n }\n\n let named: number | undefined;\n try {\n named = stream.path ? this.openNamedTerminal(stream.path) : undefined;\n } catch (e) {\n this.Fs.closeStream(stream.fd);\n throw e;\n }\n if (named !== undefined) {\n this.attach(stream, named, true);\n return stream;\n }\n\n const terminal = this.stdioTerminal();\n if (terminal !== undefined) this.attach(stream, terminal, true);\n return stream;\n };\n }\n\n private openPty(\n open: NonNullable<ProcessFs['open']>,\n path: string,\n flags: number,\n mode?: number\n ): ProcessStream | undefined {\n const pts = /^\\/dev\\/pts\\/(\\d+)$/.exec(path);\n if (path !== '/dev/ptmx' && !pts) return undefined;\n const { openPty, openPts } = this.sys;\n if (!openPty || !openPts) return undefined;\n const kfd = this.call(() =>\n pts ? openPts(Number(pts[1]), (flags & O_NOCTTY) !== 0) : openPty()\n ) as number;\n let stream: ProcessStream;\n try {\n stream = open('/dev/null', flags & ~(O_CREAT | O_EXCL | O_TRUNC), mode);\n } catch (e) {\n this.sys.close(kfd);\n throw e;\n }\n\n this.attach(stream, kfd, true);\n\n this.nameStream(stream, path);\n return stream;\n }\n\n private usePtyPaths(): void {\n const fs = this.Fs as unknown as PtyPathFs;\n for (const name of ['chown', 'lchown', 'chmod', 'lchmod'] as const) {\n const original = fs[name];\n if (typeof original !== 'function') continue;\n fs[name] = (path: string, ...rest: number[]) =>\n isPtyPath(path) ? this.existingPty(path) : original.call(fs, path, ...rest);\n }\n for (const name of ['stat', 'lstat'] as const) {\n const original = fs[name];\n if (typeof original !== 'function') continue;\n fs[name] = (path: string, ...rest: unknown[]) => {\n if (!isPtyPath(path)) return original.call(fs, path, ...rest);\n this.existingPty(path);\n return ptyStat(path);\n };\n }\n }\n\n private existingPty(path: string): void {\n const n = PTY_PATH.exec(path)?.[1];\n const exists =\n n === undefined\n ? this.sys.openPty !== undefined\n : (this.sys.ptyNumbers?.().includes(Number(n)) ?? false);\n if (!exists) throw new this.Fs.ErrnoError(wasiErrno('ENOENT'));\n }\n\n private openNamedTerminal(path: string): number | undefined {\n const { openTty } = this.sys;\n if (!openTty) return undefined;\n try {\n return openTty.call(this.sys, path);\n } catch (e) {\n if (e instanceof SyscallError && e.code === 'ENXIO') return undefined;\n return this.call(() => {\n throw e;\n });\n }\n }\n\n private stdioTerminal(): number | undefined {\n for (const fd of [0, 1, 2]) {\n const stream = this.Fs.getStream(fd);\n if (stream?.sliccKernelFd !== undefined && stream.tty) return stream.sliccKernelFd;\n }\n return undefined;\n }\n\n usePipes(pipefs: ProcessPipeFs): void {\n const createPipe = pipefs.createPipe.bind(pipefs);\n pipefs.createPipe = () => {\n const [read, write] = this.call(() => this.sys.pipe());\n\n let fds: ReturnType<ProcessPipeFs['createPipe']>;\n try {\n fds = createPipe();\n } catch (e) {\n for (const kfd of [read, write]) {\n try {\n this.sys.close(kfd);\n } catch {}\n }\n throw e;\n }\n this.attach(this.Fs.getStream(fds.readable_fd) as ProcessStream, read, false);\n this.attach(this.Fs.getStream(fds.writable_fd) as ProcessStream, write, false);\n return fds;\n };\n }\n\n private restarting<T>(syscall: () => T): T {\n for (;;) {\n try {\n return syscall();\n } catch (e) {\n if (!(e instanceof SyscallError && e.code === 'EINTR' && this.options.restartable?.())) {\n throw e;\n }\n }\n }\n }\n\n private call<T>(syscall: () => T): T {\n try {\n return syscall();\n } catch (e) {\n if (e instanceof SyscallError) throw new this.Fs.ErrnoError(wasiErrno(e.code));\n throw e;\n }\n }\n\n private ops(kfd: number, base: StreamOps): StreamOps {\n return {\n ...base,\n\n llseek: () =>\n this.call(() => {\n throw new SyscallError('ESPIPE');\n }),\n read: (s, buffer, offset, length) =>\n this.call(() => {\n const bytes = this.restarting(() => this.sys.read(kfd, length, nonblocking(s)));\n buffer.set(bytes, offset);\n return bytes.length;\n }),\n write: (s, buffer, offset, length) => {\n try {\n const bytes = buffer.slice(offset, offset + length);\n return this.restarting(() => this.sys.write(kfd, bytes, nonblocking(s)));\n } catch (e) {\n if (e instanceof SyscallError && e.code === 'EPIPE' && !this.options.sigpipe?.()) {\n throw new ProcessExit(KILLED_BY_SIGPIPE);\n }\n return this.call(() => {\n throw e;\n });\n }\n },\n fsync: () => 0,\n poll: () => {\n const state = this.call(() => this.sys.poll(kfd));\n let mask = 0;\n if (state.readable) mask |= POLLIN | POLLRDNORM;\n if (state.writable) mask |= POLLOUT | POLLWRNORM;\n\n if (state.hangup) mask |= state.readable ? POLLHUP : POLLERR;\n return mask;\n },\n dup: (stream) => {\n base.dup?.(stream);\n this.refs.set(kfd, (this.refs.get(kfd) ?? 0) + 1);\n },\n close: (stream) => {\n try {\n base.close?.(stream);\n } catch {}\n const left = (this.refs.get(kfd) ?? 1) - 1;\n if (left > 0) {\n this.refs.set(kfd, left);\n return;\n }\n this.refs.delete(kfd);\n try {\n this.sys.close(kfd);\n } catch {}\n },\n };\n }\n}\n", "import type { ChildStdio, InheritedSlot } from '../kernel/children.ts';\nimport type { WasmSyscall } from '../kernel/process.ts';\nimport type { ForkState, ForkStream } from '../kernel/protocol.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport type { SyncSabTransport } from '../realm/sync-sab-bridge.ts';\nimport type { ProcessFs, ProcessStream } from './kernel-streams.ts';\nimport type { HttpKernel } from './process-http.ts';\nimport type { SocketKernel } from './process-sockets.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nconst POLLIN = 0x001;\nconst POLLOUT = 0x004;\nconst POLLERR = 0x008;\nconst POLLHUP = 0x010;\nconst POLLNVAL = 0x020;\n\nconst SELECT_SLICE_MS = 20;\n\nconst WUNTRACED = 2;\nconst WCONTINUED = 8;\n\nfunction status(r: SyncFsResult): number {\n return r.ok ? 0 : -wasiErrno(r.errno);\n}\n\nfunction number(r: SyncFsResult): number {\n if (!r.ok) return -wasiErrno(r.errno);\n return r.kind === 'json' && typeof r.json === 'number' ? r.json : -wasiErrno('EIO');\n}\n\nexport interface ProcessKernel {\n spawn(\n file: string,\n argv: string[],\n env: Record<string, string> | null,\n cwd: string | null,\n stdio: number[],\n actions?: ReadonlyArray<readonly [number, number]>\n ): number;\n\n wait(pid: number, nohang: boolean, options?: number): [number, number] | number;\n\n fork(state: ForkState): number;\n\n kill(pid: number, sig: number): number;\n\n pause(): number;\n\n setpgid(pid: number, pgid: number): number;\n setsid(): number;\n\n getpgid(pid: number): number;\n getsid(pid: number): number;\n\n tcgetpgrp(fd: number): number;\n\n tcsetpgrp(fd: number, pgrp: number): number;\n\n execWait(pid: number): number;\n\n select(\n read: number[],\n write: number[],\n timeoutMs: number\n ): { read: number[]; write: number[] } | number;\n\n net?: SocketKernel;\n\n http?: HttpKernel;\n}\n\nexport interface ProcessKernelDeps {\n transport: SyncSabTransport;\n Fs: ProcessFs;\n\n env: Record<string, string>;\n\n beforeSpawn(): void;\n\n afterChild(): void;\n\n describeFork(): ForkStream[];\n\n inherit?(actions?: ReadonlyArray<readonly [number, number]>): InheritedSlot[];\n\n stdioPromoter?(): (stream: ProcessStream) => void;\n\n pid?: number;\n\n raise?(sig: number): void;\n\n restartable?(): boolean;\n}\n\nfunction drain(Fs: ProcessFs, stream: ProcessStream): Uint8Array {\n const chunks: Uint8Array[] = [];\n const buffer = new Uint8Array(65536);\n try {\n for (let n = Fs.read(stream, buffer, 0, buffer.length); n > 0; ) {\n chunks.push(buffer.slice(0, n));\n n = Fs.read(stream, buffer, 0, buffer.length);\n }\n } catch {}\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\nfunction kernelSelect(\n Fs: ProcessFs,\n transport: SyncSabTransport,\n read: number[],\n write: number[],\n timeoutMs: number\n): { read: number[]; write: number[] } | number {\n const kernel = (fd: number) => Fs.getStream(fd)?.sliccKernelFd as number;\n const kr = read.map(kernel);\n const kw = write.map(kernel);\n const r = transport.call({ op: 'fd-select', read: kr, write: kw, timeoutMs }, Infinity, 'select');\n if (!r.ok) return -wasiErrno(r.errno);\n const got = (r.kind === 'json' ? r.json : { read: [], write: [] }) as {\n read: number[];\n write: number[];\n };\n return {\n read: read.filter((_, i) => got.read.includes(kr[i] as number)),\n write: write.filter((_, i) => got.write.includes(kw[i] as number)),\n };\n}\n\nfunction ownReady(\n Fs: ProcessFs,\n read: number[],\n write: number[]\n): { read: number[]; write: number[] } {\n const flags = (fd: number): number => {\n const stream = Fs.getStream(fd);\n if (!stream) return POLLNVAL;\n return stream.stream_ops.poll ? stream.stream_ops.poll(stream) : POLLIN | POLLOUT;\n };\n return {\n read: read.filter((fd) => flags(fd) & (POLLIN | POLLHUP | POLLERR | POLLNVAL)),\n write: write.filter((fd) => flags(fd) & (POLLOUT | POLLERR | POLLNVAL)),\n };\n}\n\nexport function createProcessKernel(deps: ProcessKernelDeps): ProcessKernel {\n const { transport, Fs } = deps;\n\n const reaped = new Map<number, number>();\n\n const call = (req: WasmSyscall, label: string): SyncFsResult =>\n transport.call(req, Infinity, label);\n\n const slot = (fd: number, n: number, promote?: (stream: ProcessStream) => void): ChildStdio => {\n const stream = fd >= 0 ? Fs.getStream(fd) : null;\n if (!stream) return { none: true };\n promote?.(stream);\n if (stream.sliccKernelFd !== undefined) return { fd: stream.sliccKernelFd };\n\n if (stream.path === '/dev/null') return { none: true };\n return n === 0 ? { input: drain(Fs, stream) } : { capture: true };\n };\n\n const kernelWait = (pid: number, nohang: boolean, options = 0): [number, number] | number => {\n const req = {\n op: 'proc-wait' as const,\n pid,\n nohang,\n ...(options & WUNTRACED ? { untraced: true } : {}),\n ...(options & WCONTINUED ? { continued: true } : {}),\n };\n let r = transport.call(req, Infinity, `proc-wait ${pid}`);\n\n while (!r.ok && r.errno === 'EINTR' && deps.restartable?.()) {\n r = transport.call(req, Infinity, `proc-wait ${pid}`);\n }\n if (!r.ok) return -wasiErrno(r.errno);\n const waited = r.kind === 'json' ? (r.json as [number, number]) : [0, 0];\n if (waited[0] > 0) deps.afterChild();\n return [waited[0], waited[1]];\n };\n\n const deliver = (pid: number, n: number, fd: number): void => {\n const r = transport.call(\n { op: 'proc-captured', pid, slot: n },\n Infinity,\n `proc-captured ${pid}`\n );\n const stream = Fs.getStream(fd);\n if (r.ok && r.kind === 'bytes' && r.bytes.length > 0 && stream) {\n Fs.write(stream, r.bytes, 0, r.bytes.length);\n }\n };\n\n return {\n spawn(file, argv, env, cwd, fds, actions) {\n deps.beforeSpawn();\n const promote = deps.stdioPromoter?.();\n const stdio = [0, 1, 2].map((n) => slot(fds[n] ?? -1, n, promote));\n const inherit = deps.inherit?.(actions) ?? [];\n const r = transport.call(\n {\n op: 'proc-spawn',\n file,\n argv,\n env: env ?? deps.env,\n cwd: cwd ?? Fs.cwd(),\n stdio,\n ...(inherit.length > 0 ? { inherit } : {}),\n },\n Infinity,\n `proc-spawn ${file}`\n );\n if (!r.ok) return -wasiErrno(r.errno);\n const pid = r.kind === 'json' ? (r.json as number) : 0;\n const captures = [1, 2].filter((n) => 'capture' in (stdio[n] as ChildStdio));\n if (captures.length === 0) return pid;\n const waited = kernelWait(pid, false);\n if (typeof waited === 'number') return waited;\n for (const n of captures) deliver(pid, n, fds[n] as number);\n reaped.set(pid, waited[1]);\n return pid;\n },\n fork(state) {\n deps.beforeSpawn();\n const streams = deps.describeFork();\n const r = transport.call(\n { op: 'proc-fork', state: { ...state, streams, cwd: Fs.cwd() } },\n Infinity,\n 'proc-fork'\n );\n if (!r.ok) return -wasiErrno(r.errno);\n return r.kind === 'json' ? (r.json as number) : -wasiErrno('EIO');\n },\n select(read, write, timeoutMs) {\n const kernel = (fd: number) => Fs.getStream(fd)?.sliccKernelFd;\n const own = (fd: number) => kernel(fd) === undefined;\n if (![...read, ...write].some(own))\n return kernelSelect(Fs, transport, read, write, timeoutMs);\n const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : Date.now() + timeoutMs;\n const kernelRead = read.filter((fd) => !own(fd));\n const kernelWrite = write.filter((fd) => !own(fd));\n for (;;) {\n const local = ownReady(Fs, read.filter(own), write.filter(own));\n const pending = local.read.length > 0 || local.write.length > 0;\n const slice = pending ? 0 : Math.min(SELECT_SLICE_MS, Math.max(0, deadline - Date.now()));\n const got = kernelSelect(Fs, transport, kernelRead, kernelWrite, slice);\n if (typeof got === 'number') return got;\n const ready = { read: [...local.read, ...got.read], write: [...local.write, ...got.write] };\n if (ready.read.length > 0 || ready.write.length > 0 || Date.now() >= deadline) {\n return ready;\n }\n }\n },\n execWait(pid) {\n const r = transport.call({ op: 'proc-exec', pid }, Infinity, `exec ${pid}`);\n if (!r.ok) return -wasiErrno(r.errno);\n deps.afterChild();\n return r.kind === 'json' ? (r.json as [number, number])[1] : 0;\n },\n pause() {\n return status(call({ op: 'sig-pause' }, 'pause'));\n },\n kill(pid, sig) {\n if (pid === deps.pid) {\n if (sig !== 0) deps.raise?.(sig);\n return 0;\n }\n return status(call({ op: 'proc-kill', pid, sig }, `kill ${pid}`));\n },\n setpgid: (pid, pgid) => status(call({ op: 'proc-setpgid', pid, pgid }, 'setpgid')),\n setsid: () => number(call({ op: 'proc-setsid' }, 'setsid')),\n getpgid: (pid) => number(call({ op: 'proc-getpgid', pid }, 'getpgid')),\n getsid: (pid) => number(call({ op: 'proc-getsid', pid }, 'getsid')),\n tcgetpgrp(fd) {\n const kfd = Fs.getStream(fd)?.sliccKernelFd;\n if (kfd === undefined) return -wasiErrno('ENOTTY');\n return number(call({ op: 'tty-pgrp-get', fd: kfd }, 'tcgetpgrp'));\n },\n tcsetpgrp(fd, pgrp) {\n const kfd = Fs.getStream(fd)?.sliccKernelFd;\n if (kfd === undefined) return -wasiErrno('ENOTTY');\n return status(call({ op: 'tty-pgrp-set', fd: kfd, pgrp }, 'tcsetpgrp'));\n },\n wait(pid, nohang, options) {\n const key = pid > 0 ? (reaped.has(pid) ? pid : undefined) : reaped.keys().next().value;\n if (key !== undefined) {\n const status = reaped.get(key) as number;\n reaped.delete(key);\n return [key, status];\n }\n return kernelWait(pid, nohang, options);\n },\n };\n}\n", "import type { ProcessFs } from './kernel-streams.ts';\nimport type { GlueSyscall } from './process-fds.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nexport const TIOCGPTN = 0x80045430;\nexport const TIOCSPTLCK = 0x40045431;\nexport const TIOCSCTTY = 0x540e;\nexport const TIOCSWINSZ = 0x5414;\nexport const TIOCPKT = 0x5420;\n\nexport interface PtyKernel {\n ptyNumber(kfd: number): number;\n\n ptyLock(kfd: number, lock: boolean): void;\n\n setControllingTerminal(kfd: number): void;\n\n setPacketMode(kfd: number, on: boolean): void;\n\n setWinsize(kfd: number, rows: number, cols: number): void;\n}\n\nexport interface PtyIoctlDeps {\n fs(): ProcessFs | undefined;\n\n heap(): Int32Array | undefined;\n kernel: PtyKernel;\n}\n\nfunction failed(e: unknown): number {\n const code = (e as { code?: unknown } | null)?.code;\n if (typeof code === 'string') return -wasiErrno(code);\n throw e;\n}\n\nexport function ptyIoctl(ioctl: GlueSyscall, deps: PtyIoctlDeps): GlueSyscall {\n return (fd, op, varargs) => {\n const request = op >>> 0;\n if (\n request !== TIOCGPTN &&\n request !== TIOCSPTLCK &&\n request !== TIOCSCTTY &&\n request !== TIOCSWINSZ &&\n request !== TIOCPKT\n ) {\n return ioctl(fd, op, varargs);\n }\n const stream = deps.fs()?.getStream(fd);\n const kfd = (stream as { sliccKernelFd?: number } | undefined)?.sliccKernelFd;\n\n if (kfd === undefined) return ioctl(fd, op, varargs);\n const heap = deps.heap();\n if (!heap) return -wasiErrno('EFAULT');\n const argp = (heap[varargs >> 2] ?? 0) >>> 0;\n try {\n return answer(request, kfd, argp, heap, deps.kernel);\n } catch (e) {\n return failed(e);\n }\n };\n}\n\nfunction answer(\n request: number,\n kfd: number,\n argp: number,\n heap: Int32Array,\n kernel: PtyKernel\n): number {\n switch (request) {\n case TIOCGPTN:\n heap[argp >> 2] = kernel.ptyNumber(kfd);\n return 0;\n case TIOCSPTLCK:\n kernel.ptyLock(kfd, (heap[argp >> 2] ?? 0) !== 0);\n return 0;\n case TIOCSCTTY:\n kernel.setControllingTerminal(kfd);\n return 0;\n case TIOCPKT:\n kernel.setPacketMode(kfd, (heap[argp >> 2] ?? 0) !== 0);\n return 0;\n default: {\n const word = heap[argp >> 2] ?? 0;\n kernel.setWinsize(kfd, word & 0xffff, (word >>> 16) & 0xffff);\n return 0;\n }\n }\n}\n", "import type { ProcessFs, ProcessStream } from './kernel-streams.ts';\nimport { type PtyKernel, ptyIoctl } from './process-pty.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nexport const O_CLOEXEC = 0o2000000;\n\nconst FD_CLOEXEC = 1;\nconst F_DUPFD = 0;\nconst F_GETFD = 1;\nconst F_SETFD = 2;\nconst F_GETFL = 3;\nconst F_DUPFD_CLOEXEC = 1030;\n\ntype CloexecStream = Pick<ProcessStream, 'sliccCloexec'>;\n\nexport function closesOnExec(stream: CloexecStream): boolean {\n return stream.sliccCloexec === true;\n}\n\nexport function setCloseOnExec(stream: CloexecStream, on: boolean): void {\n if (on) stream.sliccCloexec = true;\n else delete stream.sliccCloexec;\n}\n\nconst tracked = new WeakSet<ProcessFs>();\n\nexport function trackCloseOnExec(Fs: ProcessFs): void {\n if (tracked.has(Fs)) return;\n tracked.add(Fs);\n if (typeof Fs.dupStream === 'function') {\n const dupStream = Fs.dupStream.bind(Fs);\n Fs.dupStream = (stream, fd) => {\n const copy = dupStream(stream, fd);\n setCloseOnExec(copy, false);\n return copy;\n };\n }\n if (typeof Fs.open === 'function') {\n const open = Fs.open.bind(Fs);\n Fs.open = (path, flags, mode) => {\n const cloexec = typeof flags === 'number' && (flags & O_CLOEXEC) !== 0;\n const stream = open(path, cloexec ? flags & ~O_CLOEXEC : flags, mode);\n setCloseOnExec(stream, cloexec);\n return stream;\n };\n }\n}\n\nexport type GlueSyscall = (...args: number[]) => number;\n\nexport interface GlueSyscalls {\n fcntl?: GlueSyscall;\n pipe2?: GlueSyscall;\n dup3?: GlueSyscall;\n socket?: GlueSyscall;\n accept4?: GlueSyscall;\n\n ioctl?: GlueSyscall;\n\n setitimer?: GlueSyscall;\n}\n\nexport interface CloexecDeps {\n fs(): ProcessFs | undefined;\n\n heap(): Int32Array | undefined;\n\n pty?: PtyKernel;\n\n timer?: { arm(ms: number): void };\n}\n\nfunction marker(deps: CloexecDeps): (fd: number, on: boolean) => void {\n return (fd, on) => {\n const stream = deps.fs()?.getStream(fd);\n if (stream) setCloseOnExec(stream, on);\n };\n}\n\nfunction cloexecFcntl(fcntl: GlueSyscall, deps: CloexecDeps): GlueSyscall {\n const mark = marker(deps);\n return (fd, cmd, varargs) => {\n if (cmd === F_DUPFD_CLOEXEC) {\n const copy = fcntl(fd, F_DUPFD, varargs);\n if (copy >= 0) mark(copy, true);\n return copy;\n }\n if (cmd === F_GETFL) {\n const flags = fcntl(fd, cmd, varargs);\n return flags < 0 ? flags : flags & ~O_CLOEXEC;\n }\n if (cmd !== F_GETFD && cmd !== F_SETFD) return fcntl(fd, cmd, varargs);\n const stream = deps.fs()?.getStream(fd);\n if (!stream) return -wasiErrno('EBADF');\n if (cmd === F_GETFD) return closesOnExec(stream) ? FD_CLOEXEC : 0;\n const arg = deps.heap()?.[varargs >> 2];\n if (arg === undefined) return -wasiErrno('EINVAL');\n setCloseOnExec(stream, (arg & FD_CLOEXEC) !== 0);\n return 0;\n };\n}\n\nfunction cloexecPipe2(pipe2: GlueSyscall, deps: CloexecDeps): GlueSyscall {\n const mark = marker(deps);\n return (fdPtr, flags) => {\n const r = pipe2(fdPtr, flags & ~O_CLOEXEC);\n const heap = deps.heap();\n if (r === 0 && flags & O_CLOEXEC && heap) {\n mark(heap[fdPtr >> 2] as number, true);\n mark(heap[(fdPtr >> 2) + 1] as number, true);\n }\n return r;\n };\n}\n\nfunction cloexecByFlag(syscall: GlueSyscall, flagArg: number, deps: CloexecDeps): GlueSyscall {\n const mark = marker(deps);\n return (...args) => {\n const cloexec = ((args[flagArg] ?? 0) & O_CLOEXEC) !== 0;\n if (cloexec) args[flagArg] = (args[flagArg] as number) & ~O_CLOEXEC;\n const fd = syscall(...args);\n if (fd >= 0) mark(fd, cloexec);\n return fd;\n };\n}\n\ntype SyscallName = keyof GlueSyscalls;\n\nconst IMPORT_NAMES: Readonly<Record<SyscallName, string>> = {\n fcntl: '__syscall_fcntl64',\n pipe2: '__syscall_pipe2',\n dup3: '__syscall_dup3',\n socket: '__syscall_socket',\n accept4: '__syscall_accept4',\n ioctl: '__syscall_ioctl',\n setitimer: '_setitimer_js',\n};\n\nfunction wrapperFactories(\n deps: CloexecDeps\n): Partial<Record<SyscallName, (syscall: GlueSyscall) => GlueSyscall>> {\n const { pty, timer } = deps;\n return {\n ...(timer ? { setitimer: (f: GlueSyscall) => kernelTimer(f, timer) } : {}),\n fcntl: (f) => cloexecFcntl(f, deps),\n pipe2: (f) => cloexecPipe2(f, deps),\n\n dup3: (f) => cloexecByFlag(f, 2, deps),\n socket: (f) => cloexecByFlag(f, 1, deps),\n accept4: (f) => cloexecByFlag(f, 3, deps),\n ...(pty\n ? { ioctl: (f: GlueSyscall) => ptyIoctl(f, { fs: deps.fs, heap: deps.heap, kernel: pty }) }\n : {}),\n };\n}\n\nfunction kernelTimer(setitimer: GlueSyscall, timer: { arm(ms: number): void }): GlueSyscall {\n return (which, ms) => {\n if (which !== 0) return setitimer(which, ms);\n timer.arm(ms ?? 0);\n return 0;\n };\n}\n\nfunction syscallOf(glue: GlueSyscalls, name: string, value: unknown): SyscallName | undefined {\n const names = Object.keys(IMPORT_NAMES) as SyscallName[];\n const own = names.find((key) => glue[key] !== undefined && glue[key] === value);\n if (own) return own;\n\n return typeof value === 'function'\n ? names.find((key) => glue[key] !== undefined && IMPORT_NAMES[key] === name)\n : undefined;\n}\n\nexport function wrapCloexecSyscalls(\n imports: WebAssembly.Imports,\n glue: GlueSyscalls | undefined,\n deps: CloexecDeps\n): void {\n if (!glue) return;\n const factories = wrapperFactories(deps);\n const seen = new Set<object>();\n for (const namespace of Object.values(imports)) {\n if (!namespace || typeof namespace !== 'object' || seen.has(namespace)) continue;\n seen.add(namespace);\n for (const [name, value] of Object.entries(namespace)) {\n const key = syscallOf(glue, name, value);\n const wrap = key && factories[key];\n if (wrap) namespace[name] = wrap(value as GlueSyscall);\n }\n }\n}\n\nexport function wasmMemory(\n instance: WebAssembly.Instance,\n imports: WebAssembly.Imports\n): WebAssembly.Memory | undefined {\n const isMemory = (v: unknown): v is WebAssembly.Memory => v instanceof WebAssembly.Memory;\n const exported = Object.values(instance.exports).find(isMemory);\n if (exported) return exported;\n for (const namespace of Object.values(imports)) {\n const found = Object.values(namespace ?? {}).find(isMemory);\n if (found) return found;\n }\n return undefined;\n}\n\nexport function fdOfPath(path: string, cwd: string): number | undefined {\n const parts: string[] = [];\n for (const part of `${path.startsWith('/') ? '' : cwd}/${path}`.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n const abs = `/${parts.join('/')}`;\n const std = ['/dev/stdin', '/dev/stdout', '/dev/stderr'].indexOf(abs);\n if (std >= 0) return std;\n const m = /^\\/(?:dev|proc\\/self)\\/fd\\/(\\d+)$/.exec(abs);\n return m ? Number(m[1]) : undefined;\n}\n\nconst DIR_MODE = 0o040555;\nconst LINK_MODE = 0o120700;\n\nfunction syntheticAttr(mode: number, ino: number): object {\n const now = new Date();\n return {\n dev: 1,\n ino,\n mode,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n size: 0,\n atime: now,\n mtime: now,\n ctime: now,\n blksize: 4096,\n blocks: 0,\n };\n}\n\ninterface FdDirNode {\n id?: number;\n node_ops?: {\n lookup?: (parent: FdDirNode, name: string) => FdDirNode;\n getattr?: (node: FdDirNode) => object;\n };\n}\n\nfunction describeFdDir(Fs: ProcessFs): void {\n let dir: FdDirNode | undefined;\n try {\n dir = Fs.lookupPath?.('/proc/self/fd', { follow: true })?.node as FdDirNode | undefined;\n } catch {\n return;\n }\n const ops = dir?.node_ops;\n const lookup = ops?.lookup;\n if (!dir || !lookup || ops.getattr) return;\n dir.node_ops = {\n ...ops,\n getattr: () => syntheticAttr(DIR_MODE, 1),\n lookup: (parent, name) => {\n const entry = lookup(parent, name);\n entry.node_ops = {\n ...entry.node_ops,\n getattr: () => syntheticAttr(LINK_MODE, entry.id ?? 0),\n };\n return entry;\n },\n };\n}\n\nexport function useDevFd(Fs: ProcessFs): void {\n if (typeof Fs.open !== 'function') return;\n try {\n Fs.symlink?.('/proc/self/fd', '/dev/fd');\n } catch {}\n describeFdDir(Fs);\n const fdOf = (path: unknown): number | undefined =>\n typeof path === 'string' ? fdOfPath(path, Fs.cwd()) : undefined;\n const target = (fd: number): ProcessStream => {\n const stream = Fs.getStream(fd);\n if (!stream) throw new Fs.ErrnoError(wasiErrno('EBADF'));\n return stream;\n };\n const open = Fs.open.bind(Fs);\n Fs.open = (path, flags, mode) => {\n const fd = fdOf(path);\n if (fd === undefined) return open(path, flags, mode);\n const copy = Fs.dupStream(target(fd), -1);\n setCloseOnExec(copy, typeof flags === 'number' && (flags & O_CLOEXEC) !== 0);\n return copy;\n };\n const { stat, fstat } = Fs;\n if (typeof stat !== 'function' || typeof fstat !== 'function') return;\n Fs.stat = (path, dontFollow) => {\n const fd = dontFollow ? undefined : fdOf(path);\n if (fd === undefined) return stat.call(Fs, path, dontFollow);\n target(fd);\n return fstat.call(Fs, fd);\n };\n}\n", "import type { InheritedSlot } from '../kernel/children.ts';\nimport type { DeviceAccess, KernelDevice } from '../kernel/fd-table.ts';\nimport type { ForkStream, KernelStreamEntry } from '../kernel/protocol.ts';\nimport type { KernelStreams, ProcessFs, ProcessStream, ProcessSys } from './kernel-streams.ts';\nimport { closesOnExec, O_CLOEXEC, setCloseOnExec } from './process-fds.ts';\n\nconst O_RDWR = 0o2;\nconst O_ACCMODE = 0o3;\nconst O_CREAT = 0o100;\nconst O_EXCL = 0o200;\nconst O_TRUNC = 0o1000;\n\nconst PLACEHOLDER_DIR = '/dev/slicc-fd';\n\ninterface LiveNodeBag {\n live?: { orphan?: boolean; data?: Uint8Array; len?: number };\n mode: number;\n}\n\nfunction isVfsFile(Fs: ProcessFs, stream: ProcessStream): boolean {\n const node = stream.node as LiveNodeBag;\n return node.live !== undefined && Fs.isFile(node.mode);\n}\n\nfunction orphanContents(stream: ProcessStream): Uint8Array | undefined {\n const live = (stream.node as LiveNodeBag).live;\n if (!live?.orphan) return undefined;\n return live.data?.slice(0, live.len ?? live.data.length) ?? new Uint8Array(0);\n}\n\nexport function vfsPromoter(\n Fs: ProcessFs,\n sys: ProcessSys,\n streams: KernelStreams,\n livePath: (stream: ProcessStream) => string\n): (stream: ProcessStream) => void {\n const promoted = new Map<object, number>();\n return (stream) => {\n if (stream.sliccKernelFd !== undefined || !isVfsFile(Fs, stream)) return;\n let kfd = promoted.get(stream.shared);\n if (kfd === undefined) {\n const contents = orphanContents(stream);\n kfd = sys.openVfs(\n livePath(stream),\n stream.flags,\n stream.position,\n contents !== undefined ? { contents, orphan: true } : undefined\n );\n promoted.set(stream.shared, kfd);\n }\n streams.attachFile(stream, kfd);\n };\n}\n\nexport function describeForFork(\n Fs: ProcessFs,\n sys: ProcessSys,\n streams: KernelStreams,\n livePath: (stream: ProcessStream) => string\n): ForkStream[] {\n const promote = vfsPromoter(Fs, sys, streams, livePath);\n const out: ForkStream[] = [];\n for (const stream of Fs.streams) {\n if (!stream) continue;\n promote(stream);\n if (stream.sliccKernelFd !== undefined) {\n out.push(kernelEntry(stream, stream.sliccKernelFd));\n } else if (stream.path) {\n const flags = stream.flags | (closesOnExec(stream) ? O_CLOEXEC : 0);\n out.push({ fd: stream.fd, path: stream.path, flags });\n }\n }\n return out;\n}\n\nfunction kernelEntry(stream: ProcessStream, kernel: number): ForkStream {\n const cloexec = closesOnExec(stream) ? { cloexec: true } : {};\n if (stream.sliccKernelSocket) {\n return { fd: stream.fd, kernel, kind: 'socket', flags: stream.flags, ...cloexec };\n }\n const kind = stream.sliccKernelFile ? 'file' : stream.tty ? 'tty' : 'stream';\n return { fd: stream.fd, kernel, kind, ...cloexec };\n}\n\nconst ACCESS: Readonly<Record<number, DeviceAccess>> = { 0: 'read', 1: 'write' };\n\nconst DEVICES: Readonly<Record<string, KernelDevice>> = {\n '/dev/null': 'null',\n '/dev/zero': 'zero',\n '/dev/urandom': 'urandom',\n '/dev/random': 'urandom',\n};\n\nexport function describeInherited(\n Fs: ProcessFs,\n sys: ProcessSys,\n streams: KernelStreams,\n livePath: (stream: ProcessStream) => string,\n actions: ReadonlyArray<readonly [number, number]> = []\n): InheritedSlot[] {\n const table = new Map<number, { stream: ProcessStream; cloexec: boolean }>();\n for (const stream of Fs.streams) {\n if (stream) table.set(stream.fd, { stream, cloexec: closesOnExec(stream) });\n }\n for (const [target, source] of actions) {\n if (target <= 2) continue;\n const from = source >= 0 ? table.get(source) : undefined;\n if (from) table.set(target, { stream: from.stream, cloexec: false });\n else table.delete(target);\n }\n const slots = new Map<number, ProcessStream>();\n for (const [fd, { stream, cloexec }] of table) {\n if (fd > 2 && !cloexec) slots.set(fd, stream);\n }\n const promote = vfsPromoter(Fs, sys, streams, livePath);\n const out: InheritedSlot[] = [];\n for (const [fd, stream] of slots) {\n promote(stream);\n const slot = inheritedSlot(fd, stream);\n if (slot) out.push(slot);\n }\n return out;\n}\n\nfunction inheritedSlot(fd: number, stream: ProcessStream): InheritedSlot | undefined {\n if (stream.sliccKernelFd === undefined) {\n const device = stream.path === undefined ? undefined : DEVICES[stream.path];\n if (!device) return undefined;\n const access = ACCESS[stream.flags & O_ACCMODE];\n return { fd, device, ...(access ? { access } : {}) };\n }\n const flags = stream.sliccKernelSocket ? { flags: stream.flags } : {};\n return { fd, kernel: stream.sliccKernelFd, ...flags };\n}\n\nfunction place(Fs: ProcessFs, stream: ProcessStream, fd: number): ProcessStream {\n if (stream.fd === fd) return stream;\n const moved = Fs.dupStream(stream, fd);\n Fs.closeStream(stream.fd);\n return moved;\n}\n\nfunction placeholder(\n Fs: ProcessFs,\n streams: KernelStreams,\n entry: { fd: number; kind: string; flags?: number }\n): ProcessStream {\n if (entry.kind === 'socket') return streams.socketStream(entry.flags ?? O_RDWR);\n if (entry.kind === 'tty') return Fs.open('/dev/tty', O_RDWR);\n if (entry.kind === 'stream') return Fs.open('/dev/null', O_RDWR);\n Fs.mkdirTree(PLACEHOLDER_DIR);\n return Fs.open(`${PLACEHOLDER_DIR}/${entry.fd}`, O_RDWR | O_CREAT);\n}\n\nconst FIFO_MODE = 0o010600;\n\nlet nextStreamIno = 0x40000000;\n\nconst streamInos = new WeakMap<KernelStreams, Map<string, number>>();\n\nfunction asFifo(stream: ProcessStream, streams: KernelStreams, identity: string): void {\n const inos = streamInos.get(streams) ?? new Map<string, number>();\n streamInos.set(streams, inos);\n const fixed = inos.get(identity) ?? nextStreamIno++;\n inos.set(identity, fixed);\n const node = stream.node;\n stream.stream_ops = {\n ...stream.stream_ops,\n getattr: () => ({ ...node.node_ops?.getattr?.(node), mode: FIFO_MODE, ino: fixed, size: 0 }),\n };\n}\n\nexport function placeKernelStream(\n Fs: ProcessFs,\n streams: KernelStreams,\n entry: KernelStreamEntry\n): ProcessStream {\n const stream = place(Fs, placeholder(Fs, streams, entry), entry.fd);\n if (entry.kind === 'file') streams.attachFile(stream, entry.kernel);\n else if (entry.kind === 'socket') streams.attachSocket(stream, entry.kernel);\n else streams.attach(stream, entry.kernel, entry.kind === 'tty');\n if (entry.kind === 'tty') streams.nameTerminal(stream);\n if (entry.kind === 'stream') {\n asFifo(stream, streams, entry.desc !== undefined ? `d${entry.desc}` : `k${entry.kernel}`);\n }\n setCloseOnExec(stream, entry.cloexec === true);\n return stream;\n}\n\nexport function restoreForkedStreams(\n Fs: ProcessFs,\n streams: KernelStreams,\n table: readonly ForkStream[]\n): void {\n for (const stream of Fs.streams) if (stream) Fs.closeStream(stream.fd);\n for (const entry of table) {\n try {\n if ('kernel' in entry) {\n placeKernelStream(Fs, streams, entry);\n } else {\n const placed = place(\n Fs,\n Fs.open(entry.path, entry.flags & ~(O_CREAT | O_EXCL | O_TRUNC)),\n entry.fd\n );\n\n setCloseOnExec(placed, (entry.flags & O_CLOEXEC) !== 0);\n }\n } catch {}\n }\n}\n", "import type { HttpHead, HttpSyscall } from '../kernel/net/http-syscalls.ts';\nimport type { HeaderList } from '../kernel/net/transport.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport type { SyncSabTransport } from '../realm/sync-sab-bridge.ts';\n\nexport interface HttpRequest {\n url: string;\n method?: string;\n headers?: HeaderList;\n body?: Uint8Array;\n}\n\nexport interface HttpKernel {\n request(req: HttpRequest): HttpHead;\n read(handle: number, max: number): Uint8Array;\n close(handle: number): void;\n}\n\nexport class HttpError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport function createHttpKernel(transport: SyncSabTransport): HttpKernel {\n const call = (req: HttpSyscall): SyncFsResult => {\n const r = transport.call(req, Number.POSITIVE_INFINITY, req.op);\n if (!r.ok) throw new HttpError(r.errno, r.message);\n return r;\n };\n return {\n request(req) {\n const r = call({\n op: 'net-request',\n url: req.url,\n method: (req.method ?? 'GET').toUpperCase(),\n headers: req.headers ?? [],\n ...(req.body ? { body: req.body } : {}),\n });\n return (r as Extract<SyncFsResult, { kind: 'json' }>).json as HttpHead;\n },\n read(handle, max) {\n return (call({ op: 'net-read', handle, max }) as Extract<SyncFsResult, { kind: 'bytes' }>)\n .bytes;\n },\n close(handle) {\n call({ op: 'net-close', handle });\n },\n };\n}\n", "import { SIG, sigbit, signalsIn } from '../kernel/signals.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport type { SyncSabTransport } from '../realm/sync-sab-bridge.ts';\nimport { SAB_I_SIGNALS, SAB_I_TIMERS } from '../realm/sync-sab-wire.ts';\n\nexport interface SignalHooks {\n masks(): { caught: number; ignored: number; restart: number } | null;\n\n raise(sig: number): void;\n\n timer?(which: number): void;\n}\n\nexport class SignalGate {\n private reported = { caught: 0, ignored: 0 };\n private restart = 0;\n\n private lastDelivered = 0;\n\n private depth = 0;\n\n private reporting = false;\n\n private readonly raw: SyncSabTransport;\n\n private readonly header: Int32Array;\n\n private readonly hooks: SignalHooks;\n\n constructor(\n raw: SyncSabTransport,\n\n header: Int32Array,\n\n hooks: SignalHooks\n ) {\n this.raw = raw;\n\n this.header = header;\n\n this.hooks = hooks;\n }\n\n transport(): SyncSabTransport {\n return {\n call: (req, timeoutMs, label): SyncFsResult => {\n this.report();\n this.depth++;\n try {\n const result = this.raw.call(req, timeoutMs, label);\n this.deliver();\n return result;\n } finally {\n this.depth--;\n }\n },\n };\n }\n\n restartable(): boolean {\n return this.lastDelivered !== 0 && (this.lastDelivered & ~this.restart) === 0;\n }\n\n private report(): void {\n if (this.reporting) return;\n this.reporting = true;\n let masks: ReturnType<SignalHooks['masks']>;\n try {\n masks = this.hooks.masks();\n } catch {\n masks = null;\n } finally {\n this.reporting = false;\n }\n if (!masks) return;\n this.restart = masks.restart;\n const { caught, ignored } = masks;\n if (caught === this.reported.caught && ignored === this.reported.ignored) return;\n this.reported = { caught, ignored };\n this.raw.call({ op: 'sig-mask', caught, ignored }, Number.POSITIVE_INFINITY, 'sig-mask');\n }\n\n deliver(): void {\n const timers = Atomics.exchange(this.header, SAB_I_TIMERS, 0);\n const pending = Atomics.exchange(this.header, SAB_I_SIGNALS, 0);\n\n if (this.depth <= 1) this.lastDelivered = pending | (timers & 1 ? sigbit(SIG.ALRM) : 0);\n for (let which = 0; which < 3; which++) {\n if (timers & (1 << which)) this.hooks.timer?.(which);\n }\n for (const sig of signalsIn(pending)) this.hooks.raise(sig);\n }\n}\n", "import { normalizePath } from '../fs/types.ts';\nimport type { SockAddr, SocketDomain } from '../kernel/socket.ts';\nimport type { SocketSyscall } from '../kernel/socket-syscalls.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport type { SyncSabTransport } from '../realm/sync-sab-bridge.ts';\nimport {\n type KernelStreams,\n O_NONBLOCK,\n ProcessExit,\n type ProcessFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n} from './kernel-streams.ts';\nimport { setCloseOnExec } from './process-fds.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nconst O_RDWR = 2;\nconst KILLED_BY_SIGPIPE = 128 + 13;\nexport interface SocketKernel {\n socket(domain: SocketDomain, nonblock: boolean, cloexec?: boolean): number;\n socketpair(domain: SocketDomain, nonblock: boolean, cloexec?: boolean): [number, number] | number;\n bind(fd: number, addr: SockAddr): number;\n listen(fd: number, backlog: number): number;\n accept(\n fd: number,\n nonblock: boolean,\n cloexec?: boolean\n ):\n | {\n fd: number;\n peer: SockAddr;\n }\n | number;\n connect(fd: number, addr: SockAddr): number;\n shutdown(fd: number, how: number): number;\n name(fd: number, peer: boolean): SockAddr | number;\n getopt(\n fd: number,\n level: number,\n name: number\n ):\n | {\n value: number;\n }\n | number;\n setopt(fd: number, level: number, name: number, value: number): number;\n send(\n fd: number,\n bytes: Uint8Array,\n flags: {\n dontwait?: boolean;\n nosignal?: boolean;\n }\n ): number;\n recv(\n fd: number,\n max: number,\n flags: {\n dontwait?: boolean;\n peek?: boolean;\n }\n ): Uint8Array | number;\n}\nexport interface SocketKernelDeps {\n transport: SyncSabTransport;\n Fs: ProcessFs;\n sys: ProcessSys;\n streams: KernelStreams;\n sigpipe?: () => boolean;\n restartable?: () => boolean;\n}\nfunction errno(e: unknown): number {\n if (e instanceof SyscallError) return -wasiErrno(e.code);\n const code = (\n e as {\n errno?: unknown;\n } | null\n )?.errno;\n if (typeof code === 'number') return -code;\n throw e;\n}\nconst O_WRONLY = 0o1;\nconst O_CREAT = 0o100;\nconst O_EXCL = 0o200;\nfunction resolved(Fs: ProcessFs, addr: SockAddr): SockAddr {\n if (addr.family !== 'unix' || !addr.path || addr.path.startsWith('\\0')) return addr;\n const path = addr.path.startsWith('/') ? addr.path : `${Fs.cwd()}/${addr.path}`;\n return { family: 'unix', path: normalizePath(path) };\n}\n\nfunction socketNode(\n Fs: ProcessFs,\n addr: SockAddr\n):\n | {\n remove(): void;\n }\n | undefined {\n if (addr.family !== 'unix' || !addr.path || addr.path.startsWith('\\0')) return undefined;\n const fs = Fs as ProcessFs & {\n unlink?(path: string): void;\n };\n let stream: ProcessStream;\n try {\n stream = Fs.open(addr.path, O_WRONLY | O_CREAT | O_EXCL, 0o755);\n } catch (e) {\n if (\n (\n e as {\n errno?: unknown;\n }\n )?.errno === wasiErrno('EEXIST')\n ) {\n throw new SyscallError('EADDRINUSE');\n }\n throw e;\n }\n if (Fs.close) Fs.close(stream);\n else Fs.closeStream(stream.fd);\n return { remove: () => fs.unlink?.(addr.path) };\n}\nexport function createSocketKernel(deps: SocketKernelDeps): SocketKernel {\n const { transport, Fs, sys, streams } = deps;\n const call = (req: SocketSyscall): SyncFsResult => {\n const r = transport.call(req, Number.POSITIVE_INFINITY, req.op);\n if (!r.ok) throw new SyscallError(r.errno);\n return r;\n };\n const json = (req: SocketSyscall): unknown => {\n const r = call(req);\n return r.ok && r.kind === 'json' ? r.json : undefined;\n };\n const done = (req: SocketSyscall): number => {\n call(req);\n return 0;\n };\n const guard = <T>(op: () => T): T | number => {\n for (;;) {\n try {\n return op();\n } catch (e) {\n const restart = e instanceof SyscallError && e.code === 'EINTR' && deps.restartable?.();\n if (!restart) return errno(e);\n }\n }\n };\n const socketAt = (\n fd: number\n ): ProcessStream & {\n sliccKernelFd: number;\n } => {\n const stream = Fs.getStream(fd);\n if (!stream) throw new SyscallError('EBADF');\n if (!stream.sliccKernelSocket || stream.sliccKernelFd === undefined) {\n throw new SyscallError('ENOTSOCK');\n }\n return stream as ProcessStream & {\n sliccKernelFd: number;\n };\n };\n const kfd = (fd: number): number => socketAt(fd).sliccKernelFd;\n const install = (k: number, nonblock: boolean, cloexec = false): number => {\n let stream: ProcessStream;\n try {\n stream = streams.socketStream(O_RDWR | (nonblock ? O_NONBLOCK : 0));\n } catch (e) {\n sys.close(k);\n throw e;\n }\n streams.attachSocket(stream, k);\n setCloseOnExec(stream, cloexec);\n return stream.fd;\n };\n return {\n socket: (domain, nonblock, cloexec) =>\n guard(() => install(json({ op: 'sock-open', domain }) as number, nonblock, cloexec)),\n socketpair: (domain, nonblock, cloexec) =>\n guard(() => {\n const [a, b] = json({ op: 'sock-pair', domain }) as [number, number];\n let first: number;\n try {\n first = install(a, nonblock, cloexec);\n } catch (e) {\n sys.close(b);\n throw e;\n }\n try {\n return [first, install(b, nonblock, cloexec)] as [number, number];\n } catch (e) {\n const stream = Fs.getStream(first);\n if (stream) stream.stream_ops.close?.(stream);\n Fs.closeStream(first);\n throw e;\n }\n }),\n bind: (fd, given) =>\n guard(() => {\n const addr = resolved(Fs, given);\n const node = socketNode(Fs, addr);\n try {\n return done({ op: 'sock-bind', fd: kfd(fd), addr });\n } catch (e) {\n node?.remove();\n throw e;\n }\n }),\n listen: (fd, backlog) => guard(() => done({ op: 'sock-listen', fd: kfd(fd), backlog })),\n accept: (fd, nonblock, cloexec) =>\n guard(() => {\n const listener = socketAt(fd);\n const req = {\n op: 'sock-accept' as const,\n fd: listener.sliccKernelFd,\n nonblock: (listener.flags & O_NONBLOCK) !== 0,\n };\n const got = json(req) as {\n fd: number;\n peer: SockAddr;\n };\n return { fd: install(got.fd, nonblock, cloexec), peer: got.peer };\n }),\n connect: (fd, addr) =>\n guard(() => {\n const stream = socketAt(fd);\n const nonblock = (stream.flags & O_NONBLOCK) !== 0;\n return done({\n op: 'sock-connect',\n fd: stream.sliccKernelFd,\n addr: resolved(Fs, addr),\n nonblock,\n });\n }),\n shutdown: (fd, how) => guard(() => done({ op: 'sock-shutdown', fd: kfd(fd), how })),\n name: (fd, peer) => guard(() => json({ op: 'sock-name', fd: kfd(fd), peer }) as SockAddr),\n getopt: (fd, level, name) =>\n guard(() => ({ value: json({ op: 'sock-getopt', fd: kfd(fd), level, name }) as number })),\n setopt: (fd, level, name, value) =>\n guard(() => done({ op: 'sock-setopt', fd: kfd(fd), level, name, value })),\n send: (fd, bytes, flags) =>\n guard(() => {\n const stream = socketAt(fd);\n const nonblock = flags.dontwait === true || (stream.flags & O_NONBLOCK) !== 0;\n try {\n return sys.write(stream.sliccKernelFd, bytes, { nonblock });\n } catch (e) {\n const broken = e instanceof SyscallError && e.code === 'EPIPE';\n if (broken && !flags.nosignal && !deps.sigpipe?.())\n throw new ProcessExit(KILLED_BY_SIGPIPE);\n throw e;\n }\n }),\n recv: (fd, max, flags) =>\n guard(() => {\n const stream = socketAt(fd);\n const nonblock = flags.dontwait === true || (stream.flags & O_NONBLOCK) !== 0;\n return sys.read(stream.sliccKernelFd, max, { nonblock, peek: flags.peek === true });\n }),\n };\n}\n", "import type { ProcessFs } from './kernel-streams.ts';\n\nexport const REALM_UID = 1000;\nexport const REALM_GID = 1000;\n\nexport function ownByRealmUser(Fs: ProcessFs): void {\n const { stat, fstat } = Fs;\n const owned = (attr: object): object => ({ ...attr, uid: REALM_UID, gid: REALM_GID });\n if (typeof stat === 'function') {\n Fs.stat = (path, dontFollow) => owned(stat.call(Fs, path, dontFollow));\n }\n if (typeof fstat === 'function') Fs.fstat = (fd) => owned(fstat.call(Fs, fd));\n}\n", "import type { DeviceMeta, PollState } from '../kernel/fd-table.ts';\nimport type { ForkState, InheritedFd, WasmProcessInitMsg } from '../kernel/protocol.ts';\nimport { SIG } from '../kernel/signals.ts';\nimport type { Termios } from '../kernel/tty.ts';\nimport { mountVfsIntoEmscripten } from '../realm/emscripten-vfs-hook.ts';\nimport { type LiveFsNode, liveNodePath } from '../realm/live-vfs-fs.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n createSyncFsSabBridge,\n createSyncSabTransport,\n type SabPostLike,\n type SyncSabTransport,\n} from '../realm/sync-sab-bridge.ts';\nimport { SAB_HEADER_I32, type SyncSabRequestBody } from '../realm/sync-sab-wire.ts';\nimport {\n KernelStreams,\n type ProcessFs,\n type ProcessPipeFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n} from './kernel-streams.ts';\nimport { createProcessKernel, type ProcessKernel } from './process-children.ts';\nimport {\n type GlueSyscalls,\n trackCloseOnExec,\n useDevFd,\n wasmMemory,\n wrapCloexecSyscalls,\n} from './process-fds.ts';\nimport {\n describeForFork,\n describeInherited,\n placeKernelStream,\n restoreForkedStreams,\n vfsPromoter,\n} from './process-fork.ts';\nimport { createHttpKernel } from './process-http.ts';\nimport type { PtyKernel } from './process-pty.ts';\nimport { SignalGate } from './process-signals.ts';\nimport { createSocketKernel } from './process-sockets.ts';\nimport { ownByRealmUser } from './realm-user.ts';\n\nexport {\n type ProcessFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n} from './kernel-streams.ts';\n\nexport function kernelSys(transport: SyncSabTransport): ProcessSys & PtyKernel {\n const call = (req: SyncSabRequestBody, label: string): SyncFsResult => {\n const r = transport.call(req, Number.POSITIVE_INFINITY, label);\n if (!r.ok) throw new SyscallError(r.errno);\n return r;\n };\n const json = (r: SyncFsResult): unknown => (r.ok && r.kind === 'json' ? r.json : undefined);\n return {\n read(fd, max, opts) {\n const flags = {\n ...(opts?.nonblock ? { nonblock: true } : {}),\n ...(opts?.peek ? { peek: true } : {}),\n };\n const r = call({ op: 'fd-read', fd, max, ...flags }, `fd-read ${fd}`);\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n },\n write(fd, bytes, opts) {\n const req = {\n op: 'fd-write' as const,\n fd,\n body: bytes,\n ...(opts?.nonblock ? { nonblock: true } : {}),\n };\n const n = json(call(req, `fd-write ${fd}`));\n return typeof n === 'number' ? n : bytes.length;\n },\n close(fd) {\n call({ op: 'fd-close', fd }, `fd-close ${fd}`);\n },\n pipe() {\n return json(call({ op: 'fd-pipe' }, 'fd-pipe')) as [number, number];\n },\n poll(fd) {\n return json(call({ op: 'fd-poll', fd }, `fd-poll ${fd}`)) as PollState;\n },\n openVfs(path, flags, position, opts) {\n return json(\n call(\n {\n op: 'fd-open-vfs',\n path,\n flags,\n position,\n ...(opts?.contents !== undefined ? { contents: opts.contents } : {}),\n ...(opts?.orphan ? { orphan: true } : {}),\n ...(opts?.truncate ? { truncate: true } : {}),\n ...(opts?.create ? { create: true } : {}),\n },\n `fd-open-vfs ${path}`\n )\n ) as number;\n },\n seek(fd, offset, whence) {\n return json(call({ op: 'fd-seek', fd, offset, whence }, `fd-seek ${fd}`)) as number;\n },\n flush(fd) {\n call({ op: 'fd-flush', fd }, `fd-flush ${fd}`);\n },\n pread(fd, max, at) {\n const r = call({ op: 'fd-pread', fd, max, offset: at }, `fd-pread ${fd}`);\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n },\n isatty(fd) {\n return (\n (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { tty?: boolean })?.tty === true\n );\n },\n ttyName(fd) {\n return (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { name?: string })?.name;\n },\n openTty(name) {\n const req =\n name === undefined ? { op: 'fd-open-tty' as const } : { op: 'fd-open-tty' as const, name };\n return json(call(req, `fd-open-tty ${name ?? ''}`)) as number;\n },\n tcgets(fd) {\n return json(call({ op: 'tty-get', fd }, `tty-get ${fd}`)) as Termios;\n },\n tcsets(fd, termios) {\n call({ op: 'tty-set', fd, termios }, `tty-set ${fd}`);\n },\n winsize(fd) {\n return json(call({ op: 'tty-winsz', fd }, `tty-winsz ${fd}`)) as [number, number];\n },\n openPty() {\n return json(call({ op: 'pty-open' }, 'pty-open')) as number;\n },\n openPts(n, noctty) {\n return json(call({ op: 'pty-slave-open', n, noctty }, `pty-slave-open ${n}`)) as number;\n },\n ptyNumbers() {\n return json(call({ op: 'pty-list' }, 'pty-list')) as number[];\n },\n ptyNumber(fd) {\n return json(call({ op: 'pty-number', fd }, `pty-number ${fd}`)) as number;\n },\n ptyLock(fd, lock) {\n call({ op: 'pty-lock', fd, lock }, `pty-lock ${fd}`);\n },\n setControllingTerminal(fd) {\n call({ op: 'pty-ctty', fd }, `pty-ctty ${fd}`);\n },\n setPacketMode(fd, on) {\n call({ op: 'pty-packet', fd, on }, `pty-packet ${fd}`);\n },\n setWinsize(fd, rows, cols) {\n call({ op: 'pty-winsz-set', fd, rows, cols }, `pty-winsz-set ${fd}`);\n },\n };\n}\n\nexport function wireKernelFd(Fs: ProcessFs, streams: KernelStreams, entry: InheritedFd): void {\n if (entry.device && openDevice(Fs, entry.fd, entry.device)) return;\n\n placeKernelStream(Fs, streams, {\n ...entry,\n kind: entry.device ? 'stream' : entry.kind,\n kernel: entry.fd,\n });\n}\n\nconst O_RDONLY = 0;\nconst O_WRONLY = 1;\nconst O_RDWR = 2;\n\nfunction openDevice(Fs: ProcessFs, fd: number, meta: DeviceMeta): boolean {\n const flags = meta.access === 'read' ? O_RDONLY : meta.access === 'write' ? O_WRONLY : O_RDWR;\n let stream: ProcessStream;\n try {\n stream = Fs.open(`/dev/${meta.device}`, flags);\n } catch {\n return false;\n }\n if (stream.fd !== fd) {\n Fs.dupStream(stream, fd);\n Fs.closeStream(stream.fd);\n }\n return true;\n}\n\nexport function wireKernelStdio(Fs: ProcessFs, streams: KernelStreams): void {\n for (const fd of [0, 1, 2]) {\n const stream = Fs.getStream(fd);\n if (!stream) continue;\n streams.attach(stream, fd);\n streams.nameTerminal(stream);\n }\n}\n\ninterface RunningModule {\n FS: ProcessFs;\n callMain(args: string[]): number | undefined;\n sliccRunMain?: (args: string[]) => number | undefined;\n sliccForkChild?: (state: ForkState & { pid: number }) => number | undefined;\n PIPEFS?: ProcessPipeFs;\n\n sliccSigpipe?: () => number;\n\n sliccSigMask?: (which: number) => number;\n\n sliccRaise?: (sig: number) => void;\n\n sliccTimerFire?: (which: number) => boolean;\n\n sliccKernel?: ProcessKernel;\n\n sliccSyscalls?: GlueSyscalls;\n}\n\nexport type GlueEvaluator = (glue: string, module: object) => void;\n\nexport function glueBody(glue: string): string {\n return glue.startsWith('#!') ? glue.slice(glue.indexOf('\\n') + 1) : glue;\n}\n\nconst GLUE_TRAILER = [\n \"if (typeof ENV !== 'undefined') Object.assign(ENV, Module.sliccEnv);\",\n 'const __sliccTake = (name, value) => {',\n ' const own = Object.getOwnPropertyDescriptor(Module, name);',\n \" if (own && 'value' in own && own.value != null) return;\",\n ' Object.defineProperty(Module, name, { value, writable: true, configurable: true, enumerable: true });',\n '};',\n \"if (typeof FS !== 'undefined') __sliccTake('FS', FS);\",\n \"if (typeof callMain === 'function') __sliccTake('callMain', callMain);\",\n \"if (typeof sliccRunMain === 'function') __sliccTake('sliccRunMain', sliccRunMain);\",\n \"if (typeof sliccForkChild === 'function') __sliccTake('sliccForkChild', sliccForkChild);\",\n \"if (typeof PIPEFS !== 'undefined') __sliccTake('PIPEFS', PIPEFS);\",\n\n 'Module.sliccSyscalls ??= {',\n \" fcntl: typeof ___syscall_fcntl64 === 'function' ? ___syscall_fcntl64 : undefined,\",\n \" pipe2: typeof ___syscall_pipe2 === 'function' ? ___syscall_pipe2 : undefined,\",\n \" dup3: typeof ___syscall_dup3 === 'function' ? ___syscall_dup3 : undefined,\",\n \" socket: typeof ___syscall_socket === 'function' ? ___syscall_socket : undefined,\",\n \" accept4: typeof ___syscall_accept4 === 'function' ? ___syscall_accept4 : undefined,\",\n \" ioctl: typeof ___syscall_ioctl === 'function' ? ___syscall_ioctl : undefined,\",\n \" setitimer: typeof __setitimer_js === 'function' ? __setitimer_js : undefined,\",\n '};',\n\n 'const __sliccUp = () =>',\n \" (typeof runtimeInitialized === 'undefined' || runtimeInitialized) &&\",\n \" !(typeof runtimeExited !== 'undefined' && runtimeExited) &&\",\n \" !(typeof ABORT !== 'undefined' && ABORT);\",\n \"Module.sliccSigpipe ??= () => (__sliccUp() && typeof _slicc_sigpipe === 'function' ? _slicc_sigpipe() : -1);\",\n\n \"Module.sliccSigMask ??= (w) => (__sliccUp() && typeof _slicc_sig_mask === 'function' ? _slicc_sig_mask(w) : -1);\",\n \"Module.sliccRaise ??= (sig) => { if (__sliccUp() && typeof _slicc_raise === 'function') _slicc_raise(sig); };\",\n\n 'Module.sliccTimerFire ??= (which) => {',\n \" if (!__sliccUp() || typeof __emscripten_timeout !== 'function') return false;\",\n \" __emscripten_timeout(which, typeof _emscripten_get_now === 'function' ? _emscripten_get_now() : performance.now());\",\n ' return true;',\n '};',\n\n \"if (typeof SliccFork !== 'undefined' && !SliccFork.balancesKeepalive && typeof runtimeKeepalivePop === 'function') {\",\n ' let __sliccForking = SliccFork.forking === true;',\n \" Object.defineProperty(SliccFork, 'forking', {\",\n ' get: () => __sliccForking,',\n ' set: (on) => { if (__sliccForking && !on) runtimeKeepalivePop(); __sliccForking = on; },',\n ' configurable: true,',\n ' });',\n '}',\n].join('\\n');\n\nexport function ownValue<T>(module: object, name: string): T | undefined {\n const own = Object.getOwnPropertyDescriptor(module, name);\n return own && 'value' in own ? (own.value as T | undefined) : undefined;\n}\n\nexport const evaluateGlue: GlueEvaluator = (glue, module) => {\n let run: (module: object) => void;\n try {\n run = new Function('Module', `${glueBody(glue)}\\n;${GLUE_TRAILER}`) as (module: object) => void;\n } catch (e) {\n throw e instanceof EvalError ? new Error(EVAL_BLOCKED) : e;\n }\n run(module);\n};\n\nexport const EVAL_BLOCKED =\n \"the wasm realm evaluates the program's Emscripten glue, and this page's CSP forbids eval \" +\n \"(no 'unsafe-eval')\";\n\nexport function signalMasks(\n m: Pick<RunningModule, 'sliccSigMask'>\n): { caught: number; ignored: number; restart: number } | null {\n const mask = m.sliccSigMask;\n const caught = mask?.(0) ?? -1;\n if (!mask || caught === -1) return null;\n return { caught, ignored: mask(1), restart: mask(2) };\n}\n\nexport async function runWasmProcess(\n init: WasmProcessInitMsg,\n port: SabPostLike,\n deps: { evaluate?: GlueEvaluator; warn?: (message: string) => void } = {}\n): Promise<number> {\n const signals = new SignalGate(\n createSyncSabTransport(init.sab, port),\n new Int32Array(init.sab, 0, SAB_HEADER_I32),\n {\n masks: () => signalMasks(module as unknown as RunningModule),\n raise: (sig) => (module as unknown as RunningModule).sliccRaise?.(sig),\n\n timer: (which) => {\n const running = module as unknown as RunningModule;\n if (!running.sliccTimerFire?.(which)) running.sliccRaise?.(SIG.ALRM);\n },\n }\n );\n const transport = signals.transport();\n const sys = kernelSys(transport);\n const encoder = new TextEncoder();\n const say = (fd: number) => (text: string) => sys.write(fd, encoder.encode(`${text}\\n`));\n let ready!: () => void;\n let failed!: (error: unknown) => void;\n let memory: WebAssembly.Memory | undefined;\n const initialized = new Promise<void>((resolve, reject) => {\n ready = resolve;\n failed = reject;\n });\n const module = {\n noInitialRun: true,\n thisProgram: init.argv0,\n sliccPid: init.pid,\n\n ...(init.ppid !== undefined ? { sliccPpid: init.ppid } : {}),\n sliccEnv: init.env,\n print: say(1),\n printErr: say(2),\n instantiateWasm(\n imports: WebAssembly.Imports,\n done: (instance: WebAssembly.Instance, module: WebAssembly.Module) => void\n ): object {\n Promise.resolve()\n .then(() => {\n wrapCloexecSyscalls(imports, ownValue<GlueSyscalls>(module, 'sliccSyscalls'), {\n fs: () => ownValue<ProcessFs>(module, 'FS'),\n heap: () => (memory ? new Int32Array(memory.buffer) : undefined),\n pty: sys,\n\n timer: {\n arm: (ms) => {\n transport.call(\n { op: 'proc-alarm', sig: SIG.ALRM, ms, repeat: false, timer: 0 },\n Number.POSITIVE_INFINITY,\n 'alarm'\n );\n },\n },\n });\n return WebAssembly.instantiate(init.program.module, imports);\n })\n .then((instance) => {\n memory = wasmMemory(instance, imports);\n done(instance, init.program.module);\n }, failed);\n return {};\n },\n\n preRun: [\n (m: object) => {\n if (!hasStreams(m)) return;\n const fs = (m as RunningModule).FS;\n\n trackCloseOnExec(fs);\n try {\n fs.mkdirTree(init.cwd);\n fs.chdir(init.cwd);\n } catch {}\n },\n ],\n onRuntimeInitialized: () => ready(),\n };\n (deps.evaluate ?? evaluateGlue)(init.program.glue, module);\n await initialized;\n const running = module as unknown as RunningModule;\n if (!hasStreams(running)) return runStdioOnly(running, init);\n const vfs = mountVfsIntoEmscripten(running.FS, {\n bridge: createSyncFsSabBridge(transport),\n cwd: init.cwd,\n warn: deps.warn ?? say(2),\n });\n const sigpipe = (): boolean => running.sliccSigpipe?.() === 1;\n const restartable = (): boolean => signals.restartable();\n const streams = new KernelStreams(running.FS, sys, { sigpipe, restartable });\n trackCloseOnExec(running.FS);\n if (init.fork) restoreForkedStreams(running.FS, streams, init.fork.streams ?? []);\n else {\n wireKernelStdio(running.FS, streams);\n for (const entry of init.fds ?? []) wireKernelFd(running.FS, streams, entry);\n }\n const pipefs = ownValue<ProcessPipeFs>(running, 'PIPEFS');\n if (pipefs) streams.usePipes(pipefs);\n streams.useControllingTerminal();\n useDevFd(running.FS);\n ownByRealmUser(running.FS);\n const livePath = (s: ProcessStream) => liveNodePath(s.node as unknown as LiveFsNode);\n running.sliccKernel = createProcessKernel({\n transport,\n Fs: running.FS,\n env: init.env,\n beforeSpawn: () => vfs.flush(),\n afterChild: () => vfs.invalidate(),\n pid: init.pid,\n raise: (sig) => running.sliccRaise?.(sig),\n restartable,\n describeFork: () => describeForFork(running.FS, sys, streams, livePath),\n inherit: (actions) => describeInherited(running.FS, sys, streams, livePath, actions),\n stdioPromoter: () => vfsPromoter(running.FS, sys, streams, livePath),\n });\n running.sliccKernel.http = createHttpKernel(transport);\n running.sliccKernel.net = createSocketKernel({\n transport,\n Fs: running.FS,\n sys,\n streams,\n sigpipe,\n restartable,\n });\n try {\n return runMain(running, init);\n } finally {\n vfs.flush();\n }\n}\n\nfunction hasStreams(module: object): boolean {\n return typeof ownValue<Partial<ProcessFs>>(module, 'FS')?.getStream === 'function';\n}\n\nfunction runStdioOnly(running: RunningModule, init: WasmProcessInitMsg): number {\n if (init.fork) throw new Error(`${init.argv0} cannot resume a fork: it has no filesystem`);\n return runMain(running, init);\n}\n\nfunction runMain(running: RunningModule, init: WasmProcessInitMsg): number {\n try {\n if (init.fork) {\n if (!running.sliccForkChild) throw new Error(`${init.argv0} cannot resume a fork`);\n return running.sliccForkChild({ ...init.fork, pid: init.pid }) ?? 0;\n }\n\n return (running.sliccRunMain ?? running.callMain)(init.args) ?? 0;\n } catch (e) {\n const status = (e as { status?: unknown })?.status;\n if (typeof status !== 'number') throw e;\n return status;\n }\n}\n", "import {\n WASM_PROCESS_ERROR,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_INIT,\n type WasmProcessErrorMsg,\n type WasmProcessExitMsg,\n type WasmProcessInitMsg,\n} from '../kernel/protocol.ts';\nimport type { SabPostLike } from '../realm/sync-sab-bridge.ts';\nimport { runWasmProcess } from './process-runtime.ts';\n\nexport type ProcessRunner = (init: WasmProcessInitMsg, port: SabPostLike) => Promise<number>;\n\nexport function processEntry(\n port: SabPostLike,\n run: ProcessRunner = runWasmProcess\n): (data: unknown) => void {\n return (data) => {\n if ((data as { type?: string } | undefined)?.type !== WASM_PROCESS_INIT) return;\n run(data as WasmProcessInitMsg, port).then(\n (code) => port.postMessage({ type: WASM_PROCESS_EXIT, code } satisfies WasmProcessExitMsg),\n (err) =>\n port.postMessage({\n type: WASM_PROCESS_ERROR,\n message: err instanceof Error ? (err.stack ?? err.message) : String(err),\n } satisfies WasmProcessErrorMsg)\n );\n };\n}\n", "import { processEntry } from './process/process-entry.ts';\n\ninterface WorkerScope {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nconst scope = globalThis as unknown as WorkerScope;\nconst onMessage = processEntry({ postMessage: (message) => scope.postMessage(message) });\nscope.addEventListener('message', (event) => onMessage(event.data));\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["errno", "status", "errno", "status", "EIO", "status", "POLLIN", "POLLOUT", "POLLERR", "POLLHUP", "status", "O_CREAT", "O_EXCL", "O_TRUNC", "O_RDWR", "KILLED_BY_SIGPIPE", "O_CREAT", "O_EXCL", "O_WRONLY", "O_RDWR", "running", "encoder", "failed", "status"]
|
|
7
7
|
}
|