/** * Per-process syscall implementations (flock, fcntl, etc.) that run * in the context of a single WASM PHP process. Analogous to OS * user space: each process gets its own instance bound to its PID, * constants, and file descriptor table. */ import type { Emscripten } from '@php-wasm/universal'; import type { WasmKernelSpace } from './wasm-kernel-space'; type FSNode = Emscripten.FS.FSNode; type HeapAccessor = { get(offset: number): T; set(offset: number, value: T): void; }; type NonZeroNumber = Exclude; export type WasmUserSpaceContext = { pid: number; constants: { F_RDLCK: number; F_WRLCK: number; F_UNLCK: number; F_GETFL: number; O_ACCMODE: number; O_RDONLY: number; O_WRONLY: number; O_APPEND: number; O_NONBLOCK: number; F_SETFL: number; F_GETLK: number; F_SETLK: number; F_SETLKW: number; SEEK_SET: number; SEEK_CUR: number; SEEK_END: number; LOCK_SH: 1; LOCK_EX: 2; LOCK_NB: 4; LOCK_UN: 8; }; errnoCodes: { EBADF: NonZeroNumber; EINVAL: NonZeroNumber; EAGAIN: NonZeroNumber; EDEADLK: NonZeroNumber; EWOULDBLOCK: NonZeroNumber; }; memory: { HEAP8: HeapAccessor; HEAPU8: HeapAccessor; HEAP16: HeapAccessor; HEAPU16: HeapAccessor; HEAP32: HeapAccessor; HEAPU32: HeapAccessor; HEAPF32: HeapAccessor; HEAP64: HeapAccessor; HEAPU64: HeapAccessor; HEAPF64: HeapAccessor; }; wasmImports: { builtin_fcntl64: (fd: number, cmd: number, varargs?: any) => number; builtin_fd_close: (fd: number) => number; js_wasm_trace: (...args: any[]) => void; }; wasmExports: { wasm_get_end_offset: (fd: number) => bigint; }; syscalls: { getStreamFromFD: (fd: number) => Emscripten.FS.FSStream; }; FS: typeof Emscripten.FS; PROXYFS: typeof Emscripten.PROXYFS & { realPath(node: FSNode): string; }; NODEFS: typeof Emscripten.NODEFS & { realPath(node: FSNode): string; }; }; export type WasmUserSpaceAPI = { fcntl64: (fd: number, cmd: number, varargs?: number) => number; flock: (fd: number, op: number) => number; fd_close: (fd: number) => number; js_release_file_locks: () => void; gethostbyname: (hostname: string) => Promise; }; export declare function bindUserSpace({ fileLockManager }: WasmKernelSpace, { pid, memory, constants: { F_RDLCK, F_WRLCK, F_UNLCK, F_GETFL, O_ACCMODE, O_RDONLY, O_WRONLY, O_APPEND, O_NONBLOCK, F_SETFL, F_GETLK, F_SETLK, F_SETLKW, SEEK_SET, SEEK_CUR, SEEK_END, LOCK_SH, LOCK_EX, LOCK_NB, LOCK_UN, }, errnoCodes: { EBADF, EINVAL, EAGAIN, EWOULDBLOCK }, wasmImports: { builtin_fcntl64, builtin_fd_close, js_wasm_trace }, wasmExports: { wasm_get_end_offset }, syscalls: { getStreamFromFD }, FS, PROXYFS, NODEFS, }: WasmUserSpaceContext): WasmUserSpaceAPI; export {};