webrtc2-config
Version:
WebRTC2 Config - Configuration management for WebRTC applications with STUN/TURN servers, ICE settings, media constraints, and cross-platform defaults
174 lines (148 loc) • 4.39 kB
text/typescript
/**
* @webrtc2/config
*
* Configuration management for WebRTC2 ecosystem
*/
import type { RTCConnectionConfig } from '@webrtc2/types';
export interface WebRTC2Config {
// Connection settings
rtc: RTCConnectionConfig;
// Signaling server
signaling: {
url: string;
reconnectAttempts: number;
reconnectDelay: number;
};
// Media settings
media: {
video: {
width: number;
height: number;
frameRate: number;
facingMode?: 'user' | 'environment';
};
audio: {
echoCancellation: boolean;
noiseSuppression: boolean;
autoGainControl: boolean;
};
};
// UI settings
ui: {
theme: 'light' | 'dark' | 'auto';
language: string;
showStats: boolean;
};
// Debug settings
debug: {
enabled: boolean;
level: 'debug' | 'info' | 'warn' | 'error';
logToConsole: boolean;
};
}
// Default configuration
export const defaultConfig: WebRTC2Config = {
rtc: {
iceServers: [
{ urls: 'stun:stun.l.google.com:19302' },
{ urls: 'stun:stun1.l.google.com:19302' }
],
bundlePolicy: 'balanced',
rtcpMuxPolicy: 'require'
} as RTCConnectionConfig,
signaling: {
url: 'wss://signaling.webrtc2.com',
reconnectAttempts: 5,
reconnectDelay: 1000
},
media: {
video: {
width: 1280,
height: 720,
frameRate: 30,
facingMode: 'user'
},
audio: {
echoCancellation: true,
noiseSuppression: true,
autoGainControl: true
}
},
ui: {
theme: 'auto',
language: 'en',
showStats: false
},
debug: {
enabled: false,
level: 'info',
logToConsole: true
}
};
// Configuration manager
export class ConfigManager {
private config: WebRTC2Config;
constructor(initialConfig?: Partial<WebRTC2Config>) {
this.config = this.mergeConfig(defaultConfig, initialConfig || {});
}
private mergeConfig(base: WebRTC2Config, override: Partial<WebRTC2Config>): WebRTC2Config {
return {
rtc: { ...base.rtc, ...override.rtc },
signaling: { ...base.signaling, ...override.signaling },
media: {
video: { ...base.media.video, ...override.media?.video },
audio: { ...base.media.audio, ...override.media?.audio }
},
ui: { ...base.ui, ...override.ui },
debug: { ...base.debug, ...override.debug }
};
}
get(): WebRTC2Config {
return { ...this.config };
}
update(updates: Partial<WebRTC2Config>): void {
this.config = this.mergeConfig(this.config, updates);
}
reset(): void {
this.config = { ...defaultConfig };
}
// Specific getters for common use cases
getRTCConfig(): RTCConnectionConfig {
return { ...this.config.rtc };
}
getSignalingUrl(): string {
return this.config.signaling.url;
}
getMediaConstraints(): MediaStreamConstraints {
return {
video: {
width: this.config.media.video.width,
height: this.config.media.video.height,
frameRate: this.config.media.video.frameRate,
facingMode: this.config.media.video.facingMode
},
audio: {
echoCancellation: this.config.media.audio.echoCancellation,
noiseSuppression: this.config.media.audio.noiseSuppression,
autoGainControl: this.config.media.audio.autoGainControl
}
};
}
}
// Default config manager instance
export const config = new ConfigManager();
// Helper functions
export function createConfig(overrides?: Partial<WebRTC2Config>): ConfigManager {
return new ConfigManager(overrides);
}
export function validateConfig(config: Partial<WebRTC2Config>): boolean {
// Basic validation - can be extended
if (config.signaling?.url && !config.signaling.url.startsWith('ws')) {
return false;
}
if (config.media?.video?.width && config.media.video.width <= 0) {
return false;
}
return true;
}
export const VERSION = '1.0.0';