UNPKG

@vgerbot/web-rpc

Version:

A TypeScript library that provides type-safe Remote Procedure Call (RPC) communication between different JavaScript contexts using various transport mechanisms

82 lines (71 loc) 3.27 kB
import browser from 'webextension-polyfill'; type PromisifyFunction<F> = F extends (...args: infer P) => infer R ? (...args: P) => Promise<R extends Promise<infer P> ? P : R> : F; type FilterOutAttributes<Base> = { [Key in keyof Base]: Base[Key] extends (...args: any[]) => any ? Base[Key] : never; }; type PromisifyObject<P, T extends { [key: string]: (...args: any[]) => any; } = FilterOutAttributes<P>> = { [Key in keyof T]: ReturnType<T[Key]> extends Promise<unknown> ? T[Key] : PromisifyFunction<T[Key]>; }; type TypedArray = Uint8Array | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array | Uint8ClampedArray; type SerializableData = string | number | boolean | null | undefined | TypedArray | ArrayBuffer | SerializableData[] | { [key: string | number]: SerializableData; }; interface Transport { send(data: SerializableData, transfer?: Transferable[]): void; onMessage(callback: (data: SerializableData) => void): () => void; close(): void; } declare class WebRPC { private readonly clientId; private readonly ports; private readonly transport; constructor(clientId: string, transport: Transport | ((data: SerializableData, transferables: Transferable[]) => void)); receive(data: unknown): void; register(id: string, instance: unknown): void; get<T>(id: string): PromisifyObject<T>; close(): void; } type BrowserExtensionTransportOptions = { port: browser.Runtime.Port; }; declare class BrowserExtensionTransport implements Transport { private readonly port; private listener?; constructor(options: BrowserExtensionTransportOptions); send(data: SerializableData, transfer?: Transferable[]): void; onMessage(callback: (data: SerializableData) => void): () => void; close(): void; } type MessageSender = Worker | MessagePort | BroadcastChannel | ServiceWorker | DedicatedWorkerGlobalScope; declare class PostMessageTransport<T extends MessageSender> implements Transport { private readonly sender; private readonly cleanup; constructor(sender: T); send(data: SerializableData, transfer?: Transferable[]): void; onMessage(callback: (data: SerializableData) => void): () => void; close(): void; } type WindowPostMessageOptions = { remote: Window; origin?: string; source?: Window; }; declare class WindowPostMessageTransport implements Transport { private readonly remote; private readonly origin; private readonly source; private listener?; constructor(options: WindowPostMessageOptions); send(data: SerializableData, transfer?: Transferable[]): void; onMessage(callback: (data: SerializableData) => void): () => void; close(): void; } declare class SendFunctionTransport implements Transport { readonly send: (data: SerializableData, transferables: Transferable[]) => void; constructor(send: (data: SerializableData, transferables: Transferable[]) => void); onMessage(callback: (data: SerializableData) => void): () => void; close(): void; } export { BrowserExtensionTransport, type BrowserExtensionTransportOptions, PostMessageTransport, SendFunctionTransport, type Transport, WebRPC, type WindowPostMessageOptions, WindowPostMessageTransport, WebRPC as default };