import { Emittable } from "../event/emitter.js"; //#region src/message/port.d.ts /** * Message port events * * @typeParam T - Message data type */ type MessagePortEvents = { /** * `message` event */ message: MessageEvent; /** * `messageerror` event */ messageerror: MessageEvent; }; /** * Safe MessagePort wrapper interface * * @typeParam T - Message data type */ interface SafeMessagePort extends Emittable>, Disposable { /** * The underlying `MessagePort` instance */ raw: MessagePort; /** * Post a message through the port * * @param message - The message to post * @param transfer - Optional transferable objects */ postMessage(message: any, transfer?: Transferable[]): void; /** * Start receiving messages on this port */ start(): void; /** * Close the port and release all resources */ close(): void; /** * Add an event listener to the underlying port */ addEventListener: MessagePort["addEventListener"]; /** * Remove an event listener from the underlying port */ removeEventListener: MessagePort["removeEventListener"]; /** * Dispatch an event to the underlying port */ dispatchEvent: MessagePort["dispatchEvent"]; /** * The onmessage event handler */ onmessage: MessagePort["onmessage"]; /** * The onmessageerror event handler */ onmessageerror: MessagePort["onmessageerror"]; } /** * Return type for {@link safeMessagePort} * * @typeParam T - Message data type */ type SafeMessagePortResult = Readonly, "onmessage" | "onmessageerror">> & Pick, "onmessage" | "onmessageerror">; /** * Create a safe {@link MessagePort} wrapper as an {@link Emittable | event emitter} * * The returned SafeMessagePort will automatically handle the closing of the `MessagePort` when disposed, and it will also manage event listeners to prevent memory leaks. * * The underlying `MessagePort` will be started automatically. * * @typeParam T - Message data type * * @param port - The MessagePort to wrap * @returns A {@link SafeMessagePort} that wraps the `MessagePort` * * @example * ```ts * const channel = new MessageChannel() * const port = safeMessagePort<{ greeting: string }>(channel.port1) * * port.on('message', (event) => { * console.log(event.data.greeting) // type-safe * }) * * port.postMessage({ greeting: 'hello' }) // type-safe * ``` */ declare function safeMessagePort(port: MessagePort): SafeMessagePortResult; //#endregion export { MessagePortEvents, SafeMessagePort, SafeMessagePortResult, safeMessagePort };