All checks were successful
Queue Release Build / prepare (push) Successful in 2m28s
Deploy Web Apps / deploy (push) Successful in 7m58s
Queue Release Build / build-linux (push) Successful in 46m59s
Queue Release Build / build-windows (push) Successful in 26m2s
Queue Release Build / finalize (push) Successful in 23s
105 lines
4.5 KiB
TypeScript
105 lines
4.5 KiB
TypeScript
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<LatencyProfile, number> = {
|
|
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;
|