@ai-ecoverse/slicc-kernel 1.6.1 → 1.7.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.
@@ -0,0 +1,7 @@
1
+ {
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-http.ts", "../src/process/process-signals.ts", "../src/process/process-sockets.ts", "../src/process/realm-user.ts", "../src/process/process-runtime.ts", "../src/process/wasi/dylink.ts", "../src/process/wasi/wasi-files.ts", "../src/process/wasi/wasi-abi.ts", "../src/process/wasi/wasi-fds.ts", "../src/process/wasi/wasi-memory.ts", "../src/process/wasi/wasi-poll.ts", "../src/process/wasi/wasi-host.ts", "../src/process/wasi/wasi-imports.ts", "../src/process/wasi/wasi-signals.ts", "../src/process/wasi/wasi-stats.ts", "../src/process/wasi/wasi-threads.ts", "../src/process/wasi/wasix-fork.ts", "../src/process/wasi/wasix-linker.ts", "../src/process/wasi/wasix-process.ts", "../src/process/wasi/wasix-sockets.ts", "../src/process/wasi/wasix-host.ts", "../src/process/wasi/wasm-names.ts", "../src/process/wasi/wasi-runtime.ts", "../src/node-process-worker.ts", "../src/process/process-entry.ts"],
4
+ "sourcesContent": ["import type { ImportedMemory } from '../process/wasi/wasi-module.ts';\nimport type { WasiForkState } from '../process/wasi/wasix-fork.ts';\nimport 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';\nexport const WASM_THREAD_SPAWN = 'wasm-thread-spawn';\nexport const WASM_THREAD_INIT = 'wasm-thread-init';\nexport const WASM_THREAD_EXIT = 'wasm-thread-exit';\nexport const WASM_MAX_THREADS = 256;\nexport const WASM_DEFAULT_THREADS = 64;\n\nexport interface WasmProgram {\n abi?: 'emscripten' | 'wasi';\n glue: string;\n module: WebAssembly.Module;\n memory?: ImportedMemory;\n names?: string;\n imports?: string;\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 wasi?: WasiForkState;\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\nexport interface WasmThread {\n tid: number;\n arg: number;\n memory: WebAssembly.Memory;\n ids: SharedArrayBuffer;\n modules?: Record<string, WebAssembly.Module>;\n}\n\nexport interface WasmThreadSpawnMsg {\n type: typeof WASM_THREAD_SPAWN;\n thread: WasmThread;\n}\n\nexport interface WasmThreadInitMsg extends Omit<WasmProcessInitMsg, 'type' | 'fork' | 'fds'> {\n type: typeof WASM_THREAD_INIT;\n thread: WasmThread;\n}\n\nexport interface WasmThreadExitMsg {\n type: typeof WASM_THREAD_EXIT;\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 mounted?: unknown;\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?.live && 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 && !node.mounted) 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 root?: MemfsRoot;\n rename?(from: string, to: string): void;\n lookupPath?(path: string, opts?: { follow?: boolean; parent?: boolean }): { node: object };\n sliccRename?: true;\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 (Fs.root?.memfs) Fs.root.node_ops = Fs.root.memfs;\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\ntype MemfsRoot = LiveFsNode & { contents?: Record<string, unknown>; memfs?: LiveNodeOps };\n\nexport function liveRoot(Fs: LiveMountFsApi, bridge: SyncFsPosixBridge): void {\n const root = Fs.root;\n const plugin = Fs.filesystems.SLICC_LIVE_FS;\n if (!root || !plugin) return;\n root.mount.opts = { root: '/', bridge };\n root.live = { len: 0, loaded: false, dirty: false, openCount: 0 };\n plugin.mounts.add(root.mount);\n invalidateLiveVfs(Fs, plugin);\n guardRenames(Fs);\n const memfs = root.memfs ?? root.node_ops;\n const live = plugin.node_ops;\n root.memfs = memfs;\n const own = (name: string) => Object.hasOwn(root.contents ?? {}, name);\n root.node_ops = {\n ...memfs,\n lookup: (parent, name) => live.lookup(parent, name),\n mknod: (parent, name, mode, dev) => live.mknod(parent, name, mode, dev),\n unlink: (parent, name) => live.unlink(parent, name),\n rmdir: (parent, name) => (own(name) ? memfs : live).rmdir(parent, name),\n symlink: (parent, name, target) => live.symlink(parent, name, target),\n rename: (node, dir, name) => (node.live ? live : memfs).rename(node, dir, name),\n readdir(node) {\n const names = new Set(memfs.readdir(node));\n for (const name of live.readdir(node)) names.add(name);\n return [...names];\n },\n };\n}\n\nfunction crosses(Fs: LiveMountFsApi, from: string, to: string): boolean {\n const parentOf = (path: string) =>\n Fs.lookupPath?.(path, { parent: true }).node as LiveFsNode | undefined;\n const name = from.replace(/\\/+$/, '').split('/').pop() ?? '';\n try {\n const fromDir = parentOf(from);\n const node = fromDir && Fs.lookupNode?.(fromDir, name);\n const dir = parentOf(to);\n return !!node && !!dir && !!node.live !== !!dir.live;\n } catch {\n return false;\n }\n}\n\nfunction guardRenames(Fs: LiveMountFsApi): void {\n const rename = Fs.rename?.bind(Fs);\n if (!rename || Fs.sliccRename) return;\n Fs.sliccRename = true;\n Fs.rename = (from, to) => {\n if (crosses(Fs, from, to)) throw new Fs.ErrnoError(ERRNO_BY_CODE.EXDEV);\n rename(from, to);\n };\n}\n", "import {\n flushLiveVfs,\n invalidateLiveVfs,\n type LiveMountFsApi,\n liveRoot,\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(\n bridge: SyncFsPosixBridge,\n warn: (message: string) => void\n): string[] | undefined {\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 undefined;\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 dirs = topLevelDirs(bridge, warn);\n const { plugin, mounted } = mountLiveVfsDirs(Fs, bridge, dirs ?? [], warn);\n if (dirs) liveRoot(Fs, bridge);\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?: (stream: ProcessStream) => unknown;\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\nconst EBADF = 8;\n\ntype AsyncImport = ((...args: number[]) => unknown) & { isAsync?: boolean };\n\nfunction persistsItself(stream: ProcessStream): boolean {\n const type = stream.node.mount?.type as { syncfs?: unknown } | undefined;\n return typeof type?.syncfs === 'function';\n}\n\nexport function syncFsync(imports: WebAssembly.Imports, fs: () => ProcessFs | undefined): void {\n for (const namespace of Object.values(imports)) {\n const original = namespace?.fd_sync as AsyncImport | undefined;\n if (typeof original !== 'function' || !original.isAsync) continue;\n namespace.fd_sync = (fd: number) => {\n const stream = fs()?.getStream(fd);\n if (!stream) return EBADF;\n if (persistsItself(stream)) return original(fd);\n try {\n const result = stream.stream_ops.fsync?.(stream);\n return typeof result === 'number' ? result : 0;\n } catch (err) {\n const { errno, code } = err as { errno?: unknown; code?: unknown };\n return typeof errno === 'number' ? errno : wasiErrno(String(code));\n }\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 syncFsync,\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 syncFsync(imports, () => ownValue<ProcessFs>(module, 'FS'));\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", "const MEM_INFO = 1;\nconst NEEDED = 2;\nconst RUNTIME_PATH = 5;\n\nexport interface DylinkInfo {\n memorySize: number;\n\n memoryAlign: number;\n\n tableSize: number;\n tableAlign: number;\n\n needed: string[];\n\n runtimePath: string[];\n}\n\nexport function dylinkInfo(module: WebAssembly.Module): DylinkInfo | undefined {\n const [section] = WebAssembly.Module.customSections(module, 'dylink.0');\n if (!section) return undefined;\n const bytes = new Uint8Array(section);\n let at = 0;\n const uleb = (): number => {\n let value = 0;\n let shift = 0;\n for (;;) {\n const b = bytes[at++];\n value += (b & 0x7f) * 2 ** shift;\n if (!(b & 0x80)) return value;\n shift += 7;\n }\n };\n const string = (): string => {\n const len = uleb();\n const s = new TextDecoder().decode(bytes.subarray(at, at + len));\n at += len;\n return s;\n };\n const info: DylinkInfo = {\n memorySize: 0,\n memoryAlign: 0,\n tableSize: 0,\n tableAlign: 0,\n needed: [],\n runtimePath: [],\n };\n while (at < bytes.length) {\n const kind = bytes[at++];\n const len = uleb();\n const end = at + len;\n if (kind === MEM_INFO) {\n info.memorySize = uleb();\n info.memoryAlign = uleb();\n info.tableSize = uleb();\n info.tableAlign = uleb();\n } else if (kind === NEEDED) {\n for (let n = uleb(); n > 0; n--) info.needed.push(string());\n } else if (kind === RUNTIME_PATH) {\n for (let n = uleb(); n > 0; n--) info.runtimePath.push(string());\n }\n at = end;\n }\n return info;\n}\n", "import type { DeviceAccess, KernelFdKind } from '../../kernel/fd-table.ts';\nimport type { SyncFsBridgeStat, SyncFsPosixBridge } from '../../realm/sync-fs-wire.ts';\n\nexport class WasiError extends Error {\n readonly code: string;\n constructor(code: string) {\n super(code);\n this.code = code;\n }\n}\n\nexport class FileBuffer {\n private data: Uint8Array | undefined;\n private length = 0;\n private dirty = false;\n\n private orphaned = false;\n\n opens = 0;\n\n private readonly fs: SyncFsPosixBridge;\n path: string;\n constructor(\n fs: SyncFsPosixBridge,\n path: string,\n\n empty: boolean\n ) {\n this.fs = fs;\n this.path = path;\n if (empty) {\n this.data = new Uint8Array(0);\n this.dirty = true;\n }\n }\n\n load(): Uint8Array {\n if (!this.data) {\n this.data = this.fs.readFile(this.path);\n this.length = this.data.length;\n }\n return this.data;\n }\n\n size(): number {\n this.load();\n return this.length;\n }\n\n pread(max: number, at: number): Uint8Array {\n const bytes = this.load();\n const n = Math.max(0, Math.min(max, this.length - at));\n return bytes.subarray(at, at + n);\n }\n\n pwrite(bytes: Uint8Array, at: number): number {\n this.load();\n const end = at + bytes.length;\n this.ensure(end);\n const buf = this.data as Uint8Array;\n if (at > this.length) buf.fill(0, this.length, at);\n buf.set(bytes, at);\n this.length = Math.max(this.length, end);\n this.dirty = true;\n return bytes.length;\n }\n\n truncate(size: number): void {\n this.load();\n this.ensure(size);\n if (size > this.length) (this.data as Uint8Array).fill(0, this.length, size);\n this.length = size;\n this.dirty = true;\n }\n\n private ensure(need: number): void {\n const cur = this.data as Uint8Array;\n if (cur.length >= need) return;\n const grown = new Uint8Array(Math.max(need, cur.length * 2, 4096));\n grown.set(cur.subarray(0, this.length));\n this.data = grown;\n }\n\n orphan(): void {\n this.orphaned = true;\n }\n\n isOrphan(): boolean {\n return this.orphaned;\n }\n\n isDirty(): boolean {\n return this.dirty;\n }\n\n contents(): Uint8Array {\n return this.load().slice(0, this.length);\n }\n\n flush(): void {\n if (this.orphaned || !this.dirty || !this.data) return;\n this.fs.writeFile(this.path, this.data.slice(0, this.length));\n this.dirty = false;\n }\n}\n\nexport class LocalFile {\n offset = 0;\n refs = 1;\n\n readonly buffer: FileBuffer;\n readonly readable: boolean;\n readonly writable: boolean;\n append: boolean;\n constructor(buffer: FileBuffer, readable: boolean, writable: boolean, append: boolean) {\n this.buffer = buffer;\n this.readable = readable;\n this.writable = writable;\n this.append = append;\n }\n\n get path(): string {\n return this.buffer.path;\n }\n\n size(): number {\n return this.buffer.size();\n }\n\n pread(max: number, at: number): Uint8Array {\n return this.buffer.pread(max, at);\n }\n\n read(max: number): Uint8Array {\n const out = this.buffer.pread(max, this.offset);\n this.offset += out.length;\n return out;\n }\n\n pwrite(bytes: Uint8Array, at: number): number {\n return this.buffer.pwrite(bytes, at);\n }\n\n write(bytes: Uint8Array): number {\n if (this.append) this.offset = this.buffer.size();\n const n = this.buffer.pwrite(bytes, this.offset);\n this.offset += n;\n return n;\n }\n\n truncate(size: number): void {\n this.buffer.truncate(size);\n }\n\n flush(): void {\n this.buffer.flush();\n }\n}\n\nexport interface DirListing {\n names: string[];\n stats: Map<string, SyncFsBridgeStat | null>;\n}\n\nexport type WasiEntry =\n | {\n type: 'kernel';\n\n kind?: KernelFdKind;\n nonblock: boolean;\n append: boolean;\n }\n | { type: 'file'; file: LocalFile }\n | {\n type: 'dir';\n path: string;\n\n preopen?: string;\n listing?: DirListing;\n }\n | {\n type: 'device';\n device: 'null' | 'zero' | 'urandom';\n\n access?: DeviceAccess;\n };\n\nexport function normalize(path: string): string {\n const out: string[] = [];\n for (const seg of path.split('/')) {\n if (seg === '' || seg === '.') continue;\n if (seg === '..') out.pop();\n else out.push(seg);\n }\n return `/${out.join('/')}`;\n}\n\nexport function resolveUnder(dir: string, path: string): string {\n return normalize(path.startsWith('/') ? path : `${dir}/${path}`);\n}\n\nexport function pathInode(path: string): bigint {\n let h = 0xcbf29ce484222325n;\n for (let i = 0; i < path.length; i++) {\n h ^= BigInt(path.charCodeAt(i));\n h = (h * 0x100000001b3n) & 0xffffffffffffffffn;\n }\n return h;\n}\n\nexport function cachingBridge(\n bridge: SyncFsPosixBridge\n): SyncFsPosixBridge & { invalidate(): void } {\n const stats = new Map<string, SyncFsBridgeStat | Error>();\n const lstats = new Map<string, SyncFsBridgeStat | Error>();\n const cached = (map: typeof stats, path: string, get: () => SyncFsBridgeStat) => {\n let hit = map.get(path);\n if (hit === undefined) {\n try {\n hit = get();\n } catch (e) {\n hit = e as Error;\n }\n map.set(path, hit);\n }\n if (hit instanceof Error) throw hit;\n return hit;\n };\n const invalidate = () => {\n stats.clear();\n lstats.clear();\n };\n\n const mutating = <T>(op: () => T): T => {\n try {\n return op();\n } finally {\n invalidate();\n }\n };\n return {\n readFile: (p) => bridge.readFile(p),\n readdir: (p) => bridge.readdir(p),\n\n readdirStat: (p: string) => {\n const list = bridge.readdirStat(p);\n const base = p === '/' ? '' : p;\n for (const [name, st] of list) {\n if (!st) continue;\n lstats.set(`${base}/${name}`, st);\n if (!st.isSymbolicLink) stats.set(`${base}/${name}`, st);\n }\n return list;\n },\n readlink: (p) => bridge.readlink(p),\n stat: (p) => cached(stats, p, () => bridge.stat(p)),\n lstat: (p) => cached(lstats, p, () => bridge.lstat(p)),\n exists: (p) => {\n try {\n cached(stats, p, () => bridge.stat(p));\n return true;\n } catch {\n return false;\n }\n },\n writeFile: (p, bytes) => mutating(() => bridge.writeFile(p, bytes)),\n mkdir: (p) => mutating(() => bridge.mkdir(p)),\n rm: (p) => mutating(() => bridge.rm(p)),\n rename: (from, to) => mutating(() => bridge.rename(from, to)),\n unlink: (p) => mutating(() => bridge.unlink(p)),\n rmdir: (p) => mutating(() => bridge.rmdir(p)),\n symlink: (target, link) => mutating(() => bridge.symlink(target, link)),\n chmod: (p, mode) => mutating(() => bridge.chmod(p, mode)),\n utimes: (p, a, m) => mutating(() => bridge.utimes(p, a, m)),\n invalidate,\n };\n}\n", "export const E = {\n SUCCESS: 0,\n '2BIG': 1,\n ACCES: 2,\n ADDRINUSE: 3,\n ADDRNOTAVAIL: 4,\n AFNOSUPPORT: 5,\n AGAIN: 6,\n ALREADY: 7,\n BADF: 8,\n BUSY: 10,\n CHILD: 12,\n CONNREFUSED: 14,\n CONNRESET: 15,\n EXIST: 20,\n FAULT: 21,\n FBIG: 22,\n INPROGRESS: 26,\n INTR: 27,\n INVAL: 28,\n IO: 29,\n ISCONN: 30,\n ISDIR: 31,\n LOOP: 32,\n MFILE: 33,\n NAMETOOLONG: 37,\n NETUNREACH: 40,\n NOENT: 44,\n NOEXEC: 45,\n NOMEM: 48,\n NOSPC: 51,\n NOSYS: 52,\n NOTCONN: 53,\n NOTDIR: 54,\n NOTEMPTY: 55,\n NOTSOCK: 57,\n NOTSUP: 58,\n NOTTY: 59,\n NXIO: 60,\n PERM: 63,\n PIPE: 64,\n PROTONOSUPPORT: 66,\n RANGE: 68,\n ROFS: 69,\n SPIPE: 70,\n SRCH: 71,\n TIMEDOUT: 73,\n XDEV: 75,\n NOTCAPABLE: 76,\n} as const;\n\nexport function wasiErrnoOf(code: string | undefined): number {\n if (!code) return E.IO;\n const name = code.startsWith('E') ? code.slice(1) : code;\n if (name === 'OPNOTSUPP') return E.NOTSUP;\n if (name === 'WOULDBLOCK') return E.AGAIN;\n return (E as Record<string, number>)[name] ?? E.IO;\n}\n\nexport const FILETYPE = {\n UNKNOWN: 0,\n BLOCK_DEVICE: 1,\n CHARACTER_DEVICE: 2,\n DIRECTORY: 3,\n REGULAR_FILE: 4,\n SOCKET_DGRAM: 5,\n SOCKET_STREAM: 6,\n SYMBOLIC_LINK: 7,\n} as const;\n\nexport const RIGHTS = {\n FD_DATASYNC: 1n << 0n,\n FD_READ: 1n << 1n,\n FD_SEEK: 1n << 2n,\n FD_FDSTAT_SET_FLAGS: 1n << 3n,\n FD_SYNC: 1n << 4n,\n FD_TELL: 1n << 5n,\n FD_WRITE: 1n << 6n,\n\n ALL: (1n << 30n) - 1n,\n} as const;\n\nexport const OFLAGS = { CREAT: 1, DIRECTORY: 2, EXCL: 4, TRUNC: 8 } as const;\nexport const FDFLAGS = { APPEND: 1, DSYNC: 2, NONBLOCK: 4, RSYNC: 8, SYNC: 16 } as const;\nexport const LOOKUP_SYMLINK_FOLLOW = 1;\nexport const WHENCE = { SET: 0, CUR: 1, END: 2 } as const;\nexport const CLOCK = { REALTIME: 0, MONOTONIC: 1, PROCESS_CPUTIME: 2, THREAD_CPUTIME: 3 } as const;\nexport const FSTFLAGS = { ATIM: 1, ATIM_NOW: 2, MTIM: 4, MTIM_NOW: 8 } as const;\nexport const EVENTTYPE = { CLOCK: 0, FD_READ: 1, FD_WRITE: 2 } as const;\nexport const SUBCLOCK_ABSTIME = 1;\n\nexport const EVENT_FD_READWRITE_HANGUP = 1;\n\nexport const RIFLAGS = { PEEK: 1, WAITALL: 2 } as const;\n\nexport const SDFLAGS = { RD: 1, WR: 2 } as const;\nexport const PREOPENTYPE_DIR = 0;\n\nexport const SIZE = {\n FILESTAT: 64,\n FDSTAT: 24,\n DIRENT: 24,\n SUBSCRIPTION: 48,\n EVENT: 32,\n} as const;\n\nexport const WASI_SIGNAL_TO_POSIX: Readonly<Record<number, number>> = Object.fromEntries(\n Array.from({ length: 30 }, (_, i) => [i + 1, i + 1 < 16 ? i + 1 : i + 2])\n);\n", "import type { DeviceAccess, DeviceMeta, HeldMeta, KernelFdKind } from '../../kernel/fd-table.ts';\nimport type { FdInfo, WasmSyscall } from '../../kernel/process.ts';\nimport type { SyncFsBridgeStat, SyncFsPosixBridge } from '../../realm/sync-fs-wire.ts';\nimport type { ProcessSys } from '../kernel-streams.ts';\nimport { FDFLAGS, OFLAGS, RIGHTS } from './wasi-abi.ts';\nimport {\n FileBuffer,\n LocalFile,\n normalize,\n resolveUnder,\n type WasiEntry,\n WasiError,\n} from './wasi-files.ts';\n\nconst SYNTHETIC_DIRS = ['usr', 'bin'];\n\nexport interface WasiKernel {\n sys: ProcessSys;\n\n call(req: WasmSyscall): unknown;\n}\n\ntype Device = 'null' | 'zero' | 'urandom';\n\nconst O_NONBLOCK = 0o4000;\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\n\nexport type WasiForkFd =\n | { fd: number; type: 'kernel'; nonblock: boolean; append: boolean }\n | { fd: number; type: 'dir'; path: string; preopen?: string }\n | { fd: number; type: 'device'; device: 'null' | 'zero' | 'urandom'; access?: DeviceAccess };\n\nconst DEVICES: Readonly<Record<string, Device>> = {\n '/dev/null': 'null',\n '/dev/zero': 'zero',\n '/dev/urandom': 'urandom',\n '/dev/random': 'urandom',\n};\n\nfunction stdioAlias(path: string): number | undefined {\n const m = /^\\/dev\\/(?:(stdin)|(stdout)|(stderr)|fd\\/(\\d+))$/.exec(path);\n if (!m) return undefined;\n return m[1] ? 0 : m[2] ? 1 : m[3] ? 2 : Number(m[4]);\n}\n\nexport function deviceOf(path: string): Device | undefined {\n return DEVICES[path];\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(root === '/' ? '/' : `${root}/`);\n}\n\nexport class WasiFds {\n private readonly table = new Map<number, WasiEntry>();\n\n private readonly buffers = new Map<string, FileBuffer>();\n\n private readonly kernel: WasiKernel;\n private readonly fs: SyncFsPosixBridge;\n constructor(kernel: WasiKernel, fs: SyncFsPosixBridge) {\n this.kernel = kernel;\n this.fs = fs;\n }\n\n setup(\n cwd: string,\n inherited: ReadonlyArray<{\n fd: number;\n kind?: KernelFdKind;\n flags?: number;\n device?: DeviceMeta;\n }>\n ): void {\n for (const fd of [0, 1, 2]) this.table.set(fd, kernelEntry());\n const preopens = this.preopens(cwd);\n const top = 3 + preopens.length;\n for (const { fd, kind, flags, device } of inherited) {\n let at = fd;\n if (fd < top) {\n at = this.kernel.call({ op: 'fd-dup', fd, min: top }) as number;\n this.kernel.sys.close(fd);\n }\n if (device) {\n this.table.set(at, deviceEntry(device));\n continue;\n }\n\n const nonblock = ((flags ?? 0) & O_NONBLOCK) !== 0;\n this.table.set(at, { ...kernelEntry(), nonblock, ...(kind ? { kind } : {}) });\n }\n preopens.forEach((entry, i) => {\n this.kernel.call({ op: 'fd-reserve', fd: 3 + i, meta: metaOf(entry) as HeldMeta });\n this.table.set(3 + i, entry);\n });\n }\n\n private preopens(cwd: string): WasiEntry[] {\n const out: WasiEntry[] = [{ type: 'dir', path: normalize(cwd), preopen: '.' }];\n let names: string[] = [];\n try {\n names = this.fs.readdir('/');\n } catch {\n return out;\n }\n\n for (const name of [...new Set([...names, 'dev', ...SYNTHETIC_DIRS])].sort()) {\n const path = `/${name}`;\n if (path === '/dev') {\n out.push({ type: 'dir', path, preopen: path });\n continue;\n }\n try {\n if (this.fs.stat(path).isDirectory) out.push({ type: 'dir', path, preopen: path });\n } catch {}\n }\n return out;\n }\n\n find(fd: number): WasiEntry | undefined {\n if (!this.shared) return this.table.get(fd);\n this.sync();\n return this.table.get(fd) ?? this.fetch(fd);\n }\n\n private shared: Int32Array | undefined;\n private seen = 0;\n\n get isShared(): boolean {\n return this.shared !== undefined;\n }\n\n share(ids: Int32Array, fresh: boolean): void {\n if (!fresh) {\n this.promoteFiles();\n for (const fd of this.cloexec) this.kernel.call({ op: 'fd-cloexec', fd, on: true });\n for (const [fd, e] of this.table) {\n if (e.type === 'kernel' && (e.nonblock || e.append)) this.publishFlags(fd, e);\n }\n } else {\n this.table.clear();\n this.cloexec.clear();\n }\n this.shared = ids;\n this.seen = Atomics.load(ids, GEN);\n }\n\n private sync(): void {\n const gen = Atomics.load(this.shared as Int32Array, GEN);\n if (gen === this.seen) return;\n this.table.clear();\n this.cloexec.clear();\n this.seen = gen;\n }\n\n private bump(): void {\n if (!this.shared) return;\n const gen = Atomics.add(this.shared, GEN, 1) + 1;\n\n if (gen - 1 === this.seen) this.seen = gen;\n }\n\n private fetch(fd: number): WasiEntry | undefined {\n let info: FdInfo;\n try {\n info = this.kernel.call({ op: 'fd-info', fd }) as FdInfo;\n } catch {\n return undefined;\n }\n const e = entryOf(info);\n if (!e) return undefined;\n this.table.set(fd, e);\n if (info.cloexec) this.cloexec.add(fd);\n return e;\n }\n\n private listed(): Array<[number, WasiEntry, boolean]> {\n const out: Array<[number, WasiEntry, boolean]> = [];\n for (const info of this.kernel.call({ op: 'fd-list' }) as Array<FdInfo & { fd: number }>) {\n const e = entryOf(info);\n if (e) out.push([info.fd, e, info.cloexec === true]);\n }\n return out;\n }\n\n private publishFlags(fd: number, e: { nonblock: boolean; append: boolean }): void {\n const flags = (e.nonblock ? O_NONBLOCK : 0) | (e.append ? O_APPEND : 0);\n this.kernel.call({ op: 'fd-setfl', fd, flags });\n }\n\n setFlags(fd: number, nonblock: boolean, append: boolean): void {\n const e = this.get(fd);\n if (e.type === 'kernel') {\n e.nonblock = nonblock;\n e.append = append;\n if (this.shared) {\n this.publishFlags(fd, e);\n this.bump();\n }\n } else if (e.type === 'file') e.file.append = append;\n }\n\n setCloexec(fd: number, on: boolean): void {\n this.get(fd);\n if (on) this.cloexec.add(fd);\n else this.cloexec.delete(fd);\n if (this.shared) {\n this.kernel.call({ op: 'fd-cloexec', fd, on });\n this.bump();\n }\n }\n\n cwd(): string | undefined {\n const dot = this.find(3);\n return dot?.type === 'dir' && dot.preopen === '.' ? dot.path : undefined;\n }\n\n terminals(): number[] {\n const fds = this.shared\n ? (this.kernel.call({ op: 'fd-list' }) as Array<FdInfo & { fd: number }>)\n .filter((info) => info.tty)\n .map((info) => info.fd)\n : [...this.table]\n .filter(([, e]) => e.type === 'kernel' && e.kind === 'tty')\n .map(([fd]) => fd);\n return fds.sort((a, b) => a - b);\n }\n\n sockets(): number[] {\n return [...this.table]\n .filter(([, e]) => e.type === 'kernel' && e.kind === 'socket')\n .map(([fd]) => fd)\n .sort((a, b) => a - b);\n }\n\n adopt(fd: number, kind: KernelFdKind, nonblock: boolean): void {\n this.table.set(fd, { type: 'kernel', kind, nonblock, append: false });\n if (this.shared && nonblock) this.publishFlags(fd, { nonblock, append: false });\n this.bump();\n }\n\n get(fd: number): WasiEntry {\n const e = this.find(fd);\n if (!e) throw new WasiError('EBADF');\n return e;\n }\n\n preopen(fd: number): Extract<WasiEntry, { type: 'dir' }> & { preopen: string } {\n const e = this.find(fd);\n if (e?.type !== 'dir' || e.preopen === undefined) throw new WasiError('EBADF');\n return e as Extract<WasiEntry, { type: 'dir' }> & { preopen: string };\n }\n\n dir(fd: number): Extract<WasiEntry, { type: 'dir' }> {\n const e = this.get(fd);\n if (e.type !== 'dir') throw new WasiError('ENOTDIR');\n return e;\n }\n\n private install(e: WasiEntry, min = 3): number {\n const meta = metaOf(e);\n const fd = this.kernel.call({\n op: 'fd-reserve',\n ...(min > 3 ? { min } : {}),\n ...(meta ? { meta } : {}),\n }) as number;\n this.table.set(fd, e);\n this.bump();\n return fd;\n }\n\n readonly cloexec = new Set<number>();\n\n implicitCloexec = false;\n\n dup(fd: number, min: number, cloexec: boolean): number {\n const e = this.get(fd);\n let at: number;\n if (e.type === 'kernel') {\n at = this.kernel.call({ op: 'fd-dup', fd, min: Math.max(3, min) }) as number;\n this.table.set(at, { ...e });\n } else {\n if (e.type === 'file') e.file.refs++;\n at = this.install(e.type === 'file' ? e : { ...e }, min);\n }\n if (cloexec) this.setCloexec(at, true);\n this.bump();\n return at;\n }\n\n pipe(): [number, number] {\n const [r, w] = this.kernel.sys.pipe();\n this.table.set(r, { type: 'kernel', kind: 'stream', nonblock: false, append: false });\n this.table.set(w, { type: 'kernel', kind: 'stream', nonblock: false, append: false });\n this.bump();\n return [r, w];\n }\n\n chdir(path: string): void {\n const dot = this.find(3);\n if (dot?.type !== 'dir' || dot.preopen !== '.') return;\n dot.path = path;\n\n this.kernel.call({ op: 'fd-meta', fd: 3, meta: { dir: path, preopen: '.' } });\n this.bump();\n }\n\n promoteFiles(): void {\n const promoted = new Map<LocalFile, number>();\n\n const handed = new Set<FileBuffer>();\n for (const [fd, e] of [...this.table]) {\n if (e.type !== 'file') continue;\n const first = promoted.get(e.file);\n if (first !== undefined) {\n this.kernel.call({ op: 'fd-promote', fd, share: first });\n } else {\n this.kernel.call(promoteRequest(fd, e.file, handed));\n handed.add(e.file.buffer);\n promoted.set(e.file, fd);\n }\n this.table.set(fd, { type: 'kernel', kind: 'file', nonblock: false, append: e.file.append });\n }\n for (const file of promoted.keys()) {\n if (--file.buffer.opens <= 0) this.buffers.delete(file.path);\n }\n }\n\n snapshot(): WasiForkFd[] {\n const out: WasiForkFd[] = [];\n\n if (this.shared) return out;\n for (const [fd, e] of this.table) {\n if (e.type === 'kernel')\n out.push({ fd, type: 'kernel', nonblock: e.nonblock, append: e.append });\n else if (e.type === 'dir')\n out.push({ fd, type: 'dir', path: e.path, ...(e.preopen ? { preopen: e.preopen } : {}) });\n else if (e.type === 'device') out.push({ fd, ...deviceEntry(e) });\n }\n return out;\n }\n\n restore(fds: readonly WasiForkFd[], cloexec: readonly number[]): void {\n this.table.clear();\n for (const f of fds) {\n if (f.type === 'kernel')\n this.table.set(f.fd, { type: 'kernel', nonblock: f.nonblock, append: f.append });\n else if (f.type === 'dir')\n this.table.set(f.fd, {\n type: 'dir',\n path: f.path,\n ...(f.preopen ? { preopen: f.preopen } : {}),\n });\n else this.table.set(f.fd, deviceEntry(f));\n }\n for (const fd of cloexec) this.cloexec.add(fd);\n }\n\n inheritable(): Map<number, number> {\n const out = new Map<number, number>();\n const all = this.shared\n ? this.listed()\n : [...this.table].map(([fd, e]): [number, WasiEntry, boolean] => [\n fd,\n e,\n this.cloexec.has(fd),\n ]);\n for (const [fd, e, cloexec] of all) {\n if (e.type !== 'kernel' || cloexec) continue;\n if (this.implicitCloexec && fd > 2) continue;\n out.set(fd, fd);\n }\n return out;\n }\n\n close(fd: number): void {\n const e = this.get(fd);\n this.table.delete(fd);\n this.cloexec.delete(fd);\n this.kernel.sys.close(fd);\n this.release(e);\n this.bump();\n }\n\n renumber(from: number, to: number, keep = false): void {\n const e = this.get(from);\n\n const old = keep ? this.find(to) : this.get(to);\n if (from === to) return;\n this.kernel.call({ op: 'fd-renumber', from, to, ...(keep ? { keep } : {}) });\n this.cloexec.delete(to);\n if (keep) {\n if (e.type === 'file') e.file.refs++;\n this.table.set(to, e.type === 'file' ? e : { ...e });\n } else {\n this.table.delete(from);\n this.table.set(to, e);\n if (this.cloexec.delete(from)) this.cloexec.add(to);\n }\n if (old) this.release(old);\n this.bump();\n }\n\n private release(e: WasiEntry): void {\n if (e.type !== 'file' || --e.file.refs > 0) return;\n const { buffer } = e.file;\n buffer.flush();\n if (--buffer.opens === 0 && this.buffers.get(buffer.path) === buffer) {\n this.buffers.delete(buffer.path);\n }\n }\n\n kind(fd: number, e: Extract<WasiEntry, { type: 'kernel' }>): KernelFdKind {\n if (!e.kind) {\n const info = this.kernel.call({ op: 'fd-info', fd }) as {\n tty?: boolean;\n kind?: KernelFdKind;\n };\n e.kind = info.kind ?? (info.tty ? 'tty' : 'stream');\n }\n return e.kind;\n }\n\n flushAll(): void {\n for (const buffer of this.buffers.values()) buffer.flush();\n }\n\n flushPath(path: string): void {\n for (const [p, buffer] of this.buffers) if (within(p, path)) buffer.flush();\n\n if (this.shared) this.kernel.call({ op: 'fd-path-flush', path });\n }\n\n unlinking(path: string): void {\n this.buffers.get(path)?.load();\n if (this.shared) this.kernel.call({ op: 'fd-path-unlinking', path });\n }\n\n unlinked(path: string): void {\n if (this.shared) this.kernel.call({ op: 'fd-path-unlinked', path });\n const buffer = this.buffers.get(path);\n if (!buffer) return;\n buffer.orphan();\n this.buffers.delete(path);\n }\n\n renamed(from: string, to: string): void {\n if (from === to) return;\n if (this.shared) this.kernel.call({ op: 'fd-path-renamed', from, to });\n const moved: Array<[string, FileBuffer]> = [];\n for (const [p, buffer] of this.buffers) {\n if (within(p, from)) moved.push([p, buffer]);\n else if (within(p, to)) {\n buffer.orphan();\n this.buffers.delete(p);\n }\n }\n for (const [p, buffer] of moved) {\n this.buffers.delete(p);\n buffer.path = to + p.slice(from.length);\n this.buffers.set(buffer.path, buffer);\n }\n }\n\n resolve(dirfd: number, path: string): string {\n if (path.startsWith('/')) return normalize(path);\n return resolveUnder(this.dir(dirfd).path, path);\n }\n\n open(path: string, oflags: number, rights: bigint, fdflags: number): number {\n const device = deviceOf(path);\n if (device) return this.install({ type: 'device', device });\n\n if (path === '/dev/tty' || /^\\/dev\\/tty\\d+$/.test(path)) {\n const fd = this.kernel.sys.openTty?.(path === '/dev/tty' ? undefined : path);\n if (fd === undefined) throw new WasiError('ENXIO');\n this.table.set(fd, { ...kernelEntry(), kind: 'tty' });\n this.bump();\n return fd;\n }\n const alias = stdioAlias(path);\n if (alias !== undefined) return this.reopen(alias);\n const s = this.statOrMissing(path);\n if (s && oflags & OFLAGS.CREAT && oflags & OFLAGS.EXCL) throw new WasiError('EEXIST');\n if (oflags & OFLAGS.DIRECTORY && !s?.isDirectory) {\n throw new WasiError(s ? 'ENOTDIR' : 'ENOENT');\n }\n if (s?.isDirectory) return this.install({ type: 'dir', path });\n if (!s && !(oflags & OFLAGS.CREAT)) throw new WasiError('ENOENT');\n if (this.shared) return this.kernelFile(path, s, oflags, rights, fdflags);\n return this.install({ type: 'file', file: this.file(path, s, oflags, rights, fdflags) });\n }\n\n private file(\n path: string,\n existing: SyncFsBridgeStat | undefined,\n oflags: number,\n rights: bigint,\n fdflags: number\n ): LocalFile {\n const writable =\n (rights & RIGHTS.FD_WRITE) !== 0n || (oflags & (OFLAGS.CREAT | OFLAGS.TRUNC)) !== 0;\n const readable = (rights & RIGHTS.FD_READ) !== 0n || !writable;\n let buffer = this.buffers.get(path);\n if (buffer) {\n if (oflags & OFLAGS.TRUNC) buffer.truncate(0);\n } else {\n if (!existing) this.fs.writeFile(path, new Uint8Array(0));\n buffer = new FileBuffer(this.fs, path, !existing || (oflags & OFLAGS.TRUNC) !== 0);\n this.buffers.set(path, buffer);\n }\n buffer.opens++;\n return new LocalFile(buffer, readable, writable, (fdflags & FDFLAGS.APPEND) !== 0);\n }\n\n private kernelFile(\n path: string,\n existing: SyncFsBridgeStat | undefined,\n oflags: number,\n rights: bigint,\n fdflags: number\n ): number {\n const writable =\n (rights & RIGHTS.FD_WRITE) !== 0n || (oflags & (OFLAGS.CREAT | OFLAGS.TRUNC)) !== 0;\n const readable = (rights & RIGHTS.FD_READ) !== 0n || !writable;\n const append = (fdflags & FDFLAGS.APPEND) !== 0;\n const flags = (writable ? (readable ? O_RDWR : O_WRONLY) : 0) | (append ? O_APPEND : 0);\n\n if (!existing) this.fs.writeFile(path, new Uint8Array(0));\n\n const truncate = !existing || (oflags & OFLAGS.TRUNC) !== 0;\n const fd = this.kernel.sys.openVfs(path, flags, 0, truncate ? { truncate } : {});\n this.table.set(fd, { type: 'kernel', kind: 'file', nonblock: false, append });\n if (append) this.publishFlags(fd, { nonblock: false, append });\n this.bump();\n return fd;\n }\n\n private statOrMissing(path: string): SyncFsBridgeStat | undefined {\n try {\n return this.fs.stat(path);\n } catch (e) {\n if ((e as { code?: string }).code === 'ENOENT') return undefined;\n throw e;\n }\n }\n\n private reopen(fd: number): number {\n const e = this.get(fd);\n if (e.type === 'kernel') {\n const at = this.kernel.call({ op: 'fd-dup', fd }) as number;\n this.table.set(at, { ...e });\n this.bump();\n return at;\n }\n if (e.type === 'file') e.file.refs++;\n return this.install(e.type === 'file' ? e : { ...e });\n }\n}\n\nfunction kernelEntry(): Extract<WasiEntry, { type: 'kernel' }> {\n return { type: 'kernel', nonblock: false, append: false };\n}\n\nconst GEN = 2;\n\nfunction deviceEntry(meta: DeviceMeta): Extract<WasiEntry, { type: 'device' }> {\n return { type: 'device', device: meta.device, ...(meta.access ? { access: meta.access } : {}) };\n}\n\nfunction metaOf(e: WasiEntry): HeldMeta | undefined {\n if (e.type === 'dir') return { dir: e.path, ...(e.preopen ? { preopen: e.preopen } : {}) };\n if (e.type === 'device') return { device: e.device, ...(e.access ? { access: e.access } : {}) };\n return undefined;\n}\n\nfunction entryOf(info: FdInfo): WasiEntry | undefined {\n if (info.meta && 'dir' in info.meta) {\n return {\n type: 'dir',\n path: info.meta.dir,\n ...(info.meta.preopen ? { preopen: info.meta.preopen } : {}),\n };\n }\n if (info.meta && 'device' in info.meta) return deviceEntry(info.meta);\n if (info.kind === 'held') return undefined;\n return {\n type: 'kernel',\n kind: info.kind,\n nonblock: ((info.flags ?? 0) & O_NONBLOCK) !== 0,\n append: ((info.flags ?? 0) & O_APPEND) !== 0,\n };\n}\n\nfunction promoteRequest(\n fd: number,\n f: LocalFile,\n handed: ReadonlySet<FileBuffer>\n): Extract<WasmSyscall, { op: 'fd-promote' }> {\n const orphan = f.buffer.isOrphan();\n const joins = !orphan && handed.has(f.buffer);\n return {\n op: 'fd-promote',\n fd,\n path: f.path,\n flags: (f.writable ? (f.readable ? O_RDWR : O_WRONLY) : 0) | (f.append ? O_APPEND : 0),\n position: f.offset,\n ...(joins ? {} : { contents: f.buffer.contents() }),\n ...(orphan ? { orphan: true } : {}),\n\n ...(!joins && f.buffer.isDirty() ? { dirty: true } : {}),\n };\n}\n", "const decoder = new TextDecoder();\n\nexport class WasiMemory {\n private memory: WebAssembly.Memory | undefined;\n\n bind(memory: WebAssembly.Memory): void {\n this.memory = memory;\n }\n\n private buffer(): ArrayBuffer {\n if (!this.memory) throw new Error('WASI: no memory bound');\n return this.memory.buffer;\n }\n\n view(): DataView {\n return new DataView(this.buffer());\n }\n\n bytes(ptr: number, len: number): Uint8Array {\n return new Uint8Array(this.buffer(), ptr, len);\n }\n\n string(ptr: number, len: number): string {\n return decoder.decode(this.bytes(ptr, len).slice());\n }\n\n cString(ptr: number): string {\n const bytes = new Uint8Array(this.buffer());\n let end = ptr;\n while (end < bytes.length && bytes[end] !== 0) end++;\n return decoder.decode(bytes.slice(ptr, end));\n }\n\n size(): number {\n return this.buffer().byteLength;\n }\n\n iovecs(ptr: number, count: number): Array<[number, number]> {\n const v = this.view();\n const out: Array<[number, number]> = [];\n for (let i = 0; i < count; i++) {\n out.push([v.getUint32(ptr + i * 8, true), v.getUint32(ptr + i * 8 + 4, true)]);\n }\n return out;\n }\n\n capacity(ptr: number, count: number): number {\n return this.iovecs(ptr, count).reduce((n, [, len]) => n + len, 0);\n }\n\n gather(ptr: number, count: number): Uint8Array {\n const vecs = this.iovecs(ptr, count);\n if (vecs.length === 1) return this.bytes(vecs[0][0], vecs[0][1]).slice();\n const out = new Uint8Array(vecs.reduce((n, [, len]) => n + len, 0));\n let at = 0;\n for (const [base, len] of vecs) {\n out.set(this.bytes(base, len), at);\n at += len;\n }\n return out;\n }\n\n scatter(ptr: number, count: number, data: Uint8Array): number {\n let at = 0;\n for (const [base, len] of this.iovecs(ptr, count)) {\n if (at >= data.length) break;\n const n = Math.min(len, data.length - at);\n this.bytes(base, n).set(data.subarray(at, at + n));\n at += n;\n }\n return at;\n }\n\n putStrings(list: readonly string[], ptrs: number, buf: number): void {\n const encoder = new TextEncoder();\n const v = this.view();\n let at = buf;\n list.forEach((s, i) => {\n const b = encoder.encode(s);\n v.setUint32(ptrs + i * 4, at, true);\n this.bytes(at, b.length).set(b);\n v.setUint8(at + b.length, 0);\n at += b.length + 1;\n });\n }\n\n putSizes(list: readonly string[], countPtr: number, sizePtr: number): void {\n const encoder = new TextEncoder();\n const v = this.view();\n v.setUint32(countPtr, list.length, true);\n v.setUint32(\n sizePtr,\n list.reduce((n, s) => n + encoder.encode(s).length + 1, 0),\n true\n );\n }\n}\n", "import { E, EVENT_FD_READWRITE_HANGUP, EVENTTYPE, SIZE, SUBCLOCK_ABSTIME } from './wasi-abi.ts';\nimport type { WasiFds, WasiKernel } from './wasi-fds.ts';\nimport type { WasiMemory } from './wasi-memory.ts';\n\ninterface Subscription {\n userdata: bigint;\n type: number;\n fd: number;\n\n deadline: number;\n}\n\ninterface PollEvent {\n userdata: bigint;\n error: number;\n type: number;\n\n hangup?: boolean;\n}\n\nexport type ClockNow = (id: number) => bigint;\n\nfunction readSubscriptions(mem: WasiMemory, ptr: number, n: number, now: ClockNow): Subscription[] {\n const v = mem.view();\n const at = performance.now();\n const subs: Subscription[] = [];\n for (let i = 0; i < n; i++) {\n const p = ptr + i * SIZE.SUBSCRIPTION;\n const type = v.getUint8(p + 8);\n const sub = { userdata: v.getBigUint64(p, true), type, fd: -1, deadline: Infinity };\n if (type === EVENTTYPE.CLOCK) {\n const id = v.getUint32(p + 16, true);\n let ms = Number(v.getBigUint64(p + 24, true)) / 1e6;\n if (v.getUint16(p + 40, true) & SUBCLOCK_ABSTIME) ms -= Number(now(id)) / 1e6;\n sub.deadline = at + Math.max(0, ms);\n } else {\n sub.fd = v.getUint32(p + 16, true);\n }\n subs.push(sub);\n }\n return subs;\n}\n\nfunction writeEvents(mem: WasiMemory, ptr: number, events: readonly PollEvent[]): void {\n const v = mem.view();\n events.forEach((ev, i) => {\n const p = ptr + i * SIZE.EVENT;\n mem.bytes(p, SIZE.EVENT).fill(0);\n v.setBigUint64(p, ev.userdata, true);\n v.setUint16(p + 8, ev.error, true);\n v.setUint8(p + 10, ev.type);\n\n if (ev.type !== EVENTTYPE.CLOCK) {\n v.setBigUint64(p + 16, 1n, true);\n if (ev.hangup) v.setUint16(p + 24, EVENT_FD_READWRITE_HANGUP, true);\n }\n });\n}\n\nfunction classify(\n fds: WasiFds,\n subs: readonly Subscription[]\n): { events: PollEvent[]; read: number[]; write: number[] } {\n const events: PollEvent[] = [];\n const read: number[] = [];\n const write: number[] = [];\n for (const s of subs) {\n if (s.type === EVENTTYPE.CLOCK) continue;\n const e = fds.find(s.fd);\n if (!e) events.push({ userdata: s.userdata, error: E.BADF, type: s.type });\n else if (e.type !== 'kernel')\n events.push({ userdata: s.userdata, error: E.SUCCESS, type: s.type });\n else (s.type === EVENTTYPE.FD_READ ? read : write).push(s.fd);\n }\n return { events, read, write };\n}\n\nfunction readyEvents(\n subs: readonly Subscription[],\n ready: { read: number[]; write: number[]; hangup?: number[] }\n): PollEvent[] {\n return subs\n .filter(\n (s) =>\n (s.type === EVENTTYPE.FD_READ && ready.read.includes(s.fd)) ||\n (s.type === EVENTTYPE.FD_WRITE && ready.write.includes(s.fd))\n )\n .map((s) => ({\n userdata: s.userdata,\n error: E.SUCCESS,\n type: s.type,\n hangup: ready.hangup?.includes(s.fd) === true,\n }));\n}\n\nexport function pollOneoff(\n deps: {\n mem: WasiMemory;\n fds: WasiFds;\n kernel: WasiKernel;\n now: ClockNow;\n\n interruptWakes?: boolean;\n },\n inPtr: number,\n outPtr: number,\n nsubs: number,\n neventsPtr: number\n): number {\n if (nsubs === 0) return E.INVAL;\n const { mem, kernel } = deps;\n const subs = readSubscriptions(mem, inPtr, nsubs, deps.now);\n const { events, read, write } = classify(deps.fds, subs);\n let interrupted = false;\n if (read.length > 0 || write.length > 0 || events.length === 0) {\n const earliest = Math.min(...subs.map((s) => s.deadline));\n let timeoutMs = -1;\n if (events.length > 0) timeoutMs = 0;\n else if (earliest !== Infinity)\n timeoutMs = Math.max(0, Math.ceil(earliest - performance.now()));\n let ready: unknown;\n try {\n ready = kernel.call({ op: 'fd-select', read, write, timeoutMs });\n } catch (e) {\n if (!deps.interruptWakes || (e as { code?: unknown }).code !== 'EINTR') throw e;\n interrupted = true;\n ready = { read: [], write: [] };\n }\n events.push(\n ...readyEvents(subs, ready as { read: number[]; write: number[]; hangup?: number[] })\n );\n }\n const after = performance.now();\n\n for (const s of subs) {\n if (s.type === EVENTTYPE.CLOCK && (interrupted || s.deadline <= after + 0.5)) {\n events.push({ userdata: s.userdata, error: E.SUCCESS, type: s.type });\n }\n }\n writeEvents(mem, outPtr, events);\n mem.view().setUint32(neventsPtr, events.length, true);\n return E.SUCCESS;\n}\n", "import type { DeviceMeta, KernelFdKind } from '../../kernel/fd-table.ts';\nimport type { SyncFsBridgeStat, SyncFsPosixBridge } from '../../realm/sync-fs-wire.ts';\nimport {\n CLOCK,\n E,\n FDFLAGS,\n FILETYPE,\n FSTFLAGS,\n LOOKUP_SYMLINK_FOLLOW,\n PREOPENTYPE_DIR,\n RIFLAGS,\n RIGHTS,\n SDFLAGS,\n SIZE,\n WASI_SIGNAL_TO_POSIX,\n WHENCE,\n wasiErrnoOf,\n} from './wasi-abi.ts';\nimport { deviceOf, WasiFds, type WasiForkFd, type WasiKernel } from './wasi-fds.ts';\nimport {\n type DirListing,\n normalize,\n pathInode,\n resolveUnder,\n type WasiEntry,\n WasiError,\n} from './wasi-files.ts';\nimport { WasiMemory } from './wasi-memory.ts';\nimport { pollOneoff } from './wasi-poll.ts';\n\nexport class WasiExit extends Error {\n readonly code: number;\n constructor(code: number) {\n super(`exit ${code}`);\n this.code = code;\n }\n}\n\nexport interface WasiHostOptions {\n args: readonly string[];\n env: Readonly<Record<string, string>>;\n cwd: string;\n pid: number;\n\n ppid?: number;\n kernel: WasiKernel;\n\n fs: SyncFsPosixBridge & { invalidate?(): void };\n\n inherited?: ReadonlyArray<{\n fd: number;\n kind?: KernelFdKind;\n flags?: number;\n device?: DeviceMeta;\n }>;\n\n shared?: Int32Array;\n\n forked?: { fds: readonly WasiForkFd[]; cloexec: readonly number[] };\n}\n\nexport type WasiFunction = (...args: never[]) => number | undefined;\n\nconst NS_PER_MS = 1_000_000n;\n\nconst MONOTONIC_BASE = BigInt(Math.round(performance.timeOrigin)) * NS_PER_MS;\n\nconst MAX_READ = 1024 * 1024;\nconst SIGPIPE_EXIT = 141;\n\ninterface Positional {\n pread(max: number, at: number): Uint8Array;\n pwrite(bytes: Uint8Array, at: number): number;\n size(): number;\n truncate(size: number): void;\n}\n\ninterface Filestat {\n filetype: number;\n size: bigint;\n ino: bigint;\n mtimeNs: bigint;\n}\n\nfunction filetypeOf(s: SyncFsBridgeStat | null | undefined): number {\n if (!s) return FILETYPE.UNKNOWN;\n if (s.isSymbolicLink) return FILETYPE.SYMBOLIC_LINK;\n if (s.isDirectory) return FILETYPE.DIRECTORY;\n return s.isFile ? FILETYPE.REGULAR_FILE : FILETYPE.UNKNOWN;\n}\n\nfunction filestatOf(path: string, s: SyncFsBridgeStat): Filestat {\n return {\n filetype: filetypeOf(s),\n size: BigInt(s.size),\n ino: s.ino !== undefined ? BigInt(s.ino) : pathInode(path),\n mtimeNs: BigInt(Math.round(s.mtimeMs ?? 0)) * NS_PER_MS,\n };\n}\n\nfunction kernelFiletype(kind: string): { filetype: number; seeks: boolean } {\n switch (kind) {\n case 'tty':\n case 'device':\n return { filetype: FILETYPE.CHARACTER_DEVICE, seeks: false };\n case 'socket':\n return { filetype: FILETYPE.SOCKET_STREAM, seeks: false };\n case 'file':\n return { filetype: FILETYPE.REGULAR_FILE, seeks: true };\n default:\n return { filetype: FILETYPE.UNKNOWN, seeks: false };\n }\n}\n\nexport class WasiHost {\n readonly mem = new WasiMemory();\n readonly fds: WasiFds;\n private readonly started = performance.now();\n private cache: Record<string, WasiFunction> | undefined;\n\n private readonly startCwd: string;\n\n interruptWakes = false;\n\n onRaise: ((sig: number) => boolean) | undefined;\n\n private readonly listening: number[];\n\n readonly o: WasiHostOptions;\n constructor(o: WasiHostOptions) {\n this.o = o;\n this.startCwd = o.cwd;\n this.fds = new WasiFds(o.kernel, o.fs);\n if (o.shared) this.fds.share(o.shared, true);\n else if (o.forked) this.fds.restore(o.forked.fds, o.forked.cloexec);\n else this.fds.setup(o.cwd, o.inherited ?? []);\n this.listening = o.shared ? [] : this.fds.sockets();\n }\n\n get cwd(): string {\n return this.fds.cwd() ?? this.startCwd;\n }\n\n imports(): Record<string, WasiFunction> {\n this.cache ??= wrap({\n ...this.processImports(),\n ...this.ioImports(),\n ...this.statImports(),\n ...this.pathImports(),\n ...this.socketImports(),\n poll_oneoff: (inPtr: number, outPtr: number, n: number, nevents: number) =>\n pollOneoff(\n {\n mem: this.mem,\n fds: this.fds,\n kernel: this.o.kernel,\n now: (id) => this.now(id),\n interruptWakes: this.interruptWakes,\n },\n inPtr,\n outPtr,\n n,\n nevents\n ),\n });\n return this.cache;\n }\n\n now(id: number): bigint {\n if (id === CLOCK.REALTIME) return BigInt(Date.now()) * NS_PER_MS;\n\n if (id === CLOCK.MONOTONIC) {\n return MONOTONIC_BASE + BigInt(Math.round(performance.now() * 1e6));\n }\n return BigInt(Math.round((performance.now() - this.started) * 1e6)) + 1n;\n }\n\n private environ(): string[] {\n const listen = this.listening.length > 0 ? { SLICC_LISTEN_FDS: this.listening.join(' ') } : {};\n const env = { PWD: this.cwd, ...this.o.env, ...listen };\n return Object.entries(env).map(([k, v]) => `${k}=${v}`);\n }\n\n private processImports(): Record<string, WasiFunction> {\n const { mem } = this;\n return {\n args_get: (argv: number, buf: number) => void mem.putStrings(this.o.args, argv, buf),\n args_sizes_get: (n: number, size: number) => void mem.putSizes(this.o.args, n, size),\n environ_get: (envp: number, buf: number) => void mem.putStrings(this.environ(), envp, buf),\n environ_sizes_get: (n: number, size: number) => void mem.putSizes(this.environ(), n, size),\n clock_res_get: (_id: number, out: number) => void mem.view().setBigUint64(out, 1000n, true),\n clock_time_get: (id: number, _precision: bigint, out: number) =>\n void mem.view().setBigUint64(out, this.now(id), true),\n random_get: (buf: number, len: number) => {\n for (let at = 0; at < len; at += 65536) {\n const chunk = new Uint8Array(Math.min(65536, len - at));\n crypto.getRandomValues(chunk);\n mem.bytes(buf + at, chunk.length).set(chunk);\n }\n },\n sched_yield: () => E.SUCCESS,\n proc_exit: (code: number) => {\n throw new WasiExit(code);\n },\n proc_raise: (sig: number) => {\n const posix = WASI_SIGNAL_TO_POSIX[sig];\n if (posix === undefined) throw new WasiError('EINVAL');\n if (this.onRaise?.(posix)) return;\n this.o.kernel.call({ op: 'proc-kill', pid: this.o.pid, sig: posix });\n },\n };\n }\n\n private ioImports(): Record<string, WasiFunction> {\n const { mem, fds } = this;\n return {\n fd_write: (fd: number, iovs: number, n: number, out: number) =>\n void mem.view().setUint32(out, this.write(fd, mem.gather(iovs, n)), true),\n fd_read: (fd: number, iovs: number, n: number, out: number) => {\n const data = this.read(fd, mem.capacity(iovs, n));\n mem.view().setUint32(out, mem.scatter(iovs, n, data), true);\n },\n fd_pread: (fd: number, iovs: number, n: number, at: bigint, out: number) => {\n const data = this.positional(fd, 'read').pread(mem.capacity(iovs, n), Number(at));\n mem.view().setUint32(out, mem.scatter(iovs, n, data), true);\n },\n fd_pwrite: (fd: number, iovs: number, n: number, at: bigint, out: number) =>\n void mem\n .view()\n .setUint32(\n out,\n this.positional(fd, 'write').pwrite(mem.gather(iovs, n), Number(at)),\n true\n ),\n fd_seek: (fd: number, offset: bigint, whence: number, out: number) =>\n void mem.view().setBigUint64(out, BigInt(this.seek(fd, Number(offset), whence)), true),\n fd_tell: (fd: number, out: number) =>\n void mem.view().setBigUint64(out, BigInt(this.seek(fd, 0, WHENCE.CUR)), true),\n fd_close: (fd: number) => void fds.close(fd),\n fd_renumber: (from: number, to: number) => void fds.renumber(from, to),\n fd_sync: (fd: number) => void this.sync(fd),\n fd_datasync: (fd: number) => void this.sync(fd),\n fd_advise: (fd: number) => void fds.get(fd),\n fd_allocate: (fd: number, offset: bigint, len: bigint) => {\n const file = this.positional(fd);\n const end = Number(offset + len);\n if (end > file.size()) file.truncate(end);\n },\n };\n }\n\n private statImports(): Record<string, WasiFunction> {\n const { mem, fds } = this;\n return {\n fd_fdstat_get: (fd: number, out: number) => void this.fdstat(fd, out),\n fd_fdstat_set_flags: (fd: number, flags: number) =>\n void fds.setFlags(fd, (flags & FDFLAGS.NONBLOCK) !== 0, (flags & FDFLAGS.APPEND) !== 0),\n fd_fdstat_set_rights: (fd: number) => void fds.get(fd),\n fd_filestat_get: (fd: number, out: number) =>\n void this.writeFilestat(out, this.fdFilestat(fd)),\n fd_filestat_set_size: (fd: number, size: bigint) =>\n void this.positional(fd).truncate(Number(size)),\n fd_filestat_set_times: (fd: number, atim: bigint, mtim: bigint, flags: number) => {\n const e = fds.get(fd);\n if (e.type === 'file') {\n e.file.flush();\n this.setTimes(e.file.path, atim, mtim, flags);\n } else if (e.type === 'dir') this.setTimes(e.path, atim, mtim, flags);\n },\n fd_prestat_get: (fd: number, out: number) => {\n const name = new TextEncoder().encode(fds.preopen(fd).preopen);\n mem.view().setUint8(out, PREOPENTYPE_DIR);\n mem.view().setUint32(out + 4, name.length, true);\n },\n fd_prestat_dir_name: (fd: number, buf: number, len: number) => {\n const name = new TextEncoder().encode(fds.preopen(fd).preopen);\n mem.bytes(buf, Math.min(len, name.length)).set(name.subarray(0, len));\n },\n fd_readdir: (fd: number, buf: number, len: number, cookie: bigint, used: number) =>\n void this.readdir(fd, buf, len, Number(cookie), used),\n };\n }\n\n private pathImports(): Record<string, WasiFunction> {\n const { mem, fds, o } = this;\n const at = (dirfd: number, p: number, l: number) => fds.resolve(dirfd, mem.string(p, l));\n return {\n path_open: (\n dirfd: number,\n _lookup: number,\n p: number,\n l: number,\n oflags: number,\n rights: bigint,\n _inheriting: bigint,\n fdflags: number,\n out: number\n ) => void mem.view().setUint32(out, fds.open(at(dirfd, p, l), oflags, rights, fdflags), true),\n path_filestat_get: (dirfd: number, lookup: number, p: number, l: number, out: number) =>\n void this.writeFilestat(out, this.pathFilestat(at(dirfd, p, l), lookup)),\n path_filestat_set_times: (\n dirfd: number,\n _lookup: number,\n p: number,\n l: number,\n atim: bigint,\n mtim: bigint,\n flags: number\n ) => {\n const path = at(dirfd, p, l);\n fds.flushPath(path);\n this.setTimes(path, atim, mtim, flags);\n },\n path_create_directory: (dirfd: number, p: number, l: number) => {\n const path = at(dirfd, p, l);\n if (o.fs.exists(path)) throw new WasiError('EEXIST');\n o.fs.mkdir(path);\n },\n path_remove_directory: (dirfd: number, p: number, l: number) =>\n void o.fs.rmdir(at(dirfd, p, l)),\n path_unlink_file: (dirfd: number, p: number, l: number) => {\n const path = at(dirfd, p, l);\n if (o.fs.lstat(path).isDirectory) throw new WasiError('EISDIR');\n fds.unlinking(path);\n o.fs.unlink(path);\n fds.unlinked(path);\n },\n path_rename: (fd: number, p: number, l: number, fd2: number, p2: number, l2: number) => {\n const from = at(fd, p, l);\n const to = at(fd2, p2, l2);\n fds.flushPath(from);\n o.fs.rename(from, to);\n fds.renamed(from, to);\n },\n path_symlink: (tp: number, tl: number, dirfd: number, p: number, l: number) =>\n void o.fs.symlink(mem.string(tp, tl), at(dirfd, p, l)),\n path_readlink: (\n dirfd: number,\n p: number,\n l: number,\n buf: number,\n len: number,\n used: number\n ) => {\n const target = new TextEncoder().encode(o.fs.readlink(at(dirfd, p, l)));\n const n = Math.min(len, target.length);\n mem.bytes(buf, n).set(target.subarray(0, n));\n mem.view().setUint32(used, n, true);\n },\n\n path_link: () => E.NOTSUP,\n };\n }\n\n private socket(fd: number): Extract<WasiEntry, { type: 'kernel' }> {\n const e = this.fds.get(fd);\n if (e.type !== 'kernel' || this.fds.kind(fd, e) !== 'socket') throw new WasiError('ENOTSOCK');\n return e;\n }\n\n private socketImports(): Record<string, WasiFunction> {\n const { mem, fds, o } = this;\n return {\n sock_accept: (fd: number, flags: number, out: number) => {\n const listener = this.socket(fd);\n const r = o.kernel.call({ op: 'sock-accept', fd, nonblock: listener.nonblock }) as {\n fd: number;\n };\n fds.adopt(r.fd, 'socket', (flags & FDFLAGS.NONBLOCK) !== 0);\n mem.view().setUint32(out, r.fd, true);\n },\n sock_recv: (\n fd: number,\n iovs: number,\n n: number,\n riflags: number,\n outLen: number,\n outFlags: number\n ) => {\n const e = this.socket(fd);\n const peek = (riflags & RIFLAGS.PEEK) !== 0;\n const want = mem.capacity(iovs, n);\n const data =\n (riflags & RIFLAGS.WAITALL) !== 0 && !peek\n ? this.recvAll(fd, want, e.nonblock)\n : o.kernel.sys.read(fd, Math.min(want, MAX_READ), { nonblock: e.nonblock, peek });\n mem.view().setUint32(outLen, mem.scatter(iovs, n, data), true);\n mem.view().setUint16(outFlags, 0, true);\n },\n\n sock_send: (fd: number, iovs: number, n: number, _flags: number, out: number) => {\n const e = this.socket(fd);\n const sent = o.kernel.sys.write(fd, mem.gather(iovs, n), { nonblock: e.nonblock });\n mem.view().setUint32(out, sent, true);\n },\n sock_shutdown: (fd: number, how: number) => {\n this.socket(fd);\n const both = SDFLAGS.RD | SDFLAGS.WR;\n if (how === 0 || (how & ~both) !== 0) throw new WasiError('EINVAL');\n\n o.kernel.call({\n op: 'sock-shutdown',\n fd,\n how: how === both ? 2 : how === SDFLAGS.WR ? 1 : 0,\n });\n },\n };\n }\n\n private recvAll(fd: number, want: number, nonblock: boolean): Uint8Array {\n const chunks: Uint8Array[] = [];\n let got = 0;\n while (got < want) {\n let chunk: Uint8Array;\n try {\n chunk = this.o.kernel.sys.read(fd, Math.min(want - got, MAX_READ), { nonblock });\n } catch (err) {\n if (got === 0) throw err;\n break;\n }\n if (chunk.length === 0) break;\n chunks.push(chunk);\n got += chunk.length;\n }\n const out = new Uint8Array(got);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private file(fd: number, access?: 'read' | 'write') {\n const e = this.fds.get(fd);\n if (e.type !== 'file') {\n throw new WasiError(e.type === 'dir' ? 'EISDIR' : e.type === 'kernel' ? 'ESPIPE' : 'EINVAL');\n }\n if ((access === 'read' && !e.file.readable) || (access === 'write' && !e.file.writable)) {\n throw new WasiError('EBADF');\n }\n return e.file;\n }\n\n private positional(fd: number, access?: 'read' | 'write'): Positional {\n const e = this.fds.get(fd);\n if (e.type !== 'kernel' || this.fds.kind(fd, e) !== 'file') return this.file(fd, access);\n const kernel = this.o.kernel;\n return {\n pread: (max, at) => {\n if (!kernel.sys.pread) throw new WasiError('ESPIPE');\n return kernel.sys.pread(fd, Math.min(max, MAX_READ), at);\n },\n pwrite: (body, at) => kernel.call({ op: 'fd-pwrite', fd, offset: at, body }) as number,\n size: () => this.kernelStat(fd).size,\n truncate: (size) => void kernel.call({ op: 'fd-resize', fd, size }),\n };\n }\n\n private kernelStat(fd: number): { path?: string; size: number; orphan?: true } {\n return this.o.kernel.call({ op: 'fd-vfs-stat', fd }) as {\n path?: string;\n size: number;\n orphan?: true;\n };\n }\n\n private write(fd: number, data: Uint8Array): number {\n const e = this.fds.get(fd);\n if (e.type === 'kernel') {\n try {\n return this.o.kernel.sys.write(fd, data, { nonblock: e.nonblock });\n } catch (err) {\n if ((err as { code?: string }).code === 'EPIPE') throw new WasiExit(SIGPIPE_EXIT);\n throw err;\n }\n }\n if (e.type === 'device') {\n if (e.access === 'read') throw new WasiError('EBADF');\n return data.length;\n }\n return this.file(fd, 'write').write(data);\n }\n\n private read(fd: number, max: number): Uint8Array {\n const e = this.fds.get(fd);\n if (e.type === 'kernel') {\n return this.o.kernel.sys.read(fd, Math.min(max, MAX_READ), { nonblock: e.nonblock });\n }\n if (e.type === 'device') {\n if (e.access === 'write') throw new WasiError('EBADF');\n if (e.device === 'null') return new Uint8Array(0);\n const out = new Uint8Array(Math.min(max, 65536));\n return e.device === 'zero' ? out : crypto.getRandomValues(out);\n }\n return this.file(fd, 'read').read(max);\n }\n\n private seek(fd: number, offset: number, whence: number): number {\n const e = this.fds.get(fd);\n if (e.type === 'kernel') {\n if (this.fds.kind(fd, e) !== 'file') throw new WasiError('ESPIPE');\n return this.o.kernel.sys.seek(fd, offset, whence);\n }\n if (e.type === 'device') return 0;\n const file = this.file(fd);\n const base = whence === WHENCE.SET ? 0 : whence === WHENCE.CUR ? file.offset : file.size();\n if (whence > WHENCE.END || base + offset < 0) throw new WasiError('EINVAL');\n file.offset = base + offset;\n return file.offset;\n }\n\n private sync(fd: number): void {\n const e = this.fds.get(fd);\n if (e.type === 'file') e.file.flush();\n else if (e.type === 'kernel' && this.fds.kind(fd, e) === 'file') this.o.kernel.sys.flush(fd);\n }\n\n private fdstat(fd: number, out: number): void {\n const e = this.fds.get(fd);\n let filetype: number = FILETYPE.CHARACTER_DEVICE;\n let seeks = true;\n let flags = 0;\n if (e.type === 'kernel') {\n ({ filetype, seeks } = kernelFiletype(this.fds.kind(fd, e)));\n if (e.nonblock) flags |= FDFLAGS.NONBLOCK;\n if (e.append) flags |= FDFLAGS.APPEND;\n } else if (e.type === 'file') {\n filetype = FILETYPE.REGULAR_FILE;\n if (e.file.append) flags |= FDFLAGS.APPEND;\n } else if (e.type === 'dir') filetype = FILETYPE.DIRECTORY;\n const v = this.mem.view();\n v.setUint8(out, filetype);\n v.setUint16(out + 2, flags, true);\n\n const rights = seeks ? RIGHTS.ALL : RIGHTS.ALL & ~(RIGHTS.FD_SEEK | RIGHTS.FD_TELL);\n v.setBigUint64(out + 8, rights, true);\n v.setBigUint64(out + 16, RIGHTS.ALL, true);\n }\n\n private writeFilestat(ptr: number, f: Filestat): void {\n const v = this.mem.view();\n v.setBigUint64(ptr, 1n, true);\n v.setBigUint64(ptr + 8, f.ino, true);\n v.setUint8(ptr + 16, f.filetype);\n v.setBigUint64(ptr + 24, 1n, true);\n v.setBigUint64(ptr + 32, f.size, true);\n v.setBigUint64(ptr + 40, f.mtimeNs, true);\n v.setBigUint64(ptr + 48, f.mtimeNs, true);\n v.setBigUint64(ptr + 56, f.mtimeNs, true);\n }\n\n private fdFilestat(fd: number): Filestat {\n const e = this.fds.get(fd);\n if (e.type === 'dir') return filestatOf(e.path, this.o.fs.stat(e.path));\n if (e.type === 'file') return this.statOrphanable(e.file.path, e.file.size());\n const kind = e.type === 'kernel' ? this.fds.kind(fd, e) : undefined;\n if (kind === 'file') {\n const vfs = this.kernelStat(fd);\n if (vfs.path) return this.statOrphanable(vfs.path, vfs.size, vfs.orphan);\n }\n const filetype = kind ? kernelFiletype(kind).filetype : FILETYPE.CHARACTER_DEVICE;\n return { filetype, size: 0n, ino: BigInt(fd + 1), mtimeNs: 0n };\n }\n\n private statOrphanable(path: string, size: number, orphan = false): Filestat {\n let s: SyncFsBridgeStat | undefined;\n\n if (!orphan) {\n try {\n s = this.o.fs.stat(path);\n } catch {}\n }\n return {\n ...filestatOf(path, s ?? { isFile: true, isDirectory: false, size: 0 }),\n size: BigInt(size),\n };\n }\n\n private pathFilestat(path: string, lookup: number): Filestat {\n if (deviceOf(path)) {\n return { filetype: FILETYPE.CHARACTER_DEVICE, size: 0n, ino: pathInode(path), mtimeNs: 0n };\n }\n this.fds.flushPath(path);\n const follow = (lookup & LOOKUP_SYMLINK_FOLLOW) !== 0;\n return filestatOf(path, follow ? this.o.fs.stat(path) : this.o.fs.lstat(path));\n }\n\n private setTimes(path: string, atim: bigint, mtim: bigint, flags: number): void {\n const now = Date.now();\n let current: number | undefined;\n const kept = (): number => (current ??= this.o.fs.stat(path).mtimeMs ?? now);\n const pick = (set: number, setNow: number, value: bigint): number =>\n flags & setNow ? now : flags & set ? Number(value / NS_PER_MS) : kept();\n this.o.fs.utimes(\n path,\n pick(FSTFLAGS.ATIM, FSTFLAGS.ATIM_NOW, atim),\n pick(FSTFLAGS.MTIM, FSTFLAGS.MTIM_NOW, mtim)\n );\n }\n\n private readdir(fd: number, buf: number, len: number, cookie: number, usedPtr: number): void {\n const dir = this.fds.dir(fd);\n if (cookie === 0 || !dir.listing) dir.listing = this.list(dir.path);\n const { names, stats } = dir.listing;\n let at = 0;\n for (let i = cookie; i < names.length && at < len; i++) {\n const name = names[i];\n const full =\n name === '.'\n ? dir.path\n : name === '..'\n ? normalize(`${dir.path}/..`)\n : resolveUnder(dir.path, name);\n if (!stats.has(name)) stats.set(name, this.lstatOrNull(full));\n const st = stats.get(name) ?? null;\n const record = direntRecord(\n i + 1,\n st?.ino !== undefined ? BigInt(st.ino) : pathInode(full),\n name,\n filetypeOf(st)\n );\n const n = Math.min(record.length, len - at);\n this.mem.bytes(buf + at, n).set(record.subarray(0, n));\n at += n;\n }\n this.mem.view().setUint32(usedPtr, at, true);\n }\n\n private list(path: string): DirListing {\n const { fs } = this.o;\n const listed = fs.readdirStat(path);\n return { names: ['.', '..', ...listed.map(([name]) => name)], stats: new Map(listed) };\n }\n\n private lstatOrNull(path: string): SyncFsBridgeStat | null {\n try {\n return this.o.fs.lstat(path);\n } catch {\n return null;\n }\n }\n\n flushAll(): void {\n this.fds.flushAll();\n }\n}\n\nfunction direntRecord(next: number, ino: bigint, name: string, filetype: number): Uint8Array {\n const nameBytes = new TextEncoder().encode(name);\n const record = new Uint8Array(SIZE.DIRENT + nameBytes.length);\n const v = new DataView(record.buffer);\n v.setBigUint64(0, BigInt(next), true);\n v.setBigUint64(8, ino, true);\n v.setUint32(16, nameBytes.length, true);\n v.setUint8(20, filetype);\n record.set(nameBytes, SIZE.DIRENT);\n return record;\n}\n\nexport function wrap(table: Record<string, WasiFunction>): Record<string, WasiFunction> {\n const out: Record<string, WasiFunction> = {};\n for (const [name, fn] of Object.entries(table)) {\n out[name] = (...args: never[]) => {\n try {\n return fn(...args) ?? E.SUCCESS;\n } catch (e) {\n if (e instanceof WasiExit) throw e;\n if (e instanceof WasiError) return wasiErrnoOf(e.code);\n const code = (e as { code?: unknown } | null)?.code;\n if (typeof code === 'string') return wasiErrnoOf(code);\n if (e instanceof RangeError) return E.FAULT;\n throw e;\n }\n };\n }\n return out;\n}\n", "import type { SyncFsPosixBridge, SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport { E, FDFLAGS, OFLAGS, RIGHTS, wasiErrnoOf } from './wasi-abi.ts';\nimport { WasiError } from './wasi-files.ts';\nimport type { WasiHost } from './wasi-host.ts';\n\nexport interface Request {\n op: string;\n [key: string]: unknown;\n}\n\nexport type Raw = (req: Request) => SyncFsResult;\n\nexport interface OpenOptions {\n read?: boolean;\n write?: boolean;\n append?: boolean;\n create?: boolean;\n exclusive?: boolean;\n truncate?: boolean;\n directory?: boolean;\n nofollow?: boolean;\n mode?: number;\n}\n\nexport interface FdStat {\n kind: 'file' | 'dir' | 'device' | 'stream';\n path?: string;\n mode: number;\n uid: number;\n gid: number;\n size: number;\n ino?: number;\n mtimeMs?: number;\n}\n\nexport type Taken = { value: unknown } | { error: string };\n\nexport type Stdio = 'pipe' | 'inherit' | 'null';\n\nexport interface SpawnOptions {\n argv: string[];\n env?: Record<string, string>;\n cwd?: string;\n stdin?: Stdio;\n stdout?: Stdio;\n stderr?: Stdio;\n}\n\nexport interface Spawned {\n pid: number;\n stdin?: number;\n stdout?: number;\n stderr?: number;\n}\n\nexport interface Waited {\n status: number;\n signal?: number;\n}\n\nexport interface ImportsContext {\n memory(): WebAssembly.Memory;\n instance(): WebAssembly.Instance | undefined;\n tid: number;\n argv: readonly string[];\n env: Readonly<Record<string, string>>;\n cwd(): string;\n fs: SyncFsPosixBridge;\n fds: {\n open(path: string, options?: OpenOptions): number;\n close(fd: number): void;\n fstat(fd: number): FdStat;\n fchmod(fd: number, mode: number): void;\n tryLock(fd: number, exclusive: boolean): number;\n unlock(fd: number): void;\n };\n syscall(req: Request): unknown;\n spawn(options: SpawnOptions): Spawned;\n wait(pid: number): Waited;\n kill(pid: number, sig: number): void;\n async: {\n submit(req: Request): number;\n wait(timeoutMs?: number): number;\n take(id: number): Taken | undefined;\n resolve(value: unknown): number;\n hold(): number;\n cancel(id: number): void;\n close(): void;\n };\n errno(err: unknown): number;\n}\n\nexport type ProgramImports = Record<string, Record<string, WebAssembly.ImportValue>>;\n\nexport type CreateImports = (ctx: ImportsContext) => ProgramImports;\n\nconst UID = 1000;\n\nfunction base64(text: string): string {\n const bytes = new TextEncoder().encode(text);\n let binary = '';\n for (let at = 0; at < bytes.length; at += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(at, at + 0x8000));\n }\n return btoa(binary);\n}\n\nexport async function loadImports(source: string): Promise<CreateImports> {\n const loaded = (await import(`data:text/javascript;base64,${base64(source)}`)) as {\n createImports?: unknown;\n };\n if (typeof loaded.createImports !== 'function') {\n throw new Error('the imports module exports no createImports function');\n }\n return loaded.createImports as CreateImports;\n}\n\nfunction value(result: SyncFsResult): unknown {\n if (!result.ok) throw new WasiError(result.errno);\n if (result.kind === 'json') return result.json;\n return result.kind === 'bytes' ? result.bytes : undefined;\n}\n\nfunction code(err: unknown): string | undefined {\n const c = (err as { code?: unknown } | null)?.code;\n return typeof c === 'string' ? c : undefined;\n}\n\nexport interface ContextOptions {\n host: WasiHost;\n raw: Raw;\n tid: number;\n memory: () => WebAssembly.Memory;\n instance: () => WebAssembly.Instance | undefined;\n}\n\nexport function importsContext({\n host,\n raw,\n tid,\n memory,\n instance,\n}: ContextOptions): ImportsContext {\n const { fs } = host.o;\n const call = (req: Request) => value(raw(req));\n const pathOf = (fd: number): string | undefined => {\n const e = host.fds.get(fd);\n if (e.type === 'file') return e.file.path;\n if (e.type === 'dir') return e.path;\n if (e.type === 'kernel' && host.fds.kind(fd, e) === 'file') {\n return (call({ op: 'fd-vfs-stat', fd }) as { path?: string }).path;\n }\n return undefined;\n };\n const requirePath = (fd: number): string => {\n const path = pathOf(fd);\n if (path === undefined) throw new WasiError('EBADF');\n return path;\n };\n const fds: ImportsContext['fds'] = {\n open(path, o = {}) {\n const abs = host.fds.resolve(3, path);\n if (o.nofollow && fs.exists(abs) && fs.lstat(abs).isSymbolicLink)\n throw new WasiError('ELOOP');\n const existed = fs.exists(abs);\n const oflags =\n (o.create ? OFLAGS.CREAT : 0) |\n (o.exclusive ? OFLAGS.EXCL : 0) |\n (o.truncate ? OFLAGS.TRUNC : 0) |\n (o.directory ? OFLAGS.DIRECTORY : 0);\n const rights = (o.write ? RIGHTS.FD_WRITE : 0n) | (o.read || !o.write ? RIGHTS.FD_READ : 0n);\n const fd = host.fds.open(abs, oflags, rights, o.append ? FDFLAGS.APPEND : 0);\n if (o.mode !== undefined && !existed) fs.chmod(abs, o.mode);\n return fd;\n },\n close(fd) {\n host.fds.close(fd);\n },\n fstat(fd) {\n const e = host.fds.get(fd);\n const path = pathOf(fd);\n if (path === undefined) {\n const kind = e.type === 'device' ? 'device' : 'stream';\n return { kind, mode: kind === 'device' ? 0o20666 : 0o10600, uid: UID, gid: UID, size: 0 };\n }\n host.fds.flushPath(path);\n const s = fs.stat(path);\n return {\n kind: s.isDirectory ? 'dir' : 'file',\n path,\n mode: s.mode ?? (s.isDirectory ? 0o40755 : 0o100644),\n uid: UID,\n gid: UID,\n size: s.size,\n ...(s.ino !== undefined ? { ino: s.ino } : {}),\n ...(s.mtimeMs !== undefined ? { mtimeMs: s.mtimeMs } : {}),\n };\n },\n fchmod(fd, mode) {\n fs.chmod(requirePath(fd), mode);\n },\n tryLock(fd, exclusive) {\n const path = requirePath(fd);\n try {\n call({ op: 'lock', path, exclusive, fd });\n } catch (err) {\n if (code(err) === 'EAGAIN') return E.AGAIN;\n throw err;\n }\n return E.SUCCESS;\n },\n unlock(fd) {\n call({ op: 'unlock', path: requirePath(fd) });\n },\n };\n return {\n memory,\n instance,\n tid,\n argv: host.o.args,\n env: host.o.env,\n cwd: () => host.cwd,\n fs,\n fds,\n syscall: call,\n ...processes(host, call),\n async: {\n submit: (req) => call({ op: 'async-submit', req }) as number,\n wait(timeoutMs) {\n for (;;) {\n try {\n return call({\n op: 'async-wait',\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n }) as number;\n } catch (err) {\n if (code(err) !== 'EINTR') throw err;\n if (timeoutMs !== undefined) return 0;\n }\n }\n },\n take(id) {\n const result = raw({ op: 'async-take', id });\n if (!result.ok && result.errno === 'EAGAIN') return undefined;\n if (!result.ok) return { error: result.errno };\n return { value: value(result) };\n },\n resolve: (v) => call({ op: 'async-resolve', value: v }) as number,\n hold: () => call({ op: 'async-hold' }) as number,\n cancel: (id) => void raw({ op: 'async-cancel', id }),\n close: () => void call({ op: 'async-close' }),\n },\n errno: (err) => wasiErrnoOf(code(err)),\n };\n}\n\ntype ChildSlot = { fd: number } | { none: true };\n\nconst STDIO = ['stdin', 'stdout', 'stderr'] as const;\n\nfunction processes(\n host: WasiHost,\n call: (req: Request) => unknown\n): Pick<ImportsContext, 'spawn' | 'wait' | 'kill'> {\n const close = (fd: number) => void call({ op: 'fd-close', fd });\n const slot = (n: number, how: Stdio, mine: number[], theirs: number[]): ChildSlot => {\n if (how === 'inherit') return { fd: n };\n if (how === 'null') return { none: true };\n const [read, write] = call({ op: 'fd-pipe' }) as [number, number];\n mine[n] = n === 0 ? write : read;\n theirs.push(n === 0 ? read : write);\n return { fd: n === 0 ? read : write };\n };\n return {\n spawn(o) {\n const mine: number[] = [];\n const theirs: number[] = [];\n host.fds.promoteFiles();\n try {\n const stdio = STDIO.map((name, n) => slot(n, o[name] ?? 'inherit', mine, theirs));\n const pid = call({\n op: 'proc-spawn',\n file: o.argv[0],\n argv: o.argv,\n env: o.env ?? { ...host.o.env },\n cwd: o.cwd ?? host.cwd,\n stdio,\n }) as number;\n const out: Spawned = { pid };\n STDIO.forEach((name, n) => {\n if (mine[n] !== undefined) out[name] = mine[n];\n });\n return out;\n } catch (err) {\n for (const fd of mine) if (fd !== undefined) close(fd);\n throw err;\n } finally {\n for (const fd of theirs) close(fd);\n host.o.fs.invalidate?.();\n }\n },\n wait(pid) {\n for (;;) {\n try {\n const [, status] = call({ op: 'proc-wait', pid, nohang: false }) as [number, number];\n host.o.fs.invalidate?.();\n const signal = status & 0x7f;\n return signal ? { status: 128 + signal, signal } : { status: (status >> 8) & 0xff };\n } catch (err) {\n if (code(err) !== 'EINTR') throw err;\n }\n }\n },\n kill(pid, sig) {\n call({ op: 'proc-kill', pid, sig });\n },\n };\n}\n", "import { SIG, sigbit } from '../../kernel/signals.ts';\nimport type { SignalHooks } from '../process-signals.ts';\n\nconst DELIVERED = [SIG.HUP, SIG.INT, SIG.QUIT, SIG.USR1, SIG.USR2, SIG.ALRM, SIG.TERM];\nconst DELIVERED_MASK = DELIVERED.reduce((m, sig) => m | sigbit(sig), 0);\n\nexport class WasiSignals implements SignalHooks {\n private exports: WebAssembly.Exports | undefined;\n private callback: string | undefined;\n\n private uncaught = 0;\n\n private delivering: number | undefined;\n\n private readonly fallBack: (sig: number) => void;\n constructor(fallBack: (sig: number) => void) {\n this.fallBack = fallBack;\n }\n\n bind(exports: WebAssembly.Exports): void {\n this.exports = exports;\n }\n\n register(name: string): void {\n if (typeof this.exports?.[name] === 'function') this.callback = name;\n }\n\n masks(): { caught: number; ignored: number; restart: number } | null {\n if (!this.handler()) return null;\n return { caught: DELIVERED_MASK & ~this.uncaught, ignored: 0, restart: 0 };\n }\n\n raise(sig: number): void {\n const handler = this.handler();\n if (!handler) return;\n const outer = this.delivering;\n this.delivering = sig;\n try {\n handler(sig);\n } catch (e) {\n if (!(e instanceof WebAssembly.RuntimeError)) throw e;\n this.defaultAction(sig);\n } finally {\n this.delivering = outer;\n }\n }\n\n raised(sig: number): boolean {\n if (sig !== SIG.ABRT || this.delivering === undefined) return false;\n this.defaultAction(this.delivering);\n return true;\n }\n\n private defaultAction(sig: number): void {\n this.uncaught |= sigbit(sig);\n this.fallBack(sig);\n }\n\n private handler(): ((sig: number) => void) | undefined {\n const fn = this.callback ? this.exports?.[this.callback] : undefined;\n return typeof fn === 'function' ? (fn as (sig: number) => void) : undefined;\n }\n}\n", "interface Row {\n n: number;\n ms: number;\n max: number;\n}\n\nexport class WasiStats {\n private readonly rows = new Map<string, Row>();\n private readonly phases: Array<[string, number]> = [];\n private mark = performance.now();\n\n wrap<T extends object>(tag: string, table: T): T {\n return Object.fromEntries(\n Object.entries(table).map(([name, value]) => {\n if (typeof value !== 'function') return [name, value];\n const fn = value as (...args: unknown[]) => unknown;\n const key = `${tag}.${name}`;\n return [name, (...args: unknown[]) => this.time(key, () => fn.apply(table, args))];\n })\n ) as T;\n }\n\n time<T>(key: string, fn: () => T): T {\n const t = performance.now();\n try {\n return fn();\n } finally {\n this.count(key, performance.now() - t);\n }\n }\n\n phase(name: string): void {\n const now = performance.now();\n this.phases.push([name, now - this.mark]);\n this.mark = now;\n }\n\n private count(key: string, ms: number): void {\n const row = this.rows.get(key) ?? { n: 0, ms: 0, max: 0 };\n row.n++;\n row.ms += ms;\n row.max = Math.max(row.max, ms);\n this.rows.set(key, row);\n }\n\n report(): string {\n const ms = (v: number) => v.toFixed(1).padStart(9);\n const lines = this.phases.map(([name, t]) => `${ms(t)} ms ${name}`);\n lines.push(`${'total ms'.padStart(12)} ${'calls'.padStart(7)} ${'max ms'.padStart(9)} call`);\n const sorted = [...this.rows].sort((a, b) => b[1].ms - a[1].ms);\n for (const [key, row] of sorted) {\n lines.push(`${ms(row.ms)} ${String(row.n).padStart(7)} ${ms(row.max)} ${key}`);\n }\n return `${lines.join('\\n')}\\n`;\n }\n}\n", "import {\n WASM_DEFAULT_THREADS,\n WASM_MAX_THREADS,\n WASM_THREAD_EXIT,\n WASM_THREAD_SPAWN,\n} from '../../kernel/protocol.ts';\nimport type { SabPostLike } from '../../realm/sync-sab-bridge.ts';\n\nconst LAST_TID = 0;\nconst RUNNING = 1;\n\nexport const MAIN_TID = 1;\n\nexport class ThreadExit extends Error {\n constructor() {\n super('thread exit');\n }\n}\n\nexport function threadCap(env: Readonly<Record<string, string>>): number {\n const asked = Number.parseInt(env.SLICC_WASM_THREADS ?? '', 10);\n return asked >= 1 ? Math.min(asked, WASM_MAX_THREADS) : WASM_DEFAULT_THREADS;\n}\n\nexport class WasiThreads {\n readonly ids: Int32Array;\n\n beforeSpawn: (() => void) | undefined;\n\n modules: (() => Record<string, WebAssembly.Module>) | undefined;\n\n received: Readonly<Record<string, WebAssembly.Module>> | undefined;\n\n private readonly port: SabPostLike;\n private readonly memory: WebAssembly.Memory;\n private readonly cap: number;\n readonly tid: number;\n constructor(\n port: SabPostLike,\n memory: WebAssembly.Memory,\n cap: number,\n\n tid: number,\n ids?: SharedArrayBuffer\n ) {\n this.port = port;\n this.memory = memory;\n this.cap = cap;\n this.tid = tid;\n this.ids = new Int32Array(ids ?? new SharedArrayBuffer(16));\n if (!ids) Atomics.store(this.ids, LAST_TID, MAIN_TID);\n }\n\n spawn(arg: number): number {\n if (Atomics.add(this.ids, RUNNING, 1) + 1 >= this.cap) {\n Atomics.sub(this.ids, RUNNING, 1);\n return -1;\n }\n this.beforeSpawn?.();\n const tid = Atomics.add(this.ids, LAST_TID, 1) + 1;\n const modules = this.modules?.();\n this.port.postMessage({\n type: WASM_THREAD_SPAWN,\n thread: {\n tid,\n arg,\n memory: this.memory,\n ids: this.ids.buffer as SharedArrayBuffer,\n ...(modules ? { modules } : {}),\n },\n });\n return tid;\n }\n\n exited(): void {\n Atomics.sub(this.ids, RUNNING, 1);\n this.port.postMessage({ type: WASM_THREAD_EXIT });\n }\n\n known(tid: number): boolean {\n return tid >= MAIN_TID && tid <= Atomics.load(this.ids, LAST_TID);\n }\n\n parallelism(): number {\n const cores = (globalThis as { navigator?: { hardwareConcurrency?: number } }).navigator\n ?.hardwareConcurrency;\n return Math.max(1, Math.min(this.cap, cores ?? this.cap));\n }\n}\n", "import { E } from './wasi-abi.ts';\nimport type { WasiForkFd } from './wasi-fds.ts';\nimport type { WasiMemory } from './wasi-memory.ts';\n\nexport interface WasiForkState {\n asyncifyData: number;\n\n globals: Array<[string, number]>;\n fds: WasiForkFd[];\n cloexec: number[];\n cwd: string;\n\n shared?: true;\n\n setjmps?: WasiSetjmps;\n}\n\nexport interface WasiSetjmps {\n next: number;\n snapshots: Array<[number, Snapshot]>;\n}\n\ninterface Snapshot {\n frames: Uint8Array;\n globals: Array<[string, number]>;\n}\n\ninterface AsyncifyExports {\n asyncify_start_unwind?: (data: number) => void;\n asyncify_stop_unwind?: () => void;\n asyncify_start_rewind?: (data: number) => void;\n asyncify_stop_rewind?: () => void;\n asyncify_get_state?: () => number;\n}\n\nconst UNWINDING = 1;\nconst REWINDING = 2;\n\nfunction mutableGlobals(exports: WebAssembly.Exports): Array<[string, number]> {\n const out: Array<[string, number]> = [];\n for (const [name, value] of Object.entries(exports)) {\n if (!(value instanceof WebAssembly.Global) || typeof value.value !== 'number') continue;\n try {\n const v = value.value as number;\n value.value = v;\n out.push([name, v]);\n } catch {}\n }\n return out;\n}\n\nexport class AsyncifyDriver {\n private exports: WebAssembly.Exports & AsyncifyExports = {};\n\n private stackUpper = 0;\n\n private pending: (() => number) | undefined;\n\n private answer = 0;\n private readonly snapshots = new Map<number, Snapshot>();\n private nextSnapshot = 1;\n\n private readonly mem: WasiMemory;\n constructor(mem: WasiMemory) {\n this.mem = mem;\n }\n\n bind(exports: WebAssembly.Exports): void {\n this.exports = exports as WebAssembly.Exports & AsyncifyExports;\n const sp = this.exports.__stack_pointer;\n this.stackUpper = sp instanceof WebAssembly.Global ? (sp.value as number) : 0;\n }\n\n get supported(): boolean {\n return typeof this.exports.asyncify_start_unwind === 'function';\n }\n\n resume(): boolean {\n if (this.exports.asyncify_get_state?.() !== UNWINDING) return false;\n this.exports.asyncify_stop_unwind?.();\n const op = this.pending;\n this.pending = undefined;\n if (!op) throw new Error('WASIX: unwound with nothing to do');\n this.exports.asyncify_start_rewind?.(op());\n return true;\n }\n\n setjmps(): WasiSetjmps {\n return { next: this.nextSnapshot, snapshots: [...this.snapshots] };\n }\n\n startChild(state: WasiForkState): void {\n for (const [id, snap] of state.setjmps?.snapshots ?? []) this.snapshots.set(id, snap);\n this.nextSnapshot = Math.max(this.nextSnapshot, state.setjmps?.next ?? 1);\n this.restoreGlobals(state.globals);\n this.answer = 0;\n this.exports.asyncify_start_rewind?.(state.asyncifyData);\n }\n\n rewound(): number | undefined {\n if (this.exports.asyncify_get_state?.() !== REWINDING) return undefined;\n this.exports.asyncify_stop_rewind?.();\n return this.answer;\n }\n\n fork(\n fork: (asyncifyData: number, globals: Array<[string, number]>, sp: number) => number\n ): number {\n const sp = this.stackPointer();\n const globals = mutableGlobals(this.exports);\n return this.unwind((data) => {\n this.answer = fork(data, globals, sp);\n });\n }\n\n checkpoint(snapPtr: number, retPtr: number): number {\n const id = this.nextSnapshot++;\n const v = this.mem.view();\n v.setBigUint64(snapPtr, BigInt(retPtr), true);\n v.setBigUint64(snapPtr + 8, BigInt(id), true);\n v.setBigUint64(snapPtr + 16, 0x51cc5117n, true);\n const globals = mutableGlobals(this.exports);\n return this.unwind((data) => {\n const end = this.mem.view().getUint32(data, true);\n this.snapshots.set(id, { frames: this.mem.bytes(data + 8, end - data - 8).slice(), globals });\n this.answer = 0;\n });\n }\n\n restore(snapPtr: number, val: bigint): number {\n const id = Number(this.mem.view().getBigUint64(snapPtr + 8, true));\n const snap = this.snapshots.get(id);\n if (!snap) throw new Error(`WASIX: longjmp to an unknown setjmp (${id})`);\n return this.unwind((data) => {\n this.mem.bytes(data + 8, snap.frames.length).set(snap.frames);\n this.mem.view().setUint32(data, data + 8 + snap.frames.length, true);\n this.restoreGlobals(snap.globals);\n this.answer = Number(val) || 1;\n });\n }\n\n private stackPointer(): number {\n const g = this.exports.__stack_pointer;\n return g instanceof WebAssembly.Global ? (g.value as number) : 0;\n }\n\n private dataPointer(): number {\n const g = this.exports.__data_end;\n const dataEnd = g instanceof WebAssembly.Global ? (g.value as number) : 0;\n return dataEnd < this.stackUpper ? (dataEnd + 15) & ~15 : 16;\n }\n\n private unwind(then: (data: number) => void): number {\n if (!this.supported) return E.NOSYS;\n const data = this.dataPointer();\n const v = this.mem.view();\n v.setUint32(data, data + 8, true);\n v.setUint32(data + 4, this.stackPointer() - 16, true);\n this.pending = () => {\n then(data);\n return data;\n };\n this.exports.asyncify_start_unwind?.(data);\n return E.SUCCESS;\n }\n\n private restoreGlobals(globals: Array<[string, number]>): void {\n for (const [name, value] of globals) {\n const g = this.exports[name];\n if (g instanceof WebAssembly.Global) g.value = value;\n }\n }\n}\n", "import { type DylinkInfo, dylinkInfo } from './dylink.ts';\nimport { normalize } from './wasi-files.ts';\n\nconst TABLE_BASE = 1;\nconst PAGE = 65536;\n\nexport const STACK_SIZE = 8 * 1024 * 1024;\n\nconst LIBRARY_DIRS = ['/lib', '/usr/lib', '/usr/local/lib'];\n\nfunction expandOrigin(entry: string, dir: string): string {\n return entry.replace(/\\$(?:ORIGIN\\b|\\{ORIGIN\\})/g, dir);\n}\n\nexport type LinkRecord =\n | { kind: 'load'; handle: number; path: string; memoryBase: number; tableBase: number }\n | { kind: 'slot'; index: number; handle: number; name: string };\n\nexport interface LinkerHost {\n read(path: string): Uint8Array<ArrayBuffer> | undefined;\n\n hostImports(module: WebAssembly.Module): WebAssembly.Imports;\n}\n\ninterface Linked {\n handle: number;\n path: string;\n module: WebAssembly.Module;\n info: DylinkInfo;\n instance: WebAssembly.Instance;\n memoryBase: number;\n tableBase: number;\n\n needed: number[];\n}\n\nexport class DlError extends Error {}\n\nexport class WasixLinker {\n readonly table: WebAssembly.Table;\n readonly stackPointer: WebAssembly.Global;\n readonly memoryBase: number;\n readonly stackLow: number;\n readonly stackHigh: number;\n private readonly cLongjmp: WebAssembly.Tag;\n private readonly cppException: WebAssembly.Tag;\n private main: WebAssembly.Instance | undefined;\n private readonly modules = new Map<number, Linked>();\n private readonly byPath = new Map<string, Linked>();\n\n private mainGot: Array<() => void> = [];\n private readonly slots = new Map<unknown, number>();\n private nextHandle = 1;\n\n publisher: ((record: LinkRecord) => void) | undefined;\n\n private readonly memory: WebAssembly.Memory;\n private readonly host: LinkerHost;\n constructor(\n memory: WebAssembly.Memory,\n mainInfo: DylinkInfo,\n host: LinkerHost,\n\n thread = false\n ) {\n this.memory = memory;\n this.host = host;\n this.memoryBase = Math.max(1, 2 ** mainInfo.memoryAlign);\n this.stackLow = align(this.memoryBase + mainInfo.memorySize, 1024);\n this.stackHigh = this.stackLow + STACK_SIZE;\n if (!thread) growTo(memory, this.stackHigh);\n this.table = new WebAssembly.Table({\n element: 'anyfunc',\n initial: TABLE_BASE + mainInfo.tableSize,\n });\n this.stackPointer = new WebAssembly.Global(\n { value: 'i32', mutable: true },\n thread ? 0 : this.stackHigh\n );\n const tag = () =>\n new (\n WebAssembly as unknown as { Tag: new (t: { parameters: string[] }) => WebAssembly.Tag }\n ).Tag({\n parameters: ['i32'],\n });\n this.cLongjmp = tag();\n this.cppException = tag();\n }\n\n mainImports(module: WebAssembly.Module): Record<string, Record<string, WebAssembly.ImportValue>> {\n const i32 = (v: number) => new WebAssembly.Global({ value: 'i32', mutable: false }, v);\n const got = (v: number) => new WebAssembly.Global({ value: 'i32', mutable: true }, v);\n const env: Record<string, WebAssembly.ImportValue> = {\n memory: this.memory,\n __indirect_function_table: this.table,\n __stack_pointer: this.stackPointer,\n __memory_base: i32(this.memoryBase),\n __table_base: i32(TABLE_BASE),\n __c_longjmp: this.cLongjmp as unknown as WebAssembly.ImportValue,\n __cpp_exception: this.cppException as unknown as WebAssembly.ImportValue,\n };\n const gotMem: Record<string, WebAssembly.Global> = {\n __stack_high: got(this.stackHigh),\n __stack_low: got(this.stackLow),\n __heap_base: got(this.stackHigh),\n };\n const gotFunc: Record<string, WebAssembly.Global> = {};\n this.mainGot = [];\n\n for (const imp of WebAssembly.Module.imports(module)) {\n if (imp.module === 'env' && imp.kind === 'function' && !(imp.name in env)) {\n env[imp.name] = this.functionImport(imp.name);\n } else if (imp.module === 'GOT.func' || (imp.module === 'GOT.mem' && !(imp.name in gotMem))) {\n const g = got(0);\n (imp.module === 'GOT.func' ? gotFunc : gotMem)[imp.name] = g;\n const kind = imp.module;\n this.mainGot.push(() => {\n g.value = kind === 'GOT.func' ? this.slotOrNull(imp.name) : this.addressOrNull(imp.name);\n });\n }\n }\n return { env, 'GOT.mem': gotMem, 'GOT.func': gotFunc };\n }\n\n bindMainGot(): void {\n for (const resolve of this.mainGot) resolve();\n }\n\n bindMain(instance: WebAssembly.Instance, relocate: boolean): void {\n this.main = instance;\n\n if (relocate) call(instance, '__wasm_apply_data_relocs');\n }\n\n open(name: string, cwd: string, ldPath: readonly string[]): number {\n return this.load(this.locate(name, cwd, ldPath), cwd, ldPath).handle;\n }\n\n symbol(handle: number, name: string): number {\n const found =\n handle === 0 ? this.find(name) : this.findIn(this.module(handle), name, new Set());\n if (!found) throw new DlError(`undefined symbol: ${name}`);\n const [owner, value] = found;\n if (typeof value === 'function') return this.slot(value, owner, name);\n if (value instanceof WebAssembly.Global) return this.baseOf(owner) + (value.value as number);\n throw new DlError(`${name} is neither a function nor data`);\n }\n\n invalid(handle: number): boolean {\n return !this.modules.has(handle);\n }\n\n cache: Readonly<Record<string, WebAssembly.Module>> | undefined;\n\n compiled(): Record<string, WebAssembly.Module> {\n const out: Record<string, WebAssembly.Module> = {};\n for (const [path, linked] of this.byPath) out[path] = linked.module;\n return out;\n }\n\n replay(record: LinkRecord): void {\n if (record.kind === 'load') {\n if (this.modules.has(record.handle)) return;\n this.instantiate(record.path, this.moduleAt(record.path), record, false);\n this.nextHandle = Math.max(this.nextHandle, record.handle + 1);\n return;\n }\n const value =\n record.handle === 0\n ? this.main?.exports[record.name]\n : this.module(record.handle).instance.exports[record.name];\n if (typeof value !== 'function') throw new DlError(`${record.name}: not a function`);\n growTable(this.table, record.index + 1);\n this.table.set(record.index, value);\n this.slots.set(value, record.index);\n }\n\n private moduleAt(path: string): WebAssembly.Module {\n const cached = this.cache?.[path];\n if (cached) return cached;\n const bytes = this.host.read(path);\n if (!bytes) throw new DlError(`${path}: gone`);\n return new WebAssembly.Module(bytes);\n }\n\n private module(handle: number): Linked {\n const m = this.modules.get(handle);\n if (!m) throw new DlError(`invalid handle ${handle}`);\n return m;\n }\n\n private locate(name: string, cwd: string, ldPath: readonly string[]): string {\n if (name.includes('/'))\n return name.startsWith('/') ? normalize(name) : normalize(`${cwd}/${name}`);\n for (const dir of [...ldPath.filter(Boolean), ...LIBRARY_DIRS]) {\n const path = normalize(`${dir.startsWith('/') ? '' : `${cwd}/`}${dir}/${name}`);\n if (this.byPath.has(path) || this.host.read(path)) return path;\n }\n throw new DlError(`${name}: not found`);\n }\n\n private load(path: string, cwd: string, ldPath: readonly string[]): Linked {\n const loaded = this.byPath.get(path);\n if (loaded) return loaded;\n const bytes = this.host.read(path);\n if (!bytes) throw new DlError(`${path}: no such file`);\n let module: WebAssembly.Module;\n try {\n module = new WebAssembly.Module(bytes);\n } catch (e) {\n throw new DlError(`${path}: not a wasm module (${(e as Error).message})`);\n }\n const info = dylinkInfo(module);\n if (!info) throw new DlError(`${path}: not a side module (no dylink.0)`);\n\n const dir = path.slice(0, path.lastIndexOf('/')) || '/';\n const search = [dir, ...ldPath, ...info.runtimePath.map((p) => expandOrigin(p, dir))];\n const needed = info.needed.map(\n (n) => this.load(this.locate(n, cwd, search), cwd, ldPath).handle\n );\n const memoryBase = this.allocate(info.memorySize, 2 ** info.memoryAlign);\n const tableBase = this.table.length;\n const record: LinkRecord = {\n kind: 'load',\n handle: this.nextHandle++,\n path,\n memoryBase,\n tableBase,\n };\n const linked = this.instantiate(path, module, record, true);\n linked.needed.push(...needed);\n this.publisher?.(record);\n return linked;\n }\n\n private instantiate(\n path: string,\n module: WebAssembly.Module,\n at: { handle: number; memoryBase: number; tableBase: number },\n init: boolean\n ): Linked {\n const info = dylinkInfo(module) as DylinkInfo;\n growTable(this.table, at.tableBase + info.tableSize);\n const pending: Array<() => void> = [];\n const env: Record<string, WebAssembly.ImportValue> = {\n memory: this.memory,\n __indirect_function_table: this.table,\n __stack_pointer: this.stackPointer,\n __memory_base: new WebAssembly.Global({ value: 'i32', mutable: false }, at.memoryBase),\n __table_base: new WebAssembly.Global({ value: 'i32', mutable: false }, at.tableBase),\n __c_longjmp: this.cLongjmp as unknown as WebAssembly.ImportValue,\n __cpp_exception: this.cppException as unknown as WebAssembly.ImportValue,\n };\n const gotMem: Record<string, WebAssembly.Global> = {};\n const gotFunc: Record<string, WebAssembly.Global> = {};\n const linked: Linked = {\n handle: at.handle,\n path,\n module,\n info,\n instance: undefined as never,\n memoryBase: at.memoryBase,\n tableBase: at.tableBase,\n needed: [],\n };\n for (const imp of WebAssembly.Module.imports(module)) {\n if (imp.module === 'env' && imp.kind === 'function' && !(imp.name in env)) {\n env[imp.name] = this.functionImport(imp.name);\n } else if (imp.module === 'GOT.mem') {\n const g = new WebAssembly.Global({ value: 'i32', mutable: true }, 0);\n gotMem[imp.name] = g;\n\n pending.push(() => {\n g.value = this.addressOrNull(imp.name);\n });\n } else if (imp.module === 'GOT.func') {\n const g = new WebAssembly.Global({ value: 'i32', mutable: true }, 0);\n gotFunc[imp.name] = g;\n pending.push(() => {\n g.value = this.slotOrNull(imp.name);\n });\n }\n }\n const imports: WebAssembly.Imports = {\n ...this.host.hostImports(module),\n env,\n 'GOT.mem': gotMem,\n 'GOT.func': gotFunc,\n };\n linked.instance = new WebAssembly.Instance(module, imports);\n this.modules.set(at.handle, linked);\n this.byPath.set(path, linked);\n for (const resolve of pending) resolve();\n if (init) {\n call(linked.instance, '__wasm_apply_data_relocs');\n call(linked.instance, '__wasm_call_ctors');\n } else {\n call(linked.instance, '__wasix_init_tls');\n }\n return linked;\n }\n\n private functionImport(name: string): WebAssembly.ImportValue {\n const now = this.find(name);\n if (now && typeof now[1] === 'function') return now[1] as WebAssembly.ImportValue;\n let resolved: ((...args: unknown[]) => unknown) | undefined;\n return (...args: unknown[]) => {\n if (!resolved) {\n const later = this.find(name);\n\n if (!later || typeof later[1] !== 'function')\n throw new WebAssembly.RuntimeError(`unresolved symbol ${name}`);\n resolved = later[1] as (...args: unknown[]) => unknown;\n }\n return resolved(...args);\n };\n }\n\n private addressOrNull(name: string): number {\n const found = this.find(name);\n if (!found || !(found[1] instanceof WebAssembly.Global)) return 0;\n return this.baseOf(found[0]) + (found[1].value as number);\n }\n\n private slotOrNull(name: string): number {\n const found = this.find(name);\n if (!found || typeof found[1] !== 'function') return 0;\n return this.slot(found[1], found[0], name);\n }\n\n private find(name: string): [number, unknown] | undefined {\n const inMain = this.main?.exports[name];\n if (inMain !== undefined) return [0, inMain];\n for (const m of this.modules.values()) {\n const v = m.instance?.exports[name];\n if (v !== undefined) return [m.handle, v];\n }\n return undefined;\n }\n\n private findIn(m: Linked, name: string, seen: Set<number>): [number, unknown] | undefined {\n if (seen.has(m.handle)) return undefined;\n seen.add(m.handle);\n const v = m.instance.exports[name];\n if (v !== undefined) return [m.handle, v];\n for (const h of m.needed) {\n const found = this.findIn(this.module(h), name, seen);\n if (found) return found;\n }\n return undefined;\n }\n\n private baseOf(handle: number): number {\n return handle === 0 ? this.memoryBase : this.module(handle).memoryBase;\n }\n\n private slot(fn: unknown, handle: number, name: string): number {\n const known = this.slots.get(fn);\n if (known !== undefined) return known;\n const index = this.table.length;\n this.table.grow(1);\n this.table.set(index, fn as never);\n this.slots.set(fn, index);\n this.publisher?.({ kind: 'slot', index, handle, name });\n return index;\n }\n\n private allocate(size: number, alignment: number): number {\n if (size === 0) return 0;\n const base = align(this.memory.buffer.byteLength, Math.max(alignment, 16));\n growTo(this.memory, base + size);\n return base;\n }\n}\n\nfunction align(n: number, to: number): number {\n return Math.ceil(n / to) * to;\n}\n\nfunction growTo(memory: WebAssembly.Memory, bytes: number): void {\n const pages = Math.ceil(bytes / PAGE) - memory.buffer.byteLength / PAGE;\n if (pages > 0) memory.grow(pages);\n}\n\nfunction growTable(table: WebAssembly.Table, length: number): void {\n if (table.length < length) table.grow(length - table.length);\n}\n\nfunction call(instance: WebAssembly.Instance, name: string): void {\n const fn = instance.exports[name];\n if (typeof fn === 'function') (fn as () => void)();\n}\n", "import type { ChildStdio, InheritedSlot } from '../../kernel/children.ts';\nimport { WASI_SIGNAL_TO_POSIX } from './wasi-abi.ts';\nimport { normalize } from './wasi-files.ts';\nimport { WasiExit, type WasiHost } from './wasi-host.ts';\nimport type { AsyncifyDriver, WasiForkState } from './wasix-fork.ts';\n\nexport interface SpawnFdOp {\n cmd: 'close' | 'dup2' | 'open' | 'chdir' | 'fchdir';\n fd: number;\n srcFd: number;\n path: string;\n oflags: number;\n rightsWrite: boolean;\n append: boolean;\n}\n\nexport interface ChildRequest {\n name: string;\n argv: string[];\n\n env?: Record<string, string>;\n search: boolean;\n path: string;\n ops?: readonly SpawnFdOp[];\n}\n\nfunction resolveFrom(cwd: string, path: string): string {\n return normalize(path.startsWith('/') ? path : `${cwd}/${path}`);\n}\n\nconst POSIX_TO_WASI_SIGNAL: Readonly<Record<number, number>> = Object.fromEntries(\n Object.entries(WASI_SIGNAL_TO_POSIX).map(([wasi, posix]) => [posix, Number(wasi)])\n);\n\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\nconst OFLAG_CREAT = 1;\nconst OFLAG_TRUNC = 8;\n\nexport class WasixProcess {\n private readonly host: WasiHost;\n private readonly driver: AsyncifyDriver;\n constructor(host: WasiHost, driver: AsyncifyDriver) {\n this.host = host;\n this.driver = driver;\n }\n\n private call(req: Parameters<WasiHost['o']['kernel']['call']>[0]): unknown {\n return this.host.o.kernel.call(req);\n }\n\n private environment(): Record<string, string> {\n return { ...this.host.o.env, PWD: this.host.cwd };\n }\n\n private locate(name: string, search: boolean, path: string): string {\n if (name.includes('/'))\n return name.startsWith('/') ? name : normalize(`${this.host.cwd}/${name}`);\n if (!search) return name;\n for (const dir of path.split(':')) {\n if (!dir) continue;\n const candidate = normalize(\n `${dir.startsWith('/') ? '' : `${this.host.cwd}/`}${dir}/${name}`\n );\n if (this.host.o.fs.exists(candidate)) return candidate;\n }\n return name;\n }\n\n private childFds(ops: readonly SpawnFdOp[]): {\n stdio: ChildStdio[];\n inherit: InheritedSlot[];\n cwd: string;\n opened: number[];\n } {\n const { fds } = this.host;\n fds.promoteFiles();\n const map = fds.inheritable();\n\n const nulls = new Set<number>();\n const opened: number[] = [];\n let cwd = this.host.cwd;\n try {\n for (const op of ops) cwd = this.applyFdOp(op, { map, nulls, opened }, cwd);\n } catch (e) {\n for (const kfd of opened) this.host.o.kernel.sys.close(kfd);\n throw e;\n }\n const stdio: ChildStdio[] = [0, 1, 2].map((fd) => {\n const k = map.get(fd);\n return k === undefined ? { none: true } : { fd: k };\n });\n const inherit: InheritedSlot[] = [\n ...[...map].filter(([fd]) => fd > 2).map(([fd, kernel]) => ({ fd, kernel })),\n ...[...nulls].filter((fd) => fd > 2).map((fd) => ({ fd, device: 'null' as const })),\n ];\n return { stdio, inherit, cwd, opened };\n }\n\n private applyFdOp(\n op: SpawnFdOp,\n slots: { map: Map<number, number>; nulls: Set<number>; opened: number[] },\n cwd: string\n ): string {\n const { map, nulls, opened } = slots;\n const { fds } = this.host;\n const point = (fd: number, kfd: number | undefined) => {\n if (kfd === undefined) {\n map.delete(fd);\n nulls.add(fd);\n } else {\n map.set(fd, kfd);\n nulls.delete(fd);\n }\n };\n if (op.cmd === 'close') {\n map.delete(op.fd);\n nulls.delete(op.fd);\n } else if (op.cmd === 'dup2' && nulls.has(op.srcFd)) point(op.fd, undefined);\n else if (op.cmd === 'dup2') {\n const src =\n map.get(op.srcFd) ?? (fds.find(op.srcFd)?.type === 'kernel' ? op.srcFd : undefined);\n if (src === undefined) throw Object.assign(new Error('EBADF'), { code: 'EBADF' });\n point(op.fd, src);\n } else if (op.cmd === 'open' && resolveFrom(cwd, op.path) === '/dev/null') {\n point(op.fd, undefined);\n } else if (op.cmd === 'open') {\n const kfd = this.openFor(op, cwd);\n opened.push(kfd);\n point(op.fd, kfd);\n } else if (op.cmd === 'chdir') return resolveFrom(cwd, op.path);\n else return fds.dir(op.fd).path;\n return cwd;\n }\n\n private openFor(op: SpawnFdOp, cwd: string): number {\n const path = resolveFrom(cwd, op.path);\n const create = (op.oflags & OFLAG_CREAT) !== 0;\n if (!create && !this.host.o.fs.exists(path)) {\n throw Object.assign(new Error('ENOENT'), { code: 'ENOENT' });\n }\n const flags = (op.rightsWrite ? O_RDWR : 0) | (op.append ? O_APPEND : 0);\n\n return this.host.o.kernel.sys.openVfs(path, op.rightsWrite ? flags || O_WRONLY : 0, 0, {\n ...(create ? { create } : {}),\n ...(op.oflags & OFLAG_TRUNC ? { truncate: true } : {}),\n });\n }\n\n spawn(req: ChildRequest): number {\n const { stdio, inherit, cwd, opened } = this.childFds(req.ops ?? []);\n try {\n return this.call({\n op: 'proc-spawn',\n file: this.locate(req.name, req.search, req.path),\n argv: req.argv.length > 0 ? req.argv : [req.name],\n env: req.env ?? this.environment(),\n cwd,\n stdio,\n inherit,\n }) as number;\n } finally {\n for (const kfd of opened) this.host.o.kernel.sys.close(kfd);\n\n this.host.o.fs.invalidate?.();\n }\n }\n\n exec(req: ChildRequest): never {\n const pid = this.spawn(req);\n const [, status] = this.call({ op: 'proc-exec', pid }) as [number, number];\n const sig = status & 0x7f;\n throw new WasiExit(sig ? 128 + sig : (status >> 8) & 0xff);\n }\n\n join(pidPtr: number, flags: number, statusPtr: number): void {\n const v = this.host.mem.view();\n const pid = v.getUint8(pidPtr) === 1 ? v.getUint32(pidPtr + 4, true) : -1;\n this.host.mem.bytes(statusPtr, 6).fill(0);\n const [child, status] = this.call({ op: 'proc-wait', pid, nohang: (flags & 1) !== 0 }) as [\n number,\n number,\n ];\n if (child === 0) return;\n\n this.host.o.fs.invalidate?.();\n v.setUint8(pidPtr, 1);\n v.setUint32(pidPtr + 4, child, true);\n const sig = status & 0x7f;\n if (sig) {\n v.setUint8(statusPtr, 2);\n v.setUint8(statusPtr + 4, POSIX_TO_WASI_SIGNAL[sig] ?? sig);\n } else {\n v.setUint8(statusPtr, 1);\n v.setUint16(statusPtr + 2, (status >> 8) & 0xff, true);\n }\n }\n\n fork(pidPtr: number): number | undefined {\n const back = this.driver.rewound();\n if (back !== undefined) {\n this.host.mem.view().setUint32(pidPtr, back, true);\n return undefined;\n }\n return this.driver.fork((asyncifyData, globals, forkSp) => {\n const { fds } = this.host;\n fds.promoteFiles();\n const memory = this.host.mem.bytes(0, this.host.mem.size()).slice();\n const wasi: WasiForkState = {\n asyncifyData,\n globals,\n fds: fds.snapshot(),\n cloexec: [...fds.cloexec],\n cwd: this.host.cwd,\n ...(fds.isShared ? { shared: true as const } : {}),\n setjmps: this.driver.setjmps(),\n };\n return this.call({\n op: 'proc-fork',\n state: { memory, currData: 0, forkSp, callStackNames: [], ppid: this.host.o.pid, wasi },\n }) as number;\n });\n }\n}\n", "import type { SockAddr } from '../../kernel/socket.ts';\nimport { E, FDFLAGS } from './wasi-abi.ts';\nimport { WasiError } from './wasi-files.ts';\nimport type { WasiFunction, WasiHost } from './wasi-host.ts';\n\nconst INET4 = 1;\nconst INET6 = 2;\nconst UNIX = 3;\nconst STREAM = 1;\nconst ADDR_IP_SIZE = 18;\nconst LOOPBACK = '127.0.0.1';\n\nconst OPTIONS: Readonly<Record<number, readonly [number, number]>> = {\n 1: [1, 15],\n 2: [1, 2],\n 3: [6, 1],\n 4: [1, 5],\n 6: [1, 6],\n 10: [1, 30],\n 11: [1, 4],\n 12: [1, 9],\n 14: [1, 10],\n 15: [1, 8],\n 16: [1, 7],\n 25: [1, 3],\n};\n\nexport function readAddr(view: DataView, ptr: number): SockAddr {\n const tag = view.getUint8(ptr);\n if (tag === UNIX) {\n let end = ptr + 2;\n while (end < ptr + 110 && view.getUint8(end) !== 0) end++;\n const path = new TextDecoder().decode(\n new Uint8Array(view.buffer, ptr + 2, end - ptr - 2).slice()\n );\n return { family: 'unix', path };\n }\n const port = view.getUint16(ptr + 2, true);\n if (tag === INET4) {\n const host = [0, 1, 2, 3].map((i) => view.getUint8(ptr + 4 + i)).join('.');\n return { family: 'inet', host, port };\n }\n if (tag === INET6) {\n const bytes = new Uint8Array(view.buffer, ptr + 4, 16);\n const any = bytes.every((b) => b === 0);\n return { family: 'inet', host: any ? '0.0.0.0' : LOOPBACK, port };\n }\n throw new WasiError('EAFNOSUPPORT');\n}\n\nexport function writeAddr(view: DataView, ptr: number, addr: SockAddr | undefined): void {\n new Uint8Array(view.buffer, ptr, 110).fill(0);\n if (!addr) return;\n if (addr.family === 'unix') {\n view.setUint8(ptr, UNIX);\n new Uint8Array(view.buffer, ptr + 2, 107).set(\n new TextEncoder().encode(addr.path).subarray(0, 107)\n );\n return;\n }\n view.setUint8(ptr, INET4);\n view.setUint16(ptr + 2, addr.port, true);\n const octets = ipv4(addr.host) ?? [127, 0, 0, 1];\n octets.forEach((b, i) => void view.setUint8(ptr + 4 + i, b));\n}\n\nfunction ipv4(host: string): number[] | undefined {\n const parts = host.split('.');\n if (parts.length !== 4) return undefined;\n const bytes = parts.map((p) => (/^\\d{1,3}$/.test(p) ? Number(p) : Number.NaN));\n return bytes.every((b) => b >= 0 && b <= 255) ? bytes : undefined;\n}\n\nexport function resolveName(name: string): number[] | undefined {\n if (name === 'localhost' || name === 'localhost.localdomain' || name === 'ip6-localhost') {\n return [127, 0, 0, 1];\n }\n if (name === '::1') return [127, 0, 0, 1];\n return ipv4(name);\n}\n\nexport function wasixSocketImports(\n host: WasiHost,\n preview1: Record<string, WasiFunction>\n): Record<string, WasiFunction> {\n const { mem, fds, o } = host;\n const call = (req: Parameters<typeof o.kernel.call>[0]) => o.kernel.call(req);\n\n const socket = (fd: number) => {\n const e = fds.get(fd);\n if (e.type !== 'kernel' || fds.kind(fd, e) !== 'socket') throw new WasiError('ENOTSOCK');\n return e;\n };\n const option = (opt: number): readonly [number, number] | undefined => OPTIONS[opt];\n return {\n sock_open: (af: number, type: number, _proto: number, out: number) => {\n if (af !== INET4 && af !== INET6 && af !== UNIX) throw new WasiError('EAFNOSUPPORT');\n if (type !== STREAM) throw new WasiError('EPROTONOSUPPORT');\n const fd = call({ op: 'sock-open', domain: af === UNIX ? 'unix' : 'inet' }) as number;\n fds.adopt(fd, 'socket', false);\n mem.view().setUint32(out, fd, true);\n },\n sock_bind: (fd: number, addr: number) => {\n socket(fd);\n call({ op: 'sock-bind', fd, addr: readAddr(mem.view(), addr) });\n },\n sock_listen: (fd: number, backlog: number) => {\n socket(fd);\n call({ op: 'sock-listen', fd, backlog });\n },\n sock_connect: (fd: number, addr: number) => {\n const e = socket(fd);\n call({ op: 'sock-connect', fd, addr: readAddr(mem.view(), addr), nonblock: e.nonblock });\n },\n sock_accept_v2: (fd: number, flags: number, outFd: number, outAddr: number) => {\n const e = socket(fd);\n const r = call({ op: 'sock-accept', fd, nonblock: e.nonblock }) as {\n fd: number;\n peer?: SockAddr;\n };\n fds.adopt(r.fd, 'socket', (flags & FDFLAGS.NONBLOCK) !== 0);\n mem.view().setUint32(outFd, r.fd, true);\n writeAddr(mem.view(), outAddr, r.peer);\n },\n sock_addr_local: (fd: number, out: number) => {\n socket(fd);\n writeAddr(mem.view(), out, call({ op: 'sock-name', fd, peer: false }) as SockAddr);\n },\n sock_addr_peer: (fd: number, out: number) => {\n socket(fd);\n writeAddr(mem.view(), out, call({ op: 'sock-name', fd, peer: true }) as SockAddr);\n },\n\n sock_recv_from: (\n fd: number,\n iovs: number,\n n: number,\n riflags: number,\n outLen: number,\n outFlags: number,\n outAddr: number\n ) => {\n const r = preview1.sock_recv(\n fd as never,\n iovs as never,\n n as never,\n riflags as never,\n outLen as never,\n outFlags as never\n );\n if (r !== E.SUCCESS) return r;\n writeAddr(mem.view(), outAddr, call({ op: 'sock-name', fd, peer: true }) as SockAddr);\n return E.SUCCESS;\n },\n sock_send_to: (\n fd: number,\n iovs: number,\n n: number,\n flags: number,\n _addr: number,\n out: number\n ) => preview1.sock_send(fd as never, iovs as never, n as never, flags as never, out as never),\n sock_status: (fd: number, out: number) => {\n socket(fd);\n mem.view().setUint8(out, 1);\n },\n sock_get_opt_flag: (fd: number, opt: number, out: number) => {\n socket(fd);\n const pair = option(opt);\n const v = pair\n ? (call({ op: 'sock-getopt', fd, level: pair[0], name: pair[1] }) as number)\n : 0;\n mem.view().setUint8(out, v ? 1 : 0);\n },\n sock_set_opt_flag: (fd: number, opt: number, flag: number) => {\n socket(fd);\n const pair = option(opt);\n if (pair) call({ op: 'sock-setopt', fd, level: pair[0], name: pair[1], value: flag ? 1 : 0 });\n },\n sock_get_opt_size: (fd: number, opt: number, out: number) => {\n socket(fd);\n const pair = option(opt);\n const v = pair\n ? (call({ op: 'sock-getopt', fd, level: pair[0], name: pair[1] }) as number)\n : 0;\n mem.view().setBigUint64(out, BigInt(v), true);\n },\n sock_set_opt_size: (fd: number, opt: number, size: bigint) => {\n socket(fd);\n const pair = option(opt);\n if (pair) call({ op: 'sock-setopt', fd, level: pair[0], name: pair[1], value: Number(size) });\n },\n\n sock_get_opt_time: (fd: number, _opt: number, out: number) => {\n socket(fd);\n new Uint8Array(mem.view().buffer, out, 16).fill(0);\n },\n sock_set_opt_time: (fd: number) => void socket(fd),\n\n sock_send_file: () => E.NOSYS,\n\n resolve: (\n name: number,\n len: number,\n _port: number,\n addrs: number,\n naddrs: number,\n out: number\n ) => {\n const ip = resolveName(mem.string(name, len));\n if (!ip) throw new WasiError('ENOENT');\n if (naddrs < 1) throw new WasiError('EINVAL');\n const view = mem.view();\n new Uint8Array(view.buffer, addrs, ADDR_IP_SIZE).fill(0);\n view.setUint8(addrs, INET4);\n ip.forEach((b, i) => void view.setUint8(addrs + 2 + i, b));\n view.setUint32(out, 1, true);\n },\n };\n}\n", "import { E, FDFLAGS, WASI_SIGNAL_TO_POSIX, wasiErrnoOf } from './wasi-abi.ts';\nimport { WasiError } from './wasi-files.ts';\nimport { WasiExit, type WasiFunction, type WasiHost, wrap } from './wasi-host.ts';\nimport type { WasiSignals } from './wasi-signals.ts';\nimport { MAIN_TID, ThreadExit, type WasiThreads } from './wasi-threads.ts';\nimport type { AsyncifyDriver } from './wasix-fork.ts';\nimport { DlError, type WasixLinker } from './wasix-linker.ts';\nimport { type SpawnFdOp, WasixProcess } from './wasix-process.ts';\nimport { wasixSocketImports } from './wasix-sockets.ts';\n\nconst FDFLAGSEXT_CLOEXEC = 1;\nconst SPAWN_OP_SIZE = 56;\nconst SPAWN_OPS = ['close', 'dup2', 'open', 'chdir', 'fchdir'] as const;\nconst RIGHTS_FD_WRITE = 1n << 6n;\n\nconst ICANON = 0o2;\nconst ECHO = 0o10;\n\nexport const COMPAT: Readonly<Record<string, readonly string[]>> = {\n exit: ['proc_exit2'],\n exec: ['proc_exec', 'proc_exec2', 'proc_exec3', 'proc_exec4'],\n spawn: ['proc_spawn2', 'proc_spawn3'],\n open: ['path_open2'],\n dup: ['fd_dup', 'fd_dup2'],\n alarm: ['proc_raise_interval', 'proc_raise_interval2'],\n};\n\nexport class WasixHost {\n private readonly process: WasixProcess;\n\n threads: WasiThreads | undefined;\n\n linker: WasixLinker | undefined;\n\n signals: WasiSignals | undefined;\n\n private readonly host: WasiHost;\n private readonly driver: AsyncifyDriver;\n constructor(host: WasiHost, driver: AsyncifyDriver, module?: WebAssembly.Module) {\n this.host = host;\n this.driver = driver;\n this.process = new WasixProcess(host, driver);\n\n if (module && !WebAssembly.Module.imports(module).some((i) => i.name === 'fd_fdflags_set')) {\n host.fds.implicitCloexec = true;\n\n host.interruptWakes = true;\n }\n }\n\n private get mem() {\n return this.host.mem;\n }\n\n private str(ptr: number, len: number): string {\n const s = this.mem.string(ptr, len);\n return s.endsWith('\\0') ? s.slice(0, -1) : s;\n }\n\n private cStrings(ptr: number, count: number): string[] {\n const v = this.mem.view();\n return Array.from({ length: count }, (_, i) =>\n this.mem.cString(v.getUint32(ptr + i * 4, true))\n );\n }\n\n private execOrExit(n: number, nl: number, a: number, al: number, e: number, el: number): never {\n try {\n return this.process.exec({\n name: this.str(n, nl),\n argv: WasixHost.lines(this.str(a, al)),\n env: WasixHost.env(e === 0 ? undefined : WasixHost.lines(this.str(e, el))),\n search: false,\n path: '',\n });\n } catch (err) {\n if (err instanceof WasiExit) throw err;\n const code = err instanceof WasiError ? err.code : (err as { code?: unknown } | null)?.code;\n throw new WasiExit(wasiErrnoOf(typeof code === 'string' ? code : 'ENOEXEC'));\n }\n }\n\n private static env(entries: readonly string[] | undefined): Record<string, string> | undefined {\n if (!entries) return undefined;\n const env: Record<string, string> = {};\n for (const line of entries) {\n const eq = line.indexOf('=');\n if (eq > 0) env[line.slice(0, eq)] = line.slice(eq + 1);\n }\n return env;\n }\n\n private static lines(text: string): string[] {\n return text.split('\\n').filter((line, i, all) => line !== '' || i < all.length - 1);\n }\n\n private spawnOps(ptr: number, count: number): SpawnFdOp[] {\n const v = this.mem.view();\n return Array.from({ length: count }, (_, i) => {\n const p = ptr + i * SPAWN_OP_SIZE;\n const cmd = SPAWN_OPS[v.getUint8(p)];\n if (!cmd) throw new WasiError('EINVAL');\n return {\n cmd,\n fd: v.getUint32(p + 4, true),\n srcFd: v.getUint32(p + 8, true),\n path: this.str(v.getUint32(p + 12, true), v.getUint32(p + 16, true)),\n oflags: v.getUint16(p + 24, true),\n rightsWrite: (v.getBigUint64(p + 32, true) & RIGHTS_FD_WRITE) !== 0n,\n append: (v.getUint16(p + 48, true) & FDFLAGS.APPEND) !== 0,\n };\n });\n }\n\n imports(): Record<string, WasiFunction> {\n return wrap({\n ...this.startupImports(),\n ...this.fdImports(),\n ...this.processImports(),\n ...this.threadImports(),\n ...this.dlImports(),\n ...wasixSocketImports(this.host, this.host.imports()),\n });\n }\n\n preview1(): Record<string, WasiFunction> {\n const { fds } = this.host;\n return wrap({\n fd_renumber: (from: number, to: number) => void fds.renumber(from, to, true),\n fd_close: (fd: number) => {\n const e = fds.get(fd);\n if (e.type !== 'dir' || !e.preopen) fds.close(fd);\n },\n });\n }\n\n private startupImports(): Record<string, WasiFunction> {\n const { host, mem } = this;\n return {\n proc_exit2: (code: number) => {\n throw new WasiExit(code);\n },\n\n proc_signals_sizes_get: (out: number) => void mem.view().setUint32(out, 0, true),\n proc_signals_get: () => E.SUCCESS,\n\n callback_signal: (name: number, len: number) =>\n void this.signals?.register(this.str(name, len)),\n\n proc_raise_interval: (sig: number, interval: bigint, repeat: number) =>\n void host.o.kernel.call({\n op: 'proc-alarm',\n sig: posixSignal(sig),\n ms: nsToMs(interval),\n repeat: repeat !== 0,\n }),\n\n proc_raise_interval2: (sig: number, initial: bigint, interval: bigint, repeat: number) => {\n const ms = nsToMs(interval);\n host.o.kernel.call({\n op: 'proc-alarm',\n sig: posixSignal(sig),\n ms,\n firstMs: nsToMs(initial),\n repeat: repeat !== 0 && ms > 0,\n });\n },\n proc_id: (out: number) => void mem.view().setUint32(out, host.o.pid, true),\n proc_parent: (pid: number, out: number) => {\n if (pid !== 0 && pid !== host.o.pid) throw new WasiError('ESRCH');\n mem.view().setUint32(out, host.o.ppid ?? 1, true);\n },\n getcwd: (buf: number, lenPtr: number) => {\n const bytes = new TextEncoder().encode(host.cwd);\n const max = mem.view().getUint32(lenPtr, true);\n mem.view().setUint32(lenPtr, bytes.length, true);\n if (bytes.length > max) return E.RANGE;\n mem.bytes(buf, bytes.length).set(bytes);\n if (bytes.length < max) mem.view().setUint8(buf + bytes.length, 0);\n return E.SUCCESS;\n },\n chdir: (ptr: number, len: number) => {\n const path = host.fds.resolve(3, this.str(ptr, len));\n if (!host.o.fs.stat(path).isDirectory) throw new WasiError('ENOTDIR');\n host.fds.chdir(path);\n },\n };\n }\n\n private fdImports(): Record<string, WasiFunction> {\n const { host, mem } = this;\n const preview1 = host.imports() as Record<string, (...a: unknown[]) => number>;\n return {\n fd_dup: (fd: number, out: number) =>\n void mem.view().setUint32(out, host.fds.dup(fd, 0, false), true),\n fd_dup2: (fd: number, min: number, cloexec: number, out: number) =>\n void mem.view().setUint32(out, host.fds.dup(fd, min, cloexec !== 0), true),\n fd_pipe: (rPtr: number, wPtr: number) => {\n const [r, w] = host.fds.pipe();\n mem.view().setUint32(rPtr, r, true);\n mem.view().setUint32(wPtr, w, true);\n },\n fd_fdflags_get: (fd: number, out: number) => {\n host.fds.get(fd);\n mem.view().setUint16(out, host.fds.cloexec.has(fd) ? FDFLAGSEXT_CLOEXEC : 0, true);\n },\n fd_fdflags_set: (fd: number, flags: number) =>\n void host.fds.setCloexec(fd, (flags & FDFLAGSEXT_CLOEXEC) !== 0),\n path_open2: (\n dirfd: number,\n lookup: number,\n p: number,\n l: number,\n oflags: number,\n rights: bigint,\n inheriting: bigint,\n fdflags: number,\n fdflagsext: number,\n out: number\n ) => {\n const r = preview1.path_open(dirfd, lookup, p, l, oflags, rights, inheriting, fdflags, out);\n if (r === E.SUCCESS && fdflagsext & FDFLAGSEXT_CLOEXEC)\n host.fds.setCloexec(mem.view().getUint32(out, true), true);\n return r;\n },\n tty_get: (ptr: number) => void this.ttyGet(ptr),\n tty_set: (ptr: number) => void this.ttySet(ptr),\n };\n }\n\n private processImports(): Record<string, WasiFunction> {\n const { mem, process } = this;\n return {\n proc_fork: (_copy: number, pidPtr: number) => process.fork(pidPtr),\n stack_checkpoint: (snapPtr: number, retPtr: number) => {\n const back = this.driver.rewound();\n if (back === undefined) return this.driver.checkpoint(snapPtr, retPtr);\n mem.view().setBigUint64(retPtr, BigInt(back), true);\n return E.SUCCESS;\n },\n stack_restore: (snapPtr: number, val: bigint) => void this.driver.restore(snapPtr, val),\n proc_join: (pidPtr: number, flags: number, statusPtr: number) =>\n void process.join(pidPtr, flags, statusPtr),\n proc_signal: (pid: number, sig: number) => {\n const posix = sig === 0 ? 0 : WASI_SIGNAL_TO_POSIX[sig];\n if (posix === undefined) throw new WasiError('EINVAL');\n if (pid === this.host.o.pid && posix !== 0 && this.host.onRaise?.(posix)) return;\n this.host.o.kernel.call({ op: 'proc-kill', pid, sig: posix });\n },\n\n proc_exec: (n: number, nl: number, a: number, al: number) =>\n this.execOrExit(n, nl, a, al, 0, 0),\n proc_exec2: (n: number, nl: number, a: number, al: number, e: number, el: number) =>\n this.execOrExit(n, nl, a, al, e, el),\n\n proc_exec3: (\n n: number,\n nl: number,\n a: number,\n al: number,\n e: number,\n el: number,\n search: number,\n p: number,\n pl: number\n ) =>\n process.exec({\n name: this.str(n, nl),\n argv: WasixHost.lines(this.str(a, al)),\n env: WasixHost.env(WasixHost.lines(this.str(e, el))),\n search: search !== 0,\n path: this.str(p, pl),\n }),\n\n proc_exec4: (\n n: number,\n nl: number,\n a: number,\n ac: number,\n e: number,\n ec: number,\n search: number,\n p: number,\n pl: number\n ) =>\n process.exec({\n name: this.str(n, nl),\n argv: this.cStrings(a, ac),\n env: WasixHost.env(e === 0 ? undefined : this.cStrings(e, ec)),\n search: search !== 0,\n path: this.str(p, pl),\n }),\n proc_spawn2: (...args: number[]) => {\n const [n, nl, a, al, e, el, ops, opc, , , search, p, pl, out] = args;\n const pid = process.spawn({\n name: this.str(n, nl),\n argv: WasixHost.lines(this.str(a, al)),\n env: WasixHost.env(WasixHost.lines(this.str(e, el))),\n search: search !== 0,\n path: this.str(p, pl),\n ops: this.spawnOps(ops, opc),\n });\n mem.view().setUint32(out, pid, true);\n },\n proc_spawn3: (...args: number[]) => {\n const [n, nl, a, ac, e, ec, ops, opc, , , search, p, pl, out] = args;\n const pid = process.spawn({\n name: this.str(n, nl),\n argv: this.cStrings(a, ac),\n env: WasixHost.env(e === 0 ? undefined : this.cStrings(e, ec)),\n search: search !== 0,\n path: this.str(p, pl),\n ops: this.spawnOps(ops, opc),\n });\n mem.view().setUint32(out, pid, true);\n },\n };\n }\n\n private dlImports(): Record<string, WasiFunction> {\n const { mem, host } = this;\n const failed = (message: string, buf: number, len: number): number => {\n if (len > 0) {\n const bytes = new TextEncoder().encode(message).subarray(0, len - 1);\n mem.bytes(buf, bytes.length).set(bytes);\n mem.view().setUint8(buf + bytes.length, 0);\n }\n return E.NOEXEC;\n };\n const linked = <T>(\n buf: number,\n len: number,\n op: (l: WasixLinker) => T,\n out: (v: T) => void\n ): number => {\n if (!this.linker) return failed('not a dynamically-linked program', buf, len);\n try {\n out(op(this.linker));\n return E.SUCCESS;\n } catch (e) {\n if (e instanceof DlError) return failed(e.message, buf, len);\n throw e;\n }\n };\n return {\n dlopen: (\n p: number,\n pl: number,\n _flags: number,\n buf: number,\n len: number,\n lp: number,\n ll: number,\n out: number\n ) => {\n if (p === 0) {\n mem.view().setUint32(out, 0, true);\n return E.SUCCESS;\n }\n return linked(\n buf,\n len,\n (l) => l.open(this.str(p, pl), host.cwd, lp === 0 ? [] : this.str(lp, ll).split(':')),\n (h) => void mem.view().setUint32(out, h, true)\n );\n },\n\n dlsym: (handle: number, s: number, sl: number, buf: number, len: number, out: number) =>\n linked(\n buf,\n len,\n (l) => l.symbol(handle, this.str(s, sl)),\n (v) => void mem.view().setUint32(out, v, true)\n ),\n dl_invalid_handle: (handle: number) =>\n handle !== 0 && this.linker && !this.linker.invalid(handle) ? E.SUCCESS : E.NOEXEC,\n };\n }\n\n private threadImports(): Record<string, WasiFunction> {\n const { mem, host } = this;\n const i32 = () => new Int32Array(mem.view().buffer);\n return {\n thread_id: (out: number) =>\n void mem.view().setUint32(out, this.threads?.tid ?? MAIN_TID, true),\n thread_parallelism: (out: number) =>\n void mem.view().setUint32(out, this.threads?.parallelism() ?? 1, true),\n\n thread_exit: (code: number) => {\n if (this.threads && this.threads.tid !== MAIN_TID) throw new ThreadExit();\n throw new WasiExit(code);\n },\n\n thread_signal: (tid: number, sig: number) => {\n if (!(this.threads?.known(tid) ?? tid === MAIN_TID)) throw new WasiError('ESRCH');\n const posix = WASI_SIGNAL_TO_POSIX[sig];\n if (posix === undefined) throw new WasiError('EINVAL');\n\n if (host.onRaise?.(posix)) return;\n host.o.kernel.call({ op: 'proc-kill', pid: host.o.pid, sig: posix });\n },\n\n thread_spawn_v2: (startPtr: number, tidPtr: number) => {\n if (!this.threads) return E.NOTSUP;\n const tid = this.threads.spawn(startPtr);\n if (tid < 0) return E.AGAIN;\n mem.view().setUint32(tidPtr, tid, true);\n return E.SUCCESS;\n },\n futex_wait: (ptr: number, expected: number, timeoutPtr: number, wokenPtr: number) => {\n const v = mem.view();\n const timed = timeoutPtr !== 0 && v.getUint8(timeoutPtr) === 1;\n const ms = timed\n ? Number(v.getBigUint64(timeoutPtr + 8, true)) / 1e6\n : Number.POSITIVE_INFINITY;\n\n v.setUint8(\n wokenPtr,\n Atomics.wait(i32(), ptr >> 2, expected | 0, ms) === 'timed-out' ? 0 : 1\n );\n },\n\n futex_wake: (ptr: number, wokenPtr: number) => {\n Atomics.notify(i32(), ptr >> 2, 1);\n mem.view().setUint8(wokenPtr, 1);\n },\n futex_wake_all: (ptr: number, wokenPtr: number) => {\n Atomics.notify(i32(), ptr >> 2);\n mem.view().setUint8(wokenPtr, 1);\n },\n };\n }\n\n private ttyFd(): number | undefined {\n for (const fd of [0, 1, 2]) {\n const e = this.host.fds.find(fd);\n if (e?.type === 'kernel' && this.host.fds.kind(fd, e) === 'tty') return fd;\n }\n return this.host.fds.terminals().find((fd) => fd > 2);\n }\n\n private ttyGet(ptr: number): void {\n const { host, mem } = this;\n const v = mem.view();\n mem.bytes(ptr, 24).fill(0);\n const fd = this.ttyFd();\n const isTty = (n: number) => {\n const e = host.fds.find(n);\n return e?.type === 'kernel' && host.fds.kind(n, e) === 'tty' ? 1 : 0;\n };\n v.setUint8(ptr + 16, isTty(0));\n v.setUint8(ptr + 17, isTty(1));\n v.setUint8(ptr + 18, isTty(2));\n if (fd === undefined) {\n v.setUint32(ptr, 80, true);\n v.setUint32(ptr + 4, 24, true);\n return;\n }\n const [rows, cols] = host.o.kernel.sys.winsize?.(fd) ?? [24, 80];\n const termios = host.o.kernel.sys.tcgets?.(fd);\n v.setUint32(ptr, cols, true);\n v.setUint32(ptr + 4, rows, true);\n v.setUint8(ptr + 19, termios && termios.c_lflag & ECHO ? 1 : 0);\n v.setUint8(ptr + 20, termios && termios.c_lflag & ICANON ? 1 : 0);\n }\n\n private ttySet(ptr: number): void {\n const fd = this.ttyFd();\n if (fd === undefined) throw new WasiError('ENOTTY');\n const { sys } = this.host.o.kernel;\n const termios = sys.tcgets?.(fd);\n if (!termios) throw new WasiError('ENOTTY');\n const v = this.mem.view();\n let lflag = termios.c_lflag & ~(ECHO | ICANON);\n if (v.getUint8(ptr + 19)) lflag |= ECHO;\n if (v.getUint8(ptr + 20)) lflag |= ICANON;\n sys.tcsets?.(fd, { ...termios, c_lflag: lflag });\n }\n}\n\nfunction posixSignal(sig: number): number {\n const posix = WASI_SIGNAL_TO_POSIX[sig];\n if (posix === undefined) throw new WasiError('EINVAL');\n return posix;\n}\n\nfunction nsToMs(ns: bigint): number {\n return Math.ceil(Number(ns) / 1e6);\n}\n", "export function parseFunctionNames(payload: Uint8Array): Map<number, string> {\n const names = new Map<number, string>();\n const decoder = new TextDecoder();\n let at = 0;\n const leb = (): number => {\n let value = 0;\n let shift = 0;\n let byte: number;\n do {\n if (at >= payload.length) throw new RangeError('truncated name section');\n byte = payload[at++] as number;\n value += (byte & 0x7f) * 2 ** shift;\n shift += 7;\n } while (byte & 0x80);\n return value;\n };\n while (at < payload.length) {\n const id = payload[at++];\n const size = leb();\n const end = at + size;\n if (end > payload.length) throw new RangeError('truncated name section');\n if (id === 1) {\n for (let count = leb(); count > 0; count--) {\n const index = leb();\n const length = leb();\n if (at + length > end) throw new RangeError('truncated name section');\n names.set(index, decoder.decode(payload.subarray(at, at + length)));\n at += length;\n }\n }\n at = end;\n }\n return names;\n}\n\nconst UNNAMED_FRAME = /^(\\s+at )(wasm:\\/\\/wasm\\/([^\\s()]+?):wasm-function\\[(\\d+)\\]:0x[0-9a-f]+)$/;\n\nconst WASM_MODULE = /wasm:\\/\\/wasm\\/([^\\s()]+?):wasm-function\\[/;\n\nexport function mainModule(lines: readonly string[]): string | undefined {\n for (let i = lines.length - 1; i >= 0; i--) {\n const m = WASM_MODULE.exec(lines[i] as string);\n if (!m) continue;\n return lines.slice(i + 1).some((line) => /^\\s+at /.test(line)) ? m[1] : undefined;\n }\n return undefined;\n}\n\nexport function nameFrame(\n line: string,\n module: string,\n name: (index: number) => string | undefined\n): string {\n const m = UNNAMED_FRAME.exec(line);\n if (!m || m[3] !== module) return line;\n const found = name(Number(m[4]));\n return found === undefined ? line : `${m[1]}${found} (${m[2]})`;\n}\n\nexport function sidecarNames(\n read: (path: string) => Uint8Array,\n path: string\n): (index: number) => string | undefined {\n let names: Map<number, string> | undefined;\n return (index) => {\n if (!names) {\n try {\n names = parseFunctionNames(read(path));\n } catch {\n names = new Map();\n }\n }\n return names.get(index);\n };\n}\n", "import type { WasmSyscall } from '../../kernel/process.ts';\nimport {\n WASM_PROCESS_EXIT,\n type WasmProcessInitMsg,\n type WasmProgram,\n type WasmThreadInitMsg,\n} from '../../kernel/protocol.ts';\nimport type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport {\n createSyncFsSabBridge,\n createSyncSabTransport,\n type SabPostLike,\n} from '../../realm/sync-sab-bridge.ts';\nimport { SAB_HEADER_I32 } from '../../realm/sync-sab-wire.ts';\nimport { SyscallError } from '../kernel-streams.ts';\nimport { kernelSys } from '../process-runtime.ts';\nimport { SignalGate, type SignalHooks } from '../process-signals.ts';\nimport { dylinkInfo } from './dylink.ts';\nimport { cachingBridge } from './wasi-files.ts';\nimport { WasiExit, type WasiFunction, WasiHost } from './wasi-host.ts';\nimport { importsContext, loadImports, type ProgramImports, type Raw } from './wasi-imports.ts';\nimport type { ImportedMemory } from './wasi-module.ts';\nimport { WasiSignals } from './wasi-signals.ts';\nimport { WasiStats } from './wasi-stats.ts';\nimport { MAIN_TID, ThreadExit, threadCap, WasiThreads } from './wasi-threads.ts';\nimport { AsyncifyDriver } from './wasix-fork.ts';\nimport { WasixHost } from './wasix-host.ts';\nimport { type LinkerHost, type LinkRecord, WasixLinker } from './wasix-linker.ts';\nimport { mainModule, nameFrame, sidecarNames } from './wasm-names.ts';\n\ntype ProgramOption = (\n memory: () => WebAssembly.Memory,\n instance: () => WebAssembly.Instance | undefined\n) => ProgramImports;\n\nconst TRAPPED = 134;\n\nconst PREVIEW1 = 'wasi_snapshot_preview1';\nconst WASIX = 'wasix_32v1';\n\nconst RESERVED = new Set([PREVIEW1, WASIX, 'wasi', 'env']);\n\nexport function unsupportedImport(\n module: WebAssembly.Module,\n memory?: ImportedMemory,\n extended = false\n): string | undefined {\n const imports = WebAssembly.Module.imports(module);\n const wasix = imports.some((i) => i.module === WASIX);\n\n const pie = dylinkInfo(module) !== undefined;\n for (const imp of imports) {\n if (imp.module === PREVIEW1 || imp.module === WASIX) continue;\n if (extended && !RESERVED.has(imp.module)) continue;\n if (pie && (imp.module === 'GOT.mem' || imp.module === 'GOT.func')) continue;\n\n if (pie && imp.module === 'env' && imp.kind !== 'memory') continue;\n if (imp.kind === 'memory' && memory?.module === imp.module && memory.name === imp.name)\n continue;\n\n if (imp.module === 'wasi' && imp.name === 'thread-spawn' && (wasix || memory?.shared)) continue;\n if (imp.kind === 'memory' || imp.module === 'wasi') {\n return `imports ${imp.module}.${imp.name}: no WASI program this host runs`;\n }\n return `imports ${imp.module}.${imp.name}: no WASI preview1 program (an Emscripten one runs with its glue)`;\n }\n if (!WebAssembly.Module.exports(module).some((e) => e.name === '_start')) {\n return 'no WASI command (it exports no _start)';\n }\n return undefined;\n}\n\nfunction linkImports(\n module: WebAssembly.Module,\n preview1: Record<string, WasiFunction>,\n wasix: Record<string, WasiFunction> | undefined,\n memory: WebAssembly.Memory | undefined,\n threads: WasiThreads | undefined,\n program: ProgramImports = {}\n): WebAssembly.Imports {\n for (const ns of Object.keys(program)) {\n if (RESERVED.has(ns)) throw new Error(`the imports module may not define ${ns}`);\n }\n const imports: Record<string, Record<string, WebAssembly.ImportValue>> = {\n ...program,\n [PREVIEW1]: preview1,\n ...(wasix ? { [WASIX]: { ...wasix } } : {}),\n ...(threads ? { wasi: { 'thread-spawn': (arg: number) => threads.spawn(arg) } } : {}),\n };\n for (const imp of WebAssembly.Module.imports(module)) {\n const ns = (imports[imp.module] ??= {});\n if (imp.name in ns) continue;\n if (imp.kind === 'memory' && memory) ns[imp.name] = memory;\n else if (imp.kind === 'function') ns[imp.name] = () => (imp.name === 'thread-spawn' ? -1 : 52);\n }\n return imports;\n}\n\nexport const FALLBACK_MAXIMUM_PAGES = 32768;\n\nfunction newImportedMemory(spec: ImportedMemory): WebAssembly.Memory {\n const maximum = spec.maximum ?? 65536;\n try {\n return new WebAssembly.Memory({ initial: spec.initial, maximum, shared: spec.shared });\n } catch (err) {\n if (!(err instanceof RangeError) || maximum <= FALLBACK_MAXIMUM_PAGES) throw err;\n if (spec.initial > FALLBACK_MAXIMUM_PAGES) throw err;\n return new WebAssembly.Memory({\n initial: spec.initial,\n maximum: FALLBACK_MAXIMUM_PAGES,\n shared: spec.shared,\n });\n }\n}\n\nexport function createImportedMemory(\n spec: ImportedMemory | undefined,\n copy?: Uint8Array\n): WebAssembly.Memory | undefined {\n if (!spec) return undefined;\n const memory = newImportedMemory(spec);\n if (copy) fillMemory(memory, copy);\n return memory;\n}\n\nfunction restoreExportedMemory(\n instance: WebAssembly.Instance,\n imported: WebAssembly.Memory | undefined,\n init: WasmProcessInitMsg\n): void {\n if (imported || !init.fork?.wasi) return;\n fillMemory(instance.exports.memory as WebAssembly.Memory, init.fork.memory);\n}\n\nfunction fillMemory(memory: WebAssembly.Memory, copy: Uint8Array): void {\n const pages = copy.byteLength / 65536 - memory.buffer.byteLength / 65536;\n if (pages > 0) memory.grow(pages);\n new Uint8Array(memory.buffer).set(copy);\n}\n\nfunction kernelOf(\n init: { sab: SharedArrayBuffer; argv0: string },\n port: SabPostLike,\n\n hooks: SignalHooks = { masks: () => null, raise: () => {} }\n) {\n const transport = new SignalGate(\n createSyncSabTransport(init.sab, port),\n new Int32Array(init.sab, 0, SAB_HEADER_I32),\n hooks\n ).transport();\n const sys = kernelSys(transport);\n const call = (req: WasmSyscall): unknown => {\n const r: SyncFsResult = transport.call(req, Number.POSITIVE_INFINITY, req.op);\n if (!r.ok) throw new SyscallError(r.errno);\n return r.kind === 'json' ? r.json : undefined;\n };\n const say = (text: string) => sys.write(2, new TextEncoder().encode(`${init.argv0}: ${text}\\n`));\n return { transport, sys, call, say };\n}\n\nfunction traced<T extends object>(stats: WasiStats | undefined, tag: string, table: T): T {\n return stats ? stats.wrap(tag, table) : table;\n}\n\nfunction timedCalls(stats: WasiStats, call: (req: WasmSyscall) => unknown) {\n return (req: WasmSyscall): unknown => stats.time(`kernel.${req.op}`, () => call(req));\n}\n\nfunction report(stats: WasiStats, sys: { write(fd: number, bytes: Uint8Array): unknown }): void {\n stats.phase('run');\n try {\n sys.write(2, new TextEncoder().encode(stats.report()));\n } catch {}\n}\n\nfunction spawnsThreads(module: WebAssembly.Module): boolean {\n return WebAssembly.Module.imports(module).some(\n (i) =>\n (i.module === 'wasi' && i.name === 'thread-spawn') ||\n (i.module === WASIX && i.name === 'thread_spawn_v2')\n );\n}\n\nasync function instantiate(\n host: WasiHost,\n module: WebAssembly.Module,\n memory: WebAssembly.Memory | undefined,\n threads: WasiThreads | undefined,\n {\n thread = false,\n stats,\n signals,\n program,\n }: {\n thread?: boolean;\n stats?: WasiStats;\n signals?: WasiSignals;\n program?: ProgramOption;\n } = {}\n): Promise<{ instance: WebAssembly.Instance; driver: AsyncifyDriver }> {\n const driver = new AsyncifyDriver(host.mem);\n const wasixHost = WebAssembly.Module.imports(module).some((i) => i.module === WASIX)\n ? new WasixHost(host, driver, module)\n : undefined;\n if (wasixHost) {\n wasixHost.threads = threads;\n wasixHost.signals = signals;\n }\n let preview1: Record<string, WasiFunction> = traced(stats, 'wasi', {\n ...host.imports(),\n ...wasixHost?.preview1(),\n });\n let wasix = wasixHost && traced(stats, 'wasix', wasixHost.imports());\n\n const info = dylinkInfo(module);\n const sync: LinkSync | undefined =\n info && memory\n ? new LinkSync(\n new WasixLinker(\n memory,\n info,\n linkerHost(host, (): WebAssembly.Imports => imports),\n thread\n ),\n (req) => host.o.kernel.call(req),\n threads?.ids\n )\n : undefined;\n if (sync) {\n ({ preview1, wasix } = sync.guard(preview1, wasix));\n if (wasixHost) wasixHost.linker = sync.linker;\n\n if (threads) {\n sync.linker.cache = threads.received;\n threads.modules = () => sync.linker.compiled();\n }\n }\n let instance: WebAssembly.Instance | undefined;\n const extra = program?.(\n () => memory ?? (instance?.exports.memory as WebAssembly.Memory),\n () => instance\n );\n const hostImports = linkImports(module, preview1, wasix, memory, threads, extra);\n const imports: WebAssembly.Imports = sync\n ? merge(hostImports, sync.linker.mainImports(module))\n : hostImports;\n instance = await WebAssembly.instantiate(module, imports);\n stats?.phase('instantiate');\n const exports = instance.exports as { memory?: WebAssembly.Memory };\n host.mem.bind(memory ?? (exports.memory as WebAssembly.Memory));\n if (sync) {\n sync.linker.bindMain(instance, !thread);\n\n if (thread) sync.catchUp();\n\n sync.linker.bindMainGot();\n }\n return { instance, driver };\n}\n\nfunction linkerHost(host: WasiHost, imports: () => WebAssembly.Imports): LinkerHost {\n return {\n read: (path) => {\n try {\n return host.o.fs.readFile(path) as Uint8Array<ArrayBuffer>;\n } catch {\n return undefined;\n }\n },\n hostImports: () => {\n const { env: _env, 'GOT.mem': _mem, 'GOT.func': _func, ...rest } = imports();\n return rest;\n },\n };\n}\n\nfunction merge(\n base: WebAssembly.Imports,\n extra: Record<string, Record<string, WebAssembly.ImportValue>>\n): WebAssembly.Imports {\n const out: WebAssembly.Imports = { ...base };\n for (const [ns, values] of Object.entries(extra)) out[ns] = { ...base[ns], ...values };\n return out;\n}\n\nclass LinkSync {\n private count = 0;\n private gen = 0;\n\n readonly linker: WasixLinker;\n private readonly call: (req: WasmSyscall) => unknown;\n private readonly ids: Int32Array | undefined;\n constructor(\n linker: WasixLinker,\n call: (req: WasmSyscall) => unknown,\n ids: Int32Array | undefined\n ) {\n this.linker = linker;\n this.call = call;\n this.ids = ids;\n linker.publisher = (record) => this.publish(record);\n }\n\n private publish(record: LinkRecord): void {\n const since = this.call({ op: 'dl-log', append: record, from: this.count }) as LinkRecord[];\n\n for (const r of since.slice(0, -1)) this.linker.replay(r);\n this.count += since.length;\n if (this.ids) this.gen = Atomics.add(this.ids, DL_GEN, 1) + 1;\n }\n\n catchUp(): void {\n const since = this.call({ op: 'dl-log', from: this.count }) as LinkRecord[];\n for (const r of since) this.linker.replay(r);\n this.count += since.length;\n if (this.ids) this.gen = Atomics.load(this.ids, DL_GEN);\n }\n\n guard(\n preview1: Record<string, WasiFunction>,\n wasix: Record<string, WasiFunction> | undefined\n ): { preview1: Record<string, WasiFunction>; wasix: Record<string, WasiFunction> | undefined } {\n const ids = this.ids;\n if (!ids) return { preview1, wasix };\n const wrap = (table: Record<string, WasiFunction>) =>\n Object.fromEntries(\n Object.entries(table).map(([name, fn]) => [\n name,\n ((...args: never[]) => {\n if (Atomics.load(ids, DL_GEN) !== this.gen) this.catchUp();\n\n const result = fn(...args);\n if (Atomics.load(ids, DL_GEN) !== this.gen) this.catchUp();\n return result;\n }) as WasiFunction,\n ])\n );\n return { preview1: wrap(preview1), wasix: wasix && wrap(wasix) };\n }\n}\n\nconst DL_GEN = 3;\n\nexport async function runWasiProcess(init: WasmProcessInitMsg, port: SabPostLike): Promise<number> {\n captureBacktraces(init.env);\n\n const signals = new WasiSignals((sig) => {\n call({ op: 'proc-kill', pid: init.pid, sig });\n throw new WasiExit(128 + sig);\n });\n const { transport, sys, call: kernelCall, say } = kernelOf(init, port, signals);\n\n const stats = init.env.SLICC_WASI_STATS === '1' ? new WasiStats() : undefined;\n const call = stats ? timedCalls(stats, kernelCall) : kernelCall;\n const { module } = init.program;\n const refused = unsupportedImport(\n module,\n init.program.memory,\n init.program.imports !== undefined\n );\n if (refused) {\n say(refused);\n return 126;\n }\n const fork = init.fork?.wasi;\n const memory = createImportedMemory(init.program.memory, fork ? init.fork?.memory : undefined);\n const threads =\n memory?.buffer instanceof SharedArrayBuffer && spawnsThreads(module)\n ? new WasiThreads(port, memory, threadCap(init.env), MAIN_TID)\n : undefined;\n const host = new WasiHost({\n args: [init.argv0, ...init.args],\n env: init.env,\n cwd: fork?.cwd ?? init.cwd,\n pid: init.pid,\n ...(init.ppid !== undefined ? { ppid: init.ppid } : {}),\n kernel: { sys: traced(stats, 'kernel', sys), call },\n fs: cachingBridge(traced(stats, 'fs', createSyncFsSabBridge(transport))),\n ...(fork?.shared && threads\n ? { shared: threads.ids }\n : fork\n ? { forked: { fds: fork.fds, cloexec: fork.cloexec } }\n : { inherited: init.fds }),\n });\n if (threads) {\n threads.beforeSpawn = () => {\n if (!host.fds.isShared) host.fds.share(threads.ids, false);\n };\n }\n const program = await programImports(init.program, host, transport, MAIN_TID);\n const { instance, driver } = await instantiate(host, module, memory, threads, {\n stats,\n signals,\n ...(program ? { program } : {}),\n });\n restoreExportedMemory(instance, memory, init);\n signals.bind(instance.exports);\n host.onRaise = (sig) => signals.raised(sig);\n const exports = instance.exports as { _start: () => void };\n driver.bind(instance.exports);\n try {\n if (fork) driver.startChild(fork);\n\n do exports._start();\n while (driver.resume());\n return 0;\n } catch (e) {\n if (e instanceof WasiExit) return e.code;\n if (!(e instanceof WebAssembly.RuntimeError)) throw e;\n try {\n say(trapMessage(e, init.env, '', programNames(host, init.program)));\n } catch {\n throw new Error(`${init.argv0}: wasm trap: ${e.message}`);\n }\n return TRAPPED;\n } finally {\n host.flushAll();\n if (stats) report(stats, sys);\n }\n}\n\nconst BACKTRACE_FRAMES = 40;\n\nexport function trapMessage(\n e: WebAssembly.RuntimeError,\n env: Readonly<Record<string, string>>,\n where = '',\n name?: (index: number) => string | undefined\n): string {\n const head = `wasm trap${where}: ${e.message}`;\n if (env.SLICC_WASM_BACKTRACE !== '1') return head;\n const lines = (e.stack ?? '').split('\\n');\n\n const main = name && mainModule(lines);\n\n const frames = lines\n .filter((line) => /^\\s+at .*wasm:\\/\\/wasm\\//.test(line))\n .slice(0, BACKTRACE_FRAMES)\n .map((line) => (name && main ? nameFrame(line, main, name) : line));\n return frames.length ? `${head}\\n${frames.join('\\n')}` : head;\n}\n\nfunction programNames(\n host: WasiHost,\n program: WasmProgram\n): ((index: number) => string | undefined) | undefined {\n const path = program.names;\n return path === undefined ? undefined : sidecarNames((p) => host.o.fs.readFile(p), path);\n}\n\nasync function programImports(\n program: WasmProgram,\n host: WasiHost,\n transport: { call(req: WasmSyscall, timeoutMs: number, label: string): SyncFsResult },\n tid: number\n): Promise<ProgramOption | undefined> {\n if (program.imports === undefined) return undefined;\n const create = await loadImports(program.imports);\n const raw: Raw = (req) => transport.call(req as WasmSyscall, Number.POSITIVE_INFINITY, req.op);\n return (memory, instance) => create(importsContext({ host, raw, tid, memory, instance }));\n}\n\nexport function captureBacktraces(env: Readonly<Record<string, string>>): void {\n if (env.SLICC_WASM_BACKTRACE !== '1') return;\n\n const v8 = Error as ErrorConstructor & { stackTraceLimit?: number };\n v8.stackTraceLimit = Math.max(v8.stackTraceLimit ?? 0, BACKTRACE_FRAMES + 20);\n}\n\nexport async function runWasiThread(init: WasmThreadInitMsg, port: SabPostLike): Promise<void> {\n captureBacktraces(init.env);\n const { transport, sys, call, say } = kernelOf(init, port);\n const { thread } = init;\n const threads = new WasiThreads(port, thread.memory, threadCap(init.env), thread.tid, thread.ids);\n threads.received = thread.modules;\n const host = new WasiHost({\n args: [init.argv0, ...init.args],\n env: init.env,\n cwd: init.cwd,\n pid: init.pid,\n ...(init.ppid !== undefined ? { ppid: init.ppid } : {}),\n kernel: { sys, call },\n fs: cachingBridge(createSyncFsSabBridge(transport)),\n shared: threads.ids,\n });\n\n const program = await programImports(init.program, host, transport, thread.tid);\n const { instance } = await instantiate(host, init.program.module, thread.memory, threads, {\n thread: true,\n ...(program ? { program } : {}),\n });\n const start = instance.exports.wasi_thread_start as (tid: number, arg: number) => void;\n try {\n start(thread.tid, thread.arg);\n threads.exited();\n } catch (e) {\n if (e instanceof ThreadExit) {\n threads.exited();\n return;\n }\n if (e instanceof WasiExit) {\n port.postMessage({ type: WASM_PROCESS_EXIT, code: e.code });\n return;\n }\n if (e instanceof WebAssembly.RuntimeError) {\n try {\n say(trapMessage(e, init.env, ` in thread ${thread.tid}`, programNames(host, init.program)));\n } catch {}\n port.postMessage({ type: WASM_PROCESS_EXIT, code: TRAPPED });\n return;\n }\n throw e;\n }\n}\n", "import { createRequire } from 'node:module';\nimport { parentPort } from 'node:worker_threads';\nimport { processEntry } from './process/process-entry.ts';\n\nconst scope = globalThis as { require?: unknown; __filename?: string; __dirname?: string };\nscope.require ??= createRequire(import.meta.url);\nscope.__filename ??= new URL(import.meta.url).pathname;\nscope.__dirname ??= new URL('.', import.meta.url).pathname;\n\nconst port = parentPort as NonNullable<typeof parentPort>;\nconst onMessage = processEntry({ postMessage: (message: unknown) => port.postMessage(message) });\nport.on('message', onMessage);\n", "import {\n WASM_PROCESS_ERROR,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_INIT,\n WASM_THREAD_INIT,\n type WasmProcessErrorMsg,\n type WasmProcessExitMsg,\n type WasmProcessInitMsg,\n type WasmThreadInitMsg,\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 interface WasiRuntime {\n runWasiProcess(init: WasmProcessInitMsg, port: SabPostLike): Promise<number>;\n runWasiThread(init: WasmThreadInitMsg, port: SabPostLike): Promise<void>;\n}\n\nexport type WasiLoader = () => Promise<WasiRuntime>;\n\nconst loadWasi: WasiLoader = () => import('./wasi/wasi-runtime.ts');\n\nexport function processEntry(\n port: SabPostLike,\n run: ProcessRunner = runWasmProcess,\n wasi: WasiLoader = loadWasi\n): (data: unknown) => void {\n const failed = (err: unknown): void =>\n port.postMessage({\n type: WASM_PROCESS_ERROR,\n message: err instanceof Error ? (err.stack ?? err.message) : String(err),\n } satisfies WasmProcessErrorMsg);\n return (data) => {\n const type = (data as { type?: string } | undefined)?.type;\n if (type === WASM_THREAD_INIT) {\n wasi()\n .then((m) => m.runWasiThread(data as WasmThreadInitMsg, port))\n .catch(failed);\n return;\n }\n if (type !== WASM_PROCESS_INIT) return;\n const init = data as WasmProcessInitMsg;\n const started =\n init.program?.abi === 'wasi'\n ? wasi().then((m) => m.runWasiProcess(init, port))\n : run(init, port);\n started.then(\n (code) => port.postMessage({ type: WASM_PROCESS_EXIT, code } satisfies WasmProcessExitMsg),\n failed\n );\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["code", "errno", "call", "code", "status", "errno", "port", "status", "code", "code", "EIO", "status", "code", "POLLIN", "POLLOUT", "POLLHUP", "POLLERR", "call", "status", "code", "value", "wrap", "errno", "code", "O_CREAT", "O_EXCL", "O_TRUNC", "call", "code", "code", "O_CREAT", "O_EXCL", "call", "O_RDWR", "value", "KILLED_BY_SIGPIPE", "call", "O_WRONLY", "O_RDWR", "port", "running", "encoder", "failed", "status", "value", "code", "code", "DEVICES", "kernelEntry", "O_NONBLOCK", "O_RDWR", "O_WRONLY", "SYNTHETIC_DIRS", "decoder", "encoder", "code", "value", "call", "status", "value", "port", "value", "value", "resolved", "O_WRONLY", "O_RDWR", "O_APPEND", "status", "port", "call", "code", "failed", "decoder", "value", "port", "call", "wrap", "port", "failed", "code"]
7
+ }