@ai-ecoverse/slicc-kernel 1.8.10 → 1.8.12
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/dist/kernel-worker.js +7 -0
- package/dist/kernel-worker.js.map +2 -2
- package/dist/node-process-worker.js +83 -13
- package/dist/node-process-worker.js.map +3 -3
- package/dist/node.js +7 -0
- package/dist/node.js.map +2 -2
- package/dist/process-worker.js +83 -13
- package/dist/process-worker.js.map +3 -3
- package/package.json +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/fs/meta.ts", "../src/pin.ts", "../src/fs/types.ts", "../src/fs/opfs.ts", "../src/kernel/pipe.ts", "../src/kernel/fd-table.ts", "../src/kernel/net/http1.ts", "../src/kernel/net/proxy-service.ts", "../src/kernel/net/x509.ts", "../src/kernel/net/realm-ca.ts", "../src/kernel/net/tls-engine.ts", "../src/kernel/net/tls-tunnel.ts", "../src/kernel/net/network.ts", "../src/kernel/net/remote-transport.ts", "../src/kernel/signals.ts", "../src/commands.ts", "../src/fs/commands.ts", "../src/kernel/children.ts", "../src/realm/sync-fs-token-registry.ts", "../src/realm/sync-fs-wire.ts", "../src/realm/sync-fs-dispatch.ts", "../src/realm/sync-sab-wire.ts", "../src/realm/sync-sab-responder.ts", "../src/kernel/host-ops.ts", "../src/kernel/net/http-syscalls.ts", "../src/kernel/tty.ts", "../src/kernel/pty.ts", "../src/kernel/select.ts", "../src/kernel/socket.ts", "../src/kernel/socket-syscalls.ts", "../src/kernel/vfs-file.ts", "../src/kernel/process.ts", "../src/kernel/protocol.ts", "../src/kernel/host.ts", "../src/kernel/jobs.ts", "../src/process/wasi/wasi-module.ts", "../src/launcher.ts", "../src/serve.ts", "../src/kernel-worker.ts"],
|
|
4
|
-
"sourcesContent": ["export interface MetaEntry {\n path: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n mtimeFor?: number;\n ctimeMs?: number;\n ino?: number;\n link?: string;\n dir?: string;\n}\n\nexport type MetaChange = (entry: MetaEntry | undefined) => MetaEntry | undefined;\n\nexport interface MetaStore {\n get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>>;\n update(path: string, change: MetaChange): Promise<void>;\n move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry): Promise<void>;\n remove(paths: readonly string[]): Promise<void>;\n links(dir: string): Promise<MetaEntry[]>;\n under(path: string): Promise<MetaEntry[]>;\n all(): Promise<MetaEntry[]>;\n}\n\nexport const META_DB = 'slicc-kernel';\nexport const META_VERSION = 1;\nexport const META_STORE = 'entries';\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction moved(entry: MetaEntry, path: string): MetaEntry {\n return entry.link === undefined ? { ...entry, path } : { ...entry, path, dir: parentOf(path) };\n}\n\nfunction under(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport class MemoryMeta implements MetaStore {\n private readonly entries = new Map<string, MetaEntry>();\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n return paths.map((path) => this.entries.get(path));\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n this.set(path, change(this.entries.get(path)));\n }\n\n private set(path: string, entry: MetaEntry | undefined): void {\n if (entry) this.entries.set(path, entry);\n else this.entries.delete(path);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n await this.remove([to]);\n const carried = [...this.entries.values()].filter((entry) => under(entry.path, from));\n for (const entry of carried) this.entries.delete(entry.path);\n for (const entry of carried) {\n const path = to + entry.path.slice(from.length);\n if (path !== to) this.entries.set(path, moved(entry, path));\n }\n this.entries.set(to, moved(root(carried.find((entry) => entry.path === from)), to));\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n for (const key of [...this.entries.keys()]) {\n if (paths.some((path) => under(key, path))) this.entries.delete(key);\n }\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n return [...this.entries.values()].filter((entry) => entry.dir === dir);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n return [...this.entries.values()].filter((entry) => under(entry.path, path));\n }\n\n async all(): Promise<MetaEntry[]> {\n return [...this.entries.values()];\n }\n}\n\nfunction descendants(path: string): IDBKeyRange {\n return IDBKeyRange.bound(`${path}/`, `${path}0`, false, true);\n}\n\nfunction settle<T>(transaction: IDBTransaction, value: () => T): Promise<T> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve(value());\n transaction.onabort = () =>\n reject(transaction.error ?? new Error('metadata transaction aborted'));\n });\n}\n\ninterface Invalidation {\n paths?: readonly string[];\n trees?: readonly string[];\n}\n\nexport class IndexedDbMeta implements MetaStore {\n private readonly db: IDBDatabase;\n private readonly cache = new Map<string, MetaEntry | null>();\n private readonly channel: BroadcastChannel;\n private generation = 0;\n\n constructor(db: IDBDatabase) {\n this.db = db;\n db.onversionchange = () => db.close();\n this.channel = new BroadcastChannel(`slicc-kernel-meta:${db.name}`);\n this.channel.onmessage = ({ data }) => this.drop(data as Invalidation);\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n\n private drop({ paths = [], trees = [] }: Invalidation): void {\n this.generation++;\n for (const path of paths) this.cache.delete(path);\n for (const key of [...this.cache.keys()]) {\n if (trees.some((tree) => under(key, tree))) this.cache.delete(key);\n }\n }\n\n private changed(invalidation: Invalidation): void {\n this.drop(invalidation);\n this.channel.postMessage(invalidation);\n }\n\n private transaction(mode: IDBTransactionMode): [IDBTransaction, IDBObjectStore] {\n const transaction = this.db.transaction(META_STORE, mode);\n return [transaction, transaction.objectStore(META_STORE)];\n }\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n const missing = paths.filter((path) => !this.cache.has(path));\n if (missing.length > 0) {\n const generation = this.generation;\n const [transaction, store] = this.transaction('readonly');\n const found = new Map<string, MetaEntry | null>();\n for (const path of missing) {\n const request = store.get(path);\n request.onsuccess = () => void found.set(path, request.result ?? null);\n }\n await settle(transaction, () => undefined);\n if (generation === this.generation)\n for (const [path, entry] of found) this.cache.set(path, entry);\n return paths.map(\n (path) => (found.has(path) ? found.get(path) : this.cache.get(path)) ?? undefined\n );\n }\n return paths.map((path) => this.cache.get(path) ?? undefined);\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n const request = store.get(path);\n let next: MetaEntry | undefined;\n request.onsuccess = () => {\n next = change(request.result);\n if (next) store.put(next);\n else store.delete(path);\n };\n await settle(transaction, () => undefined);\n this.changed({ paths: [path] });\n this.cache.set(path, next ?? null);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n const [transaction, store] = this.transaction('readwrite');\n store.delete(to);\n store.delete(descendants(to));\n const source = store.get(from);\n const below = store.getAll(descendants(from));\n below.onsuccess = () => {\n store.delete(from);\n store.delete(descendants(from));\n for (const entry of below.result as MetaEntry[]) {\n store.put(moved(entry, to + entry.path.slice(from.length)));\n }\n store.put(moved(root(source.result), to));\n };\n await settle(transaction, () => undefined);\n this.changed({ trees: [from, to] });\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n for (const path of paths) {\n store.delete(path);\n store.delete(descendants(path));\n }\n await settle(transaction, () => undefined);\n this.changed({ trees: paths });\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const request = store.index('dir').getAll(dir);\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const self = store.get(path);\n const below = store.getAll(descendants(path));\n return settle(transaction, () =>\n [self.result as MetaEntry | undefined, ...(below.result as MetaEntry[])].filter(\n (entry): entry is MetaEntry => entry !== undefined\n )\n );\n }\n\n async all(): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const request = store.getAll();\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n}\n\nexport function openMeta(name: string, factory: IDBFactory): Promise<IndexedDbMeta> {\n return new Promise((resolve, reject) => {\n const request = factory.open(name, META_VERSION);\n request.onupgradeneeded = (event) => {\n if (event.oldVersion < 1) {\n request.result.createObjectStore(META_STORE, { keyPath: 'path' }).createIndex('dir', 'dir');\n }\n };\n request.onsuccess = () => resolve(new IndexedDbMeta(request.result));\n request.onerror = () => reject(request.error);\n });\n}\n", "export function pinScript(url: URL): string {\n try {\n const request = new XMLHttpRequest();\n request.open('GET', url.href, false);\n request.send();\n if (request.status !== 200) return url.href;\n const source = `${request.responseText}\\n//# sourceURL=${url.href}\\n`;\n return URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));\n } catch {\n return url.href;\n }\n}\n", "export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtime: Date;\n atime: Date;\n ctime: Date;\n ino: number;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n readdirStat(path: string): Promise<Array<[string, FsStat | null]>>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n chmod(path: string, mode: number): Promise<void>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n}\n\nexport function fsError(code: string, path: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${path}`), { code });\n}\n\nexport function normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return `/${parts.join('/')}`;\n}\n\nexport function resolvePath(base: string, path: string): string {\n return normalizePath(path.startsWith('/') ? path : `${base}/${path}`);\n}\n\nexport function inodeOf(path: string): number {\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < path.length; i++) {\n const c = path.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 2654435761);\n h2 = Math.imul(h2 ^ c, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0) || 1;\n}\n", "import { MemoryMeta, type MetaEntry, type MetaStore } from './meta.ts';\nimport { type FsStat, fsError, inodeOf, type KernelFs, resolvePath } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\nconst PERM_MASK = 0o7777;\nconst READ_ATTEMPTS = 3;\nconst MAX_LINKS = 40;\nconst CHECK_MS = 1000;\nconst EXECUTABLE = /\\/node_modules\\/(?:@[^/]+\\/)?[^/]+\\/bin\\//;\n\ntype Handle = FileSystemFileHandle | FileSystemDirectoryHandle;\n\ninterface MovableHandle {\n move?(parent: FileSystemDirectoryHandle, name: string): Promise<void>;\n}\n\ninterface Located {\n path: string;\n handle?: Handle;\n link?: MetaEntry;\n}\n\nconst ERRNO_BY_DOM_ERROR: Readonly<Record<string, string>> = {\n NotFoundError: 'ENOENT',\n TypeMismatchError: 'ENOTDIR',\n InvalidModificationError: 'ENOTEMPTY',\n NoModificationAllowedError: 'EBUSY',\n TypeError: 'EINVAL',\n};\n\nfunction translate(err: unknown, path: string): Error {\n if (typeof (err as { code?: unknown })?.code === 'string') return err as Error;\n const name = (err as { name?: unknown })?.name;\n return fsError((typeof name === 'string' && ERRNO_BY_DOM_ERROR[name]) || 'EIO', path);\n}\n\nfunction missing(err: unknown): boolean {\n const code = (err as { code?: unknown })?.code;\n return code === 'ENOENT' || code === 'ENOTDIR';\n}\n\nfunction split(path: string): string[] {\n return path.split('/').filter(Boolean);\n}\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction baseOf(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction prefixes(path: string): string[] {\n const parts = split(path);\n return parts.map((_, i) => `/${parts.slice(0, i + 1).join('/')}`);\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nfunction isHandle(child: Handle | MetaEntry): child is Handle {\n return 'kind' in child;\n}\n\nexport class OpfsFs implements KernelFs {\n private readonly root: FileSystemDirectoryHandle;\n private readonly meta: MetaStore;\n private readonly dirs = new Map<string, FileSystemDirectoryHandle>();\n private readonly checked = new WeakMap<FileSystemDirectoryHandle, number>();\n\n private readonly channel: BroadcastChannel | undefined;\n\n constructor(\n root: FileSystemDirectoryHandle,\n meta: MetaStore = new MemoryMeta(),\n channel?: string\n ) {\n this.root = root;\n this.meta = meta;\n this.channel = channel === undefined ? undefined : new BroadcastChannel(channel);\n if (this.channel) {\n this.channel.onmessage = ({ data }) => {\n for (const path of data as string[]) this.forget(path);\n };\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n }\n\n private changed(...paths: string[]): void {\n for (const path of paths) this.forget(path);\n this.channel?.postMessage(paths);\n }\n\n resolvePath(base: string, path: string): string {\n return resolvePath(base, path);\n }\n\n private async walk(parts: string[], from: number, start: FileSystemDirectoryHandle) {\n let dir = start;\n for (let at = from; at < parts.length; at++) {\n dir = await dir.getDirectoryHandle(parts[at] as string);\n this.dirs.set(`/${parts.slice(0, at + 1).join('/')}`, dir);\n this.checked.set(dir, performance.now());\n }\n return dir;\n }\n\n private async dir(path: string): Promise<FileSystemDirectoryHandle> {\n const parts = split(path);\n let from = parts.length;\n let cached: FileSystemDirectoryHandle | undefined;\n for (; from > 0 && !cached; from--)\n cached = this.dirs.get(`/${parts.slice(0, from).join('/')}`);\n if (cached) from++;\n const at = `/${parts.slice(0, from).join('/')}`;\n if (cached && !(await this.current(at, cached))) {\n this.forget(at);\n cached = undefined;\n from = 0;\n }\n try {\n return await this.walk(parts, from, cached ?? this.root);\n } catch (err) {\n throw translate(err, path);\n }\n }\n\n private async current(path: string, dir: FileSystemDirectoryHandle): Promise<boolean> {\n if (performance.now() - (this.checked.get(dir) ?? -CHECK_MS) < CHECK_MS) return true;\n const where = await this.root.resolve(dir).catch(() => null);\n if (where === null || `/${where.join('/')}` !== path) return false;\n this.checked.set(dir, performance.now());\n return true;\n }\n\n private forget(path: string): void {\n for (const key of [...this.dirs.keys()]) if (within(key, path)) this.dirs.delete(key);\n }\n\n private async inDir<T>(path: string, op: (dir: FileSystemDirectoryHandle) => Promise<T>) {\n const dir = await this.dir(path);\n try {\n return await op(dir);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'NotFoundError' || (await this.current(path, dir)))\n throw err;\n this.forget(path);\n return op(await this.dir(path));\n }\n }\n\n private async child(\n parent: FileSystemDirectoryHandle,\n name: string,\n kind: 'file' | 'directory'\n ): Promise<Handle> {\n return kind === 'file' ? parent.getFileHandle(name) : parent.getDirectoryHandle(name);\n }\n\n private async parent(path: string): Promise<[string, string]> {\n const parts = split(path);\n const name = parts.pop();\n if (name === undefined) throw fsError('EBUSY', path);\n return [`/${parts.join('/')}`, name];\n }\n\n private async handle(path: string): Promise<Handle> {\n if (split(path).length === 0) return this.root;\n const [dir, name] = await this.parent(path);\n const known = this.dirs.has(path);\n return this.inDir(dir, async (parent): Promise<Handle> => {\n const [first, second] = known\n ? (['directory', 'file'] as const)\n : (['file', 'directory'] as const);\n try {\n return await this.child(parent, name, first);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'TypeMismatchError') throw err;\n }\n return this.child(parent, name, second);\n }).catch((err) => {\n throw translate(err, path);\n });\n }\n\n private real(path: string): Promise<boolean> {\n return this.handle(path).then(\n () => true,\n () => false\n );\n }\n\n private async linkAlong(path: string): Promise<MetaEntry | undefined> {\n for (const entry of await this.meta.get(prefixes(path))) {\n if (entry?.link === undefined) continue;\n if (!(await this.real(entry.path)) && (await this.real(parentOf(entry.path)))) return entry;\n }\n return undefined;\n }\n\n private async locate(path: string, follow: boolean): Promise<Located> {\n let current = path;\n for (let hops = 0; hops <= MAX_LINKS; hops++) {\n try {\n return { path: current, handle: await this.handle(current) };\n } catch (err) {\n if (!missing(err)) throw err;\n const link = await this.linkAlong(current);\n if (!link) throw err;\n if (link.path === current && !follow) return { path: current, link };\n const rest = current.slice(link.path.length);\n current = resolvePath(parentOf(link.path), `${link.link}${rest}`);\n }\n }\n throw fsError('ELOOP', path);\n }\n\n private mode(path: string, directory: boolean, meta: MetaEntry | undefined): number {\n const fallback = directory || EXECUTABLE.test(path) ? 0o755 : 0o644;\n return (directory ? S_IFDIR : S_IFREG) | (meta?.mode ?? fallback);\n }\n\n private async statOf(path: string, handle: Handle, meta: MetaEntry | undefined): Promise<FsStat> {\n const directory = handle.kind === 'directory';\n const file = directory ? undefined : await (handle as FileSystemFileHandle).getFile();\n const modified = file?.lastModified ?? 0;\n const mtime =\n meta?.mtimeMs !== undefined && meta.mtimeFor === modified ? meta.mtimeMs : modified;\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: file?.size ?? 0,\n mode: this.mode(path, directory, meta),\n mtime: new Date(mtime),\n atime: new Date(meta?.atimeMs ?? mtime),\n ctime: new Date(Math.max(meta?.ctimeMs ?? mtime, modified)),\n ino: meta?.ino ?? inodeOf(path),\n };\n }\n\n private linkStat(entry: MetaEntry): FsStat {\n const time = new Date(entry.mtimeMs ?? 0);\n return {\n isFile: false,\n isDirectory: false,\n isSymbolicLink: true,\n size: new TextEncoder().encode(entry.link).length,\n mode: S_IFLNK | 0o777,\n mtime: time,\n atime: time,\n ctime: new Date(entry.ctimeMs ?? 0),\n ino: entry.ino ?? inodeOf(entry.path),\n };\n }\n\n private async describe(found: Located): Promise<FsStat> {\n if (found.link) return this.linkStat(found.link);\n const [meta] = await this.meta.get([found.path]);\n return this.statOf(found.path, found.handle as Handle, meta);\n }\n\n async stat(path: string): Promise<FsStat> {\n return this.describe(await this.locate(path, true));\n }\n\n async lstat(path: string): Promise<FsStat> {\n return this.describe(await this.locate(path, false));\n }\n\n async exists(path: string): Promise<boolean> {\n return this.locate(path, true).then(\n () => true,\n () => false\n );\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const handle = (await this.locate(path, true)).handle as Handle;\n if (handle.kind === 'directory') throw fsError('EISDIR', path);\n for (let attempt = 1; ; attempt++) {\n try {\n return new Uint8Array(await (await handle.getFile()).arrayBuffer());\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'NotReadableError' || attempt >= READ_ATTEMPTS) {\n throw translate(err, path);\n }\n await new Promise((resolve) => setTimeout(resolve, attempt * 10));\n }\n }\n }\n\n async readFile(path: string): Promise<string> {\n return new TextDecoder().decode(await this.readFileBuffer(path));\n }\n\n private async writeTarget(path: string): Promise<[string, boolean]> {\n try {\n return [(await this.locate(path, true)).path, true];\n } catch (err) {\n if (!missing(err)) throw err;\n }\n const [entry] = await this.meta.get([path]);\n const wanted = entry?.link === undefined ? path : resolvePath(parentOf(path), entry.link);\n return [resolvePath((await this.locate(parentOf(wanted), true)).path, baseOf(wanted)), false];\n }\n\n async writeFile(path: string, content: Uint8Array | string): Promise<void> {\n const [target, existed] = await this.writeTarget(path);\n const [dir, name] = await this.parent(target);\n let file: FileSystemFileHandle;\n try {\n file = await this.inDir(dir, (parent) => parent.getFileHandle(name, { create: true }));\n } catch (err) {\n const code = (err as { name?: unknown })?.name === 'TypeMismatchError' ? 'EISDIR' : null;\n throw code ? fsError(code, path) : translate(err, path);\n }\n if (!existed && content.length === 0) return;\n const writable = await file.createWritable();\n await writable.write(content as FileSystemWriteChunkType);\n await writable.close();\n }\n\n private async listing(path: string): Promise<[string, Array<[string, Handle | MetaEntry]>]> {\n const found = await this.locate(path, true);\n const handle = found.handle as Handle;\n if (handle.kind !== 'directory') throw fsError('ENOTDIR', path);\n const children = new Map<string, Handle | MetaEntry>();\n for await (const child of handle.values()) children.set(child.name, child);\n for (const link of await this.meta.links(found.path)) {\n const name = baseOf(link.path);\n if (!children.has(name)) children.set(name, link);\n }\n return [found.path, [...children].sort(([a], [b]) => (a < b ? -1 : 1))];\n }\n\n async readdir(path: string): Promise<string[]> {\n return (await this.listing(path))[1].map(([name]) => name);\n }\n\n async readdirStat(path: string): Promise<Array<[string, FsStat | null]>> {\n const [dir, children] = await this.listing(path);\n const base = dir === '/' ? '' : dir;\n const metas = await this.meta.get(children.map(([name]) => `${base}/${name}`));\n return Promise.all(\n children.map(async ([name, child], i): Promise<[string, FsStat | null]> => {\n if (!isHandle(child)) return [name, this.linkStat(child)];\n const stat = await this.statOf(`${base}/${name}`, child, metas[i]).catch(() => null);\n return [name, stat];\n })\n );\n }\n\n async mkdir(path: string, options: { recursive?: boolean } = {}): Promise<void> {\n let found: Located | undefined;\n try {\n found = await this.locate(path, true);\n } catch (err) {\n if (!missing(err)) throw err;\n }\n if (found) {\n const directory = found.handle?.kind === 'directory';\n if (options.recursive && directory) return;\n throw fsError(options.recursive ? 'ENOTDIR' : 'EEXIST', path);\n }\n const [entry] = await this.meta.get([path]);\n if (entry?.link !== undefined) throw fsError('EEXIST', path);\n if (options.recursive) await this.mkdir(parentOf(path), options);\n const parent = await this.locate(parentOf(path), true);\n if (parent.handle?.kind !== 'directory') throw fsError('ENOTDIR', path);\n await parent.handle.getDirectoryHandle(baseOf(path), { create: true });\n }\n\n async rm(path: string, options: { recursive?: boolean; force?: boolean } = {}): Promise<void> {\n let found: Located;\n try {\n found = await this.locate(path, false);\n } catch (err) {\n const error = translate(err, path) as Error & { code: string };\n if (options.force && error.code === 'ENOENT') return;\n throw error;\n }\n if (found.handle) {\n const [dir, name] = await this.parent(found.path);\n try {\n await this.inDir(dir, (parent) =>\n parent.removeEntry(name, { recursive: options.recursive === true })\n );\n } catch (err) {\n throw translate(err, path);\n }\n this.changed(found.path);\n }\n await this.meta.remove([found.path]);\n }\n\n async rename(from: string, to: string): Promise<void> {\n if (from === to) return;\n const source = await this.locate(from, false);\n this.forget(source.path);\n const parent = await this.locate(parentOf(to), true);\n const destination = resolvePath(parent.path, baseOf(to));\n const sourceStat = await this.describe(source);\n if (sourceStat.isDirectory && within(destination, source.path)) throw fsError('EINVAL', to);\n const target = await this.locate(destination, false).catch((err) => {\n if (missing(err)) return null;\n throw err;\n });\n const targetStat = target && (await this.describe(target));\n if (targetStat?.isDirectory && !sourceStat.isDirectory) throw fsError('EISDIR', to);\n if (targetStat && !targetStat.isDirectory && sourceStat.isDirectory) {\n throw fsError('ENOTDIR', to);\n }\n if (targetStat?.isDirectory && (await this.readdir(destination)).length > 0) {\n throw fsError('ENOTEMPTY', to);\n }\n const now = Date.now();\n const carry = (entry: MetaEntry | undefined): MetaEntry => ({\n ino: inodeOf(source.path),\n ...entry,\n path: destination,\n ctimeMs: now,\n });\n if (source.link) {\n if (target?.handle) await this.rm(destination);\n await this.meta.move(source.path, destination, carry);\n return;\n }\n const dir = parent.handle as FileSystemDirectoryHandle;\n const name = baseOf(destination);\n const swap = targetStat?.isDirectory === true;\n const staging = swap ? `.${name}.${crypto.randomUUID()}` : name;\n this.forget(destination);\n const timed = await this.explicitTimes(source.path);\n const moved = await this.place(source.handle as Handle, dir, staging);\n if (swap) await this.rm(destination, { recursive: true });\n await this.meta.move(source.path, destination, carry);\n if (!moved) await this.rm(source.path, { recursive: true });\n let copied = !moved;\n if (swap) {\n const staged = await dir.getDirectoryHandle(staging);\n const placed = await this.place(staged, dir, name);\n if (!placed) await dir.removeEntry(staging, { recursive: true });\n copied ||= !placed;\n }\n if (copied) await this.restamp(destination, timed);\n this.changed(source.path, destination);\n }\n\n private async modified(path: string): Promise<number> {\n const handle = await this.handle(path);\n return handle.kind === 'file' ? (await handle.getFile()).lastModified : 0;\n }\n\n private async explicitTimes(path: string): Promise<string[]> {\n const timed: string[] = [];\n for (const entry of await this.meta.under(path)) {\n if (entry.mtimeFor === undefined || entry.link !== undefined) continue;\n const current = await this.modified(entry.path).catch(() => undefined);\n if (current === entry.mtimeFor) timed.push(entry.path.slice(path.length));\n }\n return timed;\n }\n\n private async restamp(path: string, timed: string[]): Promise<void> {\n for (const rest of timed) {\n const mtimeFor = await this.modified(path + rest);\n await this.meta.update(path + rest, (entry) => entry && { ...entry, mtimeFor });\n }\n }\n\n private async place(handle: Handle, dir: FileSystemDirectoryHandle, name: string) {\n const moved = await (handle as Handle & MovableHandle).move?.(dir, name).then(\n () => true,\n () => false\n );\n if (moved) return true;\n try {\n await this.copy(handle, dir, name);\n } catch (err) {\n if (handle.kind === 'directory') await dir.removeEntry(name, { recursive: true });\n throw translate(err, name);\n }\n return false;\n }\n\n private async copy(handle: Handle, dir: FileSystemDirectoryHandle, name: string): Promise<void> {\n if (handle.kind === 'file') {\n const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();\n await writable.write(await handle.getFile());\n await writable.close();\n return;\n }\n const target = await dir.getDirectoryHandle(name, { create: true });\n for await (const child of handle.values()) await this.copy(child, target, child.name);\n }\n\n async symlink(target: string, path: string): Promise<void> {\n const parent = await this.locate(parentOf(path), true);\n if (parent.handle?.kind !== 'directory') throw fsError('ENOTDIR', path);\n const at = resolvePath(parent.path, baseOf(path));\n if (\n await this.locate(at, false).then(\n () => true,\n (err) => !missing(err)\n )\n ) {\n throw fsError('EEXIST', path);\n }\n const now = Date.now();\n await this.meta.update(at, () => ({\n path: at,\n link: target,\n dir: parent.path,\n ino: inodeOf(at),\n mtimeMs: now,\n ctimeMs: now,\n }));\n }\n\n async readlink(path: string): Promise<string> {\n const found = await this.locate(path, false);\n if (found.link) return found.link.link as string;\n throw fsError('EINVAL', path);\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n const found = await this.locate(path, true);\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...entry,\n path: found.path,\n mode: mode & PERM_MASK,\n ctimeMs,\n }));\n }\n\n async utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n const found = await this.locate(path, true);\n const handle = found.handle as Handle;\n const file = handle.kind === 'file' ? await handle.getFile() : undefined;\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...entry,\n path: found.path,\n atimeMs: atime.getTime(),\n mtimeMs: mtime.getTime(),\n mtimeFor: file?.lastModified ?? 0,\n ctimeMs,\n }));\n }\n\n async reconcile(): Promise<number> {\n let removed = 0;\n for (const entry of await this.meta.all()) {\n const real = await this.real(entry.path);\n const stale =\n entry.link === undefined ? !real : real || !(await this.real(parentOf(entry.path)));\n if (!stale) continue;\n await this.meta.update(entry.path, () => undefined);\n removed++;\n }\n return removed;\n }\n}\n", "export const PIPE_CAPACITY = 64 * 1024;\n\nexport class PipeError extends Error {\n readonly code: 'EPIPE' | 'EINTR';\n\n constructor(code: 'EPIPE' | 'EINTR') {\n super(code);\n this.code = code;\n }\n}\n\nexport class KernelPipe {\n private chunks: Uint8Array[] = [];\n private size = 0;\n private readers = 0;\n private writers = 0;\n private waiters: Array<() => void> = [];\n\n readonly capacity: number;\n\n constructor(capacity: number = PIPE_CAPACITY) {\n this.capacity = capacity;\n }\n\n get buffered(): number {\n return this.size;\n }\n\n get readReady(): boolean {\n return this.size > 0 || this.writers === 0;\n }\n\n get writeReady(): boolean {\n return this.size < this.capacity || this.readers === 0;\n }\n\n get writersGone(): boolean {\n return this.writers === 0;\n }\n\n get readersGone(): boolean {\n return this.readers === 0;\n }\n\n openRead(): void {\n this.readers += 1;\n }\n\n openWrite(): void {\n this.writers += 1;\n }\n\n closeRead(): void {\n if (this.readers > 0) this.readers -= 1;\n if (this.readers === 0) {\n this.chunks = [];\n this.size = 0;\n }\n this.wake();\n }\n\n closeWrite(): void {\n if (this.writers > 0) this.writers -= 1;\n this.wake();\n }\n\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = this.take(Math.min(max, this.size));\n this.wake();\n return out;\n }\n\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = new Uint8Array(Math.min(max, this.size));\n let filled = 0;\n for (const chunk of this.chunks) {\n if (filled === out.length) break;\n const count = Math.min(chunk.length, out.length - filled);\n out.set(chunk.subarray(0, count), filled);\n filled += count;\n }\n return out;\n }\n\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n let offset = 0;\n while (offset < bytes.length) {\n if (this.readers === 0) throw new PipeError('EPIPE');\n const room = this.capacity - this.size;\n if (room === 0) {\n try {\n await this.changed(signal);\n } catch (e) {\n if (offset > 0) return offset;\n throw e;\n }\n continue;\n }\n const n = Math.min(room, bytes.length - offset);\n this.chunks.push(bytes.slice(offset, offset + n));\n this.size += n;\n offset += n;\n this.wake();\n }\n return bytes.length;\n }\n\n private take(n: number): Uint8Array {\n const out = new Uint8Array(n);\n let filled = 0;\n while (filled < n) {\n const head = this.chunks[0];\n const count = Math.min(head.length, n - filled);\n out.set(head.subarray(0, count), filled);\n filled += count;\n if (count === head.length) this.chunks.shift();\n else this.chunks[0] = head.subarray(count);\n }\n this.size -= n;\n return out;\n }\n\n changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new PipeError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new PipeError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import { KernelPipe, type PipeError } from './pipe.ts';\nimport type { PtyPair } from './pty.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport type KernelErrno =\n | 'EBADF'\n | 'EPIPE'\n | 'EMFILE'\n | 'EINVAL'\n | 'ENOENT'\n | 'ENOEXEC'\n | 'ECHILD'\n | 'ENOSYS'\n | 'ESPIPE'\n | 'EINTR'\n | 'ESRCH'\n | 'ENOTTY'\n | 'ENXIO'\n | 'EPERM'\n | 'EIO'\n | 'EACCES'\n | 'EAGAIN'\n | 'ENOTSOCK'\n | 'EAFNOSUPPORT'\n | 'EPROTONOSUPPORT'\n | 'EOPNOTSUPP'\n | 'EADDRINUSE'\n | 'EADDRNOTAVAIL'\n | 'ENETUNREACH'\n | 'ECONNREFUSED'\n | 'EINPROGRESS'\n | 'EISCONN'\n | 'ENOTCONN';\n\nexport class KernelError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport interface PollState {\n readable: boolean;\n\n writable: boolean;\n\n hangup: boolean;\n}\n\nexport interface KernelFile {\n read?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n peek?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n write?(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;\n\n close(): void | Promise<void>;\n\n poll?(): PollState;\n\n changed?(signal?: AbortSignal): Promise<void>;\n\n seek?(offset: number, whence: number): Promise<number>;\n\n flush?(): Promise<void>;\n\n pread?(max: number, at: number): Promise<Uint8Array>;\n pwrite?(bytes: Uint8Array, at: number): Promise<number>;\n\n resize?(size: number): Promise<void>;\n\n stat?(): Promise<{ path: string; size: number; orphan?: true }>;\n\n tty?: KernelTty;\n\n pty?: PtyPair;\n\n stat?(): Promise<{ size: number; path: string; orphan?: true }>;\n held?: true;\n\n heldMeta?: HeldMeta;\n}\n\nexport type HeldMeta = { dir: string; preopen?: string } | DeviceMeta;\n\nexport interface DeviceMeta {\n device: KernelDevice;\n access?: DeviceAccess;\n}\n\nexport type DeviceAccess = 'read' | 'write';\n\nexport type KernelDevice = 'null' | 'zero' | 'urandom';\n\nexport function pollFile(file: KernelFile): PollState {\n return file.poll?.() ?? { readable: !!file.read, writable: !!file.write, hangup: false };\n}\n\nexport class OpenFile {\n private refs = 1;\n\n readonly file: KernelFile;\n\n constructor(file: KernelFile) {\n this.file = file;\n }\n\n retain(): this {\n this.refs += 1;\n return this;\n }\n\n release(): void | Promise<void> {\n this.refs -= 1;\n if (this.refs === 0) return this.file.close();\n }\n}\n\nexport function openPipe(capacity?: number): { read: OpenFile; write: OpenFile } {\n const pipe = new KernelPipe(capacity);\n pipe.openRead();\n pipe.openWrite();\n return {\n read: new OpenFile({\n read: async (max, signal) => {\n try {\n return await pipe.read(max, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeRead(),\n poll: () => ({ readable: pipe.readReady, writable: false, hangup: pipe.writersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n write: new OpenFile({\n write: async (bytes, signal) => {\n try {\n return await pipe.write(bytes, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeWrite(),\n poll: () => ({ readable: false, writable: pipe.writeReady, hangup: pipe.readersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n };\n}\n\nexport function bytesSource(data: Uint8Array): OpenFile {\n let offset = 0;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n close: () => {},\n });\n}\n\nexport function 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\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) => bytes.length } : {}),\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 = 'tty' | 'stream' | 'file' | 'socket' | 'held' | 'device';\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 return file.seek ? 'file' : 'stream';\n}\n\nexport class FdTable {\n static readonly MAX_FDS = 1024;\n private fds = new Map<number, OpenFile>();\n private readonly cloexec = new Set<number>();\n\n private readonly status = new Map<number, number>();\n\n get(fd: number): OpenFile {\n const file = this.fds.get(fd);\n if (!file) throw new KernelError('EBADF');\n return file;\n }\n\n stdioTerminal(): KernelTty | undefined {\n for (const fd of [0, 1, 2]) {\n const tty = this.fds.get(fd)?.file.tty;\n if (tty) return tty;\n }\n return undefined;\n }\n\n numbers(): number[] {\n return [...this.fds.keys()].sort((a, b) => a - b);\n }\n\n has(fd: number): boolean {\n return this.fds.has(fd);\n }\n\n setCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.add(fd);\n }\n\n clearCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.delete(fd);\n }\n\n closesOnExec(fd: number): boolean {\n return this.cloexec.has(fd);\n }\n\n setStatusFlags(fd: number, flags: number): void {\n this.get(fd);\n this.status.set(fd, flags);\n }\n\n statusFlags(fd: number): number | undefined {\n return this.status.get(fd);\n }\n\n install(file: OpenFile, min = 0): number {\n for (let fd = min; fd < FdTable.MAX_FDS; fd++) {\n if (!this.fds.has(fd)) {\n this.fds.set(fd, file);\n return fd;\n }\n }\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EMFILE');\n }\n\n installAt(fd: number, file: OpenFile): void {\n if (fd < 0 || fd >= FdTable.MAX_FDS) {\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EBADF');\n }\n const previous = this.fds.get(fd);\n this.fds.set(fd, file);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n void Promise.resolve(previous?.release()).catch(() => undefined);\n }\n\n dup(fd: number, min = 0): number {\n return this.install(this.get(fd).retain(), min);\n }\n\n dup2(oldFd: number, newFd: number): number {\n const file = this.get(oldFd);\n if (oldFd !== newFd) this.installAt(newFd, file.retain());\n return newFd;\n }\n\n close(fd: number): void | Promise<void> {\n const file = this.get(fd);\n this.fds.delete(fd);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n return file.release();\n }\n\n fork(): FdTable {\n const child = new FdTable();\n for (const [fd, file] of this.fds) child.fds.set(fd, file.retain());\n for (const fd of this.cloexec) child.cloexec.add(fd);\n for (const [fd, flags] of this.status) child.status.set(fd, flags);\n return child;\n }\n\n async closeAll(): Promise<void> {\n const files = [...this.fds.values()];\n this.fds.clear();\n this.cloexec.clear();\n this.status.clear();\n await Promise.allSettled(files.map((file) => Promise.resolve().then(() => file.release())));\n }\n}\n", "import type { HeaderList } from './transport.ts';\nexport interface ByteSource {\n read(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n}\nexport class HttpError extends Error {\n readonly status: number;\n constructor(status: number, message: string) {\n super(message);\n this.status = status;\n }\n}\nconst CR = 13;\nconst LF = 10;\nconst READ_SIZE = 64 * 1024;\nconst TOKEN = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\nexport const REASON: Readonly<Record<number, string>> = {\n 100: 'Continue',\n 200: 'OK',\n 400: 'Bad Request',\n 403: 'Forbidden',\n 408: 'Request Timeout',\n 411: 'Length Required',\n 413: 'Content Too Large',\n 417: 'Expectation Failed',\n 421: 'Misdirected Request',\n 431: 'Request Header Fields Too Large',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 505: 'HTTP Version Not Supported',\n};\nexport class Incoming {\n private readonly source: ByteSource;\n private buf = new Uint8Array(0);\n private eof = false;\n constructor(source: ByteSource) {\n this.source = source;\n }\n get buffered(): number {\n return this.buf.length;\n }\n private async fill(signal?: AbortSignal): Promise<boolean> {\n if (this.eof) return false;\n const chunk = await this.source.read(READ_SIZE, signal);\n if (chunk.length === 0) {\n this.eof = true;\n return false;\n }\n const next = new Uint8Array(this.buf.length + chunk.length);\n next.set(this.buf);\n next.set(chunk, this.buf.length);\n this.buf = next;\n return true;\n }\n private take(n: number): Uint8Array {\n const out = this.buf.slice(0, n);\n this.buf = this.buf.subarray(n);\n return out;\n }\n async some(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n if (this.buf.length > 0) return this.take(Math.min(max, this.buf.length));\n if (this.eof) return new Uint8Array(0);\n const chunk = await this.source.read(max, signal);\n if (chunk.length === 0) this.eof = true;\n return chunk;\n }\n async head(limit: number, signal?: AbortSignal): Promise<Uint8Array | null> {\n let from = 0;\n for (;;) {\n const end = headEnd(this.buf, from);\n if (end > 0) {\n if (end > limit) throw new HttpError(431, 'request head too large');\n return this.take(end);\n }\n if (this.buf.length > limit) throw new HttpError(431, 'request head too large');\n from = Math.max(0, this.buf.length - 3);\n if (!(await this.fill(signal))) {\n if (this.buf.length === 0) return null;\n throw new HttpError(400, 'connection closed inside a request head');\n }\n }\n }\n async line(limit: number, signal?: AbortSignal): Promise<string> {\n let from = 0;\n for (;;) {\n const at = this.buf.indexOf(LF, from);\n if (at >= 0) {\n const line = this.take(at + 1);\n const text = latin1(line.subarray(0, line[at - 1] === CR ? at - 1 : at));\n return text;\n }\n if (this.buf.length > limit) throw new HttpError(400, 'line too long');\n from = this.buf.length;\n if (!(await this.fill(signal))) throw new HttpError(400, 'connection closed inside a body');\n }\n }\n async exactly(n: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.buf.length < n) {\n if (!(await this.fill(signal))) throw new HttpError(400, 'connection closed inside a body');\n }\n return this.take(n);\n }\n}\nfunction headEnd(buf: Uint8Array, from: number): number {\n for (let i = from; i < buf.length; i++) {\n if (buf[i] !== LF) continue;\n if (buf[i + 1] === LF) return i + 2;\n if (buf[i + 1] === CR && buf[i + 2] === LF) return i + 3;\n }\n return 0;\n}\nexport function latin1(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n out += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return out;\n}\nexport function latin1Bytes(text: string): Uint8Array {\n const out = new Uint8Array(text.length);\n for (let i = 0; i < text.length; i++) out[i] = text.charCodeAt(i) & 0xff;\n return out;\n}\nexport interface RequestHead {\n method: string;\n target: string;\n minor: number;\n headers: HeaderList;\n}\nexport function parseRequestHead(bytes: Uint8Array): RequestHead {\n const lines = latin1(bytes).split(/\\r?\\n/);\n while (lines.length > 0 && lines[0] === '') lines.shift();\n const match = /^([!#$%&'*+\\-.^_`|~0-9A-Za-z]+) (\\S+) HTTP\\/(\\d)\\.(\\d)$/.exec(lines.shift() ?? '');\n if (!match) throw new HttpError(400, 'malformed request line');\n if (match[3] !== '1') throw new HttpError(505, `HTTP/${match[3]}.${match[4]} is not supported`);\n return {\n method: match[1],\n target: match[2],\n minor: Number(match[4]),\n headers: parseFields(lines),\n };\n}\nfunction parseFields(lines: string[]): HeaderList {\n const headers: Array<readonly [string, string]> = [];\n for (const line of lines) {\n if (line === '') continue;\n if (line.startsWith(' ') || line.startsWith('\\t')) {\n throw new HttpError(400, 'obsolete line folding');\n }\n const colon = line.indexOf(':');\n const name = colon > 0 ? line.slice(0, colon) : '';\n if (!TOKEN.test(name)) throw new HttpError(400, 'malformed header field');\n headers.push([name, line.slice(colon + 1).trim()]);\n }\n return headers;\n}\nexport function fieldValues(headers: HeaderList, name: string): string[] {\n const lower = name.toLowerCase();\n return headers.filter(([n]) => n.toLowerCase() === lower).map(([, v]) => v);\n}\nexport function fieldTokens(headers: HeaderList, name: string): string[] {\n return fieldValues(headers, name)\n .flatMap((v) => v.split(','))\n .map((t) => t.trim().toLowerCase())\n .filter((t) => t !== '');\n}\nexport type BodyFraming =\n | {\n kind: 'none';\n }\n | {\n kind: 'length';\n length: number;\n }\n | {\n kind: 'chunked';\n };\nexport function requestFraming(headers: HeaderList): BodyFraming {\n const codings = fieldTokens(headers, 'transfer-encoding');\n const lengths = fieldValues(headers, 'content-length');\n if (codings.length > 0) {\n if (lengths.length > 0) throw new HttpError(400, 'both Transfer-Encoding and Content-Length');\n if (codings.length !== 1 || codings[0] !== 'chunked') {\n throw new HttpError(501, `unsupported Transfer-Encoding: ${codings.join(', ')}`);\n }\n return { kind: 'chunked' };\n }\n if (lengths.length === 0) return { kind: 'none' };\n const distinct = new Set(lengths.flatMap((v) => v.split(',')).map((v) => v.trim()));\n const [only] = distinct;\n if (distinct.size !== 1 || !/^\\d{1,15}$/.test(only)) {\n throw new HttpError(400, 'invalid Content-Length');\n }\n const length = Number(only);\n return length === 0 ? { kind: 'none' } : { kind: 'length', length };\n}\nconst MAX_CHUNK_LINE = 4096;\nconst MAX_TRAILERS = 64 * 1024;\nexport async function readBody(\n incoming: Incoming,\n framing: BodyFraming,\n cap: number,\n signal?: AbortSignal\n): Promise<Uint8Array | undefined> {\n if (framing.kind === 'none') return undefined;\n if (framing.kind === 'length') {\n if (framing.length > cap) throw new HttpError(413, `request body over ${cap} bytes`);\n return incoming.exactly(framing.length, signal);\n }\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const sizeLine = await incoming.line(MAX_CHUNK_LINE, signal);\n const size = /^([0-9A-Fa-f]{1,12})[ \\t]*(;.*)?$/.exec(sizeLine);\n if (!size) throw new HttpError(400, 'malformed chunk size');\n const n = Number.parseInt(size[1], 16);\n if (n === 0) break;\n total += n;\n if (total > cap) throw new HttpError(413, `request body over ${cap} bytes`);\n chunks.push(await incoming.exactly(n, signal));\n if ((await incoming.line(2, signal)) !== '') throw new HttpError(400, 'malformed chunk');\n }\n let trailers = 0;\n for (let line = await incoming.line(MAX_TRAILERS, signal); line !== ''; ) {\n trailers += line.length;\n if (trailers > MAX_TRAILERS) throw new HttpError(431, 'trailers too large');\n line = await incoming.line(MAX_TRAILERS, signal);\n }\n return concat(chunks, total);\n}\nexport function concat(chunks: Uint8Array[], total = chunks.reduce((n, c) => n + c.length, 0)) {\n const out = new Uint8Array(total);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n}\nfunction safeValue(value: string): boolean {\n return !/[\\r\\n\\0]/.test(value);\n}\nexport function responseHead(status: number, reason: string, headers: HeaderList): Uint8Array {\n const phrase = /^[\\t\\x20-\\x7e\\x80-\\xff]*$/.test(reason) ? reason : '';\n let head = `HTTP/1.1 ${status} ${phrase}\\r\\n`;\n for (const [name, value] of headers) {\n if (TOKEN.test(name) && safeValue(value)) head += `${name}: ${value}\\r\\n`;\n }\n return latin1Bytes(`${head}\\r\\n`);\n}\nexport function chunk(bytes: Uint8Array): Uint8Array {\n const size = latin1Bytes(`${bytes.length.toString(16)}\\r\\n`);\n const out = new Uint8Array(size.length + bytes.length + 2);\n out.set(size);\n out.set(bytes, size.length);\n out[out.length - 2] = CR;\n out[out.length - 1] = LF;\n return out;\n}\nexport const LAST_CHUNK = latin1Bytes('0\\r\\n\\r\\n');\n", "import { KernelError } from '../fd-table.ts';\nimport type { KernelSocket, LoopbackNet } from '../socket.ts';\nimport {\n type ByteSource,\n chunk,\n fieldTokens,\n fieldValues,\n HttpError,\n Incoming,\n LAST_CHUNK,\n latin1Bytes,\n parseRequestHead,\n REASON,\n type RequestHead,\n readBody,\n requestFraming,\n responseHead,\n} from './http1.ts';\nimport type { HeaderList, RealmTransport, RealmTransportResponse } from './transport.ts';\n\nexport const REALM_PROXY_PORT = 3128;\nexport interface ProxyLimits {\n maxConnections: number;\n maxHead: number;\n idleMs: number;\n bodyBudget: number;\n}\nconst DEFAULT_LIMITS: ProxyLimits = {\n maxConnections: 64,\n maxHead: 64 * 1024,\n idleMs: 120000,\n bodyBudget: 128 * 1024 * 1024,\n};\nexport interface TunnelTarget {\n host: string;\n port: number;\n}\nexport interface HttpSink {\n write(bytes: Uint8Array, signal?: AbortSignal): Promise<unknown>;\n}\nexport type ServeHttp = (source: ByteSource, sink: HttpSink, origin: string) => Promise<void>;\nexport type TunnelHandler = (\n conn: KernelSocket,\n incoming: Incoming,\n target: TunnelTarget,\n signal: AbortSignal,\n serveHttp: ServeHttp\n) => Promise<void>;\nexport interface RealmProxyOptions {\n net: LoopbackNet;\n transport: RealmTransport;\n host?: string;\n port?: number;\n tunnel?: TunnelHandler;\n tunnelReady?: () => Promise<void>;\n limits?: Partial<ProxyLimits>;\n}\nconst HOP_BY_HOP = new Set([\n 'connection',\n 'keep-alive',\n 'proxy-connection',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'te',\n 'trailer',\n 'transfer-encoding',\n 'upgrade',\n]);\nconst REQUEST_OWN = new Set(['host', 'content-length', 'expect']);\nclass Budget {\n private free: number;\n private waiters: Array<() => void> = [];\n constructor(free: number) {\n this.free = free;\n }\n async acquire(n: number, signal: AbortSignal): Promise<void> {\n while (this.free < n) {\n signal.throwIfAborted();\n await new Promise<void>((resolve) => {\n const done = (): void => {\n signal.removeEventListener('abort', done);\n resolve();\n };\n this.waiters.push(done);\n signal.addEventListener('abort', done, { once: true });\n });\n }\n this.free -= n;\n }\n release(n: number): void {\n this.free += n;\n const waiters = this.waiters;\n this.waiters = [];\n for (const wake of waiters) wake();\n }\n}\nexport function canonicalHost(host: string): string | undefined {\n const bare = host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;\n try {\n return new URL(`http://${bare}/`).hostname;\n } catch {\n return undefined;\n }\n}\nfunction localV4(a: number, b: number): boolean {\n return a === 127 || a === 0 || (a === 169 && b === 254);\n}\nfunction hextets(address: string): number[] | undefined {\n const [head, tail, extra] = address.split('::');\n if (extra !== undefined) return undefined;\n const part = (text: string | undefined) =>\n text ? text.split(':').map((h) => Number.parseInt(h, 16)) : [];\n const front = part(head);\n const back = part(tail);\n const groups =\n tail === undefined\n ? front\n : [...front, ...new Array(8 - front.length - back.length).fill(0), ...back];\n return groups.length === 8 && groups.every((g) => g >= 0 && g <= 0xffff) ? groups : undefined;\n}\nfunction localV6(address: string): boolean {\n const g = hextets(address);\n if (!g) return true;\n if ((g[0] & 0xffc0) === 0xfe80) return true;\n const zeroPrefix = g.slice(0, 5).every((x) => x === 0);\n if (!zeroPrefix) return false;\n if (g[5] === 0xffff || (g[5] === 0 && g[6] !== 0)) return localV4(g[6] >> 8, g[6] & 0xff);\n return g[5] === 0 && g[6] === 0;\n}\nexport function isLoopbackHost(hostname: string): boolean {\n const canonical = canonicalHost(hostname);\n if (canonical === undefined) return false;\n const host = canonical.replace(/\\.+$/, '');\n if (host === 'localhost' || host.endsWith('.localhost')) return true;\n if (host.startsWith('[')) return localV6(host.slice(1, -1));\n const v4 = /^(\\d+)\\.(\\d+)\\.\\d+\\.\\d+$/.exec(host);\n return v4 ? localV4(Number(v4[1]), Number(v4[2])) : false;\n}\nfunction dropped(headers: HeaderList): Set<string> {\n return new Set([...HOP_BY_HOP, ...fieldTokens(headers, 'connection')]);\n}\nexport function forwardRequestHeaders(headers: HeaderList): HeaderList {\n const drop = dropped(headers);\n return headers.filter(([name]) => {\n const lower = name.toLowerCase();\n return !drop.has(lower) && !REQUEST_OWN.has(lower);\n });\n}\nexport function forwardResponseHeaders(\n headers: HeaderList,\n opts: {\n encodedBodies: boolean;\n bodiless: boolean;\n }\n): Array<readonly [string, string]> {\n const drop = dropped(headers);\n if (!opts.encodedBodies) drop.add('content-encoding');\n if (!(opts.encodedBodies && opts.bodiless)) drop.add('content-length');\n return headers.filter(([name]) => !drop.has(name.toLowerCase()));\n}\nfunction keepsAlive(req: RequestHead): boolean {\n const tokens = fieldTokens(req.headers, 'connection');\n if (tokens.includes('close')) return false;\n return req.minor >= 1 || tokens.includes('keep-alive');\n}\nexport function tunnelRequestUrl(req: RequestHead, origin: string): string {\n const base = new URL(origin);\n let url: URL;\n try {\n url = new URL(req.target, req.target.startsWith('/') ? base : undefined);\n } catch {\n throw new HttpError(400, 'malformed request target');\n }\n const hosts = fieldValues(req.headers, 'host');\n const hostOk = hosts.every(\n (h) => URL.canParse(`https://${h}`) && new URL(`https://${h}`).host === base.host\n );\n if (url.origin !== base.origin || !hostOk) {\n throw new HttpError(421, `this tunnel is for ${base.host}`);\n }\n return url.href;\n}\nexport function requestUrl(req: RequestHead): string {\n if (req.target.startsWith('/')) {\n throw new HttpError(400, 'this is a proxy: send the absolute URL (GET http://host/path)');\n }\n let url: URL;\n try {\n url = new URL(req.target);\n } catch {\n throw new HttpError(400, 'malformed request target');\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new HttpError(400, `unsupported scheme ${url.protocol}`);\n }\n if (isLoopbackHost(url.hostname)) {\n throw new HttpError(\n 403,\n `${url.hostname} is the realm's own loopback, which the proxy does not reach: list it in no_proxy`\n );\n }\n return url.href;\n}\nexport function tunnelTarget(req: RequestHead): TunnelTarget {\n const match = /^([A-Za-z0-9.-]+|\\[[0-9A-Fa-f:.]+\\]):(\\d{1,5})$/.exec(req.target);\n const port = Number(match?.[2]);\n if (!match || port < 1 || port > 65535) {\n throw new HttpError(400, 'CONNECT needs host:port');\n }\n const host = canonicalHost(match[1]);\n if (host === undefined) throw new HttpError(400, 'CONNECT needs host:port');\n if (isLoopbackHost(host)) {\n throw new HttpError(\n 403,\n `${host} is the realm's own loopback, which the proxy does not reach: list it in no_proxy`\n );\n }\n return { host, port };\n}\nexport async function watchHangup(\n conn: KernelSocket,\n abort: AbortController,\n until: AbortSignal\n): Promise<void> {\n while (!until.aborted && !abort.signal.aborted) {\n if (conn.poll().hangup) {\n abort.abort(new KernelError('EPIPE'));\n return;\n }\n try {\n await conn.changed(until);\n } catch {\n return;\n }\n }\n}\nfunction untilAborted(\n response: Promise<RealmTransportResponse>,\n signal: AbortSignal\n): Promise<RealmTransportResponse> {\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n reject(signal.reason ?? new KernelError('EINTR'));\n response.then((late) => late.cancel()).catch(() => undefined);\n };\n if (signal.aborted) return onAbort();\n signal.addEventListener('abort', onAbort, { once: true });\n response.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));\n });\n}\ninterface Exchange {\n sink: HttpSink;\n incoming: Incoming;\n origin?: string;\n conn?: KernelSocket;\n socket: KernelSocket;\n}\nfunction plainResponse(status: number, message: string): RealmTransportResponse {\n const body = latin1Bytes(`slicc realm proxy: ${message}\\n`);\n return {\n status,\n statusText: REASON[status] ?? '',\n headers: [['Content-Type', 'text/plain; charset=utf-8']],\n body: (async function* () {\n yield body;\n })(),\n cancel: async () => undefined,\n };\n}\nfunction timedSource(conn: KernelSocket, idleMs: number, stop: AbortSignal): ByteSource {\n return {\n read: (max) => conn.read(max, AbortSignal.any([stop, AbortSignal.timeout(idleMs)])),\n };\n}\nexport class RealmProxy {\n private readonly options: RealmProxyOptions;\n private readonly listener: KernelSocket;\n private readonly stop = new AbortController();\n private readonly limits: ProxyLimits;\n private readonly slots: Budget;\n private readonly bodies: Budget;\n private readonly connections = new Set<KernelSocket>();\n readonly closed: Promise<void>;\n readonly port: number;\n constructor(options: RealmProxyOptions) {\n this.options = options;\n this.limits = { ...DEFAULT_LIMITS, ...options.limits };\n this.slots = new Budget(this.limits.maxConnections);\n this.bodies = new Budget(this.limits.bodyBudget);\n this.listener = options.net.listen({\n family: 'inet',\n host: options.host ?? '127.0.0.1',\n port: options.port ?? REALM_PROXY_PORT,\n });\n this.port = this.listener.local?.family === 'inet' ? this.listener.local.port : 0;\n this.closed = this.acceptLoop();\n }\n get stopped(): boolean {\n return this.stop.signal.aborted;\n }\n close(): void {\n if (this.stop.signal.aborted) return;\n this.stop.abort();\n this.listener.close();\n for (const conn of this.connections) conn.close();\n }\n private async acceptLoop(): Promise<void> {\n const served = new Set<Promise<void>>();\n try {\n for (;;) {\n await this.slots.acquire(1, this.stop.signal);\n let conn: KernelSocket;\n try {\n conn = await this.listener.accept(this.stop.signal);\n } catch {\n this.slots.release(1);\n break;\n }\n const done = this.serve(conn).finally(() => {\n this.slots.release(1);\n served.delete(done);\n });\n served.add(done);\n }\n } catch {}\n await Promise.allSettled([...served]);\n }\n private async serve(conn: KernelSocket): Promise<void> {\n this.connections.add(conn);\n const incoming = new Incoming(timedSource(conn, this.limits.idleMs, this.stop.signal));\n try {\n await this.requests({ sink: conn, incoming, conn, socket: conn });\n } finally {\n this.connections.delete(conn);\n conn.close();\n }\n }\n private async requests(ctx: Exchange): Promise<void> {\n try {\n for (;;) {\n const head = await ctx.incoming.head(this.limits.maxHead);\n if (!head || !(await this.exchange(ctx, head))) break;\n }\n } catch (e) {\n if (e instanceof HttpError) await this.refuse(ctx.sink, e);\n }\n }\n private async refuse(sink: HttpSink, error: HttpError): Promise<void> {\n try {\n await this.relay(sink, 'GET', 1, plainResponse(error.status, error.message), false);\n } catch {}\n }\n private async exchange(ctx: Exchange, head: Uint8Array): Promise<boolean> {\n const { sink: conn, incoming } = ctx;\n const req = parseRequestHead(head);\n if (req.method === 'CONNECT') {\n if (!ctx.conn) throw new HttpError(400, 'CONNECT inside a tunnel');\n await this.connect(ctx.conn, incoming, req);\n return false;\n }\n const url = ctx.origin ? tunnelRequestUrl(req, ctx.origin) : requestUrl(req);\n const keep = keepsAlive(req);\n const framing = requestFraming(req.headers);\n const reserve =\n framing.kind === 'length' ? framing.length : framing.kind === 'chunked' ? this.cap() : 0;\n if (reserve > this.cap()) throw new HttpError(413, `request body over ${this.cap()} bytes`);\n await this.expectContinue(conn, req, framing.kind !== 'none');\n await this.bodies.acquire(reserve, this.stop.signal);\n let response: RealmTransportResponse;\n const abort = new AbortController();\n const stopExchange = () => abort.abort();\n this.stop.signal.addEventListener('abort', stopExchange, { once: true });\n try {\n try {\n const body = await readBody(incoming, framing, this.cap());\n const waiting = new AbortController();\n void watchHangup(ctx.socket, abort, waiting.signal);\n try {\n response = await this.upstream(req, url, body, abort.signal);\n } finally {\n waiting.abort();\n }\n } finally {\n this.bodies.release(reserve);\n }\n return await this.relay(conn, req.method, req.minor, response, keep);\n } finally {\n this.stop.signal.removeEventListener('abort', stopExchange);\n abort.abort();\n }\n }\n private cap(): number {\n return Math.min(this.options.transport.traits.maxRequestBody, this.limits.bodyBudget);\n }\n private async expectContinue(conn: HttpSink, req: RequestHead, hasBody: boolean): Promise<void> {\n const expect = fieldTokens(req.headers, 'expect');\n if (expect.length === 0) return;\n if (expect.length !== 1 || expect[0] !== '100-continue') {\n throw new HttpError(417, `unsupported expectation: ${expect.join(', ')}`);\n }\n if (hasBody && req.minor >= 1) {\n await conn.write(latin1Bytes('HTTP/1.1 100 Continue\\r\\n\\r\\n'), this.stop.signal);\n }\n }\n private async upstream(\n req: RequestHead,\n url: string,\n body: Uint8Array | undefined,\n signal: AbortSignal\n ): Promise<RealmTransportResponse> {\n try {\n const fetching = this.options.transport.fetch({\n url,\n method: req.method.toUpperCase(),\n headers: forwardRequestHeaders(req.headers),\n body: req.method === 'GET' || req.method === 'HEAD' ? undefined : body,\n signal,\n });\n return await untilAborted(fetching, signal);\n } catch (e) {\n if (signal.aborted) throw e;\n const message = e instanceof Error ? e.message : String(e);\n const status = (\n e as {\n status?: unknown;\n } | null\n )?.status;\n const own = typeof status === 'number' && status >= 400 && status <= 599 ? status : 502;\n return plainResponse(own, message || 'upstream request failed');\n }\n }\n private async relay(\n conn: HttpSink,\n method: string,\n minor: number,\n response: RealmTransportResponse,\n keepAlive: boolean\n ): Promise<boolean> {\n const status = response.status;\n const bodiless = method === 'HEAD' || status === 204 || status === 304 || status < 200;\n const headers = forwardResponseHeaders(response.headers, {\n encodedBodies: this.options.transport.traits.encodedBodies,\n bodiless,\n });\n const chunked = !bodiless && minor >= 1;\n const keep = keepAlive && (bodiless || chunked);\n headers.push(['Connection', keep ? 'keep-alive' : 'close']);\n if (chunked) headers.push(['Transfer-Encoding', 'chunked']);\n const signal = this.stop.signal;\n await conn.write(\n responseHead(status, response.statusText || REASON[status] || '', headers),\n signal\n );\n if (bodiless) {\n await response.cancel();\n return keep;\n }\n try {\n for await (const piece of response.body) {\n if (piece.length > 0) await conn.write(chunked ? chunk(piece) : piece, signal);\n }\n } catch {\n await response.cancel().catch(() => undefined);\n return false;\n }\n if (chunked) await conn.write(LAST_CHUNK, signal);\n return keep;\n }\n private async connect(conn: KernelSocket, incoming: Incoming, req: RequestHead): Promise<void> {\n const target = tunnelTarget(req);\n const tunnel = this.options.tunnel;\n if (!tunnel) {\n throw new HttpError(\n 501,\n `CONNECT ${target.host}:${target.port}: no tunnels through this proxy`\n );\n }\n await this.options.tunnelReady?.().catch((e: unknown) => {\n throw new HttpError(\n 501,\n `CONNECT ${target.host}:${target.port}: ${e instanceof Error ? e.message : String(e)}`\n );\n });\n await conn.write(latin1Bytes('HTTP/1.1 200 Connection Established\\r\\n\\r\\n'), this.stop.signal);\n try {\n await tunnel(conn, incoming, target, this.stop.signal, (source, sink, origin) =>\n this.requests({ sink, incoming: new Incoming(source), origin, socket: conn })\n );\n } catch {}\n }\n}\n", "export type Signer = (tbs: Uint8Array) => Promise<Uint8Array>;\nfunction concat(parts: readonly Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n let at = 0;\n for (const p of parts) {\n out.set(p, at);\n at += p.length;\n }\n return out;\n}\nfunction length(n: number): Uint8Array {\n if (n < 0x80) return Uint8Array.of(n);\n const bytes: number[] = [];\n for (let v = n; v > 0; v = Math.floor(v / 256)) bytes.unshift(v & 0xff);\n return Uint8Array.of(0x80 | bytes.length, ...bytes);\n}\nexport function tlv(tag: number, ...contents: readonly Uint8Array[]): Uint8Array {\n const body = concat(contents);\n return concat([Uint8Array.of(tag), length(body.length), body]);\n}\nconst seq = (...parts: Uint8Array[]) => tlv(0x30, ...parts);\nconst set = (...parts: Uint8Array[]) => tlv(0x31, ...parts);\nconst octets = (bytes: Uint8Array) => tlv(0x04, bytes);\nconst bits = (bytes: Uint8Array, unused = 0) => tlv(0x03, Uint8Array.of(unused), bytes);\nconst TRUE = tlv(0x01, Uint8Array.of(0xff));\nexport function integer(magnitude: Uint8Array): Uint8Array {\n let start = 0;\n while (start < magnitude.length - 1 && magnitude[start] === 0) start++;\n const trimmed = magnitude.subarray(start);\n return tlv(0x02, trimmed[0] & 0x80 ? concat([Uint8Array.of(0), trimmed]) : trimmed);\n}\nexport function oid(dotted: string): Uint8Array {\n const [a, b, ...rest] = dotted.split('.').map(Number);\n const out = [40 * a + b];\n for (const arc of rest) {\n const groups: number[] = [];\n for (let v = arc; ; v = Math.floor(v / 128)) {\n groups.unshift(v & 0x7f);\n if (v < 128) break;\n }\n out.push(...groups.map((g, i) => (i < groups.length - 1 ? g | 0x80 : g)));\n }\n return tlv(0x06, Uint8Array.from(out));\n}\nconst utf8 = (text: string) => tlv(0x0c, new TextEncoder().encode(text));\nconst ascii = (text: string) => Uint8Array.from(text, (c) => c.charCodeAt(0) & 0x7f);\nfunction time(date: Date): Uint8Array {\n const iso = date.toISOString().replace(/[-:T]/g, '').slice(0, 14);\n const year = date.getUTCFullYear();\n return year < 2050 ? tlv(0x17, ascii(`${iso.slice(2)}Z`)) : tlv(0x18, ascii(`${iso}Z`));\n}\nconst ECDSA_SHA256 = seq(oid('1.2.840.10045.4.3.2'));\nexport interface DistinguishedName {\n commonName: string;\n organization?: string;\n}\nfunction name(dn: DistinguishedName): Uint8Array {\n const rdns = [];\n if (dn.organization) rdns.push(set(seq(oid('2.5.4.10'), utf8(dn.organization))));\n rdns.push(set(seq(oid('2.5.4.3'), utf8(dn.commonName))));\n return seq(...rdns);\n}\nfunction extension(id: string, critical: boolean, value: Uint8Array): Uint8Array {\n return critical ? seq(oid(id), TRUE, octets(value)) : seq(oid(id), octets(value));\n}\nexport function children(der: Uint8Array): Uint8Array[] {\n const out: Uint8Array[] = [];\n const [, bodyStart, bodyEnd] = header(der, 0);\n for (let at = bodyStart; at < bodyEnd; ) {\n const [, , end] = header(der, at);\n out.push(der.subarray(at, end));\n at = end;\n }\n return out;\n}\nfunction header(der: Uint8Array, at: number): [tag: number, start: number, end: number] {\n const tag = der[at];\n let len = der[at + 1];\n let start = at + 2;\n if (len & 0x80) {\n const count = len & 0x7f;\n len = 0;\n for (let i = 0; i < count; i++) len = len * 256 + der[start + i];\n start += count;\n }\n if (start + len > der.length) throw new Error('truncated DER');\n return [tag, start, start + len];\n}\nexport function contents(element: Uint8Array): Uint8Array {\n const [, start, end] = header(element, 0);\n return element.subarray(start, end);\n}\nexport function publicKeyBits(spki: Uint8Array): Uint8Array {\n const key = children(spki)[1];\n return contents(key).subarray(1);\n}\nexport async function keyId(spki: Uint8Array): Promise<Uint8Array> {\n return new Uint8Array(\n await crypto.subtle.digest('SHA-1', publicKeyBits(spki) as Uint8Array<ArrayBuffer>)\n );\n}\nexport function ecdsaDer(raw: Uint8Array): Uint8Array {\n const half = raw.length / 2;\n return seq(integer(raw.subarray(0, half)), integer(raw.subarray(half)));\n}\nexport function randomSerial(): Uint8Array {\n const serial = crypto.getRandomValues(new Uint8Array(16));\n serial[0] = (serial[0] & 0x7f) | 0x01;\n return serial;\n}\nexport function ipv4(host: string): Uint8Array | undefined {\n const m = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(host);\n if (!m) return undefined;\n const parts = m.slice(1).map(Number);\n return parts.every((p) => p <= 255) ? Uint8Array.from(parts) : undefined;\n}\nexport function ipv6(host: string): Uint8Array | undefined {\n if (!host.includes(':') || !/^[0-9A-Fa-f:.]+$/.test(host)) return undefined;\n const v4 = /(\\d{1,3}(?:\\.\\d{1,3}){3})$/.exec(host);\n let text = host;\n const tail: number[] = [];\n if (v4) {\n const bytes = ipv4(v4[1]);\n if (!bytes) return undefined;\n tail.push((bytes[0] << 8) | bytes[1], (bytes[2] << 8) | bytes[3]);\n text = host.slice(0, -v4[1].length).replace(/:$/, host.endsWith(`::${v4[1]}`) ? ':' : '');\n }\n const halves = text.split('::');\n if (halves.length > 2) return undefined;\n const groups = (part: string) => (part === '' ? [] : part.split(':'));\n const head = groups(halves[0]);\n const back = halves.length === 2 ? groups(halves[1]) : [];\n if (![...head, ...back].every((g) => /^[0-9A-Fa-f]{1,4}$/.test(g))) return undefined;\n const words = [...head, ...back].map((g) => Number.parseInt(g, 16));\n const missing = 8 - words.length - tail.length;\n if (halves.length === 2 ? missing < 1 : missing !== 0) return undefined;\n const all = [\n ...head.map((g) => Number.parseInt(g, 16)),\n ...new Array(halves.length === 2 ? missing : 0).fill(0),\n ...back.map((g) => Number.parseInt(g, 16)),\n ...tail,\n ];\n return Uint8Array.from(all.flatMap((w) => [w >> 8, w & 0xff]));\n}\nexport interface CertificateRequest {\n serial: Uint8Array;\n issuer: DistinguishedName;\n subject: DistinguishedName;\n notBefore: Date;\n notAfter: Date;\n spki: Uint8Array;\n issuerSpki: Uint8Array;\n kind:\n | {\n ca: true;\n }\n | {\n ca: false;\n host: string;\n };\n sign: Signer;\n}\nasync function extensions(req: CertificateRequest): Promise<Uint8Array> {\n const list = [extension('2.5.29.14', false, octets(await keyId(req.spki)))];\n if (req.kind.ca) {\n list.push(extension('2.5.29.19', true, seq(TRUE, integer(Uint8Array.of(0)))));\n list.push(extension('2.5.29.15', true, bits(Uint8Array.of(0x86), 1)));\n } else {\n list.push(extension('2.5.29.35', false, seq(tlv(0x80, await keyId(req.issuerSpki)))));\n list.push(extension('2.5.29.19', true, seq()));\n list.push(extension('2.5.29.15', true, bits(Uint8Array.of(0x80), 7)));\n list.push(extension('2.5.29.37', false, seq(oid('1.3.6.1.5.5.7.3.1'))));\n const ip = ipv4(req.kind.host) ?? ipv6(req.kind.host);\n const altName = ip ? tlv(0x87, ip) : tlv(0x82, ascii(req.kind.host));\n list.push(extension('2.5.29.17', false, seq(altName)));\n }\n return tlv(0xa3, seq(...list));\n}\nexport async function certificate(req: CertificateRequest): Promise<Uint8Array> {\n const tbs = seq(\n tlv(0xa0, integer(Uint8Array.of(2))),\n integer(req.serial),\n ECDSA_SHA256,\n name(req.issuer),\n seq(time(req.notBefore), time(req.notAfter)),\n name(req.subject),\n req.spki,\n await extensions(req)\n );\n const signature = ecdsaDer(await req.sign(tbs));\n return seq(tbs, ECDSA_SHA256, bits(signature));\n}\nexport function pem(der: Uint8Array): string {\n let b64 = '';\n for (let i = 0; i < der.length; i += 0x8000) {\n b64 += String.fromCharCode(...der.subarray(i, i + 0x8000));\n }\n const lines = btoa(b64).match(/.{1,64}/g) ?? [];\n return `-----BEGIN CERTIFICATE-----\\n${lines.join('\\n')}\\n-----END CERTIFICATE-----\\n`;\n}\n", "import { certificate, type DistinguishedName, ipv6, pem, randomSerial } from './x509.ts';\nexport interface CaRecord {\n key: CryptoKey;\n cert: Uint8Array;\n spki: Uint8Array;\n notAfter: number;\n name: DistinguishedName;\n}\nexport interface CaStore {\n get(owner: string): Promise<CaRecord | undefined>;\n swap(owner: string, expected: CaRecord | undefined, record: CaRecord): Promise<CaRecord>;\n}\n\nfunction sameCert(a: CaRecord | undefined, b: CaRecord | undefined): boolean {\n if (!a || !b) return a === b;\n return a.cert.length === b.cert.length && a.cert.every((byte, i) => byte === b.cert[i]);\n}\n\nexport function winner(\n current: CaRecord | undefined,\n expected: CaRecord | undefined,\n record: CaRecord\n): CaRecord | undefined {\n return sameCert(current, expected) ? record : current;\n}\nconst DAY = 24 * 60 * 60 * 1000;\nconst CA_LIFETIME = 3650 * DAY;\nconst CA_RENEW_BEFORE = 30 * DAY;\nexport const LEAF_LIFETIME = 7 * DAY;\nconst ECDSA = { name: 'ECDSA', namedCurve: 'P-256' } as const;\nconst SIGN = { name: 'ECDSA', hash: 'SHA-256' } as const;\nfunction request<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\nexport function indexedDbCaStore(dbName = 'slicc-realm-ca'): CaStore {\n let db: Promise<IDBDatabase> | undefined;\n const open = () => {\n db ??= new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, 1);\n req.onupgradeneeded = () => req.result.createObjectStore('ca');\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n db.catch(() => {\n db = undefined;\n });\n return db;\n };\n return {\n async get(owner) {\n const store = (await open()).transaction('ca').objectStore('ca');\n return (await request(store.get(owner))) as CaRecord | undefined;\n },\n async swap(owner, expected, record) {\n const tx = (await open()).transaction('ca', 'readwrite');\n const store = tx.objectStore('ca');\n let stored = record;\n const read = store.get(owner);\n read.onsuccess = () => {\n const current = read.result as CaRecord | undefined;\n const kept = winner(current, expected, record);\n if (kept === record) store.put(record, owner);\n else stored = kept as CaRecord;\n };\n await new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n return stored;\n },\n };\n}\nexport class LeafNameError extends Error {}\nexport function validLeafName(host: string): boolean {\n if (ipv6(host)) return true;\n if (host.length === 0 || host.length > 253) return false;\n return host.split('.').every((label) => /^(?!-)[a-z0-9-]{1,63}(?<!-)$/i.test(label));\n}\nexport class RealmCa {\n private readonly record: CaRecord;\n private constructor(record: CaRecord) {\n this.record = record;\n }\n static async open(owner: string, store: CaStore, now = Date.now()): Promise<RealmCa> {\n const stored = await store.get(owner).catch(() => undefined);\n if (stored && stored.notAfter - now > CA_RENEW_BEFORE) return new RealmCa(stored);\n const record = await RealmCa.create(owner, now);\n return new RealmCa(await store.swap(owner, stored, record));\n }\n private static async create(owner: string, now: number): Promise<CaRecord> {\n const pair = await crypto.subtle.generateKey(ECDSA, false, ['sign', 'verify']);\n const spki = new Uint8Array(await crypto.subtle.exportKey('spki', pair.publicKey));\n const id = Array.from(crypto.getRandomValues(new Uint8Array(4)), (b) =>\n b.toString(16).padStart(2, '0')\n ).join('');\n const name = { organization: 'SLICC', commonName: `SLICC realm CA ${owner} ${id}` };\n const notAfter = now + CA_LIFETIME;\n const cert = await certificate({\n serial: randomSerial(),\n issuer: name,\n subject: name,\n notBefore: new Date(now - DAY),\n notAfter: new Date(notAfter),\n spki,\n issuerSpki: spki,\n kind: { ca: true },\n sign: signer(pair.privateKey),\n });\n return { key: pair.privateKey, cert, spki, notAfter, name };\n }\n get cert(): Uint8Array {\n return this.record.cert;\n }\n get pem(): string {\n return pem(this.record.cert);\n }\n async issue(host: string, spki: Uint8Array, now = Date.now()): Promise<Uint8Array> {\n const name = host.toLowerCase();\n if (!validLeafName(name)) throw new LeafNameError(`no certificate for ${host}`);\n return certificate({\n serial: randomSerial(),\n issuer: this.record.name,\n subject: { commonName: name.length <= 64 ? name : 'SLICC realm leaf' },\n notBefore: new Date(now - 60 * 60 * 1000),\n notAfter: new Date(now + LEAF_LIFETIME),\n spki,\n issuerSpki: this.record.spki,\n kind: { ca: false, host: name },\n sign: signer(this.record.key),\n });\n }\n}\nfunction signer(key: CryptoKey) {\n return async (tbs: Uint8Array) =>\n new Uint8Array(await crypto.subtle.sign(SIGN, key, tbs as Uint8Array<ArrayBuffer>));\n}\nconst opened = new WeakMap<CaStore, Map<string, Promise<RealmCa>>>();\nexport function realmCa(owner: string, store: CaStore): Promise<RealmCa> {\n const cas = opened.get(store) ?? new Map<string, Promise<RealmCa>>();\n opened.set(store, cas);\n let ca = cas.get(owner);\n if (!ca) {\n const opening = RealmCa.open(owner, store);\n ca = opening;\n cas.set(owner, opening);\n opening.catch(() => {\n if (cas.get(owner) === opening) cas.delete(owner);\n });\n }\n return ca;\n}\n", "type TlsExport =\n | 'malloc'\n | 'free'\n | 'tls_last_error'\n | 'tls_strerror'\n | 'tls_leaf_new'\n | 'tls_leaf_spki'\n | 'tls_leaf_add_cert'\n | 'tls_leaf_free'\n | 'tls_session_new'\n | 'tls_feed'\n | 'tls_feed_eof'\n | 'tls_in_room'\n | 'tls_read'\n | 'tls_write'\n | 'tls_out_size'\n | 'tls_out_take'\n | 'tls_close'\n | 'tls_alpn_http11'\n | 'tls_session_free';\n\nexport type TlsEngineModule = { readonly HEAPU8: Uint8Array } & {\n readonly [K in TlsExport as `_${K}`]: (...args: number[]) => number;\n};\n\nconst SCRATCH = 64 * 1024;\nconst EOF = -1;\nexport class TlsError extends Error {\n readonly code: number;\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n }\n}\nexport class TlsEngine {\n private readonly m: TlsEngineModule;\n private readonly scratch: number;\n constructor(m: TlsEngineModule) {\n this.m = m;\n this.scratch = m._malloc(SCRATCH);\n if (!this.scratch) throw new Error('tls engine: out of memory');\n }\n private put(bytes: Uint8Array): number {\n const ptr = this.m._malloc(bytes.length + 1);\n if (!ptr) throw new Error('tls engine: out of memory');\n this.m.HEAPU8.set(bytes, ptr);\n this.m.HEAPU8[ptr + bytes.length] = 0;\n return ptr;\n }\n private taken(n: number): Uint8Array {\n return this.m.HEAPU8.slice(this.scratch, this.scratch + n);\n }\n error(code: number, what: string): TlsError {\n this.m._tls_strerror(code, this.scratch, 256);\n const end = this.m.HEAPU8.indexOf(0, this.scratch);\n const text = new TextDecoder().decode(this.m.HEAPU8.subarray(this.scratch, end));\n return new TlsError(code, `${what}: ${text || code}`);\n }\n leaf(): TlsLeaf {\n const ptr = this.m._tls_leaf_new();\n if (!ptr) throw this.error(this.m._tls_last_error(), 'leaf key');\n return new TlsLeaf(this, this.m, ptr);\n }\n session(leaf: TlsLeaf, host: string): TlsSession {\n const name = this.put(new TextEncoder().encode(host));\n try {\n const ptr = this.m._tls_session_new(leaf.ptr, name);\n if (!ptr) throw this.error(this.m._tls_last_error(), 'tls session');\n return new TlsSession(this, this.m, ptr);\n } finally {\n this.m._free(name);\n }\n }\n withBytes<T>(bytes: Uint8Array, fn: (ptr: number) => T): T {\n const ptr = this.put(bytes);\n try {\n return fn(ptr);\n } finally {\n this.m._free(ptr);\n }\n }\n intoScratch(fn: (ptr: number, max: number) => number): number | Uint8Array {\n const n = fn(this.scratch, SCRATCH);\n return n > 0 ? this.taken(n) : n;\n }\n}\nexport class TlsLeaf {\n private readonly engine: TlsEngine;\n private readonly m: TlsEngineModule;\n readonly ptr: number;\n constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number) {\n this.engine = engine;\n this.m = m;\n this.ptr = ptr;\n }\n spki(): Uint8Array {\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_leaf_spki(this.ptr, ptr, max));\n if (typeof out === 'number') throw this.engine.error(out, 'leaf public key');\n return out;\n }\n addCert(der: Uint8Array): void {\n const ret = this.engine.withBytes(der, (ptr) =>\n this.m._tls_leaf_add_cert(this.ptr, ptr, der.length)\n );\n if (ret !== 0) throw this.engine.error(ret, 'leaf certificate');\n }\n release(): void {\n this.m._tls_leaf_free(this.ptr);\n }\n}\nexport class TlsSession {\n private readonly engine: TlsEngine;\n private readonly m: TlsEngineModule;\n private readonly ptr: number;\n constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number) {\n this.engine = engine;\n this.m = m;\n this.ptr = ptr;\n }\n feed(bytes: Uint8Array): number {\n return this.engine.withBytes(bytes, (ptr) => this.m._tls_feed(this.ptr, ptr, bytes.length));\n }\n feedEnd(): void {\n this.m._tls_feed_eof(this.ptr);\n }\n read(): Uint8Array | 'more' | 'eof' {\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_read(this.ptr, ptr, max));\n if (out instanceof Uint8Array) return out;\n if (out === 0) return 'more';\n if (out === EOF) return 'eof';\n throw this.engine.error(out, 'tls');\n }\n write(bytes: Uint8Array): number {\n const n = this.engine.withBytes(bytes, (ptr) => this.m._tls_write(this.ptr, ptr, bytes.length));\n if (n < 0) throw this.engine.error(n, 'tls');\n return n;\n }\n take(): Uint8Array {\n if (this.m._tls_out_size(this.ptr) === 0) return new Uint8Array(0);\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_out_take(this.ptr, ptr, max));\n return out instanceof Uint8Array ? out : new Uint8Array(0);\n }\n close(): void {\n this.m._tls_close(this.ptr);\n }\n free(): void {\n this.m._tls_session_free(this.ptr);\n }\n}\nconst loading = new WeakMap<() => Promise<TlsEngineModule>, Promise<TlsEngine>>();\nexport function loadTlsEngine(load: () => Promise<TlsEngineModule>): Promise<TlsEngine> {\n let engine = loading.get(load);\n if (!engine) {\n const started = load().then((m) => new TlsEngine(m));\n engine = started;\n loading.set(load, started);\n started.catch(() => {\n if (loading.get(load) === started) loading.delete(load);\n });\n }\n return engine;\n}\n", "import type { KernelSocket } from '../socket.ts';\nimport type { ByteSource, Incoming } from './http1.ts';\nimport type { HttpSink, TunnelHandler, TunnelTarget } from './proxy-service.ts';\nimport { LEAF_LIFETIME, type RealmCa } from './realm-ca.ts';\nimport type { TlsEngine, TlsLeaf, TlsSession } from './tls-engine.ts';\n\nconst LEAF_REUSE = LEAF_LIFETIME - 24 * 60 * 60 * 1000;\nconst LEAF_CACHE = 256;\nconst CIPHER_READ = 64 * 1024;\nexport class TlsStream implements ByteSource, HttpSink {\n private readonly session: TlsSession;\n private readonly cipherIn: ByteSource;\n private readonly cipherOut: KernelSocket;\n private pending: Uint8Array = new Uint8Array(0);\n private ended = false;\n constructor(session: TlsSession, cipherIn: ByteSource, cipherOut: KernelSocket) {\n this.session = session;\n this.cipherIn = cipherIn;\n this.cipherOut = cipherOut;\n }\n private async flush(signal?: AbortSignal): Promise<void> {\n for (let out = this.session.take(); out.length > 0; out = this.session.take()) {\n await this.cipherOut.write(out, signal);\n }\n }\n private feedPending(): void {\n if (this.pending.length === 0) return;\n const n = this.session.feed(this.pending);\n this.pending = this.pending.subarray(n);\n }\n async read(_max: number, signal?: AbortSignal): Promise<Uint8Array> {\n for (;;) {\n this.feedPending();\n const got = this.session.read();\n await this.flush(signal);\n if (got instanceof Uint8Array) return got;\n if (got === 'eof') return new Uint8Array(0);\n if (this.pending.length > 0) continue;\n if (this.ended) {\n this.session.feedEnd();\n const last = this.session.read();\n await this.flush(signal);\n return last instanceof Uint8Array ? last : new Uint8Array(0);\n }\n const cipher = await this.cipherIn.read(CIPHER_READ, signal);\n if (cipher.length === 0) this.ended = true;\n else this.pending = cipher;\n }\n }\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n for (let at = 0; at < bytes.length; ) {\n const n = this.session.write(bytes.subarray(at, at + 16 * 1024));\n await this.flush(signal);\n at += n;\n }\n return bytes.length;\n }\n async close(signal?: AbortSignal): Promise<void> {\n this.session.close();\n await this.flush(signal);\n }\n}\ninterface CachedLeaf {\n leaf: Promise<TlsLeaf>;\n expires: number;\n}\nexport interface TlsTerminatorOptions {\n ca: () => Promise<RealmCa>;\n engine: () => Promise<TlsEngine>;\n now?: () => number;\n}\nexport class TlsTerminator {\n private readonly options: TlsTerminatorOptions;\n private readonly leaves = new Map<string, CachedLeaf>();\n private readonly now: () => number;\n constructor(options: TlsTerminatorOptions) {\n this.options = options;\n this.now = options.now ?? Date.now;\n }\n private leafFor(engine: TlsEngine, host: string): Promise<TlsLeaf> {\n const now = this.now();\n const cached = this.leaves.get(host);\n if (cached && cached.expires > now) {\n this.leaves.delete(host);\n this.leaves.set(host, cached);\n return cached.leaf;\n }\n if (cached) void this.drop(host, cached);\n const leaf = this.issue(engine, host, now);\n const entry = { leaf, expires: now + LEAF_REUSE };\n this.leaves.set(host, entry);\n leaf.catch(() => {\n if (this.leaves.get(host) === entry) this.leaves.delete(host);\n });\n for (const [oldest, old] of this.leaves) {\n if (this.leaves.size <= LEAF_CACHE) break;\n void this.drop(oldest, old);\n }\n return leaf;\n }\n private async drop(host: string, entry: CachedLeaf): Promise<void> {\n if (this.leaves.get(host) === entry) this.leaves.delete(host);\n (await entry.leaf.catch(() => undefined))?.release();\n }\n private async issue(engine: TlsEngine, host: string, now: number): Promise<TlsLeaf> {\n const ca = await this.options.ca();\n const leaf = engine.leaf();\n try {\n leaf.addCert(await ca.issue(host, leaf.spki(), now));\n leaf.addCert(ca.cert);\n return leaf;\n } catch (e) {\n leaf.release();\n throw e;\n }\n }\n async close(): Promise<void> {\n await Promise.all([...this.leaves].map(([host, entry]) => this.drop(host, entry)));\n }\n readonly handler: TunnelHandler = async (conn, incoming, target, signal, serveHttp) => {\n const engine = await this.options.engine();\n const host = target.host.replace(/^\\[|\\]$/g, '');\n const leaf = await this.leafFor(engine, host);\n const session = engine.session(leaf, host);\n try {\n const stream = new TlsStream(session, cipherSource(incoming), conn);\n const origin = `https://${authority(target)}`;\n await serveHttp(stream, stream, origin);\n await stream.close(signal).catch(() => undefined);\n } finally {\n session.free();\n }\n };\n}\nexport function authority(target: TunnelTarget): string {\n return target.port === 443 ? target.host : `${target.host}:${target.port}`;\n}\nfunction cipherSource(incoming: Incoming): ByteSource {\n return { read: (max, signal) => incoming.some(max, signal) };\n}\n", "import type { KernelFs } from '../../fs/types.ts';\nimport type { LoopbackNet } from '../socket.ts';\nimport { REALM_PROXY_PORT, RealmProxy } from './proxy-service.ts';\nimport {\n type CaRecord,\n type CaStore,\n indexedDbCaStore,\n type RealmCa,\n realmCa,\n winner,\n} from './realm-ca.ts';\nimport { loadTlsEngine, type TlsEngine, type TlsEngineModule } from './tls-engine.ts';\nimport { TlsTerminator } from './tls-tunnel.ts';\nimport type { RealmTransport } from './transport.ts';\n\nexport const NO_TRANSPORT =\n 'slicc-kernel: no network transport (createKernel({ network: { transport } }))';\n\nexport const TLS_ENGINE_PACKAGE = '@ai-ecoverse/wasm-tls-engine';\n\nexport const CA_PATH = '/etc/ssl/certs/slicc-kernel-ca.pem';\n\nconst PROXY_URL = `http://127.0.0.1:${REALM_PROXY_PORT}`;\n\nconst NO_PROXY = 'localhost,.localhost,127.0.0.1,127.0.0.0/8';\n\nconst CA_OWNER = 'slicc-kernel';\n\nexport function networkEnv(): Record<string, string> {\n return {\n http_proxy: PROXY_URL,\n https_proxy: PROXY_URL,\n HTTP_PROXY: PROXY_URL,\n HTTPS_PROXY: PROXY_URL,\n no_proxy: NO_PROXY,\n NO_PROXY: NO_PROXY,\n SSL_CERT_FILE: CA_PATH,\n CURL_CA_BUNDLE: CA_PATH,\n GIT_SSL_CAINFO: CA_PATH,\n };\n}\n\nexport function missingTransport(): RealmTransport {\n return {\n traits: { manualRedirects: true, encodedBodies: true, maxRequestBody: 0, unavailable: true },\n fetch: () => Promise.reject(Object.assign(new Error(NO_TRANSPORT), { status: 502 })),\n };\n}\n\nexport function memoryCaStore(): CaStore {\n const records = new Map<string, CaRecord>();\n return {\n get: async (owner) => records.get(owner),\n swap: async (owner, expected, record) => {\n const kept = winner(records.get(owner), expected, record) as CaRecord;\n records.set(owner, kept);\n return kept;\n },\n };\n}\n\nexport function caStore(metadata: string | false): CaStore {\n return metadata === false ? memoryCaStore() : indexedDbCaStore(`${metadata}-ca`);\n}\n\nfunction base64(bytes: Uint8Array): string {\n let text = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n text += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(text);\n}\n\nexport function packageTlsEngine(fs: KernelFs, modules: string): () => Promise<TlsEngineModule> {\n const dir = `${modules.replace(/\\/+$/, '')}/${TLS_ENGINE_PACKAGE}/dist`;\n return async () => {\n let glue: Uint8Array;\n let wasmBinary: Uint8Array;\n try {\n [glue, wasmBinary] = await Promise.all([\n fs.readFileBuffer(`${dir}/slicc-tls-engine.mjs`),\n fs.readFileBuffer(`${dir}/slicc-tls-engine.wasm`),\n ]);\n } catch {\n throw new Error(`TLS needs ${TLS_ENGINE_PACKAGE} installed in ${modules}`);\n }\n const url = `data:text/javascript;base64,${base64(glue)}`;\n const factory = (await import(url)) as {\n default: (options: {\n wasmBinary: Uint8Array;\n locateFile: (path: string) => string;\n }) => Promise<TlsEngineModule>;\n };\n return factory.default({ wasmBinary, locateFile: (path) => path });\n };\n}\n\nexport interface NetworkOptions {\n transport?: RealmTransport;\n engine: () => Promise<TlsEngine>;\n ca: () => Promise<RealmCa>;\n now?: () => number;\n}\n\nexport function kernelCa(store: CaStore): () => Promise<RealmCa> {\n return () => realmCa(CA_OWNER, store);\n}\n\nexport function kernelTlsEngine(load: () => Promise<TlsEngineModule>): () => Promise<TlsEngine> {\n return () => loadTlsEngine(load);\n}\n\nexport async function writeCaFile(fs: KernelFs, ca: () => Promise<RealmCa>): Promise<void> {\n const { pem } = await ca();\n const current = (await fs.exists(CA_PATH)) ? await fs.readFile(CA_PATH) : undefined;\n if (current === pem) return;\n await fs.mkdir(CA_PATH.slice(0, CA_PATH.lastIndexOf('/')), { recursive: true });\n await fs.writeFile(CA_PATH, pem);\n}\n\nexport function enableNetwork(\n net: LoopbackNet,\n options: NetworkOptions\n): () => RealmProxy | undefined {\n let proxy: RealmProxy | undefined;\n const transport = options.transport ?? missingTransport();\n net.activate({ family: 'inet', host: '127.0.0.1', port: REALM_PROXY_PORT }, () => {\n const tls = new TlsTerminator({\n ca: options.ca,\n engine: options.engine,\n ...(options.now ? { now: options.now } : {}),\n });\n const started = new RealmProxy({\n net,\n transport,\n tunnel: tls.handler,\n tunnelReady: async () => {\n await options.engine();\n },\n });\n proxy = started;\n void started.closed.then(async () => {\n if (proxy === started) proxy = undefined;\n await tls.close();\n });\n });\n return () => proxy;\n}\n", "import type {\n HeaderList,\n RealmTransport,\n RealmTransportRequest,\n RealmTransportResponse,\n RealmTransportTraits,\n} from './transport.ts';\n\nexport type TransportCall =\n | {\n net: 'fetch';\n nid: number;\n url: string;\n method: string;\n headers: HeaderList;\n body?: Uint8Array;\n }\n | { net: 'read'; nid: number }\n | { net: 'cancel'; nid: number };\n\nexport type TransportReply =\n | { net: 'head'; nid: number; status: number; statusText: string; headers: HeaderList }\n | { net: 'chunk'; nid: number; bytes: Uint8Array }\n | { net: 'end'; nid: number }\n | { net: 'error'; nid: number; message: string; status?: number; code?: string };\n\nexport interface TransportPort {\n postMessage(message: TransportCall): void;\n}\n\nexport class TransportError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n\n constructor(message: string, status?: number, code?: string) {\n super(message);\n this.status = status;\n this.code = code;\n }\n}\n\ninterface Waiter {\n resolve(reply: TransportReply): void;\n reject(error: Error): void;\n}\n\nexport class RemoteTransport implements RealmTransport {\n readonly traits: RealmTransportTraits;\n\n private readonly port: TransportPort;\n\n private readonly waiting = new Map<number, Waiter>();\n\n private nextId = 0;\n\n constructor(port: TransportPort, traits: RealmTransportTraits) {\n this.port = port;\n this.traits = traits;\n }\n\n receive(reply: TransportReply): void {\n const waiter = this.waiting.get(reply.nid);\n if (!waiter) return;\n this.waiting.delete(reply.nid);\n if (reply.net === 'error') {\n waiter.reject(new TransportError(reply.message, reply.status, reply.code));\n } else waiter.resolve(reply);\n }\n\n private ask(call: TransportCall): Promise<TransportReply> {\n return new Promise((resolve, reject) => {\n this.waiting.set(call.nid, { resolve, reject });\n this.port.postMessage(call);\n });\n }\n\n private cancel(nid: number): void {\n const waiter = this.waiting.get(nid);\n this.waiting.delete(nid);\n waiter?.reject(new TransportError('the request was cancelled'));\n this.port.postMessage({ net: 'cancel', nid });\n }\n\n async fetch(request: RealmTransportRequest): Promise<RealmTransportResponse> {\n const nid = ++this.nextId;\n const { signal } = request;\n signal.throwIfAborted();\n let finished = false;\n const abort = () => {\n finished = true;\n this.cancel(nid);\n };\n signal.addEventListener('abort', abort, { once: true });\n const finish = () => {\n if (finished) return;\n finished = true;\n signal.removeEventListener('abort', abort);\n };\n let head: TransportReply;\n try {\n head = await this.ask({\n net: 'fetch',\n nid,\n url: request.url,\n method: request.method,\n headers: request.headers,\n ...(request.body ? { body: request.body } : {}),\n });\n } catch (e) {\n finish();\n throw e;\n }\n const { status, statusText, headers } = head as Extract<TransportReply, { net: 'head' }>;\n const read = async (): Promise<Uint8Array | undefined> => {\n if (finished) return undefined;\n const reply = await this.ask({ net: 'read', nid }).catch((e: unknown) => {\n finish();\n throw e;\n });\n if (reply.net === 'chunk') return reply.bytes;\n finish();\n return undefined;\n };\n const cancel = async () => {\n if (finished) return;\n finish();\n this.cancel(nid);\n };\n return {\n status,\n statusText,\n headers,\n cancel,\n body: {\n [Symbol.asyncIterator]: () => ({\n next: async () => {\n const bytes = await read();\n return bytes ? { value: bytes, done: false } : { value: undefined, done: true };\n },\n return: async () => {\n await cancel();\n return { value: undefined, done: true };\n },\n }),\n },\n };\n }\n}\n", "export const SIG = {\n HUP: 1,\n INT: 2,\n QUIT: 3,\n ILL: 4,\n TRAP: 5,\n ABRT: 6,\n BUS: 7,\n FPE: 8,\n KILL: 9,\n USR1: 10,\n SEGV: 11,\n USR2: 12,\n PIPE: 13,\n ALRM: 14,\n TERM: 15,\n STKFLT: 16,\n CHLD: 17,\n CONT: 18,\n STOP: 19,\n TSTP: 20,\n TTIN: 21,\n TTOU: 22,\n URG: 23,\n XCPU: 24,\n XFSZ: 25,\n VTALRM: 26,\n PROF: 27,\n WINCH: 28,\n POLL: 29,\n PWR: 30,\n SYS: 31,\n} as const;\n\nexport type DefaultAction = 'terminate' | 'ignore' | 'stop' | 'continue';\n\nconst IGNORED_BY_DEFAULT: ReadonlySet<number> = new Set([SIG.CHLD, SIG.URG, SIG.WINCH]);\nconst STOPPING: ReadonlySet<number> = new Set([SIG.STOP, SIG.TSTP, SIG.TTIN, SIG.TTOU]);\n\nexport function defaultAction(sig: number): DefaultAction {\n if (sig === SIG.CONT) return 'continue';\n if (STOPPING.has(sig)) return 'stop';\n return IGNORED_BY_DEFAULT.has(sig) ? 'ignore' : 'terminate';\n}\n\nexport function isSignal(sig: number): boolean {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31;\n}\n\nexport function sigbit(sig: number): number {\n return 1 << sig;\n}\n\nexport function signalsIn(mask: number): number[] {\n const out: number[] = [];\n for (let sig = 1; sig <= 31; sig++) if (mask & sigbit(sig)) out.push(sig);\n return out;\n}\n\nexport const SIGNAL_BY_NAME: Readonly<\n Record<'SIGINT' | 'SIGTERM' | 'SIGKILL' | 'SIGSTOP' | 'SIGCONT', number>\n> = {\n SIGINT: SIG.INT,\n SIGTERM: SIG.TERM,\n SIGKILL: SIG.KILL,\n SIGSTOP: SIG.STOP,\n SIGCONT: SIG.CONT,\n};\n", "import type { KernelFs } from './fs/types.ts';\n\nexport type Abi = 'emscripten' | 'wasi';\n\nexport interface Command {\n name: string;\n abi: Abi;\n glue: string;\n wasm: string;\n argv0: string;\n args?: string[];\n env?: Record<string, string>;\n unset?: string[];\n script?: string;\n imports?: string;\n}\n\ninterface CommandEntry {\n abi?: unknown;\n glue?: unknown;\n wasm?: unknown;\n argv0?: unknown;\n args?: unknown;\n env?: unknown;\n script?: unknown;\n imports?: unknown;\n}\n\ninterface Manifest {\n slicc?: { abi?: unknown; commands?: unknown; env?: unknown };\n}\n\nconst NAME = /^[A-Za-z0-9._+-]+$/;\nconst ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst PACKAGE = /\\$\\{package\\}/g;\n\nfunction inside(pkg: string, rel: unknown): string | undefined {\n if (typeof rel !== 'string' || rel === '') return undefined;\n const clean = rel.replace(/^\\.\\//, '');\n if (clean.startsWith('/') || clean.split('/').includes('..')) return undefined;\n return `${pkg}/${clean}`;\n}\n\ntype ManifestEnv = Record<string, string | null>;\n\nfunction envOf(pkg: string, raw: unknown): ManifestEnv {\n const env: ManifestEnv = {};\n if (!raw || typeof raw !== 'object') return env;\n for (const [key, value] of Object.entries(raw)) {\n if (!ENV_KEY.test(key)) continue;\n if (typeof value === 'string') env[key] = value.replace(PACKAGE, pkg);\n else if (value === null) env[key] = null;\n }\n return env;\n}\n\nfunction envFields(merged: ManifestEnv): { env?: Record<string, string>; unset?: string[] } {\n const env: Record<string, string> = {};\n const unset: string[] = [];\n for (const [key, value] of Object.entries(merged)) {\n if (value === null) unset.push(key);\n else env[key] = value;\n }\n return {\n ...(Object.keys(env).length > 0 ? { env } : {}),\n ...(unset.length > 0 ? { unset } : {}),\n };\n}\n\nfunction argsOf(pkg: string, raw: unknown): string[] | undefined {\n if (!Array.isArray(raw) || raw.length === 0) return undefined;\n if (!raw.every((arg) => typeof arg === 'string')) return undefined;\n return raw.map((arg) => arg.replace(PACKAGE, pkg));\n}\n\nfunction abiOf(raw: unknown, fallback: Abi): Abi | undefined {\n const abi = raw ?? fallback;\n return abi === 'emscripten' || abi === 'wasi' ? abi : undefined;\n}\n\nfunction commandOf(\n pkg: string,\n name: string,\n raw: CommandEntry,\n packageAbi: Abi,\n shared: ManifestEnv\n): Command | undefined {\n const withEnv = envFields({ ...shared, ...envOf(pkg, raw.env) });\n const script = inside(pkg, raw.script);\n if (script) {\n return { name, abi: packageAbi, glue: script, wasm: script, argv0: name, script, ...withEnv };\n }\n const abi = abiOf(raw.abi, packageAbi);\n const wasm = inside(pkg, raw.wasm);\n const glue = abi === 'wasi' ? wasm : inside(pkg, raw.glue);\n if (!abi || !glue || !wasm) return undefined;\n const argv0 = typeof raw.argv0 === 'string' && raw.argv0 ? raw.argv0 : name;\n const args = argsOf(pkg, raw.args);\n const imports = abi === 'wasi' ? inside(pkg, raw.imports) : undefined;\n return {\n name,\n abi,\n glue,\n wasm,\n argv0,\n ...(args ? { args } : {}),\n ...withEnv,\n ...(imports ? { imports } : {}),\n };\n}\n\nexport function commandsOf(pkg: string, manifest: Manifest): Command[] {\n const slicc = manifest.slicc;\n if (!slicc || typeof slicc !== 'object') return [];\n const packageAbi = abiOf(slicc.abi, 'emscripten');\n const entries = slicc.commands;\n if (!packageAbi || !entries || typeof entries !== 'object') return [];\n const shared = envOf(pkg, slicc.env);\n const out: Command[] = [];\n for (const [name, raw] of Object.entries(entries as Record<string, CommandEntry>)) {\n if (!NAME.test(name) || name === '.' || name === '..' || !raw || typeof raw !== 'object') {\n continue;\n }\n const command = commandOf(pkg, name, raw, packageAbi, shared);\n if (command) out.push(command);\n }\n return out;\n}\n\nasync function withPackagePaths(fs: KernelFs, pkg: string, command: Command): Promise<Command> {\n if (!command.env) return command;\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(command.env)) {\n const path = !value.startsWith('/') && value.includes('/') && inside(pkg, value);\n env[key] = path && (await fs.exists(path)) ? path : value;\n }\n return { ...command, env };\n}\n\nasync function packages(fs: KernelFs, modules: string): Promise<string[]> {\n const names = await fs.readdir(modules).catch(() => []);\n const dirs: string[] = [];\n for (const name of names) {\n if (name.startsWith('.')) continue;\n if (!name.startsWith('@')) {\n dirs.push(`${modules}/${name}`);\n continue;\n }\n for (const inner of await fs.readdir(`${modules}/${name}`).catch(() => [])) {\n dirs.push(`${modules}/${name}/${inner}`);\n }\n }\n return dirs;\n}\n\nexport async function scanCommands(fs: KernelFs, modules: string): Promise<Map<string, Command>> {\n const found = new Map<string, Command>();\n for (const pkg of await packages(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n for (const command of commandsOf(pkg, manifest)) {\n if (!found.has(command.name))\n found.set(command.name, await withPackagePaths(fs, pkg, command));\n }\n }\n if (!found.has('sh') && found.has('bash')) {\n found.set('sh', { ...(found.get('bash') as Command), name: 'sh', argv0: 'sh' });\n }\n return found;\n}\n", "import { type FsStat, inodeOf, type KernelFs } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst MAX_LINKS = 40;\n\nfunction missing(err: unknown): boolean {\n return (err as { code?: unknown })?.code === 'ENOENT';\n}\n\nfunction synthetic(directory: boolean, path: string): FsStat {\n const epoch = new Date(0);\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: 0,\n mode: (directory ? S_IFDIR : S_IFREG) | 0o755,\n mtime: epoch,\n atime: epoch,\n ctime: epoch,\n ino: inodeOf(path),\n };\n}\n\nexport async function followLinks(fs: KernelFs, path: string): Promise<string> {\n let current = path;\n for (let hops = 0; hops < MAX_LINKS; hops++) {\n const st = await fs.lstat(current).catch(() => undefined);\n if (!st?.isSymbolicLink) return current;\n const parent = current.slice(0, current.lastIndexOf('/')) || '/';\n current = fs.resolvePath(parent, await fs.readlink(current));\n }\n return current;\n}\n\nexport function withCommandDirs(fs: KernelFs, names: () => Promise<ReadonlySet<string>>): KernelFs {\n async function children(path: string): Promise<string[] | undefined> {\n if (path === '/') return ['bin', 'usr'];\n if (path === '/usr') return ['bin'];\n if (path === '/bin' || path === '/usr/bin') return [...(await names())];\n return undefined;\n }\n\n async function virtual(path: string): Promise<FsStat | undefined> {\n if (path === '/usr' || path === '/bin' || path === '/usr/bin') return synthetic(true, path);\n const name = COMMAND.exec(path)?.[1];\n return name !== undefined && (await names()).has(name) ? synthetic(false, path) : undefined;\n }\n\n async function linked(path: string): Promise<FsStat | undefined> {\n return (await virtual(path)) ?? virtual(await followLinks(fs, path));\n }\n\n async function stat(path: string, real: (path: string) => Promise<FsStat>): Promise<FsStat> {\n try {\n return await real(path);\n } catch (err) {\n const found = missing(err) ? await linked(path) : undefined;\n if (found) return found;\n throw err;\n }\n }\n\n return {\n resolvePath: (base, path) => fs.resolvePath(base, path),\n readFile: (path) => fs.readFile(path),\n async readFileBuffer(path) {\n try {\n return await fs.readFileBuffer(path);\n } catch (err) {\n if (missing(err) && (await linked(path))?.isFile) return new Uint8Array(0);\n throw err;\n }\n },\n writeFile: (path, content) => fs.writeFile(path, content),\n async exists(path) {\n return (await fs.exists(path)) || (await linked(path)) !== undefined;\n },\n stat: (path) => stat(path, (p) => fs.stat(p)),\n lstat: (path) => stat(path, (p) => fs.lstat(p)),\n async readdir(path) {\n const extra = await children(path);\n if (!extra) return fs.readdir(path);\n const real = await fs.readdir(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n return [...new Set([...real, ...extra])].sort();\n },\n async readdirStat(path) {\n const extra = await children(path);\n if (!extra) return fs.readdirStat(path);\n const real = await fs.readdirStat(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n const seen = new Set(real.map(([name]) => name));\n const base = path === '/' ? '' : path;\n const added = extra.filter((name) => !seen.has(name));\n const virtuals = await Promise.all(\n added.map(\n async (name): Promise<[string, FsStat | null]> => [\n name,\n (await virtual(`${base}/${name}`)) as FsStat,\n ]\n )\n );\n return [...real, ...virtuals].sort(([a], [b]) => (a < b ? -1 : 1));\n },\n mkdir: (path, options) => fs.mkdir(path, options),\n rm: (path, options) => fs.rm(path, options),\n rename: (from, to) => fs.rename(from, to),\n symlink: (target, path) => fs.symlink(target, path),\n readlink: (path) => fs.readlink(path),\n chmod: (path, mode) => fs.chmod(path, mode),\n utimes: (path, atime, mtime) => fs.utimes(path, atime, mtime),\n };\n}\n", "import {\n bytesSource,\n type DeviceMeta,\n deviceFile,\n FdTable,\n type KernelErrno,\n KernelError,\n nullFile,\n type OpenFile,\n sinkFile,\n} from './fd-table.ts';\nimport type { ForkState } from './protocol.ts';\n\nexport type ChildStdio =\n | { fd: number }\n | { input: Uint8Array }\n | { capture: true }\n | { none: true };\n\nexport type InheritedSlot =\n | { fd: number; kernel: number; flags?: number }\n | ({ fd: number } & DeviceMeta);\n\nexport interface ChildSpawnRequest {\n file: string;\n\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n}\n\nexport interface ChildHandle {\n pid: number;\n\n exited: Promise<number>;\n\n termsig?: () => number | undefined;\n\n onState?: (listener: ChildStateListener) => void;\n}\n\nexport type ChildStateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport interface WaitFlags {\n untraced?: boolean;\n\n continued?: boolean;\n\n inGroup?: (childPid: number) => boolean;\n}\n\nexport class SpawnError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport type ChildSpawner = (req: ChildSpawnRequest, fds: FdTable) => Promise<ChildHandle>;\n\nexport type ChildForker = (state: ForkState, fds: FdTable) => Promise<ChildHandle>;\n\ninterface Child {\n exited: Promise<number>;\n termsig?: () => number | undefined;\n\n code?: number;\n\n stopReport?: number;\n\n continueReport?: boolean;\n\n captured: Map<number, Uint8Array[]>;\n}\n\nfunction interrupted(signal: AbortSignal | undefined): {\n promise: Promise<never>;\n\n done(): void;\n} {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal?.aborted) fail();\n else signal?.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal?.removeEventListener('abort', fail) };\n}\n\nexport function stoppedStatus(sig: number): number {\n return ((sig & 0xff) << 8) | 0x7f;\n}\n\nexport const CONTINUED_STATUS = 0xffff;\n\nexport function waitStatus(code: number, termsig?: number): number {\n return termsig ? termsig & 0x7f : (code & 0xff) << 8;\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\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\nexport class ChildTable {\n private readonly children = new Map<number, Child>();\n\n private readonly leftovers = new Map<number, Map<number, Uint8Array[]>>();\n\n onChildState?: () => void;\n\n onReap?: (pid: number) => void;\n\n private stateChanged: Array<() => void> = [];\n\n private readonly watchers = new Map<number, ChildStateListener>();\n\n private readonly parentFds: FdTable;\n\n private readonly spawner: ChildSpawner | undefined;\n\n private readonly forker?: ChildForker;\n\n constructor(\n parentFds: FdTable,\n\n spawner: ChildSpawner | undefined,\n\n forker?: ChildForker\n ) {\n this.parentFds = parentFds;\n\n this.spawner = spawner;\n\n this.forker = forker;\n }\n\n async fork(state: ForkState): Promise<number> {\n if (!this.forker) throw new SpawnError('ENOSYS');\n return this.track(state, this.parentFds.fork(), new Map(), this.forker);\n }\n\n async spawn(\n req: ChildSpawnRequest,\n stdio: readonly ChildStdio[],\n inherit: readonly InheritedSlot[] = []\n ): Promise<number> {\n if (!this.spawner) throw new SpawnError('ENOSYS');\n const fds = new FdTable();\n const captured = new Map<number, Uint8Array[]>();\n try {\n for (const [n, slot] of stdio.entries()) fds.installAt(n, this.openSlot(slot, n, captured));\n\n for (const slot of inherit) {\n if (slot.fd <= 2) continue;\n if ('device' in slot) {\n fds.installAt(slot.fd, deviceFile(slot.device, slot.access));\n continue;\n }\n fds.installAt(slot.fd, this.parentFds.get(slot.kernel).retain());\n if (slot.flags !== undefined) fds.setStatusFlags(slot.fd, slot.flags);\n }\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n return this.track(req, fds, captured, this.spawner);\n }\n\n private async track<R>(\n req: R,\n fds: FdTable,\n captured: Map<number, Uint8Array[]>,\n start: (req: R, fds: FdTable) => Promise<ChildHandle>\n ): Promise<number> {\n let handle: ChildHandle;\n try {\n handle = await start(req, fds);\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n const child: Child = { exited: handle.exited, termsig: handle.termsig, captured };\n void handle.exited.then((code) => {\n child.code = code;\n this.watchers.delete(handle.pid);\n this.onChildState?.();\n });\n handle.onState?.((state, sig) => {\n child.stopReport = state === 'stopped' ? sig : undefined;\n child.continueReport = state === 'continued';\n this.watchers.get(handle.pid)?.(state, sig);\n const waiters = this.stateChanged;\n this.stateChanged = [];\n for (const wake of waiters) wake();\n this.onChildState?.();\n });\n this.children.set(handle.pid, child);\n return handle.pid;\n }\n\n watch(pid: number, listener: ChildStateListener): void {\n if (this.children.has(pid)) this.watchers.set(pid, listener);\n }\n\n private openSlot(slot: ChildStdio, n: number, captured: Map<number, Uint8Array[]>): OpenFile {\n if ('fd' in slot) return this.parentFds.get(slot.fd).retain();\n if ('input' in slot) return bytesSource(slot.input);\n if ('capture' in slot) {\n const chunks: Uint8Array[] = [];\n captured.set(n, chunks);\n return sinkFile((bytes) => chunks.push(bytes));\n }\n return nullFile();\n }\n\n async wait(\n pid: number,\n nohang: boolean,\n signal?: AbortSignal,\n flags: WaitFlags = {}\n ): Promise<[number, number]> {\n let interrupt: ReturnType<typeof interrupted> | undefined;\n try {\n for (;;) {\n const candidates = this.candidates(pid, flags);\n if (candidates.length === 0) throw new KernelError('ECHILD');\n const done = candidates.find(([, child]) => child.code !== undefined);\n if (done) return this.reap(done[0], done[1].code as number);\n const changed = this.stateReport(candidates, flags);\n if (changed) return changed;\n if (nohang) return [0, 0];\n interrupt ??= interrupted(signal);\n await this.nextChange(candidates, flags, interrupt.promise);\n }\n } finally {\n interrupt?.done();\n }\n }\n\n private candidates(pid: number, flags: WaitFlags): [number, Child][] {\n const all = [...this.children];\n if (pid > 0) return all.filter(([p]) => p === pid);\n const inGroup = flags.inGroup;\n return pid === -1 || !inGroup ? all : all.filter(([p]) => inGroup(p));\n }\n\n private async nextChange(\n candidates: [number, Child][],\n flags: WaitFlags,\n interrupt: Promise<never>\n ): Promise<void> {\n let wake: (() => void) | undefined;\n const stateChange = new Promise<void>((resolve) => (wake = resolve));\n const watching = flags.untraced || flags.continued;\n if (watching && wake) this.stateChanged.push(wake);\n try {\n await Promise.race([\n ...candidates.map(([, child]) => child.exited),\n ...(watching ? [stateChange] : []),\n interrupt,\n ]);\n } finally {\n this.stateChanged = this.stateChanged.filter((w) => w !== wake);\n }\n }\n\n private stateReport(candidates: [number, Child][], flags: WaitFlags): [number, number] | null {\n for (const [p, child] of candidates) {\n if (flags.untraced && child.stopReport !== undefined) {\n const sig = child.stopReport;\n child.stopReport = undefined;\n return [p, stoppedStatus(sig)];\n }\n if (flags.continued && child.continueReport) {\n child.continueReport = false;\n return [p, CONTINUED_STATUS];\n }\n }\n return null;\n }\n\n private reap(pid: number, code: number): [number, number] {\n const child = this.children.get(pid);\n this.children.delete(pid);\n this.onReap?.(pid);\n if (child && child.captured.size > 0) this.leftovers.set(pid, child.captured);\n return [pid, waitStatus(code, child?.termsig?.())];\n }\n\n pids(): number[] {\n return [...this.children.keys()];\n }\n\n captured(pid: number, slot: number): Uint8Array {\n const slots = this.leftovers.get(pid);\n const chunks = slots?.get(slot);\n if (!slots || !chunks) return new Uint8Array(0);\n slots.delete(slot);\n if (slots.size === 0) this.leftovers.delete(pid);\n return concat(chunks);\n }\n}\n", "import type { KernelFs } from '../fs/types.ts';\n\nexport interface SyncFsTokenEntry {\n fs: KernelFs;\n cwd: string;\n}\n\nconst registry = new Map<string, SyncFsTokenEntry>();\n\nexport function mintSyncFsToken(entry: SyncFsTokenEntry): string {\n const token = crypto.randomUUID();\n registry.set(token, entry);\n return token;\n}\n\nexport function resolveSyncFsToken(token: string): SyncFsTokenEntry | null {\n return registry.get(token) ?? null;\n}\n\nexport function revokeSyncFsToken(token: string): void {\n registry.delete(token);\n}\n", "export type SyncFsOp =\n | 'read'\n | 'write'\n | 'exists'\n | 'stat'\n | 'lstat'\n | 'readdir'\n | 'readdir-stat'\n | 'mkdir'\n | 'rm'\n | 'rename'\n | 'unlink'\n | 'rmdir'\n | 'symlink'\n | 'readlink'\n | 'chmod'\n | 'utimes';\n\nexport interface SyncFsRequest {\n token: string;\n op: SyncFsOp;\n path: string;\n body?: Uint8Array;\n arg2?: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n}\n\nexport type SyncFsResult =\n | { ok: true; kind: 'bytes'; bytes: Uint8Array }\n | { ok: true; kind: 'json'; json: unknown }\n | { ok: true; kind: 'void' }\n | { ok: false; errno: string; message: string };\n\nexport const SYNC_FS_REQUEST_TIMEOUT_MS = 25_000;\n\nexport interface SyncFsBridgeStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink?: boolean;\n size: number;\n mode?: number;\n mtimeMs?: number;\n atimeMs?: number;\n ctimeMs?: number;\n ino?: number;\n}\n\nexport interface SyncFsPosixBridge {\n readFile(path: string): Uint8Array;\n writeFile(path: string, bytes: Uint8Array): void;\n stat(path: string): SyncFsBridgeStat;\n lstat(path: string): SyncFsBridgeStat;\n readdir(path: string): string[];\n exists(path: string): boolean;\n mkdir(path: string): void;\n rm(path: string): void;\n rename(from: string, to: string): void;\n unlink(path: string): void;\n rmdir(path: string): void;\n symlink(target: string, linkPath: string): void;\n readlink(path: string): string;\n chmod(path: string, mode: number): void;\n utimes(path: string, atimeMs: number, mtimeMs: number): void;\n readdirStat(path: string): Array<[string, SyncFsBridgeStat | null]>;\n}\n\nexport function syncError(code: string, label: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${label}`), { code });\n}\n\nexport function parseSyncFsStat(json: unknown): SyncFsBridgeStat | null {\n const s = json as Partial<SyncFsBridgeStat> | null;\n if (\n !s ||\n typeof s.isFile !== 'boolean' ||\n typeof s.isDirectory !== 'boolean' ||\n typeof s.size !== 'number'\n ) {\n return null;\n }\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n ...(typeof s.mode === 'number' ? { mode: s.mode } : {}),\n ...(typeof s.mtimeMs === 'number' ? { mtimeMs: s.mtimeMs } : {}),\n ...(typeof s.atimeMs === 'number' ? { atimeMs: s.atimeMs } : {}),\n ...(typeof s.ctimeMs === 'number' ? { ctimeMs: s.ctimeMs } : {}),\n ...(typeof s.ino === 'number' ? { ino: s.ino } : {}),\n };\n}\n", "import type { FsStat, KernelFs } from '../fs/types.ts';\nimport { resolveSyncFsToken } from './sync-fs-token-registry.ts';\nimport { type SyncFsRequest, type SyncFsResult, syncError } from './sync-fs-wire.ts';\n\nexport function toErrno(err: unknown): SyncFsResult {\n const message = err instanceof Error ? err.message : String(err);\n const code = (err as { code?: unknown })?.code;\n if (typeof code === 'string' && /^E[A-Z]+$/.test(code)) {\n return { ok: false, errno: code, message };\n }\n return { ok: false, errno: 'EIO', message };\n}\n\nexport interface SyncFsStatJson {\n isDirectory: boolean;\n isFile: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtimeMs: number;\n atimeMs: number;\n ctimeMs: number;\n ino: number;\n}\n\nfunction statJson(s: FsStat): SyncFsStatJson {\n return {\n isDirectory: s.isDirectory,\n isFile: s.isFile,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mode: s.mode,\n mtimeMs: s.mtime.getTime(),\n atimeMs: s.atime.getTime(),\n ctimeMs: s.ctime.getTime(),\n ino: s.ino,\n };\n}\n\nasync function readdirStat(\n fs: KernelFs,\n dir: string\n): Promise<Array<[string, SyncFsStatJson | null]>> {\n return (await fs.readdirStat(dir)).map(([name, stat]) => [name, stat && statJson(stat)]);\n}\n\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nfunction json(value: unknown): SyncFsResult {\n return { ok: true, kind: 'json', json: value };\n}\n\nasync function run(\n fs: KernelFs,\n path: string,\n req: SyncFsRequest,\n cwd: string\n): Promise<SyncFsResult> {\n switch (req.op) {\n case 'read':\n return { ok: true, kind: 'bytes', bytes: await fs.readFileBuffer(path) };\n case 'write':\n await fs.writeFile(path, req.body ?? new Uint8Array(0));\n return done;\n case 'exists':\n return json(await fs.exists(path));\n case 'stat':\n return json(statJson(await fs.stat(path)));\n case 'lstat':\n return json(statJson(await fs.lstat(path)));\n case 'readdir':\n return json(await fs.readdir(path));\n case 'readdir-stat':\n return json(await readdirStat(fs, path));\n case 'mkdir':\n await fs.mkdir(path, { recursive: true });\n return done;\n case 'rm':\n await fs.rm(path, { recursive: true });\n return done;\n case 'rename':\n await fs.rename(path, fs.resolvePath(cwd, req.arg2 ?? ''));\n return done;\n case 'unlink':\n if ((await fs.lstat(path)).isDirectory) throw syncError('EISDIR', path);\n await fs.rm(path);\n return done;\n case 'rmdir':\n if (!(await fs.lstat(path)).isDirectory) throw syncError('ENOTDIR', path);\n if ((await fs.readdir(path)).length > 0) throw syncError('ENOTEMPTY', path);\n await fs.rm(path, { recursive: true });\n return done;\n case 'symlink':\n await fs.symlink(req.arg2 ?? '', path);\n return done;\n case 'readlink':\n return json(await fs.readlink(path));\n case 'chmod':\n await fs.chmod(path, req.mode ?? 0);\n return done;\n case 'utimes':\n await fs.utimes(path, new Date(req.atimeMs ?? 0), new Date(req.mtimeMs ?? 0));\n return done;\n default:\n return { ok: false, errno: 'EINVAL', message: `sync-fs: unknown op '${req.op as string}'` };\n }\n}\n\nexport async function dispatchSyncFs(req: SyncFsRequest): Promise<SyncFsResult> {\n const entry = resolveSyncFsToken(req.token);\n if (!entry) return { ok: false, errno: 'EACCES', message: 'sync-fs: unknown or revoked token' };\n const { fs, cwd } = entry;\n try {\n return await run(fs, fs.resolvePath(cwd, req.path), req, cwd);\n } catch (err) {\n return toErrno(err);\n }\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport type { SyncFsRequest, SyncFsResult } from './sync-fs-wire.ts';\n\nexport const SAB_HEADER_I32 = 16;\nexport const SAB_HEADER_BYTES = SAB_HEADER_I32 * 4;\n\nexport const SAB_I_STATE = 0;\nexport const SAB_I_SEQ = 1;\nexport const SAB_I_STATUS = 2;\nexport const SAB_I_TOTAL = 3;\nexport const SAB_I_CHUNK = 4;\nexport const SAB_I_OFFSET = 5;\nexport const SAB_I_REQ = 6;\nexport const SAB_I_PUB = 7;\n\nexport const SAB_I_SIGNALS = 8;\n\nexport const SAB_I_TIMERS = 9;\n\nexport const SAB_STATE_IDLE = 0;\nexport const SAB_STATE_PENDING = 1;\nexport const SAB_STATE_READY = 2;\n\nexport const SAB_STATUS_BYTES = 1;\nexport const SAB_STATUS_JSON = 2;\nexport const SAB_STATUS_VOID = 3;\nexport const SAB_STATUS_ERRNO = 4;\n\nexport const SAB_DEFAULT_WINDOW_BYTES = 1024 * 1024;\n\nexport const SAB_MIN_BYTES = SAB_HEADER_BYTES + 4096;\n\nexport const SYNC_SAB_REQ_MSG = 'sync-sab-req';\n\nexport const SYNC_SAB_NEXT_MSG = 'sync-sab-next';\n\nexport type SyncSabRequestBody = Omit<SyncFsRequest, 'token'> | WasmSyscall;\n\nexport interface SyncSabReqMsg {\n type: typeof SYNC_SAB_REQ_MSG;\n id: number;\n req: SyncSabRequestBody;\n}\nexport interface SyncSabNextMsg {\n type: typeof SYNC_SAB_NEXT_MSG;\n id: number;\n offset: number;\n}\n\nexport interface SabEncodedResult {\n status: number;\n payload: Uint8Array;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function encodeSabResult(result: SyncFsResult): SabEncodedResult {\n if (!result.ok) {\n return {\n status: SAB_STATUS_ERRNO,\n payload: encoder.encode(JSON.stringify({ errno: result.errno, message: result.message })),\n };\n }\n switch (result.kind) {\n case 'bytes':\n return { status: SAB_STATUS_BYTES, payload: result.bytes };\n case 'json':\n return { status: SAB_STATUS_JSON, payload: encoder.encode(JSON.stringify(result.json)) };\n default:\n return { status: SAB_STATUS_VOID, payload: new Uint8Array(0) };\n }\n}\n\nexport function decodeSabResult(status: number, payload: Uint8Array): SyncFsResult {\n switch (status) {\n case SAB_STATUS_BYTES:\n return { ok: true, kind: 'bytes', bytes: payload };\n case SAB_STATUS_VOID:\n return { ok: true, kind: 'void' };\n case SAB_STATUS_JSON: {\n try {\n return { ok: true, kind: 'json', json: JSON.parse(decoder.decode(payload)) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed json payload' };\n }\n }\n case SAB_STATUS_ERRNO: {\n try {\n const parsed = JSON.parse(decoder.decode(payload)) as {\n errno?: unknown;\n message?: unknown;\n };\n const errno =\n typeof parsed.errno === 'string' && /^E[A-Z]+$/.test(parsed.errno) ? parsed.errno : 'EIO';\n return { ok: false, errno, message: String(parsed.message ?? errno) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed errno payload' };\n }\n }\n default:\n return { ok: false, errno: 'EIO', message: `sync-sab: unknown status ${status}` };\n }\n}\n\nexport interface SabViews {\n header: Int32Array;\n window: Uint8Array;\n}\n\nexport function sabViews(sab: SharedArrayBuffer): SabViews {\n if (sab.byteLength < SAB_MIN_BYTES) {\n throw new Error(`sync-sab: buffer too small (${sab.byteLength} < ${SAB_MIN_BYTES})`);\n }\n return {\n header: new Int32Array(sab, 0, SAB_HEADER_I32),\n window: new Uint8Array(sab, SAB_HEADER_BYTES),\n };\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport {\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsRequest,\n type SyncFsResult,\n} from './sync-fs-wire.ts';\nimport {\n encodeSabResult,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_PUB,\n SAB_I_REQ,\n SAB_I_SEQ,\n SAB_I_STATE,\n SAB_I_STATUS,\n SAB_I_TOTAL,\n SAB_STATE_READY,\n type SabViews,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabNextMsg,\n type SyncSabReqMsg,\n sabViews,\n} from './sync-sab-wire.ts';\n\nexport interface SabPortLike {\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface SyncSabResponderHandle {\n dispose(): void;\n}\n\ninterface PendingPayload {\n status: number;\n payload: Uint8Array;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst PENDING_TTL_MS = SYNC_FS_REQUEST_TIMEOUT_MS + 5_000;\n\nexport type SyncSabDispatchRequest = SyncFsRequest | (WasmSyscall & { token: string });\n\nexport interface SyncSabResponderOptions {\n dispatch: (req: SyncSabDispatchRequest) => Promise<SyncFsResult>;\n}\n\nexport function attachSyncSabResponder(\n port: SabPortLike,\n sab: SharedArrayBuffer,\n token: string,\n opts: SyncSabResponderOptions\n): SyncSabResponderHandle {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const pending = new Map<number, PendingPayload>();\n let disposed = false;\n\n const { dispatch } = opts;\n\n function drop(id: number): void {\n const entry = pending.get(id);\n if (!entry) return;\n clearTimeout(entry.timer);\n pending.delete(id);\n }\n\n function publish(id: number, entry: PendingPayload, offset: number): void {\n if (Atomics.load(header, SAB_I_REQ) !== id) {\n drop(id);\n return;\n }\n const chunk = Math.min(window.byteLength, entry.payload.byteLength - offset);\n if (chunk > 0) window.set(entry.payload.subarray(offset, offset + chunk));\n Atomics.store(header, SAB_I_STATUS, entry.status);\n Atomics.store(header, SAB_I_TOTAL, entry.payload.byteLength);\n Atomics.store(header, SAB_I_CHUNK, chunk);\n Atomics.store(header, SAB_I_OFFSET, offset);\n Atomics.store(header, SAB_I_SEQ, id);\n Atomics.store(header, SAB_I_STATE, SAB_STATE_READY);\n Atomics.add(header, SAB_I_PUB, 1);\n Atomics.notify(header, SAB_I_PUB);\n\n if (offset + chunk >= entry.payload.byteLength) drop(id);\n }\n\n function settle(id: number, result: SyncFsResult): void {\n if (disposed) return;\n const { status, payload } = encodeSabResult(result);\n\n drop(id);\n const entry: PendingPayload = {\n status,\n payload,\n timer: setTimeout(() => drop(id), PENDING_TTL_MS),\n };\n pending.set(id, entry);\n publish(id, entry, 0);\n }\n\n const handler = (event: MessageEvent): void => {\n const data = event.data as\n | { type?: unknown; id?: unknown; req?: unknown; offset?: unknown }\n | undefined;\n if (!data || typeof data.id !== 'number') return;\n if (data.type === SYNC_SAB_NEXT_MSG) {\n const entry = pending.get(data.id);\n const offset = (data as Partial<SyncSabNextMsg>).offset;\n if (\n !entry ||\n typeof offset !== 'number' ||\n !Number.isInteger(offset) ||\n offset < 0 ||\n offset > entry.payload.byteLength\n ) {\n settle(data.id, { ok: false, errno: 'EIO', message: 'sync-sab: bad continuation' });\n return;\n }\n publish(data.id, entry, offset);\n return;\n }\n if (data.type !== SYNC_SAB_REQ_MSG || !data.req || typeof data.req !== 'object') return;\n const id = data.id;\n\n const body = (data as SyncSabReqMsg).req;\n const req = { ...body, token } as SyncSabDispatchRequest;\n let dispatched: Promise<SyncFsResult>;\n try {\n dispatched = dispatch(req);\n } catch (err) {\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n void dispatched.then(\n (result) => settle(id, result),\n (err) =>\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n })\n );\n };\n\n port.addEventListener('message', handler);\n return {\n dispose: () => {\n if (disposed) return;\n disposed = true;\n port.removeEventListener('message', handler);\n for (const id of [...pending.keys()]) drop(id);\n },\n };\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { KernelError } from './fd-table.ts';\n\nexport type HostSyscall =\n | { op: 'lock'; path: string; exclusive: boolean; fd: number }\n | { op: 'unlock'; path: string }\n | { op: 'async-submit'; req: { op: string } }\n | { op: 'async-wait'; timeoutMs?: number }\n | { op: 'async-take'; id: number }\n | { op: 'async-resolve'; value: unknown }\n | { op: 'async-hold' }\n | { op: 'async-cancel'; id: number }\n | { op: 'async-close' };\n\nexport const HOST_OPS: readonly HostSyscall['op'][] = [\n 'lock',\n 'unlock',\n 'async-submit',\n 'async-wait',\n 'async-take',\n 'async-resolve',\n 'async-hold',\n 'async-cancel',\n 'async-close',\n];\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\ninterface Holder {\n exclusive: boolean;\n fds: Set<number>;\n}\n\nexport class LockTable {\n private readonly held = new Map<string, Map<number, Holder>>();\n\n lock(pid: number, path: string, exclusive: boolean, fd: number): boolean {\n const holders = this.held.get(path) ?? new Map<number, Holder>();\n for (const [other, h] of holders) if (other !== pid && (exclusive || h.exclusive)) return false;\n const mine = holders.get(pid) ?? { exclusive, fds: new Set<number>() };\n mine.exclusive = exclusive;\n mine.fds.add(fd);\n holders.set(pid, mine);\n this.held.set(path, holders);\n return true;\n }\n\n unlock(pid: number, path: string): void {\n const holders = this.held.get(path);\n holders?.delete(pid);\n if (holders?.size === 0) this.held.delete(path);\n }\n\n closed(pid: number, fd: number): void {\n for (const [path, holders] of [...this.held]) {\n const mine = holders.get(pid);\n if (mine?.fds.delete(fd) && mine.fds.size === 0) this.unlock(pid, path);\n }\n }\n\n release(pid: number): void {\n for (const path of [...this.held.keys()]) this.unlock(pid, path);\n }\n}\n\ntype Run = (req: { op: string }) => Promise<SyncFsResult>;\n\nexport class AsyncOps {\n private next = 1;\n private readonly results = new Map<number, SyncFsResult | undefined>();\n private readonly ready: number[] = [];\n private readonly waiters = new Set<() => void>();\n private closed = false;\n private readonly run: Run;\n\n constructor(run: Run) {\n this.run = run;\n }\n\n submit(req: { op: string }): number {\n const id = this.hold();\n this.run(req).then(\n (result) => this.complete(id, result),\n (err: unknown) => this.complete(id, { ok: false, errno: 'EIO', message: String(err) })\n );\n return id;\n }\n\n resolve(value: unknown): number {\n const id = this.hold();\n this.complete(id, json(value));\n return id;\n }\n\n hold(): number {\n const id = this.next++;\n this.results.set(id, undefined);\n return id;\n }\n\n take(id: number): SyncFsResult {\n if (!this.results.has(id)) throw new KernelError('EINVAL');\n const result = this.results.get(id);\n if (!result) throw new KernelError('EAGAIN');\n this.cancel(id);\n return result;\n }\n\n cancel(id: number): void {\n this.results.delete(id);\n const at = this.ready.indexOf(id);\n if (at >= 0) this.ready.splice(at, 1);\n }\n\n async wait(timeoutMs: number | undefined, signal: AbortSignal): Promise<number> {\n for (;;) {\n if (this.closed) return -1;\n const id = this.ready.shift();\n if (id !== undefined) return id;\n if (timeoutMs !== undefined && timeoutMs <= 0) return 0;\n const woke = await this.sleep(timeoutMs, signal);\n if (!woke) return 0;\n }\n }\n\n close(): void {\n this.closed = true;\n this.wake();\n }\n\n private sleep(timeoutMs: number | undefined, signal: AbortSignal): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cleanup = () => {\n clearTimeout(timer);\n this.waiters.delete(wake);\n signal.removeEventListener('abort', abort);\n };\n const wake = () => {\n cleanup();\n resolve(true);\n };\n const abort = () => {\n cleanup();\n reject(new KernelError('EINTR'));\n };\n this.waiters.add(wake);\n signal.addEventListener('abort', abort, { once: true });\n if (timeoutMs !== undefined) {\n timer = setTimeout(() => {\n cleanup();\n resolve(false);\n }, timeoutMs);\n }\n });\n }\n\n private complete(id: number, result: SyncFsResult): void {\n if (!this.results.has(id)) return;\n this.results.set(id, result);\n this.ready.push(id);\n this.wake();\n }\n\n private wake(): void {\n for (const wake of [...this.waiters]) wake();\n }\n}\n\nexport interface HostOpsContext {\n pid: number;\n locks: LockTable | undefined;\n ops: AsyncOps;\n blocking: () => AbortSignal;\n valid: (req: { op: string }) => boolean;\n}\n\nexport async function hostSyscall(req: HostSyscall, ctx: HostOpsContext): Promise<SyncFsResult> {\n switch (req.op) {\n case 'lock':\n if (!ctx.locks) throw new KernelError('ENOSYS');\n if (!ctx.locks.lock(ctx.pid, req.path, req.exclusive, req.fd))\n throw new KernelError('EAGAIN');\n return done;\n case 'unlock':\n ctx.locks?.unlock(ctx.pid, req.path);\n return done;\n case 'async-submit':\n if (!ctx.valid(req.req)) throw new KernelError('EINVAL');\n return json(ctx.ops.submit(req.req));\n case 'async-wait':\n return json(await ctx.ops.wait(req.timeoutMs, ctx.blocking()));\n case 'async-take':\n return ctx.ops.take(req.id);\n case 'async-resolve':\n return json(ctx.ops.resolve(req.value));\n case 'async-hold':\n return json(ctx.ops.hold());\n case 'async-cancel':\n ctx.ops.cancel(req.id);\n return done;\n case 'async-close':\n ctx.ops.close();\n return done;\n }\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport { NO_TRANSPORT } from './network.ts';\nimport type { HeaderList, RealmTransport } from './transport.ts';\n\nexport type HttpSyscall =\n | {\n op: 'net-request';\n url: string;\n method: string;\n headers: HeaderList;\n body?: Uint8Array;\n }\n | { op: 'net-read'; handle: number; max: number }\n | { op: 'net-close'; handle: number }\n | { op: 'net-traits' };\n\nexport const HTTP_OPS: readonly string[] = ['net-request', 'net-read', 'net-close', 'net-traits'];\n\nexport interface HttpHead {\n handle: number;\n status: number;\n statusText: string;\n url: string;\n headers: HeaderList;\n}\n\ninterface Open {\n abort: AbortController;\n body: AsyncIterator<Uint8Array>;\n left: Uint8Array;\n done: boolean;\n reading: Promise<void>;\n cancel(): Promise<void>;\n}\n\nconst EMPTY = new Uint8Array(0);\n\nfunction message(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\nasync function* once(bytes: Uint8Array): AsyncGenerator<Uint8Array> {\n yield bytes;\n}\n\nexport class HttpHandles {\n private readonly transport: RealmTransport;\n\n private readonly open = new Map<number, Open>();\n\n private nextHandle = 0;\n\n constructor(transport: RealmTransport) {\n this.transport = transport;\n }\n\n syscall(req: HttpSyscall): Promise<SyncFsResult> {\n if (req.op === 'net-request') return this.request(req);\n if (req.op === 'net-read') return this.read(req.handle, req.max);\n if (req.op === 'net-traits') return Promise.resolve(this.traits());\n return this.close(req.handle);\n }\n\n private traits(): SyncFsResult {\n const { unavailable, crossOrigin = 'any', ...rest } = this.transport.traits;\n if (unavailable) return { ok: false, errno: 'ENETUNREACH', message: NO_TRANSPORT };\n return { ok: true, kind: 'json', json: { ...rest, crossOrigin } };\n }\n\n private add(\n abort: AbortController,\n body: AsyncIterable<Uint8Array>,\n cancel: () => Promise<void>\n ) {\n const handle = ++this.nextHandle;\n this.open.set(handle, {\n abort,\n body: body[Symbol.asyncIterator](),\n left: EMPTY,\n done: false,\n reading: Promise.resolve(),\n cancel,\n });\n return handle;\n }\n\n private async request(req: Extract<HttpSyscall, { op: 'net-request' }>): Promise<SyncFsResult> {\n const abort = new AbortController();\n try {\n const response = await this.transport.fetch({\n url: req.url,\n method: req.method,\n headers: req.headers,\n ...(req.body ? { body: req.body } : {}),\n signal: abort.signal,\n });\n const handle = this.add(abort, response.body, () => response.cancel());\n const head: HttpHead = {\n handle,\n status: response.status,\n statusText: response.statusText,\n url: req.url,\n headers: response.headers,\n };\n return { ok: true, kind: 'json', json: head };\n } catch (e) {\n const text = message(e);\n if (text === NO_TRANSPORT) return { ok: false, errno: 'ENETUNREACH', message: text };\n const status = (e as { status?: unknown }).status;\n if (typeof status !== 'number' || status === 502) {\n return { ok: false, errno: 'ECONNREFUSED', message: text };\n }\n const body = new TextEncoder().encode(text);\n const handle = this.add(abort, once(body), async () => undefined);\n const head: HttpHead = {\n handle,\n status,\n statusText: '',\n url: req.url,\n headers: [['content-type', 'text/plain; charset=utf-8']],\n };\n return { ok: true, kind: 'json', json: head };\n }\n }\n\n private async read(handle: number, max: number): Promise<SyncFsResult> {\n const entry = this.open.get(handle);\n if (!entry) return { ok: false, errno: 'EBADF', message: `no request ${handle}` };\n const turn = entry.reading.then(() => this.take(entry, max));\n entry.reading = turn.then(() => undefined);\n return turn;\n }\n\n private async take(entry: Open, max: number): Promise<SyncFsResult> {\n if (entry.left.length === 0 && !entry.done) {\n try {\n const next = await entry.body.next();\n if (next.done) entry.done = true;\n else entry.left = next.value;\n } catch (e) {\n entry.done = true;\n const timedOut = (e as { code?: unknown } | null)?.code === 'ETIMEDOUT';\n return { ok: false, errno: timedOut ? 'ETIMEDOUT' : 'EIO', message: message(e) };\n }\n }\n const bytes = entry.left.subarray(0, Math.max(0, max));\n entry.left = entry.left.subarray(bytes.length);\n return { ok: true, kind: 'bytes', bytes };\n }\n\n private async close(handle: number): Promise<SyncFsResult> {\n const entry = this.open.get(handle);\n if (!entry) return { ok: false, errno: 'EBADF', message: `no request ${handle}` };\n this.open.delete(handle);\n entry.abort.abort();\n await entry.cancel().catch(() => undefined);\n return { ok: true, kind: 'void' };\n }\n\n async closeAll(): Promise<void> {\n await Promise.all([...this.open.keys()].map((handle) => this.close(handle)));\n }\n}\n", "import { KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport { SIG } from './signals.ts';\n\nexport interface Termios {\n c_iflag: number;\n c_oflag: number;\n c_cflag: number;\n c_lflag: number;\n c_cc: number[];\n}\n\nexport interface TtyScreen {\n write(bytes: Uint8Array): void;\n}\n\nconst ICRNL = 0o400;\nconst IUTF8 = 0o40000;\nconst OPOST = 0o1;\nconst ONLCR = 0o4;\nconst ISIG = 0o1;\nconst ICANON = 0o2;\nconst ECHO = 0o10;\nconst ECHOE = 0o20;\nconst ECHOCTL = 0o1000;\nconst NOFLSH = 0o200;\nconst IEXTEN = 0o100000;\nconst VINTR = 0;\nconst VQUIT = 1;\nconst VERASE = 2;\nconst VKILL = 3;\nconst VEOF = 4;\nconst VSUSP = 10;\nconst VWERASE = 14;\n\nexport function defaultTermios(): Termios {\n const cCc = new Array<number>(32).fill(0);\n Object.assign(cCc, { [VINTR]: 0x03, [VQUIT]: 0x1c, [VERASE]: 0x7f, [VKILL]: 0x15 });\n Object.assign(cCc, { [VEOF]: 0x04, 6: 1, 8: 0x11, 9: 0x13, [VSUSP]: 0x1a });\n Object.assign(cCc, { 12: 0x12, 13: 0x0f, [VWERASE]: 0x17, 15: 0x16 });\n return {\n c_iflag: ICRNL | 0o2000 | 0o20000 | IUTF8,\n c_oflag: OPOST | ONLCR,\n c_cflag: 0o17 | 0o60 | 0o200,\n c_lflag: ISIG | ICANON | ECHO | ECHOE | 0o40 | ECHOCTL | 0o4000 | IEXTEN,\n c_cc: cCc,\n };\n}\n\nconst encoder = new TextEncoder();\n\nfunction isContinuation(byte: number): boolean {\n return (byte & 0xc0) === 0x80;\n}\n\nexport class KernelTty {\n private termios = defaultTermios();\n private cols = 80;\n private rows = 24;\n\n private readable: Array<Uint8Array | null> = [];\n\n private line: number[] = [];\n private waiters: Array<() => void> = [];\n\n private hungUp = false;\n\n name?: string;\n\n private readonly screen: TtyScreen;\n\n private readonly signal: (sig: number) => void;\n\n constructor(\n screen: TtyScreen,\n\n signal: (sig: number) => void\n ) {\n this.screen = screen;\n\n this.signal = signal;\n }\n\n receive(bytes: Uint8Array): void {\n for (const byte of bytes) this.key(byte);\n this.wake();\n }\n\n resize(cols: number, rows: number): void {\n this.setSize(cols, rows);\n this.signal(SIG.WINCH);\n }\n\n hangup(): void {\n this.hungUp = true;\n this.wake();\n }\n\n signalHangup(): void {\n this.signal(SIG.HUP);\n }\n\n setSize(cols: number, rows: number): void {\n this.cols = cols;\n this.rows = rows;\n }\n\n tcgets(): Termios {\n return { ...this.termios, c_cc: [...this.termios.c_cc] };\n }\n\n tcsets(termios: Termios): void {\n const wasCanonical = this.canonical;\n this.termios = { ...termios, c_cc: [...termios.c_cc] };\n\n if (wasCanonical && !this.canonical && this.line.length > 0) {\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n this.wake();\n }\n }\n\n winsize(): [number, number] {\n return [this.rows, this.cols];\n }\n\n file(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.read(max, signal),\n write: async (bytes) => {\n if (this.hungUp) throw new KernelError('EIO');\n this.output(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.readable.length > 0 || this.hungUp,\n writable: true,\n hangup: this.hungUp,\n }),\n changed: (signal) => this.changed(signal),\n close: () => {},\n tty: this,\n });\n }\n\n private get canonical(): boolean {\n return (this.termios.c_lflag & ICANON) !== 0;\n }\n\n private cc(slot: number): number {\n return this.termios.c_cc[slot] ?? 0;\n }\n\n private key(input: number): void {\n const { c_iflag, c_lflag } = this.termios;\n const byte = input === 0x0d && c_iflag & ICRNL ? 0x0a : input;\n if (c_lflag & ISIG && this.signalKey(byte)) return;\n if (!this.canonical) {\n this.readable.push(Uint8Array.of(byte));\n if (c_lflag & ECHO) this.echo(byte);\n return;\n }\n this.edit(byte);\n }\n\n private signalKey(byte: number): boolean {\n const sig =\n byte === this.cc(VINTR)\n ? SIG.INT\n : byte === this.cc(VQUIT)\n ? SIG.QUIT\n : byte === this.cc(VSUSP)\n ? SIG.TSTP\n : 0;\n if (!sig || byte === 0) return false;\n if (this.termios.c_lflag & ECHO) this.echo(byte);\n if (!(this.termios.c_lflag & NOFLSH)) {\n this.line = [];\n this.readable = [];\n }\n this.signal(sig);\n return true;\n }\n\n private edit(byte: number): void {\n const echo = (this.termios.c_lflag & ECHO) !== 0;\n if (byte === this.cc(VERASE) || byte === 0x08) {\n this.rubOut(this.lastCharLength());\n } else if (byte === this.cc(VKILL)) {\n this.rubOut(this.line.length);\n } else if (byte === this.cc(VWERASE)) {\n this.rubOut(this.lastWordLength());\n } else if (byte === this.cc(VEOF)) {\n this.readable.push(this.line.length > 0 ? Uint8Array.from(this.line) : null);\n this.line = [];\n } else if (byte === 0x0a) {\n this.line.push(byte);\n if (echo) this.output(encoder.encode('\\n'));\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n } else {\n this.line.push(byte);\n if (echo) this.echo(byte);\n }\n }\n\n private lastWordLength(): number {\n let end = this.line.length;\n while (end > 0 && this.line[end - 1] === 0x20) end--;\n while (end > 0 && this.line[end - 1] !== 0x20) end--;\n return this.line.length - end;\n }\n\n private lastCharLength(): number {\n const { line } = this;\n let n = Math.min(1, line.length);\n if (this.termios.c_iflag & IUTF8) {\n while (n < line.length && isContinuation(line[line.length - n] ?? 0)) n++;\n }\n return n;\n }\n\n private rubOut(n: number): void {\n const dropped = this.line.splice(this.line.length - n, n);\n const utf8 = (this.termios.c_iflag & IUTF8) !== 0;\n const cells = utf8 ? dropped.filter((b) => !isContinuation(b)).length : dropped.length;\n if (cells > 0 && this.termios.c_lflag & ECHO) {\n this.output(encoder.encode('\\b \\b'.repeat(cells)), false);\n }\n }\n\n private echo(byte: number): void {\n if (byte < 0x20 && byte !== 0x0a && byte !== 0x09 && this.termios.c_lflag & ECHOCTL) {\n this.output(Uint8Array.of(0x5e, byte + 0x40), false);\n return;\n }\n this.output(Uint8Array.of(byte));\n }\n\n private output(bytes: Uint8Array, translate = true): void {\n const { c_oflag } = this.termios;\n if (!translate || !(c_oflag & OPOST && c_oflag & ONLCR) || !bytes.includes(0x0a)) {\n this.screen.write(bytes);\n return;\n }\n const out: number[] = [];\n for (const byte of bytes) {\n if (byte === 0x0a) out.push(0x0d);\n out.push(byte);\n }\n this.screen.write(Uint8Array.from(out));\n }\n\n private async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.readable.length === 0) {\n if (this.hungUp) return new Uint8Array(0);\n await this.changed(signal);\n }\n const head = this.readable[0];\n if (head === null) {\n this.readable.shift();\n return new Uint8Array(0);\n }\n if (head === undefined) return new Uint8Array(0);\n\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.readable.length > 0 && n < max) {\n const next = this.readable[0];\n if (next === null || next === undefined) break;\n const take = next.subarray(0, max - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.readable[0] = next.subarray(take.length);\n else this.readable.shift();\n if (this.canonical) break;\n }\n const out = new Uint8Array(n);\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 changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('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 { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport { KernelTty } from './tty.ts';\n\nexport type PtySignal = (tty: KernelTty, sig: number) => void;\n\nexport class PtyPair {\n readonly slave: KernelTty;\n\n locked = true;\n\n packet = false;\n private queue: Uint8Array[] = [];\n private waiters: Array<() => void> = [];\n private masterOpen = true;\n private slaveRefs = 0;\n private slaveSeen = false;\n\n readonly index: number;\n\n private readonly onFree: (pair: PtyPair) => void;\n\n constructor(\n index: number,\n\n signal: PtySignal,\n\n onFree: (pair: PtyPair) => void\n ) {\n this.index = index;\n\n this.onFree = onFree;\n this.slave = new KernelTty({ write: (bytes) => this.fromSlave(bytes) }, (sig) =>\n signal(this.slave, sig)\n );\n this.slave.name = `/dev/pts/${index}`;\n }\n\n master(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.readMaster(max, signal),\n write: async (bytes) => {\n this.slave.receive(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.queue.length > 0 || this.slaveGone,\n writable: true,\n hangup: this.slaveGone,\n }),\n changed: (signal) => this.changed(signal),\n close: () => this.closeMaster(),\n pty: this,\n });\n }\n\n openSlave(): OpenFile {\n if (!this.masterOpen || this.locked) throw new KernelError('EIO');\n const file = this.slave.file().file;\n this.slaveRefs += 1;\n this.slaveSeen = true;\n return new OpenFile({ ...file, close: () => this.closeSlave() });\n }\n\n private get slaveGone(): boolean {\n return this.slaveSeen && this.slaveRefs === 0;\n }\n\n private fromSlave(bytes: Uint8Array): void {\n if (!this.masterOpen) return;\n this.queue.push(bytes.slice());\n this.wake();\n }\n\n private async readMaster(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.queue.length === 0) {\n if (this.slaveGone) throw new KernelError('EIO');\n await this.changed(signal);\n }\n\n const status = this.packet ? 1 : 0;\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.queue.length > 0 && n < max - status) {\n const next = this.queue[0] as Uint8Array;\n const take = next.subarray(0, max - status - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.queue[0] = next.subarray(take.length);\n else this.queue.shift();\n }\n const out = new Uint8Array(status + n);\n let at = status;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private closeMaster(): void {\n this.masterOpen = false;\n this.queue = [];\n\n this.slave.hangup();\n this.slave.signalHangup();\n this.freeIfUnused();\n }\n\n private closeSlave(): void {\n this.slaveRefs -= 1;\n this.wake();\n this.freeIfUnused();\n }\n\n private freeIfUnused(): void {\n if (!this.masterOpen && this.slaveRefs === 0) this.onFree(this);\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('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\nexport class PtyTable {\n private readonly pairs = new Map<number, PtyPair>();\n\n private readonly signal: PtySignal;\n\n constructor(signal: PtySignal) {\n this.signal = signal;\n }\n\n open(): { pair: PtyPair; master: OpenFile } {\n let index = 0;\n while (this.pairs.has(index)) index += 1;\n const pair = new PtyPair(index, this.signal, (p) => this.pairs.delete(p.index));\n this.pairs.set(index, pair);\n return { pair, master: pair.master() };\n }\n\n get(index: number): PtyPair {\n const pair = this.pairs.get(index);\n if (!pair) throw new KernelError('ENOENT');\n return pair;\n }\n\n numbers(): number[] {\n return [...this.pairs.keys()].sort((a, b) => a - b);\n }\n}\n\nexport function ptsNumber(path: string): number | undefined {\n const m = /^\\/dev\\/pts\\/(\\d+)$/.exec(path);\n return m ? Number(m[1]) : undefined;\n}\n\nexport type PtySyscall =\n | { op: 'pty-open' }\n | { op: 'pty-slave-open'; n: number; noctty: boolean }\n | { op: 'pty-number'; fd: number }\n | { op: 'pty-lock'; fd: number; lock: boolean }\n | { op: 'pty-ctty'; fd: number }\n | { op: 'pty-packet'; fd: number; on: boolean }\n | { op: 'pty-list' }\n | { op: 'pty-winsz-set'; fd: number; rows: number; cols: number };\n\nexport const PTY_OPS: readonly PtySyscall['op'][] = [\n 'pty-open',\n 'pty-slave-open',\n 'pty-number',\n 'pty-lock',\n 'pty-ctty',\n 'pty-packet',\n 'pty-list',\n 'pty-winsz-set',\n];\n\nexport interface PtyContext {\n pid: number;\n fds: FdTable;\n ptys?: PtyTable;\n jobs?: JobTable;\n}\n\nfunction masterOf(ctx: PtyContext, fd: number): PtyPair {\n const pair = ctx.fds.get(fd).file.pty;\n if (!pair) throw new KernelError('ENOTTY');\n return pair;\n}\n\nfunction terminalOf(ctx: PtyContext, fd: number): KernelTty {\n const file = ctx.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n}\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nexport function ptySyscall(req: PtySyscall, ctx: PtyContext): SyncFsResult {\n switch (req.op) {\n case 'pty-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n return json(ctx.fds.install(ctx.ptys.open().master, 3));\n }\n case 'pty-slave-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n const pair = ctx.ptys.get(req.n);\n const fd = ctx.fds.install(pair.openSlave(), 3);\n\n if (!req.noctty) ctx.jobs?.acquireTerminal(ctx.pid, pair.slave);\n return json(fd);\n }\n case 'pty-number':\n return json(masterOf(ctx, req.fd).index);\n case 'pty-lock':\n masterOf(ctx, req.fd).locked = req.lock;\n return done;\n case 'pty-ctty': {\n const tty = terminalOf(ctx, req.fd);\n\n const leader = ctx.jobs?.getsid(ctx.pid, 0) === ctx.pid;\n if (leader && ctx.jobs?.controllingTerminal(ctx.pid) === tty) return done;\n if (!ctx.jobs?.acquireTerminal(ctx.pid, tty)) throw new KernelError('EPERM');\n return done;\n }\n case 'pty-list':\n return json(ctx.ptys?.numbers() ?? []);\n case 'pty-packet':\n masterOf(ctx, req.fd).packet = req.on;\n return done;\n case 'pty-winsz-set':\n terminalOf(ctx, req.fd).resize(req.cols, req.rows);\n return done;\n }\n}\n", "import { type FdTable, KernelError, pollFile } from './fd-table.ts';\n\nexport interface SelectResult {\n read: number[];\n write: number[];\n\n hangup?: number[];\n}\n\nfunction ready(fds: FdTable, read: readonly number[], write: readonly number[]): SelectResult {\n const hangup = new Set<number>();\n const pick = (list: readonly number[], dir: 'readable' | 'writable') =>\n list.filter((fd) => {\n const state = pollFile(fds.get(fd).file);\n if (state.hangup) hangup.add(fd);\n return state[dir] || state.hangup;\n });\n const out: SelectResult = { read: pick(read, 'readable'), write: pick(write, 'writable') };\n if (hangup.size > 0) out.hangup = [...hangup];\n return out;\n}\n\nfunction interruption(signal: AbortSignal): { promise: Promise<never>; done(): void } {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal.aborted) fail();\n else signal.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal.removeEventListener('abort', fail) };\n}\n\nexport async function selectFds(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n timeoutMs: number,\n interrupt: AbortSignal\n): Promise<SelectResult> {\n const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : Date.now() + timeoutMs;\n const interrupted = interruption(interrupt);\n interrupted.promise.catch(() => {});\n try {\n return await waitReady(fds, read, write, deadline, interrupted.promise);\n } finally {\n interrupted.done();\n }\n}\n\nasync function waitReady(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n deadline: number,\n interrupted: Promise<never>\n): Promise<SelectResult> {\n for (;;) {\n const now = ready(fds, read, write);\n if (now.read.length > 0 || now.write.length > 0 || Date.now() >= deadline) return now;\n\n const round = new AbortController();\n const changes = [...new Set([...read, ...write])].flatMap((fd) => {\n const file = fds.get(fd).file;\n return file.changed === undefined ? [] : [file.changed(round.signal).catch(() => undefined)];\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const expiry =\n deadline === Number.POSITIVE_INFINITY\n ? []\n : [new Promise<void>((resolve) => (timer = setTimeout(resolve, deadline - Date.now())))];\n try {\n await Promise.race([...changes, ...expiry, interrupted]);\n } finally {\n round.abort();\n clearTimeout(timer);\n }\n }\n}\n", "import { KernelError, type KernelFile, type PollState } from './fd-table.ts';\nimport { KernelPipe, PIPE_CAPACITY, PipeError } from './pipe.ts';\nexport type SockAddr =\n | {\n family: 'inet';\n host: string;\n port: number;\n }\n | {\n family: 'unix';\n path: string;\n };\nexport type SocketDomain = SockAddr['family'];\nconst SOMAXCONN = 4096;\nconst EPHEMERAL_FIRST = 32768;\nconst EPHEMERAL_LAST = 60999;\nconst SOL_SOCKET = 1;\nconst SO_TYPE = 3;\nconst SO_ERROR = 4;\nconst SO_SNDBUF = 7;\nconst SO_RCVBUF = 8;\nconst SO_ACCEPTCONN = 30;\nconst SO_DOMAIN = 39;\nconst SOCK_STREAM = 1;\nconst AF_UNIX = 1;\nconst AF_INET = 2;\nexport const SHUT_RD = 0;\nexport const SHUT_WR = 1;\nexport const SHUT_RDWR = 2;\nfunction isLoopback(host: string): boolean {\n return /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host);\n}\nasync function pipeCall<T>(op: () => Promise<T>): Promise<T> {\n try {\n return await op();\n } catch (e) {\n if (e instanceof PipeError) throw new KernelError(e.code);\n throw e;\n }\n}\nclass Changes {\n private waiters: Array<() => void> = [];\n wait(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('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 wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\ninterface Link {\n rx: KernelPipe;\n tx: KernelPipe;\n}\nfunction link(a: KernelSocket, b: KernelSocket): void {\n const ab = new KernelPipe();\n const ba = new KernelPipe();\n for (const pipe of [ab, ba]) {\n pipe.openRead();\n pipe.openWrite();\n }\n a.attach({ rx: ba, tx: ab });\n b.attach({ rx: ab, tx: ba });\n}\nexport class KernelSocket implements KernelFile {\n private readonly net: LoopbackNet;\n readonly domain: SocketDomain;\n private state: 'open' | 'listening' | 'connected' | 'closed' = 'open';\n local: SockAddr | undefined;\n peer: SockAddr | undefined;\n private link: Link | undefined;\n private readShut = false;\n private writeShut = false;\n private readonly queue: KernelSocket[] = [];\n private backlog = 0;\n private bound = false;\n private readonly changes = new Changes();\n private readonly options = new Map<string, number>();\n constructor(net: LoopbackNet, domain: SocketDomain) {\n this.net = net;\n this.domain = domain;\n }\n attach(link: Link): void {\n this.link = link;\n this.state = 'connected';\n this.changes.wake();\n }\n get listening(): boolean {\n return this.state === 'listening';\n }\n private connection(): Link {\n if (!this.link || this.state !== 'connected') throw new KernelError('ENOTCONN');\n return this.link;\n }\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n const { rx } = this.connection();\n if (this.readShut || max <= 0) return new Uint8Array(0);\n return pipeCall(() => rx.read(max, signal));\n }\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n const { rx } = this.connection();\n if (this.readShut || max <= 0) return new Uint8Array(0);\n return pipeCall(() => rx.peek(max, signal));\n }\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n const { tx } = this.connection();\n if (this.writeShut) throw new KernelError('EPIPE');\n return pipeCall(() => tx.write(bytes, signal));\n }\n poll(): PollState {\n if (this.state === 'listening') {\n return { readable: this.queue.length > 0, writable: false, hangup: false };\n }\n if (this.state !== 'connected' || !this.link) {\n return { readable: false, writable: false, hangup: true };\n }\n const { rx, tx } = this.link;\n return {\n readable: this.readShut || rx.readReady,\n writable: this.writeShut || tx.writeReady,\n hangup: rx.writersGone && tx.readersGone,\n };\n }\n changed(signal?: AbortSignal): Promise<void> {\n const own = this.changes.wait(signal);\n if (this.state !== 'connected' || !this.link) return own;\n const waits = [own, this.link.rx.changed(signal), this.link.tx.changed(signal)];\n for (const wait of waits) wait.catch(() => undefined);\n return pipeCall(() => Promise.race(waits));\n }\n bind(addr: SockAddr): void {\n if (this.state !== 'open' || this.local) throw new KernelError('EINVAL');\n if (addr.family !== this.domain) throw new KernelError('EAFNOSUPPORT');\n this.local = this.net.bind(this, addr);\n this.bound = true;\n }\n listen(backlog: number): void {\n if (this.state === 'connected') throw new KernelError('EISCONN');\n if (this.state !== 'open' && this.state !== 'listening') throw new KernelError('EINVAL');\n if (!this.local) {\n if (this.domain === 'unix') throw new KernelError('EINVAL');\n this.bind({ family: 'inet', host: '0.0.0.0', port: 0 });\n }\n this.backlog = Math.min(Math.max(backlog, 1), SOMAXCONN);\n this.state = 'listening';\n }\n async accept(signal?: AbortSignal, nonblock = false): Promise<KernelSocket> {\n for (;;) {\n if (this.state !== 'listening') throw new KernelError('EINVAL');\n const next = this.queue.shift();\n if (next) return next;\n if (nonblock) throw new KernelError('EAGAIN');\n await this.changes.wait(signal);\n }\n }\n offer(server: KernelSocket): boolean {\n if (this.state !== 'listening' || this.queue.length >= this.backlog) return false;\n this.queue.push(server);\n this.changes.wake();\n return true;\n }\n connect(addr: SockAddr): void {\n if (this.state === 'connected') throw new KernelError('EISCONN');\n if (this.state !== 'open') throw new KernelError('EINVAL');\n if (addr.family !== this.domain) throw new KernelError('EAFNOSUPPORT');\n const target = this.net.target(addr);\n if (!this.local) {\n if (addr.family === 'inet') {\n this.local = this.net.bind(this, { family: 'inet', host: '127.0.0.1', port: 0 });\n this.bound = true;\n } else this.local = { family: 'unix', path: '' };\n }\n const server = new KernelSocket(this.net, this.domain);\n server.local = addr.family === 'inet' ? { ...addr, host: canonicalHost(addr.host) } : addr;\n server.peer = this.local;\n this.peer = server.local;\n link(this, server);\n if (!target.offer(server)) {\n this.unlink();\n server.close();\n throw new KernelError('ECONNREFUSED');\n }\n }\n private unlink(): void {\n const link = this.link;\n if (link) {\n link.rx.closeRead();\n link.tx.closeWrite();\n }\n this.link = undefined;\n this.peer = undefined;\n this.state = 'open';\n }\n shutdown(how: number): void {\n const { rx, tx } = this.connection();\n if (how !== SHUT_RD && how !== SHUT_WR && how !== SHUT_RDWR) throw new KernelError('EINVAL');\n if (how !== SHUT_WR && !this.readShut) {\n this.readShut = true;\n rx.closeRead();\n }\n if (how !== SHUT_RD && !this.writeShut) {\n this.writeShut = true;\n tx.closeWrite();\n }\n this.changes.wake();\n }\n getOption(level: number, name: number): number {\n if (level === SOL_SOCKET) {\n switch (name) {\n case SO_TYPE:\n return SOCK_STREAM;\n case SO_ERROR:\n return 0;\n case SO_ACCEPTCONN:\n return this.state === 'listening' ? 1 : 0;\n case SO_DOMAIN:\n return this.domain === 'inet' ? AF_INET : AF_UNIX;\n case SO_SNDBUF:\n case SO_RCVBUF:\n return this.options.get(`${level}:${name}`) ?? PIPE_CAPACITY;\n }\n }\n return this.options.get(`${level}:${name}`) ?? 0;\n }\n setOption(level: number, name: number, value: number): void {\n this.options.set(`${level}:${name}`, value);\n }\n close(): void {\n const was = this.state;\n this.state = 'closed';\n if (was === 'listening') {\n for (const pending of this.queue.splice(0)) pending.close();\n }\n if (this.link) {\n if (!this.readShut) this.link.rx.closeRead();\n if (!this.writeShut) this.link.tx.closeWrite();\n this.readShut = true;\n this.writeShut = true;\n }\n if (this.bound && this.local) this.net.release(this.local, this);\n this.bound = false;\n this.changes.wake();\n }\n static pair(net: LoopbackNet, domain: SocketDomain): [KernelSocket, KernelSocket] {\n const a = new KernelSocket(net, domain);\n const b = new KernelSocket(net, domain);\n const name: SockAddr =\n domain === 'inet'\n ? { family: 'inet', host: '127.0.0.1', port: 0 }\n : { family: 'unix', path: '' };\n a.local = b.local = a.peer = b.peer = name;\n link(a, b);\n return [a, b];\n }\n}\nfunction canonicalHost(host: string): string {\n return host === '0.0.0.0' ? '127.0.0.1' : host;\n}\nfunction keyOf(addr: SockAddr): string {\n return addr.family === 'inet' ? `inet:${addr.port}` : `unix:${addr.path}`;\n}\nexport class LoopbackNet {\n private readonly bound = new Map<string, KernelSocket>();\n private readonly activators = new Map<string, () => void>();\n private nextEphemeral = EPHEMERAL_FIRST;\n activate(addr: SockAddr, start: () => void): void {\n this.activators.set(keyOf(addr), start);\n }\n socket(domain: SocketDomain): KernelSocket {\n return new KernelSocket(this, domain);\n }\n listen(addr: SockAddr, backlog = 128): KernelSocket {\n const socket = this.socket(addr.family);\n socket.bind(addr);\n socket.listen(backlog);\n return socket;\n }\n connect(addr: SockAddr): KernelSocket {\n const socket = this.socket(addr.family);\n socket.connect(addr);\n return socket;\n }\n bind(socket: KernelSocket, addr: SockAddr): SockAddr {\n if (addr.family === 'unix') {\n if (addr.path === '') throw new KernelError('EINVAL');\n } else if (addr.host !== '0.0.0.0' && !isLoopback(addr.host)) {\n throw new KernelError('EADDRNOTAVAIL');\n }\n const named =\n addr.family === 'inet' && addr.port === 0 ? { ...addr, port: this.ephemeral() } : addr;\n const key = keyOf(named);\n if (this.bound.has(key)) throw new KernelError('EADDRINUSE');\n this.bound.set(key, socket);\n return named;\n }\n release(addr: SockAddr, socket: KernelSocket): void {\n const key = keyOf(addr);\n if (this.bound.get(key) === socket) this.bound.delete(key);\n }\n target(addr: SockAddr): KernelSocket {\n if (addr.family === 'inet' && !isLoopback(canonicalHost(addr.host))) {\n throw new KernelError('ENETUNREACH');\n }\n const key = keyOf(addr);\n if (!this.bound.has(key)) this.activators.get(key)?.();\n const socket = this.bound.get(key);\n if (!socket?.listening) throw new KernelError('ECONNREFUSED');\n return socket;\n }\n private ephemeral(): number {\n const span = EPHEMERAL_LAST - EPHEMERAL_FIRST + 1;\n for (let i = 0; i < span; i++) {\n const port = this.nextEphemeral;\n this.nextEphemeral = port === EPHEMERAL_LAST ? EPHEMERAL_FIRST : port + 1;\n if (!this.bound.has(`inet:${port}`)) return port;\n }\n throw new KernelError('EADDRINUSE');\n }\n}\nconst namespaces = new Map<string, LoopbackNet>();\nexport function loopbackNet(owner: string): LoopbackNet {\n let net = namespaces.get(owner);\n if (!net) {\n net = new LoopbackNet();\n namespaces.set(owner, net);\n }\n return net;\n}\nexport function ownerKey(\n owner:\n | {\n kind: string;\n scoopJid?: string;\n }\n | undefined\n): string {\n return owner ? `${owner.kind}:${owner.scoopJid ?? ''}` : 'local';\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, pollFile } from './fd-table.ts';\nimport { KernelSocket, type LoopbackNet, type SockAddr, type SocketDomain } from './socket.ts';\nexport type SocketSyscall =\n | {\n op: 'sock-open';\n domain: SocketDomain;\n }\n | {\n op: 'sock-pair';\n domain: SocketDomain;\n }\n | {\n op: 'sock-bind';\n fd: number;\n addr: SockAddr;\n }\n | {\n op: 'sock-listen';\n fd: number;\n backlog: number;\n }\n | {\n op: 'sock-accept';\n fd: number;\n nonblock: boolean;\n }\n | {\n op: 'sock-connect';\n fd: number;\n addr: SockAddr;\n nonblock: boolean;\n }\n | {\n op: 'sock-shutdown';\n fd: number;\n how: number;\n }\n | {\n op: 'sock-name';\n fd: number;\n peer: boolean;\n }\n | {\n op: 'sock-getopt';\n fd: number;\n level: number;\n name: number;\n }\n | {\n op: 'sock-setopt';\n fd: number;\n level: number;\n name: number;\n value: number;\n };\nexport const SOCKET_OPS: readonly SocketSyscall['op'][] = [\n 'sock-open',\n 'sock-pair',\n 'sock-bind',\n 'sock-listen',\n 'sock-accept',\n 'sock-connect',\n 'sock-shutdown',\n 'sock-name',\n 'sock-getopt',\n 'sock-setopt',\n];\nexport interface SocketProcess {\n fds: FdTable;\n net: LoopbackNet;\n blocking(): AbortSignal;\n}\nfunction socketAt(fds: FdTable, fd: number): KernelSocket {\n const file = fds.get(fd).file;\n if (!(file instanceof KernelSocket)) throw new KernelError('ENOTSOCK');\n return file;\n}\nconst ok = (json?: unknown): SyncFsResult =>\n json === undefined ? { ok: true, kind: 'void' } : { ok: true, kind: 'json', json };\nexport async function socketSyscall(\n req: SocketSyscall,\n proc: SocketProcess\n): Promise<SyncFsResult> {\n const { fds, net } = proc;\n switch (req.op) {\n case 'sock-open':\n return ok(fds.install(new OpenFile(net.socket(req.domain)), 3));\n case 'sock-pair': {\n const [a, b] = KernelSocket.pair(net, req.domain);\n const first = fds.install(new OpenFile(a), 3);\n try {\n return ok([first, fds.install(new OpenFile(b), 3)]);\n } catch (e) {\n await Promise.resolve(fds.close(first));\n throw e;\n }\n }\n case 'sock-bind':\n socketAt(fds, req.fd).bind(req.addr);\n return ok();\n case 'sock-listen':\n socketAt(fds, req.fd).listen(req.backlog);\n return ok();\n case 'sock-accept':\n return ok(await accept(proc, req.fd, req.nonblock));\n case 'sock-connect':\n socketAt(fds, req.fd).connect(req.addr);\n if (req.nonblock) throw new KernelError('EINPROGRESS');\n return ok();\n case 'sock-shutdown':\n socketAt(fds, req.fd).shutdown(req.how);\n return ok();\n case 'sock-name': {\n const socket = socketAt(fds, req.fd);\n const addr = req.peer ? socket.peer : socket.local;\n if (req.peer && !addr) throw new KernelError('ENOTCONN');\n return ok(addr ?? unnamed(socket.domain));\n }\n case 'sock-getopt':\n return ok(socketAt(fds, req.fd).getOption(req.level, req.name));\n case 'sock-setopt':\n socketAt(fds, req.fd).setOption(req.level, req.name, req.value);\n return ok();\n }\n}\nfunction unnamed(domain: SocketDomain): SockAddr {\n return domain === 'inet'\n ? { family: 'inet', host: '0.0.0.0', port: 0 }\n : { family: 'unix', path: '' };\n}\nasync function accept(\n proc: SocketProcess,\n fd: number,\n nonblock: boolean\n): Promise<{\n fd: number;\n peer: SockAddr | undefined;\n}> {\n const listener = socketAt(proc.fds, fd);\n const waits = !nonblock && !pollFile(listener).readable;\n const socket = await listener.accept(waits ? proc.blocking() : undefined, nonblock);\n return { fd: proc.fds.install(new OpenFile(socket), 3), peer: socket.peer };\n}\n", "import { KernelError, OpenFile } from './fd-table.ts';\n\nexport interface VfsFileFs {\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array): Promise<void>;\n}\n\nconst O_ACCMODE = 0o3;\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\n\nconst SEEK_SET = 0;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\n\nexport interface VfsFileOptions {\n path: string;\n\n flags: number;\n\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n dirty?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n}\n\nexport const WRITEBACK_MS = 250;\n\nconst WRITEBACK_COST_FACTOR = 10;\n\nfunction isMissing(err: unknown): boolean {\n if ((err as { code?: unknown } | null)?.code === 'ENOENT') return true;\n return err instanceof Error && err.message.startsWith('ENOENT');\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(root.endsWith('/') ? root : `${root}/`);\n}\n\nexport class VfsNode {\n private data: Uint8Array | undefined;\n private length = 0;\n private dirty = false;\n private queue: Promise<unknown> = Promise.resolve();\n\n private writeBack: ReturnType<typeof setTimeout> | undefined;\n\n private writeBackCost = 0;\n\n opens = 0;\n\n private missing = false;\n\n private readonly fs: VfsFileFs;\n\n path: string;\n\n orphaned: boolean;\n\n constructor(\n fs: VfsFileFs,\n\n path: string,\n\n contents?: Uint8Array,\n\n orphaned: boolean = false,\n\n dirty = false\n ) {\n this.fs = fs;\n\n this.path = path;\n\n this.orphaned = orphaned;\n if (contents !== undefined) this.data = new Uint8Array(contents);\n else if (orphaned) this.data = new Uint8Array(0);\n this.length = this.data?.length ?? 0;\n if (dirty && contents !== undefined) this.markDirty();\n }\n\n serial<T>(op: () => Promise<T>): Promise<T> {\n const next = this.queue.then(op);\n this.queue = next.catch(() => undefined);\n return next;\n }\n\n async load(): Promise<Uint8Array> {\n if (!this.data) {\n try {\n this.data = await this.fs.readFileBuffer(this.path);\n } catch (err) {\n if (!isMissing(err)) throw err;\n this.data = new Uint8Array(0);\n this.missing = true;\n }\n this.length = this.data.length;\n }\n return this.data;\n }\n\n replace(contents: Uint8Array): void {\n this.data = new Uint8Array(contents);\n this.length = this.data.length;\n this.missing = false;\n this.markDirty();\n }\n\n async materialize(): Promise<void> {\n await this.load();\n if (!this.missing || this.orphaned) return;\n this.missing = false;\n await this.fs.writeFile(this.path, this.data?.slice(0, this.length) ?? new Uint8Array(0));\n }\n\n async size(): Promise<number> {\n await this.load();\n return this.length;\n }\n\n async pread(max: number, at: number): Promise<Uint8Array> {\n const bytes = await this.load();\n const n = Math.max(0, Math.min(max, this.length - at));\n return bytes.slice(at, at + n);\n }\n\n async pwrite(bytes: Uint8Array, at: number): Promise<number> {\n await this.load();\n const buf = this.ensure(at + bytes.length);\n if (at > this.length) buf.fill(0, this.length, at);\n buf.set(bytes, at);\n this.length = Math.max(this.length, at + bytes.length);\n this.markDirty();\n return bytes.length;\n }\n\n async truncate(size: number): Promise<void> {\n await this.load();\n const buf = this.ensure(size);\n if (size > this.length) buf.fill(0, this.length, size);\n this.length = size;\n this.markDirty();\n }\n\n private markDirty(): void {\n this.dirty = true;\n if (this.writeBack !== undefined || this.orphaned) return;\n const delay = Math.max(WRITEBACK_MS, this.writeBackCost * WRITEBACK_COST_FACTOR);\n this.writeBack = setTimeout(() => {\n this.writeBack = undefined;\n this.serial(() => this.flush()).catch(() => undefined);\n }, delay);\n }\n\n private ensure(need: number): Uint8Array {\n const cur = this.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, this.length));\n this.data = grown;\n return grown;\n }\n\n async flush(): Promise<void> {\n if (!this.dirty || !this.data || this.orphaned) return;\n this.dirty = false;\n const started = performance.now();\n try {\n await this.fs.writeFile(this.path, this.data.slice(0, this.length));\n } catch (err) {\n this.dirty = true;\n throw err;\n }\n this.writeBackCost = performance.now() - started;\n }\n}\n\nexport class VfsNodes {\n private readonly byPath = new Map<string, VfsNode>();\n\n private readonly fs: VfsFileFs;\n\n constructor(fs: VfsFileFs) {\n this.fs = fs;\n }\n\n open(path: string): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path);\n this.byPath.set(path, node);\n }\n node.opens++;\n return node;\n }\n\n adopt(path: string, contents: Uint8Array, dirty: boolean): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path, contents, false, dirty);\n this.byPath.set(path, node);\n } else if (dirty) {\n node.replace(contents);\n }\n node.opens++;\n return node;\n }\n\n closed(node: VfsNode): void {\n node.opens--;\n if (node.opens === 0 && this.byPath.get(node.path) === node) this.byPath.delete(node.path);\n }\n\n async flush(path: string): Promise<void> {\n for (const [p, node] of this.byPath) if (within(p, path)) await node.serial(() => node.flush());\n }\n\n async unlinking(path: string): Promise<void> {\n const node = this.byPath.get(path);\n if (node) await node.serial(() => node.load());\n }\n\n unlinked(path: string): void {\n const node = this.byPath.get(path);\n if (!node) return;\n node.orphaned = true;\n this.byPath.delete(path);\n }\n\n renamed(from: string, to: string): void {\n if (from === to) return;\n const moved: VfsNode[] = [];\n for (const [p, node] of this.byPath) {\n if (within(p, from)) moved.push(node);\n else if (within(p, to)) {\n node.orphaned = true;\n this.byPath.delete(p);\n }\n }\n for (const node of moved) {\n this.byPath.delete(node.path);\n node.path = to + node.path.slice(from.length);\n this.byPath.set(node.path, node);\n }\n }\n}\n\nexport function vfsFile(fs: VfsFileFs, opts: VfsFileOptions, nodes?: VfsNodes): OpenFile {\n const access = opts.flags & O_ACCMODE;\n const readable = access !== O_WRONLY;\n const writable = access === O_WRONLY || access === O_RDWR;\n\n const node =\n !nodes || opts.orphan\n ? new VfsNode(fs, opts.path, opts.contents, opts.orphan === true, opts.dirty === true)\n : opts.contents !== undefined\n ? nodes.adopt(opts.path, opts.contents, opts.dirty === true)\n : nodes.open(opts.path);\n\n let openError: { err: unknown } | undefined;\n const atOpen = (op: () => Promise<void>): void => {\n void node.serial(op).catch((err: unknown) => {\n openError ??= { err };\n });\n };\n if (opts.create) atOpen(() => node.materialize());\n if (opts.truncate) atOpen(() => node.truncate(0));\n const takeOpenError = (): void => {\n if (!openError) return;\n const { err } = openError;\n openError = undefined;\n throw err;\n };\n let offset = opts.position;\n const serial = <T>(op: () => Promise<T>) =>\n node.serial(() => {\n takeOpenError();\n return op();\n });\n\n return new OpenFile({\n read: readable\n ? (max) =>\n serial(async () => {\n const out = await node.pread(max, offset);\n offset += out.length;\n return out;\n })\n : undefined,\n write: writable\n ? (bytes) =>\n serial(async () => {\n if (opts.flags & O_APPEND) offset = await node.size();\n offset += await node.pwrite(bytes, offset);\n return bytes.length;\n })\n : undefined,\n seek: (to, whence) =>\n serial(async () => {\n let base = 0;\n if (whence === SEEK_CUR) base = offset;\n else if (whence === SEEK_END) base = await node.size();\n else if (whence !== SEEK_SET) throw new KernelError('EINVAL');\n if (base + to < 0) throw new KernelError('EINVAL');\n offset = base + to;\n return offset;\n }),\n pread: (max, at) =>\n serial(() => {\n if (!readable) throw new KernelError('EBADF');\n return node.pread(max, at);\n }),\n pwrite: (bytes, at) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.pwrite(bytes, at);\n }),\n resize: (size) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.truncate(size);\n }),\n stat: () =>\n serial(async () => ({\n path: node.path,\n size: await node.size(),\n ...(node.orphaned ? { orphan: true as const } : {}),\n })),\n flush: () => serial(() => node.flush()),\n\n close: () =>\n node.serial(async () => {\n try {\n takeOpenError();\n await node.flush();\n } finally {\n nodes?.closed(node);\n }\n }),\n });\n}\n", "import type { LinkRecord } from '../process/wasi/wasix-linker.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n type ChildForker,\n type ChildSpawner,\n type ChildStdio,\n ChildTable,\n type InheritedSlot,\n SpawnError,\n} from './children.ts';\nimport {\n type FdTable,\n type HeldMeta,\n heldFile,\n KernelError,\n type KernelFdKind,\n kernelFdKind,\n type OpenFile,\n openPipe,\n pollFile,\n} from './fd-table.ts';\nimport { AsyncOps, HOST_OPS, type HostSyscall, hostSyscall, type LockTable } from './host-ops.ts';\nimport type { JobTable } from './jobs.ts';\nimport { HTTP_OPS, type HttpHandles, type HttpSyscall } from './net/http-syscalls.ts';\nimport { NO_TRANSPORT } from './net/network.ts';\nimport type { ForkState } from './protocol.ts';\nimport { PTY_OPS, type PtySyscall, type PtyTable, ptySyscall } from './pty.ts';\nimport { selectFds } from './select.ts';\nimport { type DefaultAction, defaultAction, isSignal, SIG, sigbit } from './signals.ts';\nimport { KernelSocket, LoopbackNet } from './socket.ts';\nimport { SOCKET_OPS, type SocketSyscall, socketSyscall } from './socket-syscalls.ts';\nimport type { KernelTty, Termios } from './tty.ts';\nimport { type VfsFileFs, VfsNodes, vfsFile } from './vfs-file.ts';\n\nexport type WasmSyscall =\n | {\n op: 'fd-read';\n fd: number;\n max: number;\n\n nonblock?: boolean;\n\n peek?: boolean;\n }\n | { op: 'fd-write'; fd: number; body: Uint8Array; nonblock?: boolean }\n | { op: 'fd-close'; fd: number }\n | { op: 'fd-pipe' }\n | { op: 'fd-poll'; fd: number }\n | {\n op: 'fd-open-vfs';\n path: string;\n flags: number;\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n }\n | { op: 'fd-pread'; fd: number; offset: number; max: number }\n | { op: 'fd-pwrite'; fd: number; offset: number; body: Uint8Array }\n | { op: 'fd-resize'; fd: number; size: number }\n | { op: 'fd-vfs-stat'; fd: number }\n | { op: 'fd-path-flush'; path: string }\n | { op: 'fd-path-unlinking'; path: string }\n | { op: 'fd-path-unlinked'; path: string }\n | { op: 'fd-path-renamed'; from: string; to: string }\n | { op: 'fd-seek'; fd: number; offset: number; whence: number }\n | { op: 'fd-select'; read: number[]; write: number[]; timeoutMs: number }\n | { op: 'fd-info'; fd: number }\n | { op: 'fd-dup'; fd: number; min?: number }\n | { op: 'fd-reserve'; fd?: number; min?: number; meta?: HeldMeta }\n | { op: 'fd-meta'; fd: number; meta: HeldMeta }\n | { op: 'fd-setfl'; fd: number; flags: number }\n | { op: 'fd-cloexec'; fd: number; on: boolean }\n | { op: 'fd-list' }\n | { op: 'dl-log'; append?: LinkRecord; from: number }\n | {\n op: 'proc-alarm';\n sig: number;\n ms: number;\n firstMs?: number;\n repeat: boolean;\n\n timer?: number;\n }\n | { op: 'fd-renumber'; from: number; to: number; keep?: boolean }\n | {\n op: 'fd-promote';\n fd: number;\n share?: number;\n path?: string;\n flags?: number;\n position?: number;\n contents?: Uint8Array;\n orphan?: boolean;\n\n dirty?: boolean;\n }\n | { op: 'fd-open-tty'; name?: string }\n | { op: 'tty-get'; fd: number }\n | { op: 'tty-set'; fd: number; termios: Termios }\n | { op: 'tty-winsz'; fd: number }\n | { op: 'fd-flush'; fd: number }\n | {\n op: 'proc-spawn';\n file: string;\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n stdio: ChildStdio[];\n\n inherit?: InheritedSlot[];\n }\n | {\n op: 'proc-wait';\n pid: number;\n nohang: boolean;\n\n untraced?: boolean;\n continued?: boolean;\n }\n | { op: 'proc-captured'; pid: number; slot: number }\n | { op: 'proc-fork'; state: ForkState }\n | { op: 'proc-kill'; pid: number; sig: number }\n | { op: 'proc-exec'; pid: number }\n | { op: 'proc-setpgid'; pid: number; pgid: number }\n | { op: 'proc-getpgid'; pid: number }\n | { op: 'proc-getsid'; pid: number }\n | { op: 'proc-setsid' }\n | { op: 'tty-pgrp-get'; fd: number }\n | { op: 'tty-pgrp-set'; fd: number; pgrp: number }\n | { op: 'sig-mask'; caught: number; ignored: number }\n | { op: 'sig-pause' }\n | SocketSyscall\n | HttpSyscall\n | PtySyscall\n | HostSyscall;\n\ntype FdSyscall = Extract<WasmSyscall, { op: `fd-${string}` }>;\n\ntype JobSyscall = Extract<\n WasmSyscall,\n { op: 'proc-setpgid' | 'proc-getpgid' | 'proc-getsid' | 'proc-setsid' }\n>;\n\nconst JOB_OPS: ReadonlySet<string> = new Set([\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n]);\n\nfunction isJobSyscall(req: WasmSyscall): req is JobSyscall {\n return JOB_OPS.has(req.op);\n}\n\nfunction isHttpSyscall(req: WasmSyscall): req is HttpSyscall {\n return req.op.startsWith('net-');\n}\n\nfunction isSocketSyscall(req: WasmSyscall): req is SocketSyscall {\n return req.op.startsWith('sock-');\n}\n\nfunction isHostSyscall(req: { op: string }): req is HostSyscall {\n return (HOST_OPS as readonly string[]).includes(req.op);\n}\n\nfunction isPtySyscall(req: WasmSyscall): req is PtySyscall {\n return req.op.startsWith('pty-');\n}\n\ntype VfsSyscall = Extract<\n FdSyscall,\n {\n op:\n | 'fd-pread'\n | 'fd-pwrite'\n | 'fd-resize'\n | 'fd-vfs-stat'\n | 'fd-path-flush'\n | 'fd-path-unlinking'\n | 'fd-path-unlinked'\n | 'fd-path-renamed';\n }\n>;\n\nfunction isVfsSyscall(req: FdSyscall): req is VfsSyscall {\n return (\n req.op.startsWith('fd-path-') ||\n req.op === 'fd-pread' ||\n req.op === 'fd-pwrite' ||\n req.op === 'fd-resize' ||\n req.op === 'fd-vfs-stat'\n );\n}\n\nfunction isFdSyscall(req: WasmSyscall): req is FdSyscall {\n return req.op.startsWith('fd-');\n}\n\nfunction isTtySyscall(req: WasmSyscall): req is TtySyscall {\n return req.op.startsWith('tty-');\n}\n\nexport interface FdInfo {\n tty: boolean;\n kind: KernelFdKind;\n meta?: HeldMeta;\n flags?: number;\n cloexec?: true;\n\n name?: string;\n}\n\nconst SYSCALL_OPS: ReadonlySet<string> = new Set([\n 'fd-read',\n 'fd-write',\n 'fd-close',\n 'fd-pipe',\n 'fd-poll',\n 'fd-open-vfs',\n 'fd-seek',\n 'fd-pread',\n 'fd-pwrite',\n 'fd-resize',\n 'fd-vfs-stat',\n 'fd-path-flush',\n 'fd-path-unlinking',\n 'fd-path-unlinked',\n 'fd-path-renamed',\n 'fd-select',\n 'fd-info',\n 'fd-dup',\n 'fd-reserve',\n 'fd-meta',\n 'fd-setfl',\n 'fd-cloexec',\n 'fd-list',\n 'proc-alarm',\n 'dl-log',\n 'fd-renumber',\n 'fd-promote',\n 'fd-open-tty',\n 'tty-get',\n 'tty-set',\n 'tty-winsz',\n 'fd-flush',\n 'proc-spawn',\n 'proc-wait',\n 'proc-captured',\n 'proc-fork',\n 'proc-kill',\n 'proc-exec',\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n 'tty-pgrp-get',\n 'tty-pgrp-set',\n 'sig-mask',\n 'sig-pause',\n ...SOCKET_OPS,\n ...HTTP_OPS,\n ...PTY_OPS,\n ...HOST_OPS,\n]);\n\ntype TtySyscall = Extract<WasmSyscall, { op: `tty-${string}` }>;\n\nexport function isWasmSyscall(req: object): req is WasmSyscall {\n const op = (req as { op?: unknown }).op;\n return typeof op === 'string' && SYSCALL_OPS.has(op);\n}\n\nconst MAX_READ = 1024 * 1024;\n\nexport interface WasmProcessOptions {\n spawner?: ChildSpawner;\n\n forker?: ChildForker;\n\n fs: VfsFileFs;\n\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n\n onPending?: (sig: number) => void;\n\n onTimer?: (which: number) => void;\n\n hasPending?: () => boolean;\n\n pendingBits?: () => number;\n\n raise?: (sig: number) => void;\n\n onReap?: (pid: number) => void;\n\n jobs?: JobTable;\n\n ptys?: PtyTable;\n\n net?: LoopbackNet;\n\n http?: HttpHandles;\n\n locks?: LockTable;\n}\n\nexport type StateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport type SignalOutcome = DefaultAction | 'deliver' | 'forward';\n\nexport class WasmProcess {\n private exited = false;\n private readonly children: ChildTable;\n\n private caught = 0;\n private ignored = 0;\n\n private interrupt = new AbortController();\n\n private execChild: number | undefined;\n\n execTermsig: number | undefined;\n\n private stopped = 0;\n\n private stops = 0;\n private resumed: Promise<void> = Promise.resolve();\n private wake: (() => void) | undefined;\n private readonly stateListeners: StateListener[] = [];\n\n private net: LoopbackNet | undefined;\n\n private readonly nodes: VfsNodes;\n\n readonly pid: number;\n\n readonly fds: FdTable;\n\n private readonly options: WasmProcessOptions;\n\n constructor(\n pid: number,\n\n fds: FdTable,\n\n options: WasmProcessOptions\n ) {\n this.pid = pid;\n\n this.fds = fds;\n\n this.options = options;\n this.children = new ChildTable(fds, options.spawner, options.forker);\n this.nodes = new VfsNodes(options.fs);\n this.children.onChildState = () => this.signal(SIG.CHLD);\n this.children.onReap = options.onReap;\n }\n\n signal(sig: number): SignalOutcome {\n if (this.execChild !== undefined) {\n void Promise.resolve(this.options.kill?.(this.execChild, sig)).catch(() => undefined);\n return sig === SIG.KILL ? 'terminate' : 'forward';\n }\n if (sig === SIG.KILL) return 'terminate';\n\n if (sig === SIG.CONT) this.cont();\n if (sig === SIG.STOP) return this.stop(sig);\n const bit = sigbit(sig);\n if (this.ignored & bit) return 'ignore';\n if (!(this.caught & bit)) {\n const action = defaultAction(sig);\n return action === 'stop' ? this.stop(sig) : action;\n }\n if (((this.options.pendingBits?.() ?? 0) & bit) !== 0 && defaultAction(sig) === 'terminate') {\n return 'terminate';\n }\n this.options.onPending?.(sig);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n return 'deliver';\n }\n\n onState(listener: StateListener): void {\n this.stateListeners.push(listener);\n }\n\n private stop(sig: number): 'stop' {\n if (this.stopped) return 'stop';\n this.stopped = sig;\n this.stops++;\n this.resumed = new Promise((resolve) => (this.wake = resolve));\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n for (const listener of this.stateListeners) listener('stopped', sig);\n return 'stop';\n }\n\n private cont(): void {\n if (!this.stopped) return;\n this.stopped = 0;\n this.wake?.();\n for (const listener of this.stateListeners) listener('continued', SIG.CONT);\n }\n\n async syscall(req: WasmSyscall): Promise<SyncFsResult> {\n for (;;) {\n await this.resumed;\n const stops = this.stops;\n const result = await this.dispatch(req);\n\n const restart = !result.ok && result.errno === 'EINTR' && this.stops !== stops;\n if (restart && !this.options.hasPending?.()) continue;\n\n await this.resumed;\n return result;\n }\n }\n\n private async dispatch(req: WasmSyscall): Promise<SyncFsResult> {\n try {\n if (isFdSyscall(req)) return await this.fdSyscall(req);\n if (isTtySyscall(req)) return this.ttySyscall(req);\n if (isJobSyscall(req)) return this.jobSyscall(req);\n if (isSocketSyscall(req)) return await this.socketSyscall(req);\n if (isHttpSyscall(req)) return await this.httpSyscall(req);\n if (isHostSyscall(req)) {\n return await hostSyscall(req, {\n pid: this.pid,\n locks: this.options.locks,\n ops: this.asyncOps,\n blocking: () => this.blockingSignal(),\n valid: (inner) => isWasmSyscall(inner) && !isHostSyscall(inner),\n });\n }\n if (isPtySyscall(req)) {\n const { ptys, jobs } = this.options;\n return ptySyscall(req, { pid: this.pid, fds: this.fds, ptys, jobs });\n }\n return await this.procSyscall(req);\n } catch (e) {\n if (e instanceof KernelError || e instanceof SpawnError) {\n return { ok: false, errno: e.code, message: e.code };\n }\n throw e;\n }\n }\n\n private blockingSignal(): AbortSignal {\n if (this.options.hasPending?.()) throw new KernelError('EINTR');\n return this.interrupt.signal;\n }\n\n private async read(req: Extract<WasmSyscall, { op: 'fd-read' }>): Promise<Uint8Array> {\n const file = this.fds.get(req.fd).file;\n const read = req.peek ? file.peek : file.read;\n if (!read) throw new KernelError(req.peek && file.read ? 'EOPNOTSUPP' : 'EBADF');\n if (file.tty) this.checkForeground(file.tty);\n\n if (req.max <= 0) return new Uint8Array(0);\n const ready = pollFile(file).readable;\n if (!ready && req.nonblock) throw new KernelError('EAGAIN');\n const signal = ready ? this.interrupt.signal : this.blockingSignal();\n return read.call(file, Math.max(0, Math.min(req.max, MAX_READ)), signal);\n }\n\n private async write(fd: number, body: Uint8Array, nonblock = false): Promise<number> {\n const file = this.fds.get(fd).file;\n if (!file.write) throw new KernelError('EBADF');\n if (!pollFile(file).writable) {\n if (nonblock) throw new KernelError('EAGAIN');\n return file.write(body, this.blockingSignal());\n }\n\n if (nonblock) return file.write(body, AbortSignal.abort());\n\n return file.write(\n body,\n this.options.hasPending?.() ? AbortSignal.abort() : this.interrupt.signal\n );\n }\n\n private openVfsFile(req: Extract<FdSyscall, { op: 'fd-open-vfs' }>): OpenFile {\n return vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags,\n position: req.position,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.truncate ? { truncate: true } : {}),\n ...(req.create ? { create: true } : {}),\n },\n this.nodes\n );\n }\n\n private async fdSyscall(req: FdSyscall): Promise<SyncFsResult> {\n if (isVfsSyscall(req)) return this.vfsSyscall(req);\n switch (req.op) {\n case 'fd-read':\n return { ok: true, kind: 'bytes', bytes: await this.read(req) };\n case 'fd-write':\n return { ok: true, kind: 'json', json: await this.write(req.fd, req.body, req.nonblock) };\n case 'fd-close':\n this.options.locks?.closed(this.pid, req.fd);\n await Promise.resolve(this.fds.close(req.fd));\n return { ok: true, kind: 'void' };\n case 'fd-pipe': {\n const pipe = openPipe();\n const read = this.fds.install(pipe.read, 3);\n let write: number;\n try {\n write = this.fds.install(pipe.write, 3);\n } catch (e) {\n await Promise.resolve(this.fds.close(read));\n throw e;\n }\n return { ok: true, kind: 'json', json: [read, write] };\n }\n case 'fd-poll':\n return { ok: true, kind: 'json', json: pollFile(this.fds.get(req.fd).file) };\n case 'fd-open-vfs':\n return { ok: true, kind: 'json', json: this.fds.install(this.openVfsFile(req), 3) };\n case 'fd-info':\n return { ok: true, kind: 'json', json: this.fdInfo(req.fd) };\n case 'fd-list':\n return {\n ok: true,\n kind: 'json',\n json: this.fds.numbers().map((fd) => ({ fd, ...this.fdInfo(fd) })),\n };\n case 'fd-meta': {\n const file = this.fds.get(req.fd).file;\n if (!file.held) throw new KernelError('EBADF');\n file.heldMeta = req.meta;\n return { ok: true, kind: 'void' };\n }\n case 'fd-setfl':\n this.fds.setStatusFlags(req.fd, req.flags);\n return { ok: true, kind: 'void' };\n case 'fd-cloexec':\n if (req.on) this.fds.setCloseOnExec(req.fd);\n else this.fds.clearCloseOnExec(req.fd);\n return { ok: true, kind: 'void' };\n case 'fd-dup':\n return { ok: true, kind: 'json', json: this.fds.dup(req.fd, req.min ?? 3) };\n case 'fd-reserve':\n return { ok: true, kind: 'json', json: this.reserve(req.fd, req.min, req.meta) };\n case 'fd-promote':\n this.promote(req);\n return { ok: true, kind: 'void' };\n case 'fd-renumber':\n if (req.from !== req.to) {\n this.fds.dup2(req.from, req.to);\n if (!req.keep) await Promise.resolve(this.fds.close(req.from));\n }\n return { ok: true, kind: 'void' };\n case 'fd-open-tty': {\n const tty =\n req.name === undefined\n ? this.controllingTerminal()\n : this.options.jobs?.terminalNamed(req.name);\n if (!tty) throw new KernelError('ENXIO');\n return { ok: true, kind: 'json', json: this.fds.install(tty.file(), 3) };\n }\n case 'fd-select': {\n const { read, write, timeoutMs } = req;\n const signal = this.blockingSignal();\n const selected = await selectFds(this.fds, read, write, timeoutMs, signal);\n return { ok: true, kind: 'json', json: selected };\n }\n case 'fd-seek': {\n const file = this.fds.get(req.fd).file;\n if (!file.seek) throw new KernelError('ESPIPE');\n return { ok: true, kind: 'json', json: await file.seek(req.offset, req.whence) };\n }\n case 'fd-flush': {\n const file = this.fds.get(req.fd).file;\n if (file.flush) await file.flush();\n return { ok: true, kind: 'void' };\n }\n }\n }\n\n private async vfsSyscall(req: VfsSyscall): Promise<SyncFsResult> {\n if ('path' in req || 'from' in req) {\n const nodes = this.nodes;\n if (req.op === 'fd-path-flush') await nodes.flush(req.path);\n else if (req.op === 'fd-path-unlinking') await nodes.unlinking(req.path);\n else if (req.op === 'fd-path-unlinked') nodes.unlinked(req.path);\n else if (req.op === 'fd-path-renamed') nodes.renamed(req.from, req.to);\n return { ok: true, kind: 'void' };\n }\n const file = this.fds.get(req.fd).file;\n if (!file.pread || !file.pwrite || !file.resize || !file.stat) throw new KernelError('ESPIPE');\n switch (req.op) {\n case 'fd-pread':\n return {\n ok: true,\n kind: 'bytes',\n bytes: await file.pread(Math.min(req.max, MAX_READ), req.offset),\n };\n case 'fd-pwrite':\n return { ok: true, kind: 'json', json: await file.pwrite(req.body, req.offset) };\n case 'fd-resize':\n await file.resize(req.size);\n return { ok: true, kind: 'void' };\n case 'fd-vfs-stat':\n return { ok: true, kind: 'json', json: await file.stat() };\n }\n }\n\n private promote(req: Extract<WasmSyscall, { op: 'fd-promote' }>): void {\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n if (req.share !== undefined) {\n this.fds.dup2(req.share, req.fd);\n return;\n }\n if (req.path === undefined) throw new KernelError('EINVAL');\n const file = vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags ?? 0,\n position: req.position ?? 0,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.dirty ? { dirty: true } : {}),\n },\n this.nodes\n );\n this.fds.installAt(req.fd, file);\n }\n\n private reserve(fd: number | undefined, min = 3, meta?: HeldMeta): number {\n if (fd === undefined) return this.fds.install(heldFile(meta), Math.max(3, min));\n if (this.fds.has(fd)) throw new KernelError('EBADF');\n this.fds.installAt(fd, heldFile(meta));\n return fd;\n }\n\n private fdInfo(fd: number): FdInfo {\n const file = this.fds.get(fd).file;\n const flags = this.fds.statusFlags(fd);\n return {\n tty: file.tty !== undefined,\n kind: file instanceof KernelSocket ? 'socket' : kernelFdKind(file),\n ...(file.heldMeta ? { meta: file.heldMeta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(this.fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(file.tty?.name ? { name: file.tty.name } : file.pty ? { name: '/dev/ptmx' } : {}),\n };\n }\n\n private ttySyscall(req: TtySyscall): SyncFsResult {\n const tty = this.tty(req.fd);\n const jobs = this.options.jobs;\n switch (req.op) {\n case 'tty-get':\n return { ok: true, kind: 'json', json: tty.tcgets() };\n case 'tty-set':\n tty.tcsets(req.termios);\n return { ok: true, kind: 'void' };\n case 'tty-winsz':\n return { ok: true, kind: 'json', json: tty.winsize() };\n case 'tty-pgrp-get':\n return { ok: true, kind: 'json', json: jobs ? jobs.tcgetpgrp(tty, this.sid()) : this.pid };\n case 'tty-pgrp-set':\n if (jobs) jobs.tcsetpgrp(this.pid, tty, req.pgrp);\n else if (req.pgrp !== this.pid) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n }\n }\n\n private checkForeground(tty: KernelTty): void {\n const jobs = this.options.jobs;\n if (!jobs) return;\n const session = jobs.controllingTerminal(this.pid);\n if (session !== undefined && session !== tty) return;\n const pgid = this.pgid();\n if (jobs.tcgetpgrp(tty, this.sid()) === pgid) return;\n if (this.ignored & sigbit(SIG.TTIN)) throw new KernelError('EIO');\n jobs.killGroup(pgid, SIG.TTIN);\n throw new KernelError('EINTR');\n }\n\n private waitGroup(pid: number): ((child: number) => boolean) | undefined {\n const jobs = this.options.jobs;\n if (!jobs || pid > 0 || pid === -1) return undefined;\n const group = pid === 0 ? this.pgid() : -pid;\n\n return (child) => (jobs.pgidOf(child) ?? this.pgid()) === group;\n }\n\n private pgid(): number {\n return this.options.jobs?.getpgid(this.pid, 0) ?? this.pid;\n }\n\n private sid(): number {\n return this.options.jobs?.getsid(this.pid, 0) ?? this.pid;\n }\n\n private controllingTerminal(): KernelTty | undefined {\n const session = this.options.jobs?.controllingTerminal(this.pid);\n return session === undefined ? this.fds.stdioTerminal() : (session ?? undefined);\n }\n\n private jobSyscall(req: JobSyscall): SyncFsResult {\n const jobs = this.options.jobs;\n const self = (pid: number): number => {\n if (pid !== 0 && pid !== this.pid) throw new KernelError('ESRCH');\n return this.pid;\n };\n switch (req.op) {\n case 'proc-setpgid':\n if (jobs) jobs.setpgid(this.pid, req.pid, req.pgid);\n else if (self(req.pid) !== (req.pgid || this.pid)) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n case 'proc-getpgid':\n return { ok: true, kind: 'json', json: jobs?.getpgid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-getsid':\n return { ok: true, kind: 'json', json: jobs?.getsid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-setsid':\n if (!jobs) throw new KernelError('EPERM');\n return { ok: true, kind: 'json', json: jobs.setsid(this.pid) };\n }\n }\n\n private httpSyscall(req: HttpSyscall): Promise<SyncFsResult> {\n const http = this.options.http;\n if (!http) return Promise.resolve({ ok: false, errno: 'ENETUNREACH', message: NO_TRANSPORT });\n return http.syscall(req);\n }\n\n private socketSyscall(req: SocketSyscall): Promise<SyncFsResult> {\n this.net ??= this.options.net ?? new LoopbackNet();\n return socketSyscall(req, {\n fds: this.fds,\n net: this.net,\n blocking: () => this.blockingSignal(),\n });\n }\n\n private tty(fd: number): KernelTty {\n const file = this.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n }\n\n private async procSyscall(\n req: Exclude<\n WasmSyscall,\n FdSyscall | TtySyscall | JobSyscall | SocketSyscall | HttpSyscall | PtySyscall | HostSyscall\n >\n ): Promise<SyncFsResult> {\n switch (req.op) {\n case 'proc-fork':\n return { ok: true, kind: 'json', json: await this.children.fork(req.state) };\n case 'proc-spawn': {\n const { file, argv, env, cwd, stdio, inherit } = req;\n const pid = await this.children.spawn({ file, argv, env, cwd }, stdio, inherit);\n return { ok: true, kind: 'json', json: pid };\n }\n case 'proc-wait': {\n const signal = req.nohang ? this.interrupt.signal : this.blockingSignal();\n const flags = {\n untraced: req.untraced,\n continued: req.continued,\n inGroup: this.waitGroup(req.pid),\n };\n const waited = await this.children.wait(req.pid, req.nohang, signal, flags);\n return { ok: true, kind: 'json', json: waited };\n }\n case 'proc-exec': {\n this.execChild = req.pid;\n this.options.jobs?.exec(this.pid, req.pid);\n\n this.children.watch(req.pid, (state, sig) =>\n state === 'stopped' ? this.stop(sig) : this.cont()\n );\n\n await this.fds.closeAll();\n try {\n const waited = await this.children.wait(req.pid, false);\n const termsig = waited[1] & 0x7f;\n if (termsig) this.execTermsig = termsig;\n return { ok: true, kind: 'json', json: waited };\n } finally {\n this.execChild = undefined;\n }\n }\n case 'proc-kill':\n if (req.sig !== 0 && !isSignal(req.sig)) throw new KernelError('EINVAL');\n\n if (!(await this.options.kill?.(req.pid === 0 ? -this.pgid() : req.pid, req.sig))) {\n throw new KernelError('ESRCH');\n }\n return { ok: true, kind: 'void' };\n case 'proc-alarm':\n this.setAlarm(req.sig, req.firstMs ?? req.ms, req.repeat ? req.ms : 0, req.timer);\n return { ok: true, kind: 'void' };\n case 'dl-log':\n if (req.append) this.dlLog.push(req.append);\n return { ok: true, kind: 'json', json: this.dlLog.slice(req.from) };\n case 'sig-mask':\n this.caught = req.caught;\n this.ignored = req.ignored;\n return { ok: true, kind: 'void' };\n case 'sig-pause':\n return this.pause();\n case 'proc-captured':\n return { ok: true, kind: 'bytes', bytes: this.children.captured(req.pid, req.slot) };\n }\n }\n\n private pause(): Promise<never> {\n const signal = this.blockingSignal();\n return new Promise<never>((_, reject) => {\n signal.addEventListener('abort', () => reject(new KernelError('EINTR')), { once: true });\n });\n }\n\n private alarm: ReturnType<typeof setTimeout> | undefined;\n private readonly dlLog: LinkRecord[] = [];\n private readonly asyncOps = new AsyncOps((req) => this.syscall(req as WasmSyscall));\n private alarmEvery: ReturnType<typeof setInterval> | undefined;\n\n private setAlarm(sig: number, first: number, every: number, timer?: number): void {\n if (!isSignal(sig)) throw new KernelError('EINVAL');\n this.clearAlarm();\n if (first <= 0) return;\n const fire =\n timer === undefined ? () => this.options.raise?.(sig) : () => this.timerExpired(timer);\n this.alarm = setTimeout(() => {\n this.alarm = undefined;\n fire();\n if (every > 0) this.alarmEvery = setInterval(fire, every);\n }, first);\n }\n\n private timerExpired(which: number): void {\n this.options.onTimer?.(which);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n }\n\n private clearAlarm(): void {\n clearTimeout(this.alarm);\n clearInterval(this.alarmEvery);\n this.alarm = undefined;\n this.alarmEvery = undefined;\n }\n\n async exit(): Promise<void> {\n if (this.exited) return;\n this.exited = true;\n this.clearAlarm();\n this.options.locks?.release(this.pid);\n this.asyncOps.close();\n for (const pid of this.children.pids()) this.options.onReap?.(pid);\n await this.fds.closeAll();\n await this.options.http?.closeAll();\n }\n}\n", "import type { ForeignResults, ImportedMemory } from '../process/wasi/wasi-module.ts';\nimport type { WasiForkState } from '../process/wasi/wasix-fork.ts';\nimport type { DeviceMeta, KernelFdKind } from './fd-table.ts';\n\nexport const WASM_PROCESS_INIT = 'wasm-process-init';\nexport const WASM_PROCESS_EXIT = 'wasm-process-exit';\nexport const WASM_PROCESS_ERROR = 'wasm-process-error';\nexport const WASM_THREAD_SPAWN = 'wasm-thread-spawn';\nexport const WASM_THREAD_INIT = 'wasm-thread-init';\nexport const WASM_THREAD_EXIT = 'wasm-thread-exit';\nexport const WASM_MAX_THREADS = 256;\nexport const WASM_DEFAULT_THREADS = 64;\n\nexport interface WasmProgram {\n abi?: 'emscripten' | 'wasi';\n glue: string;\n module: WebAssembly.Module;\n memory?: ImportedMemory;\n foreign?: ForeignResults | undefined;\n names?: string;\n imports?: string;\n}\n\nexport interface ForkState {\n memory: Uint8Array;\n currData: number;\n forkSp: number;\n callStackNames: Array<[number, string]>;\n ppid: number;\n streams?: ForkStream[];\n cwd?: string;\n wasi?: WasiForkState;\n}\n\nexport interface KernelStreamEntry {\n fd: number;\n kernel: number;\n kind: KernelFdKind;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport type ForkStream = KernelStreamEntry | { fd: number; path: string; flags: number };\n\nexport interface InheritedFd {\n fd: number;\n kind: KernelFdKind;\n device?: DeviceMeta;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport interface WasmProcessInitMsg {\n type: typeof WASM_PROCESS_INIT;\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n sab: SharedArrayBuffer;\n ppid?: number;\n fork?: ForkState;\n fds?: InheritedFd[];\n}\n\nexport interface WasmProcessExitMsg {\n type: typeof WASM_PROCESS_EXIT;\n code: number;\n}\n\nexport interface WasmProcessErrorMsg {\n type: typeof WASM_PROCESS_ERROR;\n message: string;\n}\n\nexport interface WasmThread {\n tid: number;\n arg: number;\n memory: WebAssembly.Memory;\n ids: SharedArrayBuffer;\n modules?: Record<string, WebAssembly.Module>;\n}\n\nexport interface WasmThreadSpawnMsg {\n type: typeof WASM_THREAD_SPAWN;\n thread: WasmThread;\n}\n\nexport interface WasmThreadInitMsg extends Omit<WasmProcessInitMsg, 'type' | 'fork' | 'fds'> {\n type: typeof WASM_THREAD_INIT;\n thread: WasmThread;\n}\n\nexport interface WasmThreadExitMsg {\n type: typeof WASM_THREAD_EXIT;\n}\n", "import { dispatchSyncFs } from '../realm/sync-fs-dispatch.ts';\nimport {\n mintSyncFsToken,\n revokeSyncFsToken,\n type SyncFsTokenEntry,\n} from '../realm/sync-fs-token-registry.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n attachSyncSabResponder,\n type SyncSabDispatchRequest,\n} from '../realm/sync-sab-responder.ts';\nimport {\n SAB_DEFAULT_WINDOW_BYTES,\n SAB_HEADER_BYTES,\n SAB_HEADER_I32,\n SAB_I_SIGNALS,\n SAB_I_TIMERS,\n} from '../realm/sync-sab-wire.ts';\nimport type { ChildForker, ChildSpawner } from './children.ts';\nimport { type FdTable, kernelFdKind, type OpenFile } from './fd-table.ts';\nimport type { LockTable } from './host-ops.ts';\nimport type { JobTable } from './jobs.ts';\nimport type { HttpHandles } from './net/http-syscalls.ts';\nimport { isWasmSyscall, type StateListener, WasmProcess } from './process.ts';\nimport {\n type ForkState,\n type InheritedFd,\n WASM_MAX_THREADS,\n WASM_PROCESS_ERROR,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_INIT,\n WASM_THREAD_EXIT,\n WASM_THREAD_INIT,\n WASM_THREAD_SPAWN,\n type WasmProcessInitMsg,\n type WasmProgram,\n type WasmThread,\n type WasmThreadInitMsg,\n} from './protocol.ts';\nimport type { PtyTable } from './pty.ts';\nimport { SIG, sigbit } from './signals.ts';\nimport { KernelSocket, type LoopbackNet } from './socket.ts';\n\nexport interface WasmWorkerLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n terminate(): void;\n}\n\nexport interface SpawnWasmOptions {\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n fs: SyncFsTokenEntry['fs'];\n createWorker: () => WasmWorkerLike;\n onError?: (message: string) => void;\n spawner?: ChildSpawner;\n forker?: ChildForker;\n fork?: ForkState;\n ppid?: number;\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n jobs?: JobTable;\n ptys?: PtyTable;\n\n net?: LoopbackNet;\n\n http?: HttpHandles;\n locks?: LockTable;\n onReap?: (pid: number) => void;\n}\n\nexport interface WasmProcessHandle {\n pid: number;\n exited: Promise<number>;\n kill(code?: number): void;\n signal(sig: number): void;\n termsig(): number | undefined;\n onState(listener: StateListener): void;\n}\n\nconst CRASHED = 70;\n\nconst descIds = new WeakMap<OpenFile, number>();\nlet nextDescId = 1;\n\nfunction descId(file: OpenFile): number {\n const id = descIds.get(file) ?? nextDescId++;\n descIds.set(file, id);\n return id;\n}\n\nexport function inheritedFds(fds: FdTable): InheritedFd[] {\n return fds\n .numbers()\n .filter((fd) => fd > 2 && !fds.get(fd).file.held)\n .map((fd): InheritedFd => {\n const open = fds.get(fd);\n const flags = fds.statusFlags(fd);\n const kind = open.file instanceof KernelSocket ? 'socket' : kernelFdKind(open.file);\n const meta = open.file.heldMeta;\n return {\n fd,\n kind,\n ...(kind === 'device' && meta && 'device' in meta ? { device: meta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(kind === 'stream' ? { desc: descId(open) } : {}),\n };\n });\n}\n\ninterface WorkerSays {\n type?: string;\n code?: unknown;\n message?: unknown;\n thread?: WasmThread;\n}\n\nexport function spawnWasmProcess(opts: SpawnWasmOptions): WasmProcessHandle {\n const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const header = new Int32Array(sab, 0, SAB_HEADER_I32);\n const process = new WasmProcess(opts.pid, opts.fds, {\n spawner: opts.spawner,\n forker: opts.forker,\n fs: opts.fs,\n kill: opts.kill,\n jobs: opts.jobs,\n ptys: opts.ptys,\n net: opts.net,\n http: opts.http,\n locks: opts.locks,\n onReap: opts.onReap,\n onPending: (sig) => void Atomics.or(header, SAB_I_SIGNALS, sigbit(sig)),\n onTimer: (which) => void Atomics.or(header, SAB_I_TIMERS, 1 << which),\n hasPending: () =>\n Atomics.load(header, SAB_I_SIGNALS) !== 0 || Atomics.load(header, SAB_I_TIMERS) !== 0,\n raise: (sig) => signal(sig),\n ...(opts.program.abi === 'wasi'\n ? { pendingBits: () => Atomics.load(header, SAB_I_SIGNALS) }\n : {}),\n });\n const token = mintSyncFsToken({ fs: opts.fs, cwd: opts.cwd });\n const worker = opts.createWorker();\n const dispatch = async (req: SyncSabDispatchRequest): Promise<SyncFsResult> => {\n if (isWasmSyscall(req)) return process.syscall(req);\n return dispatchSyncFs(req);\n };\n const responder = attachSyncSabResponder(worker, sab, token, { dispatch });\n\n let settle!: (code: number) => void;\n const exited = new Promise<number>((resolve) => (settle = resolve));\n let done = false;\n let endedBy: number | undefined;\n\n const finish = (code: number, sig?: number): void => {\n if (done) return;\n done = true;\n endedBy = sig ?? process.execTermsig;\n worker.removeEventListener('message', onMessage);\n worker.removeEventListener('error', onError);\n for (const tid of [...threads.keys()]) endThread(tid);\n responder.dispose();\n revokeSyncFsToken(token);\n worker.terminate();\n void process.exit().then(\n () => settle(code),\n () => settle(code)\n );\n };\n\n const handle = (data: WorkerSays | undefined): void => {\n if (data?.type === WASM_PROCESS_EXIT) {\n finish(typeof data.code === 'number' ? data.code : CRASHED);\n } else if (data?.type === WASM_PROCESS_ERROR) {\n opts.onError?.(String(data.message));\n finish(CRASHED);\n } else if (data?.type === WASM_THREAD_SPAWN && data.thread) {\n spawnThread(data.thread);\n }\n };\n const onMessage = (event: MessageEvent): void => handle(event.data as WorkerSays | undefined);\n const onError = (event: MessageEvent): void => {\n event.preventDefault();\n opts.onError?.(String((event as unknown as ErrorEvent).message ?? 'worker error'));\n finish(CRASHED);\n };\n worker.addEventListener('message', onMessage);\n worker.addEventListener('error', onError);\n\n const threads = new Map<number, () => void>();\n const endThread = (tid: number): void => {\n const end = threads.get(tid);\n threads.delete(tid);\n end?.();\n };\n const spawnThread = (thread: WasmThread): void => {\n if (done) return;\n if (threads.size >= WASM_MAX_THREADS - 1) {\n opts.onError?.(`more than ${WASM_MAX_THREADS} threads`);\n finish(CRASHED);\n return;\n }\n const tsab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const tw = opts.createWorker();\n const tresponder = attachSyncSabResponder(tw, tsab, token, { dispatch });\n const onThreadMessage = (event: MessageEvent): void => {\n const data = event.data as WorkerSays | undefined;\n if (data?.type === WASM_THREAD_EXIT) endThread(thread.tid);\n else handle(data);\n };\n tw.addEventListener('message', onThreadMessage);\n tw.addEventListener('error', onError);\n threads.set(thread.tid, () => {\n tw.removeEventListener('message', onThreadMessage);\n tw.removeEventListener('error', onError);\n tresponder.dispose();\n tw.terminate();\n });\n const tinit: WasmThreadInitMsg = {\n type: WASM_THREAD_INIT,\n pid: opts.pid,\n program: opts.program,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab: tsab,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n thread,\n };\n tw.postMessage(tinit);\n };\n\n const init: WasmProcessInitMsg = {\n type: WASM_PROCESS_INIT,\n pid: opts.pid,\n program: opts.program,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n ...(opts.fork ? { fork: opts.fork } : { fds: inheritedFds(opts.fds) }),\n };\n worker.postMessage(init, opts.fork ? [opts.fork.memory.buffer as ArrayBuffer] : []);\n\n const signal = (sig: number): void => {\n if (process.signal(sig) === 'terminate') finish(sig === SIG.KILL ? 137 : 128 + sig, sig);\n };\n const kill = (code = 137): void =>\n finish(code, code > 128 && code < 160 ? code - 128 : undefined);\n return {\n pid: opts.pid,\n exited,\n kill,\n signal,\n termsig: () => endedBy,\n onState: (listener) => process.onState(listener),\n };\n}\n", "import { KernelError } from './fd-table.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport interface JobMember {\n pid: number;\n pgid: number;\n sid: number;\n\n signal(sig: number): void;\n\n execParent?: number;\n\n ppid?: number;\n\n execed?: boolean;\n}\n\nexport class JobTable {\n private readonly members = new Map<number, JobMember>();\n private readonly foreground = new Map<KernelTty, number>();\n\n private readonly terminals = new Map<number, KernelTty>();\n\n add(\n pid: number,\n parentPid: number | undefined,\n signal: (sig: number) => void,\n terminal?: KernelTty\n ): JobMember {\n const parent = parentPid === undefined ? undefined : this.members.get(parentPid);\n if (!parent && terminal) this.terminals.set(pid, terminal);\n const member: JobMember = {\n pid,\n ppid: parent?.pid,\n pgid: parent?.pgid ?? pid,\n sid: parent?.sid ?? pid,\n signal,\n };\n this.members.set(pid, member);\n return member;\n }\n\n remove(pid: number): void {\n this.members.delete(pid);\n }\n\n exec(pid: number, child: number): void {\n const member = this.members.get(child);\n if (member) member.execParent = pid;\n const execer = this.members.get(pid);\n if (execer) execer.execed = true;\n }\n\n pgidOf(pid: number): number | undefined {\n return this.members.get(pid)?.pgid;\n }\n\n private member(pid: number): JobMember {\n const member = this.members.get(pid);\n if (!member) throw new KernelError('ESRCH');\n return member;\n }\n\n setpgid(caller: number, pid: number, pgid: number): void {\n const target = this.member(pid || caller);\n const group = pgid || target.pid;\n if (group < 0) throw new KernelError('EINVAL');\n const self = this.member(caller);\n if (target.pid !== caller) {\n if (target.ppid !== caller) throw new KernelError('ESRCH');\n if (target.execed) throw new KernelError('EACCES');\n }\n if (target.sid !== self.sid) throw new KernelError('EPERM');\n if (target.pid === target.sid) throw new KernelError('EPERM');\n\n const exists = [...this.members.values()].some((m) => m.pgid === group && m.sid === target.sid);\n if (group !== target.pid && !exists) throw new KernelError('EPERM');\n target.pgid = group;\n }\n\n getpgid(caller: number, pid: number): number {\n return this.member(pid || caller).pgid;\n }\n\n getsid(caller: number, pid: number): number {\n return this.member(pid || caller).sid;\n }\n\n setsid(pid: number): number {\n const member = this.member(pid);\n if (member.pgid === pid) throw new KernelError('EPERM');\n member.sid = pid;\n member.pgid = pid;\n this.terminals.delete(pid);\n return pid;\n }\n\n terminalNamed(name: string): KernelTty | undefined {\n const known = new Set([...this.terminals.values(), ...this.foreground.keys()]);\n return [...known].find((tty) => tty.name === name);\n }\n\n controllingTerminal(pid: number): KernelTty | null | undefined {\n const member = this.members.get(pid);\n return member && (this.terminals.get(member.sid) ?? null);\n }\n\n acquireTerminal(pid: number, tty: KernelTty): boolean {\n const member = this.members.get(pid);\n if (!member || member.sid !== pid || this.terminals.has(pid)) return false;\n if ([...this.terminals.values()].includes(tty)) return false;\n this.terminals.set(pid, tty);\n this.foreground.set(tty, member.pgid);\n return true;\n }\n\n killGroup(pgid: number, sig: number): boolean {\n const targets = [...this.members.values()].filter((m) => m.pgid === pgid);\n const pids = new Set(targets.map((m) => m.pid));\n if (sig !== 0) {\n for (const m of targets)\n if (m.execParent === undefined || !pids.has(m.execParent)) m.signal(sig);\n }\n return targets.length > 0;\n }\n\n tcgetpgrp(tty: KernelTty, fallback: number): number {\n return this.foreground.get(tty) ?? fallback;\n }\n\n tcsetpgrp(caller: number, tty: KernelTty, pgid: number): void {\n const self = this.member(caller);\n const inSession = [...this.members.values()].some((m) => m.pgid === pgid && m.sid === self.sid);\n if (!inSession) throw new KernelError('EPERM');\n this.foreground.set(tty, pgid);\n }\n\n signalOwnedForeground(tty: KernelTty, sig: number): void {\n const pgid = this.foreground.get(tty);\n if (pgid !== undefined) this.killGroup(pgid, sig);\n }\n\n signalForeground(tty: KernelTty, fallback: number, sig: number): void {\n this.killGroup(this.tcgetpgrp(tty, fallback), sig);\n }\n}\n", "export interface ImportedMemory {\n module: string;\n name: string;\n initial: number;\n maximum?: number;\n shared: boolean;\n}\n\nexport function importedMemory(bytes: Uint8Array): ImportedMemory | undefined {\n let at = 8;\n const u32 = (): number => {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = bytes[at++];\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n };\n const name = (): string => {\n const len = u32();\n const s = new TextDecoder().decode(bytes.subarray(at, at + len));\n at += len;\n return s;\n };\n const limits = () => {\n const flags = bytes[at++];\n const initial = u32();\n const maximum = flags & 1 ? u32() : undefined;\n return { initial, maximum, shared: (flags & 2) !== 0 };\n };\n while (at < bytes.length) {\n const id = bytes[at++];\n const size = u32();\n const end = at + size;\n if (id !== 2) {\n at = end;\n continue;\n }\n const count = u32();\n for (let i = 0; i < count; i++) {\n const module = name();\n const field = name();\n const kind = bytes[at++];\n if (kind === 0) u32();\n else if (kind === 1) {\n at++;\n limits();\n } else if (kind === 2) {\n const l = limits();\n return { module, name: field, ...l };\n } else if (kind === 3) at += 2;\n else if (kind === 4) {\n at++;\n u32();\n }\n }\n return undefined;\n }\n return undefined;\n}\n\nexport const RESERVED_NAMESPACES: ReadonlySet<string> = new Set([\n 'wasi_snapshot_preview1',\n 'wasix_32v1',\n 'wasi',\n 'env',\n]);\n\nexport type ForeignResult = 'none' | 'i32' | 'i64' | 'f32' | 'f64' | 'other';\n\nexport type ForeignResults = Record<string, Record<string, ForeignResult>>;\n\nconst RESULTS: Readonly<Record<number, ForeignResult>> = {\n 127: 'i32',\n 126: 'i64',\n 125: 'f32',\n 124: 'f64',\n};\n\nfunction resultOf(results: number[]): ForeignResult {\n if (results.length === 0) return 'none';\n return (results.length === 1 && RESULTS[results[0]]) || 'other';\n}\n\nclass Reader {\n at = 8;\n readonly bytes: Uint8Array;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n }\n\n byte(): number {\n return this.bytes[this.at++];\n }\n\n u32(): number {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = this.byte();\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n }\n\n name(): string {\n const len = this.u32();\n const s = new TextDecoder().decode(this.bytes.subarray(this.at, this.at + len));\n this.at += len;\n return s;\n }\n\n valtype(): number {\n const code = this.byte();\n if (code === 0x63 || code === 0x64) this.u32();\n return code;\n }\n\n limits(): void {\n const flags = this.byte();\n this.u32();\n if (flags & 1) this.u32();\n }\n}\n\nfunction readTypes(r: Reader): ForeignResult[] | undefined {\n const types: ForeignResult[] = [];\n for (let i = r.u32(); i > 0; i--) {\n if (r.byte() !== 0x60) return undefined;\n for (let n = r.u32(); n > 0; n--) r.valtype();\n const results: number[] = [];\n for (let n = r.u32(); n > 0; n--) results.push(r.valtype());\n types.push(resultOf(results));\n }\n return types;\n}\n\nfunction skipImport(r: Reader, kind: number): void {\n if (kind === 1) {\n r.valtype();\n r.limits();\n } else if (kind === 2) r.limits();\n else if (kind === 3) {\n r.valtype();\n r.byte();\n } else {\n r.byte();\n r.u32();\n }\n}\n\nfunction readImports(r: Reader, types: ForeignResult[]): ForeignResults {\n const foreign: ForeignResults = {};\n for (let i = r.u32(); i > 0; i--) {\n const module = r.name();\n const field = r.name();\n const kind = r.byte();\n if (kind !== 0) skipImport(r, kind);\n else {\n const type = types[r.u32()] ?? 'other';\n if (!RESERVED_NAMESPACES.has(module)) (foreign[module] ??= {})[field] = type;\n }\n }\n return foreign;\n}\n\nexport function foreignImports(bytes: Uint8Array): ForeignResults | undefined {\n const r = new Reader(bytes);\n let types: ForeignResult[] | undefined = [];\n while (r.at < bytes.length) {\n const id = r.byte();\n const end = r.u32() + r.at;\n if (id === 1) types = readTypes(r);\n if (!types) return undefined;\n if (id === 2) return readImports(r, types);\n r.at = end;\n }\n return {};\n}\n", "import { type Abi, type Command, scanCommands } from './commands.ts';\nimport { followLinks, withCommandDirs } from './fs/commands.ts';\nimport type { KernelFs } from './fs/types.ts';\nimport {\n type ChildForker,\n type ChildHandle,\n type ChildSpawner,\n SpawnError,\n} from './kernel/children.ts';\nimport { bytesSource, FdTable, nullFile, sinkFile } from './kernel/fd-table.ts';\nimport { spawnWasmProcess, type WasmProcessHandle, type WasmWorkerLike } from './kernel/host.ts';\nimport { LockTable } from './kernel/host-ops.ts';\nimport { JobTable } from './kernel/jobs.ts';\nimport { HttpHandles } from './kernel/net/http-syscalls.ts';\nimport {\n enableNetwork,\n kernelCa,\n kernelTlsEngine,\n memoryCaStore,\n missingTransport,\n networkEnv,\n packageTlsEngine,\n writeCaFile,\n} from './kernel/net/network.ts';\nimport type { CaStore, RealmCa } from './kernel/net/realm-ca.ts';\nimport type { RealmTransport } from './kernel/net/transport.ts';\nimport type { ForkState, WasmProgram } from './kernel/protocol.ts';\nimport { PtyTable } from './kernel/pty.ts';\nimport { LoopbackNet } from './kernel/socket.ts';\nimport { KernelTty } from './kernel/tty.ts';\nimport {\n type ForeignResults,\n foreignImports,\n type ImportedMemory,\n importedMemory,\n} from './process/wasi/wasi-module.ts';\n\nexport interface LauncherOptions {\n fs: KernelFs;\n createWorker: () => WasmWorkerLike;\n modules?: string;\n env?: Record<string, string>;\n transport?: RealmTransport;\n caStore?: CaStore;\n}\n\nexport interface RunOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: Uint8Array;\n onStdout?: (bytes: Uint8Array) => void;\n onStderr?: (bytes: Uint8Array) => void;\n}\n\nexport interface TerminalOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n onData: (bytes: Uint8Array) => void;\n}\n\nexport interface TerminalSession {\n pid: number;\n exited: Promise<number>;\n write(bytes: Uint8Array): void;\n resize(cols: number, rows: number): void;\n signal(sig: number): void;\n close(): void;\n}\n\nexport interface RunResult {\n status: number;\n stdout: Uint8Array;\n stderr: Uint8Array;\n}\n\ninterface Target {\n abi: Abi;\n glue: string;\n wasm: string;\n argv0: string;\n prefix?: string[];\n env?: Record<string, string>;\n unset?: string[];\n imports?: string;\n}\n\ninterface Compiled {\n module: WebAssembly.Module;\n memory?: ImportedMemory;\n foreign?: ForeignResults | undefined;\n}\n\ninterface Planned {\n target: Target;\n args: string[];\n}\n\ninterface StartRequest {\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n report: (message: string) => void;\n ppid?: number;\n fork?: ForkState;\n}\n\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst PACKAGE_ROOT = /^(.*\\/node_modules\\/(?:@[^/]+\\/)?[^/]+)\\//;\nconst ENV_REFERENCE = /\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\nconst WASM_MAGIC = [0x00, 0x61, 0x73, 0x6d];\nconst SHEBANG_MAX = 256;\nconst NOT_FOUND = 127;\nconst SHARED_DIRS = ['/tmp', '/home'];\nconst encoder = new TextEncoder();\n\nfunction baseName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction modulePath(glue: string): string {\n return glue.endsWith('.js') ? `${glue.slice(0, -3)}.wasm` : `${glue}.wasm`;\n}\n\nfunction isWasm(bytes: Uint8Array): boolean {\n return WASM_MAGIC.every((b, i) => bytes[i] === b);\n}\n\nfunction shebang(head: Uint8Array): string[] | undefined {\n if (head[0] !== 0x23 || head[1] !== 0x21) return undefined;\n return new TextDecoder()\n .decode(head.subarray(0, SHEBANG_MAX))\n .slice(2)\n .split('\\n')[0]\n .trim()\n .split(/[ \\t]+/);\n}\n\nfunction interpreter(head: Uint8Array): string {\n const words = shebang(head);\n if (!words) return 'node';\n if (baseName(words[0]) === 'env') words.shift();\n if (words[0] === '-S') words.shift();\n return baseName(words[0] ?? '');\n}\n\nexport function expandDefaults(\n defaults: Readonly<Record<string, string>> | undefined,\n env: Readonly<Record<string, string>>\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(defaults ?? {})) {\n let missing = false;\n const expanded = value.replace(ENV_REFERENCE, (_, name: string) => {\n const set = Object.hasOwn(env, name) ? env[name] : undefined;\n if (set === undefined) missing = true;\n return set ?? '';\n });\n if (!missing) out[key] = expanded;\n }\n return out;\n}\n\nfunction targetOf(command: Command): Target {\n return {\n abi: command.abi,\n glue: command.glue,\n wasm: command.wasm,\n argv0: command.argv0,\n ...(command.args ? { prefix: command.args } : {}),\n ...(command.env ? { env: command.env } : {}),\n ...(command.unset ? { unset: command.unset } : {}),\n ...(command.imports ? { imports: command.imports } : {}),\n };\n}\n\nfunction childHandle(handle: WasmProcessHandle): ChildHandle {\n return {\n pid: handle.pid,\n exited: handle.exited,\n termsig: handle.termsig,\n onState: (listener) => handle.onState(listener),\n };\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, chunk) => n + chunk.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\nexport class Launcher {\n readonly fs: KernelFs;\n private readonly base: KernelFs;\n private readonly createWorker: () => WasmWorkerLike;\n private readonly modulesDir: string;\n private readonly env: Record<string, string>;\n private catalog: Promise<Map<string, Command>> | undefined;\n private readonly compiled = new Map<string, Promise<Compiled>>();\n private readonly processes = new Map<number, WasmProcessHandle>();\n private readonly zombies = new Set<number>();\n private readonly orphans = new Set<number>();\n private readonly jobs = new JobTable();\n private readonly locks = new LockTable();\n private readonly ptys = new PtyTable((tty, sig) => this.jobs.signalOwnedForeground(tty, sig));\n readonly net = new LoopbackNet();\n private readonly ca: () => Promise<RealmCa>;\n private readonly transport: RealmTransport;\n private nextPid = 1000;\n private terminals = 0;\n\n constructor(options: LauncherOptions) {\n this.base = options.fs;\n this.createWorker = options.createWorker;\n this.modulesDir = options.modules ?? '/node_modules';\n this.env = { ...networkEnv(), ...options.env };\n this.ca = kernelCa(options.caStore ?? memoryCaStore());\n this.transport = options.transport ?? missingTransport();\n enableNetwork(this.net, {\n transport: this.transport,\n engine: kernelTlsEngine(packageTlsEngine(options.fs, this.modulesDir)),\n ca: this.ca,\n });\n this.fs = withCommandDirs(options.fs, async () => new Set((await this.commands()).keys()));\n }\n\n commands(): Promise<Map<string, Command>> {\n this.catalog ??= scanCommands(this.base, this.modulesDir);\n return this.catalog;\n }\n\n async resolve(file: string, argv0: string, cwd: string): Promise<Target | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name !== undefined) {\n const command = (await this.commands()).get(name);\n return command && !command.script ? targetOf(command) : undefined;\n }\n const glue = await followLinks(this.base, this.fs.resolvePath(cwd, file));\n const linked = COMMAND.exec(glue)?.[1];\n if (linked !== undefined) return this.resolve(`/bin/${linked}`, argv0, cwd);\n const head = await this.head(glue);\n if (!head) return undefined;\n if (isWasm(head)) {\n return {\n abi: 'wasi',\n glue,\n wasm: glue,\n argv0: baseName(argv0 || file).replace(/\\.wasm$/, ''),\n };\n }\n if (interpreter(head) !== 'node') return undefined;\n const wasm = modulePath(glue);\n if (!(await this.base.exists(wasm))) return undefined;\n return { abi: 'emscripten', glue, wasm, argv0: baseName(argv0 || file) };\n }\n\n private async head(path: string): Promise<Uint8Array | undefined> {\n try {\n return (await this.base.readFileBuffer(path)).subarray(0, SHEBANG_MAX);\n } catch {\n return undefined;\n }\n }\n\n private async scriptCommand(file: string): Promise<Command | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name === undefined) return undefined;\n const command = (await this.commands()).get(name);\n return command?.script ? command : undefined;\n }\n\n private async interpreted(\n file: string,\n argv: string[],\n cwd: string\n ): Promise<Planned | undefined> {\n const command = await this.scriptCommand(file);\n const script = command?.script ?? this.fs.resolvePath(cwd, file);\n const words = shebang((await this.head(script)) ?? new Uint8Array());\n if (!words) return undefined;\n if (baseName(words[0]) === 'env') words.shift();\n const [interp, ...rest] = words;\n const found = interp ? await this.resolve(interp, interp, cwd) : undefined;\n if (!found) return undefined;\n const target = command\n ? {\n ...found,\n env: { ...found.env, ...command.env },\n unset: [...(found.unset ?? []), ...(command.unset ?? [])],\n }\n : found;\n const arg = rest.join(' ');\n return {\n target,\n args: [\n ...(target.prefix ?? []),\n ...(arg ? [arg] : []),\n command ? script : file,\n ...argv.slice(1),\n ],\n };\n }\n\n private async plan(file: string, argv: string[], cwd: string): Promise<Planned | undefined> {\n const direct = await this.resolve(file, argv[0] ?? file, cwd);\n if (direct) return { target: direct, args: [...(direct.prefix ?? []), ...argv.slice(1)] };\n return this.interpreted(file, argv, cwd);\n }\n\n private async unrunnable(file: string, cwd: string): Promise<'ENOEXEC' | 'ENOENT'> {\n const head = await this.base.readFileBuffer(this.fs.resolvePath(cwd, file)).catch(() => null);\n return head && !(head[0] === 0x23 && head[1] === 0x21) ? 'ENOEXEC' : 'ENOENT';\n }\n\n private module(path: string): Promise<Compiled> {\n return this.base.stat(path).then((st) => {\n const key = `${path}:${st.size}:${st.mtime.getTime()}`;\n let module = this.compiled.get(key);\n if (!module) {\n module = this.base.readFileBuffer(path).then(async (bytes) => {\n const memory = importedMemory(bytes);\n const foreign = foreignImports(bytes);\n const compiled = await WebAssembly.compile(bytes as BufferSource);\n return {\n module: compiled,\n ...(memory ? { memory } : {}),\n foreign,\n };\n });\n this.compiled.set(key, module);\n module.catch(() => this.compiled.delete(key));\n }\n return module;\n });\n }\n\n private async names(path: string, module: WebAssembly.Module): Promise<string | undefined> {\n if (WebAssembly.Module.customSections(module, 'name').length > 0) return undefined;\n const beside = `${path}.names`;\n if (await this.base.exists(beside)) return beside;\n const root = PACKAGE_ROOT.exec(path)?.[1];\n if (root === undefined) return undefined;\n const optional = `${root}-names${beside.slice(root.length)}`;\n return (await this.base.exists(optional)) ? optional : undefined;\n }\n\n private async program(target: Target, env: Record<string, string>): Promise<WasmProgram> {\n if (target.abi !== 'wasi') {\n const [glue, { module }] = await Promise.all([\n this.base.readFile(target.glue),\n this.module(target.wasm),\n ]);\n return { glue, module };\n }\n const { module, memory, foreign } = await this.module(target.wasm);\n const names =\n env.SLICC_WASM_BACKTRACE === '1' ? await this.names(target.wasm, module) : undefined;\n const imports = target.imports ? await this.base.readFile(target.imports) : undefined;\n return {\n abi: 'wasi',\n glue: '',\n module,\n ...(memory ? { memory } : {}),\n foreign,\n ...(names ? { names } : {}),\n ...(imports !== undefined ? { imports } : {}),\n };\n }\n\n private async launch(\n planned: Planned,\n req: Omit<StartRequest, 'program' | 'argv0' | 'args'>\n ): Promise<WasmProcessHandle> {\n const { target, args } = planned;\n const env = { ...expandDefaults(target.env, { ...req.env, cwd: req.cwd }), ...req.env };\n for (const key of target.unset ?? []) delete env[key];\n let program: WasmProgram;\n try {\n program = await this.program(target, env);\n } catch (err) {\n await req.fds.closeAll();\n throw err;\n }\n return this.start({ ...req, program, argv0: target.argv0, args, env });\n }\n\n private start(req: StartRequest): WasmProcessHandle {\n const pid = this.nextPid++;\n const terminal = req.fds.stdioTerminal();\n const handle = spawnWasmProcess({\n pid,\n program: req.program,\n argv0: req.argv0,\n args: req.args,\n env: req.env,\n cwd: req.cwd,\n fds: req.fds,\n fs: this.fs,\n createWorker: this.createWorker,\n onError: req.report,\n spawner: this.spawner(pid, req.report),\n forker: this.forker(pid, req),\n kill: (target, sig) => this.kill(target, sig),\n jobs: this.jobs,\n ptys: this.ptys,\n net: this.net,\n http: new HttpHandles(this.transport),\n locks: this.locks,\n onReap: (child) => this.reaped(child),\n ...(req.fork ? { fork: req.fork } : {}),\n ...(req.ppid !== undefined ? { ppid: req.ppid } : {}),\n });\n this.processes.set(pid, handle);\n this.jobs.add(pid, req.ppid, (sig) => handle.signal(sig), terminal);\n void handle.exited.then(() => {\n this.processes.delete(pid);\n if (req.ppid === undefined || this.orphans.delete(pid)) this.jobs.remove(pid);\n else this.zombies.add(pid);\n });\n return handle;\n }\n\n private reaped(pid: number): void {\n if (this.zombies.delete(pid)) this.jobs.remove(pid);\n else this.orphans.add(pid);\n }\n\n private spawner(ppid: number, report: (message: string) => void): ChildSpawner {\n return async (req, fds) => {\n const planned = await this.plan(req.file, req.argv, req.cwd);\n if (!planned) {\n await fds.closeAll();\n throw new SpawnError(await this.unrunnable(req.file, req.cwd));\n }\n const handle = await this.launch(planned, { env: req.env, cwd: req.cwd, fds, report, ppid });\n return childHandle(handle);\n };\n }\n\n private forker(ppid: number, parent: StartRequest): ChildForker {\n return async (state, fds) =>\n childHandle(this.start({ ...parent, cwd: state.cwd ?? parent.cwd, fds, ppid, fork: state }));\n }\n\n kill(pid: number, sig: number): boolean {\n if (pid < 0) return this.jobs.killGroup(-pid, sig);\n const handle = this.processes.get(pid);\n if (!handle) return false;\n if (sig !== 0) handle.signal(sig);\n return true;\n }\n\n async prepare(): Promise<void> {\n for (const dir of SHARED_DIRS) await this.base.mkdir(dir, { recursive: true });\n await writeCaFile(this.base, this.ca).catch(() => undefined);\n }\n\n private environment(cwd: string, extra: Record<string, string> | undefined) {\n return { PATH: '/usr/bin:/bin', HOME: '/home', ...this.env, PWD: cwd, ...extra };\n }\n\n private async starting(argv: string[], dir: string | undefined) {\n this.catalog = undefined;\n const cwd = this.fs.resolvePath('/', dir ?? '/');\n const [file = ''] = argv;\n await this.base.mkdir(cwd, { recursive: true });\n return { cwd, file, planned: await this.plan(file, argv, cwd) };\n }\n\n async openTerminal(argv: string[], options: TerminalOptions): Promise<TerminalSession> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n if (!planned) throw new Error(`${file}: command not found`);\n let leader = 0;\n const tty: KernelTty = new KernelTty(\n { write: (bytes) => options.onData(bytes.slice()) },\n (sig) => this.jobs.signalForeground(tty, leader, sig)\n );\n tty.name = `/dev/tty${++this.terminals}`;\n tty.setSize(options.cols ?? 80, options.rows ?? 24);\n const fds = new FdTable();\n const stdio = tty.file();\n fds.installAt(0, stdio);\n fds.installAt(1, stdio.retain());\n fds.installAt(2, stdio.retain());\n const env = this.environment(cwd, {\n TERM: 'xterm-256color',\n COLORTERM: 'truecolor',\n ...options.env,\n });\n const report = (message: string) => options.onData(encoder.encode(`${message}\\r\\n`));\n const handle = await this.launch(planned, { env, cwd, fds, report });\n leader = handle.pid;\n void handle.exited.then(() => tty.hangup());\n return {\n pid: handle.pid,\n exited: handle.exited,\n write: (bytes) => tty.receive(bytes),\n resize: (cols, rows) => tty.resize(cols, rows),\n signal: (sig) => this.jobs.signalForeground(tty, leader, sig),\n close: () => {\n tty.signalHangup();\n tty.hangup();\n },\n };\n }\n\n async run(argv: string[], options: RunOptions = {}): Promise<RunResult> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n const env = this.environment(cwd, options.env);\n const out: Uint8Array[] = [];\n const err: Uint8Array[] = [];\n const collect =\n (chunks: Uint8Array[], tee?: (bytes: Uint8Array) => void) => (bytes: Uint8Array) => {\n chunks.push(bytes);\n tee?.(bytes);\n };\n const stdout = collect(out, options.onStdout);\n const stderr = collect(err, options.onStderr);\n const report = (message: string) => stderr(encoder.encode(`${message}\\n`));\n if (!planned) {\n report(`${file}: command not found`);\n return { status: NOT_FOUND, stdout: concat(out), stderr: concat(err) };\n }\n const fds = new FdTable();\n fds.installAt(0, options.stdin ? bytesSource(options.stdin) : nullFile());\n fds.installAt(1, sinkFile(stdout));\n fds.installAt(2, sinkFile(stderr));\n const handle = await this.launch(planned, { env, cwd, fds, report });\n const status = await handle.exited;\n return { status, stdout: concat(out), stderr: concat(err) };\n }\n}\n", "import { META_DB, type MetaStore } from './fs/meta.ts';\nimport { OpfsFs } from './fs/opfs.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport { caStore } from './kernel/net/network.ts';\nimport { RemoteTransport, type TransportReply } from './kernel/net/remote-transport.ts';\nimport type { RealmTransportTraits } from './kernel/net/transport.ts';\nimport { SIG } from './kernel/signals.ts';\nimport {\n Launcher,\n type RunOptions,\n type TerminalOptions,\n type TerminalSession,\n} from './launcher.ts';\n\nexport interface KernelPort {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface InitRequest {\n id: number;\n op: 'init';\n root?: FileSystemDirectoryHandle;\n modules?: string;\n env?: Record<string, string>;\n metadata?: string | false;\n transport?: RealmTransportTraits;\n}\n\nexport interface RunRequest {\n id: number;\n op: 'run';\n argv: string[];\n options: Omit<RunOptions, 'onStdout' | 'onStderr'>;\n}\n\nexport interface OpenTerminalRequest {\n id: number;\n op: 'open-terminal';\n argv: string[];\n options: Omit<TerminalOptions, 'onData'>;\n}\n\nexport type TerminalAction =\n | { action: 'write'; bytes: Uint8Array }\n | { action: 'resize'; cols: number; rows: number }\n | { action: 'signal'; signal: string }\n | { action: 'close' };\n\nexport type TerminalRequest = { id: number; op: 'terminal'; terminal: number } & TerminalAction;\n\nexport type KernelRequest = InitRequest | RunRequest | OpenTerminalRequest | TerminalRequest;\n\ntype WithoutId<T> = T extends unknown ? Omit<T, 'id'> : never;\n\nexport type KernelCall = WithoutId<KernelRequest>;\n\nexport interface ServeDeps {\n storage: () => Promise<FileSystemDirectoryHandle>;\n createWorker: () => WasmWorkerLike;\n metadata?: (name: string) => Promise<MetaStore>;\n}\n\nexport function signalNumber(name: string): number {\n const key = name.slice(3);\n if (!name.startsWith('SIG') || !Object.hasOwn(SIG, key))\n throw new Error(`unknown signal ${name}`);\n return (SIG as Record<string, number>)[key];\n}\n\nfunction act(session: TerminalSession, req: TerminalAction): void {\n if (req.action === 'write') session.write(req.bytes);\n else if (req.action === 'resize') session.resize(req.cols, req.rows);\n else if (req.action === 'signal') session.signal(signalNumber(req.signal));\n else session.close();\n}\n\nfunction dirsChannel(name: string | false): string | undefined {\n return name === false ? undefined : `slicc-kernel-dirs:${name}`;\n}\n\nexport function serveKernel(port: KernelPort, deps: ServeDeps): void {\n let launcher: Promise<Launcher> | undefined;\n let remote: RemoteTransport | undefined;\n const terminals = new Map<number, TerminalSession>();\n const reply = (id: number, body: object) => port.postMessage({ id, ...body });\n\n async function ready(): Promise<Launcher> {\n if (!launcher) throw new Error('the kernel is not initialized');\n return launcher;\n }\n\n async function terminal(req: OpenTerminalRequest): Promise<number> {\n const onData = (bytes: Uint8Array) => reply(req.id, { fd: 1, bytes });\n const session = await (await ready()).openTerminal(req.argv, { ...req.options, onData });\n terminals.set(req.id, session);\n reply(req.id, { started: session.pid });\n try {\n return await session.exited;\n } finally {\n terminals.delete(req.id);\n }\n }\n\n async function handle(req: KernelRequest): Promise<unknown> {\n if (req.op === 'init') {\n launcher = (req.root ? Promise.resolve(req.root) : deps.storage()).then(async (root) => {\n const name = req.metadata ?? META_DB;\n const meta = name === false ? undefined : await deps.metadata?.(name);\n remote = req.transport ? new RemoteTransport(port, req.transport) : undefined;\n const fs = new OpfsFs(root, meta, dirsChannel(name));\n await fs.reconcile();\n const started = new Launcher({\n fs,\n createWorker: deps.createWorker,\n ...(req.modules ? { modules: req.modules } : {}),\n ...(req.env ? { env: req.env } : {}),\n ...(remote ? { transport: remote } : {}),\n caStore: caStore(deps.metadata ? name : false),\n });\n await started.prepare();\n return started;\n });\n await launcher;\n return true;\n }\n if (req.op === 'open-terminal') return terminal(req);\n if (req.op === 'terminal') {\n const session = terminals.get(req.terminal);\n if (!session) throw new Error(`no terminal ${req.terminal}`);\n act(session, req);\n return true;\n }\n return (await ready()).run(req.argv, {\n ...req.options,\n onStdout: (bytes) => reply(req.id, { fd: 1, bytes }),\n onStderr: (bytes) => reply(req.id, { fd: 2, bytes }),\n });\n }\n\n port.addEventListener('message', (event) => {\n if ((event.data as { net?: unknown }).net !== undefined) {\n remote?.receive(event.data as TransportReply);\n return;\n }\n const req = event.data as KernelRequest;\n handle(req).then(\n (result) => reply(req.id, { result }),\n (err) => reply(req.id, { error: err instanceof Error ? err.message : String(err) })\n );\n });\n}\n", "import { openMeta } from './fs/meta.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport { pinScript } from './pin.ts';\nimport { type KernelPort, serveKernel } from './serve.ts';\n\nconst processWorker = pinScript(new URL('./process-worker.js', import.meta.url));\n\nserveKernel(globalThis as unknown as KernelPort, {\n storage: () => navigator.storage.getDirectory(),\n createWorker: () => new Worker(processWorker, { type: 'module' }) as WasmWorkerLike,\n metadata: (name) => openMeta(name, indexedDB),\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export interface MetaEntry {\n path: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n mtimeFor?: number;\n ctimeMs?: number;\n ino?: number;\n link?: string;\n dir?: string;\n}\n\nexport type MetaChange = (entry: MetaEntry | undefined) => MetaEntry | undefined;\n\nexport interface MetaStore {\n get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>>;\n update(path: string, change: MetaChange): Promise<void>;\n move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry): Promise<void>;\n remove(paths: readonly string[]): Promise<void>;\n links(dir: string): Promise<MetaEntry[]>;\n under(path: string): Promise<MetaEntry[]>;\n all(): Promise<MetaEntry[]>;\n}\n\nexport const META_DB = 'slicc-kernel';\nexport const META_VERSION = 1;\nexport const META_STORE = 'entries';\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction moved(entry: MetaEntry, path: string): MetaEntry {\n return entry.link === undefined ? { ...entry, path } : { ...entry, path, dir: parentOf(path) };\n}\n\nfunction under(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport class MemoryMeta implements MetaStore {\n private readonly entries = new Map<string, MetaEntry>();\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n return paths.map((path) => this.entries.get(path));\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n this.set(path, change(this.entries.get(path)));\n }\n\n private set(path: string, entry: MetaEntry | undefined): void {\n if (entry) this.entries.set(path, entry);\n else this.entries.delete(path);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n await this.remove([to]);\n const carried = [...this.entries.values()].filter((entry) => under(entry.path, from));\n for (const entry of carried) this.entries.delete(entry.path);\n for (const entry of carried) {\n const path = to + entry.path.slice(from.length);\n if (path !== to) this.entries.set(path, moved(entry, path));\n }\n this.entries.set(to, moved(root(carried.find((entry) => entry.path === from)), to));\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n for (const key of [...this.entries.keys()]) {\n if (paths.some((path) => under(key, path))) this.entries.delete(key);\n }\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n return [...this.entries.values()].filter((entry) => entry.dir === dir);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n return [...this.entries.values()].filter((entry) => under(entry.path, path));\n }\n\n async all(): Promise<MetaEntry[]> {\n return [...this.entries.values()];\n }\n}\n\nfunction descendants(path: string): IDBKeyRange {\n return IDBKeyRange.bound(`${path}/`, `${path}0`, false, true);\n}\n\nfunction settle<T>(transaction: IDBTransaction, value: () => T): Promise<T> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve(value());\n transaction.onabort = () =>\n reject(transaction.error ?? new Error('metadata transaction aborted'));\n });\n}\n\ninterface Invalidation {\n paths?: readonly string[];\n trees?: readonly string[];\n}\n\nexport class IndexedDbMeta implements MetaStore {\n private readonly db: IDBDatabase;\n private readonly cache = new Map<string, MetaEntry | null>();\n private readonly channel: BroadcastChannel;\n private generation = 0;\n\n constructor(db: IDBDatabase) {\n this.db = db;\n db.onversionchange = () => db.close();\n this.channel = new BroadcastChannel(`slicc-kernel-meta:${db.name}`);\n this.channel.onmessage = ({ data }) => this.drop(data as Invalidation);\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n\n private drop({ paths = [], trees = [] }: Invalidation): void {\n this.generation++;\n for (const path of paths) this.cache.delete(path);\n for (const key of [...this.cache.keys()]) {\n if (trees.some((tree) => under(key, tree))) this.cache.delete(key);\n }\n }\n\n private changed(invalidation: Invalidation): void {\n this.drop(invalidation);\n this.channel.postMessage(invalidation);\n }\n\n private transaction(mode: IDBTransactionMode): [IDBTransaction, IDBObjectStore] {\n const transaction = this.db.transaction(META_STORE, mode);\n return [transaction, transaction.objectStore(META_STORE)];\n }\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n const missing = paths.filter((path) => !this.cache.has(path));\n if (missing.length > 0) {\n const generation = this.generation;\n const [transaction, store] = this.transaction('readonly');\n const found = new Map<string, MetaEntry | null>();\n for (const path of missing) {\n const request = store.get(path);\n request.onsuccess = () => void found.set(path, request.result ?? null);\n }\n await settle(transaction, () => undefined);\n if (generation === this.generation)\n for (const [path, entry] of found) this.cache.set(path, entry);\n return paths.map(\n (path) => (found.has(path) ? found.get(path) : this.cache.get(path)) ?? undefined\n );\n }\n return paths.map((path) => this.cache.get(path) ?? undefined);\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n const request = store.get(path);\n let next: MetaEntry | undefined;\n request.onsuccess = () => {\n next = change(request.result);\n if (next) store.put(next);\n else store.delete(path);\n };\n await settle(transaction, () => undefined);\n this.changed({ paths: [path] });\n this.cache.set(path, next ?? null);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n const [transaction, store] = this.transaction('readwrite');\n store.delete(to);\n store.delete(descendants(to));\n const source = store.get(from);\n const below = store.getAll(descendants(from));\n below.onsuccess = () => {\n store.delete(from);\n store.delete(descendants(from));\n for (const entry of below.result as MetaEntry[]) {\n store.put(moved(entry, to + entry.path.slice(from.length)));\n }\n store.put(moved(root(source.result), to));\n };\n await settle(transaction, () => undefined);\n this.changed({ trees: [from, to] });\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n for (const path of paths) {\n store.delete(path);\n store.delete(descendants(path));\n }\n await settle(transaction, () => undefined);\n this.changed({ trees: paths });\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const request = store.index('dir').getAll(dir);\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const self = store.get(path);\n const below = store.getAll(descendants(path));\n return settle(transaction, () =>\n [self.result as MetaEntry | undefined, ...(below.result as MetaEntry[])].filter(\n (entry): entry is MetaEntry => entry !== undefined\n )\n );\n }\n\n async all(): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const request = store.getAll();\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n}\n\nexport function openMeta(name: string, factory: IDBFactory): Promise<IndexedDbMeta> {\n return new Promise((resolve, reject) => {\n const request = factory.open(name, META_VERSION);\n request.onupgradeneeded = (event) => {\n if (event.oldVersion < 1) {\n request.result.createObjectStore(META_STORE, { keyPath: 'path' }).createIndex('dir', 'dir');\n }\n };\n request.onsuccess = () => resolve(new IndexedDbMeta(request.result));\n request.onerror = () => reject(request.error);\n });\n}\n", "export function pinScript(url: URL): string {\n try {\n const request = new XMLHttpRequest();\n request.open('GET', url.href, false);\n request.send();\n if (request.status !== 200) return url.href;\n const source = `${request.responseText}\\n//# sourceURL=${url.href}\\n`;\n return URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));\n } catch {\n return url.href;\n }\n}\n", "export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtime: Date;\n atime: Date;\n ctime: Date;\n ino: number;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n readdirStat(path: string): Promise<Array<[string, FsStat | null]>>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n chmod(path: string, mode: number): Promise<void>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n}\n\nexport function fsError(code: string, path: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${path}`), { code });\n}\n\nexport function normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return `/${parts.join('/')}`;\n}\n\nexport function resolvePath(base: string, path: string): string {\n return normalizePath(path.startsWith('/') ? path : `${base}/${path}`);\n}\n\nexport function inodeOf(path: string): number {\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < path.length; i++) {\n const c = path.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 2654435761);\n h2 = Math.imul(h2 ^ c, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0) || 1;\n}\n", "import { MemoryMeta, type MetaEntry, type MetaStore } from './meta.ts';\nimport { type FsStat, fsError, inodeOf, type KernelFs, resolvePath } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\nconst PERM_MASK = 0o7777;\nconst READ_ATTEMPTS = 3;\nconst MAX_LINKS = 40;\nconst CHECK_MS = 1000;\nconst EXECUTABLE = /\\/node_modules\\/(?:@[^/]+\\/)?[^/]+\\/bin\\//;\n\ntype Handle = FileSystemFileHandle | FileSystemDirectoryHandle;\n\ninterface MovableHandle {\n move?(parent: FileSystemDirectoryHandle, name: string): Promise<void>;\n}\n\ninterface Located {\n path: string;\n handle?: Handle;\n link?: MetaEntry;\n}\n\nconst ERRNO_BY_DOM_ERROR: Readonly<Record<string, string>> = {\n NotFoundError: 'ENOENT',\n TypeMismatchError: 'ENOTDIR',\n InvalidModificationError: 'ENOTEMPTY',\n NoModificationAllowedError: 'EBUSY',\n TypeError: 'EINVAL',\n};\n\nfunction translate(err: unknown, path: string): Error {\n if (typeof (err as { code?: unknown })?.code === 'string') return err as Error;\n const name = (err as { name?: unknown })?.name;\n return fsError((typeof name === 'string' && ERRNO_BY_DOM_ERROR[name]) || 'EIO', path);\n}\n\nfunction missing(err: unknown): boolean {\n const code = (err as { code?: unknown })?.code;\n return code === 'ENOENT' || code === 'ENOTDIR';\n}\n\nfunction split(path: string): string[] {\n return path.split('/').filter(Boolean);\n}\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction baseOf(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction prefixes(path: string): string[] {\n const parts = split(path);\n return parts.map((_, i) => `/${parts.slice(0, i + 1).join('/')}`);\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nfunction isHandle(child: Handle | MetaEntry): child is Handle {\n return 'kind' in child;\n}\n\nexport class OpfsFs implements KernelFs {\n private readonly root: FileSystemDirectoryHandle;\n private readonly meta: MetaStore;\n private readonly dirs = new Map<string, FileSystemDirectoryHandle>();\n private readonly checked = new WeakMap<FileSystemDirectoryHandle, number>();\n\n private readonly channel: BroadcastChannel | undefined;\n\n constructor(\n root: FileSystemDirectoryHandle,\n meta: MetaStore = new MemoryMeta(),\n channel?: string\n ) {\n this.root = root;\n this.meta = meta;\n this.channel = channel === undefined ? undefined : new BroadcastChannel(channel);\n if (this.channel) {\n this.channel.onmessage = ({ data }) => {\n for (const path of data as string[]) this.forget(path);\n };\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n }\n\n private changed(...paths: string[]): void {\n for (const path of paths) this.forget(path);\n this.channel?.postMessage(paths);\n }\n\n resolvePath(base: string, path: string): string {\n return resolvePath(base, path);\n }\n\n private async walk(parts: string[], from: number, start: FileSystemDirectoryHandle) {\n let dir = start;\n for (let at = from; at < parts.length; at++) {\n dir = await dir.getDirectoryHandle(parts[at] as string);\n this.dirs.set(`/${parts.slice(0, at + 1).join('/')}`, dir);\n this.checked.set(dir, performance.now());\n }\n return dir;\n }\n\n private async dir(path: string): Promise<FileSystemDirectoryHandle> {\n const parts = split(path);\n let from = parts.length;\n let cached: FileSystemDirectoryHandle | undefined;\n for (; from > 0 && !cached; from--)\n cached = this.dirs.get(`/${parts.slice(0, from).join('/')}`);\n if (cached) from++;\n const at = `/${parts.slice(0, from).join('/')}`;\n if (cached && !(await this.current(at, cached))) {\n this.forget(at);\n cached = undefined;\n from = 0;\n }\n try {\n return await this.walk(parts, from, cached ?? this.root);\n } catch (err) {\n throw translate(err, path);\n }\n }\n\n private async current(path: string, dir: FileSystemDirectoryHandle): Promise<boolean> {\n if (performance.now() - (this.checked.get(dir) ?? -CHECK_MS) < CHECK_MS) return true;\n const where = await this.root.resolve(dir).catch(() => null);\n if (where === null || `/${where.join('/')}` !== path) return false;\n this.checked.set(dir, performance.now());\n return true;\n }\n\n private forget(path: string): void {\n for (const key of [...this.dirs.keys()]) if (within(key, path)) this.dirs.delete(key);\n }\n\n private async inDir<T>(path: string, op: (dir: FileSystemDirectoryHandle) => Promise<T>) {\n const dir = await this.dir(path);\n try {\n return await op(dir);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'NotFoundError' || (await this.current(path, dir)))\n throw err;\n this.forget(path);\n return op(await this.dir(path));\n }\n }\n\n private async child(\n parent: FileSystemDirectoryHandle,\n name: string,\n kind: 'file' | 'directory'\n ): Promise<Handle> {\n return kind === 'file' ? parent.getFileHandle(name) : parent.getDirectoryHandle(name);\n }\n\n private async parent(path: string): Promise<[string, string]> {\n const parts = split(path);\n const name = parts.pop();\n if (name === undefined) throw fsError('EBUSY', path);\n return [`/${parts.join('/')}`, name];\n }\n\n private async handle(path: string): Promise<Handle> {\n if (split(path).length === 0) return this.root;\n const [dir, name] = await this.parent(path);\n const known = this.dirs.has(path);\n return this.inDir(dir, async (parent): Promise<Handle> => {\n const [first, second] = known\n ? (['directory', 'file'] as const)\n : (['file', 'directory'] as const);\n try {\n return await this.child(parent, name, first);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'TypeMismatchError') throw err;\n }\n return this.child(parent, name, second);\n }).catch((err) => {\n throw translate(err, path);\n });\n }\n\n private real(path: string): Promise<boolean> {\n return this.handle(path).then(\n () => true,\n () => false\n );\n }\n\n private async linkAlong(path: string): Promise<MetaEntry | undefined> {\n for (const entry of await this.meta.get(prefixes(path))) {\n if (entry?.link === undefined) continue;\n if (!(await this.real(entry.path)) && (await this.real(parentOf(entry.path)))) return entry;\n }\n return undefined;\n }\n\n private async locate(path: string, follow: boolean): Promise<Located> {\n let current = path;\n for (let hops = 0; hops <= MAX_LINKS; hops++) {\n try {\n return { path: current, handle: await this.handle(current) };\n } catch (err) {\n if (!missing(err)) throw err;\n const link = await this.linkAlong(current);\n if (!link) throw err;\n if (link.path === current && !follow) return { path: current, link };\n const rest = current.slice(link.path.length);\n current = resolvePath(parentOf(link.path), `${link.link}${rest}`);\n }\n }\n throw fsError('ELOOP', path);\n }\n\n private mode(path: string, directory: boolean, meta: MetaEntry | undefined): number {\n const fallback = directory || EXECUTABLE.test(path) ? 0o755 : 0o644;\n return (directory ? S_IFDIR : S_IFREG) | (meta?.mode ?? fallback);\n }\n\n private async statOf(path: string, handle: Handle, meta: MetaEntry | undefined): Promise<FsStat> {\n const directory = handle.kind === 'directory';\n const file = directory ? undefined : await (handle as FileSystemFileHandle).getFile();\n const modified = file?.lastModified ?? 0;\n const mtime =\n meta?.mtimeMs !== undefined && meta.mtimeFor === modified ? meta.mtimeMs : modified;\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: file?.size ?? 0,\n mode: this.mode(path, directory, meta),\n mtime: new Date(mtime),\n atime: new Date(meta?.atimeMs ?? mtime),\n ctime: new Date(Math.max(meta?.ctimeMs ?? mtime, modified)),\n ino: meta?.ino ?? inodeOf(path),\n };\n }\n\n private linkStat(entry: MetaEntry): FsStat {\n const time = new Date(entry.mtimeMs ?? 0);\n return {\n isFile: false,\n isDirectory: false,\n isSymbolicLink: true,\n size: new TextEncoder().encode(entry.link).length,\n mode: S_IFLNK | 0o777,\n mtime: time,\n atime: time,\n ctime: new Date(entry.ctimeMs ?? 0),\n ino: entry.ino ?? inodeOf(entry.path),\n };\n }\n\n private async describe(found: Located): Promise<FsStat> {\n if (found.link) return this.linkStat(found.link);\n const [meta] = await this.meta.get([found.path]);\n return this.statOf(found.path, found.handle as Handle, meta);\n }\n\n async stat(path: string): Promise<FsStat> {\n return this.describe(await this.locate(path, true));\n }\n\n async lstat(path: string): Promise<FsStat> {\n return this.describe(await this.locate(path, false));\n }\n\n async exists(path: string): Promise<boolean> {\n return this.locate(path, true).then(\n () => true,\n () => false\n );\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const handle = (await this.locate(path, true)).handle as Handle;\n if (handle.kind === 'directory') throw fsError('EISDIR', path);\n for (let attempt = 1; ; attempt++) {\n try {\n return new Uint8Array(await (await handle.getFile()).arrayBuffer());\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'NotReadableError' || attempt >= READ_ATTEMPTS) {\n throw translate(err, path);\n }\n await new Promise((resolve) => setTimeout(resolve, attempt * 10));\n }\n }\n }\n\n async readFile(path: string): Promise<string> {\n return new TextDecoder().decode(await this.readFileBuffer(path));\n }\n\n private async writeTarget(path: string): Promise<[string, boolean]> {\n try {\n return [(await this.locate(path, true)).path, true];\n } catch (err) {\n if (!missing(err)) throw err;\n }\n const [entry] = await this.meta.get([path]);\n const wanted = entry?.link === undefined ? path : resolvePath(parentOf(path), entry.link);\n return [resolvePath((await this.locate(parentOf(wanted), true)).path, baseOf(wanted)), false];\n }\n\n async writeFile(path: string, content: Uint8Array | string): Promise<void> {\n const [target, existed] = await this.writeTarget(path);\n const [dir, name] = await this.parent(target);\n let file: FileSystemFileHandle;\n try {\n file = await this.inDir(dir, (parent) => parent.getFileHandle(name, { create: true }));\n } catch (err) {\n const code = (err as { name?: unknown })?.name === 'TypeMismatchError' ? 'EISDIR' : null;\n throw code ? fsError(code, path) : translate(err, path);\n }\n if (!existed && content.length === 0) return;\n const writable = await file.createWritable();\n await writable.write(content as FileSystemWriteChunkType);\n await writable.close();\n }\n\n private async listing(path: string): Promise<[string, Array<[string, Handle | MetaEntry]>]> {\n const found = await this.locate(path, true);\n const handle = found.handle as Handle;\n if (handle.kind !== 'directory') throw fsError('ENOTDIR', path);\n const children = new Map<string, Handle | MetaEntry>();\n for await (const child of handle.values()) children.set(child.name, child);\n for (const link of await this.meta.links(found.path)) {\n const name = baseOf(link.path);\n if (!children.has(name)) children.set(name, link);\n }\n return [found.path, [...children].sort(([a], [b]) => (a < b ? -1 : 1))];\n }\n\n async readdir(path: string): Promise<string[]> {\n return (await this.listing(path))[1].map(([name]) => name);\n }\n\n async readdirStat(path: string): Promise<Array<[string, FsStat | null]>> {\n const [dir, children] = await this.listing(path);\n const base = dir === '/' ? '' : dir;\n const metas = await this.meta.get(children.map(([name]) => `${base}/${name}`));\n return Promise.all(\n children.map(async ([name, child], i): Promise<[string, FsStat | null]> => {\n if (!isHandle(child)) return [name, this.linkStat(child)];\n const stat = await this.statOf(`${base}/${name}`, child, metas[i]).catch(() => null);\n return [name, stat];\n })\n );\n }\n\n async mkdir(path: string, options: { recursive?: boolean } = {}): Promise<void> {\n let found: Located | undefined;\n try {\n found = await this.locate(path, true);\n } catch (err) {\n if (!missing(err)) throw err;\n }\n if (found) {\n const directory = found.handle?.kind === 'directory';\n if (options.recursive && directory) return;\n throw fsError(options.recursive ? 'ENOTDIR' : 'EEXIST', path);\n }\n const [entry] = await this.meta.get([path]);\n if (entry?.link !== undefined) throw fsError('EEXIST', path);\n if (options.recursive) await this.mkdir(parentOf(path), options);\n const parent = await this.locate(parentOf(path), true);\n if (parent.handle?.kind !== 'directory') throw fsError('ENOTDIR', path);\n await parent.handle.getDirectoryHandle(baseOf(path), { create: true });\n }\n\n async rm(path: string, options: { recursive?: boolean; force?: boolean } = {}): Promise<void> {\n let found: Located;\n try {\n found = await this.locate(path, false);\n } catch (err) {\n const error = translate(err, path) as Error & { code: string };\n if (options.force && error.code === 'ENOENT') return;\n throw error;\n }\n if (found.handle) {\n const [dir, name] = await this.parent(found.path);\n try {\n await this.inDir(dir, (parent) =>\n parent.removeEntry(name, { recursive: options.recursive === true })\n );\n } catch (err) {\n throw translate(err, path);\n }\n this.changed(found.path);\n }\n await this.meta.remove([found.path]);\n }\n\n async rename(from: string, to: string): Promise<void> {\n if (from === to) return;\n const source = await this.locate(from, false);\n this.forget(source.path);\n const parent = await this.locate(parentOf(to), true);\n const destination = resolvePath(parent.path, baseOf(to));\n const sourceStat = await this.describe(source);\n if (sourceStat.isDirectory && within(destination, source.path)) throw fsError('EINVAL', to);\n const target = await this.locate(destination, false).catch((err) => {\n if (missing(err)) return null;\n throw err;\n });\n const targetStat = target && (await this.describe(target));\n if (targetStat?.isDirectory && !sourceStat.isDirectory) throw fsError('EISDIR', to);\n if (targetStat && !targetStat.isDirectory && sourceStat.isDirectory) {\n throw fsError('ENOTDIR', to);\n }\n if (targetStat?.isDirectory && (await this.readdir(destination)).length > 0) {\n throw fsError('ENOTEMPTY', to);\n }\n const now = Date.now();\n const carry = (entry: MetaEntry | undefined): MetaEntry => ({\n ino: inodeOf(source.path),\n ...entry,\n path: destination,\n ctimeMs: now,\n });\n if (source.link) {\n if (target?.handle) await this.rm(destination);\n await this.meta.move(source.path, destination, carry);\n return;\n }\n const dir = parent.handle as FileSystemDirectoryHandle;\n const name = baseOf(destination);\n const swap = targetStat?.isDirectory === true;\n const staging = swap ? `.${name}.${crypto.randomUUID()}` : name;\n this.forget(destination);\n const timed = await this.explicitTimes(source.path);\n const moved = await this.place(source.handle as Handle, dir, staging);\n if (swap) await this.rm(destination, { recursive: true });\n await this.meta.move(source.path, destination, carry);\n if (!moved) await this.rm(source.path, { recursive: true });\n let copied = !moved;\n if (swap) {\n const staged = await dir.getDirectoryHandle(staging);\n const placed = await this.place(staged, dir, name);\n if (!placed) await dir.removeEntry(staging, { recursive: true });\n copied ||= !placed;\n }\n if (copied) await this.restamp(destination, timed);\n this.changed(source.path, destination);\n }\n\n private async modified(path: string): Promise<number> {\n const handle = await this.handle(path);\n return handle.kind === 'file' ? (await handle.getFile()).lastModified : 0;\n }\n\n private async explicitTimes(path: string): Promise<string[]> {\n const timed: string[] = [];\n for (const entry of await this.meta.under(path)) {\n if (entry.mtimeFor === undefined || entry.link !== undefined) continue;\n const current = await this.modified(entry.path).catch(() => undefined);\n if (current === entry.mtimeFor) timed.push(entry.path.slice(path.length));\n }\n return timed;\n }\n\n private async restamp(path: string, timed: string[]): Promise<void> {\n for (const rest of timed) {\n const mtimeFor = await this.modified(path + rest);\n await this.meta.update(path + rest, (entry) => entry && { ...entry, mtimeFor });\n }\n }\n\n private async place(handle: Handle, dir: FileSystemDirectoryHandle, name: string) {\n const moved = await (handle as Handle & MovableHandle).move?.(dir, name).then(\n () => true,\n () => false\n );\n if (moved) return true;\n try {\n await this.copy(handle, dir, name);\n } catch (err) {\n if (handle.kind === 'directory') await dir.removeEntry(name, { recursive: true });\n throw translate(err, name);\n }\n return false;\n }\n\n private async copy(handle: Handle, dir: FileSystemDirectoryHandle, name: string): Promise<void> {\n if (handle.kind === 'file') {\n const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();\n await writable.write(await handle.getFile());\n await writable.close();\n return;\n }\n const target = await dir.getDirectoryHandle(name, { create: true });\n for await (const child of handle.values()) await this.copy(child, target, child.name);\n }\n\n async symlink(target: string, path: string): Promise<void> {\n const parent = await this.locate(parentOf(path), true);\n if (parent.handle?.kind !== 'directory') throw fsError('ENOTDIR', path);\n const at = resolvePath(parent.path, baseOf(path));\n if (\n await this.locate(at, false).then(\n () => true,\n (err) => !missing(err)\n )\n ) {\n throw fsError('EEXIST', path);\n }\n const now = Date.now();\n await this.meta.update(at, () => ({\n path: at,\n link: target,\n dir: parent.path,\n ino: inodeOf(at),\n mtimeMs: now,\n ctimeMs: now,\n }));\n }\n\n async readlink(path: string): Promise<string> {\n const found = await this.locate(path, false);\n if (found.link) return found.link.link as string;\n throw fsError('EINVAL', path);\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n const found = await this.locate(path, true);\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...entry,\n path: found.path,\n mode: mode & PERM_MASK,\n ctimeMs,\n }));\n }\n\n async utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n const found = await this.locate(path, true);\n const handle = found.handle as Handle;\n const file = handle.kind === 'file' ? await handle.getFile() : undefined;\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...entry,\n path: found.path,\n atimeMs: atime.getTime(),\n mtimeMs: mtime.getTime(),\n mtimeFor: file?.lastModified ?? 0,\n ctimeMs,\n }));\n }\n\n async reconcile(): Promise<number> {\n let removed = 0;\n for (const entry of await this.meta.all()) {\n const real = await this.real(entry.path);\n const stale =\n entry.link === undefined ? !real : real || !(await this.real(parentOf(entry.path)));\n if (!stale) continue;\n await this.meta.update(entry.path, () => undefined);\n removed++;\n }\n return removed;\n }\n}\n", "export const PIPE_CAPACITY = 64 * 1024;\n\nexport class PipeError extends Error {\n readonly code: 'EPIPE' | 'EINTR';\n\n constructor(code: 'EPIPE' | 'EINTR') {\n super(code);\n this.code = code;\n }\n}\n\nexport class KernelPipe {\n private chunks: Uint8Array[] = [];\n private size = 0;\n private readers = 0;\n private writers = 0;\n private waiters: Array<() => void> = [];\n\n readonly capacity: number;\n\n constructor(capacity: number = PIPE_CAPACITY) {\n this.capacity = capacity;\n }\n\n get buffered(): number {\n return this.size;\n }\n\n get readReady(): boolean {\n return this.size > 0 || this.writers === 0;\n }\n\n get writeReady(): boolean {\n return this.size < this.capacity || this.readers === 0;\n }\n\n get writersGone(): boolean {\n return this.writers === 0;\n }\n\n get readersGone(): boolean {\n return this.readers === 0;\n }\n\n openRead(): void {\n this.readers += 1;\n }\n\n openWrite(): void {\n this.writers += 1;\n }\n\n closeRead(): void {\n if (this.readers > 0) this.readers -= 1;\n if (this.readers === 0) {\n this.chunks = [];\n this.size = 0;\n }\n this.wake();\n }\n\n closeWrite(): void {\n if (this.writers > 0) this.writers -= 1;\n this.wake();\n }\n\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = this.take(Math.min(max, this.size));\n this.wake();\n return out;\n }\n\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = new Uint8Array(Math.min(max, this.size));\n let filled = 0;\n for (const chunk of this.chunks) {\n if (filled === out.length) break;\n const count = Math.min(chunk.length, out.length - filled);\n out.set(chunk.subarray(0, count), filled);\n filled += count;\n }\n return out;\n }\n\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n let offset = 0;\n while (offset < bytes.length) {\n if (this.readers === 0) throw new PipeError('EPIPE');\n const room = this.capacity - this.size;\n if (room === 0) {\n try {\n await this.changed(signal);\n } catch (e) {\n if (offset > 0) return offset;\n throw e;\n }\n continue;\n }\n const n = Math.min(room, bytes.length - offset);\n this.chunks.push(bytes.slice(offset, offset + n));\n this.size += n;\n offset += n;\n this.wake();\n }\n return bytes.length;\n }\n\n private take(n: number): Uint8Array {\n const out = new Uint8Array(n);\n let filled = 0;\n while (filled < n) {\n const head = this.chunks[0];\n const count = Math.min(head.length, n - filled);\n out.set(head.subarray(0, count), filled);\n filled += count;\n if (count === head.length) this.chunks.shift();\n else this.chunks[0] = head.subarray(count);\n }\n this.size -= n;\n return out;\n }\n\n changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new PipeError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new PipeError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import { KernelPipe, type PipeError } from './pipe.ts';\nimport type { PtyPair } from './pty.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport type KernelErrno =\n | 'EBADF'\n | 'EPIPE'\n | 'EMFILE'\n | 'EINVAL'\n | 'ENOENT'\n | 'ENOEXEC'\n | 'ECHILD'\n | 'ENOSYS'\n | 'ESPIPE'\n | 'EINTR'\n | 'ESRCH'\n | 'ENOTTY'\n | 'ENXIO'\n | 'EPERM'\n | 'EIO'\n | 'EACCES'\n | 'EAGAIN'\n | 'ENOTSOCK'\n | 'EAFNOSUPPORT'\n | 'EPROTONOSUPPORT'\n | 'EOPNOTSUPP'\n | 'EADDRINUSE'\n | 'EADDRNOTAVAIL'\n | 'ENETUNREACH'\n | 'ECONNREFUSED'\n | 'EINPROGRESS'\n | 'EISCONN'\n | 'ENOTCONN';\n\nexport class KernelError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport interface PollState {\n readable: boolean;\n\n writable: boolean;\n\n hangup: boolean;\n}\n\nexport interface KernelFile {\n read?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n peek?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n write?(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;\n\n close(): void | Promise<void>;\n\n poll?(): PollState;\n\n changed?(signal?: AbortSignal): Promise<void>;\n\n seek?(offset: number, whence: number): Promise<number>;\n\n flush?(): Promise<void>;\n\n pread?(max: number, at: number): Promise<Uint8Array>;\n pwrite?(bytes: Uint8Array, at: number): Promise<number>;\n\n resize?(size: number): Promise<void>;\n\n stat?(): Promise<{ path: string; size: number; orphan?: true }>;\n\n tty?: KernelTty;\n\n pty?: PtyPair;\n\n stat?(): Promise<{ size: number; path: string; orphan?: true }>;\n held?: true;\n\n heldMeta?: HeldMeta;\n}\n\nexport type HeldMeta = { dir: string; preopen?: string } | DeviceMeta;\n\nexport interface DeviceMeta {\n device: KernelDevice;\n access?: DeviceAccess;\n}\n\nexport type DeviceAccess = 'read' | 'write';\n\nexport type KernelDevice = 'null' | 'zero' | 'urandom';\n\nexport function pollFile(file: KernelFile): PollState {\n return file.poll?.() ?? { readable: !!file.read, writable: !!file.write, hangup: false };\n}\n\nexport class OpenFile {\n private refs = 1;\n\n readonly file: KernelFile;\n\n constructor(file: KernelFile) {\n this.file = file;\n }\n\n retain(): this {\n this.refs += 1;\n return this;\n }\n\n release(): void | Promise<void> {\n this.refs -= 1;\n if (this.refs === 0) return this.file.close();\n }\n}\n\nexport function openPipe(capacity?: number): { read: OpenFile; write: OpenFile } {\n const pipe = new KernelPipe(capacity);\n pipe.openRead();\n pipe.openWrite();\n return {\n read: new OpenFile({\n read: async (max, signal) => {\n try {\n return await pipe.read(max, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeRead(),\n poll: () => ({ readable: pipe.readReady, writable: false, hangup: pipe.writersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n write: new OpenFile({\n write: async (bytes, signal) => {\n try {\n return await pipe.write(bytes, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeWrite(),\n poll: () => ({ readable: false, writable: pipe.writeReady, hangup: pipe.readersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n };\n}\n\nexport function bytesSource(data: Uint8Array): OpenFile {\n let offset = 0;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n close: () => {},\n });\n}\n\nexport function 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\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) => bytes.length } : {}),\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 = 'tty' | 'stream' | 'file' | 'socket' | 'held' | 'device';\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 return file.seek ? 'file' : 'stream';\n}\n\nexport class FdTable {\n static readonly MAX_FDS = 1024;\n private fds = new Map<number, OpenFile>();\n private readonly cloexec = new Set<number>();\n\n private readonly status = new Map<number, number>();\n\n get(fd: number): OpenFile {\n const file = this.fds.get(fd);\n if (!file) throw new KernelError('EBADF');\n return file;\n }\n\n stdioTerminal(): KernelTty | undefined {\n for (const fd of [0, 1, 2]) {\n const tty = this.fds.get(fd)?.file.tty;\n if (tty) return tty;\n }\n return undefined;\n }\n\n numbers(): number[] {\n return [...this.fds.keys()].sort((a, b) => a - b);\n }\n\n has(fd: number): boolean {\n return this.fds.has(fd);\n }\n\n setCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.add(fd);\n }\n\n clearCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.delete(fd);\n }\n\n closesOnExec(fd: number): boolean {\n return this.cloexec.has(fd);\n }\n\n setStatusFlags(fd: number, flags: number): void {\n this.get(fd);\n this.status.set(fd, flags);\n }\n\n statusFlags(fd: number): number | undefined {\n return this.status.get(fd);\n }\n\n install(file: OpenFile, min = 0): number {\n for (let fd = min; fd < FdTable.MAX_FDS; fd++) {\n if (!this.fds.has(fd)) {\n this.fds.set(fd, file);\n return fd;\n }\n }\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EMFILE');\n }\n\n installAt(fd: number, file: OpenFile): void {\n if (fd < 0 || fd >= FdTable.MAX_FDS) {\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EBADF');\n }\n const previous = this.fds.get(fd);\n this.fds.set(fd, file);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n void Promise.resolve(previous?.release()).catch(() => undefined);\n }\n\n dup(fd: number, min = 0): number {\n return this.install(this.get(fd).retain(), min);\n }\n\n dup2(oldFd: number, newFd: number): number {\n const file = this.get(oldFd);\n if (oldFd !== newFd) this.installAt(newFd, file.retain());\n return newFd;\n }\n\n close(fd: number): void | Promise<void> {\n const file = this.get(fd);\n this.fds.delete(fd);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n return file.release();\n }\n\n fork(): FdTable {\n const child = new FdTable();\n for (const [fd, file] of this.fds) child.fds.set(fd, file.retain());\n for (const fd of this.cloexec) child.cloexec.add(fd);\n for (const [fd, flags] of this.status) child.status.set(fd, flags);\n return child;\n }\n\n async closeAll(): Promise<void> {\n const files = [...this.fds.values()];\n this.fds.clear();\n this.cloexec.clear();\n this.status.clear();\n await Promise.allSettled(files.map((file) => Promise.resolve().then(() => file.release())));\n }\n}\n", "import type { HeaderList } from './transport.ts';\nexport interface ByteSource {\n read(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n}\nexport class HttpError extends Error {\n readonly status: number;\n constructor(status: number, message: string) {\n super(message);\n this.status = status;\n }\n}\nconst CR = 13;\nconst LF = 10;\nconst READ_SIZE = 64 * 1024;\nconst TOKEN = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\nexport const REASON: Readonly<Record<number, string>> = {\n 100: 'Continue',\n 200: 'OK',\n 400: 'Bad Request',\n 403: 'Forbidden',\n 408: 'Request Timeout',\n 411: 'Length Required',\n 413: 'Content Too Large',\n 417: 'Expectation Failed',\n 421: 'Misdirected Request',\n 431: 'Request Header Fields Too Large',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 505: 'HTTP Version Not Supported',\n};\nexport class Incoming {\n private readonly source: ByteSource;\n private buf = new Uint8Array(0);\n private eof = false;\n constructor(source: ByteSource) {\n this.source = source;\n }\n get buffered(): number {\n return this.buf.length;\n }\n private async fill(signal?: AbortSignal): Promise<boolean> {\n if (this.eof) return false;\n const chunk = await this.source.read(READ_SIZE, signal);\n if (chunk.length === 0) {\n this.eof = true;\n return false;\n }\n const next = new Uint8Array(this.buf.length + chunk.length);\n next.set(this.buf);\n next.set(chunk, this.buf.length);\n this.buf = next;\n return true;\n }\n private take(n: number): Uint8Array {\n const out = this.buf.slice(0, n);\n this.buf = this.buf.subarray(n);\n return out;\n }\n async some(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n if (this.buf.length > 0) return this.take(Math.min(max, this.buf.length));\n if (this.eof) return new Uint8Array(0);\n const chunk = await this.source.read(max, signal);\n if (chunk.length === 0) this.eof = true;\n return chunk;\n }\n async head(limit: number, signal?: AbortSignal): Promise<Uint8Array | null> {\n let from = 0;\n for (;;) {\n const end = headEnd(this.buf, from);\n if (end > 0) {\n if (end > limit) throw new HttpError(431, 'request head too large');\n return this.take(end);\n }\n if (this.buf.length > limit) throw new HttpError(431, 'request head too large');\n from = Math.max(0, this.buf.length - 3);\n if (!(await this.fill(signal))) {\n if (this.buf.length === 0) return null;\n throw new HttpError(400, 'connection closed inside a request head');\n }\n }\n }\n async line(limit: number, signal?: AbortSignal): Promise<string> {\n let from = 0;\n for (;;) {\n const at = this.buf.indexOf(LF, from);\n if (at >= 0) {\n const line = this.take(at + 1);\n const text = latin1(line.subarray(0, line[at - 1] === CR ? at - 1 : at));\n return text;\n }\n if (this.buf.length > limit) throw new HttpError(400, 'line too long');\n from = this.buf.length;\n if (!(await this.fill(signal))) throw new HttpError(400, 'connection closed inside a body');\n }\n }\n async exactly(n: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.buf.length < n) {\n if (!(await this.fill(signal))) throw new HttpError(400, 'connection closed inside a body');\n }\n return this.take(n);\n }\n}\nfunction headEnd(buf: Uint8Array, from: number): number {\n for (let i = from; i < buf.length; i++) {\n if (buf[i] !== LF) continue;\n if (buf[i + 1] === LF) return i + 2;\n if (buf[i + 1] === CR && buf[i + 2] === LF) return i + 3;\n }\n return 0;\n}\nexport function latin1(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n out += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return out;\n}\nexport function latin1Bytes(text: string): Uint8Array {\n const out = new Uint8Array(text.length);\n for (let i = 0; i < text.length; i++) out[i] = text.charCodeAt(i) & 0xff;\n return out;\n}\nexport interface RequestHead {\n method: string;\n target: string;\n minor: number;\n headers: HeaderList;\n}\nexport function parseRequestHead(bytes: Uint8Array): RequestHead {\n const lines = latin1(bytes).split(/\\r?\\n/);\n while (lines.length > 0 && lines[0] === '') lines.shift();\n const match = /^([!#$%&'*+\\-.^_`|~0-9A-Za-z]+) (\\S+) HTTP\\/(\\d)\\.(\\d)$/.exec(lines.shift() ?? '');\n if (!match) throw new HttpError(400, 'malformed request line');\n if (match[3] !== '1') throw new HttpError(505, `HTTP/${match[3]}.${match[4]} is not supported`);\n return {\n method: match[1],\n target: match[2],\n minor: Number(match[4]),\n headers: parseFields(lines),\n };\n}\nfunction parseFields(lines: string[]): HeaderList {\n const headers: Array<readonly [string, string]> = [];\n for (const line of lines) {\n if (line === '') continue;\n if (line.startsWith(' ') || line.startsWith('\\t')) {\n throw new HttpError(400, 'obsolete line folding');\n }\n const colon = line.indexOf(':');\n const name = colon > 0 ? line.slice(0, colon) : '';\n if (!TOKEN.test(name)) throw new HttpError(400, 'malformed header field');\n headers.push([name, line.slice(colon + 1).trim()]);\n }\n return headers;\n}\nexport function fieldValues(headers: HeaderList, name: string): string[] {\n const lower = name.toLowerCase();\n return headers.filter(([n]) => n.toLowerCase() === lower).map(([, v]) => v);\n}\nexport function fieldTokens(headers: HeaderList, name: string): string[] {\n return fieldValues(headers, name)\n .flatMap((v) => v.split(','))\n .map((t) => t.trim().toLowerCase())\n .filter((t) => t !== '');\n}\nexport type BodyFraming =\n | {\n kind: 'none';\n }\n | {\n kind: 'length';\n length: number;\n }\n | {\n kind: 'chunked';\n };\nexport function requestFraming(headers: HeaderList): BodyFraming {\n const codings = fieldTokens(headers, 'transfer-encoding');\n const lengths = fieldValues(headers, 'content-length');\n if (codings.length > 0) {\n if (lengths.length > 0) throw new HttpError(400, 'both Transfer-Encoding and Content-Length');\n if (codings.length !== 1 || codings[0] !== 'chunked') {\n throw new HttpError(501, `unsupported Transfer-Encoding: ${codings.join(', ')}`);\n }\n return { kind: 'chunked' };\n }\n if (lengths.length === 0) return { kind: 'none' };\n const distinct = new Set(lengths.flatMap((v) => v.split(',')).map((v) => v.trim()));\n const [only] = distinct;\n if (distinct.size !== 1 || !/^\\d{1,15}$/.test(only)) {\n throw new HttpError(400, 'invalid Content-Length');\n }\n const length = Number(only);\n return length === 0 ? { kind: 'none' } : { kind: 'length', length };\n}\nconst MAX_CHUNK_LINE = 4096;\nconst MAX_TRAILERS = 64 * 1024;\nexport async function readBody(\n incoming: Incoming,\n framing: BodyFraming,\n cap: number,\n signal?: AbortSignal\n): Promise<Uint8Array | undefined> {\n if (framing.kind === 'none') return undefined;\n if (framing.kind === 'length') {\n if (framing.length > cap) throw new HttpError(413, `request body over ${cap} bytes`);\n return incoming.exactly(framing.length, signal);\n }\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const sizeLine = await incoming.line(MAX_CHUNK_LINE, signal);\n const size = /^([0-9A-Fa-f]{1,12})[ \\t]*(;.*)?$/.exec(sizeLine);\n if (!size) throw new HttpError(400, 'malformed chunk size');\n const n = Number.parseInt(size[1], 16);\n if (n === 0) break;\n total += n;\n if (total > cap) throw new HttpError(413, `request body over ${cap} bytes`);\n chunks.push(await incoming.exactly(n, signal));\n if ((await incoming.line(2, signal)) !== '') throw new HttpError(400, 'malformed chunk');\n }\n let trailers = 0;\n for (let line = await incoming.line(MAX_TRAILERS, signal); line !== ''; ) {\n trailers += line.length;\n if (trailers > MAX_TRAILERS) throw new HttpError(431, 'trailers too large');\n line = await incoming.line(MAX_TRAILERS, signal);\n }\n return concat(chunks, total);\n}\nexport function concat(chunks: Uint8Array[], total = chunks.reduce((n, c) => n + c.length, 0)) {\n const out = new Uint8Array(total);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n}\nfunction safeValue(value: string): boolean {\n return !/[\\r\\n\\0]/.test(value);\n}\nexport function responseHead(status: number, reason: string, headers: HeaderList): Uint8Array {\n const phrase = /^[\\t\\x20-\\x7e\\x80-\\xff]*$/.test(reason) ? reason : '';\n let head = `HTTP/1.1 ${status} ${phrase}\\r\\n`;\n for (const [name, value] of headers) {\n if (TOKEN.test(name) && safeValue(value)) head += `${name}: ${value}\\r\\n`;\n }\n return latin1Bytes(`${head}\\r\\n`);\n}\nexport function chunk(bytes: Uint8Array): Uint8Array {\n const size = latin1Bytes(`${bytes.length.toString(16)}\\r\\n`);\n const out = new Uint8Array(size.length + bytes.length + 2);\n out.set(size);\n out.set(bytes, size.length);\n out[out.length - 2] = CR;\n out[out.length - 1] = LF;\n return out;\n}\nexport const LAST_CHUNK = latin1Bytes('0\\r\\n\\r\\n');\n", "import { KernelError } from '../fd-table.ts';\nimport type { KernelSocket, LoopbackNet } from '../socket.ts';\nimport {\n type ByteSource,\n chunk,\n fieldTokens,\n fieldValues,\n HttpError,\n Incoming,\n LAST_CHUNK,\n latin1Bytes,\n parseRequestHead,\n REASON,\n type RequestHead,\n readBody,\n requestFraming,\n responseHead,\n} from './http1.ts';\nimport type { HeaderList, RealmTransport, RealmTransportResponse } from './transport.ts';\n\nexport const REALM_PROXY_PORT = 3128;\nexport interface ProxyLimits {\n maxConnections: number;\n maxHead: number;\n idleMs: number;\n bodyBudget: number;\n}\nconst DEFAULT_LIMITS: ProxyLimits = {\n maxConnections: 64,\n maxHead: 64 * 1024,\n idleMs: 120000,\n bodyBudget: 128 * 1024 * 1024,\n};\nexport interface TunnelTarget {\n host: string;\n port: number;\n}\nexport interface HttpSink {\n write(bytes: Uint8Array, signal?: AbortSignal): Promise<unknown>;\n}\nexport type ServeHttp = (source: ByteSource, sink: HttpSink, origin: string) => Promise<void>;\nexport type TunnelHandler = (\n conn: KernelSocket,\n incoming: Incoming,\n target: TunnelTarget,\n signal: AbortSignal,\n serveHttp: ServeHttp\n) => Promise<void>;\nexport interface RealmProxyOptions {\n net: LoopbackNet;\n transport: RealmTransport;\n host?: string;\n port?: number;\n tunnel?: TunnelHandler;\n tunnelReady?: () => Promise<void>;\n limits?: Partial<ProxyLimits>;\n}\nconst HOP_BY_HOP = new Set([\n 'connection',\n 'keep-alive',\n 'proxy-connection',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'te',\n 'trailer',\n 'transfer-encoding',\n 'upgrade',\n]);\nconst REQUEST_OWN = new Set(['host', 'content-length', 'expect']);\nclass Budget {\n private free: number;\n private waiters: Array<() => void> = [];\n constructor(free: number) {\n this.free = free;\n }\n async acquire(n: number, signal: AbortSignal): Promise<void> {\n while (this.free < n) {\n signal.throwIfAborted();\n await new Promise<void>((resolve) => {\n const done = (): void => {\n signal.removeEventListener('abort', done);\n resolve();\n };\n this.waiters.push(done);\n signal.addEventListener('abort', done, { once: true });\n });\n }\n this.free -= n;\n }\n release(n: number): void {\n this.free += n;\n const waiters = this.waiters;\n this.waiters = [];\n for (const wake of waiters) wake();\n }\n}\nexport function canonicalHost(host: string): string | undefined {\n const bare = host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;\n try {\n return new URL(`http://${bare}/`).hostname;\n } catch {\n return undefined;\n }\n}\nfunction localV4(a: number, b: number): boolean {\n return a === 127 || a === 0 || (a === 169 && b === 254);\n}\nfunction hextets(address: string): number[] | undefined {\n const [head, tail, extra] = address.split('::');\n if (extra !== undefined) return undefined;\n const part = (text: string | undefined) =>\n text ? text.split(':').map((h) => Number.parseInt(h, 16)) : [];\n const front = part(head);\n const back = part(tail);\n const groups =\n tail === undefined\n ? front\n : [...front, ...new Array(8 - front.length - back.length).fill(0), ...back];\n return groups.length === 8 && groups.every((g) => g >= 0 && g <= 0xffff) ? groups : undefined;\n}\nfunction localV6(address: string): boolean {\n const g = hextets(address);\n if (!g) return true;\n if ((g[0] & 0xffc0) === 0xfe80) return true;\n const zeroPrefix = g.slice(0, 5).every((x) => x === 0);\n if (!zeroPrefix) return false;\n if (g[5] === 0xffff || (g[5] === 0 && g[6] !== 0)) return localV4(g[6] >> 8, g[6] & 0xff);\n return g[5] === 0 && g[6] === 0;\n}\nexport function isLoopbackHost(hostname: string): boolean {\n const canonical = canonicalHost(hostname);\n if (canonical === undefined) return false;\n const host = canonical.replace(/\\.+$/, '');\n if (host === 'localhost' || host.endsWith('.localhost')) return true;\n if (host.startsWith('[')) return localV6(host.slice(1, -1));\n const v4 = /^(\\d+)\\.(\\d+)\\.\\d+\\.\\d+$/.exec(host);\n return v4 ? localV4(Number(v4[1]), Number(v4[2])) : false;\n}\nfunction dropped(headers: HeaderList): Set<string> {\n return new Set([...HOP_BY_HOP, ...fieldTokens(headers, 'connection')]);\n}\nexport function forwardRequestHeaders(headers: HeaderList): HeaderList {\n const drop = dropped(headers);\n return headers.filter(([name]) => {\n const lower = name.toLowerCase();\n return !drop.has(lower) && !REQUEST_OWN.has(lower);\n });\n}\nexport function forwardResponseHeaders(\n headers: HeaderList,\n opts: {\n encodedBodies: boolean;\n bodiless: boolean;\n }\n): Array<readonly [string, string]> {\n const drop = dropped(headers);\n if (!opts.encodedBodies) drop.add('content-encoding');\n if (!(opts.encodedBodies && opts.bodiless)) drop.add('content-length');\n return headers.filter(([name]) => !drop.has(name.toLowerCase()));\n}\nfunction keepsAlive(req: RequestHead): boolean {\n const tokens = fieldTokens(req.headers, 'connection');\n if (tokens.includes('close')) return false;\n return req.minor >= 1 || tokens.includes('keep-alive');\n}\nexport function tunnelRequestUrl(req: RequestHead, origin: string): string {\n const base = new URL(origin);\n let url: URL;\n try {\n url = new URL(req.target, req.target.startsWith('/') ? base : undefined);\n } catch {\n throw new HttpError(400, 'malformed request target');\n }\n const hosts = fieldValues(req.headers, 'host');\n const hostOk = hosts.every(\n (h) => URL.canParse(`https://${h}`) && new URL(`https://${h}`).host === base.host\n );\n if (url.origin !== base.origin || !hostOk) {\n throw new HttpError(421, `this tunnel is for ${base.host}`);\n }\n return url.href;\n}\nexport function requestUrl(req: RequestHead): string {\n if (req.target.startsWith('/')) {\n throw new HttpError(400, 'this is a proxy: send the absolute URL (GET http://host/path)');\n }\n let url: URL;\n try {\n url = new URL(req.target);\n } catch {\n throw new HttpError(400, 'malformed request target');\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new HttpError(400, `unsupported scheme ${url.protocol}`);\n }\n if (isLoopbackHost(url.hostname)) {\n throw new HttpError(\n 403,\n `${url.hostname} is the realm's own loopback, which the proxy does not reach: list it in no_proxy`\n );\n }\n return url.href;\n}\nexport function tunnelTarget(req: RequestHead): TunnelTarget {\n const match = /^([A-Za-z0-9.-]+|\\[[0-9A-Fa-f:.]+\\]):(\\d{1,5})$/.exec(req.target);\n const port = Number(match?.[2]);\n if (!match || port < 1 || port > 65535) {\n throw new HttpError(400, 'CONNECT needs host:port');\n }\n const host = canonicalHost(match[1]);\n if (host === undefined) throw new HttpError(400, 'CONNECT needs host:port');\n if (isLoopbackHost(host)) {\n throw new HttpError(\n 403,\n `${host} is the realm's own loopback, which the proxy does not reach: list it in no_proxy`\n );\n }\n return { host, port };\n}\nexport async function watchHangup(\n conn: KernelSocket,\n abort: AbortController,\n until: AbortSignal\n): Promise<void> {\n while (!until.aborted && !abort.signal.aborted) {\n if (conn.poll().hangup) {\n abort.abort(new KernelError('EPIPE'));\n return;\n }\n try {\n await conn.changed(until);\n } catch {\n return;\n }\n }\n}\nfunction untilAborted(\n response: Promise<RealmTransportResponse>,\n signal: AbortSignal\n): Promise<RealmTransportResponse> {\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n reject(signal.reason ?? new KernelError('EINTR'));\n response.then((late) => late.cancel()).catch(() => undefined);\n };\n if (signal.aborted) return onAbort();\n signal.addEventListener('abort', onAbort, { once: true });\n response.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));\n });\n}\ninterface Exchange {\n sink: HttpSink;\n incoming: Incoming;\n origin?: string;\n conn?: KernelSocket;\n socket: KernelSocket;\n}\nfunction plainResponse(status: number, message: string): RealmTransportResponse {\n const body = latin1Bytes(`slicc realm proxy: ${message}\\n`);\n return {\n status,\n statusText: REASON[status] ?? '',\n headers: [['Content-Type', 'text/plain; charset=utf-8']],\n body: (async function* () {\n yield body;\n })(),\n cancel: async () => undefined,\n };\n}\nfunction timedSource(conn: KernelSocket, idleMs: number, stop: AbortSignal): ByteSource {\n return {\n read: (max) => conn.read(max, AbortSignal.any([stop, AbortSignal.timeout(idleMs)])),\n };\n}\nexport class RealmProxy {\n private readonly options: RealmProxyOptions;\n private readonly listener: KernelSocket;\n private readonly stop = new AbortController();\n private readonly limits: ProxyLimits;\n private readonly slots: Budget;\n private readonly bodies: Budget;\n private readonly connections = new Set<KernelSocket>();\n readonly closed: Promise<void>;\n readonly port: number;\n constructor(options: RealmProxyOptions) {\n this.options = options;\n this.limits = { ...DEFAULT_LIMITS, ...options.limits };\n this.slots = new Budget(this.limits.maxConnections);\n this.bodies = new Budget(this.limits.bodyBudget);\n this.listener = options.net.listen({\n family: 'inet',\n host: options.host ?? '127.0.0.1',\n port: options.port ?? REALM_PROXY_PORT,\n });\n this.port = this.listener.local?.family === 'inet' ? this.listener.local.port : 0;\n this.closed = this.acceptLoop();\n }\n get stopped(): boolean {\n return this.stop.signal.aborted;\n }\n close(): void {\n if (this.stop.signal.aborted) return;\n this.stop.abort();\n this.listener.close();\n for (const conn of this.connections) conn.close();\n }\n private async acceptLoop(): Promise<void> {\n const served = new Set<Promise<void>>();\n try {\n for (;;) {\n await this.slots.acquire(1, this.stop.signal);\n let conn: KernelSocket;\n try {\n conn = await this.listener.accept(this.stop.signal);\n } catch {\n this.slots.release(1);\n break;\n }\n const done = this.serve(conn).finally(() => {\n this.slots.release(1);\n served.delete(done);\n });\n served.add(done);\n }\n } catch {}\n await Promise.allSettled([...served]);\n }\n private async serve(conn: KernelSocket): Promise<void> {\n this.connections.add(conn);\n const incoming = new Incoming(timedSource(conn, this.limits.idleMs, this.stop.signal));\n try {\n await this.requests({ sink: conn, incoming, conn, socket: conn });\n } finally {\n this.connections.delete(conn);\n conn.close();\n }\n }\n private async requests(ctx: Exchange): Promise<void> {\n try {\n for (;;) {\n const head = await ctx.incoming.head(this.limits.maxHead);\n if (!head || !(await this.exchange(ctx, head))) break;\n }\n } catch (e) {\n if (e instanceof HttpError) await this.refuse(ctx.sink, e);\n }\n }\n private async refuse(sink: HttpSink, error: HttpError): Promise<void> {\n try {\n await this.relay(sink, 'GET', 1, plainResponse(error.status, error.message), false);\n } catch {}\n }\n private async exchange(ctx: Exchange, head: Uint8Array): Promise<boolean> {\n const { sink: conn, incoming } = ctx;\n const req = parseRequestHead(head);\n if (req.method === 'CONNECT') {\n if (!ctx.conn) throw new HttpError(400, 'CONNECT inside a tunnel');\n await this.connect(ctx.conn, incoming, req);\n return false;\n }\n const url = ctx.origin ? tunnelRequestUrl(req, ctx.origin) : requestUrl(req);\n const keep = keepsAlive(req);\n const framing = requestFraming(req.headers);\n const reserve =\n framing.kind === 'length' ? framing.length : framing.kind === 'chunked' ? this.cap() : 0;\n if (reserve > this.cap()) throw new HttpError(413, `request body over ${this.cap()} bytes`);\n await this.expectContinue(conn, req, framing.kind !== 'none');\n await this.bodies.acquire(reserve, this.stop.signal);\n let response: RealmTransportResponse;\n const abort = new AbortController();\n const stopExchange = () => abort.abort();\n this.stop.signal.addEventListener('abort', stopExchange, { once: true });\n try {\n try {\n const body = await readBody(incoming, framing, this.cap());\n const waiting = new AbortController();\n void watchHangup(ctx.socket, abort, waiting.signal);\n try {\n response = await this.upstream(req, url, body, abort.signal);\n } finally {\n waiting.abort();\n }\n } finally {\n this.bodies.release(reserve);\n }\n return await this.relay(conn, req.method, req.minor, response, keep);\n } finally {\n this.stop.signal.removeEventListener('abort', stopExchange);\n abort.abort();\n }\n }\n private cap(): number {\n return Math.min(this.options.transport.traits.maxRequestBody, this.limits.bodyBudget);\n }\n private async expectContinue(conn: HttpSink, req: RequestHead, hasBody: boolean): Promise<void> {\n const expect = fieldTokens(req.headers, 'expect');\n if (expect.length === 0) return;\n if (expect.length !== 1 || expect[0] !== '100-continue') {\n throw new HttpError(417, `unsupported expectation: ${expect.join(', ')}`);\n }\n if (hasBody && req.minor >= 1) {\n await conn.write(latin1Bytes('HTTP/1.1 100 Continue\\r\\n\\r\\n'), this.stop.signal);\n }\n }\n private async upstream(\n req: RequestHead,\n url: string,\n body: Uint8Array | undefined,\n signal: AbortSignal\n ): Promise<RealmTransportResponse> {\n try {\n const fetching = this.options.transport.fetch({\n url,\n method: req.method.toUpperCase(),\n headers: forwardRequestHeaders(req.headers),\n body: req.method === 'GET' || req.method === 'HEAD' ? undefined : body,\n signal,\n });\n return await untilAborted(fetching, signal);\n } catch (e) {\n if (signal.aborted) throw e;\n const message = e instanceof Error ? e.message : String(e);\n const status = (\n e as {\n status?: unknown;\n } | null\n )?.status;\n const own = typeof status === 'number' && status >= 400 && status <= 599 ? status : 502;\n return plainResponse(own, message || 'upstream request failed');\n }\n }\n private async relay(\n conn: HttpSink,\n method: string,\n minor: number,\n response: RealmTransportResponse,\n keepAlive: boolean\n ): Promise<boolean> {\n const status = response.status;\n const bodiless = method === 'HEAD' || status === 204 || status === 304 || status < 200;\n const headers = forwardResponseHeaders(response.headers, {\n encodedBodies: this.options.transport.traits.encodedBodies,\n bodiless,\n });\n const chunked = !bodiless && minor >= 1;\n const keep = keepAlive && (bodiless || chunked);\n headers.push(['Connection', keep ? 'keep-alive' : 'close']);\n if (chunked) headers.push(['Transfer-Encoding', 'chunked']);\n const signal = this.stop.signal;\n await conn.write(\n responseHead(status, response.statusText || REASON[status] || '', headers),\n signal\n );\n if (bodiless) {\n await response.cancel();\n return keep;\n }\n try {\n for await (const piece of response.body) {\n if (piece.length > 0) await conn.write(chunked ? chunk(piece) : piece, signal);\n }\n } catch {\n await response.cancel().catch(() => undefined);\n return false;\n }\n if (chunked) await conn.write(LAST_CHUNK, signal);\n return keep;\n }\n private async connect(conn: KernelSocket, incoming: Incoming, req: RequestHead): Promise<void> {\n const target = tunnelTarget(req);\n const tunnel = this.options.tunnel;\n if (!tunnel) {\n throw new HttpError(\n 501,\n `CONNECT ${target.host}:${target.port}: no tunnels through this proxy`\n );\n }\n await this.options.tunnelReady?.().catch((e: unknown) => {\n throw new HttpError(\n 501,\n `CONNECT ${target.host}:${target.port}: ${e instanceof Error ? e.message : String(e)}`\n );\n });\n await conn.write(latin1Bytes('HTTP/1.1 200 Connection Established\\r\\n\\r\\n'), this.stop.signal);\n try {\n await tunnel(conn, incoming, target, this.stop.signal, (source, sink, origin) =>\n this.requests({ sink, incoming: new Incoming(source), origin, socket: conn })\n );\n } catch {}\n }\n}\n", "export type Signer = (tbs: Uint8Array) => Promise<Uint8Array>;\nfunction concat(parts: readonly Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n let at = 0;\n for (const p of parts) {\n out.set(p, at);\n at += p.length;\n }\n return out;\n}\nfunction length(n: number): Uint8Array {\n if (n < 0x80) return Uint8Array.of(n);\n const bytes: number[] = [];\n for (let v = n; v > 0; v = Math.floor(v / 256)) bytes.unshift(v & 0xff);\n return Uint8Array.of(0x80 | bytes.length, ...bytes);\n}\nexport function tlv(tag: number, ...contents: readonly Uint8Array[]): Uint8Array {\n const body = concat(contents);\n return concat([Uint8Array.of(tag), length(body.length), body]);\n}\nconst seq = (...parts: Uint8Array[]) => tlv(0x30, ...parts);\nconst set = (...parts: Uint8Array[]) => tlv(0x31, ...parts);\nconst octets = (bytes: Uint8Array) => tlv(0x04, bytes);\nconst bits = (bytes: Uint8Array, unused = 0) => tlv(0x03, Uint8Array.of(unused), bytes);\nconst TRUE = tlv(0x01, Uint8Array.of(0xff));\nexport function integer(magnitude: Uint8Array): Uint8Array {\n let start = 0;\n while (start < magnitude.length - 1 && magnitude[start] === 0) start++;\n const trimmed = magnitude.subarray(start);\n return tlv(0x02, trimmed[0] & 0x80 ? concat([Uint8Array.of(0), trimmed]) : trimmed);\n}\nexport function oid(dotted: string): Uint8Array {\n const [a, b, ...rest] = dotted.split('.').map(Number);\n const out = [40 * a + b];\n for (const arc of rest) {\n const groups: number[] = [];\n for (let v = arc; ; v = Math.floor(v / 128)) {\n groups.unshift(v & 0x7f);\n if (v < 128) break;\n }\n out.push(...groups.map((g, i) => (i < groups.length - 1 ? g | 0x80 : g)));\n }\n return tlv(0x06, Uint8Array.from(out));\n}\nconst utf8 = (text: string) => tlv(0x0c, new TextEncoder().encode(text));\nconst ascii = (text: string) => Uint8Array.from(text, (c) => c.charCodeAt(0) & 0x7f);\nfunction time(date: Date): Uint8Array {\n const iso = date.toISOString().replace(/[-:T]/g, '').slice(0, 14);\n const year = date.getUTCFullYear();\n return year < 2050 ? tlv(0x17, ascii(`${iso.slice(2)}Z`)) : tlv(0x18, ascii(`${iso}Z`));\n}\nconst ECDSA_SHA256 = seq(oid('1.2.840.10045.4.3.2'));\nexport interface DistinguishedName {\n commonName: string;\n organization?: string;\n}\nfunction name(dn: DistinguishedName): Uint8Array {\n const rdns = [];\n if (dn.organization) rdns.push(set(seq(oid('2.5.4.10'), utf8(dn.organization))));\n rdns.push(set(seq(oid('2.5.4.3'), utf8(dn.commonName))));\n return seq(...rdns);\n}\nfunction extension(id: string, critical: boolean, value: Uint8Array): Uint8Array {\n return critical ? seq(oid(id), TRUE, octets(value)) : seq(oid(id), octets(value));\n}\nexport function children(der: Uint8Array): Uint8Array[] {\n const out: Uint8Array[] = [];\n const [, bodyStart, bodyEnd] = header(der, 0);\n for (let at = bodyStart; at < bodyEnd; ) {\n const [, , end] = header(der, at);\n out.push(der.subarray(at, end));\n at = end;\n }\n return out;\n}\nfunction header(der: Uint8Array, at: number): [tag: number, start: number, end: number] {\n const tag = der[at];\n let len = der[at + 1];\n let start = at + 2;\n if (len & 0x80) {\n const count = len & 0x7f;\n len = 0;\n for (let i = 0; i < count; i++) len = len * 256 + der[start + i];\n start += count;\n }\n if (start + len > der.length) throw new Error('truncated DER');\n return [tag, start, start + len];\n}\nexport function contents(element: Uint8Array): Uint8Array {\n const [, start, end] = header(element, 0);\n return element.subarray(start, end);\n}\nexport function publicKeyBits(spki: Uint8Array): Uint8Array {\n const key = children(spki)[1];\n return contents(key).subarray(1);\n}\nexport async function keyId(spki: Uint8Array): Promise<Uint8Array> {\n return new Uint8Array(\n await crypto.subtle.digest('SHA-1', publicKeyBits(spki) as Uint8Array<ArrayBuffer>)\n );\n}\nexport function ecdsaDer(raw: Uint8Array): Uint8Array {\n const half = raw.length / 2;\n return seq(integer(raw.subarray(0, half)), integer(raw.subarray(half)));\n}\nexport function randomSerial(): Uint8Array {\n const serial = crypto.getRandomValues(new Uint8Array(16));\n serial[0] = (serial[0] & 0x7f) | 0x01;\n return serial;\n}\nexport function ipv4(host: string): Uint8Array | undefined {\n const m = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(host);\n if (!m) return undefined;\n const parts = m.slice(1).map(Number);\n return parts.every((p) => p <= 255) ? Uint8Array.from(parts) : undefined;\n}\nexport function ipv6(host: string): Uint8Array | undefined {\n if (!host.includes(':') || !/^[0-9A-Fa-f:.]+$/.test(host)) return undefined;\n const v4 = /(\\d{1,3}(?:\\.\\d{1,3}){3})$/.exec(host);\n let text = host;\n const tail: number[] = [];\n if (v4) {\n const bytes = ipv4(v4[1]);\n if (!bytes) return undefined;\n tail.push((bytes[0] << 8) | bytes[1], (bytes[2] << 8) | bytes[3]);\n text = host.slice(0, -v4[1].length).replace(/:$/, host.endsWith(`::${v4[1]}`) ? ':' : '');\n }\n const halves = text.split('::');\n if (halves.length > 2) return undefined;\n const groups = (part: string) => (part === '' ? [] : part.split(':'));\n const head = groups(halves[0]);\n const back = halves.length === 2 ? groups(halves[1]) : [];\n if (![...head, ...back].every((g) => /^[0-9A-Fa-f]{1,4}$/.test(g))) return undefined;\n const words = [...head, ...back].map((g) => Number.parseInt(g, 16));\n const missing = 8 - words.length - tail.length;\n if (halves.length === 2 ? missing < 1 : missing !== 0) return undefined;\n const all = [\n ...head.map((g) => Number.parseInt(g, 16)),\n ...new Array(halves.length === 2 ? missing : 0).fill(0),\n ...back.map((g) => Number.parseInt(g, 16)),\n ...tail,\n ];\n return Uint8Array.from(all.flatMap((w) => [w >> 8, w & 0xff]));\n}\nexport interface CertificateRequest {\n serial: Uint8Array;\n issuer: DistinguishedName;\n subject: DistinguishedName;\n notBefore: Date;\n notAfter: Date;\n spki: Uint8Array;\n issuerSpki: Uint8Array;\n kind:\n | {\n ca: true;\n }\n | {\n ca: false;\n host: string;\n };\n sign: Signer;\n}\nasync function extensions(req: CertificateRequest): Promise<Uint8Array> {\n const list = [extension('2.5.29.14', false, octets(await keyId(req.spki)))];\n if (req.kind.ca) {\n list.push(extension('2.5.29.19', true, seq(TRUE, integer(Uint8Array.of(0)))));\n list.push(extension('2.5.29.15', true, bits(Uint8Array.of(0x86), 1)));\n } else {\n list.push(extension('2.5.29.35', false, seq(tlv(0x80, await keyId(req.issuerSpki)))));\n list.push(extension('2.5.29.19', true, seq()));\n list.push(extension('2.5.29.15', true, bits(Uint8Array.of(0x80), 7)));\n list.push(extension('2.5.29.37', false, seq(oid('1.3.6.1.5.5.7.3.1'))));\n const ip = ipv4(req.kind.host) ?? ipv6(req.kind.host);\n const altName = ip ? tlv(0x87, ip) : tlv(0x82, ascii(req.kind.host));\n list.push(extension('2.5.29.17', false, seq(altName)));\n }\n return tlv(0xa3, seq(...list));\n}\nexport async function certificate(req: CertificateRequest): Promise<Uint8Array> {\n const tbs = seq(\n tlv(0xa0, integer(Uint8Array.of(2))),\n integer(req.serial),\n ECDSA_SHA256,\n name(req.issuer),\n seq(time(req.notBefore), time(req.notAfter)),\n name(req.subject),\n req.spki,\n await extensions(req)\n );\n const signature = ecdsaDer(await req.sign(tbs));\n return seq(tbs, ECDSA_SHA256, bits(signature));\n}\nexport function pem(der: Uint8Array): string {\n let b64 = '';\n for (let i = 0; i < der.length; i += 0x8000) {\n b64 += String.fromCharCode(...der.subarray(i, i + 0x8000));\n }\n const lines = btoa(b64).match(/.{1,64}/g) ?? [];\n return `-----BEGIN CERTIFICATE-----\\n${lines.join('\\n')}\\n-----END CERTIFICATE-----\\n`;\n}\n", "import { certificate, type DistinguishedName, ipv6, pem, randomSerial } from './x509.ts';\nexport interface CaRecord {\n key: CryptoKey;\n cert: Uint8Array;\n spki: Uint8Array;\n notAfter: number;\n name: DistinguishedName;\n}\nexport interface CaStore {\n get(owner: string): Promise<CaRecord | undefined>;\n swap(owner: string, expected: CaRecord | undefined, record: CaRecord): Promise<CaRecord>;\n}\n\nfunction sameCert(a: CaRecord | undefined, b: CaRecord | undefined): boolean {\n if (!a || !b) return a === b;\n return a.cert.length === b.cert.length && a.cert.every((byte, i) => byte === b.cert[i]);\n}\n\nexport function winner(\n current: CaRecord | undefined,\n expected: CaRecord | undefined,\n record: CaRecord\n): CaRecord | undefined {\n return sameCert(current, expected) ? record : current;\n}\nconst DAY = 24 * 60 * 60 * 1000;\nconst CA_LIFETIME = 3650 * DAY;\nconst CA_RENEW_BEFORE = 30 * DAY;\nexport const LEAF_LIFETIME = 7 * DAY;\nconst ECDSA = { name: 'ECDSA', namedCurve: 'P-256' } as const;\nconst SIGN = { name: 'ECDSA', hash: 'SHA-256' } as const;\nfunction request<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\nexport function indexedDbCaStore(dbName = 'slicc-realm-ca'): CaStore {\n let db: Promise<IDBDatabase> | undefined;\n const open = () => {\n db ??= new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, 1);\n req.onupgradeneeded = () => req.result.createObjectStore('ca');\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n db.catch(() => {\n db = undefined;\n });\n return db;\n };\n return {\n async get(owner) {\n const store = (await open()).transaction('ca').objectStore('ca');\n return (await request(store.get(owner))) as CaRecord | undefined;\n },\n async swap(owner, expected, record) {\n const tx = (await open()).transaction('ca', 'readwrite');\n const store = tx.objectStore('ca');\n let stored = record;\n const read = store.get(owner);\n read.onsuccess = () => {\n const current = read.result as CaRecord | undefined;\n const kept = winner(current, expected, record);\n if (kept === record) store.put(record, owner);\n else stored = kept as CaRecord;\n };\n await new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n return stored;\n },\n };\n}\nexport class LeafNameError extends Error {}\nexport function validLeafName(host: string): boolean {\n if (ipv6(host)) return true;\n if (host.length === 0 || host.length > 253) return false;\n return host.split('.').every((label) => /^(?!-)[a-z0-9-]{1,63}(?<!-)$/i.test(label));\n}\nexport class RealmCa {\n private readonly record: CaRecord;\n private constructor(record: CaRecord) {\n this.record = record;\n }\n static async open(owner: string, store: CaStore, now = Date.now()): Promise<RealmCa> {\n const stored = await store.get(owner).catch(() => undefined);\n if (stored && stored.notAfter - now > CA_RENEW_BEFORE) return new RealmCa(stored);\n const record = await RealmCa.create(owner, now);\n return new RealmCa(await store.swap(owner, stored, record));\n }\n private static async create(owner: string, now: number): Promise<CaRecord> {\n const pair = await crypto.subtle.generateKey(ECDSA, false, ['sign', 'verify']);\n const spki = new Uint8Array(await crypto.subtle.exportKey('spki', pair.publicKey));\n const id = Array.from(crypto.getRandomValues(new Uint8Array(4)), (b) =>\n b.toString(16).padStart(2, '0')\n ).join('');\n const name = { organization: 'SLICC', commonName: `SLICC realm CA ${owner} ${id}` };\n const notAfter = now + CA_LIFETIME;\n const cert = await certificate({\n serial: randomSerial(),\n issuer: name,\n subject: name,\n notBefore: new Date(now - DAY),\n notAfter: new Date(notAfter),\n spki,\n issuerSpki: spki,\n kind: { ca: true },\n sign: signer(pair.privateKey),\n });\n return { key: pair.privateKey, cert, spki, notAfter, name };\n }\n get cert(): Uint8Array {\n return this.record.cert;\n }\n get pem(): string {\n return pem(this.record.cert);\n }\n async issue(host: string, spki: Uint8Array, now = Date.now()): Promise<Uint8Array> {\n const name = host.toLowerCase();\n if (!validLeafName(name)) throw new LeafNameError(`no certificate for ${host}`);\n return certificate({\n serial: randomSerial(),\n issuer: this.record.name,\n subject: { commonName: name.length <= 64 ? name : 'SLICC realm leaf' },\n notBefore: new Date(now - 60 * 60 * 1000),\n notAfter: new Date(now + LEAF_LIFETIME),\n spki,\n issuerSpki: this.record.spki,\n kind: { ca: false, host: name },\n sign: signer(this.record.key),\n });\n }\n}\nfunction signer(key: CryptoKey) {\n return async (tbs: Uint8Array) =>\n new Uint8Array(await crypto.subtle.sign(SIGN, key, tbs as Uint8Array<ArrayBuffer>));\n}\nconst opened = new WeakMap<CaStore, Map<string, Promise<RealmCa>>>();\nexport function realmCa(owner: string, store: CaStore): Promise<RealmCa> {\n const cas = opened.get(store) ?? new Map<string, Promise<RealmCa>>();\n opened.set(store, cas);\n let ca = cas.get(owner);\n if (!ca) {\n const opening = RealmCa.open(owner, store);\n ca = opening;\n cas.set(owner, opening);\n opening.catch(() => {\n if (cas.get(owner) === opening) cas.delete(owner);\n });\n }\n return ca;\n}\n", "type TlsExport =\n | 'malloc'\n | 'free'\n | 'tls_last_error'\n | 'tls_strerror'\n | 'tls_leaf_new'\n | 'tls_leaf_spki'\n | 'tls_leaf_add_cert'\n | 'tls_leaf_free'\n | 'tls_session_new'\n | 'tls_feed'\n | 'tls_feed_eof'\n | 'tls_in_room'\n | 'tls_read'\n | 'tls_write'\n | 'tls_out_size'\n | 'tls_out_take'\n | 'tls_close'\n | 'tls_alpn_http11'\n | 'tls_session_free';\n\nexport type TlsEngineModule = { readonly HEAPU8: Uint8Array } & {\n readonly [K in TlsExport as `_${K}`]: (...args: number[]) => number;\n};\n\nconst SCRATCH = 64 * 1024;\nconst EOF = -1;\nexport class TlsError extends Error {\n readonly code: number;\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n }\n}\nexport class TlsEngine {\n private readonly m: TlsEngineModule;\n private readonly scratch: number;\n constructor(m: TlsEngineModule) {\n this.m = m;\n this.scratch = m._malloc(SCRATCH);\n if (!this.scratch) throw new Error('tls engine: out of memory');\n }\n private put(bytes: Uint8Array): number {\n const ptr = this.m._malloc(bytes.length + 1);\n if (!ptr) throw new Error('tls engine: out of memory');\n this.m.HEAPU8.set(bytes, ptr);\n this.m.HEAPU8[ptr + bytes.length] = 0;\n return ptr;\n }\n private taken(n: number): Uint8Array {\n return this.m.HEAPU8.slice(this.scratch, this.scratch + n);\n }\n error(code: number, what: string): TlsError {\n this.m._tls_strerror(code, this.scratch, 256);\n const end = this.m.HEAPU8.indexOf(0, this.scratch);\n const text = new TextDecoder().decode(this.m.HEAPU8.subarray(this.scratch, end));\n return new TlsError(code, `${what}: ${text || code}`);\n }\n leaf(): TlsLeaf {\n const ptr = this.m._tls_leaf_new();\n if (!ptr) throw this.error(this.m._tls_last_error(), 'leaf key');\n return new TlsLeaf(this, this.m, ptr);\n }\n session(leaf: TlsLeaf, host: string): TlsSession {\n const name = this.put(new TextEncoder().encode(host));\n try {\n const ptr = this.m._tls_session_new(leaf.ptr, name);\n if (!ptr) throw this.error(this.m._tls_last_error(), 'tls session');\n return new TlsSession(this, this.m, ptr);\n } finally {\n this.m._free(name);\n }\n }\n withBytes<T>(bytes: Uint8Array, fn: (ptr: number) => T): T {\n const ptr = this.put(bytes);\n try {\n return fn(ptr);\n } finally {\n this.m._free(ptr);\n }\n }\n intoScratch(fn: (ptr: number, max: number) => number): number | Uint8Array {\n const n = fn(this.scratch, SCRATCH);\n return n > 0 ? this.taken(n) : n;\n }\n}\nexport class TlsLeaf {\n private readonly engine: TlsEngine;\n private readonly m: TlsEngineModule;\n readonly ptr: number;\n constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number) {\n this.engine = engine;\n this.m = m;\n this.ptr = ptr;\n }\n spki(): Uint8Array {\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_leaf_spki(this.ptr, ptr, max));\n if (typeof out === 'number') throw this.engine.error(out, 'leaf public key');\n return out;\n }\n addCert(der: Uint8Array): void {\n const ret = this.engine.withBytes(der, (ptr) =>\n this.m._tls_leaf_add_cert(this.ptr, ptr, der.length)\n );\n if (ret !== 0) throw this.engine.error(ret, 'leaf certificate');\n }\n release(): void {\n this.m._tls_leaf_free(this.ptr);\n }\n}\nexport class TlsSession {\n private readonly engine: TlsEngine;\n private readonly m: TlsEngineModule;\n private readonly ptr: number;\n constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number) {\n this.engine = engine;\n this.m = m;\n this.ptr = ptr;\n }\n feed(bytes: Uint8Array): number {\n return this.engine.withBytes(bytes, (ptr) => this.m._tls_feed(this.ptr, ptr, bytes.length));\n }\n feedEnd(): void {\n this.m._tls_feed_eof(this.ptr);\n }\n read(): Uint8Array | 'more' | 'eof' {\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_read(this.ptr, ptr, max));\n if (out instanceof Uint8Array) return out;\n if (out === 0) return 'more';\n if (out === EOF) return 'eof';\n throw this.engine.error(out, 'tls');\n }\n write(bytes: Uint8Array): number {\n const n = this.engine.withBytes(bytes, (ptr) => this.m._tls_write(this.ptr, ptr, bytes.length));\n if (n < 0) throw this.engine.error(n, 'tls');\n return n;\n }\n take(): Uint8Array {\n if (this.m._tls_out_size(this.ptr) === 0) return new Uint8Array(0);\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_out_take(this.ptr, ptr, max));\n return out instanceof Uint8Array ? out : new Uint8Array(0);\n }\n close(): void {\n this.m._tls_close(this.ptr);\n }\n free(): void {\n this.m._tls_session_free(this.ptr);\n }\n}\nconst loading = new WeakMap<() => Promise<TlsEngineModule>, Promise<TlsEngine>>();\nexport function loadTlsEngine(load: () => Promise<TlsEngineModule>): Promise<TlsEngine> {\n let engine = loading.get(load);\n if (!engine) {\n const started = load().then((m) => new TlsEngine(m));\n engine = started;\n loading.set(load, started);\n started.catch(() => {\n if (loading.get(load) === started) loading.delete(load);\n });\n }\n return engine;\n}\n", "import type { KernelSocket } from '../socket.ts';\nimport type { ByteSource, Incoming } from './http1.ts';\nimport type { HttpSink, TunnelHandler, TunnelTarget } from './proxy-service.ts';\nimport { LEAF_LIFETIME, type RealmCa } from './realm-ca.ts';\nimport type { TlsEngine, TlsLeaf, TlsSession } from './tls-engine.ts';\n\nconst LEAF_REUSE = LEAF_LIFETIME - 24 * 60 * 60 * 1000;\nconst LEAF_CACHE = 256;\nconst CIPHER_READ = 64 * 1024;\nexport class TlsStream implements ByteSource, HttpSink {\n private readonly session: TlsSession;\n private readonly cipherIn: ByteSource;\n private readonly cipherOut: KernelSocket;\n private pending: Uint8Array = new Uint8Array(0);\n private ended = false;\n constructor(session: TlsSession, cipherIn: ByteSource, cipherOut: KernelSocket) {\n this.session = session;\n this.cipherIn = cipherIn;\n this.cipherOut = cipherOut;\n }\n private async flush(signal?: AbortSignal): Promise<void> {\n for (let out = this.session.take(); out.length > 0; out = this.session.take()) {\n await this.cipherOut.write(out, signal);\n }\n }\n private feedPending(): void {\n if (this.pending.length === 0) return;\n const n = this.session.feed(this.pending);\n this.pending = this.pending.subarray(n);\n }\n async read(_max: number, signal?: AbortSignal): Promise<Uint8Array> {\n for (;;) {\n this.feedPending();\n const got = this.session.read();\n await this.flush(signal);\n if (got instanceof Uint8Array) return got;\n if (got === 'eof') return new Uint8Array(0);\n if (this.pending.length > 0) continue;\n if (this.ended) {\n this.session.feedEnd();\n const last = this.session.read();\n await this.flush(signal);\n return last instanceof Uint8Array ? last : new Uint8Array(0);\n }\n const cipher = await this.cipherIn.read(CIPHER_READ, signal);\n if (cipher.length === 0) this.ended = true;\n else this.pending = cipher;\n }\n }\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n for (let at = 0; at < bytes.length; ) {\n const n = this.session.write(bytes.subarray(at, at + 16 * 1024));\n await this.flush(signal);\n at += n;\n }\n return bytes.length;\n }\n async close(signal?: AbortSignal): Promise<void> {\n this.session.close();\n await this.flush(signal);\n }\n}\ninterface CachedLeaf {\n leaf: Promise<TlsLeaf>;\n expires: number;\n}\nexport interface TlsTerminatorOptions {\n ca: () => Promise<RealmCa>;\n engine: () => Promise<TlsEngine>;\n now?: () => number;\n}\nexport class TlsTerminator {\n private readonly options: TlsTerminatorOptions;\n private readonly leaves = new Map<string, CachedLeaf>();\n private readonly now: () => number;\n constructor(options: TlsTerminatorOptions) {\n this.options = options;\n this.now = options.now ?? Date.now;\n }\n private leafFor(engine: TlsEngine, host: string): Promise<TlsLeaf> {\n const now = this.now();\n const cached = this.leaves.get(host);\n if (cached && cached.expires > now) {\n this.leaves.delete(host);\n this.leaves.set(host, cached);\n return cached.leaf;\n }\n if (cached) void this.drop(host, cached);\n const leaf = this.issue(engine, host, now);\n const entry = { leaf, expires: now + LEAF_REUSE };\n this.leaves.set(host, entry);\n leaf.catch(() => {\n if (this.leaves.get(host) === entry) this.leaves.delete(host);\n });\n for (const [oldest, old] of this.leaves) {\n if (this.leaves.size <= LEAF_CACHE) break;\n void this.drop(oldest, old);\n }\n return leaf;\n }\n private async drop(host: string, entry: CachedLeaf): Promise<void> {\n if (this.leaves.get(host) === entry) this.leaves.delete(host);\n (await entry.leaf.catch(() => undefined))?.release();\n }\n private async issue(engine: TlsEngine, host: string, now: number): Promise<TlsLeaf> {\n const ca = await this.options.ca();\n const leaf = engine.leaf();\n try {\n leaf.addCert(await ca.issue(host, leaf.spki(), now));\n leaf.addCert(ca.cert);\n return leaf;\n } catch (e) {\n leaf.release();\n throw e;\n }\n }\n async close(): Promise<void> {\n await Promise.all([...this.leaves].map(([host, entry]) => this.drop(host, entry)));\n }\n readonly handler: TunnelHandler = async (conn, incoming, target, signal, serveHttp) => {\n const engine = await this.options.engine();\n const host = target.host.replace(/^\\[|\\]$/g, '');\n const leaf = await this.leafFor(engine, host);\n const session = engine.session(leaf, host);\n try {\n const stream = new TlsStream(session, cipherSource(incoming), conn);\n const origin = `https://${authority(target)}`;\n await serveHttp(stream, stream, origin);\n await stream.close(signal).catch(() => undefined);\n } finally {\n session.free();\n }\n };\n}\nexport function authority(target: TunnelTarget): string {\n return target.port === 443 ? target.host : `${target.host}:${target.port}`;\n}\nfunction cipherSource(incoming: Incoming): ByteSource {\n return { read: (max, signal) => incoming.some(max, signal) };\n}\n", "import type { KernelFs } from '../../fs/types.ts';\nimport type { LoopbackNet } from '../socket.ts';\nimport { REALM_PROXY_PORT, RealmProxy } from './proxy-service.ts';\nimport {\n type CaRecord,\n type CaStore,\n indexedDbCaStore,\n type RealmCa,\n realmCa,\n winner,\n} from './realm-ca.ts';\nimport { loadTlsEngine, type TlsEngine, type TlsEngineModule } from './tls-engine.ts';\nimport { TlsTerminator } from './tls-tunnel.ts';\nimport type { RealmTransport } from './transport.ts';\n\nexport const NO_TRANSPORT =\n 'slicc-kernel: no network transport (createKernel({ network: { transport } }))';\n\nexport const TLS_ENGINE_PACKAGE = '@ai-ecoverse/wasm-tls-engine';\n\nexport const CA_PATH = '/etc/ssl/certs/slicc-kernel-ca.pem';\n\nconst PROXY_URL = `http://127.0.0.1:${REALM_PROXY_PORT}`;\n\nconst NO_PROXY = 'localhost,.localhost,127.0.0.1,127.0.0.0/8';\n\nconst CA_OWNER = 'slicc-kernel';\n\nexport function networkEnv(): Record<string, string> {\n return {\n http_proxy: PROXY_URL,\n https_proxy: PROXY_URL,\n HTTP_PROXY: PROXY_URL,\n HTTPS_PROXY: PROXY_URL,\n no_proxy: NO_PROXY,\n NO_PROXY: NO_PROXY,\n SSL_CERT_FILE: CA_PATH,\n CURL_CA_BUNDLE: CA_PATH,\n GIT_SSL_CAINFO: CA_PATH,\n };\n}\n\nexport function missingTransport(): RealmTransport {\n return {\n traits: { manualRedirects: true, encodedBodies: true, maxRequestBody: 0, unavailable: true },\n fetch: () => Promise.reject(Object.assign(new Error(NO_TRANSPORT), { status: 502 })),\n };\n}\n\nexport function memoryCaStore(): CaStore {\n const records = new Map<string, CaRecord>();\n return {\n get: async (owner) => records.get(owner),\n swap: async (owner, expected, record) => {\n const kept = winner(records.get(owner), expected, record) as CaRecord;\n records.set(owner, kept);\n return kept;\n },\n };\n}\n\nexport function caStore(metadata: string | false): CaStore {\n return metadata === false ? memoryCaStore() : indexedDbCaStore(`${metadata}-ca`);\n}\n\nfunction base64(bytes: Uint8Array): string {\n let text = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n text += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(text);\n}\n\nexport function packageTlsEngine(fs: KernelFs, modules: string): () => Promise<TlsEngineModule> {\n const dir = `${modules.replace(/\\/+$/, '')}/${TLS_ENGINE_PACKAGE}/dist`;\n return async () => {\n let glue: Uint8Array;\n let wasmBinary: Uint8Array;\n try {\n [glue, wasmBinary] = await Promise.all([\n fs.readFileBuffer(`${dir}/slicc-tls-engine.mjs`),\n fs.readFileBuffer(`${dir}/slicc-tls-engine.wasm`),\n ]);\n } catch {\n throw new Error(`TLS needs ${TLS_ENGINE_PACKAGE} installed in ${modules}`);\n }\n const url = `data:text/javascript;base64,${base64(glue)}`;\n const factory = (await import(url)) as {\n default: (options: {\n wasmBinary: Uint8Array;\n locateFile: (path: string) => string;\n }) => Promise<TlsEngineModule>;\n };\n return factory.default({ wasmBinary, locateFile: (path) => path });\n };\n}\n\nexport interface NetworkOptions {\n transport?: RealmTransport;\n engine: () => Promise<TlsEngine>;\n ca: () => Promise<RealmCa>;\n now?: () => number;\n}\n\nexport function kernelCa(store: CaStore): () => Promise<RealmCa> {\n return () => realmCa(CA_OWNER, store);\n}\n\nexport function kernelTlsEngine(load: () => Promise<TlsEngineModule>): () => Promise<TlsEngine> {\n return () => loadTlsEngine(load);\n}\n\nexport async function writeCaFile(fs: KernelFs, ca: () => Promise<RealmCa>): Promise<void> {\n const { pem } = await ca();\n const current = (await fs.exists(CA_PATH)) ? await fs.readFile(CA_PATH) : undefined;\n if (current === pem) return;\n await fs.mkdir(CA_PATH.slice(0, CA_PATH.lastIndexOf('/')), { recursive: true });\n await fs.writeFile(CA_PATH, pem);\n}\n\nexport function enableNetwork(\n net: LoopbackNet,\n options: NetworkOptions\n): () => RealmProxy | undefined {\n let proxy: RealmProxy | undefined;\n const transport = options.transport ?? missingTransport();\n net.activate({ family: 'inet', host: '127.0.0.1', port: REALM_PROXY_PORT }, () => {\n const tls = new TlsTerminator({\n ca: options.ca,\n engine: options.engine,\n ...(options.now ? { now: options.now } : {}),\n });\n const started = new RealmProxy({\n net,\n transport,\n tunnel: tls.handler,\n tunnelReady: async () => {\n await options.engine();\n },\n });\n proxy = started;\n void started.closed.then(async () => {\n if (proxy === started) proxy = undefined;\n await tls.close();\n });\n });\n return () => proxy;\n}\n", "import type {\n HeaderList,\n RealmTransport,\n RealmTransportRequest,\n RealmTransportResponse,\n RealmTransportTraits,\n} from './transport.ts';\n\nexport type TransportCall =\n | {\n net: 'fetch';\n nid: number;\n url: string;\n method: string;\n headers: HeaderList;\n body?: Uint8Array;\n }\n | { net: 'read'; nid: number }\n | { net: 'cancel'; nid: number };\n\nexport type TransportReply =\n | { net: 'head'; nid: number; status: number; statusText: string; headers: HeaderList }\n | { net: 'chunk'; nid: number; bytes: Uint8Array }\n | { net: 'end'; nid: number }\n | { net: 'error'; nid: number; message: string; status?: number; code?: string };\n\nexport interface TransportPort {\n postMessage(message: TransportCall): void;\n}\n\nexport class TransportError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n\n constructor(message: string, status?: number, code?: string) {\n super(message);\n this.status = status;\n this.code = code;\n }\n}\n\ninterface Waiter {\n resolve(reply: TransportReply): void;\n reject(error: Error): void;\n}\n\nexport class RemoteTransport implements RealmTransport {\n readonly traits: RealmTransportTraits;\n\n private readonly port: TransportPort;\n\n private readonly waiting = new Map<number, Waiter>();\n\n private nextId = 0;\n\n constructor(port: TransportPort, traits: RealmTransportTraits) {\n this.port = port;\n this.traits = traits;\n }\n\n receive(reply: TransportReply): void {\n const waiter = this.waiting.get(reply.nid);\n if (!waiter) return;\n this.waiting.delete(reply.nid);\n if (reply.net === 'error') {\n waiter.reject(new TransportError(reply.message, reply.status, reply.code));\n } else waiter.resolve(reply);\n }\n\n private ask(call: TransportCall): Promise<TransportReply> {\n return new Promise((resolve, reject) => {\n this.waiting.set(call.nid, { resolve, reject });\n this.port.postMessage(call);\n });\n }\n\n private cancel(nid: number): void {\n const waiter = this.waiting.get(nid);\n this.waiting.delete(nid);\n waiter?.reject(new TransportError('the request was cancelled'));\n this.port.postMessage({ net: 'cancel', nid });\n }\n\n async fetch(request: RealmTransportRequest): Promise<RealmTransportResponse> {\n const nid = ++this.nextId;\n const { signal } = request;\n signal.throwIfAborted();\n let finished = false;\n const abort = () => {\n finished = true;\n this.cancel(nid);\n };\n signal.addEventListener('abort', abort, { once: true });\n const finish = () => {\n if (finished) return;\n finished = true;\n signal.removeEventListener('abort', abort);\n };\n let head: TransportReply;\n try {\n head = await this.ask({\n net: 'fetch',\n nid,\n url: request.url,\n method: request.method,\n headers: request.headers,\n ...(request.body ? { body: request.body } : {}),\n });\n } catch (e) {\n finish();\n throw e;\n }\n const { status, statusText, headers } = head as Extract<TransportReply, { net: 'head' }>;\n const read = async (): Promise<Uint8Array | undefined> => {\n if (finished) return undefined;\n const reply = await this.ask({ net: 'read', nid }).catch((e: unknown) => {\n finish();\n throw e;\n });\n if (reply.net === 'chunk') return reply.bytes;\n finish();\n return undefined;\n };\n const cancel = async () => {\n if (finished) return;\n finish();\n this.cancel(nid);\n };\n return {\n status,\n statusText,\n headers,\n cancel,\n body: {\n [Symbol.asyncIterator]: () => ({\n next: async () => {\n const bytes = await read();\n return bytes ? { value: bytes, done: false } : { value: undefined, done: true };\n },\n return: async () => {\n await cancel();\n return { value: undefined, done: true };\n },\n }),\n },\n };\n }\n}\n", "export const SIG = {\n HUP: 1,\n INT: 2,\n QUIT: 3,\n ILL: 4,\n TRAP: 5,\n ABRT: 6,\n BUS: 7,\n FPE: 8,\n KILL: 9,\n USR1: 10,\n SEGV: 11,\n USR2: 12,\n PIPE: 13,\n ALRM: 14,\n TERM: 15,\n STKFLT: 16,\n CHLD: 17,\n CONT: 18,\n STOP: 19,\n TSTP: 20,\n TTIN: 21,\n TTOU: 22,\n URG: 23,\n XCPU: 24,\n XFSZ: 25,\n VTALRM: 26,\n PROF: 27,\n WINCH: 28,\n POLL: 29,\n PWR: 30,\n SYS: 31,\n} as const;\n\nexport type DefaultAction = 'terminate' | 'ignore' | 'stop' | 'continue';\n\nconst IGNORED_BY_DEFAULT: ReadonlySet<number> = new Set([SIG.CHLD, SIG.URG, SIG.WINCH]);\nconst STOPPING: ReadonlySet<number> = new Set([SIG.STOP, SIG.TSTP, SIG.TTIN, SIG.TTOU]);\n\nexport function defaultAction(sig: number): DefaultAction {\n if (sig === SIG.CONT) return 'continue';\n if (STOPPING.has(sig)) return 'stop';\n return IGNORED_BY_DEFAULT.has(sig) ? 'ignore' : 'terminate';\n}\n\nexport function isSignal(sig: number): boolean {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31;\n}\n\nexport function sigbit(sig: number): number {\n return 1 << sig;\n}\n\nexport function signalsIn(mask: number): number[] {\n const out: number[] = [];\n for (let sig = 1; sig <= 31; sig++) if (mask & sigbit(sig)) out.push(sig);\n return out;\n}\n\nexport const SIGNAL_BY_NAME: Readonly<\n Record<'SIGINT' | 'SIGTERM' | 'SIGKILL' | 'SIGSTOP' | 'SIGCONT', number>\n> = {\n SIGINT: SIG.INT,\n SIGTERM: SIG.TERM,\n SIGKILL: SIG.KILL,\n SIGSTOP: SIG.STOP,\n SIGCONT: SIG.CONT,\n};\n", "import type { KernelFs } from './fs/types.ts';\n\nexport type Abi = 'emscripten' | 'wasi';\n\nexport interface Command {\n name: string;\n abi: Abi;\n glue: string;\n wasm: string;\n argv0: string;\n args?: string[];\n env?: Record<string, string>;\n unset?: string[];\n script?: string;\n imports?: string;\n}\n\ninterface CommandEntry {\n abi?: unknown;\n glue?: unknown;\n wasm?: unknown;\n argv0?: unknown;\n args?: unknown;\n env?: unknown;\n script?: unknown;\n imports?: unknown;\n}\n\ninterface Manifest {\n slicc?: { abi?: unknown; commands?: unknown; env?: unknown };\n}\n\nconst NAME = /^[A-Za-z0-9._+-]+$/;\nconst ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst PACKAGE = /\\$\\{package\\}/g;\n\nfunction inside(pkg: string, rel: unknown): string | undefined {\n if (typeof rel !== 'string' || rel === '') return undefined;\n const clean = rel.replace(/^\\.\\//, '');\n if (clean.startsWith('/') || clean.split('/').includes('..')) return undefined;\n return `${pkg}/${clean}`;\n}\n\ntype ManifestEnv = Record<string, string | null>;\n\nfunction envOf(pkg: string, raw: unknown): ManifestEnv {\n const env: ManifestEnv = {};\n if (!raw || typeof raw !== 'object') return env;\n for (const [key, value] of Object.entries(raw)) {\n if (!ENV_KEY.test(key)) continue;\n if (typeof value === 'string') env[key] = value.replace(PACKAGE, pkg);\n else if (value === null) env[key] = null;\n }\n return env;\n}\n\nfunction envFields(merged: ManifestEnv): { env?: Record<string, string>; unset?: string[] } {\n const env: Record<string, string> = {};\n const unset: string[] = [];\n for (const [key, value] of Object.entries(merged)) {\n if (value === null) unset.push(key);\n else env[key] = value;\n }\n return {\n ...(Object.keys(env).length > 0 ? { env } : {}),\n ...(unset.length > 0 ? { unset } : {}),\n };\n}\n\nfunction argsOf(pkg: string, raw: unknown): string[] | undefined {\n if (!Array.isArray(raw) || raw.length === 0) return undefined;\n if (!raw.every((arg) => typeof arg === 'string')) return undefined;\n return raw.map((arg) => arg.replace(PACKAGE, pkg));\n}\n\nfunction abiOf(raw: unknown, fallback: Abi): Abi | undefined {\n const abi = raw ?? fallback;\n return abi === 'emscripten' || abi === 'wasi' ? abi : undefined;\n}\n\nfunction commandOf(\n pkg: string,\n name: string,\n raw: CommandEntry,\n packageAbi: Abi,\n shared: ManifestEnv\n): Command | undefined {\n const withEnv = envFields({ ...shared, ...envOf(pkg, raw.env) });\n const script = inside(pkg, raw.script);\n if (script) {\n return { name, abi: packageAbi, glue: script, wasm: script, argv0: name, script, ...withEnv };\n }\n const abi = abiOf(raw.abi, packageAbi);\n const wasm = inside(pkg, raw.wasm);\n const glue = abi === 'wasi' ? wasm : inside(pkg, raw.glue);\n if (!abi || !glue || !wasm) return undefined;\n const argv0 = typeof raw.argv0 === 'string' && raw.argv0 ? raw.argv0 : name;\n const args = argsOf(pkg, raw.args);\n const imports = abi === 'wasi' ? inside(pkg, raw.imports) : undefined;\n return {\n name,\n abi,\n glue,\n wasm,\n argv0,\n ...(args ? { args } : {}),\n ...withEnv,\n ...(imports ? { imports } : {}),\n };\n}\n\nexport function commandsOf(pkg: string, manifest: Manifest): Command[] {\n const slicc = manifest.slicc;\n if (!slicc || typeof slicc !== 'object') return [];\n const packageAbi = abiOf(slicc.abi, 'emscripten');\n const entries = slicc.commands;\n if (!packageAbi || !entries || typeof entries !== 'object') return [];\n const shared = envOf(pkg, slicc.env);\n const out: Command[] = [];\n for (const [name, raw] of Object.entries(entries as Record<string, CommandEntry>)) {\n if (!NAME.test(name) || name === '.' || name === '..' || !raw || typeof raw !== 'object') {\n continue;\n }\n const command = commandOf(pkg, name, raw, packageAbi, shared);\n if (command) out.push(command);\n }\n return out;\n}\n\nasync function withPackagePaths(fs: KernelFs, pkg: string, command: Command): Promise<Command> {\n if (!command.env) return command;\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(command.env)) {\n const path = !value.startsWith('/') && value.includes('/') && inside(pkg, value);\n env[key] = path && (await fs.exists(path)) ? path : value;\n }\n return { ...command, env };\n}\n\nasync function packages(fs: KernelFs, modules: string): Promise<string[]> {\n const names = await fs.readdir(modules).catch(() => []);\n const dirs: string[] = [];\n for (const name of names) {\n if (name.startsWith('.')) continue;\n if (!name.startsWith('@')) {\n dirs.push(`${modules}/${name}`);\n continue;\n }\n for (const inner of await fs.readdir(`${modules}/${name}`).catch(() => [])) {\n dirs.push(`${modules}/${name}/${inner}`);\n }\n }\n return dirs;\n}\n\nexport async function scanCommands(fs: KernelFs, modules: string): Promise<Map<string, Command>> {\n const found = new Map<string, Command>();\n for (const pkg of await packages(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n for (const command of commandsOf(pkg, manifest)) {\n if (!found.has(command.name))\n found.set(command.name, await withPackagePaths(fs, pkg, command));\n }\n }\n if (!found.has('sh') && found.has('bash')) {\n found.set('sh', { ...(found.get('bash') as Command), name: 'sh', argv0: 'sh' });\n }\n return found;\n}\n", "import { type FsStat, inodeOf, type KernelFs } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst MAX_LINKS = 40;\n\nfunction missing(err: unknown): boolean {\n return (err as { code?: unknown })?.code === 'ENOENT';\n}\n\nfunction synthetic(directory: boolean, path: string): FsStat {\n const epoch = new Date(0);\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: 0,\n mode: (directory ? S_IFDIR : S_IFREG) | 0o755,\n mtime: epoch,\n atime: epoch,\n ctime: epoch,\n ino: inodeOf(path),\n };\n}\n\nexport async function followLinks(fs: KernelFs, path: string): Promise<string> {\n let current = path;\n for (let hops = 0; hops < MAX_LINKS; hops++) {\n const st = await fs.lstat(current).catch(() => undefined);\n if (!st?.isSymbolicLink) return current;\n const parent = current.slice(0, current.lastIndexOf('/')) || '/';\n current = fs.resolvePath(parent, await fs.readlink(current));\n }\n return current;\n}\n\nexport function withCommandDirs(fs: KernelFs, names: () => Promise<ReadonlySet<string>>): KernelFs {\n async function children(path: string): Promise<string[] | undefined> {\n if (path === '/') return ['bin', 'usr'];\n if (path === '/usr') return ['bin'];\n if (path === '/bin' || path === '/usr/bin') return [...(await names())];\n return undefined;\n }\n\n async function virtual(path: string): Promise<FsStat | undefined> {\n if (path === '/usr' || path === '/bin' || path === '/usr/bin') return synthetic(true, path);\n const name = COMMAND.exec(path)?.[1];\n return name !== undefined && (await names()).has(name) ? synthetic(false, path) : undefined;\n }\n\n async function linked(path: string): Promise<FsStat | undefined> {\n return (await virtual(path)) ?? virtual(await followLinks(fs, path));\n }\n\n async function stat(path: string, real: (path: string) => Promise<FsStat>): Promise<FsStat> {\n try {\n return await real(path);\n } catch (err) {\n const found = missing(err) ? await linked(path) : undefined;\n if (found) return found;\n throw err;\n }\n }\n\n return {\n resolvePath: (base, path) => fs.resolvePath(base, path),\n readFile: (path) => fs.readFile(path),\n async readFileBuffer(path) {\n try {\n return await fs.readFileBuffer(path);\n } catch (err) {\n if (missing(err) && (await linked(path))?.isFile) return new Uint8Array(0);\n throw err;\n }\n },\n writeFile: (path, content) => fs.writeFile(path, content),\n async exists(path) {\n return (await fs.exists(path)) || (await linked(path)) !== undefined;\n },\n stat: (path) => stat(path, (p) => fs.stat(p)),\n lstat: (path) => stat(path, (p) => fs.lstat(p)),\n async readdir(path) {\n const extra = await children(path);\n if (!extra) return fs.readdir(path);\n const real = await fs.readdir(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n return [...new Set([...real, ...extra])].sort();\n },\n async readdirStat(path) {\n const extra = await children(path);\n if (!extra) return fs.readdirStat(path);\n const real = await fs.readdirStat(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n const seen = new Set(real.map(([name]) => name));\n const base = path === '/' ? '' : path;\n const added = extra.filter((name) => !seen.has(name));\n const virtuals = await Promise.all(\n added.map(\n async (name): Promise<[string, FsStat | null]> => [\n name,\n (await virtual(`${base}/${name}`)) as FsStat,\n ]\n )\n );\n return [...real, ...virtuals].sort(([a], [b]) => (a < b ? -1 : 1));\n },\n mkdir: (path, options) => fs.mkdir(path, options),\n rm: (path, options) => fs.rm(path, options),\n rename: (from, to) => fs.rename(from, to),\n symlink: (target, path) => fs.symlink(target, path),\n readlink: (path) => fs.readlink(path),\n chmod: (path, mode) => fs.chmod(path, mode),\n utimes: (path, atime, mtime) => fs.utimes(path, atime, mtime),\n };\n}\n", "import {\n bytesSource,\n type DeviceMeta,\n deviceFile,\n FdTable,\n type KernelErrno,\n KernelError,\n nullFile,\n type OpenFile,\n sinkFile,\n} from './fd-table.ts';\nimport type { ForkState } from './protocol.ts';\n\nexport type ChildStdio =\n | { fd: number }\n | { input: Uint8Array }\n | { capture: true }\n | { none: true };\n\nexport type InheritedSlot =\n | { fd: number; kernel: number; flags?: number }\n | ({ fd: number } & DeviceMeta);\n\nexport interface ChildSpawnRequest {\n file: string;\n\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n}\n\nexport interface ChildHandle {\n pid: number;\n\n exited: Promise<number>;\n\n termsig?: () => number | undefined;\n\n onState?: (listener: ChildStateListener) => void;\n}\n\nexport type ChildStateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport interface WaitFlags {\n untraced?: boolean;\n\n continued?: boolean;\n\n inGroup?: (childPid: number) => boolean;\n}\n\nexport class SpawnError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport type ChildSpawner = (req: ChildSpawnRequest, fds: FdTable) => Promise<ChildHandle>;\n\nexport type ChildForker = (state: ForkState, fds: FdTable) => Promise<ChildHandle>;\n\ninterface Child {\n exited: Promise<number>;\n termsig?: () => number | undefined;\n\n code?: number;\n\n stopReport?: number;\n\n continueReport?: boolean;\n\n captured: Map<number, Uint8Array[]>;\n}\n\nfunction interrupted(signal: AbortSignal | undefined): {\n promise: Promise<never>;\n\n done(): void;\n} {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal?.aborted) fail();\n else signal?.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal?.removeEventListener('abort', fail) };\n}\n\nexport function stoppedStatus(sig: number): number {\n return ((sig & 0xff) << 8) | 0x7f;\n}\n\nexport const CONTINUED_STATUS = 0xffff;\n\nexport function waitStatus(code: number, termsig?: number): number {\n return termsig ? termsig & 0x7f : (code & 0xff) << 8;\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\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\nexport class ChildTable {\n private readonly children = new Map<number, Child>();\n\n private readonly leftovers = new Map<number, Map<number, Uint8Array[]>>();\n\n onChildState?: () => void;\n\n onReap?: (pid: number) => void;\n\n private stateChanged: Array<() => void> = [];\n\n private readonly watchers = new Map<number, ChildStateListener>();\n\n private readonly parentFds: FdTable;\n\n private readonly spawner: ChildSpawner | undefined;\n\n private readonly forker?: ChildForker;\n\n constructor(\n parentFds: FdTable,\n\n spawner: ChildSpawner | undefined,\n\n forker?: ChildForker\n ) {\n this.parentFds = parentFds;\n\n this.spawner = spawner;\n\n this.forker = forker;\n }\n\n async fork(state: ForkState): Promise<number> {\n if (!this.forker) throw new SpawnError('ENOSYS');\n return this.track(state, this.parentFds.fork(), new Map(), this.forker);\n }\n\n async spawn(\n req: ChildSpawnRequest,\n stdio: readonly ChildStdio[],\n inherit: readonly InheritedSlot[] = []\n ): Promise<number> {\n if (!this.spawner) throw new SpawnError('ENOSYS');\n const fds = new FdTable();\n const captured = new Map<number, Uint8Array[]>();\n try {\n for (const [n, slot] of stdio.entries()) fds.installAt(n, this.openSlot(slot, n, captured));\n\n for (const slot of inherit) {\n if (slot.fd <= 2) continue;\n if ('device' in slot) {\n fds.installAt(slot.fd, deviceFile(slot.device, slot.access));\n continue;\n }\n fds.installAt(slot.fd, this.parentFds.get(slot.kernel).retain());\n if (slot.flags !== undefined) fds.setStatusFlags(slot.fd, slot.flags);\n }\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n return this.track(req, fds, captured, this.spawner);\n }\n\n private async track<R>(\n req: R,\n fds: FdTable,\n captured: Map<number, Uint8Array[]>,\n start: (req: R, fds: FdTable) => Promise<ChildHandle>\n ): Promise<number> {\n let handle: ChildHandle;\n try {\n handle = await start(req, fds);\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n const child: Child = { exited: handle.exited, termsig: handle.termsig, captured };\n void handle.exited.then((code) => {\n child.code = code;\n this.watchers.delete(handle.pid);\n this.onChildState?.();\n });\n handle.onState?.((state, sig) => {\n child.stopReport = state === 'stopped' ? sig : undefined;\n child.continueReport = state === 'continued';\n this.watchers.get(handle.pid)?.(state, sig);\n const waiters = this.stateChanged;\n this.stateChanged = [];\n for (const wake of waiters) wake();\n this.onChildState?.();\n });\n this.children.set(handle.pid, child);\n return handle.pid;\n }\n\n watch(pid: number, listener: ChildStateListener): void {\n if (this.children.has(pid)) this.watchers.set(pid, listener);\n }\n\n private openSlot(slot: ChildStdio, n: number, captured: Map<number, Uint8Array[]>): OpenFile {\n if ('fd' in slot) return this.parentFds.get(slot.fd).retain();\n if ('input' in slot) return bytesSource(slot.input);\n if ('capture' in slot) {\n const chunks: Uint8Array[] = [];\n captured.set(n, chunks);\n return sinkFile((bytes) => chunks.push(bytes));\n }\n return nullFile();\n }\n\n async wait(\n pid: number,\n nohang: boolean,\n signal?: AbortSignal,\n flags: WaitFlags = {}\n ): Promise<[number, number]> {\n let interrupt: ReturnType<typeof interrupted> | undefined;\n try {\n for (;;) {\n const candidates = this.candidates(pid, flags);\n if (candidates.length === 0) throw new KernelError('ECHILD');\n const done = candidates.find(([, child]) => child.code !== undefined);\n if (done) return this.reap(done[0], done[1].code as number);\n const changed = this.stateReport(candidates, flags);\n if (changed) return changed;\n if (nohang) return [0, 0];\n interrupt ??= interrupted(signal);\n await this.nextChange(candidates, flags, interrupt.promise);\n }\n } finally {\n interrupt?.done();\n }\n }\n\n private candidates(pid: number, flags: WaitFlags): [number, Child][] {\n const all = [...this.children];\n if (pid > 0) return all.filter(([p]) => p === pid);\n const inGroup = flags.inGroup;\n return pid === -1 || !inGroup ? all : all.filter(([p]) => inGroup(p));\n }\n\n private async nextChange(\n candidates: [number, Child][],\n flags: WaitFlags,\n interrupt: Promise<never>\n ): Promise<void> {\n let wake: (() => void) | undefined;\n const stateChange = new Promise<void>((resolve) => (wake = resolve));\n const watching = flags.untraced || flags.continued;\n if (watching && wake) this.stateChanged.push(wake);\n try {\n await Promise.race([\n ...candidates.map(([, child]) => child.exited),\n ...(watching ? [stateChange] : []),\n interrupt,\n ]);\n } finally {\n this.stateChanged = this.stateChanged.filter((w) => w !== wake);\n }\n }\n\n private stateReport(candidates: [number, Child][], flags: WaitFlags): [number, number] | null {\n for (const [p, child] of candidates) {\n if (flags.untraced && child.stopReport !== undefined) {\n const sig = child.stopReport;\n child.stopReport = undefined;\n return [p, stoppedStatus(sig)];\n }\n if (flags.continued && child.continueReport) {\n child.continueReport = false;\n return [p, CONTINUED_STATUS];\n }\n }\n return null;\n }\n\n private reap(pid: number, code: number): [number, number] {\n const child = this.children.get(pid);\n this.children.delete(pid);\n this.onReap?.(pid);\n if (child && child.captured.size > 0) this.leftovers.set(pid, child.captured);\n return [pid, waitStatus(code, child?.termsig?.())];\n }\n\n pids(): number[] {\n return [...this.children.keys()];\n }\n\n captured(pid: number, slot: number): Uint8Array {\n const slots = this.leftovers.get(pid);\n const chunks = slots?.get(slot);\n if (!slots || !chunks) return new Uint8Array(0);\n slots.delete(slot);\n if (slots.size === 0) this.leftovers.delete(pid);\n return concat(chunks);\n }\n}\n", "import type { KernelFs } from '../fs/types.ts';\n\nexport interface SyncFsTokenEntry {\n fs: KernelFs;\n cwd: string;\n}\n\nconst registry = new Map<string, SyncFsTokenEntry>();\n\nexport function mintSyncFsToken(entry: SyncFsTokenEntry): string {\n const token = crypto.randomUUID();\n registry.set(token, entry);\n return token;\n}\n\nexport function resolveSyncFsToken(token: string): SyncFsTokenEntry | null {\n return registry.get(token) ?? null;\n}\n\nexport function revokeSyncFsToken(token: string): void {\n registry.delete(token);\n}\n", "export type SyncFsOp =\n | 'read'\n | 'write'\n | 'exists'\n | 'stat'\n | 'lstat'\n | 'readdir'\n | 'readdir-stat'\n | 'mkdir'\n | 'rm'\n | 'rename'\n | 'unlink'\n | 'rmdir'\n | 'symlink'\n | 'readlink'\n | 'chmod'\n | 'utimes'\n | 'statfs';\n\nexport interface SyncFsRequest {\n token: string;\n op: SyncFsOp;\n path: string;\n body?: Uint8Array;\n arg2?: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n}\n\nexport type SyncFsResult =\n | { ok: true; kind: 'bytes'; bytes: Uint8Array }\n | { ok: true; kind: 'json'; json: unknown }\n | { ok: true; kind: 'void' }\n | { ok: false; errno: string; message: string };\n\nexport const SYNC_FS_REQUEST_TIMEOUT_MS = 25_000;\n\nexport interface SyncFsBridgeStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink?: boolean;\n size: number;\n mode?: number;\n mtimeMs?: number;\n atimeMs?: number;\n ctimeMs?: number;\n ino?: number;\n}\n\nexport interface 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 interface SyncFsPosixBridge {\n readFile(path: string): Uint8Array;\n writeFile(path: string, bytes: Uint8Array): void;\n stat(path: string): SyncFsBridgeStat;\n lstat(path: string): SyncFsBridgeStat;\n readdir(path: string): string[];\n exists(path: string): boolean;\n mkdir(path: string): void;\n rm(path: string): void;\n rename(from: string, to: string): void;\n unlink(path: string): void;\n rmdir(path: string): void;\n symlink(target: string, linkPath: string): void;\n readlink(path: string): string;\n chmod(path: string, mode: number): void;\n utimes(path: string, atimeMs: number, mtimeMs: number): void;\n readdirStat(path: string): Array<[string, SyncFsBridgeStat | null]>;\n statfs?(): SyncFsUsage | null;\n}\n\nexport function syncError(code: string, label: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${label}`), { code });\n}\n\nexport function parseSyncFsStat(json: unknown): SyncFsBridgeStat | null {\n const s = json as Partial<SyncFsBridgeStat> | null;\n if (\n !s ||\n typeof s.isFile !== 'boolean' ||\n typeof s.isDirectory !== 'boolean' ||\n typeof s.size !== 'number'\n ) {\n return null;\n }\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n ...(typeof s.mode === 'number' ? { mode: s.mode } : {}),\n ...(typeof s.mtimeMs === 'number' ? { mtimeMs: s.mtimeMs } : {}),\n ...(typeof s.atimeMs === 'number' ? { atimeMs: s.atimeMs } : {}),\n ...(typeof s.ctimeMs === 'number' ? { ctimeMs: s.ctimeMs } : {}),\n ...(typeof s.ino === 'number' ? { ino: s.ino } : {}),\n };\n}\n", "import type { FsStat, KernelFs } from '../fs/types.ts';\nimport { resolveSyncFsToken } from './sync-fs-token-registry.ts';\nimport {\n type SyncFsRequest,\n type SyncFsResult,\n type SyncFsUsage,\n syncError,\n} from './sync-fs-wire.ts';\n\nexport function toErrno(err: unknown): SyncFsResult {\n const message = err instanceof Error ? err.message : String(err);\n const code = (err as { code?: unknown })?.code;\n if (typeof code === 'string' && /^E[A-Z]+$/.test(code)) {\n return { ok: false, errno: code, message };\n }\n return { ok: false, errno: 'EIO', message };\n}\n\nexport interface SyncFsStatJson {\n isDirectory: boolean;\n isFile: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtimeMs: number;\n atimeMs: number;\n ctimeMs: number;\n ino: number;\n}\n\nfunction statJson(s: FsStat): SyncFsStatJson {\n return {\n isDirectory: s.isDirectory,\n isFile: s.isFile,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mode: s.mode,\n mtimeMs: s.mtime.getTime(),\n atimeMs: s.atime.getTime(),\n ctimeMs: s.ctime.getTime(),\n ino: s.ino,\n };\n}\n\nasync function readdirStat(\n fs: KernelFs,\n dir: string\n): Promise<Array<[string, SyncFsStatJson | null]>> {\n return (await fs.readdirStat(dir)).map(([name, stat]) => [name, stat && statJson(stat)]);\n}\n\nasync function storageUsage(): Promise<SyncFsUsage | null> {\n const estimate = await globalThis.navigator?.storage?.estimate?.();\n if (typeof estimate?.quota !== 'number') return null;\n return { quota: estimate.quota, usage: estimate.usage ?? 0 };\n}\n\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nfunction json(value: unknown): SyncFsResult {\n return { ok: true, kind: 'json', json: value };\n}\n\nasync function run(\n fs: KernelFs,\n path: string,\n req: SyncFsRequest,\n cwd: string\n): Promise<SyncFsResult> {\n switch (req.op) {\n case 'read':\n return { ok: true, kind: 'bytes', bytes: await fs.readFileBuffer(path) };\n case 'write':\n await fs.writeFile(path, req.body ?? new Uint8Array(0));\n return done;\n case 'exists':\n return json(await fs.exists(path));\n case 'stat':\n return json(statJson(await fs.stat(path)));\n case 'lstat':\n return json(statJson(await fs.lstat(path)));\n case 'readdir':\n return json(await fs.readdir(path));\n case 'readdir-stat':\n return json(await readdirStat(fs, path));\n case 'mkdir':\n await fs.mkdir(path, { recursive: true });\n return done;\n case 'rm':\n await fs.rm(path, { recursive: true });\n return done;\n case 'rename':\n await fs.rename(path, fs.resolvePath(cwd, req.arg2 ?? ''));\n return done;\n case 'unlink':\n if ((await fs.lstat(path)).isDirectory) throw syncError('EISDIR', path);\n await fs.rm(path);\n return done;\n case 'rmdir':\n if (!(await fs.lstat(path)).isDirectory) throw syncError('ENOTDIR', path);\n if ((await fs.readdir(path)).length > 0) throw syncError('ENOTEMPTY', path);\n await fs.rm(path, { recursive: true });\n return done;\n case 'symlink':\n await fs.symlink(req.arg2 ?? '', path);\n return done;\n case 'readlink':\n return json(await fs.readlink(path));\n case 'chmod':\n await fs.chmod(path, req.mode ?? 0);\n return done;\n case 'utimes':\n await fs.utimes(path, new Date(req.atimeMs ?? 0), new Date(req.mtimeMs ?? 0));\n return done;\n case 'statfs':\n return json(await storageUsage());\n default:\n return { ok: false, errno: 'EINVAL', message: `sync-fs: unknown op '${req.op as string}'` };\n }\n}\n\nexport async function dispatchSyncFs(req: SyncFsRequest): Promise<SyncFsResult> {\n const entry = resolveSyncFsToken(req.token);\n if (!entry) return { ok: false, errno: 'EACCES', message: 'sync-fs: unknown or revoked token' };\n const { fs, cwd } = entry;\n try {\n return await run(fs, fs.resolvePath(cwd, req.path), req, cwd);\n } catch (err) {\n return toErrno(err);\n }\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport type { SyncFsRequest, SyncFsResult } from './sync-fs-wire.ts';\n\nexport const SAB_HEADER_I32 = 16;\nexport const SAB_HEADER_BYTES = SAB_HEADER_I32 * 4;\n\nexport const SAB_I_STATE = 0;\nexport const SAB_I_SEQ = 1;\nexport const SAB_I_STATUS = 2;\nexport const SAB_I_TOTAL = 3;\nexport const SAB_I_CHUNK = 4;\nexport const SAB_I_OFFSET = 5;\nexport const SAB_I_REQ = 6;\nexport const SAB_I_PUB = 7;\n\nexport const SAB_I_SIGNALS = 8;\n\nexport const SAB_I_TIMERS = 9;\n\nexport const SAB_STATE_IDLE = 0;\nexport const SAB_STATE_PENDING = 1;\nexport const SAB_STATE_READY = 2;\n\nexport const SAB_STATUS_BYTES = 1;\nexport const SAB_STATUS_JSON = 2;\nexport const SAB_STATUS_VOID = 3;\nexport const SAB_STATUS_ERRNO = 4;\n\nexport const SAB_DEFAULT_WINDOW_BYTES = 1024 * 1024;\n\nexport const SAB_MIN_BYTES = SAB_HEADER_BYTES + 4096;\n\nexport const SYNC_SAB_REQ_MSG = 'sync-sab-req';\n\nexport const SYNC_SAB_NEXT_MSG = 'sync-sab-next';\n\nexport type SyncSabRequestBody = Omit<SyncFsRequest, 'token'> | WasmSyscall;\n\nexport interface SyncSabReqMsg {\n type: typeof SYNC_SAB_REQ_MSG;\n id: number;\n req: SyncSabRequestBody;\n}\nexport interface SyncSabNextMsg {\n type: typeof SYNC_SAB_NEXT_MSG;\n id: number;\n offset: number;\n}\n\nexport interface SabEncodedResult {\n status: number;\n payload: Uint8Array;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function encodeSabResult(result: SyncFsResult): SabEncodedResult {\n if (!result.ok) {\n return {\n status: SAB_STATUS_ERRNO,\n payload: encoder.encode(JSON.stringify({ errno: result.errno, message: result.message })),\n };\n }\n switch (result.kind) {\n case 'bytes':\n return { status: SAB_STATUS_BYTES, payload: result.bytes };\n case 'json':\n return { status: SAB_STATUS_JSON, payload: encoder.encode(JSON.stringify(result.json)) };\n default:\n return { status: SAB_STATUS_VOID, payload: new Uint8Array(0) };\n }\n}\n\nexport function decodeSabResult(status: number, payload: Uint8Array): SyncFsResult {\n switch (status) {\n case SAB_STATUS_BYTES:\n return { ok: true, kind: 'bytes', bytes: payload };\n case SAB_STATUS_VOID:\n return { ok: true, kind: 'void' };\n case SAB_STATUS_JSON: {\n try {\n return { ok: true, kind: 'json', json: JSON.parse(decoder.decode(payload)) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed json payload' };\n }\n }\n case SAB_STATUS_ERRNO: {\n try {\n const parsed = JSON.parse(decoder.decode(payload)) as {\n errno?: unknown;\n message?: unknown;\n };\n const errno =\n typeof parsed.errno === 'string' && /^E[A-Z]+$/.test(parsed.errno) ? parsed.errno : 'EIO';\n return { ok: false, errno, message: String(parsed.message ?? errno) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed errno payload' };\n }\n }\n default:\n return { ok: false, errno: 'EIO', message: `sync-sab: unknown status ${status}` };\n }\n}\n\nexport interface SabViews {\n header: Int32Array;\n window: Uint8Array;\n}\n\nexport function sabViews(sab: SharedArrayBuffer): SabViews {\n if (sab.byteLength < SAB_MIN_BYTES) {\n throw new Error(`sync-sab: buffer too small (${sab.byteLength} < ${SAB_MIN_BYTES})`);\n }\n return {\n header: new Int32Array(sab, 0, SAB_HEADER_I32),\n window: new Uint8Array(sab, SAB_HEADER_BYTES),\n };\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport {\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsRequest,\n type SyncFsResult,\n} from './sync-fs-wire.ts';\nimport {\n encodeSabResult,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_PUB,\n SAB_I_REQ,\n SAB_I_SEQ,\n SAB_I_STATE,\n SAB_I_STATUS,\n SAB_I_TOTAL,\n SAB_STATE_READY,\n type SabViews,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabNextMsg,\n type SyncSabReqMsg,\n sabViews,\n} from './sync-sab-wire.ts';\n\nexport interface SabPortLike {\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface SyncSabResponderHandle {\n dispose(): void;\n}\n\ninterface PendingPayload {\n status: number;\n payload: Uint8Array;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst PENDING_TTL_MS = SYNC_FS_REQUEST_TIMEOUT_MS + 5_000;\n\nexport type SyncSabDispatchRequest = SyncFsRequest | (WasmSyscall & { token: string });\n\nexport interface SyncSabResponderOptions {\n dispatch: (req: SyncSabDispatchRequest) => Promise<SyncFsResult>;\n}\n\nexport function attachSyncSabResponder(\n port: SabPortLike,\n sab: SharedArrayBuffer,\n token: string,\n opts: SyncSabResponderOptions\n): SyncSabResponderHandle {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const pending = new Map<number, PendingPayload>();\n let disposed = false;\n\n const { dispatch } = opts;\n\n function drop(id: number): void {\n const entry = pending.get(id);\n if (!entry) return;\n clearTimeout(entry.timer);\n pending.delete(id);\n }\n\n function publish(id: number, entry: PendingPayload, offset: number): void {\n if (Atomics.load(header, SAB_I_REQ) !== id) {\n drop(id);\n return;\n }\n const chunk = Math.min(window.byteLength, entry.payload.byteLength - offset);\n if (chunk > 0) window.set(entry.payload.subarray(offset, offset + chunk));\n Atomics.store(header, SAB_I_STATUS, entry.status);\n Atomics.store(header, SAB_I_TOTAL, entry.payload.byteLength);\n Atomics.store(header, SAB_I_CHUNK, chunk);\n Atomics.store(header, SAB_I_OFFSET, offset);\n Atomics.store(header, SAB_I_SEQ, id);\n Atomics.store(header, SAB_I_STATE, SAB_STATE_READY);\n Atomics.add(header, SAB_I_PUB, 1);\n Atomics.notify(header, SAB_I_PUB);\n\n if (offset + chunk >= entry.payload.byteLength) drop(id);\n }\n\n function settle(id: number, result: SyncFsResult): void {\n if (disposed) return;\n const { status, payload } = encodeSabResult(result);\n\n drop(id);\n const entry: PendingPayload = {\n status,\n payload,\n timer: setTimeout(() => drop(id), PENDING_TTL_MS),\n };\n pending.set(id, entry);\n publish(id, entry, 0);\n }\n\n const handler = (event: MessageEvent): void => {\n const data = event.data as\n | { type?: unknown; id?: unknown; req?: unknown; offset?: unknown }\n | undefined;\n if (!data || typeof data.id !== 'number') return;\n if (data.type === SYNC_SAB_NEXT_MSG) {\n const entry = pending.get(data.id);\n const offset = (data as Partial<SyncSabNextMsg>).offset;\n if (\n !entry ||\n typeof offset !== 'number' ||\n !Number.isInteger(offset) ||\n offset < 0 ||\n offset > entry.payload.byteLength\n ) {\n settle(data.id, { ok: false, errno: 'EIO', message: 'sync-sab: bad continuation' });\n return;\n }\n publish(data.id, entry, offset);\n return;\n }\n if (data.type !== SYNC_SAB_REQ_MSG || !data.req || typeof data.req !== 'object') return;\n const id = data.id;\n\n const body = (data as SyncSabReqMsg).req;\n const req = { ...body, token } as SyncSabDispatchRequest;\n let dispatched: Promise<SyncFsResult>;\n try {\n dispatched = dispatch(req);\n } catch (err) {\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n void dispatched.then(\n (result) => settle(id, result),\n (err) =>\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n })\n );\n };\n\n port.addEventListener('message', handler);\n return {\n dispose: () => {\n if (disposed) return;\n disposed = true;\n port.removeEventListener('message', handler);\n for (const id of [...pending.keys()]) drop(id);\n },\n };\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { KernelError } from './fd-table.ts';\n\nexport type HostSyscall =\n | { op: 'lock'; path: string; exclusive: boolean; fd: number }\n | { op: 'unlock'; path: string }\n | { op: 'async-submit'; req: { op: string } }\n | { op: 'async-wait'; timeoutMs?: number }\n | { op: 'async-take'; id: number }\n | { op: 'async-resolve'; value: unknown }\n | { op: 'async-hold' }\n | { op: 'async-cancel'; id: number }\n | { op: 'async-close' };\n\nexport const HOST_OPS: readonly HostSyscall['op'][] = [\n 'lock',\n 'unlock',\n 'async-submit',\n 'async-wait',\n 'async-take',\n 'async-resolve',\n 'async-hold',\n 'async-cancel',\n 'async-close',\n];\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\ninterface Holder {\n exclusive: boolean;\n fds: Set<number>;\n}\n\nexport class LockTable {\n private readonly held = new Map<string, Map<number, Holder>>();\n\n lock(pid: number, path: string, exclusive: boolean, fd: number): boolean {\n const holders = this.held.get(path) ?? new Map<number, Holder>();\n for (const [other, h] of holders) if (other !== pid && (exclusive || h.exclusive)) return false;\n const mine = holders.get(pid) ?? { exclusive, fds: new Set<number>() };\n mine.exclusive = exclusive;\n mine.fds.add(fd);\n holders.set(pid, mine);\n this.held.set(path, holders);\n return true;\n }\n\n unlock(pid: number, path: string): void {\n const holders = this.held.get(path);\n holders?.delete(pid);\n if (holders?.size === 0) this.held.delete(path);\n }\n\n closed(pid: number, fd: number): void {\n for (const [path, holders] of [...this.held]) {\n const mine = holders.get(pid);\n if (mine?.fds.delete(fd) && mine.fds.size === 0) this.unlock(pid, path);\n }\n }\n\n release(pid: number): void {\n for (const path of [...this.held.keys()]) this.unlock(pid, path);\n }\n}\n\ntype Run = (req: { op: string }) => Promise<SyncFsResult>;\n\nexport class AsyncOps {\n private next = 1;\n private readonly results = new Map<number, SyncFsResult | undefined>();\n private readonly ready: number[] = [];\n private readonly waiters = new Set<() => void>();\n private closed = false;\n private readonly run: Run;\n\n constructor(run: Run) {\n this.run = run;\n }\n\n submit(req: { op: string }): number {\n const id = this.hold();\n this.run(req).then(\n (result) => this.complete(id, result),\n (err: unknown) => this.complete(id, { ok: false, errno: 'EIO', message: String(err) })\n );\n return id;\n }\n\n resolve(value: unknown): number {\n const id = this.hold();\n this.complete(id, json(value));\n return id;\n }\n\n hold(): number {\n const id = this.next++;\n this.results.set(id, undefined);\n return id;\n }\n\n take(id: number): SyncFsResult {\n if (!this.results.has(id)) throw new KernelError('EINVAL');\n const result = this.results.get(id);\n if (!result) throw new KernelError('EAGAIN');\n this.cancel(id);\n return result;\n }\n\n cancel(id: number): void {\n this.results.delete(id);\n const at = this.ready.indexOf(id);\n if (at >= 0) this.ready.splice(at, 1);\n }\n\n async wait(timeoutMs: number | undefined, signal: AbortSignal): Promise<number> {\n for (;;) {\n if (this.closed) return -1;\n const id = this.ready.shift();\n if (id !== undefined) return id;\n if (timeoutMs !== undefined && timeoutMs <= 0) return 0;\n const woke = await this.sleep(timeoutMs, signal);\n if (!woke) return 0;\n }\n }\n\n close(): void {\n this.closed = true;\n this.wake();\n }\n\n private sleep(timeoutMs: number | undefined, signal: AbortSignal): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cleanup = () => {\n clearTimeout(timer);\n this.waiters.delete(wake);\n signal.removeEventListener('abort', abort);\n };\n const wake = () => {\n cleanup();\n resolve(true);\n };\n const abort = () => {\n cleanup();\n reject(new KernelError('EINTR'));\n };\n this.waiters.add(wake);\n signal.addEventListener('abort', abort, { once: true });\n if (timeoutMs !== undefined) {\n timer = setTimeout(() => {\n cleanup();\n resolve(false);\n }, timeoutMs);\n }\n });\n }\n\n private complete(id: number, result: SyncFsResult): void {\n if (!this.results.has(id)) return;\n this.results.set(id, result);\n this.ready.push(id);\n this.wake();\n }\n\n private wake(): void {\n for (const wake of [...this.waiters]) wake();\n }\n}\n\nexport interface HostOpsContext {\n pid: number;\n locks: LockTable | undefined;\n ops: AsyncOps;\n blocking: () => AbortSignal;\n valid: (req: { op: string }) => boolean;\n}\n\nexport async function hostSyscall(req: HostSyscall, ctx: HostOpsContext): Promise<SyncFsResult> {\n switch (req.op) {\n case 'lock':\n if (!ctx.locks) throw new KernelError('ENOSYS');\n if (!ctx.locks.lock(ctx.pid, req.path, req.exclusive, req.fd))\n throw new KernelError('EAGAIN');\n return done;\n case 'unlock':\n ctx.locks?.unlock(ctx.pid, req.path);\n return done;\n case 'async-submit':\n if (!ctx.valid(req.req)) throw new KernelError('EINVAL');\n return json(ctx.ops.submit(req.req));\n case 'async-wait':\n return json(await ctx.ops.wait(req.timeoutMs, ctx.blocking()));\n case 'async-take':\n return ctx.ops.take(req.id);\n case 'async-resolve':\n return json(ctx.ops.resolve(req.value));\n case 'async-hold':\n return json(ctx.ops.hold());\n case 'async-cancel':\n ctx.ops.cancel(req.id);\n return done;\n case 'async-close':\n ctx.ops.close();\n return done;\n }\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport { NO_TRANSPORT } from './network.ts';\nimport type { HeaderList, RealmTransport } from './transport.ts';\n\nexport type HttpSyscall =\n | {\n op: 'net-request';\n url: string;\n method: string;\n headers: HeaderList;\n body?: Uint8Array;\n }\n | { op: 'net-read'; handle: number; max: number }\n | { op: 'net-close'; handle: number }\n | { op: 'net-traits' };\n\nexport const HTTP_OPS: readonly string[] = ['net-request', 'net-read', 'net-close', 'net-traits'];\n\nexport interface HttpHead {\n handle: number;\n status: number;\n statusText: string;\n url: string;\n headers: HeaderList;\n}\n\ninterface Open {\n abort: AbortController;\n body: AsyncIterator<Uint8Array>;\n left: Uint8Array;\n done: boolean;\n reading: Promise<void>;\n cancel(): Promise<void>;\n}\n\nconst EMPTY = new Uint8Array(0);\n\nfunction message(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\nasync function* once(bytes: Uint8Array): AsyncGenerator<Uint8Array> {\n yield bytes;\n}\n\nexport class HttpHandles {\n private readonly transport: RealmTransport;\n\n private readonly open = new Map<number, Open>();\n\n private nextHandle = 0;\n\n constructor(transport: RealmTransport) {\n this.transport = transport;\n }\n\n syscall(req: HttpSyscall): Promise<SyncFsResult> {\n if (req.op === 'net-request') return this.request(req);\n if (req.op === 'net-read') return this.read(req.handle, req.max);\n if (req.op === 'net-traits') return Promise.resolve(this.traits());\n return this.close(req.handle);\n }\n\n private traits(): SyncFsResult {\n const { unavailable, crossOrigin = 'any', ...rest } = this.transport.traits;\n if (unavailable) return { ok: false, errno: 'ENETUNREACH', message: NO_TRANSPORT };\n return { ok: true, kind: 'json', json: { ...rest, crossOrigin } };\n }\n\n private add(\n abort: AbortController,\n body: AsyncIterable<Uint8Array>,\n cancel: () => Promise<void>\n ) {\n const handle = ++this.nextHandle;\n this.open.set(handle, {\n abort,\n body: body[Symbol.asyncIterator](),\n left: EMPTY,\n done: false,\n reading: Promise.resolve(),\n cancel,\n });\n return handle;\n }\n\n private async request(req: Extract<HttpSyscall, { op: 'net-request' }>): Promise<SyncFsResult> {\n const abort = new AbortController();\n try {\n const response = await this.transport.fetch({\n url: req.url,\n method: req.method,\n headers: req.headers,\n ...(req.body ? { body: req.body } : {}),\n signal: abort.signal,\n });\n const handle = this.add(abort, response.body, () => response.cancel());\n const head: HttpHead = {\n handle,\n status: response.status,\n statusText: response.statusText,\n url: req.url,\n headers: response.headers,\n };\n return { ok: true, kind: 'json', json: head };\n } catch (e) {\n const text = message(e);\n if (text === NO_TRANSPORT) return { ok: false, errno: 'ENETUNREACH', message: text };\n const status = (e as { status?: unknown }).status;\n if (typeof status !== 'number' || status === 502) {\n return { ok: false, errno: 'ECONNREFUSED', message: text };\n }\n const body = new TextEncoder().encode(text);\n const handle = this.add(abort, once(body), async () => undefined);\n const head: HttpHead = {\n handle,\n status,\n statusText: '',\n url: req.url,\n headers: [['content-type', 'text/plain; charset=utf-8']],\n };\n return { ok: true, kind: 'json', json: head };\n }\n }\n\n private async read(handle: number, max: number): Promise<SyncFsResult> {\n const entry = this.open.get(handle);\n if (!entry) return { ok: false, errno: 'EBADF', message: `no request ${handle}` };\n const turn = entry.reading.then(() => this.take(entry, max));\n entry.reading = turn.then(() => undefined);\n return turn;\n }\n\n private async take(entry: Open, max: number): Promise<SyncFsResult> {\n if (entry.left.length === 0 && !entry.done) {\n try {\n const next = await entry.body.next();\n if (next.done) entry.done = true;\n else entry.left = next.value;\n } catch (e) {\n entry.done = true;\n const timedOut = (e as { code?: unknown } | null)?.code === 'ETIMEDOUT';\n return { ok: false, errno: timedOut ? 'ETIMEDOUT' : 'EIO', message: message(e) };\n }\n }\n const bytes = entry.left.subarray(0, Math.max(0, max));\n entry.left = entry.left.subarray(bytes.length);\n return { ok: true, kind: 'bytes', bytes };\n }\n\n private async close(handle: number): Promise<SyncFsResult> {\n const entry = this.open.get(handle);\n if (!entry) return { ok: false, errno: 'EBADF', message: `no request ${handle}` };\n this.open.delete(handle);\n entry.abort.abort();\n await entry.cancel().catch(() => undefined);\n return { ok: true, kind: 'void' };\n }\n\n async closeAll(): Promise<void> {\n await Promise.all([...this.open.keys()].map((handle) => this.close(handle)));\n }\n}\n", "import { KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport { SIG } from './signals.ts';\n\nexport interface Termios {\n c_iflag: number;\n c_oflag: number;\n c_cflag: number;\n c_lflag: number;\n c_cc: number[];\n}\n\nexport interface TtyScreen {\n write(bytes: Uint8Array): void;\n}\n\nconst ICRNL = 0o400;\nconst IUTF8 = 0o40000;\nconst OPOST = 0o1;\nconst ONLCR = 0o4;\nconst ISIG = 0o1;\nconst ICANON = 0o2;\nconst ECHO = 0o10;\nconst ECHOE = 0o20;\nconst ECHOCTL = 0o1000;\nconst NOFLSH = 0o200;\nconst IEXTEN = 0o100000;\nconst VINTR = 0;\nconst VQUIT = 1;\nconst VERASE = 2;\nconst VKILL = 3;\nconst VEOF = 4;\nconst VSUSP = 10;\nconst VWERASE = 14;\n\nexport function defaultTermios(): Termios {\n const cCc = new Array<number>(32).fill(0);\n Object.assign(cCc, { [VINTR]: 0x03, [VQUIT]: 0x1c, [VERASE]: 0x7f, [VKILL]: 0x15 });\n Object.assign(cCc, { [VEOF]: 0x04, 6: 1, 8: 0x11, 9: 0x13, [VSUSP]: 0x1a });\n Object.assign(cCc, { 12: 0x12, 13: 0x0f, [VWERASE]: 0x17, 15: 0x16 });\n return {\n c_iflag: ICRNL | 0o2000 | 0o20000 | IUTF8,\n c_oflag: OPOST | ONLCR,\n c_cflag: 0o17 | 0o60 | 0o200,\n c_lflag: ISIG | ICANON | ECHO | ECHOE | 0o40 | ECHOCTL | 0o4000 | IEXTEN,\n c_cc: cCc,\n };\n}\n\nconst encoder = new TextEncoder();\n\nfunction isContinuation(byte: number): boolean {\n return (byte & 0xc0) === 0x80;\n}\n\nexport class KernelTty {\n private termios = defaultTermios();\n private cols = 80;\n private rows = 24;\n\n private readable: Array<Uint8Array | null> = [];\n\n private line: number[] = [];\n private waiters: Array<() => void> = [];\n\n private hungUp = false;\n\n name?: string;\n\n private readonly screen: TtyScreen;\n\n private readonly signal: (sig: number) => void;\n\n constructor(\n screen: TtyScreen,\n\n signal: (sig: number) => void\n ) {\n this.screen = screen;\n\n this.signal = signal;\n }\n\n receive(bytes: Uint8Array): void {\n for (const byte of bytes) this.key(byte);\n this.wake();\n }\n\n resize(cols: number, rows: number): void {\n this.setSize(cols, rows);\n this.signal(SIG.WINCH);\n }\n\n hangup(): void {\n this.hungUp = true;\n this.wake();\n }\n\n signalHangup(): void {\n this.signal(SIG.HUP);\n }\n\n setSize(cols: number, rows: number): void {\n this.cols = cols;\n this.rows = rows;\n }\n\n tcgets(): Termios {\n return { ...this.termios, c_cc: [...this.termios.c_cc] };\n }\n\n tcsets(termios: Termios): void {\n const wasCanonical = this.canonical;\n this.termios = { ...termios, c_cc: [...termios.c_cc] };\n\n if (wasCanonical && !this.canonical && this.line.length > 0) {\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n this.wake();\n }\n }\n\n winsize(): [number, number] {\n return [this.rows, this.cols];\n }\n\n file(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.read(max, signal),\n write: async (bytes) => {\n if (this.hungUp) throw new KernelError('EIO');\n this.output(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.readable.length > 0 || this.hungUp,\n writable: true,\n hangup: this.hungUp,\n }),\n changed: (signal) => this.changed(signal),\n close: () => {},\n tty: this,\n });\n }\n\n private get canonical(): boolean {\n return (this.termios.c_lflag & ICANON) !== 0;\n }\n\n private cc(slot: number): number {\n return this.termios.c_cc[slot] ?? 0;\n }\n\n private key(input: number): void {\n const { c_iflag, c_lflag } = this.termios;\n const byte = input === 0x0d && c_iflag & ICRNL ? 0x0a : input;\n if (c_lflag & ISIG && this.signalKey(byte)) return;\n if (!this.canonical) {\n this.readable.push(Uint8Array.of(byte));\n if (c_lflag & ECHO) this.echo(byte);\n return;\n }\n this.edit(byte);\n }\n\n private signalKey(byte: number): boolean {\n const sig =\n byte === this.cc(VINTR)\n ? SIG.INT\n : byte === this.cc(VQUIT)\n ? SIG.QUIT\n : byte === this.cc(VSUSP)\n ? SIG.TSTP\n : 0;\n if (!sig || byte === 0) return false;\n if (this.termios.c_lflag & ECHO) this.echo(byte);\n if (!(this.termios.c_lflag & NOFLSH)) {\n this.line = [];\n this.readable = [];\n }\n this.signal(sig);\n return true;\n }\n\n private edit(byte: number): void {\n const echo = (this.termios.c_lflag & ECHO) !== 0;\n if (byte === this.cc(VERASE) || byte === 0x08) {\n this.rubOut(this.lastCharLength());\n } else if (byte === this.cc(VKILL)) {\n this.rubOut(this.line.length);\n } else if (byte === this.cc(VWERASE)) {\n this.rubOut(this.lastWordLength());\n } else if (byte === this.cc(VEOF)) {\n this.readable.push(this.line.length > 0 ? Uint8Array.from(this.line) : null);\n this.line = [];\n } else if (byte === 0x0a) {\n this.line.push(byte);\n if (echo) this.output(encoder.encode('\\n'));\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n } else {\n this.line.push(byte);\n if (echo) this.echo(byte);\n }\n }\n\n private lastWordLength(): number {\n let end = this.line.length;\n while (end > 0 && this.line[end - 1] === 0x20) end--;\n while (end > 0 && this.line[end - 1] !== 0x20) end--;\n return this.line.length - end;\n }\n\n private lastCharLength(): number {\n const { line } = this;\n let n = Math.min(1, line.length);\n if (this.termios.c_iflag & IUTF8) {\n while (n < line.length && isContinuation(line[line.length - n] ?? 0)) n++;\n }\n return n;\n }\n\n private rubOut(n: number): void {\n const dropped = this.line.splice(this.line.length - n, n);\n const utf8 = (this.termios.c_iflag & IUTF8) !== 0;\n const cells = utf8 ? dropped.filter((b) => !isContinuation(b)).length : dropped.length;\n if (cells > 0 && this.termios.c_lflag & ECHO) {\n this.output(encoder.encode('\\b \\b'.repeat(cells)), false);\n }\n }\n\n private echo(byte: number): void {\n if (byte < 0x20 && byte !== 0x0a && byte !== 0x09 && this.termios.c_lflag & ECHOCTL) {\n this.output(Uint8Array.of(0x5e, byte + 0x40), false);\n return;\n }\n this.output(Uint8Array.of(byte));\n }\n\n private output(bytes: Uint8Array, translate = true): void {\n const { c_oflag } = this.termios;\n if (!translate || !(c_oflag & OPOST && c_oflag & ONLCR) || !bytes.includes(0x0a)) {\n this.screen.write(bytes);\n return;\n }\n const out: number[] = [];\n for (const byte of bytes) {\n if (byte === 0x0a) out.push(0x0d);\n out.push(byte);\n }\n this.screen.write(Uint8Array.from(out));\n }\n\n private async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.readable.length === 0) {\n if (this.hungUp) return new Uint8Array(0);\n await this.changed(signal);\n }\n const head = this.readable[0];\n if (head === null) {\n this.readable.shift();\n return new Uint8Array(0);\n }\n if (head === undefined) return new Uint8Array(0);\n\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.readable.length > 0 && n < max) {\n const next = this.readable[0];\n if (next === null || next === undefined) break;\n const take = next.subarray(0, max - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.readable[0] = next.subarray(take.length);\n else this.readable.shift();\n if (this.canonical) break;\n }\n const out = new Uint8Array(n);\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 changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('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 { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport { KernelTty } from './tty.ts';\n\nexport type PtySignal = (tty: KernelTty, sig: number) => void;\n\nexport class PtyPair {\n readonly slave: KernelTty;\n\n locked = true;\n\n packet = false;\n private queue: Uint8Array[] = [];\n private waiters: Array<() => void> = [];\n private masterOpen = true;\n private slaveRefs = 0;\n private slaveSeen = false;\n\n readonly index: number;\n\n private readonly onFree: (pair: PtyPair) => void;\n\n constructor(\n index: number,\n\n signal: PtySignal,\n\n onFree: (pair: PtyPair) => void\n ) {\n this.index = index;\n\n this.onFree = onFree;\n this.slave = new KernelTty({ write: (bytes) => this.fromSlave(bytes) }, (sig) =>\n signal(this.slave, sig)\n );\n this.slave.name = `/dev/pts/${index}`;\n }\n\n master(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.readMaster(max, signal),\n write: async (bytes) => {\n this.slave.receive(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.queue.length > 0 || this.slaveGone,\n writable: true,\n hangup: this.slaveGone,\n }),\n changed: (signal) => this.changed(signal),\n close: () => this.closeMaster(),\n pty: this,\n });\n }\n\n openSlave(): OpenFile {\n if (!this.masterOpen || this.locked) throw new KernelError('EIO');\n const file = this.slave.file().file;\n this.slaveRefs += 1;\n this.slaveSeen = true;\n return new OpenFile({ ...file, close: () => this.closeSlave() });\n }\n\n private get slaveGone(): boolean {\n return this.slaveSeen && this.slaveRefs === 0;\n }\n\n private fromSlave(bytes: Uint8Array): void {\n if (!this.masterOpen) return;\n this.queue.push(bytes.slice());\n this.wake();\n }\n\n private async readMaster(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.queue.length === 0) {\n if (this.slaveGone) throw new KernelError('EIO');\n await this.changed(signal);\n }\n\n const status = this.packet ? 1 : 0;\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.queue.length > 0 && n < max - status) {\n const next = this.queue[0] as Uint8Array;\n const take = next.subarray(0, max - status - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.queue[0] = next.subarray(take.length);\n else this.queue.shift();\n }\n const out = new Uint8Array(status + n);\n let at = status;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private closeMaster(): void {\n this.masterOpen = false;\n this.queue = [];\n\n this.slave.hangup();\n this.slave.signalHangup();\n this.freeIfUnused();\n }\n\n private closeSlave(): void {\n this.slaveRefs -= 1;\n this.wake();\n this.freeIfUnused();\n }\n\n private freeIfUnused(): void {\n if (!this.masterOpen && this.slaveRefs === 0) this.onFree(this);\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('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\nexport class PtyTable {\n private readonly pairs = new Map<number, PtyPair>();\n\n private readonly signal: PtySignal;\n\n constructor(signal: PtySignal) {\n this.signal = signal;\n }\n\n open(): { pair: PtyPair; master: OpenFile } {\n let index = 0;\n while (this.pairs.has(index)) index += 1;\n const pair = new PtyPair(index, this.signal, (p) => this.pairs.delete(p.index));\n this.pairs.set(index, pair);\n return { pair, master: pair.master() };\n }\n\n get(index: number): PtyPair {\n const pair = this.pairs.get(index);\n if (!pair) throw new KernelError('ENOENT');\n return pair;\n }\n\n numbers(): number[] {\n return [...this.pairs.keys()].sort((a, b) => a - b);\n }\n}\n\nexport function ptsNumber(path: string): number | undefined {\n const m = /^\\/dev\\/pts\\/(\\d+)$/.exec(path);\n return m ? Number(m[1]) : undefined;\n}\n\nexport type PtySyscall =\n | { op: 'pty-open' }\n | { op: 'pty-slave-open'; n: number; noctty: boolean }\n | { op: 'pty-number'; fd: number }\n | { op: 'pty-lock'; fd: number; lock: boolean }\n | { op: 'pty-ctty'; fd: number }\n | { op: 'pty-packet'; fd: number; on: boolean }\n | { op: 'pty-list' }\n | { op: 'pty-winsz-set'; fd: number; rows: number; cols: number };\n\nexport const PTY_OPS: readonly PtySyscall['op'][] = [\n 'pty-open',\n 'pty-slave-open',\n 'pty-number',\n 'pty-lock',\n 'pty-ctty',\n 'pty-packet',\n 'pty-list',\n 'pty-winsz-set',\n];\n\nexport interface PtyContext {\n pid: number;\n fds: FdTable;\n ptys?: PtyTable;\n jobs?: JobTable;\n}\n\nfunction masterOf(ctx: PtyContext, fd: number): PtyPair {\n const pair = ctx.fds.get(fd).file.pty;\n if (!pair) throw new KernelError('ENOTTY');\n return pair;\n}\n\nfunction terminalOf(ctx: PtyContext, fd: number): KernelTty {\n const file = ctx.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n}\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nexport function ptySyscall(req: PtySyscall, ctx: PtyContext): SyncFsResult {\n switch (req.op) {\n case 'pty-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n return json(ctx.fds.install(ctx.ptys.open().master, 3));\n }\n case 'pty-slave-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n const pair = ctx.ptys.get(req.n);\n const fd = ctx.fds.install(pair.openSlave(), 3);\n\n if (!req.noctty) ctx.jobs?.acquireTerminal(ctx.pid, pair.slave);\n return json(fd);\n }\n case 'pty-number':\n return json(masterOf(ctx, req.fd).index);\n case 'pty-lock':\n masterOf(ctx, req.fd).locked = req.lock;\n return done;\n case 'pty-ctty': {\n const tty = terminalOf(ctx, req.fd);\n\n const leader = ctx.jobs?.getsid(ctx.pid, 0) === ctx.pid;\n if (leader && ctx.jobs?.controllingTerminal(ctx.pid) === tty) return done;\n if (!ctx.jobs?.acquireTerminal(ctx.pid, tty)) throw new KernelError('EPERM');\n return done;\n }\n case 'pty-list':\n return json(ctx.ptys?.numbers() ?? []);\n case 'pty-packet':\n masterOf(ctx, req.fd).packet = req.on;\n return done;\n case 'pty-winsz-set':\n terminalOf(ctx, req.fd).resize(req.cols, req.rows);\n return done;\n }\n}\n", "import { type FdTable, KernelError, pollFile } from './fd-table.ts';\n\nexport interface SelectResult {\n read: number[];\n write: number[];\n\n hangup?: number[];\n}\n\nfunction ready(fds: FdTable, read: readonly number[], write: readonly number[]): SelectResult {\n const hangup = new Set<number>();\n const pick = (list: readonly number[], dir: 'readable' | 'writable') =>\n list.filter((fd) => {\n const state = pollFile(fds.get(fd).file);\n if (state.hangup) hangup.add(fd);\n return state[dir] || state.hangup;\n });\n const out: SelectResult = { read: pick(read, 'readable'), write: pick(write, 'writable') };\n if (hangup.size > 0) out.hangup = [...hangup];\n return out;\n}\n\nfunction interruption(signal: AbortSignal): { promise: Promise<never>; done(): void } {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal.aborted) fail();\n else signal.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal.removeEventListener('abort', fail) };\n}\n\nexport async function selectFds(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n timeoutMs: number,\n interrupt: AbortSignal\n): Promise<SelectResult> {\n const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : Date.now() + timeoutMs;\n const interrupted = interruption(interrupt);\n interrupted.promise.catch(() => {});\n try {\n return await waitReady(fds, read, write, deadline, interrupted.promise);\n } finally {\n interrupted.done();\n }\n}\n\nasync function waitReady(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n deadline: number,\n interrupted: Promise<never>\n): Promise<SelectResult> {\n for (;;) {\n const now = ready(fds, read, write);\n if (now.read.length > 0 || now.write.length > 0 || Date.now() >= deadline) return now;\n\n const round = new AbortController();\n const changes = [...new Set([...read, ...write])].flatMap((fd) => {\n const file = fds.get(fd).file;\n return file.changed === undefined ? [] : [file.changed(round.signal).catch(() => undefined)];\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const expiry =\n deadline === Number.POSITIVE_INFINITY\n ? []\n : [new Promise<void>((resolve) => (timer = setTimeout(resolve, deadline - Date.now())))];\n try {\n await Promise.race([...changes, ...expiry, interrupted]);\n } finally {\n round.abort();\n clearTimeout(timer);\n }\n }\n}\n", "import { KernelError, type KernelFile, type PollState } from './fd-table.ts';\nimport { KernelPipe, PIPE_CAPACITY, PipeError } from './pipe.ts';\nexport type SockAddr =\n | {\n family: 'inet';\n host: string;\n port: number;\n }\n | {\n family: 'unix';\n path: string;\n };\nexport type SocketDomain = SockAddr['family'];\nconst SOMAXCONN = 4096;\nconst EPHEMERAL_FIRST = 32768;\nconst EPHEMERAL_LAST = 60999;\nconst SOL_SOCKET = 1;\nconst SO_TYPE = 3;\nconst SO_ERROR = 4;\nconst SO_SNDBUF = 7;\nconst SO_RCVBUF = 8;\nconst SO_ACCEPTCONN = 30;\nconst SO_DOMAIN = 39;\nconst SOCK_STREAM = 1;\nconst AF_UNIX = 1;\nconst AF_INET = 2;\nexport const SHUT_RD = 0;\nexport const SHUT_WR = 1;\nexport const SHUT_RDWR = 2;\nfunction isLoopback(host: string): boolean {\n return /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host);\n}\nasync function pipeCall<T>(op: () => Promise<T>): Promise<T> {\n try {\n return await op();\n } catch (e) {\n if (e instanceof PipeError) throw new KernelError(e.code);\n throw e;\n }\n}\nclass Changes {\n private waiters: Array<() => void> = [];\n wait(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('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 wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\ninterface Link {\n rx: KernelPipe;\n tx: KernelPipe;\n}\nfunction link(a: KernelSocket, b: KernelSocket): void {\n const ab = new KernelPipe();\n const ba = new KernelPipe();\n for (const pipe of [ab, ba]) {\n pipe.openRead();\n pipe.openWrite();\n }\n a.attach({ rx: ba, tx: ab });\n b.attach({ rx: ab, tx: ba });\n}\nexport class KernelSocket implements KernelFile {\n private readonly net: LoopbackNet;\n readonly domain: SocketDomain;\n private state: 'open' | 'listening' | 'connected' | 'closed' = 'open';\n local: SockAddr | undefined;\n peer: SockAddr | undefined;\n private link: Link | undefined;\n private readShut = false;\n private writeShut = false;\n private readonly queue: KernelSocket[] = [];\n private backlog = 0;\n private bound = false;\n private readonly changes = new Changes();\n private readonly options = new Map<string, number>();\n constructor(net: LoopbackNet, domain: SocketDomain) {\n this.net = net;\n this.domain = domain;\n }\n attach(link: Link): void {\n this.link = link;\n this.state = 'connected';\n this.changes.wake();\n }\n get listening(): boolean {\n return this.state === 'listening';\n }\n private connection(): Link {\n if (!this.link || this.state !== 'connected') throw new KernelError('ENOTCONN');\n return this.link;\n }\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n const { rx } = this.connection();\n if (this.readShut || max <= 0) return new Uint8Array(0);\n return pipeCall(() => rx.read(max, signal));\n }\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n const { rx } = this.connection();\n if (this.readShut || max <= 0) return new Uint8Array(0);\n return pipeCall(() => rx.peek(max, signal));\n }\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n const { tx } = this.connection();\n if (this.writeShut) throw new KernelError('EPIPE');\n return pipeCall(() => tx.write(bytes, signal));\n }\n poll(): PollState {\n if (this.state === 'listening') {\n return { readable: this.queue.length > 0, writable: false, hangup: false };\n }\n if (this.state !== 'connected' || !this.link) {\n return { readable: false, writable: false, hangup: true };\n }\n const { rx, tx } = this.link;\n return {\n readable: this.readShut || rx.readReady,\n writable: this.writeShut || tx.writeReady,\n hangup: rx.writersGone && tx.readersGone,\n };\n }\n changed(signal?: AbortSignal): Promise<void> {\n const own = this.changes.wait(signal);\n if (this.state !== 'connected' || !this.link) return own;\n const waits = [own, this.link.rx.changed(signal), this.link.tx.changed(signal)];\n for (const wait of waits) wait.catch(() => undefined);\n return pipeCall(() => Promise.race(waits));\n }\n bind(addr: SockAddr): void {\n if (this.state !== 'open' || this.local) throw new KernelError('EINVAL');\n if (addr.family !== this.domain) throw new KernelError('EAFNOSUPPORT');\n this.local = this.net.bind(this, addr);\n this.bound = true;\n }\n listen(backlog: number): void {\n if (this.state === 'connected') throw new KernelError('EISCONN');\n if (this.state !== 'open' && this.state !== 'listening') throw new KernelError('EINVAL');\n if (!this.local) {\n if (this.domain === 'unix') throw new KernelError('EINVAL');\n this.bind({ family: 'inet', host: '0.0.0.0', port: 0 });\n }\n this.backlog = Math.min(Math.max(backlog, 1), SOMAXCONN);\n this.state = 'listening';\n }\n async accept(signal?: AbortSignal, nonblock = false): Promise<KernelSocket> {\n for (;;) {\n if (this.state !== 'listening') throw new KernelError('EINVAL');\n const next = this.queue.shift();\n if (next) return next;\n if (nonblock) throw new KernelError('EAGAIN');\n await this.changes.wait(signal);\n }\n }\n offer(server: KernelSocket): boolean {\n if (this.state !== 'listening' || this.queue.length >= this.backlog) return false;\n this.queue.push(server);\n this.changes.wake();\n return true;\n }\n connect(addr: SockAddr): void {\n if (this.state === 'connected') throw new KernelError('EISCONN');\n if (this.state !== 'open') throw new KernelError('EINVAL');\n if (addr.family !== this.domain) throw new KernelError('EAFNOSUPPORT');\n const target = this.net.target(addr);\n if (!this.local) {\n if (addr.family === 'inet') {\n this.local = this.net.bind(this, { family: 'inet', host: '127.0.0.1', port: 0 });\n this.bound = true;\n } else this.local = { family: 'unix', path: '' };\n }\n const server = new KernelSocket(this.net, this.domain);\n server.local = addr.family === 'inet' ? { ...addr, host: canonicalHost(addr.host) } : addr;\n server.peer = this.local;\n this.peer = server.local;\n link(this, server);\n if (!target.offer(server)) {\n this.unlink();\n server.close();\n throw new KernelError('ECONNREFUSED');\n }\n }\n private unlink(): void {\n const link = this.link;\n if (link) {\n link.rx.closeRead();\n link.tx.closeWrite();\n }\n this.link = undefined;\n this.peer = undefined;\n this.state = 'open';\n }\n shutdown(how: number): void {\n const { rx, tx } = this.connection();\n if (how !== SHUT_RD && how !== SHUT_WR && how !== SHUT_RDWR) throw new KernelError('EINVAL');\n if (how !== SHUT_WR && !this.readShut) {\n this.readShut = true;\n rx.closeRead();\n }\n if (how !== SHUT_RD && !this.writeShut) {\n this.writeShut = true;\n tx.closeWrite();\n }\n this.changes.wake();\n }\n getOption(level: number, name: number): number {\n if (level === SOL_SOCKET) {\n switch (name) {\n case SO_TYPE:\n return SOCK_STREAM;\n case SO_ERROR:\n return 0;\n case SO_ACCEPTCONN:\n return this.state === 'listening' ? 1 : 0;\n case SO_DOMAIN:\n return this.domain === 'inet' ? AF_INET : AF_UNIX;\n case SO_SNDBUF:\n case SO_RCVBUF:\n return this.options.get(`${level}:${name}`) ?? PIPE_CAPACITY;\n }\n }\n return this.options.get(`${level}:${name}`) ?? 0;\n }\n setOption(level: number, name: number, value: number): void {\n this.options.set(`${level}:${name}`, value);\n }\n close(): void {\n const was = this.state;\n this.state = 'closed';\n if (was === 'listening') {\n for (const pending of this.queue.splice(0)) pending.close();\n }\n if (this.link) {\n if (!this.readShut) this.link.rx.closeRead();\n if (!this.writeShut) this.link.tx.closeWrite();\n this.readShut = true;\n this.writeShut = true;\n }\n if (this.bound && this.local) this.net.release(this.local, this);\n this.bound = false;\n this.changes.wake();\n }\n static pair(net: LoopbackNet, domain: SocketDomain): [KernelSocket, KernelSocket] {\n const a = new KernelSocket(net, domain);\n const b = new KernelSocket(net, domain);\n const name: SockAddr =\n domain === 'inet'\n ? { family: 'inet', host: '127.0.0.1', port: 0 }\n : { family: 'unix', path: '' };\n a.local = b.local = a.peer = b.peer = name;\n link(a, b);\n return [a, b];\n }\n}\nfunction canonicalHost(host: string): string {\n return host === '0.0.0.0' ? '127.0.0.1' : host;\n}\nfunction keyOf(addr: SockAddr): string {\n return addr.family === 'inet' ? `inet:${addr.port}` : `unix:${addr.path}`;\n}\nexport class LoopbackNet {\n private readonly bound = new Map<string, KernelSocket>();\n private readonly activators = new Map<string, () => void>();\n private nextEphemeral = EPHEMERAL_FIRST;\n activate(addr: SockAddr, start: () => void): void {\n this.activators.set(keyOf(addr), start);\n }\n socket(domain: SocketDomain): KernelSocket {\n return new KernelSocket(this, domain);\n }\n listen(addr: SockAddr, backlog = 128): KernelSocket {\n const socket = this.socket(addr.family);\n socket.bind(addr);\n socket.listen(backlog);\n return socket;\n }\n connect(addr: SockAddr): KernelSocket {\n const socket = this.socket(addr.family);\n socket.connect(addr);\n return socket;\n }\n bind(socket: KernelSocket, addr: SockAddr): SockAddr {\n if (addr.family === 'unix') {\n if (addr.path === '') throw new KernelError('EINVAL');\n } else if (addr.host !== '0.0.0.0' && !isLoopback(addr.host)) {\n throw new KernelError('EADDRNOTAVAIL');\n }\n const named =\n addr.family === 'inet' && addr.port === 0 ? { ...addr, port: this.ephemeral() } : addr;\n const key = keyOf(named);\n if (this.bound.has(key)) throw new KernelError('EADDRINUSE');\n this.bound.set(key, socket);\n return named;\n }\n release(addr: SockAddr, socket: KernelSocket): void {\n const key = keyOf(addr);\n if (this.bound.get(key) === socket) this.bound.delete(key);\n }\n target(addr: SockAddr): KernelSocket {\n if (addr.family === 'inet' && !isLoopback(canonicalHost(addr.host))) {\n throw new KernelError('ENETUNREACH');\n }\n const key = keyOf(addr);\n if (!this.bound.has(key)) this.activators.get(key)?.();\n const socket = this.bound.get(key);\n if (!socket?.listening) throw new KernelError('ECONNREFUSED');\n return socket;\n }\n private ephemeral(): number {\n const span = EPHEMERAL_LAST - EPHEMERAL_FIRST + 1;\n for (let i = 0; i < span; i++) {\n const port = this.nextEphemeral;\n this.nextEphemeral = port === EPHEMERAL_LAST ? EPHEMERAL_FIRST : port + 1;\n if (!this.bound.has(`inet:${port}`)) return port;\n }\n throw new KernelError('EADDRINUSE');\n }\n}\nconst namespaces = new Map<string, LoopbackNet>();\nexport function loopbackNet(owner: string): LoopbackNet {\n let net = namespaces.get(owner);\n if (!net) {\n net = new LoopbackNet();\n namespaces.set(owner, net);\n }\n return net;\n}\nexport function ownerKey(\n owner:\n | {\n kind: string;\n scoopJid?: string;\n }\n | undefined\n): string {\n return owner ? `${owner.kind}:${owner.scoopJid ?? ''}` : 'local';\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, pollFile } from './fd-table.ts';\nimport { KernelSocket, type LoopbackNet, type SockAddr, type SocketDomain } from './socket.ts';\nexport type SocketSyscall =\n | {\n op: 'sock-open';\n domain: SocketDomain;\n }\n | {\n op: 'sock-pair';\n domain: SocketDomain;\n }\n | {\n op: 'sock-bind';\n fd: number;\n addr: SockAddr;\n }\n | {\n op: 'sock-listen';\n fd: number;\n backlog: number;\n }\n | {\n op: 'sock-accept';\n fd: number;\n nonblock: boolean;\n }\n | {\n op: 'sock-connect';\n fd: number;\n addr: SockAddr;\n nonblock: boolean;\n }\n | {\n op: 'sock-shutdown';\n fd: number;\n how: number;\n }\n | {\n op: 'sock-name';\n fd: number;\n peer: boolean;\n }\n | {\n op: 'sock-getopt';\n fd: number;\n level: number;\n name: number;\n }\n | {\n op: 'sock-setopt';\n fd: number;\n level: number;\n name: number;\n value: number;\n };\nexport const SOCKET_OPS: readonly SocketSyscall['op'][] = [\n 'sock-open',\n 'sock-pair',\n 'sock-bind',\n 'sock-listen',\n 'sock-accept',\n 'sock-connect',\n 'sock-shutdown',\n 'sock-name',\n 'sock-getopt',\n 'sock-setopt',\n];\nexport interface SocketProcess {\n fds: FdTable;\n net: LoopbackNet;\n blocking(): AbortSignal;\n}\nfunction socketAt(fds: FdTable, fd: number): KernelSocket {\n const file = fds.get(fd).file;\n if (!(file instanceof KernelSocket)) throw new KernelError('ENOTSOCK');\n return file;\n}\nconst ok = (json?: unknown): SyncFsResult =>\n json === undefined ? { ok: true, kind: 'void' } : { ok: true, kind: 'json', json };\nexport async function socketSyscall(\n req: SocketSyscall,\n proc: SocketProcess\n): Promise<SyncFsResult> {\n const { fds, net } = proc;\n switch (req.op) {\n case 'sock-open':\n return ok(fds.install(new OpenFile(net.socket(req.domain)), 3));\n case 'sock-pair': {\n const [a, b] = KernelSocket.pair(net, req.domain);\n const first = fds.install(new OpenFile(a), 3);\n try {\n return ok([first, fds.install(new OpenFile(b), 3)]);\n } catch (e) {\n await Promise.resolve(fds.close(first));\n throw e;\n }\n }\n case 'sock-bind':\n socketAt(fds, req.fd).bind(req.addr);\n return ok();\n case 'sock-listen':\n socketAt(fds, req.fd).listen(req.backlog);\n return ok();\n case 'sock-accept':\n return ok(await accept(proc, req.fd, req.nonblock));\n case 'sock-connect':\n socketAt(fds, req.fd).connect(req.addr);\n if (req.nonblock) throw new KernelError('EINPROGRESS');\n return ok();\n case 'sock-shutdown':\n socketAt(fds, req.fd).shutdown(req.how);\n return ok();\n case 'sock-name': {\n const socket = socketAt(fds, req.fd);\n const addr = req.peer ? socket.peer : socket.local;\n if (req.peer && !addr) throw new KernelError('ENOTCONN');\n return ok(addr ?? unnamed(socket.domain));\n }\n case 'sock-getopt':\n return ok(socketAt(fds, req.fd).getOption(req.level, req.name));\n case 'sock-setopt':\n socketAt(fds, req.fd).setOption(req.level, req.name, req.value);\n return ok();\n }\n}\nfunction unnamed(domain: SocketDomain): SockAddr {\n return domain === 'inet'\n ? { family: 'inet', host: '0.0.0.0', port: 0 }\n : { family: 'unix', path: '' };\n}\nasync function accept(\n proc: SocketProcess,\n fd: number,\n nonblock: boolean\n): Promise<{\n fd: number;\n peer: SockAddr | undefined;\n}> {\n const listener = socketAt(proc.fds, fd);\n const waits = !nonblock && !pollFile(listener).readable;\n const socket = await listener.accept(waits ? proc.blocking() : undefined, nonblock);\n return { fd: proc.fds.install(new OpenFile(socket), 3), peer: socket.peer };\n}\n", "import { KernelError, OpenFile } from './fd-table.ts';\n\nexport interface VfsFileFs {\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array): Promise<void>;\n}\n\nconst O_ACCMODE = 0o3;\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\n\nconst SEEK_SET = 0;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\n\nexport interface VfsFileOptions {\n path: string;\n\n flags: number;\n\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n dirty?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n}\n\nexport const WRITEBACK_MS = 250;\n\nconst WRITEBACK_COST_FACTOR = 10;\n\nfunction isMissing(err: unknown): boolean {\n if ((err as { code?: unknown } | null)?.code === 'ENOENT') return true;\n return err instanceof Error && err.message.startsWith('ENOENT');\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(root.endsWith('/') ? root : `${root}/`);\n}\n\nexport class VfsNode {\n private data: Uint8Array | undefined;\n private length = 0;\n private dirty = false;\n private queue: Promise<unknown> = Promise.resolve();\n\n private writeBack: ReturnType<typeof setTimeout> | undefined;\n\n private writeBackCost = 0;\n\n opens = 0;\n\n private missing = false;\n\n private readonly fs: VfsFileFs;\n\n path: string;\n\n orphaned: boolean;\n\n constructor(\n fs: VfsFileFs,\n\n path: string,\n\n contents?: Uint8Array,\n\n orphaned: boolean = false,\n\n dirty = false\n ) {\n this.fs = fs;\n\n this.path = path;\n\n this.orphaned = orphaned;\n if (contents !== undefined) this.data = new Uint8Array(contents);\n else if (orphaned) this.data = new Uint8Array(0);\n this.length = this.data?.length ?? 0;\n if (dirty && contents !== undefined) this.markDirty();\n }\n\n serial<T>(op: () => Promise<T>): Promise<T> {\n const next = this.queue.then(op);\n this.queue = next.catch(() => undefined);\n return next;\n }\n\n async load(): Promise<Uint8Array> {\n if (!this.data) {\n try {\n this.data = await this.fs.readFileBuffer(this.path);\n } catch (err) {\n if (!isMissing(err)) throw err;\n this.data = new Uint8Array(0);\n this.missing = true;\n }\n this.length = this.data.length;\n }\n return this.data;\n }\n\n replace(contents: Uint8Array): void {\n this.data = new Uint8Array(contents);\n this.length = this.data.length;\n this.missing = false;\n this.markDirty();\n }\n\n async materialize(): Promise<void> {\n await this.load();\n if (!this.missing || this.orphaned) return;\n this.missing = false;\n await this.fs.writeFile(this.path, this.data?.slice(0, this.length) ?? new Uint8Array(0));\n }\n\n async size(): Promise<number> {\n await this.load();\n return this.length;\n }\n\n async pread(max: number, at: number): Promise<Uint8Array> {\n const bytes = await this.load();\n const n = Math.max(0, Math.min(max, this.length - at));\n return bytes.slice(at, at + n);\n }\n\n async pwrite(bytes: Uint8Array, at: number): Promise<number> {\n await this.load();\n const buf = this.ensure(at + bytes.length);\n if (at > this.length) buf.fill(0, this.length, at);\n buf.set(bytes, at);\n this.length = Math.max(this.length, at + bytes.length);\n this.markDirty();\n return bytes.length;\n }\n\n async truncate(size: number): Promise<void> {\n await this.load();\n const buf = this.ensure(size);\n if (size > this.length) buf.fill(0, this.length, size);\n this.length = size;\n this.markDirty();\n }\n\n private markDirty(): void {\n this.dirty = true;\n if (this.writeBack !== undefined || this.orphaned) return;\n const delay = Math.max(WRITEBACK_MS, this.writeBackCost * WRITEBACK_COST_FACTOR);\n this.writeBack = setTimeout(() => {\n this.writeBack = undefined;\n this.serial(() => this.flush()).catch(() => undefined);\n }, delay);\n }\n\n private ensure(need: number): Uint8Array {\n const cur = this.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, this.length));\n this.data = grown;\n return grown;\n }\n\n async flush(): Promise<void> {\n if (!this.dirty || !this.data || this.orphaned) return;\n this.dirty = false;\n const started = performance.now();\n try {\n await this.fs.writeFile(this.path, this.data.slice(0, this.length));\n } catch (err) {\n this.dirty = true;\n throw err;\n }\n this.writeBackCost = performance.now() - started;\n }\n}\n\nexport class VfsNodes {\n private readonly byPath = new Map<string, VfsNode>();\n\n private readonly fs: VfsFileFs;\n\n constructor(fs: VfsFileFs) {\n this.fs = fs;\n }\n\n open(path: string): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path);\n this.byPath.set(path, node);\n }\n node.opens++;\n return node;\n }\n\n adopt(path: string, contents: Uint8Array, dirty: boolean): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path, contents, false, dirty);\n this.byPath.set(path, node);\n } else if (dirty) {\n node.replace(contents);\n }\n node.opens++;\n return node;\n }\n\n closed(node: VfsNode): void {\n node.opens--;\n if (node.opens === 0 && this.byPath.get(node.path) === node) this.byPath.delete(node.path);\n }\n\n async flush(path: string): Promise<void> {\n for (const [p, node] of this.byPath) if (within(p, path)) await node.serial(() => node.flush());\n }\n\n async unlinking(path: string): Promise<void> {\n const node = this.byPath.get(path);\n if (node) await node.serial(() => node.load());\n }\n\n unlinked(path: string): void {\n const node = this.byPath.get(path);\n if (!node) return;\n node.orphaned = true;\n this.byPath.delete(path);\n }\n\n renamed(from: string, to: string): void {\n if (from === to) return;\n const moved: VfsNode[] = [];\n for (const [p, node] of this.byPath) {\n if (within(p, from)) moved.push(node);\n else if (within(p, to)) {\n node.orphaned = true;\n this.byPath.delete(p);\n }\n }\n for (const node of moved) {\n this.byPath.delete(node.path);\n node.path = to + node.path.slice(from.length);\n this.byPath.set(node.path, node);\n }\n }\n}\n\nexport function vfsFile(fs: VfsFileFs, opts: VfsFileOptions, nodes?: VfsNodes): OpenFile {\n const access = opts.flags & O_ACCMODE;\n const readable = access !== O_WRONLY;\n const writable = access === O_WRONLY || access === O_RDWR;\n\n const node =\n !nodes || opts.orphan\n ? new VfsNode(fs, opts.path, opts.contents, opts.orphan === true, opts.dirty === true)\n : opts.contents !== undefined\n ? nodes.adopt(opts.path, opts.contents, opts.dirty === true)\n : nodes.open(opts.path);\n\n let openError: { err: unknown } | undefined;\n const atOpen = (op: () => Promise<void>): void => {\n void node.serial(op).catch((err: unknown) => {\n openError ??= { err };\n });\n };\n if (opts.create) atOpen(() => node.materialize());\n if (opts.truncate) atOpen(() => node.truncate(0));\n const takeOpenError = (): void => {\n if (!openError) return;\n const { err } = openError;\n openError = undefined;\n throw err;\n };\n let offset = opts.position;\n const serial = <T>(op: () => Promise<T>) =>\n node.serial(() => {\n takeOpenError();\n return op();\n });\n\n return new OpenFile({\n read: readable\n ? (max) =>\n serial(async () => {\n const out = await node.pread(max, offset);\n offset += out.length;\n return out;\n })\n : undefined,\n write: writable\n ? (bytes) =>\n serial(async () => {\n if (opts.flags & O_APPEND) offset = await node.size();\n offset += await node.pwrite(bytes, offset);\n return bytes.length;\n })\n : undefined,\n seek: (to, whence) =>\n serial(async () => {\n let base = 0;\n if (whence === SEEK_CUR) base = offset;\n else if (whence === SEEK_END) base = await node.size();\n else if (whence !== SEEK_SET) throw new KernelError('EINVAL');\n if (base + to < 0) throw new KernelError('EINVAL');\n offset = base + to;\n return offset;\n }),\n pread: (max, at) =>\n serial(() => {\n if (!readable) throw new KernelError('EBADF');\n return node.pread(max, at);\n }),\n pwrite: (bytes, at) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.pwrite(bytes, at);\n }),\n resize: (size) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.truncate(size);\n }),\n stat: () =>\n serial(async () => ({\n path: node.path,\n size: await node.size(),\n ...(node.orphaned ? { orphan: true as const } : {}),\n })),\n flush: () => serial(() => node.flush()),\n\n close: () =>\n node.serial(async () => {\n try {\n takeOpenError();\n await node.flush();\n } finally {\n nodes?.closed(node);\n }\n }),\n });\n}\n", "import type { LinkRecord } from '../process/wasi/wasix-linker.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n type ChildForker,\n type ChildSpawner,\n type ChildStdio,\n ChildTable,\n type InheritedSlot,\n SpawnError,\n} from './children.ts';\nimport {\n type FdTable,\n type HeldMeta,\n heldFile,\n KernelError,\n type KernelFdKind,\n kernelFdKind,\n type OpenFile,\n openPipe,\n pollFile,\n} from './fd-table.ts';\nimport { AsyncOps, HOST_OPS, type HostSyscall, hostSyscall, type LockTable } from './host-ops.ts';\nimport type { JobTable } from './jobs.ts';\nimport { HTTP_OPS, type HttpHandles, type HttpSyscall } from './net/http-syscalls.ts';\nimport { NO_TRANSPORT } from './net/network.ts';\nimport type { ForkState } from './protocol.ts';\nimport { PTY_OPS, type PtySyscall, type PtyTable, ptySyscall } from './pty.ts';\nimport { selectFds } from './select.ts';\nimport { type DefaultAction, defaultAction, isSignal, SIG, sigbit } from './signals.ts';\nimport { KernelSocket, LoopbackNet } from './socket.ts';\nimport { SOCKET_OPS, type SocketSyscall, socketSyscall } from './socket-syscalls.ts';\nimport type { KernelTty, Termios } from './tty.ts';\nimport { type VfsFileFs, VfsNodes, vfsFile } from './vfs-file.ts';\n\nexport type WasmSyscall =\n | {\n op: 'fd-read';\n fd: number;\n max: number;\n\n nonblock?: boolean;\n\n peek?: boolean;\n }\n | { op: 'fd-write'; fd: number; body: Uint8Array; nonblock?: boolean }\n | { op: 'fd-close'; fd: number }\n | { op: 'fd-pipe' }\n | { op: 'fd-poll'; fd: number }\n | {\n op: 'fd-open-vfs';\n path: string;\n flags: number;\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n }\n | { op: 'fd-pread'; fd: number; offset: number; max: number }\n | { op: 'fd-pwrite'; fd: number; offset: number; body: Uint8Array }\n | { op: 'fd-resize'; fd: number; size: number }\n | { op: 'fd-vfs-stat'; fd: number }\n | { op: 'fd-path-flush'; path: string }\n | { op: 'fd-path-unlinking'; path: string }\n | { op: 'fd-path-unlinked'; path: string }\n | { op: 'fd-path-renamed'; from: string; to: string }\n | { op: 'fd-seek'; fd: number; offset: number; whence: number }\n | { op: 'fd-select'; read: number[]; write: number[]; timeoutMs: number }\n | { op: 'fd-info'; fd: number }\n | { op: 'fd-dup'; fd: number; min?: number }\n | { op: 'fd-reserve'; fd?: number; min?: number; meta?: HeldMeta }\n | { op: 'fd-meta'; fd: number; meta: HeldMeta }\n | { op: 'fd-setfl'; fd: number; flags: number }\n | { op: 'fd-cloexec'; fd: number; on: boolean }\n | { op: 'fd-list' }\n | { op: 'dl-log'; append?: LinkRecord; from: number }\n | {\n op: 'proc-alarm';\n sig: number;\n ms: number;\n firstMs?: number;\n repeat: boolean;\n\n timer?: number;\n }\n | { op: 'fd-renumber'; from: number; to: number; keep?: boolean }\n | {\n op: 'fd-promote';\n fd: number;\n share?: number;\n path?: string;\n flags?: number;\n position?: number;\n contents?: Uint8Array;\n orphan?: boolean;\n\n dirty?: boolean;\n }\n | { op: 'fd-open-tty'; name?: string }\n | { op: 'tty-get'; fd: number }\n | { op: 'tty-set'; fd: number; termios: Termios }\n | { op: 'tty-winsz'; fd: number }\n | { op: 'fd-flush'; fd: number }\n | {\n op: 'proc-spawn';\n file: string;\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n stdio: ChildStdio[];\n\n inherit?: InheritedSlot[];\n }\n | {\n op: 'proc-wait';\n pid: number;\n nohang: boolean;\n\n untraced?: boolean;\n continued?: boolean;\n }\n | { op: 'proc-captured'; pid: number; slot: number }\n | { op: 'proc-fork'; state: ForkState }\n | { op: 'proc-kill'; pid: number; sig: number }\n | { op: 'proc-exec'; pid: number }\n | { op: 'proc-setpgid'; pid: number; pgid: number }\n | { op: 'proc-getpgid'; pid: number }\n | { op: 'proc-getsid'; pid: number }\n | { op: 'proc-setsid' }\n | { op: 'tty-pgrp-get'; fd: number }\n | { op: 'tty-pgrp-set'; fd: number; pgrp: number }\n | { op: 'sig-mask'; caught: number; ignored: number }\n | { op: 'sig-pause' }\n | SocketSyscall\n | HttpSyscall\n | PtySyscall\n | HostSyscall;\n\ntype FdSyscall = Extract<WasmSyscall, { op: `fd-${string}` }>;\n\ntype JobSyscall = Extract<\n WasmSyscall,\n { op: 'proc-setpgid' | 'proc-getpgid' | 'proc-getsid' | 'proc-setsid' }\n>;\n\nconst JOB_OPS: ReadonlySet<string> = new Set([\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n]);\n\nfunction isJobSyscall(req: WasmSyscall): req is JobSyscall {\n return JOB_OPS.has(req.op);\n}\n\nfunction isHttpSyscall(req: WasmSyscall): req is HttpSyscall {\n return req.op.startsWith('net-');\n}\n\nfunction isSocketSyscall(req: WasmSyscall): req is SocketSyscall {\n return req.op.startsWith('sock-');\n}\n\nfunction isHostSyscall(req: { op: string }): req is HostSyscall {\n return (HOST_OPS as readonly string[]).includes(req.op);\n}\n\nfunction isPtySyscall(req: WasmSyscall): req is PtySyscall {\n return req.op.startsWith('pty-');\n}\n\ntype VfsSyscall = Extract<\n FdSyscall,\n {\n op:\n | 'fd-pread'\n | 'fd-pwrite'\n | 'fd-resize'\n | 'fd-vfs-stat'\n | 'fd-path-flush'\n | 'fd-path-unlinking'\n | 'fd-path-unlinked'\n | 'fd-path-renamed';\n }\n>;\n\nfunction isVfsSyscall(req: FdSyscall): req is VfsSyscall {\n return (\n req.op.startsWith('fd-path-') ||\n req.op === 'fd-pread' ||\n req.op === 'fd-pwrite' ||\n req.op === 'fd-resize' ||\n req.op === 'fd-vfs-stat'\n );\n}\n\nfunction isFdSyscall(req: WasmSyscall): req is FdSyscall {\n return req.op.startsWith('fd-');\n}\n\nfunction isTtySyscall(req: WasmSyscall): req is TtySyscall {\n return req.op.startsWith('tty-');\n}\n\nexport interface FdInfo {\n tty: boolean;\n kind: KernelFdKind;\n meta?: HeldMeta;\n flags?: number;\n cloexec?: true;\n\n name?: string;\n}\n\nconst SYSCALL_OPS: ReadonlySet<string> = new Set([\n 'fd-read',\n 'fd-write',\n 'fd-close',\n 'fd-pipe',\n 'fd-poll',\n 'fd-open-vfs',\n 'fd-seek',\n 'fd-pread',\n 'fd-pwrite',\n 'fd-resize',\n 'fd-vfs-stat',\n 'fd-path-flush',\n 'fd-path-unlinking',\n 'fd-path-unlinked',\n 'fd-path-renamed',\n 'fd-select',\n 'fd-info',\n 'fd-dup',\n 'fd-reserve',\n 'fd-meta',\n 'fd-setfl',\n 'fd-cloexec',\n 'fd-list',\n 'proc-alarm',\n 'dl-log',\n 'fd-renumber',\n 'fd-promote',\n 'fd-open-tty',\n 'tty-get',\n 'tty-set',\n 'tty-winsz',\n 'fd-flush',\n 'proc-spawn',\n 'proc-wait',\n 'proc-captured',\n 'proc-fork',\n 'proc-kill',\n 'proc-exec',\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n 'tty-pgrp-get',\n 'tty-pgrp-set',\n 'sig-mask',\n 'sig-pause',\n ...SOCKET_OPS,\n ...HTTP_OPS,\n ...PTY_OPS,\n ...HOST_OPS,\n]);\n\ntype TtySyscall = Extract<WasmSyscall, { op: `tty-${string}` }>;\n\nexport function isWasmSyscall(req: object): req is WasmSyscall {\n const op = (req as { op?: unknown }).op;\n return typeof op === 'string' && SYSCALL_OPS.has(op);\n}\n\nconst MAX_READ = 1024 * 1024;\n\nexport interface WasmProcessOptions {\n spawner?: ChildSpawner;\n\n forker?: ChildForker;\n\n fs: VfsFileFs;\n\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n\n onPending?: (sig: number) => void;\n\n onTimer?: (which: number) => void;\n\n hasPending?: () => boolean;\n\n pendingBits?: () => number;\n\n raise?: (sig: number) => void;\n\n onReap?: (pid: number) => void;\n\n jobs?: JobTable;\n\n ptys?: PtyTable;\n\n net?: LoopbackNet;\n\n http?: HttpHandles;\n\n locks?: LockTable;\n}\n\nexport type StateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport type SignalOutcome = DefaultAction | 'deliver' | 'forward';\n\nexport class WasmProcess {\n private exited = false;\n private readonly children: ChildTable;\n\n private caught = 0;\n private ignored = 0;\n\n private interrupt = new AbortController();\n\n private execChild: number | undefined;\n\n execTermsig: number | undefined;\n\n private stopped = 0;\n\n private stops = 0;\n private resumed: Promise<void> = Promise.resolve();\n private wake: (() => void) | undefined;\n private readonly stateListeners: StateListener[] = [];\n\n private net: LoopbackNet | undefined;\n\n private readonly nodes: VfsNodes;\n\n readonly pid: number;\n\n readonly fds: FdTable;\n\n private readonly options: WasmProcessOptions;\n\n constructor(\n pid: number,\n\n fds: FdTable,\n\n options: WasmProcessOptions\n ) {\n this.pid = pid;\n\n this.fds = fds;\n\n this.options = options;\n this.children = new ChildTable(fds, options.spawner, options.forker);\n this.nodes = new VfsNodes(options.fs);\n this.children.onChildState = () => this.signal(SIG.CHLD);\n this.children.onReap = options.onReap;\n }\n\n signal(sig: number): SignalOutcome {\n if (this.execChild !== undefined) {\n void Promise.resolve(this.options.kill?.(this.execChild, sig)).catch(() => undefined);\n return sig === SIG.KILL ? 'terminate' : 'forward';\n }\n if (sig === SIG.KILL) return 'terminate';\n\n if (sig === SIG.CONT) this.cont();\n if (sig === SIG.STOP) return this.stop(sig);\n const bit = sigbit(sig);\n if (this.ignored & bit) return 'ignore';\n if (!(this.caught & bit)) {\n const action = defaultAction(sig);\n return action === 'stop' ? this.stop(sig) : action;\n }\n if (((this.options.pendingBits?.() ?? 0) & bit) !== 0 && defaultAction(sig) === 'terminate') {\n return 'terminate';\n }\n this.options.onPending?.(sig);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n return 'deliver';\n }\n\n onState(listener: StateListener): void {\n this.stateListeners.push(listener);\n }\n\n private stop(sig: number): 'stop' {\n if (this.stopped) return 'stop';\n this.stopped = sig;\n this.stops++;\n this.resumed = new Promise((resolve) => (this.wake = resolve));\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n for (const listener of this.stateListeners) listener('stopped', sig);\n return 'stop';\n }\n\n private cont(): void {\n if (!this.stopped) return;\n this.stopped = 0;\n this.wake?.();\n for (const listener of this.stateListeners) listener('continued', SIG.CONT);\n }\n\n async syscall(req: WasmSyscall): Promise<SyncFsResult> {\n for (;;) {\n await this.resumed;\n const stops = this.stops;\n const result = await this.dispatch(req);\n\n const restart = !result.ok && result.errno === 'EINTR' && this.stops !== stops;\n if (restart && !this.options.hasPending?.()) continue;\n\n await this.resumed;\n return result;\n }\n }\n\n private async dispatch(req: WasmSyscall): Promise<SyncFsResult> {\n try {\n if (isFdSyscall(req)) return await this.fdSyscall(req);\n if (isTtySyscall(req)) return this.ttySyscall(req);\n if (isJobSyscall(req)) return this.jobSyscall(req);\n if (isSocketSyscall(req)) return await this.socketSyscall(req);\n if (isHttpSyscall(req)) return await this.httpSyscall(req);\n if (isHostSyscall(req)) {\n return await hostSyscall(req, {\n pid: this.pid,\n locks: this.options.locks,\n ops: this.asyncOps,\n blocking: () => this.blockingSignal(),\n valid: (inner) => isWasmSyscall(inner) && !isHostSyscall(inner),\n });\n }\n if (isPtySyscall(req)) {\n const { ptys, jobs } = this.options;\n return ptySyscall(req, { pid: this.pid, fds: this.fds, ptys, jobs });\n }\n return await this.procSyscall(req);\n } catch (e) {\n if (e instanceof KernelError || e instanceof SpawnError) {\n return { ok: false, errno: e.code, message: e.code };\n }\n throw e;\n }\n }\n\n private blockingSignal(): AbortSignal {\n if (this.options.hasPending?.()) throw new KernelError('EINTR');\n return this.interrupt.signal;\n }\n\n private async read(req: Extract<WasmSyscall, { op: 'fd-read' }>): Promise<Uint8Array> {\n const file = this.fds.get(req.fd).file;\n const read = req.peek ? file.peek : file.read;\n if (!read) throw new KernelError(req.peek && file.read ? 'EOPNOTSUPP' : 'EBADF');\n if (file.tty) this.checkForeground(file.tty);\n\n if (req.max <= 0) return new Uint8Array(0);\n const ready = pollFile(file).readable;\n if (!ready && req.nonblock) throw new KernelError('EAGAIN');\n const signal = ready ? this.interrupt.signal : this.blockingSignal();\n return read.call(file, Math.max(0, Math.min(req.max, MAX_READ)), signal);\n }\n\n private async write(fd: number, body: Uint8Array, nonblock = false): Promise<number> {\n const file = this.fds.get(fd).file;\n if (!file.write) throw new KernelError('EBADF');\n if (!pollFile(file).writable) {\n if (nonblock) throw new KernelError('EAGAIN');\n return file.write(body, this.blockingSignal());\n }\n\n if (nonblock) return file.write(body, AbortSignal.abort());\n\n return file.write(\n body,\n this.options.hasPending?.() ? AbortSignal.abort() : this.interrupt.signal\n );\n }\n\n private openVfsFile(req: Extract<FdSyscall, { op: 'fd-open-vfs' }>): OpenFile {\n return vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags,\n position: req.position,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.truncate ? { truncate: true } : {}),\n ...(req.create ? { create: true } : {}),\n },\n this.nodes\n );\n }\n\n private async fdSyscall(req: FdSyscall): Promise<SyncFsResult> {\n if (isVfsSyscall(req)) return this.vfsSyscall(req);\n switch (req.op) {\n case 'fd-read':\n return { ok: true, kind: 'bytes', bytes: await this.read(req) };\n case 'fd-write':\n return { ok: true, kind: 'json', json: await this.write(req.fd, req.body, req.nonblock) };\n case 'fd-close':\n this.options.locks?.closed(this.pid, req.fd);\n await Promise.resolve(this.fds.close(req.fd));\n return { ok: true, kind: 'void' };\n case 'fd-pipe': {\n const pipe = openPipe();\n const read = this.fds.install(pipe.read, 3);\n let write: number;\n try {\n write = this.fds.install(pipe.write, 3);\n } catch (e) {\n await Promise.resolve(this.fds.close(read));\n throw e;\n }\n return { ok: true, kind: 'json', json: [read, write] };\n }\n case 'fd-poll':\n return { ok: true, kind: 'json', json: pollFile(this.fds.get(req.fd).file) };\n case 'fd-open-vfs':\n return { ok: true, kind: 'json', json: this.fds.install(this.openVfsFile(req), 3) };\n case 'fd-info':\n return { ok: true, kind: 'json', json: this.fdInfo(req.fd) };\n case 'fd-list':\n return {\n ok: true,\n kind: 'json',\n json: this.fds.numbers().map((fd) => ({ fd, ...this.fdInfo(fd) })),\n };\n case 'fd-meta': {\n const file = this.fds.get(req.fd).file;\n if (!file.held) throw new KernelError('EBADF');\n file.heldMeta = req.meta;\n return { ok: true, kind: 'void' };\n }\n case 'fd-setfl':\n this.fds.setStatusFlags(req.fd, req.flags);\n return { ok: true, kind: 'void' };\n case 'fd-cloexec':\n if (req.on) this.fds.setCloseOnExec(req.fd);\n else this.fds.clearCloseOnExec(req.fd);\n return { ok: true, kind: 'void' };\n case 'fd-dup':\n return { ok: true, kind: 'json', json: this.fds.dup(req.fd, req.min ?? 3) };\n case 'fd-reserve':\n return { ok: true, kind: 'json', json: this.reserve(req.fd, req.min, req.meta) };\n case 'fd-promote':\n this.promote(req);\n return { ok: true, kind: 'void' };\n case 'fd-renumber':\n if (req.from !== req.to) {\n this.fds.dup2(req.from, req.to);\n if (!req.keep) await Promise.resolve(this.fds.close(req.from));\n }\n return { ok: true, kind: 'void' };\n case 'fd-open-tty': {\n const tty =\n req.name === undefined\n ? this.controllingTerminal()\n : this.options.jobs?.terminalNamed(req.name);\n if (!tty) throw new KernelError('ENXIO');\n return { ok: true, kind: 'json', json: this.fds.install(tty.file(), 3) };\n }\n case 'fd-select': {\n const { read, write, timeoutMs } = req;\n const signal = this.blockingSignal();\n const selected = await selectFds(this.fds, read, write, timeoutMs, signal);\n return { ok: true, kind: 'json', json: selected };\n }\n case 'fd-seek': {\n const file = this.fds.get(req.fd).file;\n if (!file.seek) throw new KernelError('ESPIPE');\n return { ok: true, kind: 'json', json: await file.seek(req.offset, req.whence) };\n }\n case 'fd-flush': {\n const file = this.fds.get(req.fd).file;\n if (file.flush) await file.flush();\n return { ok: true, kind: 'void' };\n }\n }\n }\n\n private async vfsSyscall(req: VfsSyscall): Promise<SyncFsResult> {\n if ('path' in req || 'from' in req) {\n const nodes = this.nodes;\n if (req.op === 'fd-path-flush') await nodes.flush(req.path);\n else if (req.op === 'fd-path-unlinking') await nodes.unlinking(req.path);\n else if (req.op === 'fd-path-unlinked') nodes.unlinked(req.path);\n else if (req.op === 'fd-path-renamed') nodes.renamed(req.from, req.to);\n return { ok: true, kind: 'void' };\n }\n const file = this.fds.get(req.fd).file;\n if (!file.pread || !file.pwrite || !file.resize || !file.stat) throw new KernelError('ESPIPE');\n switch (req.op) {\n case 'fd-pread':\n return {\n ok: true,\n kind: 'bytes',\n bytes: await file.pread(Math.min(req.max, MAX_READ), req.offset),\n };\n case 'fd-pwrite':\n return { ok: true, kind: 'json', json: await file.pwrite(req.body, req.offset) };\n case 'fd-resize':\n await file.resize(req.size);\n return { ok: true, kind: 'void' };\n case 'fd-vfs-stat':\n return { ok: true, kind: 'json', json: await file.stat() };\n }\n }\n\n private promote(req: Extract<WasmSyscall, { op: 'fd-promote' }>): void {\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n if (req.share !== undefined) {\n this.fds.dup2(req.share, req.fd);\n return;\n }\n if (req.path === undefined) throw new KernelError('EINVAL');\n const file = vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags ?? 0,\n position: req.position ?? 0,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.dirty ? { dirty: true } : {}),\n },\n this.nodes\n );\n this.fds.installAt(req.fd, file);\n }\n\n private reserve(fd: number | undefined, min = 3, meta?: HeldMeta): number {\n if (fd === undefined) return this.fds.install(heldFile(meta), Math.max(3, min));\n if (this.fds.has(fd)) throw new KernelError('EBADF');\n this.fds.installAt(fd, heldFile(meta));\n return fd;\n }\n\n private fdInfo(fd: number): FdInfo {\n const file = this.fds.get(fd).file;\n const flags = this.fds.statusFlags(fd);\n return {\n tty: file.tty !== undefined,\n kind: file instanceof KernelSocket ? 'socket' : kernelFdKind(file),\n ...(file.heldMeta ? { meta: file.heldMeta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(this.fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(file.tty?.name ? { name: file.tty.name } : file.pty ? { name: '/dev/ptmx' } : {}),\n };\n }\n\n private ttySyscall(req: TtySyscall): SyncFsResult {\n const tty = this.tty(req.fd);\n const jobs = this.options.jobs;\n switch (req.op) {\n case 'tty-get':\n return { ok: true, kind: 'json', json: tty.tcgets() };\n case 'tty-set':\n tty.tcsets(req.termios);\n return { ok: true, kind: 'void' };\n case 'tty-winsz':\n return { ok: true, kind: 'json', json: tty.winsize() };\n case 'tty-pgrp-get':\n return { ok: true, kind: 'json', json: jobs ? jobs.tcgetpgrp(tty, this.sid()) : this.pid };\n case 'tty-pgrp-set':\n if (jobs) jobs.tcsetpgrp(this.pid, tty, req.pgrp);\n else if (req.pgrp !== this.pid) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n }\n }\n\n private checkForeground(tty: KernelTty): void {\n const jobs = this.options.jobs;\n if (!jobs) return;\n const session = jobs.controllingTerminal(this.pid);\n if (session !== undefined && session !== tty) return;\n const pgid = this.pgid();\n if (jobs.tcgetpgrp(tty, this.sid()) === pgid) return;\n if (this.ignored & sigbit(SIG.TTIN)) throw new KernelError('EIO');\n jobs.killGroup(pgid, SIG.TTIN);\n throw new KernelError('EINTR');\n }\n\n private waitGroup(pid: number): ((child: number) => boolean) | undefined {\n const jobs = this.options.jobs;\n if (!jobs || pid > 0 || pid === -1) return undefined;\n const group = pid === 0 ? this.pgid() : -pid;\n\n return (child) => (jobs.pgidOf(child) ?? this.pgid()) === group;\n }\n\n private pgid(): number {\n return this.options.jobs?.getpgid(this.pid, 0) ?? this.pid;\n }\n\n private sid(): number {\n return this.options.jobs?.getsid(this.pid, 0) ?? this.pid;\n }\n\n private controllingTerminal(): KernelTty | undefined {\n const session = this.options.jobs?.controllingTerminal(this.pid);\n return session === undefined ? this.fds.stdioTerminal() : (session ?? undefined);\n }\n\n private jobSyscall(req: JobSyscall): SyncFsResult {\n const jobs = this.options.jobs;\n const self = (pid: number): number => {\n if (pid !== 0 && pid !== this.pid) throw new KernelError('ESRCH');\n return this.pid;\n };\n switch (req.op) {\n case 'proc-setpgid':\n if (jobs) jobs.setpgid(this.pid, req.pid, req.pgid);\n else if (self(req.pid) !== (req.pgid || this.pid)) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n case 'proc-getpgid':\n return { ok: true, kind: 'json', json: jobs?.getpgid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-getsid':\n return { ok: true, kind: 'json', json: jobs?.getsid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-setsid':\n if (!jobs) throw new KernelError('EPERM');\n return { ok: true, kind: 'json', json: jobs.setsid(this.pid) };\n }\n }\n\n private httpSyscall(req: HttpSyscall): Promise<SyncFsResult> {\n const http = this.options.http;\n if (!http) return Promise.resolve({ ok: false, errno: 'ENETUNREACH', message: NO_TRANSPORT });\n return http.syscall(req);\n }\n\n private socketSyscall(req: SocketSyscall): Promise<SyncFsResult> {\n this.net ??= this.options.net ?? new LoopbackNet();\n return socketSyscall(req, {\n fds: this.fds,\n net: this.net,\n blocking: () => this.blockingSignal(),\n });\n }\n\n private tty(fd: number): KernelTty {\n const file = this.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n }\n\n private async procSyscall(\n req: Exclude<\n WasmSyscall,\n FdSyscall | TtySyscall | JobSyscall | SocketSyscall | HttpSyscall | PtySyscall | HostSyscall\n >\n ): Promise<SyncFsResult> {\n switch (req.op) {\n case 'proc-fork':\n return { ok: true, kind: 'json', json: await this.children.fork(req.state) };\n case 'proc-spawn': {\n const { file, argv, env, cwd, stdio, inherit } = req;\n const pid = await this.children.spawn({ file, argv, env, cwd }, stdio, inherit);\n return { ok: true, kind: 'json', json: pid };\n }\n case 'proc-wait': {\n const signal = req.nohang ? this.interrupt.signal : this.blockingSignal();\n const flags = {\n untraced: req.untraced,\n continued: req.continued,\n inGroup: this.waitGroup(req.pid),\n };\n const waited = await this.children.wait(req.pid, req.nohang, signal, flags);\n return { ok: true, kind: 'json', json: waited };\n }\n case 'proc-exec': {\n this.execChild = req.pid;\n this.options.jobs?.exec(this.pid, req.pid);\n\n this.children.watch(req.pid, (state, sig) =>\n state === 'stopped' ? this.stop(sig) : this.cont()\n );\n\n await this.fds.closeAll();\n try {\n const waited = await this.children.wait(req.pid, false);\n const termsig = waited[1] & 0x7f;\n if (termsig) this.execTermsig = termsig;\n return { ok: true, kind: 'json', json: waited };\n } finally {\n this.execChild = undefined;\n }\n }\n case 'proc-kill':\n if (req.sig !== 0 && !isSignal(req.sig)) throw new KernelError('EINVAL');\n\n if (!(await this.options.kill?.(req.pid === 0 ? -this.pgid() : req.pid, req.sig))) {\n throw new KernelError('ESRCH');\n }\n return { ok: true, kind: 'void' };\n case 'proc-alarm':\n this.setAlarm(req.sig, req.firstMs ?? req.ms, req.repeat ? req.ms : 0, req.timer);\n return { ok: true, kind: 'void' };\n case 'dl-log':\n if (req.append) this.dlLog.push(req.append);\n return { ok: true, kind: 'json', json: this.dlLog.slice(req.from) };\n case 'sig-mask':\n this.caught = req.caught;\n this.ignored = req.ignored;\n return { ok: true, kind: 'void' };\n case 'sig-pause':\n return this.pause();\n case 'proc-captured':\n return { ok: true, kind: 'bytes', bytes: this.children.captured(req.pid, req.slot) };\n }\n }\n\n private pause(): Promise<never> {\n const signal = this.blockingSignal();\n return new Promise<never>((_, reject) => {\n signal.addEventListener('abort', () => reject(new KernelError('EINTR')), { once: true });\n });\n }\n\n private alarm: ReturnType<typeof setTimeout> | undefined;\n private readonly dlLog: LinkRecord[] = [];\n private readonly asyncOps = new AsyncOps((req) => this.syscall(req as WasmSyscall));\n private alarmEvery: ReturnType<typeof setInterval> | undefined;\n\n private setAlarm(sig: number, first: number, every: number, timer?: number): void {\n if (!isSignal(sig)) throw new KernelError('EINVAL');\n this.clearAlarm();\n if (first <= 0) return;\n const fire =\n timer === undefined ? () => this.options.raise?.(sig) : () => this.timerExpired(timer);\n this.alarm = setTimeout(() => {\n this.alarm = undefined;\n fire();\n if (every > 0) this.alarmEvery = setInterval(fire, every);\n }, first);\n }\n\n private timerExpired(which: number): void {\n this.options.onTimer?.(which);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n }\n\n private clearAlarm(): void {\n clearTimeout(this.alarm);\n clearInterval(this.alarmEvery);\n this.alarm = undefined;\n this.alarmEvery = undefined;\n }\n\n async exit(): Promise<void> {\n if (this.exited) return;\n this.exited = true;\n this.clearAlarm();\n this.options.locks?.release(this.pid);\n this.asyncOps.close();\n for (const pid of this.children.pids()) this.options.onReap?.(pid);\n await this.fds.closeAll();\n await this.options.http?.closeAll();\n }\n}\n", "import type { ForeignResults, ImportedMemory } from '../process/wasi/wasi-module.ts';\nimport type { WasiForkState } from '../process/wasi/wasix-fork.ts';\nimport type { DeviceMeta, KernelFdKind } from './fd-table.ts';\n\nexport const WASM_PROCESS_INIT = 'wasm-process-init';\nexport const WASM_PROCESS_EXIT = 'wasm-process-exit';\nexport const WASM_PROCESS_ERROR = 'wasm-process-error';\nexport const WASM_THREAD_SPAWN = 'wasm-thread-spawn';\nexport const WASM_THREAD_INIT = 'wasm-thread-init';\nexport const WASM_THREAD_EXIT = 'wasm-thread-exit';\nexport const WASM_MAX_THREADS = 256;\nexport const WASM_DEFAULT_THREADS = 64;\n\nexport interface WasmProgram {\n abi?: 'emscripten' | 'wasi';\n glue: string;\n module: WebAssembly.Module;\n memory?: ImportedMemory;\n foreign?: ForeignResults | undefined;\n names?: string;\n imports?: string;\n}\n\nexport interface ForkState {\n memory: Uint8Array;\n currData: number;\n forkSp: number;\n callStackNames: Array<[number, string]>;\n ppid: number;\n streams?: ForkStream[];\n cwd?: string;\n wasi?: WasiForkState;\n}\n\nexport interface KernelStreamEntry {\n fd: number;\n kernel: number;\n kind: KernelFdKind;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport type ForkStream = KernelStreamEntry | { fd: number; path: string; flags: number };\n\nexport interface InheritedFd {\n fd: number;\n kind: KernelFdKind;\n device?: DeviceMeta;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport interface WasmProcessInitMsg {\n type: typeof WASM_PROCESS_INIT;\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n sab: SharedArrayBuffer;\n ppid?: number;\n fork?: ForkState;\n fds?: InheritedFd[];\n}\n\nexport interface WasmProcessExitMsg {\n type: typeof WASM_PROCESS_EXIT;\n code: number;\n}\n\nexport interface WasmProcessErrorMsg {\n type: typeof WASM_PROCESS_ERROR;\n message: string;\n}\n\nexport interface WasmThread {\n tid: number;\n arg: number;\n memory: WebAssembly.Memory;\n ids: SharedArrayBuffer;\n modules?: Record<string, WebAssembly.Module>;\n}\n\nexport interface WasmThreadSpawnMsg {\n type: typeof WASM_THREAD_SPAWN;\n thread: WasmThread;\n}\n\nexport interface WasmThreadInitMsg extends Omit<WasmProcessInitMsg, 'type' | 'fork' | 'fds'> {\n type: typeof WASM_THREAD_INIT;\n thread: WasmThread;\n}\n\nexport interface WasmThreadExitMsg {\n type: typeof WASM_THREAD_EXIT;\n}\n", "import { dispatchSyncFs } from '../realm/sync-fs-dispatch.ts';\nimport {\n mintSyncFsToken,\n revokeSyncFsToken,\n type SyncFsTokenEntry,\n} from '../realm/sync-fs-token-registry.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n attachSyncSabResponder,\n type SyncSabDispatchRequest,\n} from '../realm/sync-sab-responder.ts';\nimport {\n SAB_DEFAULT_WINDOW_BYTES,\n SAB_HEADER_BYTES,\n SAB_HEADER_I32,\n SAB_I_SIGNALS,\n SAB_I_TIMERS,\n} from '../realm/sync-sab-wire.ts';\nimport type { ChildForker, ChildSpawner } from './children.ts';\nimport { type FdTable, kernelFdKind, type OpenFile } from './fd-table.ts';\nimport type { LockTable } from './host-ops.ts';\nimport type { JobTable } from './jobs.ts';\nimport type { HttpHandles } from './net/http-syscalls.ts';\nimport { isWasmSyscall, type StateListener, WasmProcess } from './process.ts';\nimport {\n type ForkState,\n type InheritedFd,\n WASM_MAX_THREADS,\n WASM_PROCESS_ERROR,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_INIT,\n WASM_THREAD_EXIT,\n WASM_THREAD_INIT,\n WASM_THREAD_SPAWN,\n type WasmProcessInitMsg,\n type WasmProgram,\n type WasmThread,\n type WasmThreadInitMsg,\n} from './protocol.ts';\nimport type { PtyTable } from './pty.ts';\nimport { SIG, sigbit } from './signals.ts';\nimport { KernelSocket, type LoopbackNet } from './socket.ts';\n\nexport interface WasmWorkerLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n terminate(): void;\n}\n\nexport interface SpawnWasmOptions {\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n fs: SyncFsTokenEntry['fs'];\n createWorker: () => WasmWorkerLike;\n onError?: (message: string) => void;\n spawner?: ChildSpawner;\n forker?: ChildForker;\n fork?: ForkState;\n ppid?: number;\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n jobs?: JobTable;\n ptys?: PtyTable;\n\n net?: LoopbackNet;\n\n http?: HttpHandles;\n locks?: LockTable;\n onReap?: (pid: number) => void;\n}\n\nexport interface WasmProcessHandle {\n pid: number;\n exited: Promise<number>;\n kill(code?: number): void;\n signal(sig: number): void;\n termsig(): number | undefined;\n onState(listener: StateListener): void;\n}\n\nconst CRASHED = 70;\n\nconst descIds = new WeakMap<OpenFile, number>();\nlet nextDescId = 1;\n\nfunction descId(file: OpenFile): number {\n const id = descIds.get(file) ?? nextDescId++;\n descIds.set(file, id);\n return id;\n}\n\nexport function inheritedFds(fds: FdTable): InheritedFd[] {\n return fds\n .numbers()\n .filter((fd) => fd > 2 && !fds.get(fd).file.held)\n .map((fd): InheritedFd => {\n const open = fds.get(fd);\n const flags = fds.statusFlags(fd);\n const kind = open.file instanceof KernelSocket ? 'socket' : kernelFdKind(open.file);\n const meta = open.file.heldMeta;\n return {\n fd,\n kind,\n ...(kind === 'device' && meta && 'device' in meta ? { device: meta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(kind === 'stream' ? { desc: descId(open) } : {}),\n };\n });\n}\n\ninterface WorkerSays {\n type?: string;\n code?: unknown;\n message?: unknown;\n thread?: WasmThread;\n}\n\nexport function spawnWasmProcess(opts: SpawnWasmOptions): WasmProcessHandle {\n const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const header = new Int32Array(sab, 0, SAB_HEADER_I32);\n const process = new WasmProcess(opts.pid, opts.fds, {\n spawner: opts.spawner,\n forker: opts.forker,\n fs: opts.fs,\n kill: opts.kill,\n jobs: opts.jobs,\n ptys: opts.ptys,\n net: opts.net,\n http: opts.http,\n locks: opts.locks,\n onReap: opts.onReap,\n onPending: (sig) => void Atomics.or(header, SAB_I_SIGNALS, sigbit(sig)),\n onTimer: (which) => void Atomics.or(header, SAB_I_TIMERS, 1 << which),\n hasPending: () =>\n Atomics.load(header, SAB_I_SIGNALS) !== 0 || Atomics.load(header, SAB_I_TIMERS) !== 0,\n raise: (sig) => signal(sig),\n ...(opts.program.abi === 'wasi'\n ? { pendingBits: () => Atomics.load(header, SAB_I_SIGNALS) }\n : {}),\n });\n const token = mintSyncFsToken({ fs: opts.fs, cwd: opts.cwd });\n const worker = opts.createWorker();\n const dispatch = async (req: SyncSabDispatchRequest): Promise<SyncFsResult> => {\n if (isWasmSyscall(req)) return process.syscall(req);\n return dispatchSyncFs(req);\n };\n const responder = attachSyncSabResponder(worker, sab, token, { dispatch });\n\n let settle!: (code: number) => void;\n const exited = new Promise<number>((resolve) => (settle = resolve));\n let done = false;\n let endedBy: number | undefined;\n\n const finish = (code: number, sig?: number): void => {\n if (done) return;\n done = true;\n endedBy = sig ?? process.execTermsig;\n worker.removeEventListener('message', onMessage);\n worker.removeEventListener('error', onError);\n for (const tid of [...threads.keys()]) endThread(tid);\n responder.dispose();\n revokeSyncFsToken(token);\n worker.terminate();\n void process.exit().then(\n () => settle(code),\n () => settle(code)\n );\n };\n\n const handle = (data: WorkerSays | undefined): void => {\n if (data?.type === WASM_PROCESS_EXIT) {\n finish(typeof data.code === 'number' ? data.code : CRASHED);\n } else if (data?.type === WASM_PROCESS_ERROR) {\n opts.onError?.(String(data.message));\n finish(CRASHED);\n } else if (data?.type === WASM_THREAD_SPAWN && data.thread) {\n spawnThread(data.thread);\n }\n };\n const onMessage = (event: MessageEvent): void => handle(event.data as WorkerSays | undefined);\n const onError = (event: MessageEvent): void => {\n event.preventDefault();\n opts.onError?.(String((event as unknown as ErrorEvent).message ?? 'worker error'));\n finish(CRASHED);\n };\n worker.addEventListener('message', onMessage);\n worker.addEventListener('error', onError);\n\n const threads = new Map<number, () => void>();\n const endThread = (tid: number): void => {\n const end = threads.get(tid);\n threads.delete(tid);\n end?.();\n };\n const spawnThread = (thread: WasmThread): void => {\n if (done) return;\n if (threads.size >= WASM_MAX_THREADS - 1) {\n opts.onError?.(`more than ${WASM_MAX_THREADS} threads`);\n finish(CRASHED);\n return;\n }\n const tsab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const tw = opts.createWorker();\n const tresponder = attachSyncSabResponder(tw, tsab, token, { dispatch });\n const onThreadMessage = (event: MessageEvent): void => {\n const data = event.data as WorkerSays | undefined;\n if (data?.type === WASM_THREAD_EXIT) endThread(thread.tid);\n else handle(data);\n };\n tw.addEventListener('message', onThreadMessage);\n tw.addEventListener('error', onError);\n threads.set(thread.tid, () => {\n tw.removeEventListener('message', onThreadMessage);\n tw.removeEventListener('error', onError);\n tresponder.dispose();\n tw.terminate();\n });\n const tinit: WasmThreadInitMsg = {\n type: WASM_THREAD_INIT,\n pid: opts.pid,\n program: opts.program,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab: tsab,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n thread,\n };\n tw.postMessage(tinit);\n };\n\n const init: WasmProcessInitMsg = {\n type: WASM_PROCESS_INIT,\n pid: opts.pid,\n program: opts.program,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n ...(opts.fork ? { fork: opts.fork } : { fds: inheritedFds(opts.fds) }),\n };\n worker.postMessage(init, opts.fork ? [opts.fork.memory.buffer as ArrayBuffer] : []);\n\n const signal = (sig: number): void => {\n if (process.signal(sig) === 'terminate') finish(sig === SIG.KILL ? 137 : 128 + sig, sig);\n };\n const kill = (code = 137): void =>\n finish(code, code > 128 && code < 160 ? code - 128 : undefined);\n return {\n pid: opts.pid,\n exited,\n kill,\n signal,\n termsig: () => endedBy,\n onState: (listener) => process.onState(listener),\n };\n}\n", "import { KernelError } from './fd-table.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport interface JobMember {\n pid: number;\n pgid: number;\n sid: number;\n\n signal(sig: number): void;\n\n execParent?: number;\n\n ppid?: number;\n\n execed?: boolean;\n}\n\nexport class JobTable {\n private readonly members = new Map<number, JobMember>();\n private readonly foreground = new Map<KernelTty, number>();\n\n private readonly terminals = new Map<number, KernelTty>();\n\n add(\n pid: number,\n parentPid: number | undefined,\n signal: (sig: number) => void,\n terminal?: KernelTty\n ): JobMember {\n const parent = parentPid === undefined ? undefined : this.members.get(parentPid);\n if (!parent && terminal) this.terminals.set(pid, terminal);\n const member: JobMember = {\n pid,\n ppid: parent?.pid,\n pgid: parent?.pgid ?? pid,\n sid: parent?.sid ?? pid,\n signal,\n };\n this.members.set(pid, member);\n return member;\n }\n\n remove(pid: number): void {\n this.members.delete(pid);\n }\n\n exec(pid: number, child: number): void {\n const member = this.members.get(child);\n if (member) member.execParent = pid;\n const execer = this.members.get(pid);\n if (execer) execer.execed = true;\n }\n\n pgidOf(pid: number): number | undefined {\n return this.members.get(pid)?.pgid;\n }\n\n private member(pid: number): JobMember {\n const member = this.members.get(pid);\n if (!member) throw new KernelError('ESRCH');\n return member;\n }\n\n setpgid(caller: number, pid: number, pgid: number): void {\n const target = this.member(pid || caller);\n const group = pgid || target.pid;\n if (group < 0) throw new KernelError('EINVAL');\n const self = this.member(caller);\n if (target.pid !== caller) {\n if (target.ppid !== caller) throw new KernelError('ESRCH');\n if (target.execed) throw new KernelError('EACCES');\n }\n if (target.sid !== self.sid) throw new KernelError('EPERM');\n if (target.pid === target.sid) throw new KernelError('EPERM');\n\n const exists = [...this.members.values()].some((m) => m.pgid === group && m.sid === target.sid);\n if (group !== target.pid && !exists) throw new KernelError('EPERM');\n target.pgid = group;\n }\n\n getpgid(caller: number, pid: number): number {\n return this.member(pid || caller).pgid;\n }\n\n getsid(caller: number, pid: number): number {\n return this.member(pid || caller).sid;\n }\n\n setsid(pid: number): number {\n const member = this.member(pid);\n if (member.pgid === pid) throw new KernelError('EPERM');\n member.sid = pid;\n member.pgid = pid;\n this.terminals.delete(pid);\n return pid;\n }\n\n terminalNamed(name: string): KernelTty | undefined {\n const known = new Set([...this.terminals.values(), ...this.foreground.keys()]);\n return [...known].find((tty) => tty.name === name);\n }\n\n controllingTerminal(pid: number): KernelTty | null | undefined {\n const member = this.members.get(pid);\n return member && (this.terminals.get(member.sid) ?? null);\n }\n\n acquireTerminal(pid: number, tty: KernelTty): boolean {\n const member = this.members.get(pid);\n if (!member || member.sid !== pid || this.terminals.has(pid)) return false;\n if ([...this.terminals.values()].includes(tty)) return false;\n this.terminals.set(pid, tty);\n this.foreground.set(tty, member.pgid);\n return true;\n }\n\n killGroup(pgid: number, sig: number): boolean {\n const targets = [...this.members.values()].filter((m) => m.pgid === pgid);\n const pids = new Set(targets.map((m) => m.pid));\n if (sig !== 0) {\n for (const m of targets)\n if (m.execParent === undefined || !pids.has(m.execParent)) m.signal(sig);\n }\n return targets.length > 0;\n }\n\n tcgetpgrp(tty: KernelTty, fallback: number): number {\n return this.foreground.get(tty) ?? fallback;\n }\n\n tcsetpgrp(caller: number, tty: KernelTty, pgid: number): void {\n const self = this.member(caller);\n const inSession = [...this.members.values()].some((m) => m.pgid === pgid && m.sid === self.sid);\n if (!inSession) throw new KernelError('EPERM');\n this.foreground.set(tty, pgid);\n }\n\n signalOwnedForeground(tty: KernelTty, sig: number): void {\n const pgid = this.foreground.get(tty);\n if (pgid !== undefined) this.killGroup(pgid, sig);\n }\n\n signalForeground(tty: KernelTty, fallback: number, sig: number): void {\n this.killGroup(this.tcgetpgrp(tty, fallback), sig);\n }\n}\n", "export interface ImportedMemory {\n module: string;\n name: string;\n initial: number;\n maximum?: number;\n shared: boolean;\n}\n\nexport function importedMemory(bytes: Uint8Array): ImportedMemory | undefined {\n let at = 8;\n const u32 = (): number => {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = bytes[at++];\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n };\n const name = (): string => {\n const len = u32();\n const s = new TextDecoder().decode(bytes.subarray(at, at + len));\n at += len;\n return s;\n };\n const limits = () => {\n const flags = bytes[at++];\n const initial = u32();\n const maximum = flags & 1 ? u32() : undefined;\n return { initial, maximum, shared: (flags & 2) !== 0 };\n };\n while (at < bytes.length) {\n const id = bytes[at++];\n const size = u32();\n const end = at + size;\n if (id !== 2) {\n at = end;\n continue;\n }\n const count = u32();\n for (let i = 0; i < count; i++) {\n const module = name();\n const field = name();\n const kind = bytes[at++];\n if (kind === 0) u32();\n else if (kind === 1) {\n at++;\n limits();\n } else if (kind === 2) {\n const l = limits();\n return { module, name: field, ...l };\n } else if (kind === 3) at += 2;\n else if (kind === 4) {\n at++;\n u32();\n }\n }\n return undefined;\n }\n return undefined;\n}\n\nexport const RESERVED_NAMESPACES: ReadonlySet<string> = new Set([\n 'wasi_snapshot_preview1',\n 'wasix_32v1',\n 'wasi',\n 'env',\n]);\n\nexport type ForeignResult = 'none' | 'i32' | 'i64' | 'f32' | 'f64' | 'other';\n\nexport type ForeignResults = Record<string, Record<string, ForeignResult>>;\n\nconst RESULTS: Readonly<Record<number, ForeignResult>> = {\n 127: 'i32',\n 126: 'i64',\n 125: 'f32',\n 124: 'f64',\n};\n\nfunction resultOf(results: number[]): ForeignResult {\n if (results.length === 0) return 'none';\n return (results.length === 1 && RESULTS[results[0]]) || 'other';\n}\n\nclass Reader {\n at = 8;\n readonly bytes: Uint8Array;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n }\n\n byte(): number {\n return this.bytes[this.at++];\n }\n\n u32(): number {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = this.byte();\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n }\n\n name(): string {\n const len = this.u32();\n const s = new TextDecoder().decode(this.bytes.subarray(this.at, this.at + len));\n this.at += len;\n return s;\n }\n\n valtype(): number {\n const code = this.byte();\n if (code === 0x63 || code === 0x64) this.u32();\n return code;\n }\n\n limits(): void {\n const flags = this.byte();\n this.u32();\n if (flags & 1) this.u32();\n }\n}\n\nfunction readTypes(r: Reader): ForeignResult[] | undefined {\n const types: ForeignResult[] = [];\n for (let i = r.u32(); i > 0; i--) {\n if (r.byte() !== 0x60) return undefined;\n for (let n = r.u32(); n > 0; n--) r.valtype();\n const results: number[] = [];\n for (let n = r.u32(); n > 0; n--) results.push(r.valtype());\n types.push(resultOf(results));\n }\n return types;\n}\n\nfunction skipImport(r: Reader, kind: number): void {\n if (kind === 1) {\n r.valtype();\n r.limits();\n } else if (kind === 2) r.limits();\n else if (kind === 3) {\n r.valtype();\n r.byte();\n } else {\n r.byte();\n r.u32();\n }\n}\n\nfunction readImports(r: Reader, types: ForeignResult[]): ForeignResults {\n const foreign: ForeignResults = {};\n for (let i = r.u32(); i > 0; i--) {\n const module = r.name();\n const field = r.name();\n const kind = r.byte();\n if (kind !== 0) skipImport(r, kind);\n else {\n const type = types[r.u32()] ?? 'other';\n if (!RESERVED_NAMESPACES.has(module)) (foreign[module] ??= {})[field] = type;\n }\n }\n return foreign;\n}\n\nexport function foreignImports(bytes: Uint8Array): ForeignResults | undefined {\n const r = new Reader(bytes);\n let types: ForeignResult[] | undefined = [];\n while (r.at < bytes.length) {\n const id = r.byte();\n const end = r.u32() + r.at;\n if (id === 1) types = readTypes(r);\n if (!types) return undefined;\n if (id === 2) return readImports(r, types);\n r.at = end;\n }\n return {};\n}\n", "import { type Abi, type Command, scanCommands } from './commands.ts';\nimport { followLinks, withCommandDirs } from './fs/commands.ts';\nimport type { KernelFs } from './fs/types.ts';\nimport {\n type ChildForker,\n type ChildHandle,\n type ChildSpawner,\n SpawnError,\n} from './kernel/children.ts';\nimport { bytesSource, FdTable, nullFile, sinkFile } from './kernel/fd-table.ts';\nimport { spawnWasmProcess, type WasmProcessHandle, type WasmWorkerLike } from './kernel/host.ts';\nimport { LockTable } from './kernel/host-ops.ts';\nimport { JobTable } from './kernel/jobs.ts';\nimport { HttpHandles } from './kernel/net/http-syscalls.ts';\nimport {\n enableNetwork,\n kernelCa,\n kernelTlsEngine,\n memoryCaStore,\n missingTransport,\n networkEnv,\n packageTlsEngine,\n writeCaFile,\n} from './kernel/net/network.ts';\nimport type { CaStore, RealmCa } from './kernel/net/realm-ca.ts';\nimport type { RealmTransport } from './kernel/net/transport.ts';\nimport type { ForkState, WasmProgram } from './kernel/protocol.ts';\nimport { PtyTable } from './kernel/pty.ts';\nimport { LoopbackNet } from './kernel/socket.ts';\nimport { KernelTty } from './kernel/tty.ts';\nimport {\n type ForeignResults,\n foreignImports,\n type ImportedMemory,\n importedMemory,\n} from './process/wasi/wasi-module.ts';\n\nexport interface LauncherOptions {\n fs: KernelFs;\n createWorker: () => WasmWorkerLike;\n modules?: string;\n env?: Record<string, string>;\n transport?: RealmTransport;\n caStore?: CaStore;\n}\n\nexport interface RunOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: Uint8Array;\n onStdout?: (bytes: Uint8Array) => void;\n onStderr?: (bytes: Uint8Array) => void;\n}\n\nexport interface TerminalOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n onData: (bytes: Uint8Array) => void;\n}\n\nexport interface TerminalSession {\n pid: number;\n exited: Promise<number>;\n write(bytes: Uint8Array): void;\n resize(cols: number, rows: number): void;\n signal(sig: number): void;\n close(): void;\n}\n\nexport interface RunResult {\n status: number;\n stdout: Uint8Array;\n stderr: Uint8Array;\n}\n\ninterface Target {\n abi: Abi;\n glue: string;\n wasm: string;\n argv0: string;\n prefix?: string[];\n env?: Record<string, string>;\n unset?: string[];\n imports?: string;\n}\n\ninterface Compiled {\n module: WebAssembly.Module;\n memory?: ImportedMemory;\n foreign?: ForeignResults | undefined;\n}\n\ninterface Planned {\n target: Target;\n args: string[];\n}\n\ninterface StartRequest {\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n report: (message: string) => void;\n ppid?: number;\n fork?: ForkState;\n}\n\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst PACKAGE_ROOT = /^(.*\\/node_modules\\/(?:@[^/]+\\/)?[^/]+)\\//;\nconst ENV_REFERENCE = /\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\nconst WASM_MAGIC = [0x00, 0x61, 0x73, 0x6d];\nconst SHEBANG_MAX = 256;\nconst NOT_FOUND = 127;\nconst SHARED_DIRS = ['/tmp', '/home'];\nconst encoder = new TextEncoder();\n\nfunction baseName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction modulePath(glue: string): string {\n return glue.endsWith('.js') ? `${glue.slice(0, -3)}.wasm` : `${glue}.wasm`;\n}\n\nfunction isWasm(bytes: Uint8Array): boolean {\n return WASM_MAGIC.every((b, i) => bytes[i] === b);\n}\n\nfunction shebang(head: Uint8Array): string[] | undefined {\n if (head[0] !== 0x23 || head[1] !== 0x21) return undefined;\n return new TextDecoder()\n .decode(head.subarray(0, SHEBANG_MAX))\n .slice(2)\n .split('\\n')[0]\n .trim()\n .split(/[ \\t]+/);\n}\n\nfunction interpreter(head: Uint8Array): string {\n const words = shebang(head);\n if (!words) return 'node';\n if (baseName(words[0]) === 'env') words.shift();\n if (words[0] === '-S') words.shift();\n return baseName(words[0] ?? '');\n}\n\nexport function expandDefaults(\n defaults: Readonly<Record<string, string>> | undefined,\n env: Readonly<Record<string, string>>\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(defaults ?? {})) {\n let missing = false;\n const expanded = value.replace(ENV_REFERENCE, (_, name: string) => {\n const set = Object.hasOwn(env, name) ? env[name] : undefined;\n if (set === undefined) missing = true;\n return set ?? '';\n });\n if (!missing) out[key] = expanded;\n }\n return out;\n}\n\nfunction targetOf(command: Command): Target {\n return {\n abi: command.abi,\n glue: command.glue,\n wasm: command.wasm,\n argv0: command.argv0,\n ...(command.args ? { prefix: command.args } : {}),\n ...(command.env ? { env: command.env } : {}),\n ...(command.unset ? { unset: command.unset } : {}),\n ...(command.imports ? { imports: command.imports } : {}),\n };\n}\n\nfunction childHandle(handle: WasmProcessHandle): ChildHandle {\n return {\n pid: handle.pid,\n exited: handle.exited,\n termsig: handle.termsig,\n onState: (listener) => handle.onState(listener),\n };\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, chunk) => n + chunk.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\nexport class Launcher {\n readonly fs: KernelFs;\n private readonly base: KernelFs;\n private readonly createWorker: () => WasmWorkerLike;\n private readonly modulesDir: string;\n private readonly env: Record<string, string>;\n private catalog: Promise<Map<string, Command>> | undefined;\n private readonly compiled = new Map<string, Promise<Compiled>>();\n private readonly processes = new Map<number, WasmProcessHandle>();\n private readonly zombies = new Set<number>();\n private readonly orphans = new Set<number>();\n private readonly jobs = new JobTable();\n private readonly locks = new LockTable();\n private readonly ptys = new PtyTable((tty, sig) => this.jobs.signalOwnedForeground(tty, sig));\n readonly net = new LoopbackNet();\n private readonly ca: () => Promise<RealmCa>;\n private readonly transport: RealmTransport;\n private nextPid = 1000;\n private terminals = 0;\n\n constructor(options: LauncherOptions) {\n this.base = options.fs;\n this.createWorker = options.createWorker;\n this.modulesDir = options.modules ?? '/node_modules';\n this.env = { ...networkEnv(), ...options.env };\n this.ca = kernelCa(options.caStore ?? memoryCaStore());\n this.transport = options.transport ?? missingTransport();\n enableNetwork(this.net, {\n transport: this.transport,\n engine: kernelTlsEngine(packageTlsEngine(options.fs, this.modulesDir)),\n ca: this.ca,\n });\n this.fs = withCommandDirs(options.fs, async () => new Set((await this.commands()).keys()));\n }\n\n commands(): Promise<Map<string, Command>> {\n this.catalog ??= scanCommands(this.base, this.modulesDir);\n return this.catalog;\n }\n\n async resolve(file: string, argv0: string, cwd: string): Promise<Target | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name !== undefined) {\n const command = (await this.commands()).get(name);\n return command && !command.script ? targetOf(command) : undefined;\n }\n const glue = await followLinks(this.base, this.fs.resolvePath(cwd, file));\n const linked = COMMAND.exec(glue)?.[1];\n if (linked !== undefined) return this.resolve(`/bin/${linked}`, argv0, cwd);\n const head = await this.head(glue);\n if (!head) return undefined;\n if (isWasm(head)) {\n return {\n abi: 'wasi',\n glue,\n wasm: glue,\n argv0: baseName(argv0 || file).replace(/\\.wasm$/, ''),\n };\n }\n if (interpreter(head) !== 'node') return undefined;\n const wasm = modulePath(glue);\n if (!(await this.base.exists(wasm))) return undefined;\n return { abi: 'emscripten', glue, wasm, argv0: baseName(argv0 || file) };\n }\n\n private async head(path: string): Promise<Uint8Array | undefined> {\n try {\n return (await this.base.readFileBuffer(path)).subarray(0, SHEBANG_MAX);\n } catch {\n return undefined;\n }\n }\n\n private async scriptCommand(file: string): Promise<Command | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name === undefined) return undefined;\n const command = (await this.commands()).get(name);\n return command?.script ? command : undefined;\n }\n\n private async interpreted(\n file: string,\n argv: string[],\n cwd: string\n ): Promise<Planned | undefined> {\n const command = await this.scriptCommand(file);\n const script = command?.script ?? this.fs.resolvePath(cwd, file);\n const words = shebang((await this.head(script)) ?? new Uint8Array());\n if (!words) return undefined;\n if (baseName(words[0]) === 'env') words.shift();\n const [interp, ...rest] = words;\n const found = interp ? await this.resolve(interp, interp, cwd) : undefined;\n if (!found) return undefined;\n const target = command\n ? {\n ...found,\n env: { ...found.env, ...command.env },\n unset: [...(found.unset ?? []), ...(command.unset ?? [])],\n }\n : found;\n const arg = rest.join(' ');\n return {\n target,\n args: [\n ...(target.prefix ?? []),\n ...(arg ? [arg] : []),\n command ? script : file,\n ...argv.slice(1),\n ],\n };\n }\n\n private async plan(file: string, argv: string[], cwd: string): Promise<Planned | undefined> {\n const direct = await this.resolve(file, argv[0] ?? file, cwd);\n if (direct) return { target: direct, args: [...(direct.prefix ?? []), ...argv.slice(1)] };\n return this.interpreted(file, argv, cwd);\n }\n\n private async unrunnable(file: string, cwd: string): Promise<'ENOEXEC' | 'ENOENT'> {\n const head = await this.base.readFileBuffer(this.fs.resolvePath(cwd, file)).catch(() => null);\n return head && !(head[0] === 0x23 && head[1] === 0x21) ? 'ENOEXEC' : 'ENOENT';\n }\n\n private module(path: string): Promise<Compiled> {\n return this.base.stat(path).then((st) => {\n const key = `${path}:${st.size}:${st.mtime.getTime()}`;\n let module = this.compiled.get(key);\n if (!module) {\n module = this.base.readFileBuffer(path).then(async (bytes) => {\n const memory = importedMemory(bytes);\n const foreign = foreignImports(bytes);\n const compiled = await WebAssembly.compile(bytes as BufferSource);\n return {\n module: compiled,\n ...(memory ? { memory } : {}),\n foreign,\n };\n });\n this.compiled.set(key, module);\n module.catch(() => this.compiled.delete(key));\n }\n return module;\n });\n }\n\n private async names(path: string, module: WebAssembly.Module): Promise<string | undefined> {\n if (WebAssembly.Module.customSections(module, 'name').length > 0) return undefined;\n const beside = `${path}.names`;\n if (await this.base.exists(beside)) return beside;\n const root = PACKAGE_ROOT.exec(path)?.[1];\n if (root === undefined) return undefined;\n const optional = `${root}-names${beside.slice(root.length)}`;\n return (await this.base.exists(optional)) ? optional : undefined;\n }\n\n private async program(target: Target, env: Record<string, string>): Promise<WasmProgram> {\n if (target.abi !== 'wasi') {\n const [glue, { module }] = await Promise.all([\n this.base.readFile(target.glue),\n this.module(target.wasm),\n ]);\n return { glue, module };\n }\n const { module, memory, foreign } = await this.module(target.wasm);\n const names =\n env.SLICC_WASM_BACKTRACE === '1' ? await this.names(target.wasm, module) : undefined;\n const imports = target.imports ? await this.base.readFile(target.imports) : undefined;\n return {\n abi: 'wasi',\n glue: '',\n module,\n ...(memory ? { memory } : {}),\n foreign,\n ...(names ? { names } : {}),\n ...(imports !== undefined ? { imports } : {}),\n };\n }\n\n private async launch(\n planned: Planned,\n req: Omit<StartRequest, 'program' | 'argv0' | 'args'>\n ): Promise<WasmProcessHandle> {\n const { target, args } = planned;\n const env = { ...expandDefaults(target.env, { ...req.env, cwd: req.cwd }), ...req.env };\n for (const key of target.unset ?? []) delete env[key];\n let program: WasmProgram;\n try {\n program = await this.program(target, env);\n } catch (err) {\n await req.fds.closeAll();\n throw err;\n }\n return this.start({ ...req, program, argv0: target.argv0, args, env });\n }\n\n private start(req: StartRequest): WasmProcessHandle {\n const pid = this.nextPid++;\n const terminal = req.fds.stdioTerminal();\n const handle = spawnWasmProcess({\n pid,\n program: req.program,\n argv0: req.argv0,\n args: req.args,\n env: req.env,\n cwd: req.cwd,\n fds: req.fds,\n fs: this.fs,\n createWorker: this.createWorker,\n onError: req.report,\n spawner: this.spawner(pid, req.report),\n forker: this.forker(pid, req),\n kill: (target, sig) => this.kill(target, sig),\n jobs: this.jobs,\n ptys: this.ptys,\n net: this.net,\n http: new HttpHandles(this.transport),\n locks: this.locks,\n onReap: (child) => this.reaped(child),\n ...(req.fork ? { fork: req.fork } : {}),\n ...(req.ppid !== undefined ? { ppid: req.ppid } : {}),\n });\n this.processes.set(pid, handle);\n this.jobs.add(pid, req.ppid, (sig) => handle.signal(sig), terminal);\n void handle.exited.then(() => {\n this.processes.delete(pid);\n if (req.ppid === undefined || this.orphans.delete(pid)) this.jobs.remove(pid);\n else this.zombies.add(pid);\n });\n return handle;\n }\n\n private reaped(pid: number): void {\n if (this.zombies.delete(pid)) this.jobs.remove(pid);\n else this.orphans.add(pid);\n }\n\n private spawner(ppid: number, report: (message: string) => void): ChildSpawner {\n return async (req, fds) => {\n const planned = await this.plan(req.file, req.argv, req.cwd);\n if (!planned) {\n await fds.closeAll();\n throw new SpawnError(await this.unrunnable(req.file, req.cwd));\n }\n const handle = await this.launch(planned, { env: req.env, cwd: req.cwd, fds, report, ppid });\n return childHandle(handle);\n };\n }\n\n private forker(ppid: number, parent: StartRequest): ChildForker {\n return async (state, fds) =>\n childHandle(this.start({ ...parent, cwd: state.cwd ?? parent.cwd, fds, ppid, fork: state }));\n }\n\n kill(pid: number, sig: number): boolean {\n if (pid < 0) return this.jobs.killGroup(-pid, sig);\n const handle = this.processes.get(pid);\n if (!handle) return false;\n if (sig !== 0) handle.signal(sig);\n return true;\n }\n\n async prepare(): Promise<void> {\n for (const dir of SHARED_DIRS) await this.base.mkdir(dir, { recursive: true });\n await writeCaFile(this.base, this.ca).catch(() => undefined);\n }\n\n private environment(cwd: string, extra: Record<string, string> | undefined) {\n return { PATH: '/usr/bin:/bin', HOME: '/home', ...this.env, PWD: cwd, ...extra };\n }\n\n private async starting(argv: string[], dir: string | undefined) {\n this.catalog = undefined;\n const cwd = this.fs.resolvePath('/', dir ?? '/');\n const [file = ''] = argv;\n await this.base.mkdir(cwd, { recursive: true });\n return { cwd, file, planned: await this.plan(file, argv, cwd) };\n }\n\n async openTerminal(argv: string[], options: TerminalOptions): Promise<TerminalSession> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n if (!planned) throw new Error(`${file}: command not found`);\n let leader = 0;\n const tty: KernelTty = new KernelTty(\n { write: (bytes) => options.onData(bytes.slice()) },\n (sig) => this.jobs.signalForeground(tty, leader, sig)\n );\n tty.name = `/dev/tty${++this.terminals}`;\n tty.setSize(options.cols ?? 80, options.rows ?? 24);\n const fds = new FdTable();\n const stdio = tty.file();\n fds.installAt(0, stdio);\n fds.installAt(1, stdio.retain());\n fds.installAt(2, stdio.retain());\n const env = this.environment(cwd, {\n TERM: 'xterm-256color',\n COLORTERM: 'truecolor',\n ...options.env,\n });\n const report = (message: string) => options.onData(encoder.encode(`${message}\\r\\n`));\n const handle = await this.launch(planned, { env, cwd, fds, report });\n leader = handle.pid;\n void handle.exited.then(() => tty.hangup());\n return {\n pid: handle.pid,\n exited: handle.exited,\n write: (bytes) => tty.receive(bytes),\n resize: (cols, rows) => tty.resize(cols, rows),\n signal: (sig) => this.jobs.signalForeground(tty, leader, sig),\n close: () => {\n tty.signalHangup();\n tty.hangup();\n },\n };\n }\n\n async run(argv: string[], options: RunOptions = {}): Promise<RunResult> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n const env = this.environment(cwd, options.env);\n const out: Uint8Array[] = [];\n const err: Uint8Array[] = [];\n const collect =\n (chunks: Uint8Array[], tee?: (bytes: Uint8Array) => void) => (bytes: Uint8Array) => {\n chunks.push(bytes);\n tee?.(bytes);\n };\n const stdout = collect(out, options.onStdout);\n const stderr = collect(err, options.onStderr);\n const report = (message: string) => stderr(encoder.encode(`${message}\\n`));\n if (!planned) {\n report(`${file}: command not found`);\n return { status: NOT_FOUND, stdout: concat(out), stderr: concat(err) };\n }\n const fds = new FdTable();\n fds.installAt(0, options.stdin ? bytesSource(options.stdin) : nullFile());\n fds.installAt(1, sinkFile(stdout));\n fds.installAt(2, sinkFile(stderr));\n const handle = await this.launch(planned, { env, cwd, fds, report });\n const status = await handle.exited;\n return { status, stdout: concat(out), stderr: concat(err) };\n }\n}\n", "import { META_DB, type MetaStore } from './fs/meta.ts';\nimport { OpfsFs } from './fs/opfs.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport { caStore } from './kernel/net/network.ts';\nimport { RemoteTransport, type TransportReply } from './kernel/net/remote-transport.ts';\nimport type { RealmTransportTraits } from './kernel/net/transport.ts';\nimport { SIG } from './kernel/signals.ts';\nimport {\n Launcher,\n type RunOptions,\n type TerminalOptions,\n type TerminalSession,\n} from './launcher.ts';\n\nexport interface KernelPort {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface InitRequest {\n id: number;\n op: 'init';\n root?: FileSystemDirectoryHandle;\n modules?: string;\n env?: Record<string, string>;\n metadata?: string | false;\n transport?: RealmTransportTraits;\n}\n\nexport interface RunRequest {\n id: number;\n op: 'run';\n argv: string[];\n options: Omit<RunOptions, 'onStdout' | 'onStderr'>;\n}\n\nexport interface OpenTerminalRequest {\n id: number;\n op: 'open-terminal';\n argv: string[];\n options: Omit<TerminalOptions, 'onData'>;\n}\n\nexport type TerminalAction =\n | { action: 'write'; bytes: Uint8Array }\n | { action: 'resize'; cols: number; rows: number }\n | { action: 'signal'; signal: string }\n | { action: 'close' };\n\nexport type TerminalRequest = { id: number; op: 'terminal'; terminal: number } & TerminalAction;\n\nexport type KernelRequest = InitRequest | RunRequest | OpenTerminalRequest | TerminalRequest;\n\ntype WithoutId<T> = T extends unknown ? Omit<T, 'id'> : never;\n\nexport type KernelCall = WithoutId<KernelRequest>;\n\nexport interface ServeDeps {\n storage: () => Promise<FileSystemDirectoryHandle>;\n createWorker: () => WasmWorkerLike;\n metadata?: (name: string) => Promise<MetaStore>;\n}\n\nexport function signalNumber(name: string): number {\n const key = name.slice(3);\n if (!name.startsWith('SIG') || !Object.hasOwn(SIG, key))\n throw new Error(`unknown signal ${name}`);\n return (SIG as Record<string, number>)[key];\n}\n\nfunction act(session: TerminalSession, req: TerminalAction): void {\n if (req.action === 'write') session.write(req.bytes);\n else if (req.action === 'resize') session.resize(req.cols, req.rows);\n else if (req.action === 'signal') session.signal(signalNumber(req.signal));\n else session.close();\n}\n\nfunction dirsChannel(name: string | false): string | undefined {\n return name === false ? undefined : `slicc-kernel-dirs:${name}`;\n}\n\nexport function serveKernel(port: KernelPort, deps: ServeDeps): void {\n let launcher: Promise<Launcher> | undefined;\n let remote: RemoteTransport | undefined;\n const terminals = new Map<number, TerminalSession>();\n const reply = (id: number, body: object) => port.postMessage({ id, ...body });\n\n async function ready(): Promise<Launcher> {\n if (!launcher) throw new Error('the kernel is not initialized');\n return launcher;\n }\n\n async function terminal(req: OpenTerminalRequest): Promise<number> {\n const onData = (bytes: Uint8Array) => reply(req.id, { fd: 1, bytes });\n const session = await (await ready()).openTerminal(req.argv, { ...req.options, onData });\n terminals.set(req.id, session);\n reply(req.id, { started: session.pid });\n try {\n return await session.exited;\n } finally {\n terminals.delete(req.id);\n }\n }\n\n async function handle(req: KernelRequest): Promise<unknown> {\n if (req.op === 'init') {\n launcher = (req.root ? Promise.resolve(req.root) : deps.storage()).then(async (root) => {\n const name = req.metadata ?? META_DB;\n const meta = name === false ? undefined : await deps.metadata?.(name);\n remote = req.transport ? new RemoteTransport(port, req.transport) : undefined;\n const fs = new OpfsFs(root, meta, dirsChannel(name));\n await fs.reconcile();\n const started = new Launcher({\n fs,\n createWorker: deps.createWorker,\n ...(req.modules ? { modules: req.modules } : {}),\n ...(req.env ? { env: req.env } : {}),\n ...(remote ? { transport: remote } : {}),\n caStore: caStore(deps.metadata ? name : false),\n });\n await started.prepare();\n return started;\n });\n await launcher;\n return true;\n }\n if (req.op === 'open-terminal') return terminal(req);\n if (req.op === 'terminal') {\n const session = terminals.get(req.terminal);\n if (!session) throw new Error(`no terminal ${req.terminal}`);\n act(session, req);\n return true;\n }\n return (await ready()).run(req.argv, {\n ...req.options,\n onStdout: (bytes) => reply(req.id, { fd: 1, bytes }),\n onStderr: (bytes) => reply(req.id, { fd: 2, bytes }),\n });\n }\n\n port.addEventListener('message', (event) => {\n if ((event.data as { net?: unknown }).net !== undefined) {\n remote?.receive(event.data as TransportReply);\n return;\n }\n const req = event.data as KernelRequest;\n handle(req).then(\n (result) => reply(req.id, { result }),\n (err) => reply(req.id, { error: err instanceof Error ? err.message : String(err) })\n );\n });\n}\n", "import { openMeta } from './fs/meta.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport { pinScript } from './pin.ts';\nimport { type KernelPort, serveKernel } from './serve.ts';\n\nconst processWorker = pinScript(new URL('./process-worker.js', import.meta.url));\n\nserveKernel(globalThis as unknown as KernelPort, {\n storage: () => navigator.storage.getDirectory(),\n createWorker: () => new Worker(processWorker, { type: 'module' }) as WasmWorkerLike,\n metadata: (name) => openMeta(name, indexedDB),\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["missing", "request", "name", "request", "name", "parentOf", "link", "time", "children", "moved", "chunk", "message", "chunk", "name", "length", "done", "name", "message", "concat", "contents", "missing", "name", "message", "name", "pem", "message", "request", "name", "S_IFDIR", "S_IFREG", "MAX_LINKS", "missing", "children", "name", "concat", "chunk", "done", "message", "name", "header", "chunk", "settle", "json", "done", "run", "encoder", "dropped", "utf8", "translate", "chunk", "chunk", "json", "done", "interrupted", "link", "canonicalHost", "name", "json", "within", "contents", "moved", "ready", "header", "settle", "done", "name", "name", "COMMAND", "encoder", "missing", "name", "set", "concat", "chunk", "module", "message", "name", "ready", "name"]
|
|
7
7
|
}
|