sandboxedjs 0.1.47 → 0.1.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/python/host-abi.ts","../src/runtime/python/protocol.ts","../src/runtime/python/syscall-client.ts","../src/runtime/python/sync-transport.ts","../src/runtime/python/sbxfs.ts","../src/runtime/python/worker-entry.ts","../src/runtime/python/worker.ts"],"names":[],"mappings":"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","file":"python-worker.js","sourcesContent":["/* Generated by python-runtime/scripts/generate_abi.py from abi/host-v1.json. Do not edit. */\n\n/** Protocol version carried in every frame. */\nexport const SBX_HOST_ABI_VERSION = 1;\n\nexport const SBX_REQUEST_HEADER_BYTES = 16;\nexport const SBX_RESPONSE_HEADER_BYTES = 20;\n\n/** Operation codes. Families are 256 apart so a family stays contiguous. */\nexport const Op = {\n handshake: 0,\n openat: 1,\n close: 2,\n read: 3,\n write: 4,\n pread: 5,\n pwrite: 6,\n lseek: 7,\n fstat: 8,\n statat: 9,\n ftruncate: 10,\n renameat: 11,\n unlinkat: 12,\n mkdirat: 13,\n readlinkat: 14,\n symlinkat: 15,\n getdents: 16,\n fsync: 17,\n dup: 256,\n dup2: 257,\n get_flags: 258,\n set_flags: 259,\n pipe: 512,\n poll: 768,\n clock_gettime: 1024,\n sleep: 1025,\n getpid: 1280,\n getcwd: 1281,\n chdir: 1282,\n environ: 1283,\n getrandom: 1536,\n} as const;\n\nexport type OpCode = (typeof Op)[keyof typeof Op];\n\n/** Canonical (Linux/musl) errno values. A negative status is `-Errno.X`. */\nexport const Errno = {\n EPERM: 1,\n ENOENT: 2,\n ESRCH: 3,\n EINTR: 4,\n EIO: 5,\n ENXIO: 6,\n E2BIG: 7,\n EBADF: 9,\n EAGAIN: 11,\n ENOMEM: 12,\n EACCES: 13,\n EFAULT: 14,\n EBUSY: 16,\n EEXIST: 17,\n EXDEV: 18,\n ENODEV: 19,\n ENOTDIR: 20,\n EISDIR: 21,\n EINVAL: 22,\n ENFILE: 23,\n EMFILE: 24,\n ENOTTY: 25,\n EFBIG: 27,\n ENOSPC: 28,\n ESPIPE: 29,\n EROFS: 30,\n EMLINK: 31,\n EPIPE: 32,\n ERANGE: 34,\n ENAMETOOLONG: 36,\n ENOSYS: 38,\n ENOTEMPTY: 39,\n ELOOP: 40,\n ENODATA: 61,\n EPROTO: 71,\n EOVERFLOW: 75,\n ETIMEDOUT: 110,\n ECANCELED: 125,\n EDQUOT: 122,\n} as const;\n\nexport type ErrnoName = keyof typeof Errno;\n\n/** Capability names a host may advertise in its handshake. */\nexport const CAPABILITIES = [\"files\", \"descriptors\", \"pipes\", \"readiness\", \"time\", \"identity\", \"entropy\", \"sockets\", \"processes\", \"signals\", \"storage\", \"services\", \"threads\"] as const;\n\nexport type Capability = (typeof CAPABILITIES)[number];\n\n/** Names by code, for diagnostics. Never used for dispatch. */\nexport const OP_NAMES: Record<number, string> = Object.fromEntries(\n Object.entries(Op).map(([name, code]) => [code, name]),\n);\n\nexport const ERRNO_NAMES: Record<number, string> = Object.fromEntries(\n Object.entries(Errno).map(([name, code]) => [code, name]),\n);\n","/**\n * Framing for the host ABI.\n *\n * Every field is fixed-width and little-endian, because the two sides are\n * compiled by different toolchains and a shared struct layout is the one thing\n * they cannot negotiate at runtime. Text is UTF-8; file content and network\n * traffic are raw bytes and are never decoded in transit.\n *\n * `request_id` and `process_generation` exist so a late answer can be\n * recognised as late. A worker that exits and is replaced must not have its\n * successor accept a completion addressed to the process before it, and the\n * failure mode for a mismatched frame is an error — never an empty success.\n */\n\nimport {\n Errno, OP_NAMES, SBX_HOST_ABI_VERSION, SBX_REQUEST_HEADER_BYTES, SBX_RESPONSE_HEADER_BYTES,\n} from \"./host-abi.js\";\n\nexport interface RequestHeader {\n version: number;\n op: number;\n requestId: number;\n generation: number;\n}\n\nexport interface ResponseFrame {\n header: RequestHeader;\n status: number;\n payload: Uint8Array;\n}\n\nexport class ProtocolError extends Error {\n readonly code = \"ERR_SBX_ABI_PROTOCOL\";\n}\n\nexport function encodeRequest(header: RequestHeader, payload: Uint8Array): Uint8Array {\n const frame = new Uint8Array(SBX_REQUEST_HEADER_BYTES + payload.length);\n const view = new DataView(frame.buffer);\n view.setUint16(0, header.version, true);\n view.setUint16(2, header.op, true);\n view.setUint32(4, header.requestId, true);\n view.setUint32(8, header.generation, true);\n view.setUint32(12, payload.length, true);\n frame.set(payload, SBX_REQUEST_HEADER_BYTES);\n return frame;\n}\n\nexport function decodeRequest(frame: Uint8Array): { header: RequestHeader; payload: Uint8Array } {\n if (frame.length < SBX_REQUEST_HEADER_BYTES) throw new ProtocolError(\"short request frame\");\n const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);\n const header: RequestHeader = {\n version: view.getUint16(0, true),\n op: view.getUint16(2, true),\n requestId: view.getUint32(4, true),\n generation: view.getUint32(8, true),\n };\n const length = view.getUint32(12, true);\n if (frame.length - SBX_REQUEST_HEADER_BYTES < length) {\n throw new ProtocolError(`truncated payload for ${OP_NAMES[header.op] ?? header.op}`);\n }\n return {\n header,\n payload: frame.subarray(SBX_REQUEST_HEADER_BYTES, SBX_REQUEST_HEADER_BYTES + length),\n };\n}\n\nexport function encodeResponse(header: RequestHeader, status: number, payload: Uint8Array): Uint8Array {\n const frame = new Uint8Array(SBX_RESPONSE_HEADER_BYTES + payload.length);\n const view = new DataView(frame.buffer);\n view.setUint16(0, header.version, true);\n view.setUint16(2, header.op, true);\n view.setUint32(4, header.requestId, true);\n view.setUint32(8, header.generation, true);\n view.setInt32(12, status, true);\n view.setUint32(16, payload.length, true);\n frame.set(payload, SBX_RESPONSE_HEADER_BYTES);\n return frame;\n}\n\nexport function decodeResponse(frame: Uint8Array, expected?: RequestHeader): ResponseFrame {\n if (frame.length < SBX_RESPONSE_HEADER_BYTES) {\n /* An empty or short frame means the transport failed. Reporting it as a\n * zero-byte success is how a dead host turns into silent data loss. */\n throw new ProtocolError(\"the host ABI transport returned an incomplete frame\");\n }\n const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);\n const header: RequestHeader = {\n version: view.getUint16(0, true),\n op: view.getUint16(2, true),\n requestId: view.getUint32(4, true),\n generation: view.getUint32(8, true),\n };\n const status = view.getInt32(12, true);\n const length = view.getUint32(16, true);\n if (frame.length - SBX_RESPONSE_HEADER_BYTES < length) throw new ProtocolError(\"truncated response payload\");\n if (expected) {\n if (header.requestId !== expected.requestId) throw new ProtocolError(\"stale response: request id mismatch\");\n if (header.generation !== expected.generation) throw new ProtocolError(\"stale response: process generation mismatch\");\n if (header.op !== expected.op) throw new ProtocolError(\"response answers a different operation\");\n }\n if (header.version !== SBX_HOST_ABI_VERSION) {\n throw new ProtocolError(`host ABI version ${header.version}, expected ${SBX_HOST_ABI_VERSION}`);\n }\n return {\n header,\n status,\n payload: frame.subarray(SBX_RESPONSE_HEADER_BYTES, SBX_RESPONSE_HEADER_BYTES + length),\n };\n}\n\n/** Little-endian reader over a payload. Bounds-checked: the guest owns this memory. */\nexport class Reader {\n private at = 0;\n private readonly view: DataView;\n private readonly bytes: Uint8Array;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n\n private need(count: number): number {\n if (this.at + count > this.bytes.length) throw new ProtocolError(\"payload underrun\");\n const offset = this.at;\n this.at += count;\n return offset;\n }\n\n i32(): number { return this.view.getInt32(this.need(4), true); }\n u32(): number { return this.view.getUint32(this.need(4), true); }\n i64(): number { return Number(this.view.getBigInt64(this.need(8), true)); }\n u64(): number { return Number(this.view.getBigUint64(this.need(8), true)); }\n bytes32(): Uint8Array {\n const length = this.u32();\n const offset = this.need(length);\n return this.bytes.subarray(offset, offset + length);\n }\n string(): string { return new TextDecoder().decode(this.bytes32()); }\n get remaining(): number { return this.bytes.length - this.at; }\n}\n\n/** Little-endian writer. Grows as needed; payload sizes are bounded by the caller. */\nexport class Writer {\n private parts: Uint8Array[] = [];\n\n i32(value: number): this { const b = new Uint8Array(4); new DataView(b.buffer).setInt32(0, value, true); this.parts.push(b); return this; }\n u32(value: number): this { const b = new Uint8Array(4); new DataView(b.buffer).setUint32(0, value >>> 0, true); this.parts.push(b); return this; }\n i64(value: number): this { const b = new Uint8Array(8); new DataView(b.buffer).setBigInt64(0, BigInt(Math.trunc(value)), true); this.parts.push(b); return this; }\n u64(value: number): this { const b = new Uint8Array(8); new DataView(b.buffer).setBigUint64(0, BigInt(Math.trunc(value)), true); this.parts.push(b); return this; }\n bytes32(value: Uint8Array): this { this.u32(value.length); this.parts.push(value); return this; }\n string(value: string): this { return this.bytes32(new TextEncoder().encode(value)); }\n\n finish(): Uint8Array {\n const total = this.parts.reduce((sum, part) => sum + part.length, 0);\n const out = new Uint8Array(total);\n let at = 0;\n for (const part of this.parts) { out.set(part, at); at += part.length; }\n return out;\n }\n}\n\n/** A status the guest reads as `-errno`. */\nexport function failure(errno: number): number {\n return -Math.abs(errno);\n}\n\nexport const EOK = 0;\nexport { Errno };\n","/**\n * The guest side of the host ABI, as the compiled code sees it.\n *\n * Compiled programs reach this through `sbx_host_call` in\n * `python-runtime/native/js/library_sbx.js`, which copies a frame out of the\n * module's memory, calls {@link HostAbiClient.callRaw}, and copies the answer\n * back. The typed methods below are for the JavaScript side of the worker —\n * loaders, the probe harness, and tests — which need the same operations\n * without going through Wasm memory.\n */\n\nimport { Errno, ERRNO_NAMES, OP_NAMES, Op, SBX_HOST_ABI_VERSION } from \"./host-abi.js\";\nimport { Reader, Writer, decodeResponse, encodeRequest, type RequestHeader } from \"./protocol.js\";\nimport type { HostCallClient } from \"./sync-transport.js\";\n\nexport class HostAbiError extends Error {\n errno: number;\n code: string;\n constructor(errno: number, op: number) {\n const name = ERRNO_NAMES[errno] ?? String(errno);\n super(`${OP_NAMES[op] ?? `op ${op}`} failed: ${name}`);\n this.errno = errno;\n this.code = name;\n }\n}\n\nexport interface HostAbiResult {\n status: number;\n payload: Uint8Array;\n}\n\n/**\n * One process's connection to the kernel.\n *\n * `generation` is stamped into every frame and checked on the way back, so a\n * completion belonging to a previous incarnation of this PID is rejected rather\n * than applied to the wrong descriptor table.\n */\nexport class HostAbiClient {\n private transport: HostCallClient;\n private generation: number;\n private nextRequestId = 1;\n\n constructor(transport: HostCallClient, generation: number) {\n this.transport = transport;\n this.generation = generation;\n }\n\n /** Send one frame, blocking. Returns the status and payload verbatim. */\n callRaw(op: number, payload: Uint8Array): HostAbiResult {\n const header: RequestHeader = {\n version: SBX_HOST_ABI_VERSION,\n op,\n requestId: this.nextRequestId++,\n generation: this.generation,\n };\n const frame = this.transport.call(encodeRequest(header, payload));\n const response = decodeResponse(frame, header);\n return { status: response.status, payload: response.payload };\n }\n\n /** As {@link callRaw}, but a negative status becomes an exception. */\n private call(op: number, payload: Uint8Array): HostAbiResult {\n const result = this.callRaw(op, payload);\n if (result.status < 0) throw new HostAbiError(-result.status, op);\n return result;\n }\n\n handshake(): { version: number; capabilities: Record<string, boolean> } {\n const { payload } = this.call(Op.handshake, new Uint8Array());\n const r = new Reader(payload);\n const version = r.u32();\n const count = r.u32();\n const capabilities: Record<string, boolean> = {};\n for (let i = 0; i < count; i += 1) capabilities[r.string()] = r.u32() === 1;\n return { version, capabilities };\n }\n\n open(path: string, flags: number, mode = 0o666): number {\n return this.call(Op.openat, new Writer().string(path).u32(flags).u32(mode).finish()).status;\n }\n\n close(fd: number): void {\n this.call(Op.close, new Writer().i32(fd).finish());\n }\n\n read(fd: number, length: number): Uint8Array {\n return this.call(Op.read, new Writer().i32(fd).u32(length).finish()).payload;\n }\n\n write(fd: number, data: Uint8Array): number {\n return this.call(Op.write, new Writer().i32(fd).bytes32(data).finish()).status;\n }\n\n /** Write every byte, looping over short writes the way a guest's libc must. */\n writeAll(fd: number, data: Uint8Array): void {\n let at = 0;\n while (at < data.length) at += this.write(fd, data.subarray(at));\n }\n\n pread(fd: number, length: number, offset: number): Uint8Array {\n return this.call(Op.pread, new Writer().i32(fd).u32(length).u64(offset).finish()).payload;\n }\n\n pwrite(fd: number, data: Uint8Array, offset: number): number {\n return this.call(Op.pwrite, new Writer().i32(fd).bytes32(data).u64(offset).finish()).status;\n }\n\n seek(fd: number, offset: number, whence: number): number {\n const { payload } = this.call(Op.lseek, new Writer().i32(fd).i64(offset).u32(whence).finish());\n return new Reader(payload).i64();\n }\n\n fstat(fd: number): HostStat {\n return decodeStat(this.call(Op.fstat, new Writer().i32(fd).finish()).payload);\n }\n\n stat(path: string, followLinks = true): HostStat {\n return decodeStat(\n this.call(Op.statat, new Writer().string(path).u32(followLinks ? 1 : 0).finish()).payload,\n );\n }\n\n ftruncate(fd: number, length: number): void {\n this.call(Op.ftruncate, new Writer().i32(fd).u64(length).finish());\n }\n\n rename(from: string, to: string): void {\n this.call(Op.renameat, new Writer().string(from).string(to).finish());\n }\n\n unlink(path: string, removeDirectory = false): void {\n this.call(Op.unlinkat, new Writer().string(path).u32(removeDirectory ? 1 : 0).finish());\n }\n\n mkdir(path: string, mode = 0o777): void {\n this.call(Op.mkdirat, new Writer().string(path).u32(mode).finish());\n }\n\n readdir(fd: number, bufferSize = 4096): string[] {\n const { payload } = this.call(Op.getdents, new Writer().i32(fd).u32(bufferSize).finish());\n const text = new TextDecoder().decode(payload);\n return text.split(\"\\0\").filter((name) => name.length > 0);\n }\n\n dup(fd: number, from = 0): number {\n return this.call(Op.dup, new Writer().i32(fd).u32(from).finish()).status;\n }\n\n dup2(fd: number, target: number): number {\n return this.call(Op.dup2, new Writer().i32(fd).i32(target).finish()).status;\n }\n\n getFlags(fd: number): { flags: number; cloexec: boolean } {\n const r = new Reader(this.call(Op.get_flags, new Writer().i32(fd).finish()).payload);\n return { flags: r.u32(), cloexec: r.u32() === 1 };\n }\n\n setFlags(fd: number, flags: number, cloexec: boolean): void {\n this.call(Op.set_flags, new Writer().i32(fd).u32(flags).u32(cloexec ? 1 : 0).finish());\n }\n\n pipe(flags = 0): [number, number] {\n const r = new Reader(this.call(Op.pipe, new Writer().u32(flags).finish()).payload);\n return [r.i32(), r.i32()];\n }\n\n poll(entries: { fd: number; events: number }[], timeoutMs: number): { fd: number; revents: number }[] {\n const w = new Writer().u32(entries.length);\n for (const entry of entries) w.i32(entry.fd).u32(entry.events);\n w.i64(timeoutMs);\n const r = new Reader(this.call(Op.poll, w.finish()).payload);\n const count = r.u32();\n const out: { fd: number; revents: number }[] = [];\n for (let i = 0; i < count; i += 1) out.push({ fd: r.i32(), revents: r.u32() });\n return out;\n }\n\n clockGettime(monotonic: boolean): { seconds: number; nanos: number } {\n const r = new Reader(this.call(Op.clock_gettime, new Writer().u32(monotonic ? 1 : 0).finish()).payload);\n return { seconds: r.i64(), nanos: r.u32() };\n }\n\n sleep(nanos: number): void {\n this.call(Op.sleep, new Writer().u64(nanos).finish());\n }\n\n identity(): { pid: number; ppid: number; uid: number; gid: number; umask: number } {\n const r = new Reader(this.call(Op.getpid, new Uint8Array()).payload);\n return { pid: r.i32(), ppid: r.i32(), uid: r.u32(), gid: r.u32(), umask: r.u32() };\n }\n\n getcwd(): string {\n return new Reader(this.call(Op.getcwd, new Uint8Array()).payload).string();\n }\n\n chdir(path: string): void {\n this.call(Op.chdir, new Writer().string(path).finish());\n }\n\n environ(): Record<string, string> {\n const joined = new Reader(this.call(Op.environ, new Uint8Array()).payload).string();\n const out: Record<string, string> = {};\n for (const entry of joined.split(\"\\0\")) {\n if (!entry) continue;\n const split = entry.indexOf(\"=\");\n out[entry.slice(0, split)] = entry.slice(split + 1);\n }\n return out;\n }\n\n getrandom(length: number): Uint8Array {\n return this.call(Op.getrandom, new Writer().u32(length).finish()).payload;\n }\n}\n\nexport interface HostStat {\n ino: number;\n mode: number;\n size: number;\n uid: number;\n gid: number;\n nlink: number;\n atimeNs: number;\n mtimeNs: number;\n ctimeNs: number;\n}\n\nfunction decodeStat(payload: Uint8Array): HostStat {\n const r = new Reader(payload);\n return {\n ino: r.u64(), mode: r.u32(), size: r.u64(),\n uid: r.u32(), gid: r.u32(), nlink: r.u32(),\n atimeNs: r.i64(), mtimeNs: r.i64(), ctimeNs: r.i64(),\n };\n}\n\nexport { Errno, Op };\n","/**\n * The transport under the host ABI: one blocking client, one non-blocking host.\n *\n * This is deliberately not `runtime/sync-channel.ts`. That channel predates the\n * ABI and carries no request identity, so a late or duplicated answer is\n * indistinguishable from the right one; worse, its server answers a failed\n * handler with a zero-length frame, which a caller can only read as a\n * successful empty result. Both are acceptable for `spawnSync`, where the\n * payload is self-describing JSON, and neither is acceptable for `read()`,\n * where an empty result means end of input.\n *\n * So the framing here always carries a full response header, a transport\n * failure is always an error, and the client verifies that the answer it got\n * belongs to the question it asked.\n *\n * Only the client blocks, and the client never owns shared state. The host\n * services requests from its ordinary event loop and may take as long as it\n * likes — which is what lets a guest's synchronous `read()` wait for a\n * keystroke that has not been typed yet.\n */\n\n/* Control-word slots over shared memory. */\nconst STATE = 0;\nconst LENGTH = 1;\nconst MORE = 2;\nconst CONTROL_WORDS = 4;\n\nconst STATE_IDLE = 0;\nconst STATE_REQUEST = 1;\nconst STATE_RESPONSE = 2;\nconst STATE_CONTINUE = 3;\nconst STATE_CLOSED = 4;\n\n/** How long a blocked client sleeps before re-checking for a closed transport. */\nconst WAIT_SLICE_MS = 200;\n\nexport interface HostTransportBuffers {\n control: SharedArrayBuffer;\n data: SharedArrayBuffer;\n}\n\nexport function createHostTransportBuffers(windowBytes = 1 << 20): HostTransportBuffers {\n return {\n control: new SharedArrayBuffer(CONTROL_WORDS * Int32Array.BYTES_PER_ELEMENT),\n data: new SharedArrayBuffer(windowBytes),\n };\n}\n\n/**\n * Can this host support a blocking guest at all?\n *\n * `SharedArrayBuffer` needs cross-origin isolation in a browser, and\n * `Atomics.wait` is forbidden on a browser's main thread — which is why the\n * blocking side is always the worker. Reporting the cause matters: without it\n * the failure surfaces as an interpreter that will not start, with nothing\n * naming the header the host is missing.\n */\nexport function syncTransportUnavailableReason(): string | null {\n if (typeof globalThis.crossOriginIsolated === \"boolean\" && !globalThis.crossOriginIsolated) {\n return \"the page is not cross-origin isolated. Serve it with Cross-Origin-Opener-Policy: same-origin and \" +\n \"Cross-Origin-Embedder-Policy: require-corp.\";\n }\n if (typeof SharedArrayBuffer !== \"function\") return \"SharedArrayBuffer is unavailable in this host.\";\n if (typeof Atomics !== \"object\" || typeof Atomics.wait !== \"function\") return \"Atomics.wait is unavailable in this host.\";\n return null;\n}\n\nexport class HostTransportError extends Error {\n code = \"ERR_SBX_HOST_TRANSPORT\";\n}\n\n/**\n * The guest side. Lives in the worker with the compiled program and blocks.\n *\n * `wake` nudges the host's event loop: the host cannot poll shared memory\n * without spinning, so each window is announced with an ordinary message.\n */\nexport class HostCallClient {\n private control: Int32Array;\n private data: Uint8Array;\n private capacity: number;\n private wake: () => void;\n private closed = false;\n\n constructor(buffers: HostTransportBuffers, wake: () => void) {\n this.control = new Int32Array(buffers.control);\n this.data = new Uint8Array(buffers.data);\n this.capacity = this.data.length;\n this.wake = wake;\n }\n\n /** Send a frame and block until the whole answer is back. Never returns empty. */\n call(request: Uint8Array): Uint8Array {\n /* A transport that has already gone away stays gone. Without this the next\n * call republishes a request over the closed marker and waits for an answer\n * from a host that is no longer listening — a killed process would hang on\n * its way out instead of exiting. */\n if (this.closed || Atomics.load(this.control, STATE) === STATE_CLOSED) {\n this.closed = true;\n throw new HostTransportError(\"the host transport is closed\");\n }\n this.send(request);\n const response = this.receive();\n if (response.length === 0) {\n throw new HostTransportError(\"the host answered with no frame; the kernel side failed or went away\");\n }\n return response;\n }\n\n private send(request: Uint8Array): void {\n let offset = 0;\n for (;;) {\n const size = Math.min(this.capacity, request.length - offset);\n this.data.set(request.subarray(offset, offset + size), 0);\n offset += size;\n Atomics.store(this.control, LENGTH, size);\n Atomics.store(this.control, MORE, offset < request.length ? 1 : 0);\n this.publish(STATE_REQUEST);\n const next = this.waitWhile(STATE_REQUEST);\n if (next === STATE_RESPONSE) return;\n if (next !== STATE_CONTINUE) {\n this.closed = true;\n throw new HostTransportError(\"the host went away mid-request\");\n }\n }\n }\n\n private receive(): Uint8Array {\n const parts: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const size = Atomics.load(this.control, LENGTH);\n parts.push(this.data.slice(0, size));\n total += size;\n if (Atomics.load(this.control, MORE) === 0) break;\n this.publish(STATE_CONTINUE);\n if (this.waitWhile(STATE_CONTINUE) !== STATE_RESPONSE) {\n this.closed = true;\n throw new HostTransportError(\"the host went away mid-response\");\n }\n }\n Atomics.store(this.control, STATE, STATE_IDLE);\n if (parts.length === 1) return parts[0];\n const joined = new Uint8Array(total);\n let at = 0;\n for (const part of parts) { joined.set(part, at); at += part.length; }\n return joined;\n }\n\n private publish(state: number): void {\n Atomics.store(this.control, STATE, state);\n Atomics.notify(this.control, STATE);\n this.wake();\n }\n\n private waitWhile(state: number): number {\n for (;;) {\n Atomics.wait(this.control, STATE, state, WAIT_SLICE_MS);\n const current = Atomics.load(this.control, STATE);\n if (current !== state) return current;\n }\n }\n}\n\n/**\n * The host side. Lives wherever the volume and the process table do, and never\n * blocks; `handle` is free to be asynchronous.\n */\nexport class HostCallServer {\n private control: Int32Array;\n private data: Uint8Array;\n private capacity: number;\n private handle: (request: Uint8Array) => Promise<Uint8Array> | Uint8Array;\n private onFault: (error: unknown) => void;\n\n private incoming: Uint8Array[] = [];\n private outgoing: Uint8Array | null = null;\n private sent = 0;\n private closed = false;\n\n constructor(\n buffers: HostTransportBuffers,\n handle: (request: Uint8Array) => Promise<Uint8Array> | Uint8Array,\n onFault: (error: unknown) => void = () => {},\n ) {\n this.control = new Int32Array(buffers.control);\n this.data = new Uint8Array(buffers.data);\n this.capacity = this.data.length;\n this.handle = handle;\n this.onFault = onFault;\n }\n\n /** Call on each wake message from the client. */\n async pump(): Promise<void> {\n if (this.closed) return;\n const state = Atomics.load(this.control, STATE);\n if (state === STATE_REQUEST) {\n const size = Atomics.load(this.control, LENGTH);\n this.incoming.push(this.data.slice(0, size));\n if (Atomics.load(this.control, MORE) === 1) {\n this.publish(STATE_CONTINUE);\n return;\n }\n const request = concat(this.incoming);\n this.incoming = [];\n let response: Uint8Array;\n try {\n response = await this.handle(request);\n } catch (error) {\n /* Anything escaping the handler is a bug in the dispatcher. Closing the\n * transport is the honest answer: the client raises, rather than\n * reading a zero-length frame as a successful empty result. */\n this.onFault(error);\n this.close();\n return;\n }\n if (this.closed) return;\n this.outgoing = response;\n this.sent = 0;\n this.sendWindow();\n return;\n }\n if (state === STATE_CONTINUE) this.sendWindow();\n }\n\n /** Release a blocked client — container teardown, or the worker being killed. */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n Atomics.store(this.control, STATE, STATE_CLOSED);\n Atomics.notify(this.control, STATE);\n }\n\n private sendWindow(): void {\n const payload = this.outgoing ?? new Uint8Array();\n const size = Math.min(this.capacity, payload.length - this.sent);\n this.data.set(payload.subarray(this.sent, this.sent + size), 0);\n this.sent += size;\n Atomics.store(this.control, LENGTH, size);\n Atomics.store(this.control, MORE, this.sent < payload.length ? 1 : 0);\n this.publish(STATE_RESPONSE);\n }\n\n private publish(state: number): void {\n Atomics.store(this.control, STATE, state);\n Atomics.notify(this.control, STATE);\n }\n}\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n if (parts.length === 1) return parts[0];\n const total = parts.reduce((sum, part) => sum + part.length, 0);\n const joined = new Uint8Array(total);\n let at = 0;\n for (const part of parts) { joined.set(part, at); at += part.length; }\n return joined;\n}\n","/**\n * An Emscripten filesystem backed by the SandboxedJs kernel.\n *\n * The interpreter is compiled expecting a POSIX filesystem, and Emscripten\n * supplies one — in the guest's own memory. That is exactly the arrangement\n * this whole design exists to avoid: a second copy of the container's state,\n * private to one process, diverging from the moment anything writes.\n *\n * So the container's directories are mounted on a filesystem whose every\n * operation is a blocking call to the kernel over `sbx_host_v1`. There is one\n * authority for files, and the interpreter is not it.\n *\n * The shape below is Emscripten's `FS` backend contract, the same one NODEFS\n * implements. It has to be synchronous, which is precisely what the host ABI's\n * blocking transport provides.\n */\n\nimport { ERRNO_NAMES, Errno } from \"./host-abi.js\";\nimport { HostAbiError, type HostAbiClient } from \"./syscall-client.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\n\n/**\n * Build the filesystem backend for one process.\n *\n * `FS` is the interpreter module's own filesystem object, `errnoCodes` is that\n * build's `ERRNO_CODES` table, and `client` is the process's connection to the\n * kernel — one per process, never shared, so a file opened here belongs to a\n * descriptor table the kernel can clean up when the process goes.\n */\nexport function createSbxFs(FS: any, client: HostAbiClient, errnoCodes: Record<string, number>): any {\n /**\n * Translate a kernel errno into the number *this libc* uses.\n *\n * Not a formality. Emscripten's musl numbering is not Linux's: `ENOENT` is\n * 44 there and 2 here, and 2 is `EACCES`. Passing our number through\n * unchanged turns \"no such file\" into \"permission denied\" — which is exactly\n * how a perfectly good `open(path, \"w\")` came back as a PermissionError\n * carrying the errno of a different failure. The ABI's canonical values are\n * Linux's; every adapter translates at its own edge.\n */\n const translate = (canonical: number): number => {\n const name = ERRNO_NAMES[canonical];\n const mapped = name ? errnoCodes[name] : undefined;\n return mapped ?? errnoCodes.EIO ?? canonical;\n };\n\n const raise = (canonical: number): never => {\n throw new FS.ErrnoError(translate(canonical));\n };\n\n const fail = (error: unknown): never => {\n if (error instanceof HostAbiError) return raise(error.errno);\n return raise(Errno.EIO);\n };\n\n const SBXFS = {\n /** Where this mount sits in the guest's namespace, and where in the container. */\n mount(mount: any): any {\n return SBXFS.createNode(null, \"/\", S_IFDIR | 0o777, 0);\n },\n\n createNode(parent: any, name: string, mode: number, dev: number): any {\n if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) raise(Errno.EINVAL);\n const node = FS.createNode(parent, name, mode, dev);\n node.node_ops = SBXFS.node_ops;\n node.stream_ops = SBXFS.stream_ops;\n return node;\n },\n\n /** The container path a guest node stands for. */\n realPath(node: any): string {\n const parts: string[] = [];\n let current = node;\n while (current.parent !== current) {\n parts.push(current.name);\n current = current.parent;\n }\n parts.push(current.mount.opts.root);\n parts.reverse();\n return parts.join(\"/\").replace(/\\/+/g, \"/\");\n },\n\n node_ops: {\n getattr(node: any): any {\n const path = SBXFS.realPath(node);\n let stat;\n try {\n stat = client.stat(path, false);\n } catch (error) {\n return fail(error);\n }\n return {\n dev: 1,\n ino: stat.ino,\n mode: stat.mode,\n nlink: stat.nlink,\n uid: stat.uid,\n gid: stat.gid,\n rdev: 0,\n size: stat.size,\n atime: new Date(stat.atimeNs / 1e6),\n mtime: new Date(stat.mtimeNs / 1e6),\n ctime: new Date(stat.ctimeNs / 1e6),\n /* Emscripten sizes its own reads from this; a wrong block size shows\n * up as short reads on large files rather than as an error. */\n blksize: 4096,\n blocks: Math.ceil(stat.size / 4096),\n };\n },\n\n setattr(node: any, attr: any): void {\n const path = SBXFS.realPath(node);\n try {\n if (attr.size !== undefined) {\n const fd = client.open(path, 1 /* O_WRONLY */);\n try {\n client.ftruncate(fd, attr.size);\n } finally {\n client.close(fd);\n }\n }\n /* Mode and times are accepted and dropped for now: the volume has no\n * per-descriptor chmod through the ABI yet, and refusing here would\n * break `pip`, which sets a mode on everything it installs. */\n } catch (error) {\n fail(error);\n }\n },\n\n lookup(parent: any, name: string): any {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n let stat;\n try {\n stat = client.stat(path, false);\n } catch (error) {\n /* A missing entry is not an error here — it is how `lookup` says\n * \"no\". Anything else is, and must not be flattened into ENOENT. */\n if (error instanceof HostAbiError && error.errno === Errno.ENOENT) raise(Errno.ENOENT);\n return fail(error);\n }\n const node = SBXFS.createNode(parent, name, stat.mode, 0);\n node.node_ops = SBXFS.node_ops;\n node.stream_ops = SBXFS.stream_ops;\n return node;\n },\n\n mknod(parent: any, name: string, mode: number, dev: number): any {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n if ((mode & S_IFDIR) === S_IFDIR) client.mkdir(path, mode & 0o777);\n else {\n const fd = client.open(path, 0o1 | 0o100 /* O_WRONLY|O_CREAT */, mode & 0o777);\n client.close(fd);\n }\n } catch (error) {\n fail(error);\n }\n return SBXFS.createNode(parent, name, mode, dev);\n },\n\n rename(node: any, newParent: any, newName: string): void {\n const from = SBXFS.realPath(node);\n const to = `${SBXFS.realPath(newParent)}/${newName}`.replace(/\\/+/g, \"/\");\n try {\n client.rename(from, to);\n } catch (error) {\n fail(error);\n }\n /* Emscripten keeps its own name tree, so it has to be told too, or the\n * next lookup finds the file under the name it no longer has. */\n node.name = newName;\n node.parent = newParent;\n },\n\n unlink(parent: any, name: string): void {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n client.unlink(path, false);\n } catch (error) {\n fail(error);\n }\n },\n\n rmdir(parent: any, name: string): void {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n client.unlink(path, true);\n } catch (error) {\n fail(error);\n }\n },\n\n readdir(node: any): string[] {\n const path = SBXFS.realPath(node);\n try {\n const fd = client.open(path, 0 /* O_RDONLY */);\n try {\n const names: string[] = [];\n for (;;) {\n const batch = client.readdir(fd, 8192);\n if (batch.length === 0) break;\n names.push(...batch);\n }\n return names;\n } finally {\n client.close(fd);\n }\n } catch (error) {\n return fail(error);\n }\n },\n\n symlink(): void {\n /* Symlinks need a kernel-side create that keeps the link, not the\n * target, in the directory entry. Refusing precisely is better than\n * silently making a copy. */\n raise(Errno.ENOSYS);\n },\n\n readlink(): string {\n return raise(Errno.EINVAL);\n },\n },\n\n stream_ops: {\n open(stream: any): void {\n const path = SBXFS.realPath(stream.node);\n if (FS.isDir(stream.node.mode)) return;\n try {\n /* The guest's flags are already POSIX numbers, and the kernel's ABI\n * uses the same ones — no translation, and none invented. */\n stream.sbxFd = client.open(path, stream.flags & ~0o2000000 /* drop O_CLOEXEC */);\n } catch (error) {\n fail(error);\n }\n },\n\n close(stream: any): void {\n if (stream.sbxFd === undefined) return;\n try {\n client.close(stream.sbxFd);\n } catch {\n /* A close that fails has still released the descriptor here; raising\n * would leak the guest's stream instead. */\n }\n stream.sbxFd = undefined;\n },\n\n read(stream: any, buffer: Uint8Array, offset: number, length: number, position: number): number {\n if (length === 0) return 0;\n try {\n const data = client.pread(stream.sbxFd, length, position);\n buffer.set(data, offset);\n return data.length;\n } catch (error) {\n return fail(error);\n }\n },\n\n write(stream: any, buffer: Uint8Array, offset: number, length: number, position: number): number {\n if (length === 0) return 0;\n try {\n return client.pwrite(stream.sbxFd, buffer.subarray(offset, offset + length), position);\n } catch (error) {\n return fail(error);\n }\n },\n\n llseek(stream: any, offset: number, whence: number): number {\n let position = offset;\n if (whence === 1) position += stream.position;\n else if (whence === 2 && FS.isFile(stream.node.mode)) {\n position += SBXFS.node_ops.getattr(stream.node).size;\n }\n if (position < 0) raise(Errno.EINVAL);\n return position;\n },\n },\n };\n\n return SBXFS;\n}\n","/**\n * One Python process, in its own worker.\n *\n * This is the rule the old integration could not keep: **one active Python\n * process owns one interpreter instance.** A worker starts, instantiates the\n * interpreter from the release artifact, runs one command line, and exits.\n * Nothing survives it — not `sys.modules`, not logging handlers, not a native\n * extension's static state — because there is nothing for it to survive in.\n *\n * Everything the interpreter would ask an operating system for goes to the\n * kernel over `sbx_host_v1`, synchronously, while this worker blocks. The\n * kernel is on another thread and stays awake, which is what makes a blocking\n * `read()` of a terminal nobody has typed into possible at all.\n */\n\nimport { HostAbiClient } from \"./syscall-client.js\";\nimport { HostCallClient, type HostTransportBuffers } from \"./sync-transport.js\";\nimport { createSbxFs } from \"./sbxfs.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface PythonWorkerStart {\n buffers: HostTransportBuffers;\n generation: number;\n moduleUrl: string;\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n /** The identity the kernel gave this process; libc's own is a constant. */\n pid: number;\n ppid: number;\n /** Container directories to mount, and where. */\n mounts: { guest: string; container: string }[];\n /** True when stdout is a terminal, which Python checks before buffering. */\n isTty: boolean;\n}\n\nexport interface PythonWorkerPort {\n postMessage(message: unknown): void;\n}\n\n/**\n * Directories the interpreter owns and the container must not cover.\n *\n * The standard library lives inside the module's own data image. Mounting the\n * container over it would replace Python with whatever the container happens\n * to have at that path — usually nothing.\n */\nconst INTERPRETER_OWNED = new Set([\"/lib\", \"/dev\", \"/proc\", \"/usr/local\"]);\n\nexport async function runPythonProcess(start: PythonWorkerStart, port: PythonWorkerPort): Promise<void> {\n const transport = new HostCallClient(start.buffers, () => port.postMessage({ type: \"wake\" }));\n\n /* The guest may not assert its own identity: the transport belongs to one\n * process, and the kernel stamps the generation it was created with. */\n const stampedCall = (request: Uint8Array): Uint8Array => {\n const stamped = request.slice();\n new DataView(stamped.buffer).setUint32(8, start.generation, true);\n return transport.call(stamped);\n };\n const client = new HostAbiClient(\n { call: stampedCall } as unknown as HostCallClient,\n start.generation,\n );\n\n const factory = (await import(/* @vite-ignore */ start.moduleUrl)).default;\n\n let exitCode = 0;\n\n /* Emscripten uses the object it is given *as* the module, so this one gains\n * `FS` and `ENV` before `preRun` fires. Reaching for them through `this`\n * instead depends on how the callback happens to be invoked, which has\n * changed between Emscripten releases and fails as \"cannot read FS of\n * undefined\" — a long way from the cause. */\n const config: any = {\n /* Emscripten resolves `python.wasm` and `python.data` beside its loader;\n * saying so explicitly survives a host that serves the loader from a\n * different path than it was built at.\n *\n * Under Node the loader reads them with `fs`, which wants a path and not a\n * `file://` URL — and reports the difference as a bare ENOENT naming the\n * URL, which reads like a missing file rather than a wrong kind of name. */\n locateFile: (file: string) => {\n const resolved = new URL(file, start.moduleUrl);\n if (resolved.protocol !== \"file:\") return resolved.href;\n return decodeURIComponent(resolved.pathname);\n },\n arguments: start.argv,\n /* Read by the `--wrap`ped `getpid`/`getppid` in library_sbx_posix.js. */\n sbxPid: start.pid,\n sbxPpid: start.ppid,\n quit: (status: number) => {\n exitCode = status;\n },\n };\n\n config.preRun = [\n () => {\n mountContainer(config.FS, client, start.mounts, config.ERRNO_CODES ?? {});\n bindStdio(config.FS, client, start.isTty);\n for (const [key, value] of Object.entries(start.env)) config.ENV[key] = value;\n try {\n config.FS.chdir(start.cwd);\n } catch {\n /* A cwd the container does not have is the caller's problem to report,\n * not a reason to fail before `main` runs. */\n }\n },\n ];\n\n const module = await factory(config);\n\n try {\n exitCode = module.callMain(start.argv) ?? exitCode;\n } catch (error) {\n const status = (error as { status?: number }).status;\n if (typeof status === \"number\") exitCode = status;\n else {\n port.postMessage({ type: \"failed\", message: String((error as Error)?.message ?? error) });\n return;\n }\n }\n port.postMessage({ type: \"exit\", code: exitCode });\n}\n\n/** Put the container's directories where a program expects to find them. */\nfunction mountContainer(\n FS: any,\n client: HostAbiClient,\n mounts: { guest: string; container: string }[],\n errnoCodes: Record<string, number>,\n): void {\n const SBXFS = createSbxFs(FS, client, errnoCodes);\n for (const mount of mounts) {\n if (INTERPRETER_OWNED.has(mount.guest)) continue;\n try {\n FS.mkdirTree(mount.guest);\n } catch {\n /* Already there. */\n }\n FS.mount(SBXFS, { root: mount.container }, mount.guest);\n }\n}\n\n/**\n * Wire the process's standard streams to the kernel's.\n *\n * Byte by byte, and never decoded: the terminal boundary is where a multi-byte\n * character gets cut in half, and a stream that decodes here turns that into a\n * replacement character the program can never recover.\n *\n * Whether these are *terminals* is the part that decides how the interpreter\n * behaves, not just how it looks. Handing Emscripten byte callbacks through\n * `FS.init(input, output, error)` makes plain character devices, so `isatty`\n * is false — and CPython with a non-terminal stdin does not start a REPL, it\n * reads stdin as a script file. `python` at an interactive prompt then sits\n * there forever with no banner, having decided it was given a program.\n *\n * So a terminal gets real TTY streams — `FS.init(null, null, null)` symlinks\n * `/dev/stdin` to `/dev/tty` — with this process's ops swapped in afterwards.\n * A pipe gets the character devices, which is what a pipe should be.\n */\nfunction bindStdio(FS: any, client: HostAbiClient, isTty: boolean): void {\n /** One byte from the kernel, or null at end of input. Blocks in between. */\n const readByte = (): number | null => {\n const data = client.read(0, 1);\n return data.length === 0 ? null : data[0]!;\n };\n\n if (!isTty) {\n FS.init(readByte, writeThrough(client, 1), writeThrough(client, 2));\n return;\n }\n\n FS.init(null, null, null);\n\n /* The stream's own ops are replaced rather than the TTY's.\n *\n * Emscripten's TTY writes a byte at a time and flushes on a newline, because\n * its sink is a `console.log`-shaped line printer. A prompt has no newline —\n * `>>> ` would sit in that buffer forever, and `fflush` does not reach it,\n * because C's `fflush` issues a `write`, not an `fsync`. Handling the whole\n * `write` here means one kernel write per guest write, which is both correct\n * and what a terminal actually looks like.\n *\n * `stream.tty` is left in place, so `isatty` still says yes.\n */\n for (const [fd, sink] of [[1, 1], [2, 2]] as [number, number][]) {\n const stream = FS.getStream(fd);\n if (!stream) continue;\n stream.stream_ops = {\n ...stream.stream_ops,\n write(_stream: any, buffer: Uint8Array, offset: number, length: number): number {\n if (length > 0) client.writeAll(sink, buffer.subarray(offset, offset + length));\n return length;\n },\n fsync(): number {\n return 0;\n },\n };\n }\n\n const stdin = FS.getStream(0);\n if (stdin) {\n stdin.stream_ops = {\n ...stdin.stream_ops,\n read(_stream: any, buffer: Uint8Array, offset: number, length: number): number {\n /* Blocks in the kernel until a key is pressed. Returning zero here\n * means end of input, so it must never be how \"nothing yet\" is\n * reported. */\n const data = client.read(0, length);\n buffer.set(data, offset);\n return data.length;\n },\n };\n }\n}\n\n/** A line-buffered writer for a non-terminal stream. */\nfunction writeThrough(client: HostAbiClient, fd: number): (charCode: number | null) => void {\n let pending: number[] = [];\n return (charCode) => {\n if (charCode === null) {\n if (pending.length > 0) {\n client.writeAll(fd, new Uint8Array(pending));\n pending = [];\n }\n return;\n }\n pending.push(charCode);\n /* Flush on a newline so output appears when it was written, and on size so\n * a long line is not held indefinitely. */\n if (charCode === 10 || pending.length >= 4096) {\n client.writeAll(fd, new Uint8Array(pending));\n pending = [];\n }\n };\n}\n","/**\n * The process worker's entry point.\n *\n * Built as its own bundle: a worker is fetched as its own module graph, so\n * anything left unresolved here has to resolve from wherever the loader\n * happens to be — the trap HANDOFF.md records for the guest worker.\n *\n * It waits for its buffers rather than reading them from `workerData`, so the\n * same file serves a browser `Worker` and a Node `worker_threads` one.\n */\n\nimport { runPythonProcess, type PythonWorkerStart } from \"./worker-entry.js\";\n\ninterface Port {\n postMessage(message: unknown): void;\n}\n\nasync function connect(): Promise<{ port: Port; onStart: (handler: (start: PythonWorkerStart) => void) => void }> {\n /* A browser worker posts and listens on its own global scope; Node's worker\n * has neither and reaches its parent through `worker_threads`. Feature\n * detection rather than a build flag, so one bundle serves both. */\n const scope = globalThis as unknown as {\n postMessage?: (message: unknown) => void;\n addEventListener?: (type: string, handler: (event: MessageEvent) => void) => void;\n };\n\n if (typeof scope.postMessage === \"function\" && typeof scope.addEventListener === \"function\") {\n const post = scope.postMessage.bind(globalThis);\n const listen = scope.addEventListener.bind(globalThis);\n return {\n port: { postMessage: post },\n onStart: (handler) =>\n listen(\"message\", (event: MessageEvent) => {\n const data = event.data as PythonWorkerStart & { type?: string };\n if (data?.type === \"start\") handler(data);\n }),\n };\n }\n\n const specifier = [\"node\", \"worker_threads\"].join(\":\");\n const { parentPort } = (await import(/* @vite-ignore */ /* webpackIgnore: true */ specifier)) as {\n parentPort: { postMessage(value: unknown): void; on(event: string, listener: (value: unknown) => void): void };\n };\n return {\n port: parentPort,\n onStart: (handler) =>\n parentPort.on(\"message\", (message) => {\n const data = message as PythonWorkerStart & { type?: string };\n if (data?.type === \"start\") handler(data);\n }),\n };\n}\n\nvoid connect().then(({ port, onStart }) => {\n onStart((start) => {\n void runPythonProcess(start, port).catch((error: Error) =>\n port.postMessage({ type: \"failed\", message: String(error?.message ?? error) }),\n );\n });\n /* The supervisor waits for this before sending the start message, so that a\n * worker whose script failed to load is reported rather than hung. */\n port.postMessage({ type: \"sandboxedjs:ready\" });\n});\n"]}
@@ -13,7 +13,11 @@ var {
13
13
  emnapiAsyncWorkPlugin,
14
14
  emnapiTSFNPlugin
15
15
  } = require2("@napi-rs/wasm-runtime");
