broadcast-channel
Version:
A BroadcastChannel that works in New Browsers, Old Browsers, WebWorkers, NodeJs, Deno and iframes
75 lines (61 loc) • 2.47 kB
TypeScript
declare type MethodType = 'node' | 'idb' | 'native' | 'localstorage' | 'simulate';
interface BroadcastChannelEventMap {
"message": MessageEvent;
"messageerror": MessageEvent;
}
export interface BroadcastMethod<State = object> {
type: string;
microSeconds(): number;
create(channelName: string, options: BroadcastChannelOptions): Promise<State> | State;
close(channelState: State): void;
onMessage(channelState: State, callback: (args: any) => void): void;
postMessage(channelState: State, message: any): Promise<any>;
canBeUsed(): boolean;
averageResponseTime(): number;
}
export type BroadcastChannelOptions = {
type?: MethodType,
methods?: BroadcastMethod[] | BroadcastMethod,
webWorkerSupport?: boolean;
prepareDelay?: number;
node?: {
ttl?: number;
useFastPath?: boolean;
/**
* Opening too many write files will throw an error.
* So we ensure we throttle to have a max limit on writes.
* @link https://stackoverflow.com/questions/8965606/node-and-error-emfile-too-many-open-files
*/
maxParallelWrites?: number;
};
idb?: {
ttl?: number;
fallbackInterval?: number;
onclose?: () => void;
};
};
declare type EventContext = 'message' | 'internal' | 'leader';
declare type OnMessageHandler<T> = ((this: BroadcastChannel, ev: T) => any) | null;
/**
* api as defined in
* @link https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts
* @link https://github.com/Microsoft/TypeScript/blob/master/src/lib/webworker.generated.d.ts#L325
*/
export class BroadcastChannel<T = any> {
constructor(name: string, opts?: BroadcastChannelOptions);
readonly id: number;
readonly name: string;
readonly options: BroadcastChannelOptions;
readonly type: MethodType;
readonly isClosed: boolean;
postMessage(msg: T): Promise<void>;
close(): Promise<void>;
onmessage: OnMessageHandler<T>;
// not defined in the official standard
addEventListener(type: EventContext, handler: OnMessageHandler<T>): void;
removeEventListener(type: EventContext, handler: OnMessageHandler<T>): void;
}
// statics
export function clearNodeFolder(opts?: BroadcastChannelOptions): Promise<boolean>;
export function enforceOptions(opts?: BroadcastChannelOptions | false | null): void;
export const OPEN_BROADCAST_CHANNELS: Set<BroadcastChannel>;