import { Header } from './encoding.js';
export type { Header };
export type MessageHandler = (header: Header, payload: Uint8Array, serialNumber: string) => void;
export interface RouterOptions {
    onSend: (message: Uint8Array, port: number, address: string, serialNumber?: string) => void;
    onMessage?: MessageHandler;
    handlers?: Map<number, MessageHandler>;
}
export interface RouterInstance {
    nextSource(): number;
    register(source: number, handler: MessageHandler): void;
    deregister(source: number, handler: MessageHandler): void;
    send(message: Uint8Array, port: number, address: string, serialNumber?: string): void;
    receive(message: Uint8Array): {
        header: Header;
        payload: Uint8Array;
        serialNumber: string;
    };
}
/**
 * Since a client is a source of messages and there may be multiple
 * clients sending messages at the same time, the router receives
 * response messages and routes them to the client (a MessageHandler)
 * that sent the request message.
 *
 * It has the added benefit of allowing callers to send messages
 * messages. With the previous benefit, the router helps associate
 * received messages with previously sent messages.
 *
 * It also decodes the header and converts the target to a serial
 * number string. This helps avoid calling the relatively expensive
 * convertTargetToSerialNumber utility function multiple times for
 * each response message.
 */
export declare function Router(options: RouterOptions): RouterInstance;
//# sourceMappingURL=router.d.ts.map