16
- var { memfsExported } = await import(options.fsModuleUrl);
16
+ var { memfsExported } = await import(
17
+ /* @vite-ignore */
18
+ /* webpackIgnore: true */
19
+ options.fsModuleUrl
20
+ );
17
21
  Object.assign(globalThis, {
18
22
  self: globalThis,
19
23
  require: require2,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/rolldown-wasi-worker.ts"],"names":["require"],"mappings":";;;;;AAiCA,IAAM,OAAA,GAAW,cAAc,EAAC;AAChC,IAAMA,QAAAA,GAAU,aAAA,CAAc,OAAA,CAAQ,aAAA,IAAiB,YAAY,GAAG,CAAA;AAEtE,IAAM;AAAA,EACJ,yBAAA;AAAA,EACA,cAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA,GAAIA,SAAQ,uBAAuB,CAAA;AAInC,IAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,OAAA,CAAQ,WAAA,CAAA;AAU/C,MAAA,CAAO,OAAO,UAAA,EAAY;AAAA,EACxB,IAAA,EAAM,UAAA;AAAA,EACN,OAAA,EAAAA,QAAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAc,IAAA,EAAc;AAC1B,IAAA,IAAI,MAAM,CAAA,EAAG,YAAA,CAAa,MAAM,MAAM,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AAAA,EAChE,CAAA;AAAA,EACA,YAAY,OAAA,EAAkB;AAC5B,IAAA,UAAA,EAAY,YAAY,OAAO,CAAA;AAAA,EACjC;AACF,CAAC,CAAA;AAED,IAAI,UAAA,EAAY;AACd,EAAA,UAAA,CAAW,EAAA,CAAG,SAAA,EAAW,CAAC,IAAA,KAAS;AACjC,IAAC,UAAA,CAAmB,SAAA,GAAY,EAAE,IAAA,EAAM,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAEA,IAAM,eAA4B,EAAC;AAEnC,IAAM,OAAA,GAAU,IAAI,cAAA,CAAe;AAAA,EACjC,MAAA,CAAO,EAAE,UAAA,EAAY,UAAA,EAAW,EAAuE;AACrG,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA,MAGpB,EAAA,EAAI,cAAc,aAAa,CAAA;AAAA,MAC/B,QAAA,EAAU,EAAE,GAAA,EAAK,GAAA,EAAI;AAAA,MACrB,OAAO,CAAA,GAAI,IAAA,KAAoB,OAAA,CAAQ,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,MAClD,QAAA,EAAU,IAAI,IAAA,KAAoB;AAChC,QAAA,OAAA,CAAQ,KAAA,CAAM,GAAG,IAAI,CAAA;AACrB,QAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,KACD,CAAA;AAED,IAAA,OAAO,0BAA0B,UAAA,EAAY;AAAA,MAC3C,WAAA,EAAa,IAAA;AAAA,MACb,IAAA;AAAA;AAAA;AAAA;AAAA,MAIA,OAAA,EAAS,CAAC,qBAAA,EAAuB,gBAAgB,CAAA;AAAA,MACjD,iBAAiB,YAAA,EAAmB;AAClC,QAAA,YAAA,CAAa,GAAA,GAAM;AAAA,UACjB,GAAG,YAAA,CAAa,GAAA;AAAA,UAChB,GAAG,YAAA,CAAa,IAAA;AAAA,UAChB,GAAG,YAAA,CAAa,MAAA;AAAA,UAChB,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAAA,EACA,QAAQ,KAAA,EAAgB;AACtB,IAAC,UAAA,CAAmB,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,YAAA,EAAc,CAAC,GAAG,YAAY,CAAA,EAAG,CAAA;AACzF,IAAA,YAAA,CAAa,MAAA,GAAS,CAAA;AAAA,EACxB;AACF,CAAC,CAAA;AAEA,UAAA,CAAmB,SAAA,GAAY,CAAC,KAAA,KAAmB,OAAA,CAAQ,OAAO,KAAK,CAAA","file":"rolldown-wasi-worker.js","sourcesContent":["/**\n * A Rolldown WASI worker thread whose filesystem is the container's.\n *\n * Rolldown's npm package ships two of these. The browser one builds its\n * filesystem from an in-memory volume proxied back to the main thread; the\n * Node one calls `node:wasi` with `preopens: { \"/\": \"/\" }` and reads the real\n * disk. Neither is usable as-is here: the browser file wants browser worker\n * globals, and the Node file wants the host's filesystem — which is precisely\n * the thing a container must not hand to the code running inside it.\n *\n * So this is the crossing of the two: Node's worker plumbing around the\n * browser's filesystem. Every path Rolldown opens on this thread is forwarded\n * to the main thread and served out of the memory volume the container mirrors\n * itself into, so the bundler and the rest of the container see one filesystem.\n *\n * Bundled as its own entry point, because a worker is fetched as its own\n * module graph rather than through the main bundle.\n */\n\nimport { createRequire } from \"node:module\";\nimport { readFileSync } from \"node:fs\";\nimport { parentPort, workerData, Worker } from \"node:worker_threads\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Resolved against the binding's own location, not this file's.\n *\n * `@napi-rs/wasm-runtime` arrives as a dependency of the Rolldown binding,\n * which an installer is free to place anywhere — nested, hoisted, in a store\n * behind a symlink. Anchoring the lookup to the package that actually depends\n * on it is what keeps this working under npm, pnpm and Yarn alike.\n */\nconst options = (workerData ?? {}) as { runtimeAnchor?: string; fsModuleUrl?: string };\nconst require = createRequire(options.runtimeAnchor ?? import.meta.url);\n\nconst {\n instantiateNapiModuleSync,\n MessageHandler,\n WASI,\n createFsProxy,\n emnapiAsyncWorkPlugin,\n emnapiTSFNPlugin,\n} = require(\"@napi-rs/wasm-runtime\");\n/* Passed in as a resolved URL: the runtime publishes `./fs` to `import` only,\n * so it cannot be required, and resolving it from here would assume the\n * installer hoisted the package next to this worker. */\nconst { memfsExported } = await import(options.fsModuleUrl!);\n\n/**\n * The browser worker globals `MessageHandler` is written against.\n *\n * emnapi decides how to talk to a thread from the environment it finds, and\n * the handler itself is written for a browser worker: it is handed events and\n * replies with a bare `postMessage`. Node's port is bridged onto those names\n * rather than the handler being rewritten.\n */\nObject.assign(globalThis, {\n self: globalThis,\n require,\n Worker,\n importScripts(file: string) {\n (0, eval)(`${readFileSync(file, \"utf8\")}//# sourceURL=${file}`);\n },\n postMessage(message: unknown) {\n parentPort?.postMessage(message);\n },\n});\n\nif (parentPort) {\n parentPort.on(\"message\", (data) => {\n (globalThis as any).onmessage?.({ data });\n });\n}\n\nconst errorOutputs: unknown[][] = [];\n\nconst handler = new MessageHandler({\n onLoad({ wasmModule, wasmMemory }: { wasmModule: WebAssembly.Module; wasmMemory: WebAssembly.Memory }) {\n const wasi = new WASI({\n /* The proxy is the whole point: every syscall goes to the main thread,\n * which answers from the volume the container keeps in step. */\n fs: createFsProxy(memfsExported),\n preopens: { \"/\": \"/\" },\n print: (...args: unknown[]) => console.log(...args),\n printErr: (...args: unknown[]) => {\n console.error(...args);\n errorOutputs.push(args);\n },\n });\n\n return instantiateNapiModuleSync(wasmModule, {\n childThread: true,\n wasi,\n /* The wasm links a \"basic\" emnapi archive with no C implementations of\n * async work or threadsafe functions, so every thread has to bring the\n * JavaScript ones. */\n plugins: [emnapiAsyncWorkPlugin, emnapiTSFNPlugin],\n overwriteImports(importObject: any) {\n importObject.env = {\n ...importObject.env,\n ...importObject.napi,\n ...importObject.emnapi,\n memory: wasmMemory,\n };\n },\n });\n },\n onError(error: unknown) {\n (globalThis as any).postMessage({ type: \"error\", error, errorOutputs: [...errorOutputs] });\n errorOutputs.length = 0;\n },\n});\n\n(globalThis as any).onmessage = (event: unknown) => handler.handle(event);\n"]}
