import { SerializedError } from "../errors.js"; import { Event } from "../event.js"; import { Disposable, IDisposable } from "../lifecycle.js"; export interface IWebWorker extends IDisposable { getId(): number; readonly onMessage: Event; readonly onError: Event; postMessage(message: Message, transfer: ArrayBuffer[]): void; } export declare function logOnceWebWorkerWarning(err: unknown): void; declare enum MessageType { Request = 0, Reply = 1, SubscribeEvent = 2, Event = 3, UnsubscribeEvent = 4 } declare class RequestMessage { readonly vsWorker: number; readonly req: string; readonly channel: string; readonly method: string; readonly args: unknown[]; readonly type = MessageType.Request; constructor(vsWorker: number, req: string, channel: string, method: string, args: unknown[]); } declare class ReplyMessage { readonly vsWorker: number; readonly seq: string; readonly res: unknown; readonly err: unknown | SerializedError; readonly type = MessageType.Reply; constructor(vsWorker: number, seq: string, res: unknown, err: unknown | SerializedError); } declare class SubscribeEventMessage { readonly vsWorker: number; readonly req: string; readonly channel: string; readonly eventName: string; readonly arg: unknown; readonly type = MessageType.SubscribeEvent; constructor(vsWorker: number, req: string, channel: string, eventName: string, arg: unknown); } declare class EventMessage { readonly vsWorker: number; readonly req: string; readonly event: unknown; readonly type = MessageType.Event; constructor(vsWorker: number, req: string, event: unknown); } declare class UnsubscribeEventMessage { readonly vsWorker: number; readonly req: string; readonly type = MessageType.UnsubscribeEvent; constructor(vsWorker: number, req: string); } export type Message = RequestMessage | ReplyMessage | SubscribeEventMessage | EventMessage | UnsubscribeEventMessage; type ProxiedMethodName = (`$${string}` | `on${string}`); export type Proxied = { [K in keyof T]: T[K] extends (...args: infer A) => infer R ? (K extends ProxiedMethodName ? (...args: A) => Promise> : never) : never; }; export interface IWebWorkerClient { proxy: Proxied; dispose(): void; setChannel(channel: string, handler: T): void; getChannel(channel: string): Proxied; } export interface IWebWorkerServer { setChannel(channel: string, handler: T): void; getChannel(channel: string): Proxied; } /** * Main thread side */ export declare class WebWorkerClient extends Disposable implements IWebWorkerClient { private readonly _worker; private readonly _onModuleLoaded; private readonly _protocol; readonly proxy: Proxied; private readonly _localChannels; private readonly _remoteChannels; constructor(worker: IWebWorker); private _handleMessage; private _handleEvent; setChannel(channel: string, handler: T): void; getChannel(channel: string): Proxied; private _onError; } export interface IWebWorkerServerRequestHandler { _requestHandlerBrand: void; [prop: string]: any; } export interface IWebWorkerServerRequestHandlerFactory { (workerServer: IWebWorkerServer): T; } /** * Worker side */ export declare class WebWorkerServer implements IWebWorkerServer { readonly requestHandler: T; private _protocol; private readonly _localChannels; private readonly _remoteChannels; constructor(postMessage: (msg: Message, transfer?: ArrayBuffer[]) => void, requestHandlerFactory: IWebWorkerServerRequestHandlerFactory); onmessage(msg: unknown): void; private _handleMessage; private _handleEvent; setChannel(channel: string, handler: T): void; getChannel(channel: string): Proxied; private initialize; } export {};