import type { ServerResponse } from "node:http"; import { type RawData, WebSocket } from "ws"; import { type NativePlaybackDiagnostics } from "./native-audio-diagnostics.ts"; export type LanPlaybackDiagnostics = LanSourcePlaybackDiagnostics | NativePlaybackDiagnostics; interface LanSourcePlaybackDiagnostics { source: "lan-playback"; clientId: string; hostUnixMs: number; reason: "interval" | "closed" | "replaced" | "server-closed"; windowMs: number; sentFrames: number; sentBytes: number; droppedFrames: number; droppedBytes: number; maxSocketBacklogBytes: number; sourcePcmArrivalGapMaxMs: number; sourcePcmArrivalGapIncludesPauses: true; } interface AudioConnectionCallbacks { onMessage(data: RawData, isBinary: boolean): void; onReplaced(previous: WebSocket): void; onClose(): void; } export declare class LanVoiceBrowserConnections { private readonly eventResponses; private readonly audioSockets; private readonly audioReports; private readonly clientIds; private readonly onAudioDiagnostics; constructor(onAudioDiagnostics?: (report: LanPlaybackDiagnostics) => void); hasAudioClients(): boolean; connectEvents(clientId: string, response: ServerResponse, closed: boolean): void; connectAudio(clientId: string, socket: WebSocket, closed: boolean, callbacks: AudioConnectionCallbacks): void; isCurrentAudio(clientId: string, socket: WebSocket): boolean; sendControl(clientId: string, value: unknown): void; broadcastControl(value: unknown): void; broadcastTakeover(token: string): void; sendAudio(socket: WebSocket, pcm: Buffer): void; private flushAudioReport; private finishAudioReport; sendAudioControl(socket: WebSocket, value: unknown): void; heartbeat(): void; close(failures: unknown[]): void; } export {};