1
+ {"version":3,"sources":["../src/runtime/rolldown-wasi-worker.ts"],"names":["require"],"mappings":";;;;;AAiCA,IAAM,OAAA,GAAW,cAAc,EAAC;AAChC,IAAMA,QAAAA,GAAU,aAAA,CAAc,OAAA,CAAQ,aAAA,IAAiB,YAAY,GAAG,CAAA;AAEtE,IAAM;AAAA,EACJ,yBAAA;AAAA,EACA,cAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA,GAAIA,SAAQ,uBAAuB,CAAA;AAInC,IAAM,EAAE,aAAA,EAAc,GAAI,MAAM;AAAA;AAAA;AAAA,EAAoD,OAAA,CAAQ;AAAA,CAAA;AAU5F,MAAA,CAAO,OAAO,UAAA,EAAY;AAAA,EACxB,IAAA,EAAM,UAAA;AAAA,EACN,OAAA,EAAAA,QAAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAc,IAAA,EAAc;AAC1B,IAAA,IAAI,MAAM,CAAA,EAAG,YAAA,CAAa,MAAM,MAAM,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AAAA,EAChE,CAAA;AAAA,EACA,YAAY,OAAA,EAAkB;AAC5B,IAAA,UAAA,EAAY,YAAY,OAAO,CAAA;AAAA,EACjC;AACF,CAAC,CAAA;AAED,IAAI,UAAA,EAAY;AACd,EAAA,UAAA,CAAW,EAAA,CAAG,SAAA,EAAW,CAAC,IAAA,KAAS;AACjC,IAAC,UAAA,CAAmB,SAAA,GAAY,EAAE,IAAA,EAAM,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAEA,IAAM,eAA4B,EAAC;AAEnC,IAAM,OAAA,GAAU,IAAI,cAAA,CAAe;AAAA,EACjC,MAAA,CAAO,EAAE,UAAA,EAAY,UAAA,EAAW,EAAuE;AACrG,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA,MAGpB,EAAA,EAAI,cAAc,aAAa,CAAA;AAAA,MAC/B,QAAA,EAAU,EAAE,GAAA,EAAK,GAAA,EAAI;AAAA,MACrB,OAAO,CAAA,GAAI,IAAA,KAAoB,OAAA,CAAQ,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,MAClD,QAAA,EAAU,IAAI,IAAA,KAAoB;AAChC,QAAA,OAAA,CAAQ,KAAA,CAAM,GAAG,IAAI,CAAA;AACrB,QAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,KACD,CAAA;AAED,IAAA,OAAO,0BAA0B,UAAA,EAAY;AAAA,MAC3C,WAAA,EAAa,IAAA;AAAA,MACb,IAAA;AAAA;AAAA;AAAA;AAAA,MAIA,OAAA,EAAS,CAAC,qBAAA,EAAuB,gBAAgB,CAAA;AAAA,MACjD,iBAAiB,YAAA,EAAmB;AAClC,QAAA,YAAA,CAAa,GAAA,GAAM;AAAA,UACjB,GAAG,YAAA,CAAa,GAAA;AAAA,UAChB,GAAG,YAAA,CAAa,IAAA;AAAA,UAChB,GAAG,YAAA,CAAa,MAAA;AAAA,UAChB,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAAA,EACA,QAAQ,KAAA,EAAgB;AACtB,IAAC,UAAA,CAAmB,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,YAAA,EAAc,CAAC,GAAG,YAAY,CAAA,EAAG,CAAA;AACzF,IAAA,YAAA,CAAa,MAAA,GAAS,CAAA;AAAA,EACxB;AACF,CAAC,CAAA;AAEA,UAAA,CAAmB,SAAA,GAAY,CAAC,KAAA,KAAmB,OAAA,CAAQ,OAAO,KAAK,CAAA","file":"rolldown-wasi-worker.js","sourcesContent":["/**\n * A Rolldown WASI worker thread whose filesystem is the container's.\n *\n * Rolldown's npm package ships two of these. The browser one builds its\n * filesystem from an in-memory volume proxied back to the main thread; the\n * Node one calls `node:wasi` with `preopens: { \"/\": \"/\" }` and reads the real\n * disk. Neither is usable as-is here: the browser file wants browser worker\n * globals, and the Node file wants the host's filesystem — which is precisely\n * the thing a container must not hand to the code running inside it.\n *\n * So this is the crossing of the two: Node's worker plumbing around the\n * browser's filesystem. Every path Rolldown opens on this thread is forwarded\n * to the main thread and served out of the memory volume the container mirrors\n * itself into, so the bundler and the rest of the container see one filesystem.\n *\n * Bundled as its own entry point, because a worker is fetched as its own\n * module graph rather than through the main bundle.\n */\n\nimport { createRequire } from \"node:module\";\nimport { readFileSync } from \"node:fs\";\nimport { parentPort, workerData, Worker } from \"node:worker_threads\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Resolved against the binding's own location, not this file's.\n *\n * `@napi-rs/wasm-runtime` arrives as a dependency of the Rolldown binding,\n * which an installer is free to place anywhere — nested, hoisted, in a store\n * behind a symlink. Anchoring the lookup to the package that actually depends\n * on it is what keeps this working under npm, pnpm and Yarn alike.\n */\nconst options = (workerData ?? {}) as { runtimeAnchor?: string; fsModuleUrl?: string };\nconst require = createRequire(options.runtimeAnchor ?? import.meta.url);\n\nconst {\n instantiateNapiModuleSync,\n MessageHandler,\n WASI,\n createFsProxy,\n emnapiAsyncWorkPlugin,\n emnapiTSFNPlugin,\n} = require(\"@napi-rs/wasm-runtime\");\n/* Passed in as a resolved URL: the runtime publishes `./fs` to `import` only,\n * so it cannot be required, and resolving it from here would assume the\n * installer hoisted the package next to this worker. */\nconst { memfsExported } = await import(/* @vite-ignore */ /* webpackIgnore: true */ options.fsModuleUrl!);\n\n/**\n * The browser worker globals `MessageHandler` is written against.\n *\n * emnapi decides how to talk to a thread from the environment it finds, and\n * the handler itself is written for a browser worker: it is handed events and\n * replies with a bare `postMessage`. Node's port is bridged onto those names\n * rather than the handler being rewritten.\n */\nObject.assign(globalThis, {\n self: globalThis,\n require,\n Worker,\n importScripts(file: string) {\n (0, eval)(`${readFileSync(file, \"utf8\")}//# sourceURL=${file}`);\n },\n postMessage(message: unknown) {\n parentPort?.postMessage(message);\n },\n});\n\nif (parentPort) {\n parentPort.on(\"message\", (data) => {\n (globalThis as any).onmessage?.({ data });\n });\n}\n\nconst errorOutputs: unknown[][] = [];\n\nconst handler = new MessageHandler({\n onLoad({ wasmModule, wasmMemory }: { wasmModule: WebAssembly.Module; wasmMemory: WebAssembly.Memory }) {\n const wasi = new WASI({\n /* The proxy is the whole point: every syscall goes to the main thread,\n * which answers from the volume the container keeps in step. */\n fs: createFsProxy(memfsExported),\n preopens: { \"/\": \"/\" },\n print: (...args: unknown[]) => console.log(...args),\n printErr: (...args: unknown[]) => {\n console.error(...args);\n errorOutputs.push(args);\n },\n });\n\n return instantiateNapiModuleSync(wasmModule, {\n childThread: true,\n wasi,\n /* The wasm links a \"basic\" emnapi archive with no C implementations of\n * async work or threadsafe functions, so every thread has to bring the\n * JavaScript ones. */\n plugins: [emnapiAsyncWorkPlugin, emnapiTSFNPlugin],\n overwriteImports(importObject: any) {\n importObject.env = {\n ...importObject.env,\n ...importObject.napi,\n ...importObject.emnapi,\n memory: wasmMemory,\n };\n },\n });\n },\n onError(error: unknown) {\n (globalThis as any).postMessage({ type: \"error\", error, errorOutputs: [...errorOutputs] });\n errorOutputs.length = 0;\n },\n});\n\n(globalThis as any).onmessage = (event: unknown) => handler.handle(event);\n"]}
@@ -27,6 +27,32 @@ function installPreviewSockets(scope) {
27
27
  return { port, path };
28
28
  }
