@ai-ecoverse/slicc-kernel 1.8.6 → 1.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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-module.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 { ForeignResults, 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 foreign?: ForeignResults | undefined;\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;\nexport const SAB_I_REQ = 6;\nexport const SAB_I_PUB = 7;\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_PUB,\n SAB_I_REQ,\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 published = Atomics.load(header, SAB_I_PUB);\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 const remaining = deadline - now();\n if (remaining <= 0) throw syncError('ETIMEDOUT', label);\n wait(header, SAB_I_PUB, published, remaining);\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 Atomics.store(header, SAB_I_REQ, id);\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_REQ, 0);\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 ETIMEDOUT: 73,\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 pwrite?(fd: number, bytes: Uint8Array, at: number): number;\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, ProcessSys } 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 errnoOf(err: unknown): number {\n const { errno, code } = (err ?? {}) as { errno?: unknown; code?: unknown };\n if (typeof errno === 'number') return errno;\n if (typeof code === 'string') return wasiErrno(code);\n throw err;\n}\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 return errnoOf(err);\n }\n };\n }\n}\n\ntype Positional = (...args: (number | bigint)[]) => number;\n\ninterface PositionalDeps {\n fs: () => ProcessFs | undefined;\n sys: Pick<ProcessSys, 'pread' | 'pwrite'>;\n memory: () => WebAssembly.Memory | undefined;\n}\n\nfunction offsetOf(rest: (number | bigint)[]): number | undefined {\n const at =\n rest.length >= 3\n ? Number(rest[1]) * 2 ** 32 + (Number(rest[0]) >>> 0)\n : Number(BigInt.asIntN(64, BigInt(rest[0])));\n return at >= 0 && Number.isSafeInteger(at) ? at : undefined;\n}\n\nfunction readInto(sys: PositionalDeps['sys'], kfd: number, target: Uint8Array, at: number): number {\n let done = 0;\n while (done < target.length) {\n const got = sys.pread?.(kfd, target.length - done, at + done) ?? new Uint8Array(0);\n if (got.length === 0) break;\n target.set(got, done);\n done += got.length;\n }\n return done;\n}\n\nfunction positioned(original: Positional, write: boolean, deps: PositionalDeps): Positional {\n return (fd, iov, iovcnt, ...rest) => {\n const stream = deps.fs()?.getStream(Number(fd));\n const memory = deps.memory();\n const kfd = stream?.sliccKernelFile ? stream.sliccKernelFd : undefined;\n if (kfd === undefined || !memory || !(write ? deps.sys.pwrite : deps.sys.pread)) {\n return original(fd, iov, iovcnt, ...rest);\n }\n const at = offsetOf(rest);\n if (at === undefined) return wasiErrno('EINVAL');\n const view = new DataView(memory.buffer);\n let done = 0;\n try {\n for (let i = 0; i < Number(iovcnt); i++) {\n const ptr = view.getUint32(Number(iov) + i * 8, true);\n const len = view.getUint32(Number(iov) + i * 8 + 4, true);\n const part = new Uint8Array(memory.buffer, ptr, len);\n const moved = write\n ? (deps.sys.pwrite?.(kfd, part.slice(), at + done) ?? 0)\n : readInto(deps.sys, kfd, part, at + done);\n done += moved;\n if (moved < len) break;\n }\n } catch (err) {\n return errnoOf(err);\n }\n view.setUint32(Number(rest[rest.length - 1]), done, true);\n return 0;\n };\n}\n\nexport function positionalIo(imports: WebAssembly.Imports, deps: PositionalDeps): void {\n for (const namespace of Object.values(imports)) {\n for (const [name, write] of [\n ['fd_pread', false],\n ['fd_pwrite', true],\n ] as const) {\n const original = namespace?.[name];\n if (typeof original === 'function') {\n namespace[name] = positioned(original as Positional, write, deps);\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 positionalIo,\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 pwrite(fd, bytes, at) {\n return json(\n call({ op: 'fd-pwrite', fd, offset: at, body: bytes }, `fd-pwrite ${fd}`)\n ) as number;\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 positionalIo(imports, {\n fs: () => ownValue<ProcessFs>(module, 'FS'),\n sys,\n memory: () => memory,\n });\n return WebAssembly.instantiate(init.program.module, imports);\n })\n .then((instance) => {\n memory = wasmMemory(instance, imports);\n done(instance, init.program.module);\n }, failed);\n return {};\n },\n\n preRun: [\n (m: object) => {\n if (!hasStreams(m)) return;\n const fs = (m as RunningModule).FS;\n\n trackCloseOnExec(fs);\n try {\n fs.mkdirTree(init.cwd);\n fs.chdir(init.cwd);\n } catch {}\n },\n ],\n onRuntimeInitialized: () => ready(),\n };\n (deps.evaluate ?? evaluateGlue)(init.program.glue, module);\n await initialized;\n const running = module as unknown as RunningModule;\n if (!hasStreams(running)) return runStdioOnly(running, init);\n const vfs = mountVfsIntoEmscripten(running.FS, {\n bridge: createSyncFsSabBridge(transport),\n cwd: init.cwd,\n warn: deps.warn ?? say(2),\n });\n const sigpipe = (): boolean => running.sliccSigpipe?.() === 1;\n const restartable = (): boolean => signals.restartable();\n const streams = new KernelStreams(running.FS, sys, { sigpipe, restartable });\n trackCloseOnExec(running.FS);\n if (init.fork) restoreForkedStreams(running.FS, streams, init.fork.streams ?? []);\n else {\n wireKernelStdio(running.FS, streams);\n for (const entry of init.fds ?? []) wireKernelFd(running.FS, streams, entry);\n }\n const pipefs = ownValue<ProcessPipeFs>(running, 'PIPEFS');\n if (pipefs) streams.usePipes(pipefs);\n streams.useControllingTerminal();\n useDevFd(running.FS);\n ownByRealmUser(running.FS);\n const livePath = (s: ProcessStream) => liveNodePath(s.node as unknown as LiveFsNode);\n running.sliccKernel = createProcessKernel({\n transport,\n Fs: running.FS,\n env: init.env,\n beforeSpawn: () => vfs.flush(),\n afterChild: () => vfs.invalidate(),\n pid: init.pid,\n raise: (sig) => running.sliccRaise?.(sig),\n restartable,\n describeFork: () => describeForFork(running.FS, sys, streams, livePath),\n inherit: (actions) => describeInherited(running.FS, sys, streams, livePath, actions),\n stdioPromoter: () => vfsPromoter(running.FS, sys, streams, livePath),\n });\n running.sliccKernel.http = createHttpKernel(transport);\n running.sliccKernel.net = createSocketKernel({\n transport,\n Fs: running.FS,\n sys,\n streams,\n sigpipe,\n restartable,\n });\n try {\n return runMain(running, init);\n } finally {\n vfs.flush();\n }\n}\n\nfunction hasStreams(module: object): boolean {\n return typeof ownValue<Partial<ProcessFs>>(module, 'FS')?.getStream === 'function';\n}\n\nfunction runStdioOnly(running: RunningModule, init: WasmProcessInitMsg): number {\n if (init.fork) throw new Error(`${init.argv0} cannot resume a fork: it has no filesystem`);\n return runMain(running, init);\n}\n\nfunction runMain(running: RunningModule, init: WasmProcessInitMsg): number {\n try {\n if (init.fork) {\n if (!running.sliccForkChild) throw new Error(`${init.argv0} cannot resume a fork`);\n return running.sliccForkChild({ ...init.fork, pid: init.pid }) ?? 0;\n }\n\n return (running.sliccRunMain ?? running.callMain)(init.args) ?? 0;\n } catch (e) {\n const status = (e as { status?: unknown })?.status;\n if (typeof status !== 'number') throw e;\n return status;\n }\n}\n", "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", "export interface ImportedMemory {\n module: string;\n name: string;\n initial: number;\n maximum?: number;\n shared: boolean;\n}\n\nexport function importedMemory(bytes: Uint8Array): ImportedMemory | undefined {\n let at = 8;\n const u32 = (): number => {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = bytes[at++];\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n };\n const name = (): string => {\n const len = u32();\n const s = new TextDecoder().decode(bytes.subarray(at, at + len));\n at += len;\n return s;\n };\n const limits = () => {\n const flags = bytes[at++];\n const initial = u32();\n const maximum = flags & 1 ? u32() : undefined;\n return { initial, maximum, shared: (flags & 2) !== 0 };\n };\n while (at < bytes.length) {\n const id = bytes[at++];\n const size = u32();\n const end = at + size;\n if (id !== 2) {\n at = end;\n continue;\n }\n const count = u32();\n for (let i = 0; i < count; i++) {\n const module = name();\n const field = name();\n const kind = bytes[at++];\n if (kind === 0) u32();\n else if (kind === 1) {\n at++;\n limits();\n } else if (kind === 2) {\n const l = limits();\n return { module, name: field, ...l };\n } else if (kind === 3) at += 2;\n else if (kind === 4) {\n at++;\n u32();\n }\n }\n return undefined;\n }\n return undefined;\n}\n\nexport const RESERVED_NAMESPACES: ReadonlySet<string> = new Set([\n 'wasi_snapshot_preview1',\n 'wasix_32v1',\n 'wasi',\n 'env',\n]);\n\nexport type ForeignResult = 'none' | 'i32' | 'i64' | 'f32' | 'f64' | 'other';\n\nexport type ForeignResults = Record<string, Record<string, ForeignResult>>;\n\nconst RESULTS: Readonly<Record<number, ForeignResult>> = {\n 127: 'i32',\n 126: 'i64',\n 125: 'f32',\n 124: 'f64',\n};\n\nfunction resultOf(results: number[]): ForeignResult {\n if (results.length === 0) return 'none';\n return (results.length === 1 && RESULTS[results[0]]) || 'other';\n}\n\nclass Reader {\n at = 8;\n readonly bytes: Uint8Array;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n }\n\n byte(): number {\n return this.bytes[this.at++];\n }\n\n u32(): number {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = this.byte();\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n }\n\n name(): string {\n const len = this.u32();\n const s = new TextDecoder().decode(this.bytes.subarray(this.at, this.at + len));\n this.at += len;\n return s;\n }\n\n valtype(): number {\n const code = this.byte();\n if (code === 0x63 || code === 0x64) this.u32();\n return code;\n }\n\n limits(): void {\n const flags = this.byte();\n this.u32();\n if (flags & 1) this.u32();\n }\n}\n\nfunction readTypes(r: Reader): ForeignResult[] | undefined {\n const types: ForeignResult[] = [];\n for (let i = r.u32(); i > 0; i--) {\n if (r.byte() !== 0x60) return undefined;\n for (let n = r.u32(); n > 0; n--) r.valtype();\n const results: number[] = [];\n for (let n = r.u32(); n > 0; n--) results.push(r.valtype());\n types.push(resultOf(results));\n }\n return types;\n}\n\nfunction skipImport(r: Reader, kind: number): void {\n if (kind === 1) {\n r.valtype();\n r.limits();\n } else if (kind === 2) r.limits();\n else if (kind === 3) {\n r.valtype();\n r.byte();\n } else {\n r.byte();\n r.u32();\n }\n}\n\nfunction readImports(r: Reader, types: ForeignResult[]): ForeignResults {\n const foreign: ForeignResults = {};\n for (let i = r.u32(); i > 0; i--) {\n const module = r.name();\n const field = r.name();\n const kind = r.byte();\n if (kind !== 0) skipImport(r, kind);\n else {\n const type = types[r.u32()] ?? 'other';\n if (!RESERVED_NAMESPACES.has(module)) (foreign[module] ??= {})[field] = type;\n }\n }\n return foreign;\n}\n\nexport function foreignImports(bytes: Uint8Array): ForeignResults | undefined {\n const r = new Reader(bytes);\n let types: ForeignResult[] | undefined = [];\n while (r.at < bytes.length) {\n const id = r.byte();\n const end = r.u32() + r.at;\n if (id === 1) types = readTypes(r);\n if (!types) return undefined;\n if (id === 2) return readImports(r, types);\n r.at = end;\n }\n return {};\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 ForeignResults, type ImportedMemory, RESERVED_NAMESPACES } 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 = RESERVED_NAMESPACES;\n\nconst noErrno = (key: string) =>\n `imports ${key}: its result cannot carry ENOSYS, and this host does not provide it`;\n\nfunction enosys(module: string, name: string, foreign: ForeignResults | undefined) {\n const type = foreign?.[module]?.[name];\n if (type === 'other') throw new Error(noErrno(`${module}.${name}`));\n if (type === 'none') return () => undefined;\n if (type === 'i64') return () => 52n;\n return () => 52;\n}\n\nfunction firstOther(foreign: ForeignResults): string | undefined {\n for (const [module, fields] of Object.entries(foreign)) {\n const name = Object.keys(fields).find((field) => fields[field] === 'other');\n if (name !== undefined) return `${module}.${name}`;\n }\n return undefined;\n}\n\ninterface ImportScope {\n extended: boolean;\n wasi: boolean;\n wasix: boolean;\n pie: boolean;\n memory: ImportedMemory | undefined;\n}\n\nfunction accepted(imp: WebAssembly.ModuleImportDescriptor, scope: ImportScope): boolean {\n const { module, name, kind } = imp;\n if (module === PREVIEW1 || module === WASIX) return true;\n if (!RESERVED.has(module) && (scope.extended || (scope.wasi && kind === 'function'))) return true;\n if (scope.pie && (module === 'GOT.mem' || module === 'GOT.func')) return true;\n if (scope.pie && module === 'env' && kind !== 'memory') return true;\n if (kind === 'memory' && scope.memory?.module === module && scope.memory.name === name)\n return true;\n return module === 'wasi' && name === 'thread-spawn' && (scope.wasix || !!scope.memory?.shared);\n}\n\nexport function unsupportedImport(\n module: WebAssembly.Module,\n memory?: ImportedMemory,\n extended = false,\n foreign: ForeignResults = {}\n): string | undefined {\n const imports = WebAssembly.Module.imports(module);\n const wasix = imports.some((i) => i.module === WASIX);\n const wasi = wasix || imports.some((i) => i.module === PREVIEW1);\n const scope = { extended, wasi, wasix, pie: dylinkInfo(module) !== undefined, memory };\n const refused = imports.find((imp) => !accepted(imp, scope));\n if (refused) {\n if (refused.kind === 'memory' || refused.module === 'wasi') {\n return `imports ${refused.module}.${refused.name}: no WASI program this host runs`;\n }\n return `imports ${refused.module}.${refused.name}: no WASI preview1 program (an Emscripten one runs with its glue)`;\n }\n const unanswerable = extended ? undefined : firstOther(foreign);\n if (unanswerable) return noErrno(unanswerable);\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 foreign?: ForeignResults\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.module === 'wasi' && imp.name === 'thread-spawn') ns[imp.name] = () => -1;\n else if (imp.kind === 'function') ns[imp.name] = enosys(imp.module, imp.name, foreign);\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 foreign,\n }: {\n thread?: boolean;\n stats?: WasiStats;\n signals?: WasiSignals;\n program?: ProgramOption;\n foreign?: ForeignResults | undefined;\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, foreign);\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 init.program.foreign\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 foreign: init.program.foreign,\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 foreign: init.program.foreign,\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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",
4
+ "sourcesContent": ["import type { ForeignResults, 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 foreign?: ForeignResults | undefined;\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;\nexport const SAB_I_REQ = 6;\nexport const SAB_I_PUB = 7;\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_PUB,\n SAB_I_REQ,\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 published = Atomics.load(header, SAB_I_PUB);\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 const remaining = deadline - now();\n if (remaining <= 0) throw syncError('ETIMEDOUT', label);\n wait(header, SAB_I_PUB, published, remaining);\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 Atomics.store(header, SAB_I_REQ, id);\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_REQ, 0);\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 ETIMEDOUT: 73,\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 pwrite?(fd: number, bytes: Uint8Array, at: number): number;\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, ProcessSys } 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 errnoOf(err: unknown): number {\n const { errno, code } = (err ?? {}) as { errno?: unknown; code?: unknown };\n if (typeof errno === 'number') return errno;\n if (typeof code === 'string') return wasiErrno(code);\n throw err;\n}\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 interface FdImports {\n fd_sync?: unknown;\n fd_pread?: unknown;\n fd_pwrite?: unknown;\n}\n\nfunction namespaces(imports: WebAssembly.Imports): WebAssembly.ModuleImports[] {\n const seen = new Set<WebAssembly.ModuleImports>();\n for (const namespace of Object.values(imports)) {\n if (namespace && typeof namespace === 'object') seen.add(namespace);\n }\n return [...seen];\n}\n\nfunction keyOf(\n namespace: WebAssembly.ModuleImports,\n name: keyof FdImports,\n glue: FdImports | undefined\n): string | undefined {\n const own = glue?.[name];\n const found =\n typeof own === 'function'\n ? Object.keys(namespace).find((k) => namespace[k] === own)\n : undefined;\n return found ?? (typeof namespace[name] === 'function' ? name : undefined);\n}\n\nexport function syncFsync(\n imports: WebAssembly.Imports,\n fs: () => ProcessFs | undefined,\n glue?: FdImports\n): void {\n for (const namespace of namespaces(imports)) {\n const key = keyOf(namespace, 'fd_sync', glue);\n const original = key === undefined ? undefined : (namespace[key] as AsyncImport);\n if (key === undefined || !original?.isAsync) continue;\n namespace[key] = (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 return errnoOf(err);\n }\n };\n }\n}\n\ntype Positional = (...args: (number | bigint)[]) => number;\n\ninterface PositionalDeps {\n glue?: FdImports | undefined;\n fs: () => ProcessFs | undefined;\n sys: Pick<ProcessSys, 'pread' | 'pwrite'>;\n memory: () => WebAssembly.Memory | undefined;\n}\n\nfunction offsetOf(rest: (number | bigint)[]): number | undefined {\n const at =\n rest.length >= 3\n ? Number(rest[1]) * 2 ** 32 + (Number(rest[0]) >>> 0)\n : Number(BigInt.asIntN(64, BigInt(rest[0])));\n return at >= 0 && Number.isSafeInteger(at) ? at : undefined;\n}\n\nfunction readInto(sys: PositionalDeps['sys'], kfd: number, target: Uint8Array, at: number): number {\n let done = 0;\n while (done < target.length) {\n const got = sys.pread?.(kfd, target.length - done, at + done) ?? new Uint8Array(0);\n if (got.length === 0) break;\n target.set(got, done);\n done += got.length;\n }\n return done;\n}\n\nfunction positioned(original: Positional, write: boolean, deps: PositionalDeps): Positional {\n return (fd, iov, iovcnt, ...rest) => {\n const stream = deps.fs()?.getStream(Number(fd));\n const memory = deps.memory();\n const kfd = stream?.sliccKernelFile ? stream.sliccKernelFd : undefined;\n if (kfd === undefined || !memory || !(write ? deps.sys.pwrite : deps.sys.pread)) {\n return original(fd, iov, iovcnt, ...rest);\n }\n const at = offsetOf(rest);\n if (at === undefined) return wasiErrno('EINVAL');\n const view = new DataView(memory.buffer);\n let done = 0;\n try {\n for (let i = 0; i < Number(iovcnt); i++) {\n const ptr = view.getUint32(Number(iov) + i * 8, true);\n const len = view.getUint32(Number(iov) + i * 8 + 4, true);\n const part = new Uint8Array(memory.buffer, ptr, len);\n const moved = write\n ? (deps.sys.pwrite?.(kfd, part.slice(), at + done) ?? 0)\n : readInto(deps.sys, kfd, part, at + done);\n done += moved;\n if (moved < len) break;\n }\n } catch (err) {\n return errnoOf(err);\n }\n view.setUint32(Number(rest[rest.length - 1]), done, true);\n return 0;\n };\n}\n\nexport function positionalIo(imports: WebAssembly.Imports, deps: PositionalDeps): void {\n for (const namespace of namespaces(imports)) {\n for (const [name, write] of [\n ['fd_pread', false],\n ['fd_pwrite', true],\n ] as const) {\n const key = keyOf(namespace, name, deps.glue);\n if (key !== undefined) {\n namespace[key] = positioned(namespace[key] as Positional, write, deps);\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 FdImports,\n type GlueSyscalls,\n positionalIo,\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 pwrite(fd, bytes, at) {\n return json(\n call({ op: 'fd-pwrite', fd, offset: at, body: bytes }, `fd-pwrite ${fd}`)\n ) as number;\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 'Module.sliccFdImports ??= {',\n \" fd_sync: typeof _fd_sync === 'function' ? _fd_sync : undefined,\",\n \" fd_pread: typeof _fd_pread === 'function' ? _fd_pread : undefined,\",\n \" fd_pwrite: typeof _fd_pwrite === 'function' ? _fd_pwrite : 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 const glue = ownValue<FdImports>(module, 'sliccFdImports');\n syncFsync(imports, () => ownValue<ProcessFs>(module, 'FS'), glue);\n positionalIo(imports, {\n glue,\n fs: () => ownValue<ProcessFs>(module, 'FS'),\n sys,\n memory: () => memory,\n });\n return WebAssembly.instantiate(init.program.module, imports);\n })\n .then((instance) => {\n memory = wasmMemory(instance, imports);\n done(instance, init.program.module);\n }, failed);\n return {};\n },\n\n preRun: [\n (m: object) => {\n if (!hasStreams(m)) return;\n const fs = (m as RunningModule).FS;\n\n trackCloseOnExec(fs);\n try {\n fs.mkdirTree(init.cwd);\n fs.chdir(init.cwd);\n } catch {}\n },\n ],\n onRuntimeInitialized: () => ready(),\n };\n (deps.evaluate ?? evaluateGlue)(init.program.glue, module);\n await initialized;\n const running = module as unknown as RunningModule;\n if (!hasStreams(running)) return runStdioOnly(running, init);\n const vfs = mountVfsIntoEmscripten(running.FS, {\n bridge: createSyncFsSabBridge(transport),\n cwd: init.cwd,\n warn: deps.warn ?? say(2),\n });\n const sigpipe = (): boolean => running.sliccSigpipe?.() === 1;\n const restartable = (): boolean => signals.restartable();\n const streams = new KernelStreams(running.FS, sys, { sigpipe, restartable });\n trackCloseOnExec(running.FS);\n if (init.fork) restoreForkedStreams(running.FS, streams, init.fork.streams ?? []);\n else {\n wireKernelStdio(running.FS, streams);\n for (const entry of init.fds ?? []) wireKernelFd(running.FS, streams, entry);\n }\n const pipefs = ownValue<ProcessPipeFs>(running, 'PIPEFS');\n if (pipefs) streams.usePipes(pipefs);\n streams.useControllingTerminal();\n useDevFd(running.FS);\n ownByRealmUser(running.FS);\n const livePath = (s: ProcessStream) => liveNodePath(s.node as unknown as LiveFsNode);\n running.sliccKernel = createProcessKernel({\n transport,\n Fs: running.FS,\n env: init.env,\n beforeSpawn: () => vfs.flush(),\n afterChild: () => vfs.invalidate(),\n pid: init.pid,\n raise: (sig) => running.sliccRaise?.(sig),\n restartable,\n describeFork: () => describeForFork(running.FS, sys, streams, livePath),\n inherit: (actions) => describeInherited(running.FS, sys, streams, livePath, actions),\n stdioPromoter: () => vfsPromoter(running.FS, sys, streams, livePath),\n });\n running.sliccKernel.http = createHttpKernel(transport);\n running.sliccKernel.net = createSocketKernel({\n transport,\n Fs: running.FS,\n sys,\n streams,\n sigpipe,\n restartable,\n });\n try {\n return runMain(running, init);\n } finally {\n vfs.flush();\n }\n}\n\nfunction hasStreams(module: object): boolean {\n return typeof ownValue<Partial<ProcessFs>>(module, 'FS')?.getStream === 'function';\n}\n\nfunction runStdioOnly(running: RunningModule, init: WasmProcessInitMsg): number {\n if (init.fork) throw new Error(`${init.argv0} cannot resume a fork: it has no filesystem`);\n return runMain(running, init);\n}\n\nfunction runMain(running: RunningModule, init: WasmProcessInitMsg): number {\n try {\n if (init.fork) {\n if (!running.sliccForkChild) throw new Error(`${init.argv0} cannot resume a fork`);\n return running.sliccForkChild({ ...init.fork, pid: init.pid }) ?? 0;\n }\n\n return (running.sliccRunMain ?? running.callMain)(init.args) ?? 0;\n } catch (e) {\n const status = (e as { status?: unknown })?.status;\n if (typeof status !== 'number') throw e;\n return status;\n }\n}\n", "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", "export interface ImportedMemory {\n module: string;\n name: string;\n initial: number;\n maximum?: number;\n shared: boolean;\n}\n\nexport function importedMemory(bytes: Uint8Array): ImportedMemory | undefined {\n let at = 8;\n const u32 = (): number => {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = bytes[at++];\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n };\n const name = (): string => {\n const len = u32();\n const s = new TextDecoder().decode(bytes.subarray(at, at + len));\n at += len;\n return s;\n };\n const limits = () => {\n const flags = bytes[at++];\n const initial = u32();\n const maximum = flags & 1 ? u32() : undefined;\n return { initial, maximum, shared: (flags & 2) !== 0 };\n };\n while (at < bytes.length) {\n const id = bytes[at++];\n const size = u32();\n const end = at + size;\n if (id !== 2) {\n at = end;\n continue;\n }\n const count = u32();\n for (let i = 0; i < count; i++) {\n const module = name();\n const field = name();\n const kind = bytes[at++];\n if (kind === 0) u32();\n else if (kind === 1) {\n at++;\n limits();\n } else if (kind === 2) {\n const l = limits();\n return { module, name: field, ...l };\n } else if (kind === 3) at += 2;\n else if (kind === 4) {\n at++;\n u32();\n }\n }\n return undefined;\n }\n return undefined;\n}\n\nexport const RESERVED_NAMESPACES: ReadonlySet<string> = new Set([\n 'wasi_snapshot_preview1',\n 'wasix_32v1',\n 'wasi',\n 'env',\n]);\n\nexport type ForeignResult = 'none' | 'i32' | 'i64' | 'f32' | 'f64' | 'other';\n\nexport type ForeignResults = Record<string, Record<string, ForeignResult>>;\n\nconst RESULTS: Readonly<Record<number, ForeignResult>> = {\n 127: 'i32',\n 126: 'i64',\n 125: 'f32',\n 124: 'f64',\n};\n\nfunction resultOf(results: number[]): ForeignResult {\n if (results.length === 0) return 'none';\n return (results.length === 1 && RESULTS[results[0]]) || 'other';\n}\n\nclass Reader {\n at = 8;\n readonly bytes: Uint8Array;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n }\n\n byte(): number {\n return this.bytes[this.at++];\n }\n\n u32(): number {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = this.byte();\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n }\n\n name(): string {\n const len = this.u32();\n const s = new TextDecoder().decode(this.bytes.subarray(this.at, this.at + len));\n this.at += len;\n return s;\n }\n\n valtype(): number {\n const code = this.byte();\n if (code === 0x63 || code === 0x64) this.u32();\n return code;\n }\n\n limits(): void {\n const flags = this.byte();\n this.u32();\n if (flags & 1) this.u32();\n }\n}\n\nfunction readTypes(r: Reader): ForeignResult[] | undefined {\n const types: ForeignResult[] = [];\n for (let i = r.u32(); i > 0; i--) {\n if (r.byte() !== 0x60) return undefined;\n for (let n = r.u32(); n > 0; n--) r.valtype();\n const results: number[] = [];\n for (let n = r.u32(); n > 0; n--) results.push(r.valtype());\n types.push(resultOf(results));\n }\n return types;\n}\n\nfunction skipImport(r: Reader, kind: number): void {\n if (kind === 1) {\n r.valtype();\n r.limits();\n } else if (kind === 2) r.limits();\n else if (kind === 3) {\n r.valtype();\n r.byte();\n } else {\n r.byte();\n r.u32();\n }\n}\n\nfunction readImports(r: Reader, types: ForeignResult[]): ForeignResults {\n const foreign: ForeignResults = {};\n for (let i = r.u32(); i > 0; i--) {\n const module = r.name();\n const field = r.name();\n const kind = r.byte();\n if (kind !== 0) skipImport(r, kind);\n else {\n const type = types[r.u32()] ?? 'other';\n if (!RESERVED_NAMESPACES.has(module)) (foreign[module] ??= {})[field] = type;\n }\n }\n return foreign;\n}\n\nexport function foreignImports(bytes: Uint8Array): ForeignResults | undefined {\n const r = new Reader(bytes);\n let types: ForeignResult[] | undefined = [];\n while (r.at < bytes.length) {\n const id = r.byte();\n const end = r.u32() + r.at;\n if (id === 1) types = readTypes(r);\n if (!types) return undefined;\n if (id === 2) return readImports(r, types);\n r.at = end;\n }\n return {};\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 ForeignResults, type ImportedMemory, RESERVED_NAMESPACES } 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 = RESERVED_NAMESPACES;\n\nconst noErrno = (key: string) =>\n `imports ${key}: its result cannot carry ENOSYS, and this host does not provide it`;\n\nfunction enosys(module: string, name: string, foreign: ForeignResults | undefined) {\n const type = foreign?.[module]?.[name];\n if (type === 'other') throw new Error(noErrno(`${module}.${name}`));\n if (type === 'none') return () => undefined;\n if (type === 'i64') return () => 52n;\n return () => 52;\n}\n\nfunction firstOther(foreign: ForeignResults): string | undefined {\n for (const [module, fields] of Object.entries(foreign)) {\n const name = Object.keys(fields).find((field) => fields[field] === 'other');\n if (name !== undefined) return `${module}.${name}`;\n }\n return undefined;\n}\n\ninterface ImportScope {\n extended: boolean;\n wasi: boolean;\n wasix: boolean;\n pie: boolean;\n memory: ImportedMemory | undefined;\n}\n\nfunction accepted(imp: WebAssembly.ModuleImportDescriptor, scope: ImportScope): boolean {\n const { module, name, kind } = imp;\n if (module === PREVIEW1 || module === WASIX) return true;\n if (!RESERVED.has(module) && (scope.extended || (scope.wasi && kind === 'function'))) return true;\n if (scope.pie && (module === 'GOT.mem' || module === 'GOT.func')) return true;\n if (scope.pie && module === 'env' && kind !== 'memory') return true;\n if (kind === 'memory' && scope.memory?.module === module && scope.memory.name === name)\n return true;\n return module === 'wasi' && name === 'thread-spawn' && (scope.wasix || !!scope.memory?.shared);\n}\n\nexport function unsupportedImport(\n module: WebAssembly.Module,\n memory?: ImportedMemory,\n extended = false,\n foreign: ForeignResults = {}\n): string | undefined {\n const imports = WebAssembly.Module.imports(module);\n const wasix = imports.some((i) => i.module === WASIX);\n const wasi = wasix || imports.some((i) => i.module === PREVIEW1);\n const scope = { extended, wasi, wasix, pie: dylinkInfo(module) !== undefined, memory };\n const refused = imports.find((imp) => !accepted(imp, scope));\n if (refused) {\n if (refused.kind === 'memory' || refused.module === 'wasi') {\n return `imports ${refused.module}.${refused.name}: no WASI program this host runs`;\n }\n return `imports ${refused.module}.${refused.name}: no WASI preview1 program (an Emscripten one runs with its glue)`;\n }\n const unanswerable = extended ? undefined : firstOther(foreign);\n if (unanswerable) return noErrno(unanswerable);\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 foreign?: ForeignResults\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.module === 'wasi' && imp.name === 'thread-spawn') ns[imp.name] = () => -1;\n else if (imp.kind === 'function') ns[imp.name] = enosys(imp.module, imp.name, foreign);\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 foreign,\n }: {\n thread?: boolean;\n stats?: WasiStats;\n signals?: WasiSignals;\n program?: ProgramOption;\n foreign?: ForeignResults | undefined;\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, foreign);\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 init.program.foreign\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 foreign: init.program.foreign,\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 foreign: init.program.foreign,\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
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", "scope", "port", "call", "wrap", "port", "failed", "code"]
7
7
  }