@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
text/typescript
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 };