29
29
  const OPEN_TIMEOUT_MS = 1e4;
30
+ const RELOAD_KEY = "sandboxedjs:reloads";
31
+ const RELOAD_LIMIT = 3;
32
+ const RELOAD_WINDOW_MS = 1e4;
33
+ function reloadForStaleServer() {
34
+ let count = 0;
35
+ try {
36
+ const raw = sessionStorage.getItem(RELOAD_KEY);
37
+ const state = raw ? JSON.parse(raw) : null;
38
+ count = state && Date.now() - state.at < RELOAD_WINDOW_MS ? state.count : 0;
39
+ if (count >= RELOAD_LIMIT) {
40
+ console.warn("sandboxedjs: the dev server keeps invalidating this page; not reloading again");
41
+ return;
42
+ }
43
+ sessionStorage.setItem(RELOAD_KEY, JSON.stringify({ at: Date.now(), count: count + 1 }));
44
+ } catch {
45
+ if (scope.__sandboxedjsReloaded) return;
46
+ scope.__sandboxedjsReloaded = true;
47
+ }
48
+ location.reload();
49
+ }
50
+ const workers = scope.navigator?.serviceWorker;
51
+ if (workers?.addEventListener) {
52
+ workers.addEventListener("message", (event2) => {
53
+ if (event2?.data?.type === "sandboxedjs:reload") reloadForStaleServer();
54
+ });
55
+ }
30
56
  const encoder = new TextEncoder();
