import { Transferable } from "./transferable.js";
import { Envelope } from "./types.js";
export declare const toSerialized: unique symbol;
export declare const toDeserialized: unique symbol;
export declare const enum PayloadType {
    RAW = 0,// User data (Numbers, Strings, Plain Objects)
    LIB = 1
}
export declare const enum WorkerTaskType {
    RUN = 0
}
export declare const enum WorkerResponseType {
    RESULT = 0,
    ERROR = 1
}
export interface SerializableConstructor<T extends Serializable = Serializable> {
    new (...args: any[]): T;
    [toDeserialized](obj: unknown): T;
}
export declare abstract class Serializable {
    abstract [toSerialized](): readonly [
        /**
         * value
         */
        unknown
    ] | readonly [
        /**
         * value
         */
        unknown,
        /**
         * transfer
         */
        Transferable[]
    ] | readonly [
        /**
         * value
         */
        unknown,
        /**
         * transfer
         */
        Transferable[],
        /**
         * typeId (Escape hatch for proxies)
         */
        number
    ];
    static [toDeserialized](_obj: unknown): Serializable;
}
export declare function register(typeId: number, cls: SerializableConstructor): void;
export declare function serialize(arg: any): [Envelope, Transferable[]];
export declare function deserialize(envelope: Envelope): any;
