import type { ExceptionJSON } from 'kerium'; import type { TransferListItem } from 'node:worker_threads'; import type { WithOptional } from 'utilium'; import type { Backend, FilesystemOf } from '../backends/backend.js'; import type { PortFS } from '../backends/port.js'; import type { CreationOptions, FileSystem, UsageInfo } from '../internal/filesystem.js'; import '../polyfills.js'; export interface WebMessagePort { postMessage(value: unknown, transfer?: TransferListItem[]): void; addEventListener(type: 'message', listener: (ev: { data: any; }) => void): void; removeEventListener(type: 'message', listener: (ev: { data: any; }) => void): void; } export interface NodeMessagePort { postMessage(value: unknown, transfer?: TransferListItem[]): void; on(type: 'message', listener: (ev: any) => void): void; off(type: 'message', listener: (ev: any) => void): void; } export type Channel = NodeMessagePort | WebMessagePort | WebSocket; /** @internal */ export interface Port { readonly channel: T; /** Send a request */ send(message: M, transfer?: TransferListItem[]): void; /** Add a response handler */ addHandler(handler: (message: M) => void): void; /** Remove a response handler */ removeHandler(handler: (message: M) => void): void; /** Remove all handlers */ disconnect?(): void; } export declare function isPort(port: unknown): port is Port; /** * Creates a new RPC port from a `Worker` or `MessagePort` that extends `EventTarget` */ export declare function fromWeb(port: T): Port; /** * Creates a new RPC port from a Node.js `Worker` or `MessagePort`. */ export declare function fromNode(port: T): Port; /** * Creates a new RPC port from a WebSocket. * @experimental */ export declare function fromWebSocket(ws: T): Port; export declare function from(port: T | Port): Port; /** * The options for the RPC options * @category Backends and Configuration */ export interface Options { /** * The target port that you want to connect to, or the current port if in a port context. */ port: Port; /** * How long to wait for a request to complete */ timeout?: number; } /** * The API for remote procedure calls * @category Internals * @internal */ export interface Methods { usage(): UsageInfo; ready(): void; rename(oldPath: string, newPath: string): void; createFile(path: string, options: CreationOptions): Uint8Array; unlink(path: string): void; rmdir(path: string): void; mkdir(path: string, options: CreationOptions): Uint8Array; readdir(path: string): string[]; touch(path: string, metadata: Uint8Array): void; exists(path: string): boolean; link(target: string, link: string): void; sync(): void; read(path: string, buffer: Uint8Array, start: number, end: number): Uint8Array; write(path: string, buffer: Uint8Array, offset: number): void; stat(path: string): Uint8Array; } /** * The methods that can be called on the RPC port * @category Internals * @internal */ export type Method = keyof Methods; /** * An RPC message * @category Internals * @internal */ export interface Message { _zenfs: true; id: string; method: Method; stack: string; } export interface Request extends Message { method: TMethod; args: Parameters; } export interface Response extends Message { error?: WithOptional; method: TMethod; value: ReturnType; } /** * Encode a RPC message as a string using JSON. * This is only done when structured cloning is not available. * @internal */ export declare function encodeMessage(message: Message): string; /** * Decode a RPC message from a string using JSON. * This is only done when structured cloning is not available. * @internal */ export declare function decodeMessage(message: string): T; export declare function isMessage(arg: unknown): arg is Message; /** * An RPC executor * @internal @hidden */ export interface Executor extends PromiseWithResolvers { fs: PortFS; timeout: ReturnType; } export declare function request(request: Omit, { port, timeout: ms, fs }: Partial & { fs: PortFS; }): Promise; export declare function handleResponse(response: Response): void; export declare function attach(port: Port, handler: (message: T) => unknown): void; export declare function detach(port: Port, handler: (message: T) => unknown): void; export declare function catchMessages(port: Port): (fs: FilesystemOf) => Promise; /** @internal */ export declare function handleRequest(port: Port, fs: FileSystem & { _descriptors?: Map; }, request: Request): Promise;