import type { Dispatch, MutableRefObject, SetStateAction } from "react"; import type { RoomCoordinator } from "../../types.js"; import { type Streams } from "../types/SFU.js"; import type { VideoWanted } from "./videoDemand.js"; import { type SFUConnectionStateInternal } from "./sfuTypes.js"; import type { AudioTransportOffer } from "../../transport/session.js"; export interface SetupPeerConnectionDeps { sfuWebSocketRef: MutableRefObject; connectionTimeoutRef: MutableRefObject; isDisconnectingRef: MutableRefObject; setStreams: Dispatch>; setConnectionState: Dispatch>; performCleanup?: (skipServerUpdate?: boolean) => Promise; } export declare function setupPeerConnection(stunServers: string[], deps: SetupPeerConnectionDeps, eSportsModeEnabled?: boolean): RTCPeerConnection; export interface ConnectParams { channelID: string; eSportsModeEnabled?: boolean; channelMaxBitrateBps?: number | null; connectSeq: number; connectSeqRef: MutableRefObject; refs: { isConnectingRef: MutableRefObject; isDisconnectingRef: MutableRefObject; peerConnectionRef: MutableRefObject; sfuWebSocketRef: MutableRefObject; registeredTracksRef: MutableRefObject; connectionTimeoutRef: MutableRefObject; microphoneBufferRef: MutableRefObject<{ processedStream?: MediaStream; mediaStream?: MediaStream; directTrack?: MediaStreamTrack; }>; /** True while a `getUserMedia` is out. See `MIC_BUSY_WAIT_MS`. */ micAcquiringRef: MutableRefObject; activeSfuUrlRef: MutableRefObject; /** * The stream id this connection announced to the signalling server. Held rather than * re-read: `replaceTrack` leaves the sender publishing under the id it was created with. */ announcedStreamIdRef: MutableRefObject; }; connectionState: SFUConnectionStateInternal; isConnected: boolean; /** * Opaque identity for what is being connected to. The client passes the server's host; the * engine compares it and reports it back, and does not parse it. */ targetId: string; stunHosts: string[]; room: RoomCoordinator; /** * Called when this connect supersedes a live one somewhere else. Telling the previous * server needs that server's connection, and the engine holds only the one it is opening. */ releasePreviousRoom?: (previousTargetId: string) => void | Promise; sfuConnectionRefs: { isDisconnectingRef: MutableRefObject; sfuWebSocketRef: MutableRefObject; peerConnectionRef: MutableRefObject; }; setConnectionState: Dispatch>; setStreams: Dispatch>; performCleanup: (skipServerUpdate?: boolean) => Promise; onVideoWanted?: (wanted: VideoWanted & { mid: string; }) => void; onIngestCap?: (bps: number | null) => void; onAudioTransport?: (offer: AudioTransportOffer) => void; onAudioSenders?: (senders: Map) => void; onWebRTCAudioWanted?: (wanted: boolean) => void; } export declare function sfuConnect(params: ConnectParams): Promise;