31
57
  const decoder = new TextDecoder();
32
58
  function concat(a, b) {
@@ -390,7 +416,7 @@ var PreviewRouter = class {
390
416
  this.clientPorts.delete(clientId);
391
417
  }
392
418
  /** Ask the page for one response and rebuild it as a `Response`. */
393
- async fetch(port, path, request) {
419
+ async fetch(port, path, request, clientId) {
394
420
  if (!this.connected) await this.options.requestHost?.().catch(() => void 0);
395
421
  if (!this.connected) {
396
422
  return isolated(
@@ -419,7 +445,7 @@ var PreviewRouter = class {
419
445
  ]);
420
446
  this.pending.delete(id);
421
447
  if (result.status === 504 && OUTDATED.test(result.statusText)) {
422
- this.options.onStale?.();
448
+ this.options.onStale?.(clientId);
423
449
  }
424
450
  const headers = new Headers(result.headers);
425
451
  const body = this.options.injectSockets === false ? result.body : withSockets(result.body, headers);
@@ -495,7 +521,10 @@ var options = {
495
521
  /* Broadcast, for the same reason `requestHost` does: after a restart this
496
522
  * worker has no idea which page owns what. A page with no preview ignores
497
523
  * it. */
498
- onStale: () => {
524
+ onStale: (clientId) => {
525
+ if (clientId) {
526
+ void worker.clients.get(clientId).then((client) => client?.postMessage({ type: "sandboxedjs:reload" }));
527
+ }
499
528
  void worker.clients.matchAll({ includeUncontrolled: true, type: "window" }).then((clients) => {
500
529
  for (const client of clients) client.postMessage({ type: "sandboxedjs:stale" });
501
530
  });
@@ -524,13 +553,13 @@ worker.addEventListener("fetch", (event) => {
524
553
  const claimed = router.claimedPort(url.pathname);
525
554
  if (claimed !== null && event.request.mode === "navigate") {
526
555
  router.bind(event.resultingClientId || event.clientId, claimed);
527
- event.respondWith(router.fetch(claimed, "/", event.request));
556
+ event.respondWith(router.fetch(claimed, "/", event.request, event.resultingClientId || event.clientId));
528
557
  return;
529
558
  }
530
559
  const port = router.portFor(event.clientId);
531
560
  if (port === void 0) return;
532
561
  event.respondWith(
533
- router.fetch(port, router.containerPath(url.pathname, url.search), event.request)
562
+ router.fetch(port, router.containerPath(url.pathname, url.search), event.request, event.clientId)
534
563
  );
535
564
  });
536
565
  //# sourceMappingURL=service-worker.js.map