@ai-ecoverse/slicc-kernel 1.165.3 → 1.166.2
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 +2 -2
- package/dist/kernel-worker.js +63 -9
- package/dist/kernel-worker.js.map +2 -2
- package/dist/node-driver-worker.js +23 -1
- package/dist/node-driver-worker.js.map +2 -2
- package/dist/node-process-worker.cjs +20492 -0
- package/dist/node-process-worker.cjs.map +7 -0
- package/dist/node-process-worker.js +49 -27
- package/dist/node-process-worker.js.map +3 -3
- package/dist/node.js +154 -13
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +1 -1
- package/dist/types/kernel/vfs-file.d.ts +6 -0
- package/dist/types/launcher.d.ts +2 -0
- package/dist/types/node/worker-boot.d.ts +15 -0
- package/dist/types/node.d.ts +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/captured-globals.ts", "../src/process/raw-stack.ts", "../src/process/js/lockdown.ts", "../src/kernel/protocol.ts", "../src/process/wasi/wasi-abi.ts", "../src/fs/changes.ts", "../src/fs/pages.ts", "../src/fs/ranged.ts", "../src/realm/sync-fs-wire.ts", "../src/process/wasi/wasi-files.ts", "../src/realm/sync-sab-wire.ts", "../src/process/wasi/wasi-threads.ts", "../src/fs/physical-path.ts", "../src/fs/dev-removal.ts", "../src/kernel/cpu-clock.ts", "../src/fs/types.ts", "../src/kernel/cred.ts", "../src/kernel/signals.ts", "../src/realm/sync-sab-bridge.ts", "../src/process/js/async-sab.ts", "../src/process/js/js-kernel.ts", "../src/process/js/js-io.ts", "../src/process/js/js-dev.ts", "../src/process/wasi/slicc-lock.ts", "../src/process/wasi/slicc-sem.ts", "../src/process/wasi/wasi-cred.ts", "../src/kernel/pipe.ts", "../src/kernel/fd-table.ts", "../src/process/wasi/wasi-fds.ts", "../src/process/wasi/wasi-memory.ts", "../src/process/wasi/wasi-poll.ts", "../src/process/wasi/wasi-sigmask.ts", "../src/process/wasi/wasi-termios.ts", "../src/process/wasi/wasix-epoll.ts", "../src/kernel/net/datagram-wire.ts", "../src/kernel/net/loopback-names.ts", "../src/kernel/net/routes.ts", "../src/process/wasi/wasix-sockets.ts", "../src/process/wasi/wasi-host.ts", "../src/process/wasi/wasix-process.ts", "../src/process/wasi/wasi-imports.ts", "../src/kernel/held-cwd.ts", "../src/realm/emscripten-held-cwd.ts", "../src/version.ts", "../src/process/js/js-children.ts", "../src/process/js/js-exit.ts", "../src/process/js/js-fetch.ts", "../src/process/js/js-net.ts", "../src/kernel/proc-info.ts", "../src/fs/owners.ts", "../src/fs/walk.ts", "../src/fs/access.ts", "../src/process/wasi-errno.ts", "../src/realm/live-vfs-fs.ts", "../src/process/process-locks.ts", "../src/process/process-pty.ts", "../src/process/process-fds.ts", "../src/process/procfs.ts", "../src/process/wasi/wasi-procfs.ts", "../src/process/js/js-proc.ts", "../src/process/js/js-rights.ts", "../src/process/js/js-run.ts", "../src/process/js/js-sync.ts", "../src/process/js/js-tty.ts", "../src/realm/emscripten-vfs-hook.ts", "../src/process/fd-metadata.ts", "../src/process/kernel-streams.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/realm-user.ts", "../src/process/process-runtime.ts", "../src/process/js/js-wasi.ts", "../src/process/js/js-watch.ts", "../src/process/js/js-websocket.ts", "../src/process/js/js-context.ts", "../src/process/js/js-thread.ts", "../src/process/js/js-runtime.ts", "../src/process/wasi/dylink.ts", "../src/process/wasi/wasi-module.ts", "../src/process/wasi/wasi-ptsfs.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/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/node-stack.ts", "../src/process/process-entry.ts"],
|
|
4
|
+
"sourcesContent": ["const here = globalThis as unknown as Record<string, unknown>;\n\nfunction bound<T>(name: string): T {\n const value = here[name];\n return (typeof value === 'function' ? value.bind(here) : value) as T;\n}\n\nconst capturedAbortController = here.AbortController as typeof globalThis.AbortController;\n\nexport { capturedAbortController as AbortController };\n\nconst capturedAbortSignal = here.AbortSignal as typeof globalThis.AbortSignal;\n\nexport { capturedAbortSignal as AbortSignal };\n\nconst capturedArray = here.Array as typeof globalThis.Array;\n\nexport { capturedArray as Array };\n\nconst capturedArrayBuffer = here.ArrayBuffer as typeof globalThis.ArrayBuffer;\n\nexport { capturedArrayBuffer as ArrayBuffer };\n\nconst capturedAtomics = here.Atomics as typeof globalThis.Atomics;\n\nexport { capturedAtomics as Atomics };\n\nconst capturedBigInt = here.BigInt as typeof globalThis.BigInt;\n\nexport { capturedBigInt as BigInt };\n\nconst capturedBigInt64Array = here.BigInt64Array as typeof globalThis.BigInt64Array;\n\nexport { capturedBigInt64Array as BigInt64Array };\n\nconst capturedBoolean = here.Boolean as typeof globalThis.Boolean;\n\nexport { capturedBoolean as Boolean };\n\nconst capturedBuffer = here.Buffer;\n\nexport { capturedBuffer as Buffer };\n\nconst capturedDataView = here.DataView as typeof globalThis.DataView;\n\nexport { capturedDataView as DataView };\n\nconst capturedDate = here.Date as typeof globalThis.Date;\n\nexport { capturedDate as Date };\n\nconst capturedDecompressionStream =\n here.DecompressionStream as typeof globalThis.DecompressionStream;\n\nexport { capturedDecompressionStream as DecompressionStream };\n\nconst capturedError = here.Error as typeof globalThis.Error;\n\nexport { capturedError as Error };\n\nconst capturedEvalError = here.EvalError as typeof globalThis.EvalError;\n\nexport { capturedEvalError as EvalError };\n\nconst capturedFunction = here.Function as typeof globalThis.Function;\n\nexport { capturedFunction as Function };\n\nconst capturedHeaders = here.Headers as typeof globalThis.Headers;\n\nexport { capturedHeaders as Headers };\n\nconst capturedInt32Array = here.Int32Array as typeof globalThis.Int32Array;\n\nexport { capturedInt32Array as Int32Array };\n\nconst capturedJSON = here.JSON as typeof globalThis.JSON;\n\nexport { capturedJSON as JSON };\n\nconst capturedMap = here.Map as typeof globalThis.Map;\n\nexport { capturedMap as Map };\n\nconst capturedMath = here.Math as typeof globalThis.Math;\n\nexport { capturedMath as Math };\n\nconst capturedNumber = here.Number as typeof globalThis.Number;\n\nexport { capturedNumber as Number };\n\nconst capturedObject = here.Object as typeof globalThis.Object;\n\nexport { capturedObject as Object };\n\nconst capturedPromise = here.Promise as typeof globalThis.Promise;\n\nexport { capturedPromise as Promise };\n\nconst capturedProxy = here.Proxy as typeof globalThis.Proxy;\n\nexport { capturedProxy as Proxy };\n\nconst capturedRangeError = here.RangeError as typeof globalThis.RangeError;\n\nexport { capturedRangeError as RangeError };\n\nconst capturedReadableStream = here.ReadableStream as typeof globalThis.ReadableStream;\n\nexport { capturedReadableStream as ReadableStream };\n\nconst capturedReflect = here.Reflect as typeof globalThis.Reflect;\n\nexport { capturedReflect as Reflect };\n\nconst capturedRequest = here.Request as typeof globalThis.Request;\n\nexport { capturedRequest as Request };\n\nconst capturedResponse = here.Response as typeof globalThis.Response;\n\nexport { capturedResponse as Response };\n\nconst capturedSet = here.Set as typeof globalThis.Set;\n\nexport { capturedSet as Set };\n\nconst capturedSharedArrayBuffer = here.SharedArrayBuffer as typeof globalThis.SharedArrayBuffer;\n\nexport { capturedSharedArrayBuffer as SharedArrayBuffer };\n\nconst capturedString = here.String as typeof globalThis.String;\n\nexport { capturedString as String };\n\nconst capturedSymbol = here.Symbol as typeof globalThis.Symbol;\n\nexport { capturedSymbol as Symbol };\n\nconst capturedSyntaxError = here.SyntaxError as typeof globalThis.SyntaxError;\n\nexport { capturedSyntaxError as SyntaxError };\n\nconst capturedTextDecoder = here.TextDecoder as typeof globalThis.TextDecoder;\n\nexport { capturedTextDecoder as TextDecoder };\n\nconst capturedTextEncoder = here.TextEncoder as typeof globalThis.TextEncoder;\n\nexport { capturedTextEncoder as TextEncoder };\n\nconst capturedTypeError = here.TypeError as typeof globalThis.TypeError;\n\nexport { capturedTypeError as TypeError };\n\nconst capturedURL = here.URL as typeof globalThis.URL;\n\nexport { capturedURL as URL };\n\nconst capturedUint8Array = here.Uint8Array as typeof globalThis.Uint8Array;\n\nexport { capturedUint8Array as Uint8Array };\n\nconst capturedWeakMap = here.WeakMap as typeof globalThis.WeakMap;\n\nexport { capturedWeakMap as WeakMap };\n\nconst capturedWeakSet = here.WeakSet as typeof globalThis.WeakSet;\n\nexport { capturedWeakSet as WeakSet };\n\nconst capturedWebAssembly = here.WebAssembly as typeof globalThis.WebAssembly;\n\nexport { capturedWebAssembly as WebAssembly };\n\nconst capturedWritableStream = here.WritableStream as typeof globalThis.WritableStream;\n\nexport { capturedWritableStream as WritableStream };\n\nconst capturedatob = bound<typeof globalThis.atob>('atob');\n\nexport { capturedatob as atob };\n\nconst capturedbtoa = bound<typeof globalThis.btoa>('btoa');\n\nexport { capturedbtoa as btoa };\n\nconst capturedclearTimeout = bound<typeof globalThis.clearTimeout>('clearTimeout');\n\nexport { capturedclearTimeout as clearTimeout };\n\nconst capturedcrypto = here.crypto as typeof globalThis.crypto;\n\nexport { capturedcrypto as crypto };\n\nconst capturedencodeURIComponent = here.encodeURIComponent as typeof globalThis.encodeURIComponent;\n\nexport { capturedencodeURIComponent as encodeURIComponent };\n\nconst capturedGlobalThis = globalThis;\n\nexport { capturedGlobalThis as globalThis };\n\nconst capturedperformance = here.performance as typeof globalThis.performance;\n\nexport { capturedperformance as performance };\n\nconst capturedprocess = here.process;\n\nexport { capturedprocess as process };\n\nconst capturedsetTimeout = bound<typeof globalThis.setTimeout>('setTimeout');\n\nexport { capturedsetTimeout as setTimeout };\n", "let reader: (error: Error) => unknown = (error) => error.stack;\n\nexport function setRawStack(read: (error: Error) => unknown): void {\n reader = read;\n}\n\nexport function rawStack(error: Error): string | undefined {\n const stack = reader(error);\n return typeof stack === 'string' ? stack : undefined;\n}\n", "export const BLOCKED_GLOBALS: readonly string[] = [\n 'XMLHttpRequest',\n 'WebSocketStream',\n 'WebTransport',\n 'EventSource',\n 'indexedDB',\n 'caches',\n 'cookieStore',\n 'SharedWorker',\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[] = [\n 'fetch',\n 'WebSocket',\n 'BroadcastChannel',\n 'importScripts',\n 'Worker',\n 'postMessage',\n];\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) Reflect.deleteProperty(holder, name);\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 const holders = chain(target);\n for (const holder of holders) Reflect.deleteProperty(holder, name);\n const kept = holders.slice(1).some((holder) => Object.hasOwn(holder, name));\n const opened = Reflect.defineProperty(target, name, {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n if (kept || !opened || 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 if ('self' in scope) {\n Reflect.defineProperty(scope, 'self', {\n value: scope,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n }\n const navigator = (scope as { navigator?: unknown }).navigator;\n if (navigator && typeof navigator === 'object') hide(navigator, BLOCKED_NAVIGATOR);\n}\n", "import type { ForeignResults, ImportedMemory } from '../process/wasi/wasi-module.ts';\nimport type { WasiForkState } from '../process/wasi/wasix-fork.ts';\nimport type { LinkRecord } from '../process/wasi/wasix-linker.ts';\nimport type { BlockedMask } from '../realm/sync-sab-wire.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_PROCESS_READY = 'wasm-process-ready';\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;\nexport const JS_THREAD_SPAWN = 'js-thread-spawn';\nexport const JS_THREAD_INIT = 'js-thread-init';\nexport const JS_THREAD_EXIT = 'js-thread-exit';\nexport const JS_MAX_THREADS = 256;\nexport const JS_DEFAULT_THREADS = 16;\nexport const JS_THREAD_NO_MEMORY = 256;\nexport const JS_THREAD_CRASHED = 257;\nexport const JS_THREAD_OWNED_FDS = 1024;\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 url?: string;\n source?: 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 dl?: DlState;\n}\n\nexport interface DlState {\n log: LinkRecord[];\n next: number;\n handle: number;\n free: number[];\n live: number[];\n}\n\nexport interface KernelStreamEntry {\n fd: number;\n kernel: number;\n kind: KernelFdKind;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n fifo?: string;\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 fifo?: string;\n}\n\nexport interface HeldCwdInit {\n sab: SharedArrayBuffer;\n slot: number;\n seen: number;\n dead: boolean;\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 changes?: SharedArrayBuffer;\n held?: HeldCwdInit;\n hostname?: string | undefined;\n ppid?: number;\n umask?: number;\n cred?: Cred;\n owners?: boolean;\n links?: 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 JsThreadSpawnMsg {\n type: typeof JS_THREAD_SPAWN;\n data: unknown;\n port: MessagePort;\n control: MessagePort;\n transfer: Transferable[];\n}\n\nexport interface JsThreadStart {\n tid: number;\n port: MessagePort;\n data: unknown;\n owned?: SharedArrayBuffer;\n}\n\nexport type JsThreadInitMsg = Omit<JsProcessInitMsg, 'type'> & {\n type: typeof JS_THREAD_INIT;\n thread: JsThreadStart;\n};\n\nexport interface JsThreadExitMsg {\n type: typeof JS_THREAD_EXIT;\n code: number;\n}\n\nexport type JsThreadControl =\n | { tid: number }\n | { errno: 'EAGAIN' | 'ESRCH'; message: string }\n | { exited: number };\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 blocked?: BlockedMask;\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 signals?: SharedArrayBuffer;\n}\n\nexport interface WasmThreadExitMsg {\n type: typeof WASM_THREAD_EXIT;\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", "const GEN = 0;\nconst RING = 1;\nconst RING_SIZE = 4096;\nconst SLOT = 2;\nexport const SHARED_TTL_MS = 100;\nexport const RENAME_WAIT_MS = 100;\nexport const RENAME_WAIT_SHARED_MS = 1000;\n\nexport function renameWait(view: ChangeView): number {\n return view.foreign() ? RENAME_WAIT_SHARED_MS : RENAME_WAIT_MS;\n}\n\nconst DIRTY = RING + RING_SIZE * SLOT;\nconst FOREIGN = DIRTY + 1;\nconst RENAMES = FOREIGN + 1;\nconst HELD = RENAMES + 1;\nconst HELD_SLOTS = 1024;\n\nexport const CHANGES_BYTES = (HELD + HELD_SLOTS) * 4;\n\nfunction heldSlot(path: string): number {\n return HELD + (changeHash(normal(path)) & (HELD_SLOTS - 1));\n}\n\nexport function changeHash(path: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < path.length; i++) {\n h ^= path.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h === 0 ? 1 : h;\n}\n\nfunction normal(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 class FileChanges {\n readonly sab: SharedArrayBuffer;\n private readonly view: Int32Array;\n\n constructor(sab: SharedArrayBuffer = new SharedArrayBuffer(CHANGES_BYTES)) {\n this.sab = sab;\n this.view = new Int32Array(sab);\n }\n\n dirtied(delta: number): void {\n Atomics.add(this.view, DIRTY, delta);\n }\n\n foreign(on: boolean): void {\n Atomics.store(this.view, FOREIGN, on ? 1 : 0);\n }\n\n flush(): void {\n Atomics.add(this.view, GEN, RING_SIZE + 1);\n }\n\n peerHeld(paths: readonly string[]): void {\n const on = new Set(paths.map(heldSlot));\n for (const slot of on) Atomics.store(this.view, slot, 1);\n for (let slot = HELD; slot < HELD + HELD_SLOTS; slot++) {\n if (!on.has(slot)) Atomics.store(this.view, slot, 0);\n }\n }\n\n renamed(): number {\n const seq = (Atomics.add(this.view, RENAMES, 1) + 1) | 0;\n Atomics.notify(this.view, RENAMES);\n return seq;\n }\n\n publish(...paths: string[]): void {\n for (const path of paths) {\n const g = (Atomics.add(this.view, GEN, 1) + 1) | 0;\n const at = RING + (g & (RING_SIZE - 1)) * SLOT;\n Atomics.store(this.view, at, 0);\n Atomics.store(this.view, at + 1, changeHash(normal(path)));\n Atomics.store(this.view, at, g);\n }\n }\n}\n\nexport class ChangeView {\n private readonly view: Int32Array;\n\n constructor(sab: SharedArrayBuffer) {\n this.view = new Int32Array(sab);\n }\n\n now(): number {\n return Atomics.load(this.view, GEN);\n }\n\n clean(): boolean {\n return this.view.length > DIRTY && Atomics.load(this.view, DIRTY) === 0;\n }\n\n foreign(): boolean {\n return this.view.length > FOREIGN && Atomics.load(this.view, FOREIGN) === 1;\n }\n\n peerHeld(path: string): boolean {\n return this.view.length > HELD && Atomics.load(this.view, heldSlot(path)) === 1;\n }\n\n renames(): number {\n return this.view.length > RENAMES ? Atomics.load(this.view, RENAMES) : 0;\n }\n\n awaitRename(seen: number, ms: number): number {\n if (this.view.length > RENAMES) Atomics.wait(this.view, RENAMES, seen, ms);\n return this.renames();\n }\n\n changedSince(seen: number, path: string): { now: number; changed: boolean } {\n const now = Atomics.load(this.view, GEN);\n const distance = (now - seen) >>> 0;\n if (distance === 0) return { now, changed: false };\n if (distance > RING_SIZE) return { now, changed: true };\n const hash = changeHash(normal(path));\n for (let i = 1; i <= distance; i++) {\n const g = (seen + i) | 0;\n const at = RING + (g & (RING_SIZE - 1)) * SLOT;\n if (Atomics.load(this.view, at) !== g) return { now, changed: true };\n const hit = Atomics.load(this.view, at + 1) === hash;\n if (Atomics.load(this.view, at) !== g) return { now, changed: true };\n if (hit) return { now, changed: true };\n }\n return { now, changed: false };\n }\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 landed(at: number, length: number): void {\n const end = at + length;\n for (let page = Math.floor(at / PAGE); page * PAGE < end; page++) {\n if (this.pages.has(page) && !this.dirty.has(page)) this.drop(page);\n }\n this.length = Math.max(this.length, end);\n this.stored = Math.max(this.stored, end);\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 refresh(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 const resized = this.length !== this.stored || this.shrink !== undefined;\n if (this.shrink === undefined) this.stored = size;\n this.length = resized ? Math.max(this.length, 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 type { ChangeView } from './changes.ts';\nimport { Pages, WRITEBACK } from './pages.ts';\n\ntype WatchStat = {\n size: number;\n version?: string | undefined;\n ino?: number | undefined;\n mtimeMs?: number | undefined;\n nlink?: number | undefined;\n};\n\nexport interface RangedWatch {\n view: ChangeView;\n ino?: number | undefined;\n seen?: number | undefined;\n stat(path: string): WatchStat;\n real?: () => string | undefined;\n linked?: boolean;\n resolved?: string | null;\n sig?: string;\n}\n\nexport const signatureOf = (st: WatchStat): string =>\n `${st.version ?? ''}:${st.size}:${st.mtimeMs ?? ''}`;\n\nexport function linkedWatch<T extends RangedWatch>(watch: T, st: WatchStat): T {\n if ((st.nlink ?? 1) < 2) return watch;\n watch.linked = true;\n watch.sig = signatureOf(st);\n return watch;\n}\n\nfunction viaAlias(watch: RangedWatch, seen: number, path: string): boolean {\n if (watch.resolved === undefined) {\n let real: string | undefined;\n try {\n real = watch.real?.();\n } catch {}\n watch.resolved = real && real !== path ? real : null;\n }\n return watch.resolved !== null && watch.view.changedSince(seen, watch.resolved).changed;\n}\n\nfunction viaLink(watch: RangedWatch, path: string): boolean {\n if (!watch.linked) return false;\n let sig: string;\n try {\n sig = signatureOf(watch.stat(path));\n } catch {\n return false;\n }\n if (sig === watch.sig) return false;\n watch.sig = sig;\n return true;\n}\n\nexport function watchedChange(\n watch: RangedWatch,\n seen: number,\n path: string\n): { now: number; changed: boolean } {\n const said = watch.view.changedSince(seen, path);\n if (said.changed || said.now === seen) return said;\n return { now: said.now, changed: viaAlias(watch, seen, path) || viaLink(watch, path) };\n}\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 private readonly watch: RangedWatch | undefined;\n private seen = 0;\n path: string;\n\n constructor(io: RangedIo, path: string, size: number, version?: string, watch?: RangedWatch) {\n this.io = io;\n this.path = path;\n this.version = version;\n this.pages = new Pages(size);\n this.watch = watch;\n if (watch) this.seen = watch.seen ?? watch.view.now();\n }\n\n private fresh(): void {\n const watch = this.watch;\n if (!watch || this.pinned) return;\n const { now, changed } = watchedChange(watch, this.seen, this.path);\n this.seen = now;\n if (changed) this.reread();\n }\n\n reread(): void {\n const watch = this.watch;\n if (!watch || this.pinned || this.pages.changed) return;\n let st: ReturnType<RangedWatch['stat']>;\n try {\n st = watch.stat(this.path);\n } catch {\n return;\n }\n if (watch.ino !== undefined && st.ino !== watch.ino) return;\n this.version = st.version;\n this.pages.refresh(st.size);\n }\n\n get changed(): boolean {\n return this.pages.changed;\n }\n\n wrote(at: number, length: number): void {\n this.pages.landed(at, length);\n this.version = undefined;\n this.fresh();\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 this.fresh();\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.fresh();\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.fresh();\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.fresh();\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.prefetch();\n }\n\n prefetch(): void {\n this.fresh();\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 type { ChangeView } from '../fs/changes.ts';\nexport 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 'copy',\n 'unlink',\n 'rmdir',\n 'symlink',\n 'readlink',\n 'chmod',\n 'utimes',\n 'lutimes',\n 'statfs',\n 'hold',\n 'create',\n 'mkfifo',\n 'kept',\n 'pread',\n 'pwrite',\n 'append',\n 'truncate',\n 'chown',\n 'lchown',\n 'access',\n 'renames',\n] as const;\n\nexport type AccessKind = 'open' | 'access' | 'eaccess' | 'follow';\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 gen?: number;\n ino?: number;\n uid?: number;\n gid?: number;\n exclusive?: boolean;\n identity?: boolean;\n now?: boolean;\n nofollow?: boolean;\n direct?: boolean;\n opening?: boolean;\n devs?: true;\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; direct?: true; dev?: string };\n\nexport const SYNC_FS_REQUEST_TIMEOUT_MS = 25_000;\n\nexport const SYNC_FS_READ_ONLY: ReadonlySet<string> = new Set([\n 'read',\n 'pread',\n 'exists',\n 'stat',\n 'lstat',\n 'readdir',\n 'readdir-stat',\n 'readlink',\n 'statfs',\n 'kept',\n 'access',\n 'renames',\n]);\n\nexport interface SyncFsBridgeStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink?: boolean;\n isSocket?: boolean;\n isFifo?: boolean;\n size: number;\n mode?: number;\n mtimeMs?: number;\n atimeMs?: number;\n ctimeMs?: number;\n ino?: number;\n fid?: string;\n escape?: string;\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 gen?: number;\n}\n\nexport type SyncFsCreated = SyncFsBridgeStat & { seen?: number };\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' | 'append'\n>;\n\nexport type ChownArgs = [\n uid: number | undefined,\n gid: number | undefined,\n follow?: boolean,\n handle?: number,\n];\n\nexport interface SyncFsPosixBridge {\n changes?: ChangeView;\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): number | undefined | 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 escape?(path: string): string | undefined;\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 seen?: { gen?: number; nofollow?: boolean; ino?: number }\n ): number | undefined;\n access?(path: string, mode: number, kind?: AccessKind, nofollow?: boolean): void;\n create?(path: string, mode?: number, opening?: boolean): SyncFsCreated | undefined | void;\n mkfifo?(path: string, mode: number): void;\n copy?(from: string, to: string, mode: number, exclusive: boolean): void;\n chown?(path: string, ...rest: ChownArgs): void;\n owners?: boolean;\n links?: 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 append?(path: string, bytes: Uint8Array): number;\n identify?(): void;\n identifyNext?(): void;\n identified?(): SyncFsBridgeStat | null;\n renames?(since: number, held: readonly string[]): SyncFsRenames;\n}\n\nexport interface SyncFsRenames {\n now: number;\n renames: Array<[string, string]>;\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 ...(s.isSocket === true ? { isSocket: true } : {}),\n ...(s.isFifo === true ? { isFifo: true } : {}),\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.fid === 'string' ? { fid: s.fid } : {}),\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.gen === 'number' ? { gen: s.gen } : {}),\n ...(typeof s.uid === 'number' ? { uid: s.uid } : {}),\n ...(typeof s.gid === 'number' ? { gid: s.gid } : {}),\n };\n}\n", "import { type ChangeView, SHARED_TTL_MS } from '../../fs/changes.ts';\n\nexport { SHARED_TTL_MS };\n\nimport { RangedFile, type RangedWatch, watchedChange } from '../../fs/ranged.ts';\nimport type { DeviceAccess, KernelFdKind } from '../../kernel/fd-table.ts';\nimport {\n type ChownArgs,\n type SyncFsBridgeStat,\n type SyncFsCreated,\n type SyncFsFileIo,\n type SyncFsPosixBridge,\n syncError,\n} from '../../realm/sync-fs-wire.ts';\n\nconst FOLLOW_MS = 2000;\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 private readonly watch: RangedWatch | undefined;\n private seen = 0;\n\n maxFile: number | undefined;\n handle: number | undefined;\n moved: ((missing: boolean) => boolean) | undefined;\n bound: SyncFsBridgeStat | undefined;\n\n constructor(\n fs: SyncFsFileIo,\n path: string,\n\n empty: boolean,\n maxFile?: number,\n size?: number,\n version?: string,\n watch?: RangedWatch\n ) {\n this.fs = fs;\n this.where = path;\n this.maxFile = maxFile;\n const { pread, pwrite, truncate } = fs;\n this.watch = watch;\n this.seen = watch?.seen ?? watch?.view.now() ?? 0;\n if (size !== undefined && pread && pwrite && truncate) {\n const io = {\n pread: (_: string, ...rest: [number, number, string?]) =>\n this.retried(() => pread.call(fs, this.where, ...rest)),\n pwrite: (_: string, ...rest: [number, Uint8Array, boolean?]) =>\n this.retried(() => pwrite.call(fs, this.where, ...rest)),\n truncate: (_: string, size: number) =>\n this.retried(() => truncate.call(fs, this.where, size)),\n };\n this.ranged = new RangedFile(io, path, size, version, watch);\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 private retried<T>(op: () => T): T {\n const end = performance.now() + FOLLOW_MS;\n for (;;) {\n try {\n return op();\n } catch (err) {\n const gone = (err as { code?: unknown }).code === 'ENOENT';\n if (!gone || performance.now() > end || !this.moved?.(true)) throw err;\n }\n }\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 prefetch(): void {\n if (this.ranged) this.ranged.prefetch();\n else this.load();\n }\n\n load(): Uint8Array {\n const view = this.watch?.view;\n if (this.data && view && this.watch && !this.dirty) {\n const { now, changed } = watchedChange(this.watch, this.seen, this.path);\n this.seen = now;\n if (changed) this.data = undefined;\n }\n if (!this.data) {\n this.seen = view?.now() ?? 0;\n this.data = this.retried(() => this.fs.readFile(this.path));\n this.length = this.data.length;\n }\n return this.data;\n }\n\n private spoiled = false;\n\n spoil(): void {\n this.spoiled = true;\n this.dirty = false;\n }\n\n private live(): void {\n if (this.spoiled) throw new WasiError('ESTALE');\n }\n\n private crowded(): boolean {\n return this.watch?.view.peerHeld(this.where) === true;\n }\n\n private exact(): number | undefined {\n this.flush();\n const watch = this.watch as RangedWatch;\n const size = this.retried(() => watch.stat(this.where)).size;\n if (this.ranged) {\n if (size !== this.ranged.size()) this.ranged.reread();\n return undefined;\n }\n if (this.data && size !== this.length) this.data = undefined;\n return this.data ? undefined : size;\n }\n\n private wrote(at: number, bytes: Uint8Array): void {\n if (this.ranged) {\n this.ranged.wrote(at, bytes.length);\n return;\n }\n const view = (this.watch as RangedWatch).view;\n const { now, changed } = view.changedSince(this.seen, this.where);\n this.seen = now;\n if (changed) this.data = undefined;\n if (!this.data) return;\n const end = at + bytes.length;\n this.ensure(end);\n const buf = this.data as Uint8Array;\n if (at > this.length) buf.fill(0, this.length, at);\n buf.set(bytes, at);\n this.length = Math.max(this.length, end);\n }\n\n size(): number {\n this.live();\n if (this.crowded()) {\n const known = this.exact();\n if (known !== undefined) return known;\n }\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 this.live();\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 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 this.live();\n if (bytes.length === 0) return 0;\n const end = at + bytes.length;\n this.fits(end);\n const { pwrite } = this.fs;\n if (pwrite && this.crowded() && end > this.size()) {\n const copy = bytes.slice();\n this.retried(() => pwrite.call(this.fs, this.where, at, copy, true));\n this.wrote(at, bytes);\n return bytes.length;\n }\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 append(bytes: Uint8Array): number | undefined {\n this.live();\n const { append } = this.fs;\n if (!append || this.orphaned) return undefined;\n this.moved?.(false);\n this.flush();\n const end = this.retried(() => append.call(this.fs, this.path, bytes));\n if (!this.ranged) {\n this.data = undefined;\n this.length = 0;\n }\n return end;\n }\n\n truncate(size: number): void {\n this.live();\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 reread(): void {\n if (this.dirty || this.orphaned) return;\n if (this.ranged) this.ranged.reread();\n else this.data = undefined;\n }\n\n isOrphan(): boolean {\n return this.orphaned;\n }\n\n isDirty(): boolean {\n return this.dirty;\n }\n\n contents(): Uint8Array {\n this.live();\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 this.moved?.(false);\n if (this.ranged) this.ranged.flush();\n else if (!this.data) return;\n else if (this.whole || !this.fs.pwrite) {\n const whole = this.data.slice(0, this.length);\n this.retried(() => this.fs.writeFile(this.path, whole, true));\n } else {\n const { pwrite } = this.fs;\n const run = this.data.slice(this.from, this.to);\n this.retried(() => pwrite.call(this.fs, this.path, this.from, run, true));\n }\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 ino: number | undefined;\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 && bytes.length > 0) {\n this.buffer.fits(this.buffer.size() + bytes.length);\n const end = this.buffer.append(bytes);\n if (end !== undefined) {\n this.offset = end;\n return bytes.length;\n }\n }\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 dgram?: boolean;\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(\n fs: Pick<SyncFsPosixBridge, 'lstat' | 'readlink' | 'access' | 'links'>,\n path: string\n): 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 if (fs.links) fs.access?.(at, 0, 'follow', true);\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 realOf(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 const at = `/${[...done, part].join('/')}`;\n if (!fs.lstat(at).isSymbolicLink) {\n done.push(part);\n continue;\n }\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 }\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;\nconst CACHE_CAP = 8192;\n\ninterface Miss {\n error: Error;\n until: number;\n gen?: number;\n}\n\nexport const FS_GEN = 4;\nexport const CRED_GEN = 5;\nexport const UMASK = 6;\nconst RING = 8;\nconst RING_SIZE = 64;\nconst SLOT = 3;\nexport const FD_RING = RING + RING_SIZE * SLOT;\nexport const FD_RING_SIZE = 64;\nexport const SHARED_IDS_BYTES = (FD_RING + FD_RING_SIZE * 2) * 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 missed = new Map<Map<string, Cached>, 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 if (this.stats.size + this.lstats.size + this.byHash.size + this.byIno.size >= CACHE_CAP)\n this.clear();\n map.set(path, entry);\n if ('until' in entry) {\n const paths = this.missed.get(map) ?? new Set<string>();\n paths.add(path);\n this.missed.set(map, paths);\n }\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 const key = (ino % 4294967296) | 0;\n if (paths.length === 0 || !this.shared) this.clear();\n if (!this.shared) return;\n for (const [i, hash] of (paths.length > 0 ? paths.map(pathHash) : [0]).entries()) {\n const g = this.publish(this.shared, hash, i === 0 ? key : 0);\n if (paths.length > 0) this.replay(g - 1);\n this.seen = g;\n }\n if (paths.length === 0) return;\n for (const [i, path] of paths.entries()) {\n this.stats.delete(path);\n this.lstats.delete(path);\n this.drop(pathHash(path), i === 0 ? key : 0);\n }\n this.forgetMisses();\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 forgetMisses(): void {\n for (const [map, paths] of this.missed) {\n for (const path of paths) if ('until' in (map.get(path) ?? {})) map.delete(path);\n }\n this.missed.clear();\n }\n\n private clear(): void {\n this.missed.clear();\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\nconst SEEN_CAP = 4096;\n\nclass SeenAt {\n private readonly view: ChangeView | undefined;\n private readonly lstats: Map<string, Cached>;\n private readonly links = new Map<string, number>();\n private readonly stats = new Map<string, number>();\n constructor(view: ChangeView | undefined, lstats: Map<string, Cached>) {\n this.view = view;\n this.lstats = lstats;\n }\n\n private of(map: Map<string, Cached>): Map<string, number> {\n return map === this.lstats ? this.links : this.stats;\n }\n\n lstat(path: string): number | undefined {\n return this.links.get(path);\n }\n\n saw(map: Map<string, Cached>, path: string, gen: number): void {\n const seen = this.of(map);\n if (seen.size >= SEEN_CAP) seen.clear();\n seen.set(path, gen);\n }\n\n changed(map: Map<string, Cached>, path: string): boolean {\n if (this.view === undefined) return false;\n const seen = this.of(map);\n const gen = seen.get(path);\n if (gen === undefined) return true;\n const since = this.view.changedSince(gen, path);\n if (!since.changed) seen.set(path, since.now);\n return since.changed;\n }\n}\n\nfunction goneAbove(\n maps: Array<Map<string, Cached>>,\n live: (miss: Miss, path: string) => boolean,\n path: string\n): Miss | undefined {\n for (let at = path.lastIndexOf('/'); at > 0; at = path.lastIndexOf('/', at - 1)) {\n const up = path.slice(0, at);\n for (const map of maps) {\n const hit = map.get(up);\n const code = hit && 'until' in hit ? (hit.error as { code?: string }).code : undefined;\n if (hit && 'until' in hit && code === 'ENOENT' && live(hit, up)) return hit;\n }\n }\n return undefined;\n}\n\nconst remember =\n (cache: StatCache, seen: SeenAt, blind: boolean, fill: (entry: object) => void) =>\n (path: string, made: SyncFsCreated | undefined | void): SyncFsCreated | undefined | void => {\n if (!made || blind) return made;\n const { seen: at, ...st } = made;\n fill(st);\n cache.put(cache.stats, path, st);\n if (at !== undefined) seen.saw(cache.stats, path, at);\n return made;\n };\n\nfunction copying(\n bridge: SyncFsPosixBridge,\n mutating: <T>(op: () => T, ...paths: string[]) => T,\n entry: (p: string) => string[]\n): Pick<SyncFsPosixBridge, 'copy'> {\n const { copy } = bridge;\n if (!copy) return {};\n return {\n copy: (from, to, mode, exclusive) =>\n mutating(() => copy.call(bridge, from, to, mode, exclusive), ...entry(to)),\n };\n}\n\nclass Fills {\n private readonly at = new WeakMap<object, number>();\n private readonly view: ChangeView | undefined;\n private readonly now: () => number;\n constructor(view: ChangeView | undefined, now: () => number) {\n this.view = view;\n this.now = now;\n }\n\n set(entry: object, at = this.now()): void {\n this.at.set(entry, at);\n }\n\n young(entry: object): boolean {\n if (!this.view?.foreign()) return true;\n return this.now() - (this.at.get(entry) ?? Number.NEGATIVE_INFINITY) < SHARED_TTL_MS;\n }\n}\n\nfunction listed(\n { cache, seen, filled }: { cache: StatCache; seen: SeenAt; filled: Fills },\n p: string,\n list: ReturnType<SyncFsPosixBridge['readdirStat']>,\n gen: number | undefined,\n asked: number\n): void {\n const base = p === '/' ? '' : p;\n for (const [name, st] of list) {\n if (!st) continue;\n filled.set(st, asked);\n const at = `${base}/${name}`;\n cache.put(cache.lstats, at, st);\n if (gen !== undefined) seen.saw(cache.lstats, at, gen);\n if (st.isSymbolicLink) continue;\n cache.put(cache.stats, at, st);\n if (gen !== undefined) seen.saw(cache.stats, at, gen);\n }\n}\n\nfunction fetched(\n {\n view,\n now,\n seen,\n filled,\n cache,\n }: {\n view: ChangeView | undefined;\n now: () => number;\n seen: SeenAt;\n filled: Fills;\n cache: StatCache;\n },\n map: Map<string, Cached>,\n path: string,\n get: () => SyncFsBridgeStat\n): Cached {\n const gen = view?.now();\n const asked = now();\n let hit: Cached;\n try {\n hit = get();\n if (gen !== undefined) seen.saw(map, path, gen);\n } catch (e) {\n hit = { error: e as Error, until: asked + MISS_TTL_MS, ...(gen !== undefined ? { gen } : {}) };\n }\n filled.set(hit, asked);\n cache.put(map, path, hit);\n return hit;\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 view = bridge.changes;\n const filled = new Fills(view, now);\n const young = (entry: object) => filled.young(entry);\n const live = (miss: Miss, path: string) =>\n miss.until > now() &&\n young(miss) &&\n (view === undefined || miss.gen === undefined || !view.changedSince(miss.gen, path).changed);\n const seen = new SeenAt(view, lstats);\n const kept = remember(cache, seen, blind, (entry) => filled.set(entry));\n const gone = (path: string) => goneAbove([lstats, stats], live, path);\n const usable = (map: typeof stats, path: string): Cached | undefined => {\n const hit = map.get(path);\n if (hit === undefined) return undefined;\n if ('until' in hit) return live(hit, path) ? hit : undefined;\n return young(hit) && !seen.changed(map, path) ? hit : undefined;\n };\n const cached = (map: typeof stats, path: string, get: () => SyncFsBridgeStat) => {\n if (blind) return get();\n cache.fresh();\n let hit = usable(map, path);\n if (hit === undefined) {\n const missing = gone(path);\n if (missing) throw missing.error;\n hit = fetched({ view, now, seen, filled, cache }, map, path, get);\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 relabeling = <T>(p: string, op: () => T): T => {\n if (exact || !bridge.identifyNext) return rewriting(p, op);\n bridge.identifyNext();\n try {\n return op();\n } finally {\n const st = bridge.identified?.() ?? null;\n if (st) cache.mutated([p], 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 ...(bridge.changes ? { changes: bridge.changes } : {}),\n ...(bridge.renames ? { renames: bridge.renames.bind(bridge) } : {}),\n readFile: (p) => bridge.readFile(p),\n readdir: (p) => bridge.readdir(p),\n\n readdirStat: (p: string) => {\n const gen = view?.now();\n const asked = now();\n const list = bridge.readdirStat(p);\n if (!blind) listed({ cache, seen, filled }, p, list, gen, asked);\n return list;\n },\n readlink: (p) => {\n const known = blind ? undefined : (cache.fresh(), lstats.get(p));\n const gen = seen.lstat(p);\n const current = view !== undefined && gen !== undefined && !view.changedSince(gen, p).changed;\n if (known && current && !('until' in known) && young(known) && !known.isSymbolicLink) {\n throw syncError('EINVAL', `'${p}' is not a symbolic link`);\n }\n return bridge.readlink(p);\n },\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) => relabeling(p, () => bridge.chmod(p, mode)),\n utimes: (p, a, m, now) => relabeling(p, () => bridge.utimes(p, a, m, now)),\n lutimes: (p, a, m, now) => mutating(() => bridge.lutimes(p, a, m, now)),\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 ? {\n create: (p: string, mode?: number, opening?: boolean) =>\n kept(\n p,\n mutating(() => bridge.create?.(p, mode, opening), ...entry(p))\n ),\n }\n : {}),\n ...(bridge.mkfifo\n ? {\n mkfifo: (p: string, mode: number) =>\n mutating(() => bridge.mkfifo?.(p, mode), ...entry(p)),\n }\n : {}),\n ...copying(bridge, mutating, entry),\n ...(chown\n ? {\n chown: (p: string, ...rest: ChownArgs) =>\n relabeling(p, () => chown.call(bridge, p, ...rest)),\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.append\n ? {\n append: (p: string, bytes: Uint8Array) =>\n rewriting(p, () => (bridge.append as NonNullable<typeof bridge.append>)(p, bytes)),\n }\n : {}),\n ...(bridge.owners ? { owners: true } : {}),\n ...(bridge.links ? { links: 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 ...(io.append\n ? {\n append: (p: string, bytes: Uint8Array) =>\n rewriting(p, () => (io.append as NonNullable<typeof io.append>)(p, bytes)),\n }\n : {}),\n };\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport type { SyncFsRequest, SyncFsResult } from './sync-fs-wire.ts';\n\nexport const SAB_HEADER_I32 = 18;\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\nexport const SAB_I_BLOCKED = 16;\n\nexport const SAB_I_BLOCKED_HI = 17;\n\nexport type BlockedMask = readonly [number, number];\n\nexport function loadBlocked(header: Int32Array): BlockedMask {\n return [Atomics.load(header, SAB_I_BLOCKED), Atomics.load(header, SAB_I_BLOCKED_HI)];\n}\n\nexport function storeBlocked(header: Int32Array, [low, high]: BlockedMask): void {\n Atomics.store(header, SAB_I_BLOCKED_HI, high);\n Atomics.store(header, SAB_I_BLOCKED, low);\n}\n\nexport const anyBlocked = (mask: BlockedMask | undefined): boolean =>\n mask !== undefined && (mask[0] !== 0 || mask[1] !== 0);\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(\n JSON.stringify({\n errno: result.errno,\n message: result.message,\n ...(result.direct ? { direct: true } : {}),\n ...(result.dev !== undefined ? { dev: result.dev } : {}),\n })\n ),\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 direct?: unknown;\n dev?: 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 const message = String(parsed.message ?? errno);\n return {\n ok: false,\n errno,\n message,\n ...(parsed.direct === true ? { direct: true as const } : {}),\n ...(typeof parsed.dev === 'string' ? { dev: parsed.dev } : {}),\n };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed errno payload' };\n }\n }\n default:\n return { ok: false, errno: 'EIO', message: `sync-sab: unknown status ${status}` };\n }\n}\n\nexport interface SabViews {\n header: Int32Array;\n window: Uint8Array;\n}\n\nexport function sabViews(sab: SharedArrayBuffer): SabViews {\n if (sab.byteLength < SAB_MIN_BYTES) {\n throw new Error(`sync-sab: buffer too small (${sab.byteLength} < ${SAB_MIN_BYTES})`);\n }\n return {\n header: new Int32Array(sab, 0, SAB_HEADER_I32),\n window: new Uint8Array(sab, SAB_HEADER_BYTES),\n };\n}\n", "import {\n 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 { anyBlocked, type BlockedMask } from '../../realm/sync-sab-wire.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 blocked: (() => BlockedMask) | 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 const blocked = this.blocked?.();\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 ...(anyBlocked(blocked) ? { blocked } : {}),\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 function physicalLeaf(fs: LinkReader, path: string): string | undefined {\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 const tail = walk.todo;\n return tail.some((p) => p === '.' || p === '..') ? undefined : [at, ...tail].join('/');\n }\n if (target === undefined) walk.done.push(part);\n else if (!follow(walk, target)) return undefined;\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", "export const SHM = '/dev/shm';\n\nexport function inShm(path: string): boolean {\n return path === SHM || path.startsWith(`${SHM}/`);\n}\n\nexport function inDevTree(path: string): boolean {\n if (path.startsWith(`${SHM}/`)) return false;\n return path === '/dev' || path.startsWith('/dev/');\n}\n\nexport function devRemoval(\n path: string,\n cred: Readonly<{ euid: number }> | undefined\n): 'EACCES' | 'EPERM' | 'EBUSY' | undefined {\n if (!inDevTree(path)) return undefined;\n if (cred && cred.euid !== 0) return 'EACCES';\n return path === '/dev' ? 'EBUSY' : 'EPERM';\n}\n\nexport function devCreation(\n path: string,\n cred: Readonly<{ euid: number }> | undefined\n): 'EACCES' | 'EPERM' | 'EROFS' | undefined {\n if (path === '/proc' || path.startsWith('/proc/')) return 'EROFS';\n if (path === '/dev' || !inDevTree(path)) return undefined;\n return cred && cred.euid !== 0 ? 'EACCES' : 'EPERM';\n}\n", "import { SAB_CLOCK_I64, SAB_CLOCK_OFFSET } from '../realm/sync-sab-wire.ts';\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(\n () => rawWait(typed, index, value, timeout),\n timeout !== 0 && Atomics.load(typed, index) === value\n );\n (Atomics as unknown as { wait: typeof wait }).wait = wait;\n}\n\nexport function localWait<T>(wait: () => T, blocks = true): T {\n const clock = local;\n if (!clock || !blocks) 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(): void {\n this.since = this.now();\n this.kind = this.stopped ? 'idle' : 'sys';\n }\n\n block(): void {\n if (this.since === 0 || this.kind === 'idle' || 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 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 states(): Array<{ tid: number; state: 'R' | 'S' }> {\n const state = (c: CpuClock): 'R' | 'S' => (c.running() ? 'R' : 'S');\n return [\n { tid: 1, state: state(this.main) },\n ...[...this.threads].map(([tid, c]) => ({ tid, state: state(c) })),\n ];\n }\n\n timed<R, T>(clock: CpuClock | undefined, dispatch: (req: R, block: () => void) => Promise<T>) {\n const c = clock ?? this.main;\n const block = () => c.block();\n return (req: R): Promise<T> => {\n c.enter();\n return dispatch(req, block).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 isSocket?: boolean;\n isFifo?: boolean;\n size: number;\n mode: number;\n mtime: Date;\n atime: Date;\n ctime: Date;\n ino: number;\n fid?: string;\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 socket?: boolean;\n fifo?: boolean;\n existing?: true;\n}\n\nexport interface CopyOptions {\n exclusive: boolean;\n owner?: NewOwner;\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 Peers {\n joined(): Promise<unknown>;\n crowded(): boolean;\n watch(listener: (crowded: boolean) => void): void;\n fresh?(): void;\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(\n path: string,\n options?: { recursive?: boolean; force?: boolean; file?: boolean }\n ): 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 copyFile?(from: string, to: string, options: CopyOptions): Promise<void>;\n readonly rootName?: string;\n chown?(path: string, change: OwnerChange): Promise<void>;\n trackOwners?(): void;\n onPeer?(settle: () => Promise<void>): void;\n heldBy?(held: (dir: string) => readonly string[]): void;\n fileId?(path: string): Promise<string>;\n bindId?(path: string): Promise<string | undefined>;\n remoteChanges?(\n listener: (change: {\n paths: readonly string[];\n trees?: readonly string[];\n moved?: { from: string; to: string };\n content?: true;\n }) => void\n ): () => void;\n peers?(): Peers | undefined;\n crossings?(mounted: (path: string) => boolean): void;\n ancestry?(path: string): Promise<Array<Perm | undefined>>;\n hasOwner?(path: string): Promise<boolean>;\n chmod(path: string, mode: number): Promise<void>;\n append?(path: string, bytes: Uint8Array, options?: PwriteOptions): Promise<number>;\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?(\n path: string,\n offset: number,\n bytes: Uint8Array,\n transfer?: boolean,\n options?: PwriteOptions\n ): Promise<void>;\n truncate?(path: string, size: number): Promise<void>;\n protect?(prefixes: readonly string[], versions?: boolean): void;\n unguarded?(): KernelFs;\n noLinks?(): KernelFs;\n mayChange?(path: string, follow: boolean, whole?: boolean): Promise<void>;\n commandTarget?(path: string): Promise<string | undefined>;\n readVersioned?(path: string, cached?: boolean): Promise<{ bytes: Uint8Array; version: string }>;\n version?(path: string, cached?: boolean): Promise<string>;\n opfsCalls?(): number;\n renameWaits?(): {\n acks: number;\n busy: number;\n waits: number;\n queries: number;\n ackMs: readonly number[];\n };\n opfsOps?(): number;\n fileIdWrites?(): number;\n announceHolds?(\n add: ReadonlyArray<[string, string | undefined]>,\n drop: readonly string[],\n wait: boolean\n ): Promise<void>;\n holdCounts?(): { mine: number; peers: number; sent: number; held: string[] } | undefined;\n peerHolds?(listener: (paths: string[]) => void): void;\n rehold?(from: string, to: string): void;\n peerKeeps?(): PeerKeeps | undefined;\n servePeerKeeps?(\n instance: string,\n handlers: {\n keeping(tab: string, paths: readonly string[]): Promise<void>;\n kept(\n tab: string,\n items: ReadonlyArray<{\n path: string;\n hidden: string | undefined;\n fid: string | undefined;\n }>,\n paths: readonly string[]\n ): Promise<void>;\n left(tab: string): void;\n }\n ): void;\n}\n\nexport interface PeerKeeps {\n shared(): boolean;\n heldWithin(\n path: string\n ): Array<{ tab: string; path: string; fid: string | undefined; instance: string | undefined }>;\n ask(\n to: string,\n body: {\n keeping?: { paths: string[] };\n kept?: {\n items: Array<{\n path: string;\n hidden: string | undefined;\n fid: string | undefined;\n }>;\n paths?: string[];\n };\n },\n cap: number\n ): Promise<boolean>;\n}\n\nexport interface PwriteOptions {\n create?: false;\n alone?: true;\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 modeOption(mode: unknown): number {\n if (!Number.isInteger(mode) || (mode as number) < 0 || (mode as number) > 0o7777) {\n throw fsError('EINVAL', `not a mode: ${String(mode)}`);\n }\n return mode as number;\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\nexport interface Redirect {\n of: string;\n to: string;\n}\n\nexport function redirected(of: string, to: string): Error {\n return Object.assign(fsError('EXDEV', `${of} leads to the mount at ${to}`), {\n redirect: { of: normalizePath(of), to: normalizePath(to) },\n });\n}\n\nexport function redirectOf(err: unknown): Redirect | undefined {\n return (err as { redirect?: Redirect } | null)?.redirect;\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 if (typeof change !== 'object' || change === null || Array.isArray(change)) {\n throw fsError('EINVAL', 'not a change');\n }\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 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\nexport interface SigInfo {\n code: number;\n pid: number;\n uid: number;\n status: number;\n}\n\nexport const SI = { USER: 0, QUEUE: -1, TIMER: -2, TKILL: -6, KERNEL: 0x80 } as const;\n\nexport const CLD = { EXITED: 1, KILLED: 2, DUMPED: 3, STOPPED: 5, CONTINUED: 6 } as const;\n\nexport const KERNEL_SIGINFO: Readonly<SigInfo> = Object.freeze({\n code: SI.KERNEL,\n pid: 0,\n uid: 0,\n status: 0,\n});\n", "import { ChangeView } from '../fs/changes.ts';\nimport { rawWait } from '../kernel/cpu-clock.ts';\nimport {\n parseSyncFsStat,\n parseSyncFsUsage,\n SYNC_FS_OPS,\n SYNC_FS_READ_ONLY,\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsBridgeStat,\n type SyncFsFileIo,\n type SyncFsPosixBridge,\n type SyncFsRenames,\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 UNCOUNTED_OPS: ReadonlySet<string> = new Set([...SYNC_FS_OPS, 'cwd-check', 'cwd-chdir']);\n\nlet calls = 0;\n\nexport function exactBody<T extends object>(\n req: T,\n transfer: Transferable[] = []\n): { req: T; transfer: Transferable[] } {\n const body: unknown = (req as { body?: unknown }).body;\n if (!ArrayBuffer.isView(body)) return { req, transfer };\n if (Object.prototype.toString.call(body.buffer) === '[object SharedArrayBuffer]') {\n return { req, transfer };\n }\n const whole =\n (body as { constructor?: unknown }).constructor === Uint8Array &&\n body.byteOffset === 0 &&\n body.byteLength === body.buffer.byteLength;\n if (whole) return { req, transfer };\n const copy = new Uint8Array(body.byteLength);\n copy.set(new Uint8Array(body.buffer, body.byteOffset, body.byteLength));\n return { req: { ...req, body: copy }, transfer: [...transfer, copy.buffer] };\n}\n\nexport function syncCallCount(): number {\n return calls;\n}\n\nlet looks = 0;\n\nexport function lookedOutside(): void {\n looks++;\n}\n\nexport function syncEpoch(): number {\n return calls + looks;\n}\n\nconst SPIN_MS = 0.06;\nconst SPIN_STRIDE = 128;\nconst SPIN_STRIDES = 256;\nconst SPIN_CORES = 4;\nconst spinning = (globalThis.navigator?.hardwareConcurrency ?? 0) >= SPIN_CORES;\nconst SPIN_CAP_MS = 1;\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 let typical = 0;\n\n const ready = (id: number): boolean =>\n Atomics.load(header, SAB_I_STATE) === SAB_STATE_READY && Atomics.load(header, SAB_I_SEQ) === id;\n\n function spinUntil(id: number, until: number): boolean {\n for (let stride = 0; stride < SPIN_STRIDES; stride++) {\n for (let i = 0; i < SPIN_STRIDE; i++) if (ready(id)) return true;\n if (now() >= until) return false;\n }\n return false;\n }\n\n function settled(start: number): void {\n typical += (Math.min(now() - start, SPIN_CAP_MS) - typical) / 8;\n }\n\n function awaitReady(id: number, deadline: number, label: string): void {\n const start = now();\n if (spinning && typical < SPIN_MS && spinUntil(id, start + SPIN_MS)) {\n settled(start);\n return;\n }\n for (;;) {\n const published = Atomics.load(header, SAB_I_PUB);\n if (ready(id)) {\n settled(start);\n return;\n }\n const remaining = deadline - now();\n if (remaining <= 0) throw syncError('EIO', label);\n wait(header, SAB_I_PUB, published, remaining);\n }\n }\n\n return {\n call(asked, timeoutMs, label, given = []): SyncFsResult {\n if (deps.memory) publishMemory(sab, deps.memory());\n const { req, transfer } = exactBody(asked, given);\n const id = ++seq;\n calls += Number(!UNCOUNTED_OPS.has(req.op));\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, now() + timeoutMs, 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, direct?: true): Error & { code: string } {\n const err = syncError(code, `sync-sab bridge, '${path}'`);\n return direct ? Object.assign(err, { direct }) : err;\n}\n\nfunction holdSeen(seen: { gen?: number; nofollow?: boolean; ino?: number }) {\n return { gen: seen.gen, ino: seen.ino, ...(seen.nofollow ? { nofollow: true } : {}) };\n}\n\nexport function createSyncFsSabBridge(\n transport: SyncSabTransport,\n opts: {\n timeoutMs?: number;\n owners?: boolean;\n links?: boolean;\n changes?: SharedArrayBuffer;\n direct?: boolean;\n } = {}\n): SyncFsPosixBridge {\n const direct = opts.direct ? { direct: true } : {};\n const timeoutMs = opts.timeoutMs ?? SYNC_FS_REQUEST_TIMEOUT_MS;\n let identity: { identity: true } | Record<string, never> = {};\n let once = false;\n let last: SyncFsBridgeStat | null = null;\n\n function run(req: SyncSabRequestBody, path: string, transfer?: Transferable[]): SyncFsResult {\n last = null;\n const silence = SYNC_FS_READ_ONLY.has(req.op) ? timeoutMs : Number.POSITIVE_INFINITY;\n const result = transport.call(req, silence, `sync-sab bridge, '${path}'`, transfer);\n if (!result.ok) throw errnoError(result.errno, path, result.direct);\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 ask = once ? { identity: true as const } : identity;\n once = false;\n const r = run({ ...req, ...ask }, 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 append: (path, body) => json({ op: 'append', path, body, ...id }, path) as number,\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, ...direct }, path));\n if (!s) throw errnoError('EIO', path);\n return s;\n },\n lstat: (path) => {\n const s = parseSyncFsStat(json({ op: 'lstat', path, ...direct }, 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 const r = run({ op: 'rename', path: from, arg2: to }, from);\n const seq = r.ok && r.kind === 'json' ? (r.json as { seq?: unknown }).seq : undefined;\n return typeof seq === 'number' ? seq : undefined;\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 identifyNext: () => {\n once = true;\n last = null;\n },\n identified: () => {\n once = false;\n return last;\n },\n lutimes: (path, atimeMs, mtimeMs, now) => {\n run({ op: 'lutimes', path, atimeMs, mtimeMs, ...(now ? { now } : {}) }, path);\n },\n mkfifo: (path, mode) => {\n run({ op: 'mkfifo', path, mode }, path);\n },\n copy: (from, to, mode, exclusive) => {\n run({ op: 'copy', path: from, arg2: to, mode, ...(exclusive ? { exclusive } : {}) }, to);\n },\n create: (path, mode, opening) => {\n const flags = { ...(mode !== undefined ? { mode } : {}), ...(opening ? { opening } : {}) };\n const r = run({ op: 'create', path, ...flags, identity: true }, path);\n if (!r.ok || r.kind !== 'json') return undefined;\n const st = parseSyncFsStat(r.json);\n if (!st) return undefined;\n const { seen } = r.json as { seen?: unknown };\n return typeof seen === 'number' ? { ...st, seen } : st;\n },\n chown: (path, uid, gid, follow, handle) => {\n const ids = { ...(uid !== undefined ? { uid } : {}), ...(gid !== undefined ? { gid } : {}) };\n changing(\n {\n op: follow ? 'chown' : 'lchown',\n path,\n ...ids,\n ...(handle !== undefined ? { handle } : {}),\n },\n path\n );\n },\n ...(opts.owners ? { owners: true } : {}),\n ...(opts.links ? { links: true } : {}),\n ...(opts.changes ? { changes: new ChangeView(opts.changes) } : {}),\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, seen = {}) => {\n const mode = (held ? 1 : 0) | (open ? 2 : 0);\n if (mode === 3) {\n return json({ op: 'hold', path, mode: mode | want, ...holdSeen(seen) }, path) as number;\n }\n run({ op: 'hold', path, mode, ...(handle !== undefined ? { handle } : {}) }, path);\n return undefined;\n },\n statfs: (path = '/') => parseSyncFsUsage(json({ op: 'statfs', path }, path)),\n renames: (since, held) =>\n json(\n { op: 'renames', path: '/', offset: since, arg2: JSON.stringify(held) },\n '/'\n ) as SyncFsRenames,\n };\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport { exactBody, 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(asked: SyncSabRequestBody): Promise<SyncFsResult> {\n const { req, transfer } = exactBody(asked);\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 if (offset === 0) port.postMessage({ type: SYNC_SAB_REQ_MSG, id, req }, transfer);\n else port.postMessage({ type: SYNC_SAB_NEXT_MSG, id, offset });\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", "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 readonly detail: string | undefined;\n\n dev: string | undefined;\n\n constructor(code: string, what: string, detail?: string) {\n super(`${what}: ${code}`);\n this.name = 'JsCallError';\n this.code = code;\n this.detail = detail;\n }\n}\n\nexport function devOf(found: unknown): string | undefined {\n const dev = (found as { dev?: unknown } | null)?.dev;\n return typeof dev === 'string' ? dev : undefined;\n}\n\nconst DETAILED: ReadonlySet<string> = new Set([\n 'fd-read',\n 'fd-write',\n 'fd-close',\n 'fd-open-clipboard',\n 'fd-open-embedder',\n 'net-ws-ready',\n 'sock-tls',\n 'sock-tls-upgrade',\n 'sock-tls-serve',\n 'sock-tls-listen',\n 'sock-tls-context',\n 'sock-tls-select',\n]);\n\nexport function umaskRequest(mask: unknown): { op: 'proc-umask'; mask?: number } {\n if (mask === undefined) return { op: 'proc-umask' };\n if (!Number.isInteger(mask) || (mask as number) < 0 || (mask as number) > 0o777) {\n throw new JsCallError('EINVAL', 'umask');\n }\n return { op: 'proc-umask', mask: mask as number };\n}\n\nexport function modeOf(mode: unknown): number {\n if (!Number.isInteger(mode) || (mode as number) < 0 || (mode as number) > 0o7777) {\n throw new JsCallError('EINVAL', 'chmod');\n }\n return mode as number;\n}\n\nexport function callError(\n result: { errno: string; message: string; dev?: string },\n op: string\n): JsCallError {\n const { errno, message } = result;\n const detailed = typeof message === 'string' && message !== errno && DETAILED.has(op);\n const err = new JsCallError(\n errno,\n detailed ? `${op}: ${message}` : op,\n detailed ? message : undefined\n );\n err.dev = result.dev;\n return err;\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 type { DeviceMeta, KernelFdKind } from '../../kernel/fd-table.ts';\nimport {\n parseSyncFsUsage,\n type SyncFsBridgeStat,\n type SyncFsResult,\n} from '../../realm/sync-fs-wire.ts';\nimport { JsCallError, modeOf } 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 mode?: number;\n nonblock?: boolean;\n signal?: AbortSignal;\n}\n\nexport interface JsWriteOptions {\n nonblock?: 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 access?: 'read' | 'write';\n}\n\nexport const CHUNK = 64 * 1024;\nexport const MAX_IO = 1024 * 1024;\nexport const MAX_PREAD = 16 * 1024 * 1024;\n\nexport function readingInto(\n read: (position: number, length: number) => Uint8Array\n): (position: number, into: Uint8Array, offset?: number, length?: number) => number {\n return (position, into, offset = 0, length = into.length - offset) => {\n const target = intoTarget(into, offset, length) as { into: Uint8Array; at: number };\n const chunk = read(position, length);\n target.into.set(chunk, target.at);\n return chunk.length;\n };\n}\n\nexport function readingIntoAsync(\n read: (position: number, length: number) => Promise<Uint8Array>\n): (position: number, into: Uint8Array, offset?: number, length?: number) => Promise<number> {\n return async (position, into, offset = 0, length = into.length - offset) => {\n const target = intoTarget(into, offset, length) as { into: Uint8Array; at: number };\n const chunk = await read(position, length);\n target.into.set(chunk, target.at);\n return chunk.length;\n };\n}\n\nexport function intoTarget(\n into: Uint8Array | undefined,\n offset: number,\n length: number\n): { into: Uint8Array; at: number } | undefined {\n if (!into) return undefined;\n if (!Number.isSafeInteger(offset) || offset < 0 || offset + length > into.length)\n throw Object.assign(new RangeError('read: the buffer is too small'), { code: 'EINVAL' });\n return { into, at: offset };\n}\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 interface JsStatFs {\n type: number;\n bsize: number;\n blocks: number;\n bfree: number;\n bavail: number;\n files: number;\n ffree: number;\n quota: number;\n usage: number;\n}\n\nconst BLOCK = 4096;\n\nexport function statFsOf(json: unknown): JsStatFs {\n const usage = parseSyncFsUsage(json);\n const blocks = usage ? Math.ceil(usage.quota / BLOCK) : 0;\n const free = usage ? Math.max(0, Math.floor((usage.quota - usage.usage) / BLOCK)) : 0;\n const bytes = { quota: usage?.quota ?? 0, usage: usage?.usage ?? 0 };\n return { type: 0, bsize: BLOCK, blocks, bfree: free, bavail: free, files: 0, ffree: 0, ...bytes };\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) | (o.nonblock ? O_NONBLOCK_OPEN : 0);\n}\n\nconst O_NONBLOCK_OPEN = 0o4000;\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 ...(o.create || isExclusive(o) ? { mode: o.mode === undefined ? 0o666 : modeOf(o.mode) } : {}),\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 { inShm } from '../../fs/dev-removal.ts';\nimport 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 readingInto,\n readingIntoAsync,\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();\nconst CHAR_KINDS: ReadonlySet<string | undefined> = new Set([\n 'device',\n 'tty',\n 'clipboard',\n 'embedder',\n 'sealed',\n]);\n\ntype DevNode =\n | { kind: 'dir'; mode: number }\n | { kind: 'device' }\n | { kind: 'tty' }\n | { kind: 'clipboard' }\n | { kind: 'embedder' }\n | { kind: 'sealed' }\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] === '/') && !inShm(abs);\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 if (name === 'embedder') return { kind: 'embedder' };\n if (name === 'sealed') return { kind: 'sealed' };\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 if (name === 'pts') return { kind: 'dir', mode: DIR | 0o555 };\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 const st = yield* pathStat(file.path);\n return { ...st, size: file.size };\n }\n if (info.terminal) return yield* terminalStat(info.terminal);\n if (CHAR_KINDS.has(info.kind)) 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' || info.kind === 'sealed' || info.kind === 'embedder')\n return `/dev/${info.kind}`;\n return `${info.kind === 'socket' ? 'socket' : 'pipe'}:[${fd}]`;\n}\n\nexport function devFdStat(fd: number): DevStep<SyncFsBridgeStat> {\n return fdStat(fd, `/dev/fd/${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 case 'embedder':\n case 'sealed':\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* devResolveTarget(abs: string): DevStep<string | undefined> {\n const node = yield* lookup(abs);\n if (node.kind === 'fd') return yield* fdTarget(node.fd, abs);\n if (node.kind === 'link' && node.fd !== undefined) return yield* fdTarget(node.fd, abs);\n return undefined;\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 if (abs === '/dev/pts') {\n const open = (yield { op: 'pty-list' }) as number[];\n return open.map(String).sort();\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 [\n ...DEVICES,\n 'clipboard',\n 'embedder',\n 'sealed',\n 'tty',\n 'fd',\n 'pts',\n 'shm',\n ...STDIO,\n ...ttys,\n ].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; size: number; orphan?: true };\n if (!at.orphan)\n return { fd: (yield openRequest(at.path, { ...o, create: false })) as number, file };\n const wantWrite = o.write === true || o.append === true || o.truncate === true;\n if (wantWrite && info.access === 'read') throw new JsCallError('EBADF', abs);\n if (!wantWrite && info.access === 'write') throw new JsCallError('EBADF', abs);\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 accessFlags(o: JsOpenOptions): number {\n const write = o.write === true || o.append === true || o.truncate === true;\n return write ? (o.read === true ? 2 : 1) : 0;\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 return {\n fd: (yield { op: 'fd-open-clipboard', flags: accessFlags(o) }) as number,\n file: false,\n };\n case 'embedder':\n return {\n fd: (yield { op: 'fd-open-embedder', flags: accessFlags(o) }) as number,\n file: false,\n };\n case 'sealed':\n return { fd: (yield { op: 'fd-open-sealed', flags: accessFlags(o) }) as number, file: false };\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 readAsync = async (position: number, length: number): Promise<Uint8Array> => {\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 const file: JsFile = {\n fd,\n path,\n async size() {\n live();\n return 0;\n },\n read: (position, length) => readAsync(position, length),\n readInto: readingIntoAsync((position, length) => readAsync(position, length)),\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 readSync = (position: number, length: number): Uint8Array => {\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 const file: JsSyncFile = {\n fd,\n path,\n size() {\n live();\n return 0;\n },\n read: (position, length) => readSync(position, length),\n readInto: readingInto((position, length) => readSync(position, length)),\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 { LockHeld, LockKind, LockTarget } from '../process-locks.ts';\nimport { WasiError } from './wasi-files.ts';\nimport type { WasiFunction } from './wasi-host.ts';\nimport type { WasiMemory } from './wasi-memory.ts';\n\nexport const F_GETLK = 12;\nexport const F_SETLK = 13;\nexport const F_SETLKW = 14;\n\nconst F_RDLCK = 0;\nconst F_WRLCK = 1;\nconst F_UNLCK = 2;\nconst SEEK_SET = 0;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\n\nexport interface LockedFile {\n target: LockTarget;\n path?: string;\n readable?: boolean;\n writable?: boolean;\n offset(): number;\n size(): number;\n}\n\nconst LOCK_NB = 4;\nconst FLOCK_OPS: Readonly<Record<number, FlockKind>> = { 1: 'shared', 2: 'exclusive', 8: 'unlock' };\n\nexport type FlockKind = 'shared' | 'exclusive' | 'unlock';\n\nexport interface LockCalls {\n set(\n target: LockTarget,\n kind: LockKind | 'unlock',\n start: number,\n len: number,\n wait: boolean\n ): unknown;\n get(target: LockTarget, kind: LockKind, start: number, len: number): LockHeld | null;\n flock(fd: number, kind: FlockKind, wait: boolean): unknown;\n}\n\nexport interface LockHost {\n mem: WasiMemory;\n file(fd: number): LockedFile;\n flush(file: LockedFile): void;\n locked(): void;\n promote(fd: number, moved?: boolean): void;\n reread(fd: number): void;\n calls: LockCalls;\n}\n\nfunction kindOf(type: number): LockKind | 'unlock' {\n if (type === F_RDLCK) return 'read';\n if (type === F_WRLCK) return 'write';\n if (type === F_UNLCK) return 'unlock';\n throw new WasiError('EINVAL');\n}\n\nfunction baseOf(file: LockedFile, whence: number): number {\n if (whence === SEEK_SET) return 0;\n if (whence === SEEK_CUR) return file.offset();\n if (whence === SEEK_END) return file.size();\n throw new WasiError('EINVAL');\n}\n\nfunction writeHolder(view: DataView, at: number, found: LockHeld | null): void {\n if (!found) {\n view.setInt16(at, F_UNLCK, true);\n return;\n }\n view.setInt16(at, found.kind === 'read' ? F_RDLCK : F_WRLCK, true);\n view.setInt16(at + 2, SEEK_SET, true);\n view.setBigInt64(at + 8, BigInt(found.start), true);\n view.setBigInt64(at + 16, BigInt(found.len), true);\n view.setInt32(at + 24, found.pid, true);\n}\n\nexport function lockImports(host: LockHost): Record<string, WasiFunction> {\n return {\n flock: (fd: number, op: number) => {\n host.promote(fd);\n const kind = FLOCK_OPS[op & ~LOCK_NB];\n if (!kind) throw new WasiError('EINVAL');\n const shared = host.calls.flock(fd, kind, kind !== 'unlock' && (op & LOCK_NB) === 0);\n if (kind !== 'unlock' && shared === true) host.reread(fd);\n },\n fcntl_lock: (fd: number, cmd: number, at: number) => {\n if (cmd !== F_GETLK && cmd !== F_SETLK && cmd !== F_SETLKW) throw new WasiError('EINVAL');\n host.promote(fd, true);\n const file = host.file(fd);\n const view = host.mem.view();\n const kind = kindOf(view.getInt16(at, true));\n const start =\n baseOf(file, view.getInt16(at + 2, true)) + Number(view.getBigInt64(at + 8, true));\n const len = Number(view.getBigInt64(at + 16, true));\n if (cmd === F_GETLK) {\n if (kind === 'unlock') throw new WasiError('EINVAL');\n writeHolder(view, at, host.calls.get(file.target, kind, start, len));\n return;\n }\n if (\n (kind === 'read' && file.readable === false) ||\n (kind === 'write' && file.writable === false)\n )\n throw new WasiError('EBADF');\n if (kind !== 'write') host.flush(file);\n const shared = host.calls.set(file.target, kind, start, len, cmd === F_SETLKW);\n if (kind === 'unlock') return;\n host.locked();\n if (shared === true) host.reread(fd);\n },\n };\n}\n", "import type { SemWaitHow } from '../../kernel/sem.ts';\nimport { CLOCK } from './wasi-abi.ts';\nimport { WasiError } from './wasi-files.ts';\nimport type { WasiFunction, WasiHost } from './wasi-host.ts';\n\nconst SEM_CREAT = 1;\nconst SEM_EXCL = 2;\nconst HOW: readonly SemWaitHow[] = ['block', 'try', 'timed'];\nconst NS_PER_MS = 1_000_000n;\n\nexport function remainingMs(deadline: bigint, now: bigint): number {\n if (deadline <= now) return 0;\n return Number((deadline - now + NS_PER_MS - 1n) / NS_PER_MS);\n}\n\nexport function semImports(host: WasiHost): Record<string, WasiFunction> {\n const { mem } = host;\n const call = (req: Parameters<typeof host.o.kernel.call>[0]) => host.o.kernel.call(req);\n const name = (ptr: number, len: number) => mem.string(ptr, len);\n return {\n sem_open: (np: number, nl: number, oflag: number, mode: number, value: number, out: number) => {\n const handle = call({\n op: 'sem-open',\n name: name(np, nl),\n create: (oflag & SEM_CREAT) !== 0,\n exclusive: (oflag & SEM_EXCL) !== 0,\n mode,\n value,\n }) as number;\n mem.view().setUint32(out, handle, true);\n },\n sem_close: (handle: number) => void call({ op: 'sem-close', handle }),\n sem_unlink: (np: number, nl: number) => void call({ op: 'sem-unlink', name: name(np, nl) }),\n sem_post: (handle: number) => void call({ op: 'sem-post', handle }),\n sem_wait: (handle: number, how: number, clock: number, deadline: bigint) => {\n const kind = HOW[how];\n if (!kind) throw new WasiError('EINVAL');\n let timeoutMs = -1;\n if (kind === 'timed') {\n if (deadline < 0n) throw new WasiError('EINVAL');\n if (clock !== CLOCK.REALTIME && clock !== CLOCK.MONOTONIC) throw new WasiError('EINVAL');\n timeoutMs = remainingMs(deadline, host.now(clock));\n }\n call({ op: 'sem-wait', handle, how: kind, timeoutMs });\n },\n sem_getvalue: (handle: number, out: number) =>\n void mem.view().setInt32(out, call({ op: 'sem-getvalue', handle }) as number, true),\n };\n}\n", "import type { Cred } from '../../kernel/cred.ts';\nimport { CRED_GEN, UMASK } from './wasi-files.ts';\n\nexport class CredCache {\n private cred: Cred | undefined;\n private stamp = 0;\n private readonly fetch: () => Cred;\n private readonly shared: Int32Array | undefined;\n\n constructor(fetch: () => Cred, shared?: Int32Array) {\n this.fetch = fetch;\n this.shared = shared;\n }\n\n private gen(): number {\n return this.shared ? Atomics.load(this.shared, CRED_GEN) : 0;\n }\n\n get(): Cred {\n const gen = this.gen();\n if (this.cred === undefined || this.stamp !== gen) {\n this.cred = this.fetch();\n this.stamp = gen;\n }\n return this.cred;\n }\n\n change(apply: () => Cred): Cred {\n const seen = this.gen();\n const cred = apply();\n if (!this.shared) {\n this.cred = cred;\n return cred;\n }\n const was = Atomics.add(this.shared, CRED_GEN, 1);\n this.cred = was === seen ? cred : undefined;\n this.stamp = was + 1;\n return cred;\n }\n}\n\nconst KNOWN = 0x10000;\nconst LOCKED = 0x20000;\n\nexport interface UmaskSignals {\n quiet<T>(fn: () => T): T;\n deliver(): void;\n}\n\nexport const UNGATED: UmaskSignals = { quiet: (fn) => fn(), deliver: () => {} };\n\nexport class UmaskCache {\n private mask: number | undefined;\n private readonly call: (mask?: number) => number;\n private readonly shared: Int32Array | undefined;\n private readonly signals: UmaskSignals;\n\n constructor(call: (mask?: number) => number, shared?: Int32Array, signals = UNGATED) {\n this.call = call;\n this.shared = shared;\n this.signals = signals;\n }\n\n get(): number {\n const { shared } = this;\n if (!shared) {\n this.mask ??= this.call();\n return this.mask;\n }\n for (;;) {\n const seen = Atomics.load(shared, UMASK);\n if (seen & LOCKED) Atomics.wait(shared, UMASK, seen);\n else if (seen & KNOWN) return seen & 0o777;\n else {\n const mask = this.call();\n if (Atomics.compareExchange(shared, UMASK, 0, mask | KNOWN) === 0) return mask;\n }\n }\n }\n\n set(mask: number): number {\n try {\n return this.signals.quiet(() => this.change(mask));\n } finally {\n this.signals.deliver();\n }\n }\n\n private change(mask: number): number {\n const { shared } = this;\n if (!shared) {\n const old = this.call(mask);\n this.mask = mask & 0o777;\n return old;\n }\n const seen = this.lock(shared);\n let next = seen;\n try {\n const old = this.call(mask);\n next = (mask & 0o777) | KNOWN;\n return old;\n } finally {\n Atomics.store(shared, UMASK, next);\n Atomics.notify(shared, UMASK);\n }\n }\n\n private lock(shared: Int32Array): number {\n for (;;) {\n const seen = Atomics.load(shared, UMASK);\n if (seen & LOCKED) Atomics.wait(shared, UMASK, seen);\n else if (Atomics.compareExchange(shared, UMASK, seen, seen | LOCKED) === seen) return seen;\n }\n }\n}\n", "export const PIPE_CAPACITY = 64 * 1024;\n\nexport interface PipeMark {\n readonly at: number;\n readonly count: number;\n drop(): void;\n}\n\nexport class PipeError extends Error {\n readonly code: 'EPIPE' | 'EINTR' | 'EAGAIN';\n\n constructor(code: 'EPIPE' | 'EINTR' | 'EAGAIN') {\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 private pushed = 0;\n private taken = 0;\n private marks: PipeMark[] = [];\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 this.dropMarks(() => true);\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(this.bounded(Math.min(max, this.size)));\n this.dropMarks((mark) => mark.at < this.taken);\n this.wake();\n return out;\n }\n\n get inFlight(): number {\n return this.marks.reduce((sum, mark) => sum + mark.count, 0);\n }\n\n async receive(\n max: number,\n nonblock: boolean,\n signal?: AbortSignal\n ): Promise<{ bytes: Uint8Array; marks: PipeMark[] }> {\n while (this.size === 0) {\n if (this.writers === 0) return { bytes: new Uint8Array(0), marks: [] };\n if (nonblock) throw new PipeError('EAGAIN');\n await this.changed(signal);\n }\n const marks = this.marks.filter((mark) => mark.at === this.taken);\n this.marks = this.marks.filter((mark) => mark.at !== this.taken);\n const bytes = this.take(this.bounded(Math.min(max, this.size)));\n this.dropMarks((mark) => mark.at < this.taken);\n this.wake();\n return { bytes, marks };\n }\n\n async writeMarked(\n bytes: Uint8Array,\n mark: (at: number) => PipeMark,\n nonblock: boolean,\n signal?: AbortSignal\n ): Promise<number> {\n while (this.readers > 0 && this.size >= this.capacity) {\n if (nonblock) throw new PipeError('EAGAIN');\n await this.changed(signal);\n }\n if (this.readers === 0) throw new PipeError('EPIPE');\n const before = this.pushed;\n const made = mark(before);\n this.marks.push(made);\n try {\n const n = await this.write(bytes, signal);\n this.orphan(made, before);\n return n;\n } catch (err) {\n this.orphan(made, before);\n throw err;\n }\n }\n\n private orphan(made: PipeMark, before: number): void {\n if (this.pushed !== before) return;\n this.dropMarks((mark) => mark === made);\n }\n\n private bounded(n: number): number {\n const next = this.marks.find((mark) => mark.at > this.taken);\n return next ? Math.min(n, next.at - this.taken) : n;\n }\n\n private dropMarks(gone: (mark: PipeMark) => boolean): void {\n const dropped = this.marks.filter(gone);\n if (dropped.length === 0) return;\n this.marks = this.marks.filter((mark) => !gone(mark));\n for (const mark of dropped) mark.drop();\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 this.pushed += 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 this.taken += 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 type { EmbedderChannel } from './embedder.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 | 'EPROTO'\n | 'EDEADLK'\n | 'ENOLCK'\n | 'EEXIST'\n | 'ELOOP'\n | 'EOVERFLOW'\n | 'ENAMETOOLONG'\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 | 'EPROTOTYPE'\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 | 'EDESTADDRREQ'\n | 'ENOPROTOOPT'\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 nread?: number;\n\n rdhup?: boolean;\n\n error?: 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 reread?(): 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 embedder?: EmbedderChannel;\n\n held?: true;\n\n heldMeta?: HeldMeta;\n\n identity?: object;\n\n fifo?: string;\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 OpenAccess = 'read' | 'write' | 'both';\n\nexport function openAccess(flags: number): OpenAccess {\n const mode = flags & 0o3;\n return mode === 0 ? 'read' : mode === 1 ? 'write' : 'both';\n}\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 private closers: Set<() => void> | undefined;\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 onClose(fn: () => void): () => void {\n this.closers ??= new Set();\n this.closers.add(fn);\n return () => void this.closers?.delete(fn);\n }\n\n release(): void | Promise<void> {\n this.refs -= 1;\n if (this.refs !== 0) return;\n const closers = this.closers;\n this.closers = undefined;\n for (const fn of closers ?? []) fn();\n 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: () => ({\n readable: pipe.readReady,\n writable: false,\n hangup: pipe.writersGone,\n nread: pipe.buffered,\n }),\n changed: (signal) => pipe.changed(signal),\n identity: pipe,\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 identity: pipe,\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 | 'embedder';\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 if (file.embedder) return 'embedder';\n return file.seek ? 'file' : 'stream';\n}\n\nexport interface ForkedHandles {\n fork(): ForkedHandles;\n clear(): void;\n}\n\nexport class FdTable {\n static readonly MAX_FDS = 1024;\n\n handles: ForkedHandles | undefined;\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 async replaceAt(fd: number, file: OpenFile): Promise<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 await 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 async dup2Clipboard(oldFd: number, newFd: number): Promise<number> {\n const file = this.get(oldFd);\n if (oldFd !== newFd) await this.replaceAt(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 child.handles = this.handles?.fork();\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 this.handles?.clear();\n await Promise.allSettled(files.map((file) => Promise.resolve().then(() => file.release())));\n }\n}\n", "import { renameWait } from '../../fs/changes.ts';\nimport { linkedWatch } from '../../fs/ranged.ts';\nimport {\n type DeviceAccess,\n type DeviceMeta,\n deviceAt,\n type HeldMeta,\n type KernelFdKind,\n} from '../../kernel/fd-table.ts';\nimport type { HeldCwd, HeldCwdReply } from '../../kernel/held-cwd.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 FD_RING,\n FD_RING_SIZE,\n FileBuffer,\n LocalFile,\n normalize,\n physical,\n realOf,\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';\nexport const EMBEDDER_PATH = '/dev/embedder';\n\nexport function deviceOf(path: string): Device | undefined {\n return deviceAt(path);\n}\n\nconst NAMED_PATHS: ReadonlySet<string> = new Set([\n SEALED_PATH,\n CLIPBOARD_PATH,\n EMBEDDER_PATH,\n '/dev/tty',\n]);\n\nfunction namedDevice(path: string): boolean {\n if (deviceOf(path) || stdioAlias(path) !== undefined) return true;\n return NAMED_PATHS.has(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 private renamesSeen: number;\n constructor(kernel: WasiKernel, fs: SyncFsPosixBridge) {\n this.kernel = kernel;\n this.fs = fs;\n this.renamesSeen = fs.changes?.renames() ?? 0;\n }\n\n ownRename(seq: number | undefined): void {\n if (seq !== undefined && seq === ((this.renamesSeen + 1) | 0)) this.renamesSeen = seq;\n }\n\n followRenames(missing = false): boolean {\n const view = this.fs.changes;\n const end = missing && view ? performance.now() + renameWait(view) : 0;\n const start = this.renamesSeen;\n for (;;) {\n const now = view?.renames() ?? 0;\n if (now !== this.renamesSeen && this.fs.renames && this.followTo(now)) return true;\n if (missing && this.renamesSeen !== start) return true;\n const left = end - performance.now();\n if (!view || left <= 0) return false;\n view.awaitRename(now, left);\n }\n }\n\n private followTo(now: number): boolean {\n const held = [...this.buffers].filter(([, b]) => !b.isOrphan()).map(([p]) => p);\n if (held.length === 0) {\n this.renamesSeen = now;\n return false;\n }\n const { now: seen, renames } = (this.fs.renames as NonNullable<typeof this.fs.renames>)(\n this.renamesSeen,\n held\n );\n this.renamesSeen = seen;\n for (const [from, to] of renames) this.renamed(from, to, undefined, true);\n return renames.length > 0;\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 adoptCopy(fd: number): number {\n const at = this.kernel.call({ op: 'fd-dup', fd, min: 3 }) as number;\n this.table.set(at, this.stdioEntry(at));\n return at;\n }\n\n preopenAt(path: string, name: string): number {\n return this.install({ type: 'dir', path: normalize(path), preopen: name });\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 shared = this.shared as Int32Array;\n const gen = Atomics.load(shared, GEN);\n if (gen === this.seen) return;\n if (!this.replay(shared, gen)) {\n this.table.clear();\n this.cloexec.clear();\n }\n this.seen = gen;\n }\n\n private replay(shared: Int32Array, upTo: number): boolean {\n if (upTo - this.seen > FD_RING_SIZE || !ringed(shared)) return false;\n const changed: number[] = [];\n for (let g = this.seen + 1; g <= upTo; g++) {\n const at = FD_RING + (g % FD_RING_SIZE) * 2;\n if (Atomics.load(shared, at) !== g) return false;\n const fd = Atomics.load(shared, at + 1);\n if (fd < 0 || Atomics.load(shared, at) !== g) return false;\n changed.push(fd);\n }\n for (const fd of changed) {\n this.table.delete(fd);\n this.cloexec.delete(fd);\n }\n return true;\n }\n\n private bump(...fds: number[]): void {\n if (!this.shared) return;\n const shared = this.shared;\n for (const fd of fds.length > 0 ? fds : [-1]) {\n const gen = Atomics.add(shared, GEN, 1) + 1;\n if (ringed(shared)) {\n const at = FD_RING + (gen % FD_RING_SIZE) * 2;\n Atomics.store(shared, at, 0);\n Atomics.store(shared, at + 1, fd);\n Atomics.store(shared, at, gen);\n }\n if (gen - 1 === this.seen) this.seen = gen;\n }\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(fd);\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(fd);\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, dgram = false): void {\n this.table.set(fd, { type: 'kernel', kind, dgram, nonblock, append: false });\n if (this.shared && nonblock) this.publishFlags(fd, { nonblock, append: false });\n this.bump(fd);\n }\n\n get(fd: number): WasiEntry {\n const e = this.find(fd);\n if (!e) throw new WasiError('EBADF');\n if (e.type === 'file') this.followRenames();\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(fd);\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 !== 'file') {\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 e.file.refs++;\n at = this.install(e, min);\n }\n if (cloexec) this.setCloexec(at, true);\n this.bump(at);\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(r, w);\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.held?.moved(this.kernel.call({ op: 'cwd-chdir', path }) as HeldCwdReply, path);\n this.bump();\n }\n\n promote(fd: number, moved = false): void {\n const e = this.get(fd);\n if (e.type === 'file' && (!moved || this.moved(fd))) this.promoteFiles(e.file.buffer);\n }\n\n promoteFiles(only?: FileBuffer): 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' || (only && e.file.buffer !== only)) 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 private locking = false;\n\n holdLocks(): void {\n this.locking = true;\n }\n\n private dropLocks(e: WasiEntry | undefined): void {\n if (!this.locking || e?.type !== 'file') return;\n try {\n this.kernel.call({ op: 'lk-close', path: e.file.path });\n } catch {}\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.dropLocks(e);\n this.bump(fd);\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.dropLocks(old);\n this.bump(from, to);\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 this.reported.delete(buffer);\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 dgram?: true;\n };\n e.kind = info.kind ?? (info.tty ? 'tty' : 'stream');\n e.dgram = info.dgram === true;\n }\n return e.kind;\n }\n\n datagram(fd: number, e: Extract<WasiEntry, { type: 'kernel' }>): boolean {\n if (this.kind(fd, e) !== 'socket') return false;\n if (e.dgram === undefined) {\n e.dgram = (this.kernel.call({ op: 'fd-info', fd }) as { dgram?: true }).dgram === true;\n }\n return e.dgram;\n }\n\n flushAll(): void {\n for (const buffer of this.buffers.values()) {\n try {\n buffer.flush();\n this.reported.delete(buffer);\n } catch (err) {\n if (!this.reported.has(buffer)) throw err;\n }\n }\n }\n\n synced(file: LocalFile): void {\n try {\n file.flush();\n this.reported.delete(file.buffer);\n } catch (err) {\n this.reported.add(file.buffer);\n throw err;\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 reread(fd: number): void {\n const e = this.get(fd);\n if (e.type === 'file') e.file.buffer.reread();\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.fs.changes?.clean()) 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 replacing(path: string): void {\n for (const [p, buffer] of this.buffers) {\n if (!within(p, path)) continue;\n try {\n buffer.prefetch();\n } catch {\n buffer.spoil();\n }\n }\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 moved(fd: number): boolean {\n const e = this.get(fd);\n if (e.type !== 'file') return false;\n if (e.file.buffer.isOrphan()) return true;\n return e.file.ino !== undefined && this.inoOf(e.file.path) !== e.file.ino;\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, foreign = false): void {\n if (from === to) return;\n if (this.shared && !foreign) 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 (foreign && buffer.isOrphan()) continue;\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 held: HeldCwd | undefined;\n\n private cwdEntry(dir: Extract<WasiEntry, { type: 'dir' }>): boolean {\n return dir.preopen === '.' || dir.preopen === './';\n }\n\n goneCwd(dir: Extract<WasiEntry, { type: 'dir' }>): boolean {\n return this.held !== undefined && this.cwdEntry(dir) && !this.held.alive(dir.path);\n }\n\n resolve(dirfd: number, path: string): string {\n if (path === '') throw new WasiError('ENOENT');\n if (path.startsWith('/')) return this.joined(path);\n const dir = this.dir(dirfd);\n if (path.split('/')[0] !== '..' && this.goneCwd(dir)) throw new WasiError('ENOENT');\n return this.joined(`${dir.path}/${path}`);\n }\n\n private joined(joined: string): string {\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, openEmbedder, 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 fd = this.openCharDevice(openSealed, oflags, rights);\n kind = 'sealed';\n } else if (path === CLIPBOARD_PATH && openClipboard) {\n fd = this.openCharDevice(openClipboard, oflags, rights);\n kind = 'clipboard';\n } else if (path === EMBEDDER_PATH && openEmbedder) {\n fd = this.openCharDevice(openEmbedder, oflags, rights);\n kind = 'embedder';\n } else if (path === '/dev/tty' || /^\\/dev\\/tty\\d+$/.test(path)) {\n const exclusive = (oflags & OFLAGS.CREAT) !== 0 && (oflags & OFLAGS.EXCL) !== 0;\n try {\n fd = openTty?.call(this.kernel.sys, path === '/dev/tty' ? undefined : path);\n } catch (err) {\n if (exclusive && (err as { code?: string }).code === 'EACCES')\n throw new WasiError('EEXIST');\n throw err;\n }\n if (fd === undefined) throw new WasiError('ENXIO');\n if (exclusive) {\n this.kernel.sys.close(fd);\n throw new WasiError('EEXIST');\n }\n kind = 'tty';\n } else return undefined;\n this.adopt(fd, kind, nonblock);\n return fd;\n }\n\n private openCharDevice(\n openDevice: (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 openDevice.call(this.kernel.sys, flags);\n }\n\n open(\n path: string,\n oflags: number,\n rights: bigint,\n fdflags: number,\n mode?: number,\n nofollow = false\n ): number {\n this.made = undefined;\n this.created = false;\n this.nofollow = nofollow;\n const exclusive = (oflags & OFLAGS.CREAT) !== 0 && (oflags & OFLAGS.EXCL) !== 0;\n const special = this.openSpecial(path, oflags, rights, fdflags, exclusive);\n if (special !== undefined) return special;\n const outside = this.escaped(path, oflags, rights);\n if (outside !== undefined) return this.open(outside, oflags, rights, fdflags, mode);\n if (exclusive && !(oflags & OFLAGS.DIRECTORY) && this.madeAtOnce(path, mode)) {\n return this.regular(path, undefined, oflags, rights, fdflags, mode, true);\n }\n if (exclusive && !nofollow && this.isLink(path)) throw new WasiError('EEXIST');\n const s = nofollow ? this.lstatOrMissing(path) : this.statOrMissing(path);\n if (s?.isSymbolicLink) throw new WasiError(exclusive ? 'EEXIST' : 'ELOOP');\n if (exclusive && s) throw new WasiError('EEXIST');\n if (s?.escape !== undefined) {\n refuseWrite({ readonly: true }, oflags, rights);\n return this.open(s.escape, oflags, rights, fdflags, mode);\n }\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, mode);\n }\n\n private nofollow = false;\n\n private readonly inos = new WeakMap<FileBuffer, number>();\n\n private otherFile(buffer: FileBuffer, st: SyncFsBridgeStat | undefined): boolean {\n const ino = this.inos.get(buffer);\n return ino !== undefined && st?.ino !== undefined && ino !== st.ino;\n }\n\n private openSpecial(\n path: string,\n oflags: number,\n rights: bigint,\n fdflags: number,\n exclusive: boolean\n ): number | undefined {\n if (exclusive && namedDevice(path)) throw new WasiError('EEXIST');\n const device = deviceOf(path);\n if (device) return this.install({ type: 'device', device });\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 undefined;\n if (this.nofollow) throw new WasiError('ELOOP');\n return this.reopen(alias);\n }\n\n private escaped(path: string, oflags: number, rights: bigint): string | undefined {\n const outside = this.fs.escape?.(path);\n if (outside === undefined) return undefined;\n refuseWrite({ readonly: true }, oflags | (oflags & OFLAGS.CREAT ? OFLAGS.TRUNC : 0), rights);\n return outside;\n }\n\n private regular(\n path: string,\n s: SyncFsBridgeStat | undefined,\n oflags: number,\n rights: bigint,\n fdflags: number,\n mode?: number,\n created = false\n ): number {\n if (s?.isFifo) return this.kernelFifo(path, s, oflags, rights, fdflags);\n if (s?.isSocket) throw new WasiError('ENXIO');\n if (this.shared || this.kernelHolds(path, s)) {\n return this.kernelFile(path, s, oflags, rights, fdflags, mode, created);\n }\n return this.install({\n type: 'file',\n file: this.file(path, s, oflags, rights, fdflags, mode, created),\n });\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 mode?: number,\n created = false\n ): LocalFile {\n const { readable, writable } = openAccess(existing, oflags, rights);\n this.followRenames();\n let buffer = created ? undefined : 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 if (buffer && this.nofollow && this.otherFile(buffer, existing)) buffer = undefined;\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, mode, created);\n }\n buffer.opens++;\n const file = new LocalFile(buffer, readable, writable, (fdflags & FDFLAGS.APPEND) !== 0);\n file.ino = existing?.ino;\n return file;\n }\n\n private freshBuffer(\n path: string,\n existing: SyncFsBridgeStat | undefined,\n oflags: number,\n want: number,\n mode?: number,\n created = false\n ): FileBuffer {\n const made = created || (!existing && this.createNew(path, oflags, mode));\n const reply = made ? this.made : undefined;\n this.made = undefined;\n const empty = made || (oflags & OFLAGS.TRUNC) !== 0;\n if (existing?.ranged) (this.fs as { invalidate?(): void }).invalidate?.();\n const seen = reply ? reply.seen : this.fs.changes?.now();\n const st = reply?.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 gen: st.gen,\n ...(this.nofollow ? { nofollow: true } : {}),\n ...(st.ino !== undefined ? { ino: st.ino } : {}),\n });\n const io = handle !== undefined && this.fs.pinned ? this.fs.pinned(handle) : this.fs;\n const view = this.fs.changes;\n const watch =\n view &&\n linkedWatch(\n {\n view,\n ino: st.ino,\n seen,\n stat: (at: string) => {\n (this.fs as { invalidate?(): void }).invalidate?.();\n return this.fs.stat(at);\n },\n real: () => realOf(this.fs, path),\n },\n st\n );\n const buffer = new FileBuffer(io, path, empty, st.maxFile, ranged, st.version, watch);\n buffer.moved = (missing) => this.followRenames(missing);\n buffer.bound = st;\n buffer.handle = handle;\n if (st.ino !== undefined) this.inos.set(buffer, st.ino);\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 mode?: number,\n created = false\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 = created || (!existing && this.createNew(path, oflags, mode));\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 ...(this.nofollow && !made ? { nofollow: 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(fd);\n return fd;\n }\n\n private kernelFifo(\n path: string,\n existing: SyncFsBridgeStat,\n oflags: number,\n rights: bigint,\n fdflags: number\n ): number {\n const { readable, writable } = openAccess(existing, oflags, rights);\n const nonblock = (fdflags & FDFLAGS.NONBLOCK) !== 0;\n const access = writable ? (readable ? O_RDWR : O_WRONLY) : 0;\n const fd = this.restarting(() =>\n this.kernel.sys.openVfs(path, access | (nonblock ? O_NONBLOCK : 0), 0, { fifo: true })\n );\n this.table.set(fd, { type: 'kernel', kind: 'stream', nonblock, append: false });\n if (nonblock) this.publishFlags(fd, { nonblock, append: false });\n this.bump(fd);\n return fd;\n }\n\n restartable: (() => boolean) | undefined;\n\n restarting<T>(call: () => T): T {\n for (;;) {\n try {\n return call();\n } catch (err) {\n if ((err as { code?: unknown }).code !== 'EINTR' || !this.restartable?.()) throw err;\n }\n }\n }\n\n created = false;\n\n private made: { st: SyncFsBridgeStat; seen: number | undefined } | undefined;\n\n private creating(path: string, mode?: number): void {\n const st = this.fs.create?.(path, mode, true);\n this.made = st ? { st, seen: st.seen } : undefined;\n this.created = true;\n }\n\n private madeAtOnce(path: string, mode?: number): boolean {\n if (!this.fs.create) return false;\n try {\n this.creating(path, mode);\n return true;\n } catch (err) {\n if ((err as { code?: string }).code === 'EEXIST') throw err;\n return false;\n }\n }\n\n private createNew(path: string, oflags: number, mode?: number): boolean {\n if (!this.fs.create) {\n this.fs.writeFile(path, new Uint8Array(0));\n this.created = true;\n return true;\n }\n try {\n this.creating(path, mode);\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 lstatOrMissing(path: string): SyncFsBridgeStat | undefined {\n try {\n return this.fs.lstat(path);\n } catch (e) {\n if ((e as { code?: string }).code === 'ENOENT') return undefined;\n throw e;\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(at);\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 ringed(shared: Int32Array): boolean {\n return shared.length >= FD_RING + FD_RING_SIZE * 2;\n}\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 dgram: info.dgram === true,\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 ...(f.buffer.handle !== undefined && f.ino !== undefined ? { ino: f.ino } : {}),\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 nbytes?: number;\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, BigInt(ev.nbytes ?? 1), 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\ninterface Ready {\n read: number[];\n write: number[];\n hangup?: number[];\n nread?: Record<number, number>;\n}\n\nfunction nbytesOf(s: Subscription, ready: Ready): { nbytes?: number } {\n const n = s.type === EVENTTYPE.FD_READ ? ready.nread?.[s.fd] : undefined;\n return n === undefined ? {} : { nbytes: n };\n}\n\nfunction readyEvents(subs: readonly Subscription[], ready: Ready): 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 ...nbytesOf(s, ready),\n }));\n}\n\ninterface PollDeps {\n mem: WasiMemory;\n fds: WasiFds;\n kernel: WasiKernel;\n now: ClockNow;\n\n interruptWakes?: boolean;\n\n entered?: boolean;\n\n resumes?: () => boolean;\n}\n\nconst RESUMES = 64;\n\nfunction selectOnce(\n deps: PollDeps,\n read: number[],\n write: number[],\n timeoutMs: number,\n mayResume: boolean\n): { ready: Ready; interrupted: boolean; resumed?: true } {\n try {\n const ready = deps.kernel.call({ op: 'fd-select', read, write, timeoutMs });\n return { ready: ready as Ready, interrupted: false };\n } catch (e) {\n if ((e as { code?: unknown }).code !== 'EINTR') throw e;\n if (!deps.interruptWakes && mayResume && deps.resumes?.()) {\n return { ready: { read: [], write: [] }, interrupted: false, resumed: true };\n }\n if (!deps.interruptWakes) throw e;\n return { ready: { read: [], write: [] }, interrupted: true };\n }\n}\n\nfunction waitEvents(\n deps: PollDeps,\n subs: readonly Subscription[],\n { events, read, write }: { events: PollEvent[]; read: number[]; write: number[] },\n entered: boolean\n): boolean {\n const earliest = subs.reduce((min, s) => Math.min(min, s.deadline), Infinity);\n const timeout = (): number => {\n if (events.length > 0 || entered) return 0;\n return earliest === Infinity ? -1 : Math.max(0, Math.ceil(earliest - performance.now()));\n };\n for (let resumes = 0; ; ) {\n const { ready, interrupted, resumed } = selectOnce(\n deps,\n read,\n write,\n timeout(),\n resumes++ < RESUMES\n );\n if (resumed) continue;\n events.push(...readyEvents(subs, ready));\n if (interrupted) return true;\n if (events.length > 0 || entered || earliest === Infinity) return false;\n if (performance.now() >= earliest) return false;\n }\n}\n\nexport function pollOneoff(\n deps: PollDeps,\n inPtr: number,\n outPtr: number,\n nsubs: number,\n neventsPtr: number\n): number {\n if (nsubs === 0) return E.INVAL;\n const { mem } = deps;\n const subs = readSubscriptions(mem, inPtr, nsubs, deps.now);\n const found = classify(deps.fds, subs);\n const { events, read, write } = found;\n const entered = deps.entered === true && deps.interruptWakes !== true;\n const waits = read.length > 0 || write.length > 0 || events.length === 0;\n const interrupted = waits && waitEvents(deps, subs, found, entered);\n const after = performance.now();\n if (entered && events.length === 0 && !subs.some((s) => s.deadline <= after)) return E.INTR;\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 { SIG, sigbit } from '../../kernel/signals.ts';\nimport {\n type BlockedMask,\n SAB_I_BLOCKED,\n SAB_I_BLOCKED_HI,\n SAB_I_KILLED,\n SAB_I_SIGNALS,\n SAB_I_STOP,\n storeBlocked,\n} from '../../realm/sync-sab-wire.ts';\nimport { E } from './wasi-abi.ts';\n\nconst UNBLOCKABLE = sigbit(SIG.KILL) | sigbit(SIG.STOP);\nconst LIBC_UNBLOCKABLE = (1 << (SIG.KILL - 1)) | (1 << (SIG.STOP - 1));\n\nconst FOREVER = 0xffff_ffff_ffff_ffffn;\nconst NS_PER_MS = 1_000_000n;\nconst POLL_MS = 50;\n\nexport const SIG_BLOCK = 0;\nexport const SIG_UNBLOCK = 1;\nexport const SIG_SETMASK = 2;\n\nexport const kernelBits = (lo: number): number => (lo << 1) & ~UNBLOCKABLE;\n\nexport const libcBits = (bits: number): number => (bits >>> 1) & ~LIBC_UNBLOCKABLE;\n\nconst apply = (how: number, mask: number, set: number): number => {\n if (how === SIG_BLOCK) return mask | set;\n if (how === SIG_UNBLOCK) return mask & ~set;\n return set;\n};\n\nexport class WasiSigmask {\n private lo: number;\n private hi: number;\n private readonly header: Int32Array;\n private readonly deliver: () => void;\n private readonly process: Int32Array | undefined;\n readonly tid: number;\n constructor(header: Int32Array, deliver: () => void, process?: Int32Array, tid = 1) {\n this.header = header;\n this.deliver = deliver;\n this.process = process;\n this.tid = tid;\n this.lo = libcBits(Atomics.load(header, SAB_I_BLOCKED));\n this.hi = Atomics.load(header, SAB_I_BLOCKED_HI);\n }\n\n static unsupported(header: Int32Array): void {\n storeBlocked(header, [0, 0]);\n }\n\n set(how: number, setLo: number, setHi: number, old: (lo: number, hi: number) => void): number {\n if (how !== SIG_BLOCK && how !== SIG_UNBLOCK && how !== SIG_SETMASK) return E.INVAL;\n old(this.lo >>> 0, this.hi >>> 0);\n this.lo = apply(how, this.lo, setLo | 0) & ~LIBC_UNBLOCKABLE;\n this.hi = apply(how, this.hi, setHi | 0);\n const now = kernelBits(this.lo);\n storeBlocked(this.header, [now, this.hi]);\n if ((Atomics.load(this.header, SAB_I_SIGNALS) & ~now) !== 0) this.deliver();\n return E.SUCCESS;\n }\n\n swap(setLo: number, setHi: number): [number, number] {\n const old: [number, number] = [this.lo, this.hi];\n this.lo = setLo & ~LIBC_UNBLOCKABLE;\n this.hi = setHi | 0;\n storeBlocked(this.header, [kernelBits(this.lo), this.hi]);\n return old;\n }\n\n deliverUnblocked(): boolean {\n const now = Atomics.load(this.header, SAB_I_BLOCKED);\n if ((Atomics.load(this.header, SAB_I_SIGNALS) & ~now) === 0) return false;\n this.deliver();\n return true;\n }\n\n restore([lo, hi]: [number, number]): void {\n this.set(SIG_SETMASK, lo, hi, () => {});\n }\n\n blockedBits(): number {\n return Atomics.load(this.header, SAB_I_BLOCKED);\n }\n\n blocks(sig: number): boolean {\n return (Atomics.load(this.header, SAB_I_BLOCKED) & sigbit(sig)) !== 0;\n }\n\n inherited(): BlockedMask {\n return [kernelBits(this.lo), this.hi];\n }\n\n discard(sig: number): void {\n Atomics.and(this.header, SAB_I_SIGNALS, ~sigbit(sig));\n if (this.process) Atomics.and(this.process, SAB_I_SIGNALS, ~sigbit(sig));\n }\n\n sigwait(\n setLo: number,\n timeoutNs: bigint,\n publish: (set: number) => void,\n took: (sig: number) => void,\n entered = false\n ): number {\n const set = kernelBits(setLo | 0);\n const value = BigInt.asUintN(64, timeoutNs);\n const deadline =\n value === FOREVER\n ? Number.POSITIVE_INFINITY\n : performance.now() + Number((value + NS_PER_MS - 1n) / NS_PER_MS);\n publish(set);\n try {\n for (;;) {\n const seen = Atomics.load(this.header, SAB_I_SIGNALS);\n const sig = this.take(set);\n if (sig !== 0) {\n took(sig);\n return E.SUCCESS;\n }\n if (entered || this.deliverUnblocked() || this.interrupted()) return E.INTR;\n const left = deadline - performance.now();\n if (left <= 0) return E.AGAIN;\n Atomics.wait(this.header, SAB_I_SIGNALS, seen, Math.min(left, POLL_MS));\n }\n } finally {\n publish(0);\n }\n }\n\n private take(set: number): number {\n for (const header of this.process ? [this.header, this.process] : [this.header]) {\n const ready = Atomics.load(header, SAB_I_SIGNALS) & set;\n if (ready === 0) continue;\n const bit = ready & -ready;\n if ((Atomics.and(header, SAB_I_SIGNALS, ~bit) & bit) !== 0) return 31 - Math.clz32(bit);\n }\n return 0;\n }\n\n private interrupted(): boolean {\n const killed = this.process ?? this.header;\n if (Atomics.load(killed, SAB_I_KILLED) !== 0) {\n this.deliver();\n return true;\n }\n if (Atomics.load(killed, SAB_I_STOP) !== 1) return false;\n while (Atomics.load(killed, SAB_I_STOP) === 1) Atomics.wait(killed, SAB_I_STOP, 1);\n return true;\n }\n\n pending(): number {\n const own = Atomics.load(this.header, SAB_I_SIGNALS);\n return libcBits(own | (this.process ? Atomics.load(this.process, SAB_I_SIGNALS) : 0));\n }\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 type { EpollEvent, EpollOp } from '../../kernel/epoll.ts';\nimport { E } from './wasi-abi.ts';\nimport { WasiError } from './wasi-files.ts';\nimport type { WasiFunction, WasiHost } from './wasi-host.ts';\n\nconst EVENT_SIZE = 32;\nconst DATA_OFFSET = 8;\nconst DATA_SIZE = 24;\nconst MAX_EVENTS = 4096;\nconst FOREVER = 0xffff_ffff_ffff_ffffn;\nconst MAX_TIMEOUT_MS = 0x7fff_ffff;\nconst NS_PER_MS = 1_000_000n;\nconst EVENTFD_SEMAPHORE = 1;\nconst EVENTFD_NONBLOCK = 4;\nconst EVENTFD_MAX = 0xffff_ffff_ffff_fffen;\nconst WASIX_OPS: readonly EpollOp[] = ['add', 'mod', 'del'];\nconst DUAL_OPS: readonly EpollOp[] = ['add', 'set', 'del', 'mod'];\n\nexport function timeoutMs(ns: bigint): number {\n const value = BigInt.asUintN(64, ns);\n if (value === FOREVER) return -1;\n const ms = (value + NS_PER_MS - 1n) / NS_PER_MS;\n return ms > BigInt(MAX_TIMEOUT_MS) ? -1 : Number(ms);\n}\n\nexport function wasixEpollImports(host: WasiHost): Record<string, WasiFunction> {\n const { mem, fds, o } = host;\n const call = (req: Parameters<typeof o.kernel.call>[0]) => o.kernel.call(req);\n const kernelFd = (fd: number, refusal: 'EINVAL' | 'EPERM'): void => {\n const e = fds.find(fd);\n if (!e) throw new WasiError('EBADF');\n if (e.type !== 'kernel') throw new WasiError(refusal);\n };\n const writeEvents = (ptr: number, events: readonly EpollEvent[]): void => {\n const view = mem.view();\n events.forEach((ev, i) => {\n const at = ptr + i * EVENT_SIZE;\n mem.bytes(at, EVENT_SIZE).fill(0);\n view.setUint32(at, ev.events, true);\n mem.bytes(at + DATA_OFFSET, DATA_SIZE).set(ev.data);\n });\n };\n return {\n epoll_create: (out: number) => {\n const fd = call({ op: 'epoll-create' }) as number;\n fds.adopt(fd, 'stream', false);\n mem.view().setUint32(out, fd, true);\n },\n epoll_ctl: (epfd: number, op: number, fd: number, event: number) => {\n const how = (host.strictEpoll ? WASIX_OPS : DUAL_OPS)[op];\n if (!how) throw new WasiError('EINVAL');\n kernelFd(epfd, 'EINVAL');\n kernelFd(fd, 'EPERM');\n if (how !== 'del' && event === 0) throw new WasiError('EINVAL');\n const events = event === 0 ? 0 : mem.view().getUint32(event, true);\n const data = event === 0 ? [] : [...mem.bytes(event + DATA_OFFSET, DATA_SIZE)];\n call({ op: 'epoll-ctl', epfd, how, fd, events, data });\n },\n epoll_wait: (epfd: number, ptr: number, maxevents: number, timeout: bigint, out: number) => {\n mem.view().setUint32(out, 0, true);\n if ((maxevents | 0) <= 0) throw new WasiError('EINVAL');\n kernelFd(epfd, 'EINVAL');\n const max = Math.min(maxevents | 0, MAX_EVENTS);\n const ms = host.entered ? 0 : timeoutMs(timeout);\n const events = call({ op: 'epoll-wait', epfd, max, timeoutMs: ms }) as EpollEvent[];\n if (host.entered && events.length === 0 && timeoutMs(timeout) !== 0) return E.INTR;\n writeEvents(ptr, events);\n mem.view().setUint32(out, events.length, true);\n return E.SUCCESS;\n },\n fd_event: (initial: bigint, flags: number, out: number) => {\n const value = BigInt.asUintN(64, initial);\n if (value > EVENTFD_MAX) throw new WasiError('EINVAL');\n const fd = call({\n op: 'eventfd-open',\n initial: value.toString(),\n semaphore: (flags & EVENTFD_SEMAPHORE) !== 0,\n }) as number;\n fds.adopt(fd, 'stream', (flags & EVENTFD_NONBLOCK) !== 0);\n mem.view().setUint32(out, fd, true);\n },\n };\n}\n", "export interface Received {\n bytes: Uint8Array;\n host: string;\n port: number;\n truncated: boolean;\n unix?: boolean;\n}\n\nexport function encodeReceived(got: Received): Uint8Array {\n const host = new TextEncoder().encode(got.host);\n const out = new Uint8Array(4 + host.length + got.bytes.length);\n const view = new DataView(out.buffer);\n view.setUint8(0, (got.truncated ? 1 : 0) | (got.unix ? 2 : 0));\n view.setUint16(1, got.port);\n view.setUint8(3, host.length);\n out.set(host, 4);\n out.set(got.bytes, 4 + host.length);\n return out;\n}\n\nexport function decodeReceived(raw: Uint8Array): Received {\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);\n const length = view.getUint8(3);\n return {\n truncated: (view.getUint8(0) & 1) !== 0,\n unix: (view.getUint8(0) & 2) !== 0,\n port: view.getUint16(1),\n host: new TextDecoder().decode(raw.subarray(4, 4 + length)),\n bytes: raw.subarray(4 + length),\n };\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\nconst LOOPBACK_V4 = /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\nconst LOOPBACK_V6 = new Set(['::1', '::', '0:0:0:0:0:0:0:1']);\nconst MAPPED_V4 = /^::ffff:7f[0-9a-f]{2}:[0-9a-f]{1,4}$/;\nconst KERNEL_PORT = /^(\\d{1,5})\\.kernel\\.localhost$/;\nconst SCHEMES: Readonly<Record<string, number>> = {\n 'http:': 80,\n 'ws:': 80,\n 'https:': 443,\n 'wss:': 443,\n};\n\nexport function isKernelLoopbackHost(hostname: string): boolean {\n const host = hostname\n .replace(/^\\[(.*)\\]$/, '$1')\n .replace(/\\.$/, '')\n .toLowerCase();\n return (\n host === 'localhost' ||\n host.endsWith('.localhost') ||\n host === '0.0.0.0' ||\n LOOPBACK_V4.test(host) ||\n LOOPBACK_V6.has(host) ||\n MAPPED_V4.test(host)\n );\n}\n\nexport function kernelLoopbackPort(href: string): number | undefined {\n let url: URL;\n try {\n url = new URL(href);\n } catch {\n return undefined;\n }\n const fallback = SCHEMES[url.protocol];\n if (fallback === undefined || !isKernelLoopbackHost(url.hostname)) return undefined;\n const named = KERNEL_PORT.exec(url.hostname.replace(/\\.$/, '').toLowerCase())?.[1];\n const port = Number(named ?? (url.port || fallback));\n return port >= 1 && port <= 65535 ? port : undefined;\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 initHostname(init: {\n hostname?: string | undefined;\n env: Readonly<Record<string, string>>;\n}): string {\n return isHostname(init.hostname) ? init.hostname : hostnameOf(init.env);\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 { 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 { decodeReceived } from '../../kernel/net/datagram-wire.ts';\nimport { 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 DGRAM = 2;\nconst RECV_DATA_TRUNCATED = 1;\nconst RIFLAG_PEEK = 1;\nconst MAX_DATAGRAM = 65_536;\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\nfunction openRequest(af: number, type: number) {\n if (af !== INET4 && af !== INET6 && af !== UNIX) throw new WasiError('EAFNOSUPPORT');\n if (type !== STREAM && type !== DGRAM) throw new WasiError('EPROTONOSUPPORT');\n const domain = af === UNIX ? ('unix' as const) : ('inet' as const);\n return {\n op: 'sock-open' as const,\n domain,\n ...(type === DGRAM ? { type: 'dgram' as const } : {}),\n };\n}\n\nfunction pairRequest(af: number, type: number) {\n if (af !== UNIX)\n throw new WasiError(af === INET4 || af === INET6 ? 'EOPNOTSUPP' : 'EAFNOSUPPORT');\n if (type !== STREAM && type !== DGRAM) throw new WasiError('EPROTONOSUPPORT');\n return {\n op: 'sock-pair' as const,\n domain: 'unix' as const,\n ...(type === DGRAM ? { type: 'dgram' as const } : {}),\n };\n}\n\nfunction absolute(cwd: string, addr: SockAddr): SockAddr {\n if (addr.family !== 'unix' || addr.path === '' || addr.path.startsWith('\\0')) return addr;\n return addr.path.startsWith('/') ? addr : { family: 'unix', path: `${cwd}/${addr.path}` };\n}\n\nfunction optionalAddr(view: DataView, ptr: number): SockAddr | undefined {\n if (ptr === 0 || view.getUint8(ptr) === 0) return undefined;\n return readAddr(view, ptr);\n}\n\nexport function datagramCalls(host: WasiHost) {\n const { mem, o } = host;\n const call = (req: Parameters<typeof o.kernel.call>[0]) => o.kernel.call(req);\n return {\n recvFrom(\n fd: number,\n nonblock: boolean,\n iovs: number,\n n: number,\n riflags: number,\n outLen: number,\n outFlags: number,\n outAddr: number\n ): number {\n const max = Math.min(mem.capacity(iovs, n), MAX_DATAGRAM);\n const peek = (riflags & RIFLAG_PEEK) !== 0;\n const raw = call({ op: 'sock-recvfrom', fd, max, peek, nonblock });\n const got = decodeReceived(raw as Uint8Array);\n const view = mem.view();\n view.setUint32(outLen, mem.scatter(iovs, n, got.bytes), true);\n view.setUint16(outFlags, got.truncated ? RECV_DATA_TRUNCATED : 0, true);\n const from: SockAddr = got.unix\n ? { family: 'unix', path: got.host }\n : { family: 'inet', host: got.host, port: got.port };\n if (outAddr) writeAddr(mem.view(), outAddr, from);\n return E.SUCCESS;\n },\n sendTo(fd: number, nonblock: boolean, iovs: number, n: number, addr: number, out: number) {\n const named = optionalAddr(mem.view(), addr);\n const to = named && absolute(host.cwd, named);\n const body = mem.gather(iovs, n);\n const sent = call({ op: 'sock-sendto', fd, body, ...(to ? { addr: to } : {}), nonblock });\n mem.view().setUint32(out, sent as number, true);\n return E.SUCCESS;\n },\n };\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 const datagrams = (fd: number): boolean => {\n try {\n const e = fds.get(fd);\n return e.type === 'kernel' && fds.datagram(fd, e);\n } catch {\n return false;\n }\n };\n const dgram = datagramCalls(host);\n return {\n sock_open: (af: number, type: number, _proto: number, out: number) => {\n const req = openRequest(af, type);\n const fd = call(req) as number;\n fds.adopt(fd, 'socket', false, 'type' in req);\n mem.view().setUint32(out, fd, true);\n },\n sock_pair: (af: number, type: number, _proto: number, out1: number, out2: number) => {\n const req = pairRequest(af, type);\n mem.view().setUint32(out1, 0, true);\n mem.view().setUint32(out2, 0, true);\n const [a, b] = call(req) as [number, number];\n fds.adopt(a, 'socket', false, 'type' in req);\n fds.adopt(b, 'socket', false, 'type' in req);\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: absolute(host.cwd, 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 const to = absolute(host.cwd, readAddr(mem.view(), addr));\n call({ op: 'sock-connect', fd, addr: to, 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 if (datagrams(fd)) {\n const e = socket(fd);\n return dgram.recvFrom(fd, e.nonblock, iovs, n, riflags, outLen, outFlags, outAddr);\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 ) => {\n if (datagrams(fd)) return dgram.sendTo(fd, socket(fd).nonblock, iovs, n, addr, out);\n return preview1.sock_send(\n fd as never,\n iovs as never,\n n as never,\n flags as never,\n out as never\n );\n },\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 { inDevTree } from '../../fs/dev-removal.ts';\nimport { physicalLeaf, 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 { HeldCwd } from '../../kernel/held-cwd.ts';\nimport type { FdInfo } from '../../kernel/process.ts';\nimport { KERNEL_SIGINFO, SIG, type SigInfo } from '../../kernel/signals.ts';\nimport type { SyncFsBridgeStat, SyncFsPosixBridge } from '../../realm/sync-fs-wire.ts';\nimport { devFdStat, devStat, devSync, inDev } from '../js/js-dev.ts';\nimport type { LockHeld } from '../process-locks.ts';\nimport { type LockedFile, type LockHost, lockImports } from './slicc-lock.ts';\nimport { semImports } from './slicc-sem.ts';\nimport {\n CLOCK,\n E,\n FDFLAGS,\n FILETYPE,\n FSTFLAGS,\n LOOKUP_SYMLINK_FOLLOW,\n PREOPENTYPE_DIR,\n RIFLAGS,\n RIGHTS,\n SDFLAGS,\n SIZE,\n WASI_SIGNAL_TO_POSIX,\n WHENCE,\n wasiErrnoOf,\n} from './wasi-abi.ts';\nimport { CredCache, UmaskCache, UNGATED } from './wasi-cred.ts';\nimport {\n CLIPBOARD_PATH,\n deviceOf,\n EMBEDDER_PATH,\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 { libcBits, SIG_SETMASK, SIG_UNBLOCK, type WasiSigmask } from './wasi-sigmask.ts';\nimport type { WasiSignals } from './wasi-signals.ts';\nimport { sliccTty } from './wasi-termios.ts';\nimport { wasixEpollImports } from './wasix-epoll.ts';\nimport type { ThreadEntry } from './wasix-fork.ts';\nimport { datagramCalls } from './wasix-sockets.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 credGen?: Int32Array;\n\n forked?: { fds: readonly WasiForkFd[]; cloexec: readonly number[] };\n\n preopenRoot?: boolean;\n\n bare?: boolean;\n\n held?: HeldCwd;\n}\n\nexport type WasiFunction = (...args: never[]) => number | undefined;\n\ntype EpollWait = (\n epfd: number,\n events: number,\n max: number,\n timeout: bigint,\n nevents: number\n) => 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_FDCWD = -2;\nconst COPY_EXCL = 1;\nconst COPY_MODE = 2;\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 S_IFLNK = 0o120000;\nconst DEFAULT_UMASK = 0o022;\n\nconst MONOTONIC_BASE = BigInt(Math.round(performance.timeOrigin)) * NS_PER_MS;\n\nconst MAX_READ = 1024 * 1024;\nconst SIGINFO_BYTES = 24;\n\nconst FD_ALIAS =\n /^\\/(?:dev\\/(stdin|stdout|stderr)|dev\\/fd\\/(\\d+)|proc\\/(self|[1-9]\\d*)\\/fd\\/(\\d+))$/;\nconst STDIO_FDS: Readonly<Record<string, number>> = { stdin: 0, stdout: 1, stderr: 2 };\n\ninterface FdAlias {\n fd: number;\n stdio: boolean;\n}\nconst SIGPIPE_EXIT = 128 + SIG.PIPE;\n\nconst SIG_IGN = 1;\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 if (s.isSocket) return FILETYPE.SOCKET_STREAM;\n if (((s.mode ?? 0) & 0o170000) === 0o020000) return FILETYPE.CHARACTER_DEVICE;\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;\nconst DEVICE_MODE = 0o20666;\n\nfunction kernelDev(path: string): boolean {\n return inDev(path) && path !== SEALED_PATH && path !== CLIPBOARD_PATH;\n}\n\nfunction kernelFiletype(kind: string): { filetype: number; seeks: boolean } {\n switch (kind) {\n case 'tty':\n case 'sealed':\n case 'clipboard':\n case 'embedder':\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 'dgram':\n return { filetype: FILETYPE.SOCKET_DGRAM, 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 creds: CredCache;\n private readonly umasks: UmaskCache;\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 strictEpoll = false;\n\n cwdFd = false;\n\n entered = false;\n\n enteredSignals = 0;\n\n raisedOnEntry: (() => number) | undefined;\n\n onRaise: ((sig: number) => boolean) | undefined;\n\n muted: ((fd: number, data: Uint8Array) => boolean) | undefined;\n\n signals: WasiSignals | undefined;\n\n sigmask: WasiSigmask | undefined;\n\n tid = 1;\n\n linkedTls: (() => Array<[number, number]>) | undefined;\n\n threadEntry: ThreadEntry | undefined;\n\n linkedModules: (() => Record<string, WebAssembly.Module>) | undefined;\n\n interrupted: (() => boolean) | undefined;\n\n quietly: <T>(fn: () => T) => T = UNGATED.quiet;\n\n deliverDue: () => void = UNGATED.deliver;\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.held) this.fds.held = o.held;\n this.creds = new CredCache(\n () => this.o.kernel.call({ op: 'proc-cred' }) as Cred,\n o.credGen ?? o.shared\n );\n this.umasks = new UmaskCache(\n (mask) =>\n this.o.kernel.call(\n mask === undefined ? { op: 'proc-umask' } : { op: 'proc-umask', mask }\n ) as number,\n o.credGen ?? o.shared,\n { quiet: (fn) => this.quietly(fn), deliver: () => this.deliverDue() }\n );\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 if (!o.bare) this.fds.setup(o.cwd, o.inherited ?? [], o.preopenRoot === true);\n this.listening = o.shared ? [] : this.fds.sockets();\n }\n\n private fromCwd(raw: string): string {\n return this.fds.cwd() === undefined\n ? this.fds.resolve(3, `${this.cwd}/${raw}`)\n : this.fds.resolve(3, raw);\n }\n\n get cwd(): string {\n return this.fds.cwd() ?? this.startCwd;\n }\n\n umask(mask?: number): number {\n return mask === undefined ? this.umasks.get() : this.umasks.set(mask);\n }\n\n private copyImport(): WasiFunction {\n const { mem, fds } = this;\n const named = (dirfd: number, p: number, l: number): string => {\n const raw = mem.string(p, l);\n if (raw === '') throw new WasiError('ENOENT');\n if (raw.startsWith('/')) return fds.resolve(3, raw);\n return dirfd === AT_FDCWD ? this.fromCwd(raw) : fds.resolve(dirfd, raw);\n };\n return (...args: number[]) => {\n const [srcDirfd, sp, sl, dstDirfd, dp, dl, mode, flags] = args as [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ];\n if (!this.o.fs.copy) return E.NOSYS;\n if ((flags & ~(COPY_EXCL | COPY_MODE)) !== 0) throw new WasiError('EINVAL');\n const from = named(srcDirfd, sp, sl);\n const to = named(dstDirfd, dp, dl);\n const bits = flags & COPY_MODE ? (this.o.fs.stat(from).mode ?? 0) : mode;\n this.copyFile(from, to, bits, (flags & COPY_EXCL) !== 0);\n return E.SUCCESS;\n };\n }\n\n copyFile(from: string, to: string, mode: number, exclusive: boolean): void {\n const { copy } = this.o.fs;\n if (!copy) throw new WasiError('ENOSYS');\n this.fds.flushPath(from);\n copy.call(this.o.fs, from, to, mode & 0o7777 & ~this.umasks.get(), exclusive);\n }\n\n private created(path: string, mode: number): void {\n const umask = this.umasks.get();\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, handle?: number) => {\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, handle);\n };\n const caller = (): [number, number] => {\n const cred = this.creds.get();\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 dev = {\n json: (req: Parameters<WasiHost['o']['kernel']['call']>[0]) => this.o.kernel.call(req),\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 === 'tty') return devSync(dev, devFdStat(fd));\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 fdMode = (fd: number): number => {\n const e = fds.get(fd);\n if (e.type === 'device') return DEVICE_MODE;\n const kind = e.type === 'kernel' ? fds.kind(fd, e) : undefined;\n if (kind === 'stream') return S_IFIFO | 0o600;\n if (kind === 'sealed' || kind === 'clipboard') return SEALED_MODE;\n if (kind !== undefined && kind !== 'file')\n return devSync(dev, devFdStat(fd)).mode ?? DEVICE_MODE;\n return modeOf(this.o.fs.stat(pathOf(fd)));\n };\n const pathOwned = (\n path: string,\n follow: boolean\n ): { uid?: number; gid?: number } | undefined => {\n const alias = this.fdAlias(path);\n if (alias && !follow) return alias.stdio ? ROOT_IDS : undefined;\n if (alias) {\n this.openFd(alias.fd);\n return fdOwned(alias.fd);\n }\n if (this.synthetic(path)) return ROOT_IDS;\n if (kernelDev(path)) return devSync(dev, devStat(path, follow));\n return this.viaDev(path, follow, () => this.statOf(path, follow), pathOwned);\n };\n const pathMode = (path: string, follow: boolean): number => {\n const alias = this.fdAlias(path);\n if (alias && !follow) {\n this.fdTarget(alias);\n return S_IFLNK | 0o777;\n }\n if (alias) {\n this.openFd(alias.fd);\n return fdMode(alias.fd);\n }\n if (this.synthetic(path) && deviceOf(path) === undefined) return SEALED_MODE;\n if (kernelDev(path)) return devSync(dev, devStat(path, follow)).mode ?? DEVICE_MODE;\n const fileMode = (st: SyncFsBridgeStat) => (st.isFifo ? S_IFIFO : 0) | modeOf(st);\n return this.viaDev(path, follow, () => fileMode(this.statOf(path, follow)), pathMode);\n };\n return wrap({\n fd_chown: (fd: number, uid: number, gid: number) => {\n const e = fds.get(fd);\n const handle = e.type === 'file' ? e.file.buffer.handle : undefined;\n void chown(pathOf(fd), uid, gid, true, handle);\n },\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 const path = at(dirfd, p, l);\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\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 const path = at(dirfd, p, l);\n if (!this.o.fs.owners) throw new WasiError('ENOTSUP');\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 path_mkfifo: (dirfd: number, p: number, l: number, mode: number) => {\n const { mkfifo } = this.o.fs;\n if (!mkfifo) return E.NOSYS;\n const raw = mem.string(p, l);\n if (raw === '') throw new WasiError('ENOENT');\n const path =\n dirfd === AT_FDCWD && !raw.startsWith('/') ? this.fromCwd(raw) : at(dirfd, p, l);\n const umask = this.umasks.get();\n const want = mode & 0o7777 & ~umask;\n mkfifo.call(this.o.fs, path, want);\n const made = (this.o.fs.lstat(path).mode ?? 0) & 0o7777;\n if ((made & ~want) !== 0) this.o.fs.chmod(path, made & want);\n return E.SUCCESS;\n },\n path_copy_file: this.copyImport(),\n umask: (mask: number, out: number) => {\n const old = this.umasks.set(mask);\n mem.view().setUint32(out, old, true);\n },\n fd_mode: (fd: number, out: number) => void mem.view().setUint32(out, fdMode(fd), true),\n path_mode: (dirfd: number, p: number, l: number, flags: number, out: number) => {\n const path = at(dirfd, p, l);\n const mode = pathMode(path, (flags & AT_SYMLINK_NOFOLLOW) === 0);\n mem.view().setUint32(out, mode, true);\n },\n });\n }\n\n private lockHost(mem: WasiMemory): LockHost {\n return {\n mem,\n file: (fd) => this.lockedFile(fd),\n flush: (file) => {\n if (file.path !== undefined) this.fds.flushPath(file.path);\n else if (file.target.fd !== undefined) this.o.kernel.sys.flush(file.target.fd);\n },\n locked: () => this.fds.holdLocks(),\n promote: (fd, moved) => this.fds.promote(fd, moved),\n reread: (fd) => this.fds.reread(fd),\n calls: {\n flock: (fd, kind, wait) =>\n this.fds.restarting(() =>\n this.o.kernel.call({ op: 'flock', fd, kind, ...(wait ? { wait } : {}) })\n ),\n set: (target, kind, start, len, wait) =>\n this.fds.restarting(() =>\n this.o.kernel.call({\n op: 'lk-set',\n ...target,\n kind,\n start,\n len,\n ...(wait ? { wait } : {}),\n })\n ),\n get: (target, kind, start, len) =>\n this.o.kernel.call({ op: 'lk-get', ...target, kind, start, len }) as LockHeld | null,\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.creds.get();\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.creds.change(() => this.o.kernel.call({ op: 'proc-setcred', change }) as Cred);\n },\n ...semImports(this),\n ...lockImports(this.lockHost(mem)),\n groups_get: (buf: number, cap: number, count: number) => {\n const { groups } = this.creds.get();\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.creds.change(\n () => this.o.kernel.call({ op: 'proc-setcred', change: { groups } }) as Cred\n );\n },\n sigaction_set: (sig: number, disposition: number, flags: number) => {\n if (!this.signals) return E.NOSYS;\n const errno = this.signals.disposition(sig, disposition, flags);\n if (errno === E.SUCCESS && disposition === SIG_IGN) this.sigmask?.discard(sig);\n return errno;\n },\n sigmask_set: (how: number, lo: number, hi: number, old: number) => {\n if (!this.sigmask) return E.NOSYS;\n if (how === SIG_UNBLOCK || how === SIG_SETMASK) {\n this.signals?.unblocking(how === SIG_UNBLOCK ? lo << 1 : ~(lo << 1));\n }\n return this.sigmask.set(how, lo, hi, (oldLo, oldHi) => {\n if (old === 0) return;\n const view = mem.view();\n view.setUint32(old, oldLo, true);\n view.setUint32(old + 4, oldHi, true);\n });\n },\n sigmask_poll: (\n lo: number,\n hi: number,\n inPtr: number,\n outPtr: number,\n n: number,\n nevents: number\n ) =>\n this.sigmask\n ? this.maskedPoll(this.sigmask, [lo, hi], [inPtr, outPtr, n, nevents])\n : E.NOSYS,\n sigmask_epoll_wait: (\n lo: number,\n hi: number,\n epfd: number,\n events: number,\n max: number,\n timeout: bigint,\n nevents: number\n ) =>\n this.sigmask\n ? this.maskedEpoll(this.sigmask, [lo, hi], nevents, (epoll) =>\n epoll(epfd, events, max, timeout, nevents)\n )\n : E.NOSYS,\n sigwait: (lo: number, _hi: number, timeout: bigint, out: number) => {\n const mask = this.sigmask;\n if (!mask) return E.NOSYS;\n mem.view().setUint32(out, 0, true);\n return mask.sigwait(\n lo,\n timeout,\n (set) => void this.o.kernel.call({ op: 'sig-waiting', tid: mask.tid, set }),\n (sig) => void mem.view().setUint32(out, sig, true),\n this.entered\n );\n },\n sigwait_info: (lo: number, _hi: number, timeout: bigint, info: number) => {\n const mask = this.sigmask;\n if (!mask) return E.NOSYS;\n let took = 0;\n const r = mask.sigwait(\n lo,\n timeout,\n (set) => void this.o.kernel.call({ op: 'sig-waiting', tid: mask.tid, set }),\n (sig) => {\n took = sig;\n },\n this.entered\n );\n if (r === E.SUCCESS) this.writeSiginfo(info, took, mask.tid);\n return r;\n },\n siginfo_take: (sig: number, info: number) =>\n this.writeSiginfo(info, sig, this.sigmask?.tid ?? this.tid, false) ? E.SUCCESS : E.NOENT,\n sigaction_inherited: (out: number) => {\n const bits = this.o.kernel.call({ op: 'sig-inherited' }) as number;\n mem.view().setBigUint64(out, BigInt(libcBits(bits) >>> 0), true);\n return E.SUCCESS;\n },\n sigpending_get: (out: number) => {\n if (!this.sigmask) return E.NOSYS;\n mem.view().setBigUint64(out, BigInt(this.sigmask.pending()), true);\n return E.SUCCESS;\n },\n });\n }\n\n private poll(inPtr: number, outPtr: number, n: number, nevents: number, resume = true): number {\n const ran = this.signals?.ran ?? 0;\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 entered: this.entered,\n ...(resume ? { resumes: () => this.resumesPoll(ran) } : {}),\n },\n inPtr,\n outPtr,\n n,\n nevents\n );\n } finally {\n this.o.fs.invalidate?.();\n }\n }\n\n private resumesPoll(ran: number): boolean {\n this.interrupted?.();\n return (this.signals?.ran ?? 0) === ran;\n }\n\n private maskedPoll(\n mask: WasiSigmask,\n set: [number, number],\n [inPtr, outPtr, n, nevents]: number[]\n ): number {\n const old = mask.swap(set[0], set[1]);\n try {\n this.mem.view().setUint32(nevents, 0, true);\n if (mask.deliverUnblocked()) return E.INTR;\n this.settleEntry(mask);\n if (n > 0) return this.poll(inPtr, outPtr, n, nevents, false);\n return this.entered ? E.INTR : this.suspend();\n } finally {\n mask.deliverUnblocked();\n mask.restore(old);\n }\n }\n\n private epollWait: EpollWait | undefined;\n\n private settleEntry(mask: WasiSigmask): void {\n if (this.entered && (this.enteredSignals & ~mask.blockedBits()) === 0) this.entered = false;\n }\n\n private maskedEpoll(\n mask: WasiSigmask,\n set: [number, number],\n nevents: number,\n wait: (epoll: EpollWait) => number | undefined\n ): number {\n const old = mask.swap(set[0], set[1]);\n try {\n this.mem.view().setUint32(nevents, 0, true);\n if (mask.deliverUnblocked()) return E.INTR;\n this.settleEntry(mask);\n this.epollWait ??= wasixEpollImports(this).epoll_wait as unknown as EpollWait;\n return wait(this.epollWait) ?? E.SUCCESS;\n } finally {\n mask.deliverUnblocked();\n mask.restore(old);\n }\n }\n\n private suspend(): number {\n for (;;) {\n try {\n this.o.kernel.call({ op: 'fd-select', read: [], write: [], timeoutMs: -1 });\n } catch (e) {\n if ((e as { code?: unknown }).code === 'EINTR') return E.INTR;\n throw e;\n }\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 this.poll(inPtr, outPtr, n, nevents),\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 if (this.o.bare) return Object.entries(this.o.env).map(([k, v]) => `${k}=${v}`);\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 follow = (lookup & LOOKUP_SYMLINK_FOLLOW) !== 0;\n try {\n const asked = at(dirfd, p, l);\n const alias = this.fdAlias(asked);\n if (alias && !alias.stdio) this.openFd(alias.fd);\n const path = alias && !alias.stdio ? `/dev/fd/${alias.fd}` : asked;\n if (deviceOf(path)) this.interrupted?.();\n mem\n .view()\n .setUint32(out, fds.open(path, oflags, rights, fdflags, undefined, !follow), true);\n if (fds.created) this.created(path, 0o666);\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') throw err;\n const raw = mem.string(p, l);\n const joined = raw.startsWith('/') ? raw : `${fds.dir(dirfd).path}/${raw}`;\n const resolved = this.resolveForDev(joined, follow);\n if (!resolved) throw err;\n mem\n .view()\n .setUint32(out, fds.open(resolved, oflags, rights, fdflags, undefined, !follow), true);\n }\n },\n path_filestat_get: (dirfd: number, lookup: number, p: number, l: number, out: number) => {\n try {\n this.writeFilestat(out, this.pathFilestat(at(dirfd, p, l), lookup));\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') throw err;\n const raw = mem.string(p, l);\n const joined = raw.startsWith('/') ? raw : `${fds.dir(dirfd).path}/${raw}`;\n const resolved = this.resolveForDev(joined, (lookup & LOOKUP_SYMLINK_FOLLOW) !== 0);\n if (!resolved) throw err;\n this.writeFilestat(out, this.pathFilestat(resolved, lookup));\n }\n },\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 if (inDevTree(path)) return void o.fs.unlink(path);\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 if (replaced === undefined) fds.replacing(to);\n const seq = o.fs.rename(from, to);\n fds.renamed(from, to, replaced);\n fds.ownRename(typeof seq === 'number' ? seq : undefined);\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 path = at(dirfd, p, l);\n const alias = this.fdAlias(path);\n const target = new TextEncoder().encode(alias ? this.fdTarget(alias) : o.fs.readlink(path));\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 if (this.fds.datagram(fd, e)) {\n return datagramCalls(this).recvFrom(\n fd,\n e.nonblock,\n iovs,\n n,\n riflags,\n outLen,\n outFlags,\n 0\n );\n }\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 lockedFile(fd: number): LockedFile {\n const e = this.fds.get(fd);\n if (e.type === 'file') {\n const { file } = e;\n return {\n target: { path: file.path },\n path: file.path,\n readable: file.readable,\n writable: file.writable,\n offset: () => file.offset,\n size: () => file.size(),\n };\n }\n if (e.type !== 'kernel') throw new WasiError('EBADF');\n if (this.fds.kind(fd, e) !== 'file') return { target: { fd }, offset: () => 0, size: () => 0 };\n return {\n target: { fd },\n offset: () => this.o.kernel.sys.seek(fd, 0, WHENCE.CUR),\n size: () => this.kernelStat(fd).size,\n };\n }\n\n private kernelStat(fd: number): { path?: string; size: number; orphan?: true } {\n return this.o.kernel.call({ op: 'fd-vfs-stat', fd }) as {\n path?: string;\n size: number;\n orphan?: true;\n };\n }\n\n private write(fd: number, data: Uint8Array): number {\n 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') this.brokenPipe();\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 brokenPipe(): void {\n let action: unknown;\n try {\n action = this.o.kernel.call({ op: 'proc-kill-self', sig: SIG.PIPE, dry: true });\n } catch {\n action = 'terminate';\n }\n if (action === 'ignore') return;\n if (action === 'terminate' && !this.sigmask?.blocks(SIG.PIPE)) throw new WasiExit(SIGPIPE_EXIT);\n this.o.kernel.call({ op: 'thread-kill', tid: this.tid, sig: SIG.PIPE });\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') this.fds.synced(e.file);\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(this.fds.datagram(fd, e) ? 'dgram' : 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 let rights = seeks ? RIGHTS.ALL : RIGHTS.ALL & ~(RIGHTS.FD_SEEK | RIGHTS.FD_TELL);\n if (e.type === 'kernel') {\n const access = this.o.kernel.sys.access?.(fd);\n if (access === 'read') rights &= ~RIGHTS.FD_WRITE;\n else if (access === 'write') rights &= ~RIGHTS.FD_READ;\n }\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()) {\n const bound = buffer.bound;\n if (!bound) return this.statOrphanable(file.path, file.size(), false, true);\n return { ...this.sized(file.path, bound, file.size()), nlink: 0n };\n }\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 const bound = buffer.bound;\n if (s && bound?.ino !== undefined && s.ino !== bound.ino) {\n s = this.keptStat(buffer.handle) ?? bound;\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 (path === EMBEDDER_PATH && !!this.o.kernel.sys.openEmbedder)\n );\n }\n\n private linkedDev(path: string, follow: boolean): string | undefined {\n if (!follow) return undefined;\n const real = physicalLeaf(this.o.fs, path);\n return real !== undefined && real !== path && kernelDev(real) ? real : undefined;\n }\n\n private statOf(path: string, follow: boolean): SyncFsBridgeStat {\n return follow ? this.o.fs.stat(path) : this.o.fs.lstat(path);\n }\n\n private viaDev<T>(\n path: string,\n follow: boolean,\n stat: () => T,\n device: (path: string, follow: boolean) => T\n ): T {\n try {\n return stat();\n } catch (err) {\n const linked = (err as { code?: string }).code === 'ENOENT' && this.linkedDev(path, follow);\n if (!linked) throw err;\n return device(linked, true);\n }\n }\n\n private devChar(path: string, follow: boolean): boolean {\n try {\n const json = (req: Parameters<WasiHost['o']['kernel']['call']>[0]) => this.o.kernel.call(req);\n const st = devSync({ json }, devStat(path, follow));\n return ((st.mode ?? 0) & 0o170000) === 0o020000;\n } catch {\n return false;\n }\n }\n\n private resolveForDev(path: string, follow = true): string | undefined {\n try {\n if (!follow) {\n const slash = path.lastIndexOf('/');\n if (slash <= 0) return undefined;\n const parent = physicalLeaf(this.o.fs, path.slice(0, slash));\n const resolved = parent === undefined ? undefined : `${parent}/${path.slice(slash + 1)}`;\n return resolved !== undefined && resolved !== path && this.synthetic(resolved)\n ? resolved\n : undefined;\n }\n const resolved = physicalLeaf(this.o.fs, path);\n return resolved !== undefined && resolved !== path && this.synthetic(resolved)\n ? resolved\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n private writeSiginfo(at: number, sig: number, tid: number, waited = true): boolean {\n const taken = this.o.kernel.call({ op: 'sig-info', sig, tid }) as SigInfo | null;\n if (!taken && !waited) return false;\n const info = taken ?? KERNEL_SIGINFO;\n const view = this.mem.view();\n const size = Math.min(view.getUint32(at, true), SIGINFO_BYTES);\n const fields = [sig, info.code, info.pid, info.uid, info.status];\n let filled = 4;\n for (const [i, value] of fields.entries()) {\n if (4 + (i + 1) * 4 > size) break;\n view.setInt32(4 + at + i * 4, value, true);\n filled = 4 + (i + 1) * 4;\n }\n view.setUint32(at, filled, true);\n return true;\n }\n\n private fdAlias(path: string): FdAlias | undefined {\n const m = FD_ALIAS.exec(path);\n if (!m) return undefined;\n if (m[1]) return { fd: STDIO_FDS[m[1]] as number, stdio: true };\n if (m[3] !== undefined && m[3] !== 'self' && Number(m[3]) !== this.o.pid) return undefined;\n return { fd: Number(m[2] ?? m[4]), stdio: false };\n }\n\n private openFd(fd: number): void {\n try {\n this.fds.get(fd);\n } catch {\n throw new WasiError('ENOENT');\n }\n }\n\n private fdTarget(alias: FdAlias): string {\n if (alias.stdio) return `/proc/self/fd/${alias.fd}`;\n this.openFd(alias.fd);\n const e = this.fds.get(alias.fd);\n if (e.type === 'file') return e.file.path;\n if (e.type === 'dir') return e.path;\n if (e.type === 'device') return `/dev/${e.device}`;\n const kind = e.type === 'kernel' ? this.fds.kind(alias.fd, e) : undefined;\n if (kind === 'file') {\n const vfs = this.kernelStat(alias.fd);\n if (vfs.path) return vfs.path;\n }\n if (kind === 'tty') return '/dev/tty';\n if (kind === 'device') return '/dev/null';\n if (kind === 'stream') {\n const { fifo } = this.o.kernel.call({ op: 'fd-info', fd: alias.fd }) as FdInfo;\n if (fifo !== undefined) return fifo;\n }\n const ino = this.fdFilestat(alias.fd).ino;\n if (kind === 'stream') return `pipe:[${ino}]`;\n if (kind === 'socket') return `socket:[${ino}]`;\n return `anon_inode:[${kind ?? 'fd'}]`;\n }\n\n private aliasFilestat(path: string, alias: FdAlias, lookup: number): Filestat {\n if ((lookup & LOOKUP_SYMLINK_FOLLOW) === 0) {\n const target = this.fdTarget(alias);\n return this.local({\n filetype: FILETYPE.SYMBOLIC_LINK,\n size: BigInt(new TextEncoder().encode(target).length),\n ino: pathInode(path),\n mtimeNs: 0n,\n });\n }\n this.openFd(alias.fd);\n return this.fdFilestat(alias.fd);\n }\n\n private pathFilestat(path: string, lookup: number): Filestat {\n const alias = this.fdAlias(path);\n if (alias) return this.aliasFilestat(path, alias, lookup);\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 try {\n return filestatOf(path, follow ? this.o.fs.stat(path) : this.o.fs.lstat(path));\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') throw err;\n const device = kernelDev(path) ? path : this.linkedDev(path, follow);\n const alias = device && device !== path ? this.fdAlias(device) : undefined;\n if (device && alias) return this.aliasFilestat(device, alias, lookup);\n if (device && this.devChar(device, true)) {\n return this.local({\n filetype: FILETYPE.CHARACTER_DEVICE,\n size: 0n,\n ino: pathInode(device),\n mtimeNs: 0n,\n });\n }\n const resolved = this.resolveForDev(path, follow);\n if (!resolved) throw err;\n return this.local({\n filetype: FILETYPE.CHARACTER_DEVICE,\n size: 0n,\n ino: pathInode(resolved),\n mtimeNs: 0n,\n });\n }\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) {\n dir.listing = this.fds.goneCwd(dir) ? { names: [], stats: new Map() } : this.list(dir.path);\n }\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 ops = req.ops ?? [];\n const { stdio, inherit, cwd, opened } = this.childFds(ops);\n const moved = ops.some((op) => op.cmd === 'chdir' || op.cmd === 'fchdir');\n try {\n const spawn = {\n op: 'proc-spawn' as const,\n file: this.locate(req.name, req.search, req.path),\n ...(req.search ? {} : { search: false as const }),\n argv: req.argv.length > 0 ? req.argv : [req.name],\n env: req.env ?? this.environment(),\n cwd,\n ...(moved ? { chdir: true as const } : {}),\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 ...(this.host.sigmask ? { blocked: this.host.sigmask.inherited() } : {}),\n ...(this.host.linkedTls ? { tls: this.host.linkedTls() } : {}),\n ...(this.host.linkedModules ? { modules: this.host.linkedModules() } : {}),\n };\n if (this.host.threadEntry) wasi.entry = this.host.threadEntry;\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 ConnectOptions {\n host: string;\n port: number;\n nonblock?: boolean;\n}\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 copyFile(from: string, to: string, options?: { mode?: number; excl?: boolean }): void;\n };\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 net: {\n connect(options: ConnectOptions): number;\n ready(fd: number): number;\n };\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 sizedOf = (fd: number): { path?: string | undefined; size?: number } => {\n const e = host.fds.get(fd);\n if (e.type === 'file') return { path: e.file.path, size: e.file.size() };\n if (e.type === 'kernel' && host.fds.kind(fd, e) === 'file') {\n return call({ op: 'fd-vfs-stat', fd }) as { path?: string; size: number };\n }\n return { path: pathOf(fd) };\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 const fresh = o.create === true && o.exclusive === true && owners && fs.create !== undefined;\n const existed = !fresh && 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 flags = o.append ? FDFLAGS.APPEND : 0;\n const fd = host.fds.open(\n abs,\n oflags,\n rights,\n flags,\n fresh ? o.mode : undefined,\n o.nofollow === true\n );\n if (o.mode !== undefined && !existed && !fresh) 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, size } = sizedOf(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 if (size === undefined) 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: 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 host.fds.promote(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), 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: Object.assign(Object.create(fs) as SyncFsPosixBridge, {\n copyFile(from: string, to: string, options: { mode?: number; excl?: boolean } = {}) {\n const at = (p: string) => host.fds.resolve(3, p.startsWith('/') ? p : `${host.cwd}/${p}`);\n host.copyFile(at(from), at(to), options.mode ?? 0o666, options.excl === true);\n },\n }),\n fds,\n syscall: (req) =>\n req.op === 'proc-umask' ? host.umask((req as { mask?: number }).mask) : call(req),\n net: network(raw, 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\nconst LOOPBACK = /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\nconst SOL_SOCKET = 1;\nconst SO_ERROR = 4;\n\nfunction loopbackHost(host: unknown): string {\n if (host === 'localhost') return '127.0.0.1';\n if (typeof host === 'string' && LOOPBACK.test(host)) return host;\n throw new WasiError('EINVAL');\n}\n\nfunction network(raw: Raw, call: (req: Request) => unknown): ImportsContext['net'] {\n return {\n connect({ host, port, nonblock = false }) {\n const to = loopbackHost(host);\n if (!Number.isInteger(port) || port < 1 || port > 65535) throw new WasiError('EINVAL');\n const fd = call({ op: 'sock-open', domain: 'inet' }) as number;\n const addr = { family: 'inet', host: to, port };\n const r = raw({ op: 'sock-connect', fd, addr, ...(nonblock ? { nonblock: true } : {}) });\n if (r.ok || (nonblock && r.errno === 'EINPROGRESS')) return fd;\n raw({ op: 'fd-close', fd });\n throw new WasiError(r.errno);\n },\n ready(fd) {\n const sel = call({ op: 'fd-select', read: [], write: [fd], timeoutMs: 0 }) as {\n write: number[];\n };\n if (!sel.write.includes(fd)) return E.INPROGRESS;\n return call({ op: 'sock-getopt', fd, level: SOL_SOCKET, name: SO_ERROR }) as number;\n },\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 ...(o.cwd !== undefined ? { chdir: true as const } : {}),\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 { HeldCwdInit } from './protocol.ts';\n\nexport const CWD_SLOTS = 1024;\n\nexport const UNTRACKED = CWD_SLOTS - 1;\n\nexport interface HeldCwdReply {\n slot?: number;\n seen?: number;\n dead?: boolean;\n}\n\nexport interface CwdAnswer {\n gen: number;\n alive: boolean;\n slot?: number;\n}\n\ninterface Held {\n path: string;\n ino: string | number | undefined;\n refs: number;\n dead: boolean;\n verified: number;\n}\n\nexport type InodeOf = (path: string) => Promise<string | number | undefined>;\n\nconst under = (path: string, changed: string): boolean =>\n changed === '/' || path === changed || path.startsWith(`${changed}/`);\n\nexport class CwdTable {\n readonly sab = new SharedArrayBuffer(CWD_SLOTS * 4);\n private readonly view = new Int32Array(this.sab);\n private readonly held = new Map<number, Held>();\n private readonly free: number[] = [];\n private next = 0;\n checks = 0;\n private readonly inodeOf: InodeOf;\n\n constructor(inodeOf: InodeOf) {\n this.inodeOf = inodeOf;\n }\n\n async hold(path: string, from?: number): Promise<number> {\n const shared = from === undefined ? undefined : this.held.get(from);\n if (shared && shared.path === path) return this.share(from);\n const ino = await this.inodeOf(path).catch(() => undefined);\n const slot = this.free.pop() ?? (this.next < UNTRACKED ? this.next++ : UNTRACKED);\n if (slot === UNTRACKED) return slot;\n this.held.set(slot, {\n path,\n ino,\n refs: 1,\n dead: false,\n verified: Atomics.load(this.view, slot),\n });\n return slot;\n }\n\n share(slot: number | undefined): number {\n const held = slot === undefined ? undefined : this.held.get(slot);\n if (!held) return UNTRACKED;\n held.refs++;\n return slot as number;\n }\n\n release(slot: number | undefined): void {\n const held = slot === undefined ? undefined : this.held.get(slot);\n if (!held || --held.refs > 0) return;\n this.held.delete(slot as number);\n Atomics.add(this.view, slot as number, 1);\n this.free.push(slot as number);\n }\n\n stateOf(slot: number): { seen: number; dead: boolean } {\n const held = this.held.get(slot);\n return { seen: held?.verified ?? Atomics.load(this.view, slot), dead: held?.dead === true };\n }\n\n touched(paths: readonly string[], trees: readonly string[] = []): void {\n if (this.held.size === 0) return;\n for (const [slot, held] of this.held) {\n if (held.dead) continue;\n if (paths.some((p) => under(held.path, p)) || trees.some((t) => under(held.path, t))) {\n Atomics.add(this.view, slot, 1);\n }\n }\n }\n\n async check(slot: number): Promise<CwdAnswer> {\n this.checks++;\n const gen = Atomics.load(this.view, slot);\n const held = this.held.get(slot);\n if (!held) return { gen, alive: true };\n if (!held.dead) {\n const ino = await this.inodeOf(held.path).catch(() => null);\n held.dead = ino === null || (held.ino !== undefined && ino !== held.ino);\n held.verified = gen;\n }\n return { gen, alive: !held.dead };\n }\n}\n\nexport class HeldCwd {\n private readonly view: Int32Array;\n private seen: number;\n private dead = false;\n private slot: number;\n private at: string | undefined;\n private readonly ask: () => CwdAnswer;\n\n constructor(\n sab: SharedArrayBuffer,\n slot: number,\n ask: () => CwdAnswer,\n state: { seen: number; dead: boolean; path?: string }\n ) {\n this.view = new Int32Array(sab);\n this.slot = slot;\n this.ask = ask;\n this.seen = state.seen;\n this.dead = state.dead;\n this.at = state.path;\n }\n\n moved(reply: HeldCwdReply, path?: string): boolean {\n if (reply.slot === undefined) return false;\n this.slot = reply.slot;\n this.seen = reply.seen ?? Atomics.load(this.view, reply.slot);\n this.dead = reply.dead === true;\n this.at = path;\n return true;\n }\n\n private follow(): boolean {\n const answer = this.ask();\n if (answer.slot !== undefined) this.slot = answer.slot;\n this.seen = answer.gen;\n this.dead = !answer.alive;\n return answer.alive;\n }\n\n alive(path?: string): boolean {\n if (path !== undefined && this.at !== undefined && path !== this.at) {\n this.at = path;\n return this.follow();\n }\n if (this.dead) return false;\n if (Atomics.load(this.view, this.slot) === this.seen) return true;\n return this.follow();\n }\n\n get current(): number {\n return this.slot;\n }\n}\n\nexport interface HeldOptions {\n cwds?: SharedArrayBuffer;\n cwdSlot?: number;\n cwdState?: { seen: number; dead: boolean };\n cwdCheck?: () => Promise<CwdAnswer>;\n cwdChdir?: (path: string) => Promise<HeldCwdReply>;\n}\n\nexport function heldInit(o: HeldOptions): { held?: HeldCwdInit } {\n if (!o.cwds || o.cwdSlot === undefined) return {};\n const state = o.cwdState ?? { seen: 0, dead: false };\n return { held: { sab: o.cwds, slot: o.cwdSlot, ...state } };\n}\n\nexport function heldHooks(o: HeldOptions): Pick<HeldOptions, 'cwdCheck' | 'cwdChdir'> {\n if (!o.cwdCheck || !o.cwdChdir) return {};\n return { cwdCheck: o.cwdCheck, cwdChdir: o.cwdChdir };\n}\n\nexport function inheritedCwd(chdir: boolean | undefined, parent: number | undefined) {\n return chdir ? undefined : parent;\n}\n", "import type { HeldCwd, HeldCwdReply } from '../kernel/held-cwd.ts';\n\nexport const DELETED = ' (deleted)';\n\nexport const relativeHere = (path: string): boolean =>\n !path.startsWith('/') && path.split('/')[0] !== '..';\n\nexport const cwdFor = (cwd: string, held: HeldCwd | undefined, path: string): string =>\n held && relativeHere(path) && !held.alive() ? `${cwd}${DELETED}` : cwd;\n\nexport interface HeldCwdFs {\n chdir?(path: string): void;\n cwd?(): string;\n sliccHeldCwd?(): string;\n sliccCwdGone?(): boolean;\n}\n\nexport function holdingCwd(\n Fs: HeldCwdFs,\n held: HeldCwd,\n chdirred: (path: string) => HeldCwdReply\n): void {\n const { chdir, cwd } = Fs;\n if (!chdir || !cwd) return;\n Fs.sliccHeldCwd = () => cwd.call(Fs);\n Fs.sliccCwdGone = () => !held.alive();\n Fs.cwd = () => {\n const path = cwd.call(Fs);\n return held.alive() ? path : `${path}${DELETED}`;\n };\n Fs.chdir = (path: string) => {\n chdir.call(Fs, path);\n held.moved(chdirred(cwd.call(Fs)));\n };\n}\n", "declare const SLICC_VERSION: string | undefined;\n\nexport const KERNEL_VERSION = typeof SLICC_VERSION === 'string' ? SLICC_VERSION : '0.0.0-dev';\nexport const OS_RELEASE = '6.0.0-slicc';\n\nexport function procVersion(): string {\n return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC\\n`;\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport { JsCallError, type JsKernel } from './js-kernel.ts';\n\nexport interface SyncSpawnKernel {\n json(req: SyncSabRequestBody): unknown;\n raw(req: SyncSabRequestBody): SyncFsResult;\n}\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 parentDeathSignal?: number | `SIG${string}`;\n stdin?: JsStdio;\n stdout?: JsStdio;\n stderr?: JsStdio;\n fds?: Readonly<Record<number, number>>;\n}\n\nexport interface JsExited {\n status: number;\n signal?: number;\n stopped?: true;\n}\n\nexport interface JsWaitOptions {\n untraced?: boolean;\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(options?: JsWaitOptions): 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 if ((status & 0xff) === 0x7f)\n return { status: 128 + ((status >> 8) & 0xff), signal: (status >> 8) & 0xff, stopped: true };\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(\n kernel: JsKernel,\n io: ChildIo,\n defaults: ChildDefaults,\n sync: SyncSpawnKernel\n) {\n const wait = async (pid: number, options: JsWaitOptions = {}): Promise<JsExited> => {\n if (typeof options !== 'object' || options === null) throw new JsCallError('EINVAL', 'wait');\n const untraced = options.untraced === true ? { untraced: true } : {};\n const r = await kernel.blocking({ op: 'proc-wait', pid, nohang: false, ...untraced });\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: (options?: JsWaitOptions) => wait(pid, options),\n kill: (signal?: number | `SIG${string}`) => kill(pid, signal),\n };\n };\n\n const request = (o: JsSpawnOptions) => {\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 death = deathOf(o.parentDeathSignal, defaults);\n const inherit = fdsOf(o.fds);\n return (stdio: Slot[]): SyncSabRequestBody => ({\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 ...(o.cwd !== undefined ? { chdir: true as const } : {}),\n stdio,\n ...(inherit.length > 0 ? { inherit } : {}),\n ...group,\n ...death,\n });\n };\n\n const spawnSync = (o: JsSpawnOptions): JsChild => {\n const spawning = request(o);\n const mine: Array<number | undefined> = [];\n const theirs: number[] = [];\n try {\n const stdio = slotsSync(sync, o, mine, theirs);\n return childOf(sync.json(spawning(stdio)) as number, mine);\n } catch (err) {\n closeAllSync(sync, mine);\n throw err;\n } finally {\n closeAllSync(sync, theirs);\n }\n };\n\n const spawn = async (o: JsSpawnOptions): Promise<JsChild> => {\n const spawning = request(o);\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(spawning(stdio))) 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, spawnSync };\n}\n\nexport function fdsOf(fds: unknown): Array<{ fd: number; kernel: number }> {\n if (fds === undefined) return [];\n if (typeof fds !== 'object' || fds === null || Array.isArray(fds)) {\n throw new JsCallError('EINVAL', 'spawn');\n }\n return Object.entries(fds).map(([key, from]) => {\n const fd = Number(key);\n const valid = Number.isInteger(fd) && fd >= 3 && String(fd) === key;\n if (!valid || !Number.isInteger(from) || (from as number) < 0) {\n throw new JsCallError('EINVAL', 'spawn');\n }\n return { fd, kernel: from as number };\n });\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\nfunction deathOf(signal: unknown, defaults: ChildDefaults): { deathSignal?: number } {\n if (signal === undefined) return {};\n if (typeof signal !== 'number' && typeof signal !== 'string') {\n throw new JsCallError('EINVAL', 'spawn');\n }\n return { deathSignal: defaults.signal(signal as number | `SIG${string}`) };\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\nfunction closeAllSync(sync: SyncSpawnKernel, fds: ReadonlyArray<number | undefined>): void {\n for (const fd of fds) if (fd !== undefined) sync.raw({ op: 'fd-close', fd });\n}\n\nfunction checked(hows: readonly JsStdio[]): number[] {\n const fds: number[] = [];\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 fds.push(how === 'inherit' ? n : how);\n }\n return fds;\n}\n\nasync function preflight(kernel: JsKernel, hows: readonly JsStdio[]): Promise<void> {\n for (const fd of checked(hows)) await kernel.json({ op: 'fd-info', fd });\n}\n\nfunction slot(\n n: number,\n how: JsStdio,\n pipe: () => [number, number],\n mine: Array<number | undefined>,\n theirs: number[]\n): Slot {\n if (how === 'inherit') return { fd: n };\n if (how === 'null') return { none: true };\n if (typeof how === 'number') return { fd: how };\n const [read, write] = pipe();\n mine[n] = n === 0 ? write : read;\n theirs.push(n === 0 ? read : write);\n return { fd: n === 0 ? read : write };\n}\n\nfunction slotsSync(\n sync: SyncSpawnKernel,\n o: JsSpawnOptions,\n mine: Array<number | undefined>,\n theirs: number[]\n): Slot[] {\n const hows = STDIO.map((name) => o[name] ?? ('inherit' as const));\n for (const fd of checked(hows)) sync.json({ op: 'fd-info', fd });\n const pipe = () => sync.json({ op: 'fd-pipe' }) as [number, number];\n return hows.map((how, n) => slot(n, how, pipe, mine, theirs));\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 const pair = how === 'pipe' ? ((await kernel.json({ op: 'fd-pipe' })) as [number, number]) : [];\n stdio.push(slot(n, how, () => pair as [number, number], mine, theirs));\n }\n return stdio;\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 { isKernelLoopbackHost } from '../../kernel/net/loopback-names.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 streamingBodies?: boolean;\n}\n\ninterface Hop {\n url: string;\n method: string;\n headers: [string, string][];\n body: Uint8Array | undefined;\n stream?: ReadableStream<Uint8Array>;\n}\n\nconst CHUNK = 64 * 1024;\nconst MAX_REDIRECTS = 20;\nconst keptRequests = new WeakMap<ReadableStream<Uint8Array>, Request>();\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 cut(err: unknown): unknown {\n if (!(err instanceof JsCallError) || err.code !== 'EIO') return err;\n return Object.assign(new Error('other side closed'), {\n name: 'SocketError',\n code: 'UND_ERR_SOCKET',\n });\n}\n\nfunction givenNames(given: HeadersInit | undefined): string[] {\n if (given === undefined || given instanceof Headers) return [];\n const pairs = Array.isArray(given) ? given : Object.entries(given);\n return pairs.map((pair) => String(pair[0]).toLowerCase());\n}\n\nfunction inOrder(headers: Headers, given: HeadersInit | undefined): [string, string][] {\n const all = new Map(headers);\n const out: [string, string][] = [];\n for (const name of [...givenNames(given), ...all.keys()]) {\n const value = all.get(name);\n if (value === undefined) continue;\n all.delete(name);\n out.push([name, value]);\n }\n return out;\n}\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 local(url: string): boolean {\n return isKernelLoopbackHost(new URL(url).hostname);\n}\n\nconst BAD_PORTS = new Set([\n 1, 7, 9, 11, 13, 15, 17, 19, 20, 21, 22, 23, 25, 37, 42, 43, 53, 69, 77, 79, 87, 95, 101, 102,\n 103, 104, 109, 110, 111, 113, 115, 117, 119, 123, 135, 137, 139, 143, 161, 179, 389, 427, 465,\n 512, 513, 514, 515, 526, 530, 531, 532, 540, 548, 554, 556, 563, 587, 601, 636, 989, 990, 993,\n 995, 1719, 1720, 1723, 2049, 3659, 4045, 4190, 5060, 5061, 6000, 6566, 6665, 6666, 6667, 6668,\n 6669, 6697, 10080,\n]);\n\nfunction badPort(url: URL): boolean {\n const port = url.port ? Number(url.port) : 0;\n return port !== 0 && BAD_PORTS.has(port);\n}\n\nfunction checkUrl(url: string): void {\n const parsed = new URL(url);\n const { protocol } = parsed;\n if (protocol !== 'http:' && protocol !== 'https:') {\n throw failed(new JsCallError('EPROTONOSUPPORT', protocol));\n }\n if (badPort(parsed)) throw failed(new Error('bad port'));\n}\n\nfunction rewrite(hop: Hop, status: number, location: string): Hop {\n const next = new URL(location, hop.url);\n checkUrl(next.href);\n if (local(next.href) && !local(hop.url)) {\n const from = new URL(hop.url).origin;\n throw failed(\n new JsCallError('EACCES', `a redirect from ${from} into the kernel's loopback: ${next.href}`)\n );\n }\n const toGet =\n ((status === 301 || status === 302) && hop.method === 'POST') ||\n (status === 303 && hop.method !== 'GET' && hop.method !== 'HEAD');\n if (hop.stream && !toGet) {\n throw failed(new JsCallError('EIO', `a ${status} redirect would send a streamed body again`));\n }\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\nfunction streams(\n known: FetchTraits,\n request: Request,\n init: RequestInit | undefined,\n url: string\n): boolean {\n if (known.streamingBodies !== true || !(init?.body instanceof ReadableStream)) return false;\n return request.method !== 'GET' && request.method !== 'HEAD' && !local(url);\n}\n\nasync function pump(\n kernel: JsKernel,\n handle: number,\n stream: ReadableStream<Uint8Array>,\n signal: AbortSignal\n): Promise<void> {\n const reader = stream.getReader();\n const stop = (): void => void reader.cancel(signal.reason).catch(() => undefined);\n signal.addEventListener('abort', stop, { once: true });\n try {\n await pumpFrom(kernel, handle, reader, signal);\n } finally {\n signal.removeEventListener('abort', stop);\n }\n}\n\nasync function pumpFrom(\n kernel: JsKernel,\n handle: number,\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal: AbortSignal\n): Promise<void> {\n for (;;) {\n let bytes: Uint8Array;\n try {\n const next = await reader.read();\n if (next.done) break;\n bytes = bytesOf(next.value);\n } catch (err) {\n await reader.cancel(err).catch(() => undefined);\n await kernel.raw({ op: 'net-close', handle });\n return;\n }\n if (bytes.length === 0) continue;\n const taken = await kernel.blocking({ op: 'net-write', handle, bytes }, signal).then(\n () => true,\n () => false\n );\n if (!taken) {\n await reader.cancel().catch(() => undefined);\n return;\n }\n }\n await kernel.raw({ op: 'net-end', handle });\n}\n\nexport function fetchOp(kernel: JsKernel) {\n const traits = new Map<boolean, Promise<FetchTraits>>();\n const traitsOf = (url: string): Promise<FetchTraits> => {\n const own = local(url);\n const known =\n traits.get(own) ?? (kernel.json({ op: 'net-traits', url }) as Promise<FetchTraits>);\n traits.set(own, known);\n known.catch(() => {\n traits.delete(own);\n });\n return known;\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.stream ? { stream: true } : hop.body ? { body: hop.body } : {}),\n })) as number;\n if (hop.stream) void pump(kernel, handle, hop.stream, signal);\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, request: Request): ReadableStream<Uint8Array> => {\n const { signal } = request;\n let aborted: (() => void) | undefined;\n const settle = (): void => {\n if (aborted) signal.removeEventListener('abort', aborted);\n };\n const stream = 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 : new TypeError('terminated', { cause: cut(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 keptRequests.set(stream, request);\n return stream;\n };\n\n const respond = (\n head: HttpHead,\n method: string,\n redirected: boolean,\n encoded: boolean,\n request: Request\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, request);\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-length');\n keptRequests.set(stream, request);\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 const traitsAt = (at: string): Promise<FetchTraits> =>\n traitsOf(at).catch((err: unknown) => {\n throw failed(err);\n });\n\n const redirect = async (\n hop: Hop,\n status: number,\n location: string,\n known: FetchTraits\n ): Promise<[Hop, FetchTraits]> => {\n const next = rewrite(hop, status, location);\n return [next, local(next.url) === local(hop.url) ? known : await traitsAt(next.url)];\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 checkUrl(request.url);\n let known = await traitsAt(request.url);\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 streamed = streams(known, request, init, url);\n const bytes = streamed ? undefined : 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: inOrder(request.headers, init?.headers),\n body: bytes,\n ...(streamed && request.body ? { stream: request.body } : {}),\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, request);\n }\n await close(head.handle);\n if (request.redirect === 'error') throw failed(new Error('unexpected redirect'));\n if (hops >= MAX_REDIRECTS) throw failed(new JsCallError('ELOOP', hop.url));\n [hop, known] = await redirect(hop, head.status, location, known);\n }\n };\n}\n", "import { E } from '../wasi/wasi-abi.ts';\nimport { JsCallError, type JsKernel } from './js-kernel.ts';\nimport type { JsSyncKernel } from './js-sync.ts';\n\nexport interface JsAddress {\n host: string;\n port: number;\n}\n\nexport interface JsTlsSession {\n readonly path: 'transport' | 'kernel';\n readonly substitutes: boolean;\n readonly verified?: boolean;\n readonly verifiedBy?: 'bundled' | 'none';\n readonly protocol: 'transport' | 'TLSv1.2' | 'TLSv1.3';\n readonly alpnProtocol: string | false;\n readonly authorized: boolean;\n readonly authorizationError?: string;\n readonly servername: string;\n readonly peerCertificates?: readonly Uint8Array[];\n readonly cipher?: JsTlsCipher;\n readonly clientCertificate?: boolean;\n readonly sni?: boolean;\n readonly hostnameChecked?: boolean;\n readonly hostnameMatches?: boolean;\n readonly chainError?: string;\n readonly keylog?: readonly string[];\n}\n\nexport interface JsTlsCipher {\n readonly name: string;\n readonly standardName: string;\n readonly version: 'TLSv1.0' | 'TLSv1.2' | 'TLSv1.3';\n}\n\nexport interface JsTlsOptions {\n servername?: string;\n alpn?: string[];\n rejectUnauthorized?: boolean;\n ca?: unknown;\n path?: 'kernel' | 'transport';\n cert?: unknown;\n key?: unknown;\n passphrase?: string;\n pfx?: unknown;\n sni?: boolean;\n checkHostname?: boolean;\n server?: boolean;\n requestCert?: boolean;\n handshakeTimeout?: number;\n keylog?: boolean;\n select?: JsTlsSelect;\n}\n\nexport interface JsTlsOffer {\n servername: string;\n protocols: string[];\n}\n\nexport interface JsTlsChoice {\n context?: JsTlsContext | number;\n alpn?: string;\n refuse?: string | number;\n}\n\nexport type JsTlsSelect = (\n offer: JsTlsOffer\n) => JsTlsChoice | undefined | Promise<JsTlsChoice | undefined>;\n\nexport interface JsTlsContext {\n readonly fd: number;\n close(): Promise<void>;\n}\n\nexport interface JsTlsContextOptions {\n cert: unknown;\n key: unknown;\n passphrase?: string;\n}\n\nexport interface JsTlsServerSession {\n readonly path: 'kernel';\n readonly protocol: 'TLSv1.2' | 'TLSv1.3';\n readonly alpnProtocol: string | false;\n readonly servername: string;\n readonly authorized: boolean;\n readonly authorizationError?: string;\n readonly peerCertificates: readonly Uint8Array[];\n readonly cipher: JsTlsCipher;\n readonly keylog?: readonly string[];\n}\n\nexport interface JsConnection {\n readonly fd: number;\n readonly tls?: JsTlsSession;\n readonly local: JsAddress;\n readonly remote: JsAddress;\n readonly readable: ReadableStream<Uint8Array>;\n readonly writable: WritableStream<Uint8Array>;\n close(): Promise<void>;\n reset(): 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 tls?: JsTlsOptions;\n}\n\nexport interface JsConnectOptions {\n host?: string;\n port?: number;\n signal?: AbortSignal;\n tls?: JsTlsOptions;\n socket?: JsConnection;\n}\n\nexport interface JsResolveOptions {\n family?: 0 | 4 | 6;\n signal?: AbortSignal;\n}\n\nexport interface JsNet {\n listen(options?: JsListenOptions): Promise<JsListener>;\n connect(options: JsConnectOptions): Promise<JsConnection>;\n secure(conn: JsConnection, tls: JsTlsOptions): Promise<JsConnection>;\n tlsContext(options: JsTlsContextOptions): Promise<JsTlsContext>;\n resolve(name: string, options?: JsResolveOptions): Promise<string[]>;\n adopt(fd: number): Promise<JsConnection | JsListener>;\n}\n\ninterface WireSession {\n path?: 'transport' | 'kernel';\n substitutes?: boolean;\n verified?: boolean;\n verifiedBy?: 'bundled' | 'none';\n protocol?: 'TLSv1.2' | 'TLSv1.3';\n alpnProtocol: string | false;\n authorized?: boolean;\n authorizationError?: string;\n servername: string;\n peerCertificates?: string[];\n cipher?: JsTlsCipher;\n clientCertificate?: boolean;\n sni?: boolean;\n hostnameChecked?: boolean;\n hostnameMatches?: boolean;\n chainError?: string;\n keylog?: string[];\n}\n\nfunction fromBase64(text: string): Uint8Array {\n const bin = atob(text);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n let bin = '';\n for (const b of bytes) bin += String.fromCharCode(b);\n return btoa(bin);\n}\n\nconst PEM = /-----BEGIN CERTIFICATE-----([\\s\\S]*?)-----END CERTIFICATE-----/g;\n\nfunction caList(ca: unknown): string[] {\n const items = Array.isArray(ca) ? ca : [ca];\n const out: string[] = [];\n for (const item of items) {\n if (item instanceof Uint8Array && item[0] === 0x30) out.push(toBase64(item));\n else {\n const text = item instanceof Uint8Array ? new TextDecoder().decode(item) : String(item);\n out.push(...[...text.matchAll(PEM)].map((m) => (m[1] as string).replace(/\\s+/g, '')));\n }\n }\n return out;\n}\n\nfunction keyText(key: unknown, what: string): string {\n if (key instanceof Uint8Array) return toBase64(key);\n if (typeof key === 'string') return toBase64(new TextEncoder().encode(key));\n throw new JsCallError('EINVAL', what, 'ERR_INVALID_ARG_TYPE: key must be a string or bytes');\n}\n\nfunction serveRequest(tls: JsTlsOptions) {\n const own = clientCert(tls, 'listen').clientCert;\n if (tls.select !== undefined && typeof tls.select !== 'function')\n throw new JsCallError('EINVAL', 'listen', 'ERR_INVALID_ARG_TYPE: select must be a function');\n if (!own && !tls.select)\n throw new JsCallError('EINVAL', 'listen', 'ERR_INVALID_ARG_VALUE: a server needs cert and key');\n return {\n ...(own ? { cert: own } : {}),\n ...(tls.select ? { select: true } : {}),\n ...(tls.ca !== undefined ? { ca: caList(tls.ca) } : {}),\n ...(tls.requestCert ? { requestCert: true } : {}),\n ...(tls.rejectUnauthorized === false ? { rejectUnauthorized: false } : {}),\n ...(tls.alpn ? { alpn: [...tls.alpn] } : {}),\n ...(tls.handshakeTimeout !== undefined ? { handshakeTimeout: tls.handshakeTimeout } : {}),\n ...(tls.keylog === true ? { keylog: true } : {}),\n };\n}\n\ninterface ServedWire {\n protocol: 'TLSv1.2' | 'TLSv1.3';\n alpnProtocol: string | false;\n servername: string;\n authorized: boolean;\n authorizationError?: string;\n peerCertificates: string[];\n cipher: JsTlsCipher;\n keylog?: string[];\n}\n\nfunction servedOf(r: ServedWire): JsTlsServerSession {\n const { authorizationError, ...rest } = r;\n return Object.freeze({\n ...rest,\n path: 'kernel',\n ...(authorizationError ? { authorizationError } : {}),\n peerCertificates: Object.freeze(r.peerCertificates.map(fromBase64)),\n cipher: Object.freeze({ ...r.cipher }),\n ...keylogOf(r.keylog),\n });\n}\n\nfunction keylogOf(lines: string[] | undefined): { keylog?: readonly string[] } {\n return lines ? { keylog: Object.freeze([...lines]) } : {};\n}\n\nfunction clientCert(tls: JsTlsOptions, what = 'connect') {\n if (tls.pfx !== undefined) {\n throw new JsCallError('ENOTSUP', what, 'pfx is not supported: pass cert and key');\n }\n if (tls.cert === undefined && tls.key === undefined) return {};\n const chain = tls.cert === undefined ? [] : caList(tls.cert);\n if (chain.length === 0 || tls.key === undefined) {\n throw new JsCallError('EINVAL', what, 'ERR_INVALID_ARG_VALUE: cert and key go together');\n }\n const passphrase = tls.passphrase === undefined ? {} : { passphrase: String(tls.passphrase) };\n return { clientCert: { chain, key: keyText(tls.key, what), ...passphrase } };\n}\n\nfunction tlsRequest(tls: JsTlsOptions) {\n return {\n ...(tls.servername ? { servername: tls.servername } : {}),\n ...(tls.alpn ? { alpn: [...tls.alpn] } : {}),\n ...(tls.ca !== undefined ? { ca: caList(tls.ca) } : {}),\n ...(tls.rejectUnauthorized === false ? { insecure: true } : {}),\n ...(tls.sni === false ? { sni: false as const } : {}),\n ...(tls.checkHostname === false ? { checkHostname: false as const } : {}),\n ...(tls.keylog === true ? { keylog: true } : {}),\n ...clientCert(tls),\n };\n}\n\nfunction controlsOf(r: WireSession) {\n if (!r.cipher) return {};\n return {\n cipher: Object.freeze({ ...r.cipher }),\n clientCertificate: r.clientCertificate === true,\n sni: r.sni !== false,\n hostnameChecked: r.hostnameChecked === true,\n ...(r.hostnameMatches === undefined ? {} : { hostnameMatches: r.hostnameMatches }),\n ...(r.chainError ? { chainError: r.chainError } : {}),\n };\n}\n\nfunction sessionOf(r: WireSession): JsTlsSession {\n if (r.path !== 'kernel') {\n return Object.freeze({\n path: 'transport',\n substitutes: true,\n protocol: 'transport',\n alpnProtocol: r.alpnProtocol,\n authorized: true,\n servername: r.servername,\n });\n }\n return Object.freeze({\n path: 'kernel',\n substitutes: r.substitutes === true,\n verified: r.verified === true,\n verifiedBy: r.verifiedBy === 'bundled' ? 'bundled' : 'none',\n protocol: r.protocol ?? 'TLSv1.2',\n alpnProtocol: r.alpnProtocol,\n authorized: r.authorized === true,\n ...(r.authorizationError ? { authorizationError: r.authorizationError } : {}),\n servername: r.servername,\n peerCertificates: Object.freeze((r.peerCertificates ?? []).map(fromBase64)),\n ...controlsOf(r),\n ...keylogOf(r.keylog),\n });\n}\n\nconst TLS_CODE = /^([A-Z][A-Z0-9_]+): /;\n\nconst ALERT = / \\(alert (\\d+)\\)$/;\n\nfunction withAlert(err: JsCallError): JsCallError {\n const alert = ALERT.exec(err.detail ?? '')?.[1];\n return alert === undefined ? err : Object.assign(err, { alert: Number(alert) });\n}\n\nasync function secureCall<T>(call: () => Promise<T>, what = 'connect'): Promise<T> {\n try {\n return await call();\n } catch (err) {\n const e = err as JsCallError;\n const code = e.code === 'EPROTO' && e.detail ? TLS_CODE.exec(e.detail)?.[1] : undefined;\n if (code) throw withAlert(new JsCallError(code, what, e.detail));\n throw err;\n }\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 LOOPBACK = /^(localhost|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/;\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;\nconst SO_ACCEPTCONN = 30;\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 interface JsSyncNet {\n listen(options?: JsListenOptions): JsListener;\n}\n\nconst ALERTS: Record<string, number> = {\n unrecognized_name: 112,\n no_application_protocol: 120,\n handshake_failure: 40,\n access_denied: 49,\n internal_error: 80,\n};\n\nfunction choiceWire(choice: JsTlsChoice | undefined) {\n if (!choice) return {};\n const { context, alpn, refuse } = choice;\n return {\n ...(context === undefined\n ? {}\n : { context: typeof context === 'number' ? context : context.fd }),\n ...(alpn === undefined ? {} : { alpn: String(alpn) }),\n ...(refuse === undefined ? {} : { refuse: ALERTS[String(refuse)] ?? Number(refuse) }),\n };\n}\n\ntype Selected = { wire: object; thrown?: unknown };\n\nconst HANDSHAKE_TIMEOUT_MS = 120_000;\n\nfunction expiry(ms: number): { late: Promise<never>; clear(): void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const late = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () =>\n reject(new JsCallError('ERR_TLS_HANDSHAKE_TIMEOUT', 'accept', 'ERR_TLS_HANDSHAKE_TIMEOUT')),\n ms\n );\n });\n late.catch(() => undefined);\n return { late, clear: () => clearTimeout(timer) };\n}\n\nasync function selected(\n pick: JsTlsSelect | undefined,\n offer: JsTlsOffer,\n ms: number\n): Promise<Selected> {\n const limit = expiry(ms);\n try {\n if (!pick) return { wire: {} };\n const choice = await Promise.race([pick(Object.freeze({ ...offer })), limit.late]);\n return { wire: choiceWire(choice) };\n } catch (thrown) {\n return { wire: { refuse: ALERTS.handshake_failure }, thrown };\n } finally {\n limit.clear();\n }\n}\n\nasync function serveOn(\n kernel: JsKernel,\n conn: JsConnection,\n req: object,\n signal: AbortSignal = NEVER,\n pick?: JsTlsSelect,\n ms = HANDSHAKE_TIMEOUT_MS\n): Promise<JsConnection> {\n const call = (body: object) =>\n secureCall(async () => {\n const r = await kernel.blocking(body as Parameters<JsKernel['blocking']>[0], signal);\n return (r.ok && r.kind === 'json' ? r.json : {}) as ServedWire & { select?: JsTlsOffer };\n }, 'accept');\n let wire = await call({ op: 'sock-tls-serve', fd: conn.fd, ...req });\n while (wire.select) {\n const { wire: choice, thrown } = await selected(pick, wire.select, ms);\n wire = await call({ op: 'sock-tls-select', fd: conn.fd, ...choice }).catch((err) => {\n throw thrown ?? err;\n });\n }\n return Object.assign(Object.create(conn), { tls: servedOf(wire) });\n}\n\nexport const HANDSHAKES_MAX = 64;\n\nfunction changeOf(waiters: Set<() => void>, signal: AbortSignal): Promise<void> {\n return new Promise<void>((resolve) => {\n const done = () => {\n waiters.delete(done);\n signal.removeEventListener('abort', done);\n resolve();\n };\n waiters.add(done);\n signal.addEventListener('abort', done, { once: true });\n });\n}\n\nexport function securedAccepts(\n plain: (signal: AbortSignal) => Promise<JsConnection>,\n serve: (conn: JsConnection, signal: AbortSignal) => Promise<JsConnection>,\n stop: AbortSignal,\n cap: number\n): (signal: AbortSignal) => Promise<JsConnection> {\n const ready: JsConnection[] = [];\n const waiters = new Set<() => void>();\n let failure: unknown;\n let pumping = false;\n let inFlight = 0;\n const wake = () => {\n for (const w of [...waiters]) w();\n };\n const handshake = (conn: JsConnection) => {\n inFlight++;\n serve(conn, stop)\n .then(\n (secured) => {\n if (stop.aborted) void secured.close();\n else ready.push(secured);\n },\n () => conn.close()\n )\n .finally(() => {\n inFlight--;\n wake();\n });\n };\n const pump = async () => {\n for (;;) {\n try {\n while (inFlight + ready.length >= cap) {\n stop.throwIfAborted();\n await changeOf(waiters, stop);\n }\n handshake(await plain(stop));\n } catch (err) {\n failure = err;\n for (const left of ready.splice(0)) void left.close();\n wake();\n return;\n }\n }\n };\n return async (signal) => {\n if (!pumping) {\n pumping = true;\n void pump();\n }\n for (;;) {\n if (stop.aborted) throw stop.reason;\n const next = ready.shift();\n if (next) {\n wake();\n return next;\n }\n if (failure !== undefined) throw failure;\n signal.throwIfAborted();\n await changeOf(waiters, signal);\n }\n };\n}\n\ninterface ListenerOps {\n kernel: JsKernel;\n io: NetIo;\n connection(fd: number): Promise<JsConnection>;\n serve(\n conn: JsConnection,\n req: object,\n signal?: AbortSignal,\n pick?: JsTlsSelect,\n ms?: number\n ): Promise<JsConnection>;\n}\n\nfunction listenerOf(\n ops: ListenerOps,\n fd: number,\n at: JsAddress,\n handshakes: number,\n tls?: JsTlsOptions\n): JsListener {\n const { kernel, io, connection, serve } = ops;\n const stop = new AbortController();\n const acceptPlain = async (signal: AbortSignal): Promise<JsConnection> => {\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 const next =\n handshakes > 0\n ? securedAccepts(\n acceptPlain,\n (c, s) => serve(c, { from: fd }, s, tls?.select, tls?.handshakeTimeout),\n stop.signal,\n handshakes\n )\n : acceptPlain;\n const accept = (options: { signal?: AbortSignal } = {}): Promise<JsConnection> =>\n next(AbortSignal.any([options.signal ?? NEVER, stop.signal]));\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\nasync function contextOf(\n kernel: JsKernel,\n io: NetIo,\n options: JsTlsContextOptions\n): Promise<JsTlsContext> {\n const own = clientCert(options ?? {}, 'tlsContext').clientCert;\n if (!own)\n throw new JsCallError(\n 'EINVAL',\n 'tlsContext',\n 'ERR_INVALID_ARG_VALUE: a context needs cert and key'\n );\n const fd = (await secureCall(\n () => kernel.json({ op: 'sock-tls-context', cert: own }),\n 'tlsContext'\n )) as number;\n let closed: Promise<void> | undefined;\n return Object.freeze({\n fd,\n close: () => {\n closed ??= io.close(fd);\n return closed;\n },\n });\n}\n\nfunction capOf(options: JsListenOptions, tls: object | undefined): number {\n return tls ? Math.max(1, Math.min(options.backlog ?? 128, HANDSHAKES_MAX)) : 0;\n}\n\nfunction resetOf(\n kernel: JsKernel,\n fd: number,\n closed: () => boolean,\n close: () => Promise<void>\n): () => Promise<void> {\n return async () => {\n if (!closed()) await kernel.call({ op: 'sock-reset', fd });\n await close();\n };\n}\n\nconst inetAt = (options: JsListenOptions): InetAddr => ({\n family: 'inet',\n host: options.host ?? '127.0.0.1',\n port: port(options.port ?? 0),\n});\n\nfunction adoptOf(\n kernel: JsKernel,\n connection: (fd: number) => Promise<JsConnection>,\n listening: (fd: number, at: JsAddress) => JsListener,\n name: (fd: number, peer: boolean) => Promise<JsAddress>\n): (fd: number) => Promise<JsConnection | JsListener> {\n return async (fd) => {\n const req = { op: 'sock-getopt' as const, fd, level: SOL_SOCKET, name: SO_ACCEPTCONN };\n if ((await kernel.json(req)) !== 1) return connection(fd);\n return listening(fd, await name(fd, false));\n };\n}\n\nexport function netOps(\n kernel: JsKernel,\n io: NetIo,\n sync?: JsSyncKernel\n): JsNet & { sync: JsSyncNet } {\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 secureCall(() => io.read(fd, undefined, stop.signal), 'read');\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 secureCall(\n () => io.send(fd, chunk, AbortSignal.any([controller.signal, stop.signal])),\n 'write'\n ),\n close: async () => void (await shut(SHUT_WR)),\n abort: () => close(),\n });\n const reset = resetOf(kernel, fd, () => closed !== undefined, close);\n return { fd, local, remote, readable, writable, close, reset };\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 serve: ListenerOps['serve'] = (...args) => serveOn(kernel, ...args);\n\n const ops: ListenerOps = { kernel, io, connection, serve };\n const listener = (fd: number, at: JsAddress, handshakes = 0, tls?: JsTlsOptions): JsListener =>\n listenerOf(ops, fd, at, handshakes, tls);\n\n const connect = async (options: JsConnectOptions): Promise<JsConnection> => {\n const signal = options.signal ?? NEVER;\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 as number),\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 const tlsConnect = async (\n options: JsConnectOptions,\n tls: JsTlsOptions\n ): Promise<JsConnection> => {\n const host = options.host ?? 'localhost';\n if (!options.socket && LOOPBACK.test(host)) {\n const { tls: _, ...plain } = options;\n const socket = await connect({ ...plain, host });\n return tlsConnect({ ...plain, host, socket }, tls).catch(async (err: unknown) => {\n await socket.close();\n throw err;\n });\n }\n const common = tlsRequest(\n options.socket && !tls.servername && options.host ? { ...tls, servername: options.host } : tls\n );\n const r = (await secureCall(async () => {\n if (!options.socket)\n return kernel.json({\n op: 'sock-tls',\n host,\n port: port(options.port as number),\n ...common,\n ...(tls.path ? { path: tls.path } : {}),\n });\n const req = { op: 'sock-tls-upgrade' as const, fd: options.socket.fd, ...common };\n const done = await kernel.blocking(req, options.signal ?? NEVER);\n return done.ok && done.kind === 'json' ? done.json : undefined;\n })) as WireSession & { fd?: number };\n const session = sessionOf(r);\n if (options.socket) return Object.assign(Object.create(options.socket), { tls: session });\n return Object.assign(await connection(r.fd as number), { tls: session });\n };\n\n const lookup = async (name: string, options: JsResolveOptions = {}): Promise<string[]> => {\n const family = options.family ?? 0;\n if (family !== 0 && family !== 4 && family !== 6) {\n throw new JsCallError('EAI_FAMILY', `resolve ${name}`);\n }\n const signal = options.signal ?? NEVER;\n signal.throwIfAborted();\n const req = { op: 'sock-resolve' as const, name: String(name), family };\n const r = await kernel.blocking(req, signal).catch((err: unknown) => {\n signal.throwIfAborted();\n const code = (err as { code?: unknown }).code;\n if (code === 'ETIMEDOUT') throw new JsCallError('EAI_AGAIN', `resolve ${name}`);\n if (code !== 'ENOENT') throw err;\n throw new JsCallError('ENOTFOUND', `resolve ${name}`);\n });\n return [...((r.ok && r.kind === 'json' ? r.json : []) as string[])];\n };\n\n const listenSync = (options: JsListenOptions = {}): JsListener => {\n const lane = sync as JsSyncKernel;\n const addr = inetAt(options);\n const tls = options.tls ? serveRequest(options.tls) : undefined;\n const fd = lane.json({ op: 'sock-open', domain: 'inet' }) as number;\n try {\n lane.call({ op: 'sock-bind', fd, addr });\n lane.call({ op: 'sock-listen', fd, backlog: options.backlog ?? 128 });\n if (tls) lane.call({ op: 'sock-tls-listen', fd, ...tls });\n const at = addressOf(lane.json({ op: 'sock-name', fd, peer: false }));\n return listener(fd, at, capOf(options, tls), options.tls);\n } catch (err) {\n lane.raw({ op: 'fd-close', fd });\n throw err;\n }\n };\n\n return {\n sync: { listen: listenSync },\n resolve: lookup,\n adopt: adoptOf(kernel, connection, listener, name),\n listen: async (options = {}) => {\n const tls = options.tls ? serveRequest(options.tls) : undefined;\n return opened(async (fd) => {\n const addr = inetAt(options);\n await kernel.call({ op: 'sock-bind', fd, addr });\n await kernel.call({ op: 'sock-listen', fd, backlog: options.backlog ?? 128 });\n if (tls)\n await secureCall(() => kernel.call({ op: 'sock-tls-listen', fd, ...tls }), 'listen');\n return listener(fd, await name(fd, false), capOf(options, tls), options.tls);\n });\n },\n secure: async (conn, tls) => {\n if (tls.server !== true) return tlsConnect({ socket: conn }, tls);\n return serve(conn, serveRequest(tls), undefined, tls.select, tls.handshakeTimeout);\n },\n tlsContext: (options) => contextOf(kernel, io, options),\n connect: (options) => {\n (options.signal ?? NEVER).throwIfAborted();\n return options.tls ? tlsConnect(options, options.tls) : connect(options);\n },\n };\n}\n", "import type { Cred } from './cred.ts';\n\nexport interface ProcessInfo {\n pid: number;\n tid: number;\n ppid: number;\n pgid: number;\n sid: number;\n argv: string[];\n exe?: string;\n exeId?: string;\n tty: string | null;\n started: number;\n state: 'S' | 'T' | 'Z';\n\n threads?: Array<{ tid: number; state: 'R' | 'S' }>;\n memory: number;\n utime?: number;\n stime?: number;\n cutime?: number;\n cstime?: number;\n umask?: number;\n cred?: Cred;\n sigIgn?: number;\n sigCgt?: number;\n sigBlk?: number;\n tag?: string;\n tags?: string[];\n}\n\nexport interface MountLine {\n type: string;\n source: string;\n target: string;\n options: Record<string, string>;\n state: 'ok' | 'failed' | 'nomedium' | 'pending';\n}\n\nexport interface ProcessListing {\n boot: number;\n processes: ProcessInfo[];\n load?: readonly [number, number, number];\n cpu?: { utime: number; stime: number; idle: number };\n wasm?: { live: number; ceiling: number; source?: string };\n peers?: number;\n fsCalls?: number;\n opfsCalls?: number;\n opfsOps?: number;\n cwdChecks?: number;\n staleFds?: number;\n fileIds?: number;\n holds?: { mine: number; peers: number; sent: number; held?: readonly string[] };\n renameAcks?: {\n acks: number;\n busy: number;\n waits: number;\n queries: number;\n ackMs: readonly number[];\n };\n}\n\nexport function mayTrace(viewer: ProcessInfo | undefined, target: ProcessInfo): boolean {\n const by = viewer?.cred;\n const of = target.cred;\n if (!by || !of || by.euid === 0) return true;\n const uid = of.ruid === by.euid && of.euid === by.euid && of.suid === by.euid;\n return uid && of.rgid === by.egid && of.egid === by.egid && of.sgid === by.egid;\n}\n\nexport function fileIdentity(\n ino: number | undefined,\n mtimeMs: number | undefined\n): string | undefined {\n if (ino === undefined || mtimeMs === undefined || !Number.isFinite(mtimeMs)) return undefined;\n return `${ino}:${Math.trunc(mtimeMs)}`;\n}\n", "import type { Cred } from '../kernel/cred.ts';\nimport type { MetaEntry } from './meta.ts';\nimport { fsError, type KernelFs, type NewOwner, type Owner } from './types.ts';\n\nexport const ROOT_OWNER: Readonly<Owner> = Object.freeze({ uid: 0, gid: 0 });\n\nconst S_ISUID = 0o4000;\nconst S_ISGID = 0o2000;\nconst S_IXGRP = 0o010;\n\nexport function ownOf(entry: MetaEntry | undefined): Owner | undefined {\n if (entry?.uid === undefined || entry.gid === undefined) return undefined;\n return { uid: entry.uid, gid: entry.gid };\n}\n\nfunction handedBy(entry: MetaEntry | undefined): Owner | undefined {\n return entry?.heir ? { uid: entry.heir[0], gid: entry.heir[1] } : ownOf(entry);\n}\n\nexport function inherit(entries: ReadonlyArray<MetaEntry | undefined>): Owner {\n for (let i = entries.length - 1; i >= 0; i--) {\n const found = handedBy(entries[i]);\n if (found) return found;\n }\n return { ...ROOT_OWNER };\n}\n\nexport function chain(path: string): string[] {\n const parts = path.split('/').filter(Boolean);\n return ['/', ...parts.map((_, i) => `/${parts.slice(0, i + 1).join('/')}`)];\n}\n\nexport function sameOwner(a: Owner, b: Owner): boolean {\n return a.uid === b.uid && a.gid === b.gid;\n}\n\nexport function ownerOf(cred: Readonly<Cred>, mode?: number): NewOwner {\n return { uid: cred.euid, gid: cred.egid, ...(mode !== undefined ? { mode } : {}) };\n}\n\nexport function inGroup(cred: Readonly<Cred>, gid: number): boolean {\n return cred.egid === gid || cred.groups.includes(gid);\n}\n\nexport function mayChown(\n cred: Readonly<Cred>,\n current: Owner,\n uid: number | undefined,\n gid: number | undefined\n): boolean {\n if (cred.euid === 0) return true;\n const owner = cred.euid === current.uid;\n if (uid !== undefined && !(owner && uid === current.uid)) return false;\n if (gid !== undefined && !(owner && (gid === current.gid || inGroup(cred, gid)))) return false;\n return true;\n}\n\nexport function clearedSetId(mode: number): number {\n const bits = S_ISUID | (mode & S_IXGRP ? S_ISGID : 0);\n return mode & 0o7777 & ~bits;\n}\n\nexport async function chownAs(\n fs: KernelFs,\n cred: Readonly<Cred>,\n path: string,\n change: { uid?: number; gid?: number; follow: boolean }\n): Promise<void> {\n const { uid, gid, follow } = change;\n const st = follow ? await fs.stat(path) : await fs.lstat(path);\n const current = { uid: st.uid ?? 0, gid: st.gid ?? 0 };\n if (!fs.chown || !mayChown(cred, current, uid, gid)) throw fsError('EPERM', path);\n const clear =\n st.isFile && (uid !== undefined || gid !== undefined) ? clearedSetId(st.mode) : undefined;\n await fs.chown(path, {\n ...(uid !== undefined ? { uid } : {}),\n ...(gid !== undefined ? { gid } : {}),\n follow,\n ...(clear !== undefined && clear !== (st.mode & 0o7777) ? { mode: clear } : {}),\n });\n}\n", "import { fsError } from './types.ts';\n\nexport interface LinkReader {\n readlink?(path: string): Promise<string>;\n lstat?(path: string): Promise<unknown>;\n}\n\nconst MAX_LINKS = 40;\n\nexport function parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nasync function mustBeDir(fs: LinkReader, path: string): Promise<void> {\n if (!fs.lstat) return;\n const st = await fs.lstat(path);\n if ((st as { isDirectory?: boolean }).isDirectory !== true) throw fsError('ENOTDIR', path);\n}\n\nasync function linkOf(fs: LinkReader, path: string): Promise<string | undefined> {\n return fs.readlink?.(path).catch(() => undefined);\n}\n\ninterface Budget {\n hops: number;\n}\n\nexport async function realDir(\n fs: LinkReader,\n dir: string,\n budget: Budget = { hops: 0 }\n): Promise<string> {\n const queue = dir.split('/').filter(Boolean);\n let at = '/';\n while (queue.length > 0) {\n const part = queue.shift() as string;\n if (part === '.') continue;\n if (part === '..') {\n at = parentOf(at);\n continue;\n }\n const next = at === '/' ? `/${part}` : `${at}/${part}`;\n const link = await linkOf(fs, next);\n if (link === undefined) {\n if (queue.find((p) => p !== '.') === '..') await mustBeDir(fs, next);\n at = next;\n continue;\n }\n if (budget.hops >= MAX_LINKS) throw fsError('ELOOP', dir);\n budget.hops++;\n queue.unshift(...link.split('/').filter(Boolean));\n if (link.startsWith('/')) at = '/';\n }\n return at;\n}\n\nexport function joinName(dir: string, name: string): string {\n return dir === '/' ? `/${name}` : `${dir}/${name}`;\n}\n\nexport async function realTarget(fs: LinkReader, path: string): Promise<string> {\n const budget: Budget = { hops: 0 };\n let dir = await realDir(fs, parentOf(path), budget);\n let name = path.slice(path.lastIndexOf('/') + 1);\n for (;;) {\n const link = await linkOf(fs, joinName(dir, name));\n if (link === undefined) break;\n if (budget.hops >= MAX_LINKS) throw fsError('ELOOP', path);\n budget.hops++;\n const target = link.startsWith('/') ? link : joinName(dir, link);\n dir = await realDir(fs, parentOf(target), budget);\n name = target.slice(target.lastIndexOf('/') + 1);\n }\n return joinName(dir, name);\n}\n", "import type { Cred } from '../kernel/cred.ts';\nimport { chain, inGroup } from './owners.ts';\nimport { type FsStat, fsError, type KernelFs, type Perm } from './types.ts';\n\nexport type { Perm };\n\nimport { joinName, parentOf } from './walk.ts';\n\nexport const R_OK = 4;\nexport const W_OK = 2;\nexport const X_OK = 1;\n\nconst MAX_LINKS = 40;\nconst S_ISVTX = 0o1000;\n\nexport interface Walked {\n path: string;\n perm: Perm | undefined;\n denied?: string;\n missing?: boolean;\n link?: true;\n}\n\nexport function permOf(st: FsStat, link?: string): Perm {\n return {\n uid: st.uid ?? 0,\n gid: st.gid ?? 0,\n mode: st.mode & 0o7777,\n ...(link !== undefined ? { link } : {}),\n };\n}\n\nexport function permits(cred: Readonly<Cred>, perm: Perm, want: number, directory = true): boolean {\n const mode = perm.mode ?? (directory ? 0o755 : 0o644);\n if (cred.euid === 0) return (want & X_OK) === 0 || directory || (mode & 0o111) !== 0;\n const shift = cred.euid === perm.uid ? 6 : inGroup(cred, perm.gid) ? 3 : 0;\n return ((mode >> shift) & want) === want;\n}\n\nexport function sticky(cred: Readonly<Cred>, dir: Perm, entry: Perm | undefined): boolean {\n if (cred.euid === 0 || ((dir.mode ?? 0) & S_ISVTX) === 0) return true;\n return cred.euid === dir.uid || cred.euid === (entry ?? dir).uid;\n}\n\nexport async function ancestryOf(fs: KernelFs, path: string): Promise<Array<Perm | undefined>> {\n if (fs.ancestry) return fs.ancestry(path);\n const out: Array<Perm | undefined> = [];\n for (const at of chain(path)) {\n const st = await fs.lstat(at).catch(() => undefined);\n if (!st) break;\n out.push(permOf(st, st.isSymbolicLink ? await fs.readlink(at) : undefined));\n }\n return out;\n}\n\nclass Perms {\n private readonly known = new Map<string, Perm | undefined>();\n private readonly fs: KernelFs;\n\n constructor(fs: KernelFs) {\n this.fs = fs;\n }\n\n async learn(path: string): Promise<void> {\n const names = chain(path);\n const perms = await ancestryOf(this.fs, path);\n for (let i = 0; i < names.length; i++) {\n const perm = perms[i];\n this.known.set(names[i] as string, perm);\n if (perm === undefined || perm.link !== undefined) break;\n }\n }\n\n async at(path: string): Promise<Perm | undefined> {\n if (!this.known.has(path)) await this.learn(path);\n return this.known.get(path);\n }\n}\n\nfunction parts(path: string): string[] {\n return path.split('/').filter((part) => part !== '' && part !== '.');\n}\n\nexport function trustedLink(perm: Perm, links: number | undefined): boolean {\n return links === undefined || perm.uid === 0 || perm.uid === links;\n}\n\nexport async function walk(\n fs: KernelFs,\n cred: Readonly<Cred>,\n path: string,\n follow: boolean,\n links?: number\n): Promise<Walked> {\n const perms = new Perms(fs);\n await perms.learn(path);\n const queue = parts(path);\n let at = '/';\n for (let hops = 0; queue.length > 0; ) {\n const part = queue.shift() as string;\n const dir = await perms.at(at);\n if (!dir) return { path: joinName(at, [part, ...queue].join('/')), perm: undefined };\n if (!permits(cred, dir, X_OK)) return { path, perm: undefined, denied: at };\n if (part === '..') {\n at = parentOf(at);\n continue;\n }\n const next = joinName(at, part);\n const perm = await perms.at(next);\n const last = queue.length === 0;\n if (perm?.link !== undefined && (!last || follow)) {\n if (!trustedLink(perm, links)) return { path, perm: undefined, denied: next, link: true };\n if (++hops > MAX_LINKS) return { path: next, perm: undefined };\n queue.unshift(...parts(perm.link));\n if (perm.link.startsWith('/')) at = '/';\n continue;\n }\n if (last) return { path: next, perm };\n at = next;\n }\n return { path: at, perm: await perms.at(at) };\n}\n\nexport async function present(fs: KernelFs, path: string, directory: boolean): Promise<boolean> {\n const st = await fs.lstat(path).catch(() => undefined);\n return st !== undefined && (!directory || st.isDirectory);\n}\n\nexport interface AccessOptions {\n follow?: boolean;\n directory?: boolean;\n links?: number | undefined;\n}\n\nasync function finalOf(\n fs: KernelFs,\n walked: Walked,\n want: number,\n options: AccessOptions\n): Promise<[Perm, boolean]> {\n const perm = walked.perm as Perm;\n if (options.follow === false && perm.link !== undefined) {\n return [{ ...perm, mode: 0o777 }, false];\n }\n if ((want & X_OK) === 0 || options.directory !== undefined) {\n return [perm, options.directory !== false];\n }\n const look = options.follow === false ? fs.lstat : fs.stat;\n const st = await look.call(fs, walked.path).catch(() => undefined);\n return st ? [permOf(st), st.isDirectory] : [perm, false];\n}\n\nexport async function access(\n fs: KernelFs,\n cred: Readonly<Cred>,\n path: string,\n want: number,\n options: AccessOptions = {}\n): Promise<Walked> {\n const walked = await walk(fs, cred, path, options.follow !== false, options.links);\n if (walked.denied !== undefined) {\n if (walked.link || (await present(fs, walked.denied, true))) return walked;\n return { path, perm: undefined, missing: true };\n }\n if (!walked.perm) return { ...walked, missing: true };\n const [perm, directory] = await finalOf(fs, walked, want, options);\n if (want === 0 || permits(cred, perm, want, directory)) return walked;\n if (await present(fs, walked.path, false)) return { ...walked, denied: walked.path };\n return { ...walked, missing: true };\n}\n\nexport function refused(path: string, errno = 'EACCES'): Error & { code: string } {\n return fsError(errno, path);\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 { permits, X_OK } from '../fs/access.ts';\nimport { type ChangeView, renameWait, SHARED_TTL_MS } from '../fs/changes.ts';\nimport {\n linkedWatch,\n RangedFile,\n type RangedIo,\n type RangedWatch,\n watchedChange,\n} from '../fs/ranged.ts';\nimport { inodeOf } from '../fs/types.ts';\nimport type { Cred } from '../kernel/cred.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, syncEpoch } from './sync-sab-bridge.ts';\n\nexport type LiveCred = Cred;\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\nconst S_IFSOCK = 0o140000;\nconst S_IFIFO = 0o010000;\nconst S_IFMT = 0o170000;\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 named?: number | undefined;\n watch?: RangedWatch | undefined;\n stat?: SyncFsBridgeStat;\n bound?: SyncFsBridgeStat;\n statAt?: number;\n filledAt?: number;\n statGen?: number;\n seenAt?: 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 listedAt?: number;\n listedGen?: number | undefined;\n\n maxFile?: number;\n\n ranges?: boolean;\n ranged?: RangedFile;\n seen?: number | undefined;\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 sliccReading?: LiveFsNode | undefined;\n sliccCred?: LiveCred;\n sliccOpenFifo?(stream: LiveFsStream, path: string): void;\n\n nameTable?: (LiveFsNode | null)[] | null;\n hashRemoveNode?(node: LiveFsNode): void;\n hashAddNode?(node: LiveFsNode): void;\n hashName?(parentId: number, name: string): number;\n lookupNode?(parent: LiveFsNode, name: string): LiveFsNode;\n lookupPath?(path: string, opts?: { follow?: boolean; parent?: boolean }): { node: object };\n open?(...args: unknown[]): unknown;\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 exactIn(node: LiveFsNode | null): boolean {\n return node?.mount.opts.bridge.owners === true;\n}\n\nfunction modeFromStat(st: SyncFsBridgeStat, exact = false): number {\n const type = st.isSymbolicLink\n ? S_IFLNK\n : st.isDirectory\n ? S_IFDIR\n : st.isSocket\n ? S_IFSOCK\n : st.isFifo\n ? S_IFIFO\n : S_IFREG;\n const fallback = st.isDirectory || st.isSymbolicLink ? 0o777 : 0o666;\n const perm = (st.mode ?? fallback) & PERM_MASK;\n return type | (exact ? perm : perm || 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\nfunction needsLoad(s: LiveNodeState, view: ChangeView | undefined, path: () => string): boolean {\n if (s.loaded && view && !s.dirty) {\n const watch = s.watch ?? { view, stat: () => ({ size: s.len }) };\n const { now, changed } = watchedChange(watch, s.seen ?? 0, path());\n s.seen = now;\n if (changed) {\n s.loaded = false;\n s.stat = undefined;\n }\n }\n if (s.loaded) return false;\n s.seen = view?.now();\n return true;\n}\n\nfunction loadedWatch(\n bridge: SyncFsPosixBridge,\n call: <T>(fn: () => T) => T,\n path: () => string,\n st: SyncFsBridgeStat | { size: number }\n): RangedWatch | undefined {\n const view = bridge.changes;\n return view && linkedWatch({ view, stat: () => call(() => bridge.stat(path())) }, st);\n}\n\nfunction rangedFileOf(\n bridge: SyncFsPosixBridge,\n call: <T>(fn: () => T) => T,\n path: () => string,\n io: RangedIo\n): RangedFile {\n const seen = bridge.changes?.now();\n const stat = () => call(() => bridge.stat(path()));\n const st = stat();\n const watch =\n bridge.changes && linkedWatch({ view: bridge.changes, ino: st.ino, seen, stat }, st);\n return new RangedFile(io, path(), st.size, st.version, watch);\n}\nconst O_APPEND = 0o2000;\n\nfunction unlessIo<T>(op: () => T): T | undefined {\n try {\n return op();\n } catch (err) {\n if ((err as { errno?: unknown }).errno === wasiErrno('EIO')) return undefined;\n throw err;\n }\n}\n\nconst O_ACCMODE = 3;\nconst O_TRUNC = 0o1000;\nconst O_PATH = 0o10000000;\n\nfunction wantOf(flags: number): number {\n if (flags & O_PATH) return 0;\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 gone(err: unknown): boolean {\n return (err as { code?: unknown } | null)?.code === 'ENOENT';\n}\n\nfunction young(s: LiveNodeState): boolean {\n return performance.now() - (s.filledAt ?? Number.NEGATIVE_INFINITY) < SHARED_TTL_MS;\n}\n\nfunction cachedStat(node: LiveFsNode, dir: boolean, view?: ChangeView): boolean {\n const s = node.live;\n if (view?.foreign() && !s.dirty) {\n const gen = s.statGen ?? s.named;\n if (s.openCount > 0 || !young(s) || gen === undefined) return false;\n if (view.changedSince(gen, liveNodePath(node)).changed) return false;\n }\n return s.stat !== undefined && (!dir || s.statAt === syncCallCount());\n}\n\nfunction searchParents(\n Fs: LiveFsApi,\n node: LiveFsNode,\n bridge: SyncFsPosixBridge,\n call: <T>(fn: () => T) => T\n): void {\n const cred = Fs.sliccCred;\n if (!cred) return;\n let cur = node.parent;\n while (cur) {\n const st = cur.live.stat;\n if (st && st.uid !== undefined && st.mode !== undefined) {\n const perm = { uid: st.uid, gid: st.gid ?? 0, mode: st.mode & 0o7777 };\n if (!permits(cred, perm, X_OK, true)) {\n call(() => bridge.access?.(liveNodePath(cur), X_OK, 'eaccess'));\n cur.live.stat = undefined;\n return;\n }\n } else {\n call(() => bridge.access?.(liveNodePath(cur), X_OK, 'eaccess'));\n return;\n }\n if (cur === cur.parent) break;\n cur = cur.parent;\n }\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 filled(\n s: LiveNodeState,\n stat: SyncFsBridgeStat,\n asked: { statGen: number | undefined; filledAt: number }\n): void {\n Object.assign(s, { stat, statAt: syncCallCount(), seenAt: syncEpoch(), ...asked });\n}\n\ninterface Asked {\n filledAt: number;\n statGen: number | undefined;\n}\n\nfunction asking(bridge: SyncFsPosixBridge): Asked {\n return { filledAt: performance.now(), statGen: bridge.changes?.now() };\n}\n\nfunction listing(s: LiveNodeState): Asked {\n return { filledAt: s.listedAt ?? Number.NEGATIVE_INFINITY, statGen: s.listedGen };\n}\n\nfunction answeredAt(node: LiveFsNode, asked: Asked): LiveFsNode {\n Object.assign(node.live, asked);\n return node;\n}\n\nfunction freshState(stat?: SyncFsBridgeStat): LiveNodeState {\n const base = { len: 0, loaded: false, dirty: false, openCount: 0 };\n return stat\n ? { stat, statAt: syncCallCount(), filledAt: performance.now(), seenAt: syncEpoch(), ...base }\n : base;\n}\n\nfunction inCache(Fs: LiveFsApi, node: LiveFsNode): boolean {\n const table = Fs.nameTable;\n const parent = node.parent as LiveFsNode & { id?: number };\n const hash = Fs.hashName?.(parent.id ?? 0, node.name);\n if (!table || hash === undefined) return true;\n let at: LiveFsNode | null | undefined = table[hash];\n while (at) {\n if (at === node) return true;\n at = (at as LiveFsNode & { name_next?: LiveFsNode | null }).name_next;\n }\n return false;\n}\n\nfunction heldUnder(held: LiveFsNode, from: string): LiveFsNode | undefined {\n let moving: LiveFsNode | undefined = held;\n while (moving && moving !== moving.mount.root && liveNodePath(moving) !== from) {\n moving = moving.parent;\n }\n return moving && moving !== moving.mount.root && liveNodePath(moving) === from\n ? moving\n : undefined;\n}\n\nfunction relinked(Fs: LiveFsApi, moving: LiveFsNode, to: string): void {\n const slash = to.lastIndexOf('/');\n let dir: LiveFsNode | undefined;\n try {\n dir = Fs.lookupPath?.(slash <= 0 ? '/' : to.slice(0, slash)).node as LiveFsNode;\n } catch {}\n if (!dir || dir.mount !== moving.mount) return;\n const name = to.slice(slash + 1);\n try {\n const existing = Fs.lookupNode?.(dir, name);\n if (existing && existing !== moving) Fs.hashRemoveNode?.(existing);\n } catch {}\n moving.parent.live.listed = undefined;\n dir.live.listed = undefined;\n Fs.hashRemoveNode?.(moving);\n moving.name = name;\n moving.parent = dir;\n Fs.hashAddNode?.(moving);\n moving.live.stat = undefined;\n}\n\nfunction renameFollower(\n Fs: LiveFsApi,\n bridgeOf: (node: LiveFsNode) => SyncFsPosixBridge,\n call: <T>(fn: () => T) => T\n) {\n const open = new Set<LiveFsNode>();\n const seen = new Map<SyncFsPosixBridge, number>();\n const follow = (node: LiveFsNode, missing = false): boolean => {\n const bridge = bridgeOf(node);\n const view = bridge.changes;\n const since = seen.get(bridge);\n let now = view?.renames() ?? 0;\n if (missing && view && now === since) now = view.awaitRename(now, renameWait(view));\n const ask = bridge.renames?.bind(bridge);\n if (since === undefined || now === since || !ask) return false;\n const held = [...open].filter((n) => !n.live.orphan && bridgeOf(n) === bridge);\n if (held.length === 0) {\n seen.set(bridge, now);\n return false;\n }\n const reply = call(() =>\n ask(\n since,\n held.map((n) => liveNodePath(n))\n )\n );\n seen.set(bridge, reply.now);\n for (const [from, to] of reply.renames) {\n for (const n of held) {\n const moving = heldUnder(n, from);\n if (moving && inCache(Fs, moving)) relinked(Fs, moving, to);\n }\n }\n return reply.renames.length > 0;\n };\n return {\n open,\n follow,\n track(node: LiveFsNode, on: boolean): void {\n node.live.bound = on && node.live.stat?.ino !== undefined ? node.live.stat : undefined;\n if (!on) {\n open.delete(node);\n return;\n }\n follow(node);\n open.add(node);\n },\n watchRenames(bridge: SyncFsPosixBridge): void {\n if (!seen.has(bridge)) seen.set(bridge, bridge.changes?.renames() ?? 0);\n },\n ownRename(bridge: SyncFsPosixBridge, seq: number | undefined): void {\n const since = seen.get(bridge);\n if (seq !== undefined && since !== undefined && seq === ((since + 1) | 0))\n seen.set(bridge, seq);\n },\n };\n}\n\nfunction followingOnce(write: () => void, follow: () => boolean): void {\n try {\n write();\n } catch (err) {\n if ((err as { errno?: number }).errno !== wasiErrno('ENOENT') || !follow()) throw err;\n write();\n }\n}\n\nfunction openReplaced(\n h: LiveHelpers,\n dir: LiveFsNode,\n name: string,\n moving: LiveFsNode\n): { node: LiveFsNode; st: SyncFsBridgeStat } | undefined {\n let node: LiveFsNode | undefined;\n try {\n node = h.Fs.lookupNode?.(dir, name);\n } catch {\n return undefined;\n }\n if (!node || node === moving || node.live?.openCount === 0 || !h.Fs.isFile(node.mode))\n return undefined;\n const st = freshStat(h, node);\n if ((st.nlink ?? 1) > 1) return undefined;\n const ranged = h.rangedOf(node);\n if (ranged) ranged.prefetch();\n else h.ensureLoaded(node);\n return { node, st };\n}\n\nfunction renamedOver(\n h: LiveHelpers,\n dir: LiveFsNode,\n name: string,\n moving: LiveFsNode,\n rename: () => void\n): void {\n const replaced = openReplaced(h, dir, name, moving);\n rename();\n if (replaced) {\n h.rangedOf(replaced.node)?.pin();\n orphaned(h, replaced.node, replaced.st);\n }\n try {\n const existing = h.Fs.lookupNode?.(dir, name);\n if (existing && existing !== moving) h.Fs.hashRemoveNode?.(existing);\n } catch {}\n}\n\nfunction renameThrough(h: LiveHelpers, node: LiveFsNode, from: string, to: string): void {\n const seq = h.call(() => h.bridgeOf(node).rename(from, to));\n h.ownRename(h.bridgeOf(node), typeof seq === 'number' ? seq : undefined);\n}\n\nfunction heldStream(h: LiveHelpers, stream: LiveFsStream, change: 1 | -1): void {\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 h.bridgeOf(stream.node).hold?.(liveNodePath(stream.node), s.writers > 0);\n } catch {}\n }\n}\n\nfunction adopted(\n node: LiveFsNode,\n st: SyncFsBridgeStat,\n asked: { statGen: number | undefined; filledAt: number }\n): boolean {\n const bound = node.live.openCount > 0 ? node.live.bound : undefined;\n if (bound && st.ino !== bound.ino) return false;\n filled(node.live, st, asked);\n node.mode = modeFromStat(st, exactIn(node));\n return true;\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 const renames = renameFollower(Fs, bridgeOf, (fn) => call(fn));\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 makeNode(parent: LiveFsNode | null, name: string, st: SyncFsBridgeStat): LiveFsNode {\n const node = Fs.createNode(parent, name, modeFromStat(st, exactIn(parent)), 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 const view = bridgeOf(node).changes;\n if (!cachedStat(node, Fs.isDir(node.mode), view)) {\n const asked = { statGen: view?.now(), filledAt: performance.now() };\n const st = call(() => bridgeOf(node).lstat(liveNodePath(linked.holder(node))));\n if (!adopted(node, st, asked)) return node.live.bound as SyncFsBridgeStat;\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 (!needsLoad(s, bridgeOf(node).changes, () => liveNodePath(linked.holder(node)))) return;\n const path = () => liveNodePath(linked.holder(node));\n const bytes = call(() => fileIo(node).readFile(path()));\n Object.assign(s, { data: bytes, len: bytes.length, loaded: true });\n s.watch = loadedWatch(bridgeOf(node), call, path, s.stat ?? { size: bytes.length });\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 s.ranged = rangedFileOf(bridge, call, path, io);\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 const whole = () => (s.data as Uint8Array).slice(0, s.len);\n const write = () =>\n s.ranged\n ? call(() => s.ranged?.flush())\n : call(() => fileIo(node).writeFile(liveNodePath(linked.holder(node)), whole(), true));\n followingOnce(write, () => renames.follow(node, true));\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 ...renames,\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 cached = owned && cachedStat(node, Fs.isDir(node.mode), bridgeOf(node).changes);\n const st = statOf(node);\n if (cached) searchParents(Fs, node, bridgeOf(node), call);\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 asked = listed ? listing(parent.live) : asking(bridgeOf(parent));\n const st = listed ?? call(() => bridgeOf(parent).lstat(childPath(parent, name)));\n return answeredAt(makeNode(parent, name, st), asked);\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\n ? bridge.create(path, perm, (opening.get(h.Fs) as number) > 0)\n : bridge.writeFile(path, new Uint8Array(0))\n );\n } else if ((mode & S_IFMT) === S_IFIFO && bridge.mkfifo) {\n call(() => bridge.mkfifo?.(path, mode & PERM_MASK));\n } else {\n throw new Fs.ErrnoError(wasiErrno('EPERM'));\n }\n const node = makeNode(parent, name, {\n isFile: Fs.isFile(mode),\n ...((mode & S_IFMT) === S_IFIFO ? { isFifo: true } : {}),\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 renamedOver(h, newDir, newName, oldNode, () => renameThrough(h, oldNode, from, to));\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 listedAt = performance.now();\n const listedGen = bridgeOf(node).changes?.now();\n const listed = call(() => bridgeOf(node).readdirStat(liveNodePath(node)));\n node.live.listed = new Map();\n Object.assign(node.live, { listedAt, listedGen });\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 const bridge = bridgeOf(node);\n const path = liveNodePath(node);\n if (bridge.links && Fs.sliccReading !== node) {\n call(() => bridge.access?.(path, 0, 'follow', true));\n }\n return call(() => bridge.readlink(path));\n },\n };\n}\n\nfunction appendThrough(h: LiveHelpers, stream: LiveFsStream, bytes: () => Uint8Array): boolean {\n const node = stream.node;\n const s = node.live;\n const append = pinnedIo(h.bridgeOf(node), s.handle).append;\n if (!append) return false;\n const body = bytes();\n const at = liveNodePath(h.linked.holder(node));\n const after = unlessIo(() => {\n h.flushNode(node);\n return h.call(() => append(at, body));\n });\n if (after === undefined) return false;\n if (!s.ranged) {\n s.data = undefined;\n s.loaded = false;\n s.len = 0;\n }\n s.stat = undefined;\n stream.position = after - body.length;\n return true;\n}\n\nfunction holdLive(\n bridge: SyncFsPosixBridge,\n node: LiveFsNode,\n on: boolean,\n want: number\n): number | undefined {\n const s = node.live;\n const seen =\n on && s.stat\n ? { gen: s.stat.gen, ...(s.stat.ino !== undefined ? { ino: s.stat.ino } : {}) }\n : undefined;\n return bridge.hold?.(liveNodePath(node), on, true, s.handle, want, seen);\n}\n\nfunction dropOpen(s: LiveNodeState): boolean {\n if (s.openCount === 0) return false;\n s.openCount -= 1;\n return true;\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) => heldStream(h, stream, change);\n\n const opened = (node: LiveFsNode, on: boolean, want = 0) => {\n const s = node.live;\n try {\n h.track(node, on);\n const handle = holdLive(bridgeOf(node), node, on, 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) || gone(err)) {\n throw new Fs.ErrnoError(wasiErrno((err as { code: string }).code));\n }\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 const fifo = (stream: LiveFsStream) => {\n const open = h.Fs.sliccOpenFifo;\n try {\n if (!open) throw new Fs.ErrnoError(wasiErrno('ENXIO'));\n open.call(h.Fs, stream, liveNodePath(stream.node));\n } catch (err) {\n if (stream.fd !== undefined) Fs.closeStream?.(stream.fd);\n throw err;\n }\n };\n const directory = (stream: LiveFsStream) => {\n if ((stream.node.mode & S_IFMT) === S_IFIFO && !(stream.flags & O_PATH)) return fifo(stream);\n if ((stream.node.mode & S_IFMT) === S_IFSOCK && !(stream.flags & O_PATH)) {\n if (stream.fd !== undefined) Fs.closeStream?.(stream.fd);\n throw new Fs.ErrnoError(wasiErrno('ENXIO'));\n }\n const bridge = bridgeOf(stream.node);\n if (!bridge.owners || !Fs.isDir(stream.node.mode) || stream.flags & O_PATH) return;\n try {\n h.call(() =>\n bridge.access?.(liveNodePath(stream.node), accessOf(wantOf(stream.flags)), 'open')\n );\n } catch (err) {\n if (stream.fd !== undefined) Fs.closeStream?.(stream.fd);\n throw err;\n }\n };\n return {\n open(stream) {\n if (!Fs.isFile(stream.node.mode)) return directory(stream);\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 if (!dropOpen(s)) return;\n h.follow(node);\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 h.track(node, false);\n if (s.handle !== undefined) 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 h.follow(node);\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 h.follow(node);\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 bytes = () => new Uint8Array(buffer.buffer, buffer.byteOffset + offset, length).slice();\n if (stream.flags & O_APPEND && appendThrough(h, stream, bytes)) return length;\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 h.follow(stream.node);\n flushNode(stream.node);\n },\n };\n}\n\nconst opening = new WeakMap<LiveFsApi, number>();\n\nfunction countOpens(Fs: LiveFsApi): void {\n const { open } = Fs;\n if (typeof open !== 'function' || opening.has(Fs)) return;\n opening.set(Fs, 0);\n Fs.open = function (this: unknown, ...args: unknown[]) {\n opening.set(Fs, (opening.get(Fs) ?? 0) + 1);\n try {\n return open.apply(this, args);\n } finally {\n opening.set(Fs, (opening.get(Fs) ?? 1) - 1);\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 countOpens(Fs);\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 h.watchRenames(mount.opts.bridge);\n if (!st.isDirectory) throw new Fs.ErrnoError(wasiErrno('ENOTDIR'));\n const root = h.makeNode(null, '/', st);\n root.mode = modeFromStat(st, mount.opts.bridge.owners === true);\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 sliccStale?: true;\n sliccVanished?: 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 guardStaleNodes(Fs, plugin);\n guardVanished(Fs);\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 outdated(node: LiveFsNode, view: ChangeView, before: number): boolean {\n const s = node.live;\n if (\n view.foreign() &&\n s.seenAt !== syncEpoch() &&\n s.openCount === 0 &&\n !s.dirty &&\n node !== node.mount.root &&\n !node.mounted\n )\n return true;\n if (s.named === undefined) {\n s.named = before;\n return false;\n }\n if (s.named === before) return false;\n const { now, changed } = view.changedSince(s.named, liveNodePath(node));\n s.named = now;\n return changed && s.openCount === 0 && !s.dirty && node !== node.mount.root && !node.mounted;\n}\n\nfunction guardStaleNodes(Fs: LiveMountFsApi, plugin: LiveVfsPlugin): void {\n const lookupNode = Fs.lookupNode?.bind(Fs);\n const forget = Fs.hashRemoveNode?.bind(Fs);\n if (!lookupNode || !forget || Fs.sliccStale) return;\n Fs.sliccStale = true;\n Fs.lookupNode = (parent, name) => {\n const view = parent.live ? parent.mount.opts.bridge.changes : undefined;\n const before = view?.now() ?? 0;\n const node = lookupNode(parent, name);\n if (!view || !ownedBy(plugin, node) || !outdated(node, view, before)) return node;\n forget(node);\n const fresh = lookupNode(parent, name);\n if (fresh.live) fresh.live.named = before;\n return fresh;\n };\n}\n\nconst O_NOFOLLOW = 0o400000;\n\nconst RESOLVING: ReadonlyArray<[string, (args: unknown[]) => boolean]> = [\n ['open', (args) => ((args[1] as number) & O_NOFOLLOW) === 0],\n ['stat', (args) => !args[1]],\n ['lstat', () => false],\n ['unlink', () => false],\n ['rename', () => false],\n ['readlink', () => false],\n ['truncate', () => true],\n];\n\nfunction guardVanished(Fs: LiveMountFsApi): void {\n const forget = Fs.hashRemoveNode?.bind(Fs);\n if (!forget || !Fs.lookupPath || Fs.sliccVanished) return;\n Fs.sliccVanished = true;\n const drop: (node: LiveFsNode) => void = forget;\n const lookupPath = Fs.lookupPath.bind(Fs);\n const ops = Fs as unknown as Record<string, ((...args: unknown[]) => unknown) | undefined>;\n const cached = (path: string, follow: boolean): LiveFsNode | undefined => {\n try {\n const node = lookupPath(path, { follow }).node as LiveFsNode;\n return node.live && node.live.openCount === 0 && !node.live.dirty ? node : undefined;\n } catch {\n return undefined;\n }\n };\n let open: ((...args: unknown[]) => unknown) | undefined;\n for (const [name, follows] of RESOLVING) {\n const op = ops[name]?.bind(Fs);\n if (name === 'open') open = op;\n if (op) ops[name] = vanishing(op, follows);\n }\n function vanishing(\n op: (...args: unknown[]) => unknown,\n follows: (args: unknown[]) => boolean\n ): (...args: unknown[]) => unknown {\n return (...args: unknown[]) => {\n try {\n return op(...args);\n } catch (err) {\n const path = args[0];\n const code = (err as { errno?: unknown }).errno;\n const taken = code === wasiErrno('EEXIST') && op === open;\n if ((code !== wasiErrno('ENOENT') && !taken) || typeof path !== 'string') throw err;\n const node = cached(path, follows(args));\n if (!node) throw err;\n drop(node);\n return op(...args);\n }\n };\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\nfunction chownHeld(\n Fs: LiveChownFs,\n node: LiveFsNode,\n s: LiveNodeState,\n uid: number,\n gid: number\n): void {\n const bridge = node.mount.opts.bridge as SyncFsPosixBridge;\n const handle = s.handle as number;\n try {\n bridge.chown?.(liveNodePath(node), idOf(uid), idOf(gid), false, handle);\n } catch (err) {\n throw toErrno(Fs, err);\n }\n if (node.parent?.live) node.parent.live.listed = undefined;\n if (!s.orphan) {\n s.stat = undefined;\n return;\n }\n try {\n const st = bridge.keptStat?.(handle);\n if (st && s.stat) s.stat = { ...s.stat, uid: st.uid, gid: st.gid, mode: st.mode };\n } catch {}\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 node = stream.node as LiveFsNode;\n const s = node.live;\n if (s?.handle !== undefined && (!s.orphan || s.kept)) return chownHeld(Fs, node, s, uid, gid);\n const target = s !== undefined || stream.path === undefined ? stream.node : stream.path;\n (Fs.chown as NonNullable<LiveChownFs['chown']>)(target, uid, gid);\n };\n}\n\nexport interface LiveLinkFs extends LiveFsApi {\n lookupPath(path: string, opts?: { follow?: boolean }): { node: object };\n}\n\nfunction flushOne(Fs: LiveFsApi, node: LiveFsNode): void {\n const s = node.live;\n if (!s.dirty || s.orphan || !(s.data || s.ranged)) return;\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 } catch (err) {\n throw toErrno(Fs, err);\n }\n s.dirty = false;\n s.stat = undefined;\n}\n\nfunction linkable(bridge: SyncFsPosixBridge, path: string): boolean {\n try {\n return bridge.lstat(path).linkable === true;\n } catch {\n return false;\n }\n}\n\nexport function linkLive(Fs: LiveLinkFs, from: string, to: string, follow: boolean): boolean {\n const target = to.replace(/\\/+$/, '');\n const slash = target.lastIndexOf('/');\n const name = target.slice(slash + 1);\n const source = Fs.lookupPath(from, { follow }).node as LiveFsNode;\n const parent = Fs.lookupPath(target.slice(0, slash) || '/', { follow: true }).node as LiveFsNode;\n if (!source.live || !parent.live) return false;\n flushOne(Fs, source);\n const base = liveNodePath(parent);\n const bridge = source.mount.opts.bridge;\n const path = liveNodePath(source);\n try {\n bridge.link(path, base === '/' ? `/${name}` : `${base}/${name}`);\n } catch (err) {\n const refused = toErrno(Fs, err) as Error & { errno: number };\n if (refused.errno !== wasiErrno('EPERM') || linkable(bridge, path)) throw refused;\n throw new Fs.ErrnoError(wasiErrno('EMLINK'));\n }\n source.live.stat = undefined;\n parent.live.listed = undefined;\n return true;\n}\n\nexport interface LiveReadlinkFs extends LiveFsApi {\n lookupPath(path: string, opts?: { follow?: boolean }): { node: object };\n readlink?(path: string): string;\n}\n\nexport function readingLinks(Fs: LiveReadlinkFs): void {\n const readlink = Fs.readlink?.bind(Fs);\n if (!readlink) return;\n Fs.readlink = (path) => {\n const was = Fs.sliccReading;\n Fs.sliccReading = Fs.lookupPath(path).node as LiveFsNode;\n try {\n return readlink(path);\n } finally {\n Fs.sliccReading = was;\n }\n };\n}\n", "import { type LiveFsNode, liveNodePath } from '../realm/live-vfs-fs.ts';\nimport type { ProcessFs, ProcessStream } from './kernel-streams.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nexport const F_GETLK = 12;\nexport const F_SETLK = 13;\nexport const F_SETLKW = 14;\n\nconst F_RDLCK = 0;\nconst F_WRLCK = 1;\nconst F_UNLCK = 2;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\nconst O_ACCMODE = 3;\nconst O_RDONLY = 0;\nconst O_WRONLY = 1;\n\nexport type LockKind = 'read' | 'write';\n\nexport interface LockTarget {\n path?: string;\n fd?: number;\n}\n\nexport interface LockHeld {\n kind: LockKind;\n pid: number;\n start: number;\n len: number;\n}\n\nexport interface LockKernel {\n setLock(\n target: LockTarget,\n kind: LockKind | 'unlock',\n start: number,\n len: number,\n wait: boolean\n ): void;\n getLock(target: LockTarget, kind: LockKind, start: number, len: number): LockHeld | null;\n closeLocks(target: LockTarget): void;\n flock?(fd: number, kind: 'shared' | 'exclusive' | 'unlock', wait: boolean): void;\n}\n\nexport interface LockDeps {\n fs(): ProcessFs | undefined;\n memory(): ArrayBufferLike | undefined;\n kernel: LockKernel;\n flush(): void;\n}\n\nexport const lockPromoters = new WeakMap<object, () => (stream: ProcessStream) => void>();\n\nconst held = new WeakMap<ProcessFs, true>();\n\nexport function lockTarget(stream: ProcessStream): LockTarget | undefined {\n if (stream.sliccKernelFile && stream.sliccKernelFd !== undefined) {\n return { fd: stream.sliccKernelFd };\n }\n const node = stream.node as unknown as Partial<LiveFsNode>;\n return node.live && node.mount ? { path: liveNodePath(node as LiveFsNode) } : undefined;\n}\n\nfunction errnoOf(err: unknown): number {\n const code = (err as { code?: unknown; errno?: unknown } | null)?.code;\n if (typeof code === 'string') return wasiErrno(code);\n const errno = (err as { errno?: unknown } | null)?.errno;\n return typeof errno === 'number' ? errno : wasiErrno('EIO');\n}\n\nfunction sizeOf(Fs: ProcessFs, stream: ProcessStream): number {\n const st = (Fs as unknown as { fstat?: (fd: number) => { size: number } }).fstat?.(stream.fd);\n return st?.size ?? 0;\n}\n\nfunction kindOf(type: number): LockKind | 'unlock' | undefined {\n if (type === F_RDLCK) return 'read';\n if (type === F_WRLCK) return 'write';\n return type === F_UNLCK ? 'unlock' : undefined;\n}\n\ninterface Flock {\n kind: LockKind | 'unlock';\n start: number;\n len: number;\n}\n\nfunction readFlock(\n view: DataView,\n at: number,\n base: (whence: number) => number\n): Flock | undefined {\n const kind = kindOf(view.getInt16(at, true));\n if (kind === undefined) return undefined;\n const start = base(view.getInt16(at + 2, true)) + Number(view.getBigInt64(at + 8, true));\n return { kind, start, len: Number(view.getBigInt64(at + 16, true)) };\n}\n\nfunction writeHolder(view: DataView, at: number, found: LockHeld | null): void {\n if (!found) {\n view.setInt16(at, F_UNLCK, true);\n return;\n }\n view.setInt16(at, found.kind === 'read' ? F_RDLCK : F_WRLCK, true);\n view.setInt16(at + 2, 0, true);\n view.setBigInt64(at + 8, BigInt(found.start), true);\n view.setBigInt64(at + 16, BigInt(found.len), true);\n view.setInt32(at + 24, found.pid, true);\n}\n\nfunction refused(kind: LockKind | 'unlock', flags: number): boolean {\n const access = flags & O_ACCMODE;\n return (kind === 'write' && access === O_RDONLY) || (kind === 'read' && access === O_WRONLY);\n}\n\nfunction baseOf(Fs: ProcessFs, stream: ProcessStream): (whence: number) => number {\n return (whence) =>\n whence === SEEK_CUR ? stream.position : whence === SEEK_END ? sizeOf(Fs, stream) : 0;\n}\n\nexport function recordLock(\n fcntl: (fd: number, cmd: number, varargs: number) => number,\n deps: LockDeps\n): (fd: number, cmd: number, varargs: number) => number {\n return (fd, cmd, varargs) => {\n if (cmd !== F_GETLK && cmd !== F_SETLK && cmd !== F_SETLKW) return fcntl(fd, cmd, varargs);\n const Fs = deps.fs();\n const buffer = deps.memory();\n const stream = Fs?.getStream(fd);\n if (stream && Fs && !stream.sliccKernelFile) lockPromoters.get(Fs)?.()(stream);\n const target = stream ? lockTarget(stream) : undefined;\n if (!Fs || !buffer || !stream || !target) return fcntl(fd, cmd, varargs);\n const view = new DataView(buffer);\n const at = view.getUint32(varargs, true);\n const lock = readFlock(view, at, baseOf(Fs, stream));\n if (!lock || (cmd === F_GETLK && lock.kind === 'unlock')) return -wasiErrno('EINVAL');\n try {\n if (cmd === F_GETLK) {\n writeHolder(\n view,\n at,\n deps.kernel.getLock(target, lock.kind as LockKind, lock.start, lock.len)\n );\n return 0;\n }\n if (refused(lock.kind, stream.flags)) return -wasiErrno('EBADF');\n if (lock.kind !== 'write') deps.flush();\n deps.kernel.setLock(target, lock.kind, lock.start, lock.len, cmd === F_SETLKW);\n if (lock.kind !== 'unlock') held.set(Fs, true);\n return 0;\n } catch (err) {\n return -errnoOf(err);\n }\n };\n}\n\nexport function closeDropsLocks(Fs: ProcessFs, kernel: LockKernel): void {\n const close = (Fs as { close?: (stream: ProcessStream) => void }).close;\n if (typeof close !== 'function') return;\n (Fs as { close: (stream: ProcessStream) => void }).close = (stream) => {\n const target = held.has(Fs) && !stream.sliccKernelFile ? lockTarget(stream) : undefined;\n close.call(Fs, stream);\n if (!target) return;\n try {\n kernel.closeLocks(target);\n } catch {}\n };\n}\n\nconst LOCK_NB = 4;\nconst FLOCK_KINDS: Readonly<Record<number, 'shared' | 'exclusive' | 'unlock'>> = {\n 1: 'shared',\n 2: 'exclusive',\n 8: 'unlock',\n};\n\nexport interface FlockDeps {\n fs(): ProcessFs | undefined;\n flock(fd: number, kind: 'shared' | 'exclusive' | 'unlock', wait: boolean): void;\n}\n\nexport function kernelFlock(deps: FlockDeps): (fd: number, op: number) => number {\n return (fd, op) => {\n const kind = FLOCK_KINDS[op & ~LOCK_NB];\n if (!kind) return -wasiErrno('EINVAL');\n const Fs = deps.fs();\n const stream = Fs?.getStream(fd);\n if (!Fs || !stream) return -wasiErrno('EBADF');\n if (stream.sliccKernelFd === undefined) lockPromoters.get(Fs)?.()(stream);\n if (stream.sliccKernelFd === undefined) return 0;\n try {\n deps.flock(stream.sliccKernelFd, kind, kind !== 'unlock' && (op & LOCK_NB) === 0);\n return 0;\n } catch (err) {\n return -errnoOf(err);\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 { devCreation, devRemoval } from '../fs/dev-removal.ts';\nimport { hostnameOf, hostsFile } from '../kernel/net/loopback-names.ts';\nimport type { MountLine } from '../kernel/proc-info.ts';\nimport { type LiveFsNode, type LiveLinkFs, linkLive, liveNodePath } from '../realm/live-vfs-fs.ts';\nimport { OS_RELEASE } from '../version.ts';\nimport type { ProcessFs, ProcessStream, ProcessSys } from './kernel-streams.ts';\nimport { type LockDeps, recordLock } from './process-locks.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 locks?: Omit<LockDeps, 'fs'>;\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) =>\n cloexecFcntl(deps.locks ? recordLock(f, { ...deps.locks, fs: deps.fs }) : 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 linkat?: unknown;\n symlinkat?: unknown;\n uname?: unknown;\n utimensat?: unknown;\n getppid?: unknown;\n resizeHeap?: unknown;\n fdWrite?: unknown;\n fdRead?: unknown;\n sleepMs?: unknown;\n flock?: unknown;\n getcwd?: 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 linkat: '__syscall_linkat',\n symlinkat: '__syscall_symlinkat',\n uname: '__syscall_uname',\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 flock: '__syscall_flock',\n getcwd: '__syscall_getcwd',\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 optional = false\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 && !optional && 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\nfunction absoluteOf(path: string, cwd: string): string {\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 return `/${parts.join('/')}`;\n}\n\nexport function fdOfPath(path: string, cwd: string): number | undefined {\n const abs = absoluteOf(path, cwd);\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\ninterface RemovalFs {\n unlink?(path: string): void;\n rmdir?(path: string): void;\n sliccCred?: { euid: number };\n}\n\ninterface FifoOpenFs {\n sliccOpenFifo?: (stream: ProcessStream, path: string) => void;\n open?: (path: unknown, flags: unknown, ...rest: unknown[]) => unknown;\n lookupPath?: (path: string, opts?: { follow?: boolean }) => { node: { mode: number } };\n}\n\nconst O_TRUNC = 0o1000;\nconst S_IFMT_BITS = 0o170000;\nconst S_IFIFO_BITS = 0o010000;\n\nfunction namesFifo(fs: FifoOpenFs, path: string, flags: number): boolean {\n try {\n const { node } = fs.lookupPath?.(path, { follow: true }) ?? { node: { mode: 0 } };\n return (node.mode & S_IFMT_BITS) === S_IFIFO_BITS;\n } catch (err) {\n const { errno, code } = (err ?? {}) as { errno?: unknown; code?: unknown };\n const errnum = typeof errno === 'number' ? errno : wasiErrno(String(code));\n if (REFUSED.has(errnum) && (flags & OWN_ERRORS) === 0) throw err;\n return false;\n }\n}\n\nconst REFUSED: ReadonlySet<number> = new Set([wasiErrno('EACCES'), wasiErrno('EPERM')]);\nconst OWN_ERRORS = 0o200 | 0o400000;\n\nexport function useFifoOpens(\n Fs: ProcessFs,\n attach?: (stream: ProcessStream, path: string) => void\n): void {\n const fs = Fs as unknown as FifoOpenFs;\n if (attach) fs.sliccOpenFifo = attach;\n const open = fs.open;\n if (typeof open !== 'function' || typeof fs.lookupPath !== 'function') return;\n fs.open = (path, flags, ...rest) => {\n const truncates = typeof path === 'string' && typeof flags === 'number' && flags & O_TRUNC;\n const kept =\n truncates && namesFifo(fs, path as string, flags as number)\n ? (flags as number) & ~O_TRUNC\n : flags;\n return open.call(Fs, path, kept, ...rest);\n };\n}\n\nexport function useDevRemoval(Fs: ProcessFs): void {\n const fs = Fs as unknown as RemovalFs;\n for (const name of ['unlink', 'rmdir'] as const) {\n const remove = fs[name];\n if (typeof remove !== 'function') continue;\n fs[name] = (path: string) => {\n const refused = devRemoval(absoluteOf(path, Fs.cwd()), fs.sliccCred);\n if (refused) throw new Fs.ErrnoError(wasiErrno(refused));\n remove.call(Fs, path);\n };\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;\nconst O_EXCL = 0o200;\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 const defaults: Record<string, string> = {};\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 const files = {\n passwd,\n group,\n hosts: hostsFile(hostnameOf(env)),\n hostname: `${hostnameOf(env)}\\n`,\n };\n for (const [name, text] of Object.entries(files)) {\n writeFile.call(Fs, `/dev/.etc/${name}`, text);\n backing[`/etc/${name}`] = `/dev/.etc/${name}`;\n defaults[`/etc/${name}`] = text;\n }\n } catch {}\n const open = Fs.open.bind(Fs);\n const seed = (path: string, text: string): void => {\n let stream: ProcessStream;\n try {\n stream = open(path, O_WRONLY | O_CREAT | O_EXCL, 0o644);\n } catch {\n return;\n }\n try {\n const bytes = new TextEncoder().encode(text);\n Fs.write(stream, bytes, 0, bytes.length);\n } finally {\n Fs.closeStream(stream.fd);\n }\n };\n Fs.open = (path, flags, mode) => {\n const instead = backing[path];\n const text = defaults[path];\n if (text !== undefined && (flags & (O_ACCMODE | O_CREAT)) !== 0) seed(path, text);\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;\nconst X_ACCESS = 1;\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 type Stat = (path: string) => { readonly?: boolean };\n const stats = bridge as { stat?: Stat; lstat?: Stat } | undefined;\n const stat = follow ? stats?.stat : stats?.lstat;\n return stat?.call(stats, 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 goneCwdGetcwd(\n imports: WebAssembly.Imports,\n fs: () => { sliccCwdGone?(): boolean } | undefined,\n glue?: KernelImports\n): void {\n wrapImport(\n imports,\n 'getcwd',\n glue,\n (own) =>\n (...args: number[]) =>\n fs()?.sliccCwdGone?.() === true ? -44 : own(...args),\n true\n );\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 AT_SYMLINK_FOLLOW = 0x400;\n\nexport function kernelLink(\n imports: WebAssembly.Imports,\n fs: () => ProcessFs | undefined,\n memory: () => WebAssembly.Memory | undefined,\n glue?: KernelImports\n): void {\n wrapImport(\n imports,\n 'linkat',\n glue,\n (own) => (olddirfd, oldpath, newdirfd, newpath, flags) => {\n const Fs = fs() as (AccessFs & Partial<LiveLinkFs>) | undefined;\n const heap = memory();\n if (!Fs?.lookupPath || !heap) return own(olddirfd, oldpath, newdirfd, newpath, flags);\n const at = (dirfd: number, ptr: number) => {\n const name = cString(heap, ptr);\n return name.startsWith('/') ? name : `${baseOf(Fs, dirfd)}/${name}`;\n };\n try {\n const from = at(olddirfd, oldpath);\n const to = at(newdirfd, newpath);\n const follow = (flags & AT_SYMLINK_FOLLOW) !== 0;\n if (linkLive(Fs as LiveLinkFs, from, to, follow)) return 0;\n } catch (err) {\n return -errnoOf(err);\n }\n return own(olddirfd, oldpath, newdirfd, newpath, flags);\n },\n true\n );\n}\n\ninterface CreationFs extends AccessFs {\n sliccCred?: { euid: number };\n}\n\nfunction refusedCreation(Fs: CreationFs, heap: WebAssembly.Memory, dirfd: number, ptr: number) {\n const name = cString(heap, ptr);\n const path = absoluteOf(name, name.startsWith('/') ? '/' : baseOf(Fs, dirfd));\n const refused = devCreation(path, Fs.sliccCred);\n if (!refused || !Fs.lookupPath) return 0;\n try {\n Fs.lookupPath(path, { follow: false });\n return 0;\n } catch {\n return -wasiErrno(refused);\n }\n}\n\nexport function devCreations(\n imports: WebAssembly.Imports,\n fs: () => ProcessFs | undefined,\n memory: () => WebAssembly.Memory | undefined,\n glue?: KernelImports\n): void {\n const check = (dirfd: number, ptr: number) => {\n const Fs = fs() as CreationFs | undefined;\n const heap = memory();\n return Fs && heap ? refusedCreation(Fs, heap, dirfd, ptr) : 0;\n };\n wrapImport(\n imports,\n 'openat',\n glue,\n (own) => (dirfd, path, flags, varargs) =>\n (flags & O_CREAT && check(dirfd, path)) || own(dirfd, path, flags, varargs),\n true\n );\n wrapImport(\n imports,\n 'mkdirat',\n glue,\n (own) => (dirfd, path, mode) => check(dirfd, path) || own(dirfd, path, mode),\n true\n );\n wrapImport(\n imports,\n 'mknodat',\n glue,\n (own) => (dirfd, path, mode, dev) => check(dirfd, path) || own(dirfd, path, mode, dev),\n true\n );\n wrapImport(\n imports,\n 'symlinkat',\n glue,\n (own) => (target, dirfd, path) => check(dirfd, path) || own(target, dirfd, path),\n true\n );\n}\n\nconst UTS_FIELD = 65;\n\nexport function kernelUname(\n imports: WebAssembly.Imports,\n hostname: string,\n memory: () => WebAssembly.Memory | undefined,\n glue?: KernelImports\n): void {\n const fields = ['Linux', hostname, OS_RELEASE, '#1 SMP PREEMPT_DYNAMIC', 'wasm32', '(none)'];\n const encoded = fields.map((f) => new TextEncoder().encode(f).subarray(0, UTS_FIELD - 1));\n wrapImport(\n imports,\n 'uname',\n glue,\n (own) => (buf) => {\n const heap = memory();\n if (!buf || !heap) return own(buf);\n const bytes = new Uint8Array(heap.buffer, buf, UTS_FIELD * fields.length);\n bytes.fill(0);\n encoded.forEach((field, i) => {\n bytes.set(field, i * UTS_FIELD);\n });\n return 0;\n },\n true\n );\n}\n\nconst CHAR_DEVICES = new Set([\n '/dev/null',\n '/dev/zero',\n '/dev/full',\n '/dev/random',\n '/dev/urandom',\n '/dev/tty',\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\ninterface ChdirFs extends AccessFs {\n chdir?(path: string): void;\n sliccChdirAt?(path: string): void;\n isDir?(mode: number): boolean;\n ErrnoError?: new (errno: number) => Error;\n}\n\nfunction kernelChdir(Fs: ChdirFs): void {\n const { chdir, lookupPath, ErrnoError } = Fs;\n if (!chdir || !lookupPath || !ErrnoError) return;\n Fs.sliccChdirAt = chdir;\n Fs.chdir = (path: string) => {\n const { node } = lookupPath.call(Fs, path, { follow: true });\n const directory = Fs.isDir?.(node.mode) === true;\n const bridge = node.live && directory ? node.mount.opts.bridge : undefined;\n try {\n bridge?.access?.(liveNodePath(node), X_ACCESS, 'eaccess', false);\n } catch (err) {\n throw new ErrnoError(errnoOf(err));\n }\n chdir.call(Fs, path);\n };\n}\n\nexport function linuxDevices(Fs: ProcessFs, owners = true): void {\n if (owners) {\n (Fs as { ignorePermissions?: boolean }).ignorePermissions = true;\n kernelChdir(Fs as unknown as ChdirFs);\n }\n const { chmod } = Fs as unknown as ChmodFs;\n if (!chmod) return;\n for (const [path, mode] of DEVICE_MODES) {\n if (!owners && !CHAR_DEVICES.has(path)) continue;\n try {\n chmod.call(Fs, path, mode);\n } catch {}\n }\n}\n", "import { ROOT } from '../kernel/cred.ts';\nimport {\n type MountLine,\n mayTrace,\n type ProcessInfo,\n type ProcessListing,\n} from '../kernel/proc-info.ts';\nimport { OS_RELEASE, procVersion } from '../version.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 EACCES = 2;\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', 'version'] as const;\n\nexport type ProcSysFile = string | ((listing: ProcessListing) => string);\n\nexport interface ProcSysTree {\n readonly [name: string]: ProcSysFile | ProcSysTree;\n}\n\nexport const SYS_TREE: ProcSysTree = {\n kernel: {\n osrelease: `${OS_RELEASE}\\n`,\n ostype: 'Linux\\n',\n slicc_wasm_memories: (listing) =>\n `${listing.wasm?.live ?? 0} ${listing.wasm?.ceiling ?? 0} ${listing.wasm?.source ?? 'none'}\\n`,\n slicc_shared_root: (listing) => `${listing.peers ?? 0}\\n`,\n slicc_fs_calls: (listing) => `${listing.fsCalls ?? 0}\\n`,\n slicc_opfs_calls: (listing) => `${listing.opfsCalls ?? 0}\\n`,\n slicc_opfs_ops: (listing) => `${listing.opfsOps ?? 0}\\n`,\n slicc_cwd_checks: (listing) => `${listing.cwdChecks ?? 0}\\n`,\n slicc_rename_ack_busy: (listing) => `${listing.renameAcks?.busy ?? 0}\\n`,\n slicc_stale_fds: (listing) => `${listing.staleFds ?? 0}\\n`,\n slicc_file_ids: (listing) => `${listing.fileIds ?? 0}\\n`,\n slicc_peer_holds: ({ holds }) =>\n `${holds?.mine ?? 0} ${holds?.peers ?? 0} ${holds?.sent ?? 0}\\n`,\n slicc_peer_held: ({ holds }) => (holds?.held ?? []).map((path) => `${path}\\n`).join(''),\n slicc_rename_acks: (listing) => {\n const samples = [...(listing.renameAcks?.ackMs ?? [])].sort((a, b) => a - b);\n const median = samples[Math.floor(samples.length / 2)] ?? 0;\n const most = samples.at(-1) ?? 0;\n const waits = listing.renameAcks?.waits ?? 0;\n const queries = listing.renameAcks?.queries ?? 0;\n return `${listing.renameAcks?.acks ?? 0} ${median.toFixed(1)} ${most.toFixed(1)} ${waits} ${queries}\\n`;\n },\n },\n};\n\nfunction isSysFile(at: ProcSysFile | ProcSysTree): at is ProcSysFile {\n return typeof at === 'string' || typeof at === 'function';\n}\n\nexport function sysEntry(parts: readonly string[]): ProcSysFile | ProcSysTree | undefined {\n let at: ProcSysFile | ProcSysTree | undefined = SYS_TREE;\n for (const part of parts) {\n if (isSysFile(at) || !Object.hasOwn(at, part)) return undefined;\n at = at[part];\n }\n return at;\n}\n\nexport function sysText(file: ProcSysFile, listing: () => ProcessListing): string {\n return typeof file === 'string' ? file : file(listing());\n}\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, state: string = info.state): string {\n const fields = [\n info.pid,\n `(${commOf(info)})`,\n 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 = {\n S: 'S (sleeping)',\n T: 'T (stopped)',\n Z: 'Z (zombie)',\n} as const;\n\nconst tagLine = (tag: string): string =>\n `Tag:\\t${tag.replaceAll('\\n', '\\\\n').replaceAll('\\t', '\\\\t').replaceAll('\\r', '\\\\r')}`;\n\nexport function taskStat(info: ProcessInfo, tid: number, boot: number): string | undefined {\n const thread = (info.threads ?? [{ tid: 1, state: info.state }]).find((t) => t.tid === tid);\n return thread && pidStat({ ...info, pid: tid }, boot, thread.state);\n}\n\nexport function taskIds(info: ProcessInfo): number[] {\n return (info.threads ?? [{ tid: 1 }]).map((t) => t.tid);\n}\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.tags ?? (info.tag !== undefined ? [info.tag] : [])).map(tagLine),\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:\\t${sigMask(info.sigBlk)}`,\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 if (name === 'version') return procVersion();\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\nfunction withPidFiles(names: string[], extra: string[]): string[] {\n return [...new Set([...names, ...PID_FILES, ...extra])];\n}\n\nfunction exeNodes(\n fresh: (parent: ProcNode, name: string, mode: number) => ProcNode,\n info: (target: number, own: boolean) => ProcessInfo | undefined,\n error: (errno?: number) => Error,\n self: number\n) {\n return {\n exeLink: (parent: ProcNode, target: number, own = false): ProcNode => {\n const of = info(target, own);\n const exe = of?.exe;\n if (!of || exe === undefined) throw error();\n const link = fresh(parent, 'exe', LINK_MODE);\n link.node_ops.readlink = () => {\n if (!mayTrace(info(self, true), of)) throw error(EACCES);\n return exe;\n };\n return link;\n },\n hasExe: (target: number, own = false): string[] =>\n info(target, own)?.exe === undefined ? [] : ['exe'],\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 sysDir = (parent: ProcNode, name: string, tree: ProcSysTree): ProcNode => {\n const dir = fresh(parent, name, DIR_MODE);\n dir.node_ops.lookup = (at, child) => {\n if (!Object.hasOwn(tree, child)) throw error();\n const next = tree[child] as ProcSysFile | ProcSysTree;\n return isSysFile(next)\n ? file(at, child, () => sysText(next, procList))\n : sysDir(at, child, next);\n };\n dir.node_ops.readdir = () => ['.', '..', ...Object.keys(tree)];\n return dir;\n };\n const exe = exeNodes(fresh, (at, own) => find(procList().processes, at, own), error, pid);\n const pidNames = (names: string[]) => withPidFiles(names, exe.hasExe(pid, true));\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 (child === 'exe') return exe.exeLink(parent, target);\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, ...exe.hasExe(target)];\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', 'sys']) 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 (name === 'sys') return sysDir(parent, name, SYS_TREE);\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 (name === 'exe') return exe.exeLink(parent, pid, true);\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 {\n fileIdentity,\n type MountLine,\n mayTrace,\n type ProcessInfo,\n type ProcessListing,\n} from '../../kernel/proc-info.ts';\nimport {\n type ChownArgs,\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 sysEntry,\n sysText,\n systemFile,\n taskIds,\n taskStat,\n} from '../procfs.ts';\nimport { normalize, SHARED_TTL_MS } 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; denied?: boolean; id?: 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 'sys',\n 'self',\n ...this.listing().processes.map((p) => String(p.pid)),\n ],\n };\n }\n if (top === 'sys') {\n const entry = sysEntry(parts.slice(1));\n if (typeof entry === 'string' || typeof entry === 'function') {\n return { kind: 'file', content: () => sysText(entry, () => this.listing()) };\n }\n return entry && { kind: 'dir', names: () => Object.keys(entry) };\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) || !this.alive(Number(top))) return undefined;\n if (leaf === 'task') return this.task(Number(top), rest);\n if (rest.length > 0) return undefined;\n if (leaf === undefined) {\n const exe = () => (this.info(Number(top))?.exe === undefined ? [] : ['exe']);\n return { kind: 'dir', names: () => [...PID_NAMES, ...exe(), 'task'] };\n }\n if (leaf === 'exe') return this.exe(Number(top));\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 exe(pid: number): Node | undefined {\n const info = this.info(pid);\n if (info?.exe === undefined) return undefined;\n const denied = !mayTrace(this.ownInfo(), info);\n const id = info.exeId === undefined ? {} : { id: info.exeId };\n return { kind: 'link', target: info.exe, ...(denied ? { denied } : {}), ...id };\n }\n\n private ownInfo(): ProcessInfo | undefined {\n const processes = this.listing().processes;\n return processes.find((p) => p.tid === this.pid) ?? processes.find((p) => p.pid === this.pid);\n }\n\n private info(pid: number): ProcessInfo | undefined {\n return this.listing().processes.find((p) => p.pid === pid);\n }\n\n private task(pid: number, rest: string[]): Node | undefined {\n const [tid, leaf, ...more] = rest;\n const tids = () => taskIds(this.info(pid) as ProcessInfo);\n if (tid === undefined) return { kind: 'dir', names: () => tids().map(String) };\n if (!/^[1-9]\\d*$/.test(tid) || more.length > 0 || !tids().includes(Number(tid)))\n return undefined;\n if (leaf === undefined) return { kind: 'dir', names: () => ['stat'] };\n if (leaf !== 'stat') return undefined;\n return {\n kind: 'file',\n content: () => {\n const listing = this.listing();\n const info = listing.processes.find((p) => p.pid === pid);\n const line = info && taskStat(info, Number(tid), listing.boot);\n if (line === undefined) throw syncError('ENOENT', `/proc/${pid}/task/${tid}/stat`);\n return line;\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 escape(path: string): string | undefined {\n return this.escapeTo(path)?.target;\n }\n\n escapeTo(path: string): { target: string; id?: string } | undefined {\n const node = this.node(this.parts(path, true));\n if (node?.kind !== 'link' || !node.target.startsWith('/')) return undefined;\n if (node.denied) throw syncError('EACCES', path);\n return node.id === undefined ? { target: node.target } : { target: node.target, id: node.id };\n }\n\n linkTo(path: string): { target: string; id: string } | undefined {\n const node = this.node(this.parts(path, false));\n if (node?.kind !== 'link' || node.id === undefined || node.denied) return undefined;\n return { target: node.target, id: node.id };\n }\n\n readlink(path: string): string {\n const node = this.find(path, false);\n if (node.kind !== 'link') throw syncError('EINVAL', path);\n if (node.denied) throw syncError('EACCES', 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', 'mkfifo'] 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 physicalProc(\n fs: Pick<SyncFsPosixBridge, 'stat' | 'changes'>,\n now: () => number = () => performance.now()\n): () => boolean {\n const view = fs.changes;\n let seen: { gen: number; physical: boolean; at: number } | undefined;\n return () => {\n if (seen && view && (!view.foreign() || now() - seen.at < SHARED_TTL_MS)) {\n const proc = view.changedSince(seen.gen, '/proc');\n if (!proc.changed && !view.changedSince(seen.gen, '/').changed) {\n seen.gen = proc.now;\n return seen.physical;\n }\n }\n const gen = view?.now();\n const at = now();\n let physical: boolean;\n try {\n fs.stat('/proc');\n physical = true;\n } catch (err) {\n const code = (err as { code?: string }).code;\n if (code !== 'ENOENT' && code !== 'ENOTDIR') {\n seen = undefined;\n return false;\n }\n physical = false;\n }\n seen = gen === undefined ? undefined : { gen, physical, at };\n return physical;\n };\n}\n\nfunction directMiss(err: unknown, path: string): boolean {\n if ((err as { direct?: unknown } | null)?.direct !== true) return false;\n return !path.split('/').some((part) => part === '.' || part === '..');\n}\n\nconst GONE = new Set(['ENOENT', 'ENOTDIR']);\n\nfunction same(fs: SyncFsPosixBridge, path: string, id: string): boolean {\n let st: ReturnType<SyncFsPosixBridge['stat']>;\n try {\n st = fs.stat(path);\n } catch (err) {\n if (GONE.has((err as { code?: string } | null)?.code ?? '')) return false;\n throw err;\n }\n if (id.startsWith('fid:')) return st.fid !== undefined && id.startsWith(`fid:${st.fid}:`);\n const now = fileIdentity(st.ino, st.mtimeMs);\n return now === undefined || now === id;\n}\n\nfunction current(fs: SyncFsPosixBridge, tree: ProcTree, q: string): string | undefined {\n const to = tree.escapeTo(q);\n if (!to || to.id === undefined) return to?.target;\n if (!same(fs, to.target, to.id)) throw syncError('ENOENT', q);\n return to.target;\n}\n\nfunction guard(\n toProc: (path: string, follow: boolean) => string | undefined,\n shadowing: () => boolean\n) {\n return <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}\n\nfunction shownLink(fs: SyncFsPosixBridge, tree: ProcTree, q: string): string {\n const target = tree.readlink(q);\n const to = tree.linkTo(q);\n if (!to) return target;\n try {\n return same(fs, to.target, to.id) ? target : `${target} (deleted)`;\n } catch {\n return target;\n }\n}\n\nfunction routing(\n fs: SyncFsPosixBridge,\n tree: ProcTree,\n toProc: (path: string, follow: boolean) => string | undefined,\n shadowing: () => boolean\n) {\n return <R>(\n p: string,\n inner: (q: string) => R,\n own: () => R,\n follow = true,\n outside?: (target: string) => R\n ): R => {\n const proc = (q: string): R => {\n const target = outside ? current(fs, tree, q) : undefined;\n return target === undefined ? inner(q) : (outside as (t: string) => R)(target);\n };\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 if (directMiss(err, p)) throw err;\n const real = toProc(p, follow);\n if (real === undefined) throw err;\n return proc(real);\n }\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 = physicalProc(fs);\n const via = routing(fs, tree, toProc, shadowing);\n const readOnly = guard(toProc, shadowing);\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 true,\n (t) => fs.readFile(t)\n ),\n stat: (p: string) =>\n via(\n p,\n (q) => tree.stat(q),\n () => fs.stat(p),\n true,\n (t) => ({ ...fs.stat(t), escape: t })\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 try {\n fs.stat(p);\n return true;\n } catch (err) {\n if (directMiss(err, p)) return false;\n }\n const late = probe();\n return typeof late === 'string' && tree.exists(late);\n },\n readlink: (p: string) =>\n via(\n p,\n (q) => shownLink(fs, tree, 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: (\n p: string,\n held: boolean,\n open?: boolean,\n handle?: number,\n want?: number,\n seen?: { gen?: number; nofollow?: boolean }\n ) => {\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, seen) ?? late(p));\n },\n kept: (handle: number) => snapshots.has(handle) || fs.kept?.(handle) === true,\n escape: (p: string) => (inProc(p) ? current(fs, tree, p) : undefined),\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, ...rest: ChownArgs) =>\n readOnly([[p, rest[2] === true]], () => chown.call(fs, p, ...rest));\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 type { MountLine, ProcessListing } from '../../kernel/proc-info.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport { memorySource } from '../procfs.ts';\nimport { inProc, ProcTree } from '../wasi/wasi-procfs.ts';\nimport { type DevStep, devAsync, devSync } from './js-dev.ts';\nimport { index, readingInto } from './js-io.ts';\nimport { JsCallError } from './js-kernel.ts';\n\nexport { inProc };\n\nexport function* procStep<T>(abs: string, pid: number, run: (tree: ProcTree) => T): DevStep<T> {\n const listing = (yield { op: 'proc-list' }) as ProcessListing;\n const mounts = abs === '/proc/mounts' ? ((yield { op: 'mount-list' }) as MountLine[]) : [];\n const tree = new ProcTree(\n { procList: () => listing, mountList: () => mounts },\n pid,\n memorySource()\n );\n try {\n return run(tree);\n } catch (err) {\n throw new JsCallError((err as { code?: string }).code ?? 'EIO', abs);\n }\n}\n\nexport function readOnly(path: string): never {\n throw new JsCallError('EROFS', path);\n}\n\nexport interface ProcOpenOptions {\n write?: boolean;\n append?: boolean;\n create?: boolean;\n truncate?: boolean;\n exclusive?: boolean;\n}\n\nexport function procWrites(options: ProcOpenOptions | undefined): boolean {\n return !!(\n options?.write ||\n options?.append ||\n options?.create ||\n options?.truncate ||\n options?.exclusive\n );\n}\n\nfunction snapshotFile(path: string, bytes: Uint8Array) {\n let closed = false;\n const live = () => {\n if (closed) throw new JsCallError('EBADF', path);\n };\n const read = (position: number, length: number) => {\n live();\n index(position, 'read');\n index(length, 'read');\n return bytes.slice(position, position + length);\n };\n return {\n fd: -1,\n path,\n size: () => {\n live();\n return bytes.length;\n },\n read,\n readInto: readingInto(read),\n write: (): number => {\n throw new JsCallError('EBADF', path);\n },\n truncate: (): void => {\n throw new JsCallError('EBADF', path);\n },\n sync: () => live(),\n close: () => {\n live();\n closed = true;\n },\n };\n}\n\nfunction promised<T extends object>(file: T): T {\n const out: Record<string, unknown> = { ...(file as Record<string, unknown>) };\n for (const [name, value] of Object.entries(file)) {\n if (typeof value === 'function') {\n out[name] = (...args: unknown[]) => new Promise((resolve) => resolve(value(...args)));\n }\n }\n return out as T;\n}\n\ntype ProcRun = <T>(step: DevStep<T>) => T | Promise<T>;\n\ninterface ProcPaths {\n resolve: (path: string) => string;\n pid: number;\n}\n\nconst WRITES = ['mkdir', 'rm', 'unlink', 'chmod', 'writeFile'] as const;\nconst TWO = ['rename', 'link'] as const;\n\nfunction procOps(paths: ProcPaths, run: ProcRun) {\n const at = (path: string) => {\n const abs = paths.resolve(path);\n return inProc(abs) ? abs : undefined;\n };\n const step = <T>(abs: string, op: (tree: ProcTree) => T) => run(procStep(abs, paths.pid, op));\n return { at, step };\n}\n\nexport function withProc<F extends Record<string, unknown>>(\n fs: F,\n paths: ProcPaths,\n run: ProcRun\n): F {\n const { at, step } = procOps(paths, run);\n const out: Record<string, unknown> = { ...fs };\n const pass = fs as Record<string, (...args: unknown[]) => unknown>;\n const reads: Record<string, (tree: ProcTree, abs: string) => unknown> = {\n stat: (tree, abs) => tree.stat(abs, true),\n lstat: (tree, abs) => tree.stat(abs, false),\n exists: (tree, abs) => tree.exists(abs),\n readdir: (tree, abs) => tree.readdir(abs),\n readlink: (tree, abs) => tree.readlink(abs),\n readFile: (tree, abs) => tree.read(abs),\n };\n for (const [name, read] of Object.entries(reads)) {\n out[name] = (path: string, ...rest: unknown[]) => {\n const abs = at(path);\n return abs ? step(abs, (tree) => read(tree, abs)) : pass[name]?.(path, ...rest);\n };\n }\n for (const name of WRITES) {\n out[name] = (path: string, ...rest: unknown[]) => {\n const abs = at(path);\n return abs ? run(refuse(abs)) : pass[name]?.(path, ...rest);\n };\n }\n for (const name of TWO) {\n out[name] = (from: string, to: string) => {\n const abs = at(from) ?? at(to);\n return abs ? run(refuse(abs)) : pass[name]?.(from, to);\n };\n }\n out.symlink = (target: string, path: string) => {\n const abs = at(path);\n return abs ? run(refuse(abs)) : pass.symlink?.(target, path);\n };\n return out as F;\n}\n\nfunction* refuse(abs: string): DevStep<never> {\n yield* [];\n return readOnly(abs);\n}\n\nexport function procOpen<O, R>(\n open: (path: string, options?: O) => R,\n paths: ProcPaths,\n run: ProcRun,\n async = false\n): (path: string, options?: O) => R {\n const { at, step } = procOps(paths, run);\n return (path, options) => {\n const abs = at(path);\n if (!abs) return open(path, options);\n if (procWrites(options as ProcOpenOptions | undefined)) return run(refuse(abs)) as R;\n return step(abs, (tree) => {\n const file = snapshotFile(abs, tree.read(abs));\n return async ? promised(file) : file;\n }) as R;\n };\n}\n\ntype Lane = { json(req: SyncSabRequestBody): unknown };\ntype AsyncLane = { json(req: SyncSabRequestBody): Promise<unknown> };\n\nexport function procFsAsync<F extends object>(fs: F, kernel: AsyncLane, paths: ProcPaths): F {\n return withProc(fs as Record<string, unknown>, paths, (step) => devAsync(kernel, step)) as F;\n}\n\nexport function procFsSync<F extends object>(fs: F, kernel: Lane, paths: ProcPaths): F {\n return withProc(fs as Record<string, unknown>, paths, (step) => devSync(kernel, step)) as F;\n}\n\nexport function procOpenAsync<O, R>(\n open: (path: string, options?: O) => R,\n kernel: AsyncLane,\n paths: ProcPaths\n) {\n return procOpen(open, paths, (step) => devAsync(kernel, step), true);\n}\n\nexport function procOpenSync<O, R>(\n open: (path: string, options?: O) => R,\n kernel: Lane,\n paths: ProcPaths\n) {\n return procOpen(open, paths, (step) => devSync(kernel, step));\n}\n", "import type { WasmSyscall } from '../../kernel/process.ts';\nimport type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\n\nconst jsonOf = (r: SyncFsResult): unknown => (r.ok && r.kind === 'json' ? r.json : undefined);\nconst bytesOf = (r: SyncFsResult): Uint8Array =>\n r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(8);\n\nexport interface JsSendmsgOptions {\n fds?: number[];\n nonblock?: boolean;\n}\n\nexport interface JsRecvmsgOptions {\n cloexec?: boolean;\n nonblock?: boolean;\n}\n\nexport interface JsReceived {\n bytes: Uint8Array;\n fds: number[];\n ctrunc: boolean;\n}\n\nconst encoder = new TextEncoder();\nconst RECV_DEFAULT = 64 * 1024;\n\nexport function sendmsgRequest(\n fd: number,\n data: Uint8Array | string,\n options: JsSendmsgOptions = {}\n) {\n return {\n op: 'sock-sendmsg' as const,\n fd,\n body: typeof data === 'string' ? encoder.encode(data) : data,\n fds: options.fds ?? [],\n nonblock: options.nonblock === true,\n };\n}\n\nexport function recvmsgRequest(fd: number, max = RECV_DEFAULT, options: JsRecvmsgOptions = {}) {\n return {\n op: 'sock-recvmsg' as const,\n fd,\n max,\n cloexec: options.cloexec === true,\n nonblock: options.nonblock === true,\n };\n}\n\nexport function decodeReceived(frame: Uint8Array): JsReceived {\n const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);\n const count = view.getUint32(0, true);\n const fds: number[] = [];\n for (let i = 0; i < count; i++) fds.push(view.getUint32(8 + i * 4, true));\n return {\n bytes: frame.slice(8 + count * 4),\n fds,\n ctrunc: (view.getUint32(4, true) & 1) === 1,\n };\n}\n\ninterface AsyncKernel {\n json(req: SyncSabRequestBody): Promise<unknown>;\n blocking(req: WasmSyscall, signal?: AbortSignal): Promise<SyncFsResult>;\n call(req: SyncSabRequestBody): Promise<SyncFsResult>;\n}\n\ntype Watch = (fd: number) => { signal: AbortSignal; done(): void };\n\nasync function blocked(\n kernel: AsyncKernel,\n watch: Watch,\n req: WasmSyscall & { fd: number; nonblock: boolean }\n) {\n if (req.nonblock) return kernel.call(req);\n const { signal, done } = watch(req.fd);\n try {\n return await kernel.blocking(req, signal);\n } finally {\n done();\n }\n}\n\nexport function rightsAsync(kernel: AsyncKernel, forget: (fd: number) => void, watch: Watch) {\n return {\n socketpair: async () =>\n (await kernel.json({ op: 'sock-pair', domain: 'unix', type: 'stream' })) as [number, number],\n sendmsg: async (fd: number, data: Uint8Array | string, options?: JsSendmsgOptions) =>\n jsonOf(await blocked(kernel, watch, sendmsgRequest(fd, data, options))) as number,\n async recvmsg(fd: number, max?: number, options?: JsRecvmsgOptions): Promise<JsReceived> {\n const got = decodeReceived(\n bytesOf(await blocked(kernel, watch, recvmsgRequest(fd, max, options)))\n );\n for (const n of got.fds) forget(n);\n return got;\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 ...(o.cwd === undefined ? {} : { chdir: true as const }),\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 { physicalPath } from '../../fs/physical-path.ts';\nimport type { JsLane } from '../../kernel/protocol.ts';\nimport { SIG } from '../../kernel/signals.ts';\nimport {\n parseSyncFsStat,\n SYNC_FS_READ_ONLY,\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsBridgeStat,\n type SyncFsResult,\n} from '../../realm/sync-fs-wire.ts';\nimport { createSyncSabTransport, type SyncSabTransport } from '../../realm/sync-sab-bridge.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport type { JsChild, JsSpawnOptions } from './js-children.ts';\nimport {\n devExists,\n devOpen,\n devReaddir,\n devReadlink,\n devResolveTarget,\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 intoTarget,\n isExclusive,\n type JsOpenOptions,\n type JsStatFs,\n type JsWriteOptions,\n joined,\n MAX_IO,\n MAX_PREAD,\n openRequest,\n readDevice,\n statFsOf,\n writeDevice,\n written,\n} from './js-io.ts';\nimport { callError, devOf, JsCallError, type JsKernel, modeOf } from './js-kernel.ts';\nimport type { JsSyncNet } from './js-net.ts';\nimport { procFsSync, procOpenSync } from './js-proc.ts';\nimport {\n decodeReceived,\n type JsReceived,\n type JsRecvmsgOptions,\n type JsSendmsgOptions,\n recvmsgRequest,\n sendmsgRequest,\n} from './js-rights.ts';\nimport type { JsRunOptions, JsRunResult } from './js-run.ts';\nimport type { JsSyncTty } from './js-tty.ts';\nimport type { JsWasi, JsWasiOptions } from './js-wasi.ts';\nimport type { JsWatcher, JsWatchListener, JsWatchOptions } from './js-watch.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 readInto(position: number, into: Uint8Array, offset?: number, length?: number): number;\n write(position: number, data: Uint8Array): number;\n truncate(size: number): void;\n sync(): void;\n close(): void;\n}\n\nexport interface JsCred {\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 JsStackFormatterFn = (\n error: unknown,\n callSites: readonly object[],\n own?: (error: unknown, callSites: object[]) => unknown\n) => unknown;\n\nexport interface JsSyncContext {\n readonly kernel: { readonly version: string };\n tty: JsSyncTty;\n run(options: JsRunOptions): JsRunResult;\n spawn(options: JsSpawnOptions): JsChild;\n exit(status?: number): never;\n kill(pid: number, signal?: number | `SIG${string}`): void;\n cred(): JsCred;\n umask(mask?: number): number;\n setcred(change: Partial<JsCred>): JsCred;\n runScript(\n source: string,\n options?: { filename?: string }\n ): { value: unknown; completion: boolean } | undefined;\n promiseState(\n promise: unknown\n ): { state: 'pending' | 'fulfilled' | 'rejected'; value: unknown } | undefined;\n setStackFormatter?(\n fn: JsStackFormatterFn | null,\n options?: { own?: boolean }\n ): JsStackFormatterFn | null;\n errorSource?(\n error: unknown\n ): { sourceLine: string; lineNumber: number; startColumn: number } | undefined;\n read(fd: number, max?: number): Uint8Array;\n write(fd: number, data: Uint8Array | string, options?: JsWriteOptions): number;\n close(fd: number): void;\n socketpair(): [number, number];\n sendmsg(fd: number, data: Uint8Array | string, options?: JsSendmsgOptions): number;\n recvmsg(fd: number, max?: number, options?: JsRecvmsgOptions): JsReceived;\n pipe(): [number, number];\n open(path: string, options?: JsOpenOptions): JsSyncFile;\n wasi: { create(options?: JsWasiOptions): JsWasi };\n net: JsSyncNet;\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, options?: { recursive?: boolean; mode?: number }): void;\n rm(path: string): void;\n unlink(path: string): void;\n rename(from: string, to: string): void;\n chmod(path: string, mode: number): void;\n link(from: string, to: string): void;\n symlink(target: string, path: string): void;\n readlink(path: string): string;\n statfs(path: string): JsStatFs;\n readFile(path: string): Uint8Array;\n writeFile(path: string, data: Uint8Array | string, options?: { mode?: number }): void;\n watch(\n path: string,\n options: JsWatchOptions | JsWatchListener,\n listener?: JsWatchListener\n ): JsWatcher;\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 closing?(fd: number): void;\n clean?: () => boolean;\n}\n\nconst encoder = new TextEncoder();\n\nexport const noLane: SyncCall = () => ({ ok: false, errno: 'ENOSYS', message: 'no sync lane' });\n\nconst READ_ONLY: ReadonlySet<string> = new Set([...SYNC_FS_READ_ONLY, 'fd-path-flush']);\n\nexport function laneOf(\n lane: JsLane | undefined,\n silence = SYNC_FS_REQUEST_TIMEOUT_MS,\n open: (sab: SharedArrayBuffer, port: JsLane['port']) => SyncSabTransport = createSyncSabTransport\n): SyncCall {\n if (!lane) return noLane;\n const transport = open(lane.sab, lane.port);\n return (req) => {\n if (!READ_ONLY.has(req.op)) return transport.call(req, Number.POSITIVE_INFINITY, req.op);\n try {\n return transport.call(req, silence, req.op);\n } catch (err) {\n const errno = (err as { code?: unknown } | null)?.code;\n return {\n ok: false,\n errno: typeof errno === 'string' ? errno : 'EIO',\n message: err instanceof Error ? err.message : String(err),\n };\n }\n };\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<\n JsSyncContext,\n | 'run'\n | 'spawn'\n | 'exit'\n | 'kill'\n | 'cred'\n | 'setcred'\n | 'kernel'\n | 'umask'\n | 'fs'\n | 'tty'\n | 'wasi'\n | 'net'\n | 'runScript'\n | 'promiseState'\n | 'setStackFormatter'\n | 'errorSource'\n> & { fs: Omit<JsSyncContext['fs'], 'watch'> } {\n const { infos, handles, resolve } = shared;\n const clean = () => shared.clean?.() === true;\n\n const tryDevSync = (abs: string): string | undefined => {\n try {\n const resolved = physicalPath(\n {\n lstat(p) {\n return parseSyncFsStat(kernel.json({ op: 'lstat', path: p })) ?? {};\n },\n readlink(p) {\n return String(kernel.json({ op: 'readlink', path: p }));\n },\n },\n abs\n );\n return resolved !== abs && inDev(resolved) ? resolved : undefined;\n } catch {\n return undefined;\n }\n };\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, options?: JsWriteOptions): number => {\n const bytes = typeof data === 'string' ? encoder.encode(data) : data;\n const i = info(fd);\n if (writeDevice(i)) return bytes.length;\n const nonblock = options?.nonblock === true;\n let at = 0;\n while (at < bytes.length) {\n const body = bytes.subarray(at, at + MAX_IO);\n try {\n const req = { op: 'fd-write' as const, fd, body, ...(nonblock ? { nonblock } : {}) };\n at += written(kernel.blocking(req), 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 if (nonblock) break;\n }\n return at;\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 try {\n if (!clean()) kernel.call({ op: 'fd-path-flush', path: abs });\n const s = parseSyncFsStat(kernel.json({ op, path: abs, devs: true }));\n if (!s) throw new JsCallError('EIO', op);\n return s;\n } catch (err) {\n if (!(err instanceof JsCallError) || err.code !== 'ENOENT') throw err;\n const devPath = err.dev;\n if (!devPath) throw err;\n return devSync(kernel, devStat(devPath, op === 'stat'));\n }\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 try {\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 } catch (err) {\n if (!(err instanceof JsCallError) || err.code !== 'ENOENT') throw err;\n const devPath = tryDevSync(abs);\n if (!devPath) throw err;\n return openDev(devPath, options);\n }\n };\n\n return {\n read,\n write,\n close(fd) {\n handles.get(fd)?.();\n handles.delete(fd);\n infos.delete(fd);\n shared.closing?.(fd);\n kernel.call({ op: 'fd-close', fd });\n },\n socketpair: () =>\n kernel.json({ op: 'sock-pair', domain: 'unix', type: 'stream' }) as [number, number],\n sendmsg: (fd, data, options) => kernel.json(sendmsgRequest(fd, data, options)) as number,\n recvmsg(fd, max, options) {\n const got = decodeReceived(kernel.bytes(recvmsgRequest(fd, max, options)));\n for (const n of got.fds) infos.delete(n);\n return got;\n },\n pipe: () => kernel.json({ op: 'fd-pipe' }) as [number, number],\n open: procOpenSync(open, kernel, { resolve, pid: shared.pid }),\n fs: procFsSync(syncPathOps(kernel, resolve, statOf, open, clean), kernel, {\n resolve,\n pid: shared.pid,\n }),\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 pread = (\n position: number,\n length: number,\n target?: { into: Uint8Array; at: number }\n ): Uint8Array | number => {\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_PREAD);\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 if (target) target.into.set(chunk, target.at + got);\n else parts.push(chunk);\n got += chunk.length;\n } while (got < length);\n return target ? got : joined(parts, got);\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 readInto(position: number, into: Uint8Array, offset = 0, length = into.length - offset) {\n return pread(position, length, intoTarget(into, offset, length)) as number;\n },\n read(position: number, length: number) {\n return pread(position, length) as Uint8Array;\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 clean: () => boolean\n): Omit<JsSyncContext['fs'], 'watch'> {\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 const found = kernel.json({ op: 'exists', path: abs, devs: true });\n if (found === true) return true;\n const devPath = devOf(found);\n return devPath ? devSync(kernel, devExists(devPath)) : false;\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, options) =>\n void kernel.call({\n op: 'mkdir',\n path: resolve(path),\n ...(options?.recursive === false ? { exclusive: true } : {}),\n mode: options?.mode === undefined ? 0o777 : modeOf(options.mode),\n }),\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 chmod: (path, mode) =>\n void kernel.call({ op: 'chmod', path: resolve(path), mode: modeOf(mode) }),\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 statfs(path) {\n let abs = resolve(path);\n if (inDev(abs)) {\n try {\n const target = devSync(kernel, devResolveTarget(abs)) as string | undefined;\n if (target?.startsWith('/')) abs = target;\n } catch {}\n }\n statOf('stat', abs);\n return statFsOf(kernel.json({ op: 'statfs', path: abs }));\n },\n readFile(path) {\n const abs = resolve(path);\n if (inDev(abs)) return readWholeSync(open(abs));\n try {\n if (!clean()) kernel.call({ op: 'fd-path-flush', path: abs });\n return kernel.bytes({ op: 'read', path: abs, devs: true });\n } catch (err) {\n if (!(err instanceof JsCallError) || err.code !== 'ENOENT') throw err;\n const devPath = err.dev;\n if (!devPath) throw err;\n return readWholeSync(open(devPath));\n }\n },\n writeFile(path, data, options) {\n const mode = options?.mode;\n const file = open(path, {\n write: true,\n create: true,\n truncate: true,\n ...(mode !== undefined ? { mode } : {}),\n });\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 JsSyncTty {\n getAttr(fd: number): JsTermios;\n setAttr(fd: number, termios: JsTermios): void;\n setRaw(fd: number, raw: boolean): void;\n}\n\ninterface SyncTtyKernel {\n json(req: Parameters<JsKernel['json']>[0]): unknown;\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(\n kernel: JsKernel,\n syncKernel?: SyncTtyKernel\n): {\n tty: JsTty;\n syncTty: JsSyncTty;\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 syncGet = (fd: number): JsTermios =>\n (syncKernel as SyncTtyKernel).json({ op: 'tty-get', fd }) as JsTermios;\n const syncSet = (fd: number, termios: JsTermios): void =>\n void (syncKernel as SyncTtyKernel).json({ op: 'tty-set', fd, termios: copy(termios) });\n const syncTty: JsSyncTty = {\n getAttr: syncGet,\n setAttr: syncSet,\n setRaw(fd, raw) {\n const info = (syncKernel as SyncTtyKernel).json({ op: 'fd-info', fd }) as FdInfo;\n const terminal = info.terminal ?? `fd ${fd}`;\n if (!raw) {\n const original = saved.get(terminal);\n saved.delete(terminal);\n if (original) syncSet(fd, original.termios);\n return;\n }\n const current = syncGet(fd);\n if (!saved.has(terminal)) saved.set(terminal, { fd, termios: current });\n syncSet(fd, rawOf(current));\n },\n };\n\n const modes = () =>\n [...saved].reverse().map(([terminal, { fd, termios }]) => ({ terminal, fd, termios }));\n return { tty, syncTty, restore, modes };\n}\n", "import {\n flushLiveVfs,\n invalidateLiveVfs,\n type LiveCred,\n type LiveMountFsApi,\n liveRoot,\n mountLiveVfsDirs,\n readingLinks,\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 sliccChdirAt?(path: string): void;\n sliccHeldCwd?(): string;\n sliccCwdGone?(): boolean;\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 cred?: LiveCred;\n}\n\nconst KERNEL_DEV_DIRS = ['/dev/shm'];\n\nfunction kernelDevDirs(bridge: SyncFsPosixBridge): string[] {\n return KERNEL_DEV_DIRS.filter((dir) => {\n try {\n return bridge.stat(dir).isDirectory;\n } catch {\n return false;\n }\n });\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\ninterface MayDeleteFs {\n mayDelete?(dir: object, name: string, isdir: boolean): number;\n lookupNode?(parent: object, name: string): { parent?: object };\n}\n\nfunction linuxRmdir(Fs: EmscriptenFsForHook): void {\n const raw = Fs as unknown as MayDeleteFs;\n const { mayDelete, lookupNode } = raw;\n if (!mayDelete || !lookupNode) return;\n raw.mayDelete = (dir: object, name: string, isdir: boolean): number => {\n const code = mayDelete.call(raw, dir, name, isdir);\n if (code !== 10 || !isdir) return code;\n try {\n const node = lookupNode.call(raw, dir, name) as { parent?: object };\n if (node === node.parent) return 10;\n } catch {\n return code;\n }\n return 0;\n };\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(\n Fs,\n bridge,\n [...(dirs ?? []), ...kernelDevDirs(bridge)],\n warn\n );\n if (dirs) liveRoot(Fs, bridge);\n if (bridge.owners && Fs.lookupPath) useLiveChown(Fs as Parameters<typeof useLiveChown>[0]);\n if (bridge.links && Fs.lookupPath) readingLinks(Fs as Parameters<typeof readingLinks>[0]);\n linuxRmdir(Fs);\n if (deps.cred) Fs.sliccCred = deps.cred;\n try {\n (Fs.sliccChdirAt ?? Fs.chdir).call(Fs, deps.cwd);\n } catch (err) {\n warn(`cannot chdir to ${deps.cwd}: errno ${(err as { errno?: unknown }).errno}`);\n }\n return {\n mounted,\n flush: () => flushLiveVfs(Fs, plugin),\n flushDirty: () => plugin.flushDirty(),\n invalidate: () => invalidateLiveVfs(Fs, plugin),\n };\n}\n", "import type { ProcessFs, ProcessStream, ProcessSys } from './kernel-streams.ts';\nimport { fdOfPath } from './process-fds.ts';\n\ntype Call = <T>(syscall: () => T) => T;\n\ninterface MetadataFs {\n chown?(path: string | object, uid: number, gid: number, dontFollow?: boolean): void;\n lchown?(path: string, uid: number, gid: number): void;\n fchown?(fd: number, uid: number, gid: number): void;\n chmod?(path: string | object, mode: number, dontFollow?: boolean): void;\n fchmod?(fd: number, mode: number): void;\n utime?(path: string, atime: number | null, mtime: number | null): void;\n sliccTouch?: boolean;\n}\n\nfunction idOf(value: number): number | undefined {\n return value === -1 || value === 0xffffffff ? undefined : value >>> 0;\n}\n\nfunction timeOf(value: number | null | undefined): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nexport function useKernelFdMetadata(Fs: ProcessFs, sys: ProcessSys, call: Call): void {\n const { fdChown, fdChmod, fdUtimes } = sys;\n const meta = Fs as unknown as MetadataFs;\n const kernelFd = (stream: ProcessStream | null | undefined): number | undefined =>\n stream?.sliccKernelFile ? stream.sliccKernelFd : undefined;\n const find = (match: (s: ProcessStream) => boolean): number | undefined => {\n for (const s of Fs.streams) {\n const kfd = s && match(s) ? kernelFd(s) : undefined;\n if (kfd !== undefined) return kfd;\n }\n return undefined;\n };\n const ofPath = (path: string | object, follow: boolean): number | undefined => {\n if (typeof path !== 'string') return find((s) => s.node === path);\n const fd = follow ? fdOfPath(path, Fs.cwd()) : undefined;\n if (fd !== undefined) return kernelFd(Fs.getStream(fd));\n return find((s) => s.path === path);\n };\n const ofFd = (fd: number): number | undefined => kernelFd(Fs.getStream(fd));\n const chownBy = (kfd: number, uid: number, gid: number) =>\n call(() => fdChown?.call(sys, kfd, idOf(uid), idOf(gid)));\n if (fdChown && meta.chown) {\n const chown = meta.chown.bind(Fs);\n meta.chown = (path, uid, gid, dontFollow) => {\n const kfd = ofPath(path, !dontFollow);\n if (kfd === undefined) return chown(path, uid, gid, dontFollow);\n chownBy(kfd, uid, gid);\n };\n }\n if (fdChown && meta.fchown) {\n const fchown = meta.fchown.bind(Fs);\n meta.fchown = (fd, uid, gid) => {\n const kfd = ofFd(fd);\n if (kfd === undefined) return fchown(fd, uid, gid);\n chownBy(kfd, uid, gid);\n };\n }\n if (fdChmod && meta.chmod) {\n const chmod = meta.chmod.bind(Fs);\n meta.chmod = (path, mode, dontFollow) => {\n const kfd = ofPath(path, !dontFollow);\n if (kfd === undefined) return chmod(path, mode, dontFollow);\n call(() => fdChmod.call(sys, kfd, mode & 0o7777));\n };\n }\n if (fdChmod && meta.fchmod) {\n const fchmod = meta.fchmod.bind(Fs);\n meta.fchmod = (fd, mode) => {\n const kfd = ofFd(fd);\n if (kfd === undefined) return fchmod(fd, mode);\n call(() => fdChmod.call(sys, kfd, mode & 0o7777));\n };\n }\n if (fdUtimes && meta.utime) {\n const utime = meta.utime.bind(Fs);\n meta.utime = (path, atime, mtime) => {\n const kfd = ofPath(path, true);\n if (kfd === undefined) return utime(path, atime, mtime);\n const now = meta.sliccTouch === true;\n call(() => fdUtimes.call(sys, kfd, timeOf(atime), timeOf(mtime), now));\n };\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 { useKernelFdMetadata } from './fd-metadata.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\nconst PTS_MAJOR = 136;\n\ninterface TtyNodeFs {\n analyzePath?: (path: string) => { exists: boolean };\n mkdev?: (path: string, dev: number) => unknown;\n makedev?: (major: number, minor: number) => number;\n registerDevice?: (dev: number, ops: object) => void;\n}\n\ninterface DevDirFs extends TtyNodeFs {\n mkdir?: (path: string, mode?: number) => unknown;\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';\nconst EMBEDDER_PATH = '/dev/embedder';\nconst DEVICE_INO: Readonly<Record<number, number>> = { 250: 1, 251: 2, 252: 3 };\n\nfunction sealedStat(minor = 250): object {\n const now = new Date();\n return {\n dev: 0x16,\n ino: DEVICE_INO[minor] as number,\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;\nconst O_DIRECTORY = 0o200000;\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 ino?: number;\n fifo?: boolean;\n nofollow?: boolean;\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 fdStat?(fd: number): object | undefined;\n fdChmod?(fd: number, mode: number): void;\n fdChown?(fd: number, uid: number | undefined, gid: number | undefined): void;\n fdUtimes?(fd: number, atimeMs: number | null, mtimeMs: number | null, now: boolean): void;\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?(flags: number): number;\n openClipboard?(flags: number): number;\n clipboardAbort?(fd: number): void;\n openEmbedder?(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 sliccKernelFifo?: string;\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\nfunction datesOf(real: object | undefined): Record<string, Date> {\n const dates: Record<string, Date> = {};\n for (const [key, value] of Object.entries(real ?? {}))\n if (/^[amc]time$/.test(key) && (typeof value === 'string' || typeof value === 'number'))\n dates[key] = new Date(value);\n return dates;\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 attachFifo(stream: ProcessStream, path: string): void {\n const kfd = this.call(() =>\n this.restarting(() => this.sys.openVfs(path, stream.flags, 0, { fifo: true }))\n );\n this.attach(stream, kfd, false);\n stream.sliccKernelFifo = path;\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 nameDevice(stream: ProcessStream, kind: 'sealed' | 'clipboard' | 'embedder'): void {\n this.nameStream(stream, `/dev/${kind}`);\n }\n\n private listSealed(): void {\n const fs = this.Fs as unknown as TtyNodeFs;\n const { analyzePath, mkdev, makedev, registerDevice } = fs;\n if (!analyzePath || !mkdev || !makedev) return;\n const nodes: Array<[string, number, ((flags: number) => number) | undefined]> = [\n [SEALED_PATH, 250, this.sys.openSealed],\n [CLIPBOARD_PATH, 251, this.sys.openClipboard],\n [EMBEDDER_PATH, 252, this.sys.openEmbedder],\n ];\n for (const [path, minor, opener] of nodes) {\n if (!opener) continue;\n const dev = makedev.call(fs, 10, minor);\n registerDevice?.call(fs, dev, {\n open: (stream: ProcessStream) => this.openNode(stream, path, opener),\n });\n if (analyzePath.call(fs, path).exists) continue;\n try {\n const node = mkdev.call(fs, path, dev);\n if (typeof node === 'object' && node !== null) {\n const made = node as { node_ops?: object };\n made.node_ops = { ...made.node_ops, getattr: () => sealedStat(minor) };\n }\n } catch {}\n }\n }\n\n private openNode(\n stream: ProcessStream,\n path: string,\n opener: (flags: number) => number,\n terminal = false\n ): void {\n let kfd: number;\n try {\n kfd = this.call(() => opener.call(this.sys, stream.flags & 3));\n } catch (e) {\n this.Fs.closeStream(stream.fd);\n throw e;\n }\n this.attach(stream, kfd, terminal);\n this.nameStream(stream, path);\n if (path === CLIPBOARD_PATH) this.reportClose(kfd);\n if (path === EMBEDDER_PATH) this.reportClose(kfd);\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 usePtsNodes(): void {\n const fs = this.Fs as unknown as DevDirFs;\n const { lookupNode, readdir, getPath, mkdir, mkdev, makedev } = fs;\n const numbers = this.sys.ptyNumbers?.bind(this.sys);\n if (!lookupNode || !readdir || !getPath || !mkdir || !mkdev || !makedev || !numbers) return;\n const make = (parent: object, name: string): boolean => {\n const dir = getPath.call(fs, parent);\n if (dir === '/dev' && name === 'pts') mkdir.call(fs, '/dev/pts', 0o755);\n else if (dir === '/dev' && name === 'ptmx' && this.sys.openPty)\n this.ptyNode('/dev/ptmx', makedev.call(fs, 5, 2));\n else if (dir === '/dev/pts' && numbers().includes(Number(name)) && /^\\d+$/.test(name))\n this.ptyNode(`/dev/pts/${name}`, makedev.call(fs, PTS_MAJOR, Number(name)));\n else return false;\n return true;\n };\n fs.lookupNode = (parent, name) => {\n try {\n return lookupNode.call(fs, parent, name);\n } catch (e) {\n if (this.creatingTerminal) throw e;\n this.creatingTerminal = true;\n let made: boolean;\n try {\n made = make(parent, name);\n } finally {\n this.creatingTerminal = false;\n }\n if (!made) throw e;\n return lookupNode.call(fs, parent, name);\n }\n };\n fs.readdir = (path) => {\n const at = path.replace(/\\/+$/, '');\n if (at === '/dev/pts') return ['.', '..', ...numbers().map(String)];\n const names = readdir.call(fs, path);\n if (at !== '/dev') return names;\n const extra = ['pts', ...(this.sys.openPty ? ['ptmx'] : [])];\n return [...names, ...extra.filter((name) => !names.includes(name))];\n };\n }\n\n private ptyNode(path: string, dev: number): void {\n const fs = this.Fs as unknown as DevDirFs;\n fs.registerDevice?.call(fs, dev, {\n open: (stream: ProcessStream) => {\n const n = PTY_PATH.exec(path)?.[1];\n const { openPty, openPts } = this.sys as Required<Pick<ProcessSys, 'openPty' | 'openPts'>>;\n const opener = () =>\n n === undefined\n ? openPty.call(this.sys)\n : openPts.call(this.sys, Number(n), (stream.flags & O_NOCTTY) !== 0);\n this.openNode(stream, path, opener, true);\n },\n });\n fs.mkdev?.call(fs, path, dev);\n }\n\n private ptsTarget(path: string, st: unknown): string | undefined {\n if (((st as { rdev?: number } | null)?.rdev ?? 0) < PTS_MAJOR << 8) return undefined;\n const { lookupPath } = this.Fs as unknown as DevDirFs;\n const real = lookupPath?.call(this.Fs, path, { follow: true }).path;\n return real !== undefined && isPtyPath(real) ? real : undefined;\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 getattr = this.kernelAttrs(stream, kfd);\n if (getattr) this.describe(stream, `${stream.path ?? ''}:${++this.described}`, getattr);\n }\n\n fstatFromKernel(stream: ProcessStream, kfd: number): void {\n const getattr = this.kernelAttrs(stream, kfd);\n if (getattr) stream.stream_ops = { ...stream.stream_ops, getattr };\n }\n\n private kernelAttrs(stream: ProcessStream, kfd: number): (() => object) | undefined {\n const { size, fdStat } = this.sys;\n if (!size) return undefined;\n const node = stream.node;\n return () => {\n const base = node.node_ops?.getattr?.(node);\n const live = this.call(() => size.call(this.sys, kfd));\n const real = fdStat && this.call(() => fdStat.call(this.sys, kfd));\n return { ...base, ...real, ...datesOf(real), size: live };\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 useKernelFdMetadata(): void {\n useKernelFdMetadata(this.Fs, this.sys, this.call.bind(this));\n }\n\n useControllingTerminal(): void {\n if (typeof this.Fs.open !== 'function') return;\n this.usePtyPaths();\n this.useTerminalNodes();\n this.usePtsNodes();\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, flags & 3));\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 clipboard = path === CLIPBOARD_PATH;\n const opener = clipboard ? this.sys.openClipboard : this.sys.openEmbedder;\n if ((!clipboard && path !== EMBEDDER_PATH) || !opener) return undefined;\n if (flags & O_DIRECTORY) throw new this.Fs.ErrnoError(wasiErrno('ENOTDIR'));\n const kfd = this.call(() => opener.call(this.sys, flags & 3));\n try {\n const stream = this.vessel(open, kfd, { path, flags, mode }, false);\n this.reportClose(kfd);\n return stream;\n } catch (e) {\n this.sys.clipboardAbort?.(kfd);\n this.sys.close(kfd);\n throw e;\n }\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 if (path === EMBEDDER_PATH && this.sys.openEmbedder) return sealedStat(252);\n const owned = this.ownedTty(path);\n if (owned && isPtyPath(path)) return this.owned(path, ptyStat(path));\n if (!isPtyPath(path))\n return this.pathStat(path, original.call(fs, path, ...rest), name, owned);\n this.existingPty(path);\n const st = ptyStat(path);\n return this.options.owners === true ? { ...st, uid: 0, gid: 0 } : st;\n };\n }\n }\n\n private pathStat(path: string, st: unknown, name: 'stat' | 'lstat', owned: boolean): unknown {\n const pts = name === 'stat' ? this.ptsTarget(path, st) : undefined;\n if (pts) {\n this.existingPty(pts);\n return owned ? this.owned(pts, ptyStat(pts)) : ptyStat(pts);\n }\n return owned && TTY_PATH.test(path) ? this.owned(path, st as object) : st;\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 = new Uint8Array(buffer.buffer, buffer.byteOffset + offset, length).slice();\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 { 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 stat?: { ino?: 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\nfunction heldOf(live: LiveNodeBag['live']): {\n pin?: { version: string; size: number };\n handle?: number;\n ino?: number;\n} {\n const ranged = live?.ranged;\n const version = ranged?.pinnedVersion;\n const pin = ranged && version !== undefined ? { version, size: ranged.size() } : undefined;\n const handle = live?.handle;\n const ino = live?.stat?.ino;\n return {\n ...(pin ? { pin } : {}),\n ...(handle !== undefined ? { handle } : {}),\n ...(handle !== undefined && ino !== undefined ? { ino } : {}),\n };\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 const live = stream.stream_ops;\n let kfd = promoted.get(stream.shared);\n if (kfd === undefined) {\n live.fsync?.(stream);\n const contents = orphanContents(stream);\n const held = heldOf((stream.node as LiveNodeBag).live);\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 streams.fstatFromKernel(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\nconst NAMED_DEVICES: Readonly<Record<string, 'sealed' | 'clipboard' | 'embedder'>> = {\n '/dev/sealed': 'sealed',\n '/dev/clipboard': 'clipboard',\n '/dev/embedder': 'embedder',\n};\n\nconst DEVICE_KINDS: ReadonlySet<string> = new Set(['sealed', 'clipboard', 'embedder']);\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 device = stream.path === undefined ? undefined : NAMED_DEVICES[stream.path];\n const kind = stream.sliccKernelFile ? 'file' : stream.tty ? 'tty' : (device ?? 'stream');\n const access = kind === 'tty' ? O_RDWR : (stream.flags ?? O_RDWR) & O_ACCMODE;\n const fifo = stream.sliccKernelFifo ? { fifo: stream.sliccKernelFifo } : {};\n return { fd: stream.fd, kernel, kind, flags: access, ...cloexec, ...fifo };\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 const access = entry.flags ?? O_RDWR;\n if (entry.kind === 'socket') return streams.socketStream(access);\n if (entry.kind === 'tty') return Fs.open('/dev/tty', O_RDWR);\n if (entry.kind === 'stream' || DEVICE_KINDS.has(entry.kind)) return Fs.open('/dev/null', access);\n Fs.mkdirTree(PLACEHOLDER_DIR);\n return Fs.open(`${PLACEHOLDER_DIR}/${entry.fd}`, access | 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' || entry.kind === 'embedder') streams.reportClose(entry.kernel);\n if (DEVICE_KINDS.has(entry.kind))\n streams.nameDevice(stream, entry.kind as 'sealed' | 'clipboard' | 'embedder');\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 if (entry.fifo) stream.path = entry.fifo;\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, SIG, sigbit } 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 { lockPromoters } from './process-locks.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 UNSEEDED = sigbit(SIG.KILL) | sigbit(SIG.STOP) | 1;\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\nexport function inheritedOf(r: SyncFsResult): number {\n return r.ok && r.kind === 'json' ? (r.json as number) & ~UNSEEDED : 0;\n}\n\nexport function inheritedSignals(transport: SyncSabTransport): number {\n return inheritedOf(\n transport.call({ op: 'sig-inherited' }, Number.POSITIVE_INFINITY, 'sig-inherited')\n );\n}\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 sigInherited(): 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: heldCwdOf(deps.Fs) };\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\nconst heldCwdOf = (Fs: ProcessFs): string => (Fs.sliccHeldCwd ?? Fs.cwd).call(Fs);\n\nexport function createProcessKernel(deps: ProcessKernelDeps): ProcessKernel {\n const { transport, Fs } = deps;\n if (deps.stdioPromoter) lockPromoters.set(Fs, deps.stdioPromoter);\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 ?? heldCwdOf(Fs),\n ...(cwd !== null ? { chdir: true as const } : {}),\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: () => status(call({ op: 'sig-pause' }, 'pause')),\n sigInherited: () => inheritedOf(call({ op: 'sig-inherited' }, 'sig-inherited')),\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 {\n SAB_I_BLOCKED,\n SAB_I_KILLED,\n SAB_I_SIGNALS,\n SAB_I_TIMERS,\n} from '../realm/sync-sab-wire.ts';\n\nexport interface SignalMasks {\n caught: number;\n ignored: number;\n restart: number;\n defaults?: number;\n nocldwait?: boolean;\n}\n\nexport interface SignalHooks {\n masks(): SignalMasks | 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, nocldwait: false };\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 raised = 0;\n\n private entering = 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 nocldwait = masks.nocldwait === true;\n const was = this.reported;\n const same = caught === was.caught && ignored === was.ignored && nocldwait === was.nocldwait;\n if (same && defaults === 0) return;\n this.reported = { caught, ignored, nocldwait };\n const req = {\n op: 'sig-mask' as const,\n caught,\n ignored,\n ...(defaults ? { defaults } : {}),\n ...(nocldwait ? { nocldwait } : {}),\n };\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) & ~Atomics.load(header, SAB_I_BLOCKED)) |\n Atomics.load(header, SAB_I_TIMERS) |\n Atomics.load(header, SAB_I_KILLED);\n if (pending === 0) return false;\n if (this.entering === 0) this.raised = this.quieted > 0 ? -1 : 0;\n this.entering++;\n try {\n this.deliver();\n } finally {\n this.entering--;\n }\n return true;\n }\n\n raisedOnEntry(): number {\n return this.raised;\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 blocked = Atomics.load(this.header, SAB_I_BLOCKED);\n const pending =\n blocked === 0\n ? Atomics.exchange(this.header, SAB_I_SIGNALS, 0)\n : Atomics.and(this.header, SAB_I_SIGNALS, blocked) & ~blocked;\n\n if (this.depth <= 1) this.lastDelivered = pending | (timers & 1 ? sigbit(SIG.ALRM) : 0);\n if (pending !== 0 || timers !== 0) this.delivered++;\n this.raised |= pending | (timers & 1 ? sigbit(SIG.ALRM) : 0) | (timers & ~1 ? -1 : 0);\n for (let which = 0; which < 3; which++) {\n if (timers & (1 << which)) this.hooks.timer?.(which);\n }\n for (const sig of signalsIn(pending)) this.hooks.raise(sig);\n }\n}\n", "import { normalizePath } from '../fs/types.ts';\nimport type { SockAddr, SocketDomain } from '../kernel/socket.ts';\nimport type { SocketSyscall } from '../kernel/socket-syscalls.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport type { SyncSabTransport } from '../realm/sync-sab-bridge.ts';\nimport {\n type KernelStreams,\n O_NONBLOCK,\n ProcessExit,\n type ProcessFs,\n type ProcessStream,\n type ProcessSys,\n SyscallError,\n} from './kernel-streams.ts';\nimport { setCloseOnExec } from './process-fds.ts';\nimport { wasiErrno } from './wasi-errno.ts';\n\nconst O_RDWR = 2;\nconst KILLED_BY_SIGPIPE = 128 + 13;\nexport interface SocketKernel {\n socket(domain: SocketDomain, nonblock: boolean, cloexec?: boolean): number;\n socketpair(domain: SocketDomain, nonblock: boolean, cloexec?: boolean): [number, number] | number;\n bind(fd: number, addr: SockAddr): number;\n listen(fd: number, backlog: number): number;\n accept(\n fd: number,\n nonblock: boolean,\n cloexec?: boolean\n ):\n | {\n fd: number;\n peer: SockAddr;\n }\n | number;\n connect(fd: number, addr: SockAddr): number;\n shutdown(fd: number, how: number): number;\n name(fd: number, peer: boolean): SockAddr | number;\n getopt(\n fd: number,\n level: number,\n name: number\n ):\n | {\n value: number;\n }\n | number;\n setopt(fd: number, level: number, name: number, value: number): number;\n 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}\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\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(() => done({ op: 'sock-bind', fd: kfd(fd), addr: resolved(Fs, given) })),\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 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 { Cred } from '../kernel/cred.ts';\nimport type { DeviceMeta, HeldMeta, PollState } from '../kernel/fd-table.ts';\nimport { type CwdAnswer, HeldCwd, type HeldCwdReply } from '../kernel/held-cwd.ts';\nimport { initHostname } from '../kernel/net/loopback-names.ts';\nimport type { MountLine, ProcessListing } from '../kernel/proc-info.ts';\nimport {\n type ForkState,\n type InheritedFd,\n WASM_PROCESS_READY,\n type WasmProcessInitMsg,\n} from '../kernel/protocol.ts';\nimport { SIG } from '../kernel/signals.ts';\nimport type { Termios } from '../kernel/tty.ts';\nimport { type HeldCwdFs, holdingCwd } from '../realm/emscripten-held-cwd.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 lookedOutside,\n type SabPostLike,\n type SyncSabTransport,\n} from '../realm/sync-sab-bridge.ts';\nimport {\n publishMemory,\n SAB_HEADER_I32,\n SAB_I_KILLED,\n SAB_I_SIGNALS,\n SAB_I_STOP,\n SAB_I_TIMERS,\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, inheritedSignals, type ProcessKernel } from './process-children.ts';\nimport {\n devCreations,\n type FdImports,\n type GlueSyscalls,\n goneCwdGetcwd,\n type KernelImports,\n kernelAccess,\n kernelLink,\n kernelUmask,\n kernelUname,\n linuxDevices,\n type Memalign,\n noFollowUtimes,\n pathOpensLinks,\n positionalIo,\n syncFsync,\n trackCloseOnExec,\n useDevFd,\n useDevRemoval,\n useFifoOpens,\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 { closeDropsLocks, kernelFlock, type LockHeld, type LockKernel } from './process-locks.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\nfunction ownBytes(bytes: Uint8Array): Uint8Array {\n if (bytes.constructor === Uint8Array) return bytes;\n return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength).slice();\n}\n\nfunction ownedBuffer(body: Uint8Array, given: Uint8Array): Transferable[] | undefined {\n return body === given ? undefined : [body.buffer as ArrayBuffer];\n}\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 & LockKernel {\n const call = (\n req: SyncSabRequestBody,\n label: string,\n transfer?: Transferable[]\n ): SyncFsResult => {\n const r = transport.call(req, Number.POSITIVE_INFINITY, label, transfer);\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 body = ownBytes(bytes);\n const req = {\n op: 'fd-write' as const,\n fd,\n body,\n ...(opts?.nonblock ? { nonblock: true } : {}),\n };\n const n = json(call(req, `fd-write ${fd}`, ownedBuffer(body, bytes)));\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 ...(opts?.ino !== undefined ? { ino: opts.ino } : {}),\n ...(opts?.nofollow ? { nofollow: true } : {}),\n ...(opts?.fifo ? { fifo: true } : {}),\n },\n `fd-open-vfs ${path}`\n )\n ) as number;\n },\n seek(fd, offset, whence) {\n return json(call({ op: 'fd-seek', fd, offset, whence }, `fd-seek ${fd}`)) as number;\n },\n flush(fd) {\n call({ op: 'fd-flush', fd }, `fd-flush ${fd}`);\n },\n pread(fd, max, at) {\n const r = call({ op: 'fd-pread', fd, max, offset: at }, `fd-pread ${fd}`);\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n },\n pwrite(fd, bytes, at) {\n const body = ownBytes(bytes);\n return json(\n call({ op: 'fd-pwrite', fd, offset: at, body }, `fd-pwrite ${fd}`, ownedBuffer(body, bytes))\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 fdStat(fd) {\n const r = json(call({ op: 'fd-vfs-stat', fd, full: true }, `fd-vfs-stat ${fd}`)) as\n | { stat?: object }\n | undefined;\n return r?.stat;\n },\n fdChmod(fd, mode) {\n call({ op: 'fd-chmod', fd, mode }, `fd-chmod ${fd}`);\n },\n fdChown(fd, uid, gid) {\n const ids = { ...(uid !== undefined ? { uid } : {}), ...(gid !== undefined ? { gid } : {}) };\n call({ op: 'fd-chown', fd, ...ids }, `fd-chown ${fd}`);\n },\n fdUtimes(fd, atimeMs, mtimeMs, now) {\n call({ op: 'fd-utimes', fd, atimeMs, mtimeMs, now }, `fd-utimes ${fd}`);\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(flags) {\n return json(call({ op: 'fd-open-sealed', flags }, '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 clipboardAbort(fd) {\n call({ op: 'fd-clipboard-abort', fd }, 'fd-clipboard-abort');\n },\n openEmbedder(flags) {\n return json(call({ op: 'fd-open-embedder', flags }, 'fd-open-embedder')) 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 setLock(target, kind, start, len, wait) {\n const req = { op: 'lk-set' as const, ...target, kind, start, len, ...(wait ? { wait } : {}) };\n call(req, 'lk-set');\n },\n getLock(target, kind, start, len) {\n return json(call({ op: 'lk-get', ...target, kind, start, len }, 'lk-get')) as LockHeld | null;\n },\n closeLocks(target) {\n call({ op: 'lk-close', ...target }, 'lk-close');\n },\n flock(fd, kind, wait) {\n call({ op: 'flock', fd, kind, ...(wait ? { wait } : {}) }, `flock ${fd}`);\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([\n 'stream',\n 'file',\n 'socket',\n 'clipboard',\n 'embedder',\n 'sealed',\n]);\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 \" linkat: typeof ___syscall_linkat === 'function' ? ___syscall_linkat : undefined,\",\n \" symlinkat: typeof ___syscall_symlinkat === 'function' ? ___syscall_symlinkat : undefined,\",\n \" uname: typeof ___syscall_uname === 'function' ? ___syscall_uname : 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 \" flock: typeof __syscall_flock === 'function' ? __syscall_flock : 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\nfunction seedInherited(transport: SyncSabTransport, seeded: { bits: number }): number {\n const bits = inheritedSignals(transport);\n seeded.bits |= bits;\n return bits;\n}\n\nexport function signalMasks(\n m: Pick<RunningModule, 'sliccSigMask'>,\n seeded: { bits: number } = { bits: 0 }\n): { caught: number; ignored: number; restart: number; defaults?: number } | null {\n const mask = m.sliccSigMask;\n const caught = mask?.(0) ?? -1;\n if (!mask || caught === -1) return null;\n const ignored = mask(1);\n const defaults = seeded.bits & ~ignored & ~caught;\n seeded.bits &= ~defaults;\n return { caught, ignored, restart: mask(2), ...(defaults ? { defaults } : {}) };\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 poll: () => void = () => undefined\n): void {\n const hold = () => {\n while (Atomics.load(header, SAB_I_STOP) === 1) Atomics.wait(header, SAB_I_STOP, 1);\n const due =\n Atomics.load(header, SAB_I_SIGNALS) |\n Atomics.load(header, SAB_I_TIMERS) |\n Atomics.load(header, SAB_I_KILLED);\n if (due !== 0) poll();\n };\n for (const name of ['fdWrite', 'fdRead', 'sleepMs'] as const) {\n wrapImport(\n imports,\n name,\n glue,\n (original) =>\n (...args) => {\n while (Atomics.load(header, SAB_I_STOP) === 1) Atomics.wait(header, SAB_I_STOP, 1);\n const done = original(...args);\n hold();\n return done;\n },\n true\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 & LockKernel;\n memory: () => WebAssembly.Memory | undefined;\n ppid: () => number;\n poll: () => void;\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 goneCwdGetcwd(imports, fsOf, kernelGlue);\n kernelLink(imports, fsOf, memory, kernelGlue);\n devCreations(imports, fsOf, memory, kernelGlue);\n kernelUname(imports, initHostname(init), memory, kernelGlue);\n wrapImport(\n imports,\n 'flock',\n kernelGlue,\n () => kernelFlock({ fs: fsOf, flock: (fd, kind, wait) => sys.flock?.(fd, kind, wait) }),\n true\n );\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, deps.poll);\n}\n\nfunction heldIn(fs: unknown, init: WasmProcessInitMsg, transport: SyncSabTransport): void {\n if (!init.held) return;\n const ask = (req: { op: 'cwd-check' } | { op: 'cwd-chdir'; path: string }) => {\n const r = transport.call(req, Number.POSITIVE_INFINITY, req.op);\n return r.ok && r.kind === 'json' ? r.json : {};\n };\n const check = () => ask({ op: 'cwd-check' }) as CwdAnswer;\n holdingCwd(\n fs as HeldCwdFs,\n new HeldCwd(init.held.sab, init.held.slot, check, init.held),\n (path) => ask({ op: 'cwd-chdir', path }) as HeldCwdReply\n );\n}\n\nfunction bridgeFlags(init: WasmProcessInitMsg): {\n owners?: boolean;\n links?: boolean;\n changes?: SharedArrayBuffer;\n} {\n return {\n ...(init.owners ? { owners: true } : {}),\n ...(init.links ? { links: true } : {}),\n ...(init.changes ? { changes: init.changes } : {}),\n };\n}\n\nfunction credSyncTransport(\n gated: SyncSabTransport,\n early: () => void,\n cred: Cred | undefined\n): SyncSabTransport {\n return {\n call: (req, timeoutMs, label) => {\n if (!FS_OPS.has(req.op)) early();\n const r = gated.call(req, timeoutMs, label);\n if (cred && req.op === 'proc-setcred' && r.ok && r.kind === 'json')\n Object.assign(cred, r.json);\n return r;\n },\n };\n}\n\nfunction sigpipeSpared(transport: SyncSabTransport): boolean {\n const req = { op: 'proc-kill-self' as const, sig: SIG.PIPE, probe: true };\n const r = transport.call(req, Number.POSITIVE_INFINITY, 'proc-kill-self');\n return r.ok && !(r.kind === 'json' && r.json === 'terminate');\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 seeded = { bits: 0 };\n const signals = new SignalGate(\n createSyncSabTransport(init.sab, port, { memory: () => memory?.buffer.byteLength ?? 0 }),\n new Int32Array(init.sab, 0, SAB_HEADER_I32),\n {\n masks: () => signalMasks(module as unknown as RunningModule, seeded),\n raise: (sig) => (module as unknown as RunningModule).sliccRaise?.(sig),\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 = credSyncTransport(gated, () => early(), init.cred);\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 sliccKernel: { sigInherited: () => seedInherited(transport, seeded) },\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 locks: { kernel: sys, memory: () => memory?.buffer, flush: () => early() },\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 poll: () => void signals.interrupt(),\n });\n return WebAssembly.instantiate(init.program.module, watchOutside(imports));\n })\n .then((instance) => {\n memory = wasmMemory(instance, imports);\n port.postMessage({ type: WASM_PROCESS_READY });\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 linuxDevices(running.FS, init.owners === true);\n const vfs = mountVfsIntoEmscripten(running.FS, {\n bridge: createSyncFsSabBridge(transport, bridgeFlags(init)),\n cwd: init.cwd,\n warn: deps.warn ?? say(2),\n cred: init.owners ? init.cred : undefined,\n });\n heldIn(running.FS, init, transport);\n early = () => signals.quiet(() => vfs.flushDirty());\n closeDropsLocks(running.FS, sys);\n const sigpipe = (): boolean => running.sliccSigpipe?.() === 1 || sigpipeSpared(gated);\n const restartable = (): boolean => signals.restartable();\n const streams = new KernelStreams(running.FS, sys, {\n sigpipe,\n restartable,\n ...(init.owners ? { owners: true } : {}),\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, HOSTNAME: initHostname(init) }, 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 streams.useKernelFdMetadata();\n useDevFd(running.FS);\n useDevRemoval(running.FS);\n useFifoOpens(running.FS, (stream, path) => streams.attachFifo(stream, path));\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 pid: init.pid,\n beforeSpawn: () => vfs.flush(),\n afterChild: () => vfs.invalidate(),\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 = initHostname(init);\n running.sliccKernel.net = createSocketKernel({\n transport,\n Fs: running.FS,\n sys,\n streams,\n sigpipe,\n restartable,\n });\n return runWithFlush(running, init, streams, vfs);\n}\n\nfunction runWithFlush(\n running: RunningModule,\n init: WasmProcessInitMsg,\n streams: KernelStreams,\n vfs: { flush(): void }\n): number {\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\nconst OUTSIDE: ReadonlySet<string> = new Set([\n 'clock_time_get',\n 'emscripten_date_now',\n 'emscripten_get_now',\n 'random_get',\n 'getentropy',\n]);\n\nfunction watchOutside(imports: WebAssembly.Imports): WebAssembly.Imports {\n for (const space of Object.values(imports)) {\n for (const [name, value] of Object.entries(space)) {\n if (!OUTSIDE.has(name) || typeof value !== 'function') continue;\n const look = value as (...args: unknown[]) => unknown;\n space[name] = (...args: unknown[]) => {\n lookedOutside();\n return look(...args);\n };\n }\n }\n return imports;\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport { createSyncFsSabBridge, type SyncSabTransport } from '../../realm/sync-sab-bridge.ts';\nimport type { SyncSabRequestBody } from '../../realm/sync-sab-wire.ts';\nimport { kernelSys } from '../process-runtime.ts';\nimport { E, EVENTTYPE } from '../wasi/wasi-abi.ts';\nimport { normalize } from '../wasi/wasi-files.ts';\nimport { type WasiFunction, WasiHost } from '../wasi/wasi-host.ts';\nimport { JsCallError } from './js-kernel.ts';\nimport type { SyncCall } from './js-sync.ts';\n\nexport interface JsWasiOptions {\n args?: readonly string[];\n env?: Readonly<Record<string, string>>;\n preopens?: Readonly<Record<string, string>>;\n stdio?: readonly [number, number, number];\n returnOnExit?: boolean;\n}\n\nexport interface JsWasi {\n readonly imports: { wasi_snapshot_preview1: Record<string, WasiFunction> };\n readonly wasiImport: Record<string, WasiFunction>;\n bind(memory: WebAssembly.Memory): void;\n start(instance: WebAssembly.Instance): number;\n initialize(instance: WebAssembly.Instance): void;\n close(): void;\n}\n\nexport class JsWasiExit extends Error {\n readonly code: number;\n constructor(code: number) {\n super(`wasi exit ${code}`);\n this.code = code;\n }\n}\n\nexport interface JsWasiDeps {\n lane: SyncCall;\n pid: number;\n cwd: string;\n resolve(path: string): string;\n fs: { owners: boolean; links: boolean } | undefined;\n live: Set<JsWasi>;\n owned: OwnedFds;\n}\n\nexport interface OwnedFds {\n add(fd: number): void;\n remove(fd: number): void;\n}\n\nexport function ownedFds(sab: SharedArrayBuffer | undefined): OwnedFds {\n if (!sab) return { add: () => {}, remove: () => {} };\n const view = new Int32Array(sab);\n const fds = new Set<number>();\n const publish = (): void => {\n Atomics.store(view, 0, 0);\n let n = 0;\n for (const fd of fds) {\n if (1 + n >= view.length) break;\n view[1 + n++] = fd;\n }\n Atomics.store(view, 0, n);\n };\n return {\n add(fd) {\n fds.add(fd);\n publish();\n },\n remove(fd) {\n if (fds.delete(fd)) publish();\n },\n };\n}\n\nconst SUB_SIZE = 48;\nconst SUB_TAG = 8;\nconst SUB_FD = 16;\nconst NO_FD = 0x7fffffff;\n\ntype PathArgs = readonly [fd: number, ptr: number, len: number];\n\nconst PATHS: Readonly<Record<string, readonly PathArgs[]>> = {\n path_open: [[0, 2, 3]],\n path_filestat_get: [[0, 2, 3]],\n path_filestat_set_times: [[0, 2, 3]],\n path_create_directory: [[0, 1, 2]],\n path_remove_directory: [[0, 1, 2]],\n path_unlink_file: [[0, 1, 2]],\n path_readlink: [[0, 1, 2]],\n path_symlink: [[2, 3, 4]],\n path_rename: [\n [0, 1, 2],\n [3, 4, 5],\n ],\n path_link: [\n [0, 2, 3],\n [4, 5, 6],\n ],\n};\n\nconst RESULTS: Readonly<Record<string, number>> = { path_open: 8, sock_accept: 2 };\n\nconst SPECIAL = new Set(['fd_close', 'fd_renumber', 'poll_oneoff', 'proc_exit']);\n\nfunction fdArgsOf(name: string): readonly number[] {\n const paths = PATHS[name];\n if (paths) return paths.map(([fd]) => fd);\n return /^(fd|sock)_/.test(name) ? [0] : [];\n}\n\nfunction laneTransport(lane: SyncCall): SyncSabTransport {\n return { call: (req: SyncSabRequestBody): SyncFsResult => lane(req) };\n}\n\nfunction within(root: string, dir: string, path: string): boolean {\n if (path.startsWith('/')) return false;\n const base = dir === root ? [] : dir.slice(root === '/' ? 1 : root.length + 1).split('/');\n const parts = [...base];\n for (const seg of path.split('/')) {\n if (seg === '' || seg === '.') continue;\n if (seg === '..') {\n if (parts.length === 0) return false;\n parts.pop();\n } else parts.push(seg);\n }\n return true;\n}\n\nfunction preopensOf(\n given: Readonly<Record<string, string>> | undefined,\n resolve: (path: string) => string\n): Array<[string, string]> {\n if (given === undefined) return [];\n if (typeof given !== 'object' || given === null) throw new JsCallError('EINVAL', 'wasi preopens');\n return Object.entries(given).map(([name, path]) => {\n if (typeof path !== 'string' || path === '') throw new JsCallError('EINVAL', 'wasi preopens');\n return [name, normalize(resolve(path))];\n });\n}\n\nexport function createJsWasi(deps: JsWasiDeps, o: JsWasiOptions = {}): JsWasi {\n const transport = laneTransport(deps.lane);\n const sys = kernelSys(transport);\n const call = (req: SyncSabRequestBody): unknown => {\n const r = deps.lane(req);\n if (!r.ok) throw new JsCallError(r.errno, req.op);\n return r.kind === 'json' ? r.json : r.kind === 'bytes' ? r.bytes : undefined;\n };\n const host = new WasiHost({\n args: [...(o.args ?? [])],\n env: { ...(o.env ?? {}) },\n cwd: deps.cwd,\n pid: deps.pid,\n kernel: { sys, call: call as WasiHost['o']['kernel']['call'] },\n fs: createSyncFsSabBridge(transport, { ...deps.fs, direct: true }),\n bare: true,\n });\n const owned = deps.owned;\n const guest = new Map<number, number>();\n const own = (g: number, k: number): void => {\n guest.set(g, k);\n owned.add(k);\n };\n const roots = new Map<number, string>();\n const opened: number[] = [];\n const closeKernel = (fd: number): void => {\n owned.remove(fd);\n try {\n host.fds.close(fd);\n } catch {}\n };\n try {\n (o.stdio ?? [0, 1, 2]).forEach((fd, i) => {\n const k = host.fds.adoptCopy(fd);\n opened.push(k);\n own(i, k);\n });\n for (const [name, path] of preopensOf(o.preopens, deps.resolve)) {\n const k = host.fds.preopenAt(path, name);\n opened.push(k);\n const g = 3 + roots.size;\n own(g, k);\n roots.set(g, path);\n }\n } catch (err) {\n for (const k of opened) closeKernel(k);\n throw err;\n }\n const table = host.imports();\n const view = () => host.mem.view();\n const free = (): number => {\n let g = 3;\n while (guest.has(g)) g++;\n return g;\n };\n const confined = (name: string, args: number[]): boolean => {\n for (const [fdAt, ptrAt, lenAt] of PATHS[name] ?? []) {\n const g = args[fdAt];\n const root = roots.get(g);\n const dir = host.fds.find(guest.get(g) as number);\n if (root === undefined || dir?.type !== 'dir') continue;\n if (!within(root, dir.path, host.mem.string(args[ptrAt], args[lenAt]))) return false;\n }\n return true;\n };\n const opens = (out: number, root: string | undefined): void => {\n const k = view().getUint32(out, true);\n const g = free();\n own(g, k);\n if (root !== undefined) roots.set(g, root);\n view().setUint32(out, g, true);\n };\n const imports: Record<string, WasiFunction> = {};\n for (const [name, fn] of Object.entries(table)) {\n if (SPECIAL.has(name)) continue;\n const fdArgs = fdArgsOf(name);\n imports[name] = ((...raw: number[]) => {\n const args = [...raw];\n for (const at of fdArgs) {\n const k = guest.get(args[at]);\n if (k === undefined) return E.BADF;\n args[at] = k;\n }\n if (!confined(name, raw)) return E.NOTCAPABLE;\n const out = RESULTS[name];\n if (out !== undefined && (raw[out] >>> 0) + 4 > host.mem.size()) return E.FAULT;\n const errno = (fn as (...a: number[]) => number)(...args);\n if (errno !== E.SUCCESS) return errno;\n if (out !== undefined) opens(raw[out] >>> 0, roots.get(raw[0]));\n return errno;\n }) as WasiFunction;\n }\n imports.fd_close = ((g: number) => {\n const k = guest.get(g);\n if (k === undefined) return E.BADF;\n guest.delete(g);\n roots.delete(g);\n owned.remove(k);\n return (table.fd_close as (fd: number) => number)(k);\n }) as WasiFunction;\n imports.fd_renumber = ((from: number, to: number) => {\n const kf = guest.get(from);\n const kt = guest.get(to);\n if (kf === undefined || kt === undefined) return E.BADF;\n if (from === to) return E.SUCCESS;\n closeKernel(kt);\n guest.set(to, kf);\n const root = roots.get(from);\n if (root === undefined) roots.delete(to);\n else roots.set(to, root);\n guest.delete(from);\n roots.delete(from);\n return E.SUCCESS;\n }) as WasiFunction;\n imports.poll_oneoff = ((inPtr: number, outPtr: number, n: number, nevents: number) => {\n const v = view();\n const swapped: Array<[number, number]> = [];\n for (let i = 0; i < n; i++) {\n const at = inPtr + i * SUB_SIZE;\n const tag = v.getUint8(at + SUB_TAG);\n if (tag !== EVENTTYPE.FD_READ && tag !== EVENTTYPE.FD_WRITE) continue;\n const g = v.getUint32(at + SUB_FD, true);\n swapped.push([at + SUB_FD, g]);\n v.setUint32(at + SUB_FD, guest.get(g) ?? NO_FD, true);\n }\n try {\n return (table.poll_oneoff as (...a: number[]) => number)(inPtr, outPtr, n, nevents);\n } finally {\n const after = view();\n for (const [at, g] of swapped) after.setUint32(at, g, true);\n }\n }) as WasiFunction;\n imports.proc_exit = ((code: number) => {\n throw new JsWasiExit(code);\n }) as WasiFunction;\n\n let closed = false;\n const run = (instance: WebAssembly.Instance, entry: '_start' | '_initialize'): number => {\n const memory = instance.exports.memory;\n if (memory instanceof WebAssembly.Memory) host.mem.bind(memory);\n const fn = instance.exports[entry];\n if (typeof fn !== 'function') {\n if (entry === '_initialize') return 0;\n throw new JsCallError('EINVAL', `wasi: the instance exports no ${entry}`);\n }\n try {\n fn();\n return 0;\n } catch (err) {\n if (err instanceof JsWasiExit && o.returnOnExit !== false) return err.code;\n throw err;\n }\n };\n const wasi: JsWasi = {\n imports: { wasi_snapshot_preview1: imports },\n wasiImport: imports,\n bind: (memory) => {\n if (!(memory instanceof WebAssembly.Memory)) throw new JsCallError('EINVAL', 'wasi bind');\n host.mem.bind(memory);\n },\n start: (instance) => run(instance, '_start'),\n initialize: (instance) => void run(instance, '_initialize'),\n close: () => {\n if (closed) return;\n closed = true;\n deps.live.delete(wasi);\n for (const k of guest.values()) closeKernel(k);\n guest.clear();\n roots.clear();\n },\n };\n deps.live.add(wasi);\n return wasi;\n}\n\nexport function wasiFor(\n o: Omit<JsWasiDeps, 'live' | 'owned'> & { owned: SharedArrayBuffer | undefined }\n): { create(options?: JsWasiOptions): JsWasi; closeAll(): void } {\n const deps: JsWasiDeps = { ...o, live: new Set(), owned: ownedFds(o.owned) };\n return {\n create: (options) => createJsWasi(deps, options),\n closeAll: () => {\n for (const wasi of [...deps.live]) wasi.close();\n },\n };\n}\n", "import type { WatchNote } from '../../fs/watch.ts';\nimport type { JsKernel } from './js-kernel.ts';\n\nexport type JsWatchNote = WatchNote;\n\nexport interface JsWatchOptions {\n recursive?: boolean;\n}\n\nexport interface JsWatcher {\n close(): void;\n}\n\nexport type JsWatchListener = (note: JsWatchNote) => void;\n\nexport function watchRequest(path: string, options: JsWatchOptions | undefined) {\n return { op: 'watch-open' as const, path, ...(options?.recursive ? { recursive: true } : {}) };\n}\n\nexport function watchArgs(\n options: JsWatchOptions | JsWatchListener | undefined,\n listener: JsWatchListener | undefined\n): [JsWatchOptions, JsWatchListener] {\n const onNote = typeof options === 'function' ? options : listener;\n if (typeof onNote !== 'function') throw new TypeError('watch needs a listener');\n return [typeof options === 'object' && options !== null ? options : {}, onNote];\n}\n\nexport function follow(\n kernel: Pick<JsKernel, 'blocking' | 'call'>,\n id: number,\n onNote: JsWatchListener\n): JsWatcher {\n const stop = new AbortController();\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n stop.abort();\n kernel.call({ op: 'watch-close', id }).catch(() => undefined);\n };\n const pump = async () => {\n while (!closed) {\n let notes: JsWatchNote[];\n try {\n const r = await kernel.blocking({ op: 'watch-next', id }, stop.signal);\n notes = r.ok && r.kind === 'json' ? (r.json as JsWatchNote[]) : [];\n } catch {\n closed = true;\n return;\n }\n for (const note of notes) {\n if (closed) return;\n if ('ended' in note) closed = true;\n onNote(note);\n }\n }\n };\n void pump();\n return { close };\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 wasClean: boolean;\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 openError(err: unknown): unknown {\n if (!(err instanceof JsCallError) || err.detail === undefined) return err;\n const prefix = `${err.code}: `;\n const message = err.detail.startsWith(prefix) ? err.detail.slice(prefix.length) : err.detail;\n return Object.assign(new Error(message), { code: err.code });\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(openError(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 { ChangeView } from '../../fs/changes.ts';\nimport { physicalPathAsync } from '../../fs/physical-path.ts';\nimport { type CwdAnswer, HeldCwd } from '../../kernel/held-cwd.ts';\nimport type { HeldCwdInit } from '../../kernel/protocol.ts';\nimport { SIG } from '../../kernel/signals.ts';\nimport { cwdFor } from '../../realm/emscripten-held-cwd.ts';\nimport { parseSyncFsStat, type SyncFsBridgeStat } from '../../realm/sync-fs-wire.ts';\nimport { KERNEL_VERSION } from '../../version.ts';\nimport {\n childOps,\n type JsChild,\n type JsExited,\n type JsSpawnOptions,\n type JsWaitOptions,\n} from './js-children.ts';\nimport {\n devAsync,\n devExists,\n devOpen,\n devReaddir,\n devReadlink,\n devResolveTarget,\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 intoTarget,\n isExclusive,\n type JsFdType,\n type JsOpenOptions,\n type JsStatFs,\n type JsWriteOptions,\n joined,\n MAX_IO,\n MAX_PREAD,\n openRequest,\n readDevice,\n readingIntoAsync,\n statFsOf,\n typeOf,\n writeDevice,\n written,\n} from './js-io.ts';\nimport { callError, devOf, JsCallError, type JsKernel, modeOf, umaskRequest } from './js-kernel.ts';\nimport { type JsNet, netOps } from './js-net.ts';\nimport { procFsAsync, procOpenAsync } from './js-proc.ts';\nimport {\n type JsReceived,\n type JsRecvmsgOptions,\n type JsSendmsgOptions,\n rightsAsync,\n} from './js-rights.ts';\nimport { runSync } from './js-run.ts';\nimport {\n type JsCred,\n type JsSyncContext,\n JsSyncKernel,\n laneOf,\n noLane,\n type SyncCall,\n type SyncShared,\n syncOps,\n} from './js-sync.ts';\nimport type { JsThreadContext } from './js-thread.ts';\nimport { type JsTty, ttyOps } from './js-tty.ts';\nimport { wasiFor } from './js-wasi.ts';\nimport {\n follow,\n type JsWatcher,\n type JsWatchListener,\n type JsWatchOptions,\n watchArgs,\n watchRequest,\n} from './js-watch.ts';\nimport { type JsWebSocket, type JsWebSocketOptions, websocketOp } from './js-websocket.ts';\n\nexport type { JsFdType, JsOpenOptions, JsWriteOptions } 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 readInto(position: number, into: Uint8Array, offset?: number, length?: number): Promise<number>;\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 JsKernelInfo {\n readonly version: string;\n}\n\nexport const KERNEL_INFO: JsKernelInfo = Object.freeze({ version: KERNEL_VERSION });\n\nexport interface JsMemory {\n heapUsed?: number;\n heapTotal?: number;\n heapLimit?: number;\n external?: number;\n arrayBuffers?: number;\n rss?: number;\n}\n\nexport interface JsAsyncContext {\n run<R>(store: unknown, fn: (...args: unknown[]) => R, ...args: unknown[]): R;\n getStore(): unknown;\n enterWith(store: unknown): void;\n}\n\nexport interface JsScriptResult {\n value: unknown;\n completion: boolean;\n}\n\nexport type JsRunScript = (source: string, filename: string) => JsScriptResult;\n\nexport interface JsPromiseState {\n state: 'pending' | 'fulfilled' | 'rejected';\n value: unknown;\n}\n\nexport type JsStackFormatter = (\n error: unknown,\n callSites: readonly object[],\n own?: (error: unknown, callSites: object[]) => unknown\n) => unknown;\n\nexport interface JsErrorSource {\n sourceLine: string;\n lineNumber: number;\n startColumn: number;\n}\n\nexport type JsErrorSourceProbe = (error: unknown) => JsErrorSource | undefined;\n\nexport type JsStackHook = (\n fn: JsStackFormatter | null,\n options?: { own?: boolean }\n) => JsStackFormatter | null;\n\nexport type JsPromiseProbe = (promise: unknown) => JsPromiseState | undefined;\n\nexport interface JsProgramContext {\n readonly kernel: JsKernelInfo;\n memory(): JsMemory;\n readonly asyncContext?: JsAsyncContext;\n readonly module?: { readonly path: string };\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, options?: JsWriteOptions): Promise<number>;\n close(fd: number): Promise<void>;\n socketpair(): Promise<[number, number]>;\n sendmsg(fd: number, data: Uint8Array | string, options?: JsSendmsgOptions): Promise<number>;\n recvmsg(fd: number, max?: number, options?: JsRecvmsgOptions): Promise<JsReceived>;\n pipe(): Promise<[number, number]>;\n select(sets: JsSelectSets, options?: { signal?: AbortSignal }): Promise<JsSelected>;\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, options?: { recursive?: boolean; mode?: number }): Promise<void>;\n rm(path: string): Promise<void>;\n unlink(path: string): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n chmod(path: string, mode: number): 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 statfs(path: string): Promise<JsStatFs>;\n readFile(path: string): Promise<Uint8Array>;\n writeFile(path: string, data: Uint8Array | string, options?: { mode?: number }): Promise<void>;\n watch(\n path: string,\n options: JsWatchOptions | JsWatchListener,\n listener?: JsWatchListener\n ): Promise<JsWatcher>;\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, options?: JsWaitOptions): Promise<JsExited>;\n kill(pid: number, signal?: JsSignal): Promise<void>;\n sudo(args: readonly string[]): Promise<JsSudoAnswer>;\n crontab(call: JsCrontabCall): Promise<JsCrontabAnswer>;\n umask(mask?: number): Promise<number>;\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 readonly thread: JsThreadContext;\n onUncaught(listener: JsStrayListener): () => void;\n onUnhandledRejection(listener: JsStrayListener): () => void;\n}\n\nexport interface JsSelectSets {\n read?: readonly number[];\n write?: readonly number[];\n timeoutMs?: number;\n}\n\nexport interface JsSelected {\n read: number[];\n write: number[];\n}\n\nfunction fdList(list: readonly number[] | undefined): number[] {\n const fds = [...(list ?? [])];\n if (!fds.every((fd) => Number.isInteger(fd) && fd >= 0))\n throw new JsCallError('EINVAL', 'select', 'ERR_INVALID_ARG_VALUE: fds must be integers >= 0');\n return fds;\n}\n\nasync function selectOp(\n kernel: JsKernel,\n sets: JsSelectSets,\n signal: AbortSignal | undefined\n): Promise<JsSelected> {\n signal?.throwIfAborted();\n const read = fdList(sets.read);\n const write = fdList(sets.write);\n const timeoutMs = sets.timeoutMs ?? -1;\n if (!Number.isFinite(timeoutMs))\n throw new JsCallError('EINVAL', 'select', 'ERR_INVALID_ARG_VALUE: timeoutMs');\n const r = await kernel.blocking(\n { op: 'fd-select', read, write, timeoutMs: Math.max(-1, Math.floor(timeoutMs)) },\n signal\n );\n const got = (r.ok && r.kind === 'json' ? r.json : {}) as Partial<JsSelected>;\n return { read: got.read ?? [], write: got.write ?? [] };\n}\n\nexport interface JsCrontabCall {\n action: 'list' | 'remove' | 'install';\n user?: string;\n text?: string;\n}\n\nexport type JsCrontabAnswer =\n | { text: string; error?: undefined }\n | { error: string; text?: undefined };\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 thread: JsThreadContext;\n memory?: (() => JsMemory) | undefined;\n asyncContext?: (() => JsAsyncContext) | undefined;\n runScript?: JsRunScript | undefined;\n modulePath?: string | undefined;\n promiseState?: JsPromiseProbe | undefined;\n stackFormatter?: JsStackHook | undefined;\n errorSource?: JsErrorSourceProbe | undefined;\n fs?: { owners: boolean; links: boolean };\n owned?: SharedArrayBuffer;\n held?: HeldCwdInit | undefined;\n failed?: () => number | undefined;\n changes?: SharedArrayBuffer | undefined;\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 name = signal.slice(3);\n if (!signal.startsWith('SIG') || !Object.hasOwn(SIG, name)) {\n throw new JsCallError('EINVAL', `signal ${signal}`);\n }\n return (SIG as Record<string, number>)[name] as number;\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 const writeSome = async (fd: number, data: Uint8Array): Promise<number> => {\n const i = await info(fd);\n if (writeDevice(i)) return data.length;\n const body = data.subarray(0, MAX_IO);\n const r = await kernel.raw({ op: 'fd-write', fd, body, nonblock: true });\n if (r.ok) return written(r, body.length);\n if (brokenPipe(callError(r, 'fd-write'), i))\n await kernel.call({ op: 'proc-kill', pid, sig: SIG.PIPE });\n throw callError(r, 'fd-write');\n };\n return { writes, writeAll, writeSome };\n}\n\nfunction readable(read: (fd: number) => Promise<Uint8Array>): ReadableStream<Uint8Array> {\n return 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}\n\nasync function resolveDevAsync(kernel: JsKernel, abs: string): Promise<string | undefined> {\n try {\n const resolved = await physicalPathAsync(\n {\n async lstat(p) {\n return parseSyncFsStat(await kernel.json({ op: 'lstat', path: p })) ?? {};\n },\n async readlink(p) {\n return String(await kernel.json({ op: 'readlink', path: p }));\n },\n },\n abs\n );\n return resolved !== abs && inDev(resolved) ? resolved : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function vfsStat(\n kernel: JsKernel,\n abs: string,\n op: 'stat' | 'lstat',\n clean: () => boolean\n): Promise<SyncFsBridgeStat> {\n try {\n if (!clean()) await kernel.call({ op: 'fd-path-flush', path: abs });\n const s = parseSyncFsStat(await kernel.json({ op, path: abs, devs: true }));\n if (!s) throw new JsCallError('EIO', op);\n return s;\n } catch (err) {\n if (!(err instanceof JsCallError) || err.code !== 'ENOENT') throw err;\n const devPath = err.dev;\n if (!devPath) throw err;\n return devAsync(kernel, devStat(devPath, op === 'stat'));\n }\n}\n\ninterface PipeIo {\n infos: Map<number, FdInfo>;\n handles: Map<number, () => void>;\n read(fd: number, max?: number, signal?: AbortSignal): Promise<Uint8Array>;\n write(fd: number, data: Uint8Array, signal?: AbortSignal): Promise<void>;\n}\n\nasync function fifoOpen(\n kernel: JsKernel,\n abs: string,\n options: JsOpenOptions,\n io: PipeIo\n): Promise<JsFile> {\n options.signal?.throwIfAborted();\n const req = { ...openRequest(abs, { ...options, create: false }), fifo: true };\n const r = await kernel.blocking(req, options.signal);\n const fd = (r.ok && r.kind === 'json' ? r.json : -1) as number;\n io.infos.set(fd, { kind: 'stream' });\n let open = true;\n const live = (): void => {\n if (!open) throw new JsCallError('EBADF', abs);\n };\n const seekless = (position: number, what: string): void => {\n live();\n if (position !== 0) throw new JsCallError('ESPIPE', what);\n };\n io.handles.set(fd, () => {\n open = false;\n });\n return {\n fd,\n path: abs,\n async size() {\n live();\n return 0;\n },\n async read(position, length) {\n seekless(position, 'read');\n return io.read(fd, length);\n },\n readInto: readingIntoAsync(async (position, length) => {\n seekless(position, 'read');\n return io.read(fd, length);\n }),\n async write(position, data) {\n seekless(position, 'write');\n await io.write(fd, data);\n return data.length;\n },\n async truncate() {\n live();\n throw new JsCallError('EINVAL', 'truncate');\n },\n sync: async () => live(),\n async close() {\n if (!open) return;\n open = false;\n io.infos.delete(fd);\n io.handles.delete(fd);\n await kernel.raw({ op: 'fd-close', fd });\n },\n };\n}\n\nasync function vfsOpen(\n kernel: JsKernel,\n abs: string,\n options: JsOpenOptions,\n statOf: (op: 'stat' | 'lstat', path: string) => Promise<SyncFsBridgeStat>,\n io: PipeIo,\n whole: boolean\n): Promise<JsFile> {\n const { infos, handles } = io;\n const existing = await statOf(isExclusive(options) ? 'lstat' : 'stat', abs).catch(absent);\n checkOpen(abs, options, existing);\n const special = existing?.isSocket || (whole && existing?.isFifo);\n if (special && !isExclusive(options)) throw new JsCallError('ENXIO', abs);\n if (existing?.isFifo && !isExclusive(options)) return fifoOpen(kernel, abs, options, io);\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\nfunction setcredOn(syncKernel: JsSyncKernel): JsSyncContext['setcred'] {\n return (change) => {\n if (typeof change !== 'object' || change === null || Array.isArray(change)) {\n throw new JsCallError('EINVAL', 'setcred');\n }\n return syncKernel.json({ op: 'proc-setcred', change: { ...change } }) as JsCred;\n };\n}\n\nfunction watchingSyncOps(kernel: JsKernel, syncKernel: JsSyncKernel, shared: SyncShared) {\n const ops = syncOps(syncKernel, shared);\n const watch: JsSyncContext['fs']['watch'] = (path, options, listener) => {\n const [given, onNote] = watchArgs(options, listener);\n const id = syncKernel.json(watchRequest(shared.resolve(path), given)) as number;\n return follow(kernel, id, onNote);\n };\n return { ...ops, fs: { ...ops.fs, watch } };\n}\n\nfunction pendingReads(\n kernel: ContextOptions['kernel'],\n info: (fd: number) => Promise<FdInfo>,\n random: (bytes: Uint8Array) => void\n) {\n const reading = new Map<number, Set<AbortController>>();\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 const stop = new AbortController();\n const waits = reading.get(fd) ?? new Set();\n reading.set(fd, waits.add(stop));\n try {\n const n = Math.min(max, MAX_IO);\n if (signal) return await readPipe(kernel, fd, n, AbortSignal.any([signal, stop.signal]));\n const r = await kernel.blocking({ op: 'fd-read', fd, max: n }, stop.signal);\n return r.ok && r.kind === 'bytes' ? r.bytes : new Uint8Array(0);\n } finally {\n waits.delete(stop);\n if (waits.size === 0 && reading.get(fd) === waits) reading.delete(fd);\n }\n };\n const closing = (fd: number) => {\n for (const stop of reading.get(fd) ?? []) stop.abort(new JsCallError('EBADF', 'read'));\n reading.delete(fd);\n };\n const watch = (fd: number): { signal: AbortSignal; done(): void } => {\n const stop = new AbortController();\n const waits = reading.get(fd) ?? new Set();\n reading.set(fd, waits.add(stop));\n const done = () => {\n waits.delete(stop);\n if (waits.size === 0 && reading.get(fd) === waits) reading.delete(fd);\n };\n return { signal: stop.signal, done };\n };\n return { read, closing, watch };\n}\n\nconst cryptoRandom = (bytes: Uint8Array) =>\n void crypto.getRandomValues(bytes as Uint8Array<ArrayBuffer>);\n\nfunction tracked(\n pending: Set<Promise<unknown>>,\n writeAll: (fd: number, data: Uint8Array) => Promise<void>,\n writeSome: (fd: number, data: Uint8Array) => Promise<number>,\n failed?: () => number | undefined\n) {\n return (fd: number, data: Uint8Array | string, options?: JsWriteOptions): Promise<number> => {\n const status = failed?.();\n if (status !== undefined) return Promise.reject(new JsExit(status));\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 if (options?.nonblock === true) return await writeSome(fd, bytes);\n await writeAll(fd, bytes);\n return bytes.length;\n } finally {\n pending.delete(settled);\n settle();\n }\n })();\n };\n}\n\nfunction heldOn(\n init: HeldCwdInit | undefined,\n lane: SyncCall,\n syncKernel: JsSyncKernel\n): HeldCwd | undefined {\n if (!init || lane === noLane) return undefined;\n const ask = () => syncKernel.json({ op: 'cwd-check' }) as CwdAnswer;\n return new HeldCwd(init.sab, init.slot, ask, init);\n}\n\nconst MEMORY_FIELDS = [\n 'heapUsed',\n 'heapTotal',\n 'heapLimit',\n 'external',\n 'arrayBuffers',\n 'rss',\n] as const;\n\nfunction measured(measure: (() => JsMemory) | undefined): JsMemory {\n const got = measure?.() ?? {};\n const out: JsMemory = {};\n for (const field of MEMORY_FIELDS) {\n const value = got[field];\n if (typeof value === 'number' && Number.isFinite(value)) out[field] = value;\n }\n return out;\n}\n\nfunction realmOps(\n o: ContextOptions\n): Pick<JsSyncContext, 'runScript' | 'promiseState' | 'setStackFormatter' | 'errorSource'> {\n const hook = o.stackFormatter;\n const source = o.errorSource;\n return {\n runScript: scriptRunner(o.runScript),\n promiseState: (promise) => o.promiseState?.(promise),\n ...(hook\n ? {\n setStackFormatter: (fn: JsStackFormatter | null, options?: { own?: boolean }) =>\n hook(fn, options),\n }\n : {}),\n ...(source ? { errorSource: (error: unknown) => source(error) } : {}),\n };\n}\n\nfunction scriptRunner(\n run: JsRunScript | undefined\n): (source: string, options?: { filename?: string }) => JsScriptResult | undefined {\n return (source, options = {}) => {\n if (typeof source !== 'string') throw new TypeError('runScript needs a source string');\n const filename = options.filename ?? '[eval]';\n if (typeof filename !== 'string') throw new TypeError('runScript needs a filename string');\n return run?.(source, filename);\n };\n}\n\nfunction hostExtras(o: ContextOptions): {\n memory: () => JsMemory;\n asyncContext?: JsAsyncContext;\n module?: { readonly path: string };\n} {\n const path = o.modulePath;\n const module = path === undefined ? {} : { module: Object.freeze({ path }) };\n return {\n memory: () => measured(o.memory),\n ...(o.asyncContext ? { asyncContext: o.asyncContext() } : {}),\n ...module,\n };\n}\n\nfunction cleanOf(sab: SharedArrayBuffer | undefined): () => boolean {\n const changes = sab ? new ChangeView(sab) : undefined;\n return () => changes?.clean() === true;\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 = o.random ?? cryptoRandom;\n let held: HeldCwd | undefined;\n const resolve = (path: string) => resolvePath(cwdFor(o.cwd, held, path), path);\n const tryDev = (abs: string) => resolveDevAsync(kernel, abs);\n const clean = cleanOf(o.changes);\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 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, closing, watch } = pendingReads(kernel, info, random);\n\n const { writes, writeAll, writeSome } = writer(kernel, info, o.pid);\n\n const write = tracked(pending, writeAll, writeSome, o.failed);\n\n const writable = (fd: number) =>\n new WritableStream<Uint8Array>({\n write: async (chunk) => {\n await write(fd, chunk);\n },\n });\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 return vfsStat(kernel, abs, op, clean);\n };\n\n const devIo = { infos, handles, read, write: writeAll };\n\n const open = async (\n path: string,\n options: JsOpenOptions = {},\n whole = false\n ): Promise<JsFile> => {\n const abs = resolve(path);\n if (inDev(abs)) return openDev(kernel, abs, options, devIo);\n try {\n return await vfsOpen(kernel, abs, options, statOf, devIo, whole);\n } catch (err) {\n if (!(err instanceof JsCallError) || err.code !== 'ENOENT') throw err;\n const devPath = await tryDev(abs);\n if (!devPath) throw err;\n return openDev(kernel, devPath, options, devIo);\n }\n };\n\n const fs = procFsAsync(pathOps(kernel, resolve, statOf, open, clean), kernel, {\n resolve,\n pid: o.pid,\n });\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 held = heldOn(o.held, lane, syncKernel);\n const terminal = ttyOps(kernel, syncKernel);\n const shared = { pid: o.pid, resolve, random, infos, handles, closing, clean };\n const wasi = wasiFor({ lane, pid: o.pid, cwd: o.cwd, resolve, fs: o.fs, owned: o.owned });\n const sync: JsSyncContext = {\n kernel: KERNEL_INFO,\n tty: terminal.syncTty,\n ...watchingSyncOps(kernel, syncKernel, shared),\n run: (options) =>\n runSync(syncKernel, { env: o.env, cwd: o.cwd, resolve, signal: signalNumber }, options),\n spawn: (options) => spawnSync(options),\n wasi: { create: wasi.create },\n net: { listen: (options) => syncNet.listen(options) },\n exit: (status = 0): never => {\n exiting ??= status & 0xff;\n wasi.closeAll();\n return exitAtOnce(lane, [...writes], terminal.modes(), exiting);\n },\n kill: killer({ self: o.pid, kernel, syncKernel, lane, writes, modes: terminal.modes }),\n cred: () => syncKernel.json({ op: 'proc-cred' }) as JsCred,\n umask: (mask) => syncKernel.json(umaskRequest(mask)) as number,\n setcred: setcredOn(syncKernel),\n ...realmOps(o),\n };\n\n const io = { read, send: writeAll, close: (fd: number) => ctx.close(fd) };\n const defaults = { env: o.env, cwd: o.cwd, signal: signalNumber };\n const { spawnSync, ...children } = childOps(kernel, io, defaults, syncKernel);\n const { sync: syncNet, ...net } = netOps(kernel, io, syncKernel);\n\n const strays = o.strays ?? { exception: new Set(), rejection: new Set() };\n const ctx: JsProgramContext = {\n kernel: KERNEL_INFO,\n argv: o.argv,\n env: o.env,\n pid: o.pid,\n ppid: async () => identityOf(await kernel.json({ op: 'proc-identity' }), o).ppid,\n cwd: o.cwd,\n stdin: readable(read),\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 closing(fd);\n await kernel.call({ op: 'fd-close', fd });\n },\n ...rightsAsync(kernel, (fd) => infos.delete(fd), watch),\n pipe: async () => (await kernel.json({ op: 'fd-pipe' })) as [number, number],\n select: (sets, options) => selectOp(kernel, sets, options?.signal),\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: procOpenAsync(open, kernel, { resolve, pid: o.pid }),\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 umask: async (mask) => (await kernel.json(umaskRequest(mask))) as number,\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 crontab: async (call) =>\n (await kernel.json({ ...call, op: 'proc-crontab' })) as JsCrontabAnswer,\n ...children,\n net,\n websocket: websocketOp(kernel),\n tty: terminal.tty,\n exit,\n thread: o.thread,\n ...hostExtras(o),\n onUncaught: (listener) => listen(strays.exception, listener),\n onUnhandledRejection: (listener) => listen(strays.rejection, listener),\n };\n const drain = async (): Promise<void> => {\n wasi.closeAll();\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 pread = async (\n position: number,\n length: number,\n target?: { into: Uint8Array; at: number }\n ): Promise<Uint8Array | number> => {\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_PREAD);\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 if (target) target.into.set(chunk, target.at + got);\n else parts.push(chunk);\n got += chunk.length;\n } while (got < length);\n return target ? got : joined(parts, got);\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 readInto(position: number, into: Uint8Array, offset = 0, length = into.length - offset) {\n return (await pread(position, length, intoTarget(into, offset, length))) as number;\n },\n async read(position: number, length: number) {\n return (await pread(position, length)) as Uint8Array;\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, whole?: boolean) => Promise<JsFile>,\n clean: () => boolean\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 const found = await kernel.json({ op: 'exists', path: abs, devs: true });\n if (found === true) return true;\n const devPath = devOf(found);\n return devPath ? devAsync(kernel, devExists(devPath)) : false;\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, options) =>\n void (await kernel.call({\n op: 'mkdir',\n path: resolve(path),\n ...(options?.recursive === false ? { exclusive: true } : {}),\n mode: options?.mode === undefined ? 0o777 : modeOf(options.mode),\n })),\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 chmod: async (path, mode) =>\n void (await kernel.call({ op: 'chmod', path: resolve(path), mode: modeOf(mode) })),\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 statfs(path) {\n let abs = resolve(path);\n if (inDev(abs)) {\n const target = await devAsync(kernel, devResolveTarget(abs)).catch(() => undefined);\n if (target?.startsWith('/')) abs = target;\n }\n await statOf('stat', abs);\n return statFsOf(await kernel.json({ op: 'statfs', path: abs }));\n },\n async watch(path, options, listener) {\n const [given, onNote] = watchArgs(options, listener);\n const id = (await kernel.json(watchRequest(resolve(path), given))) as number;\n return follow(kernel, id, onNote);\n },\n async readFile(path) {\n const abs = resolve(path);\n if (inDev(abs)) return readWhole(await open(abs));\n try {\n if (!clean()) await kernel.call({ op: 'fd-path-flush', path: abs });\n return await kernel.bytes({ op: 'read', path: abs, devs: true });\n } catch (err) {\n if (!(err instanceof JsCallError) || err.code !== 'ENOENT') throw err;\n const devPath = err.dev;\n if (!devPath) throw err;\n return readWhole(await open(devPath));\n }\n },\n async writeFile(path, data, options) {\n const mode = options?.mode;\n const file = await open(\n path,\n { write: true, create: true, truncate: true, ...(mode !== undefined ? { mode } : {}) },\n true\n );\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 {\n JS_THREAD_CRASHED,\n JS_THREAD_NO_MEMORY,\n JS_THREAD_SPAWN,\n type JsThreadControl,\n type JsThreadSpawnMsg,\n type JsThreadStart,\n} from '../../kernel/protocol.ts';\nimport type { SabPostLike } from '../../realm/sync-sab-bridge.ts';\nimport { JsCallError } from './js-kernel.ts';\n\nexport interface JsThread {\n readonly tid: number;\n readonly port: MessagePort;\n readonly exited: Promise<number>;\n terminate(): Promise<void>;\n}\n\nexport interface JsThreadSpawnOptions {\n data?: unknown;\n transfer?: readonly Transferable[];\n}\n\nexport interface JsThreadContext {\n readonly tid: number;\n readonly port: MessagePort | undefined;\n readonly data: unknown;\n readonly NO_MEMORY: number;\n readonly CRASHED: number;\n spawn(options?: JsThreadSpawnOptions): Promise<JsThread>;\n}\n\nconst NativeChannel = globalThis.MessageChannel;\n\nconst OOM = /out of memory|Array buffer allocation failed|Cannot allocate Wasm memory/i;\n\nexport function outOfMemory(err: unknown): boolean {\n return err instanceof RangeError && OOM.test(err.message);\n}\n\nfunction optionsOf(options: unknown): JsThreadSpawnOptions {\n if (options === undefined) return {};\n if (typeof options !== 'object' || options === null || Array.isArray(options)) {\n throw new JsCallError('EINVAL', 'thread.spawn');\n }\n const { transfer } = options as JsThreadSpawnOptions;\n if (transfer !== undefined && !Array.isArray(transfer)) {\n throw new JsCallError('EINVAL', 'thread.spawn');\n }\n return options as JsThreadSpawnOptions;\n}\n\nfunction started(port: MessagePort, control: MessagePort): Promise<JsThread> {\n const exited = Promise.withResolvers<number>();\n return new Promise<JsThread>((resolve, reject) => {\n const thread = (tid: number): JsThread =>\n Object.freeze({\n tid,\n port,\n exited: exited.promise,\n async terminate() {\n control.postMessage({ terminate: true });\n await exited.promise;\n },\n });\n control.onmessage = (event: MessageEvent) => {\n const said = event.data as JsThreadControl;\n if ('tid' in said) resolve(thread(said.tid));\n else if ('errno' in said) {\n control.close();\n port.close();\n reject(new JsCallError(said.errno, 'thread.spawn', said.message));\n } else if ('exited' in said) {\n control.close();\n exited.resolve(said.exited);\n }\n };\n });\n}\n\nexport function threadContext(post: SabPostLike, start?: JsThreadStart): JsThreadContext {\n const spawn = (options?: JsThreadSpawnOptions): Promise<JsThread> => {\n let asked: JsThreadSpawnOptions;\n try {\n asked = optionsOf(options);\n } catch (err) {\n return Promise.reject(err);\n }\n const channel = new NativeChannel();\n const control = new NativeChannel();\n const transfer = [...(asked.transfer ?? [])];\n const msg: JsThreadSpawnMsg = {\n type: JS_THREAD_SPAWN,\n data: asked.data,\n port: channel.port2,\n control: control.port2,\n transfer,\n };\n try {\n post.postMessage(msg, [channel.port2, control.port2, ...transfer]);\n } catch (err) {\n channel.port1.close();\n control.port1.close();\n return Promise.reject(err);\n }\n return started(channel.port1, control.port1);\n };\n return Object.freeze({\n tid: start?.tid ?? 0,\n port: start?.port,\n data: start?.data,\n NO_MEMORY: JS_THREAD_NO_MEMORY,\n CRASHED: JS_THREAD_CRASHED,\n spawn,\n });\n}\n", "import {\n JS_THREAD_NO_MEMORY,\n type JsProcessInitMsg,\n type JsThreadInitMsg,\n type JsThreadStart,\n} 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 type {\n JsAsyncContext,\n JsErrorSourceProbe,\n JsMemory,\n JsPromiseProbe,\n JsRunScript,\n JsStackHook,\n} from './js-context.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 { outOfMemory, threadContext } from './js-thread.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 memory?: () => JsMemory;\n asyncContext?: () => JsAsyncContext;\n runScript?: JsRunScript;\n moduleSource?: (url: string, source: string) => void;\n promiseState?: JsPromiseProbe;\n stackFormatter?: JsStackHook | undefined;\n errorSource?: JsErrorSourceProbe | undefined;\n imported?: () => void;\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 function runJsProcess(\n init: JsProcessInitMsg,\n port: SabPostLike,\n deps: JsRuntimeDeps = {}\n): Promise<number> {\n return runJs(init, port, deps, undefined);\n}\n\nexport function runJsThread(\n init: JsThreadInitMsg,\n port: SabPostLike,\n deps: JsRuntimeDeps = {}\n): Promise<number> {\n const { thread, ...rest } = init;\n return runJs(rest as unknown as JsProcessInitMsg, port, deps, thread);\n}\n\nasync function runJs(\n init: JsProcessInitMsg,\n port: SabPostLike,\n deps: JsRuntimeDeps,\n thread: JsThreadStart | undefined\n): Promise<number> {\n const failed = (err: unknown): number => (thread && outOfMemory(err) ? JS_THREAD_NO_MEMORY : 1);\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 let failedWith: number | undefined;\n const fail = (err: unknown): void => {\n if (err instanceof JsExit) return;\n failing ??= (thread ? Promise.resolve() : say(message(err))).then(() => exited(failed(err)));\n failedWith ??= failed(err);\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 changes: init.changes,\n fs: { owners: init.owners === true, links: init.links === true },\n strays,\n thread: threadContext(port, thread),\n memory: deps.memory,\n asyncContext: deps.asyncContext,\n runScript: deps.runScript,\n modulePath: modulePathOf(init.program),\n promiseState: deps.promiseState,\n stackFormatter: deps.stackFormatter,\n errorSource: deps.errorSource,\n ...(thread?.owned ? { owned: thread.owned } : {}),\n held: init.held,\n failed: () => failedWith,\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 const { url, glue, source } = init.program;\n if (url && source !== undefined) deps.moduleSource?.(url, source);\n main = mainOf(await (url ? import(url) : (deps.load ?? importSource)(glue)));\n deps.imported?.();\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 if (!thread) await say(message(err));\n return failed(err);\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\nfunction modulePathOf(program: { glue: string; path: string }): string | undefined {\n if (program.glue !== '') return undefined;\n return program.path;\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 { WasmSyscall } from '../../kernel/process.ts';\nimport {\n type SyncFsBridgeStat,\n type SyncFsPosixBridge,\n syncError,\n} from '../../realm/sync-fs-wire.ts';\nimport { devStat, devSync } from '../js/js-dev.ts';\n\nconst PTS = '/dev/pts';\nconst PTS_ENTRY = /^\\/dev\\/pts\\/(\\d+)$/;\n\nexport function ptsBridge<T extends SyncFsPosixBridge>(\n fs: T,\n call: (req: WasmSyscall) => unknown\n): T {\n const open = (): number[] => call({ op: 'pty-list' }) as number[];\n const kernel = { json: (req: Parameters<typeof call>[0]) => call(req) };\n const entry = (p: string, known = open()): SyncFsBridgeStat => {\n const n = PTS_ENTRY.exec(p)?.[1];\n if (n === undefined || !known.includes(Number(n))) throw syncError('ENOENT', p);\n return devSync(kernel, devStat(p, true));\n };\n const listedEntry = (name: string, known: number[]): [string, SyncFsBridgeStat | null] => {\n try {\n return [name, entry(`${PTS}/${name}`, known)];\n } catch {\n return [name, null];\n }\n };\n const dir = (): SyncFsBridgeStat => devSync(kernel, devStat(PTS, true));\n const statOf = (p: string, real: () => SyncFsBridgeStat): SyncFsBridgeStat => {\n if (p === PTS) return dir();\n return PTS_ENTRY.test(p) ? entry(p) : real();\n };\n const names = (known = open()): string[] => known.map(String).sort();\n const over: Partial<Record<keyof SyncFsPosixBridge, unknown>> = {\n stat: (p: string) => statOf(p, () => fs.stat(p)),\n lstat: (p: string) => statOf(p, () => fs.lstat(p)),\n exists: (p: string) => {\n if (p === PTS) return true;\n if (!PTS_ENTRY.test(p)) return fs.exists(p);\n return open().includes(Number(PTS_ENTRY.exec(p)?.[1]));\n },\n readdir: (p: string) => {\n if (p === PTS) return names();\n const listed = fs.readdir(p);\n return p === '/dev' && !listed.includes('pts') ? [...listed, 'pts'] : listed;\n },\n readdirStat: (p: string) => {\n if (p === PTS) {\n const known = open();\n return names(known).map((name) => listedEntry(name, known));\n }\n const listed = fs.readdirStat(p);\n if (p !== '/dev' || listed.some(([name]) => name === 'pts')) return listed;\n return [...listed, ['pts', dir()]];\n },\n };\n return new Proxy(fs, {\n get(target, key, receiver) {\n if (Object.hasOwn(over, key)) return over[key as keyof SyncFsPosixBridge];\n const value = Reflect.get(target, key, receiver);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n", "import { defaultAction, SIG, sigbit } from '../../kernel/signals.ts';\nimport type { SignalHooks, SignalMasks } 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 SA_NODEFER = 0x40000000;\nconst SA_NOCLDWAIT = 2;\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 nocldwait?: true;\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 nodefer = 0;\n\n private running = 0;\n\n private deferred = 0;\n\n private lifted = 0;\n\n unblocking(bits: number): void {\n this.lifted |= bits & this.running;\n }\n\n private defaults = 0;\n\n private nocldwait = false;\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.nodefer = withBit(this.nodefer, bit, (flags & SA_NODEFER) !== 0);\n this.defaults = withBit(this.defaults, bit, disposition === 0);\n if (sig === SIG.CHLD) this.nocldwait = (flags & SA_NOCLDWAIT) !== 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 ...(this.nocldwait ? { nocldwait: true as const } : {}),\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 this.nocldwait = state.nocldwait === true;\n }\n\n masks(): SignalMasks | null {\n if (this.hooked) {\n const caught = this.handler() ? this.handlers : 0;\n const defaults = this.defaults;\n this.defaults = 0;\n const nocldwait = this.nocldwait ? { nocldwait: true } : {};\n return { caught, ignored: this.ignoring, restart: this.restarting, defaults, ...nocldwait };\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 && !this.hooked) return;\n if (!handler || (this.hooked && (this.handlers & sigbit(sig)) === 0)) {\n if ((this.ignoring & sigbit(sig)) === 0) this.defaultAction(sig);\n return;\n }\n const bit = sigbit(sig);\n if ((this.running & bit) !== 0 && ((this.nodefer | this.lifted) & bit) === 0) {\n this.deferred |= bit;\n return;\n }\n const outer = { running: this.running & bit, lifted: this.lifted & bit };\n this.running |= bit;\n this.lifted &= ~bit;\n try {\n this.run(handler, sig);\n } finally {\n this.running = (this.running & ~bit) | outer.running;\n this.lifted = (this.lifted & ~bit) | outer.lifted;\n }\n if ((this.deferred & bit) === 0) return;\n this.deferred &= ~bit;\n this.raise(sig);\n }\n\n ran = 0;\n\n private run(handler: (sig: number) => void, sig: number): void {\n this.ran++;\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 type { BlockedMask } from '../../realm/sync-sab-wire.ts';\nimport { 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 blocked?: BlockedMask;\n\n tls?: Array<[number, number]>;\n\n modules?: Record<string, WebAssembly.Module>;\n\n entry?: ThreadEntry;\n}\n\nexport interface ThreadEntry {\n tid: number;\n arg: number;\n low: number;\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 STACK_POINTER = '__stack_pointer';\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 function reseatTls(\n exports: WebAssembly.Exports,\n bytes: (at: number, length: number) => Uint8Array\n): void {\n const init = exports.__wasm_init_tls;\n const base = exports.__tls_base;\n const size = exports.__tls_size;\n if (\n typeof init !== 'function' ||\n !(base instanceof WebAssembly.Global) ||\n !(size instanceof WebAssembly.Global)\n ) {\n return;\n }\n const at = base.value as number;\n const block = bytes(at, size.value as number).slice();\n init(at);\n bytes(at, block.length).set(block);\n}\n\nexport class AsyncifyDriver {\n private exports: WebAssembly.Exports & AsyncifyExports = {};\n\n private stackUpper = 0;\n\n private linked: { pointer: WebAssembly.Global; low: number } | undefined;\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 useStack(pointer: WebAssembly.Global, low: number): void {\n this.linked = { pointer, low };\n }\n\n private threadStack = false;\n\n useThreadStack(pointer: WebAssembly.Global, low: number): void {\n this.useStack(pointer, low);\n this.threadStack = true;\n }\n\n bind(exports: WebAssembly.Exports): void {\n this.exports = exports as WebAssembly.Exports & AsyncifyExports;\n this.stackUpper = this.stackPointer();\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 reseatTls(this.exports, (at, length) => this.mem.bytes(at, length));\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 = this.globals();\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 = this.globals();\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 stackGlobal(): WebAssembly.Global | undefined {\n const g = this.exports[STACK_POINTER];\n return g instanceof WebAssembly.Global ? g : this.linked?.pointer;\n }\n\n private stackPointer(): number {\n return (this.stackGlobal()?.value as number | undefined) ?? 0;\n }\n\n private globals(): Array<[string, number]> {\n const out = mutableGlobals(this.exports);\n if (this.linked && !out.some(([name]) => name === STACK_POINTER)) {\n out.push([STACK_POINTER, this.linked.pointer.value as number]);\n }\n return out;\n }\n\n private dataPointer(): number {\n const own = this.exports[STACK_POINTER] instanceof WebAssembly.Global;\n if (this.linked && (this.threadStack || !own)) return (this.linked.low + 15) & ~15;\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 = name === STACK_POINTER ? this.stackGlobal() : 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 { reseatTls } from './wasix-fork.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\n forkedTls: Map<number, number> | undefined;\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 tlsBases(): Array<[number, number]> {\n const bases: Array<[number, number]> = [];\n for (const [handle, linked] of this.modules) {\n const base = linked.instance.exports.__tls_base;\n if (base instanceof WebAssembly.Global) bases.push([handle, base.value as number]);\n }\n return bases;\n }\n\n private carryTls(linked: Linked): boolean {\n const base = this.forkedTls?.get(linked.handle);\n const global = linked.instance.exports.__tls_base;\n if (base === undefined || !(global instanceof WebAssembly.Global)) return false;\n global.value = base;\n reseatTls(\n linked.instance.exports,\n (at, length) => new Uint8Array(this.memory.buffer, at, length)\n );\n return true;\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 if (!this.carryTls(linked)) {\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 heapAlloc(bytes: number): number | undefined {\n const exports = this.main?.exports;\n const calloc = exports?.calloc;\n if (typeof calloc !== 'function') return undefined;\n const state = exports?.asyncify_get_state;\n if (typeof state === 'function' && (state as () => number)() !== 0) return undefined;\n const at = (calloc as Calloc)(1, bytes) >>> 0;\n return at === 0 ? undefined : at;\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 heap = this.heapAlloc(size + to - 16);\n if (heap !== undefined) return align(heap, to);\n const pages = Math.ceil((size + (to > PAGE ? to : 0)) / PAGE);\n return align(this.memory.grow(pages) * PAGE, to);\n }\n}\n\ntype Calloc = (count: number, size: number) => number;\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 { 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 { wasixEpollImports } from './wasix-epoll.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 STRICT_EPOLL_LIBC = 29;\nconst CWD_FD_LIBC = 41;\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 const libc = module ? (libcVersion(module) ?? 0) : undefined;\n if (libc !== undefined) host.strictEpoll = libc >= STRICT_EPOLL_LIBC;\n if (libc !== undefined) host.cwdFd = libc >= CWD_FD_LIBC;\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 ...wasixEpollImports(this.host),\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 if (host.cwdFd && host.fds.held && !host.fds.held.alive()) return E.NOENT;\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 const woken =\n host.entered || futexWait(i32(), ptr >> 2, expected | 0, ms, host.interrupted);\n v.setUint8(wokenPtr, woken ? 1 : 0);\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 definedFunctions(bytes: Uint8Array): number {\n let at = 8;\n const leb = (): number => {\n let value = 0;\n let shift = 0;\n let byte: number;\n do {\n if (at >= bytes.length) throw new RangeError('truncated module');\n byte = bytes[at++] as number;\n value += (byte & 0x7f) * 2 ** shift;\n shift += 7;\n } while (byte & 0x80);\n return value;\n };\n while (at < bytes.length) {\n const id = bytes[at++];\n const size = leb();\n if (id === 3) return leb();\n at += size;\n }\n return 0;\n}\n\nexport interface SidecarFit {\n functions(): number;\n warn(line: string): void;\n}\n\nexport function sidecarNames(\n read: (path: string) => Uint8Array,\n path: string,\n fit?: SidecarFit\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 let want = names.size;\n try {\n if (fit) want = fit.functions();\n } catch {\n fit?.warn(`${path} can't be checked against the module, so the frames show raw indices`);\n names = new Map();\n return undefined;\n }\n if (fit && names.size !== want) {\n fit.warn(\n `${path} names ${names.size} functions, but the module has ${want}: it doesn't fit, so the frames show raw indices`\n );\n names = new Map();\n }\n }\n return names.get(index);\n };\n}\n", "import { physicalPath } from '../../fs/physical-path.ts';\nimport { type CwdAnswer, HeldCwd } from '../../kernel/held-cwd.ts';\nimport type { MountLine, ProcessListing } from '../../kernel/proc-info.ts';\nimport type { WasmSyscall } from '../../kernel/process.ts';\nimport {\n type HeldCwdInit,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_READY,\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 { loadBlocked, 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 { rawStack } from '../raw-stack.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 { ptsBridge } from './wasi-ptsfs.ts';\nimport { WasiSigmask } from './wasi-sigmask.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 { definedFunctions, 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\nexport const takeThreadDefault =\n (call: (req: WasmSyscall) => unknown, pid: number) =>\n (sig: number): void => {\n if (defaultAction(sig) !== 'terminate') {\n call({ op: 'proc-kill', pid, sig });\n return;\n }\n try {\n call({ op: 'proc-kill-self', sig });\n } catch {}\n 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', 'siginfo_take'],\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.raisedOnEntry = () => gate.raisedOnEntry();\n host.quietly = (fn) => gate.quiet(fn);\n host.deliverDue = () => void gate.interrupt();\n host.fds.restartable = () => gate.restartable();\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 host.entered = false;\n if (driver.idle) {\n before?.();\n host.entered = host.interrupted?.() === true;\n host.enteredSignals = host.entered ? (host.raisedOnEntry?.() ?? -1) : 0;\n }\n return fn(...args);\n };\n }\n return out;\n}\n\nconst importsSlicc = (module: WebAssembly.Module, name: string): boolean =>\n WebAssembly.Module.imports(module).some((i) => i.module === SLICC && i.name === name);\n\nconst importsSigactionHook = (module: WebAssembly.Module): boolean =>\n importsSlicc(module, 'sigaction_set');\n\nexport function sigmaskOf(\n module: WebAssembly.Module,\n sab: SharedArrayBuffer,\n gate: Pick<SignalGate, 'deliver'>,\n threads: WasiThreads | undefined,\n process?: SharedArrayBuffer\n): WasiSigmask | undefined {\n const header = new Int32Array(sab, 0, SAB_HEADER_I32);\n if (!importsSlicc(module, 'sigmask_set')) {\n WasiSigmask.unsupported(header);\n return undefined;\n }\n if (threads) threads.blocked = () => loadBlocked(header);\n const shared = process && new Int32Array(process, 0, SAB_HEADER_I32);\n return new WasiSigmask(header, () => gate.deliver(), shared, threads?.tid ?? MAIN_TID);\n}\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 : r.kind === 'bytes' ? r.bytes : 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\nconst START_STACK = 0;\nconst START_STACK_SIZE = 56;\n\nfunction isWasix(module: WebAssembly.Module): boolean {\n return WebAssembly.Module.imports(module).some((i) => i.module === WASIX);\n}\n\nconst MIN_THREAD_STACK = 4096;\nconst START_ARGS_SLACK = 64;\n\nexport function threadStackLow(memory: DataView, start: number): number | undefined {\n if (start < 0 || start + START_ARGS_SLACK > memory.byteLength) return undefined;\n const stack = memory.getUint32(start + START_STACK, true);\n const size = memory.getUint32(start + START_STACK_SIZE, true);\n if (size < MIN_THREAD_STACK || size > memory.byteLength || size > stack) return undefined;\n if (stack % 16 !== 0 || stack > start + START_ARGS_SLACK || stack + START_ARGS_SLACK < start) {\n return undefined;\n }\n return stack - size;\n}\n\nfunction ownStack(\n driver: AsyncifyDriver,\n instance: WebAssembly.Instance,\n linked: WebAssembly.Global | undefined,\n low: number\n): boolean {\n const own = instance.exports.__stack_pointer;\n const pointer = own instanceof WebAssembly.Global ? own : linked;\n if (!pointer) return false;\n driver.useThreadStack(pointer, low);\n return true;\n}\n\nfunction untilDone(run: () => void, driver: AsyncifyDriver): void {\n do run();\n while (driver.resume());\n}\n\nfunction threadStart(instance: WebAssembly.Instance): (tid: number, arg: number) => void {\n return instance.exports.wasi_thread_start as (tid: number, arg: number) => void;\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 forked,\n stats,\n signals,\n program,\n foreign,\n path,\n }: {\n thread?: boolean;\n forked?: Pick<WasiForkState, 'tls' | 'modules'>;\n stats?: WasiStats;\n signals?: WasiSignals;\n program?: ProgramOption;\n foreign?: ForeignResults | undefined;\n path?: string | undefined;\n } = {}\n): Promise<{\n instance: WebAssembly.Instance;\n driver: AsyncifyDriver;\n linkedStack: WebAssembly.Global | undefined;\n}> {\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) bindLinker(host, sync, instance, { thread, forked, path });\n if (sync && !thread) driver.useStack(sync.linker.stackPointer, sync.linker.stackLow);\n return { instance, driver, linkedStack: sync?.linker.stackPointer };\n}\n\nfunction bindLinker(\n host: WasiHost,\n sync: LinkSync,\n instance: WebAssembly.Instance,\n at: {\n thread: boolean;\n forked: Pick<WasiForkState, 'tls' | 'modules'> | undefined;\n path: string | undefined;\n }\n): void {\n sync.linker.bindMain(instance, !at.thread && !at.forked);\n if (at.path !== undefined) sync.linker.mainPath = at.path;\n host.linkedTls = () => sync.linker.tlsBases();\n host.linkedModules = () => sync.linker.compiled();\n if (at.forked) {\n sync.linker.forkedTls = new Map(at.forked.tls ?? []);\n sync.linker.cache = at.forked.modules;\n }\n if (at.thread || at.forked) sync.catchUp();\n sync.linker.bindMainGot();\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; links?: boolean; changes?: SharedArrayBuffer }): {\n owners?: boolean;\n links?: boolean;\n changes?: SharedArrayBuffer;\n} {\n return {\n ...(init.owners ? { owners: true } : {}),\n ...(init.links ? { links: true } : {}),\n ...(init.changes ? { changes: init.changes } : {}),\n };\n}\n\nfunction heldOf(\n init: { held?: HeldCwdInit; cwd: string },\n call: (req: WasmSyscall) => unknown\n): { held?: HeldCwd } {\n const { held } = init;\n if (!held) return {};\n const ask = () => call({ op: 'cwd-check' }) as CwdAnswer;\n return { held: new HeldCwd(held.sab, held.slot, ask, { ...held, path: init.cwd }) };\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: ptsBridge(\n procfsBridge(\n cachingBridge(\n traced(\n stats,\n 'fs',\n createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true })\n ),\n undefined,\n threads?.ids\n ),\n procTree(call, id.pid)\n ),\n call\n ),\n ...descriptors(init, fork, threads),\n ...heldOf(init, call),\n ...(threads ? { credGen: threads.ids } : {}),\n });\n host.sigmask = sigmaskOf(module, init.sab, gate, threads);\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, linkedStack } = await instantiate(host, module, memory, threads, {\n ...(fork ? { forked: fork } : {}),\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 port.postMessage({ type: WASM_PROCESS_READY });\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 const entry = fork?.entry;\n if (entry) {\n ownStack(driver, instance, linkedStack, entry.low);\n host.threadEntry = entry;\n }\n const run = entry ? () => threadStart(instance)(entry.tid, entry.arg) : () => exports._start();\n try {\n if (fork) driver.startChild(fork);\n\n untilDone(run, driver);\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(trapReport(e, init, host, ''));\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 = (rawStack(e) ?? '').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 trapReport(\n e: WebAssembly.RuntimeError,\n init: { env: Readonly<Record<string, string>>; program: WasmProgram; argv0: string },\n host: WasiHost,\n where: string\n): string {\n const warned: string[] = [];\n const message = trapMessage(e, init.env, where, programNames(host, init.program, warned));\n return [...warned, message].join(`\\n${init.argv0}: `);\n}\n\nfunction programNames(\n host: WasiHost,\n program: WasmProgram,\n warned: string[]\n): ((index: number) => string | undefined) | undefined {\n const path = program.names;\n if (path === undefined) return undefined;\n const read = (p: string) => host.o.fs.readFile(p);\n const imported = WebAssembly.Module.imports(program.module).filter((i) => i.kind === 'function');\n return sidecarNames(read, path, {\n functions: () => imported.length + definedFunctions(read(program.path as string)),\n warn: (line) => warned.push(line),\n });\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(takeThreadDefault(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: ptsBridge(\n procfsBridge(\n cachingBridge(\n createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true }),\n undefined,\n threads.ids\n ),\n procTree(call, id.pid)\n ),\n call\n ),\n shared: threads.ids,\n ...heldOf(init, call),\n });\n host.tid = thread.tid;\n host.sigmask = sigmaskOf(init.program.module, init.sab, gate, threads, init.signals);\n\n const program = await programImports(init.program, host, transport, thread.tid);\n const { module } = init.program;\n const { memory } = thread;\n const { instance, driver, linkedStack } = await instantiate(host, module, 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 low = isWasix(module) ? threadStackLow(host.mem.view(), thread.arg) : undefined;\n if (low !== undefined && ownStack(driver, instance, linkedStack, low)) {\n driver.bind(instance.exports);\n host.threadEntry = { tid: thread.tid, arg: thread.arg, low };\n }\n const start = threadStart(instance);\n try {\n untilDone(() => start(thread.tid, thread.arg), driver);\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(trapReport(e, init, host, ` in thread ${thread.tid}`));\n } catch {}\n port.postMessage({ type: WASM_PROCESS_EXIT, code: TRAPPED });\n return;\n }\n throw e;\n }\n}\n", "import { createRequire, enableCompileCache, flushCompileCache } from 'node:module';\nimport { parentPort, workerData } from 'node:worker_threads';\nimport {\n glueUrl,\n moduleSource,\n nodeAsyncContext,\n nodeLockdown,\n nodeMemory,\n nodeProcess,\n nodePromiseState,\n nodeRunScript,\n ownCache,\n workerShaped,\n} from './node-lockdown.ts';\nimport { nodeErrorSource, nodeStackFormatter } from './node-stack.ts';\nimport { runJsProcess, runJsThread } from './process/js/js-runtime.ts';\nimport { processEntry } from './process/process-entry.ts';\nimport { runWasmProcess } from './process/process-runtime.ts';\nimport * as wasiRuntime from './process/wasi/wasi-runtime.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 data = workerData as { compileCache?: unknown; ownedCache?: unknown } | null;\nconst cacheDir = data?.compileCache;\nconst cached =\n typeof cacheDir === 'string' &&\n ownCache(cacheDir, enableCompileCache(cacheDir), data?.ownedCache === true);\nconst imported = cached ? () => flushCompileCache() : undefined;\n\nconst port = parentPort as NonNullable<typeof parentPort>;\nconst post = {\n postMessage: (message: unknown, transfer?: Transferable[]) =>\n port.postMessage(message, transfer as never),\n};\nconst strayScope = nodeProcess ? { process: nodeProcess } : {};\nconst onMessage = processEntry(\n post,\n (init, at) => {\n workerShaped(globalThis, glueUrl(init.program?.path));\n return runWasmProcess(init, at);\n },\n async () => wasiRuntime,\n async () => ({\n runJsProcess: (init, at) =>\n runJsProcess(init, at, {\n lockdown: () => nodeLockdown(),\n scope: strayScope,\n memory: nodeMemory,\n asyncContext: nodeAsyncContext,\n runScript: nodeRunScript,\n moduleSource,\n promiseState: nodePromiseState,\n stackFormatter: nodeStackFormatter,\n errorSource: nodeErrorSource,\n imported,\n }),\n runJsThread: (init, at) =>\n runJsThread(init, at, {\n lockdown: () => nodeLockdown(),\n scope: strayScope,\n memory: nodeMemory,\n asyncContext: nodeAsyncContext,\n runScript: nodeRunScript,\n moduleSource,\n promiseState: nodePromiseState,\n stackFormatter: nodeStackFormatter,\n errorSource: nodeErrorSource,\n imported,\n }),\n }),\n () => nodeLockdown()\n);\nport.on('message', onMessage);\n", "import { AsyncLocalStorage } from 'node:async_hooks';\nimport { createHash } from 'node:crypto';\nimport type { Session } from 'node:inspector';\nimport { isBuiltin, registerHooks } from 'node:module';\nimport { resolve, sep } from 'node:path';\nimport { types } from 'node:util';\nimport { getHeapStatistics } from 'node:v8';\nimport { runInThisContext } from 'node:vm';\nimport { programScript } from './node-stack.ts';\nimport { hide, lockdown, vacate } from './process/js/lockdown.ts';\n\nexport { vacate };\n\nexport const NODE_GLOBALS: readonly string[] = ['localStorage', 'sessionStorage'];\n\nexport const NODE_SLOTS: readonly string[] = [\n 'require',\n 'module',\n 'exports',\n '__filename',\n '__dirname',\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\nconst BASE64_MODULE = 'data:text/javascript;base64,';\nconst fromBase64 = Buffer.from.bind(Buffer);\nconst toText = Function.prototype.call.bind(Buffer.prototype.toString) as (\n bytes: Buffer,\n encoding: 'utf8'\n) => string;\nconst PLAIN_BASE64 = /^[A-Za-z0-9+/]+={0,2}$/;\n\nconst SOURCE_MODULE = 'slicc-module:';\nconst sources = new Map<string, string>();\n\nexport function moduleSource(url: string, source: string): void {\n sources.set(url, source);\n programScript(url, url.slice(SOURCE_MODULE.length));\n}\n\nconst sha256 = createHash;\n\nfunction sourceHash(source: string): string {\n return sha256('sha256').update(source).digest('hex');\n}\n\nexport function refuseModules(): void {\n registerHooks({\n resolve(specifier, context, next) {\n if (specifier.startsWith(SOURCE_MODULE)) {\n if (!sources.has(specifier)) throw refused(specifier);\n return { url: specifier, shortCircuit: true };\n }\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 load(url, context, next) {\n const known = sources.get(url);\n if (known !== undefined) return { format: 'module', source: known, shortCircuit: true };\n const payload = url.startsWith(BASE64_MODULE) ? url.slice(BASE64_MODULE.length) : '';\n const typed = Object.keys(context.importAttributes ?? {}).length > 0;\n if (typed || payload.length % 4 !== 0 || !PLAIN_BASE64.test(payload))\n return next(url, context);\n const source = toText(fromBase64(payload, 'base64'), 'utf8');\n return { format: 'module', source, shortCircuit: true };\n },\n });\n}\n\nconst locked = new WeakSet<object>();\n\nconst nodeProcess =\n typeof globalThis.process === 'object' && globalThis.process !== null\n ? globalThis.process\n : undefined;\n\nexport { nodeProcess };\n\nconst heapStatistics = getHeapStatistics;\nconst memoryUsage = process.memoryUsage.bind(process);\n\nexport function nodeMemory(): {\n heapUsed: number;\n heapTotal: number;\n heapLimit: number;\n external: number;\n arrayBuffers: number;\n rss: number;\n} {\n const heap = heapStatistics();\n const usage = memoryUsage();\n return {\n heapUsed: heap.used_heap_size,\n heapTotal: heap.total_heap_size,\n heapLimit: heap.heap_size_limit,\n external: heap.external_memory,\n arrayBuffers: usage.arrayBuffers,\n rss: usage.rss,\n };\n}\n\nexport function nodeLockdown(scope: object = globalThis): void {\n if (locked.has(scope)) return;\n locked.add(scope);\n zeroedBuffers(Buffer);\n lockdown(scope);\n hide(scope, NODE_GLOBALS);\n vacate(scope, NODE_SLOTS);\n refuseModules();\n}\n\nclass WorkerGlobalScope {}\n\nexport function glueUrl(path: string | undefined): string {\n const at = path?.startsWith('/') ? path : '/';\n return `file://${at.split('/').map(encodeURIComponent).join('/')}`;\n}\n\nexport function workerShaped(scope: object, href: string): void {\n const slot = (value: unknown) => ({\n value,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n Object.defineProperties(scope, {\n WorkerGlobalScope: slot(WorkerGlobalScope),\n self: slot(scope),\n location: slot(Object.freeze({ href })),\n });\n}\n\nexport function ownCache(dir: string, result: { directory?: string }, optional = false): boolean {\n const active = result.directory;\n if (active === undefined) return false;\n if (!`${resolve(active)}${sep}`.startsWith(`${resolve(dir)}${sep}`)) {\n if (optional) return false;\n throw new Error(\n `slicc-kernel: compileCache ${dir} was asked for, but this worker already caches in ${active} (a host preload enabled it): refusing to run programs`\n );\n }\n return true;\n}\n\nconst runHere = runInThisContext;\n\nexport function nodeRunScript(\n source: string,\n filename: string\n): { value: unknown; completion: boolean } {\n const options = blank(null) as { filename: string; displayErrors: boolean };\n options.filename = filename;\n options.displayErrors = false;\n programScript(filename, sourceHash(source));\n return freeze({ value: runHere(source, options), completion: true });\n}\n\nconst isPromise = types.isPromise;\nconst here: object = globalThis;\nconst define = Reflect.defineProperty;\nconst remove = Reflect.deleteProperty;\nconst call = Reflect.apply;\nconst hasOwn = Object.hasOwn;\nconst stringify = JSON.stringify;\nconst endsWith = String.prototype.endsWith;\nconst sliceOf = String.prototype.slice;\nconst toHex = Number.prototype.toString;\nconst random = Math.random;\nconst makeBigInt = BigInt;\nconst builtin = process.getBuiltinModule.bind(process);\nconst find = Array.prototype.find;\nconst keysOf = Object.keys;\nconst nothing = Object.create;\nconst isList = Array.isArray;\nconst seal = Object.freeze;\nconst ownKeys = Reflect.ownKeys;\nconst ownDescriptor = Reflect.getOwnPropertyDescriptor;\nconst BASE = Object.prototype;\ntype Snapshot = ReadonlyArray<readonly [PropertyKey, PropertyDescriptor | undefined]>;\n\nfunction snapshot(of: object): Snapshot {\n const keys = ownKeys(of);\n const out: Array<readonly [PropertyKey, PropertyDescriptor | undefined]> = [];\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i] as PropertyKey;\n out[i] = [key, ownDescriptor(of, key)];\n }\n return out;\n}\n\nfunction sameDescriptor(\n a: PropertyDescriptor | undefined,\n b: PropertyDescriptor | undefined\n): boolean {\n if (a === undefined || b === undefined) return a === b;\n for (let i = 0; i < FIELDS.length; i++) {\n const field = FIELDS[i] as string;\n if (own(a, field) !== own(b, field)) return false;\n }\n return true;\n}\n\nconst FIELDS = ['value', 'get', 'set', 'writable', 'enumerable', 'configurable'];\nconst BASE_SNAPSHOT = snapshot(BASE);\n\nfunction baseUnchanged(): boolean {\n const keys = ownKeys(BASE);\n if (keys.length !== BASE_SNAPSHOT.length) return false;\n for (let i = 0; i < keys.length; i++) {\n const was = BASE_SNAPSHOT[i] as readonly [PropertyKey, PropertyDescriptor | undefined];\n if (keys[i] !== was[0]) return false;\n if (!sameDescriptor(ownDescriptor(BASE, keys[i] as PropertyKey), was[1])) return false;\n }\n return true;\n}\nconst SERIALIZED = [Array.prototype, String.prototype, Number.prototype, Boolean.prototype];\n\nfunction untouched(): boolean {\n if (!baseUnchanged()) return false;\n for (let i = 0; i < SERIALIZED.length; i++) {\n if (ownDescriptor(SERIALIZED[i] as object, 'toJSON') !== undefined) return false;\n }\n return true;\n}\nconst Failure = Error;\nconst WrongType = TypeError;\n\nfunction own(from: unknown, key: string): unknown {\n return typeof from === 'object' && from !== null && hasOwn(from, key)\n ? (from as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction bare(fields: Record<string, unknown>): object {\n const out = nothing(null) as Record<string, unknown>;\n const keys = keysOf(fields);\n for (let i = 0; i < keys.length; i++) out[keys[i] as string] = fields[keys[i] as string];\n return out;\n}\n\nlet session: Session | undefined;\nlet inspectorGone = false;\nlet probing = false;\n\nfunction post(method: string, params: Record<string, unknown>): unknown {\n let out: unknown;\n let failed: unknown;\n let done = false;\n call((session as Session).post, session, [\n method,\n bare(params),\n (err: unknown, result: unknown) => {\n failed = err;\n out = result;\n done = true;\n },\n ]);\n if (!done) throw new Failure('slicc-kernel: the inspector did not answer synchronously');\n if (failed) throw failed;\n return out;\n}\n\nexport function inspectorSession(load: () => { Session: new () => Session }): Session | undefined {\n try {\n const made = new (load().Session)();\n made.connect();\n return made;\n } catch {\n return undefined;\n }\n}\n\nfunction connected(): boolean {\n if (session) return true;\n if (inspectorGone) return false;\n session = inspectorSession(() => builtin('node:inspector') as { Session: new () => Session });\n inspectorGone = session === undefined;\n return !inspectorGone;\n}\n\nfunction idOf(key: string, value: unknown, group: string): unknown {\n if (!define(here, key, { __proto__: null, value, configurable: true } as PropertyDescriptor)) {\n return undefined;\n }\n const result = own(\n post('Runtime.evaluate', {\n expression: `this[${stringify(key)}]`,\n objectGroup: group,\n includeCommandLineAPI: false,\n silent: true,\n returnByValue: false,\n generatePreview: false,\n }),\n 'result'\n );\n return own(result, 'objectId');\n}\n\nfunction primitive(remote: unknown): unknown {\n const raw = own(remote, 'unserializableValue');\n if (typeof raw !== 'string') return own(remote, 'value');\n if (call(endsWith, raw, ['n'])) return makeBigInt(call(sliceOf, raw, [0, -1]) as string);\n if (raw === 'NaN') return 0 / 0;\n if (raw === '-0') return -0;\n return raw === 'Infinity' ? 1 / 0 : -1 / 0;\n}\n\nfunction internal(list: unknown, name: string): unknown {\n if (!isList(list)) return undefined;\n return own(call(find, list, [(item: unknown) => own(item, 'name') === name]), 'value');\n}\n\ntype Settled = { state: 'pending' | 'fulfilled' | 'rejected'; value: unknown };\n\nfunction probe(promise: unknown, group: string, key: string): Settled | undefined {\n const promiseId = idOf(key, promise, group);\n if (promiseId === undefined) return undefined;\n const found = own(\n post('Runtime.getProperties', {\n objectId: promiseId,\n ownProperties: true,\n generatePreview: false,\n }),\n 'internalProperties'\n );\n const state = own(internal(found, '[[PromiseState]]'), 'value') as Settled['state'];\n if (state === 'pending') return seal({ state, value: undefined });\n const result = internal(found, '[[PromiseResult]]');\n const resultId = own(result, 'objectId');\n if (typeof resultId !== 'string') return seal({ state, value: primitive(result) });\n const holder = nothing(null) as { v?: unknown };\n const holderId = idOf(key, holder, group);\n if (holderId === undefined) return undefined;\n post('Runtime.callFunctionOn', {\n objectId: resultId,\n functionDeclaration: 'function (h) { \"use strict\"; h.v = this; }',\n arguments: [bare({ objectId: holderId })],\n objectGroup: group,\n silent: true,\n returnByValue: false,\n generatePreview: false,\n });\n return seal({ state, value: holder.v });\n}\n\nexport function nodePromiseState(promise: unknown): Settled | undefined {\n if (!isPromise(promise)) throw new WrongType('promiseState needs a native promise');\n if (probing) throw new Failure('slicc-kernel: promiseState is already running');\n if (!untouched() || !connected()) return undefined;\n probing = true;\n const tag = call(toHex, random() * 2 ** 52, [16]) as string;\n const group = `slicc-promise-${tag}`;\n const key = `__slicc_promise_${tag}`;\n try {\n return probe(promise, group, key);\n } finally {\n remove(here, key);\n try {\n post('Runtime.releaseObjectGroup', { objectGroup: group });\n } finally {\n probing = false;\n }\n }\n}\n\nconst Storage = AsyncLocalStorage;\nconst apply = Reflect.apply;\nconst freeze = Object.freeze;\nconst blank = Object.create;\n\nexport function nodeAsyncContext(): {\n run<R>(store: unknown, fn: (...args: unknown[]) => R, ...args: unknown[]): R;\n getStore(): unknown;\n enterWith(store: unknown): void;\n} {\n const storage = new Storage<unknown>();\n const run = storage.run.bind(storage);\n const getStore = storage.getStore.bind(storage);\n const enterWith = storage.enterWith.bind(storage);\n const api = blank(null);\n api.run = freeze(<R>(store: unknown, fn: (...args: unknown[]) => R, ...args: unknown[]): R => {\n if (typeof fn !== 'function') throw new TypeError('asyncContext.run needs a function');\n return run(store, () => apply(fn, undefined, args));\n });\n api.getStore = freeze((): unknown => getStore());\n api.enterWith = freeze((store: unknown): void => enterWith(store));\n return freeze(api);\n}\n", "import { createRequire } from 'node:module';\nimport { types } from 'node:util';\nimport type { JsErrorSource, JsStackFormatter } from './process/js/js-context.ts';\nimport { setRawStack } from './process/raw-stack.ts';\n\ntype Prepare = (error: unknown, trace: object[]) => unknown;\n\ntype Callback = (realm: unknown, error: unknown, trace: object[]) => unknown;\n\ninterface Positions {\n sourceLine?: unknown;\n scriptResourceName?: unknown;\n lineNumber?: unknown;\n startColumn?: unknown;\n}\n\ninterface Internals {\n setInternalPrepareStackTrace: (fn: Prepare) => void;\n fallback: Prepare;\n positions: ((error: object) => Positions | undefined) | undefined;\n setCallback: ((fn: Callback) => void) | undefined;\n overrides: WeakMap<object, Prepare>;\n nodeDefault: unknown;\n}\n\ninterface ErrorsBinding {\n getErrorSourcePositions?: unknown;\n setPrepareStackTraceCallback?: unknown;\n}\n\ntype Binding = (name: string) => ErrorsBinding;\n\nexport function quietly<T>(target: { emitWarning: unknown }, run: () => T): T {\n const emit = target.emitWarning;\n target.emitWarning = () => {};\n try {\n return run();\n } finally {\n target.emitWarning = emit;\n }\n}\n\nexport function bindingOf(load: (id: string) => unknown): ErrorsBinding {\n try {\n const { internalBinding } = quietly(\n process,\n () => load('internal/test/binding') as { internalBinding: Binding }\n );\n return internalBinding('errors');\n } catch {\n return {};\n }\n}\n\nfunction fn<T>(value: unknown): T | undefined {\n return typeof value === 'function' ? (value as T) : undefined;\n}\n\nconst apply = Reflect.apply;\nconst push = Array.prototype.push;\nconst startsWith = String.prototype.startsWith;\nconst slice = String.prototype.slice;\nconst lastIndexOf = String.prototype.lastIndexOf;\nconst indexOf = String.prototype.indexOf;\nconst setHas = Set.prototype.has;\nconst setAdd = Set.prototype.add;\nconst mapGet = WeakMap.prototype.get;\nconst mapSet = WeakMap.prototype.set;\nconst mapHas = WeakMap.prototype.has;\nconst mapDelete = WeakMap.prototype.delete;\nconst MainError = Error;\nconst isNativeError = types.isNativeError;\nconst freeze = Object.freeze;\nconst blank = Object.create;\n\nfunction internals(): Internals | undefined {\n try {\n const load = createRequire(import.meta.url);\n const errors = load('internal/errors') as {\n setInternalPrepareStackTrace?: unknown;\n defaultPrepareStackTrace?: unknown;\n overrideStackTrace?: unknown;\n ErrorPrepareStackTrace?: unknown;\n };\n const set = errors.setInternalPrepareStackTrace;\n let fallback = errors.defaultPrepareStackTrace;\n if (process.sourceMapsEnabled) {\n fallback = (\n load('internal/source_map/prepare_stack_trace') as {\n prepareStackTraceWithSourceMaps?: unknown;\n }\n ).prepareStackTraceWithSourceMaps;\n }\n const overrides = errors.overrideStackTrace;\n const usable = typeof set === 'function' && typeof fallback === 'function';\n if (!usable || !types.isWeakMap(overrides)) return undefined;\n const binding = bindingOf(load);\n return {\n setInternalPrepareStackTrace: set as Internals['setInternalPrepareStackTrace'],\n fallback: fallback as Prepare,\n positions: fn(binding.getErrorSourcePositions),\n setCallback: fn(binding.setPrepareStackTraceCallback),\n overrides: overrides as WeakMap<object, Prepare>,\n nodeDefault: errors.ErrorPrepareStackTrace,\n };\n } catch {\n return undefined;\n }\n}\n\ninterface Site {\n getFileName(): string | null | undefined;\n getScriptHash(): string;\n isEval(): boolean;\n getEvalOrigin(): string | undefined;\n getLineNumber(): number | null;\n getScriptNameOrSourceURL(): string | null | undefined;\n getFunctionName(): string | null;\n getTypeName(): string | null;\n}\n\nfunction ownSite(): Site {\n const saved = Object.getOwnPropertyDescriptor(Error, 'prepareStackTrace');\n try {\n Object.defineProperty(Error, 'prepareStackTrace', {\n value: (_: unknown, sites: object[]) => sites[0],\n configurable: true,\n writable: true,\n });\n return (new Error() as unknown as { stack: Site }).stack;\n } finally {\n delete (Error as { prepareStackTrace?: unknown }).prepareStackTrace;\n Object.defineProperties(Error, saved ? { prepareStackTrace: saved } : {});\n }\n}\n\nconst self = ownSite();\nconst proto = Object.getPrototypeOf(self) as Site;\nconst fileOf = proto.getFileName;\nconst hashOf = proto.getScriptHash;\nconst isEval = proto.isEval;\nconst originOf = proto.getEvalOrigin;\nconst lineOf = proto.getLineNumber;\nconst nameOf = proto.getScriptNameOrSourceURL;\nconst functionOf = proto.getFunctionName;\nconst typeOf = proto.getTypeName;\nconst syntaxProto = SyntaxError.prototype;\nconst protoOf = Object.getPrototypeOf;\nconst ownNames = new Set<unknown>([\n apply(fileOf, self, []),\n apply(proto.getScriptNameOrSourceURL, self, []),\n]);\nconst ownHash = apply(hashOf, self, []) as string;\n\nconst programHashes = new Set<string>();\nconst programNames = new Set<string>();\n\nexport function programScript(name: string, hash: string): void {\n apply(setAdd, programNames, [name]);\n apply(setAdd, programHashes, [hash]);\n}\n\nconst SOURCE_NAMES = 4096;\nconst sourceNames = new Set<string>();\n\nfunction programName(name: string): boolean {\n return (\n apply(startsWith, name, ['data:']) === true ||\n apply(setHas, programNames, [name]) === true ||\n apply(setHas, sourceNames, [name]) === true\n );\n}\n\nexport function noteSourceUrls(trace: readonly object[]): void {\n for (let i = 0; i < trace.length; i++) {\n const site = trace[i] as object;\n if (apply(isEval, site, []) !== true || apply(hashOf, site, []) === ownHash) continue;\n const origin = apply(originOf, site, []) as string | undefined;\n if (typeof origin !== 'string' || evalAt(origin)) continue;\n const name = apply(nameOf, site, []) as unknown;\n if (typeof name !== 'string' || apply(setHas, ownNames, [name]) === true) continue;\n if (sourceNames.size < SOURCE_NAMES) apply(setAdd, sourceNames, [name]);\n }\n}\n\nexport function rootOrigin(origin: string): string {\n let at = origin;\n while (apply(startsWith, at, ['eval at ']) === true) {\n const open = apply(indexOf, at, [' (']) as number;\n if (open < 0) return '';\n let depth = 1;\n let i = open + 2;\n for (; i < at.length && depth > 0; i++) {\n const c = at[i];\n if (c === '(') depth++;\n else if (c === ')') depth--;\n }\n if (depth !== 0) return '';\n at = apply(slice, at, [open + 2, i - 1]) as string;\n }\n let end = at.length;\n for (let n = 0; n < 2; n++) {\n const colon = apply(lastIndexOf, at, [':', end - 1]) as number;\n if (colon <= 0) break;\n end = colon;\n }\n return apply(slice, at, [0, end]) as string;\n}\n\nfunction evalAt(origin: string): boolean {\n return apply(startsWith, origin, ['eval at ']) === true;\n}\n\nfunction scriptOf(site: object): unknown {\n if (apply(isEval, site, []) !== true) return apply(fileOf, site, []);\n const origin = apply(originOf, site, []) as string | undefined;\n if (typeof origin !== 'string' || evalAt(origin)) return undefined;\n return apply(nameOf, site, []);\n}\n\nexport function keptFrame(site: object): boolean {\n const hash = apply(hashOf, site, []) as string;\n if (hash === ownHash) return false;\n if (apply(isEval, site, []) === true) {\n const origin = apply(originOf, site, []) as string | undefined;\n if (typeof origin !== 'string') return false;\n return !evalAt(origin) || programName(rootOrigin(origin));\n }\n const file = apply(fileOf, site, []) as unknown;\n if (typeof file !== 'string') return true;\n if (apply(setHas, programHashes, [hash]) === true) return true;\n return apply(startsWith, file, ['node:']) === true || programName(file);\n}\n\nexport function keptFrames(trace: readonly object[]): object[] {\n noteSourceUrls(trace);\n const out: object[] = [];\n for (let i = 0; i < trace.length; i++) {\n const site = trace[i] as object;\n if (keptFrame(site)) apply(push, out, [site]);\n }\n return out;\n}\n\nlet formatter: JsStackFormatter | null = null;\nlet withOwn = false;\nlet formatting = false;\n\ninterface Seen {\n site: object;\n next: object | undefined;\n at: Positions | undefined;\n}\n\nconst seen = new WeakMap<object, Seen>();\n\nfunction positionsAt(\n positions: Internals['positions'],\n error: object,\n site: object\n): Positions | undefined {\n if (positions === undefined || !keptFrame(site)) return undefined;\n try {\n return positions(error);\n } catch {\n return undefined;\n }\n}\n\nfunction record(positions: Internals['positions'], error: unknown, trace: object[]): void {\n if (typeof error === 'object' && error !== null && trace.length > 0) {\n noteSourceUrls(trace);\n const site = trace[0] as object;\n const next = trace[1] as object | undefined;\n apply(mapSet, seen, [error, { site, next, at: positionsAt(positions, error, site) }]);\n }\n}\n\nexport function stackDispatcher(fallback: Prepare, positions?: Internals['positions']): Prepare {\n return (error, trace) => {\n record(positions, error, trace);\n const fn = formatter;\n if (fn === null || formatting) return apply(fallback, undefined, [error, trace]);\n formatting = true;\n try {\n const out = apply(fn, undefined, [error, keptFrames(trace)]);\n if (typeof out === 'string') return out;\n } catch {\n } finally {\n formatting = false;\n }\n return apply(fallback, undefined, [error, trace]);\n };\n}\n\ninterface Own {\n fn: Prepare;\n self: unknown;\n}\n\nfunction errorOf(realm: unknown): unknown {\n return realm === null || realm === undefined ? undefined : (realm as { Error?: unknown }).Error;\n}\n\nfunction prepareOf(holder: unknown): unknown {\n return holder === null || holder === undefined\n ? undefined\n : (holder as { prepareStackTrace?: unknown }).prepareStackTrace;\n}\n\nexport function ownPrepare(realm: unknown, nodeDefault: unknown): Own | undefined {\n let self: unknown;\n if (typeof prepareOf(errorOf(realm)) === 'function') self = errorOf(realm);\n else if (typeof prepareOf(MainError) === 'function') self = MainError;\n else return undefined;\n const value = prepareOf(self);\n return value === nodeDefault ? undefined : { fn: value as Prepare, self };\n}\n\nfunction calling<T>(run: () => T): T {\n formatting = true;\n try {\n return run();\n } finally {\n formatting = false;\n }\n}\n\nexport function kernelCallback(\n internal: Pick<Internals, 'fallback' | 'positions' | 'overrides' | 'nodeDefault'>,\n dispatch: Prepare\n): Callback {\n const { fallback, positions, overrides, nodeDefault } = internal;\n return (realm, error, trace) => {\n if (apply(mapHas, overrides, [error]) === true) {\n const override = apply(mapGet, overrides, [error]) as Prepare;\n apply(mapDelete, overrides, [error]);\n return apply(override, undefined, [error, trace]);\n }\n const own = ownPrepare(realm, nodeDefault);\n if (formatting) return apply(fallback, undefined, [error, keptFrames(trace)]);\n const fmt = formatter;\n if (fmt !== null && withOwn) {\n record(positions, error, trace);\n return calling(() => apply(fmt, undefined, [error, keptFrames(trace), own?.fn]));\n }\n if (own === undefined) return apply(dispatch, undefined, [error, trace]);\n record(positions, error, trace);\n return apply(own.fn, own.self, [error, trace]);\n };\n}\n\nexport function rawReader(\n overrides: WeakMap<object, Prepare>,\n fallback: Prepare\n): (error: Error) => unknown {\n return (error) => {\n apply(mapSet, overrides, [\n error,\n (e: unknown, trace: object[]) => apply(fallback, undefined, [e, trace]),\n ]);\n try {\n return error.stack;\n } finally {\n apply(mapDelete, overrides, [error]);\n }\n };\n}\n\nconst found = internals();\nif (found) {\n const dispatch = stackDispatcher(found.fallback, found.positions);\n found.setInternalPrepareStackTrace(dispatch);\n if (found.setCallback) {\n found.setCallback(kernelCallback(found, dispatch));\n setRawStack(rawReader(found.overrides, found.fallback));\n }\n}\n\nexport const nodeStackFormatter:\n | ((fn: JsStackFormatter | null, options?: { own?: boolean }) => JsStackFormatter | null)\n | undefined = found\n ? (next, options) => {\n if (next !== null && typeof next !== 'function') {\n throw new TypeError('setStackFormatter needs a function or null');\n }\n const own = options === undefined ? false : (options as { own?: unknown }).own;\n if (typeof own !== 'boolean' && own !== undefined) {\n throw new TypeError('setStackFormatter: own must be a boolean');\n }\n const previous = formatter;\n formatter = next;\n withOwn = next !== null && own === true;\n return previous;\n }\n : undefined;\n\nfunction programFrame(site: object | undefined): boolean {\n if (site === undefined || !keptFrame(site)) return false;\n if (apply(isEval, site, []) === true) return true;\n const file = apply(fileOf, site, []) as unknown;\n return typeof file === 'string' && apply(startsWith, file, ['node:']) !== true;\n}\n\nexport function jsonParseSite(error: object, got: Seen): boolean {\n const { site, next } = got;\n if (protoOf(error) !== syntaxProto || apply(fileOf, site, []) !== null) return false;\n if (apply(functionOf, site, []) !== 'parse' || apply(typeOf, site, []) !== 'JSON') return false;\n return programFrame(next);\n}\n\nexport function errorSourceOf(error: unknown): JsErrorSource | undefined {\n if (typeof error !== 'object' || error === null || !isNativeError(error)) return undefined;\n try {\n void (error as { stack?: unknown }).stack;\n } catch {\n return undefined;\n }\n const got = apply(mapGet, seen, [error]) as Seen | undefined;\n if (got === undefined || !keptFrame(got.site)) return undefined;\n const { site, at } = got;\n if (!at || typeof at.sourceLine !== 'string' || typeof at.lineNumber !== 'number')\n return undefined;\n if (apply(setHas, ownNames, [at.scriptResourceName]) === true) return undefined;\n if (jsonParseSite(error, got))\n return at.scriptResourceName === undefined ? answer(at) : undefined;\n const file = scriptOf(site);\n if (at.scriptResourceName !== file || apply(lineOf, site, []) !== at.lineNumber) return undefined;\n return answer(at);\n}\n\nfunction answer(at: Positions): JsErrorSource {\n const out = blank(null) as JsErrorSource;\n out.sourceLine = at.sourceLine as string;\n out.lineNumber = at.lineNumber as number;\n out.startColumn = typeof at.startColumn === 'number' ? at.startColumn : 0;\n return freeze(out);\n}\n\nexport const nodeErrorSource: ((error: unknown) => JsErrorSource | undefined) | undefined =\n found?.positions ? errorSourceOf : undefined;\n", "import { useLocalClock } from '../kernel/cpu-clock.ts';\nimport {\n JS_THREAD_EXIT,\n JS_THREAD_INIT,\n type JsProcessInitMsg,\n type JsThreadExitMsg,\n type JsThreadInitMsg,\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';\nimport { rawStack } from './raw-stack.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 runJsThread?(init: JsThreadInitMsg, 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 ? (rawStack(err) ?? 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 && type !== JS_THREAD_INIT) return;\n const refusal = sealOnce();\n if (type === JS_THREAD_INIT) {\n if (refusal) return failed(refusal.error);\n js()\n .then((m) => {\n if (!m.runJsThread) throw new Error('this process worker runs no JS threads');\n return m.runJsThread(data as JsThreadInitMsg, port);\n })\n .then(\n (code) => port.postMessage({ type: JS_THREAD_EXIT, code } satisfies JsThreadExitMsg),\n failed\n );\n return;\n }\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
|
+
"names": ["name", "value", "read", "name", "opened", "scope", "code", "name", "seen", "last", "start", "written", "seen", "changed", "start", "json", "code", "code", "copy", "seen", "filled", "name", "young", "entry", "gone", "cached", "missing", "current", "follow", "now", "opening", "rest", "RING", "RING_SIZE", "SLOT", "size", "changed", "readable", "writable", "status", "errno", "message", "port", "blocked", "wait", "index", "value", "start", "blocked", "copy", "port", "wait", "settled", "start", "timeoutMs", "status", "code", "seen", "json", "data", "follow", "opening", "held", "index", "seen", "port", "status", "found", "errno", "message", "resolve", "code", "seen", "same", "read", "typeOf", "random", "json", "write", "index", "name", "follow", "copy", "write", "next", "answer", "index", "data", "found", "start", "call", "name", "value", "timeoutMs", "apply", "seen", "fn", "call", "next", "O_APPEND", "write", "read", "writable", "O_RDWR", "O_WRONLY", "GEN", "missing", "start", "held", "seen", "device", "name", "here", "changed", "next", "joined", "openDevice", "readable", "call", "decoder", "data", "encoder", "read", "write", "timeoutMs", "found", "NS_PER_MS", "apply", "value", "seen", "own", "value", "value", "FOREVER", "NS_PER_MS", "call", "refusal", "writeEvents", "data", "name", "ownNames", "port", "openRequest", "call", "name", "found", "idOf", "value", "NS_PER_MS", "next", "name", "record", "fn", "code", "call", "copy", "modeOf", "follow", "own", "lookup", "wait", "start", "errno", "listen", "data", "joined", "resolved", "answer", "bound", "gone", "device", "json", "filled", "alias", "current", "field", "listed", "O_WRONLY", "O_RDWR", "O_APPEND", "name", "opened", "slots", "status", "call", "timeoutMs", "LOOPBACK", "port", "slot", "read", "write", "STDIO", "name", "status", "slot", "answer", "held", "status", "wait", "slots", "call", "session", "read", "write", "STDIO", "name", "opened", "data", "status", "name", "value", "status", "local", "port", "next", "start", "rest", "base64", "reader", "own", "CHUNK", "follow", "fromBase64", "own", "rest", "chain", "call", "code", "errno", "found", "refuse", "limit", "resolve", "plain", "pump", "next", "name", "SOL_SOCKET", "local", "readable", "writable", "opened", "failed", "SO_ERROR", "LOOPBACK", "session", "lookup", "code", "name", "errno", "code", "errno", "S_IFLNK", "S_IFIFO", "changed", "call", "seen", "wantOf", "read", "write", "idOf", "opening", "s", "st", "held", "name", "follow", "missing", "bound", "pinnedIo", "fn", "attr", "cached", "listed", "UMASK", "S_IFMT", "opened", "out", "O_APPEND", "bytes", "SEEK_CUR", "SEEK_END", "own", "parentOf", "value", "refused", "code", "errno", "kindOf", "F_RDLCK", "F_WRLCK", "F_UNLCK", "start", "writeHolder", "found", "refused", "O_ACCMODE", "O_WRONLY", "baseOf", "SEEK_CUR", "SEEK_END", "F_GETLK", "F_SETLK", "F_SETLKW", "LOCK_NB", "failed", "code", "answer", "copy", "rest", "name", "value", "own", "seen", "wrap", "O_PATH", "found", "AT_SYMLINK_NOFOLLOW", "errnoOf", "errno", "code", "write", "O_ACCMODE", "O_WRONLY", "data", "lookup", "O_TRUNC", "remove", "refused", "baseOf", "AT_FDCWD", "call", "follow", "AT_EACCESS", "field", "listing", "name", "value", "sum", "scope", "UID", "self", "own", "LINK_MODE", "errno", "data", "find", "processes", "DIR_MODE", "next", "listed", "found", "procOps", "lookup", "current", "remember", "follow", "next", "MAX_HOPS", "failed", "code", "found", "refuse", "seen", "physical", "GONE", "own", "readOnly", "snapshot", "probe", "late", "name", "listed", "held", "fn", "rest", "DIR_MODE", "FILE_MODE", "LINK_MODE", "listing", "processes", "listing", "read", "index", "name", "value", "resolve", "rest", "data", "encoder", "decodeReceived", "bytesOf", "STDIO", "value", "encoder", "errno", "resolve", "resolved", "read", "index", "write", "data", "encoder", "openDev", "decodeReceived", "found", "current", "name", "SYNTHETIC_DIRS", "code", "idOf", "value", "call", "find", "follow", "O_NONBLOCK", "value", "SEALED_PATH", "CLIPBOARD_PATH", "EMBEDDER_PATH", "O_CREAT", "O_EXCL", "O_TRUNC", "status", "code", "name", "missing", "fdStat", "rest", "device", "absolute", "read", "write", "streams", "held", "kernelEntry", "device", "O_RDWR", "O_ACCMODE", "slots", "slot", "DEVICES", "O_CREAT", "O_EXCL", "O_TRUNC", "restarted", "seen", "streams", "errno", "read", "write", "timeoutMs", "POLLIN", "POLLOUT", "POLLHUP", "POLLERR", "own", "local", "slice", "call", "slot", "S_IFMT", "S_IFDIR", "device", "status", "data", "call", "code", "message", "timeoutMs", "same", "fn", "blocked", "code", "streams", "call", "json", "guard", "O_RDWR", "O_NONBLOCK", "name", "value", "KILLED_BY_SIGPIPE", "attr", "call", "json", "name", "start", "wait", "streams", "O_RDONLY", "O_DIRECTORY", "O_ACCMODE", "module", "own", "timeoutMs", "port", "running", "encoder", "failed", "exports", "resolve", "status", "value", "O_WRONLY", "O_RDWR", "name", "within", "resolve", "call", "own", "opened", "fn", "errno", "code", "follow", "pump", "failed", "message", "code", "NEVER", "resolve", "settled", "readable", "writable", "read", "write", "timeoutMs", "own", "answer", "name", "self", "data", "readable", "resolved", "follow", "random", "index", "tracked", "failed", "status", "encoder", "settled", "resolve", "field", "value", "fn", "module", "held", "code", "writable", "typeOf", "call", "drain", "found", "port", "resolve", "post", "start", "scope", "resolve", "value", "module", "port", "rest", "failed", "status", "drain", "module", "section", "value", "module", "section", "found", "call", "name", "listed", "value", "code", "exports", "name", "data", "fn", "name", "value", "fn", "exports", "name", "value", "data", "own", "SIZE", "value", "types", "fn", "code", "SIZE", "module", "field", "value", "name", "index", "code", "read", "fn", "start", "pages", "PAGE", "call", "name", "fn", "TABLE_BASE", "module", "resolve", "found", "value", "index", "record", "cached", "resolved", "seen", "exports", "index", "slice", "ICANON", "ECHO", "module", "code", "name", "lookup", "failed", "message", "decoder", "value", "index", "module", "name", "found", "read", "fn", "name", "value", "module", "field", "scope", "RESERVED", "refused", "sliccTty", "copy", "imported", "pages", "sizeOf", "port", "call", "start", "own", "exports", "read", "TABLE_BASE", "rest", "heldOf", "held", "code", "data", "message", "programNames", "record", "index", "wrap", "import_node_module", "import_node_module", "import_node_util", "value", "name", "next", "fn", "self", "internal", "own", "value", "next", "resolved", "scope", "slot", "value", "blank", "freeze", "here", "field", "failed", "name", "found", "apply", "fn", "NOT_RUNNABLE", "started", "port", "seal", "failed", "code", "refused", "data", "refusal", "port", "post", "message"]
|
|
7
|
+
}
|