import { LagunaObject } from '../types'; import { Endpoint, EventSource, PostMessageWithOrigin } from './thread.types'; export type { Endpoint }; export declare const threadPointer: unique symbol; export declare const createEndpoint: unique symbol; export declare const releasePointer: unique symbol; export interface PointerMarked { [threadPointer]: true; } type Promisify = T extends Promise ? T : Promise; type Unpromisify

= P extends Promise ? T : P; type RemoteProperty = T extends Function | PointerMarked ? Remote : Promisify; type LocalProperty = T extends Function | PointerMarked ? Local : Unpromisify; export type PointerOrClone = T extends PointerMarked ? Remote : T; export type RemovePointerOrClone = T extends RemoteObject ? Local : T; export type RemoteObject = { [P in keyof T]: RemoteProperty; }; export type LocalObject = { [P in keyof T]: LocalProperty; }; export interface PointerMethods { [createEndpoint]: () => Promise; [releasePointer]: () => void; } export type Remote = RemoteObject & (T extends (...args: infer TArguments) => infer TReturn ? (...args: { [I in keyof TArguments]: RemovePointerOrClone; }) => Promisify>> : unknown) & (T extends { new (...args: infer TArguments): infer TInstance; } ? { new (...args: { [I in keyof TArguments]: RemovePointerOrClone; }): Promisify>; } : unknown) & PointerMethods; type MaybePromise = Promise | T; export type Local = Omit, keyof PointerMethods> & (T extends (...args: infer TArguments) => infer TReturn ? (...args: { [I in keyof TArguments]: PointerOrClone; }) => MaybePromise>> : unknown) & (T extends { new (...args: infer TArguments): infer TInstance; } ? { new (...args: { [I in keyof TArguments]: PointerOrClone; }): MaybePromise>>; } : unknown); export interface TransferHandler { canHandle(value: unknown): value is T; serialize(value: T): [S, Transferable[]]; deserialize(value: S): T; } export declare const transferHandlers: Map>; export declare function expose(obj: LagunaObject, ep?: Endpoint): void; export declare const Connect: (ep: Endpoint, target?: LagunaObject) => Remote; export declare function transfer(obj: T, transfers: Transferable[]): T; export declare const pointer: (obj: LagunaObject) => LagunaObject & PointerMarked; export declare const windowEndpoint: (w: PostMessageWithOrigin, context?: EventSource, targetOrigin?: string) => Endpoint; export declare const convertToText: any;