import type { LatencyProfile } from '../../shared-kernel'; /** * All magic numbers and strings used across the WebRTC subsystem. * Centralised here so nothing is hard-coded inline. */ /** Base delay (ms) for exponential backoff on signaling reconnect */ export const SIGNALING_RECONNECT_BASE_DELAY_MS = 1_000; /** Maximum delay (ms) between signaling reconnect attempts */ export const SIGNALING_RECONNECT_MAX_DELAY_MS = 30_000; /** Default timeout (ms) for `ensureSignalingConnected` */ export const SIGNALING_CONNECT_TIMEOUT_MS = 5_000; /** Maximum P2P reconnect attempts before giving up */ export const PEER_RECONNECT_MAX_ATTEMPTS = 12; /** Interval (ms) between P2P reconnect attempts */ export const PEER_RECONNECT_INTERVAL_MS = 5_000; /** How long to wait before treating a transient disconnect as fatal */ export const PEER_DISCONNECT_GRACE_MS = 10_000; /** Interval (ms) for broadcasting state heartbeats */ export const STATE_HEARTBEAT_INTERVAL_MS = 5_000; /** Interval (ms) for application-level signaling keepalive messages */ export const SIGNALING_KEEPALIVE_INTERVAL_MS = 25_000; /** Interval (ms) for broadcasting voice presence */ export const VOICE_HEARTBEAT_INTERVAL_MS = 5_000; /** Data channel name used for P2P chat */ export const DATA_CHANNEL_LABEL = 'chat'; /** High-water mark (bytes) - pause sending when buffered amount exceeds this */ export const DATA_CHANNEL_HIGH_WATER_BYTES = 4 * 1024 * 1024; // 4 MB /** Low-water mark (bytes) - resume sending once buffered amount drops below this */ export const DATA_CHANNEL_LOW_WATER_BYTES = 1 * 1024 * 1024; // 1 MB /** Grace period before recreating a peer whose data channel closed while media may still be flowing. */ export const DATA_CHANNEL_RECOVERY_GRACE_MS = 2_500; export const SCREEN_SHARE_IDEAL_WIDTH = 1920; export const SCREEN_SHARE_IDEAL_HEIGHT = 1080; export const SCREEN_SHARE_IDEAL_FRAME_RATE = 30; /** Electron source name to prefer for whole-screen capture */ export { ELECTRON_ENTIRE_SCREEN_SOURCE_NAME } from '../../shared-kernel'; /** Minimum audio bitrate (bps) */ export const AUDIO_BITRATE_MIN_BPS = 16_000; /** Maximum audio bitrate (bps) */ export const AUDIO_BITRATE_MAX_BPS = 256_000; /** Multiplier to convert kbps -> bps */ export const KBPS_TO_BPS = 1_000; /** Pre-defined latency-to-bitrate mappings (bps) */ export const LATENCY_PROFILE_BITRATES: Record = { low: 64_000, balanced: 96_000, high: 128_000 }; export type { LatencyProfile } from '../../shared-kernel'; export const TRANSCEIVER_SEND_RECV: RTCRtpTransceiverDirection = 'sendrecv'; export const TRANSCEIVER_RECV_ONLY: RTCRtpTransceiverDirection = 'recvonly'; export const TRANSCEIVER_INACTIVE: RTCRtpTransceiverDirection = 'inactive'; export const CONNECTION_STATE_CONNECTED = 'connected'; export const CONNECTION_STATE_DISCONNECTED = 'disconnected'; export const CONNECTION_STATE_FAILED = 'failed'; export const CONNECTION_STATE_CLOSED = 'closed'; export const DATA_CHANNEL_STATE_OPEN = 'open'; export const TRACK_KIND_AUDIO = 'audio'; export const TRACK_KIND_VIDEO = 'video'; export const SIGNALING_TYPE_IDENTIFY = 'identify'; export const SIGNALING_TYPE_JOIN_SERVER = 'join_server'; export const SIGNALING_TYPE_VIEW_SERVER = 'view_server'; export const SIGNALING_TYPE_LEAVE_SERVER = 'leave_server'; export const SIGNALING_TYPE_OFFER = 'offer'; export const SIGNALING_TYPE_ANSWER = 'answer'; export const SIGNALING_TYPE_ICE_CANDIDATE = 'ice_candidate'; export const SIGNALING_TYPE_CONNECTED = 'connected'; export const SIGNALING_TYPE_SERVER_USERS = 'server_users'; export const SIGNALING_TYPE_USER_JOINED = 'user_joined'; export const SIGNALING_TYPE_USER_LEFT = 'user_left'; export const SIGNALING_TYPE_ACCESS_DENIED = 'access_denied'; export const SIGNALING_TYPE_KEEPALIVE = 'keepalive'; export const P2P_TYPE_STATE_REQUEST = 'state-request'; export const P2P_TYPE_VOICE_STATE_REQUEST = 'voice-state-request'; export const P2P_TYPE_VOICE_STATE = 'voice-state'; export const P2P_TYPE_SCREEN_STATE = 'screen-state'; export const P2P_TYPE_CAMERA_STATE = 'camera-state'; export const P2P_TYPE_SCREEN_SHARE_REQUEST = 'screen-share-request'; export const P2P_TYPE_SCREEN_SHARE_STOP = 'screen-share-stop'; export const P2P_TYPE_PING = 'ping'; export const P2P_TYPE_PONG = 'pong'; /** Interval (ms) between peer latency pings */ export const PEER_PING_INTERVAL_MS = 5_000; /** Default display name fallback */ export const DEFAULT_DISPLAY_NAME = 'User'; /** Minimum volume (normalised 0-1) */ export const VOLUME_MIN = 0; /** Maximum volume (normalised 0-1) */ export const VOLUME_MAX = 1;