@ai-ecoverse/slicc-kernel 1.78.0 → 1.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/driver-worker.js.map +2 -2
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +16 -12
- package/dist/kernel-worker.js.map +2 -2
- package/dist/node-driver-worker.js.map +2 -2
- package/dist/node-process-worker.js +3 -1
- package/dist/node-process-worker.js.map +2 -2
- package/dist/node.js +16 -12
- package/dist/node.js.map +2 -2
- package/dist/process-worker.js +3 -1
- package/dist/process-worker.js.map +2 -2
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/process/js/lockdown.ts", "../src/process/wasi/wasi-abi.ts", "../src/fs/pages.ts", "../src/fs/ranged.ts", "../src/process/wasi/wasi-files.ts", "../src/kernel/protocol.ts", "../src/process/wasi/wasi-threads.ts", "../src/fs/physical-path.ts", "../src/realm/sync-sab-wire.ts", "../src/kernel/cpu-clock.ts", "../src/fs/types.ts", "../src/kernel/cred.ts", "../src/kernel/pipe.ts", "../src/kernel/fd-table.ts", "../src/realm/sync-fs-wire.ts", "../src/process/wasi/wasi-fds.ts", "../src/process/wasi/wasi-memory.ts", "../src/process/wasi/wasi-poll.ts", "../src/process/wasi/wasi-termios.ts", "../src/process/wasi/wasi-host.ts", "../src/process/wasi/wasix-process.ts", "../src/process/wasi/wasi-imports.ts", "../src/process/js/async-sab.ts", "../src/kernel/signals.ts", "../src/process/js/js-kernel.ts", "../src/process/js/js-children.ts", "../src/process/js/js-io.ts", "../src/process/js/js-dev.ts", "../src/process/js/js-exit.ts", "../src/process/js/js-fetch.ts", "../src/process/js/js-net.ts", "../src/process/js/js-run.ts", "../src/realm/sync-sab-bridge.ts", "../src/process/js/js-sync.ts", "../src/process/js/js-tty.ts", "../src/process/js/js-websocket.ts", "../src/process/js/js-context.ts", "../src/process/js/js-runtime.ts", "../src/kernel/net/loopback-names.ts", "../src/process/wasi-errno.ts", "../src/realm/live-vfs-fs.ts", "../src/realm/emscripten-vfs-hook.ts", "../src/process/kernel-streams.ts", "../src/process/process-pty.ts", "../src/process/process-fds.ts", "../src/process/process-fork.ts", "../src/process/process-children.ts", "../src/process/process-http.ts", "../src/process/process-signals.ts", "../src/process/process-sockets.ts", "../src/process/procfs.ts", "../src/process/realm-user.ts", "../src/process/process-runtime.ts", "../src/process/wasi/dylink.ts", "../src/process/wasi/wasi-module.ts", "../src/process/wasi/wasi-procfs.ts", "../src/process/wasi/wasi-signals.ts", "../src/process/wasi/wasi-stats.ts", "../src/process/wasi/wasix-fork.ts", "../src/process/wasi/wasix-ffi.ts", "../src/process/wasi/wasix-trampoline.ts", "../src/process/wasi/wasm-functypes.ts", "../src/process/wasi/wasix-linker.ts", "../src/kernel/net/routes.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/node-lockdown.ts", "../src/process/process-entry.ts"],
|
|
4
|
-
"sourcesContent": ["export const BLOCKED_GLOBALS: readonly string[] = [\n 'XMLHttpRequest',\n 'WebSocketStream',\n 'WebTransport',\n 'EventSource',\n 'importScripts',\n 'indexedDB',\n 'caches',\n 'cookieStore',\n 'Worker',\n 'SharedWorker',\n 'BroadcastChannel',\n 'postMessage',\n 'close',\n 'webkitRequestFileSystem',\n 'webkitRequestFileSystemSync',\n 'webkitResolveLocalFileSystemURL',\n 'webkitResolveLocalFileSystemSyncURL',\n];\n\nexport const BLOCKED_NAVIGATOR: readonly string[] = [\n 'storage',\n 'storageBuckets',\n 'locks',\n 'serviceWorker',\n 'usb',\n 'hid',\n 'serial',\n];\n\nexport const OPEN_SLOTS: readonly string[] = ['fetch', 'WebSocket'];\n\nfunction chain(target: object): object[] {\n const out: object[] = [];\n for (let at: object | null = target; at && at !== Object.prototype; ) {\n out.push(at);\n at = Object.getPrototypeOf(at);\n }\n return out;\n}\n\nexport function hide(target: object, names: readonly string[]): void {\n for (const name of names) {\n const holders = chain(target);\n for (const holder of holders) {\n if (Object.getOwnPropertyDescriptor(holder, name)?.configurable) {\n Reflect.deleteProperty(holder, name);\n }\n }\n const kept = holders.slice(1).some((holder) => Object.hasOwn(holder, name));\n const defined = Reflect.defineProperty(target, name, {\n value: undefined,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n if (kept || (!defined && Reflect.get(target, name) !== undefined)) {\n throw new Error(`slicc-kernel: cannot withhold ${name} from a JS program`);\n }\n }\n}\n\nexport function vacate(target: object, names: readonly string[]): void {\n for (const name of names) {\n for (let at: object | null = target; at && at !== Object.prototype; ) {\n if (Object.getOwnPropertyDescriptor(at, name)?.configurable) Reflect.deleteProperty(at, name);\n at = Object.getPrototypeOf(at);\n }\n Reflect.defineProperty(target, name, {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n if (Reflect.get(target, name) !== undefined) {\n throw new Error(`slicc-kernel: cannot withhold ${name} from a JS program`);\n }\n }\n}\n\nexport function lockdown(scope: object = globalThis): void {\n hide(scope, BLOCKED_GLOBALS);\n vacate(scope, OPEN_SLOTS);\n const navigator = (scope as { navigator?: unknown }).navigator;\n if (navigator && typeof navigator === 'object') hide(navigator, BLOCKED_NAVIGATOR);\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 BADMSG: 9,\n BUSY: 10,\n CANCELED: 11,\n CHILD: 12,\n CONNABORTED: 13,\n CONNREFUSED: 14,\n CONNRESET: 15,\n DEADLK: 16,\n DESTADDRREQ: 17,\n DOM: 18,\n DQUOT: 19,\n EXIST: 20,\n FAULT: 21,\n FBIG: 22,\n HOSTUNREACH: 23,\n IDRM: 24,\n ILSEQ: 25,\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 MLINK: 34,\n MSGSIZE: 35,\n MULTIHOP: 36,\n NAMETOOLONG: 37,\n NETDOWN: 38,\n NETRESET: 39,\n NETUNREACH: 40,\n NFILE: 41,\n NOBUFS: 42,\n NODEV: 43,\n NOENT: 44,\n NOEXEC: 45,\n NOLCK: 46,\n NOLINK: 47,\n NOMEM: 48,\n NOMSG: 49,\n NOPROTOOPT: 50,\n NOSPC: 51,\n NOSYS: 52,\n NOTCONN: 53,\n NOTDIR: 54,\n NOTEMPTY: 55,\n NOTRECOVERABLE: 56,\n NOTSOCK: 57,\n NOTSUP: 58,\n NOTTY: 59,\n NXIO: 60,\n OVERFLOW: 61,\n OWNERDEAD: 62,\n PERM: 63,\n PIPE: 64,\n PROTO: 65,\n PROTONOSUPPORT: 66,\n PROTOTYPE: 67,\n RANGE: 68,\n ROFS: 69,\n SPIPE: 70,\n SRCH: 71,\n STALE: 72,\n TIMEDOUT: 73,\n TXTBSY: 74,\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 if (name === 'NOMEDIUM') return E.NODEV;\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\nexport function wasixSignal(sig: number): number | undefined {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31 ? sig : undefined;\n}\n", "export const PAGE = 64 * 1024;\nexport const READAHEAD = 1024 * 1024;\nexport const CLEAN_LIMIT = 4 * 1024 * 1024;\nexport const WRITEBACK = 8 * 1024 * 1024;\nexport const RUN = 1024 * 1024;\n\nexport interface Run {\n offset: number;\n bytes: Uint8Array;\n}\n\nexport interface FlushPlan {\n shrink?: number;\n runs: Run[];\n extend?: number;\n}\n\nexport class Pages {\n length: number;\n private stored: number;\n private shrink: number | undefined;\n private readonly pages = new Map<number, Uint8Array>();\n private readonly dirty = new Set<number>();\n private readonly free: Uint8Array[] = [];\n private pinned = false;\n\n constructor(size: number) {\n this.length = size;\n this.stored = size;\n }\n\n get dirtyBytes(): number {\n return this.dirty.size * PAGE;\n }\n\n get changed(): boolean {\n return this.dirty.size > 0 || this.shrink !== undefined || this.length !== this.stored;\n }\n\n missing(at: number, length: number): Array<[number, number]> {\n this.evict();\n const end = Math.min(this.stored, at + length, this.length);\n const runs: Array<[number, number]> = [];\n for (let page = Math.floor(at / PAGE); page * PAGE < end; page++) {\n if (this.pages.has(page)) continue;\n const last = runs[runs.length - 1];\n if (last && last[0] + last[1] === page * PAGE) last[1] += PAGE;\n else runs.push([page * PAGE, PAGE]);\n }\n const last = runs[runs.length - 1];\n if (last) last[1] = Math.max(last[1], Math.min(READAHEAD, this.stored - last[0]));\n return runs.map(([start, n]) => [start, Math.min(n, this.stored - start)]);\n }\n\n partial(at: number, length: number): Array<[number, number]> {\n if (length === 0) return [];\n this.evict();\n const edges = new Set([Math.floor(at / PAGE), Math.floor((at + length - 1) / PAGE)]);\n const runs: Array<[number, number]> = [];\n for (const page of edges) {\n const start = page * PAGE;\n const covered = at <= start && at + length >= start + PAGE;\n if (covered || this.pages.has(page) || start >= this.stored) continue;\n runs.push([start, Math.min(PAGE, this.stored - start)]);\n }\n return runs;\n }\n\n fill(start: number, bytes: Uint8Array): void {\n for (let at = 0; at < bytes.length; at += PAGE) {\n const page = (start + at) / PAGE;\n if (this.pages.has(page)) continue;\n const part = bytes.subarray(at, Math.min(at + PAGE, bytes.length));\n const fresh = this.take(part.length);\n fresh.set(part);\n this.pages.set(page, fresh);\n }\n }\n\n read(at: number, length: number): Uint8Array {\n const out = new Uint8Array(Math.max(0, Math.min(this.length, at + length) - at));\n this.readInto(at, out);\n return out;\n }\n\n readInto(at: number, out: Uint8Array): number {\n const end = Math.min(this.length, at + out.length);\n for (let pos = at; pos < end; ) {\n const page = Math.floor(pos / PAGE);\n const from = pos - page * PAGE;\n const n = Math.min(PAGE - from, end - pos);\n const bytes = this.pages.get(page);\n if (bytes) out.set(bytes.subarray(from, from + n), pos - at);\n else out.fill(0, pos - at, pos - at + n);\n pos += n;\n }\n return Math.max(0, end - at);\n }\n\n write(at: number, bytes: Uint8Array): void {\n for (let done = 0; done < bytes.length; ) {\n const pos = at + done;\n const page = Math.floor(pos / PAGE);\n const from = pos - page * PAGE;\n const n = Math.min(PAGE - from, bytes.length - done);\n let target = this.pages.get(page);\n if (!target) {\n target = this.take(0);\n this.pages.set(page, target);\n }\n target.set(bytes.subarray(done, done + n), from);\n this.dirty.add(page);\n done += n;\n }\n this.length = Math.max(this.length, at + bytes.length);\n }\n\n truncate(size: number): void {\n if (size < this.stored) {\n this.stored = size;\n this.shrink = Math.min(this.shrink ?? size, size);\n }\n if (size < this.length) {\n const edge = Math.floor(size / PAGE);\n for (const page of [...this.pages.keys()]) {\n if (page > edge || (page === edge && size === edge * PAGE)) this.drop(page);\n }\n this.pages.get(edge)?.fill(0, size - edge * PAGE);\n }\n this.length = size;\n }\n\n plan(): FlushPlan {\n const runs: Run[] = [];\n const sorted = [...this.dirty].sort((a, b) => a - b);\n for (let i = 0; i < sorted.length; ) {\n let j = i + 1;\n const first = sorted[i] as number;\n while (\n j < sorted.length &&\n sorted[j] === first + (j - i) &&\n ((sorted[j] as number) * PAGE) % RUN !== 0\n ) {\n j++;\n }\n const start = first * PAGE;\n const end = Math.min(this.length, (first + (j - i)) * PAGE);\n const bytes = new Uint8Array(end - start);\n for (let k = i; k < j; k++) {\n const page = this.pages.get(sorted[k] as number) as Uint8Array;\n bytes.set(page.subarray(0, Math.min(PAGE, end - (k - i) * PAGE - start)), (k - i) * PAGE);\n }\n runs.push({ offset: start, bytes });\n i = j;\n }\n const written = Math.max(this.stored, ...runs.map((r) => r.offset + r.bytes.length));\n return {\n ...(this.shrink !== undefined ? { shrink: this.shrink } : {}),\n runs,\n ...(this.length > written ? { extend: this.length } : {}),\n };\n }\n\n flushed(): void {\n this.dirty.clear();\n this.shrink = undefined;\n this.stored = this.length;\n this.evict();\n }\n\n pin(): void {\n this.pinned = true;\n }\n\n reset(size: number): void {\n if (this.pinned) return;\n for (const page of [...this.pages.keys()]) if (!this.dirty.has(page)) this.drop(page);\n if (this.changed) return;\n this.length = size;\n this.stored = size;\n }\n\n private evict(): void {\n if (this.pinned) return;\n let clean = (this.pages.size - this.dirty.size) * PAGE;\n for (const page of this.pages.keys()) {\n if (clean <= CLEAN_LIMIT) return;\n if (this.dirty.has(page)) continue;\n this.drop(page);\n clean -= PAGE;\n }\n }\n\n private take(used: number): Uint8Array {\n const page = this.free.pop();\n if (!page) return new Uint8Array(PAGE);\n page.fill(0, used);\n return page;\n }\n\n private drop(page: number): void {\n const bytes = this.pages.get(page) as Uint8Array;\n this.pages.delete(page);\n this.dirty.delete(page);\n if (this.free.length < CLEAN_LIMIT / PAGE) this.free.push(bytes);\n }\n}\n", "import { Pages, WRITEBACK } from './pages.ts';\n\nexport interface RangedIo {\n pread(path: string, offset: number, length: number, version?: string): Uint8Array;\n pwrite(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): void;\n truncate(path: string, size: number): void;\n}\n\nexport interface AsyncRangedIo {\n pread(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate(path: string, size: number): Promise<void>;\n}\n\nexport class RangedFile {\n private readonly pages: Pages;\n private readonly io: RangedIo;\n private pinned = false;\n private version: string | undefined;\n path: string;\n\n constructor(io: RangedIo, path: string, size: number, version?: string) {\n this.io = io;\n this.path = path;\n this.version = version;\n this.pages = new Pages(size);\n }\n\n get changed(): boolean {\n return this.pages.changed;\n }\n\n get pinnedVersion(): string | undefined {\n return this.version;\n }\n\n forget(): void {\n this.pages.reset(this.pages.length);\n }\n\n size(): number {\n return this.pages.length;\n }\n\n private fetch(runs: Array<[number, number]>): void {\n for (const [start, n] of runs) {\n this.pages.fill(start, this.io.pread(this.path, start, n, this.version));\n }\n }\n\n read(at: number, length: number): Uint8Array {\n this.fetch(this.pages.missing(at, length));\n return this.pages.read(at, length);\n }\n\n readInto(at: number, out: Uint8Array): number {\n this.fetch(this.pages.missing(at, out.length));\n return this.pages.readInto(at, out);\n }\n\n write(at: number, bytes: Uint8Array): void {\n this.fetch(this.pages.partial(at, bytes.length));\n this.pages.write(at, bytes);\n if (!this.pinned && this.pages.dirtyBytes >= WRITEBACK) this.flush();\n }\n\n truncate(size: number): void {\n this.pages.truncate(size);\n }\n\n flush(): void {\n if (this.pinned || !this.pages.changed) return;\n const plan = this.pages.plan();\n if (plan.shrink !== undefined) this.io.truncate(this.path, plan.shrink);\n for (const run of plan.runs) this.io.pwrite(this.path, run.offset, run.bytes, true);\n if (plan.extend !== undefined) this.io.truncate(this.path, plan.extend);\n this.version = undefined;\n this.pages.flushed();\n }\n\n pin(): void {\n this.pinned = true;\n this.pages.pin();\n this.fetch(this.pages.missing(0, this.pages.length));\n }\n\n reset(size: number): void {\n this.pages.reset(size);\n }\n}\n\nexport class AsyncRangedFile {\n private readonly pages: Pages;\n private readonly io: AsyncRangedIo;\n private pinned = false;\n private version: string | undefined;\n path: string;\n\n constructor(io: AsyncRangedIo, path: string, size: number, version?: string) {\n this.io = io;\n this.path = path;\n this.version = version;\n this.pages = new Pages(size);\n }\n\n size(): number {\n return this.pages.length;\n }\n\n private async fetch(runs: Array<[number, number]>): Promise<void> {\n for (const [start, n] of runs) {\n this.pages.fill(start, await this.io.pread(this.path, start, n, this.version));\n }\n }\n\n async read(at: number, length: number): Promise<Uint8Array> {\n await this.fetch(this.pages.missing(at, length));\n return this.pages.read(at, length);\n }\n\n async write(at: number, bytes: Uint8Array): Promise<void> {\n await this.fetch(this.pages.partial(at, bytes.length));\n this.pages.write(at, bytes);\n if (!this.pinned && this.pages.dirtyBytes >= WRITEBACK) await this.flush();\n }\n\n truncate(size: number): void {\n this.pages.truncate(size);\n }\n\n async flush(): Promise<void> {\n if (this.pinned || !this.pages.changed) return;\n const plan = this.pages.plan();\n if (plan.shrink !== undefined) await this.io.truncate(this.path, plan.shrink);\n for (const run of plan.runs) await this.io.pwrite(this.path, run.offset, run.bytes, true);\n if (plan.extend !== undefined) await this.io.truncate(this.path, plan.extend);\n this.version = undefined;\n this.pages.flushed();\n }\n\n async pin(): Promise<void> {\n this.pinned = true;\n this.pages.pin();\n await this.fetch(this.pages.missing(0, this.pages.length));\n }\n}\n", "import { RangedFile } from '../../fs/ranged.ts';\nimport type { DeviceAccess, KernelFdKind } from '../../kernel/fd-table.ts';\nimport type {\n SyncFsBridgeStat,\n SyncFsFileIo,\n SyncFsPosixBridge,\n} 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 whole = false;\n private from = Infinity;\n private to = 0;\n\n private orphaned = false;\n\n opens = 0;\n\n private readonly fs: SyncFsFileIo;\n private where: string;\n private readonly ranged: RangedFile | undefined;\n\n maxFile: number | undefined;\n handle: number | undefined;\n\n constructor(\n fs: SyncFsFileIo,\n path: string,\n\n empty: boolean,\n maxFile?: number,\n size?: number,\n version?: string\n ) {\n this.fs = fs;\n this.where = path;\n this.maxFile = maxFile;\n const { pread, pwrite, truncate } = fs;\n if (size !== undefined && pread && pwrite && truncate) {\n const io = { pread: pread.bind(fs), pwrite: pwrite.bind(fs), truncate: truncate.bind(fs) };\n this.ranged = new RangedFile(io, path, size, version);\n if (empty) this.truncate(0);\n } else if (empty) {\n this.data = new Uint8Array(0);\n this.dirty = true;\n this.whole = true;\n }\n }\n\n get path(): string {\n return this.where;\n }\n\n set path(path: string) {\n this.where = path;\n if (this.ranged) this.ranged.path = path;\n }\n\n get isRanged(): boolean {\n return this.ranged !== undefined;\n }\n\n get pin(): string | undefined {\n return this.ranged?.pinnedVersion;\n }\n\n keep(): void {\n if (this.ranged) this.ranged.pin();\n else this.load();\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 if (this.ranged) return this.ranged.size();\n this.load();\n return this.length;\n }\n\n pread(max: number, at: number): Uint8Array {\n if (this.ranged) return this.ranged.read(at, max);\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 private fits(end: number): void {\n if (this.maxFile !== undefined && end > this.maxFile) throw new WasiError('EFBIG');\n }\n\n pwrite(bytes: Uint8Array, at: number): number {\n if (bytes.length === 0) return 0;\n const end = at + bytes.length;\n this.fits(end);\n this.dirty = true;\n if (this.ranged) {\n this.ranged.write(at, bytes);\n return bytes.length;\n }\n this.load();\n this.ensure(end);\n const buf = this.data as Uint8Array;\n this.from = Math.min(this.from, at, this.length);\n this.to = Math.max(this.to, end);\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 return bytes.length;\n }\n\n truncate(size: number): void {\n this.fits(size);\n this.dirty = true;\n if (this.ranged) {\n this.ranged.truncate(size);\n return;\n }\n this.load();\n this.ensure(size);\n this.whole = true;\n if (size > this.length) (this.data as Uint8Array).fill(0, this.length, size);\n this.length = size;\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 this.ranged?.pin();\n }\n\n isOrphan(): boolean {\n return this.orphaned;\n }\n\n isDirty(): boolean {\n return this.dirty;\n }\n\n contents(): Uint8Array {\n if (this.ranged) return this.ranged.read(0, this.ranged.size());\n return this.load().slice(0, this.length);\n }\n\n flush(): void {\n if (this.orphaned || !this.dirty) return;\n if (this.ranged) this.ranged.flush();\n else if (!this.data) return;\n else if (this.whole || !this.fs.pwrite)\n this.fs.writeFile(this.path, this.data.slice(0, this.length), true);\n else this.fs.pwrite(this.path, this.from, this.data.slice(this.from, this.to), true);\n this.dirty = false;\n this.whole = false;\n this.from = Infinity;\n this.to = 0;\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 path?: string;\n ino?: number;\n }\n | { type: 'file'; file: LocalFile }\n | {\n type: 'dir';\n path: string;\n\n preopen?: string;\n twin?: number;\n listing?: DirListing;\n }\n | {\n type: 'device';\n device: 'null' | 'zero' | 'full' | '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\nconst MAX_LINKS = 40;\n\nexport function physical(fs: Pick<SyncFsPosixBridge, 'lstat' | 'readlink'>, path: string): string {\n let done: string[] = [];\n let todo = path.split('/').filter((part) => part !== '' && part !== '.');\n let hops = 0;\n while (todo.length > 0) {\n const part = todo.shift() as string;\n if (part === '..') {\n done.pop();\n continue;\n }\n if (!todo.includes('..')) {\n done.push(part);\n continue;\n }\n const at = `/${[...done, part].join('/')}`;\n const st = fs.lstat(at);\n if (st.isSymbolicLink) {\n if (++hops > MAX_LINKS) throw new WasiError('ELOOP');\n const target = fs.readlink(at);\n if (target.startsWith('/')) done = [];\n todo = [...target.split('/').filter((p) => p !== '' && p !== '.'), ...todo];\n } else if (!st.isDirectory) {\n throw new WasiError('ENOTDIR');\n } else {\n done.push(part);\n }\n }\n return `/${done.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 const MISS_TTL_MS = 20;\n\ninterface Miss {\n error: Error;\n until: number;\n}\n\nexport const FS_GEN = 4;\nconst RING = 8;\nconst RING_SIZE = 64;\nconst SLOT = 3;\nexport const SHARED_IDS_BYTES = (RING + RING_SIZE * SLOT) * 4;\n\ntype Cached = SyncFsBridgeStat | Miss;\n\nfunction inoKey(st: Cached): number {\n return 'ino' in st && typeof st.ino === 'number' ? (st.ino % 4294967296) | 0 : 0;\n}\n\nfunction pathHash(path: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < path.length; i++) h = Math.imul(h ^ path.charCodeAt(i), 0x01000193);\n return h === 0 ? 1 : h;\n}\n\nclass StatCache {\n readonly stats = new Map<string, Cached>();\n readonly lstats = new Map<string, Cached>();\n private readonly byHash = new Map<number, Set<string>>();\n private readonly byIno = new Map<number, Set<string>>();\n private readonly shared: Int32Array | undefined;\n private seen: number;\n constructor(shared: Int32Array | undefined) {\n this.shared = shared;\n this.seen = shared ? Atomics.load(shared, FS_GEN) : 0;\n }\n\n put(map: Map<string, Cached>, path: string, entry: Cached): void {\n map.set(path, entry);\n if (!this.shared) return;\n index(this.byHash, pathHash(path), path);\n const ino = inoKey(entry);\n if (ino !== 0) index(this.byIno, ino, path);\n }\n\n fresh(): void {\n if (!this.shared) return;\n const now = Atomics.load(this.shared, FS_GEN);\n if (now === this.seen) return;\n this.replay(now);\n this.seen = now;\n }\n\n changed(path: string | undefined, ino = 0): void {\n const key = (ino % 4294967296) | 0;\n if (this.shared) {\n const g = this.publish(this.shared, path === undefined ? 0 : pathHash(path), key);\n this.replay(g - 1);\n this.seen = g;\n if (path === undefined) this.clear();\n else this.drop(pathHash(path), key);\n }\n if (path === undefined) return;\n this.stats.delete(path);\n this.lstats.delete(path);\n }\n\n mutated(paths: readonly string[], ino = 0): void {\n this.clear();\n if (!this.shared) return;\n const key = (ino % 4294967296) | 0;\n for (const [i, hash] of (paths.length > 0 ? paths.map(pathHash) : [0]).entries()) {\n this.seen = this.publish(this.shared, hash, i === 0 ? key : 0);\n }\n }\n\n inoOf(path: string, look: () => SyncFsBridgeStat): number {\n if (!this.shared) return 0;\n this.fresh();\n const hit = this.stats.get(path);\n if (hit && 'ino' in hit && typeof hit.ino === 'number') return hit.ino;\n try {\n return look().ino ?? 0;\n } catch {\n return 0;\n }\n }\n\n private publish(shared: Int32Array, hash: number, ino: number): number {\n const g = Atomics.add(shared, FS_GEN, 1) + 1;\n const at = RING + (g % RING_SIZE) * SLOT;\n Atomics.store(shared, at, 0);\n Atomics.store(shared, at + 1, hash);\n Atomics.store(shared, at + 2, ino);\n Atomics.store(shared, at, g);\n return g;\n }\n\n private replay(upTo: number): void {\n const shared = this.shared as Int32Array;\n const missed: Array<[number, number]> = [];\n for (let g = this.seen + 1; g <= upTo && upTo - this.seen <= RING_SIZE; g++) {\n const at = RING + (g % RING_SIZE) * SLOT;\n const tag = Atomics.load(shared, at);\n const hash = Atomics.load(shared, at + 1);\n const ino = Atomics.load(shared, at + 2);\n if (tag !== g || hash === 0 || Atomics.load(shared, at) !== g) break;\n missed.push([hash, ino]);\n }\n if (missed.length < upTo - this.seen) this.clear();\n else for (const [hash, ino] of missed) this.drop(hash, ino);\n }\n\n private drop(hash: number, ino: number): void {\n const paths = [\n ...(this.byHash.get(hash) ?? []),\n ...(ino === 0 ? [] : (this.byIno.get(ino) ?? [])),\n ];\n for (const path of paths) {\n this.stats.delete(path);\n this.lstats.delete(path);\n }\n this.byHash.delete(hash);\n if (ino !== 0) this.byIno.delete(ino);\n }\n\n private clear(): void {\n this.stats.clear();\n this.lstats.clear();\n this.byHash.clear();\n this.byIno.clear();\n }\n}\n\nfunction index(map: Map<number, Set<string>>, key: number, path: string): void {\n const paths = map.get(key) ?? new Set<string>();\n paths.add(path);\n map.set(key, paths);\n}\n\nexport function cachingBridge(\n bridge: SyncFsPosixBridge,\n now: () => number = () => performance.now(),\n shared?: Int32Array\n): SyncFsPosixBridge & {\n invalidate(): void;\n touched(path?: string, ino?: number): void;\n threaded(): void;\n} {\n const blind = shared !== undefined && shared.length * 4 < SHARED_IDS_BYTES;\n const cache = new StatCache(blind ? undefined : shared);\n const { stats, lstats } = cache;\n const cached = (map: typeof stats, path: string, get: () => SyncFsBridgeStat) => {\n if (blind) return get();\n cache.fresh();\n let hit = map.get(path);\n if (hit === undefined || ('until' in hit && hit.until <= now())) {\n try {\n hit = get();\n } catch (e) {\n hit = { error: e as Error, until: now() + MISS_TTL_MS };\n }\n cache.put(map, path, hit);\n }\n if ('until' in hit) throw hit.error;\n return hit;\n };\n const invalidate = () => cache.mutated([]);\n const touched = (path?: string, ino?: number) => cache.changed(path, ino);\n\n const { chown } = bridge;\n const mutating = <T>(op: () => T, ...paths: string[]): T => {\n try {\n return op();\n } finally {\n cache.mutated(paths);\n }\n };\n let exact = false;\n const threaded = () => {\n if (blind || shared === undefined || !bridge.identify) return;\n exact = true;\n bridge.identify();\n };\n const identified = <T>(p: string, op: () => T, also: string[]): T => {\n try {\n return op();\n } finally {\n const st = bridge.identified?.() ?? null;\n if (st) cache.mutated([p, ...also], st.ino);\n else cache.mutated([]);\n }\n };\n const rewriting = <T>(p: string, op: () => T, ...also: string[]): T => {\n if (exact) return identified(p, op, also);\n const ino = cache.inoOf(p, () => bridge.stat(p));\n try {\n return op();\n } finally {\n cache.mutated([p, ...also], ino);\n }\n };\n const entry = (p: string) => [p, p.slice(0, p.lastIndexOf('/')) || '/'];\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 || blind) continue;\n cache.put(lstats, `${base}/${name}`, st);\n if (!st.isSymbolicLink) cache.put(stats, `${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, open) =>\n rewriting(p, () => bridge.writeFile(p, bytes, open), ...entry(p).slice(1)),\n mkdir: (p) => mutating(() => bridge.mkdir(p), ...entry(p)),\n rm: (p) => mutating(() => bridge.rm(p)),\n rename: (from, to) => mutating(() => bridge.rename(from, to)),\n link: (from, to, follow) => mutating(() => bridge.link(from, to, follow)),\n unlink: (p) => mutating(() => bridge.unlink(p)),\n rmdir: (p) => mutating(() => bridge.rmdir(p)),\n symlink: (target, link) => mutating(() => bridge.symlink(target, link), ...entry(link)),\n chmod: (p, mode) => rewriting(p, () => bridge.chmod(p, mode)),\n utimes: (p, a, m, now) => rewriting(p, () => bridge.utimes(p, a, m, now)),\n lutimes: (p, a, m, now) => mutating(() => bridge.lutimes(p, a, m, now), p),\n ...(bridge.hold ? { hold: bridge.hold.bind(bridge) } : {}),\n ...(bridge.access ? { access: bridge.access.bind(bridge) } : {}),\n ...(bridge.kept ? { kept: bridge.kept.bind(bridge) } : {}),\n ...(bridge.keptStat ? { keptStat: bridge.keptStat.bind(bridge) } : {}),\n ...(bridge.pinned ? { pinned: (handle: number) => pinnedIo(bridge, handle, rewriting) } : {}),\n ...(bridge.create\n ? { create: (p: string) => mutating(() => bridge.create?.(p), ...entry(p)) }\n : {}),\n ...(chown\n ? {\n chown: (p: string, uid?: number, gid?: number, follow?: boolean) =>\n rewriting(p, () => chown.call(bridge, p, uid, gid, follow)),\n }\n : {}),\n ...(bridge.pread && bridge.pwrite && bridge.truncate\n ? {\n pread: bridge.pread.bind(bridge),\n pwrite: (p: string, at: number, bytes: Uint8Array, transfer?: boolean) =>\n rewriting(p, () => bridge.pwrite?.(p, at, bytes, transfer)),\n truncate: (p: string, size: number) => rewriting(p, () => bridge.truncate?.(p, size)),\n }\n : {}),\n ...(bridge.owners ? { owners: true } : {}),\n invalidate,\n touched,\n threaded,\n };\n}\n\nfunction pinnedIo(\n bridge: SyncFsPosixBridge,\n handle: number,\n rewriting: <T>(p: string, op: () => T) => T\n): SyncFsFileIo {\n const io = (bridge.pinned as NonNullable<SyncFsPosixBridge['pinned']>)(handle);\n const { pread, pwrite, truncate } = io as Required<SyncFsFileIo>;\n return {\n readFile: (p) => io.readFile(p),\n writeFile: (p, bytes, open) => rewriting(p, () => io.writeFile(p, bytes, open)),\n pread: (p, at, n, version) => pread(p, at, n, version),\n pwrite: (p, at, bytes, transfer) => rewriting(p, () => pwrite(p, at, bytes, transfer)),\n truncate: (p, size) => rewriting(p, () => truncate(p, size)),\n };\n}\n", "import type { ForeignResults, ImportedMemory } from '../process/wasi/wasi-module.ts';\nimport type { WasiForkState } from '../process/wasi/wasix-fork.ts';\nimport type { Cred } from './cred.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 path?: string;\n names?: string;\n imports?: string;\n preopenRoot?: boolean;\n}\n\nexport interface JsProgram {\n abi: 'js';\n glue: string;\n path: string;\n}\n\nexport type Program = WasmProgram | JsProgram;\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 umask?: number;\n cred?: Cred;\n owners?: boolean;\n fork?: ForkState;\n fds?: InheritedFd[];\n}\n\nexport interface JsLane {\n sab: SharedArrayBuffer;\n port: MessagePort;\n}\n\nexport type JsProcessInitMsg = Omit<WasmProcessInitMsg, 'program' | 'fork'> & {\n program: JsProgram;\n lane?: JsLane;\n};\n\nexport type ProcessInitMsg = WasmProcessInitMsg | JsProcessInitMsg;\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 code?: number;\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", "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';\nimport { SHARED_IDS_BYTES } from './wasi-files.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(SHARED_IDS_BYTES));\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", "const MAX_HOPS = 40;\n\ninterface Walk {\n done: string[];\n todo: string[];\n hops: number;\n}\n\nfunction start(path: string): Walk {\n return { done: [], todo: path.split('/').filter((p) => p !== ''), hops: 0 };\n}\n\nfunction next(walk: Walk): string | undefined {\n while (walk.todo.length > 0) {\n const part = walk.todo.shift() as string;\n if (part === '.') continue;\n if (part === '..') {\n walk.done.pop();\n continue;\n }\n return part;\n }\n return undefined;\n}\n\nfunction lexical(path: string): string {\n const walk = start(path);\n for (let part = next(walk); part !== undefined; part = next(walk)) walk.done.push(part);\n return `/${walk.done.join('/')}`;\n}\n\nfunction rest(walk: Walk, part: string): string {\n return lexical(`/${[...walk.done, part, ...walk.todo].join('/')}`);\n}\n\nfunction follow(walk: Walk, target: string): boolean {\n if (++walk.hops > MAX_HOPS) return false;\n if (target.startsWith('/')) walk.done.length = 0;\n walk.todo = [...target.split('/').filter((p) => p !== ''), ...walk.todo];\n return true;\n}\n\nexport interface LinkReader {\n lstat(path: string): { isSymbolicLink?: boolean };\n readlink(path: string): string;\n}\n\nexport function physicalPath(fs: LinkReader, path: string): string {\n const walk = start(path);\n for (let part = next(walk); part !== undefined; part = next(walk)) {\n const at = `/${[...walk.done, part].join('/')}`;\n let target: string | undefined;\n try {\n target = fs.lstat(at).isSymbolicLink ? fs.readlink(at) : undefined;\n } catch {\n return rest(walk, part);\n }\n if (target === undefined) walk.done.push(part);\n else if (!follow(walk, target)) {\n throw Object.assign(new Error('too many levels of symbolic links'), { code: 'ELOOP' });\n }\n }\n return `/${walk.done.join('/')}`;\n}\n\nexport interface AsyncLinkReader {\n lstat(path: string): Promise<{ isSymbolicLink?: boolean }>;\n readlink(path: string): Promise<string>;\n}\n\nexport async function physicalPathAsync(fs: AsyncLinkReader, path: string): Promise<string> {\n const walk = start(path);\n for (let part = next(walk); part !== undefined; part = next(walk)) {\n const at = `/${[...walk.done, part].join('/')}`;\n let target: string | undefined;\n try {\n target = (await fs.lstat(at)).isSymbolicLink ? await fs.readlink(at) : undefined;\n } catch {\n return rest(walk, part);\n }\n if (target === undefined) walk.done.push(part);\n else if (!follow(walk, target)) return lexical(path);\n }\n return `/${walk.done.join('/')}`;\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_CLOCK_OFFSET = SAB_HEADER_I32 * 4;\nexport const SAB_CLOCK_I64 = 3;\nexport const SAB_HEADER_BYTES = SAB_CLOCK_OFFSET + SAB_CLOCK_I64 * 8;\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_I_MEMORY = 10;\n\nexport const SAB_I_TOTAL_HI = 11;\n\nexport const SAB_I_OFFSET_HI = 12;\n\nexport const SAB_I_KILLED = 13;\n\nexport const SAB_I_ASYNC = 14;\n\nexport const SAB_I_STOP = 15;\n\nconst U32 = 2 ** 32;\n\nexport function storeU53(header: Int32Array, lo: number, hi: number, value: number): void {\n Atomics.store(header, hi, Math.floor(value / U32));\n Atomics.store(header, lo, (value % U32) | 0);\n}\n\nexport function loadU53(header: Int32Array, lo: number, hi: number): number {\n return (Atomics.load(header, lo) >>> 0) + Atomics.load(header, hi) * U32;\n}\n\nexport function publishMemory(sab: SharedArrayBuffer, bytes: number): void {\n if (bytes > 0)\n Atomics.store(new Int32Array(sab, 0, SAB_HEADER_I32), SAB_I_MEMORY, Math.ceil(bytes / 65536));\n}\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]+$|^EAI_[A-Z]+$/.test(parsed.errno)\n ? parsed.errno\n : '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 { SAB_CLOCK_I64, SAB_CLOCK_OFFSET } from '../realm/sync-sab-wire.ts';\n\nexport const IDLE_OPS: ReadonlySet<string> = new Set([\n 'fd-select',\n 'proc-wait',\n 'proc-exec',\n 'sig-pause',\n 'sock-accept',\n 'sock-connect',\n]);\n\nexport const SYS_CAP_US = 20_000;\n\nconst LOCAL = SAB_CLOCK_OFFSET;\nconst BLOCKED = 0;\nconst IDLE = 1;\n\nexport function epochMicros(): number {\n return Math.floor((performance.timeOrigin + performance.now()) * 1000);\n}\n\nfunction slots(sab: SharedArrayBuffer): BigInt64Array {\n return new BigInt64Array(sab, LOCAL, SAB_CLOCK_I64);\n}\n\nlet local: BigInt64Array | undefined;\nlet localSab: SharedArrayBuffer | undefined;\nlet localStart = 0;\n\nexport const rawWait: (\n typed: Int32Array,\n index: number,\n value: number,\n timeout?: number\n) => 'ok' | 'not-equal' | 'timed-out' = Atomics.wait.bind(Atomics);\n\nexport function useLocalClock(sab: SharedArrayBuffer | undefined): void {\n local = sab && sab.byteLength >= LOCAL + SAB_CLOCK_I64 * 8 ? slots(sab) : undefined;\n if (!local) return;\n localSab = sab;\n localStart = epochMicros();\n const wait = (typed: Int32Array, index: number, value: number, timeout?: number) =>\n localWait(() => rawWait(typed, index, value, timeout));\n (Atomics as unknown as { wait: typeof wait }).wait = wait;\n}\n\nexport function localWait<T>(wait: () => T): T {\n const clock = local;\n if (!clock) return wait();\n const start = BigInt(epochMicros());\n const idle = Atomics.load(clock, IDLE);\n Atomics.store(clock, IDLE, idle - start);\n try {\n return wait();\n } finally {\n const end = BigInt(epochMicros());\n Atomics.store(clock, IDLE, idle + (end > start ? end - start : 0n));\n }\n}\n\nexport function localCpuNanos(): bigint | undefined {\n if (!local || !localSab) return undefined;\n const now = epochMicros();\n const blocked = Number(Atomics.load(local, BLOCKED)) + localIdle(localSab, now).idle;\n return BigInt(Math.max(0, now - localStart - blocked)) * 1000n;\n}\n\nexport function localIdle(sab: SharedArrayBuffer, now: number): { idle: number; waiting: boolean } {\n const state = Number(Atomics.load(slots(sab), IDLE));\n if (state >= 0) return { idle: state, waiting: false };\n return { idle: Math.max(0, now + state), waiting: true };\n}\n\nexport interface CpuTimes {\n utime: number;\n stime: number;\n}\n\nexport class CpuClock {\n private readonly start: number;\n private sys = 0;\n private idle = 0;\n private since = 0;\n private kind: 'sys' | 'idle' = 'sys';\n private stopped = false;\n private last: CpuTimes = { utime: 0, stime: 0 };\n private readonly sab: SharedArrayBuffer;\n private readonly now: () => number;\n\n constructor(sab: SharedArrayBuffer, now: () => number = epochMicros) {\n this.sab = sab;\n this.now = now;\n this.start = now();\n }\n\n enter(op: string): void {\n this.since = this.now();\n this.kind = this.stopped || IDLE_OPS.has(op) ? 'idle' : 'sys';\n }\n\n leave(): void {\n if (this.since === 0) return;\n this.add((this.frozen ?? this.now()) - this.since);\n this.since = 0;\n }\n\n stop(stopped: boolean): void {\n if (stopped === this.stopped) return;\n this.stopped = stopped;\n if (this.since === 0 || !stopped || this.frozen !== undefined) return;\n const now = this.now();\n this.add(now - this.since);\n this.since = now;\n this.kind = 'idle';\n }\n\n private frozen: number | undefined;\n\n freeze(): void {\n this.frozen ??= this.now();\n }\n\n running(): boolean {\n if (this.frozen !== undefined) return false;\n const now = this.now();\n const busy = this.since === 0 || (this.kind === 'sys' && now - this.since < SYS_CAP_US);\n return busy && !localIdle(this.sab, now).waiting;\n }\n\n times(): CpuTimes {\n const now = this.frozen ?? this.now();\n const open = this.since === 0 ? 0 : Math.max(0, now - this.since);\n const busy = this.kind === 'sys' ? Math.min(open, SYS_CAP_US) : 0;\n const sys = this.sys + busy;\n const idle = this.idle + (open - busy) + localIdle(this.sab, now).idle;\n const user = Math.max(0, now - this.start - sys - idle);\n this.last = {\n utime: Math.max(this.last.utime, Math.floor(user / 1000)),\n stime: Math.max(this.last.stime, Math.floor(sys / 1000)),\n };\n return this.last;\n }\n\n private add(micros: number): void {\n const spent = Math.max(0, micros);\n const busy = this.kind === 'sys' ? Math.min(spent, SYS_CAP_US) : 0;\n this.sys += busy;\n this.idle += spent - busy;\n Atomics.store(slots(this.sab), BLOCKED, BigInt(this.idle));\n }\n}\n\nexport class ProcessClocks {\n private readonly main: CpuClock;\n private readonly threads = new Map<number, CpuClock>();\n private readonly ended: CpuTimes = { utime: 0, stime: 0 };\n private readonly enabled: boolean;\n\n constructor(\n sab: SharedArrayBuffer,\n enabled = true,\n states?: { onState(listener: (state: string) => void): void }\n ) {\n this.main = new CpuClock(sab);\n this.enabled = enabled;\n states?.onState((state) => this.stop(state === 'stopped'));\n }\n\n thread(tid: number, sab: SharedArrayBuffer): CpuClock {\n const clock = new CpuClock(sab);\n this.threads.set(tid, clock);\n return clock;\n }\n\n threadEnded(tid: number): void {\n const spent = this.threads.get(tid)?.times();\n this.threads.delete(tid);\n if (!spent) return;\n this.ended.utime += spent.utime;\n this.ended.stime += spent.stime;\n }\n\n stop(stopped: boolean): void {\n for (const c of this.all()) c.stop(stopped);\n }\n\n freeze(): void {\n for (const c of this.all()) c.freeze();\n }\n\n times(): CpuTimes | undefined {\n if (!this.enabled) return undefined;\n const sum = { ...this.ended };\n for (const c of this.all()) {\n const t = c.times();\n sum.utime += t.utime;\n sum.stime += t.stime;\n }\n return sum;\n }\n\n running(): number {\n return this.enabled ? this.all().filter((c) => c.running()).length : 0;\n }\n\n timed<R extends { op: string }, T>(\n clock: CpuClock | undefined,\n dispatch: (req: R) => Promise<T>\n ) {\n const c = clock ?? this.main;\n return (req: R): Promise<T> => {\n c.enter(req.op);\n return dispatch(req).finally(() => c.leave());\n };\n }\n\n private all(): CpuClock[] {\n return [this.main, ...this.threads.values()];\n }\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 nlink?: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n linkable?: boolean;\n version?: string;\n uid?: number;\n gid?: number;\n}\n\nexport type UsersMode = 'off' | 'report' | 'enforce';\n\nexport const DEFAULT_USERS: UsersMode = 'enforce';\n\nexport interface Owner {\n uid: number;\n gid: number;\n}\n\nexport interface Perm {\n uid: number;\n gid: number;\n mode?: number;\n link?: string;\n}\n\nexport interface NewOwner extends Owner {\n mode?: number;\n parents?: number;\n}\n\nexport interface OwnerChange {\n uid?: number;\n gid?: number;\n follow?: boolean;\n kind?: 'chown' | 'adopt' | 'new';\n mode?: number;\n}\n\nexport interface HeldEntry {\n writeFile: KernelFs['writeFile'];\n direct: boolean;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n exclusive?<T>(path: string, run: (held: HeldEntry) => Promise<T>, follow?: boolean): Promise<T>;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string, owner?: NewOwner): 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; owner?: NewOwner }): Promise<void>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n link(from: string, to: string, follow?: boolean): Promise<void>;\n links?(path: string): boolean;\n symlink(target: string, path: string, owner?: NewOwner): Promise<void>;\n readlink(path: string): Promise<string>;\n realpath?(path: string, follow: boolean): Promise<string>;\n createExclusive?(path: string, owner?: NewOwner): Promise<void>;\n chown?(path: string, change: OwnerChange): Promise<void>;\n trackOwners?(): void;\n ancestry?(path: string): Promise<Array<Perm | undefined>>;\n hasOwner?(path: string): Promise<boolean>;\n chmod(path: string, mode: number): Promise<void>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n lutimes?(path: string, atime: Date, mtime: Date): Promise<void>;\n pread?(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate?(path: string, size: number): Promise<void>;\n protect?(prefixes: readonly string[]): void;\n unguarded?(): KernelFs;\n mayChange?(path: string, follow: boolean): Promise<void>;\n}\n\nexport type RangedOps = Required<Pick<KernelFs, 'pread' | 'pwrite' | 'truncate'>>;\n\nexport function rangedOps(fs: Partial<RangedOps>): RangedOps | undefined {\n const { pread, pwrite, truncate } = fs;\n if (!pread || !pwrite || !truncate) return undefined;\n return { pread: pread.bind(fs), pwrite: pwrite.bind(fs), truncate: truncate.bind(fs) };\n}\n\nexport async function lutimesOf(\n fs: KernelFs,\n path: string,\n atime: Date,\n mtime: Date\n): Promise<void> {\n if (fs.lutimes) return fs.lutimes(path, atime, mtime);\n if ((await fs.lstat(path)).isSymbolicLink) throw fsError('EOPNOTSUPP', path);\n return fs.utimes(path, atime, mtime);\n}\n\nexport function mayLink(fs: { links?(path: string): boolean }, path: string): boolean {\n return fs.links?.(path) ?? true;\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 { fsError } from '../fs/types.ts';\n\nexport interface Cred {\n ruid: number;\n euid: number;\n suid: number;\n rgid: number;\n egid: number;\n sgid: number;\n groups: number[];\n}\n\nexport type CredChange = Partial<Cred>;\n\nexport const ROOT: Readonly<Cred> = Object.freeze({\n ruid: 0,\n euid: 0,\n suid: 0,\n rgid: 0,\n egid: 0,\n sgid: 0,\n groups: [0],\n});\n\nconst MAX_ID = 0xfffffffe;\nexport const MAX_GROUPS = 65536;\nconst UIDS = ['ruid', 'euid', 'suid'] as const;\nconst GIDS = ['rgid', 'egid', 'sgid'] as const;\n\nexport function userCred(uid: number, gid: number, groups: number[] = [gid]): Cred {\n return { ruid: uid, euid: uid, suid: uid, rgid: gid, egid: gid, sgid: gid, groups: [...groups] };\n}\n\nexport function copyCred(cred: Readonly<Cred>): Cred {\n return { ...cred, groups: [...cred.groups] };\n}\n\nfunction id(value: unknown): number | undefined {\n if (value === undefined || value === -1 || value === 0xffffffff) return undefined;\n if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > MAX_ID) {\n throw fsError('EINVAL', `not a user or group id: ${String(value)}`);\n }\n return value as number;\n}\n\nexport function changeCred(cur: Readonly<Cred>, change: CredChange): Cred {\n const privileged = cur.euid === 0;\n const next = copyCred(cur);\n for (const keys of [UIDS, GIDS]) {\n const own = keys.map((key) => cur[key]);\n for (const key of keys) {\n const value = id(change[key]);\n if (value === undefined) continue;\n if (!privileged && !own.includes(value)) throw fsError('EPERM', `${key} ${value}`);\n next[key] = value;\n }\n }\n if (change.groups !== undefined) {\n if (!Array.isArray(change.groups) || change.groups.length > MAX_GROUPS) {\n throw fsError('EINVAL', 'not a group list');\n }\n const groups = change.groups.map((g) => id(g) ?? Number.NaN);\n if (groups.some(Number.isNaN)) throw fsError('EINVAL', 'not a group list');\n if (!privileged) throw fsError('EPERM', 'setgroups');\n next.groups = groups;\n }\n return next;\n}\n\nexport function maySignal(sender: Readonly<Cred>, target: Readonly<Cred>): boolean {\n if (sender.euid === 0) return true;\n return [sender.ruid, sender.euid].some((uid) => uid === target.ruid || uid === target.suid);\n}\n\nexport function maySee(viewer: Readonly<Cred>, target: Readonly<Cred>): boolean {\n return viewer.euid === 0 || target.ruid === viewer.euid || target.euid === viewer.euid;\n}\n", "export const PIPE_CAPACITY = 64 * 1024;\n\nexport class PipeError extends Error {\n readonly code: 'EPIPE' | 'EINTR';\n\n constructor(code: 'EPIPE' | 'EINTR') {\n super(code);\n this.code = code;\n }\n}\n\nexport class KernelPipe {\n private chunks: Uint8Array[] = [];\n private size = 0;\n private readers = 0;\n private writers = 0;\n private waiters: Array<() => void> = [];\n\n readonly capacity: number;\n\n constructor(capacity: number = PIPE_CAPACITY) {\n this.capacity = capacity;\n }\n\n get buffered(): number {\n return this.size;\n }\n\n get readReady(): boolean {\n return this.size > 0 || this.writers === 0;\n }\n\n get writeReady(): boolean {\n return this.size < this.capacity || this.readers === 0;\n }\n\n get writersGone(): boolean {\n return this.writers === 0;\n }\n\n get readersGone(): boolean {\n return this.readers === 0;\n }\n\n openRead(): void {\n this.readers += 1;\n }\n\n openWrite(): void {\n this.writers += 1;\n }\n\n closeRead(): void {\n if (this.readers > 0) this.readers -= 1;\n if (this.readers === 0) {\n this.chunks = [];\n this.size = 0;\n }\n this.wake();\n }\n\n closeWrite(): void {\n if (this.writers > 0) this.writers -= 1;\n this.wake();\n }\n\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = this.take(Math.min(max, this.size));\n this.wake();\n return out;\n }\n\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = new Uint8Array(Math.min(max, this.size));\n let filled = 0;\n for (const chunk of this.chunks) {\n if (filled === out.length) break;\n const count = Math.min(chunk.length, out.length - filled);\n out.set(chunk.subarray(0, count), filled);\n filled += count;\n }\n return out;\n }\n\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n let offset = 0;\n while (offset < bytes.length) {\n if (this.readers === 0) throw new PipeError('EPIPE');\n const room = this.capacity - this.size;\n if (room === 0) {\n try {\n await this.changed(signal);\n } catch (e) {\n if (offset > 0) return offset;\n throw e;\n }\n continue;\n }\n const n = Math.min(room, bytes.length - offset);\n this.chunks.push(bytes.slice(offset, offset + n));\n this.size += n;\n offset += n;\n this.wake();\n }\n return bytes.length;\n }\n\n private take(n: number): Uint8Array {\n const out = new Uint8Array(n);\n let filled = 0;\n while (filled < n) {\n const head = this.chunks[0];\n const count = Math.min(head.length, n - filled);\n out.set(head.subarray(0, count), filled);\n filled += count;\n if (count === head.length) this.chunks.shift();\n else this.chunks[0] = head.subarray(count);\n }\n this.size -= n;\n return out;\n }\n\n changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new PipeError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new PipeError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import type { ClipboardChannel } from './clipboard.ts';\nimport { KernelPipe, type PipeError } from './pipe.ts';\nimport type { PtyPair } from './pty.ts';\nimport type { SealedChannel } from './sealed.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport type KernelErrno =\n | 'EBADF'\n | 'EPIPE'\n | 'EMFILE'\n | 'EINVAL'\n | 'ENOENT'\n | 'ENOTDIR'\n | 'ENOEXEC'\n | 'ECHILD'\n | 'ENOSYS'\n | 'ESPIPE'\n | 'ENOSPC'\n | 'EINTR'\n | 'ESRCH'\n | 'ENOTTY'\n | 'ENXIO'\n | 'EPERM'\n | 'EIO'\n | 'EACCES'\n | 'EAGAIN'\n | 'ENOTSOCK'\n | 'EAFNOSUPPORT'\n | 'EPROTONOSUPPORT'\n | 'EOPNOTSUPP'\n | 'EADDRINUSE'\n | 'EADDRNOTAVAIL'\n | 'ENETUNREACH'\n | 'ECONNREFUSED'\n | 'EINPROGRESS'\n | 'EISCONN'\n | 'ENOTCONN'\n | 'EROFS'\n | 'EFBIG'\n | 'EALREADY'\n | 'ETIMEDOUT'\n | 'ECONNABORTED'\n | 'EHOSTUNREACH'\n | 'ECONNRESET'\n | 'EMSGSIZE'\n | 'ENOTSUP'\n | 'EILSEQ';\n\nexport class KernelError extends Error {\n readonly code: KernelErrno;\n\n readonly detail?: string;\n\n constructor(code: KernelErrno, detail?: string) {\n super(code);\n this.code = code;\n if (detail !== undefined) this.detail = detail;\n }\n}\n\nexport interface PollState {\n readable: boolean;\n\n writable: boolean;\n\n hangup: boolean;\n}\n\nexport interface KernelFile {\n read?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n peek?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n write?(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;\n\n close(): void | Promise<void>;\n\n poll?(): PollState;\n\n changed?(signal?: AbortSignal): Promise<void>;\n\n seek?(offset: number, whence: number): Promise<number>;\n\n flush?(): Promise<void>;\n\n pread?(max: number, at: number): Promise<Uint8Array>;\n pwrite?(bytes: Uint8Array, at: number): Promise<number>;\n\n resize?(size: number): Promise<void>;\n\n stat?(): Promise<{ path: string; size: number; orphan?: true }>;\n\n known?(): number | undefined;\n\n tty?: KernelTty;\n\n pty?: PtyPair;\n\n sealed?: SealedChannel;\n\n clipboard?: ClipboardChannel;\n\n stat?(): Promise<{ size: number; path: string; orphan?: true }>;\n held?: true;\n\n heldMeta?: HeldMeta;\n}\n\nexport type HeldMeta = { dir: string; preopen?: string; twin?: number } | DeviceMeta;\n\nexport interface DeviceMeta {\n device: KernelDevice;\n access?: DeviceAccess;\n}\n\nexport type DeviceAccess = 'read' | 'write';\n\nexport type KernelDevice = 'null' | 'zero' | 'full' | 'urandom';\n\nexport function pollFile(file: KernelFile): PollState {\n return file.poll?.() ?? { readable: !!file.read, writable: !!file.write, hangup: false };\n}\n\nexport class OpenFile {\n private refs = 1;\n\n readonly file: KernelFile;\n\n constructor(file: KernelFile) {\n this.file = file;\n }\n\n retain(): this {\n this.refs += 1;\n return this;\n }\n\n release(): void | Promise<void> {\n this.refs -= 1;\n if (this.refs === 0) return this.file.close();\n }\n}\n\nexport function openPipe(capacity?: number): { read: OpenFile; write: OpenFile } {\n const pipe = new KernelPipe(capacity);\n pipe.openRead();\n pipe.openWrite();\n return {\n read: new OpenFile({\n read: async (max, signal) => {\n try {\n return await pipe.read(max, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeRead(),\n poll: () => ({ readable: pipe.readReady, writable: false, hangup: pipe.writersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n write: new OpenFile({\n write: async (bytes, signal) => {\n try {\n return await pipe.write(bytes, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeWrite(),\n poll: () => ({ readable: false, writable: pipe.writeReady, hangup: pipe.readersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n };\n}\n\nexport function bytesSource(data: Uint8Array): OpenFile {\n let offset = 0;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n close: () => {},\n });\n}\n\nexport function memoryFile(data: Uint8Array, path: string, position = 0): OpenFile {\n let offset = position;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n pread: async (max, at) => data.subarray(at, at + max),\n seek: async (by, whence) => {\n const at = (whence === 1 ? offset : whence === 2 ? data.length : 0) + by;\n if (at < 0) throw new KernelError('EINVAL');\n offset = at;\n return at;\n },\n pwrite: async () => {\n throw new KernelError('EBADF');\n },\n resize: async () => {\n throw new KernelError('EBADF');\n },\n stat: async () => ({ path, size: data.length }),\n close: () => {},\n });\n}\n\nexport function sinkFile(onData: (bytes: Uint8Array) => void): OpenFile {\n return new OpenFile({\n write: async (bytes) => {\n onData(bytes.slice());\n return bytes.length;\n },\n close: () => {},\n });\n}\n\nexport function nullFile(): OpenFile {\n return new OpenFile({\n read: async () => new Uint8Array(0),\n write: async (bytes) => bytes.length,\n close: () => {},\n });\n}\n\nfunction written(device: KernelDevice, bytes: Uint8Array): number {\n if (device === 'full' && bytes.length > 0) throw new KernelError('ENOSPC');\n return bytes.length;\n}\n\nconst DEVICE_PATHS: ReadonlyMap<string, KernelDevice> = new Map([\n ['/dev/null', 'null'],\n ['/dev/zero', 'zero'],\n ['/dev/full', 'full'],\n ['/dev/urandom', 'urandom'],\n ['/dev/random', 'urandom'],\n]);\n\nexport function deviceAt(path: string): KernelDevice | undefined {\n return DEVICE_PATHS.get(path);\n}\n\nexport function deviceFile(device: KernelDevice, access?: DeviceAccess): OpenFile {\n const read = async (max: number): Promise<Uint8Array> => {\n if (device === 'null') return new Uint8Array(0);\n const out = new Uint8Array(max);\n if (device === 'urandom') {\n for (let at = 0; at < max; at += 65536) {\n crypto.getRandomValues(out.subarray(at, Math.min(max, at + 65536)));\n }\n }\n return out;\n };\n return new OpenFile({\n ...(access !== 'write' ? { read } : {}),\n ...(access !== 'read' ? { write: async (bytes: Uint8Array) => written(device, bytes) } : {}),\n seek: async () => 0,\n heldMeta: { device, ...(access ? { access } : {}) },\n close: () => {},\n });\n}\n\nexport function heldFile(meta?: HeldMeta): OpenFile {\n return new OpenFile({ held: true, ...(meta ? { heldMeta: meta } : {}), close: () => {} });\n}\n\nexport type KernelFdKind =\n | 'tty'\n | 'stream'\n | 'file'\n | 'socket'\n | 'held'\n | 'device'\n | 'sealed'\n | 'clipboard';\n\nexport function kernelFdKind(file: KernelFile): Exclude<KernelFdKind, 'socket'> {\n if (file.held) return 'held';\n if (file.heldMeta && 'device' in file.heldMeta) return 'device';\n if (file.tty) return 'tty';\n if (file.sealed) return 'sealed';\n if (file.clipboard) return 'clipboard';\n return file.seek ? 'file' : 'stream';\n}\n\nexport class FdTable {\n static readonly MAX_FDS = 1024;\n private fds = new Map<number, OpenFile>();\n private readonly cloexec = new Set<number>();\n\n private readonly status = new Map<number, number>();\n\n get(fd: number): OpenFile {\n const file = this.fds.get(fd);\n if (!file) throw new KernelError('EBADF');\n return file;\n }\n\n stdioTerminal(): KernelTty | undefined {\n for (const fd of [0, 1, 2]) {\n const tty = this.fds.get(fd)?.file.tty;\n if (tty) return tty;\n }\n return undefined;\n }\n\n numbers(): number[] {\n return [...this.fds.keys()].sort((a, b) => a - b);\n }\n\n has(fd: number): boolean {\n return this.fds.has(fd);\n }\n\n setCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.add(fd);\n }\n\n clearCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.delete(fd);\n }\n\n closesOnExec(fd: number): boolean {\n return this.cloexec.has(fd);\n }\n\n setStatusFlags(fd: number, flags: number): void {\n this.get(fd);\n this.status.set(fd, flags);\n }\n\n statusFlags(fd: number): number | undefined {\n return this.status.get(fd);\n }\n\n install(file: OpenFile, min = 0): number {\n for (let fd = min; fd < FdTable.MAX_FDS; fd++) {\n if (!this.fds.has(fd)) {\n this.fds.set(fd, file);\n return fd;\n }\n }\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EMFILE');\n }\n\n installAt(fd: number, file: OpenFile): void {\n if (fd < 0 || fd >= FdTable.MAX_FDS) {\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EBADF');\n }\n const previous = this.fds.get(fd);\n this.fds.set(fd, file);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n void Promise.resolve(previous?.release()).catch(() => undefined);\n }\n\n dup(fd: number, min = 0): number {\n return this.install(this.get(fd).retain(), min);\n }\n\n dup2(oldFd: number, newFd: number): number {\n const file = this.get(oldFd);\n if (oldFd !== newFd) this.installAt(newFd, file.retain());\n return newFd;\n }\n\n close(fd: number): void | Promise<void> {\n const file = this.get(fd);\n this.fds.delete(fd);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n return file.release();\n }\n\n fork(): FdTable {\n const child = new FdTable();\n for (const [fd, file] of this.fds) child.fds.set(fd, file.retain());\n for (const fd of this.cloexec) child.cloexec.add(fd);\n for (const [fd, flags] of this.status) child.status.set(fd, flags);\n return child;\n }\n\n async closeAll(): Promise<void> {\n const files = [...this.fds.values()];\n this.fds.clear();\n this.cloexec.clear();\n this.status.clear();\n await Promise.allSettled(files.map((file) => Promise.resolve().then(() => file.release())));\n }\n}\n", "export const SYNC_FS_OPS = [\n 'read',\n 'write',\n 'exists',\n 'stat',\n 'lstat',\n 'readdir',\n 'readdir-stat',\n 'mkdir',\n 'rm',\n 'rename',\n 'link',\n 'unlink',\n 'rmdir',\n 'symlink',\n 'readlink',\n 'chmod',\n 'utimes',\n 'lutimes',\n 'statfs',\n 'hold',\n 'create',\n 'kept',\n 'pread',\n 'pwrite',\n 'truncate',\n 'chown',\n 'lchown',\n 'access',\n] as const;\n\nexport type AccessKind = 'open' | 'access' | 'eaccess';\n\nexport const HOLD_READ = 4;\nexport const HOLD_WRITE = 8;\nexport const HOLD_CREATED = 16;\n\nexport type SyncFsOp = (typeof SYNC_FS_OPS)[number];\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 offset?: number;\n length?: number;\n version?: string;\n handle?: number;\n uid?: number;\n gid?: number;\n exclusive?: boolean;\n identity?: boolean;\n now?: boolean;\n nofollow?: boolean;\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 nlink?: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n linkable?: boolean;\n version?: string;\n uid?: number;\n gid?: number;\n}\n\nexport interface SyncFsUsage {\n quota: number;\n usage: number;\n}\n\nexport function parseSyncFsUsage(json: unknown): SyncFsUsage | null {\n const u = json as Partial<SyncFsUsage> | null;\n if (!u || typeof u.quota !== 'number' || typeof u.usage !== 'number') return null;\n return { quota: u.quota, usage: u.usage };\n}\n\nexport type SyncFsFileIo = Pick<\n SyncFsPosixBridge,\n 'readFile' | 'writeFile' | 'pread' | 'pwrite' | 'truncate'\n>;\n\nexport interface SyncFsPosixBridge {\n pinned?(handle: number): SyncFsFileIo;\n kept?(handle: number): boolean;\n keptStat?(handle: number): SyncFsBridgeStat;\n readFile(path: string): Uint8Array;\n writeFile(path: string, bytes: Uint8Array, open?: boolean): 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, mode?: number): void;\n rm(path: string): void;\n rename(from: string, to: string): void;\n link(from: string, to: string, follow?: boolean): 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, now?: boolean): void;\n lutimes(path: string, atimeMs: number, mtimeMs: number, now?: boolean): void;\n hold?(\n path: string,\n held: boolean,\n open?: boolean,\n handle?: number,\n want?: number\n ): number | undefined;\n access?(path: string, mode: number, kind?: AccessKind, nofollow?: boolean): void;\n create?(path: string, mode?: number): void;\n chown?(path: string, uid: number | undefined, gid: number | undefined, follow?: boolean): void;\n owners?: boolean;\n readdirStat(path: string): Array<[string, SyncFsBridgeStat | null]>;\n statfs?(path?: string): SyncFsUsage | null;\n pread?(path: string, offset: number, length: number, version?: string): Uint8Array;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): void;\n truncate?(path: string, size: number): void;\n identify?(): void;\n identified?(): 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 ...(typeof s.nlink === 'number' ? { nlink: s.nlink } : {}),\n ...(typeof s.dev === 'number' ? { dev: s.dev } : {}),\n ...(s.readonly === true ? { readonly: true } : {}),\n ...(typeof s.maxFile === 'number' ? { maxFile: s.maxFile } : {}),\n ...(s.ranged === true ? { ranged: true } : {}),\n ...(s.linkable === true ? { linkable: true } : {}),\n ...(typeof s.version === 'string' ? { version: s.version } : {}),\n ...(typeof s.uid === 'number' ? { uid: s.uid } : {}),\n ...(typeof s.gid === 'number' ? { gid: s.gid } : {}),\n };\n}\n", "import {\n type DeviceAccess,\n type DeviceMeta,\n deviceAt,\n type HeldMeta,\n type KernelFdKind,\n} from '../../kernel/fd-table.ts';\nimport type { FdInfo, WasmSyscall } from '../../kernel/process.ts';\nimport {\n HOLD_CREATED,\n HOLD_READ,\n HOLD_WRITE,\n type SyncFsBridgeStat,\n type SyncFsPosixBridge,\n} 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 physical,\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' | 'full' | '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; twin?: number }\n | { fd: number; type: 'device'; device: Device; access?: DeviceAccess };\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 const SEALED_PATH = '/dev/sealed';\nexport const CLIPBOARD_PATH = '/dev/clipboard';\n\nexport function deviceOf(path: string): Device | undefined {\n return deviceAt(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 reported = new WeakSet<FileBuffer>();\n\n private readonly byId = new Map<string, FileBuffer>();\n\n private readonly ids = new Map<FileBuffer, string>();\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 root = false\n ): void {\n for (const fd of [0, 1, 2]) this.table.set(fd, this.stdioEntry(fd));\n const preopens = this.preopens(cwd, root);\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, root: boolean): WasiEntry[] {\n const here = normalize(cwd);\n const dot: Extract<WasiEntry, { type: 'dir' }> = { type: 'dir', path: here, preopen: '.' };\n const out: WasiEntry[] = [dot];\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 if (root) {\n out.push(\n { type: 'dir', path: '/', preopen: '/' },\n { type: 'dir', path: here, preopen: './' }\n );\n dot.twin = 3 + out.length - 1;\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.fs as { threaded?(): void }).threaded?.();\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 stdioEntry(fd: number): WasiEntry {\n let info: FdInfo;\n try {\n info = this.kernel.call({ op: 'fd-info', fd }) as FdInfo;\n } catch {\n return kernelEntry();\n }\n return info?.meta && 'dir' in info.meta ? { type: 'dir', path: info.meta.dir } : kernelEntry();\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 const moved: Array<[number, Extract<WasiEntry, { type: 'dir' }>]> = [[3, dot]];\n const twin = dot.twin === undefined ? undefined : this.find(dot.twin);\n if (twin?.type === 'dir' && twin.preopen === './') moved.push([dot.twin as number, twin]);\n for (const [fd, e] of moved) {\n e.path = path;\n this.kernel.call({ op: 'fd-meta', fd, meta: metaOf(e) as HeldMeta });\n }\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, {\n type: 'kernel',\n kind: 'file',\n nonblock: false,\n append: e.file.append,\n path: e.file.path,\n ino: this.inoOf(e.file.path),\n });\n }\n for (const file of promoted.keys()) {\n if (--file.buffer.opens <= 0) {\n this.forget(file.buffer);\n this.letGo(file.buffer);\n }\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') out.push({ fd, type: 'dir', path: e.path, ...preopenOf(e) });\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, { type: 'dir', path: f.path, ...preopenOf(f) });\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 try {\n this.kernel.sys.close(fd);\n } finally {\n this.release(e);\n this.bump();\n }\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 try {\n buffer.flush();\n } catch (err) {\n this.reported.add(buffer);\n this.drop(buffer);\n throw err;\n }\n this.drop(buffer);\n }\n\n private drop(buffer: FileBuffer): void {\n if (--buffer.opens > 0) return;\n this.forget(buffer);\n this.letGo(buffer);\n }\n\n private forget(buffer: FileBuffer): void {\n for (const [p, b] of [...this.buffers]) if (b === buffer) this.buffers.delete(p);\n const id = this.ids.get(buffer);\n if (id !== undefined && this.byId.get(id) === buffer) this.byId.delete(id);\n this.ids.delete(buffer);\n }\n\n private know(buffer: FileBuffer, id: string): void {\n if (this.ids.has(buffer)) return;\n this.ids.set(buffer, id);\n if (!this.byId.has(id)) this.byId.set(id, buffer);\n }\n\n private identity(st: SyncFsBridgeStat | undefined): string | undefined {\n if (!st || st.ino === undefined || (st.nlink ?? 1) < 2) return undefined;\n return `${st.dev ?? 0}:${st.ino}`;\n }\n\n private sharing(path: string, st: SyncFsBridgeStat | undefined): FileBuffer | undefined {\n if (st?.ino === undefined) return undefined;\n const id = `${st.dev ?? 0}:${st.ino}`;\n if (!this.byId.has(id) && this.identity(st) !== undefined) this.learn();\n const buffer = this.byId.get(id);\n if (!buffer) return undefined;\n this.buffers.set(path, buffer);\n return buffer;\n }\n\n private learn(): void {\n for (const [p, buffer] of this.buffers) {\n if (this.ids.has(buffer) || buffer.isOrphan()) continue;\n const known = this.identity(this.statOrMissing(p));\n if (known !== undefined) this.know(buffer, known);\n }\n }\n\n linked(from: string, to: string): void {\n const buffer = this.buffers.get(from);\n if (!buffer || buffer.isOrphan()) return;\n const id = this.identity(this.statOrMissing(to));\n if (id === undefined) return;\n this.know(buffer, id);\n if (!this.buffers.has(to)) this.buffers.set(to, buffer);\n }\n\n private letGo(buffer: FileBuffer): void {\n this.fs.hold?.(buffer.path, false, true, buffer.handle);\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()) {\n try {\n buffer.flush();\n } catch (err) {\n if (!this.reported.has(buffer)) throw err;\n }\n }\n }\n\n flushEarly(): void {\n for (const buffer of this.buffers.values()) {\n try {\n buffer.flush();\n } catch {}\n }\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 holdsUnder(path: string): boolean {\n for (const p of this.buffers.keys()) if (within(p, path)) return true;\n return false;\n }\n\n unlinking(path: string, linked?: SyncFsBridgeStat): void {\n const buffer = this.buffers.get(path);\n if (buffer && this.survives(buffer, linked)) buffer.flush();\n else buffer?.keep();\n if (this.shared) this.kernel.call({ op: 'fd-path-unlinking', path });\n }\n\n unlinked(path: string, linked?: SyncFsBridgeStat): 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 this.detach(buffer, linked);\n this.buffers.delete(path);\n }\n\n private openedIno(fd: number): number | undefined {\n try {\n return (this.kernel.call({ op: 'fd-vfs-stat', fd, identity: true }) as { ino?: number }).ino;\n } catch (err) {\n this.kernel.sys.close(fd);\n throw err;\n }\n }\n\n private inoOf(path: string): number | undefined {\n try {\n return this.fs.stat(path).ino;\n } catch {\n return undefined;\n }\n }\n\n private survives(buffer: FileBuffer, linked: SyncFsBridgeStat | undefined): boolean {\n return linked !== undefined && buffer.handle !== undefined;\n }\n\n private detach(buffer: FileBuffer, linked: SyncFsBridgeStat | undefined): void {\n if (this.survives(buffer, linked)) {\n const id = this.identity(linked);\n if (id !== undefined) this.know(buffer, id);\n return;\n }\n buffer.orphan();\n this.forget(buffer);\n }\n\n renamed(from: string, to: string, replacedLinked?: SyncFsBridgeStat): void {\n if (from === to) return;\n if (this.shared) this.kernel.call({ op: 'fd-path-renamed', from, to });\n for (const e of this.table.values()) {\n if (e.type === 'kernel' && e.path !== undefined && within(e.path, from)) {\n e.path = to + e.path.slice(from.length);\n }\n }\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 this.detach(buffer, replacedLinked);\n this.buffers.delete(p);\n }\n }\n for (const [p] of moved) this.buffers.delete(p);\n for (const [p, buffer] of moved) {\n const next = to + p.slice(from.length);\n if (buffer.path === p) buffer.path = next;\n this.buffers.set(next, buffer);\n }\n }\n\n resolve(dirfd: number, path: string): string {\n if (path === '') throw new WasiError('ENOENT');\n const joined = path.startsWith('/') ? path : `${this.dir(dirfd).path}/${path}`;\n return joined.split('/').includes('..') ? physical(this.fs, joined) : normalize(joined);\n }\n\n private openKernelDevice(\n path: string,\n oflags: number,\n fdflags: number,\n rights: bigint\n ): number | undefined {\n const { openSealed, openClipboard, openTty } = this.kernel.sys;\n const nonblock = (fdflags & FDFLAGS.NONBLOCK) !== 0;\n let fd: number | undefined;\n let kind: KernelFdKind;\n if (path === SEALED_PATH && openSealed) {\n if (oflags & OFLAGS.DIRECTORY) throw new WasiError('ENOTDIR');\n if (oflags & OFLAGS.CREAT && oflags & OFLAGS.EXCL) throw new WasiError('EEXIST');\n fd = openSealed.call(this.kernel.sys);\n kind = 'sealed';\n } else if (path === CLIPBOARD_PATH && openClipboard) {\n fd = this.openClipboard(openClipboard, oflags, rights);\n kind = 'clipboard';\n } else if (path === '/dev/tty' || /^\\/dev\\/tty\\d+$/.test(path)) {\n fd = openTty?.call(this.kernel.sys, path === '/dev/tty' ? undefined : path);\n if (fd === undefined) throw new WasiError('ENXIO');\n kind = 'tty';\n } else return undefined;\n this.adopt(fd, kind, nonblock);\n this.bump();\n return fd;\n }\n\n private openClipboard(\n openClipboard: (flags: number) => number,\n oflags: number,\n rights: bigint\n ): number {\n if (oflags & OFLAGS.DIRECTORY) throw new WasiError('ENOTDIR');\n if (oflags & OFLAGS.CREAT && oflags & OFLAGS.EXCL) throw new WasiError('EEXIST');\n const want = wantOf(oflags, rights);\n const flags = want === 6 ? O_RDWR : want === 2 ? O_WRONLY : 0;\n return openClipboard.call(this.kernel.sys, flags);\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 const kernelDevice = this.openKernelDevice(path, oflags, fdflags, rights);\n if (kernelDevice !== undefined) return kernelDevice;\n const alias = stdioAlias(path);\n if (alias !== undefined) return this.reopen(alias);\n const exclusive = (oflags & OFLAGS.CREAT) !== 0 && (oflags & OFLAGS.EXCL) !== 0;\n if (exclusive && this.isLink(path)) throw new WasiError('EEXIST');\n const s = this.statOrMissing(path);\n if (exclusive && s) throw new WasiError('EEXIST');\n if (oflags & OFLAGS.DIRECTORY && !s?.isDirectory) {\n throw new WasiError(s ? 'ENOTDIR' : 'ENOENT');\n }\n if (s?.isDirectory) {\n const asked = (oflags & OFLAGS.DIRECTORY) === 0 && (rights & RIGHTS.FD_WRITE) !== 0n;\n if (asked || (oflags & (OFLAGS.CREAT | OFLAGS.TRUNC)) !== 0) throw new WasiError('EISDIR');\n return this.install({ type: 'dir', path });\n }\n if (!s && !(oflags & OFLAGS.CREAT)) throw new WasiError('ENOENT');\n refuseWrite(s, oflags, rights);\n return this.regular(path, s, oflags, rights, fdflags);\n }\n\n private regular(\n path: string,\n s: SyncFsBridgeStat | undefined,\n oflags: number,\n rights: bigint,\n fdflags: number\n ): number {\n if (this.shared || this.kernelHolds(path, s)) {\n return this.kernelFile(path, s, oflags, rights, fdflags);\n }\n return this.install({ type: 'file', file: this.file(path, s, oflags, rights, fdflags) });\n }\n\n private kernelHolds(path: string, st: SyncFsBridgeStat | undefined): boolean {\n for (const [fd, e] of this.table) {\n if (e.type !== 'kernel' || this.kind(fd, e) !== 'file') continue;\n this.named(fd, e);\n if (e.path === path || (st?.ino !== undefined && e.ino === st.ino)) return true;\n }\n return false;\n }\n\n private readonly learned = new WeakSet<object>();\n\n private named(fd: number, e: { path?: string; ino?: number }): void {\n if (e.path !== undefined || this.learned.has(e)) return;\n this.learned.add(e);\n try {\n const vfs = this.kernel.call({ op: 'fd-vfs-stat', fd, identity: true }) as {\n path?: string;\n orphan?: true;\n ino?: number;\n };\n if (vfs.orphan || vfs.path === undefined) return;\n e.path = vfs.path;\n e.ino = vfs.ino ?? this.inoOf(vfs.path);\n } catch {}\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 { readable, writable } = openAccess(existing, oflags, rights);\n let buffer = this.buffers.get(path);\n if (buffer?.handle !== undefined && this.fs.kept?.(buffer.handle)) {\n this.buffers.delete(path);\n buffer = undefined;\n }\n buffer ??= this.sharing(path, existing);\n const want = wantOf(oflags, rights);\n if (buffer) {\n if (this.fs.owners) this.fs.access?.(path, want, 'open');\n if (oflags & OFLAGS.TRUNC) buffer.truncate(0);\n } else {\n buffer = this.freshBuffer(path, existing, oflags, want);\n }\n buffer.opens++;\n return new LocalFile(buffer, readable, writable, (fdflags & FDFLAGS.APPEND) !== 0);\n }\n\n private freshBuffer(\n path: string,\n existing: SyncFsBridgeStat | undefined,\n oflags: number,\n want: number\n ): FileBuffer {\n const made = !existing && this.createNew(path, oflags);\n const empty = made || (oflags & OFLAGS.TRUNC) !== 0;\n if (existing?.ranged) (this.fs as { invalidate?(): void }).invalidate?.();\n const st = existing?.ranged || !existing ? this.fs.stat(path) : existing;\n const ranged = st.ranged ? st.size : undefined;\n const asked =\n (want & 4 ? HOLD_READ : 0) | (want & 2 ? HOLD_WRITE : 0) | (made ? HOLD_CREATED : 0);\n const handle = this.fs.hold?.(path, true, true, undefined, this.fs.owners ? asked : 0);\n const io = handle !== undefined && this.fs.pinned ? this.fs.pinned(handle) : this.fs;\n const buffer = new FileBuffer(io, path, empty, st.maxFile, ranged, st.version);\n buffer.handle = handle;\n this.buffers.set(path, buffer);\n const id = this.identity(st);\n if (id !== undefined) this.know(buffer, id);\n return buffer;\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 { readable, writable } = openAccess(existing, oflags, rights);\n const append = (fdflags & FDFLAGS.APPEND) !== 0;\n const flags = (writable ? (readable ? O_RDWR : O_WRONLY) : 0) | (append ? O_APPEND : 0);\n\n const made = !existing && this.createNew(path, oflags);\n\n const truncate = made || (oflags & OFLAGS.TRUNC) !== 0;\n const fd = this.kernel.sys.openVfs(path, flags, 0, {\n ...(truncate ? { truncate } : {}),\n ...(made ? { created: true } : {}),\n });\n const ino = writable ? (this.openedIno(fd) ?? this.inoOf(path)) : undefined;\n if (truncate) (this.fs as { touched?(path?: string, ino?: number): void }).touched?.(path, ino);\n this.table.set(fd, { type: 'kernel', kind: 'file', nonblock: false, append, path, ino });\n if (append) this.publishFlags(fd, { nonblock: false, append });\n this.bump();\n return fd;\n }\n\n private createNew(path: string, oflags: number): boolean {\n if (!this.fs.create) {\n this.fs.writeFile(path, new Uint8Array(0));\n return true;\n }\n try {\n this.fs.create(path);\n return true;\n } catch (err) {\n if (oflags & OFLAGS.EXCL || (err as { code?: string }).code !== 'EEXIST') throw err;\n return false;\n }\n }\n\n private isLink(path: string): boolean {\n try {\n return this.fs.lstat(path).isSymbolicLink === true;\n } catch {\n return false;\n }\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 refuseWrite(s: { readonly?: boolean } | undefined, oflags: number, rights: bigint): void {\n const writes = (rights & RIGHTS.FD_WRITE) !== 0n || (oflags & OFLAGS.TRUNC) !== 0;\n if (s?.readonly && writes) throw new WasiError('EROFS');\n}\n\nfunction preopenOf(e: { preopen?: string; twin?: number }): { preopen?: string; twin?: number } {\n return {\n ...(e.preopen ? { preopen: e.preopen } : {}),\n ...(e.twin !== undefined ? { twin: e.twin } : {}),\n };\n}\n\nfunction metaOf(e: WasiEntry): HeldMeta | undefined {\n if (e.type === 'dir') return { dir: e.path, ...preopenOf(e) };\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 { type: 'dir', path: info.meta.dir, ...preopenOf(info.meta) };\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 wantOf(oflags: number, rights: bigint): number {\n const write = (rights & RIGHTS.FD_WRITE) !== 0n || (oflags & OFLAGS.TRUNC) !== 0;\n const read = (rights & RIGHTS.FD_READ) !== 0n || !write;\n return (read ? 4 : 0) | (write ? 2 : 0);\n}\n\nfunction openAccess(\n existing: SyncFsBridgeStat | undefined,\n oflags: number,\n rights: bigint\n): { readable: boolean; writable: boolean } {\n const readonly = existing?.readonly === true;\n const mutating = readonly ? OFLAGS.TRUNC : OFLAGS.CREAT | OFLAGS.TRUNC;\n const writable = (rights & RIGHTS.FD_WRITE) !== 0n || (oflags & mutating) !== 0;\n if (writable && readonly) throw new WasiError('EROFS');\n return { readable: (rights & RIGHTS.FD_READ) !== 0n || !writable, writable };\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() || (f.buffer.handle ?? 0) < 0;\n if (!orphan && f.buffer.isRanged) f.buffer.flush();\n const joins = !orphan && (handed.has(f.buffer) || f.buffer.isRanged);\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 ...(!orphan && f.buffer.pin !== undefined\n ? { pin: { version: f.buffer.pin, size: f.buffer.size() } }\n : {}),\n\n ...(!joins && f.buffer.isDirty() ? { dirty: true } : {}),\n ...(f.buffer.handle !== undefined ? { handle: f.buffer.handle } : {}),\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 const earliest = subs.reduce((min, s) => Math.min(min, s.deadline), Infinity);\n const expired = () => performance.now() >= earliest;\n if (read.length > 0 || write.length > 0 || events.length === 0) {\n do {\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 } while (events.length === 0 && !interrupted && earliest !== Infinity && !expired());\n }\n const after = performance.now();\n\n for (const s of subs) {\n if (s.type === EVENTTYPE.CLOCK && (interrupted || s.deadline <= after)) {\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 { Termios } from '../../kernel/tty.ts';\nimport type { WasiFds, WasiKernel } from './wasi-fds.ts';\nimport { WasiError } from './wasi-files.ts';\nimport type { WasiMemory } from './wasi-memory.ts';\n\nconst NCCS = 32;\nconst C_LINE = 16;\nconst C_CC = 17;\nconst ISPEED = 52;\nconst OSPEED = 56;\nconst B38400 = 0o17;\nconst TCSAFLUSH = 2;\n\nexport function writeTermios(mem: WasiMemory, ptr: number, termios: Termios): void {\n mem.bytes(ptr, OSPEED + 4).fill(0);\n const v = mem.view();\n v.setUint32(ptr, termios.c_iflag, true);\n v.setUint32(ptr + 4, termios.c_oflag, true);\n v.setUint32(ptr + 8, termios.c_cflag, true);\n v.setUint32(ptr + 12, termios.c_lflag, true);\n for (let i = 0; i < NCCS; i++) v.setUint8(ptr + C_CC + i, termios.c_cc[i] ?? 0);\n v.setUint8(ptr + C_LINE, 0);\n v.setUint32(ptr + ISPEED, B38400, true);\n v.setUint32(ptr + OSPEED, B38400, true);\n}\n\nexport function readTermios(mem: WasiMemory, ptr: number): Termios {\n const v = mem.view();\n return {\n c_iflag: v.getUint32(ptr, true),\n c_oflag: v.getUint32(ptr + 4, true),\n c_cflag: v.getUint32(ptr + 8, true),\n c_lflag: v.getUint32(ptr + 12, true),\n c_cc: Array.from({ length: NCCS }, (_, i) => v.getUint8(ptr + C_CC + i)),\n };\n}\n\nexport function sliccTty(\n mem: WasiMemory,\n fds: WasiFds,\n kernel: WasiKernel,\n interrupted: () => void = () => undefined\n) {\n const { sys } = kernel;\n const terminal = (fd: number): number => {\n const e = fds.find(fd);\n if (!e) throw new WasiError('EBADF');\n if (e.type !== 'kernel' || fds.kind(fd, e) !== 'tty') throw new WasiError('ENOTTY');\n return fd;\n };\n const needs = <T>(value: T | undefined): T => {\n if (value === undefined) throw new WasiError('ENOTTY');\n return value;\n };\n const getAttr = (fd: number, ptr: number): void => {\n interrupted();\n writeTermios(mem, ptr, needs(sys.tcgets?.(terminal(fd))));\n };\n const setAttr = (fd: number, actions: number, ptr: number): void => {\n interrupted();\n if (actions < 0 || actions > TCSAFLUSH) throw new WasiError('EINVAL');\n const at = terminal(fd);\n needs(sys.tcsets);\n sys.tcsets?.(at, readTermios(mem, ptr), actions === TCSAFLUSH);\n };\n const size = (fd: number, ptr: number): void => {\n interrupted();\n const [rows, cols] = needs(sys.winsize?.(terminal(fd)));\n mem.bytes(ptr, 8).fill(0);\n const v = mem.view();\n v.setUint16(ptr, rows, true);\n v.setUint16(ptr + 2, cols, true);\n };\n return {\n tcgetattr: (fd: number, ptr: number) => void getAttr(fd, ptr),\n tcsetattr: (fd: number, actions: number, ptr: number) => void setAttr(fd, actions, ptr),\n winsize: (fd: number, ptr: number) => void size(fd, ptr),\n };\n}\n", "import { physicalPath } from '../../fs/physical-path.ts';\nimport { localCpuNanos } from '../../kernel/cpu-clock.ts';\nimport { type Cred, type CredChange, MAX_GROUPS } from '../../kernel/cred.ts';\nimport 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 OFLAGS,\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 {\n CLIPBOARD_PATH,\n deviceOf,\n SEALED_PATH,\n WasiFds,\n type WasiForkFd,\n type WasiKernel,\n} from './wasi-fds.ts';\nimport {\n type DirListing,\n type LocalFile,\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';\nimport type { WasiSignals } from './wasi-signals.ts';\nimport { sliccTty } from './wasi-termios.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 parent?: () => number;\n kernel: WasiKernel;\n\n fs: SyncFsPosixBridge & { invalidate?(): void; touched?(path?: string, ino?: number): 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 preopenRoot?: boolean;\n}\n\nexport type WasiFunction = (...args: never[]) => number | undefined;\n\nconst IDS = ['ruid', 'euid', 'suid', 'rgid', 'egid', 'sgid'] as const;\nconst NS_PER_MS = 1_000_000n;\nconst AT_SYMLINK_NOFOLLOW = 1;\nconst AT_EACCESS = 2;\n\nconst ROOT_IDS = Object.freeze({ uid: 0, gid: 0 });\nconst GONE: ReadonlySet<string> = new Set(['ENOENT', 'ENOTDIR']);\n\nfunction idOf(value: number): number | undefined {\n return value >>> 0 === 0xffffffff ? undefined : value >>> 0;\n}\nconst S_IFIFO = 0o010000;\nconst DEFAULT_UMASK = 0o022;\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 nlink?: bigint;\n mtimeNs: bigint;\n}\n\nfunction linkedOf(st: SyncFsBridgeStat): SyncFsBridgeStat | undefined {\n return (st.nlink ?? 1) > 1 ? st : undefined;\n}\n\nfunction linkedElsewhere(\n fs: Pick<SyncFsPosixBridge, 'lstat'>,\n path: string\n): SyncFsBridgeStat | undefined {\n try {\n return linkedOf(fs.lstat(path));\n } catch {\n return undefined;\n }\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 ...(s.nlink !== undefined ? { nlink: BigInt(s.nlink) } : {}),\n mtimeNs: BigInt(Math.round(s.mtimeMs ?? 0)) * NS_PER_MS,\n };\n}\n\nconst SEALED_MODE = 0o20666;\n\nfunction kernelFiletype(kind: string): { filetype: number; seeks: boolean } {\n switch (kind) {\n case 'tty':\n case 'sealed':\n case 'clipboard':\n return { filetype: FILETYPE.CHARACTER_DEVICE, seeks: false };\n case 'device':\n return { filetype: FILETYPE.CHARACTER_DEVICE, seeks: true };\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 muted: ((fd: number, data: Uint8Array) => boolean) | undefined;\n\n signals: WasiSignals | undefined;\n\n interrupted: (() => boolean) | undefined;\n\n quietly: (fn: () => void) => void = (fn) => fn();\n\n private readonly listening: number[];\n\n readonly o: WasiHostOptions;\n constructor(o: WasiHostOptions) {\n const { kernel } = o;\n const call: WasiKernel['call'] = (req) => {\n if (req.op !== 'fd-promote') this.fds.flushEarly();\n return kernel.call(req);\n };\n const sys = new Proxy(kernel.sys, {\n get: (target, name) => {\n const member = Reflect.get(target, name);\n if (typeof member !== 'function') return member;\n return (...args: unknown[]) => {\n this.fds.flushEarly();\n return member.apply(target, args);\n };\n },\n });\n this.o = { ...o, kernel: { sys, call } };\n this.startCwd = o.cwd;\n this.fds = new WasiFds(this.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 ?? [], o.preopenRoot === true);\n this.listening = o.shared ? [] : this.fds.sockets();\n }\n\n get cwd(): string {\n return this.fds.cwd() ?? this.startCwd;\n }\n\n private created(path: string, mode: number): void {\n const umask = this.o.kernel.call({ op: 'proc-umask' }) as number;\n if (umask !== DEFAULT_UMASK) this.o.fs.chmod(path, mode & ~umask);\n }\n\n sliccTtyImports(): Record<string, WasiFunction> {\n return wrap(sliccTty(this.mem, this.fds, this.o.kernel, () => this.interrupted?.()));\n }\n\n sliccFsImports(): Record<string, WasiFunction> {\n const { mem, fds } = this;\n const at = (dirfd: number, p: number, l: number) => fds.resolve(dirfd, mem.string(p, l));\n const pathOf = (fd: number): string => {\n const e = fds.get(fd);\n if (e.type === 'dir') return e.path;\n if (e.type === 'file') return e.file.path;\n const path =\n e.type === 'kernel' && fds.kind(fd, e) === 'file' ? this.kernelStat(fd).path : undefined;\n if (path === undefined) throw new WasiError('EBADF');\n return path;\n };\n const target = (path: string, flags: number): string => {\n if (flags & AT_SYMLINK_NOFOLLOW && this.o.fs.lstat(path).isSymbolicLink) {\n throw new WasiError('ENOTSUP');\n }\n return path;\n };\n const modeOf = (st: { mode?: number }) => (st.mode ?? 0) & 0o7777;\n const chown = (path: string, uid: number, gid: number, follow: boolean) => {\n const { chown: own } = this.o.fs;\n if (!own) throw new WasiError('ENOSYS');\n own.call(this.o.fs, path, idOf(uid), idOf(gid), follow);\n };\n const caller = (): [number, number] => {\n const cred = this.o.kernel.call({ op: 'proc-cred' }) as Cred;\n return [cred.euid, cred.egid];\n };\n const owner = (st: { uid?: number; gid?: number } | undefined, out: number): void => {\n const [uid, gid] = st?.uid === undefined ? caller() : [st.uid, st.gid as number];\n const view = mem.view();\n view.getUint32(out + 4, true);\n view.setUint32(out, uid, true);\n view.setUint32(out + 4, gid, true);\n };\n const fdOwned = (fd: number): { uid?: number; gid?: number } | undefined => {\n const e = fds.get(fd);\n if (e.type === 'device') return ROOT_IDS;\n const kind = e.type === 'kernel' ? fds.kind(fd, e) : 'file';\n if (kind === 'sealed' || kind === 'clipboard') return ROOT_IDS;\n if (kind !== 'file') return undefined;\n try {\n return this.o.fs.stat(pathOf(fd));\n } catch (err) {\n if (!GONE.has((err as { code?: unknown })?.code as string)) throw err;\n return undefined;\n }\n };\n const pathOwned = (path: string, follow: boolean) => {\n if (this.synthetic(path)) return ROOT_IDS;\n return follow ? this.o.fs.stat(path) : this.o.fs.lstat(path);\n };\n return wrap({\n fd_chown: (fd: number, uid: number, gid: number) => void chown(pathOf(fd), uid, gid, true),\n path_chown: (dirfd: number, p: number, l: number, uid: number, gid: number, flags: number) =>\n void chown(at(dirfd, p, l), uid, gid, (flags & AT_SYMLINK_NOFOLLOW) === 0),\n fd_owner: (fd: number, out: number) => {\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\n owner(fdOwned(fd), out);\n },\n fd_filestat_owner: (fd: number, statOut: number, out: number) => {\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\n this.writeFilestat(statOut, this.fdFilestat(fd));\n owner(fdOwned(fd), out);\n },\n path_filestat_owner: (\n dirfd: number,\n lookup: number,\n p: number,\n l: number,\n statOut: number,\n out: number\n ) => {\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\n const path = at(dirfd, p, l);\n this.writeFilestat(statOut, this.pathFilestat(path, lookup));\n owner(pathOwned(path, (lookup & LOOKUP_SYMLINK_FOLLOW) !== 0), out);\n },\n path_owner: (dirfd: number, p: number, l: number, flags: number, out: number) => {\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\n const path = at(dirfd, p, l);\n owner(pathOwned(path, (flags & AT_SYMLINK_NOFOLLOW) === 0), out);\n },\n path_access: (dirfd: number, p: number, l: number, amode: number, flags: number) => {\n const path = at(dirfd, p, l);\n const nofollow = (flags & AT_SYMLINK_NOFOLLOW) !== 0;\n if (this.synthetic(path)) {\n if (this.o.fs.owners && amode & 1) throw new WasiError('EACCES');\n return;\n }\n const st = pathOwned(path, !nofollow);\n if (amode & 2 && (st as { readonly?: boolean }).readonly) throw new WasiError('EROFS');\n if (!this.o.fs.owners) return;\n const kind = flags & AT_EACCESS ? 'eaccess' : 'access';\n this.o.fs.access?.(path, amode & 7, kind, nofollow);\n },\n fd_chmod: (fd: number, mode: number) => void this.o.fs.chmod(pathOf(fd), mode & 0o7777),\n path_chmod: (dirfd: number, p: number, l: number, mode: number, flags: number) =>\n void this.o.fs.chmod(target(at(dirfd, p, l), flags), mode & 0o7777),\n umask: (mask: number, out: number) => {\n const old = this.o.kernel.call({ op: 'proc-umask', mask }) as number;\n mem.view().setUint32(out, old, true);\n },\n fd_mode: (fd: number, out: number) => {\n const e = fds.get(fd);\n const kind = e.type === 'kernel' ? fds.kind(fd, e) : undefined;\n const mode =\n kind === 'stream'\n ? S_IFIFO | 0o600\n : kind === 'sealed' || kind === 'clipboard'\n ? SEALED_MODE\n : modeOf(this.o.fs.stat(pathOf(fd)));\n mem.view().setUint32(out, mode, true);\n },\n path_mode: (dirfd: number, p: number, l: number, flags: number, out: number) => {\n const path = at(dirfd, p, l);\n if (this.synthetic(path) && deviceOf(path) === undefined)\n return void mem.view().setUint32(out, SEALED_MODE, true);\n const st = flags & AT_SYMLINK_NOFOLLOW ? this.o.fs.lstat(path) : this.o.fs.stat(path);\n mem.view().setUint32(out, modeOf(st), true);\n },\n });\n }\n\n sliccImports(): Record<string, WasiFunction> {\n const { mem } = this;\n const path = (p: number, l: number) => {\n const text = mem.string(p, l);\n return text === '' || text.startsWith('/') ? text : normalize(`${this.cwd}/${text}`);\n };\n return wrap({\n mount: (\n sp: number,\n sl: number,\n tp: number,\n tl: number,\n fp: number,\n fl: number,\n flags: number,\n dp: number,\n dl: number\n ) =>\n void this.o.kernel.call({\n op: 'mount',\n source: mem.string(sp, sl),\n target: path(tp, tl),\n type: mem.string(fp, fl),\n flags,\n data: mem.string(dp, dl),\n }),\n umount2: (tp: number, tl: number, flags: number) =>\n void this.o.kernel.call({ op: 'umount', target: path(tp, tl), flags }),\n cred_get: (out: number) => {\n const cred = this.o.kernel.call({ op: 'proc-cred' }) as Cred;\n const view = mem.view();\n view.getUint32(out + 20, true);\n IDS.forEach((key, i) => void view.setUint32(out + i * 4, cred[key], true));\n },\n cred_set: (...ids: number[]) => {\n const change: CredChange = {};\n IDS.forEach((key, i) => {\n if (ids[i] !== -1) change[key] = (ids[i] as number) >>> 0;\n });\n void this.o.kernel.call({ op: 'proc-setcred', change });\n },\n groups_get: (buf: number, cap: number, count: number) => {\n const { groups } = this.o.kernel.call({ op: 'proc-cred' }) as Cred;\n if (cap !== 0 && cap < groups.length) throw new WasiError('EINVAL');\n const shown = cap === 0 ? [] : groups;\n const view = mem.view();\n view.getUint32(count, true);\n if (shown.length > 0) view.getUint32(buf + (shown.length - 1) * 4, true);\n shown.forEach((g, i) => void view.setUint32(buf + i * 4, g, true));\n view.setUint32(count, groups.length, true);\n },\n groups_set: (buf: number, n: number) => {\n if (n < 0 || n > MAX_GROUPS) throw new WasiError('EINVAL');\n const view = mem.view();\n const groups = Array.from({ length: n }, (_, i) => view.getUint32(buf + i * 4, true));\n void this.o.kernel.call({ op: 'proc-setcred', change: { groups } });\n },\n sigaction_set: (sig: number, disposition: number, flags: number) =>\n this.signals ? this.signals.disposition(sig, disposition, flags) : E.NOSYS,\n });\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 try {\n return 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 } finally {\n this.o.fs.invalidate?.();\n }\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 (localCpuNanos() ?? 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, 'write');\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, 'write').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 ) => {\n const path = at(dirfd, p, l);\n if (deviceOf(path)) this.interrupted?.();\n const fresh = (oflags & OFLAGS.CREAT) !== 0 && !this.synthetic(path) && !o.fs.exists(path);\n mem.view().setUint32(out, fds.open(path, oflags, rights, fdflags), true);\n if (fresh) this.created(path, 0o666);\n },\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, (lookup & LOOKUP_SYMLINK_FOLLOW) !== 0);\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 this.created(path, 0o777);\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 const st = o.fs.lstat(path);\n if (st.isDirectory) throw new WasiError('EISDIR');\n const linked = linkedOf(st);\n fds.unlinking(path, linked);\n o.fs.unlink(path);\n fds.unlinked(path, linked);\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 const replaced = fds.holdsUnder(to) ? linkedElsewhere(o.fs, to) : undefined;\n o.fs.rename(from, to);\n fds.renamed(from, to, replaced);\n },\n path_symlink: (tp: number, tl: number, dirfd: number, p: number, l: number) => {\n const path = at(dirfd, p, l);\n if (tl === 0) throw new WasiError('ENOENT');\n o.fs.symlink(mem.string(tp, tl), path);\n },\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: (\n fd: number,\n lookup: number,\n p: number,\n l: number,\n fd2: number,\n p2: number,\n l2: number\n ) => {\n const from = at(fd, p, l);\n const to = at(fd2, p2, l2);\n const follow = (lookup & LOOKUP_SYMLINK_FOLLOW) !== 0;\n const source = follow ? physicalPath(o.fs, from) : from;\n fds.flushPath(from);\n if (source !== from) fds.flushPath(source);\n o.fs.link(from, to, follow);\n fds.linked(from, to);\n if (source !== from) fds.linked(source, to);\n },\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 const kind = e.type === 'kernel' ? this.fds.kind(fd, e) : e.type;\n if (kind === 'device') this.interrupted?.();\n if (kind !== 'file' || e.type !== 'kernel') 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) =>\n this.changed(fd, e, kernel.call({ op: 'fd-pwrite', fd, offset: at, body }) as number),\n size: () => this.kernelStat(fd).size,\n truncate: (size) => this.changed(fd, e, void kernel.call({ op: 'fd-resize', fd, size })),\n };\n }\n\n private readonly unnamed = new WeakSet<object>();\n\n private changed<T>(fd: number, e: { path?: string; ino?: number }, result: T): T {\n if (e.path === undefined && !this.unnamed.has(e)) this.learnPath(fd, e);\n this.o.fs.touched?.(e.path, e.ino);\n return result;\n }\n\n private learnPath(fd: number, e: { path?: string; ino?: number }): void {\n this.unnamed.add(e);\n let path: string | undefined;\n try {\n const st = this.o.kernel.call({ op: 'fd-vfs-stat', fd, identity: true }) as {\n path?: string;\n orphan?: true;\n ino?: number;\n };\n path = st.orphan ? undefined : st.path;\n if (path !== undefined) e.ino = st.ino ?? this.o.fs.stat(path).ino;\n } catch {\n return;\n }\n e.path = path;\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 if (this.muted?.(fd, data)) return data.length;\n const e = this.fds.get(fd);\n if (e.type === 'kernel') {\n try {\n const n = this.o.kernel.sys.write(fd, data, { nonblock: e.nonblock });\n return this.fds.kind(fd, e) === 'file' ? this.changed(fd, e, n) : n;\n } catch (err) {\n const broken = (err as { code?: string }).code === 'EPIPE';\n if (broken && this.fds.kind(fd, e) !== 'socket') throw new WasiExit(SIGPIPE_EXIT);\n throw err;\n }\n }\n if (e.type === 'device') {\n this.interrupted?.();\n if (e.access === 'read') throw new WasiError('EBADF');\n if (e.device === 'full' && data.length > 0) throw new WasiError('ENOSPC');\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 this.interrupted?.();\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 === 'urandom' ? crypto.getRandomValues(out) : out;\n }\n return this.file(fd, 'read').read(max);\n }\n\n private local<T>(answer: T): T {\n this.interrupted?.();\n return answer;\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 const kind = this.fds.kind(fd, e);\n if (kind === 'device') return this.local(0);\n if (kind !== 'file') throw new WasiError('ESPIPE');\n return this.o.kernel.sys.seek(fd, offset, whence);\n }\n if (e.type === 'device') return this.local(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 === 'device') this.interrupted?.();\n else if (e.type === 'kernel') {\n const kind = this.fds.kind(fd, e);\n if (kind === 'file') this.o.kernel.sys.flush(fd);\n else if (kind === 'device') this.interrupted?.();\n }\n }\n\n private fdstat(fd: number, out: number): void {\n const e = this.fds.get(fd);\n if (e.type === 'device') this.interrupted?.();\n let filetype: number = FILETYPE.CHARACTER_DEVICE;\n let seeks = true;\n let flags = 0;\n if (e.type === 'kernel') {\n const kind = this.fds.kind(fd, e);\n if (kind === 'device') this.interrupted?.();\n ({ filetype, seeks } = kernelFiletype(kind));\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, f.nlink ?? 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.localFilestat(e.file);\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, vfs.orphan);\n }\n const filetype = kind ? kernelFiletype(kind).filetype : FILETYPE.CHARACTER_DEVICE;\n return this.local({ filetype, size: 0n, ino: BigInt(fd + 1), mtimeNs: 0n });\n }\n\n private localFilestat(file: LocalFile): Filestat {\n const { buffer } = file;\n if (buffer.isOrphan()) return this.statOrphanable(file.path, file.size(), false, true);\n let s: SyncFsBridgeStat | undefined;\n try {\n s = this.o.fs.stat(file.path);\n } catch {\n s = this.keptStat(buffer.handle);\n }\n return this.sized(file.path, s, file.size());\n }\n\n private keptStat(handle: number | undefined): SyncFsBridgeStat | undefined {\n if (handle === undefined) return undefined;\n try {\n return this.o.fs.keptStat?.(handle);\n } catch {\n return undefined;\n }\n }\n\n private sized(path: string, s: SyncFsBridgeStat | undefined, size: number): Filestat {\n return {\n ...filestatOf(path, s ?? { isFile: true, isDirectory: false, size: 0 }),\n size: BigInt(size),\n };\n }\n\n private statOrphanable(path: string, size: number, orphan = false, gone = false): Filestat {\n let s: SyncFsBridgeStat | undefined;\n\n if (!orphan) {\n try {\n s = this.o.fs.stat(path);\n } catch {}\n }\n const out = this.sized(path, s, size);\n return gone ? { ...out, nlink: 0n } : out;\n }\n\n private synthetic(path: string): boolean {\n return (\n deviceOf(path) !== undefined ||\n (path === SEALED_PATH && !!this.o.kernel.sys.openSealed) ||\n (path === CLIPBOARD_PATH && !!this.o.kernel.sys.openClipboard)\n );\n }\n\n private pathFilestat(path: string, lookup: number): Filestat {\n if (this.synthetic(path)) {\n return this.local({\n filetype: FILETYPE.CHARACTER_DEVICE,\n size: 0n,\n ino: pathInode(path),\n mtimeNs: 0n,\n });\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, follow = true): void {\n const asked = FSTFLAGS.ATIM | FSTFLAGS.ATIM_NOW | FSTFLAGS.MTIM | FSTFLAGS.MTIM_NOW;\n if (this.o.fs.owners && (flags & asked) === 0) return;\n const now = Date.now();\n let current: SyncFsBridgeStat | undefined;\n const statOf = follow ? this.o.fs.stat.bind(this.o.fs) : this.o.fs.lstat.bind(this.o.fs);\n const kept = (field: 'atimeMs' | 'mtimeMs'): number => {\n current ??= statOf(path);\n return current[field] ?? current.mtimeMs ?? now;\n };\n const pick = (\n set: number,\n setNow: number,\n value: bigint,\n field: 'atimeMs' | 'mtimeMs'\n ): number => (flags & setNow ? now : flags & set ? Number(value / NS_PER_MS) : kept(field));\n (follow ? this.o.fs.utimes : this.o.fs.lutimes).call(\n this.o.fs,\n path,\n pick(FSTFLAGS.ATIM, FSTFLAGS.ATIM_NOW, atim, 'atimeMs'),\n pick(FSTFLAGS.MTIM, FSTFLAGS.MTIM_NOW, mtim, 'mtimeMs'),\n (flags & (FSTFLAGS.ATIM | FSTFLAGS.MTIM)) === 0\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 { physicalPath } from '../../fs/physical-path.ts';\nimport type { ChildStdio, InheritedSlot } from '../../kernel/children.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\nexport function restarted(issue: () => unknown): unknown {\n for (;;) {\n try {\n return issue();\n } catch (e) {\n if ((e as { code?: unknown } | null)?.code !== 'EINTR') throw e;\n }\n }\n}\n\nfunction resolveFrom(cwd: string, path: string): string {\n return normalize(path.startsWith('/') ? path : `${cwd}/${path}`);\n}\n\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\nconst OFLAG_CREAT = 1;\nconst OFLAG_TRUNC = 8;\nconst JOIN_NON_BLOCKING = 1;\nconst JOIN_WAKE_STOPPED = 2;\nconst JOIN_STOPPED = 3;\n\nexport class WasixProcess {\n private readonly host: WasiHost;\n private readonly driver: AsyncifyDriver;\n private readonly inThread: () => boolean;\n constructor(host: WasiHost, driver: AsyncifyDriver, inThread: () => boolean = () => false) {\n this.host = host;\n this.driver = driver;\n this.inThread = inThread;\n }\n\n private restart(): { restart?: true } {\n return this.inThread() ? {} : { restart: true };\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 this.physicalFrom(cwd, op.path);\n else return physicalPath(this.host.o.fs, fds.dir(op.fd).path);\n return cwd;\n }\n\n private physicalFrom(cwd: string, path: string): string {\n return physicalPath(this.host.o.fs, path.startsWith('/') ? path : `${cwd}/${path}`);\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, exec = false): number {\n const { stdio, inherit, cwd, opened } = this.childFds(req.ops ?? []);\n try {\n const spawn = {\n op: 'proc-spawn' as const,\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 ...(exec ? { exec } : {}),\n ...this.restart(),\n };\n return restarted(() => this.call(spawn)) 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, true);\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({\n op: 'proc-wait',\n pid,\n nohang: (flags & JOIN_NON_BLOCKING) !== 0,\n ...(flags & JOIN_WAKE_STOPPED ? { untraced: true } : {}),\n }) as [number, number];\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 === 0x7f) {\n v.setUint8(statusPtr, JOIN_STOPPED);\n v.setUint8(statusPtr + 2, (status >> 8) & 0xff);\n } else if (sig) {\n v.setUint8(statusPtr, 2);\n v.setUint8(statusPtr + 4, 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(\n (asyncifyData, globals, forkSp) =>\n restarted(() => this.forkCall(asyncifyData, globals, forkSp)) as number\n );\n }\n\n private forkCall(\n asyncifyData: number,\n globals: Array<[string, number]>,\n forkSp: number\n ): unknown {\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 ...(this.host.signals ? { signals: this.host.signals.snapshot() } : {}),\n };\n return this.call({\n op: 'proc-fork',\n state: { memory, currData: 0, forkSp, callStackNames: [], ppid: this.host.o.pid, wasi },\n ...this.restart(),\n });\n }\n}\n", "import type { Cred } from '../../kernel/cred.ts';\nimport 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';\nimport { MAIN_TID } from './wasi-threads.ts';\nimport { restarted } from './wasix-process.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 readonly uid?: number;\n readonly gid?: 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 function importSource(source: string): Promise<Record<string, unknown>> {\n return import(`data:text/javascript;base64,${base64(source)}`);\n}\n\nexport async function loadImports(source: string): Promise<CreateImports> {\n const loaded = (await importSource(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 owners = fs.owners === true;\n const live = (): { uid: number; gid: number } => {\n if (!owners) return { uid: UID, gid: UID };\n const cred = call({ op: 'proc-cred' }) as Cred;\n return { uid: cred.euid, gid: cred.egid };\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, ...live(), 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 ...(s.uid !== undefined && s.gid !== undefined ? { uid: s.uid, gid: s.gid } : live()),\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 const ctx: ImportsContext = {\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, tid !== MAIN_TID),\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 if (!owners) return ctx;\n return Object.defineProperties(ctx, {\n uid: { get: () => live().uid, enumerable: true },\n gid: { get: () => live().gid, enumerable: true },\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 inThread: boolean\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 req = {\n op: 'proc-spawn' as const,\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 ...(inThread ? {} : { restart: true as const }),\n };\n const pid = restarted(() => call(req)) as number;\n const out: Spawned = { pid };\n STDIO.forEach((name, n) => {\n if (mine[n] !== undefined) out[name] = mine[n];\n });\n return out;\n } catch (err) {\n for (const fd of mine) if (fd !== undefined) close(fd);\n throw err;\n } finally {\n for (const fd of theirs) close(fd);\n host.o.fs.invalidate?.();\n }\n },\n wait(pid) {\n for (;;) {\n try {\n const [, status] = call({ op: 'proc-wait', pid, nohang: false }) as [number, number];\n host.o.fs.invalidate?.();\n const signal = status & 0x7f;\n return signal ? { status: 128 + signal, signal } : { status: (status >> 8) & 0xff };\n } catch (err) {\n if (code(err) !== 'EINTR') throw err;\n }\n }\n },\n kill(pid, sig) {\n call({ op: 'proc-kill', pid, sig });\n },\n };\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport type { SabPostLike } from '../../realm/sync-sab-bridge.ts';\nimport {\n decodeSabResult,\n loadU53,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_OFFSET_HI,\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_I_TOTAL_HI,\n SAB_STATE_IDLE,\n SAB_STATE_PENDING,\n SAB_STATE_READY,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabRequestBody,\n sabViews,\n} from '../../realm/sync-sab-wire.ts';\n\nexport type WaitAsyncLike = (\n typedArray: Int32Array,\n index: number,\n value: number\n) => { async: false; value: string } | { async: true; value: Promise<string> };\n\nexport interface AsyncSabTransport {\n call(req: SyncSabRequestBody): Promise<SyncFsResult>;\n}\n\nconst defaultWaitAsync: WaitAsyncLike = (a, i, v) =>\n (\n Atomics as unknown as {\n waitAsync: WaitAsyncLike;\n }\n ).waitAsync(a, i, v);\n\nexport async function changed(\n header: Int32Array,\n index: number,\n seen: number,\n waitAsync: WaitAsyncLike = defaultWaitAsync\n): Promise<void> {\n const waited = waitAsync(header, index, seen);\n if (waited.async) await waited.value;\n}\n\nexport function createAsyncSabTransport(\n sab: SharedArrayBuffer,\n port: SabPostLike,\n waitAsync: WaitAsyncLike = defaultWaitAsync\n): AsyncSabTransport {\n const { header, window } = sabViews(sab);\n let seq = 0;\n let tail: Promise<unknown> = Promise.resolve();\n\n async function ready(id: number): Promise<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 await changed(header, SAB_I_PUB, published, waitAsync);\n }\n }\n\n async function once(req: SyncSabRequestBody): Promise<SyncFsResult> {\n const id = ++seq;\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 port.postMessage(\n offset === 0\n ? { type: SYNC_SAB_REQ_MSG, id, req }\n : { type: SYNC_SAB_NEXT_MSG, id, offset }\n );\n await ready(id);\n const total = loadU53(header, SAB_I_TOTAL, SAB_I_TOTAL_HI);\n const chunk = Atomics.load(header, SAB_I_CHUNK);\n const at = loadU53(header, SAB_I_OFFSET, SAB_I_OFFSET_HI);\n if (at !== offset || chunk < 0 || total < 0 || offset + chunk > total) {\n return { ok: false, errno: 'EIO', message: 'sync-sab: torn reply' };\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 if (chunk === 0) return { ok: false, errno: 'EIO', message: 'sync-sab: empty chunk' };\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 return {\n call(req) {\n const run = tail.then(() => once(req));\n tail = run.catch(() => undefined);\n return run;\n },\n };\n}\n", "export const SIG = {\n HUP: 1,\n INT: 2,\n QUIT: 3,\n ILL: 4,\n TRAP: 5,\n ABRT: 6,\n BUS: 7,\n FPE: 8,\n KILL: 9,\n USR1: 10,\n SEGV: 11,\n USR2: 12,\n PIPE: 13,\n ALRM: 14,\n TERM: 15,\n STKFLT: 16,\n CHLD: 17,\n CONT: 18,\n STOP: 19,\n TSTP: 20,\n TTIN: 21,\n TTOU: 22,\n URG: 23,\n XCPU: 24,\n XFSZ: 25,\n VTALRM: 26,\n PROF: 27,\n WINCH: 28,\n POLL: 29,\n PWR: 30,\n SYS: 31,\n} as const;\n\nexport type DefaultAction = 'terminate' | 'ignore' | 'stop' | 'continue';\n\nconst IGNORED_BY_DEFAULT: ReadonlySet<number> = new Set([SIG.CHLD, SIG.URG, SIG.WINCH]);\nconst STOPPING: ReadonlySet<number> = new Set([SIG.STOP, SIG.TSTP, SIG.TTIN, SIG.TTOU]);\n\nexport function defaultAction(sig: number): DefaultAction {\n if (sig === SIG.CONT) return 'continue';\n if (STOPPING.has(sig)) return 'stop';\n return IGNORED_BY_DEFAULT.has(sig) ? 'ignore' : 'terminate';\n}\n\nexport function isSignal(sig: number): boolean {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31;\n}\n\nexport function sigbit(sig: number): number {\n return 1 << sig;\n}\n\nexport function signalsIn(mask: number): number[] {\n const out: number[] = [];\n for (let sig = 1; sig <= 31; sig++) if (mask & sigbit(sig)) out.push(sig);\n return out;\n}\n\nexport function signalName(sig: number | undefined): string | undefined {\n const name = Object.entries(SIG).find(([, n]) => n === sig)?.[0];\n return name === undefined ? undefined : `SIG${name}`;\n}\n\nexport function quiet<T>(p: Promise<T>): Promise<T> {\n p.catch(() => undefined);\n return p;\n}\n\nexport function signalField(sig: number | undefined): { signal?: string } {\n const name = signalName(sig);\n return name ? { signal: name } : {};\n}\n\nexport const SIGNAL_BY_NAME: Readonly<\n Record<'SIGINT' | 'SIGTERM' | 'SIGKILL' | 'SIGSTOP' | 'SIGCONT', number>\n> = {\n SIGINT: SIG.INT,\n SIGTERM: SIG.TERM,\n SIGKILL: SIG.KILL,\n SIGSTOP: SIG.STOP,\n SIGCONT: SIG.CONT,\n};\n", "import type { WasmSyscall } from '../../kernel/process.ts';\nimport { type DefaultAction, defaultAction, SIG, sigbit, signalsIn } from '../../kernel/signals.ts';\nimport type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport {\n SAB_HEADER_I32,\n SAB_I_ASYNC,\n SAB_I_SIGNALS,\n SAB_I_STOP,\n type SyncSabRequestBody,\n} from '../../realm/sync-sab-wire.ts';\nimport { type AsyncSabTransport, changed, type WaitAsyncLike } from './async-sab.ts';\n\nexport class JsCallError extends Error {\n readonly code: string;\n\n constructor(code: string, what: string) {\n super(`${what}: ${code}`);\n this.name = 'JsCallError';\n this.code = code;\n }\n}\n\nconst DETAILED: ReadonlySet<string> = new Set([\n 'fd-read',\n 'fd-write',\n 'fd-close',\n 'fd-open-clipboard',\n]);\n\nexport function callError(result: { errno: string; message: string }, op: string): JsCallError {\n const { errno, message } = result;\n const detailed = typeof message === 'string' && message !== errno && DETAILED.has(op);\n return new JsCallError(errno, detailed ? `${op}: ${message}` : op);\n}\n\nfunction untilAborted(work: Promise<void>, signal: AbortSignal | undefined): Promise<void> {\n if (!signal) return work;\n return new Promise<void>((resolve) => {\n const done = () => {\n signal.removeEventListener('abort', done);\n resolve();\n };\n signal.addEventListener('abort', done, { once: true });\n work.then(done, done);\n });\n}\n\nexport type SignalHandler = (signal: number) => unknown;\n\nexport interface JsKernelOptions {\n sab: SharedArrayBuffer;\n transport: AsyncSabTransport;\n waitAsync: WaitAsyncLike | undefined;\n onError: (err: unknown) => void;\n}\n\nfunction caughtOf(handlers: Map<number, SignalHandler>): number {\n let caught = 0;\n for (const sig of handlers.keys()) caught |= sigbit(sig);\n return caught;\n}\n\nexport class JsKernel {\n private readonly header: Int32Array;\n private readonly transport: AsyncSabTransport;\n private readonly waitAsync: WaitAsyncLike | undefined;\n private readonly onError: (err: unknown) => void;\n private handlers = new Map<number, SignalHandler>();\n private ignored = 0;\n private changing: Promise<unknown> = Promise.resolve();\n pid = 0;\n private reported = { caught: 0, ignored: 0 };\n private watching = false;\n faulted = false;\n syncLane: ((req: SyncSabRequestBody) => SyncFsResult) | undefined;\n\n constructor(o: JsKernelOptions) {\n this.header = new Int32Array(o.sab, 0, SAB_HEADER_I32);\n this.transport = o.transport;\n this.waitAsync = o.waitAsync;\n this.onError = o.onError;\n }\n\n async raw(req: SyncSabRequestBody): Promise<SyncFsResult> {\n const result = await this.transport.call(req);\n this.deliver();\n return result;\n }\n\n async call(req: SyncSabRequestBody): Promise<SyncFsResult> {\n const result = await this.raw(req);\n if (!result.ok) throw callError(result, req.op);\n return result;\n }\n\n async json(req: SyncSabRequestBody): Promise<unknown> {\n const result = await this.call(req);\n return result.ok && result.kind === 'json' ? result.json : undefined;\n }\n\n async bytes(req: SyncSabRequestBody): Promise<Uint8Array> {\n const result = await this.call(req);\n return result.ok && result.kind === 'bytes' ? result.bytes : new Uint8Array(0);\n }\n\n async blocking(\n req: WasmSyscall,\n signal?: AbortSignal,\n track?: (id: number) => void\n ): Promise<SyncFsResult> {\n for (;;) {\n const id = await this.submit(req, track);\n const result = await this.settled(id, signal);\n if (result.ok) return result;\n if (result.errno !== 'EINTR') throw callError(result, req.op);\n }\n }\n\n private acks: number[] = [];\n\n ack(id: number): void {\n this.acks.push(id);\n }\n\n private async submit(req: WasmSyscall, track?: (id: number) => void): Promise<number> {\n const ack = this.acks;\n this.acks = [];\n const r = await this.transport.call({\n op: 'async-submit',\n req,\n ...(ack.length > 0 ? { ack } : {}),\n });\n const id = r.ok && r.kind === 'json' ? (r.json as number) : undefined;\n if (id !== undefined) track?.(id);\n this.deliver();\n if (id === undefined) throw new JsCallError(r.ok ? 'EIO' : r.errno, 'async-submit');\n return id;\n }\n\n private async settled(id: number, signal?: AbortSignal): Promise<SyncFsResult> {\n for (;;) {\n const seen = Atomics.load(this.header, SAB_I_ASYNC);\n const taken = await this.raw({ op: 'async-take', id });\n if (taken.ok || taken.errno !== 'EAGAIN') return taken;\n if (signal?.aborted) {\n await this.raw({ op: 'async-cancel', id });\n throw signal.reason;\n }\n await untilAborted(changed(this.header, SAB_I_ASYNC, seen, this.waitAsync), signal);\n }\n }\n\n deliver(): void {\n const pending = Atomics.exchange(this.header, SAB_I_SIGNALS, 0);\n for (const sig of signalsIn(pending)) {\n const handler = this.handlers.get(sig);\n if (!handler) {\n if (!(this.ignored & sigbit(sig))) this.raise(sig);\n continue;\n }\n try {\n Promise.resolve(handler(sig)).catch((err) => this.fault(err));\n } catch (err) {\n this.fault(err);\n }\n }\n }\n\n private fault(err: unknown): void {\n this.faulted = true;\n this.onError(err);\n }\n\n async watch(): Promise<void> {\n if (this.watching) return;\n this.watching = true;\n for (;;) {\n await changed(this.header, SAB_I_SIGNALS, 0, this.waitAsync);\n this.deliver();\n }\n }\n\n async watchStops(): Promise<void> {\n for (;;) {\n await changed(this.header, SAB_I_STOP, 0, this.waitAsync);\n this.freeze();\n }\n }\n\n freeze(): void {\n while (Atomics.load(this.header, SAB_I_STOP) === 1) Atomics.wait(this.header, SAB_I_STOP, 1);\n }\n\n disposition(sig: number): 'caught' | 'ignored' | DefaultAction {\n if (this.handlers.has(sig)) return 'caught';\n if (this.ignored & sigbit(sig)) return 'ignored';\n return defaultAction(sig);\n }\n\n setHandler(sig: number, handler: SignalHandler | 'ignore' | 'default'): Promise<void> {\n if (sig === SIG.KILL || sig === SIG.STOP) {\n return Promise.reject(new JsCallError('EINVAL', 'signal'));\n }\n if (this.syncLane) {\n try {\n this.changeNow(this.syncLane, sig, handler);\n return Promise.resolve();\n } catch (err) {\n return Promise.reject(err);\n }\n }\n const run = this.changing.then(() => this.change(sig, handler));\n this.changing = run.catch(() => undefined);\n return run;\n }\n\n private changeNow(\n lane: (req: SyncSabRequestBody) => SyncFsResult,\n sig: number,\n handler: SignalHandler | 'ignore' | 'default'\n ): void {\n const { handlers, ignored } = this.disposed(sig, handler);\n const defaults = handler === 'default' ? sigbit(sig) : 0;\n const caught = caughtOf(handlers);\n if (caught !== this.reported.caught || ignored !== this.reported.ignored || defaults !== 0) {\n const r = lane({ op: 'sig-mask', caught, ignored, ...(defaults ? { defaults } : {}) });\n if (!r.ok) throw new JsCallError(r.errno, 'sig-mask');\n this.reported = { caught, ignored };\n }\n this.handlers = handlers;\n this.ignored = ignored;\n if (handlers.size > 0) void this.watch();\n }\n\n private disposed(\n sig: number,\n handler: SignalHandler | 'ignore' | 'default'\n ): { handlers: Map<number, SignalHandler>; ignored: number } {\n const handlers = new Map(this.handlers);\n handlers.delete(sig);\n let ignored = this.ignored & ~sigbit(sig);\n if (handler === 'ignore') ignored |= sigbit(sig);\n else if (handler !== 'default') handlers.set(sig, handler);\n return { handlers, ignored };\n }\n\n private async change(sig: number, handler: SignalHandler | 'ignore' | 'default'): Promise<void> {\n const { handlers, ignored } = this.disposed(sig, handler);\n await this.report(handlers, ignored, handler === 'default' ? sigbit(sig) : 0);\n this.handlers = handlers;\n this.ignored = ignored;\n if (handlers.size > 0) void this.watch();\n }\n\n private raise(sig: number): void {\n this.call({ op: 'proc-kill', pid: this.pid, sig }).catch(this.onError);\n }\n\n private async report(\n handlers: Map<number, SignalHandler>,\n ignored: number,\n defaults: number\n ): Promise<void> {\n const caught = caughtOf(handlers);\n const same = caught === this.reported.caught && ignored === this.reported.ignored;\n if (same && defaults === 0) return;\n this.reported = { caught, ignored };\n await this.call({ op: 'sig-mask', caught, ignored, ...(defaults ? { defaults } : {}) });\n }\n}\n", "import { JsCallError, type JsKernel } from './js-kernel.ts';\n\nexport type JsStdio = 'inherit' | 'pipe' | 'null' | number;\n\nexport interface JsSpawnOptions {\n argv: readonly string[];\n argv0?: string;\n env?: Readonly<Record<string, string>>;\n cwd?: string;\n pgid?: number;\n session?: boolean;\n stdin?: JsStdio;\n stdout?: JsStdio;\n stderr?: JsStdio;\n}\n\nexport interface JsExited {\n status: number;\n signal?: number;\n}\n\nexport interface JsChild {\n readonly pid: number;\n readonly stdin?: WritableStream<Uint8Array>;\n readonly stdout?: ReadableStream<Uint8Array>;\n readonly stderr?: ReadableStream<Uint8Array>;\n wait(): Promise<JsExited>;\n kill(signal?: number | `SIG${string}`): Promise<void>;\n}\n\nexport interface ChildIo {\n read(fd: number, max: number | undefined, signal: AbortSignal): Promise<Uint8Array>;\n send(fd: number, data: Uint8Array, signal: AbortSignal): Promise<void>;\n close(fd: number): Promise<void>;\n}\n\nexport interface ChildDefaults {\n env: Readonly<Record<string, string>>;\n cwd: string;\n signal(name: number | `SIG${string}`): number;\n}\n\nconst STDIO = ['stdin', 'stdout', 'stderr'] as const;\nconst SIGTERM = 15;\n\ntype Slot = { fd: number } | { none: true };\n\nexport function exitedOf(status: number): JsExited {\n const signal = status & 0x7f;\n return signal ? { status: 128 + signal, signal } : { status: (status >> 8) & 0xff };\n}\n\nfunction readable(io: ChildIo, fd: number): ReadableStream<Uint8Array> {\n const cancelled = new AbortController();\n return new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n const chunk = await io.read(fd, undefined, cancelled.signal).catch((err: unknown) => {\n if (cancelled.signal.aborted) return undefined;\n throw err;\n });\n if (chunk === undefined) return;\n if (chunk.length > 0) {\n controller.enqueue(chunk);\n return;\n }\n controller.close();\n await io.close(fd);\n },\n cancel: () => {\n cancelled.abort();\n return io.close(fd);\n },\n },\n { highWaterMark: 0 }\n );\n}\n\nfunction writable(io: ChildIo, fd: number): WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write: (chunk, controller) => io.send(fd, chunk, controller.signal),\n close: () => io.close(fd),\n abort: () => io.close(fd),\n });\n}\n\nexport function childOps(kernel: JsKernel, io: ChildIo, defaults: ChildDefaults) {\n const wait = async (pid: number): Promise<JsExited> => {\n const r = await kernel.blocking({ op: 'proc-wait', pid, nohang: false });\n const [, status] = (r.ok && r.kind === 'json' ? r.json : [0, 0]) as [number, number];\n return exitedOf(status);\n };\n const kill = async (pid: number, signal: number | `SIG${string}` = SIGTERM): Promise<void> => {\n await kernel.call({ op: 'proc-kill', pid, sig: signal === 0 ? 0 : defaults.signal(signal) });\n };\n\n const childOf = (pid: number, mine: Array<number | undefined>): JsChild => {\n const [stdin, stdout, stderr] = mine;\n return {\n pid,\n ...(stdin !== undefined ? { stdin: writable(io, stdin) } : {}),\n ...(stdout !== undefined ? { stdout: readable(io, stdout) } : {}),\n ...(stderr !== undefined ? { stderr: readable(io, stderr) } : {}),\n wait: () => wait(pid),\n kill: (signal?: number | `SIG${string}`) => kill(pid, signal),\n };\n };\n\n const spawn = async (o: JsSpawnOptions): Promise<JsChild> => {\n const [file] = o.argv;\n if (file === undefined) throw new JsCallError('EINVAL', 'spawn');\n const group = groupOf(o, 'spawn');\n const named = argv0Of(o.argv0, 'spawn');\n const mine: Array<number | undefined> = [];\n const theirs: number[] = [];\n try {\n const stdio = await slots(kernel, o, mine, theirs);\n const pid = (await kernel.json({\n op: 'proc-spawn',\n file,\n argv: [...o.argv],\n ...named,\n env: { ...(o.env ?? defaults.env) },\n cwd: o.cwd ?? defaults.cwd,\n stdio,\n ...group,\n })) as number;\n return childOf(pid, mine);\n } catch (err) {\n await closeAll(io, mine);\n throw err;\n } finally {\n await closeAll(io, theirs);\n }\n };\n\n return { spawn, wait, kill };\n}\n\nexport function groupOf(\n o: { pgid?: number; session?: boolean },\n call: string\n): { pgid?: number; session?: true } {\n const { pgid, session } = o;\n const valid = pgid === undefined || (Number.isInteger(pgid) && pgid >= 0);\n if (!valid || (session !== undefined && typeof session !== 'boolean')) {\n throw new JsCallError('EINVAL', call);\n }\n if (session && pgid !== undefined) throw new JsCallError('EINVAL', call);\n return session ? { session: true } : pgid !== undefined ? { pgid } : {};\n}\n\nexport function argv0Of(argv0: unknown, call: string): { argv0?: string } {\n if (argv0 === undefined) return {};\n if (typeof argv0 !== 'string') throw new JsCallError('EINVAL', call);\n return { argv0 };\n}\n\nasync function closeAll(io: ChildIo, fds: ReadonlyArray<number | undefined>): Promise<void> {\n for (const fd of fds) if (fd !== undefined) await io.close(fd).catch(() => undefined);\n}\n\nasync function preflight(kernel: JsKernel, hows: readonly JsStdio[]): Promise<void> {\n for (const [n, how] of hows.entries()) {\n if (how === 'pipe' || how === 'null') continue;\n if (how !== 'inherit' && typeof how !== 'number') throw new JsCallError('EINVAL', 'spawn');\n await kernel.json({ op: 'fd-info', fd: how === 'inherit' ? n : how });\n }\n}\n\nasync function slots(\n kernel: JsKernel,\n o: JsSpawnOptions,\n mine: Array<number | undefined>,\n theirs: number[]\n): Promise<Slot[]> {\n const hows = STDIO.map((name) => o[name] ?? ('inherit' as const));\n await preflight(kernel, hows);\n const stdio: Slot[] = [];\n for (const [n, how] of hows.entries()) {\n if (how === 'inherit') stdio.push({ fd: n });\n else if (how === 'null') stdio.push({ none: true });\n else if (typeof how === 'number') stdio.push({ fd: how });\n else {\n const [read, write] = (await kernel.json({ op: 'fd-pipe' })) as [number, number];\n mine[n] = n === 0 ? write : read;\n theirs.push(n === 0 ? read : write);\n stdio.push({ fd: n === 0 ? read : write });\n }\n }\n return stdio;\n}\n", "import type { DeviceMeta, KernelFdKind } from '../../kernel/fd-table.ts';\nimport type { SyncFsBridgeStat, SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport { JsCallError } from './js-kernel.ts';\n\nexport interface JsOpenOptions {\n read?: boolean;\n write?: boolean;\n append?: boolean;\n create?: boolean;\n exclusive?: boolean;\n truncate?: boolean;\n}\n\nexport type JsFdType = 'file' | 'pipe' | 'tty' | 'socket' | 'device' | 'directory';\n\nexport interface FdInfo {\n tty?: boolean;\n kind?: KernelFdKind;\n meta?: DeviceMeta | { dir: string };\n terminal?: string;\n}\n\nexport const CHUNK = 64 * 1024;\nexport const MAX_IO = 1024 * 1024;\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\n\nexport function typeOf(info: FdInfo): JsFdType {\n if (info.meta && 'dir' in info.meta) return 'directory';\n if (info.meta && 'device' in info.meta) return 'device';\n if (info.tty || info.kind === 'tty') return 'tty';\n if (info.kind === 'socket') return 'socket';\n return info.kind === 'file' ? 'file' : 'pipe';\n}\n\nfunction device(info: FdInfo): DeviceMeta | undefined {\n return info.meta && 'device' in info.meta ? info.meta : undefined;\n}\n\nexport function readDevice(\n info: FdInfo,\n max: number,\n random: (bytes: Uint8Array) => void\n): Uint8Array | undefined {\n if (typeOf(info) === 'directory') throw new JsCallError('EISDIR', 'read');\n const dev = device(info);\n if (!dev) return undefined;\n if (dev.access === 'write') throw new JsCallError('EBADF', 'read');\n if (dev.device === 'null') return new Uint8Array(0);\n const out = new Uint8Array(Math.min(max, CHUNK));\n if (dev.device === 'urandom') random(out);\n return out;\n}\n\nexport function writeDevice(info: FdInfo): boolean {\n if (typeOf(info) === 'directory') throw new JsCallError('EISDIR', 'write');\n const dev = device(info);\n if (!dev) return false;\n if (dev.access === 'read') throw new JsCallError('EBADF', 'write');\n if (dev.device === 'full') throw new JsCallError('ENOSPC', 'write');\n return true;\n}\n\nexport function brokenPipe(err: unknown, info: FdInfo): boolean {\n return err instanceof JsCallError && err.code === 'EPIPE' && typeOf(info) !== 'socket';\n}\n\nexport function written(r: SyncFsResult, fallback: number): number {\n return r.ok && r.kind === 'json' && typeof r.json === 'number' ? r.json : fallback;\n}\n\nexport function joined(parts: Uint8Array[], length: number): Uint8Array {\n if (parts.length === 1) return parts[0] as Uint8Array;\n const out = new Uint8Array(length);\n let at = 0;\n for (const part of parts) {\n out.set(part, at);\n at += part.length;\n }\n return out;\n}\n\nexport function fileWrite(fd: number, append: boolean, offset: number, body: Uint8Array) {\n return append\n ? { op: 'fd-write' as const, fd, body }\n : { op: 'fd-pwrite' as const, fd, offset, body };\n}\n\nexport function isExclusive(o: JsOpenOptions): boolean {\n return o.create === true && o.exclusive === true;\n}\n\nexport function absent(err: unknown): undefined {\n if (err instanceof JsCallError && err.code === 'ENOENT') return undefined;\n throw err;\n}\n\nexport function checkOpen(abs: string, o: JsOpenOptions, existing?: SyncFsBridgeStat): void {\n if (existing && isExclusive(o)) throw new JsCallError('EEXIST', abs);\n if (!existing && !o.create) throw new JsCallError('ENOENT', abs);\n if (existing?.isDirectory) throw new JsCallError('EISDIR', abs);\n}\n\nfunction flagsOf(o: JsOpenOptions): number {\n const write = o.write || o.append || o.truncate;\n const access = write ? (o.read ? O_RDWR : O_WRONLY) : 0;\n return access | (o.append ? O_APPEND : 0);\n}\n\nexport function openRequest(abs: string, o: JsOpenOptions) {\n return {\n op: 'fd-open-vfs' as const,\n path: abs,\n flags: flagsOf(o),\n position: 0,\n ...(isExclusive(o) ? { exclusive: true } : o.create ? { create: true } : { existing: true }),\n ...(o.truncate ? { truncate: true } : {}),\n };\n}\n\nexport function index(n: number, what: string): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new JsCallError('EINVAL', what);\n}\n", "import type { DeviceMeta } from '../../kernel/fd-table.ts';\nimport { parseSyncFsStat, type SyncFsBridgeStat } from '../../realm/sync-fs-wire.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport type { JsFile } from './js-context.ts';\nimport {\n type FdInfo,\n index,\n isExclusive,\n type JsOpenOptions,\n joined,\n MAX_IO,\n openRequest,\n} from './js-io.ts';\nimport { JsCallError } from './js-kernel.ts';\nimport type { JsSyncFile } from './js-sync.ts';\n\nexport type DevStep<T> = Generator<SyncSabRequestBody, T, unknown>;\n\nexport const DEV_READ_MAX = 64 * 1024 * 1024;\n\nconst DEVICES: readonly string[] = ['null', 'zero', 'full', 'random', 'urandom'];\nconst STDIO: readonly string[] = ['stdin', 'stdout', 'stderr'];\nconst SELF_FD = '/proc/self/fd';\nconst S_IFMT = 0o170000;\nconst DIR = 0o040000;\nconst LINK = 0o120000;\nconst CHAR = 0o020000;\nconst BORN = Date.now();\n\ntype DevNode =\n | { kind: 'dir'; mode: number }\n | { kind: 'device' }\n | { kind: 'tty' }\n | { kind: 'clipboard' }\n | { kind: 'terminal'; name: string; pts?: number }\n | { kind: 'link'; target: string; fd?: number }\n | { kind: 'fd'; fd: number };\n\ninterface TtyOwner {\n uid: number;\n gid: number;\n mode?: number;\n}\n\nexport function inDev(abs: string): boolean {\n return abs.startsWith('/dev') && (abs.length === 4 || abs[4] === '/');\n}\n\nfunction missing(path: string): never {\n throw new JsCallError('ENOENT', path);\n}\n\nfunction nodeStat(mode: number, size = 0, owner?: { uid: number; gid: number }): SyncFsBridgeStat {\n return {\n isFile: false,\n isDirectory: (mode & S_IFMT) === DIR,\n isSymbolicLink: (mode & S_IFMT) === LINK,\n size,\n mode,\n mtimeMs: BORN,\n atimeMs: BORN,\n ctimeMs: BORN,\n nlink: 1,\n uid: owner?.uid ?? 0,\n gid: owner?.gid ?? 0,\n };\n}\n\nfunction* lookup(abs: string): DevStep<DevNode> {\n if (abs === '/dev') return { kind: 'dir', mode: DIR | 0o755 };\n const name = abs.slice('/dev/'.length);\n if (DEVICES.includes(name)) return { kind: 'device' };\n if (name === 'tty') return { kind: 'tty' };\n if (name === 'clipboard') return { kind: 'clipboard' };\n const std = STDIO.indexOf(name);\n if (std >= 0) return { kind: 'link', target: `${SELF_FD}/${std}`, fd: std };\n if (name === 'fd') return { kind: 'link', target: SELF_FD };\n const fd = /^fd\\/(\\d+)$/.exec(name)?.[1];\n if (fd !== undefined) return { kind: 'fd', fd: Number(fd) };\n if (/^tty\\d+$/.test(name)) {\n const names = (yield { op: 'fd-tty-names' }) as string[];\n if (names.includes(abs)) return { kind: 'terminal', name: abs };\n }\n const pts = /^pts\\/(\\d+)$/.exec(name)?.[1];\n if (pts !== undefined) {\n const open = (yield { op: 'pty-list' }) as number[];\n if (open.includes(Number(pts))) return { kind: 'terminal', name: abs, pts: Number(pts) };\n }\n return missing(abs);\n}\n\nfunction* fdInfo(fd: number, path: string): DevStep<FdInfo> {\n try {\n return (yield { op: 'fd-info', fd }) as FdInfo;\n } catch (err) {\n if (err instanceof JsCallError && err.code === 'EBADF') return missing(path);\n throw err;\n }\n}\n\nfunction* pathStat(path: string): DevStep<SyncFsBridgeStat> {\n const s = parseSyncFsStat(yield { op: 'stat', path });\n if (!s) throw new JsCallError('EIO', 'stat');\n return s;\n}\n\nfunction* terminalStat(name: string): DevStep<SyncFsBridgeStat> {\n const owner = (yield { op: 'fd-tty-owner', name }) as TtyOwner | null;\n if (owner) return nodeStat(CHAR | (owner.mode ?? 0o620), 0, owner);\n return nodeStat(CHAR | (name.startsWith('/dev/pts/') ? 0o620 : 0o666));\n}\n\nfunction* fdStat(fd: number, path: string): DevStep<SyncFsBridgeStat> {\n const info = yield* fdInfo(fd, path);\n if (info.meta && 'dir' in info.meta) return yield* pathStat(info.meta.dir);\n if (info.kind === 'file') {\n const file = (yield { op: 'fd-vfs-stat', fd }) as { path: string; size: number; orphan?: true };\n if (file.orphan) return { ...nodeStat(0o100600, file.size), isFile: true };\n return yield* pathStat(file.path);\n }\n if (info.terminal) return yield* terminalStat(info.terminal);\n if (info.kind === 'device' || info.kind === 'tty' || info.kind === 'clipboard')\n return nodeStat(CHAR | 0o666);\n if (info.kind === 'socket') return nodeStat(0o140777);\n return nodeStat(0o010600);\n}\n\nfunction* fdTarget(fd: number, path: string): DevStep<string> {\n const info = yield* fdInfo(fd, path);\n if (info.meta && 'dir' in info.meta) return info.meta.dir;\n if (info.kind === 'file') return ((yield { op: 'fd-vfs-stat', fd }) as { path: string }).path;\n if (info.terminal) return info.terminal;\n if (info.meta && 'device' in info.meta) return `/dev/${(info.meta as DeviceMeta).device}`;\n if (info.kind === 'clipboard') return '/dev/clipboard';\n return `${info.kind === 'socket' ? 'socket' : 'pipe'}:[${fd}]`;\n}\n\nfunction linkStat(target: string): SyncFsBridgeStat {\n return nodeStat(LINK | 0o777, target.length);\n}\n\nexport function* devStat(abs: string, follow: boolean): DevStep<SyncFsBridgeStat> {\n const node = yield* lookup(abs);\n switch (node.kind) {\n case 'dir':\n return nodeStat(node.mode);\n case 'device':\n case 'tty':\n case 'clipboard':\n return nodeStat(CHAR | 0o666);\n case 'terminal':\n return yield* terminalStat(node.name);\n case 'link':\n if (!follow) return linkStat(node.target);\n return node.fd === undefined ? nodeStat(DIR | 0o555) : yield* fdStat(node.fd, abs);\n case 'fd':\n return follow ? yield* fdStat(node.fd, abs) : linkStat(yield* fdTarget(node.fd, abs));\n }\n}\n\nexport function* devExists(abs: string): DevStep<boolean> {\n try {\n yield* devStat(abs, true);\n return true;\n } catch (err) {\n if (err instanceof JsCallError) return false;\n throw err;\n }\n}\n\nexport function* devReadlink(abs: string): DevStep<string> {\n const node = yield* lookup(abs);\n if (node.kind === 'link') return node.target;\n if (node.kind === 'fd') return yield* fdTarget(node.fd, abs);\n throw new JsCallError('EINVAL', abs);\n}\n\nexport function* devReaddir(abs: string): DevStep<string[]> {\n if (abs === '/dev/fd') {\n const fds = (yield { op: 'fd-list' }) as Array<{ fd: number }>;\n return fds.map(({ fd }) => String(fd));\n }\n const node = yield* lookup(abs);\n if (node.kind !== 'dir') throw new JsCallError('ENOTDIR', abs);\n const names = (yield { op: 'fd-tty-names' }) as string[];\n const ttys = names.filter((n) => /^\\/dev\\/tty\\d+$/.test(n)).map((n) => n.slice(5));\n return [...DEVICES, 'clipboard', 'tty', 'fd', ...STDIO, ...ttys].sort();\n}\n\nexport interface DevOpened {\n fd: number;\n file: boolean;\n read: boolean;\n write: boolean;\n}\n\nfunction* aliasOf(\n fd: number,\n abs: string,\n o: JsOpenOptions\n): DevStep<Omit<DevOpened, 'read' | 'write'>> {\n const info = yield* fdInfo(fd, abs);\n const file = info.kind === 'file';\n if (file) {\n const at = (yield { op: 'fd-vfs-stat', fd }) as { path: string; orphan?: true };\n if (!at.orphan)\n return { fd: (yield openRequest(at.path, { ...o, create: false })) as number, file };\n }\n const copy = (yield { op: 'fd-dup', fd, min: 3 }) as number;\n if (file && o.truncate) {\n try {\n yield { op: 'fd-resize', fd: copy, size: 0 };\n } catch (err) {\n yield { op: 'fd-close', fd: copy };\n throw err;\n }\n }\n return { fd: copy, file };\n}\n\nfunction* opened(abs: string, o: JsOpenOptions): DevStep<Omit<DevOpened, 'read' | 'write'>> {\n const node = yield* lookup(abs);\n if (isExclusive(o)) throw new JsCallError('EEXIST', abs);\n switch (node.kind) {\n case 'device':\n return { fd: (yield openRequest(abs, { ...o, create: false })) as number, file: false };\n case 'tty':\n return { fd: (yield { op: 'fd-open-tty' }) as number, file: false };\n case 'clipboard': {\n const write = o.write === true || o.append === true || o.truncate === true;\n const flags = write ? (o.read === true ? 2 : 1) : 0;\n return { fd: (yield { op: 'fd-open-clipboard', flags }) as number, file: false };\n }\n case 'terminal': {\n const req =\n node.pts === undefined\n ? { op: 'fd-open-tty' as const, name: node.name }\n : { op: 'pty-slave-open' as const, n: node.pts, noctty: true };\n return { fd: (yield req) as number, file: false };\n }\n case 'fd':\n return yield* aliasOf(node.fd, abs, o);\n case 'link':\n if (node.fd !== undefined) return yield* aliasOf(node.fd, abs, o);\n throw new JsCallError('EISDIR', abs);\n case 'dir':\n throw new JsCallError('EISDIR', abs);\n }\n}\n\nexport function* devOpen(abs: string, o: JsOpenOptions): DevStep<DevOpened> {\n const write = o.write === true || o.append === true || o.truncate === true;\n return { ...(yield* opened(abs, o)), read: o.read === true || !write, write };\n}\n\nexport async function devAsync<T>(\n kernel: { json(req: SyncSabRequestBody): Promise<unknown> },\n step: DevStep<T>\n): Promise<T> {\n let next = step.next();\n while (!next.done) {\n let answer: { value: unknown } | { error: unknown };\n try {\n answer = { value: await kernel.json(next.value) };\n } catch (error) {\n answer = { error };\n }\n next = 'value' in answer ? step.next(answer.value) : step.throw(answer.error);\n }\n return next.value;\n}\n\nexport function devSync<T>(\n kernel: { json(req: SyncSabRequestBody): unknown },\n step: DevStep<T>\n): T {\n let next = step.next();\n while (!next.done) {\n let answer: { value: unknown } | { error: unknown };\n try {\n answer = { value: kernel.json(next.value) };\n } catch (error) {\n answer = { error };\n }\n next = 'value' in answer ? step.next(answer.value) : step.throw(answer.error);\n }\n return next.value;\n}\n\nfunction tooLarge(got: number): void {\n if (got > DEV_READ_MAX) throw new JsCallError('EFBIG', 'readFile');\n}\n\nexport interface StreamIo {\n read(fd: number, max: number): Promise<Uint8Array>;\n write(fd: number, data: Uint8Array): Promise<void>;\n close(fd: number): Promise<void>;\n}\n\nexport interface StreamSyncIo {\n read(fd: number, max: number): Uint8Array;\n write(fd: number, data: Uint8Array): void;\n close(fd: number): void;\n}\n\nfunction liveness(path: string) {\n let open = true;\n return {\n live: (): void => {\n if (!open) throw new JsCallError('EBADF', path);\n },\n end: (): void => {\n open = false;\n },\n };\n}\n\nexport interface StreamAccess {\n read: boolean;\n write: boolean;\n}\n\nfunction allowed(may: boolean, what: string): void {\n if (!may) throw new JsCallError('EBADF', what);\n}\n\nexport function streamFile(\n fd: number,\n path: string,\n io: StreamIo,\n access: StreamAccess\n): { file: JsFile; invalidate: () => void } {\n const { live, end } = liveness(path);\n const file: JsFile = {\n fd,\n path,\n async size() {\n live();\n return 0;\n },\n async read(position, length) {\n index(position, 'read');\n index(length, 'read');\n live();\n allowed(access.read, 'read');\n return length === 0 ? new Uint8Array(0) : io.read(fd, Math.min(length, MAX_IO));\n },\n async write(position, data) {\n index(position, 'write');\n live();\n allowed(access.write, 'write');\n await io.write(fd, data);\n return data.length;\n },\n async truncate(size) {\n live();\n index(size, 'truncate');\n throw new JsCallError('EINVAL', 'truncate');\n },\n sync: async () => live(),\n async close() {\n live();\n end();\n await io.close(fd);\n },\n };\n return { file, invalidate: end };\n}\n\nexport function streamSyncFile(\n fd: number,\n path: string,\n io: StreamSyncIo,\n access: StreamAccess\n): { file: JsSyncFile; invalidate: () => void } {\n const { live, end } = liveness(path);\n const file: JsSyncFile = {\n fd,\n path,\n size() {\n live();\n return 0;\n },\n read(position, length) {\n index(position, 'read');\n index(length, 'read');\n live();\n allowed(access.read, 'read');\n return length === 0 ? new Uint8Array(0) : io.read(fd, Math.min(length, MAX_IO));\n },\n write(position, data) {\n index(position, 'write');\n live();\n allowed(access.write, 'write');\n io.write(fd, data);\n return data.length;\n },\n truncate(size) {\n live();\n index(size, 'truncate');\n throw new JsCallError('EINVAL', 'truncate');\n },\n sync: () => live(),\n close() {\n live();\n end();\n io.close(fd);\n },\n };\n return { file, invalidate: end };\n}\n\nexport async function readWhole(file: JsFile): Promise<Uint8Array> {\n try {\n const parts: Uint8Array[] = [];\n let got = 0;\n for (;;) {\n const chunk = await file.read(got, MAX_IO);\n if (chunk.length === 0) return joined(parts, got);\n got += chunk.length;\n tooLarge(got);\n parts.push(chunk);\n }\n } finally {\n await file.close();\n }\n}\n\nexport function readWholeSync(file: JsSyncFile): Uint8Array {\n try {\n const parts: Uint8Array[] = [];\n let got = 0;\n for (;;) {\n const chunk = file.read(got, MAX_IO);\n if (chunk.length === 0) return joined(parts, got);\n got += chunk.length;\n tooLarge(got);\n parts.push(chunk);\n }\n } finally {\n file.close();\n }\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport { MAX_IO, written } from './js-io.ts';\nimport type { SyncCall } from './js-sync.ts';\n\nexport interface PendingWrite {\n fd: number;\n data: Uint8Array;\n at: number;\n len: number;\n op?: number;\n}\n\nexport interface SavedMode {\n terminal: string;\n fd: number;\n termios: unknown;\n}\n\nfunction json(r: SyncFsResult): unknown {\n return r.ok && r.kind === 'json' ? r.json : undefined;\n}\n\nfunction restoreMode(lane: SyncCall, { terminal, fd, termios }: SavedMode): void {\n const open = (json(lane({ op: 'fd-list' })) ?? []) as Array<{ fd: number; terminal?: string }>;\n const on = open.filter((entry) => entry.terminal === terminal);\n const at = (on.find((entry) => entry.fd === fd) ?? on[0])?.fd;\n if (at !== undefined) {\n lane({ op: 'tty-set', fd: at, termios } as SyncSabRequestBody);\n return;\n }\n const opened = json(lane({ op: 'fd-open-tty', name: terminal }));\n if (typeof opened !== 'number') return;\n lane({ op: 'tty-set', fd: opened, termios } as SyncSabRequestBody);\n lane({ op: 'fd-close', fd: opened });\n}\n\nfunction writeOut(lane: SyncCall, fd: number, data: Uint8Array): boolean {\n let at = 0;\n while (at < data.length) {\n const body = data.subarray(at, at + MAX_IO);\n const r = lane({ op: 'fd-write', fd, body });\n if (!r.ok && r.errno === 'EINTR') continue;\n if (!r.ok) return false;\n const n = written(r, body.length);\n if (n <= 0) return false;\n at += n;\n }\n return true;\n}\n\nfunction progress(result: SyncFsResult | null | undefined, len: number): number {\n if (!result) return len;\n if (result.ok) return written(result, len);\n return result.errno === 'EINTR' ? 0 : -1;\n}\n\nfunction settled(lane: SyncCall, writes: readonly PendingWrite[]): Map<PendingWrite, number> {\n const inFlight = writes.filter((w) => w.op !== undefined);\n const out = new Map<PendingWrite, number>();\n if (inFlight.length === 0) return out;\n const r = lane({ op: 'async-settle', ids: inFlight.map((w) => w.op as number) });\n const results = (r.ok && r.kind === 'json' ? r.json : []) as Array<SyncFsResult | null>;\n inFlight.forEach((w, i) => {\n const result = results[i];\n out.set(w, progress(result, w.len));\n });\n return out;\n}\n\nexport function exitAtOnce(\n lane: SyncCall,\n writes: readonly PendingWrite[],\n modes: readonly SavedMode[],\n status: number,\n last: SyncSabRequestBody = { op: 'proc-exit', status: status & 0xff }\n): never {\n const done = settled(lane, writes);\n const broken = new Set<number>();\n for (const w of writes) {\n const sent = done.get(w);\n if (sent === -1) broken.add(w.fd);\n if (broken.has(w.fd)) continue;\n if (!writeOut(lane, w.fd, w.data.subarray(w.at + (sent ?? 0)))) broken.add(w.fd);\n }\n for (const mode of modes) restoreMode(lane, mode);\n lane(last);\n const parked = new Int32Array(new SharedArrayBuffer(4));\n for (;;) Atomics.wait(parked, 0, 0);\n}\n", "import type { HttpHead } from '../../kernel/net/http-syscalls.ts';\nimport type { HeaderList } from '../../kernel/net/transport.ts';\nimport { JsCallError, type JsKernel } from './js-kernel.ts';\n\ninterface FetchTraits {\n manualRedirects: boolean;\n encodedBodies: boolean;\n maxRequestBody: number;\n}\n\ninterface Hop {\n url: string;\n method: string;\n headers: [string, string][];\n body: Uint8Array | undefined;\n}\n\nconst CHUNK = 64 * 1024;\nconst MAX_REDIRECTS = 20;\nconst NULL_BODY = new Set([101, 103, 204, 205, 304]);\nconst REDIRECTS = new Set([301, 302, 303, 307, 308]);\nconst BODY_HEADERS = new Set([\n 'content-encoding',\n 'content-language',\n 'content-location',\n 'content-type',\n 'content-length',\n]);\nconst DECODED = new Set(['gzip', 'x-gzip', 'deflate']);\nconst CREDENTIALS = new Set(['authorization', 'proxy-authorization', 'cookie', 'cookie2']);\n\nfunction withoutFragment(url: URL): string {\n url.hash = '';\n return url.href;\n}\n\nfunction failed(err: unknown): TypeError {\n return new TypeError('fetch failed', { cause: err });\n}\n\nfunction plain(status: number, text: string): Response {\n return new Response(text, {\n status,\n headers: { 'content-type': 'text/plain; charset=utf-8' },\n });\n}\n\nfunction rewrite(hop: Hop, status: number, location: string): Hop {\n const next = new URL(location, hop.url);\n if (next.protocol !== 'http:' && next.protocol !== 'https:') {\n throw failed(new JsCallError('EPROTONOSUPPORT', next.protocol));\n }\n const toGet =\n ((status === 301 || status === 302) && hop.method === 'POST') ||\n (status === 303 && hop.method !== 'GET' && hop.method !== 'HEAD');\n const crossOrigin = next.origin !== new URL(hop.url).origin;\n const headers = hop.headers.filter(\n ([name]) =>\n !(toGet && BODY_HEADERS.has(name.toLowerCase())) &&\n !(crossOrigin && CREDENTIALS.has(name.toLowerCase()))\n );\n return {\n url: withoutFragment(next),\n method: toGet ? 'GET' : hop.method,\n headers,\n body: toGet ? undefined : hop.body,\n };\n}\n\nconst OVER = Symbol('over');\nconst TOKEN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\nconst QUOTABLE = /^[\\t\\x20-\\x7e\\x80-\\xff]*$/;\nconst SPACE = /[\\t\\n\\r ]/;\nconst BASE64 = /; *base64$/i;\nconst SLICE = 0x8000;\n\nfunction isHex(byte: number | undefined): boolean {\n return byte !== undefined && /^[0-9A-Fa-f]$/.test(String.fromCharCode(byte));\n}\n\nfunction percentDecode(input: string): Uint8Array {\n const bytes = new TextEncoder().encode(input);\n const out = new Uint8Array(bytes.length);\n let at = 0;\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i] as number;\n if (byte === 0x25 && isHex(bytes[i + 1]) && isHex(bytes[i + 2])) {\n out[at++] = Number.parseInt(\n String.fromCharCode(bytes[i + 1] as number, bytes[i + 2] as number),\n 16\n );\n i += 2;\n } else out[at++] = byte;\n }\n return out.subarray(0, at);\n}\n\nfunction latin1(bytes: Uint8Array): string {\n let text = '';\n for (let at = 0; at < bytes.length; at += SLICE) {\n text += String.fromCharCode(...bytes.subarray(at, at + SLICE));\n }\n return text;\n}\n\nfunction quoted(input: string, from: number): [string, number] {\n let value = '';\n let at = from + 1;\n while (at < input.length) {\n const char = input[at++] as string;\n if (char === '\"') break;\n if (char !== '\\\\') value += char;\n else if (at < input.length) value += input[at++];\n else value += char;\n }\n return [value, at];\n}\n\nfunction parameter(text: string, from: number, params: Map<string, string>): number {\n let at = from + 1;\n while (SPACE.test(text[at] ?? '')) at++;\n let end = at;\n while (end < text.length && text[end] !== ';' && text[end] !== '=') end++;\n const name = text.slice(at, end).toLowerCase();\n if (text[end] !== '=') return end;\n const start = end + 1;\n let value: string;\n if (text[start] === '\"') {\n [value, at] = quoted(text, start);\n end = text.indexOf(';', at);\n } else {\n end = text.indexOf(';', start);\n value = text.slice(start, end < 0 ? undefined : end).replace(/[\\t\\n\\r ]+$/, '');\n if (!value) return end < 0 ? text.length : end;\n }\n if (end < 0) end = text.length;\n if (TOKEN.test(name) && QUOTABLE.test(value) && !params.has(name)) {\n params.set(name, value);\n }\n return end;\n}\n\nfunction mimeType(input: string): string | undefined {\n const text = input.replace(/^[\\t\\n\\r ]+|[\\t\\n\\r ]+$/g, '');\n const slash = text.indexOf('/');\n const semi = text.indexOf(';', slash);\n const type = text.slice(0, slash);\n const subtype = text.slice(slash + 1, semi < 0 ? undefined : semi).replace(/[\\t\\n\\r ]+$/, '');\n if (slash < 0 || !TOKEN.test(type) || !TOKEN.test(subtype)) return undefined;\n const params = new Map<string, string>();\n for (let at = semi < 0 ? text.length : semi; at < text.length; ) at = parameter(text, at, params);\n let out = `${type}/${subtype}`.toLowerCase();\n for (const [name, value] of params) {\n out += `;${name}=${TOKEN.test(value) ? value : `\"${value.replace(/[\"\\\\]/g, '\\\\$&')}\"`}`;\n }\n return out;\n}\n\nfunction dataResponse(request: Request): Response {\n const url = withoutFragment(new URL(request.url));\n const rest = url.slice('data:'.length);\n const comma = rest.indexOf(',');\n if (comma < 0) throw failed(new JsCallError('EINVAL', 'a data: URL without a comma'));\n let type = rest.slice(0, comma).replace(/^[\\t\\n\\f\\r ]+|[\\t\\n\\f\\r ]+$/g, '');\n let body = percentDecode(rest.slice(comma + 1));\n const base64 = BASE64.exec(type);\n if (base64) {\n type = type.slice(0, base64.index);\n let binary: string;\n try {\n binary = atob(latin1(body));\n } catch {\n throw failed(new JsCallError('EINVAL', 'a data: URL whose base64 does not decode'));\n }\n body = Uint8Array.from(binary, (c) => c.charCodeAt(0));\n }\n if (type.startsWith(';')) type = `text/plain${type}`;\n const response = new Response(\n request.method === 'HEAD' ? null : (body as Uint8Array<ArrayBuffer>),\n {\n status: 200,\n statusText: 'OK',\n headers: { 'content-type': mimeType(type) ?? 'text/plain;charset=US-ASCII' },\n }\n );\n return withMeta(response, url, false);\n}\n\nfunction withMeta(response: Response, url: string, redirected: boolean): Response {\n const clone = response.clone.bind(response);\n Object.defineProperty(response, 'url', { value: url });\n Object.defineProperty(response, 'redirected', { value: redirected });\n Object.defineProperty(response, 'clone', { value: () => withMeta(clone(), url, redirected) });\n return response;\n}\n\nfunction bytesOf(chunk: unknown): Uint8Array {\n if (typeof chunk === 'string') return new TextEncoder().encode(chunk);\n if (chunk instanceof ArrayBuffer) return new Uint8Array(chunk);\n if (ArrayBuffer.isView(chunk)) {\n return new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n }\n throw failed(new TypeError('a request body chunk must be bytes or a string'));\n}\n\nasync function bodyOf(\n request: Request,\n cap: number,\n signal: AbortSignal\n): Promise<Uint8Array | undefined | typeof OVER> {\n signal.throwIfAborted();\n if (!request.body || request.method === 'GET' || request.method === 'HEAD') return undefined;\n const reader = request.body.getReader();\n const stop = (): void => void reader.cancel(signal.reason).catch(() => undefined);\n signal.addEventListener('abort', stop, { once: true });\n const parts: Uint8Array[] = [];\n let length = 0;\n try {\n for (;;) {\n const next = await reader.read().catch((err: unknown) => {\n throw signal.aborted ? signal.reason : failed(err);\n });\n signal.throwIfAborted();\n if (next.done) break;\n const chunk = bytesOf(next.value);\n length += chunk.length;\n if (length > cap) {\n reader.cancel().catch(() => undefined);\n return OVER;\n }\n parts.push(chunk);\n }\n } finally {\n signal.removeEventListener('abort', stop);\n }\n if (length === 0) return undefined;\n const out = new Uint8Array(length);\n let at = 0;\n for (const part of parts) {\n out.set(part, at);\n at += part.length;\n }\n return out;\n}\n\nexport function fetchOp(kernel: JsKernel) {\n let traits: Promise<FetchTraits> | undefined;\n const traitsOf = (): Promise<FetchTraits> => {\n traits ??= kernel.json({ op: 'net-traits' }) as Promise<FetchTraits>;\n traits.catch(() => {\n traits = undefined;\n });\n return traits;\n };\n\n const close = (handle: number): Promise<unknown> => kernel.raw({ op: 'net-close', handle });\n\n const send = async (hop: Hop, signal: AbortSignal): Promise<HttpHead> => {\n signal.throwIfAborted();\n const handle = (await kernel.json({\n op: 'net-open',\n url: hop.url,\n method: hop.method,\n headers: hop.headers,\n ...(hop.body ? { body: hop.body } : {}),\n })) as number;\n try {\n const r = await kernel.blocking({ op: 'net-head', handle }, signal);\n signal.throwIfAborted();\n return (r.ok && r.kind === 'json' ? r.json : undefined) as HttpHead;\n } catch (err) {\n await close(handle);\n throw signal.aborted ? signal.reason : failed(err);\n }\n };\n\n const body = (handle: number, signal: AbortSignal): ReadableStream<Uint8Array> => {\n let aborted: (() => void) | undefined;\n const settle = (): void => {\n if (aborted) signal.removeEventListener('abort', aborted);\n };\n return new ReadableStream<Uint8Array>(\n {\n start(controller) {\n aborted = () => {\n controller.error(signal.reason);\n void close(handle);\n };\n signal.addEventListener('abort', aborted, { once: true });\n },\n async pull(controller) {\n let r: Awaited<ReturnType<JsKernel['blocking']>>;\n try {\n signal.throwIfAborted();\n r = await kernel.blocking({ op: 'net-read', handle, max: CHUNK }, signal);\n } catch (err) {\n settle();\n await close(handle);\n throw signal.aborted ? signal.reason : failed(err);\n }\n const bytes = r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n if (bytes.length > 0) {\n controller.enqueue(bytes);\n return;\n }\n settle();\n controller.close();\n await close(handle);\n },\n cancel: async () => {\n settle();\n await close(handle);\n },\n },\n { highWaterMark: 0 }\n );\n };\n\n const respond = (\n head: HttpHead,\n method: string,\n redirected: boolean,\n encoded: boolean,\n signal: AbortSignal\n ): Response => {\n if (head.status < 200 || head.status > 599) {\n void close(head.handle);\n throw failed(new JsCallError('EPROTO', `status ${head.status}`));\n }\n const empty = method === 'HEAD' || NULL_BODY.has(head.status);\n if (empty) void close(head.handle);\n const headers = new Headers(head.headers as HeaderList as [string, string][]);\n let stream: ReadableStream<Uint8Array> | null = empty ? null : body(head.handle, signal);\n const coding = headers.get('content-encoding')?.trim().toLowerCase();\n if (stream && encoded && coding && DECODED.has(coding)) {\n const format = coding === 'deflate' ? 'deflate' : 'gzip';\n stream = stream.pipeThrough(\n new DecompressionStream(format) as unknown as TransformStream<Uint8Array, Uint8Array>\n );\n headers.delete('content-encoding');\n headers.delete('content-length');\n }\n const response = new Response(stream, {\n status: head.status,\n statusText: head.statusText,\n headers,\n });\n return withMeta(response, head.url, redirected);\n };\n\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const request = new Request(input, init);\n const { signal } = request;\n signal.throwIfAborted();\n const { protocol } = new URL(request.url);\n if (protocol === 'data:') return dataResponse(request);\n if (protocol !== 'http:' && protocol !== 'https:') {\n throw failed(new JsCallError('EPROTONOSUPPORT', protocol));\n }\n const known = await traitsOf().catch((err: unknown) => {\n throw failed(err);\n });\n if (!known.manualRedirects && request.redirect !== 'follow') {\n throw failed(new JsCallError('ENOTSUP', `redirect: ${request.redirect}`));\n }\n const url = withoutFragment(new URL(request.url));\n const bytes = await bodyOf(request, known.maxRequestBody, signal);\n if (bytes === OVER) {\n return withMeta(plain(413, `request body over ${known.maxRequestBody} bytes`), url, false);\n }\n let hop: Hop = {\n url,\n method: request.method,\n headers: [...request.headers],\n body: bytes,\n };\n for (let hops = 0; ; hops++) {\n const head = await send(hop, signal);\n const location = head.headers.find(([name]) => name.toLowerCase() === 'location')?.[1];\n const follow =\n known.manualRedirects &&\n REDIRECTS.has(head.status) &&\n location !== undefined &&\n request.redirect !== 'manual';\n if (!follow) {\n const redirected = hops > 0 || head.redirected === true;\n return respond(head, hop.method, redirected, known.encodedBodies, signal);\n }\n await close(head.handle);\n if (request.redirect === 'error') throw failed(new JsCallError('EREDIRECT', hop.url));\n if (hops >= MAX_REDIRECTS) throw failed(new JsCallError('ELOOP', hop.url));\n hop = rewrite(hop, head.status, location);\n }\n };\n}\n", "import { E } from '../wasi/wasi-abi.ts';\nimport { JsCallError, type JsKernel } from './js-kernel.ts';\n\nexport interface JsAddress {\n host: string;\n port: number;\n}\n\nexport interface JsConnection {\n readonly fd: number;\n readonly local: JsAddress;\n readonly remote: JsAddress;\n readonly readable: ReadableStream<Uint8Array>;\n readonly writable: WritableStream<Uint8Array>;\n close(): Promise<void>;\n}\n\nexport interface JsListener extends AsyncIterable<JsConnection> {\n readonly fd: number;\n readonly host: string;\n readonly port: number;\n accept(options?: { signal?: AbortSignal }): Promise<JsConnection>;\n close(): Promise<void>;\n}\n\nexport interface JsListenOptions {\n port?: number;\n host?: string;\n backlog?: number;\n}\n\nexport interface JsConnectOptions {\n host?: string;\n port: number;\n signal?: AbortSignal;\n}\n\nexport interface JsNet {\n listen(options?: JsListenOptions): Promise<JsListener>;\n connect(options: JsConnectOptions): Promise<JsConnection>;\n}\n\nexport interface NetIo {\n read(fd: number, max: number | undefined, signal: AbortSignal): Promise<Uint8Array>;\n send(fd: number, data: Uint8Array, signal: AbortSignal): Promise<void>;\n close(fd: number): Promise<void>;\n}\n\ninterface InetAddr {\n family: 'inet';\n host: string;\n port: number;\n}\n\nconst SHUT_RD = 0;\nconst SHUT_WR = 1;\nconst IPV4 = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\nconst NEVER = new AbortController().signal;\nconst SOL_SOCKET = 1;\nconst SO_ERROR = 4;\n\nfunction errnoName(errno: number): string {\n const found = Object.entries(E).find(([, n]) => n === errno);\n return found ? `E${found[0]}` : 'EIO';\n}\n\nfunction addressOf(addr: unknown): JsAddress {\n const inet = addr as InetAddr;\n return { host: inet.host, port: inet.port };\n}\n\nfunction port(n: number): number {\n if (!Number.isInteger(n) || n < 0 || n > 65535) throw new JsCallError('EINVAL', `port ${n}`);\n return n;\n}\n\nexport function netOps(kernel: JsKernel, io: NetIo): JsNet {\n const name = async (fd: number, peer: boolean): Promise<JsAddress> =>\n addressOf(await kernel.json({ op: 'sock-name', fd, peer }));\n\n const connection = async (fd: number): Promise<JsConnection> => {\n const [local, remote] = [await name(fd, false), await name(fd, true)];\n const stop = new AbortController();\n let closed: Promise<void> | undefined;\n const close = (): Promise<void> => {\n stop.abort(new JsCallError('EBADF', 'socket closed'));\n closed ??= io.close(fd);\n return closed;\n };\n const shut = (how: number): Promise<unknown> => kernel.raw({ op: 'sock-shutdown', fd, how });\n const readable = new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n const chunk = await io.read(fd, undefined, stop.signal);\n if (chunk.length > 0) controller.enqueue(chunk);\n else controller.close();\n },\n cancel: async () => void (await shut(SHUT_RD)),\n },\n { highWaterMark: 0 }\n );\n const writable = new WritableStream<Uint8Array>({\n write: (chunk, controller) =>\n io.send(fd, chunk, AbortSignal.any([controller.signal, stop.signal])),\n close: async () => void (await shut(SHUT_WR)),\n abort: () => close(),\n });\n return { fd, local, remote, readable, writable, close };\n };\n\n const resolve = async (host: string, signal: AbortSignal): Promise<string> => {\n if (IPV4.test(host)) return host;\n const r = await kernel.blocking({ op: 'sock-resolve', name: host, family: 4 }, signal);\n return ((r.ok && r.kind === 'json' ? r.json : []) as string[])[0] as string;\n };\n\n const opened = async <T>(use: (fd: number) => Promise<T>): Promise<T> => {\n const fd = (await kernel.json({ op: 'sock-open', domain: 'inet' })) as number;\n try {\n return await use(fd);\n } catch (err) {\n await io.close(fd);\n throw err;\n }\n };\n\n const listener = (fd: number, at: JsAddress): JsListener => {\n const stop = new AbortController();\n const accept = async (options: { signal?: AbortSignal } = {}): Promise<JsConnection> => {\n const signal = AbortSignal.any([options.signal ?? NEVER, stop.signal]);\n for (;;) {\n signal.throwIfAborted();\n const r = await kernel.raw({ op: 'sock-accept', fd, nonblock: true });\n if (r.ok) return connection(((r.kind === 'json' ? r.json : {}) as { fd: number }).fd);\n if (r.errno !== 'EAGAIN') throw new JsCallError(r.errno, 'accept');\n await kernel.blocking({ op: 'fd-select', read: [fd], write: [], timeoutMs: -1 }, signal);\n }\n };\n return {\n fd,\n ...at,\n accept,\n async close() {\n stop.abort(new JsCallError('EBADF', 'listener closed'));\n await io.close(fd);\n },\n async *[Symbol.asyncIterator]() {\n for (;;) {\n try {\n yield await accept();\n } catch (err) {\n if (stop.signal.aborted) return;\n throw err;\n }\n }\n },\n };\n };\n\n return {\n listen: (options = {}) =>\n opened(async (fd) => {\n const addr: InetAddr = {\n family: 'inet',\n host: options.host ?? '127.0.0.1',\n port: port(options.port ?? 0),\n };\n await kernel.call({ op: 'sock-bind', fd, addr });\n await kernel.call({ op: 'sock-listen', fd, backlog: options.backlog ?? 128 });\n return listener(fd, await name(fd, false));\n }),\n connect: async (options) => {\n const signal = options.signal ?? NEVER;\n signal.throwIfAborted();\n const host = options.host ?? '127.0.0.1';\n if (host.includes(':')) throw new JsCallError('EADDRNOTAVAIL', host);\n const addr: InetAddr = {\n family: 'inet',\n host: await resolve(host, signal),\n port: port(options.port),\n };\n return opened(async (fd) => {\n const r = await kernel.raw({ op: 'sock-connect', fd, addr, nonblock: true });\n if (!r.ok && r.errno !== 'EINPROGRESS') throw new JsCallError(r.errno, 'connect');\n await kernel.blocking({ op: 'fd-select', read: [], write: [fd], timeoutMs: -1 }, signal);\n const failed = (await kernel.json({\n op: 'sock-getopt',\n fd,\n level: SOL_SOCKET,\n name: SO_ERROR,\n })) as number;\n if (failed !== 0) throw new JsCallError(errnoName(failed), 'connect');\n return connection(fd);\n });\n },\n };\n}\n", "import { argv0Of, groupOf } from './js-children.ts';\nimport { JsCallError } from './js-kernel.ts';\nimport type { JsSyncKernel } from './js-sync.ts';\n\nexport type JsRunStdio = 'pipe' | 'ignore' | 'inherit' | number;\n\nexport interface JsRunOptions {\n argv: readonly string[];\n argv0?: string;\n env?: Readonly<Record<string, string>>;\n cwd?: string;\n pgid?: number;\n session?: boolean;\n input?: Uint8Array | string;\n stdin?: JsRunStdio;\n stdout?: JsRunStdio;\n stderr?: JsRunStdio | 'stdout';\n maxBuffer?: number;\n timeout?: number;\n killSignal?: number | `SIG${string}`;\n}\n\nexport interface JsRunResult {\n pid: number;\n status: number | null;\n signal?: number;\n stdout?: Uint8Array;\n stderr?: Uint8Array;\n error?: { code: string };\n}\n\nexport interface RunDefaults {\n env: Readonly<Record<string, string>>;\n cwd: string;\n resolve(path: string): string;\n signal(name: number | `SIG${string}`): number;\n}\n\ninterface Outcome {\n pid: number;\n status: number | null;\n signal?: number;\n error?: { code: string };\n out: number;\n err: number;\n}\n\nconst encoder = new TextEncoder();\n\nconst STDIO = new Set<unknown>(['pipe', 'ignore', 'inherit']);\n\nfunction stdioOf(how: JsRunStdio | undefined): JsRunStdio {\n if (how === undefined) return 'pipe';\n if (typeof how === 'number' && Number.isInteger(how) && how >= 0) return how;\n if (!STDIO.has(how)) throw new JsCallError('EINVAL', 'run');\n return how;\n}\n\nfunction stderrOf(how: JsRunStdio | 'stdout' | undefined): JsRunStdio | 'stdout' {\n return how === 'stdout' ? how : stdioOf(how);\n}\n\nfunction limit(value: number | undefined): number | undefined {\n if (value === undefined || value === Number.POSITIVE_INFINITY) return value;\n if (!(value >= 0)) throw new JsCallError('EINVAL', 'run');\n return value;\n}\n\nexport function decodeRun(\n bytes: Uint8Array,\n stdout: JsRunStdio,\n stderr: JsRunStdio | 'stdout'\n): JsRunResult {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const size = view.getUint32(0, true);\n const outcome = JSON.parse(new TextDecoder().decode(bytes.subarray(4, 4 + size))) as Outcome;\n const out = bytes.slice(4 + size, 4 + size + outcome.out);\n const err = bytes.slice(4 + size + outcome.out, 4 + size + outcome.out + outcome.err);\n return {\n pid: outcome.pid,\n status: outcome.status,\n ...(outcome.signal !== undefined ? { signal: outcome.signal } : {}),\n ...(stdout === 'pipe' ? { stdout: out } : {}),\n ...(stderr === 'pipe' ? { stderr: err } : {}),\n ...(outcome.error ? { error: outcome.error } : {}),\n };\n}\n\nexport function runSync(kernel: JsSyncKernel, d: RunDefaults, o: JsRunOptions): JsRunResult {\n const [file] = o.argv;\n if (file === undefined) throw new JsCallError('EINVAL', 'run');\n const group = groupOf(o, 'run');\n const named = argv0Of(o.argv0, 'run');\n const stdout = stdioOf(o.stdout);\n const stderr = stderrOf(o.stderr);\n const input = typeof o.input === 'string' ? encoder.encode(o.input) : o.input;\n const maxBuffer = limit(o.maxBuffer);\n const timeout = limit(o.timeout);\n const bytes = kernel.bytes({\n op: 'proc-run',\n file,\n argv: [...o.argv],\n ...named,\n env: { ...(o.env ?? d.env) },\n cwd: o.cwd === undefined ? d.cwd : d.resolve(o.cwd),\n ...group,\n stdin: stdioOf(o.stdin),\n ...(input ? { input } : {}),\n stdout,\n stderr,\n ...(maxBuffer !== undefined && maxBuffer !== Number.POSITIVE_INFINITY ? { maxBuffer } : {}),\n ...(maxBuffer === Number.POSITIVE_INFINITY ? { maxBuffer: Number.MAX_SAFE_INTEGER } : {}),\n ...(timeout !== undefined && timeout !== Number.POSITIVE_INFINITY\n ? { timeoutMs: timeout }\n : {}),\n killSignal: d.signal(o.killSignal ?? 'SIGTERM'),\n });\n return decodeRun(bytes, stdout, stderr);\n}\n", "import { rawWait } from '../kernel/cpu-clock.ts';\nimport {\n parseSyncFsStat,\n parseSyncFsUsage,\n SYNC_FS_OPS,\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsBridgeStat,\n type SyncFsFileIo,\n type SyncFsPosixBridge,\n type SyncFsResult,\n syncError,\n} from './sync-fs-wire.ts';\nimport {\n decodeSabResult,\n loadU53,\n publishMemory,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_OFFSET_HI,\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_I_TOTAL_HI,\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, transfer?: Transferable[]): void;\n}\n\nexport interface SyncSabTransport {\n call(\n req: SyncSabRequestBody,\n timeoutMs: number,\n label: string,\n transfer?: Transferable[]\n ): 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\nconst PATH_OPS: ReadonlySet<string> = new Set(SYNC_FS_OPS);\nlet calls = 0;\n\nexport function syncCallCount(): number {\n return calls;\n}\n\nexport function createSyncSabTransport(\n sab: SharedArrayBuffer,\n port: SabPostLike,\n deps: { wait?: AtomicsWaitLike; now?: () => number; memory?: () => number } = {}\n): SyncSabTransport {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const wait: AtomicsWaitLike = deps.wait ?? ((a, i, v, t) => rawWait(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, transfer = []): SyncFsResult {\n if (deps.memory) publishMemory(sab, deps.memory());\n const id = ++seq;\n calls += Number(!PATH_OPS.has(req.op));\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 if (offset === 0 && transfer.length > 0) port.postMessage(msg, transfer);\n else port.postMessage(msg);\n } catch {\n throw syncError('EIO', label);\n }\n awaitReady(id, deadline, label);\n const total = loadU53(header, SAB_I_TOTAL, SAB_I_TOTAL_HI);\n const chunk = Atomics.load(header, SAB_I_CHUNK);\n const at = loadU53(header, SAB_I_OFFSET, SAB_I_OFFSET_HI);\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; owners?: boolean } = {}\n): SyncFsPosixBridge {\n const timeoutMs = opts.timeoutMs ?? SYNC_FS_REQUEST_TIMEOUT_MS;\n let identity: { identity: true } | Record<string, never> = {};\n let last: SyncFsBridgeStat | null = null;\n\n function run(req: SyncSabRequestBody, path: string, transfer?: Transferable[]): SyncFsResult {\n last = null;\n const result = transport.call(req, timeoutMs, `sync-sab bridge, '${path}'`, transfer);\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 const changing = (req: SyncSabRequestBody, path: string, transfer?: Transferable[]): void => {\n const r = run({ ...req, ...identity }, path, transfer);\n if (r.ok && r.kind === 'json') last = parseSyncFsStat(r.json);\n };\n\n const io = (id: { handle?: number }): SyncFsFileIo => ({\n readFile: (path) => bytes({ op: 'read', path, ...id }, path),\n writeFile: (path, data, open) => {\n changing({ op: 'write', path, body: data, ...(open ? { mode: 1 } : {}), ...id }, path);\n },\n pread: (path, offset, length, version) =>\n bytes({ op: 'pread', path, offset, length, ...(version ? { version } : {}), ...id }, path),\n pwrite: (path, offset, body, transfer) => {\n const whole = body.byteOffset === 0 && body.byteLength === body.buffer.byteLength;\n const owned = transfer && whole && body.buffer instanceof ArrayBuffer;\n const transferred = owned ? [body.buffer as ArrayBuffer] : [];\n changing({ op: 'pwrite', path, offset, body, ...id }, path, transferred);\n },\n truncate: (path, length) => {\n changing({ op: 'truncate', path, length, ...id }, path);\n },\n });\n\n return {\n ...io({}),\n pinned: (handle) => io({ handle }),\n kept: (handle) => json({ op: 'kept', path: '/', handle }, '/') === true,\n keptStat: (handle) => {\n const s = parseSyncFsStat(json({ op: 'stat', path: '/', handle }, '/'));\n if (!s) throw errnoError('EIO', '/');\n return s;\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, mode) => {\n run({ op: 'mkdir', path, exclusive: true, ...(mode !== undefined ? { mode } : {}) }, 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 link: (from, to, follow) => {\n run({ op: 'link', path: from, arg2: to, ...(follow ? { mode: 1 } : {}) }, 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 changing({ op: 'chmod', path, mode }, path);\n },\n utimes: (path, atimeMs, mtimeMs, now) => {\n changing({ op: 'utimes', path, atimeMs, mtimeMs, ...(now ? { now } : {}) }, path);\n },\n identify: () => {\n identity = { identity: true };\n },\n identified: () => last,\n lutimes: (path, atimeMs, mtimeMs, now) => {\n run({ op: 'lutimes', path, atimeMs, mtimeMs, ...(now ? { now } : {}) }, path);\n },\n create: (path, mode) => {\n run({ op: 'create', path, ...(mode !== undefined ? { mode } : {}) }, path);\n },\n chown: (path, uid, gid, follow) => {\n const ids = { ...(uid !== undefined ? { uid } : {}), ...(gid !== undefined ? { gid } : {}) };\n changing({ op: follow ? 'chown' : 'lchown', path, ...ids }, path);\n },\n ...(opts.owners ? { owners: true } : {}),\n access: (path, mode, kind = 'access', nofollow) => {\n run({ op: 'access', path, mode, arg2: kind, ...(nofollow ? { nofollow } : {}) }, path);\n },\n hold: (path, held, open, handle, want = 0) => {\n const mode = (held ? 1 : 0) | (open ? 2 : 0);\n if (mode === 3) return json({ op: 'hold', path, mode: mode | want }, path) as number;\n run({ op: 'hold', path, mode, ...(handle !== undefined ? { handle } : {}) }, path);\n return undefined;\n },\n statfs: (path = '/') => parseSyncFsUsage(json({ op: 'statfs', path }, path)),\n };\n}\n", "import type { JsLane } from '../../kernel/protocol.ts';\nimport { SIG } from '../../kernel/signals.ts';\nimport {\n parseSyncFsStat,\n type SyncFsBridgeStat,\n type SyncFsResult,\n} from '../../realm/sync-fs-wire.ts';\nimport { createSyncSabTransport } from '../../realm/sync-sab-bridge.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport {\n devExists,\n devOpen,\n devReaddir,\n devReadlink,\n devStat,\n devSync,\n inDev,\n readWholeSync,\n streamSyncFile,\n} from './js-dev.ts';\nimport {\n absent,\n brokenPipe,\n CHUNK,\n checkOpen,\n type FdInfo,\n fileWrite,\n index,\n isExclusive,\n type JsOpenOptions,\n joined,\n MAX_IO,\n openRequest,\n readDevice,\n writeDevice,\n written,\n} from './js-io.ts';\nimport { callError, JsCallError, type JsKernel } from './js-kernel.ts';\nimport type { JsRunOptions, JsRunResult } from './js-run.ts';\n\nexport type SyncCall = (req: SyncSabRequestBody) => SyncFsResult;\n\nexport interface JsSyncFile {\n readonly fd: number;\n readonly path: string;\n size(): number;\n read(position: number, length: number): Uint8Array;\n write(position: number, data: Uint8Array): number;\n truncate(size: number): void;\n sync(): void;\n close(): void;\n}\n\nexport interface JsSyncContext {\n run(options: JsRunOptions): JsRunResult;\n exit(status?: number): never;\n kill(pid: number, signal?: number | `SIG${string}`): void;\n read(fd: number, max?: number): Uint8Array;\n write(fd: number, data: Uint8Array | string): void;\n close(fd: number): void;\n open(path: string, options?: JsOpenOptions): JsSyncFile;\n fs: {\n stat(path: string): SyncFsBridgeStat;\n lstat(path: string): SyncFsBridgeStat;\n exists(path: string): boolean;\n readdir(path: string): string[];\n mkdir(path: string): void;\n rm(path: string): void;\n unlink(path: string): void;\n rename(from: string, to: string): void;\n link(from: string, to: string): void;\n symlink(target: string, path: string): void;\n readlink(path: string): string;\n readFile(path: string): Uint8Array;\n writeFile(path: string, data: Uint8Array | string): void;\n };\n}\n\nexport interface SyncShared {\n pid: number;\n resolve(path: string): string;\n random(bytes: Uint8Array): void;\n infos: Map<number, FdInfo>;\n handles: Map<number, () => void>;\n}\n\nconst encoder = new TextEncoder();\n\nexport const noLane: SyncCall = () => ({ ok: false, errno: 'ENOSYS', message: 'no sync lane' });\n\nexport function laneOf(lane: JsLane | undefined): SyncCall {\n if (!lane) return noLane;\n const transport = createSyncSabTransport(lane.sab, lane.port);\n return (req) => transport.call(req, Number.POSITIVE_INFINITY, req.op);\n}\n\nexport class JsSyncKernel {\n private readonly lane: SyncCall;\n private readonly kernel: Pick<JsKernel, 'deliver'>;\n private readonly unwind: () => void;\n\n constructor(lane: SyncCall, kernel: Pick<JsKernel, 'deliver'>, unwind: () => void = () => {}) {\n this.lane = lane;\n this.kernel = kernel;\n this.unwind = unwind;\n }\n\n raw(req: SyncSabRequestBody): SyncFsResult {\n this.unwind();\n const result = this.lane(req);\n this.kernel.deliver();\n this.unwind();\n return result;\n }\n\n call(req: SyncSabRequestBody): SyncFsResult {\n const result = this.raw(req);\n if (!result.ok) throw callError(result, req.op);\n return result;\n }\n\n json(req: SyncSabRequestBody): unknown {\n const result = this.call(req);\n return result.ok && result.kind === 'json' ? result.json : undefined;\n }\n\n bytes(req: SyncSabRequestBody): Uint8Array {\n const result = this.call(req);\n return result.ok && result.kind === 'bytes' ? result.bytes : new Uint8Array(0);\n }\n\n blocking(req: SyncSabRequestBody): SyncFsResult {\n for (;;) {\n const result = this.raw(req);\n if (result.ok) return result;\n if (result.errno !== 'EINTR') throw callError(result, req.op);\n }\n }\n}\n\nexport function syncOps(\n kernel: JsSyncKernel,\n shared: SyncShared\n): Omit<JsSyncContext, 'run' | 'exit' | 'kill'> {\n const { infos, handles, resolve } = shared;\n\n const info = (fd: number): FdInfo => {\n const known = infos.get(fd);\n if (known) return known;\n const got = kernel.json({ op: 'fd-info', fd }) as FdInfo;\n infos.set(fd, got);\n return got;\n };\n\n const read = (fd: number, max = CHUNK): Uint8Array => {\n index(max, 'read');\n const emulated = readDevice(info(fd), max, shared.random);\n if (emulated) return emulated;\n const r = kernel.blocking({ op: 'fd-read', fd, max: Math.min(max, MAX_IO) });\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n };\n\n const write = (fd: number, data: Uint8Array | string): void => {\n const bytes = typeof data === 'string' ? encoder.encode(data) : data;\n const i = info(fd);\n if (writeDevice(i)) return;\n let at = 0;\n while (at < bytes.length) {\n const body = bytes.subarray(at, at + MAX_IO);\n try {\n at += written(kernel.blocking({ op: 'fd-write', fd, body }), body.length);\n } catch (err) {\n if (brokenPipe(err, i)) kernel.call({ op: 'proc-kill', pid: shared.pid, sig: SIG.PIPE });\n throw err;\n }\n }\n };\n\n const statOf = (op: 'stat' | 'lstat', path: string): SyncFsBridgeStat => {\n const abs = resolve(path);\n if (inDev(abs)) return devSync(kernel, devStat(abs, op === 'stat'));\n kernel.call({ op: 'fd-path-flush', path: abs });\n const s = parseSyncFsStat(kernel.json({ op, path: abs }));\n if (!s) throw new JsCallError('EIO', op);\n return s;\n };\n\n const openDev = (abs: string, options: JsOpenOptions): JsSyncFile => {\n const { fd, file, ...access } = devSync(kernel, devOpen(abs, options));\n const forget = () => {\n infos.delete(fd);\n handles.delete(fd);\n };\n if (file) infos.set(fd, { kind: 'file' });\n const close = (n: number) => {\n forget();\n kernel.call({ op: 'fd-close', fd: n });\n };\n const handle = file\n ? syncFile(kernel, fd, abs, options.append === true, forget)\n : streamSyncFile(fd, abs, { read: (n, max) => read(n, max), write, close }, access);\n handles.set(fd, handle.invalidate);\n return handle.file;\n };\n\n const open = (path: string, options: JsOpenOptions = {}): JsSyncFile => {\n const abs = resolve(path);\n if (inDev(abs)) return openDev(abs, options);\n let existing: SyncFsBridgeStat | undefined;\n try {\n existing = statOf(isExclusive(options) ? 'lstat' : 'stat', abs);\n } catch (err) {\n existing = absent(err);\n }\n checkOpen(abs, options, existing);\n const fd = kernel.json(openRequest(abs, options)) as number;\n try {\n kernel.call({ op: 'fd-vfs-stat', fd });\n } catch (err) {\n kernel.raw({ op: 'fd-close', fd });\n throw err;\n }\n infos.set(fd, { kind: 'file' });\n const handle = syncFile(kernel, fd, abs, options.append === true, () => {\n infos.delete(fd);\n handles.delete(fd);\n });\n handles.set(fd, handle.invalidate);\n return handle.file;\n };\n\n return {\n read,\n write,\n close(fd) {\n handles.get(fd)?.();\n handles.delete(fd);\n infos.delete(fd);\n kernel.call({ op: 'fd-close', fd });\n },\n open,\n fs: syncPathOps(kernel, resolve, statOf, open),\n };\n}\n\nfunction syncFile(\n kernel: JsSyncKernel,\n fd: number,\n path: string,\n append: boolean,\n forget: () => void\n): { file: JsSyncFile; invalidate: () => void } {\n let open = true;\n const live = (): void => {\n if (!open) throw new JsCallError('EBADF', path);\n };\n const file: JsSyncFile = {\n fd,\n path,\n size() {\n live();\n return (kernel.json({ op: 'fd-vfs-stat', fd }) as { size: number }).size;\n },\n read(position, length) {\n index(position, 'read');\n index(length, 'read');\n const parts: Uint8Array[] = [];\n let got = 0;\n do {\n live();\n const max = Math.min(length - got, MAX_IO);\n if (max <= 0) break;\n const chunk = kernel.bytes({ op: 'fd-pread', fd, offset: position + got, max });\n if (chunk.length === 0) break;\n parts.push(chunk);\n got += chunk.length;\n } while (got < length);\n return joined(parts, got);\n },\n write(position, data) {\n index(position, 'write');\n let at = 0;\n do {\n live();\n if (at >= data.length) break;\n const body = data.subarray(at, at + MAX_IO);\n const n = kernel.json(fileWrite(fd, append, position + at, body)) as number;\n if (!(n > 0)) throw new JsCallError('EIO', 'write');\n at += n;\n } while (at < data.length);\n return at;\n },\n truncate(size) {\n live();\n index(size, 'truncate');\n kernel.call({ op: 'fd-resize', fd, size });\n },\n sync() {\n live();\n kernel.call({ op: 'fd-flush', fd });\n },\n close() {\n live();\n open = false;\n forget();\n kernel.call({ op: 'fd-close', fd });\n },\n };\n return {\n file,\n invalidate: () => {\n open = false;\n },\n };\n}\n\nfunction syncPathOps(\n kernel: JsSyncKernel,\n resolve: (path: string) => string,\n statOf: (op: 'stat' | 'lstat', path: string) => SyncFsBridgeStat,\n open: (path: string, options?: JsOpenOptions) => JsSyncFile\n): JsSyncContext['fs'] {\n return {\n stat: (path) => statOf('stat', path),\n lstat: (path) => statOf('lstat', path),\n exists(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devSync(kernel, devExists(abs));\n return kernel.json({ op: 'exists', path: abs }) === true;\n },\n readdir(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devSync(kernel, devReaddir(abs));\n return kernel.json({ op: 'readdir', path: abs }) as string[];\n },\n mkdir: (path) => void kernel.call({ op: 'mkdir', path: resolve(path) }),\n rm: (path) => void kernel.call({ op: 'rm', path: resolve(path) }),\n unlink: (path) => void kernel.call({ op: 'unlink', path: resolve(path) }),\n rename: (from, to) =>\n void kernel.call({ op: 'rename', path: resolve(from), arg2: resolve(to) }),\n link: (from, to) => void kernel.call({ op: 'link', path: resolve(from), arg2: resolve(to) }),\n symlink: (target, path) =>\n void kernel.call({ op: 'symlink', path: resolve(path), arg2: target }),\n readlink(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devSync(kernel, devReadlink(abs));\n return String(kernel.json({ op: 'readlink', path: abs }));\n },\n readFile(path) {\n const abs = resolve(path);\n if (inDev(abs)) return readWholeSync(open(abs));\n kernel.call({ op: 'fd-path-flush', path: abs });\n return kernel.bytes({ op: 'read', path: abs });\n },\n writeFile(path, data) {\n const file = open(path, { write: true, create: true, truncate: true });\n try {\n file.write(0, typeof data === 'string' ? encoder.encode(data) : data);\n } finally {\n file.close();\n }\n },\n };\n}\n", "import type { FdInfo } from './js-io.ts';\nimport type { JsKernel } from './js-kernel.ts';\n\nexport interface JsTermios {\n c_iflag: number;\n c_oflag: number;\n c_cflag: number;\n c_lflag: number;\n c_cc: number[];\n}\n\nexport interface JsTtySize {\n columns: number;\n rows: number;\n}\n\nexport interface JsTty {\n getAttr(fd: number): Promise<JsTermios>;\n setAttr(fd: number, termios: JsTermios): Promise<void>;\n setRaw(fd: number, raw: boolean): Promise<void>;\n size(fd: number): Promise<JsTtySize>;\n foreground(fd: number): Promise<number>;\n setForeground(fd: number, pgrp: number): Promise<void>;\n}\n\nconst BRKINT = 0o2;\nconst INPCK = 0o20;\nconst ISTRIP = 0o40;\nconst ICRNL = 0o400;\nconst IXON = 0o2000;\nconst ONLCR = 0o4;\nconst CS8 = 0o60;\nconst ISIG = 0o1;\nconst ICANON = 0o2;\nconst ECHO = 0o10;\nconst IEXTEN = 0o100000;\nconst VTIME = 5;\nconst VMIN = 6;\n\nfunction copy(termios: JsTermios): JsTermios {\n return { ...termios, c_cc: [...termios.c_cc] };\n}\n\nexport function rawOf(termios: JsTermios): JsTermios {\n const raw = copy(termios);\n raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);\n raw.c_oflag |= ONLCR;\n raw.c_cflag |= CS8;\n raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);\n raw.c_cc[VMIN] = 1;\n raw.c_cc[VTIME] = 0;\n return raw;\n}\n\nexport function ttyOps(kernel: JsKernel): {\n tty: JsTty;\n restore(): Promise<void>;\n modes(): Array<{ terminal: string; fd: number; termios: JsTermios }>;\n} {\n const saved = new Map<string, { fd: number; termios: JsTermios }>();\n const terminalOf = async (fd: number): Promise<string> =>\n ((await kernel.json({ op: 'fd-info', fd })) as FdInfo).terminal ?? `fd ${fd}`;\n\n const getAttr = async (fd: number): Promise<JsTermios> =>\n (await kernel.json({ op: 'tty-get', fd })) as JsTermios;\n const setAttr = async (fd: number, termios: JsTermios): Promise<void> => {\n await kernel.call({ op: 'tty-set', fd, termios: copy(termios) });\n };\n\n const tty: JsTty = {\n getAttr,\n setAttr,\n async setRaw(fd, raw) {\n const terminal = await terminalOf(fd);\n if (!raw) {\n const original = saved.get(terminal);\n saved.delete(terminal);\n if (original) await setAttr(fd, original.termios);\n return;\n }\n const current = await getAttr(fd);\n if (!saved.has(terminal)) saved.set(terminal, { fd, termios: current });\n await setAttr(fd, rawOf(current));\n },\n async size(fd) {\n const [rows, columns] = (await kernel.json({ op: 'tty-winsz', fd })) as [number, number];\n return { columns, rows };\n },\n foreground: async (fd) => (await kernel.json({ op: 'tty-pgrp-get', fd })) as number,\n async setForeground(fd, pgrp) {\n await kernel.call({ op: 'tty-pgrp-set', fd, pgrp });\n },\n };\n\n const openOn = async (terminal: string, fd: number): Promise<number | undefined> => {\n const open = (await kernel.json({ op: 'fd-list' })) as Array<FdInfo & { fd: number }>;\n const on = open.filter((entry) => entry.terminal === terminal);\n return (on.find((entry) => entry.fd === fd) ?? on[0])?.fd;\n };\n const reopened = async (terminal: string, termios: JsTermios): Promise<void> => {\n const fd = (await kernel.json({ op: 'fd-open-tty', name: terminal })) as number;\n try {\n await setAttr(fd, termios);\n } finally {\n await kernel.call({ op: 'fd-close', fd });\n }\n };\n const restore = async (): Promise<void> => {\n for (const [terminal, { fd, termios }] of [...saved].reverse()) {\n saved.delete(terminal);\n const at = await openOn(terminal, fd).catch(() => undefined);\n const back = at === undefined ? reopened(terminal, termios) : setAttr(at, termios);\n await back.catch(() => undefined);\n }\n };\n\n const modes = () =>\n [...saved].reverse().map(([terminal, { fd, termios }]) => ({ terminal, fd, termios }));\n return { tty, restore, modes };\n}\n", "import { JsCallError, type JsKernel } from './js-kernel.ts';\n\nexport type JsWebSocketMessage = string | Uint8Array;\n\nexport interface JsWebSocketClose {\n code: number;\n reason: string;\n}\n\nexport interface JsWebSocketOptions {\n protocols?: string | string[];\n headers?: HeadersInit;\n signal?: AbortSignal;\n}\n\nexport interface JsWebSocket {\n readonly url: string;\n readonly protocol: string;\n readonly readable: ReadableStream<JsWebSocketMessage>;\n readonly writable: WritableStream<JsWebSocketMessage>;\n readonly closed: Promise<JsWebSocketClose>;\n close(close?: Partial<JsWebSocketClose>): void;\n}\n\nconst SEND_BUFFER = 1024 * 1024;\nconst MAX_REASON = 123;\nconst NEVER = new AbortController().signal;\n\nfunction failed(err: unknown): TypeError {\n return new TypeError('websocket failed', { cause: err });\n}\n\nfunction socketUrl(input: string | URL): string {\n const url = new URL(input);\n if (url.protocol === 'http:') url.protocol = 'ws:';\n else if (url.protocol === 'https:') url.protocol = 'wss:';\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new SyntaxError(`not a WebSocket URL: ${url.href}`);\n }\n url.hash = '';\n return url.href;\n}\n\nfunction closeCode(code: number | undefined): number {\n if (code === undefined) return 1000;\n if (code === 1000 || (code >= 3000 && code <= 4999)) return code;\n throw new JsCallError('EINVAL', `close code ${code}`);\n}\n\nfunction closeReason(reason: string | undefined): string {\n if (reason === undefined) return '';\n if (new TextEncoder().encode(reason).length > MAX_REASON) {\n throw new JsCallError('EINVAL', `close reason over ${MAX_REASON} bytes`);\n }\n return reason;\n}\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function websocketOp(kernel: JsKernel) {\n return async (input: string | URL, options: JsWebSocketOptions = {}): Promise<JsWebSocket> => {\n const url = socketUrl(input);\n const signal = options.signal ?? NEVER;\n signal.throwIfAborted();\n const protocols =\n typeof options.protocols === 'string' ? [options.protocols] : (options.protocols ?? []);\n const handle = (await kernel.json({\n op: 'net-ws-open',\n url,\n protocols,\n headers: [...new Headers(options.headers)],\n })) as number;\n const free = () => kernel.raw({ op: 'net-close', handle });\n let protocol: string;\n try {\n const r = await kernel.blocking({ op: 'net-ws-ready', handle }, signal);\n protocol = ((r.ok && r.kind === 'json' ? r.json : {}) as { protocol: string }).protocol;\n } catch (err) {\n await free();\n throw signal.aborted ? signal.reason : failed(err);\n }\n\n let settle!: (close: JsWebSocketClose) => void;\n let lose!: (err: unknown) => void;\n const closed = new Promise<JsWebSocketClose>((resolve, reject) => {\n settle = resolve;\n lose = reject;\n });\n closed.catch(() => undefined);\n const stop = new AbortController();\n let freed = false;\n const onAbort = (): void => hardStop(signal.reason);\n const finish = (): void => {\n freed = true;\n signal.removeEventListener('abort', onAbort);\n void free();\n };\n const hardStop = (reason: unknown): void => {\n if (stop.signal.aborted) return;\n stop.abort(reason);\n lose(reason);\n finish();\n };\n signal.addEventListener('abort', onAbort, { once: true });\n let settled = false;\n let readDone = false;\n const release = (): void => {\n if (!settled || !readDone || freed) return;\n finish();\n };\n kernel\n .blocking({ op: 'net-ws-wait', handle }, stop.signal)\n .then((r) => {\n settled = true;\n settle((r as Extract<typeof r, { kind: 'json' }>).json as JsWebSocketClose);\n release();\n })\n .catch(lose);\n const close = (how: Partial<JsWebSocketClose> = {}): void => {\n void kernel.raw({\n op: 'net-ws-close',\n handle,\n code: closeCode(how.code),\n reason: closeReason(how.reason),\n });\n };\n\n const readable = new ReadableStream<JsWebSocketMessage>(\n {\n async pull(controller) {\n let r: Awaited<ReturnType<JsKernel['blocking']>>;\n try {\n r = await kernel.blocking({ op: 'net-ws-recv', handle }, stop.signal);\n } catch (err) {\n hardStop(stop.signal.aborted ? stop.signal.reason : failed(err));\n throw stop.signal.reason;\n }\n stop.signal.throwIfAborted();\n if (r.ok && r.kind === 'bytes') {\n controller.enqueue(r.bytes);\n return;\n }\n const text = ((r.ok && r.kind === 'json' ? r.json : {}) as { text?: string }).text;\n if (text !== undefined) {\n controller.enqueue(text);\n return;\n }\n controller.close();\n readDone = true;\n release();\n },\n cancel: () => {\n close();\n readDone = true;\n release();\n },\n },\n { highWaterMark: 0 }\n );\n\n const writable = new WritableStream<JsWebSocketMessage>({\n async write(chunk, controller) {\n stop.signal.throwIfAborted();\n const send = async (body: object): Promise<number> => {\n if (settled) throw new JsCallError('EPIPE', 'the websocket is closed');\n return (await kernel.json({ op: 'net-ws-send', handle, ...body })) as number;\n };\n let buffered = await send(typeof chunk === 'string' ? { text: chunk } : { body: chunk });\n while (buffered > SEND_BUFFER) {\n await wait(10);\n stop.signal.throwIfAborted();\n controller.signal.throwIfAborted();\n buffered = await send({});\n }\n },\n close: () => close(),\n abort: () => close({ code: 1000, reason: '' }),\n });\n\n return { url, protocol, readable, writable, closed, close };\n };\n}\n", "import { SIG } from '../../kernel/signals.ts';\nimport { parseSyncFsStat, type SyncFsBridgeStat } from '../../realm/sync-fs-wire.ts';\nimport { childOps, type JsChild, type JsExited, type JsSpawnOptions } from './js-children.ts';\nimport {\n devAsync,\n devExists,\n devOpen,\n devReaddir,\n devReadlink,\n devStat,\n inDev,\n readWhole,\n streamFile,\n} from './js-dev.ts';\nimport { exitAtOnce, type PendingWrite, type SavedMode } from './js-exit.ts';\nimport { fetchOp } from './js-fetch.ts';\nimport {\n absent,\n brokenPipe,\n CHUNK,\n checkOpen,\n type FdInfo,\n fileWrite,\n index,\n isExclusive,\n type JsFdType,\n type JsOpenOptions,\n joined,\n MAX_IO,\n openRequest,\n readDevice,\n typeOf,\n writeDevice,\n written,\n} from './js-io.ts';\nimport { callError, JsCallError, type JsKernel } from './js-kernel.ts';\nimport { type JsNet, netOps } from './js-net.ts';\nimport { runSync } from './js-run.ts';\nimport {\n type JsSyncContext,\n JsSyncKernel,\n laneOf,\n noLane,\n type SyncCall,\n syncOps,\n} from './js-sync.ts';\nimport { type JsTty, ttyOps } from './js-tty.ts';\nimport { type JsWebSocket, type JsWebSocketOptions, websocketOp } from './js-websocket.ts';\n\nexport type { JsFdType, JsOpenOptions } from './js-io.ts';\n\nexport interface JsFile {\n readonly fd: number;\n readonly path: string;\n size(): Promise<number>;\n read(position: number, length: number): Promise<Uint8Array>;\n write(position: number, data: Uint8Array): Promise<number>;\n truncate(size: number): Promise<void>;\n sync(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface JsFdStatus {\n type: JsFdType;\n tty: boolean;\n seekable: boolean;\n}\n\nexport type JsSignal = number | `SIG${string}`;\n\nexport interface JsProgramContext {\n readonly argv: readonly string[];\n readonly env: Readonly<Record<string, string>>;\n readonly pid: number;\n ppid(): Promise<number>;\n readonly cwd: string;\n readonly stdin: ReadableStream<Uint8Array>;\n readonly stdout: WritableStream<Uint8Array>;\n readonly stderr: WritableStream<Uint8Array>;\n read(fd: number, max?: number): Promise<Uint8Array>;\n write(fd: number, data: Uint8Array | string): Promise<void>;\n close(fd: number): Promise<void>;\n fdStatus(fd: number): Promise<JsFdStatus>;\n isatty(fd: number): Promise<boolean>;\n open(path: string, options?: JsOpenOptions): Promise<JsFile>;\n resolve(path: string): string;\n fs: {\n stat(path: string): Promise<SyncFsBridgeStat>;\n lstat(path: string): Promise<SyncFsBridgeStat>;\n exists(path: string): Promise<boolean>;\n readdir(path: string): Promise<string[]>;\n mkdir(path: string): Promise<void>;\n rm(path: string): Promise<void>;\n unlink(path: string): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n link(from: string, to: string): Promise<void>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n readFile(path: string): Promise<Uint8Array>;\n writeFile(path: string, data: Uint8Array | string): Promise<void>;\n };\n signals: {\n on(signal: JsSignal, handler: (signal: number) => void): Promise<void>;\n ignore(signal: JsSignal): Promise<void>;\n reset(signal: JsSignal): Promise<void>;\n };\n sync: JsSyncContext;\n spawn(options: JsSpawnOptions): Promise<JsChild>;\n wait(pid: number): Promise<JsExited>;\n kill(pid: number, signal?: JsSignal): Promise<void>;\n sudo(args: readonly string[]): Promise<JsSudoAnswer>;\n net: JsNet;\n websocket(url: string | URL, options?: JsWebSocketOptions): Promise<JsWebSocket>;\n tty: JsTty;\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n exit(code?: number): never;\n onUncaught(listener: JsStrayListener): () => void;\n onUnhandledRejection(listener: JsStrayListener): () => void;\n}\n\nexport type JsSudoAnswer =\n | { error: string; errno: string }\n | { list: string }\n | { run: string[] }\n | { pid: number };\n\nexport type JsStrayListener = (error: unknown, promise?: Promise<unknown>) => void;\n\nexport interface JsStrays {\n exception: Set<JsStrayListener>;\n rejection: Set<JsStrayListener>;\n}\n\nfunction listen(listeners: Set<JsStrayListener>, listener: JsStrayListener): () => void {\n const own = (error: unknown, promise?: Promise<unknown>) => listener(error, promise);\n listeners.add(own);\n return () => void listeners.delete(own);\n}\n\nexport class JsExit extends Error {\n readonly status: number;\n\n constructor(status: number) {\n super(`exit ${status}`);\n this.name = 'JsExit';\n this.status = status;\n }\n}\n\nexport interface ContextOptions {\n kernel: JsKernel;\n argv: readonly string[];\n env: Readonly<Record<string, string>>;\n pid: number;\n ppid: number;\n cwd: string;\n exit(status: number): void;\n random?: (bytes: Uint8Array) => void;\n lane?: SyncCall;\n strays?: JsStrays;\n}\n\nconst encoder = new TextEncoder();\n\nexport interface Identity {\n pid: number;\n ppid: number;\n}\n\nexport function identityOf(answer: unknown, fallback: { pid: number; ppid?: number }): Identity {\n const id = answer as Partial<Identity> | null;\n return {\n pid: typeof id?.pid === 'number' ? id.pid : fallback.pid,\n ppid: typeof id?.ppid === 'number' ? id.ppid : (fallback.ppid ?? 1),\n };\n}\n\nexport function signalNumber(signal: JsSignal): number {\n if (typeof signal === 'number') {\n if (Number.isInteger(signal) && signal >= 1 && signal <= 31) return signal;\n throw new JsCallError('EINVAL', `signal ${signal}`);\n }\n const n = (SIG as Record<string, number>)[signal.slice(3)];\n if (n === undefined) throw new JsCallError('EINVAL', `signal ${signal}`);\n return n;\n}\n\nexport function resolvePath(cwd: string, path: string): string {\n const parts: string[] = [];\n for (const part of (path.startsWith('/') ? path : `${cwd}/${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 interface CreatedContext {\n ctx: JsProgramContext;\n drain(): Promise<unknown>;\n}\n\ninterface KillerDeps {\n self: number;\n kernel: JsKernel;\n syncKernel: JsSyncKernel;\n lane: SyncCall;\n writes: Set<PendingWrite>;\n modes: () => SavedMode[];\n}\n\nfunction killer(d: KillerDeps): JsSyncContext['kill'] {\n return (pid, signal = 'SIGTERM') => {\n const sig = signal === 0 ? 0 : signalNumber(signal);\n const self = sig !== 0 && includesSelf(d.syncKernel, d.self, pid);\n if (!self || d.kernel.disposition(sig) !== 'terminate') {\n d.syncKernel.call({ op: 'proc-kill', pid, sig });\n return;\n }\n const target = pid === d.self ? {} : { target: pid };\n const r = d.lane({ op: 'proc-kill-self', sig, ...target, probe: true });\n if (!r.ok) throw new JsCallError(r.errno, 'kill');\n if (r.kind === 'void') return;\n exitAtOnce(d.lane, [...d.writes], d.modes(), 128 + sig, {\n op: 'proc-kill-self',\n sig,\n ...target,\n });\n };\n}\n\nfunction includesSelf(kernel: JsSyncKernel, self: number, pid: number): boolean {\n if (pid === self || pid === 0) return true;\n if (pid > 0 || pid === -1) return false;\n return kernel.json({ op: 'proc-getpgid', pid: 0 }) === -pid;\n}\n\nfunction writer(kernel: JsKernel, info: (fd: number) => Promise<FdInfo>, pid: number) {\n const writes = new Set<PendingWrite>();\n const sendAll = async (\n fd: number,\n data: Uint8Array,\n i: FdInfo,\n w: PendingWrite,\n signal?: AbortSignal\n ): Promise<void> => {\n while (w.at < data.length) {\n const body = data.subarray(w.at, w.at + MAX_IO);\n w.len = body.length;\n try {\n w.at += signal\n ? await sendSome(kernel, fd, body, signal)\n : written(\n await kernel.blocking({ op: 'fd-write', fd, body }, undefined, (id) => {\n if (w.op !== undefined) kernel.ack(w.op);\n w.op = id;\n }),\n body.length\n );\n if (w.op !== undefined) kernel.ack(w.op);\n w.op = undefined;\n } catch (err) {\n if (brokenPipe(err, i)) await kernel.call({ op: 'proc-kill', pid, sig: SIG.PIPE });\n throw err;\n }\n }\n };\n const writeAll = async (fd: number, data: Uint8Array, signal?: AbortSignal): Promise<void> => {\n const w: PendingWrite = { fd, data, at: 0, len: 0 };\n if (!signal) writes.add(w);\n try {\n const i = await info(fd);\n if (writeDevice(i)) return;\n await sendAll(fd, data, i, w, signal);\n } finally {\n writes.delete(w);\n }\n };\n\n return { writes, writeAll };\n}\n\nexport function createContext(o: ContextOptions): CreatedContext {\n const { kernel } = o;\n const infos = new Map<number, FdInfo>();\n const handles = new Map<number, () => void>();\n const pending = new Set<Promise<unknown>>();\n const random =\n o.random ??\n ((bytes: Uint8Array) => void crypto.getRandomValues(bytes as Uint8Array<ArrayBuffer>));\n const resolve = (path: string) => resolvePath(o.cwd, path);\n let exiting: number | undefined;\n const exit = (code = 0): never => {\n exiting ??= code;\n o.exit(code);\n throw new JsExit(code);\n };\n const unwind = (): void => {\n if (exiting !== undefined) throw new JsExit(exiting);\n if (kernel.faulted) throw new JsExit(1);\n };\n\n const info = async (fd: number): Promise<FdInfo> => {\n const known = infos.get(fd);\n if (known) return known;\n const got = (await kernel.json({ op: 'fd-info', fd })) as FdInfo;\n infos.set(fd, got);\n return got;\n };\n const read = async (fd: number, max = CHUNK, signal?: AbortSignal): Promise<Uint8Array> => {\n index(max, 'read');\n const emulated = readDevice(await info(fd), max, random);\n if (emulated) return emulated;\n return readPipe(kernel, fd, Math.min(max, MAX_IO), signal);\n };\n\n const { writes, writeAll } = writer(kernel, info, o.pid);\n\n const write = (fd: number, data: Uint8Array | string): Promise<void> => {\n const bytes = typeof data === 'string' ? encoder.encode(data) : data;\n let settle!: () => void;\n const settled = new Promise<void>((resolve) => (settle = resolve));\n pending.add(settled);\n return (async () => {\n try {\n await writeAll(fd, bytes);\n } finally {\n pending.delete(settled);\n settle();\n }\n })();\n };\n\n const writable = (fd: number) =>\n new WritableStream<Uint8Array>({ write: (chunk) => write(fd, chunk) });\n\n const statOf = async (op: 'stat' | 'lstat', path: string): Promise<SyncFsBridgeStat> => {\n const abs = resolve(path);\n if (inDev(abs)) return devAsync(kernel, devStat(abs, op === 'stat'));\n await kernel.call({ op: 'fd-path-flush', path: abs });\n const s = parseSyncFsStat(await kernel.json({ op, path: abs }));\n if (!s) throw new JsCallError('EIO', op);\n return s;\n };\n\n const open = async (path: string, options: JsOpenOptions = {}): Promise<JsFile> => {\n const abs = resolve(path);\n if (inDev(abs)) return openDev(kernel, abs, options, { infos, handles, read, write: writeAll });\n const existing = await statOf(isExclusive(options) ? 'lstat' : 'stat', abs).catch(absent);\n checkOpen(abs, options, existing);\n const fd = (await kernel.json(openRequest(abs, options))) as number;\n try {\n await kernel.call({ op: 'fd-vfs-stat', fd });\n } catch (err) {\n await kernel.raw({ op: 'fd-close', fd });\n throw err;\n }\n infos.set(fd, { kind: 'file' });\n const handle = fileHandle(kernel, fd, abs, options.append === true, () => {\n infos.delete(fd);\n handles.delete(fd);\n });\n handles.set(fd, handle.invalidate);\n return handle.file;\n };\n\n const fs = pathOps(kernel, resolve, statOf, open);\n const lane = o.lane ?? laneOf(undefined);\n if (o.lane && o.lane !== noLane) kernel.syncLane = o.lane;\n const syncKernel = new JsSyncKernel(lane, kernel, unwind);\n const terminal = ttyOps(kernel);\n const sync: JsSyncContext = {\n ...syncOps(syncKernel, { pid: o.pid, resolve, random, infos, handles }),\n run: (options) =>\n runSync(syncKernel, { env: o.env, cwd: o.cwd, resolve, signal: signalNumber }, options),\n exit: (status = 0): never => {\n exiting ??= status & 0xff;\n return exitAtOnce(lane, [...writes], terminal.modes(), exiting);\n },\n kill: killer({ self: o.pid, kernel, syncKernel, lane, writes, modes: terminal.modes }),\n };\n\n const io = { read, send: writeAll, close: (fd: number) => ctx.close(fd) };\n const children = childOps(kernel, io, { env: o.env, cwd: o.cwd, signal: signalNumber });\n\n const strays = o.strays ?? { exception: new Set(), rejection: new Set() };\n const ctx: JsProgramContext = {\n argv: o.argv,\n env: o.env,\n pid: o.pid,\n async ppid() {\n return identityOf(await kernel.json({ op: 'proc-identity' }), o).ppid;\n },\n cwd: o.cwd,\n stdin: new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n const chunk = await read(0);\n if (chunk.length === 0) controller.close();\n else controller.enqueue(chunk);\n },\n },\n { highWaterMark: 0 }\n ),\n stdout: writable(1),\n stderr: writable(2),\n read,\n write,\n async close(fd) {\n handles.get(fd)?.();\n handles.delete(fd);\n infos.delete(fd);\n await kernel.call({ op: 'fd-close', fd });\n },\n async fdStatus(fd) {\n const type = typeOf(await info(fd));\n return { type, tty: type === 'tty', seekable: type === 'file' };\n },\n isatty: async (fd) => typeOf(await info(fd)) === 'tty',\n open,\n resolve,\n fs,\n signals: {\n on: async (signal, handler) => kernel.setHandler(signalNumber(signal), handler),\n ignore: async (signal) => kernel.setHandler(signalNumber(signal), 'ignore'),\n reset: async (signal) => kernel.setHandler(signalNumber(signal), 'default'),\n },\n sync,\n fetch: fetchOp(kernel),\n sudo: async (args) =>\n (await kernel.json({\n op: 'proc-sudo',\n args: [...args],\n cwd: o.cwd,\n ...(o.env.TERM !== undefined ? { term: o.env.TERM } : {}),\n })) as JsSudoAnswer,\n ...children,\n net: netOps(kernel, io),\n websocket: websocketOp(kernel),\n tty: terminal.tty,\n exit,\n onUncaught: (listener) => listen(strays.exception, listener),\n onUnhandledRejection: (listener) => listen(strays.rejection, listener),\n };\n const drain = async (): Promise<void> => {\n for (;;) {\n await Promise.all([...pending]);\n await new Promise((resolve) => setTimeout(resolve, 0));\n if (pending.size === 0) break;\n }\n await terminal.restore();\n };\n return { ctx, drain };\n}\n\ninterface DevState {\n infos: Map<number, FdInfo>;\n handles: Map<number, () => void>;\n read(fd: number, max: number): Promise<Uint8Array>;\n write(fd: number, data: Uint8Array): Promise<void>;\n}\n\nasync function openDev(\n kernel: JsKernel,\n abs: string,\n options: JsOpenOptions,\n state: DevState\n): Promise<JsFile> {\n const { fd, file, ...access } = await devAsync(kernel, devOpen(abs, options));\n const forget = () => {\n state.infos.delete(fd);\n state.handles.delete(fd);\n };\n if (file) state.infos.set(fd, { kind: 'file' });\n const close = async (n: number) => {\n forget();\n await kernel.call({ op: 'fd-close', fd: n });\n };\n const handle = file\n ? fileHandle(kernel, fd, abs, options.append === true, forget)\n : streamFile(\n fd,\n abs,\n { read: (n, max) => state.read(n, max), write: state.write, close },\n access\n );\n state.handles.set(fd, handle.invalidate);\n return handle.file;\n}\n\nfunction fileHandle(\n kernel: JsKernel,\n fd: number,\n path: string,\n append: boolean,\n forget: () => void\n): { file: JsFile; invalidate: () => void } {\n let open = true;\n const live = (): void => {\n if (!open) throw new JsCallError('EBADF', path);\n };\n const file: JsFile = {\n fd,\n path,\n async size() {\n live();\n const s = (await kernel.json({ op: 'fd-vfs-stat', fd })) as { size: number };\n return s.size;\n },\n async read(position, length) {\n index(position, 'read');\n index(length, 'read');\n const parts: Uint8Array[] = [];\n let got = 0;\n do {\n live();\n const max = Math.min(length - got, MAX_IO);\n if (max <= 0) break;\n const chunk = await kernel.bytes({ op: 'fd-pread', fd, offset: position + got, max });\n if (chunk.length === 0) break;\n parts.push(chunk);\n got += chunk.length;\n } while (got < length);\n return joined(parts, got);\n },\n async write(position, data) {\n index(position, 'write');\n let at = 0;\n do {\n live();\n if (at >= data.length) break;\n const body = data.subarray(at, at + MAX_IO);\n const n = (await kernel.json(fileWrite(fd, append, position + at, body))) as number;\n if (!(n > 0)) throw new JsCallError('EIO', 'write');\n at += n;\n } while (at < data.length);\n return at;\n },\n async truncate(size) {\n live();\n index(size, 'truncate');\n await kernel.call({ op: 'fd-resize', fd, size });\n },\n async sync() {\n live();\n await kernel.call({ op: 'fd-flush', fd });\n },\n async close() {\n live();\n open = false;\n forget();\n await kernel.call({ op: 'fd-close', fd });\n },\n };\n return {\n file,\n invalidate: () => {\n open = false;\n },\n };\n}\n\nasync function readPipe(\n kernel: JsKernel,\n fd: number,\n max: number,\n signal: AbortSignal | undefined\n): Promise<Uint8Array> {\n if (signal) return receiveSome(kernel, fd, max, signal);\n const r = await kernel.blocking({ op: 'fd-read', fd, max });\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n}\n\nasync function receiveSome(\n kernel: JsKernel,\n fd: number,\n max: number,\n signal: AbortSignal\n): Promise<Uint8Array> {\n for (;;) {\n signal.throwIfAborted();\n const r = await kernel.raw({ op: 'fd-read', fd, max, nonblock: true });\n if (r.ok) return r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n if (r.errno !== 'EAGAIN') throw callError(r, 'fd-read');\n await kernel.blocking({ op: 'fd-select', read: [fd], write: [], timeoutMs: -1 }, signal);\n }\n}\n\nasync function sendSome(\n kernel: JsKernel,\n fd: number,\n body: Uint8Array,\n signal: AbortSignal\n): Promise<number> {\n for (;;) {\n signal.throwIfAborted();\n const r = await kernel.raw({ op: 'fd-write', fd, body, nonblock: true });\n if (r.ok) return written(r, body.length);\n if (r.errno !== 'EAGAIN') throw callError(r, 'fd-write');\n await kernel.blocking({ op: 'fd-select', read: [], write: [fd], timeoutMs: -1 }, signal);\n }\n}\n\nfunction pathOps(\n kernel: JsKernel,\n resolve: (path: string) => string,\n statOf: (op: 'stat' | 'lstat', path: string) => Promise<SyncFsBridgeStat>,\n open: (path: string, options?: JsOpenOptions) => Promise<JsFile>\n): JsProgramContext['fs'] {\n return {\n stat: (path) => statOf('stat', path),\n lstat: (path) => statOf('lstat', path),\n async exists(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devAsync(kernel, devExists(abs));\n return (await kernel.json({ op: 'exists', path: abs })) === true;\n },\n async readdir(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devAsync(kernel, devReaddir(abs));\n return (await kernel.json({ op: 'readdir', path: abs })) as string[];\n },\n mkdir: async (path) => void (await kernel.call({ op: 'mkdir', path: resolve(path) })),\n rm: async (path) => void (await kernel.call({ op: 'rm', path: resolve(path) })),\n unlink: async (path) => void (await kernel.call({ op: 'unlink', path: resolve(path) })),\n rename: async (from, to) =>\n void (await kernel.call({ op: 'rename', path: resolve(from), arg2: resolve(to) })),\n link: async (from, to) =>\n void (await kernel.call({ op: 'link', path: resolve(from), arg2: resolve(to) })),\n symlink: async (target, path) =>\n void (await kernel.call({ op: 'symlink', path: resolve(path), arg2: target })),\n async readlink(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devAsync(kernel, devReadlink(abs));\n return String(await kernel.json({ op: 'readlink', path: abs }));\n },\n async readFile(path) {\n const abs = resolve(path);\n if (inDev(abs)) return readWhole(await open(abs));\n await kernel.call({ op: 'fd-path-flush', path: abs });\n return kernel.bytes({ op: 'read', path: abs });\n },\n async writeFile(path, data) {\n const file = await open(path, { write: true, create: true, truncate: true });\n try {\n await file.write(0, typeof data === 'string' ? encoder.encode(data) : data);\n } finally {\n await file.close();\n }\n },\n };\n}\n", "import type { JsProcessInitMsg } from '../../kernel/protocol.ts';\nimport type { SabPostLike } from '../../realm/sync-sab-bridge.ts';\nimport { importSource } from '../wasi/wasi-imports.ts';\nimport { createAsyncSabTransport, type WaitAsyncLike } from './async-sab.ts';\nimport {\n createContext,\n identityOf,\n JsExit,\n type JsProgramContext,\n type JsStrays,\n} from './js-context.ts';\nimport { JsKernel } from './js-kernel.ts';\nimport { laneOf } from './js-sync.ts';\nimport { lockdown } from './lockdown.ts';\n\nexport type JsMain = (ctx: JsProgramContext) => unknown;\n\nexport interface JsRuntimeDeps {\n waitAsync?: WaitAsyncLike;\n load?: (source: string) => Promise<Record<string, unknown>>;\n lockdown?: () => void;\n scope?: object;\n}\n\nconst NOT_RUNNABLE = 126;\n\ntype StrayKind = keyof JsStrays;\ntype Stray = (kind: StrayKind, err: unknown, promise?: Promise<unknown>) => void;\n\ninterface StrayScope {\n process?: {\n on?: (event: string, listener: (err: unknown, promise?: Promise<unknown>) => void) => void;\n };\n addEventListener?: (\n type: string,\n listener: (event: {\n preventDefault(): void;\n reason?: unknown;\n error?: unknown;\n promise?: Promise<unknown>;\n }) => void\n ) => void;\n}\n\nexport function trapStrays(scope: StrayScope, stray: Stray): void {\n if (typeof scope.process?.on === 'function') {\n scope.process.on('unhandledRejection', (err, promise) => stray('rejection', err, promise));\n scope.process.on('uncaughtException', (err) => stray('exception', err));\n return;\n }\n scope.addEventListener?.('unhandledrejection', (event) => {\n event.preventDefault();\n stray('rejection', event.reason, event.promise);\n });\n scope.addEventListener?.('error', (event) => {\n event.preventDefault();\n stray('exception', event.error);\n });\n}\n\nasync function settledStrays(): Promise<void> {\n for (let turn = 0; turn < 2; turn++) await new Promise((resolve) => setTimeout(resolve, 0));\n}\n\nfunction message(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction statusOf(value: unknown): number {\n return typeof value === 'number' && Number.isInteger(value) ? value & 0xff : 0;\n}\n\nexport function mainOf(module: Record<string, unknown>): JsMain | undefined {\n const main = typeof module.default === 'function' ? module.default : module.main;\n return typeof main === 'function' ? (main as JsMain) : undefined;\n}\n\nexport async function runJsProcess(\n init: JsProcessInitMsg,\n port: SabPostLike,\n deps: JsRuntimeDeps = {}\n): Promise<number> {\n const transport = createAsyncSabTransport(init.sab, port, deps.waitAsync);\n let resolveExit!: (status: number) => void;\n const exit = new Promise<number>((resolve) => (resolveExit = resolve));\n let exitedWith: number | undefined;\n const exited = (status: number): void => {\n exitedWith ??= status;\n resolveExit(status);\n };\n let failing: Promise<void> | undefined;\n const fail = (err: unknown): void => {\n if (err instanceof JsExit) return;\n failing ??= say(message(err)).then(() => exited(1));\n };\n const kernel = new JsKernel({\n sab: init.sab,\n transport,\n onError: fail,\n waitAsync: deps.waitAsync,\n });\n void kernel.watchStops();\n const strays: JsStrays = { exception: new Set(), rejection: new Set() };\n const id = identityOf(await kernel.json({ op: 'proc-identity' }), init);\n kernel.pid = id.pid;\n const { ctx, drain } = createContext({\n kernel,\n argv: [init.argv0, ...init.args],\n env: init.env,\n pid: id.pid,\n ppid: id.ppid,\n cwd: init.cwd,\n exit: (status) => exited(statusOf(status)),\n lane: laneOf(init.lane),\n strays,\n });\n const say = (text: string) => ctx.write(2, `${init.argv0}: ${text}\\n`).catch(() => undefined);\n\n let main: JsMain | undefined;\n trapStrays((deps.scope ?? globalThis) as StrayScope, (kind, err, promise) => {\n const listeners = [...strays[kind]];\n if (listeners.length === 0) return fail(err);\n for (const listener of listeners) {\n try {\n listener(err, promise);\n } catch (thrown) {\n fail(thrown);\n }\n }\n });\n try {\n (deps.lockdown ?? lockdown)();\n main = mainOf(await (deps.load ?? importSource)(init.program.glue));\n } catch (err) {\n await say(message(err));\n return NOT_RUNNABLE;\n }\n if (!main) {\n await say(`${init.program.path} exports no main function`);\n return NOT_RUNNABLE;\n }\n const program = main;\n const ran = Promise.resolve()\n .then(() => program(ctx))\n .then(statusOf, async (err: unknown) => {\n if (err instanceof JsExit) return err.status;\n await say(message(err));\n return 1;\n });\n const status = await Promise.race([ran, exit]);\n await drain();\n await settledStrays();\n await failing;\n if (exitedWith !== undefined) return exitedWith;\n return status;\n}\n", "export const HOST_LOOPBACK = 'host.slicc.internal';\n\nexport const HOST_LOOPBACK_ADDRESS = [10, 0, 2, 2] as const;\n\nexport const PAGE_LOOPBACK = 'kernel.localhost';\n\nexport const PAGE_LOOPBACK_URL = `http://{port}.${PAGE_LOOPBACK}`;\n\nexport function toHostLoopback(href: string): string {\n const url = new URL(href);\n if (url.hostname.replace(/\\.$/, '').toLowerCase() !== HOST_LOOPBACK) return href;\n url.hostname = '127.0.0.1';\n return url.href;\n}\n\nexport const DEFAULT_HOSTNAME = 'slicc';\n\nexport const HOSTNAME_ADDRESS = '127.0.1.1';\n\nexport const LIBC_HOSTNAMES: readonly string[] = ['emscripten', 'wasmer.sh'];\n\nconst LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;\n\nfunction reserved(name: string): boolean {\n const lower = name.toLowerCase();\n return (\n lower === 'localhost' ||\n lower.endsWith('.localhost') ||\n lower === HOST_LOOPBACK ||\n lower === 'wasmer.sh' ||\n /^\\d+(\\.\\d+){3}$/.test(lower)\n );\n}\n\nexport function isHostname(name: unknown): name is string {\n if (typeof name !== 'string' || name.length > 253 || reserved(name)) return false;\n return name.split('.').every((l) => LABEL.test(l));\n}\n\nexport function hostnameOf(env: Readonly<Record<string, string>>): string {\n return isHostname(env.HOSTNAME) ? env.HOSTNAME : DEFAULT_HOSTNAME;\n}\n\nexport function ownNames(hostname: string): string[] {\n return [...new Set([hostname.toLowerCase(), ...LIBC_HOSTNAMES])];\n}\n\nexport function hostsFile(hostname: string = DEFAULT_HOSTNAME): string {\n return [\n '127.0.0.1 localhost localhost.localdomain',\n '::1 localhost ip6-localhost',\n `${HOSTNAME_ADDRESS} ${ownNames(hostname).join(' ')}`,\n `${HOST_LOOPBACK_ADDRESS.join('.')} ${HOST_LOOPBACK}`,\n '',\n ].join('\\n');\n}\n", "import { E } from './wasi/wasi-abi.ts';\n\nconst WASI_ERRNO: Readonly<Partial<Record<string, number>>> = {\n ...Object.fromEntries(Object.entries(E).map(([name, errno]) => [`E${name}`, errno])),\n EWOULDBLOCK: E.AGAIN,\n ENOTSUP: 138,\n EOPNOTSUPP: 138,\n ENOMEDIUM: 148,\n};\n\nexport function wasiErrno(code: string): number {\n return WASI_ERRNO[code] ?? E.IO;\n}\n", "import { RangedFile } from '../fs/ranged.ts';\nimport { inodeOf } from '../fs/types.ts';\nimport { wasiErrno } from '../process/wasi-errno.ts';\nimport {\n HOLD_CREATED,\n HOLD_READ,\n HOLD_WRITE,\n type SyncFsBridgeStat,\n type SyncFsFileIo,\n type SyncFsPosixBridge,\n type SyncFsUsage,\n} from './sync-fs-wire.ts';\nimport { syncCallCount } from './sync-sab-bridge.ts';\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 statAt?: number;\n\n data?: Uint8Array;\n len: number;\n loaded: boolean;\n dirty: boolean;\n openCount: number;\n writers?: number;\n\n orphan?: boolean;\n\n kept?: boolean;\n\n id?: string;\n\n listed?: Map<string, SyncFsBridgeStat>;\n\n maxFile?: number;\n\n ranges?: boolean;\n ranged?: RangedFile;\n handle?: number;\n created?: boolean;\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 fd?: 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 | null;\n mtime?: number | Date | null;\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 closeStream?(fd: number): void;\n sliccTouch?: boolean;\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 flushDirty(): void;\n\n mounts: Set<LiveFsMount>;\n handled?: Set<LiveFsNode>;\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 = wasiErrno(typeof code === 'string' ? code : '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 | null | 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\nconst EARLY_WHOLE_FILE = 64 * 1024;\n\nconst O_ACCMODE = 3;\nconst O_TRUNC = 0o1000;\n\nfunction wantOf(flags: number): number {\n const mode = flags & O_ACCMODE;\n const read = mode === 1 ? 0 : HOLD_READ;\n const write = mode !== 0 || (flags & O_TRUNC) !== 0 ? HOLD_WRITE : 0;\n return read | write;\n}\n\nfunction accessOf(want: number): number {\n return (want & HOLD_READ ? 4 : 0) | (want & HOLD_WRITE ? 2 : 0);\n}\n\nfunction refusal(err: unknown): boolean {\n const code = (err as { code?: unknown } | null)?.code;\n return code === 'EACCES' || code === 'EPERM';\n}\n\nfunction cachedStat(s: LiveNodeState, dir: boolean): boolean {\n return s.stat !== undefined && (!dir || s.statAt === syncCallCount());\n}\n\nconst stale = (s: LiveNodeState): boolean => !!s.orphan && !s.kept;\n\nfunction linkedStates(bridgeOf: (node: LiveFsNode) => SyncFsPosixBridge) {\n const opens = new Map<LiveNodeState, LiveFsNode>();\n const byId = new Map<string, LiveNodeState>();\n const idOf = (st: SyncFsBridgeStat | undefined): string | undefined =>\n st?.ino === undefined || (st.nlink ?? 1) < 2 ? undefined : `${st.dev}:${st.ino}`;\n\n function know(s: LiveNodeState, id: string): void {\n s.id = id;\n if (!byId.has(id)) byId.set(id, s);\n }\n\n function opening(node: LiveFsNode, on: boolean): void {\n const s = node.live;\n if (!on) {\n opens.delete(s);\n if (s.id !== undefined && byId.get(s.id) === s) byId.delete(s.id);\n s.id = undefined;\n return;\n }\n opens.set(s, node);\n const id = idOf(s.stat);\n if (id !== undefined) know(s, id);\n }\n\n function sharedWith(node: LiveFsNode): LiveNodeState | undefined {\n const st = node.live.stat;\n if (st?.ino === undefined) return undefined;\n const id = `${st.dev}:${st.ino}`;\n if (!byId.has(id) && idOf(st) !== undefined) {\n for (const [s, other] of opens) {\n if (s.id !== undefined || s.orphan) continue;\n let st: SyncFsBridgeStat | undefined;\n try {\n st = bridgeOf(other).lstat(liveNodePath(other));\n } catch {}\n const known = idOf(st);\n if (known !== undefined) know(s, known);\n }\n }\n const s = byId.get(id);\n return s && s !== node.live && !stale(s) ? s : undefined;\n }\n const holder = (node: LiveFsNode): LiveFsNode => opens.get(node.live) ?? node;\n return { opening, sharedWith, know, idOf, holder };\n}\n\nfunction createHelpers(Fs: LiveFsApi, ops: LiveOpsTables) {\n const bridgeOf = (node: LiveFsNode): SyncFsPosixBridge => node.mount.opts.bridge;\n const fileIo = (node: LiveFsNode): SyncFsFileIo => pinnedIo(bridgeOf(node), node.live.handle);\n const dirty = new Set<LiveFsNode>();\n const handled = new Set<LiveFsNode>();\n const linked = linkedStates(bridgeOf);\n\n function markDirty(node: LiveFsNode): void {\n node.live.dirty = true;\n dirty.add(node);\n }\n\n function flushDirty(): void {\n for (const node of [...dirty]) {\n const s = node.live;\n if (!s.dirty || stale(s)) {\n dirty.delete(node);\n continue;\n }\n if (!s.ranged && s.len > EARLY_WHOLE_FILE) continue;\n try {\n flushNode(node);\n dirty.delete(node);\n } catch {}\n }\n }\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 !== wasiErrno('ENOSYS')) throw err;\n }\n }\n\n function freshState(stat?: SyncFsBridgeStat): LiveNodeState {\n const statAt = syncCallCount();\n return { ...(stat ? { stat, statAt } : {}), 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 const size = node.live.ranged?.size() ?? node.live.len;\n return { ...(node.live.stat as SyncFsBridgeStat), size };\n }\n if (!cachedStat(node.live, Fs.isDir(node.mode))) {\n const st = call(() => bridgeOf(node).lstat(liveNodePath(linked.holder(node))));\n Object.assign(node.live, { stat: st, statAt: syncCallCount() });\n node.mode = modeFromStat(st);\n }\n return node.live.stat as SyncFsBridgeStat;\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(() => fileIo(node).readFile(liveNodePath(linked.holder(node))));\n s.data = bytes;\n s.len = bytes.length;\n s.loaded = true;\n }\n\n function rangedOf(node: LiveFsNode): RangedFile | undefined {\n const s = node.live;\n if (s.ranged || !s.ranges) return s.ranged;\n const bridge = bridgeOf(node);\n const path = () => liveNodePath(linked.holder(node));\n const file = () => fileIo(node) as Required<SyncFsFileIo>;\n const io = {\n pread: (_: string, at: number, n: number, version?: string) =>\n file().pread(path(), at, n, version),\n pwrite: (_: string, at: number, bytes: Uint8Array, transfer?: boolean) =>\n file().pwrite(path(), at, bytes, transfer),\n truncate: (_: string, size: number) => file().truncate(path(), size),\n };\n const st = call(() => bridge.stat(path()));\n s.ranged = new RangedFile(io, path(), st.size, st.version);\n return s.ranged;\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 || stale(s) || !(s.data || s.ranged)) return;\n if (s.ranged) call(() => s.ranged?.flush());\n else {\n const bytes = (s.data as Uint8Array).slice(0, s.len);\n call(() => fileIo(node).writeFile(liveNodePath(linked.holder(node)), bytes, true));\n }\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.orphan) {\n const st = statOf(node);\n if (st.readonly) throw new Fs.ErrnoError(wasiErrno('EROFS'));\n if (st.maxFile !== undefined && size > st.maxFile) {\n throw new Fs.ErrnoError(wasiErrno('EFBIG'));\n }\n }\n const ranged = s.openCount > 0 ? rangedOf(node) : undefined;\n if (ranged) {\n ranged.truncate(size);\n markDirty(node);\n return;\n }\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 markDirty(node);\n return;\n }\n\n const path = liveNodePath(node);\n const bridge = bridgeOf(node);\n if (statOf(node).ranged && bridge.truncate) {\n call(() => bridge.truncate?.(path, size));\n s.stat = undefined;\n return;\n }\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 handled,\n linked,\n call,\n metadataCall,\n makeNode,\n statOf,\n childPath,\n ensureLoaded,\n ensureCapacity,\n rangedOf,\n flushNode,\n markDirty,\n flushDirty,\n truncate,\n };\n}\n\ntype LiveHelpers = ReturnType<typeof createHelpers>;\n\nfunction freshStat(h: LiveHelpers, node: LiveFsNode): SyncFsBridgeStat {\n const { statOf } = h;\n const st = statOf(node);\n if (!st.linkable) return st;\n node.live.stat = undefined;\n return statOf(node);\n}\n\nfunction orphaned(h: LiveHelpers, node: LiveFsNode, st: SyncFsBridgeStat): void {\n const { bridgeOf } = h;\n const s = node.live;\n const nlink = st.nlink ?? 1;\n let kept = false;\n try {\n kept = nlink > 1 && s.handle !== undefined && bridgeOf(node).kept?.(s.handle) === true;\n } catch {}\n if (nlink > 1 && !kept && h.linked.holder(node) !== node) {\n s.stat = undefined;\n return;\n }\n s.orphan = true;\n if (!kept) return;\n s.kept = true;\n s.stat = { ...st, nlink: nlink - 1 };\n const id = h.linked.idOf(st);\n if (id !== undefined) h.linked.know(s, id);\n}\n\nfunction createNodeOps(h: LiveHelpers): LiveNodeOps {\n const { Fs, bridgeOf, call, metadataCall, makeNode, statOf, childPath, flushNode, truncate } = h;\n const { ensureLoaded } = h;\n const setTimes = (node: LiveFsNode, path: string, atime: number, mtime: number): void => {\n const now = Fs.sliccTouch === true;\n if (Fs.isLink(node.mode)) {\n metadataCall(() => bridgeOf(node).lutimes(path, atime, mtime, now));\n return;\n }\n flushNode(node);\n metadataCall(() => bridgeOf(node).utimes(path, atime, mtime, now));\n };\n const stamped = typeof (Fs as { doSetAttr?: unknown }).doSetAttr !== 'function';\n const timesOf = (node: LiveFsNode, attr: LiveSetAttr): [number, number] | undefined => {\n const mtime = toMs(attr.mtime) ?? (stamped ? attr.timestamp : undefined);\n const atime = toMs(attr.atime);\n if (mtime !== undefined && attr.atime !== null) return [atime ?? mtime, mtime];\n if (atime === undefined && mtime === undefined) return undefined;\n const st = statOf(node);\n return [atime ?? st.atimeMs ?? st.mtimeMs ?? 0, mtime ?? st.mtimeMs ?? 0];\n };\n return {\n getattr(node) {\n const owned = bridgeOf(node).owners === true;\n if (owned && Fs.isLink(node.mode) && statOf(node).uid === undefined)\n node.live.stat = undefined;\n const st = statOf(node);\n const s = node.live;\n const size = Fs.isDir(node.mode) ? 4096 : (s.ranged?.size() ?? (s.loaded ? s.len : st.size));\n const mtime = new Date(st.mtimeMs ?? 0);\n return {\n dev: st.dev ?? 1,\n ino: st.ino ?? inodeOf(liveNodePath(node)),\n mode: node.mode,\n nlink: st.nlink ?? 1,\n uid: owned ? (st.uid ?? 0) : 0,\n gid: owned ? (st.gid ?? 0) : 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) * 8,\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 if (Fs.isLink(node.mode)) throw new Fs.ErrnoError(wasiErrno('EOPNOTSUPP'));\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 times = timesOf(node, attr);\n if (times) setTimes(node, path, ...times);\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 const bridge = bridgeOf(parent);\n const perm = bridge.owners ? mode & PERM_MASK : undefined;\n if (Fs.isDir(mode) && perm !== undefined) {\n call(() => bridge.mkdir(path, perm));\n } else if (Fs.isDir(mode)) {\n call(() => bridge.mkdir(path));\n\n const masked = mode & PERM_MASK & ~UMASK;\n if (masked !== DEFAULT_DIR_PERM) metadataCall(() => bridge.chmod(path, masked));\n } else if (Fs.isFile(mode)) {\n call(() =>\n bridge.create ? bridge.create(path, perm) : bridge.writeFile(path, new Uint8Array(0))\n );\n } else {\n throw new Fs.ErrnoError(wasiErrno('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 if (Fs.isFile(mode)) node.live.created = true;\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 const st = open && freshStat(h, open);\n if (open) {\n const ranged = h.rangedOf(open);\n if (ranged) ranged.pin();\n else ensureLoaded(open);\n }\n call(() => bridgeOf(parent).unlink(childPath(parent, name)));\n if (open && st) orphaned(h, open, st);\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(wasiErrno('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, bridgeOf, rangedOf } = h;\n const held = (stream: LiveFsStream, change: 1 | -1) => {\n const s = stream.node.live;\n if ((stream.flags & 3) === 0 || s.orphan) return;\n const before = s.writers ?? 0;\n s.writers = Math.max(0, before + change);\n if ((before === 0) !== (s.writers === 0)) {\n try {\n bridgeOf(stream.node).hold?.(liveNodePath(stream.node), s.writers > 0);\n } catch {}\n }\n };\n const opened = (node: LiveFsNode, on: boolean, want = 0) => {\n const s = node.live;\n try {\n const handle = bridgeOf(node).hold?.(liveNodePath(node), on, true, s.handle, want);\n s.handle = on ? handle : undefined;\n h.linked.opening(node, on);\n if (s.handle === undefined) h.handled.delete(node);\n else h.handled.add(node);\n } catch (err) {\n if (refusal(err)) throw new Fs.ErrnoError(wasiErrno((err as { code: string }).code));\n }\n };\n const permitted = (stream: LiveFsStream, created: boolean): number => {\n const s = stream.node.live;\n const bridge = bridgeOf(stream.node);\n if (!bridge.owners || s.orphan) return 0;\n const want = wantOf(stream.flags) | (created ? HOLD_CREATED : 0);\n if (s.openCount > 0 && !created) {\n h.call(() => bridge.access?.(liveNodePath(stream.node), accessOf(want), 'open'));\n }\n return want;\n };\n return {\n open(stream) {\n if (!Fs.isFile(stream.node.mode)) return;\n const s = stream.node.live;\n const created = s.created === true;\n s.created = undefined;\n if (s.openCount === 0 && !s.orphan) {\n const bridge = bridgeOf(stream.node);\n s.ranges = !!(\n bridge.pread &&\n bridge.pwrite &&\n bridge.truncate &&\n statOf(stream.node).ranged\n );\n const shared = h.linked.sharedWith(stream.node);\n if (shared) stream.node.live = shared;\n else rangedOf(stream.node);\n }\n if ((stream.flags & 3) !== 0) {\n try {\n const st = statOf(stream.node);\n if (st.readonly) throw new Fs.ErrnoError(wasiErrno('EROFS'));\n stream.node.live.maxFile = st.maxFile;\n } catch (err) {\n if (stream.fd !== undefined) Fs.closeStream?.(stream.fd);\n throw err;\n }\n }\n const live = stream.node.live;\n let counted = false;\n try {\n const want = permitted(stream, created);\n live.openCount++;\n counted = true;\n if (live.openCount === 1) opened(stream.node, true, want);\n } catch (err) {\n if (counted) live.openCount--;\n if (stream.fd !== undefined) Fs.closeStream?.(stream.fd);\n throw err;\n }\n held(stream, 1);\n },\n\n dup(stream) {\n if (!Fs.isFile(stream.node.mode)) return;\n stream.node.live.openCount++;\n held(stream, 1);\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) {\n held(stream, -1);\n return;\n }\n try {\n flushNode(node);\n } finally {\n s.data = undefined;\n s.ranged = undefined;\n s.ranges = false;\n s.len = 0;\n s.loaded = false;\n held(stream, -1);\n opened(node, 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(wasiErrno('EISDIR'));\n const ranged = rangedOf(node);\n if (ranged) {\n const out = new Uint8Array(buffer.buffer, buffer.byteOffset + offset, Math.max(0, length));\n return h.call(() => ranged.readInto(position, out));\n }\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(wasiErrno('EISDIR'));\n if (length <= 0) return 0;\n const s = node.live;\n const end = position + length;\n if (s.maxFile !== undefined && end > s.maxFile) throw new Fs.ErrnoError(wasiErrno('EFBIG'));\n const ranged = rangedOf(node);\n if (ranged) {\n const bytes = new Uint8Array(buffer.buffer, buffer.byteOffset + offset, length);\n h.call(() => ranged.write(position, bytes));\n h.markDirty(node);\n return length;\n }\n ensureLoaded(node);\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 h.markDirty(node);\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 += rangedOf(stream.node)?.size() ?? (s.loaded ? s.len : statOf(stream.node).size);\n }\n if (pos < 0) throw new Fs.ErrnoError(wasiErrno('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 handled: h.handled,\n flushDirty: () => h.flushDirty(),\n mount(mount) {\n const st = h.call(() => mount.opts.bridge.stat(mount.opts.root));\n if (!st.isDirectory) throw new Fs.ErrnoError(wasiErrno('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 const s = node.live;\n if (!ownedBy(plugin, node) || !s.dirty || !(s.data || s.ranged)) continue;\n try {\n if (s.ranged) s.ranged.flush();\n else {\n const bytes = (s.data as Uint8Array).slice(0, s.len);\n pinnedIo(node.mount.opts.bridge, s.handle).writeFile(liveNodePath(node), bytes, true);\n }\n s.dirty = false;\n } catch (err) {\n throw toErrno(Fs, err);\n }\n }\n }\n}\n\nfunction refresh(s: LiveNodeState): void {\n if (s.dirty || s.orphan) return;\n if (s.ranged?.pinnedVersion !== undefined) {\n s.ranged.forget();\n return;\n }\n s.data = undefined;\n s.ranged = undefined;\n s.len = 0;\n s.loaded = false;\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 refresh(s);\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 sliccKept?: true;\n open?(path: string, flags: number, mode?: number): unknown;\n statfsNode?(node: LiveFsNode): Record<string, number>;\n sliccStatfs?: 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 guardStatfs(Fs);\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 guardKeptNodes(Fs, plugin.handled);\n guardStatfs(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 guardStatfs(Fs: LiveMountFsApi): void {\n const statfsNode = Fs.statfsNode?.bind(Fs);\n if (!statfsNode || Fs.sliccStatfs) return;\n Fs.sliccStatfs = true;\n Fs.statfsNode = (node) => {\n const defaults = statfsNode(node);\n let usage: SyncFsUsage | null | undefined;\n try {\n usage = node.live ? node.mount?.opts?.bridge?.statfs?.(liveNodePath(node)) : undefined;\n } catch {\n return defaults;\n }\n if (!usage) return defaults;\n const free = Math.max(0, Math.floor((usage.quota - usage.usage) / 4096));\n return {\n ...defaults,\n bsize: 4096,\n frsize: 4096,\n blocks: Math.ceil(usage.quota / 4096),\n bfree: free,\n bavail: free,\n };\n };\n}\n\nfunction pinnedIo(bridge: SyncFsPosixBridge, handle: number | undefined): SyncFsFileIo {\n return handle !== undefined && bridge.pinned ? bridge.pinned(handle) : bridge;\n}\n\nfunction guardKeptNodes(Fs: LiveMountFsApi, handled: Set<LiveFsNode> | undefined): void {\n const open = Fs.open?.bind(Fs);\n const forget = Fs.hashRemoveNode?.bind(Fs);\n if (!open || !forget || !Fs.lookupPath || !handled || Fs.sliccKept) return;\n Fs.sliccKept = true;\n const lookupPath = Fs.lookupPath.bind(Fs);\n Fs.open = (path, flags, mode) => {\n const name = path.slice(path.lastIndexOf('/') + 1);\n if (![...handled].some((held) => held.name === name)) return open(path, flags, mode);\n let node: LiveFsNode | undefined;\n try {\n node = lookupPath(path, { follow: true }).node as LiveFsNode;\n } catch {}\n const handle = node?.live?.openCount ? node.live.handle : undefined;\n if (node && handle !== undefined && node.mount.opts.bridge.kept?.(handle)) forget(node);\n return open(path, flags, mode);\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(wasiErrno('EXDEV'));\n rename(from, to);\n };\n}\n\nexport interface LiveChownFs extends LiveFsApi {\n lookupPath(path: string, opts?: { follow?: boolean }): { node: object };\n chown?(path: string | object, uid: number, gid: number, dontFollow?: boolean): void;\n fchown?(fd: number, uid: number, gid: number): void;\n getStreamChecked?(fd: number): { node: object; path?: string };\n}\n\nfunction idOf(value: number): number | undefined {\n return value === -1 || value === 0xffffffff ? undefined : value >>> 0;\n}\n\nexport function useLiveChown(Fs: LiveChownFs): void {\n const chown = Fs.chown?.bind(Fs);\n if (!chown) return;\n Fs.chown = (path, uid, gid, dontFollow) => {\n const node = (\n typeof path === 'string' ? Fs.lookupPath(path, { follow: !dontFollow }).node : path\n ) as LiveFsNode;\n if (!node.live || node.live.orphan) return chown(path, uid, gid, dontFollow);\n try {\n node.mount.opts.bridge.chown?.(liveNodePath(node), idOf(uid), idOf(gid));\n } catch (err) {\n throw toErrno(Fs, err);\n }\n node.live.stat = undefined;\n if (node.parent?.live) node.parent.live.listed = undefined;\n };\n const { getStreamChecked } = Fs;\n if (!Fs.fchown || !getStreamChecked) return;\n Fs.fchown = (fd, uid, gid) => {\n const stream = getStreamChecked.call(Fs, fd);\n const live = (stream.node as LiveFsNode).live !== undefined;\n const target = live || stream.path === undefined ? stream.node : stream.path;\n (Fs.chown as NonNullable<LiveChownFs['chown']>)(target, uid, gid);\n };\n}\n", "import {\n flushLiveVfs,\n invalidateLiveVfs,\n type LiveMountFsApi,\n liveRoot,\n mountLiveVfsDirs,\n useLiveChown,\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 chown?(path: string | object, uid: number, gid: number, dontFollow?: boolean): void;\n}\n\nexport interface EmscriptenVfsHandle {\n mounted: string[];\n flush(): void;\n flushDirty(): 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 if (bridge.owners && Fs.lookupPath) useLiveChown(Fs as Parameters<typeof useLiveChown>[0]);\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 flushDirty: () => plugin.flushDirty(),\n invalidate: () => invalidateLiveVfs(Fs, plugin),\n };\n}\n", "import type { HeldMeta, PollState } from '../kernel/fd-table.ts';\nimport type { MountLine, ProcessListing } from '../kernel/proc-info.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;\nconst TCSETSF = 0x5404;\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\nconst TTY_PATH = /^\\/dev\\/tty\\d+$/;\n\ninterface TtyNodeFs {\n analyzePath?: (path: string) => { exists: boolean };\n mkdev?: (path: string, dev: number) => unknown;\n makedev?: (major: number, minor: number) => number;\n}\n\ninterface DevDirFs extends TtyNodeFs {\n lookupNode?: (parent: object, name: string) => object;\n readdir?: (path: string) => string[];\n getPath?: (node: object) => string;\n lookupPath?: (path: string, opts: { follow: boolean }) => { path: string };\n cwd?: () => string;\n}\n\nconst TTY_NAME = /^tty\\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 SEALED_PATH = '/dev/sealed';\n\nconst STRERROR: Readonly<Record<string, string>> = {\n EACCES: 'Permission denied',\n EIO: 'I/O error',\n ENOTSUP: 'Not supported',\n EOPNOTSUPP: 'Not supported',\n EFBIG: 'File too large',\n EILSEQ: 'Illegal byte sequence',\n EINTR: 'Interrupted system call',\n};\nconst CLIPBOARD_PATH = '/dev/clipboard';\n\nfunction sealedStat(minor = 250): object {\n const now = new Date();\n return {\n dev: 0x16,\n ino: 1,\n mode: 0o20666,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: (10 << 8) | minor,\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?: {\n contents?: Uint8Array;\n orphan?: boolean;\n truncate?: boolean;\n create?: boolean;\n created?: boolean;\n pin?: { version: string; size: number };\n handle?: number;\n }\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 kind?(fd: number): string | undefined;\n\n heldMeta?(fd: number): HeldMeta | undefined;\n\n access?(fd: number): 'read' | 'write' | undefined;\n\n size?(fd: number): number;\n\n openTty?(name?: string): number;\n ttyNames?(): string[];\n ttyOwner?(name: string): TtyOwner | null;\n\n tcgets?(fd: number): Termios;\n tcsets?(fd: number, termios: Termios, flush?: boolean): void;\n winsize?(fd: number): [number, number];\n\n openPty?(): number;\n openPts?(n: number, noctty: boolean): number;\n\n ptyNumbers?(): number[];\n\n openSealed?(): number;\n openClipboard?(flags: number): number;\n procList?(): ProcessListing;\n mountList?(): MountLine[];\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 mmap?: 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(\n stream: ProcessStream,\n buffer: Uint8Array,\n offset: number,\n length: number,\n position?: number\n ): number;\n write(stream: ProcessStream, buffer: Uint8Array, offset: number, length: number): number;\n\n stat?(path: string, dontFollow?: boolean): object;\n writeFile?(path: string, data: string | Uint8Array): void;\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 owners?: boolean;\n program?: string;\n}\n\nexport interface TtyOwner {\n uid: number;\n gid: number;\n mode?: number;\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 descriptions = new Map<string, () => object>();\n\n private described = 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 this.ttyNode(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 listSealed(): void {\n const { analyzePath, mkdev, makedev } = this.Fs as unknown as TtyNodeFs;\n if (!analyzePath || !mkdev || !makedev) return;\n const nodes: Array<[string, number, unknown]> = [\n [SEALED_PATH, 250, this.sys.openSealed],\n [CLIPBOARD_PATH, 251, this.sys.openClipboard],\n ];\n for (const [path, minor, present] of nodes) {\n if (!present || analyzePath.call(this.Fs, path).exists) continue;\n try {\n mkdev.call(this.Fs, path, makedev.call(this.Fs, 10, minor));\n } catch {}\n }\n }\n\n private readonly reporting = new Set<number>();\n\n reportClose(kfd: number): void {\n this.reporting.add(kfd);\n }\n\n quitting = false;\n\n private atExit = false;\n\n private failedAtExit = false;\n\n private readonly committed = new Set<number>();\n\n exiting(): () => void {\n this.atExit = true;\n return () => {\n this.atExit = false;\n };\n }\n\n private commitStdout(): void {\n const kfd = this.Fs.getStream(1)?.sliccKernelFd;\n if (kfd === undefined || !this.reporting.delete(kfd)) return;\n this.committed.add(kfd);\n try {\n this.sys.close(kfd);\n } catch (e) {\n if (e instanceof SyscallError) this.stdoutFailed(e.code);\n }\n }\n\n exitStatus(status: number): number {\n return this.failedAtExit && status === 0 ? 1 : status;\n }\n\n private reportedClose(stream: ProcessStream, kfd: number): void {\n try {\n this.sys.close(kfd);\n } catch (e) {\n if (this.quitting && stream.fd === 1 && e instanceof SyscallError) this.stdoutFailed(e.code);\n this.call(() => {\n throw e;\n });\n }\n }\n\n private stdoutFailed(code: string): void {\n this.failedAtExit = true;\n const stderr = this.Fs.getStream(2)?.sliccKernelFd;\n if (stderr === undefined) return;\n const line = `${this.options.program ?? 'program'}: write error: ${STRERROR[code] ?? code}\\n`;\n try {\n this.sys.write(stderr, new TextEncoder().encode(line));\n } catch {}\n }\n\n private creatingTerminal = false;\n\n private useTerminalNodes(): void {\n const fs = this.Fs as unknown as DevDirFs;\n const { lookupNode, readdir, getPath, mkdev, makedev } = fs;\n const ttyNames = this.sys.ttyNames?.bind(this.sys);\n if (!lookupNode || !readdir || !getPath || !mkdev || !makedev || !ttyNames) return;\n fs.lookupNode = (parent, name) => {\n try {\n return lookupNode.call(fs, parent, name);\n } catch (e) {\n const path = `/dev/${name}`;\n if (this.creatingTerminal || !TTY_NAME.test(name) || getPath.call(fs, parent) !== '/dev')\n throw e;\n if (!ttyNames().includes(path)) throw e;\n this.creatingTerminal = true;\n try {\n mkdev.call(fs, path, makedev.call(fs, 6, 0));\n } finally {\n this.creatingTerminal = false;\n }\n return lookupNode.call(fs, parent, name);\n }\n };\n fs.readdir = (path) => {\n const names = readdir.call(fs, path);\n if (path.replace(/\\/+$/, '') !== '/dev') return names;\n const missing = ttyNames()\n .map((tty) => tty.slice('/dev/'.length))\n .filter((name) => TTY_NAME.test(name) && !names.includes(name));\n return [...names, ...missing];\n };\n }\n\n private ttyNode(name: string): void {\n const { analyzePath, mkdev, makedev } = this.Fs as unknown as TtyNodeFs;\n if (!TTY_PATH.test(name) || !analyzePath || !mkdev || !makedev) return;\n if (!analyzePath.call(this.Fs, name).exists)\n mkdev.call(this.Fs, name, makedev.call(this.Fs, 6, 0));\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, op === TCSETSF);\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 sizeFromKernel(stream: ProcessStream, kfd: number): void {\n const { size } = this.sys;\n if (!size) return;\n const node = stream.node;\n this.describe(stream, `${stream.path ?? ''}:${++this.described}`, () => ({\n ...node.node_ops?.getattr?.(node),\n size: this.call(() => size.call(this.sys, kfd)),\n }));\n }\n\n describe(stream: ProcessStream, name: string, getattr: () => object): void {\n if (this.descriptions.size === 0) this.useDescriptions();\n this.descriptions.set(name, getattr);\n stream.path = name;\n stream.stream_ops = { ...stream.stream_ops, getattr };\n }\n\n private useDescriptions(): void {\n const fs = this.Fs as unknown as PtyPathFs;\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 const getattr = this.descriptions.get(path);\n return getattr ? getattr() : original.call(fs, path, ...rest);\n };\n }\n }\n\n useControllingTerminal(): void {\n if (typeof this.Fs.open !== 'function') return;\n this.usePtyPaths();\n this.useTerminalNodes();\n this.listSealed();\n const open = this.Fs.open.bind(this.Fs);\n this.Fs.open = (path, flags, mode) => {\n const device = typeof path === 'string' ? this.devicePath(path) : undefined;\n if (device !== undefined && TTY_PATH.test(device) && !this.terminalExists(device)) {\n throw new this.Fs.ErrnoError(wasiErrno('ENOENT'));\n }\n const pty =\n this.openPty(open, path, flags, mode) ??\n this.openSealed(open, path, flags, mode) ??\n this.openClipboard(open, path, flags, mode);\n if (pty) return pty;\n this.refuseExclusiveLink(path, flags);\n const stream = this.openRacing(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 openRacing(\n open: NonNullable<ProcessFs['open']>,\n path: string,\n flags: number,\n mode?: number\n ): ProcessStream {\n try {\n return open(path, flags, mode);\n } catch (err) {\n const lost = (err as { errno?: number }).errno === wasiErrno('EEXIST') && !(flags & O_EXCL);\n if (!lost) throw err;\n return open(path, flags, mode);\n }\n }\n\n private refuseExclusiveLink(path: string, flags: number): void {\n if ((flags & (O_CREAT | O_EXCL)) !== (O_CREAT | O_EXCL)) return;\n let mode = 0;\n try {\n mode = (this.Fs.stat?.(path, true) as { mode?: number } | undefined)?.mode ?? 0;\n } catch {}\n if ((mode & 0o170000) === 0o120000) throw new this.Fs.ErrnoError(wasiErrno('EEXIST'));\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 return this.vessel(open, kfd, { path, flags, mode }, true);\n }\n\n private openSealed(\n open: NonNullable<ProcessFs['open']>,\n path: string,\n flags: number,\n mode?: number\n ): ProcessStream | undefined {\n const { openSealed } = this.sys;\n if (path !== SEALED_PATH || !openSealed) return undefined;\n const kfd = this.call(() => openSealed.call(this.sys));\n return this.vessel(open, kfd, { path, flags, mode }, false);\n }\n\n private openClipboard(\n open: NonNullable<ProcessFs['open']>,\n path: string,\n flags: number,\n mode?: number\n ): ProcessStream | undefined {\n const { openClipboard } = this.sys;\n if (path !== CLIPBOARD_PATH || !openClipboard) return undefined;\n const kfd = this.call(() => openClipboard.call(this.sys, flags & 3));\n const stream = this.vessel(open, kfd, { path, flags, mode }, false);\n this.reportClose(kfd);\n return stream;\n }\n\n private vessel(\n open: NonNullable<ProcessFs['open']>,\n kfd: number,\n at: { path: string; flags: number; mode: number | undefined },\n terminal: boolean\n ): ProcessStream {\n let stream: ProcessStream;\n try {\n stream = open('/dev/null', at.flags & ~(O_CREAT | O_EXCL | O_TRUNC), at.mode);\n } catch (e) {\n this.sys.close(kfd);\n throw e;\n }\n\n this.attach(stream, kfd, terminal);\n\n this.nameStream(stream, at.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 (path === SEALED_PATH && this.sys.openSealed) return sealedStat();\n if (path === CLIPBOARD_PATH && this.sys.openClipboard) return sealedStat(251);\n const owned = this.ownedTty(path);\n if (owned && isPtyPath(path)) return this.owned(path, ptyStat(path));\n if (!isPtyPath(path)) {\n const st = original.call(fs, path, ...rest);\n return owned && TTY_PATH.test(path) ? this.owned(path, st as object) : st;\n }\n this.existingPty(path);\n return ptyStat(path);\n };\n }\n }\n\n private ownedTty(path: string): boolean {\n return this.options.owners === true && this.sys.ttyOwner !== undefined && path !== '/dev/ptmx';\n }\n\n private owned(path: string, st: object): object {\n const ask = this.sys.ttyOwner as (name: string) => TtyOwner | null;\n const owner = this.call(() => ask.call(this.sys, path));\n if (!owner) return st;\n const mode = ((st as { mode: number }).mode & ~0o7777) | (owner.mode ?? 0o620);\n return { ...st, uid: owner.uid, gid: owner.gid, mode };\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 devicePath(path: string): string | undefined {\n const name = path.slice(path.lastIndexOf('/') + 1);\n if (!TTY_NAME.test(name)) return undefined;\n const { lookupPath, cwd } = this.Fs as unknown as DevDirFs;\n const absolute = path.startsWith('/') ? path : `${cwd?.call(this.Fs) ?? '/'}/${path}`;\n const dir = absolute.slice(0, absolute.lastIndexOf('/')) || '/';\n try {\n const real = lookupPath?.call(this.Fs, dir, { follow: true }).path ?? dir;\n return `${real === '/' ? '' : real}/${name}`;\n } catch {\n return absolute;\n }\n }\n\n private terminalExists(path: string): boolean {\n const { analyzePath } = this.Fs as unknown as TtyNodeFs;\n return analyzePath?.call(this.Fs, path).exists ?? true;\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 if (this.atExit && stream.fd === 2 && this.reporting.size > 0) this.commitStdout();\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 if (this.committed.size > 0 && this.committed.delete(kfd)) return;\n if (this.reporting.size > 0 && this.reporting.delete(kfd)) {\n this.reportedClose(stream, kfd);\n return;\n }\n try {\n this.sys.close(kfd);\n } catch {}\n },\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 { hostnameOf, hostsFile } from '../kernel/net/loopback-names.ts';\nimport type { MountLine } from '../kernel/proc-info.ts';\nimport { type LiveFsNode, liveNodePath } from '../realm/live-vfs-fs.ts';\nimport 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 quietTarget(dup3: GlueSyscall, deps: CloexecDeps): GlueSyscall {\n return (fd = -1, newfd = -1, flags = 0, ...rest) => {\n const Fs = deps.fs();\n const target = fd === newfd || flags !== 0 ? undefined : Fs?.getStream(newfd);\n if (target && Fs?.getStream(fd)) {\n try {\n Fs.close?.(target);\n } catch {}\n }\n return dup3(fd, newfd, flags, ...rest);\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(quietTarget(f, deps), 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;\nconst AT_SYMLINK_NOFOLLOW = 0x100;\nconst EMSCRIPTEN_EPERM = 63;\n\ninterface UtimeNode {\n node_ops: {\n setattr?(node: UtimeNode, attr: { atime: number | null; mtime: number | null }): void;\n };\n}\n\ninterface UtimeFs {\n utime?(path: string, atime: number | null, mtime: number | null): void;\n lookupPath?(path: string, opts: { follow: boolean }): { node: UtimeNode };\n ErrnoError?: new (errno: number) => Error;\n}\n\nconst O_PATH = 0o10000000;\n\ninterface MayOpenFs {\n mayOpen?(node: { mode: number }, flags: number): number;\n isLink?(mode: number): boolean;\n}\n\nexport function pathOpensLinks(Fs: ProcessFs): void {\n const fs = Fs as unknown as MayOpenFs;\n const { mayOpen, isLink } = fs;\n if (!mayOpen || !isLink) return;\n fs.mayOpen = (node, flags) =>\n flags & O_PATH && isLink.call(fs, node.mode) ? 0 : mayOpen.call(fs, node, flags);\n}\n\ntype Syscall = (...args: number[]) => number;\n\nexport interface KernelImports {\n openat?: unknown;\n mkdirat?: unknown;\n mknodat?: unknown;\n umask?: unknown;\n faccessat?: unknown;\n utimensat?: unknown;\n getppid?: unknown;\n resizeHeap?: unknown;\n fdWrite?: unknown;\n fdRead?: unknown;\n sleepMs?: unknown;\n}\n\nconst LITERALS: Record<keyof KernelImports, string> = {\n openat: '__syscall_openat',\n mkdirat: '__syscall_mkdirat',\n mknodat: '__syscall_mknodat',\n umask: '__syscall_umask',\n faccessat: '__syscall_faccessat',\n utimensat: '__syscall_utimensat',\n getppid: 'slicc_getppid_js',\n resizeHeap: 'emscripten_resize_heap',\n fdWrite: 'fd_write',\n fdRead: 'fd_read',\n sleepMs: 'slicc_sleep_ms',\n};\n\nexport function importKey(\n namespace: WebAssembly.ModuleImports,\n name: keyof KernelImports,\n glue: KernelImports | undefined\n): string | undefined {\n const own = glue?.[name];\n if (typeof own === 'function') {\n const found = Object.keys(namespace).find((k) => namespace[k] === own);\n if (found !== undefined) return found;\n }\n const literal = LITERALS[name];\n return typeof namespace[literal] === 'function' ? literal : undefined;\n}\n\nexport function wrapImport(\n imports: WebAssembly.Imports,\n name: keyof KernelImports,\n glue: KernelImports | undefined,\n wrap: (original: Syscall) => Syscall\n): void {\n let wrapped = false;\n for (const ns of namespaces(imports)) {\n const key = importKey(ns, name, glue);\n if (key === undefined) continue;\n ns[key] = wrap(ns[key] as Syscall);\n wrapped = true;\n }\n if (!wrapped && typeof glue?.[name] === 'function') {\n throw new Error(`slicc-kernel cannot find the glue's ${LITERALS[name]} among its imports`);\n }\n}\n\nexport interface UmaskDeps {\n initial: number;\n memory(): WebAssembly.Memory | undefined;\n set(mask: number): void;\n glue?: KernelImports | undefined;\n}\n\nexport function kernelUmask(imports: WebAssembly.Imports, deps: UmaskDeps): void {\n let umask = deps.initial & 0o777;\n const { glue } = deps;\n wrapImport(imports, 'openat', glue, (openat) => (dirfd, path, flags, varargs) => {\n const memory = deps.memory();\n if (flags & O_CREAT && varargs && memory) new Int32Array(memory.buffer)[varargs >> 2] &= ~umask;\n return openat(dirfd, path, flags, varargs);\n });\n wrapImport(\n imports,\n 'mkdirat',\n glue,\n (mkdirat) => (dirfd, path, mode) => mkdirat(dirfd, path, mode & ~umask)\n );\n wrapImport(\n imports,\n 'mknodat',\n glue,\n (mknodat) => (dirfd, path, mode, dev) => mknodat(dirfd, path, mode & ~umask, dev)\n );\n wrapImport(imports, 'umask', glue, (own) => {\n own(umask);\n return (mask) => {\n const old = umask;\n umask = mask & 0o777;\n own(umask);\n deps.set(umask);\n return old;\n };\n });\n}\n\nconst UTIME_NOW = 0x3fffffff;\nconst UTIME_OMIT = 0x3ffffffe;\n\nfunction touching(times: number, memory: WebAssembly.Memory | undefined): boolean {\n if (times === 0) return true;\n if (!memory) return false;\n const heap = new Int32Array(memory.buffer);\n const nsec = [heap[(times + 8) >> 2], heap[(times + 24) >> 2]];\n return nsec.every((n) => n === UTIME_NOW || n === UTIME_OMIT);\n}\n\nfunction touch<T>(Fs: TouchFs | undefined, on: boolean, run: () => T): T {\n if (!Fs || !on) return run();\n Fs.sliccTouch = true;\n try {\n return run();\n } finally {\n Fs.sliccTouch = undefined;\n }\n}\n\ninterface TouchFs {\n sliccTouch?: boolean;\n}\n\nexport function noFollowUtimes(\n imports: WebAssembly.Imports,\n fs: () => ProcessFs | undefined,\n glue?: unknown,\n memory: () => WebAssembly.Memory | undefined = () => undefined\n): void {\n wrapImport(\n imports,\n 'utimensat',\n { utimensat: glue },\n (utimensat) => (dirfd, path, times, flags) => {\n const Fs = fs() as (UtimeFs & TouchFs) | undefined;\n const on = touching(times, memory());\n const { utime, lookupPath, ErrnoError } = Fs ?? {};\n if (!Fs || !(flags & AT_SYMLINK_NOFOLLOW) || !utime || !lookupPath || !ErrnoError) {\n return touch(Fs, on, () => utimensat(dirfd, path, times, flags));\n }\n Fs.utime = (at, atime, mtime) => {\n const { node } = lookupPath.call(Fs, at, { follow: false });\n if (!node.node_ops.setattr) throw new ErrnoError(EMSCRIPTEN_EPERM);\n node.node_ops.setattr(node, { atime, mtime });\n };\n try {\n return touch(Fs, on, () => utimensat(dirfd, path, times, flags));\n } finally {\n Fs.utime = utime;\n }\n }\n );\n}\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\nconst PROT_WRITE = 2;\nconst MAP_PRIVATE = 2;\nconst MAP_TYPE = 0xf;\nconst O_WRONLY = 1;\nconst MAP_ALIGN = 65536;\n\ntype Mmap = (\n stream: ProcessStream,\n length: number,\n position: number,\n prot: number,\n flags: number\n) => { ptr: number; allocated: boolean };\n\nexport type Memalign = (alignment: number, size: number) => number;\n\nexport interface MmapDeps {\n sys: Pick<ProcessSys, 'pread'>;\n memory: () => WebAssembly.Memory | undefined;\n memalign: () => Memalign | undefined;\n}\n\nfunction staging(Fs: ProcessFs, length: number): Uint8Array {\n try {\n return new Uint8Array(length);\n } catch {\n throw new Fs.ErrnoError(wasiErrno('ENOMEM'));\n }\n}\n\nexport function useFileMmap(Fs: ProcessFs, deps: MmapDeps): void {\n const fs = Fs as ProcessFs & { mmap?: Mmap };\n const mmap = fs.mmap;\n if (typeof mmap !== 'function') return;\n fs.mmap = (stream, length, position, prot, flags) => {\n const memalign = deps.memalign();\n const memory = deps.memory();\n const shared = (flags & MAP_TYPE) !== MAP_PRIVATE && (prot & PROT_WRITE) !== 0;\n const kfd = stream.sliccKernelFile ? stream.sliccKernelFd : undefined;\n if (shared && kfd !== undefined) throw new Fs.ErrnoError(wasiErrno('ENODEV'));\n if (\n (stream.stream_ops.mmap && kfd === undefined) ||\n !memalign ||\n !memory ||\n length <= 0 ||\n shared ||\n (stream.flags & O_ACCMODE) === O_WRONLY ||\n !Fs.isFile(stream.node.mode)\n ) {\n return mmap.call(fs, stream, length, position, prot, flags);\n }\n const data = staging(Fs, length);\n let done = 0;\n try {\n if (kfd !== undefined) done = readInto(deps.sys, kfd, data, position);\n else {\n for (let got = 1; done < length && got > 0; done += got) {\n got = Fs.read(stream, data, done, length - done, position + done);\n }\n }\n } catch (err) {\n throw new Fs.ErrnoError(errnoOf(err));\n }\n const size = Math.ceil(length / MAP_ALIGN) * MAP_ALIGN;\n const ptr = memalign(MAP_ALIGN, size);\n if (!ptr) throw new Fs.ErrnoError(wasiErrno('ENOMEM'));\n const target = new Uint8Array(memory.buffer, ptr, size);\n target.fill(0);\n target.set(data.subarray(0, done));\n return { ptr, allocated: true };\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\ninterface DeviceFs {\n analyzePath?: (path: string) => { exists: boolean };\n registerDevice?: (dev: number, ops: object) => void;\n mkdev?: (path: string, mode: number, dev: number) => unknown;\n makedev?: (major: number, minor: number) => number;\n}\n\nconst CHAR_DEVICE = 0o20666;\n\nexport function useZeroDevices(Fs: ProcessFs): void {\n const { analyzePath, registerDevice, mkdev, makedev } = Fs as unknown as DeviceFs;\n if (!analyzePath || !registerDevice || !mkdev || !makedev) return;\n const zeros = (_s: unknown, buffer: Uint8Array, offset: number, length: number) => {\n buffer.fill(0, offset, offset + length);\n return length;\n };\n const devices = [\n ['/dev/zero', 5, (_s: unknown, _b: Uint8Array, _o: number, length: number) => length],\n [\n '/dev/full',\n 7,\n (_s: unknown, _b: Uint8Array, _o: number, length: number) => {\n if (length > 0) throw new Fs.ErrnoError(wasiErrno('ENOSPC'));\n return 0;\n },\n ],\n ] as const;\n for (const [path, minor, write] of devices) {\n if (analyzePath.call(Fs, path).exists) continue;\n const dev = makedev.call(Fs, 1, minor);\n registerDevice.call(Fs, dev, { read: zeros, write, llseek: () => 0 });\n mkdev.call(Fs, path, CHAR_DEVICE, dev);\n }\n}\n\nfunction linkStdio(Fs: ProcessFs): void {\n const { unlink, symlink } = Fs as { unlink?: (path: string) => void } & ProcessFs;\n if (!unlink || !symlink) return;\n for (const [fd, name] of ['stdin', 'stdout', 'stderr'].entries()) {\n try {\n unlink.call(Fs, `/dev/${name}`);\n } catch {}\n try {\n symlink.call(Fs, `/proc/self/fd/${fd}`, `/dev/${name}`);\n } catch {}\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 linkStdio(Fs);\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\nconst O_ACCMODE = 0o3;\nconst O_CREAT = 0o100;\n\nconst field = (text: string) =>\n (text || 'none').replace(/[\\s\\\\]/g, (c) => `\\\\${c.charCodeAt(0).toString(8).padStart(3, '0')}`);\n\nlet pinnedRoot: string | undefined;\n\nconst rootKind = (): string => (globalThis.navigator?.storage ? 'opfs' : 'memory');\n\nexport function pinRootKind(): void {\n pinnedRoot = rootKind();\n}\n\nexport function mountTable(mounts: MountLine[] = []): string {\n const root = pinnedRoot ?? rootKind();\n const lines = [`${root} / ${root} rw 0 0`, 'devfs /dev devfs rw 0 0', 'proc /proc proc rw 0 0'];\n for (const m of mounts) {\n const options = Object.entries(m.options).map(([k, v]) => (v === '' ? k : `${k}=${v}`));\n if (m.state !== 'ok') options.push(m.state);\n const access = options.includes('ro') ? [] : ['rw'];\n lines.push(\n `${field(m.source)} ${field(m.target)} ${m.type} ${[...access, ...options].join(',')} 0 0`\n );\n }\n return `${lines.join('\\n')}\\n`;\n}\n\nconst NAME = /^[a-z_][a-z0-9_-]*$/i;\n\nexport function accounts(env: Record<string, string> = {}): { passwd: string; group: string } {\n const user = env.USER ?? 'web_user';\n const name = NAME.test(user) && user !== 'root' ? user : 'user';\n const home = env.HOME || '/home';\n return {\n passwd: `root:x:0:0:root:/root:/bin/sh\\n${name}:x:1000:1000:${name}:${home}:/bin/bash\\n`,\n group: `root:x:0:\\n${name}:x:1000:\\n`,\n };\n}\n\nexport function useMounts(Fs: ProcessFs, env: Record<string, string> = {}, live = false): void {\n const { writeFile, mkdirTree } = Fs;\n if (typeof Fs.open !== 'function' || typeof writeFile !== 'function') return;\n const { passwd, group } = accounts(env);\n const backing: Record<string, string> = { '/etc/mtab': '/proc/mounts' };\n try {\n if (!live) writeFile.call(Fs, '/proc/mounts', mountTable());\n } catch {\n return;\n }\n try {\n mkdirTree.call(Fs, '/dev/.etc');\n writeFile.call(Fs, '/dev/.etc/passwd', passwd);\n writeFile.call(Fs, '/dev/.etc/group', group);\n writeFile.call(Fs, '/dev/.etc/hosts', hostsFile(hostnameOf(env)));\n writeFile.call(Fs, '/dev/.etc/hostname', `${hostnameOf(env)}\\n`);\n backing['/etc/passwd'] = '/dev/.etc/passwd';\n backing['/etc/group'] = '/dev/.etc/group';\n backing['/etc/hosts'] = '/dev/.etc/hosts';\n backing['/etc/hostname'] = '/dev/.etc/hostname';\n } catch {}\n const open = Fs.open.bind(Fs);\n Fs.open = (path, flags, mode) => {\n const instead = backing[path];\n if (!instead || (flags & (O_ACCMODE | O_CREAT)) !== 0) return open(path, flags, mode);\n try {\n return open(path, flags, mode);\n } catch (e) {\n if ((e as { errno?: unknown })?.errno !== wasiErrno('ENOENT')) throw e;\n return open(instead, flags, mode);\n }\n };\n}\n\nconst AT_FDCWD = -100;\nconst AT_EACCESS = 0x200;\n\ninterface AccessFs {\n lookupPath?(path: string, opts: { follow: boolean }): { node: LiveFsNode };\n cwd?(): string;\n getStream?(fd: number): { path?: string } | null | undefined;\n}\n\nfunction cString(memory: WebAssembly.Memory, at: number): string {\n const bytes = new Uint8Array(memory.buffer, at);\n return new TextDecoder().decode(bytes.subarray(0, bytes.indexOf(0)));\n}\n\nfunction baseOf(Fs: AccessFs, dirfd: number): string {\n return dirfd === AT_FDCWD ? (Fs.cwd?.() ?? '/') : (Fs.getStream?.(dirfd)?.path ?? '/');\n}\n\nconst W_ACCESS = 2;\n\nfunction readonlyRefusal(\n Fs: AccessFs,\n memory: WebAssembly.Memory,\n call: { dirfd: number; path: number; amode: number; flags: number }\n): number {\n if (!(call.amode & W_ACCESS)) return 0;\n try {\n const name = cString(memory, call.path);\n const abs = name.startsWith('/') ? name : `${baseOf(Fs, call.dirfd)}/${name}`;\n const follow = (call.flags & AT_SYMLINK_NOFOLLOW) === 0;\n const { node } = (Fs.lookupPath as NonNullable<AccessFs['lookupPath']>).call(Fs, abs, {\n follow,\n });\n const bridge = node.live ? node.mount.opts.bridge : undefined;\n const stat = (bridge as { stat?: (path: string) => { readonly?: boolean } } | undefined)?.stat;\n return stat?.(liveNodePath(node)).readonly ? -wasiErrno('EROFS') : 0;\n } catch {\n return 0;\n }\n}\n\nfunction kernelChecks(\n Fs: AccessFs,\n memory: WebAssembly.Memory,\n call: { dirfd: number; path: number; amode: number; flags: number }\n): number {\n const name = cString(memory, call.path);\n const abs = name.startsWith('/') ? name : `${baseOf(Fs, call.dirfd)}/${name}`;\n const lookupPath = Fs.lookupPath as NonNullable<AccessFs['lookupPath']>;\n const { node } = lookupPath.call(Fs, abs, { follow: (call.flags & AT_SYMLINK_NOFOLLOW) === 0 });\n const bridge = node.live ? node.mount.opts.bridge : undefined;\n if (!bridge?.owners || !bridge.access) return 0;\n const kind = call.flags & AT_EACCESS ? 'eaccess' : 'access';\n bridge.access(liveNodePath(node), call.amode, kind, (call.flags & AT_SYMLINK_NOFOLLOW) !== 0);\n return 0;\n}\n\nexport function kernelAccess(\n imports: WebAssembly.Imports,\n fs: () => ProcessFs | undefined,\n memory: () => WebAssembly.Memory | undefined,\n glue?: KernelImports\n): void {\n wrapImport(imports, 'faccessat', glue, (own) => (dirfd, path, amode, flags) => {\n const Fs = fs() as AccessFs | undefined;\n const heap = memory();\n const call = { dirfd, path, amode: amode & 7, flags };\n const refused = Fs?.lookupPath && heap ? readonlyRefusal(Fs, heap, call) : 0;\n if (refused !== 0) return refused;\n const rc = own(dirfd, path, amode, flags);\n if (rc !== 0 || !Fs?.lookupPath || !heap) return rc;\n try {\n return kernelChecks(Fs, heap, { dirfd, path, amode: amode & 7, flags });\n } catch (err) {\n return -errnoOf(err);\n }\n });\n}\n\nconst DEVICE_MODES: ReadonlyArray<[string, number]> = [\n ['/', 0o755],\n ['/dev', 0o755],\n ['/dev/null', 0o666],\n ['/dev/zero', 0o666],\n ['/dev/full', 0o666],\n ['/dev/random', 0o666],\n ['/dev/urandom', 0o666],\n ['/dev/tty', 0o666],\n ['/dev/shm', 0o1777],\n];\n\ninterface ChmodFs {\n chmod?(path: string, mode: number): void;\n}\n\nexport function linuxDevices(Fs: ProcessFs): void {\n const { chmod } = Fs as unknown as ChmodFs;\n if (!chmod) return;\n for (const [path, mode] of DEVICE_MODES) {\n try {\n chmod.call(Fs, path, mode);\n } catch {}\n }\n}\n", "import type { InheritedSlot } from '../kernel/children.ts';\nimport type { DeviceAccess, DeviceMeta, 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?: {\n orphan?: boolean;\n data?: Uint8Array;\n len?: number;\n handle?: number;\n ranged?: {\n pinnedVersion?: string;\n size(): number;\n read(at: number, length: number): Uint8Array;\n };\n };\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 if (live.ranged) return live.ranged.read(0, live.ranged.size());\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 const ranged = (stream.node as LiveNodeBag).live?.ranged;\n const version = ranged?.pinnedVersion;\n const pin = ranged && version !== undefined ? { version, size: ranged.size() } : undefined;\n const handle = (stream.node as LiveNodeBag).live?.handle;\n const held = { ...(pin ? { pin } : {}), ...(handle !== undefined ? { handle } : {}) };\n kfd = sys.openVfs(\n livePath(stream),\n stream.flags,\n stream.position,\n contents !== undefined\n ? { contents, orphan: true }\n : Object.keys(held).length > 0\n ? held\n : 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/full': 'full',\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\nexport function deviceOfStream(stream: ProcessStream): DeviceMeta | undefined {\n const device = stream.path === undefined ? undefined : DEVICES[stream.path];\n if (!device || stream.sliccKernelFd !== undefined) return undefined;\n const access = ACCESS[stream.flags & O_ACCMODE];\n return { device, ...(access ? { access } : {}) };\n}\n\nfunction inheritedSlot(fd: number, stream: ProcessStream): InheritedSlot | undefined {\n if (stream.sliccKernelFd === undefined) {\n const device = deviceOfStream(stream);\n return device ? { fd, ...device } : undefined;\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' || entry.kind === 'clipboard') 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 streams.describe(stream, `pipe:[${fixed}]`, () => ({\n ...node.node_ops?.getattr?.(node),\n mode: FIFO_MODE,\n ino: fixed,\n 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') {\n streams.attachFile(stream, entry.kernel);\n streams.sizeFromKernel(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 === 'clipboard') streams.reportClose(entry.kernel);\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 { ChildStdio, InheritedSlot } from '../kernel/children.ts';\nimport type { Cred, CredChange } from '../kernel/cred.ts';\nimport type { WasmSyscall } from '../kernel/process.ts';\nimport type { ForkState, ForkStream } from '../kernel/protocol.ts';\nimport { defaultAction } from '../kernel/signals.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 { deviceOfStream } from './process-fork.ts';\nimport type { HttpKernel } from './process-http.ts';\nimport type { SocketKernel } from './process-sockets.ts';\nimport type { Owner } from './realm-user.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nconst S_IFMT = 0o170000;\nconst S_IFDIR = 0o040000;\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 credOf(r: SyncFsResult): Cred | number {\n return r.ok ? ((r as { json?: unknown }).json as Cred) : -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\nfunction throughKernel(sig: number): boolean {\n if (sig === 0) return false;\n const action = defaultAction(sig);\n return action === 'terminate' || action === 'stop';\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 cred(): Cred | number;\n\n setcred(change: CredChange): Cred | number;\n\n tcgetpgrp(fd: number): number;\n\n tcsetpgrp(fd: number, pgrp: number): number;\n\n execWait(pid: number): number;\n\n execve(\n file: string,\n argv: string[],\n env: Record<string, string> | null,\n cwd: string | null\n ): number;\n\n mount(source: string, target: string, fstype: string, flags: number, data: string): number;\n\n umount2(target: string, flags: 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 hostname?: string;\n\n http?: HttpKernel;\n}\n\nexport interface ProcessKernelDeps {\n transport: SyncSabTransport;\n owner?: Owner;\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 memory?(): WebAssembly.Memory | undefined;\n\n deliveries?(): number;\n}\n\nfunction restarted(issue: () => SyncFsResult): SyncFsResult {\n for (;;) {\n const r = issue();\n if (r.ok || r.errno !== 'EINTR') return r;\n }\n}\n\nfunction forkRestarted(\n deps: ProcessKernelDeps,\n state: ForkState,\n snapshotAt: number | undefined\n): SyncFsResult {\n let memory = state.memory;\n let seen = snapshotAt;\n return restarted(() => {\n const streams = deps.describeFork();\n const now = deps.deliveries?.();\n if (now !== seen) {\n seen = now;\n const live = deps.memory?.();\n if (live) memory = new Uint8Array(live.buffer).slice();\n }\n const forked = { ...state, memory, streams, cwd: deps.Fs.cwd() };\n return deps.transport.call(\n { op: 'proc-fork', state: forked, restart: true },\n Infinity,\n 'proc-fork'\n );\n });\n}\n\nfunction flushed(beforeSpawn: () => void): number {\n try {\n beforeSpawn();\n return 0;\n } catch (err) {\n const errno = (err as { errno?: unknown } | null)?.errno;\n if (typeof errno !== 'number') throw err;\n return -errno;\n }\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\nfunction anySelect(\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;\n const own = (fd: number) => kernel(fd) === undefined;\n if (![...read, ...write].some(own)) 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\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 at = (path: string) => (path === '' || path.startsWith('/') ? path : `${Fs.cwd()}/${path}`);\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.node?.mode ?? 0) & S_IFMT) === S_IFDIR && stream.path) return { dir: stream.path };\n const device = deviceOfStream(stream);\n if (device) return device;\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 const execCaptures = new Map<number, () => void>();\n\n const execWait = (pid: number): number => {\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\n const spawnChild = (\n file: string,\n argv: string[],\n env: Record<string, string> | null,\n cwd: string | null,\n fds: number[],\n actions: ReadonlyArray<readonly [number, number]> | undefined,\n exec: boolean\n ): number => {\n const unflushed = flushed(deps.beforeSpawn);\n if (unflushed < 0) return unflushed;\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 req = {\n op: 'proc-spawn' as const,\n file,\n argv,\n env: env ?? deps.env,\n cwd: cwd ?? Fs.cwd(),\n stdio,\n ...(inherit.length > 0 ? { inherit } : {}),\n ...(exec ? { exec } : {}),\n restart: true as const,\n };\n const r = restarted(() => transport.call(req, Infinity, `proc-spawn ${file}`));\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 if (exec) {\n execCaptures.set(pid, () => {\n for (const n of captures) deliver(pid, n, fds[n] as number);\n });\n return pid;\n }\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\n return {\n spawn(file, argv, env, cwd, fds, actions) {\n return spawnChild(file, argv, env, cwd, fds, actions, false);\n },\n fork(state) {\n const snapshotAt = deps.deliveries?.();\n const unflushed = flushed(deps.beforeSpawn);\n if (unflushed < 0) return unflushed;\n const r = forkRestarted(deps, state, snapshotAt);\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) => anySelect(Fs, transport, read, write, timeoutMs),\n execWait: execWait,\n execve(file, argv, env, cwd) {\n const pid = spawnChild(file, argv, env, cwd, [0, 1, 2], undefined, true);\n if (pid < 0) return pid;\n const status = execWait(pid);\n execCaptures.get(pid)?.();\n execCaptures.delete(pid);\n return status;\n },\n pause() {\n return status(call({ op: 'sig-pause' }, 'pause'));\n },\n mount(source, target, type, flags, data) {\n const req = { op: 'mount' as const, source, target: at(target), type, flags, data };\n return status(call(req, `mount ${target}`));\n },\n umount2(target, flags) {\n return status(call({ op: 'umount', target: at(target), flags }, `umount ${target}`));\n },\n kill(pid, sig) {\n if (pid === deps.pid && !throughKernel(sig)) {\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 cred: () => credOf(call({ op: 'proc-cred' }, 'cred')),\n setcred(change) {\n const cred = credOf(call({ op: 'proc-setcred', change }, 'setcred'));\n if (typeof cred === 'object' && deps.owner) {\n deps.owner.uid = cred.euid;\n deps.owner.gid = cred.egid;\n }\n return cred;\n },\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 { 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_KILLED, SAB_I_SIGNALS, SAB_I_TIMERS } from '../realm/sync-sab-wire.ts';\n\nexport interface SignalHooks {\n masks(): { caught: number; ignored: number; restart: number; defaults?: number } | null;\n\n raise(sig: number): void;\n\n timer?(which: number): void;\n\n killed?(code: 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 unwinding = false;\n\n private quieted = 0;\n\n private delivered = 0;\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 deliveries(): number {\n return this.delivered;\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, defaults = 0 } = masks;\n const same = caught === this.reported.caught && ignored === this.reported.ignored;\n if (same && defaults === 0) return;\n this.reported = { caught, ignored };\n const req = { op: 'sig-mask' as const, caught, ignored, ...(defaults ? { defaults } : {}) };\n this.raw.call(req, Number.POSITIVE_INFINITY, 'sig-mask');\n }\n\n quiet<T>(fn: () => T): T {\n this.quieted++;\n try {\n return fn();\n } finally {\n this.quieted--;\n }\n }\n\n interrupt(): boolean {\n this.report();\n const header = this.header;\n const pending =\n Atomics.load(header, SAB_I_SIGNALS) |\n Atomics.load(header, SAB_I_TIMERS) |\n Atomics.load(header, SAB_I_KILLED);\n if (pending === 0) return false;\n this.deliver();\n return true;\n }\n\n deliver(): void {\n if (this.quieted > 0) return;\n const killed = Atomics.load(this.header, SAB_I_KILLED);\n if (killed !== 0 && !this.unwinding && this.hooks.killed) {\n this.unwinding = true;\n this.hooks.killed(killed);\n }\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 if (pending !== 0 || timers !== 0) this.delivered++;\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 resolve(name: string, family?: 0 | 4 | 6): string[] | 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 resolve: (name, family = 4) =>\n guard(() => json({ op: 'sock-resolve', name, family }) as string[]),\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 { ROOT } from '../kernel/cred.ts';\nimport type { MountLine, ProcessInfo, ProcessListing } from '../kernel/proc-info.ts';\nimport { mountTable } from './process-fds.ts';\n\nconst HZ = 100;\nconst DIR_MODE = 0o40555;\nconst FILE_MODE = 0o100444;\nconst LINK_MODE = 0o120777;\nconst ENOENT = 44;\nconst EINVAL = 28;\nconst UID = 1000;\nconst KIB = 1024;\nconst FALLBACK_MEMORY = 4 * KIB * KIB * KIB;\n\nexport const PID_FILES = ['cmdline', 'comm', 'stat', 'statm', 'status'] as const;\nexport const SYSTEM_FILES = ['loadavg', 'meminfo', 'stat', 'uptime'] as const;\n\ntype PidFile = (typeof PID_FILES)[number];\ntype SystemFile = (typeof SYSTEM_FILES)[number];\n\nexport interface ProcSys {\n procList?(): ProcessListing;\n mountList?(): MountLine[];\n}\n\nexport interface MemorySource {\n deviceMemory?: number;\n usedHeap?: number;\n}\n\nexport function commOf(info: ProcessInfo): string {\n const name = info.argv[0] ?? '';\n return name.slice(name.lastIndexOf('/') + 1).slice(0, 15);\n}\n\nexport function ttyNumber(tty: string | null): number {\n const pts = tty && /^\\/dev\\/pts\\/(\\d+)$/.exec(tty);\n if (pts) return (136 << 8) | Number(pts[1]);\n const vt = tty && /^\\/dev\\/tty(\\d+)$/.exec(tty);\n return vt ? (4 << 8) | Number(vt[1]) : 0;\n}\n\nfunction pages(bytes: number): number {\n return Math.ceil(bytes / 4096);\n}\n\nfunction ticks(ms: number): number {\n return Math.max(0, Math.floor((ms * HZ) / 1000));\n}\n\nexport function pidStat(info: ProcessInfo, boot: number): string {\n const fields = [\n info.pid,\n `(${commOf(info)})`,\n info.state,\n info.ppid,\n info.pgid,\n info.sid,\n ttyNumber(info.tty),\n info.tty ? info.pgid : -1,\n 0x400000,\n 0,\n 0,\n 0,\n 0,\n ticks(info.utime ?? 0),\n ticks(info.stime ?? 0),\n ticks(info.cutime ?? 0),\n ticks(info.cstime ?? 0),\n 20,\n 0,\n 1,\n 0,\n ticks(info.started - boot),\n info.memory,\n pages(info.memory),\n '18446744073709551615',\n ...Array<number>(12).fill(0),\n 17,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n ...Array<number>(7).fill(0),\n 0,\n ];\n return `${fields.join(' ')}\\n`;\n}\n\nconst sigMask = (mask = 0): string => (mask >>> 1).toString(16).padStart(16, '0');\n\nconst STATES = { S: 'S (sleeping)', T: 'T (stopped)', Z: 'Z (zombie)' } as const;\n\nexport function pidStatus(info: ProcessInfo): string {\n const state = STATES[info.state];\n const c = info.cred ?? ROOT;\n const ids = (r: number, e: number, s: number) => `${r}\\t${e}\\t${s}\\t${e}`;\n return [\n `Name:\\t${commOf(info)}`,\n `Umask:\\t${(info.umask ?? 0o022).toString(8).padStart(4, '0')}`,\n `State:\\t${state}`,\n `Tgid:\\t${info.pid}`,\n 'Ngid:\\t0',\n `Pid:\\t${info.pid}`,\n `PPid:\\t${info.ppid}`,\n 'TracerPid:\\t0',\n `Uid:\\t${ids(c.ruid, c.euid, c.suid)}`,\n `Gid:\\t${ids(c.rgid, c.egid, c.sgid)}`,\n 'FDSize:\\t64',\n `VmSize:\\t${Math.ceil(info.memory / KIB)} kB`,\n `VmRSS:\\t${Math.ceil(info.memory / KIB)} kB`,\n `Groups:\\t${c.groups.join(' ')}`,\n `NSpid:\\t${info.pid}`,\n `NSpgid:\\t${info.pgid}`,\n `NSsid:\\t${info.sid}`,\n 'Threads:\\t1',\n 'SigQ:\\t0/0',\n 'SigPnd:\\t0000000000000000',\n 'ShdPnd:\\t0000000000000000',\n 'SigBlk:\\t0000000000000000',\n `SigIgn:\\t${sigMask(info.sigIgn)}`,\n `SigCgt:\\t${sigMask(info.sigCgt)}`,\n '',\n ].join('\\n');\n}\n\nexport function pidFile(name: PidFile, info: ProcessInfo, boot: number): string {\n if (name === 'cmdline') return info.state === 'Z' ? '' : `${info.argv.join('\\0')}\\0`;\n if (name === 'comm') return `${commOf(info)}\\n`;\n if (name === 'stat') return pidStat(info, boot);\n if (name === 'statm') {\n const p = pages(info.memory);\n return `${p} ${p} 0 0 0 ${p} 0\\n`;\n }\n return pidStatus(info);\n}\n\nexport function memoryInfo(source: MemorySource, used = 0): string {\n const total = source.deviceMemory ? source.deviceMemory * KIB * KIB * KIB : FALLBACK_MEMORY;\n const free = Math.max(0, total - used - (source.usedHeap ?? 0));\n const kb = (bytes: number) => `${Math.floor(bytes / KIB)} kB`;\n return [\n ['MemTotal', kb(total)],\n ['MemFree', kb(free)],\n ['MemAvailable', kb(free)],\n ['Buffers', kb(0)],\n ['Cached', kb(0)],\n ['SwapCached', kb(0)],\n ['Shmem', kb(0)],\n ['SReclaimable', kb(0)],\n ['SwapTotal', kb(0)],\n ['SwapFree', kb(0)],\n ]\n .map(([key, value]) => `${`${key}:`.padEnd(16)}${value.padStart(12)}`)\n .concat('')\n .join('\\n');\n}\n\nexport function systemFile(\n name: SystemFile,\n listing: ProcessListing,\n now: number,\n memory: MemorySource\n): string {\n const up = Math.max(0, now - listing.boot) / 1000;\n if (name === 'uptime') return `${up.toFixed(2)} ${up.toFixed(2)}\\n`;\n if (name === 'meminfo') {\n return memoryInfo(\n memory,\n listing.processes.reduce((sum, p) => sum + p.memory, 0)\n );\n }\n const live = listing.processes.filter((p) => p.state !== 'Z');\n if (name === 'loadavg') {\n const last = Math.max(0, ...listing.processes.map((p) => p.pid));\n const [one, five, fifteen] = (listing.load ?? [0, 0, 0]).map((n) => n.toFixed(2));\n return `${one} ${five} ${fifteen} 1/${live.length} ${last}\\n`;\n }\n const sum = (key: 'utime' | 'stime') =>\n listing.cpu?.[key] ?? listing.processes.reduce((n, p) => n + (p[key] ?? 0), 0);\n const user = ticks(sum('utime'));\n const system = ticks(sum('stime'));\n const idle = listing.cpu\n ? ticks(listing.cpu.idle)\n : Math.max(0, ticks(now - listing.boot) - user - system);\n return [\n `cpu ${user} 0 ${system} ${idle} 0 0 0 0 0 0`,\n `cpu0 ${user} 0 ${system} ${idle} 0 0 0 0 0 0`,\n 'intr 0',\n 'ctxt 0',\n `btime ${Math.floor(listing.boot / 1000)}`,\n `processes ${listing.processes.length}`,\n 'procs_running 1',\n 'procs_blocked 0',\n '',\n ].join('\\n');\n}\n\nexport function memorySource(scope: object = globalThis): MemorySource {\n const nav = (scope as { navigator?: { deviceMemory?: unknown } }).navigator;\n const perf = (scope as { performance?: { memory?: { usedJSHeapSize?: unknown } } }).performance;\n const deviceMemory = nav?.deviceMemory;\n const used = perf?.memory?.usedJSHeapSize;\n return {\n ...(typeof deviceMemory === 'number' && deviceMemory > 0 ? { deviceMemory } : {}),\n ...(typeof used === 'number' ? { usedHeap: used } : {}),\n };\n}\n\ninterface ProcNode {\n name: string;\n mode: number;\n id?: number;\n parent?: ProcNode;\n node_ops: {\n lookup?: (parent: ProcNode, name: string) => ProcNode;\n readdir?: (node: ProcNode) => string[];\n getattr?: (node: ProcNode) => object;\n setattr?: (node: ProcNode, attr: object) => void;\n readlink?: (node: ProcNode) => string;\n };\n stream_ops?: object;\n}\n\ninterface ProcStream {\n node: ProcNode;\n position: number;\n sliccProc?: Uint8Array;\n getdents?: string[] | null;\n fd?: number | null;\n}\n\ninterface DirStreamOps {\n open?: (stream: ProcStream) => void;\n dup?: (stream: ProcStream) => void;\n close?: (stream: ProcStream) => void;\n}\n\nexport interface ProcFs {\n lookupPath?(path: string, opts?: { follow?: boolean }): { node: object };\n createNode?(parent: object, name: string, mode: number, rdev: number): object;\n hashRemoveNode?(node: object): void;\n streams?: unknown[];\n ErrnoError: new (errno: number) => Error;\n}\n\nfunction attr(node: ProcNode): object {\n const now = new Date();\n return {\n dev: 3,\n ino: node.id,\n mode: node.mode,\n nlink: 1,\n uid: UID,\n gid: UID,\n rdev: 0,\n size: 0,\n atime: now,\n mtime: now,\n ctime: now,\n blksize: 4096,\n blocks: 0,\n };\n}\n\nexport function useProcfs(Fs: ProcFs, sys: ProcSys, pid: number, memory = memorySource()): void {\n const { lookupPath, createNode, hashRemoveNode } = Fs;\n const procList = sys.procList?.bind(sys);\n if (!lookupPath || !createNode || !hashRemoveNode || !procList) return;\n let proc: ProcNode;\n let self: ProcNode;\n try {\n proc = lookupPath.call(Fs, '/proc', { follow: true }).node as ProcNode;\n self = lookupPath.call(Fs, '/proc/self', { follow: true }).node as ProcNode;\n } catch {\n return;\n }\n const error = (errno = ENOENT) => new Fs.ErrnoError(errno);\n const fresh = (parent: ProcNode, name: string, mode: number): ProcNode => {\n const node = createNode.call(Fs, parent, name, mode, 0) as ProcNode;\n hashRemoveNode.call(Fs, node);\n node.node_ops = { getattr: attr, setattr: () => {} };\n node.stream_ops = {\n llseek: (stream: ProcStream, offset: number, whence: number) => {\n const at = (whence === 1 ? stream.position : 0) + offset;\n if (at < 0) throw error(EINVAL);\n return at;\n },\n };\n return node;\n };\n const file = (parent: ProcNode, name: string, content: () => string): ProcNode => {\n const node = fresh(parent, name, FILE_MODE);\n node.stream_ops = {\n open: (stream: ProcStream) => {\n stream.sliccProc = new TextEncoder().encode(content());\n },\n read: (\n stream: ProcStream,\n buffer: Uint8Array,\n offset: number,\n length: number,\n at: number\n ) => {\n const data = stream.sliccProc ?? new Uint8Array(0);\n const chunk = data.subarray(at, at + length);\n buffer.set(chunk, offset);\n return chunk.length;\n },\n llseek: (stream: ProcStream, offset: number, whence: number) => {\n const end = stream.sliccProc?.length ?? 0;\n const at = (whence === 1 ? stream.position : whence === 2 ? end : 0) + offset;\n if (at < 0) throw error(EINVAL);\n return at;\n },\n };\n return node;\n };\n const find = (processes: ProcessInfo[], target: number, own: boolean) =>\n (own ? processes.find((p) => p.tid === target) : undefined) ??\n processes.find((p) => p.pid === target || p.tid === target);\n const infoOf = (target: number): ProcessInfo | undefined =>\n find(procList().processes, target, false);\n const pidContent =\n (target: number, name: PidFile, own = false) =>\n () => {\n const listing = procList();\n const info = find(listing.processes, target, own);\n if (!info) throw error();\n return pidFile(name, info, listing.boot);\n };\n const pidNames = (names: string[]) => [...new Set([...names, ...PID_FILES])];\n const pidDir = (name: string, target: number): ProcNode => {\n const dir = fresh(proc, name, DIR_MODE);\n dir.node_ops.lookup = (parent, child) => {\n if (!(PID_FILES as readonly string[]).includes(child)) throw error();\n return file(parent, child, pidContent(target, child as PidFile));\n };\n dir.node_ops.readdir = () => ['.', '..', ...PID_FILES];\n return dir;\n };\n const scans = new Map<ProcStream, Set<number>>();\n const listed = (target: number) => {\n let found = false;\n for (const [stream, pids] of scans) {\n if (Fs.streams && Fs.streams[stream.fd ?? -1] !== stream) scans.delete(stream);\n else found ||= pids.has(target);\n }\n return found;\n };\n const procOps = proc.node_ops;\n const lookup = procOps.lookup?.bind(procOps);\n const readdir = procOps.readdir?.bind(procOps);\n const listAll = (node: ProcNode) => {\n const names = new Set(readdir ? readdir(node) : ['.', '..']);\n for (const name of [...SYSTEM_FILES, 'mounts']) names.add(name);\n for (const p of procList().processes) names.add(String(p.pid));\n return [...names];\n };\n proc.node_ops = {\n ...procOps,\n lookup: (parent, name) => {\n if (/^[1-9]\\d*$/.test(name)) {\n if (!infoOf(Number(name)) && !listed(Number(name))) throw error();\n return pidDir(name, Number(name));\n }\n if (name === 'mounts') return file(parent, name, () => mountTable(sys.mountList?.() ?? []));\n if ((SYSTEM_FILES as readonly string[]).includes(name)) {\n return file(parent, name, () =>\n systemFile(name as SystemFile, procList(), Date.now(), memory)\n );\n }\n if (!lookup) throw error();\n return lookup(parent, name);\n },\n readdir: (node) => listAll(node),\n };\n const track = (stream: ProcStream, names: string[] | null | undefined) => {\n let current = names;\n const remember = (list: string[]) =>\n scans.set(stream, new Set(list.filter((n) => /^[1-9]\\d*$/.test(n)).map(Number)));\n remember(current ?? []);\n Object.defineProperty(stream, 'getdents', {\n configurable: true,\n enumerable: true,\n get: () => current,\n set: (next: string[] | null) => {\n current = next;\n if (next) remember(next);\n },\n });\n };\n const dirOps = (proc.stream_ops ?? {}) as DirStreamOps;\n proc.stream_ops = {\n ...dirOps,\n open: (stream: ProcStream) => {\n dirOps.open?.(stream);\n track(stream, listAll(proc));\n },\n dup: (stream: ProcStream) => {\n dirOps.dup?.(stream);\n track(stream, stream.getdents);\n },\n close: (stream: ProcStream) => {\n scans.delete(stream);\n dirOps.close?.(stream);\n },\n };\n hashRemoveNode.call(Fs, self);\n const link = fresh(proc, 'self', LINK_MODE);\n const shownPid = () => String(find(procList().processes, pid, true)?.pid ?? pid);\n link.node_ops.readlink = shownPid;\n const procLookup = proc.node_ops.lookup as NonNullable<ProcNode['node_ops']['lookup']>;\n proc.node_ops.lookup = (parent, name) =>\n name === 'self' ? link : name === shownPid() ? self : procLookup(parent, name);\n const selfOps = self.node_ops;\n const selfLookup = selfOps.lookup?.bind(selfOps);\n const selfReaddir = selfOps.readdir?.bind(selfOps);\n self.node_ops = {\n ...selfOps,\n lookup: (parent, name) => {\n if ((PID_FILES as readonly string[]).includes(name)) {\n return file(parent, name, pidContent(pid, name as PidFile, true));\n }\n if (!selfLookup) throw error();\n return selfLookup(parent, name);\n },\n readdir: (node) => pidNames(selfReaddir ? selfReaddir(node) : ['.', '..']),\n };\n}\n", "import type { Cred } from '../kernel/cred.ts';\nimport type { ProcessFs } from './kernel-streams.ts';\n\nexport interface Owner {\n uid: number;\n gid: number;\n}\n\nexport const LEGACY_OWNER: Readonly<Owner> = Object.freeze({ uid: 1000, gid: 1000 });\n\nconst CRED_ABI = /\\bslicc_cred_js\\b/;\n\nexport function credAbi(glue: string): boolean {\n return CRED_ABI.test(glue);\n}\n\nexport function ownByCaller(Fs: ProcessFs, cred?: Readonly<Cred>, abi = true): Owner {\n const owner = abi ? { uid: cred?.euid ?? 0, gid: cred?.egid ?? 0 } : { ...LEGACY_OWNER };\n const { stat, fstat } = Fs;\n const owned = (attr: object): object => ({ ...attr, uid: owner.uid, gid: owner.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 return owner;\n}\n", "import type { DeviceMeta, HeldMeta, PollState } from '../kernel/fd-table.ts';\nimport { hostnameOf } from '../kernel/net/loopback-names.ts';\nimport type { MountLine, ProcessListing } from '../kernel/proc-info.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 { SYNC_FS_OPS, 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 {\n publishMemory,\n SAB_HEADER_I32,\n SAB_I_STOP,\n type SyncSabRequestBody,\n} from '../realm/sync-sab-wire.ts';\nimport {\n KernelStreams,\n type ProcessFs,\n type ProcessPipeFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n type TtyOwner,\n} from './kernel-streams.ts';\nimport { createProcessKernel, type ProcessKernel } from './process-children.ts';\nimport {\n type FdImports,\n type GlueSyscalls,\n type KernelImports,\n kernelAccess,\n kernelUmask,\n linuxDevices,\n type Memalign,\n noFollowUtimes,\n pathOpensLinks,\n positionalIo,\n syncFsync,\n trackCloseOnExec,\n useDevFd,\n useFileMmap,\n useMounts,\n useZeroDevices,\n wasmMemory,\n wrapCloexecSyscalls,\n wrapImport,\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 { type ProcFs, useProcfs } from './procfs.ts';\nimport { credAbi, type Owner, ownByCaller } from './realm-user.ts';\n\nexport {\n type ProcessFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n} from './kernel-streams.ts';\n\nconst FS_OPS: ReadonlySet<string> = new Set(SYNC_FS_OPS);\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 ...(opts?.created ? { created: true } : {}),\n ...(opts?.pin ? { pin: opts.pin } : {}),\n ...(opts?.handle !== undefined ? { handle: opts.handle } : {}),\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 kind(fd) {\n return (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { kind?: string })?.kind;\n },\n heldMeta(fd) {\n return (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { meta?: HeldMeta }).meta;\n },\n access(fd) {\n return (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { access?: 'read' | 'write' })\n .access;\n },\n size(fd) {\n return (json(call({ op: 'fd-vfs-stat', fd }, `fd-vfs-stat ${fd}`)) as { size: number }).size;\n },\n ttyNames() {\n return json(call({ op: 'fd-tty-names' }, 'fd-tty-names')) as string[];\n },\n ttyOwner(name) {\n return json(call({ op: 'fd-tty-owner', name }, `fd-tty-owner ${name}`)) as TtyOwner | null;\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, flush) {\n call({ op: 'tty-set', fd, termios, ...(flush ? { flush } : {}) }, `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 openSealed() {\n return json(call({ op: 'fd-open-sealed' }, 'fd-open-sealed')) as number;\n },\n openClipboard(flags) {\n return json(call({ op: 'fd-open-clipboard', flags }, 'fd-open-clipboard')) as number;\n },\n ptyNumbers() {\n return json(call({ op: 'pty-list' }, 'pty-list')) as number[];\n },\n procList() {\n return json(call({ op: 'proc-list' }, 'proc-list')) as ProcessListing;\n },\n mountList() {\n return json(call({ op: 'mount-list' }, 'mount-list')) as MountLine[];\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;\nconst O_ACCMODE = 3;\n\nconst O_DIRECTORY = 0o200000;\n\nconst accessMode = (access: 'read' | 'write' | undefined): number =>\n access === 'read' ? O_RDONLY : access === 'write' ? O_WRONLY : O_RDWR;\n\nfunction openDevice(Fs: ProcessFs, fd: number, meta: DeviceMeta): boolean {\n return openAt(Fs, fd, `/dev/${meta.device}`, accessMode(meta.access));\n}\n\nfunction openHeld(Fs: ProcessFs, fd: number, meta: HeldMeta): boolean {\n return 'dir' in meta\n ? openAt(Fs, fd, meta.dir, O_RDONLY | O_DIRECTORY)\n : openDevice(Fs, fd, meta);\n}\n\nfunction openAt(Fs: ProcessFs, fd: number, path: string, flags: number): boolean {\n let stream: ProcessStream;\n try {\n stream = Fs.open(path, 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\nconst PLACED: ReadonlySet<string> = new Set(['stream', 'file', 'socket', 'clipboard']);\n\nexport function wireKernelStdio(Fs: ProcessFs, streams: KernelStreams, sys?: ProcessSys): void {\n for (const fd of [0, 1, 2]) {\n const stream = Fs.getStream(fd);\n if (!stream) continue;\n const kind = sys?.kind?.(fd);\n const meta = kind === 'device' || kind === 'held' ? sys?.heldMeta?.(fd) : undefined;\n if (meta && openHeld(Fs, fd, meta)) continue;\n if (kind && PLACED.has(kind)) {\n const flags = sys?.access\n ? (stream.flags & ~O_ACCMODE) | accessMode(sys.access(fd))\n : stream.flags;\n Fs.closeStream(fd);\n const kernel = { fd, kernel: fd, kind: kind as InheritedFd['kind'], flags };\n placeKernelStream(Fs, streams, kernel).flags = flags;\n continue;\n }\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 \"if (typeof thisProgram !== 'undefined' && Module.thisProgram === '') thisProgram = '';\",\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.sliccKernelImports ??= {',\n \" openat: typeof ___syscall_openat === 'function' ? ___syscall_openat : undefined,\",\n \" mkdirat: typeof ___syscall_mkdirat === 'function' ? ___syscall_mkdirat : undefined,\",\n \" mknodat: typeof ___syscall_mknodat === 'function' ? ___syscall_mknodat : undefined,\",\n \" umask: typeof ___syscall_umask === 'function' ? ___syscall_umask : undefined,\",\n \" faccessat: typeof ___syscall_faccessat === 'function' ? ___syscall_faccessat : undefined,\",\n \" utimensat: typeof ___syscall_utimensat === 'function' ? ___syscall_utimensat : undefined,\",\n \" getppid: typeof _slicc_getppid_js === 'function' ? _slicc_getppid_js : undefined,\",\n \" resizeHeap: typeof _emscripten_resize_heap === 'function' ? _emscripten_resize_heap : undefined,\",\n \" fdWrite: typeof _fd_write === 'function' ? _fd_write : undefined,\",\n \" fdRead: typeof _fd_read === 'function' ? _fd_read : undefined,\",\n \" sleepMs: typeof slicc_sleep_ms === 'function' ? slicc_sleep_ms : 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 identify(\n transport: SyncSabTransport,\n init: { pid: number; ppid?: number }\n): { pid: number; ppid: number } {\n const r = transport.call({ op: 'proc-identity' }, Number.POSITIVE_INFINITY, 'proc-identity');\n const id = r.ok && r.kind === 'json' ? (r.json as { pid: number; ppid: number } | null) : null;\n return id ?? { pid: init.pid, ppid: init.ppid ?? 1 };\n}\n\nexport function liveParent(\n imports: WebAssembly.Imports,\n parent: () => number,\n glue?: KernelImports\n): void {\n wrapImport(imports, 'getppid', glue, () => parent);\n}\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 function reportGrowth(\n imports: WebAssembly.Imports,\n publish: () => void,\n glue?: KernelImports\n): void {\n wrapImport(imports, 'resizeHeap', glue, (resize) => (...args) => {\n const grown = resize(...args);\n publish();\n return grown;\n });\n}\n\nexport function holdWhileStopped(\n imports: WebAssembly.Imports,\n header: Int32Array,\n glue?: KernelImports\n): void {\n const hold = () => {\n while (Atomics.load(header, SAB_I_STOP) === 1) Atomics.wait(header, SAB_I_STOP, 1);\n };\n for (const name of ['fdWrite', 'fdRead', 'sleepMs'] as const) {\n wrapImport(imports, name, glue, (original) => (...args) => {\n hold();\n const done = original(...args);\n hold();\n return done;\n });\n }\n}\n\nfunction callerOwner(Fs: ProcessFs, init: WasmProcessInitMsg): { owner?: Owner } {\n return init.owners ? {} : { owner: ownByCaller(Fs, init.cred, credAbi(init.program.glue)) };\n}\n\nfunction utimensatOf(module: object): unknown {\n return ownValue<{ utimensat?: unknown }>(module, 'sliccSyscalls')?.utimensat;\n}\n\ninterface WrapperDeps {\n init: WasmProcessInitMsg;\n transport: SyncSabTransport;\n sys: ProcessSys;\n memory: () => WebAssembly.Memory | undefined;\n ppid: () => number;\n}\n\nfunction kernelWrappers(imports: WebAssembly.Imports, module: object, deps: WrapperDeps): void {\n const { init, transport, sys, memory } = deps;\n const kernelGlue = ownValue<KernelImports>(module, 'sliccKernelImports');\n liveParent(imports, deps.ppid, kernelGlue);\n kernelUmask(imports, {\n glue: kernelGlue,\n initial: init.umask ?? 0o022,\n memory,\n set: (mask) =>\n void transport.call({ op: 'proc-umask', mask }, Number.POSITIVE_INFINITY, 'umask'),\n });\n const fsOf = () => ownValue<ProcessFs>(module, 'FS');\n noFollowUtimes(imports, fsOf, kernelGlue?.utimensat ?? utimensatOf(module), memory);\n kernelAccess(imports, fsOf, memory, kernelGlue);\n const glue = ownValue<FdImports>(module, 'sliccFdImports');\n syncFsync(imports, fsOf, glue);\n positionalIo(imports, { glue, fs: fsOf, sys, memory });\n const grown = () => publishMemory(init.sab, memory()?.buffer.byteLength ?? 0);\n reportGrowth(imports, grown, kernelGlue);\n holdWhileStopped(imports, new Int32Array(init.sab, 0, SAB_HEADER_I32), kernelGlue);\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 memory: () => memory?.buffer.byteLength ?? 0,\n }),\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 gated = signals.transport();\n let early = (): void => {};\n const transport: SyncSabTransport = {\n call: (req, timeoutMs, label) => {\n if (!FS_OPS.has(req.op)) early();\n return gated.call(req, timeoutMs, label);\n },\n };\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 let exports: WebAssembly.Exports | undefined;\n let atExit: () => () => void = () => () => {};\n const initialized = new Promise<void>((resolve, reject) => {\n ready = resolve;\n failed = reject;\n });\n const id = identify(transport, init);\n const module = {\n noInitialRun: true,\n thisProgram: init.argv0,\n sliccPid: id.pid,\n sliccPpid: id.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 kernelWrappers(imports, module, {\n init,\n transport,\n sys,\n memory: () => memory,\n ppid: () => identify(transport, init).ppid,\n });\n return WebAssembly.instantiate(init.program.module, imports);\n })\n .then((instance) => {\n memory = wasmMemory(instance, imports);\n exports = instance.exports;\n publishMemory(init.sab, memory?.buffer.byteLength ?? 0);\n done(\n withExitHook(instance, () => atExit()),\n init.program.module\n );\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 pathOpensLinks(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 if (init.owners) linuxDevices(running.FS);\n const vfs = mountVfsIntoEmscripten(running.FS, {\n bridge: createSyncFsSabBridge(transport, init.owners ? { owners: true } : {}),\n cwd: init.cwd,\n warn: deps.warn ?? say(2),\n });\n early = () => signals.quiet(() => vfs.flushDirty());\n const sigpipe = (): boolean => running.sliccSigpipe?.() === 1;\n const restartable = (): boolean => signals.restartable();\n const owners = init.owners ? { owners: true } : {};\n const streams = new KernelStreams(running.FS, sys, {\n sigpipe,\n restartable,\n ...owners,\n program: init.argv0,\n });\n trackCloseOnExec(running.FS);\n quietQuit(running.FS as unknown as QuitFs, (on) => {\n streams.quitting = on;\n });\n atExit = () => streams.exiting();\n useMounts(running.FS, init.env, true);\n useZeroDevices(running.FS);\n useProcfs(running.FS as unknown as ProcFs, sys, init.pid);\n if (init.fork) restoreForkedStreams(running.FS, streams, init.fork.streams ?? []);\n else {\n wireKernelStdio(running.FS, streams, sys);\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 useFileMmap(running.FS, {\n sys,\n memory: () => memory,\n memalign: () => exports?.emscripten_builtin_memalign as Memalign | undefined,\n });\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 memory: () => memory,\n deliveries: () => signals.deliveries(),\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 ...callerOwner(running.FS, init),\n });\n running.sliccKernel.http = createHttpKernel(transport);\n running.sliccKernel.hostname = hostnameOf(init.env);\n running.sliccKernel.net = createSocketKernel({\n transport,\n Fs: running.FS,\n sys,\n streams,\n sigpipe,\n restartable,\n });\n try {\n return streams.exitStatus(runMain(running, init));\n } finally {\n try {\n vfs.flush();\n } catch {}\n }\n}\n\ninterface QuitFs {\n quit?: () => void;\n close: (stream: unknown) => void;\n}\n\nfunction withExitHook(\n instance: WebAssembly.Instance,\n begin: () => () => void\n): WebAssembly.Instance {\n const funcs = instance.exports.__funcs_on_exit;\n if (typeof funcs !== 'function') return instance;\n const run = funcs as () => void;\n const exported = Object.assign(Object.create(null), instance.exports, {\n __funcs_on_exit: () => {\n const end = begin();\n try {\n run();\n } finally {\n end();\n }\n },\n });\n return { exports: exported } as WebAssembly.Instance;\n}\n\nexport function quietQuit(Fs: QuitFs, quitting?: (on: boolean) => void): void {\n const { quit, close } = Fs;\n if (!quit) return;\n Fs.quit = () => {\n quitting?.(true);\n Fs.close = (stream) => {\n try {\n close.call(Fs, stream);\n } catch {}\n };\n try {\n quit.call(Fs);\n } finally {\n quitting?.(false);\n Fs.close = close;\n }\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", "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\nconst LIBC_MARK = /^wasix-sysroot \\d{4}\\.\\d+\\.\\d+-(\\d+)/;\n\nexport function libcVersion(module: WebAssembly.Module): number | undefined {\n for (const section of WebAssembly.Module.customSections(module, 'slicc.libc')) {\n const found = LIBC_MARK.exec(new TextDecoder().decode(section));\n if (found) return Number(found[1]);\n }\n return undefined;\n}\n", "import type { MountLine, ProcessListing } from '../../kernel/proc-info.ts';\nimport {\n type SyncFsBridgeStat,\n type SyncFsFileIo,\n type SyncFsPosixBridge,\n syncError,\n} from '../../realm/sync-fs-wire.ts';\nimport { mountTable } from '../process-fds.ts';\nimport {\n type MemorySource,\n memorySource,\n PID_FILES,\n pidFile,\n SYSTEM_FILES,\n systemFile,\n} from '../procfs.ts';\nimport { normalize } from './wasi-files.ts';\n\nexport interface ProcSource {\n procList(): ProcessListing;\n mountList(): MountLine[];\n}\n\ntype Node =\n | { kind: 'dir'; names: () => string[] }\n | { kind: 'link'; target: string }\n | { kind: 'file'; content: () => string };\n\nconst DIR_MODE = 0o40555;\nconst FILE_MODE = 0o100444;\nconst LINK_MODE = 0o120777;\n\nconst PID_NAMES: readonly string[] = PID_FILES;\nconst SYSTEM_NAMES: readonly string[] = SYSTEM_FILES;\n\nexport function inProc(path: string): boolean {\n return path === '/proc' || path.startsWith('/proc/');\n}\n\nexport class ProcTree {\n private readonly source: ProcSource;\n private readonly pid: number;\n private readonly memory: MemorySource;\n\n constructor(source: ProcSource, pid: number, memory: MemorySource = memorySource()) {\n this.source = source;\n this.pid = pid;\n this.memory = memory;\n }\n\n private listing(): ProcessListing {\n return this.source.procList();\n }\n\n private alive(pid: number): boolean {\n return this.listing().processes.some((p) => p.pid === pid);\n }\n\n private node(parts: string[]): Node | undefined {\n const [top, leaf, ...rest] = parts;\n if (top === undefined) {\n return {\n kind: 'dir',\n names: () => [\n ...SYSTEM_NAMES,\n 'mounts',\n 'self',\n ...this.listing().processes.map((p) => String(p.pid)),\n ],\n };\n }\n if (top === 'self') {\n return leaf === undefined ? { kind: 'link', target: String(this.pid) } : undefined;\n }\n if (leaf === undefined && top === 'mounts') {\n return { kind: 'file', content: () => mountTable(this.source.mountList()) };\n }\n if (leaf === undefined && SYSTEM_NAMES.includes(top)) {\n return {\n kind: 'file',\n content: () =>\n systemFile(top as (typeof SYSTEM_FILES)[number], this.listing(), Date.now(), this.memory),\n };\n }\n if (!/^[1-9]\\d*$/.test(top) || rest.length > 0 || !this.alive(Number(top))) return undefined;\n if (leaf === undefined) return { kind: 'dir', names: () => [...PID_NAMES] };\n if (!PID_NAMES.includes(leaf)) return undefined;\n return {\n kind: 'file',\n content: () => {\n const listing = this.listing();\n const info = listing.processes.find((p) => p.pid === Number(top));\n if (!info) throw syncError('ENOENT', `/proc/${top}/${leaf}`);\n return pidFile(leaf as (typeof PID_FILES)[number], info, listing.boot);\n },\n };\n }\n\n private parts(path: string, follow: boolean): string[] {\n const parts = path\n .split('/')\n .filter((p) => p !== '')\n .slice(1);\n if (parts[0] === 'self' && (follow || parts.length > 1)) parts[0] = String(this.pid);\n return parts;\n }\n\n private find(path: string, follow: boolean): Node {\n const node = this.node(this.parts(path, follow));\n if (!node) throw syncError('ENOENT', path);\n return node;\n }\n\n stat(path: string, follow = true): SyncFsBridgeStat {\n const node = this.find(path, follow);\n const base = {\n isFile: false,\n isDirectory: false,\n size: 0,\n mtimeMs: Date.now(),\n readonly: true,\n };\n if (node.kind === 'dir') return { ...base, isDirectory: true, mode: DIR_MODE };\n if (node.kind === 'link') {\n return { ...base, isSymbolicLink: true, mode: LINK_MODE, size: node.target.length };\n }\n return { ...base, isFile: true, mode: FILE_MODE, size: this.bytes(node).length };\n }\n\n private bytes(node: Node): Uint8Array {\n return new TextEncoder().encode(node.kind === 'file' ? node.content() : '');\n }\n\n read(path: string): Uint8Array {\n const node = this.find(path, true);\n if (node.kind !== 'file') throw syncError('EISDIR', path);\n return this.bytes(node);\n }\n\n readdir(path: string): string[] {\n const node = this.find(path, true);\n if (node.kind !== 'dir') throw syncError('ENOTDIR', path);\n return node.names();\n }\n\n readlink(path: string): string {\n const node = this.find(path, false);\n if (node.kind !== 'link') throw syncError('EINVAL', path);\n return node.target;\n }\n\n exists(path: string): boolean {\n try {\n this.find(path, true);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nconst FOLLOWING = ['writeFile', 'chmod', 'utimes', 'pwrite', 'truncate'] as const;\nconst NOT_FOLLOWING = ['mkdir', 'rm', 'unlink', 'rmdir', 'lutimes', 'create'] as const;\nconst MAX_HOPS = 40;\n\ntype ProcRefusal = { refused: string };\ntype ProcWalk = Generator<\n { at: string; check: boolean },\n string | undefined | ProcRefusal,\n string | boolean | ProcRefusal\n>;\n\nfunction* procWalk(path: string, follow: boolean): ProcWalk {\n let done: string[] = [];\n let todo = path.split('/').filter((part) => part !== '');\n let hops = 0;\n let broken: ProcRefusal | undefined;\n while (todo.length > 0) {\n const part = todo.shift() as string;\n if (part === '.') continue;\n if (part === '..') {\n done.pop();\n continue;\n }\n const at = `/${[...done, part].join('/')}`;\n const whole = normalize(`/${[...done, part, ...todo].join('/')}`);\n if (inProc(at) && inProc(whole)) return broken ?? whole;\n if (!follow && todo.length === 0) return undefined;\n const target = yield { at, check: todo.find((next) => next !== '.') === '..' };\n if (typeof target === 'string') {\n if (++hops > MAX_HOPS) return undefined;\n [done, todo] = throughLink(target, done, todo);\n } else {\n broken ??= refusalOf(target);\n done.push(part);\n }\n }\n return undefined;\n}\n\nfunction failed(err: unknown): ProcRefusal {\n const code = (err as { code?: unknown } | null)?.code;\n return { refused: typeof code === 'string' ? code : 'ENOENT' };\n}\n\nfunction refusalOf(found: boolean | ProcRefusal): ProcRefusal | undefined {\n if (found === true) return undefined;\n return found === false ? { refused: 'ENOTDIR' } : found;\n}\n\nfunction throughLink(target: string, done: string[], todo: string[]): [string[], string[]] {\n const parts = target.split('/').filter((part) => part !== '');\n return [target.startsWith('/') ? [] : done, [...parts, ...todo]];\n}\n\nfunction procPath(\n fs: Pick<SyncFsPosixBridge, 'lstat' | 'readlink'>,\n path: string,\n follow: boolean\n): string | undefined {\n const walk = procWalk(path, follow);\n let step = walk.next();\n while (!step.done) {\n const { at, check } = step.value;\n let target: string | boolean | ProcRefusal;\n try {\n const st = fs.lstat(at);\n target = st.isSymbolicLink ? fs.readlink(at) : !check || st.isDirectory;\n } catch (err) {\n target = failed(err);\n }\n step = walk.next(target);\n }\n const result = step.value;\n if (typeof result === 'object') throw syncError(result.refused, path);\n return result;\n}\n\nexport async function procAlias(\n fs: { readlink?(path: string): Promise<string>; lstat?(path: string): Promise<unknown> },\n path: string,\n follow: boolean\n): Promise<string | undefined | ProcRefusal> {\n const { readlink, lstat } = fs;\n if (!readlink || !lstat) return undefined;\n const physical = await lstat.call(fs, '/proc').then(\n () => true,\n () => false\n );\n if (!physical) return undefined;\n const walk = procWalk(path, follow);\n let step = walk.next();\n while (!step.done) {\n const { at, check } = step.value;\n const link = await readlink.call(fs, at).catch(() => undefined);\n const isDir = (st: unknown) => (st as { isDirectory?: boolean }).isDirectory === true;\n const target = link ?? (check ? await lstat.call(fs, at).then(isDir, failed) : true);\n step = walk.next(target);\n }\n return step.value;\n}\n\nfunction frozen(bytes: Uint8Array): SyncFsFileIo {\n const refuse = (): never => {\n throw syncError('EROFS', '/proc');\n };\n return {\n readFile: () => bytes,\n pread: (_p: string, at: number, n: number) => bytes.subarray(at, at + n),\n writeFile: refuse,\n pwrite: refuse,\n truncate: refuse,\n };\n}\n\nexport function procfsBridge<T extends SyncFsPosixBridge>(fs: T, tree: ProcTree): T {\n const toProc = (path: string, follow: boolean) => procPath(fs, path, follow);\n const shadowing = (): boolean => {\n try {\n return fs.exists('/proc');\n } catch {\n return false;\n }\n };\n const via = <R>(p: string, proc: (q: string) => R, own: () => R, follow = true): R => {\n if (inProc(p)) return proc(p);\n if (shadowing()) {\n const real = toProc(p, follow);\n if (real !== undefined) return proc(real);\n }\n try {\n return own();\n } catch (err) {\n const real = toProc(p, follow);\n if (real === undefined) throw err;\n return proc(real);\n }\n };\n const readOnly = <R>(paths: Array<[string, boolean]>, run: () => R): R => {\n const physical = shadowing();\n for (const [p, follow] of paths) {\n if (inProc(p) || (physical && toProc(p, follow) !== undefined)) throw syncError('EROFS', p);\n }\n return run();\n };\n const snapshots = new Map<number, Uint8Array>();\n let lastSnapshot = 0;\n const snapshot = (q: string): number => {\n lastSnapshot--;\n snapshots.set(lastSnapshot, tree.read(q));\n return lastSnapshot;\n };\n const late = (p: string): number | undefined => {\n const q = toProc(p, true);\n return q === undefined ? undefined : snapshot(q);\n };\n const over: Partial<Record<keyof SyncFsPosixBridge, unknown>> = {\n readFile: (p: string) =>\n via(\n p,\n (q) => tree.read(q),\n () => fs.readFile(p)\n ),\n stat: (p: string) =>\n via(\n p,\n (q) => tree.stat(q),\n () => fs.stat(p)\n ),\n lstat: (p: string) =>\n via(\n p,\n (q) => tree.stat(q, false),\n () => fs.lstat(p),\n false\n ),\n readdir: (p: string) =>\n via(\n p,\n (q) => tree.readdir(q),\n () => {\n const names = fs.readdir(p);\n return p === '/' && !names.includes('proc') ? [...names, 'proc'] : names;\n }\n ),\n exists: (p: string) => {\n if (inProc(p)) return tree.exists(p);\n const probe = () => {\n try {\n return toProc(p, true);\n } catch {\n return null;\n }\n };\n const real = shadowing() ? probe() : undefined;\n if (real === null) return false;\n if (real !== undefined) return tree.exists(real);\n if (fs.exists(p)) return true;\n const late = probe();\n return typeof late === 'string' && tree.exists(late);\n },\n readlink: (p: string) =>\n via(\n p,\n (q) => tree.readlink(q),\n () => fs.readlink(p),\n false\n ),\n readdirStat: (p: string) =>\n via(\n p,\n (q) =>\n tree.readdir(q).map((name): [string, SyncFsBridgeStat | null] => {\n try {\n return [name, tree.stat(`${q}/${name}`, false)];\n } catch {\n return [name, null];\n }\n }),\n () => {\n const listed = fs.readdirStat(p);\n if (p !== '/' || listed.some(([name]) => name === 'proc')) return listed;\n return [...listed, ['proc', tree.stat('/proc')] as [string, SyncFsBridgeStat]];\n }\n ),\n rename: (from: string, to: string) =>\n readOnly(\n [\n [from, false],\n [to, false],\n ],\n () => fs.rename(from, to)\n ),\n symlink: (target: string, link: string) =>\n readOnly([[link, false]], () => fs.symlink(target, link)),\n link: (from: string, to: string, follow?: boolean) =>\n readOnly(\n [\n [from, follow === true],\n [to, false],\n ],\n () => fs.link(from, to, follow)\n ),\n hold: (p: string, held: boolean, open?: boolean, handle?: number, want?: number) => {\n if (handle !== undefined && snapshots.delete(handle)) return undefined;\n if (!held) return fs.hold?.(p, held, open, handle);\n return via(p, snapshot, () => fs.hold?.(p, held, open, undefined, want) ?? late(p));\n },\n kept: (handle: number) => snapshots.has(handle) || fs.kept?.(handle) === true,\n pinned: (handle: number) => {\n const bytes = snapshots.get(handle);\n return bytes ? frozen(bytes) : (fs.pinned?.(handle) ?? fs);\n },\n ...(fs.pread\n ? {\n pread: (p: string, at: number, n: number, version?: string) =>\n via(\n p,\n (q) => tree.read(q).subarray(at, at + n),\n () => (fs.pread as NonNullable<T['pread']>)(p, at, n, version)\n ),\n }\n : {}),\n };\n for (const [names, follow] of [\n [FOLLOWING, true],\n [NOT_FOLLOWING, false],\n ] as const) {\n for (const name of names) {\n const fn = fs[name] as ((p: string, ...rest: unknown[]) => unknown) | undefined;\n if (!fn) continue;\n over[name] = (p: string, ...rest: unknown[]) =>\n readOnly([[p, follow]], () => fn.call(fs, p, ...rest));\n }\n }\n const { chown } = fs;\n if (chown) {\n over.chown = (p: string, uid?: number, gid?: number, follow?: boolean) =>\n readOnly([[p, follow === true]], () => chown.call(fs, p, uid, gid, follow));\n }\n return new Proxy(fs, {\n get: (target, key, receiver) =>\n key in over ? over[key as keyof SyncFsPosixBridge] : Reflect.get(target, key, receiver),\n });\n}\n", "import { defaultAction, SIG, sigbit } from '../../kernel/signals.ts';\nimport type { SignalHooks } from '../process-signals.ts';\nimport { E } from './wasi-abi.ts';\nimport { WasiExit } from './wasi-host.ts';\n\nconst DELIVERED_MASK = Object.values(SIG)\n .filter((sig) => sig !== SIG.KILL && sig !== SIG.STOP)\n .reduce((m, sig) => m | sigbit(sig), 0);\n\nconst KERNEL_DEFAULTS = [SIG.TSTP, SIG.TTIN, SIG.TTOU, SIG.CHLD, SIG.CONT, SIG.URG, SIG.WINCH]\n .map(sigbit)\n .reduce((m, bit) => m | bit, 0);\n\nconst LIBC_DEFAULT_EXIT = 127;\n\nconst SA_RESTART = 0x10000000;\nconst DISPOSITION_IGNORE = 1;\nconst DISPOSITION_HANDLER = 2;\n\nexport interface WasiSignalState {\n callback?: string;\n hooked?: true;\n handlers: number;\n ignoring: number;\n restarting: number;\n uncaught: number;\n}\n\nconst withBit = (mask: number, bit: number, on: boolean): number => (on ? mask | bit : mask & ~bit);\n\nconst WASIX_LIBC_DEFAULT_LINE = /^Program recieved (?:stop|termination|fatal) signal: [^\\n]+\\n$/;\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 defaulted = false;\n\n private libcDefault = false;\n\n private hooked = false;\n\n private handlers = 0;\n\n private ignoring = 0;\n\n private restarting = 0;\n\n private defaults = 0;\n\n private readonly fallBack: (sig: number) => void;\n private readonly onKilled: ((code: number) => void) | undefined;\n constructor(fallBack: (sig: number) => void, onKilled?: (code: number) => void) {\n this.fallBack = fallBack;\n this.onKilled = onKilled;\n }\n\n killed(code: number): void {\n this.onKilled?.(code);\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 useHook(): void {\n this.hooked = true;\n }\n\n disposition(sig: number, disposition: number, flags: number): number {\n if (sig < 1 || sig > 31 || (DELIVERED_MASK & sigbit(sig)) === 0) return E.INVAL;\n const bit = sigbit(sig);\n this.handlers = withBit(this.handlers, bit, disposition === DISPOSITION_HANDLER);\n this.ignoring = withBit(this.ignoring, bit, disposition === DISPOSITION_IGNORE);\n this.restarting = withBit(this.restarting, bit, (flags & SA_RESTART) !== 0);\n this.defaults = withBit(this.defaults, bit, disposition === 0);\n return E.SUCCESS;\n }\n\n snapshot(): WasiSignalState {\n return {\n ...(this.callback ? { callback: this.callback } : {}),\n ...(this.hooked ? { hooked: true as const } : {}),\n handlers: this.handlers,\n ignoring: this.ignoring,\n restarting: this.restarting,\n uncaught: this.uncaught,\n };\n }\n\n restore(state: WasiSignalState): void {\n if (state.callback) this.register(state.callback);\n if (state.hooked) this.hooked = true;\n this.handlers = state.handlers;\n this.ignoring = state.ignoring;\n this.restarting = state.restarting;\n this.uncaught = state.uncaught;\n }\n\n masks(): { caught: number; ignored: number; restart: number; defaults?: number } | null {\n if (this.hooked) {\n const caught = this.handler() ? this.handlers : 0;\n const defaults = this.defaults;\n this.defaults = 0;\n return { caught, ignored: this.ignoring, restart: this.restarting, defaults };\n }\n if (!this.handler()) return null;\n return { caught: DELIVERED_MASK & ~this.uncaught & ~KERNEL_DEFAULTS, ignored: 0, restart: 0 };\n }\n\n raise(sig: number): void {\n const handler = this.handler();\n if (!handler) return;\n const outer = { sig: this.delivering, defaulted: this.defaulted, libc: this.libcDefault };\n this.delivering = sig;\n this.defaulted = false;\n this.libcDefault = false;\n try {\n handler(sig);\n } catch (e) {\n const libcExit = e instanceof WasiExit && e.code === LIBC_DEFAULT_EXIT && this.libcDefault;\n if (!(libcExit && !this.defaulted) && !(e instanceof WebAssembly.RuntimeError)) throw e;\n if (!this.defaulted) this.defaultAction(sig);\n } finally {\n this.delivering = outer.sig;\n this.defaulted = outer.defaulted;\n this.libcDefault = outer.libc;\n }\n }\n\n muted(fd: number, data: Uint8Array): boolean {\n if (fd !== 2 || this.delivering === undefined) return false;\n if (!WASIX_LIBC_DEFAULT_LINE.test(new TextDecoder().decode(data))) return false;\n this.libcDefault = true;\n return true;\n }\n\n raised(sig: number): boolean {\n if (sig !== SIG.ABRT || this.delivering === undefined) return false;\n if (!this.defaulted) this.defaultAction(this.delivering);\n return true;\n }\n\n private defaultAction(sig: number): void {\n this.defaulted = true;\n this.uncaught |= sigbit(sig);\n this.fallBack(sig);\n if (defaultAction(sig) !== 'terminate') this.uncaught &= ~sigbit(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 { E } from './wasi-abi.ts';\nimport type { WasiForkFd } from './wasi-fds.ts';\nimport type { WasiMemory } from './wasi-memory.ts';\nimport type { WasiSignalState } from './wasi-signals.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 signals?: WasiSignalState;\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 get idle(): boolean {\n const state = this.exports.asyncify_get_state;\n return !this.supported || typeof state !== 'function' || state() === 0;\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 { WasiError } from './wasi-files.ts';\nimport type { WasiMemory } from './wasi-memory.ts';\nimport type { FuncTypes, ValType } from './wasm-functypes.ts';\n\ntype Scalar = Exclude<ValType, 'other'>;\ntype Value = number | bigint;\n\nconst SIZE: Readonly<Record<Scalar, number>> = { i32: 4, i64: 8, f32: 4, f64: 8 };\n\nfunction read(view: DataView, at: number, type: Scalar): Value {\n if (type === 'i32') return view.getInt32(at, true);\n if (type === 'i64') return view.getBigInt64(at, true);\n if (type === 'f32') return view.getFloat32(at, true);\n return view.getFloat64(at, true);\n}\n\nfunction readSome(view: DataView, at: number, end: number, type: Scalar): Value {\n if (at + SIZE[type] <= end) return read(view, at, type);\n const some = new DataView(new ArrayBuffer(8));\n for (let i = 0; at + i < end; i++) some.setUint8(i, view.getUint8(at + i));\n return read(some, 0, type);\n}\n\nfunction write(view: DataView, at: number, type: Scalar, value: Value): void {\n if (type === 'i32') view.setInt32(at, Number(value), true);\n else if (type === 'i64') view.setBigInt64(at, BigInt(value), true);\n else if (type === 'f32') view.setFloat32(at, Number(value), true);\n else view.setFloat64(at, Number(value), true);\n}\n\nfunction scalars(types: ValType[]): Scalar[] {\n if (types.includes('other')) throw new WasiError('EINVAL');\n return types as Scalar[];\n}\n\nexport interface FfiContext {\n mem: WasiMemory;\n table(): WebAssembly.Table | undefined;\n types: FuncTypes;\n}\n\nexport function callDynamic(\n ctx: FfiContext,\n ...operands: [number, number, number, number, number, number]\n): void {\n const [id, values, valuesLen, results, resultsLen, strict] = operands.map((n) => n >>> 0);\n const table = ctx.table();\n if (!table) throw new WasiError('ENOTSUP');\n const fn = id < table.length ? table.get(id) : null;\n const sig = fn ? ctx.types.of(fn) : undefined;\n if (!fn || !sig) throw new WasiError('EINVAL');\n const params = scalars(sig.params);\n const outs = scalars(sig.results);\n const size = (types: Scalar[]) => types.reduce((n, type) => n + SIZE[type], 0);\n if (strict && (size(params) !== valuesLen || size(outs) !== resultsLen)) {\n throw new WasiError('EINVAL');\n }\n const view = ctx.mem.view();\n if (values + valuesLen > view.byteLength || results + resultsLen > view.byteLength) {\n throw new WasiError('EFAULT');\n }\n const end = values + valuesLen;\n let at = values;\n const args = params.map((type) => {\n const v = readSome(view, at, end, type);\n at += SIZE[type];\n return v;\n });\n const returned = (fn as (...a: Value[]) => Value | Value[] | undefined)(...args);\n const got = outs.length === 1 ? [returned as Value] : ((returned ?? []) as Value[]);\n const after = ctx.mem.view();\n const stop = results + resultsLen;\n let out = results;\n outs.forEach((type, i) => {\n if (out + SIZE[type] > stop) return;\n write(after, out, type, got[i] as Value);\n out += SIZE[type];\n });\n}\n", "import type { FuncSig, ValType } from './wasm-functypes.ts';\n\nexport type Scalar = 'i32' | 'i64' | 'f32' | 'f64' | 'v128';\n\nconst CODES: readonly Scalar[] = ['i32', 'i64', 'f32', 'f64', 'v128'];\n\nconst VALTYPE: Readonly<Record<Scalar, number>> = {\n i32: 0x7f,\n i64: 0x7e,\n f32: 0x7d,\n f64: 0x7c,\n v128: 0x7b,\n};\n\nconst SIZE: Readonly<Record<Scalar, number>> = { i32: 4, i64: 8, f32: 4, f64: 8, v128: 16 };\n\nconst STORE: Readonly<Record<Scalar, number[]>> = {\n i32: [0x36],\n i64: [0x37],\n f32: [0x38],\n f64: [0x39],\n v128: [0xfd, 0x0b],\n};\n\nconst LOAD: Readonly<Record<Scalar, number[]>> = {\n i32: [0x28],\n i64: [0x29],\n f32: [0x2a],\n f64: [0x2b],\n v128: [0xfd, 0x00],\n};\n\nexport function valueTypes(codes: Uint8Array): Scalar[] | undefined {\n const out: Scalar[] = [];\n for (const code of codes) {\n const type = CODES[code];\n if (!type) return undefined;\n out.push(type);\n }\n return out;\n}\n\nfunction u32(n: number): number[] {\n const out: number[] = [];\n let v = n >>> 0;\n do {\n let b = v & 0x7f;\n v >>>= 7;\n if (v) b |= 0x80;\n out.push(b);\n } while (v);\n return out;\n}\n\nfunction s32(n: number): number[] {\n const out: number[] = [];\n let v = n | 0;\n for (;;) {\n const b = v & 0x7f;\n v >>= 7;\n if ((v === 0 && !(b & 0x40)) || (v === -1 && b & 0x40)) {\n out.push(b);\n return out;\n }\n out.push(b | 0x80);\n }\n}\n\nfunction name(s: string): number[] {\n const bytes = [...new TextEncoder().encode(s)];\n return [...u32(bytes.length), ...bytes];\n}\n\nfunction section(id: number, body: number[]): number[] {\n return [id, ...u32(body.length), ...body];\n}\n\nfunction vec(items: number[][]): number[] {\n return [...u32(items.length), ...items.flat()];\n}\n\nfunction align16(n: number): number {\n return Math.ceil(n / 16) * 16;\n}\n\nexport function trampolineBytes(\n params: Scalar[],\n results: Scalar[],\n shared: boolean\n): Uint8Array<ArrayBuffer> {\n const sig = [\n 0x60,\n ...vec(params.map((t) => [VALTYPE[t]])),\n ...vec(results.map((t) => [VALTYPE[t]])),\n ];\n const backing = [0x60, ...vec([[0x7f], [0x7f], [0x7f]]), ...vec([])];\n const memory = shared ? [0x03, 0x00, ...u32(65536)] : [0x00, 0x00];\n const imports = vec([\n [...name('env'), ...name('memory'), 0x02, ...memory],\n [...name('env'), ...name('__indirect_function_table'), 0x01, 0x70, 0x00, 0x00],\n [...name('env'), ...name('__stack_pointer'), 0x03, 0x7f, 0x01],\n [...name('env'), ...name('backing'), 0x03, 0x7f, 0x00],\n [...name('env'), ...name('user_data'), 0x03, 0x7f, 0x00],\n ]);\n const n = params.length;\n const [orig, args, res] = [n, n + 1, n + 2];\n const valuesSize = align16(params.reduce((sum, t) => sum + SIZE[t], 0));\n const resultsSize = align16(results.reduce((sum, t) => sum + SIZE[t], 0));\n const body: number[] = [\n 0x23,\n 0,\n 0x22,\n ...u32(orig),\n 0x41,\n ...s32(resultsSize),\n 0x6b,\n 0x22,\n ...u32(res),\n ];\n body.push(0x41, ...s32(valuesSize), 0x6b, 0x22, ...u32(args), 0x24, 0);\n let at = 0;\n params.forEach((t, i) => {\n body.push(0x20, ...u32(args), 0x20, ...u32(i), ...STORE[t], 0, ...u32(at));\n at += SIZE[t];\n });\n body.push(0x20, ...u32(args), 0x20, ...u32(res), 0x23, 2, 0x23, 1, 0x11, 1, 0);\n at = 0;\n for (const t of results) {\n body.push(0x20, ...u32(res), ...LOAD[t], 0, ...u32(at));\n at += SIZE[t];\n }\n body.push(0x20, ...u32(orig), 0x24, 0, 0x0b);\n const func = [...vec([[...u32(3), 0x7f]]), ...body];\n return Uint8Array.from([\n 0x00,\n 0x61,\n 0x73,\n 0x6d,\n 0x01,\n 0x00,\n 0x00,\n 0x00,\n ...section(1, vec([sig, backing])),\n ...section(2, imports),\n ...section(3, vec([[0]])),\n ...section(7, vec([[...name('t'), 0x00, 0x00]])),\n ...section(10, vec([[...u32(func.length), ...func]])),\n ]);\n}\n\nexport class Trampolines {\n private readonly modules = new Map<string, WebAssembly.Module>();\n\n get compiled(): number {\n return this.modules.size;\n }\n\n make(\n params: Scalar[],\n results: Scalar[],\n env: {\n memory: WebAssembly.Memory;\n table: WebAssembly.Table;\n stackPointer: WebAssembly.Global;\n backing: number;\n userData: number;\n }\n ): { fn: (...args: unknown[]) => unknown; sig: FuncSig } {\n const shared = env.memory.buffer instanceof SharedArrayBuffer;\n const key = `${params.join(',')}>${results.join(',')}${shared ? 's' : ''}`;\n let module = this.modules.get(key);\n if (!module) {\n module = new WebAssembly.Module(trampolineBytes(params, results, shared));\n this.modules.set(key, module);\n }\n const i32 = (v: number) => new WebAssembly.Global({ value: 'i32', mutable: false }, v);\n const instance = new WebAssembly.Instance(module, {\n env: {\n memory: env.memory,\n __indirect_function_table: env.table,\n __stack_pointer: env.stackPointer,\n backing: i32(env.backing),\n user_data: i32(env.userData),\n },\n });\n const sig: FuncSig = {\n params: params.map((t) => (t === 'v128' ? 'other' : t)) as ValType[],\n results: results.map((t) => (t === 'v128' ? 'other' : t)) as ValType[],\n };\n return { fn: instance.exports.t as (...args: unknown[]) => unknown, sig };\n }\n}\n", "export type ValType = 'i32' | 'i64' | 'f32' | 'f64' | 'other';\n\nexport interface FuncSig {\n params: ValType[];\n results: ValType[];\n}\n\nexport interface ElemSegment {\n offset: number;\n tableBase: boolean;\n funcs: number[];\n}\n\nexport interface FuncTypeInfo {\n sigs: FuncSig[];\n funcs: number[];\n exports: Record<string, number>;\n elems: ElemSegment[];\n}\n\nconst VALTYPES: Readonly<Record<number, ValType>> = {\n 127: 'i32',\n 126: 'i64',\n 125: 'f32',\n 124: 'f64',\n};\n\nconst TABLE_BASE = '__table_base';\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++] ?? 0;\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 s32(): number {\n let result = 0;\n let shift = 0;\n let b: number;\n do {\n b = this.byte();\n result |= (b & 0x7f) << shift;\n shift += 7;\n } while (b & 0x80);\n return shift < 32 && b & 0x40 ? result | (-1 << shift) : result;\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(): ValType {\n const code = this.byte();\n if (code === 0x63 || code === 0x64) this.s32();\n return VALTYPES[code] ?? 'other';\n }\n\n limits(): void {\n const flags = this.byte();\n this.u32();\n if (flags & 1) this.u32();\n }\n}\n\ninterface Scan {\n info: FuncTypeInfo;\n globals: Array<string | number | undefined>;\n}\n\nfunction readTypes(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n r.byte();\n const params: ValType[] = [];\n for (let n = r.u32(); n > 0; n--) params.push(r.valtype());\n const results: ValType[] = [];\n for (let n = r.u32(); n > 0; n--) results.push(r.valtype());\n s.info.sigs.push({ params, results });\n }\n}\n\nfunction readImports(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n r.name();\n const field = r.name();\n const kind = r.byte();\n if (kind === 0) s.info.funcs.push(r.u32());\n else 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 s.globals.push(field);\n } else {\n r.byte();\n r.u32();\n }\n }\n}\n\nfunction readFunctions(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) s.info.funcs.push(r.u32());\n}\n\nconst SKIP: Readonly<Record<number, (r: Reader) => void>> = {\n 66: (r) => r.s32(),\n 67: (r) => {\n r.at += 4;\n },\n 68: (r) => {\n r.at += 8;\n },\n 208: (r) => r.valtype(),\n};\n\nfunction constExpr(r: Reader, s: Scan): { value: number; tableBase: boolean } | undefined {\n let value = 0;\n let tableBase = false;\n let known = true;\n for (;;) {\n const op = r.byte();\n if (op === 0x0b) return known ? { value, tableBase } : undefined;\n if (op === 0x41) value += r.s32();\n else if (op === 0x23) {\n const g = s.globals[r.u32()];\n if (g === TABLE_BASE) tableBase = true;\n else if (typeof g === 'number') value += g;\n else known = false;\n } else if (op === 0xd2) {\n value = r.u32();\n } else if (op in SKIP) {\n SKIP[op]?.(r);\n known = false;\n } else if (op !== 0x6a) {\n r.at = r.bytes.length;\n return undefined;\n }\n }\n}\n\nfunction readGlobals(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n r.valtype();\n r.byte();\n const init = constExpr(r, s);\n s.globals.push(init && !init.tableBase ? init.value : undefined);\n }\n}\n\nfunction readExports(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n const name = r.name();\n const kind = r.byte();\n const index = r.u32();\n if (kind === 0) s.info.exports[name] = index;\n }\n}\n\nfunction readElems(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n const flags = r.u32();\n const active = (flags & 1) === 0;\n const table = flags & 2 ? (active ? r.u32() : 0) : 0;\n const offset = active ? constExpr(r, s) : undefined;\n if (flags & 3) r.valtype();\n const funcs: number[] = [];\n for (let n = r.u32(); n > 0; n--) {\n if (flags & 4) {\n const ref = constExpr(r, s);\n funcs.push(ref ? ref.value : -1);\n } else funcs.push(r.u32());\n }\n if (offset && table === 0) {\n s.info.elems.push({ offset: offset.value, tableBase: offset.tableBase, funcs });\n }\n }\n}\n\nconst SECTIONS: Readonly<Record<number, (r: Reader, s: Scan) => void>> = {\n 1: readTypes,\n 2: readImports,\n 3: readFunctions,\n 6: readGlobals,\n 7: readExports,\n 9: readElems,\n};\n\nexport function funcTypeInfo(bytes: Uint8Array): FuncTypeInfo {\n const r = new Reader(bytes);\n const s: Scan = { info: { sigs: [], funcs: [], exports: {}, elems: [] }, globals: [] };\n while (r.at < bytes.length) {\n const id = r.byte();\n const end = r.u32() + r.at;\n SECTIONS[id]?.(r, s);\n r.at = end;\n }\n return s.info;\n}\n\nexport class FuncTypes {\n private readonly known = new WeakMap<object, FuncSig>();\n private pending: Array<() => void> = [];\n\n register(\n read: () => Uint8Array | undefined,\n instance: WebAssembly.Instance,\n table: WebAssembly.Table | undefined,\n tableBase: number\n ): void {\n this.pending.push(() => {\n const bytes = read();\n if (bytes) this.add(funcTypeInfo(bytes), instance, table, tableBase);\n });\n }\n\n add(\n info: FuncTypeInfo,\n instance: WebAssembly.Instance,\n table: WebAssembly.Table | undefined,\n tableBase: number\n ): void {\n const sig = (func: number) => info.sigs[info.funcs[func] ?? -1];\n for (const [name, func] of Object.entries(info.exports)) {\n const fn = instance.exports[name];\n const type = sig(func);\n if (typeof fn === 'function' && type) this.known.set(fn, type);\n }\n if (!table) return;\n for (const seg of info.elems) {\n const start = seg.offset + (seg.tableBase ? tableBase : 0);\n seg.funcs.forEach((func, i) => {\n const type = sig(func);\n const fn = start + i < table.length ? table.get(start + i) : null;\n if (fn && type) this.known.set(fn, type);\n });\n }\n }\n\n set(fn: object, sig: FuncSig): void {\n this.known.set(fn, sig);\n }\n\n of(fn: object): FuncSig | undefined {\n const known = this.known.get(fn);\n if (known || this.pending.length === 0) return known;\n const pending = this.pending;\n this.pending = [];\n for (const run of pending) run();\n return this.known.get(fn);\n }\n}\n", "import { type DylinkInfo, dylinkInfo } from './dylink.ts';\nimport { normalize } from './wasi-files.ts';\nimport { type Scalar, Trampolines } from './wasix-trampoline.ts';\nimport { FuncTypes } from './wasm-functypes.ts';\n\nexport const 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 | {\n kind: 'load';\n handle: number;\n path: string;\n memoryBase: number;\n tableBase: number;\n needed?: number[];\n }\n | { kind: 'slot'; index: number; handle: number; name: string }\n | { kind: 'closure'; index: number }\n | { kind: 'closure-free'; index: number }\n | {\n kind: 'closure-prepare';\n index: number;\n backing: number;\n userData: number;\n params: Scalar[];\n results: Scalar[];\n };\n\nexport interface LinkerHost {\n read(path: string): Uint8Array<ArrayBuffer> | undefined;\n\n hostImports(module: WebAssembly.Module): WebAssembly.Imports;\n\n real?(path: string): string;\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 indices:\n | {\n reserve(floor: number, size: number): number;\n load(floor: number, size: number): { base: number; handle: number };\n lock(): void;\n unlock(): void;\n allocate(floor: number): number;\n free(index: number): void;\n }\n | undefined;\n\n types = new FuncTypes();\n\n readonly trampolines = new Trampolines();\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 mainPath: string | undefined;\n\n private isMain(path: string): boolean {\n if (this.mainPath === undefined) return false;\n if (path === this.mainPath) return true;\n const real = this.host.real;\n if (real === undefined) return false;\n try {\n return real(path) === real(this.mainPath);\n } catch {\n return false;\n }\n }\n\n open(name: string, cwd: string, ldPath: readonly string[]): number {\n const path = this.locate(name, cwd, ldPath);\n if (this.isMain(path)) return 0;\n this.indices?.lock();\n try {\n return this.load(path, cwd, ldPath).handle;\n } finally {\n this.indices?.unlock();\n }\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 allocateClosure(): number {\n const index = (this.indices as NonNullable<WasixLinker['indices']>).allocate(this.table.length);\n growTable(this.table, index + 1);\n this.live.add(index);\n return index;\n }\n\n freeClosure(index: number): void {\n this.indices?.free(index);\n this.live.delete(index);\n this.table.set(index, null);\n }\n\n private readonly live = new Set<number>();\n\n prepareClosure(record: Omit<Extract<LinkRecord, { kind: 'closure-prepare' }>, 'kind'>): void {\n if (!this.live.has(record.index)) throw new DlError(`closure ${record.index}: not allocated`);\n const full: LinkRecord = { kind: 'closure-prepare', ...record };\n this.install(full);\n this.publisher?.(full);\n }\n\n private install(record: Extract<LinkRecord, { kind: 'closure-prepare' }>): void {\n growTable(this.table, record.index + 1);\n const { fn, sig } = this.trampolines.make(record.params, record.results, {\n memory: this.memory,\n table: this.table,\n stackPointer: this.stackPointer,\n backing: record.backing,\n userData: record.userData,\n });\n this.table.set(record.index, fn as never);\n this.types.set(fn, sig);\n }\n\n private reserveLoad(size: number): { base: number; handle: number } {\n return (\n this.indices?.load(this.table.length, size) ?? {\n base: this.table.length,\n handle: this.nextHandle++,\n }\n );\n }\n\n private reserve(size: number): number {\n return this.indices?.reserve(this.table.length, size) ?? this.table.length;\n }\n\n replay(record: LinkRecord): void {\n if (record.kind === 'closure') {\n growTable(this.table, record.index + 1);\n this.live.add(record.index);\n return;\n }\n if (record.kind === 'closure-free') {\n this.live.delete(record.index);\n if (record.index < this.table.length) this.table.set(record.index, null);\n return;\n }\n if (record.kind === 'closure-prepare') {\n this.install(record);\n return;\n }\n if (record.kind === 'load') {\n if (this.modules.has(record.handle)) return;\n const linked = this.instantiate(record.path, this.moduleAt(record.path), record, false);\n linked.needed.push(...(record.needed ?? []));\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 { base: tableBase, handle } = this.reserveLoad(info.tableSize);\n const record: LinkRecord = {\n kind: 'load',\n handle,\n path,\n memoryBase,\n tableBase,\n ...(needed.length > 0 ? { needed } : {}),\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.types.register(() => this.host.read(path), linked.instance, this.table, at.tableBase);\n this.modules.set(at.handle, linked);\n const first = this.byPath.get(path);\n if (!first || at.handle < first.handle) 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 indexed = 0;\n\n private indexTable(): void {\n for (let i = this.indexed; i < this.table.length; i++) {\n const fn = this.table.get(i);\n if (fn && !this.slots.has(fn)) this.slots.set(fn, i);\n }\n this.indexed = this.table.length;\n }\n\n private slot(fn: unknown, handle: number, name: string): number {\n this.indexTable();\n const known = this.slots.get(fn);\n if (known !== undefined) return known;\n const index = this.reserve(1);\n growTable(this.table, index + 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 to = Math.max(alignment, 16);\n const pages = Math.ceil((size + (to > PAGE ? to : 0)) / PAGE);\n return align(this.memory.grow(pages) * PAGE, to);\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 { HOST_LOOPBACK, HOST_LOOPBACK_ADDRESS } from './loopback-names.ts';\n\nexport interface RouteTable {\n prefixes: readonly string[];\n exit: boolean;\n}\n\nexport type Destination = 'loopback' | 'host' | 'reserved' | 'uplink' | 'unreachable';\n\ninterface Prefix {\n v6: boolean;\n bits: bigint;\n length: number;\n}\n\nconst HOST_ADDRESS = HOST_LOOPBACK_ADDRESS.join('.');\n\nexport function ipv4Bytes(text: string): number[] | undefined {\n const parts = text.split('.');\n if (parts.length !== 4 || !parts.every((p) => /^\\d{1,3}$/.test(p))) return undefined;\n const bytes = parts.map(Number);\n return bytes.every((b) => b <= 255) ? bytes : undefined;\n}\n\nexport function ipv6Groups(text: string): number[] | undefined {\n if (!text.includes(':')) return undefined;\n let canonical: string;\n try {\n canonical = new URL(`http://[${text}]/`).hostname.slice(1, -1);\n } catch {\n return undefined;\n }\n const [head, tail] = canonical.split('::');\n const part = (s: string | undefined) =>\n s ? s.split(':').map((h) => Number.parseInt(h, 16)) : [];\n const front = part(head);\n const back = part(tail);\n return tail === undefined\n ? front\n : [...front, ...new Array<number>(8 - front.length - back.length).fill(0), ...back];\n}\n\nfunction toBits(values: number[], width: number): bigint {\n return values.reduce((acc, v) => (acc << BigInt(width)) | BigInt(v), 0n);\n}\n\nfunction addressBits(host: string): { v6: boolean; bits: bigint } | undefined {\n const v4 = ipv4Bytes(host);\n if (v4) return { v6: false, bits: toBits(v4, 8) };\n const v6 = ipv6Groups(host);\n return v6 ? { v6: true, bits: toBits(v6, 16) } : undefined;\n}\n\nfunction parsePrefix(text: string): Prefix | undefined {\n const parts = text.trim().split('/');\n if (parts.length > 2) return undefined;\n const [address = '', size] = parts;\n const parsed = addressBits(address);\n if (!parsed) return undefined;\n const max = parsed.v6 ? 128 : 32;\n const length = size === undefined ? max : /^\\d{1,3}$/.test(size) ? Number(size) : -1;\n if (length < 0 || length > max) return undefined;\n return { ...parsed, length };\n}\n\nfunction within(prefix: Prefix, addr: { v6: boolean; bits: bigint }): boolean {\n if (prefix.v6 !== addr.v6) return false;\n const shift = BigInt((prefix.v6 ? 128 : 32) - prefix.length);\n return addr.bits >> shift === prefix.bits >> shift;\n}\n\nconst RESERVED = [\n '0.0.0.0/8',\n '127.0.0.0/8',\n '169.254.0.0/16',\n '224.0.0.0/4',\n '240.0.0.0/4',\n '::/96',\n '::ffff:0:0/96',\n 'fe80::/10',\n 'ff00::/8',\n].map((p) => parsePrefix(p) as Prefix);\n\nexport class Routes {\n private table: Prefix[] = [];\n private exit = false;\n readonly ipv6: boolean;\n\n constructor(ipv6 = false) {\n this.ipv6 = ipv6;\n }\n\n set(table: RouteTable): void {\n const parsed = (table.prefixes ?? []).map(parsePrefix);\n const bad = (table.prefixes ?? []).find((_, i) => !parsed[i]);\n if (bad !== undefined) throw new Error(`not an address prefix: ${bad}`);\n this.table = parsed as Prefix[];\n this.exit = table.exit === true;\n }\n\n classify(host: string): Destination {\n const name = host.toLowerCase().replace(/\\.$/, '');\n if (name === 'localhost' || name.endsWith('.localhost') || name === '0.0.0.0') {\n return 'loopback';\n }\n if (name === HOST_LOOPBACK || name === HOST_ADDRESS) return 'host';\n const addr = addressBits(name);\n if (!addr) return 'unreachable';\n if (addr.v6 && addr.bits === 1n) return 'loopback';\n if (!addr.v6 && addr.bits >> 24n === 127n) return 'loopback';\n if (RESERVED.some((p) => within(p, addr))) return 'reserved';\n if (addr.v6 && !this.ipv6) return 'unreachable';\n if (this.exit || this.table.some((p) => within(p, addr))) return 'uplink';\n return 'unreachable';\n }\n}\n", "import { ipv6Groups } from '../../kernel/net/routes.ts';\nimport 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 return { family: 'inet', host: ipv6Host(new Uint8Array(view.buffer, ptr + 4, 16)), port };\n }\n throw new WasiError('EAFNOSUPPORT');\n}\n\nfunction ipv6Host(bytes: Uint8Array): string {\n const zeros = (n: number) => bytes.subarray(0, n).every((b) => b === 0);\n if (zeros(16)) return '0.0.0.0';\n if (zeros(15) && bytes[15] === 1) return LOOPBACK;\n if (zeros(10) && bytes[10] === 0xff && bytes[11] === 0xff) return bytes.subarray(12).join('.');\n const groups = [0, 2, 4, 6, 8, 10, 12, 14].map((i) =>\n ((bytes[i] << 8) | bytes[i + 1]).toString(16)\n );\n return new URL(`http://[${groups.join(':')}]/`).hostname.slice(1, -1);\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.setUint16(ptr + 2, addr.port, true);\n const groups = ipv4(addr.host) ? undefined : ipv6Groups(addr.host);\n if (groups) {\n view.setUint8(ptr, INET6);\n groups.forEach((g, i) => void view.setUint16(ptr + 4 + i * 2, g));\n return;\n }\n view.setUint8(ptr, INET4);\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 ipBytes(host: string): number[] | undefined {\n const groups = ipv4(host) ? undefined : ipv6Groups(host);\n return groups ? groups.flatMap((g) => [g >> 8, g & 0xff]) : ipv4(host);\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 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_pair: (af: number, type: number, _proto: number, out1: number, out2: number) => {\n if (af !== UNIX)\n throw new WasiError(af === INET4 || af === INET6 ? 'EOPNOTSUPP' : 'EAFNOSUPPORT');\n if (type !== STREAM) throw new WasiError('EPROTONOSUPPORT');\n mem.view().setUint32(out1, 0, true);\n mem.view().setUint32(out2, 0, true);\n const [a, b] = call({ op: 'sock-pair', domain: 'unix' }) as [number, number];\n fds.adopt(a, 'socket', false);\n fds.adopt(b, 'socket', false);\n mem.view().setUint32(out1, a, true);\n mem.view().setUint32(out2, b, 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 found = call({ op: 'sock-resolve', name: mem.string(name, len), family: 0 });\n const ips = (found as string[]).map(ipBytes).filter((ip) => ip !== undefined);\n if (ips.length === 0) throw new WasiError('ENOENT');\n if (naddrs < 1) throw new WasiError('EINVAL');\n const view = mem.view();\n const count = Math.min(ips.length, naddrs);\n new Uint8Array(view.buffer, addrs, ADDR_IP_SIZE * count).fill(0);\n for (let i = 0; i < count; i++) {\n const at = addrs + i * ADDR_IP_SIZE;\n view.setUint8(at, ips[i].length === 4 ? INET4 : INET6);\n new Uint8Array(view.buffer, at + 2, ips[i].length).set(ips[i]);\n }\n view.setUint32(out, count, true);\n },\n };\n}\n", "import { E, FDFLAGS, wasiErrnoOf, wasixSignal } from './wasi-abi.ts';\nimport { WasiError } from './wasi-files.ts';\nimport { WasiExit, type WasiFunction, type WasiHost, wrap } from './wasi-host.ts';\nimport { libcVersion } from './wasi-module.ts';\nimport type { WasiSignals } from './wasi-signals.ts';\nimport { MAIN_TID, ThreadExit, type WasiThreads } from './wasi-threads.ts';\nimport { callDynamic } from './wasix-ffi.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';\nimport { valueTypes } from './wasix-trampoline.ts';\nimport { FuncTypes } from './wasm-functypes.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\nconst FUTEX_SLICE_MS = 50;\n\nexport function futexWait(\n view: Int32Array,\n index: number,\n expected: number,\n ms: number,\n interrupted: (() => boolean) | undefined\n): boolean {\n const deadline = performance.now() + ms;\n for (;;) {\n const slice = interrupted ? Math.min(FUTEX_SLICE_MS, ms) : ms;\n if (Atomics.wait(view, index, expected, slice) !== 'timed-out') return true;\n if (interrupted?.()) return true;\n ms = deadline - performance.now();\n if (ms <= 0) return false;\n }\n}\n\nconst EINTR_LIBC = 22;\nconst MAIN_HANDLE = 0x7fffffff;\n\nexport class WasixHost {\n private readonly process: WasixProcess;\n\n threads: WasiThreads | undefined;\n\n linker: WasixLinker | undefined;\n\n types = new FuncTypes();\n\n table: WebAssembly.Table | 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(\n host,\n driver,\n () => (this.threads?.tid ?? MAIN_TID) !== MAIN_TID\n );\n\n if (module && !WebAssembly.Module.imports(module).some((i) => i.name === 'fd_fdflags_set')) {\n host.fds.implicitCloexec = true;\n\n host.interruptWakes = (libcVersion(module) ?? 0) < EINTR_LIBC;\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 closure_allocate: (out: number) => {\n if (!this.linker) throw new WasiError('ENOTSUP');\n this.mem.view().setUint32(out, this.linker.allocateClosure(), true);\n },\n closure_prepare: (\n backing: number,\n index: number,\n argTypes: number,\n argCount: number,\n resultTypes: number,\n resultCount: number,\n userData: number\n ) => {\n if (!this.linker) throw new WasiError('ENOTSUP');\n const params = valueTypes(this.mem.bytes(argTypes, argCount));\n const results = valueTypes(this.mem.bytes(resultTypes, resultCount));\n if (!params || !results) throw new WasiError('EINVAL');\n try {\n this.linker.prepareClosure({ index, backing, userData, params, results });\n } catch (e) {\n if (e instanceof DlError) throw new WasiError('EINVAL');\n throw e;\n }\n },\n closure_free: (index: number) => {\n if (!this.linker) throw new WasiError('ENOTSUP');\n this.linker.freeClosure(index);\n },\n call_dynamic: (...a: number[]) =>\n void callDynamic(\n { mem: this.mem, table: () => this.table, types: this.types },\n ...(a as [number, number, number, number, number, number])\n ),\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.parent?.() ?? 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 : wasixSignal(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 if (!this.linker) return failed('not a dynamically-linked program', buf, len);\n mem.view().setUint32(out, MAIN_HANDLE, 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 === 0 ? MAIN_HANDLE : 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 === MAIN_HANDLE ? 0 : handle, this.str(s, sl)),\n (v) => void mem.view().setUint32(out, v, true)\n ),\n dl_invalid_handle: (handle: number) =>\n this.linker && (handle === MAIN_HANDLE || (handle !== 0 && !this.linker.invalid(handle)))\n ? E.SUCCESS\n : 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 = posixSignal(sig);\n if (host.onRaise?.(posix)) return;\n host.o.kernel.call({ op: 'thread-kill', tid, 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 v.setUint8(\n wokenPtr,\n futexWait(i32(), ptr >> 2, expected | 0, ms, host.interrupted) ? 1 : 0\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 host.interrupted?.();\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) throw new WasiError('ENOTTY');\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 this.host.interrupted?.();\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 = wasixSignal(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 { physicalPath } from '../../fs/physical-path.ts';\nimport type { MountLine, ProcessListing } from '../../kernel/proc-info.ts';\nimport 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 { defaultAction } from '../../kernel/signals.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 { publishMemory, SAB_HEADER_I32 } from '../../realm/sync-sab-wire.ts';\nimport { SyscallError } from '../kernel-streams.ts';\nimport { identify, 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, type WasiHostOptions } 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 { ProcTree, procfsBridge } from './wasi-procfs.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, type WasiForkState } from './wasix-fork.ts';\nimport { WasixHost } from './wasix-host.ts';\nimport { type LinkerHost, type LinkRecord, TABLE_BASE, 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';\nconst SLICC = 'slicc';\n\nconst SIGNAL_CALLBACK = '__wasm_signal';\n\nconst takeDefault =\n (call: (req: WasmSyscall) => unknown, pid: number) =>\n (sig: number): void => {\n call({ op: 'proc-kill', pid, sig });\n if (defaultAction(sig) === 'terminate') throw new WasiExit(128 + sig);\n };\n\nconst SLICC_FS = 'slicc_fs';\nconst SLICC_TTY = 'slicc_tty';\n\nconst RESERVED = RESERVED_NAMESPACES;\n\nexport const UNDELIVERED: Readonly<Record<string, readonly string[]>> = {\n [PREVIEW1]: ['proc_exit', 'clock_time_get'],\n [WASIX]: ['proc_exit2', 'thread_exit', 'thread_spawn_v2', 'callback_signal'],\n [SLICC]: ['sigaction_set'],\n wasi: ['thread-spawn'],\n};\n\nconst DELIVERED = [PREVIEW1, WASIX, SLICC, SLICC_FS, SLICC_TTY];\n\nexport function wireSignals(host: WasiHost, gate: SignalGate): void {\n host.interrupted = () => gate.interrupt();\n host.quietly = (fn) => gate.quiet(fn);\n}\n\nexport function catchUpFirst(\n host: WasiHost,\n sync: { current(): void } | undefined\n): (() => void) | undefined {\n return sync && (() => host.quietly(() => sync.current()));\n}\n\nfunction deliverAll(\n imports: WebAssembly.Imports,\n host: WasiHost,\n driver: AsyncifyDriver,\n before?: () => void\n): void {\n for (const ns of DELIVERED) {\n const table = imports[ns];\n if (table) imports[ns] = delivering(ns, table, host, driver, before);\n }\n}\n\nexport function delivering(\n ns: string,\n table: WebAssembly.ModuleImports,\n host: WasiHost,\n driver: AsyncifyDriver,\n before?: () => void\n): WebAssembly.ModuleImports {\n const exempt = new Set(UNDELIVERED[ns]);\n const out: WebAssembly.ModuleImports = {};\n for (const [name, value] of Object.entries(table)) {\n if (exempt.has(name) || typeof value !== 'function') {\n out[name] = value;\n continue;\n }\n const fn = value as (...args: unknown[]) => unknown;\n out[name] = (...args: unknown[]) => {\n if (driver.idle) {\n before?.();\n host.interrupted?.();\n }\n return fn(...args);\n };\n }\n return out;\n}\n\nconst importsSigactionHook = (module: WebAssembly.Module): boolean =>\n WebAssembly.Module.imports(module).some((i) => i.module === SLICC && i.name === 'sigaction_set');\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 slicc: Record<string, WasiFunction> = {},\n sliccFs: Record<string, WasiFunction> = {},\n sliccTty: Record<string, WasiFunction> = {}\n): WebAssembly.Imports {\n for (const ns of Object.keys(program)) {\n if (RESERVED.has(ns) || ns === SLICC || ns === SLICC_FS || ns === SLICC_TTY)\n throw new Error(`the imports module may not define ${ns}`);\n }\n const imports: Record<string, Record<string, WebAssembly.ImportValue>> = {\n ...program,\n [SLICC]: { ...slicc },\n [SLICC_FS]: { ...sliccFs },\n [SLICC_TTY]: { ...sliccTty },\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 sizeOf(main: { memory?: WebAssembly.Memory }): () => number {\n return () => main.memory?.buffer.byteLength ?? 0;\n}\n\nfunction memoryOf(\n instance: WebAssembly.Instance,\n imported: WebAssembly.Memory | undefined\n): WebAssembly.Memory | undefined {\n return imported ?? (instance.exports.memory as WebAssembly.Memory | undefined);\n}\n\nfunction kernelOf(\n init: { sab: SharedArrayBuffer; argv0: string },\n port: SabPostLike,\n\n hooks: SignalHooks = { masks: () => null, raise: () => {} },\n memory?: () => number\n) {\n const gate = new SignalGate(\n createSyncSabTransport(init.sab, port, memory ? { memory } : {}),\n new Int32Array(init.sab, 0, SAB_HEADER_I32),\n hooks\n );\n const transport = gate.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, gate };\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 path,\n }: {\n thread?: boolean;\n stats?: WasiStats;\n signals?: WasiSignals;\n program?: ProgramOption;\n foreign?: ForeignResults | undefined;\n path?: string | 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\n )\n : undefined;\n if (sync) {\n ({ preview1, wasix } = sync.guard(preview1, wasix));\n if (wasixHost) {\n wasixHost.linker = sync.linker;\n wasixHost.types = sync.linker.types;\n }\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 slicc = traced(stats, 'slicc', host.sliccImports());\n const sliccFs = traced(stats, 'slicc_fs', host.sliccFsImports());\n const sliccTty = traced(stats, 'slicc_tty', host.sliccTtyImports());\n const hostImports = linkImports(\n module,\n preview1,\n wasix,\n memory,\n threads,\n extra,\n foreign,\n slicc,\n sliccFs,\n sliccTty\n );\n deliverAll(hostImports, host, driver, catchUpFirst(host, sync));\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 (wasixHost) {\n const table = sync?.linker.table ?? exportedTable(instance);\n wasixHost.table = table;\n if (path !== undefined) {\n const read = linkerHost(host, () => ({})).read;\n wasixHost.types.register(() => read(path), instance, table, sync ? TABLE_BASE : 0);\n }\n }\n if (sync) {\n sync.linker.bindMain(instance, !thread);\n if (path !== undefined) sync.linker.mainPath = path;\n\n if (thread) sync.catchUp();\n\n sync.linker.bindMainGot();\n }\n return { instance, driver };\n}\n\nfunction procTree(call: (req: WasmSyscall) => unknown, pid: number): ProcTree {\n return new ProcTree(\n {\n procList: () => call({ op: 'proc-list' }) as ProcessListing,\n mountList: () => call({ op: 'mount-list' }) as MountLine[],\n },\n pid\n );\n}\n\nfunction exportedTable(instance: WebAssembly.Instance): WebAssembly.Table | undefined {\n const table = instance.exports.__indirect_function_table;\n return table instanceof WebAssembly.Table ? table : undefined;\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 real: (path) => physicalPath(host.o.fs, path),\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\nexport class 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 private readonly owner: number;\n constructor(\n linker: WasixLinker,\n call: (req: WasmSyscall) => unknown,\n threads: Pick<WasiThreads, 'ids' | 'tid'> | undefined\n ) {\n this.linker = linker;\n this.call = call;\n this.ids = threads?.ids;\n this.owner = threads?.tid ?? 0;\n linker.publisher = (record) => this.publish(record);\n linker.indices = {\n reserve: (floor, size) => this.call({ op: 'dl-reserve', floor, size }) as number,\n load: (floor, size) =>\n this.call({ op: 'dl-load-reserve', floor, size }) as { base: number; handle: number },\n lock: () => {\n this.call({ op: 'dl-lock', owner: this.owner });\n try {\n this.catchUp();\n } catch (e) {\n this.call({ op: 'dl-unlock', owner: this.owner });\n throw e;\n }\n },\n unlock: () => this.call({ op: 'dl-unlock', owner: this.owner }),\n allocate: (floor) => {\n const index = this.call({ op: 'dl-closure', floor }) as number;\n this.catchUp();\n this.bump();\n return index;\n },\n free: (index) => {\n this.call({ op: 'dl-closure-free', index });\n this.bump();\n },\n };\n }\n\n private bump(): void {\n if (this.ids) Atomics.add(this.ids, DL_GEN, 1);\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 this.bump();\n this.catchUp();\n }\n\n current(): void {\n if (this.ids && Atomics.load(this.ids, DL_GEN) !== this.gen) this.catchUp();\n }\n\n catchUp(): void {\n for (;;) {\n const gen = this.ids ? Atomics.load(this.ids, DL_GEN) : 0;\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 || Atomics.load(this.ids, DL_GEN) === gen) {\n this.gen = gen;\n return;\n }\n }\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 this.current();\n const result = fn(...args);\n this.current();\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\nfunction descriptors(\n init: WasmProcessInitMsg,\n fork: WasiForkState | undefined,\n threads: WasiThreads | undefined\n): Pick<WasiHostOptions, 'shared' | 'forked' | 'inherited' | 'preopenRoot'> {\n if (fork?.shared && threads) return { shared: threads.ids };\n if (fork) return { forked: { fds: fork.fds, cloexec: fork.cloexec } };\n return { inherited: init.fds ?? [], ...(init.program.preopenRoot ? { preopenRoot: true } : {}) };\n}\n\nfunction ownersOf(init: { owners?: boolean }): { owners?: boolean } {\n return init.owners ? { owners: true } : {};\n}\n\nexport async function runWasiProcess(init: WasmProcessInitMsg, port: SabPostLike): Promise<number> {\n captureBacktraces(init.env);\n\n const signals = new WasiSignals(\n takeDefault((req) => call(req), init.pid),\n (code) => {\n throw new WasiExit(code);\n }\n );\n const main: { memory?: WebAssembly.Memory } = {};\n const {\n transport,\n sys,\n call: kernelCall,\n say,\n gate,\n } = kernelOf(init, port, signals, sizeOf(main));\n const id = identify(transport, init);\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: id.pid,\n ppid: id.ppid,\n parent: () => identify(transport, init).ppid,\n kernel: { sys: traced(stats, 'kernel', sys), call },\n fs: procfsBridge(\n cachingBridge(\n traced(stats, 'fs', createSyncFsSabBridge(transport, ownersOf(init))),\n undefined,\n threads?.ids\n ),\n procTree(call, id.pid)\n ),\n ...descriptors(init, fork, threads),\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 path: init.program.path,\n ...(program ? { program } : {}),\n });\n restoreExportedMemory(instance, memory, init);\n main.memory = memoryOf(instance, memory);\n publishMemory(init.sab, sizeOf(main)());\n signals.bind(instance.exports);\n if (importsSigactionHook(module)) signals.useHook();\n if (fork?.signals) signals.restore(fork.signals);\n host.signals = signals;\n wireSignals(host, gate);\n host.onRaise = (sig) => signals.raised(sig);\n host.muted = (fd, data) => signals.muted(fd, data);\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 { thread } = init;\n const { transport, sys, call, say, gate } = kernelOf(init, port, {\n masks: () => null,\n raise: (sig) => signals.raise(sig),\n });\n const signals = new WasiSignals(takeDefault(call, init.pid));\n const threads = new WasiThreads(port, thread.memory, threadCap(init.env), thread.tid, thread.ids);\n threads.received = thread.modules;\n const id = identify(transport, init);\n const host = new WasiHost({\n args: [init.argv0, ...init.args],\n env: init.env,\n cwd: init.cwd,\n pid: id.pid,\n ppid: id.ppid,\n parent: () => identify(transport, init).ppid,\n kernel: { sys, call },\n fs: procfsBridge(\n cachingBridge(createSyncFsSabBridge(transport, ownersOf(init)), undefined, threads.ids),\n procTree(call, id.pid)\n ),\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 path: init.program.path,\n ...(program ? { program } : {}),\n });\n signals.bind(instance.exports);\n signals.register(SIGNAL_CALLBACK);\n wireSignals(host, gate);\n host.onRaise = (sig) => signals.raised(sig);\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 { nodeLockdown } from './node-lockdown.ts';\nimport { runJsProcess } from './process/js/js-runtime.ts';\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 post = { postMessage: (message: unknown) => port.postMessage(message) };\nconst onMessage = processEntry(post, undefined, undefined, async () => ({\n runJsProcess: (init, at) => runJsProcess(init, at, { lockdown: () => nodeLockdown() }),\n}));\nport.on('message', onMessage);\n", "import { isBuiltin, registerHooks } from 'node:module';\nimport { hide, lockdown, vacate } from './process/js/lockdown.ts';\n\nexport { vacate };\n\nexport const NODE_GLOBALS: readonly string[] = [\n 'require',\n 'module',\n 'exports',\n '__filename',\n '__dirname',\n 'localStorage',\n 'sessionStorage',\n];\n\nexport const NODE_SLOTS: readonly string[] = [\n 'process',\n 'global',\n 'setImmediate',\n 'clearImmediate',\n];\n\nexport function zeroedBuffers(buffer: typeof Buffer): void {\n const alloc = buffer.alloc.bind(buffer);\n const fixed = (value: unknown) => ({ value, writable: false, configurable: false });\n Object.defineProperties(buffer, {\n allocUnsafe: fixed((size: number) => alloc(size)),\n allocUnsafeSlow: fixed((size: number) => alloc(size)),\n poolSize: fixed(0),\n });\n}\n\nfunction refused(specifier: string): Error {\n return Object.assign(new Error(`slicc-kernel: a JS program cannot import ${specifier}`), {\n code: 'ERR_ACCESS_DENIED',\n });\n}\n\nexport function refuseModules(): void {\n registerHooks({\n resolve(specifier, context, next) {\n if (isBuiltin(specifier)) throw refused(specifier);\n const resolved = next(specifier, context);\n if (!resolved.url.startsWith('data:')) throw refused(resolved.url);\n return resolved;\n },\n });\n}\n\nexport function nodeLockdown(scope: object = globalThis): void {\n zeroedBuffers(Buffer);\n lockdown(scope);\n hide(scope, NODE_GLOBALS);\n vacate(scope, NODE_SLOTS);\n refuseModules();\n}\n", "import { useLocalClock } from '../kernel/cpu-clock.ts';\nimport {\n type JsProcessInitMsg,\n type ProcessInitMsg,\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\nexport interface JsRuntime {\n runJsProcess(init: JsProcessInitMsg, port: SabPostLike): Promise<number>;\n}\n\nexport type JsLoader = () => Promise<JsRuntime>;\n\nconst loadWasi: WasiLoader = () => import('./wasi/wasi-runtime.ts');\n\nconst loadJs: JsLoader = () => import('./js/js-runtime.ts');\n\nconst NOT_RUNNABLE = 126;\n\nfunction started(\n init: ProcessInitMsg,\n port: SabPostLike,\n run: ProcessRunner,\n wasi: WasiLoader,\n js: JsLoader\n): Promise<number> {\n if (init.program?.abi === 'js') {\n const jsInit = init as JsProcessInitMsg;\n return js().then((m) => m.runJsProcess(jsInit, port));\n }\n const wasmInit = init as WasmProcessInitMsg;\n if (wasmInit.program?.abi === 'wasi') return wasi().then((m) => m.runWasiProcess(wasmInit, port));\n return run(wasmInit, port);\n}\n\nexport function processEntry(\n port: SabPostLike,\n run: ProcessRunner = runWasmProcess,\n wasi: WasiLoader = loadWasi,\n js: JsLoader = loadJs,\n seal: () => void = () => {}\n): (data: unknown) => void {\n const failed = (err: unknown, code?: number): void =>\n port.postMessage({\n type: WASM_PROCESS_ERROR,\n message: err instanceof Error ? (err.stack ?? err.message) : String(err),\n ...(code === undefined ? {} : { code }),\n } satisfies WasmProcessErrorMsg);\n let refused: { error: unknown } | null | undefined;\n const sealOnce = (): { error: unknown } | null => {\n if (refused === undefined) {\n try {\n seal();\n refused = null;\n } catch (error) {\n refused = { error };\n }\n }\n return refused;\n };\n return (data) => {\n const type = (data as { type?: string } | undefined)?.type;\n if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT) return;\n const refusal = sealOnce();\n const init = data as { sab?: SharedArrayBuffer; program?: { abi?: string } } | undefined;\n if (type === WASM_THREAD_INIT || init?.program?.abi !== 'js') useLocalClock(init?.sab);\n if (type === WASM_THREAD_INIT) {\n if (refusal) return failed(refusal.error);\n wasi()\n .then((m) => m.runWasiThread(data as WasmThreadInitMsg, port))\n .catch(failed);\n return;\n }\n if (refusal) return failed(refusal.error, NOT_RUNNABLE);\n started(data as ProcessInitMsg, port, run, wasi, js).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": ["export const BLOCKED_GLOBALS: readonly string[] = [\n 'XMLHttpRequest',\n 'WebSocketStream',\n 'WebTransport',\n 'EventSource',\n 'importScripts',\n 'indexedDB',\n 'caches',\n 'cookieStore',\n 'Worker',\n 'SharedWorker',\n 'BroadcastChannel',\n 'postMessage',\n 'close',\n 'webkitRequestFileSystem',\n 'webkitRequestFileSystemSync',\n 'webkitResolveLocalFileSystemURL',\n 'webkitResolveLocalFileSystemSyncURL',\n];\n\nexport const BLOCKED_NAVIGATOR: readonly string[] = [\n 'storage',\n 'storageBuckets',\n 'locks',\n 'serviceWorker',\n 'usb',\n 'hid',\n 'serial',\n];\n\nexport const OPEN_SLOTS: readonly string[] = ['fetch', 'WebSocket'];\n\nfunction chain(target: object): object[] {\n const out: object[] = [];\n for (let at: object | null = target; at && at !== Object.prototype; ) {\n out.push(at);\n at = Object.getPrototypeOf(at);\n }\n return out;\n}\n\nexport function hide(target: object, names: readonly string[]): void {\n for (const name of names) {\n const holders = chain(target);\n for (const holder of holders) {\n if (Object.getOwnPropertyDescriptor(holder, name)?.configurable) {\n Reflect.deleteProperty(holder, name);\n }\n }\n const kept = holders.slice(1).some((holder) => Object.hasOwn(holder, name));\n const defined = Reflect.defineProperty(target, name, {\n value: undefined,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n if (kept || (!defined && Reflect.get(target, name) !== undefined)) {\n throw new Error(`slicc-kernel: cannot withhold ${name} from a JS program`);\n }\n }\n}\n\nexport function vacate(target: object, names: readonly string[]): void {\n for (const name of names) {\n for (let at: object | null = target; at && at !== Object.prototype; ) {\n if (Object.getOwnPropertyDescriptor(at, name)?.configurable) Reflect.deleteProperty(at, name);\n at = Object.getPrototypeOf(at);\n }\n Reflect.defineProperty(target, name, {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n if (Reflect.get(target, name) !== undefined) {\n throw new Error(`slicc-kernel: cannot withhold ${name} from a JS program`);\n }\n }\n}\n\nexport function lockdown(scope: object = globalThis): void {\n hide(scope, BLOCKED_GLOBALS);\n vacate(scope, OPEN_SLOTS);\n const navigator = (scope as { navigator?: unknown }).navigator;\n if (navigator && typeof navigator === 'object') hide(navigator, BLOCKED_NAVIGATOR);\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 BADMSG: 9,\n BUSY: 10,\n CANCELED: 11,\n CHILD: 12,\n CONNABORTED: 13,\n CONNREFUSED: 14,\n CONNRESET: 15,\n DEADLK: 16,\n DESTADDRREQ: 17,\n DOM: 18,\n DQUOT: 19,\n EXIST: 20,\n FAULT: 21,\n FBIG: 22,\n HOSTUNREACH: 23,\n IDRM: 24,\n ILSEQ: 25,\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 MLINK: 34,\n MSGSIZE: 35,\n MULTIHOP: 36,\n NAMETOOLONG: 37,\n NETDOWN: 38,\n NETRESET: 39,\n NETUNREACH: 40,\n NFILE: 41,\n NOBUFS: 42,\n NODEV: 43,\n NOENT: 44,\n NOEXEC: 45,\n NOLCK: 46,\n NOLINK: 47,\n NOMEM: 48,\n NOMSG: 49,\n NOPROTOOPT: 50,\n NOSPC: 51,\n NOSYS: 52,\n NOTCONN: 53,\n NOTDIR: 54,\n NOTEMPTY: 55,\n NOTRECOVERABLE: 56,\n NOTSOCK: 57,\n NOTSUP: 58,\n NOTTY: 59,\n NXIO: 60,\n OVERFLOW: 61,\n OWNERDEAD: 62,\n PERM: 63,\n PIPE: 64,\n PROTO: 65,\n PROTONOSUPPORT: 66,\n PROTOTYPE: 67,\n RANGE: 68,\n ROFS: 69,\n SPIPE: 70,\n SRCH: 71,\n STALE: 72,\n TIMEDOUT: 73,\n TXTBSY: 74,\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 if (name === 'NOMEDIUM') return E.NODEV;\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\nexport function wasixSignal(sig: number): number | undefined {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31 ? sig : undefined;\n}\n", "export const PAGE = 64 * 1024;\nexport const READAHEAD = 1024 * 1024;\nexport const CLEAN_LIMIT = 4 * 1024 * 1024;\nexport const WRITEBACK = 8 * 1024 * 1024;\nexport const RUN = 1024 * 1024;\n\nexport interface Run {\n offset: number;\n bytes: Uint8Array;\n}\n\nexport interface FlushPlan {\n shrink?: number;\n runs: Run[];\n extend?: number;\n}\n\nexport class Pages {\n length: number;\n private stored: number;\n private shrink: number | undefined;\n private readonly pages = new Map<number, Uint8Array>();\n private readonly dirty = new Set<number>();\n private readonly free: Uint8Array[] = [];\n private pinned = false;\n\n constructor(size: number) {\n this.length = size;\n this.stored = size;\n }\n\n get dirtyBytes(): number {\n return this.dirty.size * PAGE;\n }\n\n get changed(): boolean {\n return this.dirty.size > 0 || this.shrink !== undefined || this.length !== this.stored;\n }\n\n missing(at: number, length: number): Array<[number, number]> {\n this.evict();\n const end = Math.min(this.stored, at + length, this.length);\n const runs: Array<[number, number]> = [];\n for (let page = Math.floor(at / PAGE); page * PAGE < end; page++) {\n if (this.pages.has(page)) continue;\n const last = runs[runs.length - 1];\n if (last && last[0] + last[1] === page * PAGE) last[1] += PAGE;\n else runs.push([page * PAGE, PAGE]);\n }\n const last = runs[runs.length - 1];\n if (last) last[1] = Math.max(last[1], Math.min(READAHEAD, this.stored - last[0]));\n return runs.map(([start, n]) => [start, Math.min(n, this.stored - start)]);\n }\n\n partial(at: number, length: number): Array<[number, number]> {\n if (length === 0) return [];\n this.evict();\n const edges = new Set([Math.floor(at / PAGE), Math.floor((at + length - 1) / PAGE)]);\n const runs: Array<[number, number]> = [];\n for (const page of edges) {\n const start = page * PAGE;\n const covered = at <= start && at + length >= start + PAGE;\n if (covered || this.pages.has(page) || start >= this.stored) continue;\n runs.push([start, Math.min(PAGE, this.stored - start)]);\n }\n return runs;\n }\n\n fill(start: number, bytes: Uint8Array): void {\n for (let at = 0; at < bytes.length; at += PAGE) {\n const page = (start + at) / PAGE;\n if (this.pages.has(page)) continue;\n const part = bytes.subarray(at, Math.min(at + PAGE, bytes.length));\n const fresh = this.take(part.length);\n fresh.set(part);\n this.pages.set(page, fresh);\n }\n }\n\n read(at: number, length: number): Uint8Array {\n const out = new Uint8Array(Math.max(0, Math.min(this.length, at + length) - at));\n this.readInto(at, out);\n return out;\n }\n\n readInto(at: number, out: Uint8Array): number {\n const end = Math.min(this.length, at + out.length);\n for (let pos = at; pos < end; ) {\n const page = Math.floor(pos / PAGE);\n const from = pos - page * PAGE;\n const n = Math.min(PAGE - from, end - pos);\n const bytes = this.pages.get(page);\n if (bytes) out.set(bytes.subarray(from, from + n), pos - at);\n else out.fill(0, pos - at, pos - at + n);\n pos += n;\n }\n return Math.max(0, end - at);\n }\n\n write(at: number, bytes: Uint8Array): void {\n for (let done = 0; done < bytes.length; ) {\n const pos = at + done;\n const page = Math.floor(pos / PAGE);\n const from = pos - page * PAGE;\n const n = Math.min(PAGE - from, bytes.length - done);\n let target = this.pages.get(page);\n if (!target) {\n target = this.take(0);\n this.pages.set(page, target);\n }\n target.set(bytes.subarray(done, done + n), from);\n this.dirty.add(page);\n done += n;\n }\n this.length = Math.max(this.length, at + bytes.length);\n }\n\n truncate(size: number): void {\n if (size < this.stored) {\n this.stored = size;\n this.shrink = Math.min(this.shrink ?? size, size);\n }\n if (size < this.length) {\n const edge = Math.floor(size / PAGE);\n for (const page of [...this.pages.keys()]) {\n if (page > edge || (page === edge && size === edge * PAGE)) this.drop(page);\n }\n this.pages.get(edge)?.fill(0, size - edge * PAGE);\n }\n this.length = size;\n }\n\n plan(): FlushPlan {\n const runs: Run[] = [];\n const sorted = [...this.dirty].sort((a, b) => a - b);\n for (let i = 0; i < sorted.length; ) {\n let j = i + 1;\n const first = sorted[i] as number;\n while (\n j < sorted.length &&\n sorted[j] === first + (j - i) &&\n ((sorted[j] as number) * PAGE) % RUN !== 0\n ) {\n j++;\n }\n const start = first * PAGE;\n const end = Math.min(this.length, (first + (j - i)) * PAGE);\n const bytes = new Uint8Array(end - start);\n for (let k = i; k < j; k++) {\n const page = this.pages.get(sorted[k] as number) as Uint8Array;\n bytes.set(page.subarray(0, Math.min(PAGE, end - (k - i) * PAGE - start)), (k - i) * PAGE);\n }\n runs.push({ offset: start, bytes });\n i = j;\n }\n const written = Math.max(this.stored, ...runs.map((r) => r.offset + r.bytes.length));\n return {\n ...(this.shrink !== undefined ? { shrink: this.shrink } : {}),\n runs,\n ...(this.length > written ? { extend: this.length } : {}),\n };\n }\n\n flushed(): void {\n this.dirty.clear();\n this.shrink = undefined;\n this.stored = this.length;\n this.evict();\n }\n\n pin(): void {\n this.pinned = true;\n }\n\n reset(size: number): void {\n if (this.pinned) return;\n for (const page of [...this.pages.keys()]) if (!this.dirty.has(page)) this.drop(page);\n if (this.changed) return;\n this.length = size;\n this.stored = size;\n }\n\n private evict(): void {\n if (this.pinned) return;\n let clean = (this.pages.size - this.dirty.size) * PAGE;\n for (const page of this.pages.keys()) {\n if (clean <= CLEAN_LIMIT) return;\n if (this.dirty.has(page)) continue;\n this.drop(page);\n clean -= PAGE;\n }\n }\n\n private take(used: number): Uint8Array {\n const page = this.free.pop();\n if (!page) return new Uint8Array(PAGE);\n page.fill(0, used);\n return page;\n }\n\n private drop(page: number): void {\n const bytes = this.pages.get(page) as Uint8Array;\n this.pages.delete(page);\n this.dirty.delete(page);\n if (this.free.length < CLEAN_LIMIT / PAGE) this.free.push(bytes);\n }\n}\n", "import { Pages, WRITEBACK } from './pages.ts';\n\nexport interface RangedIo {\n pread(path: string, offset: number, length: number, version?: string): Uint8Array;\n pwrite(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): void;\n truncate(path: string, size: number): void;\n}\n\nexport interface AsyncRangedIo {\n pread(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate(path: string, size: number): Promise<void>;\n}\n\nexport class RangedFile {\n private readonly pages: Pages;\n private readonly io: RangedIo;\n private pinned = false;\n private version: string | undefined;\n path: string;\n\n constructor(io: RangedIo, path: string, size: number, version?: string) {\n this.io = io;\n this.path = path;\n this.version = version;\n this.pages = new Pages(size);\n }\n\n get changed(): boolean {\n return this.pages.changed;\n }\n\n get pinnedVersion(): string | undefined {\n return this.version;\n }\n\n forget(): void {\n this.pages.reset(this.pages.length);\n }\n\n size(): number {\n return this.pages.length;\n }\n\n private fetch(runs: Array<[number, number]>): void {\n for (const [start, n] of runs) {\n this.pages.fill(start, this.io.pread(this.path, start, n, this.version));\n }\n }\n\n read(at: number, length: number): Uint8Array {\n this.fetch(this.pages.missing(at, length));\n return this.pages.read(at, length);\n }\n\n readInto(at: number, out: Uint8Array): number {\n this.fetch(this.pages.missing(at, out.length));\n return this.pages.readInto(at, out);\n }\n\n write(at: number, bytes: Uint8Array): void {\n this.fetch(this.pages.partial(at, bytes.length));\n this.pages.write(at, bytes);\n if (!this.pinned && this.pages.dirtyBytes >= WRITEBACK) this.flush();\n }\n\n truncate(size: number): void {\n this.pages.truncate(size);\n }\n\n flush(): void {\n if (this.pinned || !this.pages.changed) return;\n const plan = this.pages.plan();\n if (plan.shrink !== undefined) this.io.truncate(this.path, plan.shrink);\n for (const run of plan.runs) this.io.pwrite(this.path, run.offset, run.bytes, true);\n if (plan.extend !== undefined) this.io.truncate(this.path, plan.extend);\n this.version = undefined;\n this.pages.flushed();\n }\n\n pin(): void {\n this.pinned = true;\n this.pages.pin();\n this.fetch(this.pages.missing(0, this.pages.length));\n }\n\n reset(size: number): void {\n this.pages.reset(size);\n }\n}\n\nexport class AsyncRangedFile {\n private readonly pages: Pages;\n private readonly io: AsyncRangedIo;\n private pinned = false;\n private version: string | undefined;\n path: string;\n\n constructor(io: AsyncRangedIo, path: string, size: number, version?: string) {\n this.io = io;\n this.path = path;\n this.version = version;\n this.pages = new Pages(size);\n }\n\n size(): number {\n return this.pages.length;\n }\n\n private async fetch(runs: Array<[number, number]>): Promise<void> {\n for (const [start, n] of runs) {\n this.pages.fill(start, await this.io.pread(this.path, start, n, this.version));\n }\n }\n\n async read(at: number, length: number): Promise<Uint8Array> {\n await this.fetch(this.pages.missing(at, length));\n return this.pages.read(at, length);\n }\n\n async write(at: number, bytes: Uint8Array): Promise<void> {\n await this.fetch(this.pages.partial(at, bytes.length));\n this.pages.write(at, bytes);\n if (!this.pinned && this.pages.dirtyBytes >= WRITEBACK) await this.flush();\n }\n\n truncate(size: number): void {\n this.pages.truncate(size);\n }\n\n async flush(): Promise<void> {\n if (this.pinned || !this.pages.changed) return;\n const plan = this.pages.plan();\n if (plan.shrink !== undefined) await this.io.truncate(this.path, plan.shrink);\n for (const run of plan.runs) await this.io.pwrite(this.path, run.offset, run.bytes, true);\n if (plan.extend !== undefined) await this.io.truncate(this.path, plan.extend);\n this.version = undefined;\n this.pages.flushed();\n }\n\n async pin(): Promise<void> {\n this.pinned = true;\n this.pages.pin();\n await this.fetch(this.pages.missing(0, this.pages.length));\n }\n}\n", "import { RangedFile } from '../../fs/ranged.ts';\nimport type { DeviceAccess, KernelFdKind } from '../../kernel/fd-table.ts';\nimport type {\n SyncFsBridgeStat,\n SyncFsFileIo,\n SyncFsPosixBridge,\n} 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 whole = false;\n private from = Infinity;\n private to = 0;\n\n private orphaned = false;\n\n opens = 0;\n\n private readonly fs: SyncFsFileIo;\n private where: string;\n private readonly ranged: RangedFile | undefined;\n\n maxFile: number | undefined;\n handle: number | undefined;\n\n constructor(\n fs: SyncFsFileIo,\n path: string,\n\n empty: boolean,\n maxFile?: number,\n size?: number,\n version?: string\n ) {\n this.fs = fs;\n this.where = path;\n this.maxFile = maxFile;\n const { pread, pwrite, truncate } = fs;\n if (size !== undefined && pread && pwrite && truncate) {\n const io = { pread: pread.bind(fs), pwrite: pwrite.bind(fs), truncate: truncate.bind(fs) };\n this.ranged = new RangedFile(io, path, size, version);\n if (empty) this.truncate(0);\n } else if (empty) {\n this.data = new Uint8Array(0);\n this.dirty = true;\n this.whole = true;\n }\n }\n\n get path(): string {\n return this.where;\n }\n\n set path(path: string) {\n this.where = path;\n if (this.ranged) this.ranged.path = path;\n }\n\n get isRanged(): boolean {\n return this.ranged !== undefined;\n }\n\n get pin(): string | undefined {\n return this.ranged?.pinnedVersion;\n }\n\n keep(): void {\n if (this.ranged) this.ranged.pin();\n else this.load();\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 if (this.ranged) return this.ranged.size();\n this.load();\n return this.length;\n }\n\n pread(max: number, at: number): Uint8Array {\n if (this.ranged) return this.ranged.read(at, max);\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 private fits(end: number): void {\n if (this.maxFile !== undefined && end > this.maxFile) throw new WasiError('EFBIG');\n }\n\n pwrite(bytes: Uint8Array, at: number): number {\n if (bytes.length === 0) return 0;\n const end = at + bytes.length;\n this.fits(end);\n this.dirty = true;\n if (this.ranged) {\n this.ranged.write(at, bytes);\n return bytes.length;\n }\n this.load();\n this.ensure(end);\n const buf = this.data as Uint8Array;\n this.from = Math.min(this.from, at, this.length);\n this.to = Math.max(this.to, end);\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 return bytes.length;\n }\n\n truncate(size: number): void {\n this.fits(size);\n this.dirty = true;\n if (this.ranged) {\n this.ranged.truncate(size);\n return;\n }\n this.load();\n this.ensure(size);\n this.whole = true;\n if (size > this.length) (this.data as Uint8Array).fill(0, this.length, size);\n this.length = size;\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 this.ranged?.pin();\n }\n\n isOrphan(): boolean {\n return this.orphaned;\n }\n\n isDirty(): boolean {\n return this.dirty;\n }\n\n contents(): Uint8Array {\n if (this.ranged) return this.ranged.read(0, this.ranged.size());\n return this.load().slice(0, this.length);\n }\n\n flush(): void {\n if (this.orphaned || !this.dirty) return;\n if (this.ranged) this.ranged.flush();\n else if (!this.data) return;\n else if (this.whole || !this.fs.pwrite)\n this.fs.writeFile(this.path, this.data.slice(0, this.length), true);\n else this.fs.pwrite(this.path, this.from, this.data.slice(this.from, this.to), true);\n this.dirty = false;\n this.whole = false;\n this.from = Infinity;\n this.to = 0;\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 path?: string;\n ino?: number;\n }\n | { type: 'file'; file: LocalFile }\n | {\n type: 'dir';\n path: string;\n\n preopen?: string;\n twin?: number;\n listing?: DirListing;\n }\n | {\n type: 'device';\n device: 'null' | 'zero' | 'full' | '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\nconst MAX_LINKS = 40;\n\nexport function physical(fs: Pick<SyncFsPosixBridge, 'lstat' | 'readlink'>, path: string): string {\n let done: string[] = [];\n let todo = path.split('/').filter((part) => part !== '' && part !== '.');\n let hops = 0;\n while (todo.length > 0) {\n const part = todo.shift() as string;\n if (part === '..') {\n done.pop();\n continue;\n }\n if (!todo.includes('..')) {\n done.push(part);\n continue;\n }\n const at = `/${[...done, part].join('/')}`;\n const st = fs.lstat(at);\n if (st.isSymbolicLink) {\n if (++hops > MAX_LINKS) throw new WasiError('ELOOP');\n const target = fs.readlink(at);\n if (target.startsWith('/')) done = [];\n todo = [...target.split('/').filter((p) => p !== '' && p !== '.'), ...todo];\n } else if (!st.isDirectory) {\n throw new WasiError('ENOTDIR');\n } else {\n done.push(part);\n }\n }\n return `/${done.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 const MISS_TTL_MS = 20;\n\ninterface Miss {\n error: Error;\n until: number;\n}\n\nexport const FS_GEN = 4;\nconst RING = 8;\nconst RING_SIZE = 64;\nconst SLOT = 3;\nexport const SHARED_IDS_BYTES = (RING + RING_SIZE * SLOT) * 4;\n\ntype Cached = SyncFsBridgeStat | Miss;\n\nfunction inoKey(st: Cached): number {\n return 'ino' in st && typeof st.ino === 'number' ? (st.ino % 4294967296) | 0 : 0;\n}\n\nfunction pathHash(path: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < path.length; i++) h = Math.imul(h ^ path.charCodeAt(i), 0x01000193);\n return h === 0 ? 1 : h;\n}\n\nclass StatCache {\n readonly stats = new Map<string, Cached>();\n readonly lstats = new Map<string, Cached>();\n private readonly byHash = new Map<number, Set<string>>();\n private readonly byIno = new Map<number, Set<string>>();\n private readonly shared: Int32Array | undefined;\n private seen: number;\n constructor(shared: Int32Array | undefined) {\n this.shared = shared;\n this.seen = shared ? Atomics.load(shared, FS_GEN) : 0;\n }\n\n put(map: Map<string, Cached>, path: string, entry: Cached): void {\n map.set(path, entry);\n if (!this.shared) return;\n index(this.byHash, pathHash(path), path);\n const ino = inoKey(entry);\n if (ino !== 0) index(this.byIno, ino, path);\n }\n\n fresh(): void {\n if (!this.shared) return;\n const now = Atomics.load(this.shared, FS_GEN);\n if (now === this.seen) return;\n this.replay(now);\n this.seen = now;\n }\n\n changed(path: string | undefined, ino = 0): void {\n const key = (ino % 4294967296) | 0;\n if (this.shared) {\n const g = this.publish(this.shared, path === undefined ? 0 : pathHash(path), key);\n this.replay(g - 1);\n this.seen = g;\n if (path === undefined) this.clear();\n else this.drop(pathHash(path), key);\n }\n if (path === undefined) return;\n this.stats.delete(path);\n this.lstats.delete(path);\n }\n\n mutated(paths: readonly string[], ino = 0): void {\n this.clear();\n if (!this.shared) return;\n const key = (ino % 4294967296) | 0;\n for (const [i, hash] of (paths.length > 0 ? paths.map(pathHash) : [0]).entries()) {\n this.seen = this.publish(this.shared, hash, i === 0 ? key : 0);\n }\n }\n\n inoOf(path: string, look: () => SyncFsBridgeStat): number {\n if (!this.shared) return 0;\n this.fresh();\n const hit = this.stats.get(path);\n if (hit && 'ino' in hit && typeof hit.ino === 'number') return hit.ino;\n try {\n return look().ino ?? 0;\n } catch {\n return 0;\n }\n }\n\n private publish(shared: Int32Array, hash: number, ino: number): number {\n const g = Atomics.add(shared, FS_GEN, 1) + 1;\n const at = RING + (g % RING_SIZE) * SLOT;\n Atomics.store(shared, at, 0);\n Atomics.store(shared, at + 1, hash);\n Atomics.store(shared, at + 2, ino);\n Atomics.store(shared, at, g);\n return g;\n }\n\n private replay(upTo: number): void {\n const shared = this.shared as Int32Array;\n const missed: Array<[number, number]> = [];\n for (let g = this.seen + 1; g <= upTo && upTo - this.seen <= RING_SIZE; g++) {\n const at = RING + (g % RING_SIZE) * SLOT;\n const tag = Atomics.load(shared, at);\n const hash = Atomics.load(shared, at + 1);\n const ino = Atomics.load(shared, at + 2);\n if (tag !== g || hash === 0 || Atomics.load(shared, at) !== g) break;\n missed.push([hash, ino]);\n }\n if (missed.length < upTo - this.seen) this.clear();\n else for (const [hash, ino] of missed) this.drop(hash, ino);\n }\n\n private drop(hash: number, ino: number): void {\n const paths = [\n ...(this.byHash.get(hash) ?? []),\n ...(ino === 0 ? [] : (this.byIno.get(ino) ?? [])),\n ];\n for (const path of paths) {\n this.stats.delete(path);\n this.lstats.delete(path);\n }\n this.byHash.delete(hash);\n if (ino !== 0) this.byIno.delete(ino);\n }\n\n private clear(): void {\n this.stats.clear();\n this.lstats.clear();\n this.byHash.clear();\n this.byIno.clear();\n }\n}\n\nfunction index(map: Map<number, Set<string>>, key: number, path: string): void {\n const paths = map.get(key) ?? new Set<string>();\n paths.add(path);\n map.set(key, paths);\n}\n\nexport function cachingBridge(\n bridge: SyncFsPosixBridge,\n now: () => number = () => performance.now(),\n shared?: Int32Array\n): SyncFsPosixBridge & {\n invalidate(): void;\n touched(path?: string, ino?: number): void;\n threaded(): void;\n} {\n const blind = shared !== undefined && shared.length * 4 < SHARED_IDS_BYTES;\n const cache = new StatCache(blind ? undefined : shared);\n const { stats, lstats } = cache;\n const cached = (map: typeof stats, path: string, get: () => SyncFsBridgeStat) => {\n if (blind) return get();\n cache.fresh();\n let hit = map.get(path);\n if (hit === undefined || ('until' in hit && hit.until <= now())) {\n try {\n hit = get();\n } catch (e) {\n hit = { error: e as Error, until: now() + MISS_TTL_MS };\n }\n cache.put(map, path, hit);\n }\n if ('until' in hit) throw hit.error;\n return hit;\n };\n const invalidate = () => cache.mutated([]);\n const touched = (path?: string, ino?: number) => cache.changed(path, ino);\n\n const { chown } = bridge;\n const mutating = <T>(op: () => T, ...paths: string[]): T => {\n try {\n return op();\n } finally {\n cache.mutated(paths);\n }\n };\n let exact = false;\n const threaded = () => {\n if (blind || shared === undefined || !bridge.identify) return;\n exact = true;\n bridge.identify();\n };\n const identified = <T>(p: string, op: () => T, also: string[]): T => {\n try {\n return op();\n } finally {\n const st = bridge.identified?.() ?? null;\n if (st) cache.mutated([p, ...also], st.ino);\n else cache.mutated([]);\n }\n };\n const rewriting = <T>(p: string, op: () => T, ...also: string[]): T => {\n if (exact) return identified(p, op, also);\n const ino = cache.inoOf(p, () => bridge.stat(p));\n try {\n return op();\n } finally {\n cache.mutated([p, ...also], ino);\n }\n };\n const entry = (p: string) => [p, p.slice(0, p.lastIndexOf('/')) || '/'];\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 || blind) continue;\n cache.put(lstats, `${base}/${name}`, st);\n if (!st.isSymbolicLink) cache.put(stats, `${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, open) =>\n rewriting(p, () => bridge.writeFile(p, bytes, open), ...entry(p).slice(1)),\n mkdir: (p) => mutating(() => bridge.mkdir(p), ...entry(p)),\n rm: (p) => mutating(() => bridge.rm(p)),\n rename: (from, to) => mutating(() => bridge.rename(from, to)),\n link: (from, to, follow) => mutating(() => bridge.link(from, to, follow)),\n unlink: (p) => mutating(() => bridge.unlink(p)),\n rmdir: (p) => mutating(() => bridge.rmdir(p)),\n symlink: (target, link) => mutating(() => bridge.symlink(target, link), ...entry(link)),\n chmod: (p, mode) => rewriting(p, () => bridge.chmod(p, mode)),\n utimes: (p, a, m, now) => rewriting(p, () => bridge.utimes(p, a, m, now)),\n lutimes: (p, a, m, now) => mutating(() => bridge.lutimes(p, a, m, now), p),\n ...(bridge.hold ? { hold: bridge.hold.bind(bridge) } : {}),\n ...(bridge.access ? { access: bridge.access.bind(bridge) } : {}),\n ...(bridge.kept ? { kept: bridge.kept.bind(bridge) } : {}),\n ...(bridge.keptStat ? { keptStat: bridge.keptStat.bind(bridge) } : {}),\n ...(bridge.pinned ? { pinned: (handle: number) => pinnedIo(bridge, handle, rewriting) } : {}),\n ...(bridge.create\n ? { create: (p: string) => mutating(() => bridge.create?.(p), ...entry(p)) }\n : {}),\n ...(chown\n ? {\n chown: (p: string, uid?: number, gid?: number, follow?: boolean) =>\n rewriting(p, () => chown.call(bridge, p, uid, gid, follow)),\n }\n : {}),\n ...(bridge.pread && bridge.pwrite && bridge.truncate\n ? {\n pread: bridge.pread.bind(bridge),\n pwrite: (p: string, at: number, bytes: Uint8Array, transfer?: boolean) =>\n rewriting(p, () => bridge.pwrite?.(p, at, bytes, transfer)),\n truncate: (p: string, size: number) => rewriting(p, () => bridge.truncate?.(p, size)),\n }\n : {}),\n ...(bridge.owners ? { owners: true } : {}),\n invalidate,\n touched,\n threaded,\n };\n}\n\nfunction pinnedIo(\n bridge: SyncFsPosixBridge,\n handle: number,\n rewriting: <T>(p: string, op: () => T) => T\n): SyncFsFileIo {\n const io = (bridge.pinned as NonNullable<SyncFsPosixBridge['pinned']>)(handle);\n const { pread, pwrite, truncate } = io as Required<SyncFsFileIo>;\n return {\n readFile: (p) => io.readFile(p),\n writeFile: (p, bytes, open) => rewriting(p, () => io.writeFile(p, bytes, open)),\n pread: (p, at, n, version) => pread(p, at, n, version),\n pwrite: (p, at, bytes, transfer) => rewriting(p, () => pwrite(p, at, bytes, transfer)),\n truncate: (p, size) => rewriting(p, () => truncate(p, size)),\n };\n}\n", "import type { ForeignResults, ImportedMemory } from '../process/wasi/wasi-module.ts';\nimport type { WasiForkState } from '../process/wasi/wasix-fork.ts';\nimport type { Cred } from './cred.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 path?: string;\n names?: string;\n imports?: string;\n preopenRoot?: boolean;\n}\n\nexport interface JsProgram {\n abi: 'js';\n glue: string;\n path: string;\n}\n\nexport type Program = WasmProgram | JsProgram;\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 umask?: number;\n cred?: Cred;\n owners?: boolean;\n fork?: ForkState;\n fds?: InheritedFd[];\n}\n\nexport interface JsLane {\n sab: SharedArrayBuffer;\n port: MessagePort;\n}\n\nexport type JsProcessInitMsg = Omit<WasmProcessInitMsg, 'program' | 'fork'> & {\n program: JsProgram;\n lane?: JsLane;\n};\n\nexport type ProcessInitMsg = WasmProcessInitMsg | JsProcessInitMsg;\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 code?: number;\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", "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';\nimport { SHARED_IDS_BYTES } from './wasi-files.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(SHARED_IDS_BYTES));\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", "const MAX_HOPS = 40;\n\ninterface Walk {\n done: string[];\n todo: string[];\n hops: number;\n}\n\nfunction start(path: string): Walk {\n return { done: [], todo: path.split('/').filter((p) => p !== ''), hops: 0 };\n}\n\nfunction next(walk: Walk): string | undefined {\n while (walk.todo.length > 0) {\n const part = walk.todo.shift() as string;\n if (part === '.') continue;\n if (part === '..') {\n walk.done.pop();\n continue;\n }\n return part;\n }\n return undefined;\n}\n\nfunction lexical(path: string): string {\n const walk = start(path);\n for (let part = next(walk); part !== undefined; part = next(walk)) walk.done.push(part);\n return `/${walk.done.join('/')}`;\n}\n\nfunction rest(walk: Walk, part: string): string {\n return lexical(`/${[...walk.done, part, ...walk.todo].join('/')}`);\n}\n\nfunction follow(walk: Walk, target: string): boolean {\n if (++walk.hops > MAX_HOPS) return false;\n if (target.startsWith('/')) walk.done.length = 0;\n walk.todo = [...target.split('/').filter((p) => p !== ''), ...walk.todo];\n return true;\n}\n\nexport interface LinkReader {\n lstat(path: string): { isSymbolicLink?: boolean };\n readlink(path: string): string;\n}\n\nexport function physicalPath(fs: LinkReader, path: string): string {\n const walk = start(path);\n for (let part = next(walk); part !== undefined; part = next(walk)) {\n const at = `/${[...walk.done, part].join('/')}`;\n let target: string | undefined;\n try {\n target = fs.lstat(at).isSymbolicLink ? fs.readlink(at) : undefined;\n } catch {\n return rest(walk, part);\n }\n if (target === undefined) walk.done.push(part);\n else if (!follow(walk, target)) {\n throw Object.assign(new Error('too many levels of symbolic links'), { code: 'ELOOP' });\n }\n }\n return `/${walk.done.join('/')}`;\n}\n\nexport interface AsyncLinkReader {\n lstat(path: string): Promise<{ isSymbolicLink?: boolean }>;\n readlink(path: string): Promise<string>;\n}\n\nexport async function physicalPathAsync(fs: AsyncLinkReader, path: string): Promise<string> {\n const walk = start(path);\n for (let part = next(walk); part !== undefined; part = next(walk)) {\n const at = `/${[...walk.done, part].join('/')}`;\n let target: string | undefined;\n try {\n target = (await fs.lstat(at)).isSymbolicLink ? await fs.readlink(at) : undefined;\n } catch {\n return rest(walk, part);\n }\n if (target === undefined) walk.done.push(part);\n else if (!follow(walk, target)) return lexical(path);\n }\n return `/${walk.done.join('/')}`;\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_CLOCK_OFFSET = SAB_HEADER_I32 * 4;\nexport const SAB_CLOCK_I64 = 3;\nexport const SAB_HEADER_BYTES = SAB_CLOCK_OFFSET + SAB_CLOCK_I64 * 8;\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_I_MEMORY = 10;\n\nexport const SAB_I_TOTAL_HI = 11;\n\nexport const SAB_I_OFFSET_HI = 12;\n\nexport const SAB_I_KILLED = 13;\n\nexport const SAB_I_ASYNC = 14;\n\nexport const SAB_I_STOP = 15;\n\nconst U32 = 2 ** 32;\n\nexport function storeU53(header: Int32Array, lo: number, hi: number, value: number): void {\n Atomics.store(header, hi, Math.floor(value / U32));\n Atomics.store(header, lo, (value % U32) | 0);\n}\n\nexport function loadU53(header: Int32Array, lo: number, hi: number): number {\n return (Atomics.load(header, lo) >>> 0) + Atomics.load(header, hi) * U32;\n}\n\nexport function publishMemory(sab: SharedArrayBuffer, bytes: number): void {\n if (bytes > 0)\n Atomics.store(new Int32Array(sab, 0, SAB_HEADER_I32), SAB_I_MEMORY, Math.ceil(bytes / 65536));\n}\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]+$|^EAI_[A-Z]+$/.test(parsed.errno)\n ? parsed.errno\n : '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 { SAB_CLOCK_I64, SAB_CLOCK_OFFSET } from '../realm/sync-sab-wire.ts';\n\nexport const IDLE_OPS: ReadonlySet<string> = new Set([\n 'fd-select',\n 'proc-wait',\n 'proc-exec',\n 'sig-pause',\n 'sock-accept',\n 'sock-connect',\n]);\n\nexport const SYS_CAP_US = 20_000;\n\nconst LOCAL = SAB_CLOCK_OFFSET;\nconst BLOCKED = 0;\nconst IDLE = 1;\n\nexport function epochMicros(): number {\n return Math.floor((performance.timeOrigin + performance.now()) * 1000);\n}\n\nfunction slots(sab: SharedArrayBuffer): BigInt64Array {\n return new BigInt64Array(sab, LOCAL, SAB_CLOCK_I64);\n}\n\nlet local: BigInt64Array | undefined;\nlet localSab: SharedArrayBuffer | undefined;\nlet localStart = 0;\n\nexport const rawWait: (\n typed: Int32Array,\n index: number,\n value: number,\n timeout?: number\n) => 'ok' | 'not-equal' | 'timed-out' = Atomics.wait.bind(Atomics);\n\nexport function useLocalClock(sab: SharedArrayBuffer | undefined): void {\n local = sab && sab.byteLength >= LOCAL + SAB_CLOCK_I64 * 8 ? slots(sab) : undefined;\n if (!local) return;\n localSab = sab;\n localStart = epochMicros();\n const wait = (typed: Int32Array, index: number, value: number, timeout?: number) =>\n localWait(() => rawWait(typed, index, value, timeout));\n (Atomics as unknown as { wait: typeof wait }).wait = wait;\n}\n\nexport function localWait<T>(wait: () => T): T {\n const clock = local;\n if (!clock) return wait();\n const start = BigInt(epochMicros());\n const idle = Atomics.load(clock, IDLE);\n Atomics.store(clock, IDLE, idle - start);\n try {\n return wait();\n } finally {\n const end = BigInt(epochMicros());\n Atomics.store(clock, IDLE, idle + (end > start ? end - start : 0n));\n }\n}\n\nexport function localCpuNanos(): bigint | undefined {\n if (!local || !localSab) return undefined;\n const now = epochMicros();\n const blocked = Number(Atomics.load(local, BLOCKED)) + localIdle(localSab, now).idle;\n return BigInt(Math.max(0, now - localStart - blocked)) * 1000n;\n}\n\nexport function localIdle(sab: SharedArrayBuffer, now: number): { idle: number; waiting: boolean } {\n const state = Number(Atomics.load(slots(sab), IDLE));\n if (state >= 0) return { idle: state, waiting: false };\n return { idle: Math.max(0, now + state), waiting: true };\n}\n\nexport interface CpuTimes {\n utime: number;\n stime: number;\n}\n\nexport class CpuClock {\n private readonly start: number;\n private sys = 0;\n private idle = 0;\n private since = 0;\n private kind: 'sys' | 'idle' = 'sys';\n private stopped = false;\n private last: CpuTimes = { utime: 0, stime: 0 };\n private readonly sab: SharedArrayBuffer;\n private readonly now: () => number;\n\n constructor(sab: SharedArrayBuffer, now: () => number = epochMicros) {\n this.sab = sab;\n this.now = now;\n this.start = now();\n }\n\n enter(op: string): void {\n this.since = this.now();\n this.kind = this.stopped || IDLE_OPS.has(op) ? 'idle' : 'sys';\n }\n\n leave(): void {\n if (this.since === 0) return;\n this.add((this.frozen ?? this.now()) - this.since);\n this.since = 0;\n }\n\n stop(stopped: boolean): void {\n if (stopped === this.stopped) return;\n this.stopped = stopped;\n if (this.since === 0 || !stopped || this.frozen !== undefined) return;\n const now = this.now();\n this.add(now - this.since);\n this.since = now;\n this.kind = 'idle';\n }\n\n private frozen: number | undefined;\n\n freeze(): void {\n this.frozen ??= this.now();\n }\n\n running(): boolean {\n if (this.frozen !== undefined) return false;\n const now = this.now();\n const busy = this.since === 0 || (this.kind === 'sys' && now - this.since < SYS_CAP_US);\n return busy && !localIdle(this.sab, now).waiting;\n }\n\n times(): CpuTimes {\n const now = this.frozen ?? this.now();\n const open = this.since === 0 ? 0 : Math.max(0, now - this.since);\n const busy = this.kind === 'sys' ? Math.min(open, SYS_CAP_US) : 0;\n const sys = this.sys + busy;\n const idle = this.idle + (open - busy) + localIdle(this.sab, now).idle;\n const user = Math.max(0, now - this.start - sys - idle);\n this.last = {\n utime: Math.max(this.last.utime, Math.floor(user / 1000)),\n stime: Math.max(this.last.stime, Math.floor(sys / 1000)),\n };\n return this.last;\n }\n\n private add(micros: number): void {\n const spent = Math.max(0, micros);\n const busy = this.kind === 'sys' ? Math.min(spent, SYS_CAP_US) : 0;\n this.sys += busy;\n this.idle += spent - busy;\n Atomics.store(slots(this.sab), BLOCKED, BigInt(this.idle));\n }\n}\n\nexport class ProcessClocks {\n private readonly main: CpuClock;\n private readonly threads = new Map<number, CpuClock>();\n private readonly ended: CpuTimes = { utime: 0, stime: 0 };\n private readonly enabled: boolean;\n\n constructor(\n sab: SharedArrayBuffer,\n enabled = true,\n states?: { onState(listener: (state: string) => void): void }\n ) {\n this.main = new CpuClock(sab);\n this.enabled = enabled;\n states?.onState((state) => this.stop(state === 'stopped'));\n }\n\n thread(tid: number, sab: SharedArrayBuffer): CpuClock {\n const clock = new CpuClock(sab);\n this.threads.set(tid, clock);\n return clock;\n }\n\n threadEnded(tid: number): void {\n const spent = this.threads.get(tid)?.times();\n this.threads.delete(tid);\n if (!spent) return;\n this.ended.utime += spent.utime;\n this.ended.stime += spent.stime;\n }\n\n stop(stopped: boolean): void {\n for (const c of this.all()) c.stop(stopped);\n }\n\n freeze(): void {\n for (const c of this.all()) c.freeze();\n }\n\n times(): CpuTimes | undefined {\n if (!this.enabled) return undefined;\n const sum = { ...this.ended };\n for (const c of this.all()) {\n const t = c.times();\n sum.utime += t.utime;\n sum.stime += t.stime;\n }\n return sum;\n }\n\n running(): number {\n return this.enabled ? this.all().filter((c) => c.running()).length : 0;\n }\n\n timed<R extends { op: string }, T>(\n clock: CpuClock | undefined,\n dispatch: (req: R) => Promise<T>\n ) {\n const c = clock ?? this.main;\n return (req: R): Promise<T> => {\n c.enter(req.op);\n return dispatch(req).finally(() => c.leave());\n };\n }\n\n private all(): CpuClock[] {\n return [this.main, ...this.threads.values()];\n }\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 nlink?: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n linkable?: boolean;\n version?: string;\n uid?: number;\n gid?: number;\n}\n\nexport type UsersMode = 'off' | 'report' | 'enforce';\n\nexport const DEFAULT_USERS: UsersMode = 'enforce';\n\nexport interface Owner {\n uid: number;\n gid: number;\n}\n\nexport interface Perm {\n uid: number;\n gid: number;\n mode?: number;\n link?: string;\n}\n\nexport interface NewOwner extends Owner {\n mode?: number;\n parents?: number;\n}\n\nexport interface OwnerChange {\n uid?: number;\n gid?: number;\n follow?: boolean;\n kind?: 'chown' | 'adopt' | 'new';\n mode?: number;\n}\n\nexport interface HeldEntry {\n writeFile: KernelFs['writeFile'];\n direct: boolean;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n exclusive?<T>(path: string, run: (held: HeldEntry) => Promise<T>, follow?: boolean): Promise<T>;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string, owner?: NewOwner): 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; owner?: NewOwner }): Promise<void>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n link(from: string, to: string, follow?: boolean): Promise<void>;\n links?(path: string): boolean;\n symlink(target: string, path: string, owner?: NewOwner): Promise<void>;\n readlink(path: string): Promise<string>;\n realpath?(path: string, follow: boolean): Promise<string>;\n createExclusive?(path: string, owner?: NewOwner): Promise<void>;\n chown?(path: string, change: OwnerChange): Promise<void>;\n trackOwners?(): void;\n ancestry?(path: string): Promise<Array<Perm | undefined>>;\n hasOwner?(path: string): Promise<boolean>;\n chmod(path: string, mode: number): Promise<void>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n lutimes?(path: string, atime: Date, mtime: Date): Promise<void>;\n pread?(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate?(path: string, size: number): Promise<void>;\n protect?(prefixes: readonly string[]): void;\n unguarded?(): KernelFs;\n mayChange?(path: string, follow: boolean): Promise<void>;\n}\n\nexport type RangedOps = Required<Pick<KernelFs, 'pread' | 'pwrite' | 'truncate'>>;\n\nexport function rangedOps(fs: Partial<RangedOps>): RangedOps | undefined {\n const { pread, pwrite, truncate } = fs;\n if (!pread || !pwrite || !truncate) return undefined;\n return { pread: pread.bind(fs), pwrite: pwrite.bind(fs), truncate: truncate.bind(fs) };\n}\n\nexport async function lutimesOf(\n fs: KernelFs,\n path: string,\n atime: Date,\n mtime: Date\n): Promise<void> {\n if (fs.lutimes) return fs.lutimes(path, atime, mtime);\n if ((await fs.lstat(path)).isSymbolicLink) throw fsError('EOPNOTSUPP', path);\n return fs.utimes(path, atime, mtime);\n}\n\nexport function mayLink(fs: { links?(path: string): boolean }, path: string): boolean {\n return fs.links?.(path) ?? true;\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 { fsError } from '../fs/types.ts';\n\nexport interface Cred {\n ruid: number;\n euid: number;\n suid: number;\n rgid: number;\n egid: number;\n sgid: number;\n groups: number[];\n}\n\nexport type CredChange = Partial<Cred>;\n\nexport const ROOT: Readonly<Cred> = Object.freeze({\n ruid: 0,\n euid: 0,\n suid: 0,\n rgid: 0,\n egid: 0,\n sgid: 0,\n groups: [0],\n});\n\nconst MAX_ID = 0xfffffffe;\nexport const MAX_GROUPS = 65536;\nconst UIDS = ['ruid', 'euid', 'suid'] as const;\nconst GIDS = ['rgid', 'egid', 'sgid'] as const;\n\nexport function userCred(uid: number, gid: number, groups: number[] = [gid]): Cred {\n return { ruid: uid, euid: uid, suid: uid, rgid: gid, egid: gid, sgid: gid, groups: [...groups] };\n}\n\nexport function copyCred(cred: Readonly<Cred>): Cred {\n return { ...cred, groups: [...cred.groups] };\n}\n\nfunction id(value: unknown): number | undefined {\n if (value === undefined || value === -1 || value === 0xffffffff) return undefined;\n if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > MAX_ID) {\n throw fsError('EINVAL', `not a user or group id: ${String(value)}`);\n }\n return value as number;\n}\n\nexport function changeCred(cur: Readonly<Cred>, change: CredChange): Cred {\n const privileged = cur.euid === 0;\n const next = copyCred(cur);\n for (const keys of [UIDS, GIDS]) {\n const own = keys.map((key) => cur[key]);\n for (const key of keys) {\n const value = id(change[key]);\n if (value === undefined) continue;\n if (!privileged && !own.includes(value)) throw fsError('EPERM', `${key} ${value}`);\n next[key] = value;\n }\n }\n if (change.groups !== undefined) {\n if (!Array.isArray(change.groups) || change.groups.length > MAX_GROUPS) {\n throw fsError('EINVAL', 'not a group list');\n }\n const groups = change.groups.map((g) => id(g) ?? Number.NaN);\n if (groups.some(Number.isNaN)) throw fsError('EINVAL', 'not a group list');\n if (!privileged) throw fsError('EPERM', 'setgroups');\n next.groups = groups;\n }\n return next;\n}\n\nexport function maySignal(sender: Readonly<Cred>, target: Readonly<Cred>): boolean {\n if (sender.euid === 0) return true;\n return [sender.ruid, sender.euid].some((uid) => uid === target.ruid || uid === target.suid);\n}\n\nexport function maySee(viewer: Readonly<Cred>, target: Readonly<Cred>): boolean {\n return viewer.euid === 0 || target.ruid === viewer.euid || target.euid === viewer.euid;\n}\n", "export const PIPE_CAPACITY = 64 * 1024;\n\nexport class PipeError extends Error {\n readonly code: 'EPIPE' | 'EINTR';\n\n constructor(code: 'EPIPE' | 'EINTR') {\n super(code);\n this.code = code;\n }\n}\n\nexport class KernelPipe {\n private chunks: Uint8Array[] = [];\n private size = 0;\n private readers = 0;\n private writers = 0;\n private waiters: Array<() => void> = [];\n\n readonly capacity: number;\n\n constructor(capacity: number = PIPE_CAPACITY) {\n this.capacity = capacity;\n }\n\n get buffered(): number {\n return this.size;\n }\n\n get readReady(): boolean {\n return this.size > 0 || this.writers === 0;\n }\n\n get writeReady(): boolean {\n return this.size < this.capacity || this.readers === 0;\n }\n\n get writersGone(): boolean {\n return this.writers === 0;\n }\n\n get readersGone(): boolean {\n return this.readers === 0;\n }\n\n openRead(): void {\n this.readers += 1;\n }\n\n openWrite(): void {\n this.writers += 1;\n }\n\n closeRead(): void {\n if (this.readers > 0) this.readers -= 1;\n if (this.readers === 0) {\n this.chunks = [];\n this.size = 0;\n }\n this.wake();\n }\n\n closeWrite(): void {\n if (this.writers > 0) this.writers -= 1;\n this.wake();\n }\n\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = this.take(Math.min(max, this.size));\n this.wake();\n return out;\n }\n\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = new Uint8Array(Math.min(max, this.size));\n let filled = 0;\n for (const chunk of this.chunks) {\n if (filled === out.length) break;\n const count = Math.min(chunk.length, out.length - filled);\n out.set(chunk.subarray(0, count), filled);\n filled += count;\n }\n return out;\n }\n\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n let offset = 0;\n while (offset < bytes.length) {\n if (this.readers === 0) throw new PipeError('EPIPE');\n const room = this.capacity - this.size;\n if (room === 0) {\n try {\n await this.changed(signal);\n } catch (e) {\n if (offset > 0) return offset;\n throw e;\n }\n continue;\n }\n const n = Math.min(room, bytes.length - offset);\n this.chunks.push(bytes.slice(offset, offset + n));\n this.size += n;\n offset += n;\n this.wake();\n }\n return bytes.length;\n }\n\n private take(n: number): Uint8Array {\n const out = new Uint8Array(n);\n let filled = 0;\n while (filled < n) {\n const head = this.chunks[0];\n const count = Math.min(head.length, n - filled);\n out.set(head.subarray(0, count), filled);\n filled += count;\n if (count === head.length) this.chunks.shift();\n else this.chunks[0] = head.subarray(count);\n }\n this.size -= n;\n return out;\n }\n\n changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new PipeError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new PipeError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import type { ClipboardChannel } from './clipboard.ts';\nimport { KernelPipe, type PipeError } from './pipe.ts';\nimport type { PtyPair } from './pty.ts';\nimport type { SealedChannel } from './sealed.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport type KernelErrno =\n | 'EBADF'\n | 'EPIPE'\n | 'EMFILE'\n | 'EINVAL'\n | 'ENOENT'\n | 'ENOTDIR'\n | 'ENOEXEC'\n | 'ECHILD'\n | 'ENOSYS'\n | 'ESPIPE'\n | 'ENOSPC'\n | 'EINTR'\n | 'ESRCH'\n | 'ENOTTY'\n | 'ENXIO'\n | 'EPERM'\n | 'EIO'\n | 'EACCES'\n | 'EAGAIN'\n | 'ENOTSOCK'\n | 'EAFNOSUPPORT'\n | 'EPROTONOSUPPORT'\n | 'EOPNOTSUPP'\n | 'EADDRINUSE'\n | 'EADDRNOTAVAIL'\n | 'ENETUNREACH'\n | 'ECONNREFUSED'\n | 'EINPROGRESS'\n | 'EISCONN'\n | 'ENOTCONN'\n | 'EROFS'\n | 'EFBIG'\n | 'EALREADY'\n | 'ETIMEDOUT'\n | 'ECONNABORTED'\n | 'EHOSTUNREACH'\n | 'ECONNRESET'\n | 'EMSGSIZE'\n | 'ENOTSUP'\n | 'EILSEQ';\n\nexport class KernelError extends Error {\n readonly code: KernelErrno;\n\n readonly detail?: string;\n\n constructor(code: KernelErrno, detail?: string) {\n super(code);\n this.code = code;\n if (detail !== undefined) this.detail = detail;\n }\n}\n\nexport interface PollState {\n readable: boolean;\n\n writable: boolean;\n\n hangup: boolean;\n}\n\nexport interface KernelFile {\n read?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n peek?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n write?(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;\n\n close(): void | Promise<void>;\n\n poll?(): PollState;\n\n changed?(signal?: AbortSignal): Promise<void>;\n\n seek?(offset: number, whence: number): Promise<number>;\n\n flush?(): Promise<void>;\n\n pread?(max: number, at: number): Promise<Uint8Array>;\n pwrite?(bytes: Uint8Array, at: number): Promise<number>;\n\n resize?(size: number): Promise<void>;\n\n stat?(): Promise<{ path: string; size: number; orphan?: true }>;\n\n known?(): number | undefined;\n\n tty?: KernelTty;\n\n pty?: PtyPair;\n\n sealed?: SealedChannel;\n\n clipboard?: ClipboardChannel;\n\n stat?(): Promise<{ size: number; path: string; orphan?: true }>;\n held?: true;\n\n heldMeta?: HeldMeta;\n}\n\nexport type HeldMeta = { dir: string; preopen?: string; twin?: number } | DeviceMeta;\n\nexport interface DeviceMeta {\n device: KernelDevice;\n access?: DeviceAccess;\n}\n\nexport type DeviceAccess = 'read' | 'write';\n\nexport type KernelDevice = 'null' | 'zero' | 'full' | 'urandom';\n\nexport function pollFile(file: KernelFile): PollState {\n return file.poll?.() ?? { readable: !!file.read, writable: !!file.write, hangup: false };\n}\n\nexport class OpenFile {\n private refs = 1;\n\n readonly file: KernelFile;\n\n constructor(file: KernelFile) {\n this.file = file;\n }\n\n retain(): this {\n this.refs += 1;\n return this;\n }\n\n release(): void | Promise<void> {\n this.refs -= 1;\n if (this.refs === 0) return this.file.close();\n }\n}\n\nexport function openPipe(capacity?: number): { read: OpenFile; write: OpenFile } {\n const pipe = new KernelPipe(capacity);\n pipe.openRead();\n pipe.openWrite();\n return {\n read: new OpenFile({\n read: async (max, signal) => {\n try {\n return await pipe.read(max, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeRead(),\n poll: () => ({ readable: pipe.readReady, writable: false, hangup: pipe.writersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n write: new OpenFile({\n write: async (bytes, signal) => {\n try {\n return await pipe.write(bytes, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeWrite(),\n poll: () => ({ readable: false, writable: pipe.writeReady, hangup: pipe.readersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n };\n}\n\nexport function bytesSource(data: Uint8Array): OpenFile {\n let offset = 0;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n close: () => {},\n });\n}\n\nexport function memoryFile(data: Uint8Array, path: string, position = 0): OpenFile {\n let offset = position;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n pread: async (max, at) => data.subarray(at, at + max),\n seek: async (by, whence) => {\n const at = (whence === 1 ? offset : whence === 2 ? data.length : 0) + by;\n if (at < 0) throw new KernelError('EINVAL');\n offset = at;\n return at;\n },\n pwrite: async () => {\n throw new KernelError('EBADF');\n },\n resize: async () => {\n throw new KernelError('EBADF');\n },\n stat: async () => ({ path, size: data.length }),\n close: () => {},\n });\n}\n\nexport function sinkFile(onData: (bytes: Uint8Array) => void): OpenFile {\n return new OpenFile({\n write: async (bytes) => {\n onData(bytes.slice());\n return bytes.length;\n },\n close: () => {},\n });\n}\n\nexport function nullFile(): OpenFile {\n return new OpenFile({\n read: async () => new Uint8Array(0),\n write: async (bytes) => bytes.length,\n close: () => {},\n });\n}\n\nfunction written(device: KernelDevice, bytes: Uint8Array): number {\n if (device === 'full' && bytes.length > 0) throw new KernelError('ENOSPC');\n return bytes.length;\n}\n\nconst DEVICE_PATHS: ReadonlyMap<string, KernelDevice> = new Map([\n ['/dev/null', 'null'],\n ['/dev/zero', 'zero'],\n ['/dev/full', 'full'],\n ['/dev/urandom', 'urandom'],\n ['/dev/random', 'urandom'],\n]);\n\nexport function deviceAt(path: string): KernelDevice | undefined {\n return DEVICE_PATHS.get(path);\n}\n\nexport function deviceFile(device: KernelDevice, access?: DeviceAccess): OpenFile {\n const read = async (max: number): Promise<Uint8Array> => {\n if (device === 'null') return new Uint8Array(0);\n const out = new Uint8Array(max);\n if (device === 'urandom') {\n for (let at = 0; at < max; at += 65536) {\n crypto.getRandomValues(out.subarray(at, Math.min(max, at + 65536)));\n }\n }\n return out;\n };\n return new OpenFile({\n ...(access !== 'write' ? { read } : {}),\n ...(access !== 'read' ? { write: async (bytes: Uint8Array) => written(device, bytes) } : {}),\n seek: async () => 0,\n heldMeta: { device, ...(access ? { access } : {}) },\n close: () => {},\n });\n}\n\nexport function heldFile(meta?: HeldMeta): OpenFile {\n return new OpenFile({ held: true, ...(meta ? { heldMeta: meta } : {}), close: () => {} });\n}\n\nexport type KernelFdKind =\n | 'tty'\n | 'stream'\n | 'file'\n | 'socket'\n | 'held'\n | 'device'\n | 'sealed'\n | 'clipboard';\n\nexport function kernelFdKind(file: KernelFile): Exclude<KernelFdKind, 'socket'> {\n if (file.held) return 'held';\n if (file.heldMeta && 'device' in file.heldMeta) return 'device';\n if (file.tty) return 'tty';\n if (file.sealed) return 'sealed';\n if (file.clipboard) return 'clipboard';\n return file.seek ? 'file' : 'stream';\n}\n\nexport class FdTable {\n static readonly MAX_FDS = 1024;\n private fds = new Map<number, OpenFile>();\n private readonly cloexec = new Set<number>();\n\n private readonly status = new Map<number, number>();\n\n get(fd: number): OpenFile {\n const file = this.fds.get(fd);\n if (!file) throw new KernelError('EBADF');\n return file;\n }\n\n stdioTerminal(): KernelTty | undefined {\n for (const fd of [0, 1, 2]) {\n const tty = this.fds.get(fd)?.file.tty;\n if (tty) return tty;\n }\n return undefined;\n }\n\n numbers(): number[] {\n return [...this.fds.keys()].sort((a, b) => a - b);\n }\n\n has(fd: number): boolean {\n return this.fds.has(fd);\n }\n\n setCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.add(fd);\n }\n\n clearCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.delete(fd);\n }\n\n closesOnExec(fd: number): boolean {\n return this.cloexec.has(fd);\n }\n\n setStatusFlags(fd: number, flags: number): void {\n this.get(fd);\n this.status.set(fd, flags);\n }\n\n statusFlags(fd: number): number | undefined {\n return this.status.get(fd);\n }\n\n install(file: OpenFile, min = 0): number {\n for (let fd = min; fd < FdTable.MAX_FDS; fd++) {\n if (!this.fds.has(fd)) {\n this.fds.set(fd, file);\n return fd;\n }\n }\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EMFILE');\n }\n\n installAt(fd: number, file: OpenFile): void {\n if (fd < 0 || fd >= FdTable.MAX_FDS) {\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EBADF');\n }\n const previous = this.fds.get(fd);\n this.fds.set(fd, file);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n void Promise.resolve(previous?.release()).catch(() => undefined);\n }\n\n dup(fd: number, min = 0): number {\n return this.install(this.get(fd).retain(), min);\n }\n\n dup2(oldFd: number, newFd: number): number {\n const file = this.get(oldFd);\n if (oldFd !== newFd) this.installAt(newFd, file.retain());\n return newFd;\n }\n\n close(fd: number): void | Promise<void> {\n const file = this.get(fd);\n this.fds.delete(fd);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n return file.release();\n }\n\n fork(): FdTable {\n const child = new FdTable();\n for (const [fd, file] of this.fds) child.fds.set(fd, file.retain());\n for (const fd of this.cloexec) child.cloexec.add(fd);\n for (const [fd, flags] of this.status) child.status.set(fd, flags);\n return child;\n }\n\n async closeAll(): Promise<void> {\n const files = [...this.fds.values()];\n this.fds.clear();\n this.cloexec.clear();\n this.status.clear();\n await Promise.allSettled(files.map((file) => Promise.resolve().then(() => file.release())));\n }\n}\n", "export const SYNC_FS_OPS = [\n 'read',\n 'write',\n 'exists',\n 'stat',\n 'lstat',\n 'readdir',\n 'readdir-stat',\n 'mkdir',\n 'rm',\n 'rename',\n 'link',\n 'unlink',\n 'rmdir',\n 'symlink',\n 'readlink',\n 'chmod',\n 'utimes',\n 'lutimes',\n 'statfs',\n 'hold',\n 'create',\n 'kept',\n 'pread',\n 'pwrite',\n 'truncate',\n 'chown',\n 'lchown',\n 'access',\n] as const;\n\nexport type AccessKind = 'open' | 'access' | 'eaccess';\n\nexport const HOLD_READ = 4;\nexport const HOLD_WRITE = 8;\nexport const HOLD_CREATED = 16;\n\nexport type SyncFsOp = (typeof SYNC_FS_OPS)[number];\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 offset?: number;\n length?: number;\n version?: string;\n handle?: number;\n uid?: number;\n gid?: number;\n exclusive?: boolean;\n identity?: boolean;\n now?: boolean;\n nofollow?: boolean;\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 nlink?: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n linkable?: boolean;\n version?: string;\n uid?: number;\n gid?: number;\n}\n\nexport interface SyncFsUsage {\n quota: number;\n usage: number;\n}\n\nexport function parseSyncFsUsage(json: unknown): SyncFsUsage | null {\n const u = json as Partial<SyncFsUsage> | null;\n if (!u || typeof u.quota !== 'number' || typeof u.usage !== 'number') return null;\n return { quota: u.quota, usage: u.usage };\n}\n\nexport type SyncFsFileIo = Pick<\n SyncFsPosixBridge,\n 'readFile' | 'writeFile' | 'pread' | 'pwrite' | 'truncate'\n>;\n\nexport interface SyncFsPosixBridge {\n pinned?(handle: number): SyncFsFileIo;\n kept?(handle: number): boolean;\n keptStat?(handle: number): SyncFsBridgeStat;\n readFile(path: string): Uint8Array;\n writeFile(path: string, bytes: Uint8Array, open?: boolean): 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, mode?: number): void;\n rm(path: string): void;\n rename(from: string, to: string): void;\n link(from: string, to: string, follow?: boolean): 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, now?: boolean): void;\n lutimes(path: string, atimeMs: number, mtimeMs: number, now?: boolean): void;\n hold?(\n path: string,\n held: boolean,\n open?: boolean,\n handle?: number,\n want?: number\n ): number | undefined;\n access?(path: string, mode: number, kind?: AccessKind, nofollow?: boolean): void;\n create?(path: string, mode?: number): void;\n chown?(path: string, uid: number | undefined, gid: number | undefined, follow?: boolean): void;\n owners?: boolean;\n readdirStat(path: string): Array<[string, SyncFsBridgeStat | null]>;\n statfs?(path?: string): SyncFsUsage | null;\n pread?(path: string, offset: number, length: number, version?: string): Uint8Array;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): void;\n truncate?(path: string, size: number): void;\n identify?(): void;\n identified?(): 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 ...(typeof s.nlink === 'number' ? { nlink: s.nlink } : {}),\n ...(typeof s.dev === 'number' ? { dev: s.dev } : {}),\n ...(s.readonly === true ? { readonly: true } : {}),\n ...(typeof s.maxFile === 'number' ? { maxFile: s.maxFile } : {}),\n ...(s.ranged === true ? { ranged: true } : {}),\n ...(s.linkable === true ? { linkable: true } : {}),\n ...(typeof s.version === 'string' ? { version: s.version } : {}),\n ...(typeof s.uid === 'number' ? { uid: s.uid } : {}),\n ...(typeof s.gid === 'number' ? { gid: s.gid } : {}),\n };\n}\n", "import {\n type DeviceAccess,\n type DeviceMeta,\n deviceAt,\n type HeldMeta,\n type KernelFdKind,\n} from '../../kernel/fd-table.ts';\nimport type { FdInfo, WasmSyscall } from '../../kernel/process.ts';\nimport {\n HOLD_CREATED,\n HOLD_READ,\n HOLD_WRITE,\n type SyncFsBridgeStat,\n type SyncFsPosixBridge,\n} 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 physical,\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' | 'full' | '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; twin?: number }\n | { fd: number; type: 'device'; device: Device; access?: DeviceAccess };\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 const SEALED_PATH = '/dev/sealed';\nexport const CLIPBOARD_PATH = '/dev/clipboard';\n\nexport function deviceOf(path: string): Device | undefined {\n return deviceAt(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 reported = new WeakSet<FileBuffer>();\n\n private readonly byId = new Map<string, FileBuffer>();\n\n private readonly ids = new Map<FileBuffer, string>();\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 root = false\n ): void {\n for (const fd of [0, 1, 2]) this.table.set(fd, this.stdioEntry(fd));\n const preopens = this.preopens(cwd, root);\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, root: boolean): WasiEntry[] {\n const here = normalize(cwd);\n const dot: Extract<WasiEntry, { type: 'dir' }> = { type: 'dir', path: here, preopen: '.' };\n const out: WasiEntry[] = [dot];\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 if (root) {\n out.push(\n { type: 'dir', path: '/', preopen: '/' },\n { type: 'dir', path: here, preopen: './' }\n );\n dot.twin = 3 + out.length - 1;\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.fs as { threaded?(): void }).threaded?.();\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 stdioEntry(fd: number): WasiEntry {\n let info: FdInfo;\n try {\n info = this.kernel.call({ op: 'fd-info', fd }) as FdInfo;\n } catch {\n return kernelEntry();\n }\n return info?.meta && 'dir' in info.meta ? { type: 'dir', path: info.meta.dir } : kernelEntry();\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 const moved: Array<[number, Extract<WasiEntry, { type: 'dir' }>]> = [[3, dot]];\n const twin = dot.twin === undefined ? undefined : this.find(dot.twin);\n if (twin?.type === 'dir' && twin.preopen === './') moved.push([dot.twin as number, twin]);\n for (const [fd, e] of moved) {\n e.path = path;\n this.kernel.call({ op: 'fd-meta', fd, meta: metaOf(e) as HeldMeta });\n }\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, {\n type: 'kernel',\n kind: 'file',\n nonblock: false,\n append: e.file.append,\n path: e.file.path,\n ino: this.inoOf(e.file.path),\n });\n }\n for (const file of promoted.keys()) {\n if (--file.buffer.opens <= 0) {\n this.forget(file.buffer);\n this.letGo(file.buffer);\n }\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') out.push({ fd, type: 'dir', path: e.path, ...preopenOf(e) });\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, { type: 'dir', path: f.path, ...preopenOf(f) });\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 try {\n this.kernel.sys.close(fd);\n } finally {\n this.release(e);\n this.bump();\n }\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 try {\n buffer.flush();\n } catch (err) {\n this.reported.add(buffer);\n this.drop(buffer);\n throw err;\n }\n this.drop(buffer);\n }\n\n private drop(buffer: FileBuffer): void {\n if (--buffer.opens > 0) return;\n this.forget(buffer);\n this.letGo(buffer);\n }\n\n private forget(buffer: FileBuffer): void {\n for (const [p, b] of [...this.buffers]) if (b === buffer) this.buffers.delete(p);\n const id = this.ids.get(buffer);\n if (id !== undefined && this.byId.get(id) === buffer) this.byId.delete(id);\n this.ids.delete(buffer);\n }\n\n private know(buffer: FileBuffer, id: string): void {\n if (this.ids.has(buffer)) return;\n this.ids.set(buffer, id);\n if (!this.byId.has(id)) this.byId.set(id, buffer);\n }\n\n private identity(st: SyncFsBridgeStat | undefined): string | undefined {\n if (!st || st.ino === undefined || (st.nlink ?? 1) < 2) return undefined;\n return `${st.dev ?? 0}:${st.ino}`;\n }\n\n private sharing(path: string, st: SyncFsBridgeStat | undefined): FileBuffer | undefined {\n if (st?.ino === undefined) return undefined;\n const id = `${st.dev ?? 0}:${st.ino}`;\n if (!this.byId.has(id) && this.identity(st) !== undefined) this.learn();\n const buffer = this.byId.get(id);\n if (!buffer) return undefined;\n this.buffers.set(path, buffer);\n return buffer;\n }\n\n private learn(): void {\n for (const [p, buffer] of this.buffers) {\n if (this.ids.has(buffer) || buffer.isOrphan()) continue;\n const known = this.identity(this.statOrMissing(p));\n if (known !== undefined) this.know(buffer, known);\n }\n }\n\n linked(from: string, to: string): void {\n const buffer = this.buffers.get(from);\n if (!buffer || buffer.isOrphan()) return;\n const id = this.identity(this.statOrMissing(to));\n if (id === undefined) return;\n this.know(buffer, id);\n if (!this.buffers.has(to)) this.buffers.set(to, buffer);\n }\n\n private letGo(buffer: FileBuffer): void {\n this.fs.hold?.(buffer.path, false, true, buffer.handle);\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()) {\n try {\n buffer.flush();\n } catch (err) {\n if (!this.reported.has(buffer)) throw err;\n }\n }\n }\n\n flushEarly(): void {\n for (const buffer of this.buffers.values()) {\n try {\n buffer.flush();\n } catch {}\n }\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 holdsUnder(path: string): boolean {\n for (const p of this.buffers.keys()) if (within(p, path)) return true;\n return false;\n }\n\n unlinking(path: string, linked?: SyncFsBridgeStat): void {\n const buffer = this.buffers.get(path);\n if (buffer && this.survives(buffer, linked)) buffer.flush();\n else buffer?.keep();\n if (this.shared) this.kernel.call({ op: 'fd-path-unlinking', path });\n }\n\n unlinked(path: string, linked?: SyncFsBridgeStat): 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 this.detach(buffer, linked);\n this.buffers.delete(path);\n }\n\n private openedIno(fd: number): number | undefined {\n try {\n return (this.kernel.call({ op: 'fd-vfs-stat', fd, identity: true }) as { ino?: number }).ino;\n } catch (err) {\n this.kernel.sys.close(fd);\n throw err;\n }\n }\n\n private inoOf(path: string): number | undefined {\n try {\n return this.fs.stat(path).ino;\n } catch {\n return undefined;\n }\n }\n\n private survives(buffer: FileBuffer, linked: SyncFsBridgeStat | undefined): boolean {\n return linked !== undefined && buffer.handle !== undefined;\n }\n\n private detach(buffer: FileBuffer, linked: SyncFsBridgeStat | undefined): void {\n if (this.survives(buffer, linked)) {\n const id = this.identity(linked);\n if (id !== undefined) this.know(buffer, id);\n return;\n }\n buffer.orphan();\n this.forget(buffer);\n }\n\n renamed(from: string, to: string, replacedLinked?: SyncFsBridgeStat): void {\n if (from === to) return;\n if (this.shared) this.kernel.call({ op: 'fd-path-renamed', from, to });\n for (const e of this.table.values()) {\n if (e.type === 'kernel' && e.path !== undefined && within(e.path, from)) {\n e.path = to + e.path.slice(from.length);\n }\n }\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 this.detach(buffer, replacedLinked);\n this.buffers.delete(p);\n }\n }\n for (const [p] of moved) this.buffers.delete(p);\n for (const [p, buffer] of moved) {\n const next = to + p.slice(from.length);\n if (buffer.path === p) buffer.path = next;\n this.buffers.set(next, buffer);\n }\n }\n\n resolve(dirfd: number, path: string): string {\n if (path === '') throw new WasiError('ENOENT');\n const joined = path.startsWith('/') ? path : `${this.dir(dirfd).path}/${path}`;\n return joined.split('/').includes('..') ? physical(this.fs, joined) : normalize(joined);\n }\n\n private openKernelDevice(\n path: string,\n oflags: number,\n fdflags: number,\n rights: bigint\n ): number | undefined {\n const { openSealed, openClipboard, openTty } = this.kernel.sys;\n const nonblock = (fdflags & FDFLAGS.NONBLOCK) !== 0;\n let fd: number | undefined;\n let kind: KernelFdKind;\n if (path === SEALED_PATH && openSealed) {\n if (oflags & OFLAGS.DIRECTORY) throw new WasiError('ENOTDIR');\n if (oflags & OFLAGS.CREAT && oflags & OFLAGS.EXCL) throw new WasiError('EEXIST');\n fd = openSealed.call(this.kernel.sys);\n kind = 'sealed';\n } else if (path === CLIPBOARD_PATH && openClipboard) {\n fd = this.openClipboard(openClipboard, oflags, rights);\n kind = 'clipboard';\n } else if (path === '/dev/tty' || /^\\/dev\\/tty\\d+$/.test(path)) {\n fd = openTty?.call(this.kernel.sys, path === '/dev/tty' ? undefined : path);\n if (fd === undefined) throw new WasiError('ENXIO');\n kind = 'tty';\n } else return undefined;\n this.adopt(fd, kind, nonblock);\n this.bump();\n return fd;\n }\n\n private openClipboard(\n openClipboard: (flags: number) => number,\n oflags: number,\n rights: bigint\n ): number {\n if (oflags & OFLAGS.DIRECTORY) throw new WasiError('ENOTDIR');\n if (oflags & OFLAGS.CREAT && oflags & OFLAGS.EXCL) throw new WasiError('EEXIST');\n const want = wantOf(oflags, rights);\n const flags = want === 6 ? O_RDWR : want === 2 ? O_WRONLY : 0;\n return openClipboard.call(this.kernel.sys, flags);\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 const kernelDevice = this.openKernelDevice(path, oflags, fdflags, rights);\n if (kernelDevice !== undefined) return kernelDevice;\n const alias = stdioAlias(path);\n if (alias !== undefined) return this.reopen(alias);\n const exclusive = (oflags & OFLAGS.CREAT) !== 0 && (oflags & OFLAGS.EXCL) !== 0;\n if (exclusive && this.isLink(path)) throw new WasiError('EEXIST');\n const s = this.statOrMissing(path);\n if (exclusive && s) throw new WasiError('EEXIST');\n if (oflags & OFLAGS.DIRECTORY && !s?.isDirectory) {\n throw new WasiError(s ? 'ENOTDIR' : 'ENOENT');\n }\n if (s?.isDirectory) {\n const asked = (oflags & OFLAGS.DIRECTORY) === 0 && (rights & RIGHTS.FD_WRITE) !== 0n;\n if (asked || (oflags & (OFLAGS.CREAT | OFLAGS.TRUNC)) !== 0) throw new WasiError('EISDIR');\n return this.install({ type: 'dir', path });\n }\n if (!s && !(oflags & OFLAGS.CREAT)) throw new WasiError('ENOENT');\n refuseWrite(s, oflags, rights);\n return this.regular(path, s, oflags, rights, fdflags);\n }\n\n private regular(\n path: string,\n s: SyncFsBridgeStat | undefined,\n oflags: number,\n rights: bigint,\n fdflags: number\n ): number {\n if (this.shared || this.kernelHolds(path, s)) {\n return this.kernelFile(path, s, oflags, rights, fdflags);\n }\n return this.install({ type: 'file', file: this.file(path, s, oflags, rights, fdflags) });\n }\n\n private kernelHolds(path: string, st: SyncFsBridgeStat | undefined): boolean {\n for (const [fd, e] of this.table) {\n if (e.type !== 'kernel' || this.kind(fd, e) !== 'file') continue;\n this.named(fd, e);\n if (e.path === path || (st?.ino !== undefined && e.ino === st.ino)) return true;\n }\n return false;\n }\n\n private readonly learned = new WeakSet<object>();\n\n private named(fd: number, e: { path?: string; ino?: number }): void {\n if (e.path !== undefined || this.learned.has(e)) return;\n this.learned.add(e);\n try {\n const vfs = this.kernel.call({ op: 'fd-vfs-stat', fd, identity: true }) as {\n path?: string;\n orphan?: true;\n ino?: number;\n };\n if (vfs.orphan || vfs.path === undefined) return;\n e.path = vfs.path;\n e.ino = vfs.ino ?? this.inoOf(vfs.path);\n } catch {}\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 { readable, writable } = openAccess(existing, oflags, rights);\n let buffer = this.buffers.get(path);\n if (buffer?.handle !== undefined && this.fs.kept?.(buffer.handle)) {\n this.buffers.delete(path);\n buffer = undefined;\n }\n buffer ??= this.sharing(path, existing);\n const want = wantOf(oflags, rights);\n if (buffer) {\n if (this.fs.owners) this.fs.access?.(path, want, 'open');\n if (oflags & OFLAGS.TRUNC) buffer.truncate(0);\n } else {\n buffer = this.freshBuffer(path, existing, oflags, want);\n }\n buffer.opens++;\n return new LocalFile(buffer, readable, writable, (fdflags & FDFLAGS.APPEND) !== 0);\n }\n\n private freshBuffer(\n path: string,\n existing: SyncFsBridgeStat | undefined,\n oflags: number,\n want: number\n ): FileBuffer {\n const made = !existing && this.createNew(path, oflags);\n const empty = made || (oflags & OFLAGS.TRUNC) !== 0;\n if (existing?.ranged) (this.fs as { invalidate?(): void }).invalidate?.();\n const st = existing?.ranged || !existing ? this.fs.stat(path) : existing;\n const ranged = st.ranged ? st.size : undefined;\n const asked =\n (want & 4 ? HOLD_READ : 0) | (want & 2 ? HOLD_WRITE : 0) | (made ? HOLD_CREATED : 0);\n const handle = this.fs.hold?.(path, true, true, undefined, this.fs.owners ? asked : 0);\n const io = handle !== undefined && this.fs.pinned ? this.fs.pinned(handle) : this.fs;\n const buffer = new FileBuffer(io, path, empty, st.maxFile, ranged, st.version);\n buffer.handle = handle;\n this.buffers.set(path, buffer);\n const id = this.identity(st);\n if (id !== undefined) this.know(buffer, id);\n return buffer;\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 { readable, writable } = openAccess(existing, oflags, rights);\n const append = (fdflags & FDFLAGS.APPEND) !== 0;\n const flags = (writable ? (readable ? O_RDWR : O_WRONLY) : 0) | (append ? O_APPEND : 0);\n\n const made = !existing && this.createNew(path, oflags);\n\n const truncate = made || (oflags & OFLAGS.TRUNC) !== 0;\n const fd = this.kernel.sys.openVfs(path, flags, 0, {\n ...(truncate ? { truncate } : {}),\n ...(made ? { created: true } : {}),\n });\n const ino = writable ? (this.openedIno(fd) ?? this.inoOf(path)) : undefined;\n if (truncate) (this.fs as { touched?(path?: string, ino?: number): void }).touched?.(path, ino);\n this.table.set(fd, { type: 'kernel', kind: 'file', nonblock: false, append, path, ino });\n if (append) this.publishFlags(fd, { nonblock: false, append });\n this.bump();\n return fd;\n }\n\n private createNew(path: string, oflags: number): boolean {\n if (!this.fs.create) {\n this.fs.writeFile(path, new Uint8Array(0));\n return true;\n }\n try {\n this.fs.create(path);\n return true;\n } catch (err) {\n if (oflags & OFLAGS.EXCL || (err as { code?: string }).code !== 'EEXIST') throw err;\n return false;\n }\n }\n\n private isLink(path: string): boolean {\n try {\n return this.fs.lstat(path).isSymbolicLink === true;\n } catch {\n return false;\n }\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 refuseWrite(s: { readonly?: boolean } | undefined, oflags: number, rights: bigint): void {\n const writes = (rights & RIGHTS.FD_WRITE) !== 0n || (oflags & OFLAGS.TRUNC) !== 0;\n if (s?.readonly && writes) throw new WasiError('EROFS');\n}\n\nfunction preopenOf(e: { preopen?: string; twin?: number }): { preopen?: string; twin?: number } {\n return {\n ...(e.preopen ? { preopen: e.preopen } : {}),\n ...(e.twin !== undefined ? { twin: e.twin } : {}),\n };\n}\n\nfunction metaOf(e: WasiEntry): HeldMeta | undefined {\n if (e.type === 'dir') return { dir: e.path, ...preopenOf(e) };\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 { type: 'dir', path: info.meta.dir, ...preopenOf(info.meta) };\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 wantOf(oflags: number, rights: bigint): number {\n const write = (rights & RIGHTS.FD_WRITE) !== 0n || (oflags & OFLAGS.TRUNC) !== 0;\n const read = (rights & RIGHTS.FD_READ) !== 0n || !write;\n return (read ? 4 : 0) | (write ? 2 : 0);\n}\n\nfunction openAccess(\n existing: SyncFsBridgeStat | undefined,\n oflags: number,\n rights: bigint\n): { readable: boolean; writable: boolean } {\n const readonly = existing?.readonly === true;\n const mutating = readonly ? OFLAGS.TRUNC : OFLAGS.CREAT | OFLAGS.TRUNC;\n const writable = (rights & RIGHTS.FD_WRITE) !== 0n || (oflags & mutating) !== 0;\n if (writable && readonly) throw new WasiError('EROFS');\n return { readable: (rights & RIGHTS.FD_READ) !== 0n || !writable, writable };\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() || (f.buffer.handle ?? 0) < 0;\n if (!orphan && f.buffer.isRanged) f.buffer.flush();\n const joins = !orphan && (handed.has(f.buffer) || f.buffer.isRanged);\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 ...(!orphan && f.buffer.pin !== undefined\n ? { pin: { version: f.buffer.pin, size: f.buffer.size() } }\n : {}),\n\n ...(!joins && f.buffer.isDirty() ? { dirty: true } : {}),\n ...(f.buffer.handle !== undefined ? { handle: f.buffer.handle } : {}),\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 const earliest = subs.reduce((min, s) => Math.min(min, s.deadline), Infinity);\n const expired = () => performance.now() >= earliest;\n if (read.length > 0 || write.length > 0 || events.length === 0) {\n do {\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 } while (events.length === 0 && !interrupted && earliest !== Infinity && !expired());\n }\n const after = performance.now();\n\n for (const s of subs) {\n if (s.type === EVENTTYPE.CLOCK && (interrupted || s.deadline <= after)) {\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 { Termios } from '../../kernel/tty.ts';\nimport type { WasiFds, WasiKernel } from './wasi-fds.ts';\nimport { WasiError } from './wasi-files.ts';\nimport type { WasiMemory } from './wasi-memory.ts';\n\nconst NCCS = 32;\nconst C_LINE = 16;\nconst C_CC = 17;\nconst ISPEED = 52;\nconst OSPEED = 56;\nconst B38400 = 0o17;\nconst TCSAFLUSH = 2;\n\nexport function writeTermios(mem: WasiMemory, ptr: number, termios: Termios): void {\n mem.bytes(ptr, OSPEED + 4).fill(0);\n const v = mem.view();\n v.setUint32(ptr, termios.c_iflag, true);\n v.setUint32(ptr + 4, termios.c_oflag, true);\n v.setUint32(ptr + 8, termios.c_cflag, true);\n v.setUint32(ptr + 12, termios.c_lflag, true);\n for (let i = 0; i < NCCS; i++) v.setUint8(ptr + C_CC + i, termios.c_cc[i] ?? 0);\n v.setUint8(ptr + C_LINE, 0);\n v.setUint32(ptr + ISPEED, B38400, true);\n v.setUint32(ptr + OSPEED, B38400, true);\n}\n\nexport function readTermios(mem: WasiMemory, ptr: number): Termios {\n const v = mem.view();\n return {\n c_iflag: v.getUint32(ptr, true),\n c_oflag: v.getUint32(ptr + 4, true),\n c_cflag: v.getUint32(ptr + 8, true),\n c_lflag: v.getUint32(ptr + 12, true),\n c_cc: Array.from({ length: NCCS }, (_, i) => v.getUint8(ptr + C_CC + i)),\n };\n}\n\nexport function sliccTty(\n mem: WasiMemory,\n fds: WasiFds,\n kernel: WasiKernel,\n interrupted: () => void = () => undefined\n) {\n const { sys } = kernel;\n const terminal = (fd: number): number => {\n const e = fds.find(fd);\n if (!e) throw new WasiError('EBADF');\n if (e.type !== 'kernel' || fds.kind(fd, e) !== 'tty') throw new WasiError('ENOTTY');\n return fd;\n };\n const needs = <T>(value: T | undefined): T => {\n if (value === undefined) throw new WasiError('ENOTTY');\n return value;\n };\n const getAttr = (fd: number, ptr: number): void => {\n interrupted();\n writeTermios(mem, ptr, needs(sys.tcgets?.(terminal(fd))));\n };\n const setAttr = (fd: number, actions: number, ptr: number): void => {\n interrupted();\n if (actions < 0 || actions > TCSAFLUSH) throw new WasiError('EINVAL');\n const at = terminal(fd);\n needs(sys.tcsets);\n sys.tcsets?.(at, readTermios(mem, ptr), actions === TCSAFLUSH);\n };\n const size = (fd: number, ptr: number): void => {\n interrupted();\n const [rows, cols] = needs(sys.winsize?.(terminal(fd)));\n mem.bytes(ptr, 8).fill(0);\n const v = mem.view();\n v.setUint16(ptr, rows, true);\n v.setUint16(ptr + 2, cols, true);\n };\n return {\n tcgetattr: (fd: number, ptr: number) => void getAttr(fd, ptr),\n tcsetattr: (fd: number, actions: number, ptr: number) => void setAttr(fd, actions, ptr),\n winsize: (fd: number, ptr: number) => void size(fd, ptr),\n };\n}\n", "import { physicalPath } from '../../fs/physical-path.ts';\nimport { localCpuNanos } from '../../kernel/cpu-clock.ts';\nimport { type Cred, type CredChange, MAX_GROUPS } from '../../kernel/cred.ts';\nimport 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 OFLAGS,\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 {\n CLIPBOARD_PATH,\n deviceOf,\n SEALED_PATH,\n WasiFds,\n type WasiForkFd,\n type WasiKernel,\n} from './wasi-fds.ts';\nimport {\n type DirListing,\n type LocalFile,\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';\nimport type { WasiSignals } from './wasi-signals.ts';\nimport { sliccTty } from './wasi-termios.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 parent?: () => number;\n kernel: WasiKernel;\n\n fs: SyncFsPosixBridge & { invalidate?(): void; touched?(path?: string, ino?: number): 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 preopenRoot?: boolean;\n}\n\nexport type WasiFunction = (...args: never[]) => number | undefined;\n\nconst IDS = ['ruid', 'euid', 'suid', 'rgid', 'egid', 'sgid'] as const;\nconst NS_PER_MS = 1_000_000n;\nconst AT_SYMLINK_NOFOLLOW = 1;\nconst AT_EACCESS = 2;\n\nconst ROOT_IDS = Object.freeze({ uid: 0, gid: 0 });\nconst GONE: ReadonlySet<string> = new Set(['ENOENT', 'ENOTDIR']);\n\nfunction idOf(value: number): number | undefined {\n return value >>> 0 === 0xffffffff ? undefined : value >>> 0;\n}\nconst S_IFIFO = 0o010000;\nconst DEFAULT_UMASK = 0o022;\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 nlink?: bigint;\n mtimeNs: bigint;\n}\n\nfunction linkedOf(st: SyncFsBridgeStat): SyncFsBridgeStat | undefined {\n return (st.nlink ?? 1) > 1 ? st : undefined;\n}\n\nfunction linkedElsewhere(\n fs: Pick<SyncFsPosixBridge, 'lstat'>,\n path: string\n): SyncFsBridgeStat | undefined {\n try {\n return linkedOf(fs.lstat(path));\n } catch {\n return undefined;\n }\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 ...(s.nlink !== undefined ? { nlink: BigInt(s.nlink) } : {}),\n mtimeNs: BigInt(Math.round(s.mtimeMs ?? 0)) * NS_PER_MS,\n };\n}\n\nconst SEALED_MODE = 0o20666;\n\nfunction kernelFiletype(kind: string): { filetype: number; seeks: boolean } {\n switch (kind) {\n case 'tty':\n case 'sealed':\n case 'clipboard':\n return { filetype: FILETYPE.CHARACTER_DEVICE, seeks: false };\n case 'device':\n return { filetype: FILETYPE.CHARACTER_DEVICE, seeks: true };\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 muted: ((fd: number, data: Uint8Array) => boolean) | undefined;\n\n signals: WasiSignals | undefined;\n\n interrupted: (() => boolean) | undefined;\n\n quietly: (fn: () => void) => void = (fn) => fn();\n\n private readonly listening: number[];\n\n readonly o: WasiHostOptions;\n constructor(o: WasiHostOptions) {\n const { kernel } = o;\n const call: WasiKernel['call'] = (req) => {\n if (req.op !== 'fd-promote') this.fds.flushEarly();\n return kernel.call(req);\n };\n const sys = new Proxy(kernel.sys, {\n get: (target, name) => {\n const member = Reflect.get(target, name);\n if (typeof member !== 'function') return member;\n return (...args: unknown[]) => {\n this.fds.flushEarly();\n return member.apply(target, args);\n };\n },\n });\n this.o = { ...o, kernel: { sys, call } };\n this.startCwd = o.cwd;\n this.fds = new WasiFds(this.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 ?? [], o.preopenRoot === true);\n this.listening = o.shared ? [] : this.fds.sockets();\n }\n\n get cwd(): string {\n return this.fds.cwd() ?? this.startCwd;\n }\n\n private created(path: string, mode: number): void {\n const umask = this.o.kernel.call({ op: 'proc-umask' }) as number;\n if (umask !== DEFAULT_UMASK) this.o.fs.chmod(path, mode & ~umask);\n }\n\n sliccTtyImports(): Record<string, WasiFunction> {\n return wrap(sliccTty(this.mem, this.fds, this.o.kernel, () => this.interrupted?.()));\n }\n\n sliccFsImports(): Record<string, WasiFunction> {\n const { mem, fds } = this;\n const at = (dirfd: number, p: number, l: number) => fds.resolve(dirfd, mem.string(p, l));\n const pathOf = (fd: number): string => {\n const e = fds.get(fd);\n if (e.type === 'dir') return e.path;\n if (e.type === 'file') return e.file.path;\n const path =\n e.type === 'kernel' && fds.kind(fd, e) === 'file' ? this.kernelStat(fd).path : undefined;\n if (path === undefined) throw new WasiError('EBADF');\n return path;\n };\n const target = (path: string, flags: number): string => {\n if (flags & AT_SYMLINK_NOFOLLOW && this.o.fs.lstat(path).isSymbolicLink) {\n throw new WasiError('ENOTSUP');\n }\n return path;\n };\n const modeOf = (st: { mode?: number }) => (st.mode ?? 0) & 0o7777;\n const chown = (path: string, uid: number, gid: number, follow: boolean) => {\n const { chown: own } = this.o.fs;\n if (!own) throw new WasiError('ENOSYS');\n own.call(this.o.fs, path, idOf(uid), idOf(gid), follow);\n };\n const caller = (): [number, number] => {\n const cred = this.o.kernel.call({ op: 'proc-cred' }) as Cred;\n return [cred.euid, cred.egid];\n };\n const owner = (st: { uid?: number; gid?: number } | undefined, out: number): void => {\n const [uid, gid] = st?.uid === undefined ? caller() : [st.uid, st.gid as number];\n const view = mem.view();\n view.getUint32(out + 4, true);\n view.setUint32(out, uid, true);\n view.setUint32(out + 4, gid, true);\n };\n const fdOwned = (fd: number): { uid?: number; gid?: number } | undefined => {\n const e = fds.get(fd);\n if (e.type === 'device') return ROOT_IDS;\n const kind = e.type === 'kernel' ? fds.kind(fd, e) : 'file';\n if (kind === 'sealed' || kind === 'clipboard') return ROOT_IDS;\n if (kind !== 'file') return undefined;\n try {\n return this.o.fs.stat(pathOf(fd));\n } catch (err) {\n if (!GONE.has((err as { code?: unknown })?.code as string)) throw err;\n return undefined;\n }\n };\n const pathOwned = (path: string, follow: boolean) => {\n if (this.synthetic(path)) return ROOT_IDS;\n return follow ? this.o.fs.stat(path) : this.o.fs.lstat(path);\n };\n return wrap({\n fd_chown: (fd: number, uid: number, gid: number) => void chown(pathOf(fd), uid, gid, true),\n path_chown: (dirfd: number, p: number, l: number, uid: number, gid: number, flags: number) =>\n void chown(at(dirfd, p, l), uid, gid, (flags & AT_SYMLINK_NOFOLLOW) === 0),\n fd_owner: (fd: number, out: number) => {\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\n owner(fdOwned(fd), out);\n },\n fd_filestat_owner: (fd: number, statOut: number, out: number) => {\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\n this.writeFilestat(statOut, this.fdFilestat(fd));\n owner(fdOwned(fd), out);\n },\n path_filestat_owner: (\n dirfd: number,\n lookup: number,\n p: number,\n l: number,\n statOut: number,\n out: number\n ) => {\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\n const path = at(dirfd, p, l);\n this.writeFilestat(statOut, this.pathFilestat(path, lookup));\n owner(pathOwned(path, (lookup & LOOKUP_SYMLINK_FOLLOW) !== 0), out);\n },\n path_owner: (dirfd: number, p: number, l: number, flags: number, out: number) => {\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\n const path = at(dirfd, p, l);\n owner(pathOwned(path, (flags & AT_SYMLINK_NOFOLLOW) === 0), out);\n },\n path_access: (dirfd: number, p: number, l: number, amode: number, flags: number) => {\n const path = at(dirfd, p, l);\n const nofollow = (flags & AT_SYMLINK_NOFOLLOW) !== 0;\n if (this.synthetic(path)) {\n if (this.o.fs.owners && amode & 1) throw new WasiError('EACCES');\n return;\n }\n const st = pathOwned(path, !nofollow);\n if (amode & 2 && (st as { readonly?: boolean }).readonly) throw new WasiError('EROFS');\n if (!this.o.fs.owners) return;\n const kind = flags & AT_EACCESS ? 'eaccess' : 'access';\n this.o.fs.access?.(path, amode & 7, kind, nofollow);\n },\n fd_chmod: (fd: number, mode: number) => void this.o.fs.chmod(pathOf(fd), mode & 0o7777),\n path_chmod: (dirfd: number, p: number, l: number, mode: number, flags: number) =>\n void this.o.fs.chmod(target(at(dirfd, p, l), flags), mode & 0o7777),\n umask: (mask: number, out: number) => {\n const old = this.o.kernel.call({ op: 'proc-umask', mask }) as number;\n mem.view().setUint32(out, old, true);\n },\n fd_mode: (fd: number, out: number) => {\n const e = fds.get(fd);\n const kind = e.type === 'kernel' ? fds.kind(fd, e) : undefined;\n const mode =\n kind === 'stream'\n ? S_IFIFO | 0o600\n : kind === 'sealed' || kind === 'clipboard'\n ? SEALED_MODE\n : modeOf(this.o.fs.stat(pathOf(fd)));\n mem.view().setUint32(out, mode, true);\n },\n path_mode: (dirfd: number, p: number, l: number, flags: number, out: number) => {\n const path = at(dirfd, p, l);\n if (this.synthetic(path) && deviceOf(path) === undefined)\n return void mem.view().setUint32(out, SEALED_MODE, true);\n const st = flags & AT_SYMLINK_NOFOLLOW ? this.o.fs.lstat(path) : this.o.fs.stat(path);\n mem.view().setUint32(out, modeOf(st), true);\n },\n });\n }\n\n sliccImports(): Record<string, WasiFunction> {\n const { mem } = this;\n const path = (p: number, l: number) => {\n const text = mem.string(p, l);\n return text === '' || text.startsWith('/') ? text : normalize(`${this.cwd}/${text}`);\n };\n return wrap({\n mount: (\n sp: number,\n sl: number,\n tp: number,\n tl: number,\n fp: number,\n fl: number,\n flags: number,\n dp: number,\n dl: number\n ) =>\n void this.o.kernel.call({\n op: 'mount',\n source: mem.string(sp, sl),\n target: path(tp, tl),\n type: mem.string(fp, fl),\n flags,\n data: mem.string(dp, dl),\n }),\n umount2: (tp: number, tl: number, flags: number) =>\n void this.o.kernel.call({ op: 'umount', target: path(tp, tl), flags }),\n cred_get: (out: number) => {\n const cred = this.o.kernel.call({ op: 'proc-cred' }) as Cred;\n const view = mem.view();\n view.getUint32(out + 20, true);\n IDS.forEach((key, i) => void view.setUint32(out + i * 4, cred[key], true));\n },\n cred_set: (...ids: number[]) => {\n const change: CredChange = {};\n IDS.forEach((key, i) => {\n if (ids[i] !== -1) change[key] = (ids[i] as number) >>> 0;\n });\n void this.o.kernel.call({ op: 'proc-setcred', change });\n },\n groups_get: (buf: number, cap: number, count: number) => {\n const { groups } = this.o.kernel.call({ op: 'proc-cred' }) as Cred;\n if (cap !== 0 && cap < groups.length) throw new WasiError('EINVAL');\n const shown = cap === 0 ? [] : groups;\n const view = mem.view();\n view.getUint32(count, true);\n if (shown.length > 0) view.getUint32(buf + (shown.length - 1) * 4, true);\n shown.forEach((g, i) => void view.setUint32(buf + i * 4, g, true));\n view.setUint32(count, groups.length, true);\n },\n groups_set: (buf: number, n: number) => {\n if (n < 0 || n > MAX_GROUPS) throw new WasiError('EINVAL');\n const view = mem.view();\n const groups = Array.from({ length: n }, (_, i) => view.getUint32(buf + i * 4, true));\n void this.o.kernel.call({ op: 'proc-setcred', change: { groups } });\n },\n sigaction_set: (sig: number, disposition: number, flags: number) =>\n this.signals ? this.signals.disposition(sig, disposition, flags) : E.NOSYS,\n });\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 try {\n return 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 } finally {\n this.o.fs.invalidate?.();\n }\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 (localCpuNanos() ?? 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, 'write');\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, 'write').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 ) => {\n const path = at(dirfd, p, l);\n if (deviceOf(path)) this.interrupted?.();\n const fresh = (oflags & OFLAGS.CREAT) !== 0 && !this.synthetic(path) && !o.fs.exists(path);\n mem.view().setUint32(out, fds.open(path, oflags, rights, fdflags), true);\n if (fresh) this.created(path, 0o666);\n },\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, (lookup & LOOKUP_SYMLINK_FOLLOW) !== 0);\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 this.created(path, 0o777);\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 const st = o.fs.lstat(path);\n if (st.isDirectory) throw new WasiError('EISDIR');\n const linked = linkedOf(st);\n fds.unlinking(path, linked);\n o.fs.unlink(path);\n fds.unlinked(path, linked);\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 const replaced = fds.holdsUnder(to) ? linkedElsewhere(o.fs, to) : undefined;\n o.fs.rename(from, to);\n fds.renamed(from, to, replaced);\n },\n path_symlink: (tp: number, tl: number, dirfd: number, p: number, l: number) => {\n const path = at(dirfd, p, l);\n if (tl === 0) throw new WasiError('ENOENT');\n o.fs.symlink(mem.string(tp, tl), path);\n },\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: (\n fd: number,\n lookup: number,\n p: number,\n l: number,\n fd2: number,\n p2: number,\n l2: number\n ) => {\n const from = at(fd, p, l);\n const to = at(fd2, p2, l2);\n const follow = (lookup & LOOKUP_SYMLINK_FOLLOW) !== 0;\n const source = follow ? physicalPath(o.fs, from) : from;\n fds.flushPath(from);\n if (source !== from) fds.flushPath(source);\n o.fs.link(from, to, follow);\n fds.linked(from, to);\n if (source !== from) fds.linked(source, to);\n },\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 const kind = e.type === 'kernel' ? this.fds.kind(fd, e) : e.type;\n if (kind === 'device') this.interrupted?.();\n if (kind !== 'file' || e.type !== 'kernel') 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) =>\n this.changed(fd, e, kernel.call({ op: 'fd-pwrite', fd, offset: at, body }) as number),\n size: () => this.kernelStat(fd).size,\n truncate: (size) => this.changed(fd, e, void kernel.call({ op: 'fd-resize', fd, size })),\n };\n }\n\n private readonly unnamed = new WeakSet<object>();\n\n private changed<T>(fd: number, e: { path?: string; ino?: number }, result: T): T {\n if (e.path === undefined && !this.unnamed.has(e)) this.learnPath(fd, e);\n this.o.fs.touched?.(e.path, e.ino);\n return result;\n }\n\n private learnPath(fd: number, e: { path?: string; ino?: number }): void {\n this.unnamed.add(e);\n let path: string | undefined;\n try {\n const st = this.o.kernel.call({ op: 'fd-vfs-stat', fd, identity: true }) as {\n path?: string;\n orphan?: true;\n ino?: number;\n };\n path = st.orphan ? undefined : st.path;\n if (path !== undefined) e.ino = st.ino ?? this.o.fs.stat(path).ino;\n } catch {\n return;\n }\n e.path = path;\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 if (this.muted?.(fd, data)) return data.length;\n const e = this.fds.get(fd);\n if (e.type === 'kernel') {\n try {\n const n = this.o.kernel.sys.write(fd, data, { nonblock: e.nonblock });\n return this.fds.kind(fd, e) === 'file' ? this.changed(fd, e, n) : n;\n } catch (err) {\n const broken = (err as { code?: string }).code === 'EPIPE';\n if (broken && this.fds.kind(fd, e) !== 'socket') throw new WasiExit(SIGPIPE_EXIT);\n throw err;\n }\n }\n if (e.type === 'device') {\n this.interrupted?.();\n if (e.access === 'read') throw new WasiError('EBADF');\n if (e.device === 'full' && data.length > 0) throw new WasiError('ENOSPC');\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 this.interrupted?.();\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 === 'urandom' ? crypto.getRandomValues(out) : out;\n }\n return this.file(fd, 'read').read(max);\n }\n\n private local<T>(answer: T): T {\n this.interrupted?.();\n return answer;\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 const kind = this.fds.kind(fd, e);\n if (kind === 'device') return this.local(0);\n if (kind !== 'file') throw new WasiError('ESPIPE');\n return this.o.kernel.sys.seek(fd, offset, whence);\n }\n if (e.type === 'device') return this.local(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 === 'device') this.interrupted?.();\n else if (e.type === 'kernel') {\n const kind = this.fds.kind(fd, e);\n if (kind === 'file') this.o.kernel.sys.flush(fd);\n else if (kind === 'device') this.interrupted?.();\n }\n }\n\n private fdstat(fd: number, out: number): void {\n const e = this.fds.get(fd);\n if (e.type === 'device') this.interrupted?.();\n let filetype: number = FILETYPE.CHARACTER_DEVICE;\n let seeks = true;\n let flags = 0;\n if (e.type === 'kernel') {\n const kind = this.fds.kind(fd, e);\n if (kind === 'device') this.interrupted?.();\n ({ filetype, seeks } = kernelFiletype(kind));\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, f.nlink ?? 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.localFilestat(e.file);\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, vfs.orphan);\n }\n const filetype = kind ? kernelFiletype(kind).filetype : FILETYPE.CHARACTER_DEVICE;\n return this.local({ filetype, size: 0n, ino: BigInt(fd + 1), mtimeNs: 0n });\n }\n\n private localFilestat(file: LocalFile): Filestat {\n const { buffer } = file;\n if (buffer.isOrphan()) return this.statOrphanable(file.path, file.size(), false, true);\n let s: SyncFsBridgeStat | undefined;\n try {\n s = this.o.fs.stat(file.path);\n } catch {\n s = this.keptStat(buffer.handle);\n }\n return this.sized(file.path, s, file.size());\n }\n\n private keptStat(handle: number | undefined): SyncFsBridgeStat | undefined {\n if (handle === undefined) return undefined;\n try {\n return this.o.fs.keptStat?.(handle);\n } catch {\n return undefined;\n }\n }\n\n private sized(path: string, s: SyncFsBridgeStat | undefined, size: number): Filestat {\n return {\n ...filestatOf(path, s ?? { isFile: true, isDirectory: false, size: 0 }),\n size: BigInt(size),\n };\n }\n\n private statOrphanable(path: string, size: number, orphan = false, gone = false): Filestat {\n let s: SyncFsBridgeStat | undefined;\n\n if (!orphan) {\n try {\n s = this.o.fs.stat(path);\n } catch {}\n }\n const out = this.sized(path, s, size);\n return gone ? { ...out, nlink: 0n } : out;\n }\n\n private synthetic(path: string): boolean {\n return (\n deviceOf(path) !== undefined ||\n (path === SEALED_PATH && !!this.o.kernel.sys.openSealed) ||\n (path === CLIPBOARD_PATH && !!this.o.kernel.sys.openClipboard)\n );\n }\n\n private pathFilestat(path: string, lookup: number): Filestat {\n if (this.synthetic(path)) {\n return this.local({\n filetype: FILETYPE.CHARACTER_DEVICE,\n size: 0n,\n ino: pathInode(path),\n mtimeNs: 0n,\n });\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, follow = true): void {\n const asked = FSTFLAGS.ATIM | FSTFLAGS.ATIM_NOW | FSTFLAGS.MTIM | FSTFLAGS.MTIM_NOW;\n if (this.o.fs.owners && (flags & asked) === 0) return;\n const now = Date.now();\n let current: SyncFsBridgeStat | undefined;\n const statOf = follow ? this.o.fs.stat.bind(this.o.fs) : this.o.fs.lstat.bind(this.o.fs);\n const kept = (field: 'atimeMs' | 'mtimeMs'): number => {\n current ??= statOf(path);\n return current[field] ?? current.mtimeMs ?? now;\n };\n const pick = (\n set: number,\n setNow: number,\n value: bigint,\n field: 'atimeMs' | 'mtimeMs'\n ): number => (flags & setNow ? now : flags & set ? Number(value / NS_PER_MS) : kept(field));\n (follow ? this.o.fs.utimes : this.o.fs.lutimes).call(\n this.o.fs,\n path,\n pick(FSTFLAGS.ATIM, FSTFLAGS.ATIM_NOW, atim, 'atimeMs'),\n pick(FSTFLAGS.MTIM, FSTFLAGS.MTIM_NOW, mtim, 'mtimeMs'),\n (flags & (FSTFLAGS.ATIM | FSTFLAGS.MTIM)) === 0\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 { physicalPath } from '../../fs/physical-path.ts';\nimport type { ChildStdio, InheritedSlot } from '../../kernel/children.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\nexport function restarted(issue: () => unknown): unknown {\n for (;;) {\n try {\n return issue();\n } catch (e) {\n if ((e as { code?: unknown } | null)?.code !== 'EINTR') throw e;\n }\n }\n}\n\nfunction resolveFrom(cwd: string, path: string): string {\n return normalize(path.startsWith('/') ? path : `${cwd}/${path}`);\n}\n\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\nconst OFLAG_CREAT = 1;\nconst OFLAG_TRUNC = 8;\nconst JOIN_NON_BLOCKING = 1;\nconst JOIN_WAKE_STOPPED = 2;\nconst JOIN_STOPPED = 3;\n\nexport class WasixProcess {\n private readonly host: WasiHost;\n private readonly driver: AsyncifyDriver;\n private readonly inThread: () => boolean;\n constructor(host: WasiHost, driver: AsyncifyDriver, inThread: () => boolean = () => false) {\n this.host = host;\n this.driver = driver;\n this.inThread = inThread;\n }\n\n private restart(): { restart?: true } {\n return this.inThread() ? {} : { restart: true };\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 this.physicalFrom(cwd, op.path);\n else return physicalPath(this.host.o.fs, fds.dir(op.fd).path);\n return cwd;\n }\n\n private physicalFrom(cwd: string, path: string): string {\n return physicalPath(this.host.o.fs, path.startsWith('/') ? path : `${cwd}/${path}`);\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, exec = false): number {\n const { stdio, inherit, cwd, opened } = this.childFds(req.ops ?? []);\n try {\n const spawn = {\n op: 'proc-spawn' as const,\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 ...(exec ? { exec } : {}),\n ...this.restart(),\n };\n return restarted(() => this.call(spawn)) 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, true);\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({\n op: 'proc-wait',\n pid,\n nohang: (flags & JOIN_NON_BLOCKING) !== 0,\n ...(flags & JOIN_WAKE_STOPPED ? { untraced: true } : {}),\n }) as [number, number];\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 === 0x7f) {\n v.setUint8(statusPtr, JOIN_STOPPED);\n v.setUint8(statusPtr + 2, (status >> 8) & 0xff);\n } else if (sig) {\n v.setUint8(statusPtr, 2);\n v.setUint8(statusPtr + 4, 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(\n (asyncifyData, globals, forkSp) =>\n restarted(() => this.forkCall(asyncifyData, globals, forkSp)) as number\n );\n }\n\n private forkCall(\n asyncifyData: number,\n globals: Array<[string, number]>,\n forkSp: number\n ): unknown {\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 ...(this.host.signals ? { signals: this.host.signals.snapshot() } : {}),\n };\n return this.call({\n op: 'proc-fork',\n state: { memory, currData: 0, forkSp, callStackNames: [], ppid: this.host.o.pid, wasi },\n ...this.restart(),\n });\n }\n}\n", "import type { Cred } from '../../kernel/cred.ts';\nimport 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';\nimport { MAIN_TID } from './wasi-threads.ts';\nimport { restarted } from './wasix-process.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 readonly uid?: number;\n readonly gid?: 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 function importSource(source: string): Promise<Record<string, unknown>> {\n return import(`data:text/javascript;base64,${base64(source)}`);\n}\n\nexport async function loadImports(source: string): Promise<CreateImports> {\n const loaded = (await importSource(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 owners = fs.owners === true;\n const live = (): { uid: number; gid: number } => {\n if (!owners) return { uid: UID, gid: UID };\n const cred = call({ op: 'proc-cred' }) as Cred;\n return { uid: cred.euid, gid: cred.egid };\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, ...live(), 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 ...(s.uid !== undefined && s.gid !== undefined ? { uid: s.uid, gid: s.gid } : live()),\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 const ctx: ImportsContext = {\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, tid !== MAIN_TID),\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 if (!owners) return ctx;\n return Object.defineProperties(ctx, {\n uid: { get: () => live().uid, enumerable: true },\n gid: { get: () => live().gid, enumerable: true },\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 inThread: boolean\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 req = {\n op: 'proc-spawn' as const,\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 ...(inThread ? {} : { restart: true as const }),\n };\n const pid = restarted(() => call(req)) as number;\n const out: Spawned = { pid };\n STDIO.forEach((name, n) => {\n if (mine[n] !== undefined) out[name] = mine[n];\n });\n return out;\n } catch (err) {\n for (const fd of mine) if (fd !== undefined) close(fd);\n throw err;\n } finally {\n for (const fd of theirs) close(fd);\n host.o.fs.invalidate?.();\n }\n },\n wait(pid) {\n for (;;) {\n try {\n const [, status] = call({ op: 'proc-wait', pid, nohang: false }) as [number, number];\n host.o.fs.invalidate?.();\n const signal = status & 0x7f;\n return signal ? { status: 128 + signal, signal } : { status: (status >> 8) & 0xff };\n } catch (err) {\n if (code(err) !== 'EINTR') throw err;\n }\n }\n },\n kill(pid, sig) {\n call({ op: 'proc-kill', pid, sig });\n },\n };\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport type { SabPostLike } from '../../realm/sync-sab-bridge.ts';\nimport {\n decodeSabResult,\n loadU53,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_OFFSET_HI,\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_I_TOTAL_HI,\n SAB_STATE_IDLE,\n SAB_STATE_PENDING,\n SAB_STATE_READY,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabRequestBody,\n sabViews,\n} from '../../realm/sync-sab-wire.ts';\n\nexport type WaitAsyncLike = (\n typedArray: Int32Array,\n index: number,\n value: number\n) => { async: false; value: string } | { async: true; value: Promise<string> };\n\nexport interface AsyncSabTransport {\n call(req: SyncSabRequestBody): Promise<SyncFsResult>;\n}\n\nconst defaultWaitAsync: WaitAsyncLike = (a, i, v) =>\n (\n Atomics as unknown as {\n waitAsync: WaitAsyncLike;\n }\n ).waitAsync(a, i, v);\n\nexport async function changed(\n header: Int32Array,\n index: number,\n seen: number,\n waitAsync: WaitAsyncLike = defaultWaitAsync\n): Promise<void> {\n const waited = waitAsync(header, index, seen);\n if (waited.async) await waited.value;\n}\n\nexport function createAsyncSabTransport(\n sab: SharedArrayBuffer,\n port: SabPostLike,\n waitAsync: WaitAsyncLike = defaultWaitAsync\n): AsyncSabTransport {\n const { header, window } = sabViews(sab);\n let seq = 0;\n let tail: Promise<unknown> = Promise.resolve();\n\n async function ready(id: number): Promise<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 await changed(header, SAB_I_PUB, published, waitAsync);\n }\n }\n\n async function once(req: SyncSabRequestBody): Promise<SyncFsResult> {\n const id = ++seq;\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 port.postMessage(\n offset === 0\n ? { type: SYNC_SAB_REQ_MSG, id, req }\n : { type: SYNC_SAB_NEXT_MSG, id, offset }\n );\n await ready(id);\n const total = loadU53(header, SAB_I_TOTAL, SAB_I_TOTAL_HI);\n const chunk = Atomics.load(header, SAB_I_CHUNK);\n const at = loadU53(header, SAB_I_OFFSET, SAB_I_OFFSET_HI);\n if (at !== offset || chunk < 0 || total < 0 || offset + chunk > total) {\n return { ok: false, errno: 'EIO', message: 'sync-sab: torn reply' };\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 if (chunk === 0) return { ok: false, errno: 'EIO', message: 'sync-sab: empty chunk' };\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 return {\n call(req) {\n const run = tail.then(() => once(req));\n tail = run.catch(() => undefined);\n return run;\n },\n };\n}\n", "export const SIG = {\n HUP: 1,\n INT: 2,\n QUIT: 3,\n ILL: 4,\n TRAP: 5,\n ABRT: 6,\n BUS: 7,\n FPE: 8,\n KILL: 9,\n USR1: 10,\n SEGV: 11,\n USR2: 12,\n PIPE: 13,\n ALRM: 14,\n TERM: 15,\n STKFLT: 16,\n CHLD: 17,\n CONT: 18,\n STOP: 19,\n TSTP: 20,\n TTIN: 21,\n TTOU: 22,\n URG: 23,\n XCPU: 24,\n XFSZ: 25,\n VTALRM: 26,\n PROF: 27,\n WINCH: 28,\n POLL: 29,\n PWR: 30,\n SYS: 31,\n} as const;\n\nexport type DefaultAction = 'terminate' | 'ignore' | 'stop' | 'continue';\n\nconst IGNORED_BY_DEFAULT: ReadonlySet<number> = new Set([SIG.CHLD, SIG.URG, SIG.WINCH]);\nconst STOPPING: ReadonlySet<number> = new Set([SIG.STOP, SIG.TSTP, SIG.TTIN, SIG.TTOU]);\n\nexport function defaultAction(sig: number): DefaultAction {\n if (sig === SIG.CONT) return 'continue';\n if (STOPPING.has(sig)) return 'stop';\n return IGNORED_BY_DEFAULT.has(sig) ? 'ignore' : 'terminate';\n}\n\nexport function isSignal(sig: number): boolean {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31;\n}\n\nexport function sigbit(sig: number): number {\n return 1 << sig;\n}\n\nexport function signalsIn(mask: number): number[] {\n const out: number[] = [];\n for (let sig = 1; sig <= 31; sig++) if (mask & sigbit(sig)) out.push(sig);\n return out;\n}\n\nexport function signalName(sig: number | undefined): string | undefined {\n const name = Object.entries(SIG).find(([, n]) => n === sig)?.[0];\n return name === undefined ? undefined : `SIG${name}`;\n}\n\nexport function quiet<T>(p: Promise<T>): Promise<T> {\n p.catch(() => undefined);\n return p;\n}\n\nexport function signalField(sig: number | undefined): { signal?: string } {\n const name = signalName(sig);\n return name ? { signal: name } : {};\n}\n\nexport const SIGNAL_BY_NAME: Readonly<\n Record<'SIGINT' | 'SIGTERM' | 'SIGKILL' | 'SIGSTOP' | 'SIGCONT', number>\n> = {\n SIGINT: SIG.INT,\n SIGTERM: SIG.TERM,\n SIGKILL: SIG.KILL,\n SIGSTOP: SIG.STOP,\n SIGCONT: SIG.CONT,\n};\n", "import type { WasmSyscall } from '../../kernel/process.ts';\nimport { type DefaultAction, defaultAction, SIG, sigbit, signalsIn } from '../../kernel/signals.ts';\nimport type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport {\n SAB_HEADER_I32,\n SAB_I_ASYNC,\n SAB_I_SIGNALS,\n SAB_I_STOP,\n type SyncSabRequestBody,\n} from '../../realm/sync-sab-wire.ts';\nimport { type AsyncSabTransport, changed, type WaitAsyncLike } from './async-sab.ts';\n\nexport class JsCallError extends Error {\n readonly code: string;\n\n constructor(code: string, what: string) {\n super(`${what}: ${code}`);\n this.name = 'JsCallError';\n this.code = code;\n }\n}\n\nconst DETAILED: ReadonlySet<string> = new Set([\n 'fd-read',\n 'fd-write',\n 'fd-close',\n 'fd-open-clipboard',\n]);\n\nexport function callError(result: { errno: string; message: string }, op: string): JsCallError {\n const { errno, message } = result;\n const detailed = typeof message === 'string' && message !== errno && DETAILED.has(op);\n return new JsCallError(errno, detailed ? `${op}: ${message}` : op);\n}\n\nfunction untilAborted(work: Promise<void>, signal: AbortSignal | undefined): Promise<void> {\n if (!signal) return work;\n return new Promise<void>((resolve) => {\n const done = () => {\n signal.removeEventListener('abort', done);\n resolve();\n };\n signal.addEventListener('abort', done, { once: true });\n work.then(done, done);\n });\n}\n\nexport type SignalHandler = (signal: number) => unknown;\n\nexport interface JsKernelOptions {\n sab: SharedArrayBuffer;\n transport: AsyncSabTransport;\n waitAsync: WaitAsyncLike | undefined;\n onError: (err: unknown) => void;\n}\n\nfunction caughtOf(handlers: Map<number, SignalHandler>): number {\n let caught = 0;\n for (const sig of handlers.keys()) caught |= sigbit(sig);\n return caught;\n}\n\nexport class JsKernel {\n private readonly header: Int32Array;\n private readonly transport: AsyncSabTransport;\n private readonly waitAsync: WaitAsyncLike | undefined;\n private readonly onError: (err: unknown) => void;\n private handlers = new Map<number, SignalHandler>();\n private ignored = 0;\n private changing: Promise<unknown> = Promise.resolve();\n pid = 0;\n private reported = { caught: 0, ignored: 0 };\n private watching = false;\n faulted = false;\n syncLane: ((req: SyncSabRequestBody) => SyncFsResult) | undefined;\n\n constructor(o: JsKernelOptions) {\n this.header = new Int32Array(o.sab, 0, SAB_HEADER_I32);\n this.transport = o.transport;\n this.waitAsync = o.waitAsync;\n this.onError = o.onError;\n }\n\n async raw(req: SyncSabRequestBody): Promise<SyncFsResult> {\n const result = await this.transport.call(req);\n this.deliver();\n return result;\n }\n\n async call(req: SyncSabRequestBody): Promise<SyncFsResult> {\n const result = await this.raw(req);\n if (!result.ok) throw callError(result, req.op);\n return result;\n }\n\n async json(req: SyncSabRequestBody): Promise<unknown> {\n const result = await this.call(req);\n return result.ok && result.kind === 'json' ? result.json : undefined;\n }\n\n async bytes(req: SyncSabRequestBody): Promise<Uint8Array> {\n const result = await this.call(req);\n return result.ok && result.kind === 'bytes' ? result.bytes : new Uint8Array(0);\n }\n\n async blocking(\n req: WasmSyscall,\n signal?: AbortSignal,\n track?: (id: number) => void\n ): Promise<SyncFsResult> {\n for (;;) {\n const id = await this.submit(req, track);\n const result = await this.settled(id, signal);\n if (result.ok) return result;\n if (result.errno !== 'EINTR') throw callError(result, req.op);\n }\n }\n\n private acks: number[] = [];\n\n ack(id: number): void {\n this.acks.push(id);\n }\n\n private async submit(req: WasmSyscall, track?: (id: number) => void): Promise<number> {\n const ack = this.acks;\n this.acks = [];\n const r = await this.transport.call({\n op: 'async-submit',\n req,\n ...(ack.length > 0 ? { ack } : {}),\n });\n const id = r.ok && r.kind === 'json' ? (r.json as number) : undefined;\n if (id !== undefined) track?.(id);\n this.deliver();\n if (id === undefined) throw new JsCallError(r.ok ? 'EIO' : r.errno, 'async-submit');\n return id;\n }\n\n private async settled(id: number, signal?: AbortSignal): Promise<SyncFsResult> {\n for (;;) {\n const seen = Atomics.load(this.header, SAB_I_ASYNC);\n const taken = await this.raw({ op: 'async-take', id });\n if (taken.ok || taken.errno !== 'EAGAIN') return taken;\n if (signal?.aborted) {\n await this.raw({ op: 'async-cancel', id });\n throw signal.reason;\n }\n await untilAborted(changed(this.header, SAB_I_ASYNC, seen, this.waitAsync), signal);\n }\n }\n\n deliver(): void {\n const pending = Atomics.exchange(this.header, SAB_I_SIGNALS, 0);\n for (const sig of signalsIn(pending)) {\n const handler = this.handlers.get(sig);\n if (!handler) {\n if (!(this.ignored & sigbit(sig))) this.raise(sig);\n continue;\n }\n try {\n Promise.resolve(handler(sig)).catch((err) => this.fault(err));\n } catch (err) {\n this.fault(err);\n }\n }\n }\n\n private fault(err: unknown): void {\n this.faulted = true;\n this.onError(err);\n }\n\n async watch(): Promise<void> {\n if (this.watching) return;\n this.watching = true;\n for (;;) {\n await changed(this.header, SAB_I_SIGNALS, 0, this.waitAsync);\n this.deliver();\n }\n }\n\n async watchStops(): Promise<void> {\n for (;;) {\n await changed(this.header, SAB_I_STOP, 0, this.waitAsync);\n this.freeze();\n }\n }\n\n freeze(): void {\n while (Atomics.load(this.header, SAB_I_STOP) === 1) Atomics.wait(this.header, SAB_I_STOP, 1);\n }\n\n disposition(sig: number): 'caught' | 'ignored' | DefaultAction {\n if (this.handlers.has(sig)) return 'caught';\n if (this.ignored & sigbit(sig)) return 'ignored';\n return defaultAction(sig);\n }\n\n setHandler(sig: number, handler: SignalHandler | 'ignore' | 'default'): Promise<void> {\n if (sig === SIG.KILL || sig === SIG.STOP) {\n return Promise.reject(new JsCallError('EINVAL', 'signal'));\n }\n if (this.syncLane) {\n try {\n this.changeNow(this.syncLane, sig, handler);\n return Promise.resolve();\n } catch (err) {\n return Promise.reject(err);\n }\n }\n const run = this.changing.then(() => this.change(sig, handler));\n this.changing = run.catch(() => undefined);\n return run;\n }\n\n private changeNow(\n lane: (req: SyncSabRequestBody) => SyncFsResult,\n sig: number,\n handler: SignalHandler | 'ignore' | 'default'\n ): void {\n const { handlers, ignored } = this.disposed(sig, handler);\n const defaults = handler === 'default' ? sigbit(sig) : 0;\n const caught = caughtOf(handlers);\n if (caught !== this.reported.caught || ignored !== this.reported.ignored || defaults !== 0) {\n const r = lane({ op: 'sig-mask', caught, ignored, ...(defaults ? { defaults } : {}) });\n if (!r.ok) throw new JsCallError(r.errno, 'sig-mask');\n this.reported = { caught, ignored };\n }\n this.handlers = handlers;\n this.ignored = ignored;\n if (handlers.size > 0) void this.watch();\n }\n\n private disposed(\n sig: number,\n handler: SignalHandler | 'ignore' | 'default'\n ): { handlers: Map<number, SignalHandler>; ignored: number } {\n const handlers = new Map(this.handlers);\n handlers.delete(sig);\n let ignored = this.ignored & ~sigbit(sig);\n if (handler === 'ignore') ignored |= sigbit(sig);\n else if (handler !== 'default') handlers.set(sig, handler);\n return { handlers, ignored };\n }\n\n private async change(sig: number, handler: SignalHandler | 'ignore' | 'default'): Promise<void> {\n const { handlers, ignored } = this.disposed(sig, handler);\n await this.report(handlers, ignored, handler === 'default' ? sigbit(sig) : 0);\n this.handlers = handlers;\n this.ignored = ignored;\n if (handlers.size > 0) void this.watch();\n }\n\n private raise(sig: number): void {\n this.call({ op: 'proc-kill', pid: this.pid, sig }).catch(this.onError);\n }\n\n private async report(\n handlers: Map<number, SignalHandler>,\n ignored: number,\n defaults: number\n ): Promise<void> {\n const caught = caughtOf(handlers);\n const same = caught === this.reported.caught && ignored === this.reported.ignored;\n if (same && defaults === 0) return;\n this.reported = { caught, ignored };\n await this.call({ op: 'sig-mask', caught, ignored, ...(defaults ? { defaults } : {}) });\n }\n}\n", "import { JsCallError, type JsKernel } from './js-kernel.ts';\n\nexport type JsStdio = 'inherit' | 'pipe' | 'null' | number;\n\nexport interface JsSpawnOptions {\n argv: readonly string[];\n argv0?: string;\n env?: Readonly<Record<string, string>>;\n cwd?: string;\n pgid?: number;\n session?: boolean;\n stdin?: JsStdio;\n stdout?: JsStdio;\n stderr?: JsStdio;\n}\n\nexport interface JsExited {\n status: number;\n signal?: number;\n}\n\nexport interface JsChild {\n readonly pid: number;\n readonly stdin?: WritableStream<Uint8Array>;\n readonly stdout?: ReadableStream<Uint8Array>;\n readonly stderr?: ReadableStream<Uint8Array>;\n wait(): Promise<JsExited>;\n kill(signal?: number | `SIG${string}`): Promise<void>;\n}\n\nexport interface ChildIo {\n read(fd: number, max: number | undefined, signal: AbortSignal): Promise<Uint8Array>;\n send(fd: number, data: Uint8Array, signal: AbortSignal): Promise<void>;\n close(fd: number): Promise<void>;\n}\n\nexport interface ChildDefaults {\n env: Readonly<Record<string, string>>;\n cwd: string;\n signal(name: number | `SIG${string}`): number;\n}\n\nconst STDIO = ['stdin', 'stdout', 'stderr'] as const;\nconst SIGTERM = 15;\n\ntype Slot = { fd: number } | { none: true };\n\nexport function exitedOf(status: number): JsExited {\n const signal = status & 0x7f;\n return signal ? { status: 128 + signal, signal } : { status: (status >> 8) & 0xff };\n}\n\nfunction readable(io: ChildIo, fd: number): ReadableStream<Uint8Array> {\n const cancelled = new AbortController();\n return new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n const chunk = await io.read(fd, undefined, cancelled.signal).catch((err: unknown) => {\n if (cancelled.signal.aborted) return undefined;\n throw err;\n });\n if (chunk === undefined) return;\n if (chunk.length > 0) {\n controller.enqueue(chunk);\n return;\n }\n controller.close();\n await io.close(fd);\n },\n cancel: () => {\n cancelled.abort();\n return io.close(fd);\n },\n },\n { highWaterMark: 0 }\n );\n}\n\nfunction writable(io: ChildIo, fd: number): WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write: (chunk, controller) => io.send(fd, chunk, controller.signal),\n close: () => io.close(fd),\n abort: () => io.close(fd),\n });\n}\n\nexport function childOps(kernel: JsKernel, io: ChildIo, defaults: ChildDefaults) {\n const wait = async (pid: number): Promise<JsExited> => {\n const r = await kernel.blocking({ op: 'proc-wait', pid, nohang: false });\n const [, status] = (r.ok && r.kind === 'json' ? r.json : [0, 0]) as [number, number];\n return exitedOf(status);\n };\n const kill = async (pid: number, signal: number | `SIG${string}` = SIGTERM): Promise<void> => {\n await kernel.call({ op: 'proc-kill', pid, sig: signal === 0 ? 0 : defaults.signal(signal) });\n };\n\n const childOf = (pid: number, mine: Array<number | undefined>): JsChild => {\n const [stdin, stdout, stderr] = mine;\n return {\n pid,\n ...(stdin !== undefined ? { stdin: writable(io, stdin) } : {}),\n ...(stdout !== undefined ? { stdout: readable(io, stdout) } : {}),\n ...(stderr !== undefined ? { stderr: readable(io, stderr) } : {}),\n wait: () => wait(pid),\n kill: (signal?: number | `SIG${string}`) => kill(pid, signal),\n };\n };\n\n const spawn = async (o: JsSpawnOptions): Promise<JsChild> => {\n const [file] = o.argv;\n if (file === undefined) throw new JsCallError('EINVAL', 'spawn');\n const group = groupOf(o, 'spawn');\n const named = argv0Of(o.argv0, 'spawn');\n const mine: Array<number | undefined> = [];\n const theirs: number[] = [];\n try {\n const stdio = await slots(kernel, o, mine, theirs);\n const pid = (await kernel.json({\n op: 'proc-spawn',\n file,\n argv: [...o.argv],\n ...named,\n env: { ...(o.env ?? defaults.env) },\n cwd: o.cwd ?? defaults.cwd,\n stdio,\n ...group,\n })) as number;\n return childOf(pid, mine);\n } catch (err) {\n await closeAll(io, mine);\n throw err;\n } finally {\n await closeAll(io, theirs);\n }\n };\n\n return { spawn, wait, kill };\n}\n\nexport function groupOf(\n o: { pgid?: number; session?: boolean },\n call: string\n): { pgid?: number; session?: true } {\n const { pgid, session } = o;\n const valid = pgid === undefined || (Number.isInteger(pgid) && pgid >= 0);\n if (!valid || (session !== undefined && typeof session !== 'boolean')) {\n throw new JsCallError('EINVAL', call);\n }\n if (session && pgid !== undefined) throw new JsCallError('EINVAL', call);\n return session ? { session: true } : pgid !== undefined ? { pgid } : {};\n}\n\nexport function argv0Of(argv0: unknown, call: string): { argv0?: string } {\n if (argv0 === undefined) return {};\n if (typeof argv0 !== 'string') throw new JsCallError('EINVAL', call);\n return { argv0 };\n}\n\nasync function closeAll(io: ChildIo, fds: ReadonlyArray<number | undefined>): Promise<void> {\n for (const fd of fds) if (fd !== undefined) await io.close(fd).catch(() => undefined);\n}\n\nasync function preflight(kernel: JsKernel, hows: readonly JsStdio[]): Promise<void> {\n for (const [n, how] of hows.entries()) {\n if (how === 'pipe' || how === 'null') continue;\n if (how !== 'inherit' && typeof how !== 'number') throw new JsCallError('EINVAL', 'spawn');\n await kernel.json({ op: 'fd-info', fd: how === 'inherit' ? n : how });\n }\n}\n\nasync function slots(\n kernel: JsKernel,\n o: JsSpawnOptions,\n mine: Array<number | undefined>,\n theirs: number[]\n): Promise<Slot[]> {\n const hows = STDIO.map((name) => o[name] ?? ('inherit' as const));\n await preflight(kernel, hows);\n const stdio: Slot[] = [];\n for (const [n, how] of hows.entries()) {\n if (how === 'inherit') stdio.push({ fd: n });\n else if (how === 'null') stdio.push({ none: true });\n else if (typeof how === 'number') stdio.push({ fd: how });\n else {\n const [read, write] = (await kernel.json({ op: 'fd-pipe' })) as [number, number];\n mine[n] = n === 0 ? write : read;\n theirs.push(n === 0 ? read : write);\n stdio.push({ fd: n === 0 ? read : write });\n }\n }\n return stdio;\n}\n", "import type { DeviceMeta, KernelFdKind } from '../../kernel/fd-table.ts';\nimport type { SyncFsBridgeStat, SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport { JsCallError } from './js-kernel.ts';\n\nexport interface JsOpenOptions {\n read?: boolean;\n write?: boolean;\n append?: boolean;\n create?: boolean;\n exclusive?: boolean;\n truncate?: boolean;\n}\n\nexport type JsFdType = 'file' | 'pipe' | 'tty' | 'socket' | 'device' | 'directory';\n\nexport interface FdInfo {\n tty?: boolean;\n kind?: KernelFdKind;\n meta?: DeviceMeta | { dir: string };\n terminal?: string;\n}\n\nexport const CHUNK = 64 * 1024;\nexport const MAX_IO = 1024 * 1024;\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\n\nexport function typeOf(info: FdInfo): JsFdType {\n if (info.meta && 'dir' in info.meta) return 'directory';\n if (info.meta && 'device' in info.meta) return 'device';\n if (info.tty || info.kind === 'tty') return 'tty';\n if (info.kind === 'socket') return 'socket';\n return info.kind === 'file' ? 'file' : 'pipe';\n}\n\nfunction device(info: FdInfo): DeviceMeta | undefined {\n return info.meta && 'device' in info.meta ? info.meta : undefined;\n}\n\nexport function readDevice(\n info: FdInfo,\n max: number,\n random: (bytes: Uint8Array) => void\n): Uint8Array | undefined {\n if (typeOf(info) === 'directory') throw new JsCallError('EISDIR', 'read');\n const dev = device(info);\n if (!dev) return undefined;\n if (dev.access === 'write') throw new JsCallError('EBADF', 'read');\n if (dev.device === 'null') return new Uint8Array(0);\n const out = new Uint8Array(Math.min(max, CHUNK));\n if (dev.device === 'urandom') random(out);\n return out;\n}\n\nexport function writeDevice(info: FdInfo): boolean {\n if (typeOf(info) === 'directory') throw new JsCallError('EISDIR', 'write');\n const dev = device(info);\n if (!dev) return false;\n if (dev.access === 'read') throw new JsCallError('EBADF', 'write');\n if (dev.device === 'full') throw new JsCallError('ENOSPC', 'write');\n return true;\n}\n\nexport function brokenPipe(err: unknown, info: FdInfo): boolean {\n return err instanceof JsCallError && err.code === 'EPIPE' && typeOf(info) !== 'socket';\n}\n\nexport function written(r: SyncFsResult, fallback: number): number {\n return r.ok && r.kind === 'json' && typeof r.json === 'number' ? r.json : fallback;\n}\n\nexport function joined(parts: Uint8Array[], length: number): Uint8Array {\n if (parts.length === 1) return parts[0] as Uint8Array;\n const out = new Uint8Array(length);\n let at = 0;\n for (const part of parts) {\n out.set(part, at);\n at += part.length;\n }\n return out;\n}\n\nexport function fileWrite(fd: number, append: boolean, offset: number, body: Uint8Array) {\n return append\n ? { op: 'fd-write' as const, fd, body }\n : { op: 'fd-pwrite' as const, fd, offset, body };\n}\n\nexport function isExclusive(o: JsOpenOptions): boolean {\n return o.create === true && o.exclusive === true;\n}\n\nexport function absent(err: unknown): undefined {\n if (err instanceof JsCallError && err.code === 'ENOENT') return undefined;\n throw err;\n}\n\nexport function checkOpen(abs: string, o: JsOpenOptions, existing?: SyncFsBridgeStat): void {\n if (existing && isExclusive(o)) throw new JsCallError('EEXIST', abs);\n if (!existing && !o.create) throw new JsCallError('ENOENT', abs);\n if (existing?.isDirectory) throw new JsCallError('EISDIR', abs);\n}\n\nfunction flagsOf(o: JsOpenOptions): number {\n const write = o.write || o.append || o.truncate;\n const access = write ? (o.read ? O_RDWR : O_WRONLY) : 0;\n return access | (o.append ? O_APPEND : 0);\n}\n\nexport function openRequest(abs: string, o: JsOpenOptions) {\n return {\n op: 'fd-open-vfs' as const,\n path: abs,\n flags: flagsOf(o),\n position: 0,\n ...(isExclusive(o) ? { exclusive: true } : o.create ? { create: true } : { existing: true }),\n ...(o.truncate ? { truncate: true } : {}),\n };\n}\n\nexport function index(n: number, what: string): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new JsCallError('EINVAL', what);\n}\n", "import type { DeviceMeta } from '../../kernel/fd-table.ts';\nimport { parseSyncFsStat, type SyncFsBridgeStat } from '../../realm/sync-fs-wire.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport type { JsFile } from './js-context.ts';\nimport {\n type FdInfo,\n index,\n isExclusive,\n type JsOpenOptions,\n joined,\n MAX_IO,\n openRequest,\n} from './js-io.ts';\nimport { JsCallError } from './js-kernel.ts';\nimport type { JsSyncFile } from './js-sync.ts';\n\nexport type DevStep<T> = Generator<SyncSabRequestBody, T, unknown>;\n\nexport const DEV_READ_MAX = 64 * 1024 * 1024;\n\nconst DEVICES: readonly string[] = ['null', 'zero', 'full', 'random', 'urandom'];\nconst STDIO: readonly string[] = ['stdin', 'stdout', 'stderr'];\nconst SELF_FD = '/proc/self/fd';\nconst S_IFMT = 0o170000;\nconst DIR = 0o040000;\nconst LINK = 0o120000;\nconst CHAR = 0o020000;\nconst BORN = Date.now();\n\ntype DevNode =\n | { kind: 'dir'; mode: number }\n | { kind: 'device' }\n | { kind: 'tty' }\n | { kind: 'clipboard' }\n | { kind: 'terminal'; name: string; pts?: number }\n | { kind: 'link'; target: string; fd?: number }\n | { kind: 'fd'; fd: number };\n\ninterface TtyOwner {\n uid: number;\n gid: number;\n mode?: number;\n}\n\nexport function inDev(abs: string): boolean {\n return abs.startsWith('/dev') && (abs.length === 4 || abs[4] === '/');\n}\n\nfunction missing(path: string): never {\n throw new JsCallError('ENOENT', path);\n}\n\nfunction nodeStat(mode: number, size = 0, owner?: { uid: number; gid: number }): SyncFsBridgeStat {\n return {\n isFile: false,\n isDirectory: (mode & S_IFMT) === DIR,\n isSymbolicLink: (mode & S_IFMT) === LINK,\n size,\n mode,\n mtimeMs: BORN,\n atimeMs: BORN,\n ctimeMs: BORN,\n nlink: 1,\n uid: owner?.uid ?? 0,\n gid: owner?.gid ?? 0,\n };\n}\n\nfunction* lookup(abs: string): DevStep<DevNode> {\n if (abs === '/dev') return { kind: 'dir', mode: DIR | 0o755 };\n const name = abs.slice('/dev/'.length);\n if (DEVICES.includes(name)) return { kind: 'device' };\n if (name === 'tty') return { kind: 'tty' };\n if (name === 'clipboard') return { kind: 'clipboard' };\n const std = STDIO.indexOf(name);\n if (std >= 0) return { kind: 'link', target: `${SELF_FD}/${std}`, fd: std };\n if (name === 'fd') return { kind: 'link', target: SELF_FD };\n const fd = /^fd\\/(\\d+)$/.exec(name)?.[1];\n if (fd !== undefined) return { kind: 'fd', fd: Number(fd) };\n if (/^tty\\d+$/.test(name)) {\n const names = (yield { op: 'fd-tty-names' }) as string[];\n if (names.includes(abs)) return { kind: 'terminal', name: abs };\n }\n const pts = /^pts\\/(\\d+)$/.exec(name)?.[1];\n if (pts !== undefined) {\n const open = (yield { op: 'pty-list' }) as number[];\n if (open.includes(Number(pts))) return { kind: 'terminal', name: abs, pts: Number(pts) };\n }\n return missing(abs);\n}\n\nfunction* fdInfo(fd: number, path: string): DevStep<FdInfo> {\n try {\n return (yield { op: 'fd-info', fd }) as FdInfo;\n } catch (err) {\n if (err instanceof JsCallError && err.code === 'EBADF') return missing(path);\n throw err;\n }\n}\n\nfunction* pathStat(path: string): DevStep<SyncFsBridgeStat> {\n const s = parseSyncFsStat(yield { op: 'stat', path });\n if (!s) throw new JsCallError('EIO', 'stat');\n return s;\n}\n\nfunction* terminalStat(name: string): DevStep<SyncFsBridgeStat> {\n const owner = (yield { op: 'fd-tty-owner', name }) as TtyOwner | null;\n if (owner) return nodeStat(CHAR | (owner.mode ?? 0o620), 0, owner);\n return nodeStat(CHAR | (name.startsWith('/dev/pts/') ? 0o620 : 0o666));\n}\n\nfunction* fdStat(fd: number, path: string): DevStep<SyncFsBridgeStat> {\n const info = yield* fdInfo(fd, path);\n if (info.meta && 'dir' in info.meta) return yield* pathStat(info.meta.dir);\n if (info.kind === 'file') {\n const file = (yield { op: 'fd-vfs-stat', fd }) as { path: string; size: number; orphan?: true };\n if (file.orphan) return { ...nodeStat(0o100600, file.size), isFile: true };\n return yield* pathStat(file.path);\n }\n if (info.terminal) return yield* terminalStat(info.terminal);\n if (info.kind === 'device' || info.kind === 'tty' || info.kind === 'clipboard')\n return nodeStat(CHAR | 0o666);\n if (info.kind === 'socket') return nodeStat(0o140777);\n return nodeStat(0o010600);\n}\n\nfunction* fdTarget(fd: number, path: string): DevStep<string> {\n const info = yield* fdInfo(fd, path);\n if (info.meta && 'dir' in info.meta) return info.meta.dir;\n if (info.kind === 'file') return ((yield { op: 'fd-vfs-stat', fd }) as { path: string }).path;\n if (info.terminal) return info.terminal;\n if (info.meta && 'device' in info.meta) return `/dev/${(info.meta as DeviceMeta).device}`;\n if (info.kind === 'clipboard') return '/dev/clipboard';\n return `${info.kind === 'socket' ? 'socket' : 'pipe'}:[${fd}]`;\n}\n\nfunction linkStat(target: string): SyncFsBridgeStat {\n return nodeStat(LINK | 0o777, target.length);\n}\n\nexport function* devStat(abs: string, follow: boolean): DevStep<SyncFsBridgeStat> {\n const node = yield* lookup(abs);\n switch (node.kind) {\n case 'dir':\n return nodeStat(node.mode);\n case 'device':\n case 'tty':\n case 'clipboard':\n return nodeStat(CHAR | 0o666);\n case 'terminal':\n return yield* terminalStat(node.name);\n case 'link':\n if (!follow) return linkStat(node.target);\n return node.fd === undefined ? nodeStat(DIR | 0o555) : yield* fdStat(node.fd, abs);\n case 'fd':\n return follow ? yield* fdStat(node.fd, abs) : linkStat(yield* fdTarget(node.fd, abs));\n }\n}\n\nexport function* devExists(abs: string): DevStep<boolean> {\n try {\n yield* devStat(abs, true);\n return true;\n } catch (err) {\n if (err instanceof JsCallError) return false;\n throw err;\n }\n}\n\nexport function* devReadlink(abs: string): DevStep<string> {\n const node = yield* lookup(abs);\n if (node.kind === 'link') return node.target;\n if (node.kind === 'fd') return yield* fdTarget(node.fd, abs);\n throw new JsCallError('EINVAL', abs);\n}\n\nexport function* devReaddir(abs: string): DevStep<string[]> {\n if (abs === '/dev/fd') {\n const fds = (yield { op: 'fd-list' }) as Array<{ fd: number }>;\n return fds.map(({ fd }) => String(fd));\n }\n const node = yield* lookup(abs);\n if (node.kind !== 'dir') throw new JsCallError('ENOTDIR', abs);\n const names = (yield { op: 'fd-tty-names' }) as string[];\n const ttys = names.filter((n) => /^\\/dev\\/tty\\d+$/.test(n)).map((n) => n.slice(5));\n return [...DEVICES, 'clipboard', 'tty', 'fd', ...STDIO, ...ttys].sort();\n}\n\nexport interface DevOpened {\n fd: number;\n file: boolean;\n read: boolean;\n write: boolean;\n}\n\nfunction* aliasOf(\n fd: number,\n abs: string,\n o: JsOpenOptions\n): DevStep<Omit<DevOpened, 'read' | 'write'>> {\n const info = yield* fdInfo(fd, abs);\n const file = info.kind === 'file';\n if (file) {\n const at = (yield { op: 'fd-vfs-stat', fd }) as { path: string; orphan?: true };\n if (!at.orphan)\n return { fd: (yield openRequest(at.path, { ...o, create: false })) as number, file };\n }\n const copy = (yield { op: 'fd-dup', fd, min: 3 }) as number;\n if (file && o.truncate) {\n try {\n yield { op: 'fd-resize', fd: copy, size: 0 };\n } catch (err) {\n yield { op: 'fd-close', fd: copy };\n throw err;\n }\n }\n return { fd: copy, file };\n}\n\nfunction* opened(abs: string, o: JsOpenOptions): DevStep<Omit<DevOpened, 'read' | 'write'>> {\n const node = yield* lookup(abs);\n if (isExclusive(o)) throw new JsCallError('EEXIST', abs);\n switch (node.kind) {\n case 'device':\n return { fd: (yield openRequest(abs, { ...o, create: false })) as number, file: false };\n case 'tty':\n return { fd: (yield { op: 'fd-open-tty' }) as number, file: false };\n case 'clipboard': {\n const write = o.write === true || o.append === true || o.truncate === true;\n const flags = write ? (o.read === true ? 2 : 1) : 0;\n return { fd: (yield { op: 'fd-open-clipboard', flags }) as number, file: false };\n }\n case 'terminal': {\n const req =\n node.pts === undefined\n ? { op: 'fd-open-tty' as const, name: node.name }\n : { op: 'pty-slave-open' as const, n: node.pts, noctty: true };\n return { fd: (yield req) as number, file: false };\n }\n case 'fd':\n return yield* aliasOf(node.fd, abs, o);\n case 'link':\n if (node.fd !== undefined) return yield* aliasOf(node.fd, abs, o);\n throw new JsCallError('EISDIR', abs);\n case 'dir':\n throw new JsCallError('EISDIR', abs);\n }\n}\n\nexport function* devOpen(abs: string, o: JsOpenOptions): DevStep<DevOpened> {\n const write = o.write === true || o.append === true || o.truncate === true;\n return { ...(yield* opened(abs, o)), read: o.read === true || !write, write };\n}\n\nexport async function devAsync<T>(\n kernel: { json(req: SyncSabRequestBody): Promise<unknown> },\n step: DevStep<T>\n): Promise<T> {\n let next = step.next();\n while (!next.done) {\n let answer: { value: unknown } | { error: unknown };\n try {\n answer = { value: await kernel.json(next.value) };\n } catch (error) {\n answer = { error };\n }\n next = 'value' in answer ? step.next(answer.value) : step.throw(answer.error);\n }\n return next.value;\n}\n\nexport function devSync<T>(\n kernel: { json(req: SyncSabRequestBody): unknown },\n step: DevStep<T>\n): T {\n let next = step.next();\n while (!next.done) {\n let answer: { value: unknown } | { error: unknown };\n try {\n answer = { value: kernel.json(next.value) };\n } catch (error) {\n answer = { error };\n }\n next = 'value' in answer ? step.next(answer.value) : step.throw(answer.error);\n }\n return next.value;\n}\n\nfunction tooLarge(got: number): void {\n if (got > DEV_READ_MAX) throw new JsCallError('EFBIG', 'readFile');\n}\n\nexport interface StreamIo {\n read(fd: number, max: number): Promise<Uint8Array>;\n write(fd: number, data: Uint8Array): Promise<void>;\n close(fd: number): Promise<void>;\n}\n\nexport interface StreamSyncIo {\n read(fd: number, max: number): Uint8Array;\n write(fd: number, data: Uint8Array): void;\n close(fd: number): void;\n}\n\nfunction liveness(path: string) {\n let open = true;\n return {\n live: (): void => {\n if (!open) throw new JsCallError('EBADF', path);\n },\n end: (): void => {\n open = false;\n },\n };\n}\n\nexport interface StreamAccess {\n read: boolean;\n write: boolean;\n}\n\nfunction allowed(may: boolean, what: string): void {\n if (!may) throw new JsCallError('EBADF', what);\n}\n\nexport function streamFile(\n fd: number,\n path: string,\n io: StreamIo,\n access: StreamAccess\n): { file: JsFile; invalidate: () => void } {\n const { live, end } = liveness(path);\n const file: JsFile = {\n fd,\n path,\n async size() {\n live();\n return 0;\n },\n async read(position, length) {\n index(position, 'read');\n index(length, 'read');\n live();\n allowed(access.read, 'read');\n return length === 0 ? new Uint8Array(0) : io.read(fd, Math.min(length, MAX_IO));\n },\n async write(position, data) {\n index(position, 'write');\n live();\n allowed(access.write, 'write');\n await io.write(fd, data);\n return data.length;\n },\n async truncate(size) {\n live();\n index(size, 'truncate');\n throw new JsCallError('EINVAL', 'truncate');\n },\n sync: async () => live(),\n async close() {\n live();\n end();\n await io.close(fd);\n },\n };\n return { file, invalidate: end };\n}\n\nexport function streamSyncFile(\n fd: number,\n path: string,\n io: StreamSyncIo,\n access: StreamAccess\n): { file: JsSyncFile; invalidate: () => void } {\n const { live, end } = liveness(path);\n const file: JsSyncFile = {\n fd,\n path,\n size() {\n live();\n return 0;\n },\n read(position, length) {\n index(position, 'read');\n index(length, 'read');\n live();\n allowed(access.read, 'read');\n return length === 0 ? new Uint8Array(0) : io.read(fd, Math.min(length, MAX_IO));\n },\n write(position, data) {\n index(position, 'write');\n live();\n allowed(access.write, 'write');\n io.write(fd, data);\n return data.length;\n },\n truncate(size) {\n live();\n index(size, 'truncate');\n throw new JsCallError('EINVAL', 'truncate');\n },\n sync: () => live(),\n close() {\n live();\n end();\n io.close(fd);\n },\n };\n return { file, invalidate: end };\n}\n\nexport async function readWhole(file: JsFile): Promise<Uint8Array> {\n try {\n const parts: Uint8Array[] = [];\n let got = 0;\n for (;;) {\n const chunk = await file.read(got, MAX_IO);\n if (chunk.length === 0) return joined(parts, got);\n got += chunk.length;\n tooLarge(got);\n parts.push(chunk);\n }\n } finally {\n await file.close();\n }\n}\n\nexport function readWholeSync(file: JsSyncFile): Uint8Array {\n try {\n const parts: Uint8Array[] = [];\n let got = 0;\n for (;;) {\n const chunk = file.read(got, MAX_IO);\n if (chunk.length === 0) return joined(parts, got);\n got += chunk.length;\n tooLarge(got);\n parts.push(chunk);\n }\n } finally {\n file.close();\n }\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport { MAX_IO, written } from './js-io.ts';\nimport type { SyncCall } from './js-sync.ts';\n\nexport interface PendingWrite {\n fd: number;\n data: Uint8Array;\n at: number;\n len: number;\n op?: number;\n}\n\nexport interface SavedMode {\n terminal: string;\n fd: number;\n termios: unknown;\n}\n\nfunction json(r: SyncFsResult): unknown {\n return r.ok && r.kind === 'json' ? r.json : undefined;\n}\n\nfunction restoreMode(lane: SyncCall, { terminal, fd, termios }: SavedMode): void {\n const open = (json(lane({ op: 'fd-list' })) ?? []) as Array<{ fd: number; terminal?: string }>;\n const on = open.filter((entry) => entry.terminal === terminal);\n const at = (on.find((entry) => entry.fd === fd) ?? on[0])?.fd;\n if (at !== undefined) {\n lane({ op: 'tty-set', fd: at, termios } as SyncSabRequestBody);\n return;\n }\n const opened = json(lane({ op: 'fd-open-tty', name: terminal }));\n if (typeof opened !== 'number') return;\n lane({ op: 'tty-set', fd: opened, termios } as SyncSabRequestBody);\n lane({ op: 'fd-close', fd: opened });\n}\n\nfunction writeOut(lane: SyncCall, fd: number, data: Uint8Array): boolean {\n let at = 0;\n while (at < data.length) {\n const body = data.subarray(at, at + MAX_IO);\n const r = lane({ op: 'fd-write', fd, body });\n if (!r.ok && r.errno === 'EINTR') continue;\n if (!r.ok) return false;\n const n = written(r, body.length);\n if (n <= 0) return false;\n at += n;\n }\n return true;\n}\n\nfunction progress(result: SyncFsResult | null | undefined, len: number): number {\n if (!result) return len;\n if (result.ok) return written(result, len);\n return result.errno === 'EINTR' ? 0 : -1;\n}\n\nfunction settled(lane: SyncCall, writes: readonly PendingWrite[]): Map<PendingWrite, number> {\n const inFlight = writes.filter((w) => w.op !== undefined);\n const out = new Map<PendingWrite, number>();\n if (inFlight.length === 0) return out;\n const r = lane({ op: 'async-settle', ids: inFlight.map((w) => w.op as number) });\n const results = (r.ok && r.kind === 'json' ? r.json : []) as Array<SyncFsResult | null>;\n inFlight.forEach((w, i) => {\n const result = results[i];\n out.set(w, progress(result, w.len));\n });\n return out;\n}\n\nexport function exitAtOnce(\n lane: SyncCall,\n writes: readonly PendingWrite[],\n modes: readonly SavedMode[],\n status: number,\n last: SyncSabRequestBody = { op: 'proc-exit', status: status & 0xff }\n): never {\n const done = settled(lane, writes);\n const broken = new Set<number>();\n for (const w of writes) {\n const sent = done.get(w);\n if (sent === -1) broken.add(w.fd);\n if (broken.has(w.fd)) continue;\n if (!writeOut(lane, w.fd, w.data.subarray(w.at + (sent ?? 0)))) broken.add(w.fd);\n }\n for (const mode of modes) restoreMode(lane, mode);\n lane(last);\n const parked = new Int32Array(new SharedArrayBuffer(4));\n for (;;) Atomics.wait(parked, 0, 0);\n}\n", "import type { HttpHead } from '../../kernel/net/http-syscalls.ts';\nimport type { HeaderList } from '../../kernel/net/transport.ts';\nimport { JsCallError, type JsKernel } from './js-kernel.ts';\n\ninterface FetchTraits {\n manualRedirects: boolean;\n encodedBodies: boolean;\n maxRequestBody: number;\n}\n\ninterface Hop {\n url: string;\n method: string;\n headers: [string, string][];\n body: Uint8Array | undefined;\n}\n\nconst CHUNK = 64 * 1024;\nconst MAX_REDIRECTS = 20;\nconst NULL_BODY = new Set([101, 103, 204, 205, 304]);\nconst REDIRECTS = new Set([301, 302, 303, 307, 308]);\nconst BODY_HEADERS = new Set([\n 'content-encoding',\n 'content-language',\n 'content-location',\n 'content-type',\n 'content-length',\n]);\nconst DECODED = new Set(['gzip', 'x-gzip', 'deflate']);\nconst CREDENTIALS = new Set(['authorization', 'proxy-authorization', 'cookie', 'cookie2']);\n\nfunction withoutFragment(url: URL): string {\n url.hash = '';\n return url.href;\n}\n\nfunction failed(err: unknown): TypeError {\n return new TypeError('fetch failed', { cause: err });\n}\n\nfunction plain(status: number, text: string): Response {\n return new Response(text, {\n status,\n headers: { 'content-type': 'text/plain; charset=utf-8' },\n });\n}\n\nfunction rewrite(hop: Hop, status: number, location: string): Hop {\n const next = new URL(location, hop.url);\n if (next.protocol !== 'http:' && next.protocol !== 'https:') {\n throw failed(new JsCallError('EPROTONOSUPPORT', next.protocol));\n }\n const toGet =\n ((status === 301 || status === 302) && hop.method === 'POST') ||\n (status === 303 && hop.method !== 'GET' && hop.method !== 'HEAD');\n const crossOrigin = next.origin !== new URL(hop.url).origin;\n const headers = hop.headers.filter(\n ([name]) =>\n !(toGet && BODY_HEADERS.has(name.toLowerCase())) &&\n !(crossOrigin && CREDENTIALS.has(name.toLowerCase()))\n );\n return {\n url: withoutFragment(next),\n method: toGet ? 'GET' : hop.method,\n headers,\n body: toGet ? undefined : hop.body,\n };\n}\n\nconst OVER = Symbol('over');\nconst TOKEN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\nconst QUOTABLE = /^[\\t\\x20-\\x7e\\x80-\\xff]*$/;\nconst SPACE = /[\\t\\n\\r ]/;\nconst BASE64 = /; *base64$/i;\nconst SLICE = 0x8000;\n\nfunction isHex(byte: number | undefined): boolean {\n return byte !== undefined && /^[0-9A-Fa-f]$/.test(String.fromCharCode(byte));\n}\n\nfunction percentDecode(input: string): Uint8Array {\n const bytes = new TextEncoder().encode(input);\n const out = new Uint8Array(bytes.length);\n let at = 0;\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i] as number;\n if (byte === 0x25 && isHex(bytes[i + 1]) && isHex(bytes[i + 2])) {\n out[at++] = Number.parseInt(\n String.fromCharCode(bytes[i + 1] as number, bytes[i + 2] as number),\n 16\n );\n i += 2;\n } else out[at++] = byte;\n }\n return out.subarray(0, at);\n}\n\nfunction latin1(bytes: Uint8Array): string {\n let text = '';\n for (let at = 0; at < bytes.length; at += SLICE) {\n text += String.fromCharCode(...bytes.subarray(at, at + SLICE));\n }\n return text;\n}\n\nfunction quoted(input: string, from: number): [string, number] {\n let value = '';\n let at = from + 1;\n while (at < input.length) {\n const char = input[at++] as string;\n if (char === '\"') break;\n if (char !== '\\\\') value += char;\n else if (at < input.length) value += input[at++];\n else value += char;\n }\n return [value, at];\n}\n\nfunction parameter(text: string, from: number, params: Map<string, string>): number {\n let at = from + 1;\n while (SPACE.test(text[at] ?? '')) at++;\n let end = at;\n while (end < text.length && text[end] !== ';' && text[end] !== '=') end++;\n const name = text.slice(at, end).toLowerCase();\n if (text[end] !== '=') return end;\n const start = end + 1;\n let value: string;\n if (text[start] === '\"') {\n [value, at] = quoted(text, start);\n end = text.indexOf(';', at);\n } else {\n end = text.indexOf(';', start);\n value = text.slice(start, end < 0 ? undefined : end).replace(/[\\t\\n\\r ]+$/, '');\n if (!value) return end < 0 ? text.length : end;\n }\n if (end < 0) end = text.length;\n if (TOKEN.test(name) && QUOTABLE.test(value) && !params.has(name)) {\n params.set(name, value);\n }\n return end;\n}\n\nfunction mimeType(input: string): string | undefined {\n const text = input.replace(/^[\\t\\n\\r ]+|[\\t\\n\\r ]+$/g, '');\n const slash = text.indexOf('/');\n const semi = text.indexOf(';', slash);\n const type = text.slice(0, slash);\n const subtype = text.slice(slash + 1, semi < 0 ? undefined : semi).replace(/[\\t\\n\\r ]+$/, '');\n if (slash < 0 || !TOKEN.test(type) || !TOKEN.test(subtype)) return undefined;\n const params = new Map<string, string>();\n for (let at = semi < 0 ? text.length : semi; at < text.length; ) at = parameter(text, at, params);\n let out = `${type}/${subtype}`.toLowerCase();\n for (const [name, value] of params) {\n out += `;${name}=${TOKEN.test(value) ? value : `\"${value.replace(/[\"\\\\]/g, '\\\\$&')}\"`}`;\n }\n return out;\n}\n\nfunction dataResponse(request: Request): Response {\n const url = withoutFragment(new URL(request.url));\n const rest = url.slice('data:'.length);\n const comma = rest.indexOf(',');\n if (comma < 0) throw failed(new JsCallError('EINVAL', 'a data: URL without a comma'));\n let type = rest.slice(0, comma).replace(/^[\\t\\n\\f\\r ]+|[\\t\\n\\f\\r ]+$/g, '');\n let body = percentDecode(rest.slice(comma + 1));\n const base64 = BASE64.exec(type);\n if (base64) {\n type = type.slice(0, base64.index);\n let binary: string;\n try {\n binary = atob(latin1(body));\n } catch {\n throw failed(new JsCallError('EINVAL', 'a data: URL whose base64 does not decode'));\n }\n body = Uint8Array.from(binary, (c) => c.charCodeAt(0));\n }\n if (type.startsWith(';')) type = `text/plain${type}`;\n const response = new Response(\n request.method === 'HEAD' ? null : (body as Uint8Array<ArrayBuffer>),\n {\n status: 200,\n statusText: 'OK',\n headers: { 'content-type': mimeType(type) ?? 'text/plain;charset=US-ASCII' },\n }\n );\n return withMeta(response, url, false);\n}\n\nfunction withMeta(response: Response, url: string, redirected: boolean): Response {\n const clone = response.clone.bind(response);\n Object.defineProperty(response, 'url', { value: url });\n Object.defineProperty(response, 'redirected', { value: redirected });\n Object.defineProperty(response, 'clone', { value: () => withMeta(clone(), url, redirected) });\n return response;\n}\n\nfunction bytesOf(chunk: unknown): Uint8Array {\n if (typeof chunk === 'string') return new TextEncoder().encode(chunk);\n if (chunk instanceof ArrayBuffer) return new Uint8Array(chunk);\n if (ArrayBuffer.isView(chunk)) {\n return new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n }\n throw failed(new TypeError('a request body chunk must be bytes or a string'));\n}\n\nasync function bodyOf(\n request: Request,\n cap: number,\n signal: AbortSignal\n): Promise<Uint8Array | undefined | typeof OVER> {\n signal.throwIfAborted();\n if (!request.body || request.method === 'GET' || request.method === 'HEAD') return undefined;\n const reader = request.body.getReader();\n const stop = (): void => void reader.cancel(signal.reason).catch(() => undefined);\n signal.addEventListener('abort', stop, { once: true });\n const parts: Uint8Array[] = [];\n let length = 0;\n try {\n for (;;) {\n const next = await reader.read().catch((err: unknown) => {\n throw signal.aborted ? signal.reason : failed(err);\n });\n signal.throwIfAborted();\n if (next.done) break;\n const chunk = bytesOf(next.value);\n length += chunk.length;\n if (length > cap) {\n reader.cancel().catch(() => undefined);\n return OVER;\n }\n parts.push(chunk);\n }\n } finally {\n signal.removeEventListener('abort', stop);\n }\n if (length === 0) return undefined;\n const out = new Uint8Array(length);\n let at = 0;\n for (const part of parts) {\n out.set(part, at);\n at += part.length;\n }\n return out;\n}\n\nexport function fetchOp(kernel: JsKernel) {\n let traits: Promise<FetchTraits> | undefined;\n const traitsOf = (): Promise<FetchTraits> => {\n traits ??= kernel.json({ op: 'net-traits' }) as Promise<FetchTraits>;\n traits.catch(() => {\n traits = undefined;\n });\n return traits;\n };\n\n const close = (handle: number): Promise<unknown> => kernel.raw({ op: 'net-close', handle });\n\n const send = async (hop: Hop, signal: AbortSignal): Promise<HttpHead> => {\n signal.throwIfAborted();\n const handle = (await kernel.json({\n op: 'net-open',\n url: hop.url,\n method: hop.method,\n headers: hop.headers,\n ...(hop.body ? { body: hop.body } : {}),\n })) as number;\n try {\n const r = await kernel.blocking({ op: 'net-head', handle }, signal);\n signal.throwIfAborted();\n return (r.ok && r.kind === 'json' ? r.json : undefined) as HttpHead;\n } catch (err) {\n await close(handle);\n throw signal.aborted ? signal.reason : failed(err);\n }\n };\n\n const body = (handle: number, signal: AbortSignal): ReadableStream<Uint8Array> => {\n let aborted: (() => void) | undefined;\n const settle = (): void => {\n if (aborted) signal.removeEventListener('abort', aborted);\n };\n return new ReadableStream<Uint8Array>(\n {\n start(controller) {\n aborted = () => {\n controller.error(signal.reason);\n void close(handle);\n };\n signal.addEventListener('abort', aborted, { once: true });\n },\n async pull(controller) {\n let r: Awaited<ReturnType<JsKernel['blocking']>>;\n try {\n signal.throwIfAborted();\n r = await kernel.blocking({ op: 'net-read', handle, max: CHUNK }, signal);\n } catch (err) {\n settle();\n await close(handle);\n throw signal.aborted ? signal.reason : failed(err);\n }\n const bytes = r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n if (bytes.length > 0) {\n controller.enqueue(bytes);\n return;\n }\n settle();\n controller.close();\n await close(handle);\n },\n cancel: async () => {\n settle();\n await close(handle);\n },\n },\n { highWaterMark: 0 }\n );\n };\n\n const respond = (\n head: HttpHead,\n method: string,\n redirected: boolean,\n encoded: boolean,\n signal: AbortSignal\n ): Response => {\n if (head.status < 200 || head.status > 599) {\n void close(head.handle);\n throw failed(new JsCallError('EPROTO', `status ${head.status}`));\n }\n const empty = method === 'HEAD' || NULL_BODY.has(head.status);\n if (empty) void close(head.handle);\n const headers = new Headers(head.headers as HeaderList as [string, string][]);\n let stream: ReadableStream<Uint8Array> | null = empty ? null : body(head.handle, signal);\n const coding = headers.get('content-encoding')?.trim().toLowerCase();\n if (stream && encoded && coding && DECODED.has(coding)) {\n const format = coding === 'deflate' ? 'deflate' : 'gzip';\n stream = stream.pipeThrough(\n new DecompressionStream(format) as unknown as TransformStream<Uint8Array, Uint8Array>\n );\n headers.delete('content-encoding');\n headers.delete('content-length');\n }\n const response = new Response(stream, {\n status: head.status,\n statusText: head.statusText,\n headers,\n });\n return withMeta(response, head.url, redirected);\n };\n\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const request = new Request(input, init);\n const { signal } = request;\n signal.throwIfAborted();\n const { protocol } = new URL(request.url);\n if (protocol === 'data:') return dataResponse(request);\n if (protocol !== 'http:' && protocol !== 'https:') {\n throw failed(new JsCallError('EPROTONOSUPPORT', protocol));\n }\n const known = await traitsOf().catch((err: unknown) => {\n throw failed(err);\n });\n if (!known.manualRedirects && request.redirect !== 'follow') {\n throw failed(new JsCallError('ENOTSUP', `redirect: ${request.redirect}`));\n }\n const url = withoutFragment(new URL(request.url));\n const bytes = await bodyOf(request, known.maxRequestBody, signal);\n if (bytes === OVER) {\n return withMeta(plain(413, `request body over ${known.maxRequestBody} bytes`), url, false);\n }\n let hop: Hop = {\n url,\n method: request.method,\n headers: [...request.headers],\n body: bytes,\n };\n for (let hops = 0; ; hops++) {\n const head = await send(hop, signal);\n const location = head.headers.find(([name]) => name.toLowerCase() === 'location')?.[1];\n const follow =\n known.manualRedirects &&\n REDIRECTS.has(head.status) &&\n location !== undefined &&\n request.redirect !== 'manual';\n if (!follow) {\n const redirected = hops > 0 || head.redirected === true;\n return respond(head, hop.method, redirected, known.encodedBodies, signal);\n }\n await close(head.handle);\n if (request.redirect === 'error') throw failed(new JsCallError('EREDIRECT', hop.url));\n if (hops >= MAX_REDIRECTS) throw failed(new JsCallError('ELOOP', hop.url));\n hop = rewrite(hop, head.status, location);\n }\n };\n}\n", "import { E } from '../wasi/wasi-abi.ts';\nimport { JsCallError, type JsKernel } from './js-kernel.ts';\n\nexport interface JsAddress {\n host: string;\n port: number;\n}\n\nexport interface JsConnection {\n readonly fd: number;\n readonly local: JsAddress;\n readonly remote: JsAddress;\n readonly readable: ReadableStream<Uint8Array>;\n readonly writable: WritableStream<Uint8Array>;\n close(): Promise<void>;\n}\n\nexport interface JsListener extends AsyncIterable<JsConnection> {\n readonly fd: number;\n readonly host: string;\n readonly port: number;\n accept(options?: { signal?: AbortSignal }): Promise<JsConnection>;\n close(): Promise<void>;\n}\n\nexport interface JsListenOptions {\n port?: number;\n host?: string;\n backlog?: number;\n}\n\nexport interface JsConnectOptions {\n host?: string;\n port: number;\n signal?: AbortSignal;\n}\n\nexport interface JsNet {\n listen(options?: JsListenOptions): Promise<JsListener>;\n connect(options: JsConnectOptions): Promise<JsConnection>;\n}\n\nexport interface NetIo {\n read(fd: number, max: number | undefined, signal: AbortSignal): Promise<Uint8Array>;\n send(fd: number, data: Uint8Array, signal: AbortSignal): Promise<void>;\n close(fd: number): Promise<void>;\n}\n\ninterface InetAddr {\n family: 'inet';\n host: string;\n port: number;\n}\n\nconst SHUT_RD = 0;\nconst SHUT_WR = 1;\nconst IPV4 = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\nconst NEVER = new AbortController().signal;\nconst SOL_SOCKET = 1;\nconst SO_ERROR = 4;\n\nfunction errnoName(errno: number): string {\n const found = Object.entries(E).find(([, n]) => n === errno);\n return found ? `E${found[0]}` : 'EIO';\n}\n\nfunction addressOf(addr: unknown): JsAddress {\n const inet = addr as InetAddr;\n return { host: inet.host, port: inet.port };\n}\n\nfunction port(n: number): number {\n if (!Number.isInteger(n) || n < 0 || n > 65535) throw new JsCallError('EINVAL', `port ${n}`);\n return n;\n}\n\nexport function netOps(kernel: JsKernel, io: NetIo): JsNet {\n const name = async (fd: number, peer: boolean): Promise<JsAddress> =>\n addressOf(await kernel.json({ op: 'sock-name', fd, peer }));\n\n const connection = async (fd: number): Promise<JsConnection> => {\n const [local, remote] = [await name(fd, false), await name(fd, true)];\n const stop = new AbortController();\n let closed: Promise<void> | undefined;\n const close = (): Promise<void> => {\n stop.abort(new JsCallError('EBADF', 'socket closed'));\n closed ??= io.close(fd);\n return closed;\n };\n const shut = (how: number): Promise<unknown> => kernel.raw({ op: 'sock-shutdown', fd, how });\n const readable = new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n const chunk = await io.read(fd, undefined, stop.signal);\n if (chunk.length > 0) controller.enqueue(chunk);\n else controller.close();\n },\n cancel: async () => void (await shut(SHUT_RD)),\n },\n { highWaterMark: 0 }\n );\n const writable = new WritableStream<Uint8Array>({\n write: (chunk, controller) =>\n io.send(fd, chunk, AbortSignal.any([controller.signal, stop.signal])),\n close: async () => void (await shut(SHUT_WR)),\n abort: () => close(),\n });\n return { fd, local, remote, readable, writable, close };\n };\n\n const resolve = async (host: string, signal: AbortSignal): Promise<string> => {\n if (IPV4.test(host)) return host;\n const r = await kernel.blocking({ op: 'sock-resolve', name: host, family: 4 }, signal);\n return ((r.ok && r.kind === 'json' ? r.json : []) as string[])[0] as string;\n };\n\n const opened = async <T>(use: (fd: number) => Promise<T>): Promise<T> => {\n const fd = (await kernel.json({ op: 'sock-open', domain: 'inet' })) as number;\n try {\n return await use(fd);\n } catch (err) {\n await io.close(fd);\n throw err;\n }\n };\n\n const listener = (fd: number, at: JsAddress): JsListener => {\n const stop = new AbortController();\n const accept = async (options: { signal?: AbortSignal } = {}): Promise<JsConnection> => {\n const signal = AbortSignal.any([options.signal ?? NEVER, stop.signal]);\n for (;;) {\n signal.throwIfAborted();\n const r = await kernel.raw({ op: 'sock-accept', fd, nonblock: true });\n if (r.ok) return connection(((r.kind === 'json' ? r.json : {}) as { fd: number }).fd);\n if (r.errno !== 'EAGAIN') throw new JsCallError(r.errno, 'accept');\n await kernel.blocking({ op: 'fd-select', read: [fd], write: [], timeoutMs: -1 }, signal);\n }\n };\n return {\n fd,\n ...at,\n accept,\n async close() {\n stop.abort(new JsCallError('EBADF', 'listener closed'));\n await io.close(fd);\n },\n async *[Symbol.asyncIterator]() {\n for (;;) {\n try {\n yield await accept();\n } catch (err) {\n if (stop.signal.aborted) return;\n throw err;\n }\n }\n },\n };\n };\n\n return {\n listen: (options = {}) =>\n opened(async (fd) => {\n const addr: InetAddr = {\n family: 'inet',\n host: options.host ?? '127.0.0.1',\n port: port(options.port ?? 0),\n };\n await kernel.call({ op: 'sock-bind', fd, addr });\n await kernel.call({ op: 'sock-listen', fd, backlog: options.backlog ?? 128 });\n return listener(fd, await name(fd, false));\n }),\n connect: async (options) => {\n const signal = options.signal ?? NEVER;\n signal.throwIfAborted();\n const host = options.host ?? '127.0.0.1';\n if (host.includes(':')) throw new JsCallError('EADDRNOTAVAIL', host);\n const addr: InetAddr = {\n family: 'inet',\n host: await resolve(host, signal),\n port: port(options.port),\n };\n return opened(async (fd) => {\n const r = await kernel.raw({ op: 'sock-connect', fd, addr, nonblock: true });\n if (!r.ok && r.errno !== 'EINPROGRESS') throw new JsCallError(r.errno, 'connect');\n await kernel.blocking({ op: 'fd-select', read: [], write: [fd], timeoutMs: -1 }, signal);\n const failed = (await kernel.json({\n op: 'sock-getopt',\n fd,\n level: SOL_SOCKET,\n name: SO_ERROR,\n })) as number;\n if (failed !== 0) throw new JsCallError(errnoName(failed), 'connect');\n return connection(fd);\n });\n },\n };\n}\n", "import { argv0Of, groupOf } from './js-children.ts';\nimport { JsCallError } from './js-kernel.ts';\nimport type { JsSyncKernel } from './js-sync.ts';\n\nexport type JsRunStdio = 'pipe' | 'ignore' | 'inherit' | number;\n\nexport interface JsRunOptions {\n argv: readonly string[];\n argv0?: string;\n env?: Readonly<Record<string, string>>;\n cwd?: string;\n pgid?: number;\n session?: boolean;\n input?: Uint8Array | string;\n stdin?: JsRunStdio;\n stdout?: JsRunStdio;\n stderr?: JsRunStdio | 'stdout';\n maxBuffer?: number;\n timeout?: number;\n killSignal?: number | `SIG${string}`;\n}\n\nexport interface JsRunResult {\n pid: number;\n status: number | null;\n signal?: number;\n stdout?: Uint8Array;\n stderr?: Uint8Array;\n error?: { code: string };\n}\n\nexport interface RunDefaults {\n env: Readonly<Record<string, string>>;\n cwd: string;\n resolve(path: string): string;\n signal(name: number | `SIG${string}`): number;\n}\n\ninterface Outcome {\n pid: number;\n status: number | null;\n signal?: number;\n error?: { code: string };\n out: number;\n err: number;\n}\n\nconst encoder = new TextEncoder();\n\nconst STDIO = new Set<unknown>(['pipe', 'ignore', 'inherit']);\n\nfunction stdioOf(how: JsRunStdio | undefined): JsRunStdio {\n if (how === undefined) return 'pipe';\n if (typeof how === 'number' && Number.isInteger(how) && how >= 0) return how;\n if (!STDIO.has(how)) throw new JsCallError('EINVAL', 'run');\n return how;\n}\n\nfunction stderrOf(how: JsRunStdio | 'stdout' | undefined): JsRunStdio | 'stdout' {\n return how === 'stdout' ? how : stdioOf(how);\n}\n\nfunction limit(value: number | undefined): number | undefined {\n if (value === undefined || value === Number.POSITIVE_INFINITY) return value;\n if (!(value >= 0)) throw new JsCallError('EINVAL', 'run');\n return value;\n}\n\nexport function decodeRun(\n bytes: Uint8Array,\n stdout: JsRunStdio,\n stderr: JsRunStdio | 'stdout'\n): JsRunResult {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const size = view.getUint32(0, true);\n const outcome = JSON.parse(new TextDecoder().decode(bytes.subarray(4, 4 + size))) as Outcome;\n const out = bytes.slice(4 + size, 4 + size + outcome.out);\n const err = bytes.slice(4 + size + outcome.out, 4 + size + outcome.out + outcome.err);\n return {\n pid: outcome.pid,\n status: outcome.status,\n ...(outcome.signal !== undefined ? { signal: outcome.signal } : {}),\n ...(stdout === 'pipe' ? { stdout: out } : {}),\n ...(stderr === 'pipe' ? { stderr: err } : {}),\n ...(outcome.error ? { error: outcome.error } : {}),\n };\n}\n\nexport function runSync(kernel: JsSyncKernel, d: RunDefaults, o: JsRunOptions): JsRunResult {\n const [file] = o.argv;\n if (file === undefined) throw new JsCallError('EINVAL', 'run');\n const group = groupOf(o, 'run');\n const named = argv0Of(o.argv0, 'run');\n const stdout = stdioOf(o.stdout);\n const stderr = stderrOf(o.stderr);\n const input = typeof o.input === 'string' ? encoder.encode(o.input) : o.input;\n const maxBuffer = limit(o.maxBuffer);\n const timeout = limit(o.timeout);\n const bytes = kernel.bytes({\n op: 'proc-run',\n file,\n argv: [...o.argv],\n ...named,\n env: { ...(o.env ?? d.env) },\n cwd: o.cwd === undefined ? d.cwd : d.resolve(o.cwd),\n ...group,\n stdin: stdioOf(o.stdin),\n ...(input ? { input } : {}),\n stdout,\n stderr,\n ...(maxBuffer !== undefined && maxBuffer !== Number.POSITIVE_INFINITY ? { maxBuffer } : {}),\n ...(maxBuffer === Number.POSITIVE_INFINITY ? { maxBuffer: Number.MAX_SAFE_INTEGER } : {}),\n ...(timeout !== undefined && timeout !== Number.POSITIVE_INFINITY\n ? { timeoutMs: timeout }\n : {}),\n killSignal: d.signal(o.killSignal ?? 'SIGTERM'),\n });\n return decodeRun(bytes, stdout, stderr);\n}\n", "import { rawWait } from '../kernel/cpu-clock.ts';\nimport {\n parseSyncFsStat,\n parseSyncFsUsage,\n SYNC_FS_OPS,\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsBridgeStat,\n type SyncFsFileIo,\n type SyncFsPosixBridge,\n type SyncFsResult,\n syncError,\n} from './sync-fs-wire.ts';\nimport {\n decodeSabResult,\n loadU53,\n publishMemory,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_OFFSET_HI,\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_I_TOTAL_HI,\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, transfer?: Transferable[]): void;\n}\n\nexport interface SyncSabTransport {\n call(\n req: SyncSabRequestBody,\n timeoutMs: number,\n label: string,\n transfer?: Transferable[]\n ): 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\nconst PATH_OPS: ReadonlySet<string> = new Set(SYNC_FS_OPS);\nlet calls = 0;\n\nexport function syncCallCount(): number {\n return calls;\n}\n\nexport function createSyncSabTransport(\n sab: SharedArrayBuffer,\n port: SabPostLike,\n deps: { wait?: AtomicsWaitLike; now?: () => number; memory?: () => number } = {}\n): SyncSabTransport {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const wait: AtomicsWaitLike = deps.wait ?? ((a, i, v, t) => rawWait(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, transfer = []): SyncFsResult {\n if (deps.memory) publishMemory(sab, deps.memory());\n const id = ++seq;\n calls += Number(!PATH_OPS.has(req.op));\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 if (offset === 0 && transfer.length > 0) port.postMessage(msg, transfer);\n else port.postMessage(msg);\n } catch {\n throw syncError('EIO', label);\n }\n awaitReady(id, deadline, label);\n const total = loadU53(header, SAB_I_TOTAL, SAB_I_TOTAL_HI);\n const chunk = Atomics.load(header, SAB_I_CHUNK);\n const at = loadU53(header, SAB_I_OFFSET, SAB_I_OFFSET_HI);\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; owners?: boolean } = {}\n): SyncFsPosixBridge {\n const timeoutMs = opts.timeoutMs ?? SYNC_FS_REQUEST_TIMEOUT_MS;\n let identity: { identity: true } | Record<string, never> = {};\n let last: SyncFsBridgeStat | null = null;\n\n function run(req: SyncSabRequestBody, path: string, transfer?: Transferable[]): SyncFsResult {\n last = null;\n const result = transport.call(req, timeoutMs, `sync-sab bridge, '${path}'`, transfer);\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 const changing = (req: SyncSabRequestBody, path: string, transfer?: Transferable[]): void => {\n const r = run({ ...req, ...identity }, path, transfer);\n if (r.ok && r.kind === 'json') last = parseSyncFsStat(r.json);\n };\n\n const io = (id: { handle?: number }): SyncFsFileIo => ({\n readFile: (path) => bytes({ op: 'read', path, ...id }, path),\n writeFile: (path, data, open) => {\n changing({ op: 'write', path, body: data, ...(open ? { mode: 1 } : {}), ...id }, path);\n },\n pread: (path, offset, length, version) =>\n bytes({ op: 'pread', path, offset, length, ...(version ? { version } : {}), ...id }, path),\n pwrite: (path, offset, body, transfer) => {\n const whole = body.byteOffset === 0 && body.byteLength === body.buffer.byteLength;\n const owned = transfer && whole && body.buffer instanceof ArrayBuffer;\n const transferred = owned ? [body.buffer as ArrayBuffer] : [];\n changing({ op: 'pwrite', path, offset, body, ...id }, path, transferred);\n },\n truncate: (path, length) => {\n changing({ op: 'truncate', path, length, ...id }, path);\n },\n });\n\n return {\n ...io({}),\n pinned: (handle) => io({ handle }),\n kept: (handle) => json({ op: 'kept', path: '/', handle }, '/') === true,\n keptStat: (handle) => {\n const s = parseSyncFsStat(json({ op: 'stat', path: '/', handle }, '/'));\n if (!s) throw errnoError('EIO', '/');\n return s;\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, mode) => {\n run({ op: 'mkdir', path, exclusive: true, ...(mode !== undefined ? { mode } : {}) }, 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 link: (from, to, follow) => {\n run({ op: 'link', path: from, arg2: to, ...(follow ? { mode: 1 } : {}) }, 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 changing({ op: 'chmod', path, mode }, path);\n },\n utimes: (path, atimeMs, mtimeMs, now) => {\n changing({ op: 'utimes', path, atimeMs, mtimeMs, ...(now ? { now } : {}) }, path);\n },\n identify: () => {\n identity = { identity: true };\n },\n identified: () => last,\n lutimes: (path, atimeMs, mtimeMs, now) => {\n run({ op: 'lutimes', path, atimeMs, mtimeMs, ...(now ? { now } : {}) }, path);\n },\n create: (path, mode) => {\n run({ op: 'create', path, ...(mode !== undefined ? { mode } : {}) }, path);\n },\n chown: (path, uid, gid, follow) => {\n const ids = { ...(uid !== undefined ? { uid } : {}), ...(gid !== undefined ? { gid } : {}) };\n changing({ op: follow ? 'chown' : 'lchown', path, ...ids }, path);\n },\n ...(opts.owners ? { owners: true } : {}),\n access: (path, mode, kind = 'access', nofollow) => {\n run({ op: 'access', path, mode, arg2: kind, ...(nofollow ? { nofollow } : {}) }, path);\n },\n hold: (path, held, open, handle, want = 0) => {\n const mode = (held ? 1 : 0) | (open ? 2 : 0);\n if (mode === 3) return json({ op: 'hold', path, mode: mode | want }, path) as number;\n run({ op: 'hold', path, mode, ...(handle !== undefined ? { handle } : {}) }, path);\n return undefined;\n },\n statfs: (path = '/') => parseSyncFsUsage(json({ op: 'statfs', path }, path)),\n };\n}\n", "import type { JsLane } from '../../kernel/protocol.ts';\nimport { SIG } from '../../kernel/signals.ts';\nimport {\n parseSyncFsStat,\n type SyncFsBridgeStat,\n type SyncFsResult,\n} from '../../realm/sync-fs-wire.ts';\nimport { createSyncSabTransport } from '../../realm/sync-sab-bridge.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport {\n devExists,\n devOpen,\n devReaddir,\n devReadlink,\n devStat,\n devSync,\n inDev,\n readWholeSync,\n streamSyncFile,\n} from './js-dev.ts';\nimport {\n absent,\n brokenPipe,\n CHUNK,\n checkOpen,\n type FdInfo,\n fileWrite,\n index,\n isExclusive,\n type JsOpenOptions,\n joined,\n MAX_IO,\n openRequest,\n readDevice,\n writeDevice,\n written,\n} from './js-io.ts';\nimport { callError, JsCallError, type JsKernel } from './js-kernel.ts';\nimport type { JsRunOptions, JsRunResult } from './js-run.ts';\n\nexport type SyncCall = (req: SyncSabRequestBody) => SyncFsResult;\n\nexport interface JsSyncFile {\n readonly fd: number;\n readonly path: string;\n size(): number;\n read(position: number, length: number): Uint8Array;\n write(position: number, data: Uint8Array): number;\n truncate(size: number): void;\n sync(): void;\n close(): void;\n}\n\nexport interface JsSyncContext {\n run(options: JsRunOptions): JsRunResult;\n exit(status?: number): never;\n kill(pid: number, signal?: number | `SIG${string}`): void;\n read(fd: number, max?: number): Uint8Array;\n write(fd: number, data: Uint8Array | string): void;\n close(fd: number): void;\n open(path: string, options?: JsOpenOptions): JsSyncFile;\n fs: {\n stat(path: string): SyncFsBridgeStat;\n lstat(path: string): SyncFsBridgeStat;\n exists(path: string): boolean;\n readdir(path: string): string[];\n mkdir(path: string): void;\n rm(path: string): void;\n unlink(path: string): void;\n rename(from: string, to: string): void;\n link(from: string, to: string): void;\n symlink(target: string, path: string): void;\n readlink(path: string): string;\n readFile(path: string): Uint8Array;\n writeFile(path: string, data: Uint8Array | string): void;\n };\n}\n\nexport interface SyncShared {\n pid: number;\n resolve(path: string): string;\n random(bytes: Uint8Array): void;\n infos: Map<number, FdInfo>;\n handles: Map<number, () => void>;\n}\n\nconst encoder = new TextEncoder();\n\nexport const noLane: SyncCall = () => ({ ok: false, errno: 'ENOSYS', message: 'no sync lane' });\n\nexport function laneOf(lane: JsLane | undefined): SyncCall {\n if (!lane) return noLane;\n const transport = createSyncSabTransport(lane.sab, lane.port);\n return (req) => transport.call(req, Number.POSITIVE_INFINITY, req.op);\n}\n\nexport class JsSyncKernel {\n private readonly lane: SyncCall;\n private readonly kernel: Pick<JsKernel, 'deliver'>;\n private readonly unwind: () => void;\n\n constructor(lane: SyncCall, kernel: Pick<JsKernel, 'deliver'>, unwind: () => void = () => {}) {\n this.lane = lane;\n this.kernel = kernel;\n this.unwind = unwind;\n }\n\n raw(req: SyncSabRequestBody): SyncFsResult {\n this.unwind();\n const result = this.lane(req);\n this.kernel.deliver();\n this.unwind();\n return result;\n }\n\n call(req: SyncSabRequestBody): SyncFsResult {\n const result = this.raw(req);\n if (!result.ok) throw callError(result, req.op);\n return result;\n }\n\n json(req: SyncSabRequestBody): unknown {\n const result = this.call(req);\n return result.ok && result.kind === 'json' ? result.json : undefined;\n }\n\n bytes(req: SyncSabRequestBody): Uint8Array {\n const result = this.call(req);\n return result.ok && result.kind === 'bytes' ? result.bytes : new Uint8Array(0);\n }\n\n blocking(req: SyncSabRequestBody): SyncFsResult {\n for (;;) {\n const result = this.raw(req);\n if (result.ok) return result;\n if (result.errno !== 'EINTR') throw callError(result, req.op);\n }\n }\n}\n\nexport function syncOps(\n kernel: JsSyncKernel,\n shared: SyncShared\n): Omit<JsSyncContext, 'run' | 'exit' | 'kill'> {\n const { infos, handles, resolve } = shared;\n\n const info = (fd: number): FdInfo => {\n const known = infos.get(fd);\n if (known) return known;\n const got = kernel.json({ op: 'fd-info', fd }) as FdInfo;\n infos.set(fd, got);\n return got;\n };\n\n const read = (fd: number, max = CHUNK): Uint8Array => {\n index(max, 'read');\n const emulated = readDevice(info(fd), max, shared.random);\n if (emulated) return emulated;\n const r = kernel.blocking({ op: 'fd-read', fd, max: Math.min(max, MAX_IO) });\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n };\n\n const write = (fd: number, data: Uint8Array | string): void => {\n const bytes = typeof data === 'string' ? encoder.encode(data) : data;\n const i = info(fd);\n if (writeDevice(i)) return;\n let at = 0;\n while (at < bytes.length) {\n const body = bytes.subarray(at, at + MAX_IO);\n try {\n at += written(kernel.blocking({ op: 'fd-write', fd, body }), body.length);\n } catch (err) {\n if (brokenPipe(err, i)) kernel.call({ op: 'proc-kill', pid: shared.pid, sig: SIG.PIPE });\n throw err;\n }\n }\n };\n\n const statOf = (op: 'stat' | 'lstat', path: string): SyncFsBridgeStat => {\n const abs = resolve(path);\n if (inDev(abs)) return devSync(kernel, devStat(abs, op === 'stat'));\n kernel.call({ op: 'fd-path-flush', path: abs });\n const s = parseSyncFsStat(kernel.json({ op, path: abs }));\n if (!s) throw new JsCallError('EIO', op);\n return s;\n };\n\n const openDev = (abs: string, options: JsOpenOptions): JsSyncFile => {\n const { fd, file, ...access } = devSync(kernel, devOpen(abs, options));\n const forget = () => {\n infos.delete(fd);\n handles.delete(fd);\n };\n if (file) infos.set(fd, { kind: 'file' });\n const close = (n: number) => {\n forget();\n kernel.call({ op: 'fd-close', fd: n });\n };\n const handle = file\n ? syncFile(kernel, fd, abs, options.append === true, forget)\n : streamSyncFile(fd, abs, { read: (n, max) => read(n, max), write, close }, access);\n handles.set(fd, handle.invalidate);\n return handle.file;\n };\n\n const open = (path: string, options: JsOpenOptions = {}): JsSyncFile => {\n const abs = resolve(path);\n if (inDev(abs)) return openDev(abs, options);\n let existing: SyncFsBridgeStat | undefined;\n try {\n existing = statOf(isExclusive(options) ? 'lstat' : 'stat', abs);\n } catch (err) {\n existing = absent(err);\n }\n checkOpen(abs, options, existing);\n const fd = kernel.json(openRequest(abs, options)) as number;\n try {\n kernel.call({ op: 'fd-vfs-stat', fd });\n } catch (err) {\n kernel.raw({ op: 'fd-close', fd });\n throw err;\n }\n infos.set(fd, { kind: 'file' });\n const handle = syncFile(kernel, fd, abs, options.append === true, () => {\n infos.delete(fd);\n handles.delete(fd);\n });\n handles.set(fd, handle.invalidate);\n return handle.file;\n };\n\n return {\n read,\n write,\n close(fd) {\n handles.get(fd)?.();\n handles.delete(fd);\n infos.delete(fd);\n kernel.call({ op: 'fd-close', fd });\n },\n open,\n fs: syncPathOps(kernel, resolve, statOf, open),\n };\n}\n\nfunction syncFile(\n kernel: JsSyncKernel,\n fd: number,\n path: string,\n append: boolean,\n forget: () => void\n): { file: JsSyncFile; invalidate: () => void } {\n let open = true;\n const live = (): void => {\n if (!open) throw new JsCallError('EBADF', path);\n };\n const file: JsSyncFile = {\n fd,\n path,\n size() {\n live();\n return (kernel.json({ op: 'fd-vfs-stat', fd }) as { size: number }).size;\n },\n read(position, length) {\n index(position, 'read');\n index(length, 'read');\n const parts: Uint8Array[] = [];\n let got = 0;\n do {\n live();\n const max = Math.min(length - got, MAX_IO);\n if (max <= 0) break;\n const chunk = kernel.bytes({ op: 'fd-pread', fd, offset: position + got, max });\n if (chunk.length === 0) break;\n parts.push(chunk);\n got += chunk.length;\n } while (got < length);\n return joined(parts, got);\n },\n write(position, data) {\n index(position, 'write');\n let at = 0;\n do {\n live();\n if (at >= data.length) break;\n const body = data.subarray(at, at + MAX_IO);\n const n = kernel.json(fileWrite(fd, append, position + at, body)) as number;\n if (!(n > 0)) throw new JsCallError('EIO', 'write');\n at += n;\n } while (at < data.length);\n return at;\n },\n truncate(size) {\n live();\n index(size, 'truncate');\n kernel.call({ op: 'fd-resize', fd, size });\n },\n sync() {\n live();\n kernel.call({ op: 'fd-flush', fd });\n },\n close() {\n live();\n open = false;\n forget();\n kernel.call({ op: 'fd-close', fd });\n },\n };\n return {\n file,\n invalidate: () => {\n open = false;\n },\n };\n}\n\nfunction syncPathOps(\n kernel: JsSyncKernel,\n resolve: (path: string) => string,\n statOf: (op: 'stat' | 'lstat', path: string) => SyncFsBridgeStat,\n open: (path: string, options?: JsOpenOptions) => JsSyncFile\n): JsSyncContext['fs'] {\n return {\n stat: (path) => statOf('stat', path),\n lstat: (path) => statOf('lstat', path),\n exists(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devSync(kernel, devExists(abs));\n return kernel.json({ op: 'exists', path: abs }) === true;\n },\n readdir(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devSync(kernel, devReaddir(abs));\n return kernel.json({ op: 'readdir', path: abs }) as string[];\n },\n mkdir: (path) => void kernel.call({ op: 'mkdir', path: resolve(path) }),\n rm: (path) => void kernel.call({ op: 'rm', path: resolve(path) }),\n unlink: (path) => void kernel.call({ op: 'unlink', path: resolve(path) }),\n rename: (from, to) =>\n void kernel.call({ op: 'rename', path: resolve(from), arg2: resolve(to) }),\n link: (from, to) => void kernel.call({ op: 'link', path: resolve(from), arg2: resolve(to) }),\n symlink: (target, path) =>\n void kernel.call({ op: 'symlink', path: resolve(path), arg2: target }),\n readlink(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devSync(kernel, devReadlink(abs));\n return String(kernel.json({ op: 'readlink', path: abs }));\n },\n readFile(path) {\n const abs = resolve(path);\n if (inDev(abs)) return readWholeSync(open(abs));\n kernel.call({ op: 'fd-path-flush', path: abs });\n return kernel.bytes({ op: 'read', path: abs });\n },\n writeFile(path, data) {\n const file = open(path, { write: true, create: true, truncate: true });\n try {\n file.write(0, typeof data === 'string' ? encoder.encode(data) : data);\n } finally {\n file.close();\n }\n },\n };\n}\n", "import type { FdInfo } from './js-io.ts';\nimport type { JsKernel } from './js-kernel.ts';\n\nexport interface JsTermios {\n c_iflag: number;\n c_oflag: number;\n c_cflag: number;\n c_lflag: number;\n c_cc: number[];\n}\n\nexport interface JsTtySize {\n columns: number;\n rows: number;\n}\n\nexport interface JsTty {\n getAttr(fd: number): Promise<JsTermios>;\n setAttr(fd: number, termios: JsTermios): Promise<void>;\n setRaw(fd: number, raw: boolean): Promise<void>;\n size(fd: number): Promise<JsTtySize>;\n foreground(fd: number): Promise<number>;\n setForeground(fd: number, pgrp: number): Promise<void>;\n}\n\nconst BRKINT = 0o2;\nconst INPCK = 0o20;\nconst ISTRIP = 0o40;\nconst ICRNL = 0o400;\nconst IXON = 0o2000;\nconst ONLCR = 0o4;\nconst CS8 = 0o60;\nconst ISIG = 0o1;\nconst ICANON = 0o2;\nconst ECHO = 0o10;\nconst IEXTEN = 0o100000;\nconst VTIME = 5;\nconst VMIN = 6;\n\nfunction copy(termios: JsTermios): JsTermios {\n return { ...termios, c_cc: [...termios.c_cc] };\n}\n\nexport function rawOf(termios: JsTermios): JsTermios {\n const raw = copy(termios);\n raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);\n raw.c_oflag |= ONLCR;\n raw.c_cflag |= CS8;\n raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);\n raw.c_cc[VMIN] = 1;\n raw.c_cc[VTIME] = 0;\n return raw;\n}\n\nexport function ttyOps(kernel: JsKernel): {\n tty: JsTty;\n restore(): Promise<void>;\n modes(): Array<{ terminal: string; fd: number; termios: JsTermios }>;\n} {\n const saved = new Map<string, { fd: number; termios: JsTermios }>();\n const terminalOf = async (fd: number): Promise<string> =>\n ((await kernel.json({ op: 'fd-info', fd })) as FdInfo).terminal ?? `fd ${fd}`;\n\n const getAttr = async (fd: number): Promise<JsTermios> =>\n (await kernel.json({ op: 'tty-get', fd })) as JsTermios;\n const setAttr = async (fd: number, termios: JsTermios): Promise<void> => {\n await kernel.call({ op: 'tty-set', fd, termios: copy(termios) });\n };\n\n const tty: JsTty = {\n getAttr,\n setAttr,\n async setRaw(fd, raw) {\n const terminal = await terminalOf(fd);\n if (!raw) {\n const original = saved.get(terminal);\n saved.delete(terminal);\n if (original) await setAttr(fd, original.termios);\n return;\n }\n const current = await getAttr(fd);\n if (!saved.has(terminal)) saved.set(terminal, { fd, termios: current });\n await setAttr(fd, rawOf(current));\n },\n async size(fd) {\n const [rows, columns] = (await kernel.json({ op: 'tty-winsz', fd })) as [number, number];\n return { columns, rows };\n },\n foreground: async (fd) => (await kernel.json({ op: 'tty-pgrp-get', fd })) as number,\n async setForeground(fd, pgrp) {\n await kernel.call({ op: 'tty-pgrp-set', fd, pgrp });\n },\n };\n\n const openOn = async (terminal: string, fd: number): Promise<number | undefined> => {\n const open = (await kernel.json({ op: 'fd-list' })) as Array<FdInfo & { fd: number }>;\n const on = open.filter((entry) => entry.terminal === terminal);\n return (on.find((entry) => entry.fd === fd) ?? on[0])?.fd;\n };\n const reopened = async (terminal: string, termios: JsTermios): Promise<void> => {\n const fd = (await kernel.json({ op: 'fd-open-tty', name: terminal })) as number;\n try {\n await setAttr(fd, termios);\n } finally {\n await kernel.call({ op: 'fd-close', fd });\n }\n };\n const restore = async (): Promise<void> => {\n for (const [terminal, { fd, termios }] of [...saved].reverse()) {\n saved.delete(terminal);\n const at = await openOn(terminal, fd).catch(() => undefined);\n const back = at === undefined ? reopened(terminal, termios) : setAttr(at, termios);\n await back.catch(() => undefined);\n }\n };\n\n const modes = () =>\n [...saved].reverse().map(([terminal, { fd, termios }]) => ({ terminal, fd, termios }));\n return { tty, restore, modes };\n}\n", "import { JsCallError, type JsKernel } from './js-kernel.ts';\n\nexport type JsWebSocketMessage = string | Uint8Array;\n\nexport interface JsWebSocketClose {\n code: number;\n reason: string;\n}\n\nexport interface JsWebSocketOptions {\n protocols?: string | string[];\n headers?: HeadersInit;\n signal?: AbortSignal;\n}\n\nexport interface JsWebSocket {\n readonly url: string;\n readonly protocol: string;\n readonly readable: ReadableStream<JsWebSocketMessage>;\n readonly writable: WritableStream<JsWebSocketMessage>;\n readonly closed: Promise<JsWebSocketClose>;\n close(close?: Partial<JsWebSocketClose>): void;\n}\n\nconst SEND_BUFFER = 1024 * 1024;\nconst MAX_REASON = 123;\nconst NEVER = new AbortController().signal;\n\nfunction failed(err: unknown): TypeError {\n return new TypeError('websocket failed', { cause: err });\n}\n\nfunction socketUrl(input: string | URL): string {\n const url = new URL(input);\n if (url.protocol === 'http:') url.protocol = 'ws:';\n else if (url.protocol === 'https:') url.protocol = 'wss:';\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new SyntaxError(`not a WebSocket URL: ${url.href}`);\n }\n url.hash = '';\n return url.href;\n}\n\nfunction closeCode(code: number | undefined): number {\n if (code === undefined) return 1000;\n if (code === 1000 || (code >= 3000 && code <= 4999)) return code;\n throw new JsCallError('EINVAL', `close code ${code}`);\n}\n\nfunction closeReason(reason: string | undefined): string {\n if (reason === undefined) return '';\n if (new TextEncoder().encode(reason).length > MAX_REASON) {\n throw new JsCallError('EINVAL', `close reason over ${MAX_REASON} bytes`);\n }\n return reason;\n}\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function websocketOp(kernel: JsKernel) {\n return async (input: string | URL, options: JsWebSocketOptions = {}): Promise<JsWebSocket> => {\n const url = socketUrl(input);\n const signal = options.signal ?? NEVER;\n signal.throwIfAborted();\n const protocols =\n typeof options.protocols === 'string' ? [options.protocols] : (options.protocols ?? []);\n const handle = (await kernel.json({\n op: 'net-ws-open',\n url,\n protocols,\n headers: [...new Headers(options.headers)],\n })) as number;\n const free = () => kernel.raw({ op: 'net-close', handle });\n let protocol: string;\n try {\n const r = await kernel.blocking({ op: 'net-ws-ready', handle }, signal);\n protocol = ((r.ok && r.kind === 'json' ? r.json : {}) as { protocol: string }).protocol;\n } catch (err) {\n await free();\n throw signal.aborted ? signal.reason : failed(err);\n }\n\n let settle!: (close: JsWebSocketClose) => void;\n let lose!: (err: unknown) => void;\n const closed = new Promise<JsWebSocketClose>((resolve, reject) => {\n settle = resolve;\n lose = reject;\n });\n closed.catch(() => undefined);\n const stop = new AbortController();\n let freed = false;\n const onAbort = (): void => hardStop(signal.reason);\n const finish = (): void => {\n freed = true;\n signal.removeEventListener('abort', onAbort);\n void free();\n };\n const hardStop = (reason: unknown): void => {\n if (stop.signal.aborted) return;\n stop.abort(reason);\n lose(reason);\n finish();\n };\n signal.addEventListener('abort', onAbort, { once: true });\n let settled = false;\n let readDone = false;\n const release = (): void => {\n if (!settled || !readDone || freed) return;\n finish();\n };\n kernel\n .blocking({ op: 'net-ws-wait', handle }, stop.signal)\n .then((r) => {\n settled = true;\n settle((r as Extract<typeof r, { kind: 'json' }>).json as JsWebSocketClose);\n release();\n })\n .catch(lose);\n const close = (how: Partial<JsWebSocketClose> = {}): void => {\n void kernel.raw({\n op: 'net-ws-close',\n handle,\n code: closeCode(how.code),\n reason: closeReason(how.reason),\n });\n };\n\n const readable = new ReadableStream<JsWebSocketMessage>(\n {\n async pull(controller) {\n let r: Awaited<ReturnType<JsKernel['blocking']>>;\n try {\n r = await kernel.blocking({ op: 'net-ws-recv', handle }, stop.signal);\n } catch (err) {\n hardStop(stop.signal.aborted ? stop.signal.reason : failed(err));\n throw stop.signal.reason;\n }\n stop.signal.throwIfAborted();\n if (r.ok && r.kind === 'bytes') {\n controller.enqueue(r.bytes);\n return;\n }\n const text = ((r.ok && r.kind === 'json' ? r.json : {}) as { text?: string }).text;\n if (text !== undefined) {\n controller.enqueue(text);\n return;\n }\n controller.close();\n readDone = true;\n release();\n },\n cancel: () => {\n close();\n readDone = true;\n release();\n },\n },\n { highWaterMark: 0 }\n );\n\n const writable = new WritableStream<JsWebSocketMessage>({\n async write(chunk, controller) {\n stop.signal.throwIfAborted();\n const send = async (body: object): Promise<number> => {\n if (settled) throw new JsCallError('EPIPE', 'the websocket is closed');\n return (await kernel.json({ op: 'net-ws-send', handle, ...body })) as number;\n };\n let buffered = await send(typeof chunk === 'string' ? { text: chunk } : { body: chunk });\n while (buffered > SEND_BUFFER) {\n await wait(10);\n stop.signal.throwIfAborted();\n controller.signal.throwIfAborted();\n buffered = await send({});\n }\n },\n close: () => close(),\n abort: () => close({ code: 1000, reason: '' }),\n });\n\n return { url, protocol, readable, writable, closed, close };\n };\n}\n", "import { SIG } from '../../kernel/signals.ts';\nimport { parseSyncFsStat, type SyncFsBridgeStat } from '../../realm/sync-fs-wire.ts';\nimport { childOps, type JsChild, type JsExited, type JsSpawnOptions } from './js-children.ts';\nimport {\n devAsync,\n devExists,\n devOpen,\n devReaddir,\n devReadlink,\n devStat,\n inDev,\n readWhole,\n streamFile,\n} from './js-dev.ts';\nimport { exitAtOnce, type PendingWrite, type SavedMode } from './js-exit.ts';\nimport { fetchOp } from './js-fetch.ts';\nimport {\n absent,\n brokenPipe,\n CHUNK,\n checkOpen,\n type FdInfo,\n fileWrite,\n index,\n isExclusive,\n type JsFdType,\n type JsOpenOptions,\n joined,\n MAX_IO,\n openRequest,\n readDevice,\n typeOf,\n writeDevice,\n written,\n} from './js-io.ts';\nimport { callError, JsCallError, type JsKernel } from './js-kernel.ts';\nimport { type JsNet, netOps } from './js-net.ts';\nimport { runSync } from './js-run.ts';\nimport {\n type JsSyncContext,\n JsSyncKernel,\n laneOf,\n noLane,\n type SyncCall,\n syncOps,\n} from './js-sync.ts';\nimport { type JsTty, ttyOps } from './js-tty.ts';\nimport { type JsWebSocket, type JsWebSocketOptions, websocketOp } from './js-websocket.ts';\n\nexport type { JsFdType, JsOpenOptions } from './js-io.ts';\n\nexport interface JsFile {\n readonly fd: number;\n readonly path: string;\n size(): Promise<number>;\n read(position: number, length: number): Promise<Uint8Array>;\n write(position: number, data: Uint8Array): Promise<number>;\n truncate(size: number): Promise<void>;\n sync(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface JsFdStatus {\n type: JsFdType;\n tty: boolean;\n seekable: boolean;\n}\n\nexport type JsSignal = number | `SIG${string}`;\n\nexport interface JsProgramContext {\n readonly argv: readonly string[];\n readonly env: Readonly<Record<string, string>>;\n readonly pid: number;\n ppid(): Promise<number>;\n readonly cwd: string;\n readonly stdin: ReadableStream<Uint8Array>;\n readonly stdout: WritableStream<Uint8Array>;\n readonly stderr: WritableStream<Uint8Array>;\n read(fd: number, max?: number): Promise<Uint8Array>;\n write(fd: number, data: Uint8Array | string): Promise<void>;\n close(fd: number): Promise<void>;\n fdStatus(fd: number): Promise<JsFdStatus>;\n isatty(fd: number): Promise<boolean>;\n open(path: string, options?: JsOpenOptions): Promise<JsFile>;\n resolve(path: string): string;\n fs: {\n stat(path: string): Promise<SyncFsBridgeStat>;\n lstat(path: string): Promise<SyncFsBridgeStat>;\n exists(path: string): Promise<boolean>;\n readdir(path: string): Promise<string[]>;\n mkdir(path: string): Promise<void>;\n rm(path: string): Promise<void>;\n unlink(path: string): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n link(from: string, to: string): Promise<void>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n readFile(path: string): Promise<Uint8Array>;\n writeFile(path: string, data: Uint8Array | string): Promise<void>;\n };\n signals: {\n on(signal: JsSignal, handler: (signal: number) => void): Promise<void>;\n ignore(signal: JsSignal): Promise<void>;\n reset(signal: JsSignal): Promise<void>;\n };\n sync: JsSyncContext;\n spawn(options: JsSpawnOptions): Promise<JsChild>;\n wait(pid: number): Promise<JsExited>;\n kill(pid: number, signal?: JsSignal): Promise<void>;\n sudo(args: readonly string[]): Promise<JsSudoAnswer>;\n net: JsNet;\n websocket(url: string | URL, options?: JsWebSocketOptions): Promise<JsWebSocket>;\n tty: JsTty;\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n exit(code?: number): never;\n onUncaught(listener: JsStrayListener): () => void;\n onUnhandledRejection(listener: JsStrayListener): () => void;\n}\n\nexport type JsSudoAnswer =\n | { error: string; errno: string }\n | { list: string }\n | { run: string[] }\n | { pid: number };\n\nexport type JsStrayListener = (error: unknown, promise?: Promise<unknown>) => void;\n\nexport interface JsStrays {\n exception: Set<JsStrayListener>;\n rejection: Set<JsStrayListener>;\n}\n\nfunction listen(listeners: Set<JsStrayListener>, listener: JsStrayListener): () => void {\n const own = (error: unknown, promise?: Promise<unknown>) => listener(error, promise);\n listeners.add(own);\n return () => void listeners.delete(own);\n}\n\nexport class JsExit extends Error {\n readonly status: number;\n\n constructor(status: number) {\n super(`exit ${status}`);\n this.name = 'JsExit';\n this.status = status;\n }\n}\n\nexport interface ContextOptions {\n kernel: JsKernel;\n argv: readonly string[];\n env: Readonly<Record<string, string>>;\n pid: number;\n ppid: number;\n cwd: string;\n exit(status: number): void;\n random?: (bytes: Uint8Array) => void;\n lane?: SyncCall;\n strays?: JsStrays;\n}\n\nconst encoder = new TextEncoder();\n\nexport interface Identity {\n pid: number;\n ppid: number;\n}\n\nexport function identityOf(answer: unknown, fallback: { pid: number; ppid?: number }): Identity {\n const id = answer as Partial<Identity> | null;\n return {\n pid: typeof id?.pid === 'number' ? id.pid : fallback.pid,\n ppid: typeof id?.ppid === 'number' ? id.ppid : (fallback.ppid ?? 1),\n };\n}\n\nexport function signalNumber(signal: JsSignal): number {\n if (typeof signal === 'number') {\n if (Number.isInteger(signal) && signal >= 1 && signal <= 31) return signal;\n throw new JsCallError('EINVAL', `signal ${signal}`);\n }\n const n = (SIG as Record<string, number>)[signal.slice(3)];\n if (n === undefined) throw new JsCallError('EINVAL', `signal ${signal}`);\n return n;\n}\n\nexport function resolvePath(cwd: string, path: string): string {\n const parts: string[] = [];\n for (const part of (path.startsWith('/') ? path : `${cwd}/${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 interface CreatedContext {\n ctx: JsProgramContext;\n drain(): Promise<unknown>;\n}\n\ninterface KillerDeps {\n self: number;\n kernel: JsKernel;\n syncKernel: JsSyncKernel;\n lane: SyncCall;\n writes: Set<PendingWrite>;\n modes: () => SavedMode[];\n}\n\nfunction killer(d: KillerDeps): JsSyncContext['kill'] {\n return (pid, signal = 'SIGTERM') => {\n const sig = signal === 0 ? 0 : signalNumber(signal);\n const self = sig !== 0 && includesSelf(d.syncKernel, d.self, pid);\n if (!self || d.kernel.disposition(sig) !== 'terminate') {\n d.syncKernel.call({ op: 'proc-kill', pid, sig });\n return;\n }\n const target = pid === d.self ? {} : { target: pid };\n const r = d.lane({ op: 'proc-kill-self', sig, ...target, probe: true });\n if (!r.ok) throw new JsCallError(r.errno, 'kill');\n if (r.kind === 'void') return;\n exitAtOnce(d.lane, [...d.writes], d.modes(), 128 + sig, {\n op: 'proc-kill-self',\n sig,\n ...target,\n });\n };\n}\n\nfunction includesSelf(kernel: JsSyncKernel, self: number, pid: number): boolean {\n if (pid === self || pid === 0) return true;\n if (pid > 0 || pid === -1) return false;\n return kernel.json({ op: 'proc-getpgid', pid: 0 }) === -pid;\n}\n\nfunction writer(kernel: JsKernel, info: (fd: number) => Promise<FdInfo>, pid: number) {\n const writes = new Set<PendingWrite>();\n const sendAll = async (\n fd: number,\n data: Uint8Array,\n i: FdInfo,\n w: PendingWrite,\n signal?: AbortSignal\n ): Promise<void> => {\n while (w.at < data.length) {\n const body = data.subarray(w.at, w.at + MAX_IO);\n w.len = body.length;\n try {\n w.at += signal\n ? await sendSome(kernel, fd, body, signal)\n : written(\n await kernel.blocking({ op: 'fd-write', fd, body }, undefined, (id) => {\n if (w.op !== undefined) kernel.ack(w.op);\n w.op = id;\n }),\n body.length\n );\n if (w.op !== undefined) kernel.ack(w.op);\n w.op = undefined;\n } catch (err) {\n if (brokenPipe(err, i)) await kernel.call({ op: 'proc-kill', pid, sig: SIG.PIPE });\n throw err;\n }\n }\n };\n const writeAll = async (fd: number, data: Uint8Array, signal?: AbortSignal): Promise<void> => {\n const w: PendingWrite = { fd, data, at: 0, len: 0 };\n if (!signal) writes.add(w);\n try {\n const i = await info(fd);\n if (writeDevice(i)) return;\n await sendAll(fd, data, i, w, signal);\n } finally {\n writes.delete(w);\n }\n };\n\n return { writes, writeAll };\n}\n\nexport function createContext(o: ContextOptions): CreatedContext {\n const { kernel } = o;\n const infos = new Map<number, FdInfo>();\n const handles = new Map<number, () => void>();\n const pending = new Set<Promise<unknown>>();\n const random =\n o.random ??\n ((bytes: Uint8Array) => void crypto.getRandomValues(bytes as Uint8Array<ArrayBuffer>));\n const resolve = (path: string) => resolvePath(o.cwd, path);\n let exiting: number | undefined;\n const exit = (code = 0): never => {\n exiting ??= code;\n o.exit(code);\n throw new JsExit(code);\n };\n const unwind = (): void => {\n if (exiting !== undefined) throw new JsExit(exiting);\n if (kernel.faulted) throw new JsExit(1);\n };\n\n const info = async (fd: number): Promise<FdInfo> => {\n const known = infos.get(fd);\n if (known) return known;\n const got = (await kernel.json({ op: 'fd-info', fd })) as FdInfo;\n infos.set(fd, got);\n return got;\n };\n const read = async (fd: number, max = CHUNK, signal?: AbortSignal): Promise<Uint8Array> => {\n index(max, 'read');\n const emulated = readDevice(await info(fd), max, random);\n if (emulated) return emulated;\n return readPipe(kernel, fd, Math.min(max, MAX_IO), signal);\n };\n\n const { writes, writeAll } = writer(kernel, info, o.pid);\n\n const write = (fd: number, data: Uint8Array | string): Promise<void> => {\n const bytes = typeof data === 'string' ? encoder.encode(data) : data;\n let settle!: () => void;\n const settled = new Promise<void>((resolve) => (settle = resolve));\n pending.add(settled);\n return (async () => {\n try {\n await writeAll(fd, bytes);\n } finally {\n pending.delete(settled);\n settle();\n }\n })();\n };\n\n const writable = (fd: number) =>\n new WritableStream<Uint8Array>({ write: (chunk) => write(fd, chunk) });\n\n const statOf = async (op: 'stat' | 'lstat', path: string): Promise<SyncFsBridgeStat> => {\n const abs = resolve(path);\n if (inDev(abs)) return devAsync(kernel, devStat(abs, op === 'stat'));\n await kernel.call({ op: 'fd-path-flush', path: abs });\n const s = parseSyncFsStat(await kernel.json({ op, path: abs }));\n if (!s) throw new JsCallError('EIO', op);\n return s;\n };\n\n const open = async (path: string, options: JsOpenOptions = {}): Promise<JsFile> => {\n const abs = resolve(path);\n if (inDev(abs)) return openDev(kernel, abs, options, { infos, handles, read, write: writeAll });\n const existing = await statOf(isExclusive(options) ? 'lstat' : 'stat', abs).catch(absent);\n checkOpen(abs, options, existing);\n const fd = (await kernel.json(openRequest(abs, options))) as number;\n try {\n await kernel.call({ op: 'fd-vfs-stat', fd });\n } catch (err) {\n await kernel.raw({ op: 'fd-close', fd });\n throw err;\n }\n infos.set(fd, { kind: 'file' });\n const handle = fileHandle(kernel, fd, abs, options.append === true, () => {\n infos.delete(fd);\n handles.delete(fd);\n });\n handles.set(fd, handle.invalidate);\n return handle.file;\n };\n\n const fs = pathOps(kernel, resolve, statOf, open);\n const lane = o.lane ?? laneOf(undefined);\n if (o.lane && o.lane !== noLane) kernel.syncLane = o.lane;\n const syncKernel = new JsSyncKernel(lane, kernel, unwind);\n const terminal = ttyOps(kernel);\n const sync: JsSyncContext = {\n ...syncOps(syncKernel, { pid: o.pid, resolve, random, infos, handles }),\n run: (options) =>\n runSync(syncKernel, { env: o.env, cwd: o.cwd, resolve, signal: signalNumber }, options),\n exit: (status = 0): never => {\n exiting ??= status & 0xff;\n return exitAtOnce(lane, [...writes], terminal.modes(), exiting);\n },\n kill: killer({ self: o.pid, kernel, syncKernel, lane, writes, modes: terminal.modes }),\n };\n\n const io = { read, send: writeAll, close: (fd: number) => ctx.close(fd) };\n const children = childOps(kernel, io, { env: o.env, cwd: o.cwd, signal: signalNumber });\n\n const strays = o.strays ?? { exception: new Set(), rejection: new Set() };\n const ctx: JsProgramContext = {\n argv: o.argv,\n env: o.env,\n pid: o.pid,\n async ppid() {\n return identityOf(await kernel.json({ op: 'proc-identity' }), o).ppid;\n },\n cwd: o.cwd,\n stdin: new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n const chunk = await read(0);\n if (chunk.length === 0) controller.close();\n else controller.enqueue(chunk);\n },\n },\n { highWaterMark: 0 }\n ),\n stdout: writable(1),\n stderr: writable(2),\n read,\n write,\n async close(fd) {\n handles.get(fd)?.();\n handles.delete(fd);\n infos.delete(fd);\n await kernel.call({ op: 'fd-close', fd });\n },\n async fdStatus(fd) {\n const type = typeOf(await info(fd));\n return { type, tty: type === 'tty', seekable: type === 'file' };\n },\n isatty: async (fd) => typeOf(await info(fd)) === 'tty',\n open,\n resolve,\n fs,\n signals: {\n on: async (signal, handler) => kernel.setHandler(signalNumber(signal), handler),\n ignore: async (signal) => kernel.setHandler(signalNumber(signal), 'ignore'),\n reset: async (signal) => kernel.setHandler(signalNumber(signal), 'default'),\n },\n sync,\n fetch: fetchOp(kernel),\n sudo: async (args) =>\n (await kernel.json({\n op: 'proc-sudo',\n args: [...args],\n cwd: o.cwd,\n ...(o.env.TERM !== undefined ? { term: o.env.TERM } : {}),\n })) as JsSudoAnswer,\n ...children,\n net: netOps(kernel, io),\n websocket: websocketOp(kernel),\n tty: terminal.tty,\n exit,\n onUncaught: (listener) => listen(strays.exception, listener),\n onUnhandledRejection: (listener) => listen(strays.rejection, listener),\n };\n const drain = async (): Promise<void> => {\n for (;;) {\n await Promise.all([...pending]);\n await new Promise((resolve) => setTimeout(resolve, 0));\n if (pending.size === 0) break;\n }\n await terminal.restore();\n };\n return { ctx, drain };\n}\n\ninterface DevState {\n infos: Map<number, FdInfo>;\n handles: Map<number, () => void>;\n read(fd: number, max: number): Promise<Uint8Array>;\n write(fd: number, data: Uint8Array): Promise<void>;\n}\n\nasync function openDev(\n kernel: JsKernel,\n abs: string,\n options: JsOpenOptions,\n state: DevState\n): Promise<JsFile> {\n const { fd, file, ...access } = await devAsync(kernel, devOpen(abs, options));\n const forget = () => {\n state.infos.delete(fd);\n state.handles.delete(fd);\n };\n if (file) state.infos.set(fd, { kind: 'file' });\n const close = async (n: number) => {\n forget();\n await kernel.call({ op: 'fd-close', fd: n });\n };\n const handle = file\n ? fileHandle(kernel, fd, abs, options.append === true, forget)\n : streamFile(\n fd,\n abs,\n { read: (n, max) => state.read(n, max), write: state.write, close },\n access\n );\n state.handles.set(fd, handle.invalidate);\n return handle.file;\n}\n\nfunction fileHandle(\n kernel: JsKernel,\n fd: number,\n path: string,\n append: boolean,\n forget: () => void\n): { file: JsFile; invalidate: () => void } {\n let open = true;\n const live = (): void => {\n if (!open) throw new JsCallError('EBADF', path);\n };\n const file: JsFile = {\n fd,\n path,\n async size() {\n live();\n const s = (await kernel.json({ op: 'fd-vfs-stat', fd })) as { size: number };\n return s.size;\n },\n async read(position, length) {\n index(position, 'read');\n index(length, 'read');\n const parts: Uint8Array[] = [];\n let got = 0;\n do {\n live();\n const max = Math.min(length - got, MAX_IO);\n if (max <= 0) break;\n const chunk = await kernel.bytes({ op: 'fd-pread', fd, offset: position + got, max });\n if (chunk.length === 0) break;\n parts.push(chunk);\n got += chunk.length;\n } while (got < length);\n return joined(parts, got);\n },\n async write(position, data) {\n index(position, 'write');\n let at = 0;\n do {\n live();\n if (at >= data.length) break;\n const body = data.subarray(at, at + MAX_IO);\n const n = (await kernel.json(fileWrite(fd, append, position + at, body))) as number;\n if (!(n > 0)) throw new JsCallError('EIO', 'write');\n at += n;\n } while (at < data.length);\n return at;\n },\n async truncate(size) {\n live();\n index(size, 'truncate');\n await kernel.call({ op: 'fd-resize', fd, size });\n },\n async sync() {\n live();\n await kernel.call({ op: 'fd-flush', fd });\n },\n async close() {\n live();\n open = false;\n forget();\n await kernel.call({ op: 'fd-close', fd });\n },\n };\n return {\n file,\n invalidate: () => {\n open = false;\n },\n };\n}\n\nasync function readPipe(\n kernel: JsKernel,\n fd: number,\n max: number,\n signal: AbortSignal | undefined\n): Promise<Uint8Array> {\n if (signal) return receiveSome(kernel, fd, max, signal);\n const r = await kernel.blocking({ op: 'fd-read', fd, max });\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n}\n\nasync function receiveSome(\n kernel: JsKernel,\n fd: number,\n max: number,\n signal: AbortSignal\n): Promise<Uint8Array> {\n for (;;) {\n signal.throwIfAborted();\n const r = await kernel.raw({ op: 'fd-read', fd, max, nonblock: true });\n if (r.ok) return r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n if (r.errno !== 'EAGAIN') throw callError(r, 'fd-read');\n await kernel.blocking({ op: 'fd-select', read: [fd], write: [], timeoutMs: -1 }, signal);\n }\n}\n\nasync function sendSome(\n kernel: JsKernel,\n fd: number,\n body: Uint8Array,\n signal: AbortSignal\n): Promise<number> {\n for (;;) {\n signal.throwIfAborted();\n const r = await kernel.raw({ op: 'fd-write', fd, body, nonblock: true });\n if (r.ok) return written(r, body.length);\n if (r.errno !== 'EAGAIN') throw callError(r, 'fd-write');\n await kernel.blocking({ op: 'fd-select', read: [], write: [fd], timeoutMs: -1 }, signal);\n }\n}\n\nfunction pathOps(\n kernel: JsKernel,\n resolve: (path: string) => string,\n statOf: (op: 'stat' | 'lstat', path: string) => Promise<SyncFsBridgeStat>,\n open: (path: string, options?: JsOpenOptions) => Promise<JsFile>\n): JsProgramContext['fs'] {\n return {\n stat: (path) => statOf('stat', path),\n lstat: (path) => statOf('lstat', path),\n async exists(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devAsync(kernel, devExists(abs));\n return (await kernel.json({ op: 'exists', path: abs })) === true;\n },\n async readdir(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devAsync(kernel, devReaddir(abs));\n return (await kernel.json({ op: 'readdir', path: abs })) as string[];\n },\n mkdir: async (path) => void (await kernel.call({ op: 'mkdir', path: resolve(path) })),\n rm: async (path) => void (await kernel.call({ op: 'rm', path: resolve(path) })),\n unlink: async (path) => void (await kernel.call({ op: 'unlink', path: resolve(path) })),\n rename: async (from, to) =>\n void (await kernel.call({ op: 'rename', path: resolve(from), arg2: resolve(to) })),\n link: async (from, to) =>\n void (await kernel.call({ op: 'link', path: resolve(from), arg2: resolve(to) })),\n symlink: async (target, path) =>\n void (await kernel.call({ op: 'symlink', path: resolve(path), arg2: target })),\n async readlink(path) {\n const abs = resolve(path);\n if (inDev(abs)) return devAsync(kernel, devReadlink(abs));\n return String(await kernel.json({ op: 'readlink', path: abs }));\n },\n async readFile(path) {\n const abs = resolve(path);\n if (inDev(abs)) return readWhole(await open(abs));\n await kernel.call({ op: 'fd-path-flush', path: abs });\n return kernel.bytes({ op: 'read', path: abs });\n },\n async writeFile(path, data) {\n const file = await open(path, { write: true, create: true, truncate: true });\n try {\n await file.write(0, typeof data === 'string' ? encoder.encode(data) : data);\n } finally {\n await file.close();\n }\n },\n };\n}\n", "import type { JsProcessInitMsg } from '../../kernel/protocol.ts';\nimport type { SabPostLike } from '../../realm/sync-sab-bridge.ts';\nimport { importSource } from '../wasi/wasi-imports.ts';\nimport { createAsyncSabTransport, type WaitAsyncLike } from './async-sab.ts';\nimport {\n createContext,\n identityOf,\n JsExit,\n type JsProgramContext,\n type JsStrays,\n} from './js-context.ts';\nimport { JsKernel } from './js-kernel.ts';\nimport { laneOf } from './js-sync.ts';\nimport { lockdown } from './lockdown.ts';\n\nexport type JsMain = (ctx: JsProgramContext) => unknown;\n\nexport interface JsRuntimeDeps {\n waitAsync?: WaitAsyncLike;\n load?: (source: string) => Promise<Record<string, unknown>>;\n lockdown?: () => void;\n scope?: object;\n}\n\nconst NOT_RUNNABLE = 126;\n\ntype StrayKind = keyof JsStrays;\ntype Stray = (kind: StrayKind, err: unknown, promise?: Promise<unknown>) => void;\n\ninterface StrayScope {\n process?: {\n on?: (event: string, listener: (err: unknown, promise?: Promise<unknown>) => void) => void;\n };\n addEventListener?: (\n type: string,\n listener: (event: {\n preventDefault(): void;\n reason?: unknown;\n error?: unknown;\n promise?: Promise<unknown>;\n }) => void\n ) => void;\n}\n\nexport function trapStrays(scope: StrayScope, stray: Stray): void {\n if (typeof scope.process?.on === 'function') {\n scope.process.on('unhandledRejection', (err, promise) => stray('rejection', err, promise));\n scope.process.on('uncaughtException', (err) => stray('exception', err));\n return;\n }\n scope.addEventListener?.('unhandledrejection', (event) => {\n event.preventDefault();\n stray('rejection', event.reason, event.promise);\n });\n scope.addEventListener?.('error', (event) => {\n event.preventDefault();\n stray('exception', event.error);\n });\n}\n\nasync function settledStrays(): Promise<void> {\n for (let turn = 0; turn < 2; turn++) await new Promise((resolve) => setTimeout(resolve, 0));\n}\n\nfunction message(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction statusOf(value: unknown): number {\n return typeof value === 'number' && Number.isInteger(value) ? value & 0xff : 0;\n}\n\nexport function mainOf(module: Record<string, unknown>): JsMain | undefined {\n const main = typeof module.default === 'function' ? module.default : module.main;\n return typeof main === 'function' ? (main as JsMain) : undefined;\n}\n\nexport async function runJsProcess(\n init: JsProcessInitMsg,\n port: SabPostLike,\n deps: JsRuntimeDeps = {}\n): Promise<number> {\n const transport = createAsyncSabTransport(init.sab, port, deps.waitAsync);\n let resolveExit!: (status: number) => void;\n const exit = new Promise<number>((resolve) => (resolveExit = resolve));\n let exitedWith: number | undefined;\n const exited = (status: number): void => {\n exitedWith ??= status;\n resolveExit(status);\n };\n let failing: Promise<void> | undefined;\n const fail = (err: unknown): void => {\n if (err instanceof JsExit) return;\n failing ??= say(message(err)).then(() => exited(1));\n };\n const kernel = new JsKernel({\n sab: init.sab,\n transport,\n onError: fail,\n waitAsync: deps.waitAsync,\n });\n void kernel.watchStops();\n const strays: JsStrays = { exception: new Set(), rejection: new Set() };\n const id = identityOf(await kernel.json({ op: 'proc-identity' }), init);\n kernel.pid = id.pid;\n const { ctx, drain } = createContext({\n kernel,\n argv: [init.argv0, ...init.args],\n env: init.env,\n pid: id.pid,\n ppid: id.ppid,\n cwd: init.cwd,\n exit: (status) => exited(statusOf(status)),\n lane: laneOf(init.lane),\n strays,\n });\n const say = (text: string) => ctx.write(2, `${init.argv0}: ${text}\\n`).catch(() => undefined);\n\n let main: JsMain | undefined;\n trapStrays((deps.scope ?? globalThis) as StrayScope, (kind, err, promise) => {\n const listeners = [...strays[kind]];\n if (listeners.length === 0) return fail(err);\n for (const listener of listeners) {\n try {\n listener(err, promise);\n } catch (thrown) {\n fail(thrown);\n }\n }\n });\n try {\n (deps.lockdown ?? lockdown)();\n main = mainOf(await (deps.load ?? importSource)(init.program.glue));\n } catch (err) {\n await say(message(err));\n return NOT_RUNNABLE;\n }\n if (!main) {\n await say(`${init.program.path} exports no main function`);\n return NOT_RUNNABLE;\n }\n const program = main;\n const ran = Promise.resolve()\n .then(() => program(ctx))\n .then(statusOf, async (err: unknown) => {\n if (err instanceof JsExit) return err.status;\n await say(message(err));\n return 1;\n });\n const status = await Promise.race([ran, exit]);\n await drain();\n await settledStrays();\n await failing;\n if (exitedWith !== undefined) return exitedWith;\n return status;\n}\n", "export const HOST_LOOPBACK = 'host.slicc.internal';\n\nexport const HOST_LOOPBACK_ADDRESS = [10, 0, 2, 2] as const;\n\nexport const PAGE_LOOPBACK = 'kernel.localhost';\n\nexport const PAGE_LOOPBACK_URL = `http://{port}.${PAGE_LOOPBACK}`;\n\nexport function toHostLoopback(href: string): string {\n const url = new URL(href);\n if (url.hostname.replace(/\\.$/, '').toLowerCase() !== HOST_LOOPBACK) return href;\n url.hostname = '127.0.0.1';\n return url.href;\n}\n\nexport const DEFAULT_HOSTNAME = 'slicc';\n\nexport const HOSTNAME_ADDRESS = '127.0.1.1';\n\nexport const LIBC_HOSTNAMES: readonly string[] = ['emscripten', 'wasmer.sh'];\n\nconst LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;\n\nfunction reserved(name: string): boolean {\n const lower = name.toLowerCase();\n return (\n lower === 'localhost' ||\n lower.endsWith('.localhost') ||\n lower === HOST_LOOPBACK ||\n lower === 'wasmer.sh' ||\n /^\\d+(\\.\\d+){3}$/.test(lower)\n );\n}\n\nexport function isHostname(name: unknown): name is string {\n if (typeof name !== 'string' || name.length > 253 || reserved(name)) return false;\n return name.split('.').every((l) => LABEL.test(l));\n}\n\nexport function hostnameOf(env: Readonly<Record<string, string>>): string {\n return isHostname(env.HOSTNAME) ? env.HOSTNAME : DEFAULT_HOSTNAME;\n}\n\nexport function ownNames(hostname: string): string[] {\n return [...new Set([hostname.toLowerCase(), ...LIBC_HOSTNAMES])];\n}\n\nexport function hostsFile(hostname: string = DEFAULT_HOSTNAME): string {\n return [\n '127.0.0.1 localhost localhost.localdomain',\n '::1 localhost ip6-localhost',\n `${HOSTNAME_ADDRESS} ${ownNames(hostname).join(' ')}`,\n `${HOST_LOOPBACK_ADDRESS.join('.')} ${HOST_LOOPBACK}`,\n '',\n ].join('\\n');\n}\n", "import { E } from './wasi/wasi-abi.ts';\n\nconst WASI_ERRNO: Readonly<Partial<Record<string, number>>> = {\n ...Object.fromEntries(Object.entries(E).map(([name, errno]) => [`E${name}`, errno])),\n EWOULDBLOCK: E.AGAIN,\n ENOTSUP: 138,\n EOPNOTSUPP: 138,\n ENOMEDIUM: 148,\n};\n\nexport function wasiErrno(code: string): number {\n return WASI_ERRNO[code] ?? E.IO;\n}\n", "import { RangedFile } from '../fs/ranged.ts';\nimport { inodeOf } from '../fs/types.ts';\nimport { wasiErrno } from '../process/wasi-errno.ts';\nimport {\n HOLD_CREATED,\n HOLD_READ,\n HOLD_WRITE,\n type SyncFsBridgeStat,\n type SyncFsFileIo,\n type SyncFsPosixBridge,\n type SyncFsUsage,\n} from './sync-fs-wire.ts';\nimport { syncCallCount } from './sync-sab-bridge.ts';\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 statAt?: number;\n\n data?: Uint8Array;\n len: number;\n loaded: boolean;\n dirty: boolean;\n openCount: number;\n writers?: number;\n\n orphan?: boolean;\n\n kept?: boolean;\n\n id?: string;\n\n listed?: Map<string, SyncFsBridgeStat>;\n\n maxFile?: number;\n\n ranges?: boolean;\n ranged?: RangedFile;\n handle?: number;\n created?: boolean;\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 fd?: 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 | null;\n mtime?: number | Date | null;\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 closeStream?(fd: number): void;\n sliccTouch?: boolean;\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 flushDirty(): void;\n\n mounts: Set<LiveFsMount>;\n handled?: Set<LiveFsNode>;\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 = wasiErrno(typeof code === 'string' ? code : '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 | null | 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\nconst EARLY_WHOLE_FILE = 64 * 1024;\n\nconst O_ACCMODE = 3;\nconst O_TRUNC = 0o1000;\n\nfunction wantOf(flags: number): number {\n const mode = flags & O_ACCMODE;\n const read = mode === 1 ? 0 : HOLD_READ;\n const write = mode !== 0 || (flags & O_TRUNC) !== 0 ? HOLD_WRITE : 0;\n return read | write;\n}\n\nfunction accessOf(want: number): number {\n return (want & HOLD_READ ? 4 : 0) | (want & HOLD_WRITE ? 2 : 0);\n}\n\nfunction refusal(err: unknown): boolean {\n const code = (err as { code?: unknown } | null)?.code;\n return code === 'EACCES' || code === 'EPERM';\n}\n\nfunction cachedStat(s: LiveNodeState, dir: boolean): boolean {\n return s.stat !== undefined && (!dir || s.statAt === syncCallCount());\n}\n\nconst stale = (s: LiveNodeState): boolean => !!s.orphan && !s.kept;\n\nfunction linkedStates(bridgeOf: (node: LiveFsNode) => SyncFsPosixBridge) {\n const opens = new Map<LiveNodeState, LiveFsNode>();\n const byId = new Map<string, LiveNodeState>();\n const idOf = (st: SyncFsBridgeStat | undefined): string | undefined =>\n st?.ino === undefined || (st.nlink ?? 1) < 2 ? undefined : `${st.dev}:${st.ino}`;\n\n function know(s: LiveNodeState, id: string): void {\n s.id = id;\n if (!byId.has(id)) byId.set(id, s);\n }\n\n function opening(node: LiveFsNode, on: boolean): void {\n const s = node.live;\n if (!on) {\n opens.delete(s);\n if (s.id !== undefined && byId.get(s.id) === s) byId.delete(s.id);\n s.id = undefined;\n return;\n }\n opens.set(s, node);\n const id = idOf(s.stat);\n if (id !== undefined) know(s, id);\n }\n\n function sharedWith(node: LiveFsNode): LiveNodeState | undefined {\n const st = node.live.stat;\n if (st?.ino === undefined) return undefined;\n const id = `${st.dev}:${st.ino}`;\n if (!byId.has(id) && idOf(st) !== undefined) {\n for (const [s, other] of opens) {\n if (s.id !== undefined || s.orphan) continue;\n let st: SyncFsBridgeStat | undefined;\n try {\n st = bridgeOf(other).lstat(liveNodePath(other));\n } catch {}\n const known = idOf(st);\n if (known !== undefined) know(s, known);\n }\n }\n const s = byId.get(id);\n return s && s !== node.live && !stale(s) ? s : undefined;\n }\n const holder = (node: LiveFsNode): LiveFsNode => opens.get(node.live) ?? node;\n return { opening, sharedWith, know, idOf, holder };\n}\n\nfunction createHelpers(Fs: LiveFsApi, ops: LiveOpsTables) {\n const bridgeOf = (node: LiveFsNode): SyncFsPosixBridge => node.mount.opts.bridge;\n const fileIo = (node: LiveFsNode): SyncFsFileIo => pinnedIo(bridgeOf(node), node.live.handle);\n const dirty = new Set<LiveFsNode>();\n const handled = new Set<LiveFsNode>();\n const linked = linkedStates(bridgeOf);\n\n function markDirty(node: LiveFsNode): void {\n node.live.dirty = true;\n dirty.add(node);\n }\n\n function flushDirty(): void {\n for (const node of [...dirty]) {\n const s = node.live;\n if (!s.dirty || stale(s)) {\n dirty.delete(node);\n continue;\n }\n if (!s.ranged && s.len > EARLY_WHOLE_FILE) continue;\n try {\n flushNode(node);\n dirty.delete(node);\n } catch {}\n }\n }\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 !== wasiErrno('ENOSYS')) throw err;\n }\n }\n\n function freshState(stat?: SyncFsBridgeStat): LiveNodeState {\n const statAt = syncCallCount();\n return { ...(stat ? { stat, statAt } : {}), 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 const size = node.live.ranged?.size() ?? node.live.len;\n return { ...(node.live.stat as SyncFsBridgeStat), size };\n }\n if (!cachedStat(node.live, Fs.isDir(node.mode))) {\n const st = call(() => bridgeOf(node).lstat(liveNodePath(linked.holder(node))));\n Object.assign(node.live, { stat: st, statAt: syncCallCount() });\n node.mode = modeFromStat(st);\n }\n return node.live.stat as SyncFsBridgeStat;\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(() => fileIo(node).readFile(liveNodePath(linked.holder(node))));\n s.data = bytes;\n s.len = bytes.length;\n s.loaded = true;\n }\n\n function rangedOf(node: LiveFsNode): RangedFile | undefined {\n const s = node.live;\n if (s.ranged || !s.ranges) return s.ranged;\n const bridge = bridgeOf(node);\n const path = () => liveNodePath(linked.holder(node));\n const file = () => fileIo(node) as Required<SyncFsFileIo>;\n const io = {\n pread: (_: string, at: number, n: number, version?: string) =>\n file().pread(path(), at, n, version),\n pwrite: (_: string, at: number, bytes: Uint8Array, transfer?: boolean) =>\n file().pwrite(path(), at, bytes, transfer),\n truncate: (_: string, size: number) => file().truncate(path(), size),\n };\n const st = call(() => bridge.stat(path()));\n s.ranged = new RangedFile(io, path(), st.size, st.version);\n return s.ranged;\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 || stale(s) || !(s.data || s.ranged)) return;\n if (s.ranged) call(() => s.ranged?.flush());\n else {\n const bytes = (s.data as Uint8Array).slice(0, s.len);\n call(() => fileIo(node).writeFile(liveNodePath(linked.holder(node)), bytes, true));\n }\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.orphan) {\n const st = statOf(node);\n if (st.readonly) throw new Fs.ErrnoError(wasiErrno('EROFS'));\n if (st.maxFile !== undefined && size > st.maxFile) {\n throw new Fs.ErrnoError(wasiErrno('EFBIG'));\n }\n }\n const ranged = s.openCount > 0 ? rangedOf(node) : undefined;\n if (ranged) {\n ranged.truncate(size);\n markDirty(node);\n return;\n }\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 markDirty(node);\n return;\n }\n\n const path = liveNodePath(node);\n const bridge = bridgeOf(node);\n if (statOf(node).ranged && bridge.truncate) {\n call(() => bridge.truncate?.(path, size));\n s.stat = undefined;\n return;\n }\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 handled,\n linked,\n call,\n metadataCall,\n makeNode,\n statOf,\n childPath,\n ensureLoaded,\n ensureCapacity,\n rangedOf,\n flushNode,\n markDirty,\n flushDirty,\n truncate,\n };\n}\n\ntype LiveHelpers = ReturnType<typeof createHelpers>;\n\nfunction freshStat(h: LiveHelpers, node: LiveFsNode): SyncFsBridgeStat {\n const { statOf } = h;\n const st = statOf(node);\n if (!st.linkable) return st;\n node.live.stat = undefined;\n return statOf(node);\n}\n\nfunction orphaned(h: LiveHelpers, node: LiveFsNode, st: SyncFsBridgeStat): void {\n const { bridgeOf } = h;\n const s = node.live;\n const nlink = st.nlink ?? 1;\n let kept = false;\n try {\n kept = nlink > 1 && s.handle !== undefined && bridgeOf(node).kept?.(s.handle) === true;\n } catch {}\n if (nlink > 1 && !kept && h.linked.holder(node) !== node) {\n s.stat = undefined;\n return;\n }\n s.orphan = true;\n if (!kept) return;\n s.kept = true;\n s.stat = { ...st, nlink: nlink - 1 };\n const id = h.linked.idOf(st);\n if (id !== undefined) h.linked.know(s, id);\n}\n\nfunction createNodeOps(h: LiveHelpers): LiveNodeOps {\n const { Fs, bridgeOf, call, metadataCall, makeNode, statOf, childPath, flushNode, truncate } = h;\n const { ensureLoaded } = h;\n const setTimes = (node: LiveFsNode, path: string, atime: number, mtime: number): void => {\n const now = Fs.sliccTouch === true;\n if (Fs.isLink(node.mode)) {\n metadataCall(() => bridgeOf(node).lutimes(path, atime, mtime, now));\n return;\n }\n flushNode(node);\n metadataCall(() => bridgeOf(node).utimes(path, atime, mtime, now));\n };\n const stamped = typeof (Fs as { doSetAttr?: unknown }).doSetAttr !== 'function';\n const timesOf = (node: LiveFsNode, attr: LiveSetAttr): [number, number] | undefined => {\n const mtime = toMs(attr.mtime) ?? (stamped ? attr.timestamp : undefined);\n const atime = toMs(attr.atime);\n if (mtime !== undefined && attr.atime !== null) return [atime ?? mtime, mtime];\n if (atime === undefined && mtime === undefined) return undefined;\n const st = statOf(node);\n return [atime ?? st.atimeMs ?? st.mtimeMs ?? 0, mtime ?? st.mtimeMs ?? 0];\n };\n return {\n getattr(node) {\n const owned = bridgeOf(node).owners === true;\n if (owned && Fs.isLink(node.mode) && statOf(node).uid === undefined)\n node.live.stat = undefined;\n const st = statOf(node);\n const s = node.live;\n const size = Fs.isDir(node.mode) ? 4096 : (s.ranged?.size() ?? (s.loaded ? s.len : st.size));\n const mtime = new Date(st.mtimeMs ?? 0);\n return {\n dev: st.dev ?? 1,\n ino: st.ino ?? inodeOf(liveNodePath(node)),\n mode: node.mode,\n nlink: st.nlink ?? 1,\n uid: owned ? (st.uid ?? 0) : 0,\n gid: owned ? (st.gid ?? 0) : 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) * 8,\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 if (Fs.isLink(node.mode)) throw new Fs.ErrnoError(wasiErrno('EOPNOTSUPP'));\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 times = timesOf(node, attr);\n if (times) setTimes(node, path, ...times);\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 const bridge = bridgeOf(parent);\n const perm = bridge.owners ? mode & PERM_MASK : undefined;\n if (Fs.isDir(mode) && perm !== undefined) {\n call(() => bridge.mkdir(path, perm));\n } else if (Fs.isDir(mode)) {\n call(() => bridge.mkdir(path));\n\n const masked = mode & PERM_MASK & ~UMASK;\n if (masked !== DEFAULT_DIR_PERM) metadataCall(() => bridge.chmod(path, masked));\n } else if (Fs.isFile(mode)) {\n call(() =>\n bridge.create ? bridge.create(path, perm) : bridge.writeFile(path, new Uint8Array(0))\n );\n } else {\n throw new Fs.ErrnoError(wasiErrno('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 if (Fs.isFile(mode)) node.live.created = true;\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 const st = open && freshStat(h, open);\n if (open) {\n const ranged = h.rangedOf(open);\n if (ranged) ranged.pin();\n else ensureLoaded(open);\n }\n call(() => bridgeOf(parent).unlink(childPath(parent, name)));\n if (open && st) orphaned(h, open, st);\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(wasiErrno('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, bridgeOf, rangedOf } = h;\n const held = (stream: LiveFsStream, change: 1 | -1) => {\n const s = stream.node.live;\n if ((stream.flags & 3) === 0 || s.orphan) return;\n const before = s.writers ?? 0;\n s.writers = Math.max(0, before + change);\n if ((before === 0) !== (s.writers === 0)) {\n try {\n bridgeOf(stream.node).hold?.(liveNodePath(stream.node), s.writers > 0);\n } catch {}\n }\n };\n const opened = (node: LiveFsNode, on: boolean, want = 0) => {\n const s = node.live;\n try {\n const handle = bridgeOf(node).hold?.(liveNodePath(node), on, true, s.handle, want);\n s.handle = on ? handle : undefined;\n h.linked.opening(node, on);\n if (s.handle === undefined) h.handled.delete(node);\n else h.handled.add(node);\n } catch (err) {\n if (refusal(err)) throw new Fs.ErrnoError(wasiErrno((err as { code: string }).code));\n }\n };\n const permitted = (stream: LiveFsStream, created: boolean): number => {\n const s = stream.node.live;\n const bridge = bridgeOf(stream.node);\n if (!bridge.owners || s.orphan) return 0;\n const want = wantOf(stream.flags) | (created ? HOLD_CREATED : 0);\n if (s.openCount > 0 && !created) {\n h.call(() => bridge.access?.(liveNodePath(stream.node), accessOf(want), 'open'));\n }\n return want;\n };\n return {\n open(stream) {\n if (!Fs.isFile(stream.node.mode)) return;\n const s = stream.node.live;\n const created = s.created === true;\n s.created = undefined;\n if (s.openCount === 0 && !s.orphan) {\n const bridge = bridgeOf(stream.node);\n s.ranges = !!(\n bridge.pread &&\n bridge.pwrite &&\n bridge.truncate &&\n statOf(stream.node).ranged\n );\n const shared = h.linked.sharedWith(stream.node);\n if (shared) stream.node.live = shared;\n else rangedOf(stream.node);\n }\n if ((stream.flags & 3) !== 0) {\n try {\n const st = statOf(stream.node);\n if (st.readonly) throw new Fs.ErrnoError(wasiErrno('EROFS'));\n stream.node.live.maxFile = st.maxFile;\n } catch (err) {\n if (stream.fd !== undefined) Fs.closeStream?.(stream.fd);\n throw err;\n }\n }\n const live = stream.node.live;\n let counted = false;\n try {\n const want = permitted(stream, created);\n live.openCount++;\n counted = true;\n if (live.openCount === 1) opened(stream.node, true, want);\n } catch (err) {\n if (counted) live.openCount--;\n if (stream.fd !== undefined) Fs.closeStream?.(stream.fd);\n throw err;\n }\n held(stream, 1);\n },\n\n dup(stream) {\n if (!Fs.isFile(stream.node.mode)) return;\n stream.node.live.openCount++;\n held(stream, 1);\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) {\n held(stream, -1);\n return;\n }\n try {\n flushNode(node);\n } finally {\n s.data = undefined;\n s.ranged = undefined;\n s.ranges = false;\n s.len = 0;\n s.loaded = false;\n held(stream, -1);\n opened(node, 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(wasiErrno('EISDIR'));\n const ranged = rangedOf(node);\n if (ranged) {\n const out = new Uint8Array(buffer.buffer, buffer.byteOffset + offset, Math.max(0, length));\n return h.call(() => ranged.readInto(position, out));\n }\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(wasiErrno('EISDIR'));\n if (length <= 0) return 0;\n const s = node.live;\n const end = position + length;\n if (s.maxFile !== undefined && end > s.maxFile) throw new Fs.ErrnoError(wasiErrno('EFBIG'));\n const ranged = rangedOf(node);\n if (ranged) {\n const bytes = new Uint8Array(buffer.buffer, buffer.byteOffset + offset, length);\n h.call(() => ranged.write(position, bytes));\n h.markDirty(node);\n return length;\n }\n ensureLoaded(node);\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 h.markDirty(node);\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 += rangedOf(stream.node)?.size() ?? (s.loaded ? s.len : statOf(stream.node).size);\n }\n if (pos < 0) throw new Fs.ErrnoError(wasiErrno('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 handled: h.handled,\n flushDirty: () => h.flushDirty(),\n mount(mount) {\n const st = h.call(() => mount.opts.bridge.stat(mount.opts.root));\n if (!st.isDirectory) throw new Fs.ErrnoError(wasiErrno('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 const s = node.live;\n if (!ownedBy(plugin, node) || !s.dirty || !(s.data || s.ranged)) continue;\n try {\n if (s.ranged) s.ranged.flush();\n else {\n const bytes = (s.data as Uint8Array).slice(0, s.len);\n pinnedIo(node.mount.opts.bridge, s.handle).writeFile(liveNodePath(node), bytes, true);\n }\n s.dirty = false;\n } catch (err) {\n throw toErrno(Fs, err);\n }\n }\n }\n}\n\nfunction refresh(s: LiveNodeState): void {\n if (s.dirty || s.orphan) return;\n if (s.ranged?.pinnedVersion !== undefined) {\n s.ranged.forget();\n return;\n }\n s.data = undefined;\n s.ranged = undefined;\n s.len = 0;\n s.loaded = false;\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 refresh(s);\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 sliccKept?: true;\n open?(path: string, flags: number, mode?: number): unknown;\n statfsNode?(node: LiveFsNode): Record<string, number>;\n sliccStatfs?: 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 guardStatfs(Fs);\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 guardKeptNodes(Fs, plugin.handled);\n guardStatfs(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 guardStatfs(Fs: LiveMountFsApi): void {\n const statfsNode = Fs.statfsNode?.bind(Fs);\n if (!statfsNode || Fs.sliccStatfs) return;\n Fs.sliccStatfs = true;\n Fs.statfsNode = (node) => {\n const defaults = statfsNode(node);\n let usage: SyncFsUsage | null | undefined;\n try {\n usage = node.live ? node.mount?.opts?.bridge?.statfs?.(liveNodePath(node)) : undefined;\n } catch {\n return defaults;\n }\n if (!usage) return defaults;\n const free = Math.max(0, Math.floor((usage.quota - usage.usage) / 4096));\n return {\n ...defaults,\n bsize: 4096,\n frsize: 4096,\n blocks: Math.ceil(usage.quota / 4096),\n bfree: free,\n bavail: free,\n };\n };\n}\n\nfunction pinnedIo(bridge: SyncFsPosixBridge, handle: number | undefined): SyncFsFileIo {\n return handle !== undefined && bridge.pinned ? bridge.pinned(handle) : bridge;\n}\n\nfunction guardKeptNodes(Fs: LiveMountFsApi, handled: Set<LiveFsNode> | undefined): void {\n const open = Fs.open?.bind(Fs);\n const forget = Fs.hashRemoveNode?.bind(Fs);\n if (!open || !forget || !Fs.lookupPath || !handled || Fs.sliccKept) return;\n Fs.sliccKept = true;\n const lookupPath = Fs.lookupPath.bind(Fs);\n Fs.open = (path, flags, mode) => {\n const name = path.slice(path.lastIndexOf('/') + 1);\n if (![...handled].some((held) => held.name === name)) return open(path, flags, mode);\n let node: LiveFsNode | undefined;\n try {\n node = lookupPath(path, { follow: true }).node as LiveFsNode;\n } catch {}\n const handle = node?.live?.openCount ? node.live.handle : undefined;\n if (node && handle !== undefined && node.mount.opts.bridge.kept?.(handle)) forget(node);\n return open(path, flags, mode);\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(wasiErrno('EXDEV'));\n rename(from, to);\n };\n}\n\nexport interface LiveChownFs extends LiveFsApi {\n lookupPath(path: string, opts?: { follow?: boolean }): { node: object };\n chown?(path: string | object, uid: number, gid: number, dontFollow?: boolean): void;\n fchown?(fd: number, uid: number, gid: number): void;\n getStreamChecked?(fd: number): { node: object; path?: string };\n}\n\nfunction idOf(value: number): number | undefined {\n return value === -1 || value === 0xffffffff ? undefined : value >>> 0;\n}\n\nexport function useLiveChown(Fs: LiveChownFs): void {\n const chown = Fs.chown?.bind(Fs);\n if (!chown) return;\n Fs.chown = (path, uid, gid, dontFollow) => {\n const node = (\n typeof path === 'string' ? Fs.lookupPath(path, { follow: !dontFollow }).node : path\n ) as LiveFsNode;\n if (!node.live || node.live.orphan) return chown(path, uid, gid, dontFollow);\n try {\n node.mount.opts.bridge.chown?.(liveNodePath(node), idOf(uid), idOf(gid));\n } catch (err) {\n throw toErrno(Fs, err);\n }\n node.live.stat = undefined;\n if (node.parent?.live) node.parent.live.listed = undefined;\n };\n const { getStreamChecked } = Fs;\n if (!Fs.fchown || !getStreamChecked) return;\n Fs.fchown = (fd, uid, gid) => {\n const stream = getStreamChecked.call(Fs, fd);\n const live = (stream.node as LiveFsNode).live !== undefined;\n const target = live || stream.path === undefined ? stream.node : stream.path;\n (Fs.chown as NonNullable<LiveChownFs['chown']>)(target, uid, gid);\n };\n}\n", "import {\n flushLiveVfs,\n invalidateLiveVfs,\n type LiveMountFsApi,\n liveRoot,\n mountLiveVfsDirs,\n useLiveChown,\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 chown?(path: string | object, uid: number, gid: number, dontFollow?: boolean): void;\n}\n\nexport interface EmscriptenVfsHandle {\n mounted: string[];\n flush(): void;\n flushDirty(): 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 if (bridge.owners && Fs.lookupPath) useLiveChown(Fs as Parameters<typeof useLiveChown>[0]);\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 flushDirty: () => plugin.flushDirty(),\n invalidate: () => invalidateLiveVfs(Fs, plugin),\n };\n}\n", "import type { HeldMeta, PollState } from '../kernel/fd-table.ts';\nimport type { MountLine, ProcessListing } from '../kernel/proc-info.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;\nconst TCSETSF = 0x5404;\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\nconst TTY_PATH = /^\\/dev\\/tty\\d+$/;\n\ninterface TtyNodeFs {\n analyzePath?: (path: string) => { exists: boolean };\n mkdev?: (path: string, dev: number) => unknown;\n makedev?: (major: number, minor: number) => number;\n}\n\ninterface DevDirFs extends TtyNodeFs {\n lookupNode?: (parent: object, name: string) => object;\n readdir?: (path: string) => string[];\n getPath?: (node: object) => string;\n lookupPath?: (path: string, opts: { follow: boolean }) => { path: string };\n cwd?: () => string;\n}\n\nconst TTY_NAME = /^tty\\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 SEALED_PATH = '/dev/sealed';\n\nconst STRERROR: Readonly<Record<string, string>> = {\n EACCES: 'Permission denied',\n EIO: 'I/O error',\n ENOTSUP: 'Not supported',\n EOPNOTSUPP: 'Not supported',\n EFBIG: 'File too large',\n EILSEQ: 'Illegal byte sequence',\n EINTR: 'Interrupted system call',\n};\nconst CLIPBOARD_PATH = '/dev/clipboard';\n\nfunction sealedStat(minor = 250): object {\n const now = new Date();\n return {\n dev: 0x16,\n ino: 1,\n mode: 0o20666,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: (10 << 8) | minor,\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?: {\n contents?: Uint8Array;\n orphan?: boolean;\n truncate?: boolean;\n create?: boolean;\n created?: boolean;\n pin?: { version: string; size: number };\n handle?: number;\n }\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 kind?(fd: number): string | undefined;\n\n heldMeta?(fd: number): HeldMeta | undefined;\n\n access?(fd: number): 'read' | 'write' | undefined;\n\n size?(fd: number): number;\n\n openTty?(name?: string): number;\n ttyNames?(): string[];\n ttyOwner?(name: string): TtyOwner | null;\n\n tcgets?(fd: number): Termios;\n tcsets?(fd: number, termios: Termios, flush?: boolean): void;\n winsize?(fd: number): [number, number];\n\n openPty?(): number;\n openPts?(n: number, noctty: boolean): number;\n\n ptyNumbers?(): number[];\n\n openSealed?(): number;\n openClipboard?(flags: number): number;\n procList?(): ProcessListing;\n mountList?(): MountLine[];\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 mmap?: 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(\n stream: ProcessStream,\n buffer: Uint8Array,\n offset: number,\n length: number,\n position?: number\n ): number;\n write(stream: ProcessStream, buffer: Uint8Array, offset: number, length: number): number;\n\n stat?(path: string, dontFollow?: boolean): object;\n writeFile?(path: string, data: string | Uint8Array): void;\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 owners?: boolean;\n program?: string;\n}\n\nexport interface TtyOwner {\n uid: number;\n gid: number;\n mode?: number;\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 descriptions = new Map<string, () => object>();\n\n private described = 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 this.ttyNode(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 listSealed(): void {\n const { analyzePath, mkdev, makedev } = this.Fs as unknown as TtyNodeFs;\n if (!analyzePath || !mkdev || !makedev) return;\n const nodes: Array<[string, number, unknown]> = [\n [SEALED_PATH, 250, this.sys.openSealed],\n [CLIPBOARD_PATH, 251, this.sys.openClipboard],\n ];\n for (const [path, minor, present] of nodes) {\n if (!present || analyzePath.call(this.Fs, path).exists) continue;\n try {\n mkdev.call(this.Fs, path, makedev.call(this.Fs, 10, minor));\n } catch {}\n }\n }\n\n private readonly reporting = new Set<number>();\n\n reportClose(kfd: number): void {\n this.reporting.add(kfd);\n }\n\n quitting = false;\n\n private atExit = false;\n\n private failedAtExit = false;\n\n private readonly committed = new Set<number>();\n\n exiting(): () => void {\n this.atExit = true;\n return () => {\n this.atExit = false;\n };\n }\n\n private commitStdout(): void {\n const kfd = this.Fs.getStream(1)?.sliccKernelFd;\n if (kfd === undefined || !this.reporting.delete(kfd)) return;\n this.committed.add(kfd);\n try {\n this.sys.close(kfd);\n } catch (e) {\n if (e instanceof SyscallError) this.stdoutFailed(e.code);\n }\n }\n\n exitStatus(status: number): number {\n return this.failedAtExit && status === 0 ? 1 : status;\n }\n\n private reportedClose(stream: ProcessStream, kfd: number): void {\n try {\n this.sys.close(kfd);\n } catch (e) {\n if (this.quitting && stream.fd === 1 && e instanceof SyscallError) this.stdoutFailed(e.code);\n this.call(() => {\n throw e;\n });\n }\n }\n\n private stdoutFailed(code: string): void {\n this.failedAtExit = true;\n const stderr = this.Fs.getStream(2)?.sliccKernelFd;\n if (stderr === undefined) return;\n const line = `${this.options.program ?? 'program'}: write error: ${STRERROR[code] ?? code}\\n`;\n try {\n this.sys.write(stderr, new TextEncoder().encode(line));\n } catch {}\n }\n\n private creatingTerminal = false;\n\n private useTerminalNodes(): void {\n const fs = this.Fs as unknown as DevDirFs;\n const { lookupNode, readdir, getPath, mkdev, makedev } = fs;\n const ttyNames = this.sys.ttyNames?.bind(this.sys);\n if (!lookupNode || !readdir || !getPath || !mkdev || !makedev || !ttyNames) return;\n fs.lookupNode = (parent, name) => {\n try {\n return lookupNode.call(fs, parent, name);\n } catch (e) {\n const path = `/dev/${name}`;\n if (this.creatingTerminal || !TTY_NAME.test(name) || getPath.call(fs, parent) !== '/dev')\n throw e;\n if (!ttyNames().includes(path)) throw e;\n this.creatingTerminal = true;\n try {\n mkdev.call(fs, path, makedev.call(fs, 6, 0));\n } finally {\n this.creatingTerminal = false;\n }\n return lookupNode.call(fs, parent, name);\n }\n };\n fs.readdir = (path) => {\n const names = readdir.call(fs, path);\n if (path.replace(/\\/+$/, '') !== '/dev') return names;\n const missing = ttyNames()\n .map((tty) => tty.slice('/dev/'.length))\n .filter((name) => TTY_NAME.test(name) && !names.includes(name));\n return [...names, ...missing];\n };\n }\n\n private ttyNode(name: string): void {\n const { analyzePath, mkdev, makedev } = this.Fs as unknown as TtyNodeFs;\n if (!TTY_PATH.test(name) || !analyzePath || !mkdev || !makedev) return;\n if (!analyzePath.call(this.Fs, name).exists)\n mkdev.call(this.Fs, name, makedev.call(this.Fs, 6, 0));\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, op === TCSETSF);\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 sizeFromKernel(stream: ProcessStream, kfd: number): void {\n const { size } = this.sys;\n if (!size) return;\n const node = stream.node;\n this.describe(stream, `${stream.path ?? ''}:${++this.described}`, () => ({\n ...node.node_ops?.getattr?.(node),\n size: this.call(() => size.call(this.sys, kfd)),\n }));\n }\n\n describe(stream: ProcessStream, name: string, getattr: () => object): void {\n if (this.descriptions.size === 0) this.useDescriptions();\n this.descriptions.set(name, getattr);\n stream.path = name;\n stream.stream_ops = { ...stream.stream_ops, getattr };\n }\n\n private useDescriptions(): void {\n const fs = this.Fs as unknown as PtyPathFs;\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 const getattr = this.descriptions.get(path);\n return getattr ? getattr() : original.call(fs, path, ...rest);\n };\n }\n }\n\n useControllingTerminal(): void {\n if (typeof this.Fs.open !== 'function') return;\n this.usePtyPaths();\n this.useTerminalNodes();\n this.listSealed();\n const open = this.Fs.open.bind(this.Fs);\n this.Fs.open = (path, flags, mode) => {\n const device = typeof path === 'string' ? this.devicePath(path) : undefined;\n if (device !== undefined && TTY_PATH.test(device) && !this.terminalExists(device)) {\n throw new this.Fs.ErrnoError(wasiErrno('ENOENT'));\n }\n const pty =\n this.openPty(open, path, flags, mode) ??\n this.openSealed(open, path, flags, mode) ??\n this.openClipboard(open, path, flags, mode);\n if (pty) return pty;\n this.refuseExclusiveLink(path, flags);\n const stream = this.openRacing(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 openRacing(\n open: NonNullable<ProcessFs['open']>,\n path: string,\n flags: number,\n mode?: number\n ): ProcessStream {\n try {\n return open(path, flags, mode);\n } catch (err) {\n const lost = (err as { errno?: number }).errno === wasiErrno('EEXIST') && !(flags & O_EXCL);\n if (!lost) throw err;\n return open(path, flags, mode);\n }\n }\n\n private refuseExclusiveLink(path: string, flags: number): void {\n if ((flags & (O_CREAT | O_EXCL)) !== (O_CREAT | O_EXCL)) return;\n let mode = 0;\n try {\n mode = (this.Fs.stat?.(path, true) as { mode?: number } | undefined)?.mode ?? 0;\n } catch {}\n if ((mode & 0o170000) === 0o120000) throw new this.Fs.ErrnoError(wasiErrno('EEXIST'));\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 return this.vessel(open, kfd, { path, flags, mode }, true);\n }\n\n private openSealed(\n open: NonNullable<ProcessFs['open']>,\n path: string,\n flags: number,\n mode?: number\n ): ProcessStream | undefined {\n const { openSealed } = this.sys;\n if (path !== SEALED_PATH || !openSealed) return undefined;\n const kfd = this.call(() => openSealed.call(this.sys));\n return this.vessel(open, kfd, { path, flags, mode }, false);\n }\n\n private openClipboard(\n open: NonNullable<ProcessFs['open']>,\n path: string,\n flags: number,\n mode?: number\n ): ProcessStream | undefined {\n const { openClipboard } = this.sys;\n if (path !== CLIPBOARD_PATH || !openClipboard) return undefined;\n const kfd = this.call(() => openClipboard.call(this.sys, flags & 3));\n const stream = this.vessel(open, kfd, { path, flags, mode }, false);\n this.reportClose(kfd);\n return stream;\n }\n\n private vessel(\n open: NonNullable<ProcessFs['open']>,\n kfd: number,\n at: { path: string; flags: number; mode: number | undefined },\n terminal: boolean\n ): ProcessStream {\n let stream: ProcessStream;\n try {\n stream = open('/dev/null', at.flags & ~(O_CREAT | O_EXCL | O_TRUNC), at.mode);\n } catch (e) {\n this.sys.close(kfd);\n throw e;\n }\n\n this.attach(stream, kfd, terminal);\n\n this.nameStream(stream, at.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 (path === SEALED_PATH && this.sys.openSealed) return sealedStat();\n if (path === CLIPBOARD_PATH && this.sys.openClipboard) return sealedStat(251);\n const owned = this.ownedTty(path);\n if (owned && isPtyPath(path)) return this.owned(path, ptyStat(path));\n if (!isPtyPath(path)) {\n const st = original.call(fs, path, ...rest);\n return owned && TTY_PATH.test(path) ? this.owned(path, st as object) : st;\n }\n this.existingPty(path);\n return ptyStat(path);\n };\n }\n }\n\n private ownedTty(path: string): boolean {\n return this.options.owners === true && this.sys.ttyOwner !== undefined && path !== '/dev/ptmx';\n }\n\n private owned(path: string, st: object): object {\n const ask = this.sys.ttyOwner as (name: string) => TtyOwner | null;\n const owner = this.call(() => ask.call(this.sys, path));\n if (!owner) return st;\n const mode = ((st as { mode: number }).mode & ~0o7777) | (owner.mode ?? 0o620);\n return { ...st, uid: owner.uid, gid: owner.gid, mode };\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 devicePath(path: string): string | undefined {\n const name = path.slice(path.lastIndexOf('/') + 1);\n if (!TTY_NAME.test(name)) return undefined;\n const { lookupPath, cwd } = this.Fs as unknown as DevDirFs;\n const absolute = path.startsWith('/') ? path : `${cwd?.call(this.Fs) ?? '/'}/${path}`;\n const dir = absolute.slice(0, absolute.lastIndexOf('/')) || '/';\n try {\n const real = lookupPath?.call(this.Fs, dir, { follow: true }).path ?? dir;\n return `${real === '/' ? '' : real}/${name}`;\n } catch {\n return absolute;\n }\n }\n\n private terminalExists(path: string): boolean {\n const { analyzePath } = this.Fs as unknown as TtyNodeFs;\n return analyzePath?.call(this.Fs, path).exists ?? true;\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 if (this.atExit && stream.fd === 2 && this.reporting.size > 0) this.commitStdout();\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 if (this.committed.size > 0 && this.committed.delete(kfd)) return;\n if (this.reporting.size > 0 && this.reporting.delete(kfd)) {\n this.reportedClose(stream, kfd);\n return;\n }\n try {\n this.sys.close(kfd);\n } catch {}\n },\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 { hostnameOf, hostsFile } from '../kernel/net/loopback-names.ts';\nimport type { MountLine } from '../kernel/proc-info.ts';\nimport { type LiveFsNode, liveNodePath } from '../realm/live-vfs-fs.ts';\nimport 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 quietTarget(dup3: GlueSyscall, deps: CloexecDeps): GlueSyscall {\n return (fd = -1, newfd = -1, flags = 0, ...rest) => {\n const Fs = deps.fs();\n const target = fd === newfd || flags !== 0 ? undefined : Fs?.getStream(newfd);\n if (target && Fs?.getStream(fd)) {\n try {\n Fs.close?.(target);\n } catch {}\n }\n return dup3(fd, newfd, flags, ...rest);\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(quietTarget(f, deps), 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;\nconst AT_SYMLINK_NOFOLLOW = 0x100;\nconst EMSCRIPTEN_EPERM = 63;\n\ninterface UtimeNode {\n node_ops: {\n setattr?(node: UtimeNode, attr: { atime: number | null; mtime: number | null }): void;\n };\n}\n\ninterface UtimeFs {\n utime?(path: string, atime: number | null, mtime: number | null): void;\n lookupPath?(path: string, opts: { follow: boolean }): { node: UtimeNode };\n ErrnoError?: new (errno: number) => Error;\n}\n\nconst O_PATH = 0o10000000;\n\ninterface MayOpenFs {\n mayOpen?(node: { mode: number }, flags: number): number;\n isLink?(mode: number): boolean;\n}\n\nexport function pathOpensLinks(Fs: ProcessFs): void {\n const fs = Fs as unknown as MayOpenFs;\n const { mayOpen, isLink } = fs;\n if (!mayOpen || !isLink) return;\n fs.mayOpen = (node, flags) =>\n flags & O_PATH && isLink.call(fs, node.mode) ? 0 : mayOpen.call(fs, node, flags);\n}\n\ntype Syscall = (...args: number[]) => number;\n\nexport interface KernelImports {\n openat?: unknown;\n mkdirat?: unknown;\n mknodat?: unknown;\n umask?: unknown;\n faccessat?: unknown;\n utimensat?: unknown;\n getppid?: unknown;\n resizeHeap?: unknown;\n fdWrite?: unknown;\n fdRead?: unknown;\n sleepMs?: unknown;\n}\n\nconst LITERALS: Record<keyof KernelImports, string> = {\n openat: '__syscall_openat',\n mkdirat: '__syscall_mkdirat',\n mknodat: '__syscall_mknodat',\n umask: '__syscall_umask',\n faccessat: '__syscall_faccessat',\n utimensat: '__syscall_utimensat',\n getppid: 'slicc_getppid_js',\n resizeHeap: 'emscripten_resize_heap',\n fdWrite: 'fd_write',\n fdRead: 'fd_read',\n sleepMs: 'slicc_sleep_ms',\n};\n\nexport function importKey(\n namespace: WebAssembly.ModuleImports,\n name: keyof KernelImports,\n glue: KernelImports | undefined\n): string | undefined {\n const own = glue?.[name];\n if (typeof own === 'function') {\n const found = Object.keys(namespace).find((k) => namespace[k] === own);\n if (found !== undefined) return found;\n }\n const literal = LITERALS[name];\n return typeof namespace[literal] === 'function' ? literal : undefined;\n}\n\nexport function wrapImport(\n imports: WebAssembly.Imports,\n name: keyof KernelImports,\n glue: KernelImports | undefined,\n wrap: (original: Syscall) => Syscall\n): void {\n let wrapped = false;\n for (const ns of namespaces(imports)) {\n const key = importKey(ns, name, glue);\n if (key === undefined) continue;\n ns[key] = wrap(ns[key] as Syscall);\n wrapped = true;\n }\n if (!wrapped && typeof glue?.[name] === 'function') {\n throw new Error(`slicc-kernel cannot find the glue's ${LITERALS[name]} among its imports`);\n }\n}\n\nexport interface UmaskDeps {\n initial: number;\n memory(): WebAssembly.Memory | undefined;\n set(mask: number): void;\n glue?: KernelImports | undefined;\n}\n\nexport function kernelUmask(imports: WebAssembly.Imports, deps: UmaskDeps): void {\n let umask = deps.initial & 0o777;\n const { glue } = deps;\n wrapImport(imports, 'openat', glue, (openat) => (dirfd, path, flags, varargs) => {\n const memory = deps.memory();\n if (flags & O_CREAT && varargs && memory) new Int32Array(memory.buffer)[varargs >> 2] &= ~umask;\n return openat(dirfd, path, flags, varargs);\n });\n wrapImport(\n imports,\n 'mkdirat',\n glue,\n (mkdirat) => (dirfd, path, mode) => mkdirat(dirfd, path, mode & ~umask)\n );\n wrapImport(\n imports,\n 'mknodat',\n glue,\n (mknodat) => (dirfd, path, mode, dev) => mknodat(dirfd, path, mode & ~umask, dev)\n );\n wrapImport(imports, 'umask', glue, (own) => {\n own(umask);\n return (mask) => {\n const old = umask;\n umask = mask & 0o777;\n own(umask);\n deps.set(umask);\n return old;\n };\n });\n}\n\nconst UTIME_NOW = 0x3fffffff;\nconst UTIME_OMIT = 0x3ffffffe;\n\nfunction touching(times: number, memory: WebAssembly.Memory | undefined): boolean {\n if (times === 0) return true;\n if (!memory) return false;\n const heap = new Int32Array(memory.buffer);\n const nsec = [heap[(times + 8) >> 2], heap[(times + 24) >> 2]];\n return nsec.every((n) => n === UTIME_NOW || n === UTIME_OMIT);\n}\n\nfunction touch<T>(Fs: TouchFs | undefined, on: boolean, run: () => T): T {\n if (!Fs || !on) return run();\n Fs.sliccTouch = true;\n try {\n return run();\n } finally {\n Fs.sliccTouch = undefined;\n }\n}\n\ninterface TouchFs {\n sliccTouch?: boolean;\n}\n\nexport function noFollowUtimes(\n imports: WebAssembly.Imports,\n fs: () => ProcessFs | undefined,\n glue?: unknown,\n memory: () => WebAssembly.Memory | undefined = () => undefined\n): void {\n wrapImport(\n imports,\n 'utimensat',\n { utimensat: glue },\n (utimensat) => (dirfd, path, times, flags) => {\n const Fs = fs() as (UtimeFs & TouchFs) | undefined;\n const on = touching(times, memory());\n const { utime, lookupPath, ErrnoError } = Fs ?? {};\n if (!Fs || !(flags & AT_SYMLINK_NOFOLLOW) || !utime || !lookupPath || !ErrnoError) {\n return touch(Fs, on, () => utimensat(dirfd, path, times, flags));\n }\n Fs.utime = (at, atime, mtime) => {\n const { node } = lookupPath.call(Fs, at, { follow: false });\n if (!node.node_ops.setattr) throw new ErrnoError(EMSCRIPTEN_EPERM);\n node.node_ops.setattr(node, { atime, mtime });\n };\n try {\n return touch(Fs, on, () => utimensat(dirfd, path, times, flags));\n } finally {\n Fs.utime = utime;\n }\n }\n );\n}\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\nconst PROT_WRITE = 2;\nconst MAP_PRIVATE = 2;\nconst MAP_TYPE = 0xf;\nconst O_WRONLY = 1;\nconst MAP_ALIGN = 65536;\n\ntype Mmap = (\n stream: ProcessStream,\n length: number,\n position: number,\n prot: number,\n flags: number\n) => { ptr: number; allocated: boolean };\n\nexport type Memalign = (alignment: number, size: number) => number;\n\nexport interface MmapDeps {\n sys: Pick<ProcessSys, 'pread'>;\n memory: () => WebAssembly.Memory | undefined;\n memalign: () => Memalign | undefined;\n}\n\nfunction staging(Fs: ProcessFs, length: number): Uint8Array {\n try {\n return new Uint8Array(length);\n } catch {\n throw new Fs.ErrnoError(wasiErrno('ENOMEM'));\n }\n}\n\nexport function useFileMmap(Fs: ProcessFs, deps: MmapDeps): void {\n const fs = Fs as ProcessFs & { mmap?: Mmap };\n const mmap = fs.mmap;\n if (typeof mmap !== 'function') return;\n fs.mmap = (stream, length, position, prot, flags) => {\n const memalign = deps.memalign();\n const memory = deps.memory();\n const shared = (flags & MAP_TYPE) !== MAP_PRIVATE && (prot & PROT_WRITE) !== 0;\n const kfd = stream.sliccKernelFile ? stream.sliccKernelFd : undefined;\n if (shared && kfd !== undefined) throw new Fs.ErrnoError(wasiErrno('ENODEV'));\n if (\n (stream.stream_ops.mmap && kfd === undefined) ||\n !memalign ||\n !memory ||\n length <= 0 ||\n shared ||\n (stream.flags & O_ACCMODE) === O_WRONLY ||\n !Fs.isFile(stream.node.mode)\n ) {\n return mmap.call(fs, stream, length, position, prot, flags);\n }\n const data = staging(Fs, length);\n let done = 0;\n try {\n if (kfd !== undefined) done = readInto(deps.sys, kfd, data, position);\n else {\n for (let got = 1; done < length && got > 0; done += got) {\n got = Fs.read(stream, data, done, length - done, position + done);\n }\n }\n } catch (err) {\n throw new Fs.ErrnoError(errnoOf(err));\n }\n const size = Math.ceil(length / MAP_ALIGN) * MAP_ALIGN;\n const ptr = memalign(MAP_ALIGN, size);\n if (!ptr) throw new Fs.ErrnoError(wasiErrno('ENOMEM'));\n const target = new Uint8Array(memory.buffer, ptr, size);\n target.fill(0);\n target.set(data.subarray(0, done));\n return { ptr, allocated: true };\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\ninterface DeviceFs {\n analyzePath?: (path: string) => { exists: boolean };\n registerDevice?: (dev: number, ops: object) => void;\n mkdev?: (path: string, mode: number, dev: number) => unknown;\n makedev?: (major: number, minor: number) => number;\n}\n\nconst CHAR_DEVICE = 0o20666;\n\nexport function useZeroDevices(Fs: ProcessFs): void {\n const { analyzePath, registerDevice, mkdev, makedev } = Fs as unknown as DeviceFs;\n if (!analyzePath || !registerDevice || !mkdev || !makedev) return;\n const zeros = (_s: unknown, buffer: Uint8Array, offset: number, length: number) => {\n buffer.fill(0, offset, offset + length);\n return length;\n };\n const devices = [\n ['/dev/zero', 5, (_s: unknown, _b: Uint8Array, _o: number, length: number) => length],\n [\n '/dev/full',\n 7,\n (_s: unknown, _b: Uint8Array, _o: number, length: number) => {\n if (length > 0) throw new Fs.ErrnoError(wasiErrno('ENOSPC'));\n return 0;\n },\n ],\n ] as const;\n for (const [path, minor, write] of devices) {\n if (analyzePath.call(Fs, path).exists) continue;\n const dev = makedev.call(Fs, 1, minor);\n registerDevice.call(Fs, dev, { read: zeros, write, llseek: () => 0 });\n mkdev.call(Fs, path, CHAR_DEVICE, dev);\n }\n}\n\nfunction linkStdio(Fs: ProcessFs): void {\n const { unlink, symlink } = Fs as { unlink?: (path: string) => void } & ProcessFs;\n if (!unlink || !symlink) return;\n for (const [fd, name] of ['stdin', 'stdout', 'stderr'].entries()) {\n try {\n unlink.call(Fs, `/dev/${name}`);\n } catch {}\n try {\n symlink.call(Fs, `/proc/self/fd/${fd}`, `/dev/${name}`);\n } catch {}\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 linkStdio(Fs);\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\nconst O_ACCMODE = 0o3;\nconst O_CREAT = 0o100;\n\nconst field = (text: string) =>\n (text || 'none').replace(/[\\s\\\\]/g, (c) => `\\\\${c.charCodeAt(0).toString(8).padStart(3, '0')}`);\n\nlet pinnedRoot: string | undefined;\n\nconst rootKind = (): string => (globalThis.navigator?.storage ? 'opfs' : 'memory');\n\nexport function pinRootKind(): void {\n pinnedRoot = rootKind();\n}\n\nexport function mountTable(mounts: MountLine[] = []): string {\n const root = pinnedRoot ?? rootKind();\n const lines = [`${root} / ${root} rw 0 0`, 'devfs /dev devfs rw 0 0', 'proc /proc proc rw 0 0'];\n for (const m of mounts) {\n const options = Object.entries(m.options).map(([k, v]) => (v === '' ? k : `${k}=${v}`));\n if (m.state !== 'ok') options.push(m.state);\n const access = options.includes('ro') ? [] : ['rw'];\n lines.push(\n `${field(m.source)} ${field(m.target)} ${m.type} ${[...access, ...options].join(',')} 0 0`\n );\n }\n return `${lines.join('\\n')}\\n`;\n}\n\nconst NAME = /^[a-z_][a-z0-9_-]*$/i;\n\nexport function accounts(env: Record<string, string> = {}): { passwd: string; group: string } {\n const user = env.USER ?? 'web_user';\n const name = NAME.test(user) && user !== 'root' ? user : 'user';\n const home = env.HOME || '/home';\n return {\n passwd: `root:x:0:0:root:/root:/bin/sh\\n${name}:x:1000:1000:${name}:${home}:/bin/bash\\n`,\n group: `root:x:0:\\n${name}:x:1000:\\n`,\n };\n}\n\nexport function useMounts(Fs: ProcessFs, env: Record<string, string> = {}, live = false): void {\n const { writeFile, mkdirTree } = Fs;\n if (typeof Fs.open !== 'function' || typeof writeFile !== 'function') return;\n const { passwd, group } = accounts(env);\n const backing: Record<string, string> = { '/etc/mtab': '/proc/mounts' };\n try {\n if (!live) writeFile.call(Fs, '/proc/mounts', mountTable());\n } catch {\n return;\n }\n try {\n mkdirTree.call(Fs, '/dev/.etc');\n writeFile.call(Fs, '/dev/.etc/passwd', passwd);\n writeFile.call(Fs, '/dev/.etc/group', group);\n writeFile.call(Fs, '/dev/.etc/hosts', hostsFile(hostnameOf(env)));\n writeFile.call(Fs, '/dev/.etc/hostname', `${hostnameOf(env)}\\n`);\n backing['/etc/passwd'] = '/dev/.etc/passwd';\n backing['/etc/group'] = '/dev/.etc/group';\n backing['/etc/hosts'] = '/dev/.etc/hosts';\n backing['/etc/hostname'] = '/dev/.etc/hostname';\n } catch {}\n const open = Fs.open.bind(Fs);\n Fs.open = (path, flags, mode) => {\n const instead = backing[path];\n if (!instead || (flags & (O_ACCMODE | O_CREAT)) !== 0) return open(path, flags, mode);\n try {\n return open(path, flags, mode);\n } catch (e) {\n if ((e as { errno?: unknown })?.errno !== wasiErrno('ENOENT')) throw e;\n return open(instead, flags, mode);\n }\n };\n}\n\nconst AT_FDCWD = -100;\nconst AT_EACCESS = 0x200;\n\ninterface AccessFs {\n lookupPath?(path: string, opts: { follow: boolean }): { node: LiveFsNode };\n cwd?(): string;\n getStream?(fd: number): { path?: string } | null | undefined;\n}\n\nfunction cString(memory: WebAssembly.Memory, at: number): string {\n const bytes = new Uint8Array(memory.buffer, at);\n return new TextDecoder().decode(bytes.subarray(0, bytes.indexOf(0)));\n}\n\nfunction baseOf(Fs: AccessFs, dirfd: number): string {\n return dirfd === AT_FDCWD ? (Fs.cwd?.() ?? '/') : (Fs.getStream?.(dirfd)?.path ?? '/');\n}\n\nconst W_ACCESS = 2;\n\nfunction readonlyRefusal(\n Fs: AccessFs,\n memory: WebAssembly.Memory,\n call: { dirfd: number; path: number; amode: number; flags: number }\n): number {\n if (!(call.amode & W_ACCESS)) return 0;\n try {\n const name = cString(memory, call.path);\n const abs = name.startsWith('/') ? name : `${baseOf(Fs, call.dirfd)}/${name}`;\n const follow = (call.flags & AT_SYMLINK_NOFOLLOW) === 0;\n const { node } = (Fs.lookupPath as NonNullable<AccessFs['lookupPath']>).call(Fs, abs, {\n follow,\n });\n const bridge = node.live ? node.mount.opts.bridge : undefined;\n const stat = (bridge as { stat?: (path: string) => { readonly?: boolean } } | undefined)?.stat;\n return stat?.(liveNodePath(node)).readonly ? -wasiErrno('EROFS') : 0;\n } catch {\n return 0;\n }\n}\n\nfunction kernelChecks(\n Fs: AccessFs,\n memory: WebAssembly.Memory,\n call: { dirfd: number; path: number; amode: number; flags: number }\n): number {\n const name = cString(memory, call.path);\n const abs = name.startsWith('/') ? name : `${baseOf(Fs, call.dirfd)}/${name}`;\n const lookupPath = Fs.lookupPath as NonNullable<AccessFs['lookupPath']>;\n const { node } = lookupPath.call(Fs, abs, { follow: (call.flags & AT_SYMLINK_NOFOLLOW) === 0 });\n const bridge = node.live ? node.mount.opts.bridge : undefined;\n if (!bridge?.owners || !bridge.access) return 0;\n const kind = call.flags & AT_EACCESS ? 'eaccess' : 'access';\n bridge.access(liveNodePath(node), call.amode, kind, (call.flags & AT_SYMLINK_NOFOLLOW) !== 0);\n return 0;\n}\n\nexport function kernelAccess(\n imports: WebAssembly.Imports,\n fs: () => ProcessFs | undefined,\n memory: () => WebAssembly.Memory | undefined,\n glue?: KernelImports\n): void {\n wrapImport(imports, 'faccessat', glue, (own) => (dirfd, path, amode, flags) => {\n const Fs = fs() as AccessFs | undefined;\n const heap = memory();\n const call = { dirfd, path, amode: amode & 7, flags };\n const refused = Fs?.lookupPath && heap ? readonlyRefusal(Fs, heap, call) : 0;\n if (refused !== 0) return refused;\n const rc = own(dirfd, path, amode, flags);\n if (rc !== 0 || !Fs?.lookupPath || !heap) return rc;\n try {\n return kernelChecks(Fs, heap, { dirfd, path, amode: amode & 7, flags });\n } catch (err) {\n return -errnoOf(err);\n }\n });\n}\n\nconst DEVICE_MODES: ReadonlyArray<[string, number]> = [\n ['/', 0o755],\n ['/dev', 0o755],\n ['/dev/null', 0o666],\n ['/dev/zero', 0o666],\n ['/dev/full', 0o666],\n ['/dev/random', 0o666],\n ['/dev/urandom', 0o666],\n ['/dev/tty', 0o666],\n ['/dev/shm', 0o1777],\n];\n\ninterface ChmodFs {\n chmod?(path: string, mode: number): void;\n}\n\nexport function linuxDevices(Fs: ProcessFs): void {\n const { chmod } = Fs as unknown as ChmodFs;\n if (!chmod) return;\n for (const [path, mode] of DEVICE_MODES) {\n try {\n chmod.call(Fs, path, mode);\n } catch {}\n }\n}\n", "import type { InheritedSlot } from '../kernel/children.ts';\nimport type { DeviceAccess, DeviceMeta, 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?: {\n orphan?: boolean;\n data?: Uint8Array;\n len?: number;\n handle?: number;\n ranged?: {\n pinnedVersion?: string;\n size(): number;\n read(at: number, length: number): Uint8Array;\n };\n };\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 if (live.ranged) return live.ranged.read(0, live.ranged.size());\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 const ranged = (stream.node as LiveNodeBag).live?.ranged;\n const version = ranged?.pinnedVersion;\n const pin = ranged && version !== undefined ? { version, size: ranged.size() } : undefined;\n const handle = (stream.node as LiveNodeBag).live?.handle;\n const held = { ...(pin ? { pin } : {}), ...(handle !== undefined ? { handle } : {}) };\n kfd = sys.openVfs(\n livePath(stream),\n stream.flags,\n stream.position,\n contents !== undefined\n ? { contents, orphan: true }\n : Object.keys(held).length > 0\n ? held\n : 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/full': 'full',\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\nexport function deviceOfStream(stream: ProcessStream): DeviceMeta | undefined {\n const device = stream.path === undefined ? undefined : DEVICES[stream.path];\n if (!device || stream.sliccKernelFd !== undefined) return undefined;\n const access = ACCESS[stream.flags & O_ACCMODE];\n return { device, ...(access ? { access } : {}) };\n}\n\nfunction inheritedSlot(fd: number, stream: ProcessStream): InheritedSlot | undefined {\n if (stream.sliccKernelFd === undefined) {\n const device = deviceOfStream(stream);\n return device ? { fd, ...device } : undefined;\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' || entry.kind === 'clipboard') 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 streams.describe(stream, `pipe:[${fixed}]`, () => ({\n ...node.node_ops?.getattr?.(node),\n mode: FIFO_MODE,\n ino: fixed,\n 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') {\n streams.attachFile(stream, entry.kernel);\n streams.sizeFromKernel(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 === 'clipboard') streams.reportClose(entry.kernel);\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 { ChildStdio, InheritedSlot } from '../kernel/children.ts';\nimport type { Cred, CredChange } from '../kernel/cred.ts';\nimport type { WasmSyscall } from '../kernel/process.ts';\nimport type { ForkState, ForkStream } from '../kernel/protocol.ts';\nimport { defaultAction } from '../kernel/signals.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 { deviceOfStream } from './process-fork.ts';\nimport type { HttpKernel } from './process-http.ts';\nimport type { SocketKernel } from './process-sockets.ts';\nimport type { Owner } from './realm-user.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nconst S_IFMT = 0o170000;\nconst S_IFDIR = 0o040000;\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 credOf(r: SyncFsResult): Cred | number {\n return r.ok ? ((r as { json?: unknown }).json as Cred) : -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\nfunction throughKernel(sig: number): boolean {\n if (sig === 0) return false;\n const action = defaultAction(sig);\n return action === 'terminate' || action === 'stop';\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 cred(): Cred | number;\n\n setcred(change: CredChange): Cred | number;\n\n tcgetpgrp(fd: number): number;\n\n tcsetpgrp(fd: number, pgrp: number): number;\n\n execWait(pid: number): number;\n\n execve(\n file: string,\n argv: string[],\n env: Record<string, string> | null,\n cwd: string | null\n ): number;\n\n mount(source: string, target: string, fstype: string, flags: number, data: string): number;\n\n umount2(target: string, flags: 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 hostname?: string;\n\n http?: HttpKernel;\n}\n\nexport interface ProcessKernelDeps {\n transport: SyncSabTransport;\n owner?: Owner;\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 memory?(): WebAssembly.Memory | undefined;\n\n deliveries?(): number;\n}\n\nfunction restarted(issue: () => SyncFsResult): SyncFsResult {\n for (;;) {\n const r = issue();\n if (r.ok || r.errno !== 'EINTR') return r;\n }\n}\n\nfunction forkRestarted(\n deps: ProcessKernelDeps,\n state: ForkState,\n snapshotAt: number | undefined\n): SyncFsResult {\n let memory = state.memory;\n let seen = snapshotAt;\n return restarted(() => {\n const streams = deps.describeFork();\n const now = deps.deliveries?.();\n if (now !== seen) {\n seen = now;\n const live = deps.memory?.();\n if (live) memory = new Uint8Array(live.buffer).slice();\n }\n const forked = { ...state, memory, streams, cwd: deps.Fs.cwd() };\n return deps.transport.call(\n { op: 'proc-fork', state: forked, restart: true },\n Infinity,\n 'proc-fork'\n );\n });\n}\n\nfunction flushed(beforeSpawn: () => void): number {\n try {\n beforeSpawn();\n return 0;\n } catch (err) {\n const errno = (err as { errno?: unknown } | null)?.errno;\n if (typeof errno !== 'number') throw err;\n return -errno;\n }\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\nfunction anySelect(\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;\n const own = (fd: number) => kernel(fd) === undefined;\n if (![...read, ...write].some(own)) 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\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 at = (path: string) => (path === '' || path.startsWith('/') ? path : `${Fs.cwd()}/${path}`);\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.node?.mode ?? 0) & S_IFMT) === S_IFDIR && stream.path) return { dir: stream.path };\n const device = deviceOfStream(stream);\n if (device) return device;\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 const execCaptures = new Map<number, () => void>();\n\n const execWait = (pid: number): number => {\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\n const spawnChild = (\n file: string,\n argv: string[],\n env: Record<string, string> | null,\n cwd: string | null,\n fds: number[],\n actions: ReadonlyArray<readonly [number, number]> | undefined,\n exec: boolean\n ): number => {\n const unflushed = flushed(deps.beforeSpawn);\n if (unflushed < 0) return unflushed;\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 req = {\n op: 'proc-spawn' as const,\n file,\n argv,\n env: env ?? deps.env,\n cwd: cwd ?? Fs.cwd(),\n stdio,\n ...(inherit.length > 0 ? { inherit } : {}),\n ...(exec ? { exec } : {}),\n restart: true as const,\n };\n const r = restarted(() => transport.call(req, Infinity, `proc-spawn ${file}`));\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 if (exec) {\n execCaptures.set(pid, () => {\n for (const n of captures) deliver(pid, n, fds[n] as number);\n });\n return pid;\n }\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\n return {\n spawn(file, argv, env, cwd, fds, actions) {\n return spawnChild(file, argv, env, cwd, fds, actions, false);\n },\n fork(state) {\n const snapshotAt = deps.deliveries?.();\n const unflushed = flushed(deps.beforeSpawn);\n if (unflushed < 0) return unflushed;\n const r = forkRestarted(deps, state, snapshotAt);\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) => anySelect(Fs, transport, read, write, timeoutMs),\n execWait: execWait,\n execve(file, argv, env, cwd) {\n const pid = spawnChild(file, argv, env, cwd, [0, 1, 2], undefined, true);\n if (pid < 0) return pid;\n const status = execWait(pid);\n execCaptures.get(pid)?.();\n execCaptures.delete(pid);\n return status;\n },\n pause() {\n return status(call({ op: 'sig-pause' }, 'pause'));\n },\n mount(source, target, type, flags, data) {\n const req = { op: 'mount' as const, source, target: at(target), type, flags, data };\n return status(call(req, `mount ${target}`));\n },\n umount2(target, flags) {\n return status(call({ op: 'umount', target: at(target), flags }, `umount ${target}`));\n },\n kill(pid, sig) {\n if (pid === deps.pid && !throughKernel(sig)) {\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 cred: () => credOf(call({ op: 'proc-cred' }, 'cred')),\n setcred(change) {\n const cred = credOf(call({ op: 'proc-setcred', change }, 'setcred'));\n if (typeof cred === 'object' && deps.owner) {\n deps.owner.uid = cred.euid;\n deps.owner.gid = cred.egid;\n }\n return cred;\n },\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 { 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_KILLED, SAB_I_SIGNALS, SAB_I_TIMERS } from '../realm/sync-sab-wire.ts';\n\nexport interface SignalHooks {\n masks(): { caught: number; ignored: number; restart: number; defaults?: number } | null;\n\n raise(sig: number): void;\n\n timer?(which: number): void;\n\n killed?(code: 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 unwinding = false;\n\n private quieted = 0;\n\n private delivered = 0;\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 deliveries(): number {\n return this.delivered;\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, defaults = 0 } = masks;\n const same = caught === this.reported.caught && ignored === this.reported.ignored;\n if (same && defaults === 0) return;\n this.reported = { caught, ignored };\n const req = { op: 'sig-mask' as const, caught, ignored, ...(defaults ? { defaults } : {}) };\n this.raw.call(req, Number.POSITIVE_INFINITY, 'sig-mask');\n }\n\n quiet<T>(fn: () => T): T {\n this.quieted++;\n try {\n return fn();\n } finally {\n this.quieted--;\n }\n }\n\n interrupt(): boolean {\n this.report();\n const header = this.header;\n const pending =\n Atomics.load(header, SAB_I_SIGNALS) |\n Atomics.load(header, SAB_I_TIMERS) |\n Atomics.load(header, SAB_I_KILLED);\n if (pending === 0) return false;\n this.deliver();\n return true;\n }\n\n deliver(): void {\n if (this.quieted > 0) return;\n const killed = Atomics.load(this.header, SAB_I_KILLED);\n if (killed !== 0 && !this.unwinding && this.hooks.killed) {\n this.unwinding = true;\n this.hooks.killed(killed);\n }\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 if (pending !== 0 || timers !== 0) this.delivered++;\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 resolve(name: string, family?: 0 | 4 | 6): string[] | 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 resolve: (name, family = 4) =>\n guard(() => json({ op: 'sock-resolve', name, family }) as string[]),\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 { ROOT } from '../kernel/cred.ts';\nimport type { MountLine, ProcessInfo, ProcessListing } from '../kernel/proc-info.ts';\nimport { mountTable } from './process-fds.ts';\n\nconst HZ = 100;\nconst DIR_MODE = 0o40555;\nconst FILE_MODE = 0o100444;\nconst LINK_MODE = 0o120777;\nconst ENOENT = 44;\nconst EINVAL = 28;\nconst UID = 1000;\nconst KIB = 1024;\nconst FALLBACK_MEMORY = 4 * KIB * KIB * KIB;\n\nexport const PID_FILES = ['cmdline', 'comm', 'stat', 'statm', 'status'] as const;\nexport const SYSTEM_FILES = ['loadavg', 'meminfo', 'stat', 'uptime'] as const;\n\ntype PidFile = (typeof PID_FILES)[number];\ntype SystemFile = (typeof SYSTEM_FILES)[number];\n\nexport interface ProcSys {\n procList?(): ProcessListing;\n mountList?(): MountLine[];\n}\n\nexport interface MemorySource {\n deviceMemory?: number;\n usedHeap?: number;\n}\n\nexport function commOf(info: ProcessInfo): string {\n const name = info.argv[0] ?? '';\n return name.slice(name.lastIndexOf('/') + 1).slice(0, 15);\n}\n\nexport function ttyNumber(tty: string | null): number {\n const pts = tty && /^\\/dev\\/pts\\/(\\d+)$/.exec(tty);\n if (pts) return (136 << 8) | Number(pts[1]);\n const vt = tty && /^\\/dev\\/tty(\\d+)$/.exec(tty);\n return vt ? (4 << 8) | Number(vt[1]) : 0;\n}\n\nfunction pages(bytes: number): number {\n return Math.ceil(bytes / 4096);\n}\n\nfunction ticks(ms: number): number {\n return Math.max(0, Math.floor((ms * HZ) / 1000));\n}\n\nexport function pidStat(info: ProcessInfo, boot: number): string {\n const fields = [\n info.pid,\n `(${commOf(info)})`,\n info.state,\n info.ppid,\n info.pgid,\n info.sid,\n ttyNumber(info.tty),\n info.tty ? info.pgid : -1,\n 0x400000,\n 0,\n 0,\n 0,\n 0,\n ticks(info.utime ?? 0),\n ticks(info.stime ?? 0),\n ticks(info.cutime ?? 0),\n ticks(info.cstime ?? 0),\n 20,\n 0,\n 1,\n 0,\n ticks(info.started - boot),\n info.memory,\n pages(info.memory),\n '18446744073709551615',\n ...Array<number>(12).fill(0),\n 17,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n ...Array<number>(7).fill(0),\n 0,\n ];\n return `${fields.join(' ')}\\n`;\n}\n\nconst sigMask = (mask = 0): string => (mask >>> 1).toString(16).padStart(16, '0');\n\nconst STATES = { S: 'S (sleeping)', T: 'T (stopped)', Z: 'Z (zombie)' } as const;\n\nconst tagLine = (tag: string): string =>\n `Tag:\\t${tag.replaceAll('\\n', '\\\\n').replaceAll('\\t', '\\\\t').replaceAll('\\r', '\\\\r')}`;\n\nexport function pidStatus(info: ProcessInfo): string {\n const state = STATES[info.state];\n const c = info.cred ?? ROOT;\n const ids = (r: number, e: number, s: number) => `${r}\\t${e}\\t${s}\\t${e}`;\n return [\n `Name:\\t${commOf(info)}`,\n `Umask:\\t${(info.umask ?? 0o022).toString(8).padStart(4, '0')}`,\n `State:\\t${state}`,\n `Tgid:\\t${info.pid}`,\n 'Ngid:\\t0',\n `Pid:\\t${info.pid}`,\n `PPid:\\t${info.ppid}`,\n 'TracerPid:\\t0',\n `Uid:\\t${ids(c.ruid, c.euid, c.suid)}`,\n `Gid:\\t${ids(c.rgid, c.egid, c.sgid)}`,\n ...(info.tag !== undefined ? [tagLine(info.tag)] : []),\n 'FDSize:\\t64',\n `VmSize:\\t${Math.ceil(info.memory / KIB)} kB`,\n `VmRSS:\\t${Math.ceil(info.memory / KIB)} kB`,\n `Groups:\\t${c.groups.join(' ')}`,\n `NSpid:\\t${info.pid}`,\n `NSpgid:\\t${info.pgid}`,\n `NSsid:\\t${info.sid}`,\n 'Threads:\\t1',\n 'SigQ:\\t0/0',\n 'SigPnd:\\t0000000000000000',\n 'ShdPnd:\\t0000000000000000',\n 'SigBlk:\\t0000000000000000',\n `SigIgn:\\t${sigMask(info.sigIgn)}`,\n `SigCgt:\\t${sigMask(info.sigCgt)}`,\n '',\n ].join('\\n');\n}\n\nexport function pidFile(name: PidFile, info: ProcessInfo, boot: number): string {\n if (name === 'cmdline') return info.state === 'Z' ? '' : `${info.argv.join('\\0')}\\0`;\n if (name === 'comm') return `${commOf(info)}\\n`;\n if (name === 'stat') return pidStat(info, boot);\n if (name === 'statm') {\n const p = pages(info.memory);\n return `${p} ${p} 0 0 0 ${p} 0\\n`;\n }\n return pidStatus(info);\n}\n\nexport function memoryInfo(source: MemorySource, used = 0): string {\n const total = source.deviceMemory ? source.deviceMemory * KIB * KIB * KIB : FALLBACK_MEMORY;\n const free = Math.max(0, total - used - (source.usedHeap ?? 0));\n const kb = (bytes: number) => `${Math.floor(bytes / KIB)} kB`;\n return [\n ['MemTotal', kb(total)],\n ['MemFree', kb(free)],\n ['MemAvailable', kb(free)],\n ['Buffers', kb(0)],\n ['Cached', kb(0)],\n ['SwapCached', kb(0)],\n ['Shmem', kb(0)],\n ['SReclaimable', kb(0)],\n ['SwapTotal', kb(0)],\n ['SwapFree', kb(0)],\n ]\n .map(([key, value]) => `${`${key}:`.padEnd(16)}${value.padStart(12)}`)\n .concat('')\n .join('\\n');\n}\n\nexport function systemFile(\n name: SystemFile,\n listing: ProcessListing,\n now: number,\n memory: MemorySource\n): string {\n const up = Math.max(0, now - listing.boot) / 1000;\n if (name === 'uptime') return `${up.toFixed(2)} ${up.toFixed(2)}\\n`;\n if (name === 'meminfo') {\n return memoryInfo(\n memory,\n listing.processes.reduce((sum, p) => sum + p.memory, 0)\n );\n }\n const live = listing.processes.filter((p) => p.state !== 'Z');\n if (name === 'loadavg') {\n const last = Math.max(0, ...listing.processes.map((p) => p.pid));\n const [one, five, fifteen] = (listing.load ?? [0, 0, 0]).map((n) => n.toFixed(2));\n return `${one} ${five} ${fifteen} 1/${live.length} ${last}\\n`;\n }\n const sum = (key: 'utime' | 'stime') =>\n listing.cpu?.[key] ?? listing.processes.reduce((n, p) => n + (p[key] ?? 0), 0);\n const user = ticks(sum('utime'));\n const system = ticks(sum('stime'));\n const idle = listing.cpu\n ? ticks(listing.cpu.idle)\n : Math.max(0, ticks(now - listing.boot) - user - system);\n return [\n `cpu ${user} 0 ${system} ${idle} 0 0 0 0 0 0`,\n `cpu0 ${user} 0 ${system} ${idle} 0 0 0 0 0 0`,\n 'intr 0',\n 'ctxt 0',\n `btime ${Math.floor(listing.boot / 1000)}`,\n `processes ${listing.processes.length}`,\n 'procs_running 1',\n 'procs_blocked 0',\n '',\n ].join('\\n');\n}\n\nexport function memorySource(scope: object = globalThis): MemorySource {\n const nav = (scope as { navigator?: { deviceMemory?: unknown } }).navigator;\n const perf = (scope as { performance?: { memory?: { usedJSHeapSize?: unknown } } }).performance;\n const deviceMemory = nav?.deviceMemory;\n const used = perf?.memory?.usedJSHeapSize;\n return {\n ...(typeof deviceMemory === 'number' && deviceMemory > 0 ? { deviceMemory } : {}),\n ...(typeof used === 'number' ? { usedHeap: used } : {}),\n };\n}\n\ninterface ProcNode {\n name: string;\n mode: number;\n id?: number;\n parent?: ProcNode;\n node_ops: {\n lookup?: (parent: ProcNode, name: string) => ProcNode;\n readdir?: (node: ProcNode) => string[];\n getattr?: (node: ProcNode) => object;\n setattr?: (node: ProcNode, attr: object) => void;\n readlink?: (node: ProcNode) => string;\n };\n stream_ops?: object;\n}\n\ninterface ProcStream {\n node: ProcNode;\n position: number;\n sliccProc?: Uint8Array;\n getdents?: string[] | null;\n fd?: number | null;\n}\n\ninterface DirStreamOps {\n open?: (stream: ProcStream) => void;\n dup?: (stream: ProcStream) => void;\n close?: (stream: ProcStream) => void;\n}\n\nexport interface ProcFs {\n lookupPath?(path: string, opts?: { follow?: boolean }): { node: object };\n createNode?(parent: object, name: string, mode: number, rdev: number): object;\n hashRemoveNode?(node: object): void;\n streams?: unknown[];\n ErrnoError: new (errno: number) => Error;\n}\n\nfunction attr(node: ProcNode): object {\n const now = new Date();\n return {\n dev: 3,\n ino: node.id,\n mode: node.mode,\n nlink: 1,\n uid: UID,\n gid: UID,\n rdev: 0,\n size: 0,\n atime: now,\n mtime: now,\n ctime: now,\n blksize: 4096,\n blocks: 0,\n };\n}\n\nexport function useProcfs(Fs: ProcFs, sys: ProcSys, pid: number, memory = memorySource()): void {\n const { lookupPath, createNode, hashRemoveNode } = Fs;\n const procList = sys.procList?.bind(sys);\n if (!lookupPath || !createNode || !hashRemoveNode || !procList) return;\n let proc: ProcNode;\n let self: ProcNode;\n try {\n proc = lookupPath.call(Fs, '/proc', { follow: true }).node as ProcNode;\n self = lookupPath.call(Fs, '/proc/self', { follow: true }).node as ProcNode;\n } catch {\n return;\n }\n const error = (errno = ENOENT) => new Fs.ErrnoError(errno);\n const fresh = (parent: ProcNode, name: string, mode: number): ProcNode => {\n const node = createNode.call(Fs, parent, name, mode, 0) as ProcNode;\n hashRemoveNode.call(Fs, node);\n node.node_ops = { getattr: attr, setattr: () => {} };\n node.stream_ops = {\n llseek: (stream: ProcStream, offset: number, whence: number) => {\n const at = (whence === 1 ? stream.position : 0) + offset;\n if (at < 0) throw error(EINVAL);\n return at;\n },\n };\n return node;\n };\n const file = (parent: ProcNode, name: string, content: () => string): ProcNode => {\n const node = fresh(parent, name, FILE_MODE);\n node.stream_ops = {\n open: (stream: ProcStream) => {\n stream.sliccProc = new TextEncoder().encode(content());\n },\n read: (\n stream: ProcStream,\n buffer: Uint8Array,\n offset: number,\n length: number,\n at: number\n ) => {\n const data = stream.sliccProc ?? new Uint8Array(0);\n const chunk = data.subarray(at, at + length);\n buffer.set(chunk, offset);\n return chunk.length;\n },\n llseek: (stream: ProcStream, offset: number, whence: number) => {\n const end = stream.sliccProc?.length ?? 0;\n const at = (whence === 1 ? stream.position : whence === 2 ? end : 0) + offset;\n if (at < 0) throw error(EINVAL);\n return at;\n },\n };\n return node;\n };\n const find = (processes: ProcessInfo[], target: number, own: boolean) =>\n (own ? processes.find((p) => p.tid === target) : undefined) ??\n processes.find((p) => p.pid === target || p.tid === target);\n const infoOf = (target: number): ProcessInfo | undefined =>\n find(procList().processes, target, false);\n const pidContent =\n (target: number, name: PidFile, own = false) =>\n () => {\n const listing = procList();\n const info = find(listing.processes, target, own);\n if (!info) throw error();\n return pidFile(name, info, listing.boot);\n };\n const pidNames = (names: string[]) => [...new Set([...names, ...PID_FILES])];\n const pidDir = (name: string, target: number): ProcNode => {\n const dir = fresh(proc, name, DIR_MODE);\n dir.node_ops.lookup = (parent, child) => {\n if (!(PID_FILES as readonly string[]).includes(child)) throw error();\n return file(parent, child, pidContent(target, child as PidFile));\n };\n dir.node_ops.readdir = () => ['.', '..', ...PID_FILES];\n return dir;\n };\n const scans = new Map<ProcStream, Set<number>>();\n const listed = (target: number) => {\n let found = false;\n for (const [stream, pids] of scans) {\n if (Fs.streams && Fs.streams[stream.fd ?? -1] !== stream) scans.delete(stream);\n else found ||= pids.has(target);\n }\n return found;\n };\n const procOps = proc.node_ops;\n const lookup = procOps.lookup?.bind(procOps);\n const readdir = procOps.readdir?.bind(procOps);\n const listAll = (node: ProcNode) => {\n const names = new Set(readdir ? readdir(node) : ['.', '..']);\n for (const name of [...SYSTEM_FILES, 'mounts']) names.add(name);\n for (const p of procList().processes) names.add(String(p.pid));\n return [...names];\n };\n proc.node_ops = {\n ...procOps,\n lookup: (parent, name) => {\n if (/^[1-9]\\d*$/.test(name)) {\n if (!infoOf(Number(name)) && !listed(Number(name))) throw error();\n return pidDir(name, Number(name));\n }\n if (name === 'mounts') return file(parent, name, () => mountTable(sys.mountList?.() ?? []));\n if ((SYSTEM_FILES as readonly string[]).includes(name)) {\n return file(parent, name, () =>\n systemFile(name as SystemFile, procList(), Date.now(), memory)\n );\n }\n if (!lookup) throw error();\n return lookup(parent, name);\n },\n readdir: (node) => listAll(node),\n };\n const track = (stream: ProcStream, names: string[] | null | undefined) => {\n let current = names;\n const remember = (list: string[]) =>\n scans.set(stream, new Set(list.filter((n) => /^[1-9]\\d*$/.test(n)).map(Number)));\n remember(current ?? []);\n Object.defineProperty(stream, 'getdents', {\n configurable: true,\n enumerable: true,\n get: () => current,\n set: (next: string[] | null) => {\n current = next;\n if (next) remember(next);\n },\n });\n };\n const dirOps = (proc.stream_ops ?? {}) as DirStreamOps;\n proc.stream_ops = {\n ...dirOps,\n open: (stream: ProcStream) => {\n dirOps.open?.(stream);\n track(stream, listAll(proc));\n },\n dup: (stream: ProcStream) => {\n dirOps.dup?.(stream);\n track(stream, stream.getdents);\n },\n close: (stream: ProcStream) => {\n scans.delete(stream);\n dirOps.close?.(stream);\n },\n };\n hashRemoveNode.call(Fs, self);\n const link = fresh(proc, 'self', LINK_MODE);\n const shownPid = () => String(find(procList().processes, pid, true)?.pid ?? pid);\n link.node_ops.readlink = shownPid;\n const procLookup = proc.node_ops.lookup as NonNullable<ProcNode['node_ops']['lookup']>;\n proc.node_ops.lookup = (parent, name) =>\n name === 'self' ? link : name === shownPid() ? self : procLookup(parent, name);\n const selfOps = self.node_ops;\n const selfLookup = selfOps.lookup?.bind(selfOps);\n const selfReaddir = selfOps.readdir?.bind(selfOps);\n self.node_ops = {\n ...selfOps,\n lookup: (parent, name) => {\n if ((PID_FILES as readonly string[]).includes(name)) {\n return file(parent, name, pidContent(pid, name as PidFile, true));\n }\n if (!selfLookup) throw error();\n return selfLookup(parent, name);\n },\n readdir: (node) => pidNames(selfReaddir ? selfReaddir(node) : ['.', '..']),\n };\n}\n", "import type { Cred } from '../kernel/cred.ts';\nimport type { ProcessFs } from './kernel-streams.ts';\n\nexport interface Owner {\n uid: number;\n gid: number;\n}\n\nexport const LEGACY_OWNER: Readonly<Owner> = Object.freeze({ uid: 1000, gid: 1000 });\n\nconst CRED_ABI = /\\bslicc_cred_js\\b/;\n\nexport function credAbi(glue: string): boolean {\n return CRED_ABI.test(glue);\n}\n\nexport function ownByCaller(Fs: ProcessFs, cred?: Readonly<Cred>, abi = true): Owner {\n const owner = abi ? { uid: cred?.euid ?? 0, gid: cred?.egid ?? 0 } : { ...LEGACY_OWNER };\n const { stat, fstat } = Fs;\n const owned = (attr: object): object => ({ ...attr, uid: owner.uid, gid: owner.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 return owner;\n}\n", "import type { DeviceMeta, HeldMeta, PollState } from '../kernel/fd-table.ts';\nimport { hostnameOf } from '../kernel/net/loopback-names.ts';\nimport type { MountLine, ProcessListing } from '../kernel/proc-info.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 { SYNC_FS_OPS, 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 {\n publishMemory,\n SAB_HEADER_I32,\n SAB_I_STOP,\n type SyncSabRequestBody,\n} from '../realm/sync-sab-wire.ts';\nimport {\n KernelStreams,\n type ProcessFs,\n type ProcessPipeFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n type TtyOwner,\n} from './kernel-streams.ts';\nimport { createProcessKernel, type ProcessKernel } from './process-children.ts';\nimport {\n type FdImports,\n type GlueSyscalls,\n type KernelImports,\n kernelAccess,\n kernelUmask,\n linuxDevices,\n type Memalign,\n noFollowUtimes,\n pathOpensLinks,\n positionalIo,\n syncFsync,\n trackCloseOnExec,\n useDevFd,\n useFileMmap,\n useMounts,\n useZeroDevices,\n wasmMemory,\n wrapCloexecSyscalls,\n wrapImport,\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 { type ProcFs, useProcfs } from './procfs.ts';\nimport { credAbi, type Owner, ownByCaller } from './realm-user.ts';\n\nexport {\n type ProcessFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n} from './kernel-streams.ts';\n\nconst FS_OPS: ReadonlySet<string> = new Set(SYNC_FS_OPS);\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 ...(opts?.created ? { created: true } : {}),\n ...(opts?.pin ? { pin: opts.pin } : {}),\n ...(opts?.handle !== undefined ? { handle: opts.handle } : {}),\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 kind(fd) {\n return (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { kind?: string })?.kind;\n },\n heldMeta(fd) {\n return (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { meta?: HeldMeta }).meta;\n },\n access(fd) {\n return (json(call({ op: 'fd-info', fd }, `fd-info ${fd}`)) as { access?: 'read' | 'write' })\n .access;\n },\n size(fd) {\n return (json(call({ op: 'fd-vfs-stat', fd }, `fd-vfs-stat ${fd}`)) as { size: number }).size;\n },\n ttyNames() {\n return json(call({ op: 'fd-tty-names' }, 'fd-tty-names')) as string[];\n },\n ttyOwner(name) {\n return json(call({ op: 'fd-tty-owner', name }, `fd-tty-owner ${name}`)) as TtyOwner | null;\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, flush) {\n call({ op: 'tty-set', fd, termios, ...(flush ? { flush } : {}) }, `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 openSealed() {\n return json(call({ op: 'fd-open-sealed' }, 'fd-open-sealed')) as number;\n },\n openClipboard(flags) {\n return json(call({ op: 'fd-open-clipboard', flags }, 'fd-open-clipboard')) as number;\n },\n ptyNumbers() {\n return json(call({ op: 'pty-list' }, 'pty-list')) as number[];\n },\n procList() {\n return json(call({ op: 'proc-list' }, 'proc-list')) as ProcessListing;\n },\n mountList() {\n return json(call({ op: 'mount-list' }, 'mount-list')) as MountLine[];\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;\nconst O_ACCMODE = 3;\n\nconst O_DIRECTORY = 0o200000;\n\nconst accessMode = (access: 'read' | 'write' | undefined): number =>\n access === 'read' ? O_RDONLY : access === 'write' ? O_WRONLY : O_RDWR;\n\nfunction openDevice(Fs: ProcessFs, fd: number, meta: DeviceMeta): boolean {\n return openAt(Fs, fd, `/dev/${meta.device}`, accessMode(meta.access));\n}\n\nfunction openHeld(Fs: ProcessFs, fd: number, meta: HeldMeta): boolean {\n return 'dir' in meta\n ? openAt(Fs, fd, meta.dir, O_RDONLY | O_DIRECTORY)\n : openDevice(Fs, fd, meta);\n}\n\nfunction openAt(Fs: ProcessFs, fd: number, path: string, flags: number): boolean {\n let stream: ProcessStream;\n try {\n stream = Fs.open(path, 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\nconst PLACED: ReadonlySet<string> = new Set(['stream', 'file', 'socket', 'clipboard']);\n\nexport function wireKernelStdio(Fs: ProcessFs, streams: KernelStreams, sys?: ProcessSys): void {\n for (const fd of [0, 1, 2]) {\n const stream = Fs.getStream(fd);\n if (!stream) continue;\n const kind = sys?.kind?.(fd);\n const meta = kind === 'device' || kind === 'held' ? sys?.heldMeta?.(fd) : undefined;\n if (meta && openHeld(Fs, fd, meta)) continue;\n if (kind && PLACED.has(kind)) {\n const flags = sys?.access\n ? (stream.flags & ~O_ACCMODE) | accessMode(sys.access(fd))\n : stream.flags;\n Fs.closeStream(fd);\n const kernel = { fd, kernel: fd, kind: kind as InheritedFd['kind'], flags };\n placeKernelStream(Fs, streams, kernel).flags = flags;\n continue;\n }\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 \"if (typeof thisProgram !== 'undefined' && Module.thisProgram === '') thisProgram = '';\",\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.sliccKernelImports ??= {',\n \" openat: typeof ___syscall_openat === 'function' ? ___syscall_openat : undefined,\",\n \" mkdirat: typeof ___syscall_mkdirat === 'function' ? ___syscall_mkdirat : undefined,\",\n \" mknodat: typeof ___syscall_mknodat === 'function' ? ___syscall_mknodat : undefined,\",\n \" umask: typeof ___syscall_umask === 'function' ? ___syscall_umask : undefined,\",\n \" faccessat: typeof ___syscall_faccessat === 'function' ? ___syscall_faccessat : undefined,\",\n \" utimensat: typeof ___syscall_utimensat === 'function' ? ___syscall_utimensat : undefined,\",\n \" getppid: typeof _slicc_getppid_js === 'function' ? _slicc_getppid_js : undefined,\",\n \" resizeHeap: typeof _emscripten_resize_heap === 'function' ? _emscripten_resize_heap : undefined,\",\n \" fdWrite: typeof _fd_write === 'function' ? _fd_write : undefined,\",\n \" fdRead: typeof _fd_read === 'function' ? _fd_read : undefined,\",\n \" sleepMs: typeof slicc_sleep_ms === 'function' ? slicc_sleep_ms : 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 identify(\n transport: SyncSabTransport,\n init: { pid: number; ppid?: number }\n): { pid: number; ppid: number } {\n const r = transport.call({ op: 'proc-identity' }, Number.POSITIVE_INFINITY, 'proc-identity');\n const id = r.ok && r.kind === 'json' ? (r.json as { pid: number; ppid: number } | null) : null;\n return id ?? { pid: init.pid, ppid: init.ppid ?? 1 };\n}\n\nexport function liveParent(\n imports: WebAssembly.Imports,\n parent: () => number,\n glue?: KernelImports\n): void {\n wrapImport(imports, 'getppid', glue, () => parent);\n}\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 function reportGrowth(\n imports: WebAssembly.Imports,\n publish: () => void,\n glue?: KernelImports\n): void {\n wrapImport(imports, 'resizeHeap', glue, (resize) => (...args) => {\n const grown = resize(...args);\n publish();\n return grown;\n });\n}\n\nexport function holdWhileStopped(\n imports: WebAssembly.Imports,\n header: Int32Array,\n glue?: KernelImports\n): void {\n const hold = () => {\n while (Atomics.load(header, SAB_I_STOP) === 1) Atomics.wait(header, SAB_I_STOP, 1);\n };\n for (const name of ['fdWrite', 'fdRead', 'sleepMs'] as const) {\n wrapImport(imports, name, glue, (original) => (...args) => {\n hold();\n const done = original(...args);\n hold();\n return done;\n });\n }\n}\n\nfunction callerOwner(Fs: ProcessFs, init: WasmProcessInitMsg): { owner?: Owner } {\n return init.owners ? {} : { owner: ownByCaller(Fs, init.cred, credAbi(init.program.glue)) };\n}\n\nfunction utimensatOf(module: object): unknown {\n return ownValue<{ utimensat?: unknown }>(module, 'sliccSyscalls')?.utimensat;\n}\n\ninterface WrapperDeps {\n init: WasmProcessInitMsg;\n transport: SyncSabTransport;\n sys: ProcessSys;\n memory: () => WebAssembly.Memory | undefined;\n ppid: () => number;\n}\n\nfunction kernelWrappers(imports: WebAssembly.Imports, module: object, deps: WrapperDeps): void {\n const { init, transport, sys, memory } = deps;\n const kernelGlue = ownValue<KernelImports>(module, 'sliccKernelImports');\n liveParent(imports, deps.ppid, kernelGlue);\n kernelUmask(imports, {\n glue: kernelGlue,\n initial: init.umask ?? 0o022,\n memory,\n set: (mask) =>\n void transport.call({ op: 'proc-umask', mask }, Number.POSITIVE_INFINITY, 'umask'),\n });\n const fsOf = () => ownValue<ProcessFs>(module, 'FS');\n noFollowUtimes(imports, fsOf, kernelGlue?.utimensat ?? utimensatOf(module), memory);\n kernelAccess(imports, fsOf, memory, kernelGlue);\n const glue = ownValue<FdImports>(module, 'sliccFdImports');\n syncFsync(imports, fsOf, glue);\n positionalIo(imports, { glue, fs: fsOf, sys, memory });\n const grown = () => publishMemory(init.sab, memory()?.buffer.byteLength ?? 0);\n reportGrowth(imports, grown, kernelGlue);\n holdWhileStopped(imports, new Int32Array(init.sab, 0, SAB_HEADER_I32), kernelGlue);\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 memory: () => memory?.buffer.byteLength ?? 0,\n }),\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 gated = signals.transport();\n let early = (): void => {};\n const transport: SyncSabTransport = {\n call: (req, timeoutMs, label) => {\n if (!FS_OPS.has(req.op)) early();\n return gated.call(req, timeoutMs, label);\n },\n };\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 let exports: WebAssembly.Exports | undefined;\n let atExit: () => () => void = () => () => {};\n const initialized = new Promise<void>((resolve, reject) => {\n ready = resolve;\n failed = reject;\n });\n const id = identify(transport, init);\n const module = {\n noInitialRun: true,\n thisProgram: init.argv0,\n sliccPid: id.pid,\n sliccPpid: id.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 kernelWrappers(imports, module, {\n init,\n transport,\n sys,\n memory: () => memory,\n ppid: () => identify(transport, init).ppid,\n });\n return WebAssembly.instantiate(init.program.module, imports);\n })\n .then((instance) => {\n memory = wasmMemory(instance, imports);\n exports = instance.exports;\n publishMemory(init.sab, memory?.buffer.byteLength ?? 0);\n done(\n withExitHook(instance, () => atExit()),\n init.program.module\n );\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 pathOpensLinks(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 if (init.owners) linuxDevices(running.FS);\n const vfs = mountVfsIntoEmscripten(running.FS, {\n bridge: createSyncFsSabBridge(transport, init.owners ? { owners: true } : {}),\n cwd: init.cwd,\n warn: deps.warn ?? say(2),\n });\n early = () => signals.quiet(() => vfs.flushDirty());\n const sigpipe = (): boolean => running.sliccSigpipe?.() === 1;\n const restartable = (): boolean => signals.restartable();\n const owners = init.owners ? { owners: true } : {};\n const streams = new KernelStreams(running.FS, sys, {\n sigpipe,\n restartable,\n ...owners,\n program: init.argv0,\n });\n trackCloseOnExec(running.FS);\n quietQuit(running.FS as unknown as QuitFs, (on) => {\n streams.quitting = on;\n });\n atExit = () => streams.exiting();\n useMounts(running.FS, init.env, true);\n useZeroDevices(running.FS);\n useProcfs(running.FS as unknown as ProcFs, sys, init.pid);\n if (init.fork) restoreForkedStreams(running.FS, streams, init.fork.streams ?? []);\n else {\n wireKernelStdio(running.FS, streams, sys);\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 useFileMmap(running.FS, {\n sys,\n memory: () => memory,\n memalign: () => exports?.emscripten_builtin_memalign as Memalign | undefined,\n });\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 memory: () => memory,\n deliveries: () => signals.deliveries(),\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 ...callerOwner(running.FS, init),\n });\n running.sliccKernel.http = createHttpKernel(transport);\n running.sliccKernel.hostname = hostnameOf(init.env);\n running.sliccKernel.net = createSocketKernel({\n transport,\n Fs: running.FS,\n sys,\n streams,\n sigpipe,\n restartable,\n });\n try {\n return streams.exitStatus(runMain(running, init));\n } finally {\n try {\n vfs.flush();\n } catch {}\n }\n}\n\ninterface QuitFs {\n quit?: () => void;\n close: (stream: unknown) => void;\n}\n\nfunction withExitHook(\n instance: WebAssembly.Instance,\n begin: () => () => void\n): WebAssembly.Instance {\n const funcs = instance.exports.__funcs_on_exit;\n if (typeof funcs !== 'function') return instance;\n const run = funcs as () => void;\n const exported = Object.assign(Object.create(null), instance.exports, {\n __funcs_on_exit: () => {\n const end = begin();\n try {\n run();\n } finally {\n end();\n }\n },\n });\n return { exports: exported } as WebAssembly.Instance;\n}\n\nexport function quietQuit(Fs: QuitFs, quitting?: (on: boolean) => void): void {\n const { quit, close } = Fs;\n if (!quit) return;\n Fs.quit = () => {\n quitting?.(true);\n Fs.close = (stream) => {\n try {\n close.call(Fs, stream);\n } catch {}\n };\n try {\n quit.call(Fs);\n } finally {\n quitting?.(false);\n Fs.close = close;\n }\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", "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\nconst LIBC_MARK = /^wasix-sysroot \\d{4}\\.\\d+\\.\\d+-(\\d+)/;\n\nexport function libcVersion(module: WebAssembly.Module): number | undefined {\n for (const section of WebAssembly.Module.customSections(module, 'slicc.libc')) {\n const found = LIBC_MARK.exec(new TextDecoder().decode(section));\n if (found) return Number(found[1]);\n }\n return undefined;\n}\n", "import type { MountLine, ProcessListing } from '../../kernel/proc-info.ts';\nimport {\n type SyncFsBridgeStat,\n type SyncFsFileIo,\n type SyncFsPosixBridge,\n syncError,\n} from '../../realm/sync-fs-wire.ts';\nimport { mountTable } from '../process-fds.ts';\nimport {\n type MemorySource,\n memorySource,\n PID_FILES,\n pidFile,\n SYSTEM_FILES,\n systemFile,\n} from '../procfs.ts';\nimport { normalize } from './wasi-files.ts';\n\nexport interface ProcSource {\n procList(): ProcessListing;\n mountList(): MountLine[];\n}\n\ntype Node =\n | { kind: 'dir'; names: () => string[] }\n | { kind: 'link'; target: string }\n | { kind: 'file'; content: () => string };\n\nconst DIR_MODE = 0o40555;\nconst FILE_MODE = 0o100444;\nconst LINK_MODE = 0o120777;\n\nconst PID_NAMES: readonly string[] = PID_FILES;\nconst SYSTEM_NAMES: readonly string[] = SYSTEM_FILES;\n\nexport function inProc(path: string): boolean {\n return path === '/proc' || path.startsWith('/proc/');\n}\n\nexport class ProcTree {\n private readonly source: ProcSource;\n private readonly pid: number;\n private readonly memory: MemorySource;\n\n constructor(source: ProcSource, pid: number, memory: MemorySource = memorySource()) {\n this.source = source;\n this.pid = pid;\n this.memory = memory;\n }\n\n private listing(): ProcessListing {\n return this.source.procList();\n }\n\n private alive(pid: number): boolean {\n return this.listing().processes.some((p) => p.pid === pid);\n }\n\n private node(parts: string[]): Node | undefined {\n const [top, leaf, ...rest] = parts;\n if (top === undefined) {\n return {\n kind: 'dir',\n names: () => [\n ...SYSTEM_NAMES,\n 'mounts',\n 'self',\n ...this.listing().processes.map((p) => String(p.pid)),\n ],\n };\n }\n if (top === 'self') {\n return leaf === undefined ? { kind: 'link', target: String(this.pid) } : undefined;\n }\n if (leaf === undefined && top === 'mounts') {\n return { kind: 'file', content: () => mountTable(this.source.mountList()) };\n }\n if (leaf === undefined && SYSTEM_NAMES.includes(top)) {\n return {\n kind: 'file',\n content: () =>\n systemFile(top as (typeof SYSTEM_FILES)[number], this.listing(), Date.now(), this.memory),\n };\n }\n if (!/^[1-9]\\d*$/.test(top) || rest.length > 0 || !this.alive(Number(top))) return undefined;\n if (leaf === undefined) return { kind: 'dir', names: () => [...PID_NAMES] };\n if (!PID_NAMES.includes(leaf)) return undefined;\n return {\n kind: 'file',\n content: () => {\n const listing = this.listing();\n const info = listing.processes.find((p) => p.pid === Number(top));\n if (!info) throw syncError('ENOENT', `/proc/${top}/${leaf}`);\n return pidFile(leaf as (typeof PID_FILES)[number], info, listing.boot);\n },\n };\n }\n\n private parts(path: string, follow: boolean): string[] {\n const parts = path\n .split('/')\n .filter((p) => p !== '')\n .slice(1);\n if (parts[0] === 'self' && (follow || parts.length > 1)) parts[0] = String(this.pid);\n return parts;\n }\n\n private find(path: string, follow: boolean): Node {\n const node = this.node(this.parts(path, follow));\n if (!node) throw syncError('ENOENT', path);\n return node;\n }\n\n stat(path: string, follow = true): SyncFsBridgeStat {\n const node = this.find(path, follow);\n const base = {\n isFile: false,\n isDirectory: false,\n size: 0,\n mtimeMs: Date.now(),\n readonly: true,\n };\n if (node.kind === 'dir') return { ...base, isDirectory: true, mode: DIR_MODE };\n if (node.kind === 'link') {\n return { ...base, isSymbolicLink: true, mode: LINK_MODE, size: node.target.length };\n }\n return { ...base, isFile: true, mode: FILE_MODE, size: this.bytes(node).length };\n }\n\n private bytes(node: Node): Uint8Array {\n return new TextEncoder().encode(node.kind === 'file' ? node.content() : '');\n }\n\n read(path: string): Uint8Array {\n const node = this.find(path, true);\n if (node.kind !== 'file') throw syncError('EISDIR', path);\n return this.bytes(node);\n }\n\n readdir(path: string): string[] {\n const node = this.find(path, true);\n if (node.kind !== 'dir') throw syncError('ENOTDIR', path);\n return node.names();\n }\n\n readlink(path: string): string {\n const node = this.find(path, false);\n if (node.kind !== 'link') throw syncError('EINVAL', path);\n return node.target;\n }\n\n exists(path: string): boolean {\n try {\n this.find(path, true);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nconst FOLLOWING = ['writeFile', 'chmod', 'utimes', 'pwrite', 'truncate'] as const;\nconst NOT_FOLLOWING = ['mkdir', 'rm', 'unlink', 'rmdir', 'lutimes', 'create'] as const;\nconst MAX_HOPS = 40;\n\ntype ProcRefusal = { refused: string };\ntype ProcWalk = Generator<\n { at: string; check: boolean },\n string | undefined | ProcRefusal,\n string | boolean | ProcRefusal\n>;\n\nfunction* procWalk(path: string, follow: boolean): ProcWalk {\n let done: string[] = [];\n let todo = path.split('/').filter((part) => part !== '');\n let hops = 0;\n let broken: ProcRefusal | undefined;\n while (todo.length > 0) {\n const part = todo.shift() as string;\n if (part === '.') continue;\n if (part === '..') {\n done.pop();\n continue;\n }\n const at = `/${[...done, part].join('/')}`;\n const whole = normalize(`/${[...done, part, ...todo].join('/')}`);\n if (inProc(at) && inProc(whole)) return broken ?? whole;\n if (!follow && todo.length === 0) return undefined;\n const target = yield { at, check: todo.find((next) => next !== '.') === '..' };\n if (typeof target === 'string') {\n if (++hops > MAX_HOPS) return undefined;\n [done, todo] = throughLink(target, done, todo);\n } else {\n broken ??= refusalOf(target);\n done.push(part);\n }\n }\n return undefined;\n}\n\nfunction failed(err: unknown): ProcRefusal {\n const code = (err as { code?: unknown } | null)?.code;\n return { refused: typeof code === 'string' ? code : 'ENOENT' };\n}\n\nfunction refusalOf(found: boolean | ProcRefusal): ProcRefusal | undefined {\n if (found === true) return undefined;\n return found === false ? { refused: 'ENOTDIR' } : found;\n}\n\nfunction throughLink(target: string, done: string[], todo: string[]): [string[], string[]] {\n const parts = target.split('/').filter((part) => part !== '');\n return [target.startsWith('/') ? [] : done, [...parts, ...todo]];\n}\n\nfunction procPath(\n fs: Pick<SyncFsPosixBridge, 'lstat' | 'readlink'>,\n path: string,\n follow: boolean\n): string | undefined {\n const walk = procWalk(path, follow);\n let step = walk.next();\n while (!step.done) {\n const { at, check } = step.value;\n let target: string | boolean | ProcRefusal;\n try {\n const st = fs.lstat(at);\n target = st.isSymbolicLink ? fs.readlink(at) : !check || st.isDirectory;\n } catch (err) {\n target = failed(err);\n }\n step = walk.next(target);\n }\n const result = step.value;\n if (typeof result === 'object') throw syncError(result.refused, path);\n return result;\n}\n\nexport async function procAlias(\n fs: { readlink?(path: string): Promise<string>; lstat?(path: string): Promise<unknown> },\n path: string,\n follow: boolean\n): Promise<string | undefined | ProcRefusal> {\n const { readlink, lstat } = fs;\n if (!readlink || !lstat) return undefined;\n const physical = await lstat.call(fs, '/proc').then(\n () => true,\n () => false\n );\n if (!physical) return undefined;\n const walk = procWalk(path, follow);\n let step = walk.next();\n while (!step.done) {\n const { at, check } = step.value;\n const link = await readlink.call(fs, at).catch(() => undefined);\n const isDir = (st: unknown) => (st as { isDirectory?: boolean }).isDirectory === true;\n const target = link ?? (check ? await lstat.call(fs, at).then(isDir, failed) : true);\n step = walk.next(target);\n }\n return step.value;\n}\n\nfunction frozen(bytes: Uint8Array): SyncFsFileIo {\n const refuse = (): never => {\n throw syncError('EROFS', '/proc');\n };\n return {\n readFile: () => bytes,\n pread: (_p: string, at: number, n: number) => bytes.subarray(at, at + n),\n writeFile: refuse,\n pwrite: refuse,\n truncate: refuse,\n };\n}\n\nexport function procfsBridge<T extends SyncFsPosixBridge>(fs: T, tree: ProcTree): T {\n const toProc = (path: string, follow: boolean) => procPath(fs, path, follow);\n const shadowing = (): boolean => {\n try {\n return fs.exists('/proc');\n } catch {\n return false;\n }\n };\n const via = <R>(p: string, proc: (q: string) => R, own: () => R, follow = true): R => {\n if (inProc(p)) return proc(p);\n if (shadowing()) {\n const real = toProc(p, follow);\n if (real !== undefined) return proc(real);\n }\n try {\n return own();\n } catch (err) {\n const real = toProc(p, follow);\n if (real === undefined) throw err;\n return proc(real);\n }\n };\n const readOnly = <R>(paths: Array<[string, boolean]>, run: () => R): R => {\n const physical = shadowing();\n for (const [p, follow] of paths) {\n if (inProc(p) || (physical && toProc(p, follow) !== undefined)) throw syncError('EROFS', p);\n }\n return run();\n };\n const snapshots = new Map<number, Uint8Array>();\n let lastSnapshot = 0;\n const snapshot = (q: string): number => {\n lastSnapshot--;\n snapshots.set(lastSnapshot, tree.read(q));\n return lastSnapshot;\n };\n const late = (p: string): number | undefined => {\n const q = toProc(p, true);\n return q === undefined ? undefined : snapshot(q);\n };\n const over: Partial<Record<keyof SyncFsPosixBridge, unknown>> = {\n readFile: (p: string) =>\n via(\n p,\n (q) => tree.read(q),\n () => fs.readFile(p)\n ),\n stat: (p: string) =>\n via(\n p,\n (q) => tree.stat(q),\n () => fs.stat(p)\n ),\n lstat: (p: string) =>\n via(\n p,\n (q) => tree.stat(q, false),\n () => fs.lstat(p),\n false\n ),\n readdir: (p: string) =>\n via(\n p,\n (q) => tree.readdir(q),\n () => {\n const names = fs.readdir(p);\n return p === '/' && !names.includes('proc') ? [...names, 'proc'] : names;\n }\n ),\n exists: (p: string) => {\n if (inProc(p)) return tree.exists(p);\n const probe = () => {\n try {\n return toProc(p, true);\n } catch {\n return null;\n }\n };\n const real = shadowing() ? probe() : undefined;\n if (real === null) return false;\n if (real !== undefined) return tree.exists(real);\n if (fs.exists(p)) return true;\n const late = probe();\n return typeof late === 'string' && tree.exists(late);\n },\n readlink: (p: string) =>\n via(\n p,\n (q) => tree.readlink(q),\n () => fs.readlink(p),\n false\n ),\n readdirStat: (p: string) =>\n via(\n p,\n (q) =>\n tree.readdir(q).map((name): [string, SyncFsBridgeStat | null] => {\n try {\n return [name, tree.stat(`${q}/${name}`, false)];\n } catch {\n return [name, null];\n }\n }),\n () => {\n const listed = fs.readdirStat(p);\n if (p !== '/' || listed.some(([name]) => name === 'proc')) return listed;\n return [...listed, ['proc', tree.stat('/proc')] as [string, SyncFsBridgeStat]];\n }\n ),\n rename: (from: string, to: string) =>\n readOnly(\n [\n [from, false],\n [to, false],\n ],\n () => fs.rename(from, to)\n ),\n symlink: (target: string, link: string) =>\n readOnly([[link, false]], () => fs.symlink(target, link)),\n link: (from: string, to: string, follow?: boolean) =>\n readOnly(\n [\n [from, follow === true],\n [to, false],\n ],\n () => fs.link(from, to, follow)\n ),\n hold: (p: string, held: boolean, open?: boolean, handle?: number, want?: number) => {\n if (handle !== undefined && snapshots.delete(handle)) return undefined;\n if (!held) return fs.hold?.(p, held, open, handle);\n return via(p, snapshot, () => fs.hold?.(p, held, open, undefined, want) ?? late(p));\n },\n kept: (handle: number) => snapshots.has(handle) || fs.kept?.(handle) === true,\n pinned: (handle: number) => {\n const bytes = snapshots.get(handle);\n return bytes ? frozen(bytes) : (fs.pinned?.(handle) ?? fs);\n },\n ...(fs.pread\n ? {\n pread: (p: string, at: number, n: number, version?: string) =>\n via(\n p,\n (q) => tree.read(q).subarray(at, at + n),\n () => (fs.pread as NonNullable<T['pread']>)(p, at, n, version)\n ),\n }\n : {}),\n };\n for (const [names, follow] of [\n [FOLLOWING, true],\n [NOT_FOLLOWING, false],\n ] as const) {\n for (const name of names) {\n const fn = fs[name] as ((p: string, ...rest: unknown[]) => unknown) | undefined;\n if (!fn) continue;\n over[name] = (p: string, ...rest: unknown[]) =>\n readOnly([[p, follow]], () => fn.call(fs, p, ...rest));\n }\n }\n const { chown } = fs;\n if (chown) {\n over.chown = (p: string, uid?: number, gid?: number, follow?: boolean) =>\n readOnly([[p, follow === true]], () => chown.call(fs, p, uid, gid, follow));\n }\n return new Proxy(fs, {\n get: (target, key, receiver) =>\n key in over ? over[key as keyof SyncFsPosixBridge] : Reflect.get(target, key, receiver),\n });\n}\n", "import { defaultAction, SIG, sigbit } from '../../kernel/signals.ts';\nimport type { SignalHooks } from '../process-signals.ts';\nimport { E } from './wasi-abi.ts';\nimport { WasiExit } from './wasi-host.ts';\n\nconst DELIVERED_MASK = Object.values(SIG)\n .filter((sig) => sig !== SIG.KILL && sig !== SIG.STOP)\n .reduce((m, sig) => m | sigbit(sig), 0);\n\nconst KERNEL_DEFAULTS = [SIG.TSTP, SIG.TTIN, SIG.TTOU, SIG.CHLD, SIG.CONT, SIG.URG, SIG.WINCH]\n .map(sigbit)\n .reduce((m, bit) => m | bit, 0);\n\nconst LIBC_DEFAULT_EXIT = 127;\n\nconst SA_RESTART = 0x10000000;\nconst DISPOSITION_IGNORE = 1;\nconst DISPOSITION_HANDLER = 2;\n\nexport interface WasiSignalState {\n callback?: string;\n hooked?: true;\n handlers: number;\n ignoring: number;\n restarting: number;\n uncaught: number;\n}\n\nconst withBit = (mask: number, bit: number, on: boolean): number => (on ? mask | bit : mask & ~bit);\n\nconst WASIX_LIBC_DEFAULT_LINE = /^Program recieved (?:stop|termination|fatal) signal: [^\\n]+\\n$/;\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 defaulted = false;\n\n private libcDefault = false;\n\n private hooked = false;\n\n private handlers = 0;\n\n private ignoring = 0;\n\n private restarting = 0;\n\n private defaults = 0;\n\n private readonly fallBack: (sig: number) => void;\n private readonly onKilled: ((code: number) => void) | undefined;\n constructor(fallBack: (sig: number) => void, onKilled?: (code: number) => void) {\n this.fallBack = fallBack;\n this.onKilled = onKilled;\n }\n\n killed(code: number): void {\n this.onKilled?.(code);\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 useHook(): void {\n this.hooked = true;\n }\n\n disposition(sig: number, disposition: number, flags: number): number {\n if (sig < 1 || sig > 31 || (DELIVERED_MASK & sigbit(sig)) === 0) return E.INVAL;\n const bit = sigbit(sig);\n this.handlers = withBit(this.handlers, bit, disposition === DISPOSITION_HANDLER);\n this.ignoring = withBit(this.ignoring, bit, disposition === DISPOSITION_IGNORE);\n this.restarting = withBit(this.restarting, bit, (flags & SA_RESTART) !== 0);\n this.defaults = withBit(this.defaults, bit, disposition === 0);\n return E.SUCCESS;\n }\n\n snapshot(): WasiSignalState {\n return {\n ...(this.callback ? { callback: this.callback } : {}),\n ...(this.hooked ? { hooked: true as const } : {}),\n handlers: this.handlers,\n ignoring: this.ignoring,\n restarting: this.restarting,\n uncaught: this.uncaught,\n };\n }\n\n restore(state: WasiSignalState): void {\n if (state.callback) this.register(state.callback);\n if (state.hooked) this.hooked = true;\n this.handlers = state.handlers;\n this.ignoring = state.ignoring;\n this.restarting = state.restarting;\n this.uncaught = state.uncaught;\n }\n\n masks(): { caught: number; ignored: number; restart: number; defaults?: number } | null {\n if (this.hooked) {\n const caught = this.handler() ? this.handlers : 0;\n const defaults = this.defaults;\n this.defaults = 0;\n return { caught, ignored: this.ignoring, restart: this.restarting, defaults };\n }\n if (!this.handler()) return null;\n return { caught: DELIVERED_MASK & ~this.uncaught & ~KERNEL_DEFAULTS, ignored: 0, restart: 0 };\n }\n\n raise(sig: number): void {\n const handler = this.handler();\n if (!handler) return;\n const outer = { sig: this.delivering, defaulted: this.defaulted, libc: this.libcDefault };\n this.delivering = sig;\n this.defaulted = false;\n this.libcDefault = false;\n try {\n handler(sig);\n } catch (e) {\n const libcExit = e instanceof WasiExit && e.code === LIBC_DEFAULT_EXIT && this.libcDefault;\n if (!(libcExit && !this.defaulted) && !(e instanceof WebAssembly.RuntimeError)) throw e;\n if (!this.defaulted) this.defaultAction(sig);\n } finally {\n this.delivering = outer.sig;\n this.defaulted = outer.defaulted;\n this.libcDefault = outer.libc;\n }\n }\n\n muted(fd: number, data: Uint8Array): boolean {\n if (fd !== 2 || this.delivering === undefined) return false;\n if (!WASIX_LIBC_DEFAULT_LINE.test(new TextDecoder().decode(data))) return false;\n this.libcDefault = true;\n return true;\n }\n\n raised(sig: number): boolean {\n if (sig !== SIG.ABRT || this.delivering === undefined) return false;\n if (!this.defaulted) this.defaultAction(this.delivering);\n return true;\n }\n\n private defaultAction(sig: number): void {\n this.defaulted = true;\n this.uncaught |= sigbit(sig);\n this.fallBack(sig);\n if (defaultAction(sig) !== 'terminate') this.uncaught &= ~sigbit(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 { E } from './wasi-abi.ts';\nimport type { WasiForkFd } from './wasi-fds.ts';\nimport type { WasiMemory } from './wasi-memory.ts';\nimport type { WasiSignalState } from './wasi-signals.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 signals?: WasiSignalState;\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 get idle(): boolean {\n const state = this.exports.asyncify_get_state;\n return !this.supported || typeof state !== 'function' || state() === 0;\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 { WasiError } from './wasi-files.ts';\nimport type { WasiMemory } from './wasi-memory.ts';\nimport type { FuncTypes, ValType } from './wasm-functypes.ts';\n\ntype Scalar = Exclude<ValType, 'other'>;\ntype Value = number | bigint;\n\nconst SIZE: Readonly<Record<Scalar, number>> = { i32: 4, i64: 8, f32: 4, f64: 8 };\n\nfunction read(view: DataView, at: number, type: Scalar): Value {\n if (type === 'i32') return view.getInt32(at, true);\n if (type === 'i64') return view.getBigInt64(at, true);\n if (type === 'f32') return view.getFloat32(at, true);\n return view.getFloat64(at, true);\n}\n\nfunction readSome(view: DataView, at: number, end: number, type: Scalar): Value {\n if (at + SIZE[type] <= end) return read(view, at, type);\n const some = new DataView(new ArrayBuffer(8));\n for (let i = 0; at + i < end; i++) some.setUint8(i, view.getUint8(at + i));\n return read(some, 0, type);\n}\n\nfunction write(view: DataView, at: number, type: Scalar, value: Value): void {\n if (type === 'i32') view.setInt32(at, Number(value), true);\n else if (type === 'i64') view.setBigInt64(at, BigInt(value), true);\n else if (type === 'f32') view.setFloat32(at, Number(value), true);\n else view.setFloat64(at, Number(value), true);\n}\n\nfunction scalars(types: ValType[]): Scalar[] {\n if (types.includes('other')) throw new WasiError('EINVAL');\n return types as Scalar[];\n}\n\nexport interface FfiContext {\n mem: WasiMemory;\n table(): WebAssembly.Table | undefined;\n types: FuncTypes;\n}\n\nexport function callDynamic(\n ctx: FfiContext,\n ...operands: [number, number, number, number, number, number]\n): void {\n const [id, values, valuesLen, results, resultsLen, strict] = operands.map((n) => n >>> 0);\n const table = ctx.table();\n if (!table) throw new WasiError('ENOTSUP');\n const fn = id < table.length ? table.get(id) : null;\n const sig = fn ? ctx.types.of(fn) : undefined;\n if (!fn || !sig) throw new WasiError('EINVAL');\n const params = scalars(sig.params);\n const outs = scalars(sig.results);\n const size = (types: Scalar[]) => types.reduce((n, type) => n + SIZE[type], 0);\n if (strict && (size(params) !== valuesLen || size(outs) !== resultsLen)) {\n throw new WasiError('EINVAL');\n }\n const view = ctx.mem.view();\n if (values + valuesLen > view.byteLength || results + resultsLen > view.byteLength) {\n throw new WasiError('EFAULT');\n }\n const end = values + valuesLen;\n let at = values;\n const args = params.map((type) => {\n const v = readSome(view, at, end, type);\n at += SIZE[type];\n return v;\n });\n const returned = (fn as (...a: Value[]) => Value | Value[] | undefined)(...args);\n const got = outs.length === 1 ? [returned as Value] : ((returned ?? []) as Value[]);\n const after = ctx.mem.view();\n const stop = results + resultsLen;\n let out = results;\n outs.forEach((type, i) => {\n if (out + SIZE[type] > stop) return;\n write(after, out, type, got[i] as Value);\n out += SIZE[type];\n });\n}\n", "import type { FuncSig, ValType } from './wasm-functypes.ts';\n\nexport type Scalar = 'i32' | 'i64' | 'f32' | 'f64' | 'v128';\n\nconst CODES: readonly Scalar[] = ['i32', 'i64', 'f32', 'f64', 'v128'];\n\nconst VALTYPE: Readonly<Record<Scalar, number>> = {\n i32: 0x7f,\n i64: 0x7e,\n f32: 0x7d,\n f64: 0x7c,\n v128: 0x7b,\n};\n\nconst SIZE: Readonly<Record<Scalar, number>> = { i32: 4, i64: 8, f32: 4, f64: 8, v128: 16 };\n\nconst STORE: Readonly<Record<Scalar, number[]>> = {\n i32: [0x36],\n i64: [0x37],\n f32: [0x38],\n f64: [0x39],\n v128: [0xfd, 0x0b],\n};\n\nconst LOAD: Readonly<Record<Scalar, number[]>> = {\n i32: [0x28],\n i64: [0x29],\n f32: [0x2a],\n f64: [0x2b],\n v128: [0xfd, 0x00],\n};\n\nexport function valueTypes(codes: Uint8Array): Scalar[] | undefined {\n const out: Scalar[] = [];\n for (const code of codes) {\n const type = CODES[code];\n if (!type) return undefined;\n out.push(type);\n }\n return out;\n}\n\nfunction u32(n: number): number[] {\n const out: number[] = [];\n let v = n >>> 0;\n do {\n let b = v & 0x7f;\n v >>>= 7;\n if (v) b |= 0x80;\n out.push(b);\n } while (v);\n return out;\n}\n\nfunction s32(n: number): number[] {\n const out: number[] = [];\n let v = n | 0;\n for (;;) {\n const b = v & 0x7f;\n v >>= 7;\n if ((v === 0 && !(b & 0x40)) || (v === -1 && b & 0x40)) {\n out.push(b);\n return out;\n }\n out.push(b | 0x80);\n }\n}\n\nfunction name(s: string): number[] {\n const bytes = [...new TextEncoder().encode(s)];\n return [...u32(bytes.length), ...bytes];\n}\n\nfunction section(id: number, body: number[]): number[] {\n return [id, ...u32(body.length), ...body];\n}\n\nfunction vec(items: number[][]): number[] {\n return [...u32(items.length), ...items.flat()];\n}\n\nfunction align16(n: number): number {\n return Math.ceil(n / 16) * 16;\n}\n\nexport function trampolineBytes(\n params: Scalar[],\n results: Scalar[],\n shared: boolean\n): Uint8Array<ArrayBuffer> {\n const sig = [\n 0x60,\n ...vec(params.map((t) => [VALTYPE[t]])),\n ...vec(results.map((t) => [VALTYPE[t]])),\n ];\n const backing = [0x60, ...vec([[0x7f], [0x7f], [0x7f]]), ...vec([])];\n const memory = shared ? [0x03, 0x00, ...u32(65536)] : [0x00, 0x00];\n const imports = vec([\n [...name('env'), ...name('memory'), 0x02, ...memory],\n [...name('env'), ...name('__indirect_function_table'), 0x01, 0x70, 0x00, 0x00],\n [...name('env'), ...name('__stack_pointer'), 0x03, 0x7f, 0x01],\n [...name('env'), ...name('backing'), 0x03, 0x7f, 0x00],\n [...name('env'), ...name('user_data'), 0x03, 0x7f, 0x00],\n ]);\n const n = params.length;\n const [orig, args, res] = [n, n + 1, n + 2];\n const valuesSize = align16(params.reduce((sum, t) => sum + SIZE[t], 0));\n const resultsSize = align16(results.reduce((sum, t) => sum + SIZE[t], 0));\n const body: number[] = [\n 0x23,\n 0,\n 0x22,\n ...u32(orig),\n 0x41,\n ...s32(resultsSize),\n 0x6b,\n 0x22,\n ...u32(res),\n ];\n body.push(0x41, ...s32(valuesSize), 0x6b, 0x22, ...u32(args), 0x24, 0);\n let at = 0;\n params.forEach((t, i) => {\n body.push(0x20, ...u32(args), 0x20, ...u32(i), ...STORE[t], 0, ...u32(at));\n at += SIZE[t];\n });\n body.push(0x20, ...u32(args), 0x20, ...u32(res), 0x23, 2, 0x23, 1, 0x11, 1, 0);\n at = 0;\n for (const t of results) {\n body.push(0x20, ...u32(res), ...LOAD[t], 0, ...u32(at));\n at += SIZE[t];\n }\n body.push(0x20, ...u32(orig), 0x24, 0, 0x0b);\n const func = [...vec([[...u32(3), 0x7f]]), ...body];\n return Uint8Array.from([\n 0x00,\n 0x61,\n 0x73,\n 0x6d,\n 0x01,\n 0x00,\n 0x00,\n 0x00,\n ...section(1, vec([sig, backing])),\n ...section(2, imports),\n ...section(3, vec([[0]])),\n ...section(7, vec([[...name('t'), 0x00, 0x00]])),\n ...section(10, vec([[...u32(func.length), ...func]])),\n ]);\n}\n\nexport class Trampolines {\n private readonly modules = new Map<string, WebAssembly.Module>();\n\n get compiled(): number {\n return this.modules.size;\n }\n\n make(\n params: Scalar[],\n results: Scalar[],\n env: {\n memory: WebAssembly.Memory;\n table: WebAssembly.Table;\n stackPointer: WebAssembly.Global;\n backing: number;\n userData: number;\n }\n ): { fn: (...args: unknown[]) => unknown; sig: FuncSig } {\n const shared = env.memory.buffer instanceof SharedArrayBuffer;\n const key = `${params.join(',')}>${results.join(',')}${shared ? 's' : ''}`;\n let module = this.modules.get(key);\n if (!module) {\n module = new WebAssembly.Module(trampolineBytes(params, results, shared));\n this.modules.set(key, module);\n }\n const i32 = (v: number) => new WebAssembly.Global({ value: 'i32', mutable: false }, v);\n const instance = new WebAssembly.Instance(module, {\n env: {\n memory: env.memory,\n __indirect_function_table: env.table,\n __stack_pointer: env.stackPointer,\n backing: i32(env.backing),\n user_data: i32(env.userData),\n },\n });\n const sig: FuncSig = {\n params: params.map((t) => (t === 'v128' ? 'other' : t)) as ValType[],\n results: results.map((t) => (t === 'v128' ? 'other' : t)) as ValType[],\n };\n return { fn: instance.exports.t as (...args: unknown[]) => unknown, sig };\n }\n}\n", "export type ValType = 'i32' | 'i64' | 'f32' | 'f64' | 'other';\n\nexport interface FuncSig {\n params: ValType[];\n results: ValType[];\n}\n\nexport interface ElemSegment {\n offset: number;\n tableBase: boolean;\n funcs: number[];\n}\n\nexport interface FuncTypeInfo {\n sigs: FuncSig[];\n funcs: number[];\n exports: Record<string, number>;\n elems: ElemSegment[];\n}\n\nconst VALTYPES: Readonly<Record<number, ValType>> = {\n 127: 'i32',\n 126: 'i64',\n 125: 'f32',\n 124: 'f64',\n};\n\nconst TABLE_BASE = '__table_base';\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++] ?? 0;\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 s32(): number {\n let result = 0;\n let shift = 0;\n let b: number;\n do {\n b = this.byte();\n result |= (b & 0x7f) << shift;\n shift += 7;\n } while (b & 0x80);\n return shift < 32 && b & 0x40 ? result | (-1 << shift) : result;\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(): ValType {\n const code = this.byte();\n if (code === 0x63 || code === 0x64) this.s32();\n return VALTYPES[code] ?? 'other';\n }\n\n limits(): void {\n const flags = this.byte();\n this.u32();\n if (flags & 1) this.u32();\n }\n}\n\ninterface Scan {\n info: FuncTypeInfo;\n globals: Array<string | number | undefined>;\n}\n\nfunction readTypes(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n r.byte();\n const params: ValType[] = [];\n for (let n = r.u32(); n > 0; n--) params.push(r.valtype());\n const results: ValType[] = [];\n for (let n = r.u32(); n > 0; n--) results.push(r.valtype());\n s.info.sigs.push({ params, results });\n }\n}\n\nfunction readImports(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n r.name();\n const field = r.name();\n const kind = r.byte();\n if (kind === 0) s.info.funcs.push(r.u32());\n else 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 s.globals.push(field);\n } else {\n r.byte();\n r.u32();\n }\n }\n}\n\nfunction readFunctions(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) s.info.funcs.push(r.u32());\n}\n\nconst SKIP: Readonly<Record<number, (r: Reader) => void>> = {\n 66: (r) => r.s32(),\n 67: (r) => {\n r.at += 4;\n },\n 68: (r) => {\n r.at += 8;\n },\n 208: (r) => r.valtype(),\n};\n\nfunction constExpr(r: Reader, s: Scan): { value: number; tableBase: boolean } | undefined {\n let value = 0;\n let tableBase = false;\n let known = true;\n for (;;) {\n const op = r.byte();\n if (op === 0x0b) return known ? { value, tableBase } : undefined;\n if (op === 0x41) value += r.s32();\n else if (op === 0x23) {\n const g = s.globals[r.u32()];\n if (g === TABLE_BASE) tableBase = true;\n else if (typeof g === 'number') value += g;\n else known = false;\n } else if (op === 0xd2) {\n value = r.u32();\n } else if (op in SKIP) {\n SKIP[op]?.(r);\n known = false;\n } else if (op !== 0x6a) {\n r.at = r.bytes.length;\n return undefined;\n }\n }\n}\n\nfunction readGlobals(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n r.valtype();\n r.byte();\n const init = constExpr(r, s);\n s.globals.push(init && !init.tableBase ? init.value : undefined);\n }\n}\n\nfunction readExports(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n const name = r.name();\n const kind = r.byte();\n const index = r.u32();\n if (kind === 0) s.info.exports[name] = index;\n }\n}\n\nfunction readElems(r: Reader, s: Scan): void {\n for (let i = r.u32(); i > 0; i--) {\n const flags = r.u32();\n const active = (flags & 1) === 0;\n const table = flags & 2 ? (active ? r.u32() : 0) : 0;\n const offset = active ? constExpr(r, s) : undefined;\n if (flags & 3) r.valtype();\n const funcs: number[] = [];\n for (let n = r.u32(); n > 0; n--) {\n if (flags & 4) {\n const ref = constExpr(r, s);\n funcs.push(ref ? ref.value : -1);\n } else funcs.push(r.u32());\n }\n if (offset && table === 0) {\n s.info.elems.push({ offset: offset.value, tableBase: offset.tableBase, funcs });\n }\n }\n}\n\nconst SECTIONS: Readonly<Record<number, (r: Reader, s: Scan) => void>> = {\n 1: readTypes,\n 2: readImports,\n 3: readFunctions,\n 6: readGlobals,\n 7: readExports,\n 9: readElems,\n};\n\nexport function funcTypeInfo(bytes: Uint8Array): FuncTypeInfo {\n const r = new Reader(bytes);\n const s: Scan = { info: { sigs: [], funcs: [], exports: {}, elems: [] }, globals: [] };\n while (r.at < bytes.length) {\n const id = r.byte();\n const end = r.u32() + r.at;\n SECTIONS[id]?.(r, s);\n r.at = end;\n }\n return s.info;\n}\n\nexport class FuncTypes {\n private readonly known = new WeakMap<object, FuncSig>();\n private pending: Array<() => void> = [];\n\n register(\n read: () => Uint8Array | undefined,\n instance: WebAssembly.Instance,\n table: WebAssembly.Table | undefined,\n tableBase: number\n ): void {\n this.pending.push(() => {\n const bytes = read();\n if (bytes) this.add(funcTypeInfo(bytes), instance, table, tableBase);\n });\n }\n\n add(\n info: FuncTypeInfo,\n instance: WebAssembly.Instance,\n table: WebAssembly.Table | undefined,\n tableBase: number\n ): void {\n const sig = (func: number) => info.sigs[info.funcs[func] ?? -1];\n for (const [name, func] of Object.entries(info.exports)) {\n const fn = instance.exports[name];\n const type = sig(func);\n if (typeof fn === 'function' && type) this.known.set(fn, type);\n }\n if (!table) return;\n for (const seg of info.elems) {\n const start = seg.offset + (seg.tableBase ? tableBase : 0);\n seg.funcs.forEach((func, i) => {\n const type = sig(func);\n const fn = start + i < table.length ? table.get(start + i) : null;\n if (fn && type) this.known.set(fn, type);\n });\n }\n }\n\n set(fn: object, sig: FuncSig): void {\n this.known.set(fn, sig);\n }\n\n of(fn: object): FuncSig | undefined {\n const known = this.known.get(fn);\n if (known || this.pending.length === 0) return known;\n const pending = this.pending;\n this.pending = [];\n for (const run of pending) run();\n return this.known.get(fn);\n }\n}\n", "import { type DylinkInfo, dylinkInfo } from './dylink.ts';\nimport { normalize } from './wasi-files.ts';\nimport { type Scalar, Trampolines } from './wasix-trampoline.ts';\nimport { FuncTypes } from './wasm-functypes.ts';\n\nexport const 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 | {\n kind: 'load';\n handle: number;\n path: string;\n memoryBase: number;\n tableBase: number;\n needed?: number[];\n }\n | { kind: 'slot'; index: number; handle: number; name: string }\n | { kind: 'closure'; index: number }\n | { kind: 'closure-free'; index: number }\n | {\n kind: 'closure-prepare';\n index: number;\n backing: number;\n userData: number;\n params: Scalar[];\n results: Scalar[];\n };\n\nexport interface LinkerHost {\n read(path: string): Uint8Array<ArrayBuffer> | undefined;\n\n hostImports(module: WebAssembly.Module): WebAssembly.Imports;\n\n real?(path: string): string;\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 indices:\n | {\n reserve(floor: number, size: number): number;\n load(floor: number, size: number): { base: number; handle: number };\n lock(): void;\n unlock(): void;\n allocate(floor: number): number;\n free(index: number): void;\n }\n | undefined;\n\n types = new FuncTypes();\n\n readonly trampolines = new Trampolines();\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 mainPath: string | undefined;\n\n private isMain(path: string): boolean {\n if (this.mainPath === undefined) return false;\n if (path === this.mainPath) return true;\n const real = this.host.real;\n if (real === undefined) return false;\n try {\n return real(path) === real(this.mainPath);\n } catch {\n return false;\n }\n }\n\n open(name: string, cwd: string, ldPath: readonly string[]): number {\n const path = this.locate(name, cwd, ldPath);\n if (this.isMain(path)) return 0;\n this.indices?.lock();\n try {\n return this.load(path, cwd, ldPath).handle;\n } finally {\n this.indices?.unlock();\n }\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 allocateClosure(): number {\n const index = (this.indices as NonNullable<WasixLinker['indices']>).allocate(this.table.length);\n growTable(this.table, index + 1);\n this.live.add(index);\n return index;\n }\n\n freeClosure(index: number): void {\n this.indices?.free(index);\n this.live.delete(index);\n this.table.set(index, null);\n }\n\n private readonly live = new Set<number>();\n\n prepareClosure(record: Omit<Extract<LinkRecord, { kind: 'closure-prepare' }>, 'kind'>): void {\n if (!this.live.has(record.index)) throw new DlError(`closure ${record.index}: not allocated`);\n const full: LinkRecord = { kind: 'closure-prepare', ...record };\n this.install(full);\n this.publisher?.(full);\n }\n\n private install(record: Extract<LinkRecord, { kind: 'closure-prepare' }>): void {\n growTable(this.table, record.index + 1);\n const { fn, sig } = this.trampolines.make(record.params, record.results, {\n memory: this.memory,\n table: this.table,\n stackPointer: this.stackPointer,\n backing: record.backing,\n userData: record.userData,\n });\n this.table.set(record.index, fn as never);\n this.types.set(fn, sig);\n }\n\n private reserveLoad(size: number): { base: number; handle: number } {\n return (\n this.indices?.load(this.table.length, size) ?? {\n base: this.table.length,\n handle: this.nextHandle++,\n }\n );\n }\n\n private reserve(size: number): number {\n return this.indices?.reserve(this.table.length, size) ?? this.table.length;\n }\n\n replay(record: LinkRecord): void {\n if (record.kind === 'closure') {\n growTable(this.table, record.index + 1);\n this.live.add(record.index);\n return;\n }\n if (record.kind === 'closure-free') {\n this.live.delete(record.index);\n if (record.index < this.table.length) this.table.set(record.index, null);\n return;\n }\n if (record.kind === 'closure-prepare') {\n this.install(record);\n return;\n }\n if (record.kind === 'load') {\n if (this.modules.has(record.handle)) return;\n const linked = this.instantiate(record.path, this.moduleAt(record.path), record, false);\n linked.needed.push(...(record.needed ?? []));\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 { base: tableBase, handle } = this.reserveLoad(info.tableSize);\n const record: LinkRecord = {\n kind: 'load',\n handle,\n path,\n memoryBase,\n tableBase,\n ...(needed.length > 0 ? { needed } : {}),\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.types.register(() => this.host.read(path), linked.instance, this.table, at.tableBase);\n this.modules.set(at.handle, linked);\n const first = this.byPath.get(path);\n if (!first || at.handle < first.handle) 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 indexed = 0;\n\n private indexTable(): void {\n for (let i = this.indexed; i < this.table.length; i++) {\n const fn = this.table.get(i);\n if (fn && !this.slots.has(fn)) this.slots.set(fn, i);\n }\n this.indexed = this.table.length;\n }\n\n private slot(fn: unknown, handle: number, name: string): number {\n this.indexTable();\n const known = this.slots.get(fn);\n if (known !== undefined) return known;\n const index = this.reserve(1);\n growTable(this.table, index + 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 to = Math.max(alignment, 16);\n const pages = Math.ceil((size + (to > PAGE ? to : 0)) / PAGE);\n return align(this.memory.grow(pages) * PAGE, to);\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 { HOST_LOOPBACK, HOST_LOOPBACK_ADDRESS } from './loopback-names.ts';\n\nexport interface RouteTable {\n prefixes: readonly string[];\n exit: boolean;\n}\n\nexport type Destination = 'loopback' | 'host' | 'reserved' | 'uplink' | 'unreachable';\n\ninterface Prefix {\n v6: boolean;\n bits: bigint;\n length: number;\n}\n\nconst HOST_ADDRESS = HOST_LOOPBACK_ADDRESS.join('.');\n\nexport function ipv4Bytes(text: string): number[] | undefined {\n const parts = text.split('.');\n if (parts.length !== 4 || !parts.every((p) => /^\\d{1,3}$/.test(p))) return undefined;\n const bytes = parts.map(Number);\n return bytes.every((b) => b <= 255) ? bytes : undefined;\n}\n\nexport function ipv6Groups(text: string): number[] | undefined {\n if (!text.includes(':')) return undefined;\n let canonical: string;\n try {\n canonical = new URL(`http://[${text}]/`).hostname.slice(1, -1);\n } catch {\n return undefined;\n }\n const [head, tail] = canonical.split('::');\n const part = (s: string | undefined) =>\n s ? s.split(':').map((h) => Number.parseInt(h, 16)) : [];\n const front = part(head);\n const back = part(tail);\n return tail === undefined\n ? front\n : [...front, ...new Array<number>(8 - front.length - back.length).fill(0), ...back];\n}\n\nfunction toBits(values: number[], width: number): bigint {\n return values.reduce((acc, v) => (acc << BigInt(width)) | BigInt(v), 0n);\n}\n\nfunction addressBits(host: string): { v6: boolean; bits: bigint } | undefined {\n const v4 = ipv4Bytes(host);\n if (v4) return { v6: false, bits: toBits(v4, 8) };\n const v6 = ipv6Groups(host);\n return v6 ? { v6: true, bits: toBits(v6, 16) } : undefined;\n}\n\nfunction parsePrefix(text: string): Prefix | undefined {\n const parts = text.trim().split('/');\n if (parts.length > 2) return undefined;\n const [address = '', size] = parts;\n const parsed = addressBits(address);\n if (!parsed) return undefined;\n const max = parsed.v6 ? 128 : 32;\n const length = size === undefined ? max : /^\\d{1,3}$/.test(size) ? Number(size) : -1;\n if (length < 0 || length > max) return undefined;\n return { ...parsed, length };\n}\n\nfunction within(prefix: Prefix, addr: { v6: boolean; bits: bigint }): boolean {\n if (prefix.v6 !== addr.v6) return false;\n const shift = BigInt((prefix.v6 ? 128 : 32) - prefix.length);\n return addr.bits >> shift === prefix.bits >> shift;\n}\n\nconst RESERVED = [\n '0.0.0.0/8',\n '127.0.0.0/8',\n '169.254.0.0/16',\n '224.0.0.0/4',\n '240.0.0.0/4',\n '::/96',\n '::ffff:0:0/96',\n 'fe80::/10',\n 'ff00::/8',\n].map((p) => parsePrefix(p) as Prefix);\n\nexport class Routes {\n private table: Prefix[] = [];\n private exit = false;\n readonly ipv6: boolean;\n\n constructor(ipv6 = false) {\n this.ipv6 = ipv6;\n }\n\n set(table: RouteTable): void {\n const parsed = (table.prefixes ?? []).map(parsePrefix);\n const bad = (table.prefixes ?? []).find((_, i) => !parsed[i]);\n if (bad !== undefined) throw new Error(`not an address prefix: ${bad}`);\n this.table = parsed as Prefix[];\n this.exit = table.exit === true;\n }\n\n classify(host: string): Destination {\n const name = host.toLowerCase().replace(/\\.$/, '');\n if (name === 'localhost' || name.endsWith('.localhost') || name === '0.0.0.0') {\n return 'loopback';\n }\n if (name === HOST_LOOPBACK || name === HOST_ADDRESS) return 'host';\n const addr = addressBits(name);\n if (!addr) return 'unreachable';\n if (addr.v6 && addr.bits === 1n) return 'loopback';\n if (!addr.v6 && addr.bits >> 24n === 127n) return 'loopback';\n if (RESERVED.some((p) => within(p, addr))) return 'reserved';\n if (addr.v6 && !this.ipv6) return 'unreachable';\n if (this.exit || this.table.some((p) => within(p, addr))) return 'uplink';\n return 'unreachable';\n }\n}\n", "import { ipv6Groups } from '../../kernel/net/routes.ts';\nimport 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 return { family: 'inet', host: ipv6Host(new Uint8Array(view.buffer, ptr + 4, 16)), port };\n }\n throw new WasiError('EAFNOSUPPORT');\n}\n\nfunction ipv6Host(bytes: Uint8Array): string {\n const zeros = (n: number) => bytes.subarray(0, n).every((b) => b === 0);\n if (zeros(16)) return '0.0.0.0';\n if (zeros(15) && bytes[15] === 1) return LOOPBACK;\n if (zeros(10) && bytes[10] === 0xff && bytes[11] === 0xff) return bytes.subarray(12).join('.');\n const groups = [0, 2, 4, 6, 8, 10, 12, 14].map((i) =>\n ((bytes[i] << 8) | bytes[i + 1]).toString(16)\n );\n return new URL(`http://[${groups.join(':')}]/`).hostname.slice(1, -1);\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.setUint16(ptr + 2, addr.port, true);\n const groups = ipv4(addr.host) ? undefined : ipv6Groups(addr.host);\n if (groups) {\n view.setUint8(ptr, INET6);\n groups.forEach((g, i) => void view.setUint16(ptr + 4 + i * 2, g));\n return;\n }\n view.setUint8(ptr, INET4);\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 ipBytes(host: string): number[] | undefined {\n const groups = ipv4(host) ? undefined : ipv6Groups(host);\n return groups ? groups.flatMap((g) => [g >> 8, g & 0xff]) : ipv4(host);\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 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_pair: (af: number, type: number, _proto: number, out1: number, out2: number) => {\n if (af !== UNIX)\n throw new WasiError(af === INET4 || af === INET6 ? 'EOPNOTSUPP' : 'EAFNOSUPPORT');\n if (type !== STREAM) throw new WasiError('EPROTONOSUPPORT');\n mem.view().setUint32(out1, 0, true);\n mem.view().setUint32(out2, 0, true);\n const [a, b] = call({ op: 'sock-pair', domain: 'unix' }) as [number, number];\n fds.adopt(a, 'socket', false);\n fds.adopt(b, 'socket', false);\n mem.view().setUint32(out1, a, true);\n mem.view().setUint32(out2, b, 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 found = call({ op: 'sock-resolve', name: mem.string(name, len), family: 0 });\n const ips = (found as string[]).map(ipBytes).filter((ip) => ip !== undefined);\n if (ips.length === 0) throw new WasiError('ENOENT');\n if (naddrs < 1) throw new WasiError('EINVAL');\n const view = mem.view();\n const count = Math.min(ips.length, naddrs);\n new Uint8Array(view.buffer, addrs, ADDR_IP_SIZE * count).fill(0);\n for (let i = 0; i < count; i++) {\n const at = addrs + i * ADDR_IP_SIZE;\n view.setUint8(at, ips[i].length === 4 ? INET4 : INET6);\n new Uint8Array(view.buffer, at + 2, ips[i].length).set(ips[i]);\n }\n view.setUint32(out, count, true);\n },\n };\n}\n", "import { E, FDFLAGS, wasiErrnoOf, wasixSignal } from './wasi-abi.ts';\nimport { WasiError } from './wasi-files.ts';\nimport { WasiExit, type WasiFunction, type WasiHost, wrap } from './wasi-host.ts';\nimport { libcVersion } from './wasi-module.ts';\nimport type { WasiSignals } from './wasi-signals.ts';\nimport { MAIN_TID, ThreadExit, type WasiThreads } from './wasi-threads.ts';\nimport { callDynamic } from './wasix-ffi.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';\nimport { valueTypes } from './wasix-trampoline.ts';\nimport { FuncTypes } from './wasm-functypes.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\nconst FUTEX_SLICE_MS = 50;\n\nexport function futexWait(\n view: Int32Array,\n index: number,\n expected: number,\n ms: number,\n interrupted: (() => boolean) | undefined\n): boolean {\n const deadline = performance.now() + ms;\n for (;;) {\n const slice = interrupted ? Math.min(FUTEX_SLICE_MS, ms) : ms;\n if (Atomics.wait(view, index, expected, slice) !== 'timed-out') return true;\n if (interrupted?.()) return true;\n ms = deadline - performance.now();\n if (ms <= 0) return false;\n }\n}\n\nconst EINTR_LIBC = 22;\nconst MAIN_HANDLE = 0x7fffffff;\n\nexport class WasixHost {\n private readonly process: WasixProcess;\n\n threads: WasiThreads | undefined;\n\n linker: WasixLinker | undefined;\n\n types = new FuncTypes();\n\n table: WebAssembly.Table | 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(\n host,\n driver,\n () => (this.threads?.tid ?? MAIN_TID) !== MAIN_TID\n );\n\n if (module && !WebAssembly.Module.imports(module).some((i) => i.name === 'fd_fdflags_set')) {\n host.fds.implicitCloexec = true;\n\n host.interruptWakes = (libcVersion(module) ?? 0) < EINTR_LIBC;\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 closure_allocate: (out: number) => {\n if (!this.linker) throw new WasiError('ENOTSUP');\n this.mem.view().setUint32(out, this.linker.allocateClosure(), true);\n },\n closure_prepare: (\n backing: number,\n index: number,\n argTypes: number,\n argCount: number,\n resultTypes: number,\n resultCount: number,\n userData: number\n ) => {\n if (!this.linker) throw new WasiError('ENOTSUP');\n const params = valueTypes(this.mem.bytes(argTypes, argCount));\n const results = valueTypes(this.mem.bytes(resultTypes, resultCount));\n if (!params || !results) throw new WasiError('EINVAL');\n try {\n this.linker.prepareClosure({ index, backing, userData, params, results });\n } catch (e) {\n if (e instanceof DlError) throw new WasiError('EINVAL');\n throw e;\n }\n },\n closure_free: (index: number) => {\n if (!this.linker) throw new WasiError('ENOTSUP');\n this.linker.freeClosure(index);\n },\n call_dynamic: (...a: number[]) =>\n void callDynamic(\n { mem: this.mem, table: () => this.table, types: this.types },\n ...(a as [number, number, number, number, number, number])\n ),\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.parent?.() ?? 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 : wasixSignal(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 if (!this.linker) return failed('not a dynamically-linked program', buf, len);\n mem.view().setUint32(out, MAIN_HANDLE, 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 === 0 ? MAIN_HANDLE : 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 === MAIN_HANDLE ? 0 : handle, this.str(s, sl)),\n (v) => void mem.view().setUint32(out, v, true)\n ),\n dl_invalid_handle: (handle: number) =>\n this.linker && (handle === MAIN_HANDLE || (handle !== 0 && !this.linker.invalid(handle)))\n ? E.SUCCESS\n : 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 = posixSignal(sig);\n if (host.onRaise?.(posix)) return;\n host.o.kernel.call({ op: 'thread-kill', tid, 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 v.setUint8(\n wokenPtr,\n futexWait(i32(), ptr >> 2, expected | 0, ms, host.interrupted) ? 1 : 0\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 host.interrupted?.();\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) throw new WasiError('ENOTTY');\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 this.host.interrupted?.();\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 = wasixSignal(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 { physicalPath } from '../../fs/physical-path.ts';\nimport type { MountLine, ProcessListing } from '../../kernel/proc-info.ts';\nimport 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 { defaultAction } from '../../kernel/signals.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 { publishMemory, SAB_HEADER_I32 } from '../../realm/sync-sab-wire.ts';\nimport { SyscallError } from '../kernel-streams.ts';\nimport { identify, 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, type WasiHostOptions } 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 { ProcTree, procfsBridge } from './wasi-procfs.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, type WasiForkState } from './wasix-fork.ts';\nimport { WasixHost } from './wasix-host.ts';\nimport { type LinkerHost, type LinkRecord, TABLE_BASE, 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';\nconst SLICC = 'slicc';\n\nconst SIGNAL_CALLBACK = '__wasm_signal';\n\nconst takeDefault =\n (call: (req: WasmSyscall) => unknown, pid: number) =>\n (sig: number): void => {\n call({ op: 'proc-kill', pid, sig });\n if (defaultAction(sig) === 'terminate') throw new WasiExit(128 + sig);\n };\n\nconst SLICC_FS = 'slicc_fs';\nconst SLICC_TTY = 'slicc_tty';\n\nconst RESERVED = RESERVED_NAMESPACES;\n\nexport const UNDELIVERED: Readonly<Record<string, readonly string[]>> = {\n [PREVIEW1]: ['proc_exit', 'clock_time_get'],\n [WASIX]: ['proc_exit2', 'thread_exit', 'thread_spawn_v2', 'callback_signal'],\n [SLICC]: ['sigaction_set'],\n wasi: ['thread-spawn'],\n};\n\nconst DELIVERED = [PREVIEW1, WASIX, SLICC, SLICC_FS, SLICC_TTY];\n\nexport function wireSignals(host: WasiHost, gate: SignalGate): void {\n host.interrupted = () => gate.interrupt();\n host.quietly = (fn) => gate.quiet(fn);\n}\n\nexport function catchUpFirst(\n host: WasiHost,\n sync: { current(): void } | undefined\n): (() => void) | undefined {\n return sync && (() => host.quietly(() => sync.current()));\n}\n\nfunction deliverAll(\n imports: WebAssembly.Imports,\n host: WasiHost,\n driver: AsyncifyDriver,\n before?: () => void\n): void {\n for (const ns of DELIVERED) {\n const table = imports[ns];\n if (table) imports[ns] = delivering(ns, table, host, driver, before);\n }\n}\n\nexport function delivering(\n ns: string,\n table: WebAssembly.ModuleImports,\n host: WasiHost,\n driver: AsyncifyDriver,\n before?: () => void\n): WebAssembly.ModuleImports {\n const exempt = new Set(UNDELIVERED[ns]);\n const out: WebAssembly.ModuleImports = {};\n for (const [name, value] of Object.entries(table)) {\n if (exempt.has(name) || typeof value !== 'function') {\n out[name] = value;\n continue;\n }\n const fn = value as (...args: unknown[]) => unknown;\n out[name] = (...args: unknown[]) => {\n if (driver.idle) {\n before?.();\n host.interrupted?.();\n }\n return fn(...args);\n };\n }\n return out;\n}\n\nconst importsSigactionHook = (module: WebAssembly.Module): boolean =>\n WebAssembly.Module.imports(module).some((i) => i.module === SLICC && i.name === 'sigaction_set');\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 slicc: Record<string, WasiFunction> = {},\n sliccFs: Record<string, WasiFunction> = {},\n sliccTty: Record<string, WasiFunction> = {}\n): WebAssembly.Imports {\n for (const ns of Object.keys(program)) {\n if (RESERVED.has(ns) || ns === SLICC || ns === SLICC_FS || ns === SLICC_TTY)\n throw new Error(`the imports module may not define ${ns}`);\n }\n const imports: Record<string, Record<string, WebAssembly.ImportValue>> = {\n ...program,\n [SLICC]: { ...slicc },\n [SLICC_FS]: { ...sliccFs },\n [SLICC_TTY]: { ...sliccTty },\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 sizeOf(main: { memory?: WebAssembly.Memory }): () => number {\n return () => main.memory?.buffer.byteLength ?? 0;\n}\n\nfunction memoryOf(\n instance: WebAssembly.Instance,\n imported: WebAssembly.Memory | undefined\n): WebAssembly.Memory | undefined {\n return imported ?? (instance.exports.memory as WebAssembly.Memory | undefined);\n}\n\nfunction kernelOf(\n init: { sab: SharedArrayBuffer; argv0: string },\n port: SabPostLike,\n\n hooks: SignalHooks = { masks: () => null, raise: () => {} },\n memory?: () => number\n) {\n const gate = new SignalGate(\n createSyncSabTransport(init.sab, port, memory ? { memory } : {}),\n new Int32Array(init.sab, 0, SAB_HEADER_I32),\n hooks\n );\n const transport = gate.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, gate };\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 path,\n }: {\n thread?: boolean;\n stats?: WasiStats;\n signals?: WasiSignals;\n program?: ProgramOption;\n foreign?: ForeignResults | undefined;\n path?: string | 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\n )\n : undefined;\n if (sync) {\n ({ preview1, wasix } = sync.guard(preview1, wasix));\n if (wasixHost) {\n wasixHost.linker = sync.linker;\n wasixHost.types = sync.linker.types;\n }\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 slicc = traced(stats, 'slicc', host.sliccImports());\n const sliccFs = traced(stats, 'slicc_fs', host.sliccFsImports());\n const sliccTty = traced(stats, 'slicc_tty', host.sliccTtyImports());\n const hostImports = linkImports(\n module,\n preview1,\n wasix,\n memory,\n threads,\n extra,\n foreign,\n slicc,\n sliccFs,\n sliccTty\n );\n deliverAll(hostImports, host, driver, catchUpFirst(host, sync));\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 (wasixHost) {\n const table = sync?.linker.table ?? exportedTable(instance);\n wasixHost.table = table;\n if (path !== undefined) {\n const read = linkerHost(host, () => ({})).read;\n wasixHost.types.register(() => read(path), instance, table, sync ? TABLE_BASE : 0);\n }\n }\n if (sync) {\n sync.linker.bindMain(instance, !thread);\n if (path !== undefined) sync.linker.mainPath = path;\n\n if (thread) sync.catchUp();\n\n sync.linker.bindMainGot();\n }\n return { instance, driver };\n}\n\nfunction procTree(call: (req: WasmSyscall) => unknown, pid: number): ProcTree {\n return new ProcTree(\n {\n procList: () => call({ op: 'proc-list' }) as ProcessListing,\n mountList: () => call({ op: 'mount-list' }) as MountLine[],\n },\n pid\n );\n}\n\nfunction exportedTable(instance: WebAssembly.Instance): WebAssembly.Table | undefined {\n const table = instance.exports.__indirect_function_table;\n return table instanceof WebAssembly.Table ? table : undefined;\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 real: (path) => physicalPath(host.o.fs, path),\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\nexport class 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 private readonly owner: number;\n constructor(\n linker: WasixLinker,\n call: (req: WasmSyscall) => unknown,\n threads: Pick<WasiThreads, 'ids' | 'tid'> | undefined\n ) {\n this.linker = linker;\n this.call = call;\n this.ids = threads?.ids;\n this.owner = threads?.tid ?? 0;\n linker.publisher = (record) => this.publish(record);\n linker.indices = {\n reserve: (floor, size) => this.call({ op: 'dl-reserve', floor, size }) as number,\n load: (floor, size) =>\n this.call({ op: 'dl-load-reserve', floor, size }) as { base: number; handle: number },\n lock: () => {\n this.call({ op: 'dl-lock', owner: this.owner });\n try {\n this.catchUp();\n } catch (e) {\n this.call({ op: 'dl-unlock', owner: this.owner });\n throw e;\n }\n },\n unlock: () => this.call({ op: 'dl-unlock', owner: this.owner }),\n allocate: (floor) => {\n const index = this.call({ op: 'dl-closure', floor }) as number;\n this.catchUp();\n this.bump();\n return index;\n },\n free: (index) => {\n this.call({ op: 'dl-closure-free', index });\n this.bump();\n },\n };\n }\n\n private bump(): void {\n if (this.ids) Atomics.add(this.ids, DL_GEN, 1);\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 this.bump();\n this.catchUp();\n }\n\n current(): void {\n if (this.ids && Atomics.load(this.ids, DL_GEN) !== this.gen) this.catchUp();\n }\n\n catchUp(): void {\n for (;;) {\n const gen = this.ids ? Atomics.load(this.ids, DL_GEN) : 0;\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 || Atomics.load(this.ids, DL_GEN) === gen) {\n this.gen = gen;\n return;\n }\n }\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 this.current();\n const result = fn(...args);\n this.current();\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\nfunction descriptors(\n init: WasmProcessInitMsg,\n fork: WasiForkState | undefined,\n threads: WasiThreads | undefined\n): Pick<WasiHostOptions, 'shared' | 'forked' | 'inherited' | 'preopenRoot'> {\n if (fork?.shared && threads) return { shared: threads.ids };\n if (fork) return { forked: { fds: fork.fds, cloexec: fork.cloexec } };\n return { inherited: init.fds ?? [], ...(init.program.preopenRoot ? { preopenRoot: true } : {}) };\n}\n\nfunction ownersOf(init: { owners?: boolean }): { owners?: boolean } {\n return init.owners ? { owners: true } : {};\n}\n\nexport async function runWasiProcess(init: WasmProcessInitMsg, port: SabPostLike): Promise<number> {\n captureBacktraces(init.env);\n\n const signals = new WasiSignals(\n takeDefault((req) => call(req), init.pid),\n (code) => {\n throw new WasiExit(code);\n }\n );\n const main: { memory?: WebAssembly.Memory } = {};\n const {\n transport,\n sys,\n call: kernelCall,\n say,\n gate,\n } = kernelOf(init, port, signals, sizeOf(main));\n const id = identify(transport, init);\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: id.pid,\n ppid: id.ppid,\n parent: () => identify(transport, init).ppid,\n kernel: { sys: traced(stats, 'kernel', sys), call },\n fs: procfsBridge(\n cachingBridge(\n traced(stats, 'fs', createSyncFsSabBridge(transport, ownersOf(init))),\n undefined,\n threads?.ids\n ),\n procTree(call, id.pid)\n ),\n ...descriptors(init, fork, threads),\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 path: init.program.path,\n ...(program ? { program } : {}),\n });\n restoreExportedMemory(instance, memory, init);\n main.memory = memoryOf(instance, memory);\n publishMemory(init.sab, sizeOf(main)());\n signals.bind(instance.exports);\n if (importsSigactionHook(module)) signals.useHook();\n if (fork?.signals) signals.restore(fork.signals);\n host.signals = signals;\n wireSignals(host, gate);\n host.onRaise = (sig) => signals.raised(sig);\n host.muted = (fd, data) => signals.muted(fd, data);\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 { thread } = init;\n const { transport, sys, call, say, gate } = kernelOf(init, port, {\n masks: () => null,\n raise: (sig) => signals.raise(sig),\n });\n const signals = new WasiSignals(takeDefault(call, init.pid));\n const threads = new WasiThreads(port, thread.memory, threadCap(init.env), thread.tid, thread.ids);\n threads.received = thread.modules;\n const id = identify(transport, init);\n const host = new WasiHost({\n args: [init.argv0, ...init.args],\n env: init.env,\n cwd: init.cwd,\n pid: id.pid,\n ppid: id.ppid,\n parent: () => identify(transport, init).ppid,\n kernel: { sys, call },\n fs: procfsBridge(\n cachingBridge(createSyncFsSabBridge(transport, ownersOf(init)), undefined, threads.ids),\n procTree(call, id.pid)\n ),\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 path: init.program.path,\n ...(program ? { program } : {}),\n });\n signals.bind(instance.exports);\n signals.register(SIGNAL_CALLBACK);\n wireSignals(host, gate);\n host.onRaise = (sig) => signals.raised(sig);\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 { nodeLockdown } from './node-lockdown.ts';\nimport { runJsProcess } from './process/js/js-runtime.ts';\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 post = { postMessage: (message: unknown) => port.postMessage(message) };\nconst onMessage = processEntry(post, undefined, undefined, async () => ({\n runJsProcess: (init, at) => runJsProcess(init, at, { lockdown: () => nodeLockdown() }),\n}));\nport.on('message', onMessage);\n", "import { isBuiltin, registerHooks } from 'node:module';\nimport { hide, lockdown, vacate } from './process/js/lockdown.ts';\n\nexport { vacate };\n\nexport const NODE_GLOBALS: readonly string[] = [\n 'require',\n 'module',\n 'exports',\n '__filename',\n '__dirname',\n 'localStorage',\n 'sessionStorage',\n];\n\nexport const NODE_SLOTS: readonly string[] = [\n 'process',\n 'global',\n 'setImmediate',\n 'clearImmediate',\n];\n\nexport function zeroedBuffers(buffer: typeof Buffer): void {\n const alloc = buffer.alloc.bind(buffer);\n const fixed = (value: unknown) => ({ value, writable: false, configurable: false });\n Object.defineProperties(buffer, {\n allocUnsafe: fixed((size: number) => alloc(size)),\n allocUnsafeSlow: fixed((size: number) => alloc(size)),\n poolSize: fixed(0),\n });\n}\n\nfunction refused(specifier: string): Error {\n return Object.assign(new Error(`slicc-kernel: a JS program cannot import ${specifier}`), {\n code: 'ERR_ACCESS_DENIED',\n });\n}\n\nexport function refuseModules(): void {\n registerHooks({\n resolve(specifier, context, next) {\n if (isBuiltin(specifier)) throw refused(specifier);\n const resolved = next(specifier, context);\n if (!resolved.url.startsWith('data:')) throw refused(resolved.url);\n return resolved;\n },\n });\n}\n\nexport function nodeLockdown(scope: object = globalThis): void {\n zeroedBuffers(Buffer);\n lockdown(scope);\n hide(scope, NODE_GLOBALS);\n vacate(scope, NODE_SLOTS);\n refuseModules();\n}\n", "import { useLocalClock } from '../kernel/cpu-clock.ts';\nimport {\n type JsProcessInitMsg,\n type ProcessInitMsg,\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\nexport interface JsRuntime {\n runJsProcess(init: JsProcessInitMsg, port: SabPostLike): Promise<number>;\n}\n\nexport type JsLoader = () => Promise<JsRuntime>;\n\nconst loadWasi: WasiLoader = () => import('./wasi/wasi-runtime.ts');\n\nconst loadJs: JsLoader = () => import('./js/js-runtime.ts');\n\nconst NOT_RUNNABLE = 126;\n\nfunction started(\n init: ProcessInitMsg,\n port: SabPostLike,\n run: ProcessRunner,\n wasi: WasiLoader,\n js: JsLoader\n): Promise<number> {\n if (init.program?.abi === 'js') {\n const jsInit = init as JsProcessInitMsg;\n return js().then((m) => m.runJsProcess(jsInit, port));\n }\n const wasmInit = init as WasmProcessInitMsg;\n if (wasmInit.program?.abi === 'wasi') return wasi().then((m) => m.runWasiProcess(wasmInit, port));\n return run(wasmInit, port);\n}\n\nexport function processEntry(\n port: SabPostLike,\n run: ProcessRunner = runWasmProcess,\n wasi: WasiLoader = loadWasi,\n js: JsLoader = loadJs,\n seal: () => void = () => {}\n): (data: unknown) => void {\n const failed = (err: unknown, code?: number): void =>\n port.postMessage({\n type: WASM_PROCESS_ERROR,\n message: err instanceof Error ? (err.stack ?? err.message) : String(err),\n ...(code === undefined ? {} : { code }),\n } satisfies WasmProcessErrorMsg);\n let refused: { error: unknown } | null | undefined;\n const sealOnce = (): { error: unknown } | null => {\n if (refused === undefined) {\n try {\n seal();\n refused = null;\n } catch (error) {\n refused = { error };\n }\n }\n return refused;\n };\n return (data) => {\n const type = (data as { type?: string } | undefined)?.type;\n if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT) return;\n const refusal = sealOnce();\n const init = data as { sab?: SharedArrayBuffer; program?: { abi?: string } } | undefined;\n if (type === WASM_THREAD_INIT || init?.program?.abi !== 'js') useLocalClock(init?.sab);\n if (type === WASM_THREAD_INIT) {\n if (refusal) return failed(refusal.error);\n wasi()\n .then((m) => m.runWasiThread(data as WasmThreadInitMsg, port))\n .catch(failed);\n return;\n }\n if (refusal) return failed(refusal.error, NOT_RUNNABLE);\n started(data as ProcessInitMsg, port, run, wasi, js).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": ["name", "scope", "code", "name", "last", "start", "written", "start", "name", "follow", "now", "code", "readable", "writable", "port", "status", "errno", "wait", "index", "value", "start", "json", "code", "write", "read", "writable", "device", "name", "next", "joined", "readable", "decoder", "encoder", "read", "write", "value", "value", "next", "name", "code", "call", "follow", "lookup", "listen", "answer", "field", "O_WRONLY", "O_RDWR", "O_APPEND", "name", "opened", "slots", "status", "call", "read", "write", "name", "status", "index", "port", "status", "errno", "message", "code", "status", "wait", "slots", "call", "STDIO", "name", "read", "write", "write", "O_RDWR", "O_WRONLY", "O_APPEND", "index", "name", "STDIO", "follow", "copy", "write", "next", "answer", "index", "opened", "status", "status", "next", "name", "value", "start", "rest", "base64", "CHUNK", "follow", "errno", "name", "local", "readable", "writable", "opened", "failed", "STDIO", "value", "encoder", "port", "wait", "status", "code", "json", "follow", "read", "index", "write", "encoder", "openDev", "failed", "code", "NEVER", "settled", "readable", "writable", "answer", "code", "read", "index", "write", "encoder", "settled", "resolve", "writable", "status", "drain", "scope", "value", "port", "status", "drain", "name", "code", "name", "errno", "code", "errno", "wantOf", "read", "write", "idOf", "s", "st", "pinnedIo", "call", "name", "attr", "opened", "out", "value", "name", "SYNTHETIC_DIRS", "O_NONBLOCK", "SEALED_PATH", "CLIPBOARD_PATH", "O_TRUNC", "status", "code", "name", "missing", "rest", "device", "read", "write", "failed", "code", "copy", "rest", "name", "value", "wrap", "O_CREAT", "AT_SYMLINK_NOFOLLOW", "errno", "code", "write", "O_ACCMODE", "O_WRONLY", "lookup", "call", "follow", "AT_EACCESS", "refused", "kernelEntry", "slots", "device", "DEVICES", "O_ACCMODE", "O_RDWR", "O_CREAT", "O_EXCL", "O_TRUNC", "restarted", "errno", "read", "write", "POLLIN", "POLLOUT", "POLLHUP", "POLLERR", "local", "call", "S_IFMT", "S_IFDIR", "device", "status", "call", "code", "message", "code", "O_WRONLY", "O_CREAT", "O_EXCL", "call", "json", "O_RDWR", "O_NONBLOCK", "name", "value", "KILLED_BY_SIGPIPE", "name", "value", "sum", "scope", "UID", "errno", "processes", "DIR_MODE", "lookup", "next", "LINK_MODE", "attr", "call", "json", "name", "O_ACCMODE", "port", "running", "encoder", "failed", "status", "O_WRONLY", "O_RDWR", "section", "value", "section", "follow", "next", "MAX_HOPS", "failed", "code", "physical", "late", "name", "rest", "DIR_MODE", "FILE_MODE", "LINK_MODE", "code", "name", "name", "value", "name", "value", "SIZE", "value", "code", "SIZE", "field", "value", "name", "index", "code", "read", "start", "pages", "PAGE", "name", "TABLE_BASE", "value", "index", "resolved", "port", "call", "name", "index", "ICANON", "ECHO", "code", "name", "lookup", "failed", "message", "decoder", "value", "index", "name", "read", "name", "value", "field", "scope", "RESERVED", "refused", "sliccTty", "copy", "pages", "port", "call", "read", "TABLE_BASE", "rest", "code", "start", "index", "wrap", "value", "next", "resolved", "scope", "NOT_RUNNABLE", "port", "failed", "code", "refused", "refusal", "port", "message"]
|
|
7
7
|
}
|