nanolith
Version:
Multi-threading in no time with seamless TypeScript support.
50 lines (49 loc) • 1.85 kB
TypeScript
import type { Messenger } from '../messenger/index.js';
import type { MessengerMessageType } from '../constants/messenger.js';
export type MessengerBaseMessageBody<Type = MessengerMessageType> = {
type: Type;
sender: string;
};
export type MessengerMessageBody = {
data: any;
} & MessengerBaseMessageBody<MessengerMessageType.Message>;
export type MessengerCloseMessageBody = MessengerBaseMessageBody<MessengerMessageType.Close>;
export type MessengerStreamMessageBody = {
data: any;
} & MessengerBaseMessageBody<MessengerMessageType.StreamMessage>;
export type MessengerRawData = Readonly<{
/**
* The unique identifier for the set of {@link BroadcastChannel}s
* the `Messenger` instances are tuned into.
*/
__messengerID: string;
}>;
export type MessengerList = {
/**
* For use only within workers.
*
* @param name The name of the `Messenger` to use.
* @returns A promise of a {@link Messenger} instance that can be used to send messages between threads.
*
* This function will throw an error if a `Messenger` instance with the specified name was never sent to the worker.
*
* @example
* const messenger = await MessengerList.use('foo');
*
* messenger.onMessage<string>((data) => console.log(data, 'received!'));
*/
use: (name: string) => Promise<Messenger>;
/**
* Grab hold of an object containing all `Messenger`s available within the current worker.
*
* **Tip:** Useful when debugging issues involving `Messenger`s.
*
* @returns An object containing `Messenger`s organized based on their names.
*
* @example
* const map = MessengerList.list;
* console.log(map); // -> { foo: Messenger, bar: Messenger }
* console.log(map.foo.uniqueKey);
*/
list: Record<string, Messenger>;
};