@livepeer-frameworks/streamcrafter-core 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +24 -1
  2. package/dist/cjs/IngestControllerV2-BSD6O8gz.cjs +5662 -0
  3. package/dist/cjs/IngestControllerV2-BSD6O8gz.cjs.map +1 -0
  4. package/dist/cjs/IngestControllerV2-DZFuxrNk.cjs +5768 -0
  5. package/dist/cjs/IngestControllerV2-DZFuxrNk.cjs.map +1 -0
  6. package/dist/cjs/IngestControllerV2-Mt6aX-DU.cjs +5768 -0
  7. package/dist/cjs/IngestControllerV2-Mt6aX-DU.cjs.map +1 -0
  8. package/dist/cjs/index.cjs +60 -5
  9. package/dist/cjs/index.cjs.map +1 -1
  10. package/dist/cjs/vanilla.cjs +1 -1
  11. package/dist/cjs/vanilla.cjs.map +1 -1
  12. package/dist/esm/IngestControllerV2-BaOxEiTq.js +5606 -0
  13. package/dist/esm/IngestControllerV2-BaOxEiTq.js.map +1 -0
  14. package/dist/esm/IngestControllerV2-DswB_ybx.js +5712 -0
  15. package/dist/esm/IngestControllerV2-DswB_ybx.js.map +1 -0
  16. package/dist/esm/IngestControllerV2-fiwB1xzE.js +5712 -0
  17. package/dist/esm/IngestControllerV2-fiwB1xzE.js.map +1 -0
  18. package/dist/esm/index.js +61 -6
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/vanilla.js +1 -1
  21. package/dist/esm/vanilla.js.map +1 -1
  22. package/dist/types/core/EncoderManager.d.ts +6 -0
  23. package/dist/types/core/IngestControllerV2.d.ts +7 -0
  24. package/dist/types/core/SceneManager.d.ts +6 -0
  25. package/dist/types/core/WhipClient.d.ts +1 -0
  26. package/dist/types/core/renderers/Canvas2DRenderer.d.ts +1 -0
  27. package/dist/types/core/renderers/WebGLRenderer.d.ts +1 -0
  28. package/dist/types/core/renderers/WebGPURenderer.d.ts +3 -0
  29. package/dist/types/core/renderers/index.d.ts +5 -0
  30. package/dist/types/types.d.ts +5 -0
  31. package/dist/workers/compositor.worker.js +92 -5
  32. package/dist/workers/compositor.worker.js.map +1 -1
  33. package/dist/workers/encoder.worker.js +2 -2
  34. package/dist/workers/encoder.worker.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/core/EncoderManager.ts +63 -1
  37. package/src/core/IngestControllerV2.ts +114 -98
  38. package/src/core/SceneManager.ts +16 -3
  39. package/src/core/WhipClient.ts +26 -0
  40. package/src/core/renderers/WebGPURenderer.ts +1 -1
  41. package/src/vanilla/StreamCrafterV2.ts +0 -1
  42. package/src/workers/compositor.worker.ts +1 -2
  43. package/src/workers/encoder.worker.ts +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IngestControllerV2-BSD6O8gz.cjs","sources":["../../src/types.ts","../../src/core/EventEmitter.ts","../../src/core/MediaConstraints.ts","../../src/core/DeviceManager.ts","../../src/core/ScreenCapture.ts","../../src/core/WhipClient.ts","../../src/core/AudioMixer.ts","../../src/core/ReconnectionManager.ts","../../src/core/layouts/index.ts","../../src/core/TransitionEngine.ts","../../src/core/SceneManager.ts","../../src/core/EncoderManager.ts","../../src/core/FeatureDetection.ts","../../src/core/IngestControllerV2.ts"],"sourcesContent":["/**\n * StreamCrafter Core Types\n * Type definitions for browser-based streaming with WebCodecs\n */\n\n// ============================================================================\n// State Types\n// ============================================================================\n\nexport type IngestState =\n | 'idle'\n | 'requesting_permissions'\n | 'capturing'\n | 'connecting'\n | 'streaming'\n | 'reconnecting'\n | 'error'\n | 'destroyed';\n\nexport type WhipConnectionState =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'failed'\n | 'closed';\n\nexport type QualityProfile = 'professional' | 'broadcast' | 'conference' | 'auto';\n\n// ============================================================================\n// Device Types\n// ============================================================================\n\nexport interface DeviceInfo {\n deviceId: string;\n kind: 'audioinput' | 'videoinput' | 'audiooutput';\n label: string;\n groupId: string;\n}\n\nexport interface CaptureOptions {\n videoDeviceId?: string;\n audioDeviceId?: string;\n facingMode?: 'user' | 'environment';\n profile?: QualityProfile;\n customConstraints?: MediaStreamConstraints;\n}\n\nexport interface ScreenCaptureOptions {\n video?: boolean | DisplayMediaStreamOptions['video'];\n audio?: boolean | DisplayMediaStreamOptions['audio'];\n preferCurrentTab?: boolean;\n systemAudio?: 'include' | 'exclude';\n /** Cursor visibility in screen capture */\n cursor?: 'always' | 'motion' | 'never';\n /** Allow switching surfaces during capture (Chrome 107+) */\n surfaceSwitching?: boolean;\n /** Include/exclude self browser surface (Chrome 107+) */\n selfBrowserSurface?: 'include' | 'exclude';\n /** Monitor type surfaces (Chrome 119+) */\n monitorTypeSurfaces?: 'include' | 'exclude';\n}\n\n// ============================================================================\n// Quality Profile Types\n// ============================================================================\n\nexport interface QualityProfileInfo {\n id: QualityProfile;\n name: string;\n description: string;\n}\n\nexport interface AudioConstraintProfile {\n echoCancellation: boolean;\n noiseSuppression: boolean;\n autoGainControl: boolean;\n sampleRate: number;\n channelCount: number;\n latency?: number;\n}\n\nexport interface VideoConstraintProfile {\n width: { ideal: number };\n height: { ideal: number };\n frameRate: { ideal: number };\n}\n\n// ============================================================================\n// WHIP Client Types\n// ============================================================================\n\nexport interface WhipClientConfig {\n whipUrl: string;\n iceServers?: RTCIceServer[];\n debug?: boolean;\n}\n\nexport interface WhipClientEvents {\n stateChange: { state: WhipConnectionState; previousState: WhipConnectionState };\n stats: { video: RTCOutboundStats; audio: RTCOutboundStats };\n error: { message: string; error?: Error };\n iceCandidate: { candidate: RTCIceCandidate | null };\n}\n\nexport interface RTCOutboundStats {\n bytesSent: number;\n packetsSent: number;\n packetsLost: number;\n bitrate?: number;\n}\n\n// ============================================================================\n// Ingest Controller Types\n// ============================================================================\n\nexport interface IngestControllerConfig {\n whipUrl: string;\n iceServers?: RTCIceServer[];\n profile?: QualityProfile;\n useWebCodecs?: boolean;\n debug?: boolean;\n}\n\nexport interface IngestStateContext {\n reason?: string;\n error?: string;\n connectionState?: WhipConnectionState;\n hasVideo?: boolean;\n hasAudio?: boolean;\n isScreenShare?: boolean;\n}\n\nexport interface IngestControllerEvents {\n stateChange: { state: IngestState; context?: IngestStateContext };\n statsUpdate: IngestStats;\n deviceChange: { devices: DeviceInfo[] };\n error: { error: string; recoverable: boolean };\n}\n\nexport interface IngestStats {\n video: {\n bytesSent: number;\n packetsSent: number;\n packetsLost: number;\n framesEncoded: number;\n framesPerSecond: number;\n bitrate: number;\n };\n audio: {\n bytesSent: number;\n packetsSent: number;\n packetsLost: number;\n bitrate: number;\n };\n connection: {\n rtt: number;\n state: RTCPeerConnectionState;\n iceState: RTCIceConnectionState;\n };\n timestamp: number;\n}\n\n// ============================================================================\n// Browser Capability Types\n// ============================================================================\n\nexport interface BrowserCapabilities {\n webcodecs: {\n videoEncoder: boolean;\n audioEncoder: boolean;\n mediaStreamTrackProcessor: boolean;\n mediaStreamTrackGenerator: boolean;\n };\n webrtc: {\n peerConnection: boolean;\n replaceTrack: boolean;\n insertableStreams: boolean;\n scriptTransform: boolean;\n };\n mediaDevices: {\n getUserMedia: boolean;\n getDisplayMedia: boolean;\n enumerateDevices: boolean;\n };\n recommended: 'webcodecs' | 'mediastream';\n}\n\n// ============================================================================\n// Encoder Types\n// ============================================================================\n\nexport interface VideoEncoderSettings {\n codec: string;\n width: number;\n height: number;\n bitrate: number;\n framerate: number;\n}\n\nexport interface AudioEncoderSettings {\n codec: string;\n sampleRate: number;\n numberOfChannels: number;\n bitrate: number;\n}\n\nexport interface EncoderConfig {\n video: VideoEncoderSettings;\n audio: AudioEncoderSettings;\n}\n\n/**\n * Partial overrides for encoder settings\n * Allows UI to override individual settings from the profile defaults\n */\nexport interface EncoderOverrides {\n video?: {\n width?: number;\n height?: number;\n bitrate?: number;\n framerate?: number;\n };\n audio?: {\n bitrate?: number;\n sampleRate?: number;\n numberOfChannels?: number;\n };\n}\n\n// ============================================================================\n// Worker Message Types\n// ============================================================================\n\nexport type WorkerMessageType =\n | 'initialize'\n | 'videoFrame'\n | 'audioData'\n | 'start'\n | 'stop'\n | 'updateConfig'\n | 'ready'\n | 'error'\n | 'stats';\n\nexport interface WorkerMessage {\n type: WorkerMessageType;\n data?: unknown;\n}\n\nexport interface WorkerInitMessage extends WorkerMessage {\n type: 'initialize';\n data: EncoderConfig;\n}\n\nexport interface WorkerFrameMessage extends WorkerMessage {\n type: 'videoFrame';\n data: {\n frame: VideoFrame;\n timestamp: number;\n };\n}\n\nexport interface WorkerAudioMessage extends WorkerMessage {\n type: 'audioData';\n data: {\n audioData: AudioData;\n timestamp: number;\n };\n}\n\n// ============================================================================\n// Multi-Source Types (Phase 2)\n// ============================================================================\n\nexport type SourceType = 'camera' | 'screen' | 'custom';\n\nexport interface MediaSource {\n id: string;\n type: SourceType;\n stream: MediaStream;\n label: string;\n active: boolean;\n muted: boolean;\n volume: number; // 0.0 - 2.0 for audio mixing (200% boost)\n primaryVideo: boolean; // Is this the primary video source for streaming\n}\n\nexport interface SourceAddedEvent {\n source: MediaSource;\n}\n\nexport interface SourceRemovedEvent {\n sourceId: string;\n}\n\nexport interface SourceUpdatedEvent {\n source: MediaSource;\n changes: Partial<MediaSource>;\n}\n\n// ============================================================================\n// Audio Mixer Types (Phase 2)\n// ============================================================================\n\nexport interface AudioMixerConfig {\n sampleRate?: number;\n channelCount?: number;\n}\n\nexport interface AudioMixerEvents {\n outputChanged: { stream: MediaStream };\n sourceAdded: { sourceId: string };\n sourceRemoved: { sourceId: string };\n levelUpdate: { level: number; peakLevel: number }; // 0-1 normalized levels for VU meter\n error: { message: string; error?: Error };\n}\n\nexport interface AudioSourceOptions {\n volume?: number;\n muted?: boolean;\n pan?: number; // -1.0 (left) to 1.0 (right)\n}\n\n// ============================================================================\n// Reconnection Types (Phase 2)\n// ============================================================================\n\nexport interface ReconnectionConfig {\n enabled: boolean;\n maxAttempts: number;\n baseDelay: number; // ms\n maxDelay: number; // ms\n backoffMultiplier: number;\n}\n\nexport interface ReconnectionState {\n isReconnecting: boolean;\n attemptNumber: number;\n nextAttemptIn: number | null; // ms until next attempt\n lastError: string | null;\n}\n\nexport interface ReconnectionEvents {\n attemptStart: { attempt: number; delay: number };\n attemptSuccess: undefined;\n attemptFailed: { attempt: number; error: string };\n exhausted: { totalAttempts: number };\n}\n\n// ============================================================================\n// Extended Ingest Controller Types (Phase 2)\n// ============================================================================\n\nexport interface IngestControllerConfigV2 extends IngestControllerConfig {\n reconnection?: Partial<ReconnectionConfig>;\n audioMixing?: boolean;\n compositor?: Partial<CompositorConfig>;\n}\n\nexport interface IngestControllerEventsV2 extends IngestControllerEvents {\n sourceAdded: SourceAddedEvent;\n sourceRemoved: SourceRemovedEvent;\n sourceUpdated: SourceUpdatedEvent;\n qualityChanged: { profile: QualityProfile; previousProfile: QualityProfile };\n reconnectionAttempt: { attempt: number; maxAttempts: number };\n reconnectionSuccess: undefined;\n reconnectionFailed: { error: string };\n webCodecsActive: { active: boolean };\n}\n\nexport interface IngestStateContextV2 extends IngestStateContext {\n sources?: MediaSource[];\n activeProfile?: QualityProfile;\n reconnection?: ReconnectionState;\n}\n\n// ============================================================================\n// Scene & Layer Types (Phase 3 - Compositor)\n// ============================================================================\n\nexport interface Scene {\n id: string;\n name: string;\n layers: Layer[];\n backgroundColor: string; // hex color for empty areas\n}\n\nexport interface Layer {\n id: string;\n sourceId: string; // references MediaSource.id\n visible: boolean;\n locked: boolean;\n zIndex: number;\n transform: LayerTransform;\n scalingMode: ScalingMode; // How source is scaled to fit layer bounds\n}\n\nexport interface LayerTransform {\n // Position (0-1 relative to canvas)\n x: number;\n y: number;\n // Size (0-1 relative to canvas)\n width: number;\n height: number;\n // Effects\n opacity: number; // 0-1\n rotation: number; // degrees\n borderRadius: number; // pixels\n // Crop (0-1 from each edge)\n crop: CropConfig;\n}\n\nexport interface CropConfig {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n// ============================================================================\n// Layout Types (Phase 3 - Compositor)\n// ============================================================================\n\nexport type LayoutMode =\n | 'solo' // Single source fullscreen\n | 'pip-br' // PiP bottom-right\n | 'pip-bl' // PiP bottom-left\n | 'pip-tr' // PiP top-right\n | 'pip-tl' // PiP top-left\n | 'split-h' // Split horizontal 50/50\n | 'split-v' // Split vertical 50/50\n | 'focus-l' // Focus left (70/30)\n | 'focus-r' // Focus right (30/70)\n | 'grid' // Auto grid (2x2, 3x3, etc based on source count)\n | 'stack' // Vertical stack\n // 3-source layouts\n | 'pip-dual-br' // Main + 2 PiPs bottom-right\n | 'pip-dual-bl' // Main + 2 PiPs bottom-left\n | 'split-pip-l' // Split + PiP on left side\n | 'split-pip-r' // Split + PiP on right side\n // Featured layout (1 big, rest in strip)\n | 'featured' // Main source large, others in bottom strip\n | 'featured-r' // Main source large, others in right strip\n // Legacy aliases\n | 'fullscreen' // Alias for 'solo'\n | 'pip' // Alias for 'pip-br'\n | 'side-by-side'; // Alias for 'split-h'\n\n// Legacy types for compatibility\nexport type PipPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\nexport type SplitDirection = 'horizontal' | 'vertical';\n\n// How sources are scaled to fit their layer bounds\nexport type ScalingMode =\n | 'stretch' // Stretch to fill (may distort)\n | 'letterbox' // Fit with black bars (preserve aspect)\n | 'crop'; // Fill and crop overflow (preserve aspect)\n\nexport interface LayoutConfig {\n mode: LayoutMode;\n // Scaling mode for all layers\n scalingMode?: ScalingMode;\n // PiP scale (for pip-* modes)\n pipScale?: number; // 0.2 = 20% of canvas (default 0.25)\n // Legacy options (for backwards compatibility)\n pipPosition?: PipPosition;\n splitRatio?: number;\n splitDirection?: SplitDirection;\n}\n\n// ============================================================================\n// Transition Types (Phase 3 - Compositor)\n// ============================================================================\n\nexport type TransitionType =\n | 'cut'\n | 'fade'\n | 'slide-left'\n | 'slide-right'\n | 'slide-up'\n | 'slide-down';\n\nexport type EasingType = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out';\n\nexport interface TransitionConfig {\n type: TransitionType;\n durationMs: number; // 300-1000ms typical\n easing: EasingType;\n}\n\nexport interface TransitionState {\n active: boolean;\n type: TransitionType;\n progress: number; // 0-1\n fromSceneId: string;\n toSceneId: string;\n startTime: number;\n durationMs: number;\n}\n\n// ============================================================================\n// Renderer Types (Phase 3 - Compositor)\n// ============================================================================\n\nexport type RendererType = 'canvas2d' | 'webgl' | 'webgpu' | 'auto';\n\nexport interface RendererStats {\n fps: number;\n frameTimeMs: number;\n gpuMemoryMB?: number;\n}\n\nexport type FilterType = 'blur' | 'colorMatrix' | 'glow' | 'grayscale' | 'sepia' | 'invert';\n\nexport interface FilterConfig {\n type: FilterType;\n strength?: number;\n brightness?: number;\n contrast?: number;\n saturation?: number;\n hue?: number;\n}\n\n// ============================================================================\n// Compositor Configuration (Phase 3)\n// ============================================================================\n\nexport interface CompositorConfig {\n enabled: boolean;\n width: number; // output resolution\n height: number;\n frameRate: number; // 30 or 60\n renderer: RendererType;\n defaultTransition: TransitionConfig;\n}\n\n// Default compositor configuration\nexport const DEFAULT_COMPOSITOR_CONFIG: CompositorConfig = {\n enabled: false,\n width: 1920,\n height: 1080,\n frameRate: 30,\n renderer: 'auto',\n defaultTransition: {\n type: 'fade',\n durationMs: 500,\n easing: 'ease-in-out',\n },\n};\n\n// Default layer transform\nexport const DEFAULT_LAYER_TRANSFORM: LayerTransform = {\n x: 0,\n y: 0,\n width: 1,\n height: 1,\n opacity: 1,\n rotation: 0,\n borderRadius: 0,\n crop: { top: 0, right: 0, bottom: 0, left: 0 },\n};\n\n// ============================================================================\n// Compositor Worker Messages (Phase 3)\n// ============================================================================\n\n/**\n * Layout transition animation configuration\n */\nexport interface LayoutTransitionConfig {\n durationMs: number;\n easing: EasingType;\n}\n\nexport type CompositorMainToWorker =\n | { type: 'init'; config: CompositorConfig; canvas: OffscreenCanvas }\n | { type: 'updateScene'; scene: Scene }\n | { type: 'sourceFrame'; sourceId: string; frame: VideoFrame }\n | { type: 'sourceImage'; sourceId: string; bitmap: ImageBitmap }\n | { type: 'startTransition'; transition: TransitionConfig; toSceneId: string }\n | { type: 'updateLayout'; layout: LayoutConfig }\n | { type: 'animateLayout'; targetScene: Scene; transition: LayoutTransitionConfig }\n | { type: 'resize'; width: number; height: number; frameRate?: number }\n | { type: 'setRenderer'; renderer: RendererType }\n | { type: 'applyFilter'; layerId: string; filter: FilterConfig }\n | { type: 'destroy' };\n\nexport type CompositorWorkerToMain =\n | { type: 'ready' }\n | { type: 'stats'; stats: RendererStats }\n | { type: 'transitionComplete'; sceneId: string }\n | { type: 'layoutAnimationComplete' }\n | { type: 'rendererChanged'; renderer: RendererType }\n | { type: 'error'; message: string };\n\n// ============================================================================\n// Scene Manager Events (Phase 3)\n// ============================================================================\n\nexport interface SceneManagerEvents {\n sceneCreated: { scene: Scene };\n sceneDeleted: { sceneId: string };\n sceneActivated: { scene: Scene; previousSceneId: string | null };\n layerAdded: { sceneId: string; layer: Layer };\n layerRemoved: { sceneId: string; layerId: string };\n layerUpdated: { sceneId: string; layer: Layer };\n transitionStarted: { fromSceneId: string; toSceneId: string; transition: TransitionConfig };\n transitionCompleted: { sceneId: string };\n layoutAnimationStarted: { layout: LayoutConfig };\n layoutAnimationCompleted: { layout: LayoutConfig };\n rendererChanged: { renderer: RendererType };\n statsUpdate: { stats: RendererStats };\n error: { message: string; error?: Error };\n}\n\n// ============================================================================\n// Ingest Endpoint Resolution Types (Gateway Integration)\n// ============================================================================\n\nexport interface IngestEndpoint {\n nodeId: string;\n baseUrl: string;\n whipUrl?: string;\n rtmpUrl?: string;\n srtUrl?: string;\n region?: string;\n loadScore?: number;\n}\n\nexport interface IngestMetadata {\n streamId: string;\n streamKey: string;\n tenantId: string;\n recordingEnabled: boolean;\n}\n\nexport interface IngestEndpoints {\n primary: IngestEndpoint;\n fallbacks: IngestEndpoint[];\n metadata?: IngestMetadata;\n}\n\nexport interface IngestClientConfig {\n gatewayUrl: string;\n streamKey: string;\n authToken?: string;\n maxRetries?: number;\n initialDelayMs?: number;\n}\n\nexport type IngestClientStatus = 'idle' | 'loading' | 'ready' | 'error';\n\nexport interface IngestClientEvents {\n statusChange: { status: IngestClientStatus; error?: string };\n endpointsResolved: { endpoints: IngestEndpoints };\n}\n","/**\n * Typed Event Emitter\n * A type-safe event emitter for StreamCrafter\n */\n\ntype EventHandler<T> = (data: T) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventMap = { [key: string]: any };\n\nexport class TypedEventEmitter<Events extends EventMap> {\n private listeners = new Map<keyof Events, Set<EventHandler<unknown>>>();\n\n /**\n * Subscribe to an event\n */\n on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler as EventHandler<unknown>);\n\n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event (once)\n */\n once<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): () => void {\n const wrappedHandler: EventHandler<Events[K]> = (data) => {\n this.off(event, wrappedHandler);\n handler(data);\n };\n return this.on(event, wrappedHandler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler<unknown>);\n if (handlers.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n /**\n * Emit an event\n */\n protected emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in event handler for \"${String(event)}\":`, error);\n }\n });\n }\n }\n\n /**\n * Remove all listeners for an event (or all events if no event specified)\n */\n removeAllListeners<K extends keyof Events>(event?: K): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /**\n * Get the number of listeners for an event\n */\n listenerCount<K extends keyof Events>(event: K): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","/**\n * Media Quality Profiles\n * Configurable audio/video processing controls for different use cases\n * Ported from StreamCrafter MediaQualityProfiles.jsx\n */\n\nimport type {\n QualityProfile,\n QualityProfileInfo,\n AudioConstraintProfile,\n VideoConstraintProfile,\n} from '../types';\n\n/**\n * Get audio constraints for a quality profile\n */\nexport function getAudioConstraints(profile: QualityProfile = 'professional'): AudioConstraintProfile {\n const profiles: Record<QualityProfile, AudioConstraintProfile> = {\n professional: {\n // Raw audio for professional streaming/recording\n echoCancellation: false,\n noiseSuppression: false,\n autoGainControl: false,\n sampleRate: 48000,\n channelCount: 2,\n latency: 0.01,\n },\n\n broadcast: {\n // Minimal processing for live streaming\n echoCancellation: false,\n noiseSuppression: true, // Light noise suppression only\n autoGainControl: false,\n sampleRate: 48000,\n channelCount: 2,\n latency: 0.02,\n },\n\n conference: {\n // Optimized for video calls/meetings\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n sampleRate: 44100,\n channelCount: 1, // Mono for bandwidth\n latency: 0.05,\n },\n\n auto: {\n // Let browser decide (default browser behavior)\n echoCancellation: false,\n noiseSuppression: false,\n autoGainControl: false,\n sampleRate: 48000,\n channelCount: 2,\n },\n };\n\n return profiles[profile] || profiles.professional;\n}\n\n/**\n * Get video constraints for a quality profile\n */\nexport function getVideoConstraints(profile: QualityProfile = 'professional'): VideoConstraintProfile {\n const profiles: Record<QualityProfile, VideoConstraintProfile> = {\n professional: {\n // Raw video for professional streaming\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n frameRate: { ideal: 30 },\n },\n\n broadcast: {\n // Optimized for streaming\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n frameRate: { ideal: 30 },\n },\n\n conference: {\n // Optimized for video calls\n width: { ideal: 1280 },\n height: { ideal: 720 },\n frameRate: { ideal: 24 },\n },\n\n auto: {\n // Standard constraints, let browser optimize\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n frameRate: { ideal: 30 },\n },\n };\n\n return profiles[profile] || profiles.professional;\n}\n\n/**\n * Get available quality profiles with descriptions\n */\nexport function getAvailableProfiles(): QualityProfileInfo[] {\n return [\n {\n id: 'professional',\n name: 'Professional',\n description: 'Raw quality for content creators - disables all browser processing',\n },\n {\n id: 'broadcast',\n name: 'Broadcast',\n description: 'Minimal processing optimized for live streaming',\n },\n {\n id: 'conference',\n name: 'Conference',\n description: 'Full processing for video calls and meetings',\n },\n {\n id: 'auto',\n name: 'Auto',\n description: 'Let browser decide optimal settings',\n },\n ];\n}\n\n/**\n * Build full MediaStreamConstraints from a quality profile\n */\nexport function buildMediaConstraints(\n profile: QualityProfile,\n options?: {\n videoDeviceId?: string;\n audioDeviceId?: string;\n facingMode?: 'user' | 'environment';\n }\n): MediaStreamConstraints {\n const audioProfile = getAudioConstraints(profile);\n const videoProfile = getVideoConstraints(profile);\n\n const constraints: MediaStreamConstraints = {\n audio: {\n echoCancellation: audioProfile.echoCancellation,\n noiseSuppression: audioProfile.noiseSuppression,\n autoGainControl: audioProfile.autoGainControl,\n sampleRate: audioProfile.sampleRate,\n channelCount: audioProfile.channelCount,\n ...(options?.audioDeviceId && { deviceId: { exact: options.audioDeviceId } }),\n },\n video: {\n width: videoProfile.width,\n height: videoProfile.height,\n frameRate: videoProfile.frameRate,\n ...(options?.videoDeviceId && { deviceId: { exact: options.videoDeviceId } }),\n ...(options?.facingMode && { facingMode: options.facingMode }),\n },\n };\n\n return constraints;\n}\n\n/**\n * Merge quality profile with custom constraints\n */\nexport function mergeWithCustomConstraints(\n profile: QualityProfile,\n customConstraints: Partial<MediaStreamConstraints> = {}\n): MediaStreamConstraints {\n const baseConstraints = buildMediaConstraints(profile);\n\n return {\n audio:\n typeof baseConstraints.audio === 'object' && typeof customConstraints.audio === 'object'\n ? { ...baseConstraints.audio, ...customConstraints.audio }\n : customConstraints.audio ?? baseConstraints.audio,\n video:\n typeof baseConstraints.video === 'object' && typeof customConstraints.video === 'object'\n ? { ...baseConstraints.video, ...customConstraints.video }\n : customConstraints.video ?? baseConstraints.video,\n };\n}\n\n/**\n * Get encoder settings for a quality profile\n */\nexport function getEncoderSettings(profile: QualityProfile = 'professional') {\n const settings = {\n professional: {\n video: {\n codec: 'avc1.42E01E', // H.264 Baseline\n width: 1920,\n height: 1080,\n bitrate: 4_000_000, // 4 Mbps\n framerate: 30,\n },\n audio: {\n codec: 'opus',\n sampleRate: 48000,\n numberOfChannels: 2,\n bitrate: 128_000, // 128 kbps\n },\n },\n\n broadcast: {\n video: {\n codec: 'avc1.42E01E',\n width: 1920,\n height: 1080,\n bitrate: 2_500_000, // 2.5 Mbps\n framerate: 30,\n },\n audio: {\n codec: 'opus',\n sampleRate: 48000,\n numberOfChannels: 2,\n bitrate: 128_000,\n },\n },\n\n conference: {\n video: {\n codec: 'avc1.42E01E',\n width: 1280,\n height: 720,\n bitrate: 1_500_000, // 1.5 Mbps\n framerate: 24,\n },\n audio: {\n codec: 'opus',\n sampleRate: 48000,\n numberOfChannels: 2,\n bitrate: 128_000, // 128 kbps - same as other profiles\n },\n },\n\n auto: {\n video: {\n codec: 'avc1.42E01E',\n width: 1920,\n height: 1080,\n bitrate: 2_000_000, // 2 Mbps\n framerate: 30,\n },\n audio: {\n codec: 'opus',\n sampleRate: 48000,\n numberOfChannels: 2,\n bitrate: 128_000,\n },\n },\n };\n\n return settings[profile] || settings.professional;\n}\n","/**\n * Device Manager\n * Handles camera/microphone enumeration and capture\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport { buildMediaConstraints } from './MediaConstraints';\nimport type { DeviceInfo, CaptureOptions, QualityProfile } from '../types';\n\ninterface DeviceManagerEvents {\n devicesChanged: { devices: DeviceInfo[] };\n permissionChanged: { granted: boolean; denied: boolean };\n error: { message: string; error?: Error };\n}\n\nexport class DeviceManager extends TypedEventEmitter<DeviceManagerEvents> {\n private devices: DeviceInfo[] = [];\n private currentStream: MediaStream | null = null;\n private permissionStatus: { video: boolean; audio: boolean } = {\n video: false,\n audio: false,\n };\n\n constructor() {\n super();\n this.setupDeviceChangeListener();\n }\n\n /**\n * Set up listener for device changes\n */\n private setupDeviceChangeListener(): void {\n if (typeof navigator !== 'undefined' && navigator.mediaDevices) {\n navigator.mediaDevices.addEventListener('devicechange', async () => {\n await this.enumerateDevices();\n this.emit('devicesChanged', { devices: this.devices });\n });\n }\n }\n\n /**\n * Enumerate all media devices\n */\n async enumerateDevices(): Promise<DeviceInfo[]> {\n if (!navigator.mediaDevices?.enumerateDevices) {\n throw new Error('enumerateDevices not supported');\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices();\n\n this.devices = devices\n .filter((d) => d.kind === 'audioinput' || d.kind === 'videoinput' || d.kind === 'audiooutput')\n .map((d) => ({\n deviceId: d.deviceId,\n kind: d.kind as DeviceInfo['kind'],\n label: d.label || `${d.kind} (${d.deviceId.slice(0, 8)}...)`,\n groupId: d.groupId,\n }));\n\n return this.devices;\n }\n\n /**\n * Get video input devices (cameras)\n */\n async getVideoInputs(): Promise<DeviceInfo[]> {\n await this.enumerateDevices();\n return this.devices.filter((d) => d.kind === 'videoinput');\n }\n\n /**\n * Get audio input devices (microphones)\n */\n async getAudioInputs(): Promise<DeviceInfo[]> {\n await this.enumerateDevices();\n return this.devices.filter((d) => d.kind === 'audioinput');\n }\n\n /**\n * Get audio output devices (speakers)\n */\n async getAudioOutputs(): Promise<DeviceInfo[]> {\n await this.enumerateDevices();\n return this.devices.filter((d) => d.kind === 'audiooutput');\n }\n\n /**\n * Request permissions for camera and/or microphone\n */\n async requestPermissions(options: { video?: boolean; audio?: boolean } = { video: true, audio: true }): Promise<{ video: boolean; audio: boolean }> {\n try {\n // Request a temporary stream to trigger permission prompts\n const stream = await navigator.mediaDevices.getUserMedia({\n video: options.video,\n audio: options.audio,\n });\n\n // Stop all tracks immediately\n stream.getTracks().forEach((track) => track.stop());\n\n // Update permission status\n if (options.video) this.permissionStatus.video = true;\n if (options.audio) this.permissionStatus.audio = true;\n\n // Re-enumerate devices to get labels\n await this.enumerateDevices();\n\n this.emit('permissionChanged', {\n granted: true,\n denied: false,\n });\n\n return this.permissionStatus;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError') {\n this.emit('permissionChanged', {\n granted: false,\n denied: true,\n });\n }\n\n this.emit('error', {\n message: `Permission request failed: ${err.message}`,\n error: err,\n });\n\n throw error;\n }\n }\n\n /**\n * Check if permissions are granted\n */\n hasPermission(kind: 'video' | 'audio'): boolean {\n return this.permissionStatus[kind];\n }\n\n /**\n * Get user media with quality profile\n */\n async getUserMedia(options: CaptureOptions = {}): Promise<MediaStream> {\n const profile: QualityProfile = options.profile || 'professional';\n\n let constraints: MediaStreamConstraints;\n\n if (options.customConstraints) {\n constraints = options.customConstraints;\n } else {\n constraints = buildMediaConstraints(profile, {\n videoDeviceId: options.videoDeviceId,\n audioDeviceId: options.audioDeviceId,\n facingMode: options.facingMode,\n });\n }\n\n try {\n // Try with all constraints first\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n this.currentStream = stream;\n\n // Update permission status\n if (stream.getVideoTracks().length > 0) this.permissionStatus.video = true;\n if (stream.getAudioTracks().length > 0) this.permissionStatus.audio = true;\n\n return stream;\n } catch (error) {\n // Fallback: try without specific device constraints\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (err.name === 'OverconstrainedError') {\n // Try with relaxed constraints\n const relaxedConstraints: MediaStreamConstraints = {\n video: constraints.video ? true : false,\n audio: constraints.audio ? true : false,\n };\n\n const stream = await navigator.mediaDevices.getUserMedia(relaxedConstraints);\n this.currentStream = stream;\n return stream;\n }\n\n this.emit('error', {\n message: `getUserMedia failed: ${err.message}`,\n error: err,\n });\n\n throw error;\n }\n }\n\n /**\n * Get current stream\n */\n getStream(): MediaStream | null {\n return this.currentStream;\n }\n\n /**\n * Stop all tracks on current stream\n */\n stopAllTracks(): void {\n if (this.currentStream) {\n this.currentStream.getTracks().forEach((track) => {\n track.stop();\n });\n this.currentStream = null;\n }\n }\n\n /**\n * Replace video track in current stream\n */\n async replaceVideoTrack(deviceId: string, profile: QualityProfile = 'professional'): Promise<MediaStreamTrack | null> {\n if (!this.currentStream) {\n throw new Error('No active stream to replace track in');\n }\n\n // Stop current video track\n const currentVideoTrack = this.currentStream.getVideoTracks()[0];\n if (currentVideoTrack) {\n currentVideoTrack.stop();\n this.currentStream.removeTrack(currentVideoTrack);\n }\n\n // Get new video track\n const constraints = buildMediaConstraints(profile, { videoDeviceId: deviceId });\n const newStream = await navigator.mediaDevices.getUserMedia({\n video: constraints.video,\n audio: false,\n });\n\n const newTrack = newStream.getVideoTracks()[0];\n if (newTrack) {\n this.currentStream.addTrack(newTrack);\n }\n\n return newTrack || null;\n }\n\n /**\n * Replace audio track in current stream\n */\n async replaceAudioTrack(deviceId: string, profile: QualityProfile = 'professional'): Promise<MediaStreamTrack | null> {\n if (!this.currentStream) {\n throw new Error('No active stream to replace track in');\n }\n\n // Stop current audio track\n const currentAudioTrack = this.currentStream.getAudioTracks()[0];\n if (currentAudioTrack) {\n currentAudioTrack.stop();\n this.currentStream.removeTrack(currentAudioTrack);\n }\n\n // Get new audio track\n const constraints = buildMediaConstraints(profile, { audioDeviceId: deviceId });\n const newStream = await navigator.mediaDevices.getUserMedia({\n video: false,\n audio: constraints.audio,\n });\n\n const newTrack = newStream.getAudioTracks()[0];\n if (newTrack) {\n this.currentStream.addTrack(newTrack);\n }\n\n return newTrack || null;\n }\n\n /**\n * Get all cached devices\n */\n getAllDevices(): DeviceInfo[] {\n return [...this.devices];\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n this.stopAllTracks();\n this.removeAllListeners();\n }\n}\n","/**\n * Screen Capture\n * Wrapper for getDisplayMedia with proper error handling\n * Supports multiple simultaneous screen captures\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport type { ScreenCaptureOptions } from '../types';\n\ninterface ScreenCaptureEvents {\n started: { stream: MediaStream; captureId: string };\n ended: { captureId: string; stream: MediaStream | null; reason: string };\n error: { message: string; error?: Error };\n}\n\ninterface CaptureInfo {\n stream: MediaStream;\n label: string;\n}\n\nexport class ScreenCapture extends TypedEventEmitter<ScreenCaptureEvents> {\n private captures: Map<string, CaptureInfo> = new Map();\n private captureCounter = 0;\n\n /**\n * Start a new screen capture\n * Each call creates a new capture - supports multiple simultaneous captures\n */\n async start(options: ScreenCaptureOptions = {}): Promise<MediaStream | null> {\n try {\n // Build video constraints with higher framerate for smooth screen share\n let videoConstraints: MediaTrackConstraints | boolean;\n\n if (options.video === false) {\n videoConstraints = false;\n } else if (typeof options.video === 'object') {\n // Use custom video constraints if provided as object, merged with defaults\n const customVideo = options.video as MediaTrackConstraints;\n videoConstraints = {\n // Default values\n frameRate: { ideal: 30, max: 60 },\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n // Merge custom constraints (overrides defaults)\n ...customVideo,\n // Always add cursor if specified\n ...(options.cursor !== undefined ? { cursor: options.cursor } : {}),\n };\n } else {\n // Default constraints\n videoConstraints = {\n // Request high framerate for smooth screen capture\n frameRate: { ideal: 30, max: 60 },\n // Request good resolution - let browser pick best for display\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n // Prefer motion over sharpness when encoding is under pressure\n ...(options.cursor !== undefined ? { cursor: options.cursor } : {}),\n };\n }\n\n const constraints: DisplayMediaStreamOptions = {\n video: videoConstraints,\n audio: options.audio ?? false,\n };\n\n // Add preferCurrentTab if supported and requested\n if (options.preferCurrentTab && 'preferCurrentTab' in constraints) {\n (constraints as Record<string, unknown>).preferCurrentTab = true;\n }\n\n // Add surfaceSwitching if requested (Chrome 107+)\n if (options.surfaceSwitching) {\n (constraints as Record<string, unknown>).surfaceSwitching = 'include';\n }\n\n // Add selfBrowserSurface if requested (Chrome 107+)\n if (options.selfBrowserSurface !== undefined) {\n (constraints as Record<string, unknown>).selfBrowserSurface = options.selfBrowserSurface;\n }\n\n // Add monitorTypeSurfaces if requested (Chrome 119+)\n if (options.monitorTypeSurfaces) {\n (constraints as Record<string, unknown>).monitorTypeSurfaces = options.monitorTypeSurfaces;\n }\n\n // Add system audio preference if supported\n if (options.systemAudio && constraints.audio) {\n if (typeof constraints.audio === 'object') {\n (constraints.audio as Record<string, unknown>).systemAudio = options.systemAudio;\n }\n }\n\n const stream = await navigator.mediaDevices.getDisplayMedia(constraints);\n\n // Generate a unique ID for this capture\n const captureId = `screen-${++this.captureCounter}-${Date.now()}`;\n\n // Get a label for this capture from the video track\n const videoTrack = stream.getVideoTracks()[0];\n const label = videoTrack?.label || `Screen ${this.captureCounter}`;\n\n // Store the capture\n this.captures.set(captureId, { stream, label });\n\n // Listen for track ended events (user stopped sharing)\n stream.getTracks().forEach((track) => {\n track.addEventListener('ended', () => {\n this.handleTrackEnded(captureId, stream);\n });\n });\n\n this.emit('started', { stream, captureId });\n\n return stream;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // User cancelled is not an error\n if (err.name === 'AbortError' || err.name === 'NotAllowedError') {\n this.emit('ended', { captureId: '', stream: null, reason: 'cancelled' });\n return null;\n }\n\n this.emit('error', {\n message: `Screen capture failed: ${err.message}`,\n error: err,\n });\n\n throw error;\n }\n }\n\n /**\n * Handle track ended event\n */\n private handleTrackEnded(captureId: string, stream: MediaStream): void {\n // Check if all tracks have ended\n const activeTracks = stream.getTracks().filter((t) => t.readyState === 'live');\n if (activeTracks.length === 0) {\n this.captures.delete(captureId);\n this.emit('ended', { captureId, stream, reason: 'user_stopped' });\n }\n }\n\n /**\n * Stop a specific screen capture by its stream\n */\n stopByStream(stream: MediaStream): void {\n for (const [captureId, info] of this.captures) {\n if (info.stream === stream) {\n info.stream.getTracks().forEach((track) => track.stop());\n this.captures.delete(captureId);\n this.emit('ended', { captureId, stream, reason: 'stopped' });\n return;\n }\n }\n }\n\n /**\n * Stop all screen captures\n */\n stop(): void {\n for (const [captureId, info] of this.captures) {\n info.stream.getTracks().forEach((track) => track.stop());\n this.emit('ended', { captureId, stream: info.stream, reason: 'stopped' });\n }\n this.captures.clear();\n }\n\n /**\n * Get all active captures\n */\n getCaptures(): Array<{ captureId: string; stream: MediaStream; label: string }> {\n return Array.from(this.captures.entries()).map(([captureId, info]) => ({\n captureId,\n stream: info.stream,\n label: info.label,\n }));\n }\n\n /**\n * Check if any screen capture is active\n */\n isActive(): boolean {\n return this.captures.size > 0;\n }\n\n /**\n * Get the count of active captures\n */\n getCaptureCount(): number {\n return this.captures.size;\n }\n\n // Legacy methods for backwards compatibility (use first capture)\n\n /**\n * Get current stream (first capture for backwards compatibility)\n * @deprecated Use getCaptures() instead\n */\n getStream(): MediaStream | null {\n const first = this.captures.values().next().value;\n return first?.stream ?? null;\n }\n\n /**\n * Get video track (first capture for backwards compatibility)\n * @deprecated Use getCaptures() instead\n */\n getVideoTrack(): MediaStreamTrack | null {\n const stream = this.getStream();\n return stream?.getVideoTracks()[0] ?? null;\n }\n\n /**\n * Get audio track (first capture for backwards compatibility)\n * @deprecated Use getCaptures() instead\n */\n getAudioTrack(): MediaStreamTrack | null {\n const stream = this.getStream();\n return stream?.getAudioTracks()[0] ?? null;\n }\n\n /**\n * Check if system audio is being captured\n */\n hasAudio(): boolean {\n for (const [, info] of this.captures) {\n if (info.stream.getAudioTracks().length > 0) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n this.stop();\n this.removeAllListeners();\n }\n}\n","/**\n * WHIP Client\n * WebRTC-HTTP Ingestion Protocol client for streaming\n * Ported from StreamCrafter useWhipStreaming.js\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport type { WhipClientConfig, WhipConnectionState, WhipClientEvents } from '../types';\nimport type { EncoderManager, EncodedVideoChunkData, EncodedAudioChunkData } from './EncoderManager';\n\nexport class WhipClient extends TypedEventEmitter<WhipClientEvents> {\n private config: WhipClientConfig;\n private peerConnection: RTCPeerConnection | null = null;\n private videoTrackGenerator: MediaStreamTrackGenerator | null = null;\n private audioTrackGenerator: MediaStreamTrackGenerator | null = null;\n private state: WhipConnectionState = 'disconnected';\n\n // Writer management to prevent locking issues\n private videoWriter: WritableStreamDefaultWriter<VideoFrame> | null = null;\n private audioWriter: WritableStreamDefaultWriter<AudioData> | null = null;\n private videoWriteQueue: Array<{\n frame: VideoFrame;\n resolve: (value: boolean) => void;\n reject: (error: Error) => void;\n }> = [];\n private audioWriteQueue: Array<{\n audioData: AudioData;\n resolve: (value: boolean) => void;\n reject: (error: Error) => void;\n }> = [];\n private isProcessingVideoQueue = false;\n private isProcessingAudioQueue = false;\n\n // RTCRtpScriptTransform workers for WebCodecs integration\n private videoTransformWorker: Worker | null = null;\n private audioTransformWorker: Worker | null = null;\n private encoderListenerCleanup: (() => void) | null = null;\n\n // Negotiated codecs (populated after connection)\n private negotiatedVideoCodec: string | null = null;\n private negotiatedAudioCodec: string | null = null;\n\n constructor(config: WhipClientConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Debug logging helper\n */\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.log(`[WHIP] ${message}`, data ?? '');\n }\n }\n\n /**\n * Error logging helper\n */\n private logError(message: string, error?: Error): void {\n console.error(`[WHIP ERROR] ${message}`, error ?? '');\n this.emit('error', { message, error });\n }\n\n /**\n * Update connection state\n */\n private setState(newState: WhipConnectionState): void {\n const previousState = this.state;\n this.state = newState;\n this.emit('stateChange', { state: newState, previousState });\n }\n\n // ==========================================================================\n // Codec alignment for WebCodecs path\n // ==========================================================================\n\n /**\n * Set codec preferences on transceivers before creating offer.\n * Prefers VP9 (royalty-free, better compression) then H264 for video.\n * Prefers Opus for audio.\n */\n private preferCodecs(pc: RTCPeerConnection): void {\n const transceivers = pc.getTransceivers();\n\n for (const transceiver of transceivers) {\n if (!transceiver.setCodecPreferences) {\n continue;\n }\n\n const trackKind = transceiver.sender.track?.kind;\n\n if (trackKind === 'video') {\n const capabilities = RTCRtpSender.getCapabilities('video');\n if (!capabilities?.codecs) continue;\n\n // Filter to VP9 and H264, preferring VP9\n const preferred = capabilities.codecs\n .filter((c) => c.mimeType === 'video/VP9' || c.mimeType === 'video/H264')\n .sort((a, b) => {\n // VP9 first, then H264\n if (a.mimeType === 'video/VP9' && b.mimeType !== 'video/VP9') return -1;\n if (a.mimeType !== 'video/VP9' && b.mimeType === 'video/VP9') return 1;\n return 0;\n });\n\n if (preferred.length > 0) {\n try {\n transceiver.setCodecPreferences(preferred);\n this.log('Set video codec preferences', preferred.map((c) => c.mimeType));\n } catch (err) {\n this.log('Failed to set video codec preferences', err);\n }\n }\n }\n\n if (trackKind === 'audio') {\n const capabilities = RTCRtpSender.getCapabilities('audio');\n if (!capabilities?.codecs) continue;\n\n // Filter to Opus only\n const preferred = capabilities.codecs.filter((c) => c.mimeType === 'audio/opus');\n\n if (preferred.length > 0) {\n try {\n transceiver.setCodecPreferences(preferred);\n this.log('Set audio codec preferences', preferred.map((c) => c.mimeType));\n } catch (err) {\n this.log('Failed to set audio codec preferences', err);\n }\n }\n }\n }\n }\n\n /**\n * Verify negotiated codecs after connection.\n * Populates negotiatedVideoCodec and negotiatedAudioCodec.\n */\n private verifyCodecAlignment(): void {\n if (!this.peerConnection) return;\n\n const senders = this.peerConnection.getSenders();\n\n for (const sender of senders) {\n const params = sender.getParameters();\n const codec = params.codecs?.[0];\n\n if (sender.track?.kind === 'video' && codec?.mimeType) {\n this.negotiatedVideoCodec = codec.mimeType;\n this.log('Negotiated video codec', codec.mimeType);\n }\n\n if (sender.track?.kind === 'audio' && codec?.mimeType) {\n this.negotiatedAudioCodec = codec.mimeType;\n this.log('Negotiated audio codec', codec.mimeType);\n }\n }\n }\n\n /**\n * Check if encoded frame insertion is safe.\n * Returns true if negotiated codecs are compatible with WebCodecs output.\n *\n * For WebCodecs insertion to work correctly:\n * - Video must be VP9 or H264 (what WebCodecs can produce)\n * - Audio must be Opus (what WebCodecs can produce)\n */\n canUseEncodedInsertion(): boolean {\n // Must have a connection\n if (!this.peerConnection || this.state !== 'connected') {\n this.log('canUseEncodedInsertion: no connection', { hasPC: !!this.peerConnection, state: this.state });\n return false;\n }\n\n // Must have RTCRtpScriptTransform support\n if (typeof RTCRtpScriptTransform === 'undefined') {\n this.log('canUseEncodedInsertion: RTCRtpScriptTransform not supported');\n return false;\n }\n\n // Must have senders with transform support\n const senders = this.peerConnection.getSenders();\n const hasTransformSupport = senders.some((s) => 'transform' in s);\n if (!hasTransformSupport) {\n this.log('Sender transform not supported');\n return false;\n }\n\n // Check video codec alignment\n if (this.negotiatedVideoCodec) {\n const videoOk =\n this.negotiatedVideoCodec === 'video/VP9' ||\n this.negotiatedVideoCodec === 'video/H264';\n\n if (!videoOk) {\n this.log('Video codec not compatible with WebCodecs', this.negotiatedVideoCodec);\n return false;\n }\n }\n\n // Check audio codec alignment\n if (this.negotiatedAudioCodec) {\n const audioOk = this.negotiatedAudioCodec === 'audio/opus';\n\n if (!audioOk) {\n this.log('Audio codec not compatible with WebCodecs', this.negotiatedAudioCodec);\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get the negotiated video codec MIME type.\n */\n getNegotiatedVideoCodec(): string | null {\n return this.negotiatedVideoCodec;\n }\n\n /**\n * Get the negotiated audio codec MIME type.\n */\n getNegotiatedAudioCodec(): string | null {\n return this.negotiatedAudioCodec;\n }\n\n /**\n * Check if connected.\n */\n get isConnected(): boolean {\n return this.state === 'connected';\n }\n\n /**\n * Connect to WHIP endpoint with a MediaStream\n */\n async connect(stream: MediaStream): Promise<void> {\n try {\n this.log('Starting WHIP connection');\n this.setState('connecting');\n\n if (!this.config.whipUrl) {\n throw new Error('WHIP URL is required');\n }\n\n // Create RTCPeerConnection\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.iceServers || [],\n };\n\n this.log('Creating RTCPeerConnection', pcConfig);\n const pc = new RTCPeerConnection(pcConfig);\n\n // Set up connection state monitoring\n pc.onconnectionstatechange = () => {\n const state = pc.connectionState;\n this.log(`Connection state changed: ${state}`);\n\n switch (state) {\n case 'connected':\n this.log('WHIP streaming connected successfully');\n this.setState('connected');\n break;\n case 'disconnected':\n this.setState('disconnected');\n break;\n case 'failed':\n this.setState('failed');\n break;\n case 'closed':\n this.setState('closed');\n break;\n }\n };\n\n pc.oniceconnectionstatechange = () => {\n this.log(`ICE connection state: ${pc.iceConnectionState}`);\n };\n\n pc.onicegatheringstatechange = () => {\n this.log(`ICE gathering state: ${pc.iceGatheringState}`);\n };\n\n pc.onicecandidate = (event) => {\n this.emit('iceCandidate', { candidate: event.candidate });\n if (event.candidate) {\n this.log('ICE candidate generated', event.candidate.candidate);\n } else {\n this.log('ICE candidate gathering complete');\n }\n };\n\n // Add tracks from the stream\n this.log('Adding tracks to peer connection');\n stream.getTracks().forEach((track, index) => {\n this.log(`Adding ${track.kind} track ${index}`, {\n id: track.id,\n kind: track.kind,\n enabled: track.enabled,\n readyState: track.readyState,\n });\n pc.addTrack(track, stream);\n });\n\n this.peerConnection = pc;\n\n // Set codec preferences before creating offer (for WebCodecs alignment)\n this.preferCodecs(pc);\n\n // Create and set local description\n this.log('Creating offer');\n const offer = await pc.createOffer({\n offerToReceiveAudio: false,\n offerToReceiveVideo: false,\n });\n\n this.log('Setting local description');\n await pc.setLocalDescription(offer);\n\n this.log('Local SDP offer created', {\n type: offer.type,\n sdpLength: offer.sdp?.length,\n });\n\n // Send offer to WHIP endpoint\n this.log(`Sending offer to WHIP endpoint: ${this.config.whipUrl}`);\n\n const response = await fetch(this.config.whipUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/sdp',\n Accept: 'application/sdp',\n },\n body: offer.sdp,\n });\n\n this.log(`WHIP response status: ${response.status} ${response.statusText}`);\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`WHIP request failed: ${response.status} ${response.statusText} - ${errorText}`);\n }\n\n // Get and set remote description\n const answerSdp = await response.text();\n this.log('Received SDP answer', {\n length: answerSdp.length,\n });\n\n await pc.setRemoteDescription({\n type: 'answer',\n sdp: answerSdp,\n });\n\n this.log('Remote description set successfully');\n\n // Verify negotiated codecs for WebCodecs alignment\n this.verifyCodecAlignment();\n\n this.log('WHIP connection established, waiting for ICE connection...');\n } catch (error) {\n this.logError('Failed to connect', error instanceof Error ? error : new Error(String(error)));\n this.setState('failed');\n this.cleanup();\n throw error;\n }\n }\n\n /**\n * Connect using MediaStreamTrackGenerators (for WebCodecs path)\n */\n async connectWithGenerators(): Promise<{\n videoGenerator: MediaStreamTrackGenerator;\n audioGenerator: MediaStreamTrackGenerator;\n }> {\n try {\n this.log('Starting WHIP connection with track generators');\n this.setState('connecting');\n\n if (!this.config.whipUrl) {\n throw new Error('WHIP URL is required');\n }\n\n // Create track generators\n this.log('Creating MediaStreamTrackGenerators');\n const videoGenerator = new MediaStreamTrackGenerator({ kind: 'video' });\n const audioGenerator = new MediaStreamTrackGenerator({ kind: 'audio' });\n\n this.videoTrackGenerator = videoGenerator;\n this.audioTrackGenerator = audioGenerator;\n\n this.log('Track generators created successfully');\n\n // Create RTCPeerConnection\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.iceServers || [],\n };\n\n this.log('Creating RTCPeerConnection', pcConfig);\n const pc = new RTCPeerConnection(pcConfig);\n\n // Set up connection state monitoring\n pc.onconnectionstatechange = () => {\n const state = pc.connectionState;\n this.log(`Connection state changed: ${state}`);\n\n switch (state) {\n case 'connected':\n this.log('WHIP streaming connected successfully');\n this.setState('connected');\n break;\n case 'disconnected':\n this.setState('disconnected');\n break;\n case 'failed':\n this.setState('failed');\n break;\n case 'closed':\n this.setState('closed');\n break;\n }\n };\n\n pc.oniceconnectionstatechange = () => {\n this.log(`ICE connection state: ${pc.iceConnectionState}`);\n };\n\n pc.onicegatheringstatechange = () => {\n this.log(`ICE gathering state: ${pc.iceGatheringState}`);\n };\n\n pc.onicecandidate = (event) => {\n this.emit('iceCandidate', { candidate: event.candidate });\n if (event.candidate) {\n this.log('ICE candidate generated', event.candidate.candidate);\n } else {\n this.log('ICE candidate gathering complete');\n }\n };\n\n // Add tracks to peer connection\n const mediaStream = new MediaStream([videoGenerator, audioGenerator]);\n\n this.log('Adding tracks to peer connection');\n mediaStream.getTracks().forEach((track, index) => {\n this.log(`Adding ${track.kind} track ${index}`, {\n id: track.id,\n kind: track.kind,\n enabled: track.enabled,\n readyState: track.readyState,\n });\n pc.addTrack(track, mediaStream);\n });\n\n this.peerConnection = pc;\n\n // Set codec preferences before creating offer\n this.preferCodecs(pc);\n\n // Create and set local description\n this.log('Creating offer');\n const offer = await pc.createOffer({\n offerToReceiveAudio: false,\n offerToReceiveVideo: false,\n });\n\n this.log('Setting local description');\n await pc.setLocalDescription(offer);\n\n // Send offer to WHIP endpoint\n this.log(`Sending offer to WHIP endpoint: ${this.config.whipUrl}`);\n\n const response = await fetch(this.config.whipUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/sdp',\n Accept: 'application/sdp',\n },\n body: offer.sdp,\n });\n\n this.log(`WHIP response status: ${response.status} ${response.statusText}`);\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`WHIP request failed: ${response.status} ${response.statusText} - ${errorText}`);\n }\n\n // Get and set remote description\n const answerSdp = await response.text();\n this.log('Received SDP answer', { length: answerSdp.length });\n\n await pc.setRemoteDescription({\n type: 'answer',\n sdp: answerSdp,\n });\n\n this.log('Remote description set successfully');\n\n // Verify negotiated codecs\n this.verifyCodecAlignment();\n\n this.log('WHIP connection established with generators');\n\n return { videoGenerator, audioGenerator };\n } catch (error) {\n this.logError('Failed to connect with generators', error instanceof Error ? error : new Error(String(error)));\n this.setState('failed');\n this.cleanup();\n throw error;\n }\n }\n\n /**\n * Process video write queue\n */\n private async processVideoQueue(): Promise<void> {\n if (this.isProcessingVideoQueue || this.videoWriteQueue.length === 0) {\n return;\n }\n\n this.isProcessingVideoQueue = true;\n\n try {\n while (this.videoWriteQueue.length > 0) {\n const item = this.videoWriteQueue.shift();\n if (!item) continue;\n\n const { frame, resolve, reject } = item;\n\n if (!this.videoTrackGenerator) {\n reject(new Error('Video track generator not available'));\n continue;\n }\n\n try {\n if (!this.videoWriter) {\n this.videoWriter = this.videoTrackGenerator.writable.getWriter();\n }\n\n await this.videoWriter!.write(frame);\n resolve(true);\n } catch (error) {\n // Release writer on error and try to recreate\n if (this.videoWriter) {\n try {\n this.videoWriter.releaseLock();\n } catch {\n // Ignore release errors\n }\n this.videoWriter = null;\n }\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n }\n } finally {\n this.isProcessingVideoQueue = false;\n }\n }\n\n /**\n * Process audio write queue\n */\n private async processAudioQueue(): Promise<void> {\n if (this.isProcessingAudioQueue || this.audioWriteQueue.length === 0) {\n return;\n }\n\n this.isProcessingAudioQueue = true;\n\n try {\n while (this.audioWriteQueue.length > 0) {\n const item = this.audioWriteQueue.shift();\n if (!item) continue;\n\n const { audioData, resolve, reject } = item;\n\n if (!this.audioTrackGenerator) {\n reject(new Error('Audio track generator not available'));\n continue;\n }\n\n try {\n if (!this.audioWriter) {\n this.audioWriter = this.audioTrackGenerator.writable.getWriter();\n }\n\n await this.audioWriter!.write(audioData);\n resolve(true);\n } catch (error) {\n // Release writer on error and try to recreate\n if (this.audioWriter) {\n try {\n this.audioWriter.releaseLock();\n } catch {\n // Ignore release errors\n }\n this.audioWriter = null;\n }\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n }\n } finally {\n this.isProcessingAudioQueue = false;\n }\n }\n\n /**\n * Send video frame to WHIP stream (queued)\n */\n async sendVideoFrame(frame: VideoFrame): Promise<boolean> {\n if (!this.videoTrackGenerator) {\n if (frame) {\n try { frame.close(); } catch { /* ignore */ }\n }\n return false;\n }\n\n return new Promise((resolve, reject) => {\n this.videoWriteQueue.push({ frame, resolve, reject });\n this.processVideoQueue();\n });\n }\n\n /**\n * Send audio data to WHIP stream (queued)\n */\n async sendAudioData(audioData: AudioData): Promise<boolean> {\n if (!this.audioTrackGenerator) {\n if (audioData) {\n try { audioData.close(); } catch { /* ignore */ }\n }\n return false;\n }\n\n return new Promise((resolve, reject) => {\n this.audioWriteQueue.push({ audioData, resolve, reject });\n this.processAudioQueue();\n });\n }\n\n /**\n * Replace a track in the peer connection\n */\n async replaceTrack(oldTrack: MediaStreamTrack, newTrack: MediaStreamTrack): Promise<void> {\n if (!this.peerConnection) {\n throw new Error('No peer connection');\n }\n\n const sender = this.peerConnection\n .getSenders()\n .find((s) => s.track?.kind === oldTrack.kind);\n\n if (!sender) {\n throw new Error(`No sender found for ${oldTrack.kind} track`);\n }\n\n await sender.replaceTrack(newTrack);\n this.log(`Replaced ${oldTrack.kind} track`);\n }\n\n /**\n * Add a track to the peer connection\n */\n async addTrack(track: MediaStreamTrack, stream?: MediaStream): Promise<void> {\n if (!this.peerConnection) {\n throw new Error('No peer connection');\n }\n\n this.peerConnection.addTrack(track, stream || new MediaStream([track]));\n this.log(`Added ${track.kind} track`);\n }\n\n /**\n * Get connection statistics\n */\n async getStats(): Promise<RTCStatsReport | null> {\n if (!this.peerConnection) {\n return null;\n }\n\n try {\n return await this.peerConnection.getStats();\n } catch (error) {\n this.logError('Failed to get connection stats', error instanceof Error ? error : new Error(String(error)));\n return null;\n }\n }\n\n /**\n * Get current connection state\n */\n getState(): WhipConnectionState {\n return this.state;\n }\n\n /**\n * Get peer connection\n */\n getPeerConnection(): RTCPeerConnection | null {\n return this.peerConnection;\n }\n\n /**\n * Attach RTCRtpScriptTransform to inject WebCodecs-encoded chunks\n *\n * This method creates transform workers and attaches them to the RTP senders,\n * allowing us to replace browser-encoded frames with our WebCodecs-encoded chunks.\n *\n * @param encoderManager - The EncoderManager that produces encoded chunks\n * @param workerUrl - Optional URL to the rtcTransform worker (for bundled usage)\n */\n attachEncoderTransform(\n encoderManager: EncoderManager,\n workerUrl?: string\n ): void {\n if (!this.peerConnection) {\n throw new Error('No peer connection - call connect() first');\n }\n\n // Check for RTCRtpScriptTransform support\n if (typeof RTCRtpScriptTransform === 'undefined') {\n this.log('RTCRtpScriptTransform not supported, skipping encoder transform');\n return;\n }\n\n this.log('Attaching encoder transform');\n\n // Create transform workers using inlined worker bundle\n const createWorker = (): Worker | null => {\n // Custom worker URL takes precedence (for consumers who bundle separately)\n if (workerUrl) {\n return new Worker(workerUrl, { type: 'module' });\n }\n\n // Preferred: load packaged worker relative to the built module URL.\n try {\n const packagedUrl = new URL('../workers/rtcTransform.worker.js', import.meta.url);\n return new Worker(packagedUrl, { type: 'module' });\n } catch (err) {\n this.log('Packaged worker URL failed, trying fallback paths', err);\n }\n\n const fallbackPaths = [\n '/workers/rtcTransform.worker.js',\n './workers/rtcTransform.worker.js',\n '/node_modules/@livepeer-frameworks/streamcrafter-core/dist/workers/rtcTransform.worker.js',\n ];\n\n for (const path of fallbackPaths) {\n try {\n return new Worker(path, { type: 'module' });\n } catch {\n try {\n return new Worker(path);\n } catch {\n // Continue\n }\n }\n }\n\n return null;\n };\n\n // Get senders\n const senders = this.peerConnection.getSenders();\n const videoSender = senders.find((s) => s.track?.kind === 'video');\n const audioSender = senders.find((s) => s.track?.kind === 'audio');\n\n // Attach video transform\n if (videoSender && 'transform' in videoSender) {\n this.log('Creating video transform worker');\n this.videoTransformWorker = createWorker();\n\n if (this.videoTransformWorker) {\n // Configure worker\n this.videoTransformWorker.postMessage({\n type: 'configure',\n config: {\n debug: this.config.debug,\n maxQueueSize: 30, // ~1 second at 30fps\n },\n });\n\n // Attach transform to sender\n // RTCRtpScriptTransform options are passed to worker via rtctransform event\n (videoSender as RTCRtpSender & { transform: unknown }).transform =\n new RTCRtpScriptTransform(this.videoTransformWorker, { kind: 'video' });\n\n this.log('Video transform attached');\n } else {\n this.logError('Failed to create video transform worker');\n }\n }\n\n // Attach audio transform\n if (audioSender && 'transform' in audioSender) {\n this.log('Creating audio transform worker');\n this.audioTransformWorker = createWorker();\n\n if (this.audioTransformWorker) {\n // Configure worker\n this.audioTransformWorker.postMessage({\n type: 'configure',\n config: {\n debug: this.config.debug,\n maxQueueSize: 50, // Audio packets are smaller/more frequent\n },\n });\n\n // Attach transform to sender\n (audioSender as RTCRtpSender & { transform: unknown }).transform =\n new RTCRtpScriptTransform(this.audioTransformWorker, { kind: 'audio' });\n\n this.log('Audio transform attached');\n } else {\n this.logError('Failed to create audio transform worker');\n }\n }\n\n // Forward encoded chunks from encoder to transform workers\n const handleVideoChunk = (chunk: EncodedVideoChunkData): void => {\n if (this.videoTransformWorker) {\n this.videoTransformWorker.postMessage(\n { type: 'videoChunk', data: chunk },\n [chunk.data] // Transfer ArrayBuffer ownership\n );\n }\n };\n\n const handleAudioChunk = (chunk: EncodedAudioChunkData): void => {\n if (this.audioTransformWorker) {\n this.audioTransformWorker.postMessage(\n { type: 'audioChunk', data: chunk },\n [chunk.data] // Transfer ArrayBuffer ownership\n );\n }\n };\n\n // Subscribe to encoder events\n encoderManager.on('videoChunk', handleVideoChunk);\n encoderManager.on('audioChunk', handleAudioChunk);\n\n // Store cleanup function\n this.encoderListenerCleanup = () => {\n encoderManager.off('videoChunk', handleVideoChunk);\n encoderManager.off('audioChunk', handleAudioChunk);\n };\n\n this.log('Encoder transform attached successfully');\n }\n\n /**\n * Check if encoder transform is attached\n */\n hasEncoderTransform(): boolean {\n return this.videoTransformWorker !== null || this.audioTransformWorker !== null;\n }\n\n /**\n * Detach encoder transform and stop workers\n */\n detachEncoderTransform(): void {\n // Clean up encoder event listeners\n if (this.encoderListenerCleanup) {\n this.encoderListenerCleanup();\n this.encoderListenerCleanup = null;\n }\n\n // Stop video transform worker\n if (this.videoTransformWorker) {\n this.videoTransformWorker.postMessage({ type: 'stop' });\n this.videoTransformWorker.terminate();\n this.videoTransformWorker = null;\n }\n\n // Stop audio transform worker\n if (this.audioTransformWorker) {\n this.audioTransformWorker.postMessage({ type: 'stop' });\n this.audioTransformWorker.terminate();\n this.audioTransformWorker = null;\n }\n\n this.log('Encoder transform detached');\n }\n\n /**\n * Clean up writers\n */\n private cleanupWriters(): void {\n if (this.videoWriter) {\n try {\n this.videoWriter.releaseLock();\n } catch {\n // Ignore\n }\n this.videoWriter = null;\n }\n\n if (this.audioWriter) {\n try {\n this.audioWriter.releaseLock();\n } catch {\n // Ignore\n }\n this.audioWriter = null;\n }\n\n this.videoWriteQueue = [];\n this.audioWriteQueue = [];\n this.isProcessingVideoQueue = false;\n this.isProcessingAudioQueue = false;\n }\n\n /**\n * Clean up resources\n */\n private cleanup(): void {\n this.cleanupWriters();\n this.detachEncoderTransform();\n\n if (this.videoTrackGenerator) {\n this.videoTrackGenerator.stop();\n this.videoTrackGenerator = null;\n }\n\n if (this.audioTrackGenerator) {\n this.audioTrackGenerator.stop();\n this.audioTrackGenerator = null;\n }\n\n if (this.peerConnection) {\n this.peerConnection.close();\n this.peerConnection = null;\n }\n }\n\n /**\n * Disconnect from WHIP endpoint\n */\n async disconnect(): Promise<void> {\n this.log('Disconnecting WHIP');\n this.cleanup();\n this.setState('disconnected');\n }\n\n /**\n * Destroy the client\n */\n destroy(): void {\n this.cleanup();\n this.removeAllListeners();\n }\n}\n","/**\n * Audio Mixer\n * Combines multiple audio tracks using Web Audio API\n * Supports per-source volume control, muting, and panning\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport type { AudioMixerConfig, AudioMixerEvents, AudioSourceOptions } from '../types';\n\ninterface AudioSourceNode {\n id: string;\n sourceNode: MediaStreamAudioSourceNode;\n gainNode: GainNode;\n panNode: StereoPannerNode;\n track: MediaStreamTrack;\n options: Required<AudioSourceOptions>;\n}\n\nexport class AudioMixer extends TypedEventEmitter<AudioMixerEvents> {\n private audioContext: AudioContext | null = null;\n private destination: MediaStreamAudioDestinationNode | null = null;\n private masterGain: GainNode | null = null;\n private compressor: DynamicsCompressorNode | null = null;\n private limiter: DynamicsCompressorNode | null = null;\n private analyzer: AnalyserNode | null = null;\n private sources: Map<string, AudioSourceNode> = new Map();\n private config: Required<AudioMixerConfig>;\n private outputStream: MediaStream | null = null;\n private levelMonitoringActive = false;\n private peakLevel = 0;\n private peakDecayRate = 0.95; // Peak meter decay\n\n constructor(config: AudioMixerConfig = {}) {\n super();\n this.config = {\n sampleRate: config.sampleRate ?? 48000,\n channelCount: config.channelCount ?? 2,\n };\n }\n\n /**\n * Initialize the audio mixer\n */\n async initialize(): Promise<void> {\n if (this.audioContext) {\n return; // Already initialized\n }\n\n try {\n this.audioContext = new AudioContext({\n sampleRate: this.config.sampleRate,\n });\n\n // Create destination node (outputs to MediaStream)\n this.destination = this.audioContext.createMediaStreamDestination();\n this.destination.channelCount = this.config.channelCount;\n\n // Create master gain node\n this.masterGain = this.audioContext.createGain();\n\n // Create compressor for consistent levels (voice/streaming optimized)\n this.compressor = this.audioContext.createDynamicsCompressor();\n this.compressor.threshold.value = -24; // Start compressing at -24dB\n this.compressor.knee.value = 30; // Soft knee for natural sound\n this.compressor.ratio.value = 4; // 4:1 compression\n this.compressor.attack.value = 0.003; // 3ms attack (fast for peaks)\n this.compressor.release.value = 0.25; // 250ms release\n\n // Create limiter (prevent clipping, brick-wall at -1dB)\n this.limiter = this.audioContext.createDynamicsCompressor();\n this.limiter.threshold.value = -1; // Brick-wall at -1dB\n this.limiter.knee.value = 0; // Hard knee\n this.limiter.ratio.value = 20; // Heavy limiting\n this.limiter.attack.value = 0.001; // 1ms attack\n this.limiter.release.value = 0.1; // 100ms release\n\n // Create analyzer for VU meter (non-destructive tap)\n this.analyzer = this.audioContext.createAnalyser();\n this.analyzer.fftSize = 256;\n this.analyzer.smoothingTimeConstant = 0.3;\n\n // Connect the chain: masterGain -> compressor -> analyzer -> limiter -> destination\n // Analyzer is after compressor so we see post-compression levels\n this.masterGain.connect(this.compressor);\n this.compressor.connect(this.analyzer);\n this.analyzer.connect(this.limiter);\n this.limiter.connect(this.destination);\n\n // Get the output stream\n this.outputStream = this.destination.stream;\n\n console.log('[AudioMixer] Initialized with compressor/limiter chain', {\n sampleRate: this.audioContext.sampleRate,\n channelCount: this.config.channelCount,\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error('[AudioMixer] Failed to initialize:', err);\n this.emit('error', { message: err.message, error: err });\n throw err;\n }\n }\n\n /**\n * Add an audio source to the mixer\n */\n addSource(\n id: string,\n track: MediaStreamTrack,\n options: AudioSourceOptions = {}\n ): void {\n if (!this.audioContext || !this.masterGain) {\n throw new Error('AudioMixer not initialized. Call initialize() first.');\n }\n\n if (track.kind !== 'audio') {\n throw new Error('Track must be an audio track');\n }\n\n // Remove existing source with same ID if present\n if (this.sources.has(id)) {\n this.removeSource(id);\n }\n\n try {\n // Create a MediaStream from the track\n const stream = new MediaStream([track]);\n\n // Create source node from the stream\n const sourceNode = this.audioContext.createMediaStreamSource(stream);\n\n // Create gain node for volume control\n const gainNode = this.audioContext.createGain();\n gainNode.gain.value = options.muted ? 0 : (options.volume ?? 1.0);\n\n // Create panner node for stereo positioning\n const panNode = this.audioContext.createStereoPanner();\n panNode.pan.value = options.pan ?? 0;\n\n // Connect the chain: source -> gain -> pan -> master\n sourceNode.connect(gainNode);\n gainNode.connect(panNode);\n panNode.connect(this.masterGain);\n\n // Store the source\n const audioSource: AudioSourceNode = {\n id,\n sourceNode,\n gainNode,\n panNode,\n track,\n options: {\n volume: options.volume ?? 1.0,\n muted: options.muted ?? false,\n pan: options.pan ?? 0,\n },\n };\n\n this.sources.set(id, audioSource);\n\n console.log('[AudioMixer] Added source:', id);\n this.emit('sourceAdded', { sourceId: id });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error('[AudioMixer] Failed to add source:', err);\n this.emit('error', { message: `Failed to add source: ${err.message}`, error: err });\n throw err;\n }\n }\n\n /**\n * Remove an audio source from the mixer\n */\n removeSource(id: string): void {\n const source = this.sources.get(id);\n if (!source) {\n return;\n }\n\n try {\n // Disconnect all nodes\n source.sourceNode.disconnect();\n source.gainNode.disconnect();\n source.panNode.disconnect();\n\n this.sources.delete(id);\n\n console.log('[AudioMixer] Removed source:', id);\n this.emit('sourceRemoved', { sourceId: id });\n } catch (error) {\n console.error('[AudioMixer] Error removing source:', error);\n }\n }\n\n /**\n * Update source options\n */\n updateSource(id: string, options: AudioSourceOptions): void {\n const source = this.sources.get(id);\n if (!source) {\n console.warn('[AudioMixer] Source not found:', id);\n return;\n }\n\n // Update volume\n if (options.volume !== undefined) {\n source.options.volume = options.volume;\n if (!source.options.muted) {\n source.gainNode.gain.setTargetAtTime(\n options.volume,\n this.audioContext?.currentTime ?? 0,\n 0.01 // Smooth transition\n );\n }\n }\n\n // Update mute state\n if (options.muted !== undefined) {\n source.options.muted = options.muted;\n source.gainNode.gain.setTargetAtTime(\n options.muted ? 0 : source.options.volume,\n this.audioContext?.currentTime ?? 0,\n 0.01\n );\n }\n\n // Update pan\n if (options.pan !== undefined) {\n source.options.pan = options.pan;\n source.panNode.pan.setTargetAtTime(\n options.pan,\n this.audioContext?.currentTime ?? 0,\n 0.01\n );\n }\n }\n\n /**\n * Set volume for a source (supports boost up to 2x)\n */\n setVolume(id: string, volume: number): void {\n // Allow gain boost up to 2.0 (double) for quiet sources\n this.updateSource(id, { volume: Math.max(0, Math.min(2.0, volume)) });\n }\n\n /**\n * Mute a source\n */\n mute(id: string): void {\n this.updateSource(id, { muted: true });\n }\n\n /**\n * Unmute a source\n */\n unmute(id: string): void {\n this.updateSource(id, { muted: false });\n }\n\n /**\n * Toggle mute for a source\n */\n toggleMute(id: string): boolean {\n const source = this.sources.get(id);\n if (!source) {\n return false;\n }\n const newMuted = !source.options.muted;\n this.updateSource(id, { muted: newMuted });\n return newMuted;\n }\n\n /**\n * Set pan for a source (-1.0 = left, 0 = center, 1.0 = right)\n */\n setPan(id: string, pan: number): void {\n this.updateSource(id, { pan: Math.max(-1, Math.min(1, pan)) });\n }\n\n /**\n * Set master volume (supports boost up to 2x / +6dB)\n */\n setMasterVolume(volume: number): void {\n if (!this.masterGain) return;\n this.masterGain.gain.setTargetAtTime(\n Math.max(0, Math.min(2, volume)),\n this.audioContext?.currentTime ?? 0,\n 0.01\n );\n }\n\n /**\n * Get current master volume\n */\n getMasterVolume(): number {\n return this.masterGain?.gain.value ?? 1;\n }\n\n /**\n * Get the mixed output stream\n */\n getOutputStream(): MediaStream | null {\n return this.outputStream;\n }\n\n /**\n * Get the output audio track\n */\n getOutputTrack(): MediaStreamTrack | null {\n return this.outputStream?.getAudioTracks()[0] ?? null;\n }\n\n /**\n * Get all source IDs\n */\n getSourceIds(): string[] {\n return Array.from(this.sources.keys());\n }\n\n /**\n * Get source options\n */\n getSourceOptions(id: string): Required<AudioSourceOptions> | null {\n const source = this.sources.get(id);\n return source ? { ...source.options } : null;\n }\n\n /**\n * Check if a source exists\n */\n hasSource(id: string): boolean {\n return this.sources.has(id);\n }\n\n /**\n * Get the number of sources\n */\n getSourceCount(): number {\n return this.sources.size;\n }\n\n /**\n * Resume audio context (required after user interaction)\n */\n async resume(): Promise<void> {\n if (this.audioContext && this.audioContext.state === 'suspended') {\n await this.audioContext.resume();\n }\n }\n\n /**\n * Suspend audio context\n */\n async suspend(): Promise<void> {\n if (this.audioContext && this.audioContext.state === 'running') {\n await this.audioContext.suspend();\n }\n }\n\n /**\n * Get audio context state\n */\n getState(): AudioContextState | null {\n return this.audioContext?.state ?? null;\n }\n\n /**\n * Get current audio level (0-1) for VU meter\n * Uses dB scaling for perceptually accurate display\n */\n getLevel(): number {\n if (!this.analyzer) return 0;\n\n const data = new Uint8Array(this.analyzer.frequencyBinCount);\n this.analyzer.getByteTimeDomainData(data);\n\n // Calculate peak amplitude (linear 0-1)\n let max = 0;\n for (let i = 0; i < data.length; i++) {\n const v = Math.abs(data[i] - 128) / 128;\n if (v > max) max = v;\n }\n\n // Avoid log(0)\n if (max < 0.0001) return 0;\n\n // Convert to dB scale\n // 0 dB = full scale (max=1), -60 dB = very quiet\n const dB = 20 * Math.log10(max);\n\n // Map dB range to 0-1\n // -60 dB -> 0, 0 dB -> 1\n const minDb = -60;\n const maxDb = 0;\n const normalized = (dB - minDb) / (maxDb - minDb);\n\n return Math.max(0, Math.min(1, normalized));\n }\n\n /**\n * Get current and peak audio levels for VU meter with decay\n */\n getLevels(): { level: number; peakLevel: number } {\n const level = this.getLevel();\n\n // Update peak with decay\n if (level > this.peakLevel) {\n this.peakLevel = level;\n } else {\n this.peakLevel *= this.peakDecayRate;\n }\n\n return { level, peakLevel: this.peakLevel };\n }\n\n /**\n * Start emitting level updates (for VU meter)\n * Call this when you want to start monitoring audio levels\n */\n startLevelMonitoring(): void {\n if (this.levelMonitoringActive) return;\n this.levelMonitoringActive = true;\n\n const update = () => {\n if (!this.levelMonitoringActive || this.audioContext?.state !== 'running') {\n return;\n }\n\n const { level, peakLevel } = this.getLevels();\n this.emit('levelUpdate', { level, peakLevel });\n\n requestAnimationFrame(update);\n };\n\n requestAnimationFrame(update);\n console.log('[AudioMixer] Level monitoring started');\n }\n\n /**\n * Stop emitting level updates\n */\n stopLevelMonitoring(): void {\n this.levelMonitoringActive = false;\n this.peakLevel = 0;\n console.log('[AudioMixer] Level monitoring stopped');\n }\n\n /**\n * Check if level monitoring is active\n */\n isMonitoringLevels(): boolean {\n return this.levelMonitoringActive;\n }\n\n /**\n * Destroy the mixer and clean up resources\n */\n destroy(): void {\n // Stop level monitoring\n this.stopLevelMonitoring();\n\n // Remove all sources\n for (const id of this.sources.keys()) {\n this.removeSource(id);\n }\n\n // Disconnect processing nodes\n if (this.compressor) {\n this.compressor.disconnect();\n this.compressor = null;\n }\n\n if (this.limiter) {\n this.limiter.disconnect();\n this.limiter = null;\n }\n\n if (this.analyzer) {\n this.analyzer.disconnect();\n this.analyzer = null;\n }\n\n // Close audio context\n if (this.audioContext) {\n this.audioContext.close().catch(() => {\n // Ignore close errors\n });\n this.audioContext = null;\n }\n\n this.destination = null;\n this.masterGain = null;\n this.outputStream = null;\n\n this.removeAllListeners();\n }\n}\n","/**\n * Reconnection Manager\n * Handles automatic reconnection with exponential backoff\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport type { ReconnectionConfig, ReconnectionState, ReconnectionEvents } from '../types';\n\nexport const DEFAULT_RECONNECTION_CONFIG: ReconnectionConfig = {\n enabled: true,\n maxAttempts: 5,\n baseDelay: 1000, // 1 second\n maxDelay: 30000, // 30 seconds\n backoffMultiplier: 2,\n};\n\nexport class ReconnectionManager extends TypedEventEmitter<ReconnectionEvents> {\n private config: ReconnectionConfig;\n private state: ReconnectionState;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private countdownInterval: ReturnType<typeof setInterval> | null = null;\n private reconnectCallback: (() => Promise<void>) | null = null;\n\n constructor(config: Partial<ReconnectionConfig> = {}) {\n super();\n this.config = { ...DEFAULT_RECONNECTION_CONFIG, ...config };\n this.state = {\n isReconnecting: false,\n attemptNumber: 0,\n nextAttemptIn: null,\n lastError: null,\n };\n }\n\n /**\n * Calculate delay for next attempt using exponential backoff\n */\n private calculateDelay(attempt: number): number {\n const delay = this.config.baseDelay * Math.pow(this.config.backoffMultiplier, attempt - 1);\n // Add some jitter (±10%) to prevent thundering herd\n const jitter = delay * 0.1 * (Math.random() * 2 - 1);\n return Math.min(delay + jitter, this.config.maxDelay);\n }\n\n /**\n * Start reconnection process\n */\n start(reconnectCallback: () => Promise<void>): void {\n if (!this.config.enabled) {\n console.log('[ReconnectionManager] Reconnection disabled');\n return;\n }\n\n if (this.state.isReconnecting) {\n console.log('[ReconnectionManager] Already reconnecting');\n return;\n }\n\n this.reconnectCallback = reconnectCallback;\n this.state = {\n isReconnecting: true,\n attemptNumber: 0,\n nextAttemptIn: null,\n lastError: null,\n };\n\n this.scheduleNextAttempt();\n }\n\n /**\n * Schedule the next reconnection attempt\n */\n private scheduleNextAttempt(): void {\n if (!this.state.isReconnecting) return;\n\n this.state.attemptNumber++;\n\n if (this.state.attemptNumber > this.config.maxAttempts) {\n this.handleExhausted();\n return;\n }\n\n const delay = this.calculateDelay(this.state.attemptNumber);\n this.state.nextAttemptIn = delay;\n\n console.log(\n `[ReconnectionManager] Scheduling attempt ${this.state.attemptNumber}/${this.config.maxAttempts} in ${delay}ms`\n );\n\n this.emit('attemptStart', {\n attempt: this.state.attemptNumber,\n delay,\n });\n\n // Start countdown\n this.startCountdown(delay);\n\n // Schedule the attempt\n this.reconnectTimeout = setTimeout(() => {\n this.executeAttempt();\n }, delay);\n }\n\n /**\n * Start countdown interval\n */\n private startCountdown(delay: number): void {\n this.stopCountdown();\n\n const startTime = Date.now();\n this.countdownInterval = setInterval(() => {\n const elapsed = Date.now() - startTime;\n this.state.nextAttemptIn = Math.max(0, delay - elapsed);\n }, 100);\n }\n\n /**\n * Stop countdown interval\n */\n private stopCountdown(): void {\n if (this.countdownInterval) {\n clearInterval(this.countdownInterval);\n this.countdownInterval = null;\n }\n }\n\n /**\n * Execute a reconnection attempt\n */\n private async executeAttempt(): Promise<void> {\n this.stopCountdown();\n this.state.nextAttemptIn = null;\n\n if (!this.reconnectCallback) {\n console.error('[ReconnectionManager] No reconnect callback set');\n return;\n }\n\n console.log(`[ReconnectionManager] Executing attempt ${this.state.attemptNumber}`);\n\n try {\n await this.reconnectCallback();\n\n // Success!\n this.handleSuccess();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.handleFailure(errorMessage);\n }\n }\n\n /**\n * Handle successful reconnection\n */\n private handleSuccess(): void {\n console.log('[ReconnectionManager] Reconnection successful');\n\n this.state = {\n isReconnecting: false,\n attemptNumber: 0,\n nextAttemptIn: null,\n lastError: null,\n };\n\n this.cleanup();\n this.emit('attemptSuccess', undefined);\n }\n\n /**\n * Handle failed reconnection attempt\n */\n private handleFailure(error: string): void {\n console.log(`[ReconnectionManager] Attempt ${this.state.attemptNumber} failed:`, error);\n\n this.state.lastError = error;\n\n this.emit('attemptFailed', {\n attempt: this.state.attemptNumber,\n error,\n });\n\n // Schedule next attempt\n this.scheduleNextAttempt();\n }\n\n /**\n * Handle exhausted attempts\n */\n private handleExhausted(): void {\n console.log('[ReconnectionManager] All reconnection attempts exhausted');\n\n this.emit('exhausted', {\n totalAttempts: this.config.maxAttempts,\n });\n\n this.stop();\n }\n\n /**\n * Stop reconnection process\n */\n stop(): void {\n console.log('[ReconnectionManager] Stopping reconnection');\n\n this.cleanup();\n\n this.state = {\n isReconnecting: false,\n attemptNumber: 0,\n nextAttemptIn: null,\n lastError: this.state.lastError,\n };\n }\n\n /**\n * Clean up timers\n */\n private cleanup(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n this.stopCountdown();\n this.reconnectCallback = null;\n }\n\n /**\n * Reset the manager (e.g., after manual reconnect)\n */\n reset(): void {\n this.stop();\n this.state.lastError = null;\n }\n\n /**\n * Get current state\n */\n getState(): ReconnectionState {\n return { ...this.state };\n }\n\n /**\n * Check if currently reconnecting\n */\n isReconnecting(): boolean {\n return this.state.isReconnecting;\n }\n\n /**\n * Get current attempt number\n */\n getAttemptNumber(): number {\n return this.state.attemptNumber;\n }\n\n /**\n * Get max attempts\n */\n getMaxAttempts(): number {\n return this.config.maxAttempts;\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<ReconnectionConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Destroy the manager\n */\n destroy(): void {\n this.cleanup();\n this.removeAllListeners();\n }\n}\n","/**\n * Layout Strategies\n *\n * Preset layout configurations for common streaming scenarios.\n * Layouts calculate layer transforms automatically based on source arrangement.\n *\n * Available layouts:\n * - Solo: Single source fullscreen\n * - PiP (4 corners): Main source with smaller overlay in corner\n * - Split H/V: Two sources side by side (50/50)\n * - Focus L/R: Two sources with emphasis (70/30)\n * - Grid: 2x2 grid for 3-4 sources\n * - Stack: Vertical stack of sources\n */\n\nimport type {\n Layer,\n LayoutConfig,\n LayoutMode,\n ScalingMode,\n} from '../../types';\nimport { DEFAULT_LAYER_TRANSFORM } from '../../types';\n\n// ============================================================================\n// Layout Preset Definitions\n// ============================================================================\n\nexport interface LayoutPreset {\n mode: LayoutMode;\n label: string;\n icon: string;\n minSources: number;\n maxSources: number;\n}\n\n/**\n * All available layout presets with metadata\n */\nexport const LAYOUT_PRESETS: LayoutPreset[] = [\n { mode: 'solo', label: 'Solo', icon: '⬜', minSources: 1, maxSources: 1 },\n // 2-source layouts\n { mode: 'pip-br', label: 'PiP ↘', icon: '◳', minSources: 2, maxSources: 2 },\n { mode: 'pip-bl', label: 'PiP ↙', icon: '◲', minSources: 2, maxSources: 2 },\n { mode: 'pip-tr', label: 'PiP ↗', icon: '◱', minSources: 2, maxSources: 2 },\n { mode: 'pip-tl', label: 'PiP ↖', icon: '◰', minSources: 2, maxSources: 2 },\n { mode: 'split-h', label: 'Split ⬌', icon: '▥', minSources: 2, maxSources: 2 },\n { mode: 'split-v', label: 'Split ⬍', icon: '▤', minSources: 2, maxSources: 2 },\n { mode: 'focus-l', label: 'Focus ◀', icon: '◧', minSources: 2, maxSources: 2 },\n { mode: 'focus-r', label: 'Focus ▶', icon: '◨', minSources: 2, maxSources: 2 },\n // 3-source layouts\n { mode: 'pip-dual-br', label: 'Main+2 PiP', icon: '⊞', minSources: 3, maxSources: 3 },\n { mode: 'pip-dual-bl', label: 'Main+2 PiP ↙', icon: '⊟', minSources: 3, maxSources: 3 },\n { mode: 'split-pip-l', label: 'Split+PiP', icon: '⊠', minSources: 3, maxSources: 3 },\n { mode: 'split-pip-r', label: 'Split+PiP ▶', icon: '⊡', minSources: 3, maxSources: 3 },\n // Featured layout (1 main + strip of others)\n { mode: 'featured', label: 'Featured', icon: '⬒', minSources: 3, maxSources: 99 },\n { mode: 'featured-r', label: 'Featured ▶', icon: '⬓', minSources: 3, maxSources: 99 },\n // Auto-grid (works with any count 2+)\n { mode: 'grid', label: 'Grid', icon: '▦', minSources: 2, maxSources: 99 },\n { mode: 'stack', label: 'Stack', icon: '☰', minSources: 2, maxSources: 99 },\n];\n\n// ============================================================================\n// Layer Creation Helpers\n// ============================================================================\n\n// Default scaling mode used when not specified\nlet currentScalingMode: ScalingMode = 'letterbox';\n\nfunction createLayer(\n sourceId: string,\n zIndex: number,\n transform: Partial<typeof DEFAULT_LAYER_TRANSFORM>,\n scalingMode: ScalingMode = currentScalingMode\n): Layer {\n return {\n id: `layer-${zIndex}-${sourceId}`,\n sourceId,\n visible: true,\n locked: false,\n zIndex,\n transform: { ...DEFAULT_LAYER_TRANSFORM, ...transform },\n scalingMode,\n };\n}\n\n// ============================================================================\n// Layout Implementations\n// ============================================================================\n\nconst PIP_SCALE = 0.25;\nconst PIP_PADDING = 0.02;\nconst PIP_BORDER_RADIUS = 8;\nconst SPLIT_GAP = 0.005;\n\n/**\n * Solo layout - single source fullscreen\n */\nfunction applySoloLayout(sourceIds: string[]): Layer[] {\n return [createLayer(sourceIds[0], 0, { x: 0, y: 0, width: 1, height: 1 })];\n}\n\n/**\n * PiP layout - main source with overlay in specified corner\n */\nfunction applyPipLayout(\n sourceIds: string[],\n corner: 'tl' | 'tr' | 'bl' | 'br',\n pipScale: number = PIP_SCALE\n): Layer[] {\n if (sourceIds.length < 2) return applySoloLayout(sourceIds);\n\n const positions = {\n tl: { x: PIP_PADDING, y: PIP_PADDING },\n tr: { x: 1 - pipScale - PIP_PADDING, y: PIP_PADDING },\n bl: { x: PIP_PADDING, y: 1 - pipScale - PIP_PADDING },\n br: { x: 1 - pipScale - PIP_PADDING, y: 1 - pipScale - PIP_PADDING },\n };\n\n const pos = positions[corner];\n\n return [\n // Main (background)\n createLayer(sourceIds[0], 0, { x: 0, y: 0, width: 1, height: 1 }),\n // PiP (overlay)\n createLayer(sourceIds[1], 1, {\n x: pos.x,\n y: pos.y,\n width: pipScale,\n height: pipScale,\n borderRadius: PIP_BORDER_RADIUS,\n }),\n ];\n}\n\n/**\n * Split layout - two sources side by side\n */\nfunction applySplitLayout(\n sourceIds: string[],\n direction: 'h' | 'v',\n ratio: number = 0.5\n): Layer[] {\n if (sourceIds.length < 2) return applySoloLayout(sourceIds);\n\n const gap = SPLIT_GAP;\n const halfGap = gap / 2;\n\n if (direction === 'h') {\n // Horizontal split (left-right)\n return [\n createLayer(sourceIds[0], 0, {\n x: 0,\n y: 0,\n width: ratio - halfGap,\n height: 1,\n }),\n createLayer(sourceIds[1], 0, {\n x: ratio + halfGap,\n y: 0,\n width: 1 - ratio - halfGap,\n height: 1,\n }),\n ];\n } else {\n // Vertical split (top-bottom)\n return [\n createLayer(sourceIds[0], 0, {\n x: 0,\n y: 0,\n width: 1,\n height: ratio - halfGap,\n }),\n createLayer(sourceIds[1], 0, {\n x: 0,\n y: ratio + halfGap,\n width: 1,\n height: 1 - ratio - halfGap,\n }),\n ];\n }\n}\n\n/**\n * Grid layout - auto-scaling grid for any number of sources\n * Calculates optimal grid dimensions based on source count\n */\nfunction applyGridLayout(sourceIds: string[]): Layer[] {\n const count = sourceIds.length;\n if (count === 0) return [];\n if (count === 1) return applySoloLayout(sourceIds);\n if (count === 2) return applySplitLayout(sourceIds, 'h');\n\n const gap = SPLIT_GAP;\n\n // Calculate optimal grid dimensions\n // For count <= 4: 2x2, for 5-6: 3x2, for 7-9: 3x3, etc.\n const cols = Math.ceil(Math.sqrt(count));\n const rows = Math.ceil(count / cols);\n\n const cellW = (1 - gap * (cols - 1)) / cols;\n const cellH = (1 - gap * (rows - 1)) / rows;\n\n const layers: Layer[] = [];\n\n for (let i = 0; i < count; i++) {\n const col = i % cols;\n const row = Math.floor(i / cols);\n\n // Center the last row if it's not full\n const isLastRow = row === rows - 1;\n const itemsInRow = isLastRow ? (count - 1) % cols + 1 : cols;\n let offsetX = 0;\n\n if (isLastRow && itemsInRow < cols) {\n // Center the incomplete row\n const rowWidth = itemsInRow * cellW + (itemsInRow - 1) * gap;\n offsetX = (1 - rowWidth) / 2;\n }\n\n const x = offsetX + col * (cellW + gap);\n const y = row * (cellH + gap);\n\n layers.push(createLayer(sourceIds[i], i, { x, y, width: cellW, height: cellH }));\n }\n\n return layers;\n}\n\n/**\n * Dual PiP layout - main source with 2 PiP overlays in corner\n */\nfunction applyDualPipLayout(sourceIds: string[], corner: 'br' | 'bl'): Layer[] {\n if (sourceIds.length < 3) return applyPipLayout(sourceIds, corner === 'br' ? 'br' : 'bl');\n\n const pipScale = PIP_SCALE;\n const pipGap = 0.01;\n\n // Main source fullscreen\n const layers: Layer[] = [\n createLayer(sourceIds[0], 0, { x: 0, y: 0, width: 1, height: 1 }),\n ];\n\n if (corner === 'br') {\n // Two PiPs stacked vertically in bottom-right\n layers.push(\n createLayer(sourceIds[1], 1, {\n x: 1 - pipScale - PIP_PADDING,\n y: 1 - 2 * pipScale - pipGap - PIP_PADDING,\n width: pipScale,\n height: pipScale,\n borderRadius: PIP_BORDER_RADIUS,\n }),\n createLayer(sourceIds[2], 2, {\n x: 1 - pipScale - PIP_PADDING,\n y: 1 - pipScale - PIP_PADDING,\n width: pipScale,\n height: pipScale,\n borderRadius: PIP_BORDER_RADIUS,\n })\n );\n } else {\n // Two PiPs stacked vertically in bottom-left\n layers.push(\n createLayer(sourceIds[1], 1, {\n x: PIP_PADDING,\n y: 1 - 2 * pipScale - pipGap - PIP_PADDING,\n width: pipScale,\n height: pipScale,\n borderRadius: PIP_BORDER_RADIUS,\n }),\n createLayer(sourceIds[2], 2, {\n x: PIP_PADDING,\n y: 1 - pipScale - PIP_PADDING,\n width: pipScale,\n height: pipScale,\n borderRadius: PIP_BORDER_RADIUS,\n })\n );\n }\n\n return layers;\n}\n\n/**\n * Split + PiP layout - two sources side by side, third as PiP overlay\n */\nfunction applySplitPipLayout(sourceIds: string[], pipSide: 'l' | 'r'): Layer[] {\n if (sourceIds.length < 3) return applySplitLayout(sourceIds, 'h');\n\n const gap = SPLIT_GAP;\n const halfGap = gap / 2;\n const pipScale = PIP_SCALE;\n\n const layers: Layer[] = [\n // Left half\n createLayer(sourceIds[0], 0, { x: 0, y: 0, width: 0.5 - halfGap, height: 1 }),\n // Right half\n createLayer(sourceIds[1], 0, { x: 0.5 + halfGap, y: 0, width: 0.5 - halfGap, height: 1 }),\n ];\n\n // PiP overlay\n if (pipSide === 'l') {\n // PiP on left half, bottom-right of that section\n layers.push(createLayer(sourceIds[2], 1, {\n x: 0.5 - halfGap - pipScale - PIP_PADDING,\n y: 1 - pipScale - PIP_PADDING,\n width: pipScale,\n height: pipScale,\n borderRadius: PIP_BORDER_RADIUS,\n }));\n } else {\n // PiP on right half, bottom-right of that section\n layers.push(createLayer(sourceIds[2], 1, {\n x: 1 - pipScale - PIP_PADDING,\n y: 1 - pipScale - PIP_PADDING,\n width: pipScale,\n height: pipScale,\n borderRadius: PIP_BORDER_RADIUS,\n }));\n }\n\n return layers;\n}\n\n/**\n * Featured layout - one main source large, others in a strip\n * @param direction - 'bottom' for strip below, 'right' for strip on right\n */\nfunction applyFeaturedLayout(sourceIds: string[], direction: 'bottom' | 'right'): Layer[] {\n const count = sourceIds.length;\n if (count <= 2) return applySplitLayout(sourceIds, direction === 'bottom' ? 'v' : 'h', 0.75);\n\n const gap = SPLIT_GAP;\n const stripRatio = 0.2; // Strip takes 20% of the space\n const mainRatio = 1 - stripRatio - gap;\n\n const layers: Layer[] = [];\n\n if (direction === 'bottom') {\n // Main source on top (80%)\n layers.push(createLayer(sourceIds[0], 0, {\n x: 0, y: 0, width: 1, height: mainRatio\n }));\n\n // Strip of thumbnails at bottom\n const thumbCount = count - 1;\n const thumbW = (1 - gap * (thumbCount - 1)) / thumbCount;\n\n for (let i = 1; i < count; i++) {\n layers.push(createLayer(sourceIds[i], 0, {\n x: (i - 1) * (thumbW + gap),\n y: mainRatio + gap,\n width: thumbW,\n height: stripRatio,\n }));\n }\n } else {\n // Main source on left (80%)\n layers.push(createLayer(sourceIds[0], 0, {\n x: 0, y: 0, width: mainRatio, height: 1\n }));\n\n // Strip of thumbnails on right\n const thumbCount = count - 1;\n const thumbH = (1 - gap * (thumbCount - 1)) / thumbCount;\n\n for (let i = 1; i < count; i++) {\n layers.push(createLayer(sourceIds[i], 0, {\n x: mainRatio + gap,\n y: (i - 1) * (thumbH + gap),\n width: stripRatio,\n height: thumbH,\n }));\n }\n }\n\n return layers;\n}\n\n/**\n * Stack layout - vertical stack of sources (no limit)\n */\nfunction applyStackLayout(sourceIds: string[]): Layer[] {\n const count = sourceIds.length;\n if (count === 0) return [];\n if (count === 1) return applySoloLayout(sourceIds);\n\n const gap = SPLIT_GAP;\n const cellH = (1 - gap * (count - 1)) / count;\n\n return sourceIds.map((id, i) =>\n createLayer(id, 0, {\n x: 0,\n y: i * (cellH + gap),\n width: 1,\n height: cellH,\n })\n );\n}\n\n// ============================================================================\n// Main Layout Factory\n// ============================================================================\n\n/**\n * Apply a layout configuration to a list of sources\n *\n * @param layout - Layout configuration\n * @param sourceIds - Array of source IDs to arrange\n * @returns Array of Layer configurations\n */\nexport function applyLayout(layout: LayoutConfig, sourceIds: string[]): Layer[] {\n if (sourceIds.length === 0) {\n return [];\n }\n\n // Set the scaling mode for all layers created by this layout\n currentScalingMode = layout.scalingMode ?? 'letterbox';\n const pipScale = layout.pipScale ?? PIP_SCALE;\n\n switch (layout.mode) {\n // Solo / Fullscreen\n case 'solo':\n case 'fullscreen':\n return applySoloLayout(sourceIds);\n\n // 2-source PiP variants\n case 'pip-br':\n case 'pip':\n return applyPipLayout(sourceIds, 'br', pipScale);\n case 'pip-bl':\n return applyPipLayout(sourceIds, 'bl', pipScale);\n case 'pip-tr':\n return applyPipLayout(sourceIds, 'tr', pipScale);\n case 'pip-tl':\n return applyPipLayout(sourceIds, 'tl', pipScale);\n\n // Split variants\n case 'split-h':\n case 'side-by-side':\n return applySplitLayout(sourceIds, 'h');\n case 'split-v':\n return applySplitLayout(sourceIds, 'v');\n\n // Focus variants (70/30 split)\n case 'focus-l':\n return applySplitLayout(sourceIds, 'h', 0.7);\n case 'focus-r':\n return applySplitLayout(sourceIds, 'h', 0.3);\n\n // 3-source layouts\n case 'pip-dual-br':\n return applyDualPipLayout(sourceIds, 'br');\n case 'pip-dual-bl':\n return applyDualPipLayout(sourceIds, 'bl');\n case 'split-pip-l':\n return applySplitPipLayout(sourceIds, 'l');\n case 'split-pip-r':\n return applySplitPipLayout(sourceIds, 'r');\n\n // Featured layouts (any source count 3+)\n case 'featured':\n return applyFeaturedLayout(sourceIds, 'bottom');\n case 'featured-r':\n return applyFeaturedLayout(sourceIds, 'right');\n\n // Multi-source layouts (auto-grid for any count)\n case 'grid':\n return applyGridLayout(sourceIds);\n case 'stack':\n return applyStackLayout(sourceIds);\n\n default:\n return applySoloLayout(sourceIds);\n }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Create a default LayoutConfig\n */\nexport function createDefaultLayoutConfig(): LayoutConfig {\n return {\n mode: 'solo',\n scalingMode: 'letterbox',\n };\n}\n\n/**\n * Get all available layout presets\n */\nexport function getLayoutPresets(): LayoutPreset[] {\n return LAYOUT_PRESETS;\n}\n\n/**\n * Get presets that work with the given source count\n */\nexport function getAvailablePresets(sourceCount: number): LayoutPreset[] {\n return LAYOUT_PRESETS.filter(\n (p) => sourceCount >= p.minSources && sourceCount <= p.maxSources\n );\n}\n\n/**\n * Get minimum source count required for a layout mode\n */\nexport function getMinSourcesForLayout(mode: LayoutMode): number {\n const preset = LAYOUT_PRESETS.find((p) => p.mode === mode);\n return preset?.minSources ?? 1;\n}\n\n/**\n * Check if a layout mode is available for a given source count\n */\nexport function isLayoutAvailable(mode: LayoutMode, sourceCount: number): boolean {\n const preset = LAYOUT_PRESETS.find((p) => p.mode === mode);\n if (!preset) return false;\n return sourceCount >= preset.minSources && sourceCount <= preset.maxSources;\n}\n\n// ============================================================================\n// Legacy exports for backwards compatibility\n// ============================================================================\n\nexport { applySoloLayout as applyFullscreenLayout };\nexport { applyPipLayout };\nexport { applySplitLayout as applySideBySideLayout };\n\nexport function createPipLayoutConfig(\n pipPosition: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' = 'bottom-right',\n pipScale: number = 0.25\n): LayoutConfig {\n const positionMap = {\n 'top-left': 'pip-tl',\n 'top-right': 'pip-tr',\n 'bottom-left': 'pip-bl',\n 'bottom-right': 'pip-br',\n } as const;\n return {\n mode: positionMap[pipPosition],\n pipScale,\n };\n}\n\nexport function createSideBySideLayoutConfig(\n splitRatio: number = 0.5,\n splitDirection: 'horizontal' | 'vertical' = 'horizontal'\n): LayoutConfig {\n return {\n mode: splitDirection === 'horizontal' ? 'split-h' : 'split-v',\n splitRatio,\n };\n}\n\nexport function getAvailableLayoutModes(): LayoutMode[] {\n return LAYOUT_PRESETS.map((p) => p.mode);\n}\n","/**\n * Transition Engine\n *\n * Manages smooth transitions between scenes with configurable easing.\n *\n * Supported transition types:\n * - cut: Instant switch (no animation)\n * - fade: Cross-dissolve between scenes\n * - slide-left/right/up/down: Sliding panel transition\n *\n * Easing functions:\n * - linear: Constant speed\n * - ease-in: Start slow, end fast\n * - ease-out: Start fast, end slow\n * - ease-in-out: Start slow, accelerate, end slow\n */\n\nimport type {\n TransitionConfig,\n TransitionState,\n TransitionType,\n EasingType,\n} from '../types';\n\n// ============================================================================\n// Easing Functions\n// ============================================================================\n\ntype EasingFunction = (t: number) => number;\n\n/**\n * Standard easing functions based on Robert Penner's easing equations\n */\nconst EASING_FUNCTIONS: Record<EasingType, EasingFunction> = {\n linear: (t) => t,\n\n 'ease-in': (t) => t * t,\n\n 'ease-out': (t) => t * (2 - t),\n\n 'ease-in-out': (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n};\n\n// ============================================================================\n// TransitionEngine Class\n// ============================================================================\n\n/**\n * Engine for managing scene transitions with timing and easing\n */\nexport class TransitionEngine {\n private state: TransitionState | null = null;\n private easing: EasingFunction = EASING_FUNCTIONS.linear;\n\n /**\n * Start a new transition between scenes\n *\n * @param fromSceneId - ID of the scene being transitioned from\n * @param toSceneId - ID of the scene being transitioned to\n * @param config - Transition configuration (type, duration, easing)\n */\n start(fromSceneId: string, toSceneId: string, config: TransitionConfig): void {\n this.state = {\n active: true,\n type: config.type,\n progress: 0,\n fromSceneId,\n toSceneId,\n startTime: performance.now(),\n durationMs: config.durationMs,\n };\n\n this.easing = EASING_FUNCTIONS[config.easing] || EASING_FUNCTIONS.linear;\n\n // For 'cut' transitions, immediately complete\n if (config.type === 'cut') {\n this.state.progress = 1;\n this.state.active = false;\n }\n }\n\n /**\n * Update transition progress based on elapsed time\n * Call this every frame during a transition\n *\n * @returns Current transition state, or null if no transition is active\n */\n update(): TransitionState | null {\n if (!this.state?.active) {\n return null;\n }\n\n const elapsed = performance.now() - this.state.startTime;\n const rawProgress = Math.min(1, elapsed / this.state.durationMs);\n\n // Apply easing to get smooth progress\n this.state.progress = this.easing(rawProgress);\n\n // Check if transition is complete\n if (rawProgress >= 1) {\n this.state.active = false;\n this.state.progress = 1; // Ensure we end at exactly 1\n }\n\n return this.state;\n }\n\n /**\n * Check if a transition is currently active\n */\n isActive(): boolean {\n return this.state?.active ?? false;\n }\n\n /**\n * Get the current transition progress (0-1, with easing applied)\n */\n getProgress(): number {\n return this.state?.progress ?? 0;\n }\n\n /**\n * Get the raw linear progress (0-1, without easing)\n */\n getRawProgress(): number {\n if (!this.state?.active) {\n return this.state?.progress ?? 0;\n }\n\n const elapsed = performance.now() - this.state.startTime;\n return Math.min(1, elapsed / this.state.durationMs);\n }\n\n /**\n * Get the current transition type\n */\n getType(): TransitionType {\n return this.state?.type ?? 'cut';\n }\n\n /**\n * Get the source scene ID (scene being transitioned from)\n */\n getFromSceneId(): string | null {\n return this.state?.fromSceneId ?? null;\n }\n\n /**\n * Get the target scene ID (scene being transitioned to)\n */\n getToSceneId(): string | null {\n return this.state?.toSceneId ?? null;\n }\n\n /**\n * Get remaining time in milliseconds\n */\n getRemainingTime(): number {\n if (!this.state?.active) {\n return 0;\n }\n\n const elapsed = performance.now() - this.state.startTime;\n return Math.max(0, this.state.durationMs - elapsed);\n }\n\n /**\n * Get the full transition state (for serialization/debugging)\n */\n getState(): TransitionState | null {\n return this.state ? { ...this.state } : null;\n }\n\n /**\n * Cancel the current transition\n * The transition will stop at its current progress\n */\n cancel(): void {\n if (this.state) {\n this.state.active = false;\n }\n }\n\n /**\n * Force-complete the current transition\n * Jumps to the end state immediately\n */\n complete(): void {\n if (this.state) {\n this.state.active = false;\n this.state.progress = 1;\n }\n }\n\n /**\n * Reset the engine, clearing any transition state\n */\n reset(): void {\n this.state = null;\n this.easing = EASING_FUNCTIONS.linear;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a default transition configuration\n */\nexport function createDefaultTransitionConfig(): TransitionConfig {\n return {\n type: 'fade',\n durationMs: 500,\n easing: 'ease-in-out',\n };\n}\n\n/**\n * Create a cut (instant) transition configuration\n */\nexport function createCutTransition(): TransitionConfig {\n return {\n type: 'cut',\n durationMs: 0,\n easing: 'linear',\n };\n}\n\n/**\n * Create a fade transition configuration\n */\nexport function createFadeTransition(\n durationMs: number = 500,\n easing: EasingType = 'ease-in-out'\n): TransitionConfig {\n return {\n type: 'fade',\n durationMs,\n easing,\n };\n}\n\n/**\n * Create a slide transition configuration\n */\nexport function createSlideTransition(\n direction: 'left' | 'right' | 'up' | 'down' = 'left',\n durationMs: number = 500,\n easing: EasingType = 'ease-in-out'\n): TransitionConfig {\n return {\n type: `slide-${direction}` as TransitionType,\n durationMs,\n easing,\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get all available transition types\n */\nexport function getAvailableTransitionTypes(): TransitionType[] {\n return ['cut', 'fade', 'slide-left', 'slide-right', 'slide-up', 'slide-down'];\n}\n\n/**\n * Get all available easing types\n */\nexport function getAvailableEasingTypes(): EasingType[] {\n return ['linear', 'ease-in', 'ease-out', 'ease-in-out'];\n}\n\n/**\n * Validate a transition configuration\n */\nexport function validateTransitionConfig(config: Partial<TransitionConfig>): TransitionConfig {\n return {\n type: config.type || 'fade',\n durationMs: Math.max(0, config.durationMs ?? 500),\n easing: config.easing || 'ease-in-out',\n };\n}\n","/**\n * SceneManager\n *\n * Main thread coordinator for the compositor system.\n * Manages scenes, layers, and coordinates with the compositor worker.\n *\n * Responsibilities:\n * - Scene CRUD (create, read, update, delete)\n * - Layer management within scenes\n * - Source → Layer binding\n * - Transition triggering\n * - Frame extraction and forwarding to worker\n * - Output track management\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport type {\n Scene,\n Layer,\n LayerTransform,\n CompositorConfig,\n TransitionConfig,\n LayoutConfig,\n LayoutTransitionConfig,\n FilterConfig,\n RendererType,\n RendererStats,\n SceneManagerEvents,\n CompositorMainToWorker,\n CompositorWorkerToMain,\n} from '../types';\nimport { DEFAULT_LAYER_TRANSFORM, DEFAULT_COMPOSITOR_CONFIG } from '../types';\nimport { applyLayout, createDefaultLayoutConfig } from './layouts';\nimport { createDefaultTransitionConfig } from './TransitionEngine';\n\n// ============================================================================\n// SceneManager Class\n// ============================================================================\n\n/**\n * Default layout transition configuration\n */\nconst DEFAULT_LAYOUT_TRANSITION: LayoutTransitionConfig = {\n durationMs: 300,\n easing: 'ease-out',\n};\n\nexport class SceneManager extends TypedEventEmitter<SceneManagerEvents> {\n private scenes: Map<string, Scene> = new Map();\n private activeSceneId: string | null = null;\n private config: CompositorConfig;\n private defaultTransition: TransitionConfig;\n private defaultLayoutTransition: LayoutTransitionConfig = DEFAULT_LAYOUT_TRANSITION;\n private currentLayout: LayoutConfig;\n private isAnimating = false;\n\n // Worker communication\n private worker: Worker | null = null;\n private workerReady = false;\n private pendingMessages: CompositorMainToWorker[] = [];\n\n // Frame extraction\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private frameProcessors: Map<string, any> = new Map();\n\n // Output\n private outputCanvas: HTMLCanvasElement | null = null;\n private outputStream: MediaStream | null = null;\n\n // Stats\n private lastStats: RendererStats = { fps: 0, frameTimeMs: 0 };\n\n constructor(config?: Partial<CompositorConfig>) {\n super();\n this.config = { ...DEFAULT_COMPOSITOR_CONFIG, ...config };\n this.defaultTransition = this.config.defaultTransition || createDefaultTransitionConfig();\n this.currentLayout = createDefaultLayoutConfig();\n }\n\n // ============================================================================\n // Worker Loading\n // ============================================================================\n\n /**\n * Initialize the worker with fallback loading strategies\n */\n private async initializeWorker(): Promise<void> {\n // Fallback: try loading from paths (for development or custom deployments)\n let lastError: Error | null = null;\n\n const workerPaths = [\n // Preferred: packaged worker relative to built module URL\n new URL('../workers/compositor.worker.js', import.meta.url).href,\n // Vite dev server with pnpm workspace symlinks\n '/node_modules/@livepeer-frameworks/streamcrafter-core/dist/workers/compositor.worker.js',\n // Public folder paths\n '/workers/compositor.worker.js',\n './workers/compositor.worker.js',\n ];\n\n console.log('[SceneManager] Trying fallback worker paths:', workerPaths);\n\n for (const path of workerPaths) {\n if (this.worker) break;\n\n try {\n console.log(`[SceneManager] Trying worker path: ${path}`);\n\n // Worker constructor doesn't throw on 404, need to use a test approach\n const testWorker =\n (() => {\n try {\n return new Worker(path, { type: 'module' });\n } catch {\n return new Worker(path);\n }\n })();\n\n // Wait for either successful message or error\n const success = await new Promise<boolean>((resolve) => {\n const timeout = setTimeout(() => {\n testWorker.terminate();\n resolve(false);\n }, 2000);\n\n testWorker.onerror = () => {\n clearTimeout(timeout);\n testWorker.terminate();\n resolve(false);\n };\n\n // If worker starts sending messages, it loaded successfully\n testWorker.onmessage = () => {\n clearTimeout(timeout);\n resolve(true);\n };\n\n // Also check if we get a ready response quickly\n // Some workers might not send immediate messages, give a short grace period\n setTimeout(() => {\n // If we haven't errored by now, assume it loaded\n clearTimeout(timeout);\n resolve(true);\n }, 500);\n });\n\n if (success) {\n // Terminate test worker and create the real one\n testWorker.terminate();\n try {\n this.worker = new Worker(path, { type: 'module' });\n } catch {\n this.worker = new Worker(path);\n }\n console.log(`[SceneManager] Worker loaded from: ${path}`);\n break;\n } else {\n console.warn(`[SceneManager] Worker failed to load from: ${path}`);\n }\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n console.warn(`[SceneManager] Failed to load worker from ${path}:`, lastError.message);\n this.worker = null;\n }\n }\n\n if (!this.worker) {\n throw new Error(\n `Failed to initialize compositor worker. ` +\n `Make sure the worker is bundled correctly. ` +\n `Last error: ${lastError?.message ?? 'unknown'}`\n );\n }\n }\n\n // ============================================================================\n // Initialization\n // ============================================================================\n\n /**\n * Initialize the compositor system\n * Creates the worker and sets up the output canvas\n * Returns when the worker is ready\n */\n async initialize(): Promise<void> {\n console.log('[SceneManager] initialize() called');\n\n if (this.worker) {\n throw new Error('SceneManager already initialized');\n }\n\n // Create output canvas\n console.log('[SceneManager] Creating output canvas', { width: this.config.width, height: this.config.height });\n this.outputCanvas = document.createElement('canvas');\n this.outputCanvas.width = this.config.width;\n this.outputCanvas.height = this.config.height;\n\n // Get OffscreenCanvas for worker\n const offscreen = this.outputCanvas.transferControlToOffscreen();\n console.log('[SceneManager] Created OffscreenCanvas');\n\n // Create the worker using the same strategy as the player\n console.log('[SceneManager] Initializing worker...');\n await this.initializeWorker();\n console.log('[SceneManager] Worker initialized, waiting for ready...');\n\n // Create a promise that resolves when worker sends 'ready'\n const readyPromise = new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n console.error('[SceneManager] Worker initialization timeout');\n reject(new Error('Compositor worker initialization timeout'));\n }, 10000); // 10 second timeout\n\n // Set up message handler (worker is guaranteed non-null after initializeWorker)\n this.worker!.onmessage = (e: MessageEvent<CompositorWorkerToMain>) => {\n console.log('[SceneManager] Worker message:', e.data.type);\n if (e.data.type === 'ready') {\n clearTimeout(timeout);\n resolve();\n }\n this.handleWorkerMessage(e.data);\n };\n\n this.worker!.onerror = (e: ErrorEvent) => {\n console.error('[SceneManager] Worker error:', e.message);\n clearTimeout(timeout);\n reject(new Error(e.message));\n };\n });\n\n // Initialize the worker with the offscreen canvas\n // Note: Send directly (not via sendToWorker) because workerReady is still false\n console.log('[SceneManager] Sending init message to worker');\n this.worker!.postMessage(\n { type: 'init', config: this.config, canvas: offscreen },\n [offscreen]\n );\n\n // Wait for worker to be ready\n await readyPromise;\n console.log('[SceneManager] Worker is ready');\n\n // Create default scene\n console.log('[SceneManager] Creating default scene');\n const defaultScene = this.createScene('Default');\n console.log('[SceneManager] Setting active scene:', defaultScene.id);\n this.setActiveScene(defaultScene.id);\n console.log('[SceneManager] Initialize complete');\n }\n\n /**\n * Handle messages from the compositor worker\n */\n private handleWorkerMessage(message: CompositorWorkerToMain): void {\n switch (message.type) {\n case 'ready':\n this.workerReady = true;\n // Send any pending messages\n for (const msg of this.pendingMessages) {\n this.worker?.postMessage(msg);\n }\n this.pendingMessages = [];\n break;\n\n case 'stats':\n this.lastStats = message.stats;\n this.emit('statsUpdate', { stats: message.stats });\n break;\n\n case 'transitionComplete':\n this.emit('transitionCompleted', { sceneId: message.sceneId });\n break;\n\n case 'layoutAnimationComplete': {\n this.isAnimating = false;\n // Update local scene with the final layout\n const activeScene = this.getActiveScene();\n if (activeScene) {\n const sourceIds = activeScene.layers\n .filter(l => l.visible)\n .map((l) => l.sourceId);\n activeScene.layers = applyLayout(this.currentLayout, sourceIds);\n }\n this.emit('layoutAnimationCompleted', { layout: this.currentLayout });\n break;\n }\n\n case 'rendererChanged':\n // Update the config with the actual renderer type (important for 'auto' mode)\n this.config.renderer = message.renderer;\n this.emit('rendererChanged', { renderer: message.renderer });\n break;\n\n case 'error':\n this.emit('error', { message: message.message });\n break;\n }\n }\n\n /**\n * Send a message to the worker\n */\n private sendToWorker(message: CompositorMainToWorker, transfer?: Transferable[]): void {\n if (this.workerReady && this.worker) {\n this.worker.postMessage(message, transfer || []);\n } else {\n // Queue the message until worker is ready\n this.pendingMessages.push(message);\n }\n }\n\n // ============================================================================\n // Scene Management\n // ============================================================================\n\n /**\n * Create a new scene\n */\n createScene(name: string, backgroundColor = '#000000'): Scene {\n const id = `scene-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n\n const scene: Scene = {\n id,\n name,\n layers: [],\n backgroundColor,\n };\n\n this.scenes.set(id, scene);\n this.emit('sceneCreated', { scene });\n\n return scene;\n }\n\n /**\n * Delete a scene\n */\n deleteScene(sceneId: string): void {\n if (!this.scenes.has(sceneId)) {\n throw new Error(`Scene not found: ${sceneId}`);\n }\n\n if (this.activeSceneId === sceneId) {\n throw new Error('Cannot delete the active scene');\n }\n\n this.scenes.delete(sceneId);\n this.emit('sceneDeleted', { sceneId });\n }\n\n /**\n * Get a scene by ID\n */\n getScene(sceneId: string): Scene | undefined {\n return this.scenes.get(sceneId);\n }\n\n /**\n * Get all scenes\n */\n getAllScenes(): Scene[] {\n return Array.from(this.scenes.values());\n }\n\n /**\n * Get the active scene\n */\n getActiveScene(): Scene | undefined {\n return this.activeSceneId ? this.scenes.get(this.activeSceneId) : undefined;\n }\n\n /**\n * Set the active scene (instant switch, no transition)\n */\n setActiveScene(sceneId: string): void {\n const scene = this.scenes.get(sceneId);\n if (!scene) {\n throw new Error(`Scene not found: ${sceneId}`);\n }\n\n const previousSceneId = this.activeSceneId;\n this.activeSceneId = sceneId;\n\n // Update the worker\n this.sendToWorker({ type: 'updateScene', scene });\n\n this.emit('sceneActivated', { scene, previousSceneId });\n }\n\n /**\n * Transition to a new scene\n */\n async transitionTo(sceneId: string, transition?: TransitionConfig): Promise<void> {\n const scene = this.scenes.get(sceneId);\n if (!scene) {\n throw new Error(`Scene not found: ${sceneId}`);\n }\n\n const transitionConfig = transition || this.defaultTransition;\n\n // First, send the target scene to the worker\n this.sendToWorker({ type: 'updateScene', scene });\n\n // Then start the transition\n this.sendToWorker({\n type: 'startTransition',\n transition: transitionConfig,\n toSceneId: sceneId,\n });\n\n const previousSceneId = this.activeSceneId;\n this.emit('transitionStarted', {\n fromSceneId: previousSceneId || '',\n toSceneId: sceneId,\n transition: transitionConfig,\n });\n\n // Update active scene ID\n this.activeSceneId = sceneId;\n }\n\n // ============================================================================\n // Layer Management\n // ============================================================================\n\n /**\n * Add a layer to a scene\n */\n addLayer(\n sceneId: string,\n sourceId: string,\n transform?: Partial<LayerTransform>\n ): Layer {\n const scene = this.scenes.get(sceneId);\n if (!scene) {\n throw new Error(`Scene not found: ${sceneId}`);\n }\n\n const layerId = `layer-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const maxZIndex = scene.layers.reduce((max, l) => Math.max(max, l.zIndex), -1);\n\n const layer: Layer = {\n id: layerId,\n sourceId,\n visible: true,\n locked: false,\n zIndex: maxZIndex + 1,\n transform: { ...DEFAULT_LAYER_TRANSFORM, ...transform },\n scalingMode: this.currentLayout.scalingMode ?? 'letterbox',\n };\n\n scene.layers.push(layer);\n this.updateSceneInWorker(scene);\n\n this.emit('layerAdded', { sceneId, layer });\n return layer;\n }\n\n /**\n * Remove a layer from a scene\n */\n removeLayer(sceneId: string, layerId: string): void {\n const scene = this.scenes.get(sceneId);\n if (!scene) {\n throw new Error(`Scene not found: ${sceneId}`);\n }\n\n const index = scene.layers.findIndex((l) => l.id === layerId);\n if (index === -1) {\n throw new Error(`Layer not found: ${layerId}`);\n }\n\n scene.layers.splice(index, 1);\n this.updateSceneInWorker(scene);\n\n this.emit('layerRemoved', { sceneId, layerId });\n }\n\n /**\n * Update a layer's transform\n */\n updateLayerTransform(\n sceneId: string,\n layerId: string,\n transform: Partial<LayerTransform>\n ): void {\n const scene = this.scenes.get(sceneId);\n if (!scene) {\n throw new Error(`Scene not found: ${sceneId}`);\n }\n\n const layer = scene.layers.find((l) => l.id === layerId);\n if (!layer) {\n throw new Error(`Layer not found: ${layerId}`);\n }\n\n layer.transform = { ...layer.transform, ...transform };\n this.updateSceneInWorker(scene);\n\n this.emit('layerUpdated', { sceneId, layer });\n }\n\n /**\n * Toggle layer visibility\n */\n setLayerVisibility(sceneId: string, layerId: string, visible: boolean): void {\n const scene = this.scenes.get(sceneId);\n if (!scene) {\n throw new Error(`Scene not found: ${sceneId}`);\n }\n\n const layer = scene.layers.find((l) => l.id === layerId);\n if (!layer) {\n throw new Error(`Layer not found: ${layerId}`);\n }\n\n layer.visible = visible;\n this.updateSceneInWorker(scene);\n\n this.emit('layerUpdated', { sceneId, layer });\n }\n\n /**\n * Reorder layers in a scene\n */\n reorderLayers(sceneId: string, layerIds: string[]): void {\n const scene = this.scenes.get(sceneId);\n if (!scene) {\n throw new Error(`Scene not found: ${sceneId}`);\n }\n\n // Reorder based on the provided IDs\n layerIds.forEach((id, index) => {\n const layer = scene.layers.find((l) => l.id === id);\n if (layer) {\n layer.zIndex = index;\n }\n });\n\n this.updateSceneInWorker(scene);\n }\n\n /**\n * Cycle the source order in the active scene (rotate layers)\n * @param direction - 'forward' moves first to last, 'backward' moves last to first\n */\n cycleSourceOrder(direction: 'forward' | 'backward' = 'forward'): void {\n const scene = this.getActiveScene();\n if (!scene || scene.layers.length < 2) {\n console.warn('[SceneManager] cycleSourceOrder: Need at least 2 layers');\n return;\n }\n\n // Debug: log state BEFORE cycle\n console.log('[SceneManager] cycleSourceOrder BEFORE:', {\n direction,\n layers: scene.layers.map(l => ({ id: l.id, sourceId: l.sourceId, zIndex: l.zIndex })),\n });\n\n // Get layer IDs sorted by current zIndex\n const sortedLayers = [...scene.layers].sort((a, b) => a.zIndex - b.zIndex);\n const layerIds = sortedLayers.map((l) => l.id);\n\n console.log('[SceneManager] sorted layerIds before rotate:', [...layerIds]);\n\n // Rotate the array\n if (direction === 'forward') {\n const first = layerIds.shift();\n if (first) layerIds.push(first);\n } else {\n const last = layerIds.pop();\n if (last) layerIds.unshift(last);\n }\n\n console.log('[SceneManager] layerIds after rotate:', [...layerIds]);\n\n // Apply the new Z-order\n this.reorderLayers(scene.id, layerIds);\n\n // Debug: log state AFTER reorder, BEFORE applyLayout\n console.log('[SceneManager] after reorderLayers:', {\n layers: scene.layers.map(l => ({ id: l.id, sourceId: l.sourceId, zIndex: l.zIndex })),\n });\n\n // Re-apply layout to update visual positions based on new Z-order\n if (this.currentLayout) {\n this.applyLayout(this.currentLayout, true, { durationMs: 200, easing: 'ease-out' });\n }\n\n // Debug: log state AFTER applyLayout\n console.log('[SceneManager] cycleSourceOrder AFTER applyLayout:', {\n layers: scene.layers.map(l => ({ id: l.id, sourceId: l.sourceId, zIndex: l.zIndex })),\n });\n\n this.emit('layerUpdated', { sceneId: scene.id, layer: scene.layers[0] });\n }\n\n /**\n * Update scene in the worker\n */\n private updateSceneInWorker(scene: Scene): void {\n if (this.activeSceneId === scene.id) {\n this.sendToWorker({ type: 'updateScene', scene });\n }\n }\n\n // ============================================================================\n // Layout Presets\n // ============================================================================\n\n /**\n * Apply a layout preset to the active scene\n * @param layout - Layout configuration to apply\n * @param animate - Whether to animate the transition (default: true)\n * @param transition - Custom transition config (uses default if not provided)\n */\n applyLayout(\n layout: LayoutConfig,\n animate = true,\n transition?: Partial<LayoutTransitionConfig>\n ): void {\n const scene = this.getActiveScene();\n if (!scene) {\n console.warn('[SceneManager] applyLayout: No active scene');\n return;\n }\n\n this.currentLayout = layout;\n\n // Get source IDs from current layers sorted by zIndex (preserves cycle order)\n const sourceIds = [...scene.layers]\n .filter(l => l.visible)\n .sort((a, b) => a.zIndex - b.zIndex)\n .map((l) => l.sourceId);\n console.log('[SceneManager] applyLayout', {\n mode: layout.mode,\n sourceIds,\n currentLayerCount: scene.layers.length,\n animate,\n });\n\n // Generate new layers from layout\n const newLayers = applyLayout(layout, sourceIds);\n\n // Create target scene with new layers\n const targetScene: Scene = {\n ...scene,\n layers: newLayers,\n };\n\n // Always update scene.layers to keep state in sync\n scene.layers = newLayers;\n\n if (animate && newLayers.length > 0) {\n // Animate to the new layout\n const transitionConfig: LayoutTransitionConfig = {\n ...this.defaultLayoutTransition,\n ...transition,\n };\n\n this.isAnimating = true;\n this.emit('layoutAnimationStarted', { layout });\n this.sendToWorker({\n type: 'animateLayout',\n targetScene,\n transition: transitionConfig,\n });\n } else {\n // Instant update (no animation)\n this.updateSceneInWorker(scene);\n }\n\n // Also send layout update to worker (for metadata tracking)\n this.sendToWorker({ type: 'updateLayout', layout });\n }\n\n /**\n * Set the default layout transition configuration\n */\n setDefaultLayoutTransition(transition: Partial<LayoutTransitionConfig>): void {\n this.defaultLayoutTransition = {\n ...this.defaultLayoutTransition,\n ...transition,\n };\n }\n\n /**\n * Check if a layout animation is currently in progress\n */\n isLayoutAnimating(): boolean {\n return this.isAnimating;\n }\n\n /**\n * Get the current layout\n */\n getCurrentLayout(): LayoutConfig {\n return this.currentLayout;\n }\n\n // ============================================================================\n // Source Binding\n // ============================================================================\n\n /**\n * Bind a MediaStream source to the compositor\n * This extracts frames and sends them to the worker\n */\n bindSource(sourceId: string, stream: MediaStream): void {\n // Get the video track\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error('No video track in stream');\n }\n\n // Create a MediaStreamTrackProcessor to extract frames\n // MediaStreamTrackProcessor is experimental and not in all TypeScript defs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const MediaStreamTrackProcessorCtor = (globalThis as any).MediaStreamTrackProcessor;\n if (!MediaStreamTrackProcessorCtor) {\n console.warn('[SceneManager] MediaStreamTrackProcessor not available, compositor will not work');\n return;\n }\n\n const processor = new MediaStreamTrackProcessorCtor({ track: videoTrack });\n this.frameProcessors.set(sourceId, processor);\n\n // Read frames and send to worker\n const reader = processor.readable.getReader();\n\n const readFrame = async (): Promise<void> => {\n try {\n const { done, value } = await reader.read();\n if (done || !value) return;\n\n // Cast to VideoFrame since we know it's a video track processor\n const frame = value as VideoFrame;\n\n // Send frame to worker (transfer ownership)\n this.sendToWorker(\n { type: 'sourceFrame', sourceId, frame },\n [frame]\n );\n\n // Continue reading\n readFrame();\n } catch (error) {\n console.error('[SceneManager] Frame read error:', error);\n }\n };\n\n readFrame();\n }\n\n /**\n * Unbind a source from the compositor\n */\n unbindSource(sourceId: string): void {\n const processor = this.frameProcessors.get(sourceId);\n if (processor) {\n // Processor will be garbage collected\n this.frameProcessors.delete(sourceId);\n }\n }\n\n /**\n * Bind an image source to the compositor\n */\n async bindImageSource(sourceId: string, imageUrl: string): Promise<void> {\n const response = await fetch(imageUrl);\n const blob = await response.blob();\n const bitmap = await createImageBitmap(blob);\n\n this.sendToWorker(\n { type: 'sourceImage', sourceId, bitmap },\n [bitmap]\n );\n }\n\n // ============================================================================\n // Filters\n // ============================================================================\n\n /**\n * Apply a filter to a layer\n * Note: Only supported with WebGL or WebGPU renderer\n */\n applyFilter(layerId: string, filter: FilterConfig): void {\n this.sendToWorker({ type: 'applyFilter', layerId, filter });\n }\n\n // ============================================================================\n // Output\n // ============================================================================\n\n /**\n * Get the output MediaStreamTrack for the composited video\n */\n getOutputTrack(): MediaStreamTrack | null {\n if (!this.outputCanvas) return null;\n\n // Capture from the canvas at the configured frame rate\n if (!this.outputStream) {\n this.outputStream = this.outputCanvas.captureStream(this.config.frameRate);\n }\n\n return this.outputStream.getVideoTracks()[0] || null;\n }\n\n /**\n * Get the output MediaStream\n */\n getOutputStream(): MediaStream | null {\n if (!this.outputCanvas) return null;\n\n if (!this.outputStream) {\n this.outputStream = this.outputCanvas.captureStream(this.config.frameRate);\n }\n\n return this.outputStream;\n }\n\n // ============================================================================\n // Stats & State\n // ============================================================================\n\n /**\n * Get the current renderer type\n */\n getRendererType(): RendererType {\n return this.config.renderer;\n }\n\n /**\n * Switch to a different renderer at runtime\n * The worker will destroy the old renderer and create a new one\n */\n setRenderer(rendererType: RendererType): void {\n this.config.renderer = rendererType;\n this.sendToWorker({ type: 'setRenderer', renderer: rendererType });\n }\n\n /**\n * Get the latest stats from the compositor\n */\n getStats(): RendererStats {\n return this.lastStats;\n }\n\n /**\n * Get the compositor configuration\n */\n getConfig(): CompositorConfig {\n return { ...this.config };\n }\n\n /**\n * Update output configuration (resolution / frame rate).\n * Resizes the output canvas and reinitializes the renderer.\n */\n updateOutputConfig(config: Partial<Pick<CompositorConfig, 'width' | 'height' | 'frameRate'>>): boolean {\n const nextWidth = config.width ?? this.config.width;\n const nextHeight = config.height ?? this.config.height;\n const nextFrameRate = config.frameRate ?? this.config.frameRate;\n\n const changed =\n nextWidth !== this.config.width ||\n nextHeight !== this.config.height ||\n nextFrameRate !== this.config.frameRate;\n\n if (!changed) return false;\n\n this.config.width = nextWidth;\n this.config.height = nextHeight;\n this.config.frameRate = nextFrameRate;\n\n // Canvas size must be updated in the worker (OffscreenCanvas after transfer).\n // Updating the HTMLCanvasElement here throws once control is transferred.\n this.sendToWorker({ type: 'resize', width: nextWidth, height: nextHeight, frameRate: nextFrameRate });\n\n return true;\n }\n\n /**\n * Check if the compositor is initialized\n */\n isInitialized(): boolean {\n return this.workerReady;\n }\n\n // ============================================================================\n // Cleanup\n // ============================================================================\n\n /**\n * Destroy the SceneManager and release all resources\n */\n destroy(): void {\n // Stop all frame processors\n for (const [sourceId] of this.frameProcessors) {\n this.unbindSource(sourceId);\n }\n this.frameProcessors.clear();\n\n // Terminate the worker\n if (this.worker) {\n this.sendToWorker({ type: 'destroy' });\n this.worker.terminate();\n this.worker = null;\n }\n\n // Clear scenes\n this.scenes.clear();\n this.activeSceneId = null;\n\n // Clear output\n this.outputStream = null;\n this.outputCanvas = null;\n\n this.workerReady = false;\n this.removeAllListeners();\n }\n}\n","/**\n * Encoder Manager\n * Manages WebCodecs encoder worker from main thread\n * Handles frame transfer via MediaStreamTrackProcessor\n *\n * Output: Encoded chunks emitted via 'videoChunk' and 'audioChunk' events\n * (for RTCRtpScriptTransform injection)\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport type { EncoderConfig, VideoEncoderSettings, AudioEncoderSettings, EncoderOverrides } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface EncoderStats {\n video: {\n framesEncoded: number;\n framesDropped: number;\n framesSubmitted: number;\n framesPending: number;\n bytesEncoded: number;\n lastFrameTime: number;\n };\n audio: {\n samplesEncoded: number;\n samplesDropped: number;\n samplesSubmitted: number;\n samplesPending: number;\n bytesEncoded: number;\n lastSampleTime: number;\n };\n timestamp: number;\n}\n\n// Serializable encoded chunk data (matches worker output)\nexport interface EncodedVideoChunkData {\n timestamp: number;\n duration: number | null;\n type: 'key' | 'delta';\n data: ArrayBuffer;\n}\n\nexport interface EncodedAudioChunkData {\n timestamp: number;\n duration: number | null;\n type: 'key' | 'delta';\n data: ArrayBuffer;\n}\n\ninterface EncoderManagerEvents {\n ready: undefined;\n started: undefined;\n stopped: undefined;\n stats: EncoderStats;\n error: { message: string; fatal: boolean };\n videoChunk: EncodedVideoChunkData;\n audioChunk: EncodedAudioChunkData;\n}\n\nexport interface EncoderManagerOptions {\n /** URL to the encoder worker script */\n workerUrl?: string;\n /** Pre-constructed Worker instance (takes precedence over workerUrl) */\n worker?: Worker;\n debug?: boolean;\n /** Timeout for worker responses (ms) */\n timeout?: number;\n}\n\n// Worker message types (must match encoder.worker.ts)\ntype WorkerInMessage =\n | { type: 'initialize'; requestId: string; data: { config: EncoderConfig } }\n | { type: 'start'; requestId: string }\n | { type: 'stop'; requestId: string }\n | { type: 'flush'; requestId: string }\n | { type: 'updateConfig'; requestId: string; data: Partial<EncoderConfig> }\n | { type: 'videoFrame'; data: VideoFrame }\n | { type: 'audioData'; data: AudioData };\n\ninterface PendingRequest {\n resolve: (value?: unknown) => void;\n reject: (reason?: unknown) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n// ============================================================================\n// Default encoder settings\n// ============================================================================\n\nexport const DEFAULT_VIDEO_SETTINGS: Record<string, VideoEncoderSettings> = {\n professional: {\n codec: 'avc1.4d0032', // H.264 High Profile Level 5.0\n width: 1920,\n height: 1080,\n bitrate: 8_000_000,\n framerate: 30,\n },\n broadcast: {\n codec: 'avc1.4d0028', // H.264 High Profile Level 4.0\n width: 1920,\n height: 1080,\n bitrate: 4_500_000,\n framerate: 30,\n },\n conference: {\n codec: 'avc1.4d001f', // H.264 High Profile Level 3.1\n width: 1280,\n height: 720,\n bitrate: 2_500_000,\n framerate: 30,\n },\n low: {\n codec: 'avc1.42001e', // H.264 Baseline Profile Level 3.0\n width: 640,\n height: 480,\n bitrate: 1_000_000,\n framerate: 24,\n },\n};\n\nexport const DEFAULT_AUDIO_SETTINGS: AudioEncoderSettings = {\n codec: 'opus',\n sampleRate: 48000,\n numberOfChannels: 2,\n bitrate: 128_000,\n};\n\n// ============================================================================\n// EncoderManager\n// ============================================================================\n\nexport class EncoderManager extends TypedEventEmitter<EncoderManagerEvents> {\n private worker: Worker | null = null;\n private videoProcessor: MediaStreamTrackProcessor<VideoFrame> | null = null;\n private audioProcessor: MediaStreamTrackProcessor<AudioData> | null = null;\n private videoReader: ReadableStreamDefaultReader<VideoFrame> | null = null;\n private audioReader: ReadableStreamDefaultReader<AudioData> | null = null;\n private isRunning = false;\n private isInitialized = false;\n private options: Required<Omit<EncoderManagerOptions, 'worker'>>;\n private stats: EncoderStats | null = null;\n private config: EncoderConfig | null = null;\n\n // Pending request tracking for async handshake\n private pendingRequests = new Map<string, PendingRequest>();\n private requestCounter = 0;\n\n private providedWorker: Worker | null = null;\n\n constructor(options: EncoderManagerOptions = {}) {\n super();\n this.options = {\n workerUrl: options.workerUrl ?? '',\n debug: options.debug ?? false,\n timeout: options.timeout ?? 10000,\n } as Required<Omit<EncoderManagerOptions, 'worker'>>;\n // Store pre-constructed worker if provided\n this.providedWorker = options.worker ?? null;\n }\n\n // ==========================================================================\n // Debug logging\n // ==========================================================================\n\n private log(message: string, data?: unknown): void {\n if (this.options.debug) {\n console.log(`[EncoderManager] ${message}`, data ?? '');\n }\n }\n\n // ==========================================================================\n // Request/response helpers\n // ==========================================================================\n\n private generateRequestId(): string {\n return `req_${++this.requestCounter}_${Date.now()}`;\n }\n\n private sendRequest<T = void>(message: WorkerInMessage): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.worker) {\n reject(new Error('Worker not created'));\n return;\n }\n\n const requestId = (message as { requestId?: string }).requestId;\n if (!requestId) {\n // Fire-and-forget message (videoFrame, audioData)\n this.worker.postMessage(message);\n resolve(undefined as T);\n return;\n }\n\n const timer = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error(`Request ${requestId} timed out`));\n }, this.options.timeout);\n\n this.pendingRequests.set(requestId, { resolve: resolve as (v?: unknown) => void, reject, timer });\n this.worker.postMessage(message);\n });\n }\n\n private handleResponse(requestId: string, success: boolean, error?: string): void {\n const pending = this.pendingRequests.get(requestId);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this.pendingRequests.delete(requestId);\n\n if (success) {\n pending.resolve();\n } else {\n pending.reject(new Error(error ?? 'Unknown error'));\n }\n }\n\n // ==========================================================================\n // Worker creation\n // ==========================================================================\n\n /**\n * Try to create a worker from a URL and wait for it to be ready\n * Returns the worker if successful, null if it fails to load\n */\n private tryCreateWorker(url: string | URL, useModule = true): Promise<Worker | null> {\n return new Promise((resolve) => {\n try {\n const worker = new Worker(url, useModule ? { type: 'module' } : undefined);\n let resolved = false;\n\n const cleanup = () => {\n worker.removeEventListener('message', onMessage);\n worker.removeEventListener('error', onError);\n };\n\n const onMessage = (e: MessageEvent) => {\n // Worker loaded and sent a message - it's working\n if (!resolved) {\n resolved = true;\n cleanup();\n // Put the message back by re-dispatching after we return\n // Actually, we need to handle this message in initialize()\n // For now, just resolve - the worker is loaded\n resolve(worker);\n }\n };\n\n const onError = (e: ErrorEvent) => {\n if (!resolved) {\n resolved = true;\n cleanup();\n this.log('Worker failed to load from: ' + url.toString(), e.message);\n worker.terminate();\n resolve(null);\n }\n };\n\n worker.addEventListener('message', onMessage);\n worker.addEventListener('error', onError);\n\n // Timeout - if no message or error within 2 seconds, assume it's loading but slow\n // We'll resolve with the worker and let initialize() handle the timeout\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n cleanup();\n resolve(worker);\n }\n }, 2000);\n } catch (e) {\n this.log('Failed to create worker: ' + url.toString(), e);\n resolve(null);\n }\n });\n }\n\n private async createWorkerAsync(): Promise<Worker> {\n // Priority 1: Use pre-constructed worker if provided\n if (this.providedWorker) {\n this.log('Using provided worker instance');\n return this.providedWorker;\n }\n\n // Priority 2: Use explicit worker URL if provided\n if (this.options.workerUrl) {\n this.log('Creating worker from URL:', this.options.workerUrl);\n const worker = await this.tryCreateWorker(this.options.workerUrl);\n if (worker) return worker;\n }\n\n // Build list of URLs to try\n const urlsToTry: Array<{ url: string | URL; description: string }> = [];\n\n // Priority 3: Try loading relative to built module\n try {\n const workerUrl = new URL('../workers/encoder.worker.js', import.meta.url);\n urlsToTry.push({ url: workerUrl, description: 'import.meta.url relative' });\n } catch {\n // URL construction failed, skip\n }\n\n // Priority 4: Fallback paths for various environments\n urlsToTry.push(\n { url: '/workers/encoder.worker.js', description: 'Vite dev server' },\n { url: '/node_modules/@livepeer-frameworks/streamcrafter-core/dist/workers/encoder.worker.js', description: 'node_modules' },\n { url: './workers/encoder.worker.js', description: 'relative path' },\n );\n\n // Try each URL in sequence\n for (const { url, description } of urlsToTry) {\n this.log(`Trying worker path: ${url.toString()} (${description})`);\n const worker = await this.tryCreateWorker(url);\n if (worker) {\n this.log('Worker loaded from:', url.toString());\n return worker;\n }\n }\n\n throw new Error(\n 'Failed to create encoder worker. ' +\n 'Provide a worker URL via options.workerUrl or ensure workers are served correctly.'\n );\n }\n\n // Synchronous wrapper for backwards compatibility - creates worker optimistically\n private createWorker(): Worker {\n // For sync creation, just try the most likely path\n // The async initialization will handle failures\n if (this.providedWorker) {\n return this.providedWorker;\n }\n\n if (this.options.workerUrl) {\n return new Worker(this.options.workerUrl, { type: 'module' });\n }\n\n // Try import.meta.url first (works in production builds)\n try {\n const workerUrl = new URL('../workers/encoder.worker.js', import.meta.url);\n return new Worker(workerUrl, { type: 'module' });\n } catch {\n // Fall through\n }\n\n // Try common fallback paths\n return new Worker('/workers/encoder.worker.js', { type: 'module' });\n }\n\n // ==========================================================================\n // Worker message handling\n // ==========================================================================\n\n private handleWorkerMessage(message: { type: string; requestId?: string; data?: unknown }): void {\n switch (message.type) {\n case 'ready':\n this.log('Worker ready');\n if (message.requestId) {\n this.handleResponse(message.requestId, true);\n }\n this.emit('ready', undefined);\n break;\n\n case 'started':\n this.log('Encoding started');\n if (message.requestId) {\n this.handleResponse(message.requestId, true);\n }\n this.emit('started', undefined);\n break;\n\n case 'stopped':\n this.log('Encoding stopped');\n if (message.requestId) {\n this.handleResponse(message.requestId, true);\n }\n this.emit('stopped', undefined);\n break;\n\n case 'flushed':\n this.log('Encoder flushed');\n if (message.requestId) {\n this.handleResponse(message.requestId, true);\n }\n break;\n\n case 'stats':\n this.stats = message.data as EncoderStats;\n this.emit('stats', this.stats);\n break;\n\n case 'error': {\n const error = message.data as { message: string; fatal: boolean };\n console.error('[EncoderManager] Worker error:', error);\n if (message.requestId) {\n this.handleResponse(message.requestId, false, error.message);\n }\n this.emit('error', error);\n break;\n }\n\n case 'encodedVideoChunk':\n this.emit('videoChunk', message.data as EncodedVideoChunkData);\n break;\n\n case 'encodedAudioChunk':\n this.emit('audioChunk', message.data as EncodedAudioChunkData);\n break;\n\n default:\n this.log('Unknown message from worker', message);\n }\n }\n\n // ==========================================================================\n // Public API\n // ==========================================================================\n\n /**\n * Initialize the encoder with a media stream and config.\n * Creates the worker, sends initialize message, and waits for ready ack.\n */\n async initialize(stream: MediaStream, config: EncoderConfig): Promise<void> {\n this.log('Initializing encoder', config);\n this.config = config;\n\n // Check for WebCodecs support\n if (typeof VideoEncoder === 'undefined' || typeof AudioEncoder === 'undefined') {\n throw new Error('WebCodecs not supported in this browser');\n }\n\n // Check for MediaStreamTrackProcessor support\n if (typeof MediaStreamTrackProcessor === 'undefined') {\n throw new Error('MediaStreamTrackProcessor not supported in this browser');\n }\n\n // Get input tracks\n const videoTrack = stream.getVideoTracks()[0];\n const audioTrack = stream.getAudioTracks()[0];\n\n // Create track processors for input\n if (videoTrack) {\n this.videoProcessor = new MediaStreamTrackProcessor({ track: videoTrack });\n }\n\n if (audioTrack) {\n this.audioProcessor = new MediaStreamTrackProcessor({ track: audioTrack });\n }\n\n // Create worker using async method that tries multiple paths\n this.worker = await this.createWorkerAsync();\n\n this.worker.onmessage = (event) => {\n this.handleWorkerMessage(event.data);\n };\n\n this.worker.onerror = (error) => {\n console.error('[EncoderManager] Worker error:', error);\n this.emit('error', { message: error.message, fatal: true });\n };\n\n // Send initialize message and wait for ready\n const requestId = this.generateRequestId();\n this.log('Sending initialize to worker', { requestId });\n\n await this.sendRequest({\n type: 'initialize',\n requestId,\n data: { config },\n });\n\n this.isInitialized = true;\n this.log('Worker initialized and ready');\n }\n\n /**\n * Start encoding.\n * Sends start message, waits for started ack, then begins frame processing.\n */\n async start(): Promise<void> {\n if (!this.isInitialized) {\n throw new Error('EncoderManager not initialized');\n }\n\n if (this.isRunning) {\n return;\n }\n\n this.log('Starting encoder');\n\n // Send start message and wait for started ack\n const requestId = this.generateRequestId();\n await this.sendRequest({\n type: 'start',\n requestId,\n });\n\n this.isRunning = true;\n\n // Now start frame processing (only after worker is ready)\n if (this.videoProcessor) {\n this.startVideoProcessing();\n }\n\n if (this.audioProcessor) {\n this.startAudioProcessing();\n }\n\n this.log('Encoder started, frame processing active');\n }\n\n /**\n * Start video frame processing loop.\n * Reads frames from MediaStreamTrackProcessor and sends to worker.\n */\n private async startVideoProcessing(): Promise<void> {\n if (!this.videoProcessor || !this.worker) return;\n\n try {\n this.videoReader = this.videoProcessor.readable.getReader();\n const reader = this.videoReader;\n\n while (this.isRunning) {\n const { value: frame, done } = await reader.read();\n\n if (done || !frame) {\n break;\n }\n\n try {\n // Transfer frame to worker (zero-copy)\n this.worker.postMessage(\n { type: 'videoFrame', data: frame },\n [frame]\n );\n } catch (error) {\n console.error('[EncoderManager] Error sending video frame:', error);\n try {\n frame.close();\n } catch {\n // Ignore\n }\n }\n }\n } catch (error) {\n if (this.isRunning) {\n console.error('[EncoderManager] Video processing error:', error);\n }\n }\n }\n\n /**\n * Start audio data processing loop.\n */\n private async startAudioProcessing(): Promise<void> {\n if (!this.audioProcessor || !this.worker) return;\n\n try {\n this.audioReader = this.audioProcessor.readable.getReader();\n const reader = this.audioReader;\n\n while (this.isRunning) {\n const { value: audioData, done } = await reader.read();\n\n if (done || !audioData) {\n break;\n }\n\n try {\n this.worker.postMessage(\n { type: 'audioData', data: audioData },\n [audioData]\n );\n } catch (error) {\n console.error('[EncoderManager] Error sending audio data:', error);\n try {\n audioData.close();\n } catch {\n // Ignore\n }\n }\n }\n } catch (error) {\n if (this.isRunning) {\n console.error('[EncoderManager] Audio processing error:', error);\n }\n }\n }\n\n /**\n * Stop encoding.\n */\n async stop(): Promise<void> {\n if (!this.isRunning) {\n return;\n }\n\n this.isRunning = false;\n this.log('Stopping encoder');\n\n // Cancel readers\n if (this.videoReader) {\n try {\n await this.videoReader.cancel();\n this.videoReader.releaseLock();\n } catch {\n // Ignore\n }\n this.videoReader = null;\n }\n\n if (this.audioReader) {\n try {\n await this.audioReader.cancel();\n this.audioReader.releaseLock();\n } catch {\n // Ignore\n }\n this.audioReader = null;\n }\n\n // Tell worker to stop\n if (this.worker && this.isInitialized) {\n const requestId = this.generateRequestId();\n try {\n await this.sendRequest({\n type: 'stop',\n requestId,\n });\n } catch (error) {\n this.log('Stop request failed (may be expected)', error);\n }\n }\n\n this.emit('stopped', undefined);\n }\n\n /**\n * Update encoder configuration (e.g., bitrate).\n */\n async updateConfig(config: Partial<EncoderConfig>): Promise<void> {\n if (!this.worker || !this.isInitialized) {\n throw new Error('EncoderManager not initialized');\n }\n\n const requestId = this.generateRequestId();\n await this.sendRequest({\n type: 'updateConfig',\n requestId,\n data: config,\n });\n\n // Update local config\n if (this.config) {\n if (config.video) {\n this.config.video = { ...this.config.video, ...config.video };\n }\n if (config.audio) {\n this.config.audio = { ...this.config.audio, ...config.audio };\n }\n }\n }\n\n /**\n * Flush encoder buffers.\n */\n async flush(): Promise<void> {\n if (!this.worker || !this.isInitialized) {\n return;\n }\n\n const requestId = this.generateRequestId();\n await this.sendRequest({\n type: 'flush',\n requestId,\n });\n }\n\n /**\n * Get current stats.\n */\n getStats(): EncoderStats | null {\n return this.stats;\n }\n\n /**\n * Get current config.\n */\n getConfig(): EncoderConfig | null {\n return this.config;\n }\n\n /**\n * Check if encoder is initialized.\n */\n getIsInitialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Check if encoder is running.\n */\n getIsRunning(): boolean {\n return this.isRunning;\n }\n\n /**\n * Destroy the encoder manager.\n */\n destroy(): void {\n this.stop();\n this.isInitialized = false;\n\n // Clear processors\n this.videoProcessor = null;\n this.audioProcessor = null;\n\n // Clear pending requests\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error('EncoderManager destroyed'));\n }\n this.pendingRequests.clear();\n\n // Terminate worker\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n this.removeAllListeners();\n }\n}\n\n/**\n * Select appropriate H.264 codec profile/level based on resolution and framerate.\n * Uses High Profile with the minimum level that supports the given parameters.\n *\n * H.264 Level capabilities (High Profile):\n * - Level 3.1 (4d001f): 1280x720 @ 30fps, 14 Mbps\n * - Level 4.0 (4d0028): 1920x1080 @ 30fps or 1280x720 @ 60fps, 20 Mbps\n * - Level 5.0 (4d0032): 1920x1080 @ 60fps or 2560x1440 @ 30fps, 25 Mbps\n * - Level 5.1 (4d0033): 2560x1440 @ 60fps or 3840x2160 @ 30fps, 40 Mbps\n * - Level 5.2 (4d0034): 3840x2160 @ 60fps, 60 Mbps\n */\nfunction selectH264Codec(width: number, height: number, framerate: number): string {\n const pixels = width * height;\n\n // 4K (3840x2160)\n if (pixels >= 3840 * 2160) {\n return framerate > 30 ? 'avc1.640034' : 'avc1.640033'; // Level 5.2 or 5.1\n }\n // 1440p (2560x1440)\n if (pixels >= 2560 * 1440) {\n return framerate > 30 ? 'avc1.640033' : 'avc1.640032'; // Level 5.1 or 5.0\n }\n // 1080p (1920x1080)\n if (pixels >= 1920 * 1080) {\n return framerate > 30 ? 'avc1.640032' : 'avc1.64002a'; // Level 5.0 or 4.2\n }\n // 720p (1280x720)\n if (pixels >= 1280 * 720) {\n return framerate > 30 ? 'avc1.64002a' : 'avc1.640028'; // Level 4.2 or 4.0\n }\n // Lower resolutions\n return 'avc1.64001f'; // Level 3.1 (High Profile)\n}\n\n/**\n * Create default encoder config for a quality profile.\n * Optionally merge with encoder overrides from UI.\n * Automatically selects an appropriate H.264 codec based on final resolution/framerate.\n */\nexport function createEncoderConfig(\n profile: 'professional' | 'broadcast' | 'conference' | 'low' = 'broadcast',\n overrides?: EncoderOverrides\n): EncoderConfig {\n const baseVideo = DEFAULT_VIDEO_SETTINGS[profile];\n const baseAudio = DEFAULT_AUDIO_SETTINGS;\n\n // Calculate final video settings\n const finalWidth = overrides?.video?.width ?? baseVideo.width;\n const finalHeight = overrides?.video?.height ?? baseVideo.height;\n const finalFramerate = overrides?.video?.framerate ?? baseVideo.framerate;\n\n // Select appropriate codec for final resolution/framerate\n const codec = selectH264Codec(finalWidth, finalHeight, finalFramerate);\n\n return {\n video: {\n ...baseVideo,\n codec, // Use dynamically selected codec\n width: finalWidth,\n height: finalHeight,\n framerate: finalFramerate,\n ...(overrides?.video?.bitrate !== undefined && { bitrate: overrides.video.bitrate }),\n },\n audio: {\n ...baseAudio,\n ...(overrides?.audio?.bitrate !== undefined && { bitrate: overrides.audio.bitrate }),\n ...(overrides?.audio?.sampleRate !== undefined && { sampleRate: overrides.audio.sampleRate }),\n ...(overrides?.audio?.numberOfChannels !== undefined && { numberOfChannels: overrides.audio.numberOfChannels }),\n },\n };\n}\n","/**\n * Browser Feature Detection\n * Detects WebCodecs, WebRTC, and MediaDevices capabilities\n */\n\nimport type { BrowserCapabilities } from '../types';\n\n/**\n * Detect all browser capabilities for streaming\n */\nexport function detectCapabilities(): BrowserCapabilities {\n const webcodecs = {\n videoEncoder: typeof VideoEncoder !== 'undefined',\n audioEncoder: typeof AudioEncoder !== 'undefined',\n mediaStreamTrackProcessor: typeof MediaStreamTrackProcessor !== 'undefined',\n mediaStreamTrackGenerator: typeof MediaStreamTrackGenerator !== 'undefined',\n };\n\n const webrtc = {\n peerConnection: typeof RTCPeerConnection !== 'undefined',\n replaceTrack: typeof RTCRtpSender !== 'undefined' && 'replaceTrack' in RTCRtpSender.prototype,\n insertableStreams:\n typeof RTCRtpSender !== 'undefined' &&\n 'createEncodedStreams' in RTCRtpSender.prototype,\n scriptTransform: typeof RTCRtpScriptTransform !== 'undefined',\n };\n\n const mediaDevices = {\n getUserMedia:\n typeof navigator !== 'undefined' &&\n typeof navigator.mediaDevices !== 'undefined' &&\n typeof navigator.mediaDevices.getUserMedia === 'function',\n getDisplayMedia:\n typeof navigator !== 'undefined' &&\n typeof navigator.mediaDevices !== 'undefined' &&\n typeof navigator.mediaDevices.getDisplayMedia === 'function',\n enumerateDevices:\n typeof navigator !== 'undefined' &&\n typeof navigator.mediaDevices !== 'undefined' &&\n typeof navigator.mediaDevices.enumerateDevices === 'function',\n };\n\n // Determine recommended path\n const webCodecsFullSupport =\n webcodecs.videoEncoder &&\n webcodecs.audioEncoder &&\n webcodecs.mediaStreamTrackProcessor &&\n webcodecs.mediaStreamTrackGenerator;\n\n const recommended: 'webcodecs' | 'mediastream' = webCodecsFullSupport\n ? 'webcodecs'\n : 'mediastream';\n\n return {\n webcodecs,\n webrtc,\n mediaDevices,\n recommended,\n };\n}\n\n/**\n * Check if WebCodecs is fully supported\n */\nexport function isWebCodecsSupported(): boolean {\n return (\n typeof VideoEncoder !== 'undefined' &&\n typeof AudioEncoder !== 'undefined' &&\n typeof MediaStreamTrackProcessor !== 'undefined' &&\n typeof MediaStreamTrackGenerator !== 'undefined'\n );\n}\n\n/**\n * Check if basic WebRTC is supported\n */\nexport function isWebRTCSupported(): boolean {\n return typeof RTCPeerConnection !== 'undefined';\n}\n\n/**\n * Check if media devices API is available\n */\nexport function isMediaDevicesSupported(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n typeof navigator.mediaDevices !== 'undefined' &&\n typeof navigator.mediaDevices.getUserMedia === 'function'\n );\n}\n\n/**\n * Check if screen capture is supported\n */\nexport function isScreenCaptureSupported(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n typeof navigator.mediaDevices !== 'undefined' &&\n typeof navigator.mediaDevices.getDisplayMedia === 'function'\n );\n}\n\n/**\n * Check if RTCRtpScriptTransform is supported\n * This is required for Path C WebCodecs integration (replacing browser-encoded frames)\n */\nexport function isRTCRtpScriptTransformSupported(): boolean {\n return typeof RTCRtpScriptTransform !== 'undefined';\n}\n\n/**\n * Check if full WebCodecs encoding path is available\n * Requires both WebCodecs support AND RTCRtpScriptTransform for Path C\n */\nexport function isWebCodecsEncodingPathSupported(): boolean {\n return isWebCodecsSupported() && isRTCRtpScriptTransformSupported();\n}\n\n/**\n * Get the recommended streaming path based on browser capabilities\n */\nexport function getRecommendedPath(): 'webcodecs' | 'mediastream' {\n return isWebCodecsSupported() ? 'webcodecs' : 'mediastream';\n}\n\n/**\n * Check if a specific video codec is supported for encoding\n */\nexport async function isVideoCodecSupported(codec: string): Promise<boolean> {\n if (!isWebCodecsSupported()) {\n return false;\n }\n\n try {\n const support = await VideoEncoder.isConfigSupported({\n codec,\n width: 1920,\n height: 1080,\n bitrate: 2_000_000,\n framerate: 30,\n });\n return support.supported === true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a specific audio codec is supported for encoding\n */\nexport async function isAudioCodecSupported(codec: string): Promise<boolean> {\n if (!isWebCodecsSupported()) {\n return false;\n }\n\n try {\n const support = await AudioEncoder.isConfigSupported({\n codec,\n sampleRate: 48000,\n numberOfChannels: 2,\n bitrate: 128_000,\n });\n return support.supported === true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get list of likely supported video codecs\n */\nexport async function getSupportedVideoCodecs(): Promise<string[]> {\n const codecs = [\n 'avc1.42E01E', // H.264 Baseline\n 'avc1.4D401E', // H.264 Main\n 'avc1.64001E', // H.264 High\n 'vp8',\n 'vp09.00.10.08', // VP9 Profile 0\n ];\n\n const supported: string[] = [];\n for (const codec of codecs) {\n if (await isVideoCodecSupported(codec)) {\n supported.push(codec);\n }\n }\n\n return supported;\n}\n\n/**\n * Get list of likely supported audio codecs\n */\nexport async function getSupportedAudioCodecs(): Promise<string[]> {\n const codecs = ['opus', 'mp4a.40.2']; // Opus, AAC-LC\n\n const supported: string[] = [];\n for (const codec of codecs) {\n if (await isAudioCodecSupported(codec)) {\n supported.push(codec);\n }\n }\n\n return supported;\n}\n","/**\n * Ingest Controller V2\n * Enhanced orchestrator with Phase 2 features:\n * - Multi-source support (camera + screen simultaneously)\n * - Audio mixing\n * - Quality profile switching\n * - Automatic reconnection with exponential backoff\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport { DeviceManager } from './DeviceManager';\nimport { ScreenCapture } from './ScreenCapture';\nimport { WhipClient } from './WhipClient';\nimport { AudioMixer } from './AudioMixer';\nimport { ReconnectionManager, DEFAULT_RECONNECTION_CONFIG } from './ReconnectionManager';\nimport { SceneManager } from './SceneManager';\nimport { EncoderManager, createEncoderConfig } from './EncoderManager';\nimport { detectCapabilities, isWebCodecsSupported, isRTCRtpScriptTransformSupported } from './FeatureDetection';\nimport { getEncoderSettings, getVideoConstraints, getAudioConstraints } from './MediaConstraints';\nimport type {\n IngestControllerConfigV2,\n IngestControllerEventsV2,\n IngestState,\n IngestStateContextV2,\n IngestStats,\n CaptureOptions,\n ScreenCaptureOptions,\n QualityProfile,\n DeviceInfo,\n MediaSource,\n SourceType,\n ReconnectionConfig,\n CompositorConfig,\n EncoderOverrides,\n} from '../types';\nimport { DEFAULT_COMPOSITOR_CONFIG } from '../types';\n\nlet sourceIdCounter = 0;\nfunction generateSourceId(type: SourceType): string {\n return `${type}-${++sourceIdCounter}-${Date.now()}`;\n}\n\nexport class IngestControllerV2 extends TypedEventEmitter<IngestControllerEventsV2> {\n private config: IngestControllerConfigV2;\n private deviceManager: DeviceManager;\n private screenCapture: ScreenCapture;\n private audioMixer: AudioMixer;\n private reconnectionManager: ReconnectionManager;\n private whipClient: WhipClient | null = null;\n\n private state: IngestState = 'idle';\n private stateContext: IngestStateContextV2 = {};\n private sources: Map<string, MediaSource> = new Map();\n private outputStream: MediaStream | null = null;\n private currentProfile: QualityProfile;\n private useWebCodecs: boolean;\n private statsInterval: ReturnType<typeof setInterval> | null = null;\n private lastStats: IngestStats | null = null;\n\n // Phase 3: Compositor\n private sceneManager: SceneManager | null = null;\n private compositorBaseConfig: CompositorConfig | null = null;\n\n // Phase 2.5: WebCodecs Encoder (Path C)\n private encoderManager: EncoderManager | null = null;\n private encoderOverrides: EncoderOverrides = {};\n\n constructor(config: IngestControllerConfigV2) {\n super();\n this.config = config;\n this.currentProfile = config.profile || 'broadcast';\n this.deviceManager = new DeviceManager();\n this.screenCapture = new ScreenCapture();\n this.audioMixer = new AudioMixer();\n this.reconnectionManager = new ReconnectionManager(config.reconnection);\n\n // Determine if we should use WebCodecs\n const capabilities = detectCapabilities();\n this.useWebCodecs = config.useWebCodecs ?? capabilities.recommended === 'webcodecs';\n\n // Set up event forwarding\n this.setupEventForwarding();\n\n this.log('IngestControllerV2 initialized', {\n useWebCodecs: this.useWebCodecs,\n profile: this.currentProfile,\n audioMixing: config.audioMixing ?? false,\n });\n }\n\n /**\n * Debug logging\n */\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.log(`[IngestControllerV2] ${message}`, data ?? '');\n }\n }\n\n /**\n * Set up event forwarding from child components\n */\n private setupEventForwarding(): void {\n this.deviceManager.on('devicesChanged', (event) => {\n this.emit('deviceChange', event);\n });\n\n this.deviceManager.on('error', (event) => {\n this.emit('error', { error: event.message, recoverable: true });\n });\n\n this.screenCapture.on('ended', (event) => {\n this.log('Screen capture ended', event);\n // Find and remove the specific screen source by matching the stream\n if (event.stream) {\n for (const [id, source] of this.sources) {\n if (source.type === 'screen' && source.stream === event.stream) {\n this.removeSource(id);\n break;\n }\n }\n }\n });\n\n this.screenCapture.on('error', (event) => {\n this.emit('error', { error: event.message, recoverable: true });\n });\n\n // Reconnection events\n this.reconnectionManager.on('attemptStart', (event) => {\n this.emit('reconnectionAttempt', {\n attempt: event.attempt,\n maxAttempts: this.reconnectionManager.getMaxAttempts(),\n });\n });\n\n this.reconnectionManager.on('attemptSuccess', () => {\n this.emit('reconnectionSuccess', undefined);\n this.setState('streaming');\n });\n\n this.reconnectionManager.on('attemptFailed', (event) => {\n this.log('Reconnection attempt failed', event);\n });\n\n this.reconnectionManager.on('exhausted', () => {\n this.emit('reconnectionFailed', { error: 'All reconnection attempts exhausted' });\n this.setState('error', { error: 'Connection lost - reconnection failed' });\n });\n }\n\n /**\n * Update state\n */\n private setState(newState: IngestState, context?: Partial<IngestStateContextV2>): void {\n this.state = newState;\n if (context) {\n this.stateContext = { ...this.stateContext, ...context };\n }\n this.stateContext.sources = Array.from(this.sources.values());\n this.stateContext.activeProfile = this.currentProfile;\n this.stateContext.reconnection = this.reconnectionManager.getState();\n this.emit('stateChange', { state: this.state, context: this.stateContext });\n }\n\n /**\n * Initialize audio mixer if needed\n */\n private async ensureAudioMixer(): Promise<void> {\n if (this.config.audioMixing && this.audioMixer.getState() === null) {\n await this.audioMixer.initialize();\n }\n }\n\n /**\n * Add a media source\n */\n private addMediaSource(\n type: SourceType,\n stream: MediaStream,\n label: string\n ): MediaSource {\n const id = generateSourceId(type);\n\n // Check if this is the first video source (will be primary by default)\n const hasVideoTrack = stream.getVideoTracks().length > 0;\n const existingVideoSources = Array.from(this.sources.values()).filter(\n (s) => s.stream.getVideoTracks().length > 0\n );\n const isPrimaryVideo = hasVideoTrack && existingVideoSources.length === 0;\n\n const source: MediaSource = {\n id,\n type,\n stream,\n label,\n active: true,\n muted: false,\n volume: 1.0,\n primaryVideo: isPrimaryVideo,\n };\n\n this.sources.set(id, source);\n this.log(`Added source: ${id} (${type})`, { label, tracks: stream.getTracks().length, primaryVideo: isPrimaryVideo });\n\n // Add audio track to mixer if enabled\n if (this.config.audioMixing) {\n const audioTrack = stream.getAudioTracks()[0];\n if (audioTrack) {\n this.audioMixer.addSource(id, audioTrack, { volume: 1.0 });\n }\n }\n\n // Bind to compositor if enabled\n if (this.sceneManager && this.sceneManager.isInitialized()) {\n this.log('Binding source to compositor', { sourceId: id });\n this.sceneManager.bindSource(id, stream);\n // Add layer to active scene\n const activeScene = this.sceneManager.getActiveScene();\n this.log('Adding layer to scene', { sourceId: id, activeSceneId: activeScene?.id, sceneLayers: activeScene?.layers.length });\n if (activeScene) {\n this.sceneManager.addLayer(activeScene.id, id);\n this.log('Layer added', { sourceId: id, layerCount: activeScene.layers.length });\n }\n } else {\n this.log('Compositor not ready when adding source', {\n sourceId: id,\n hasSceneManager: !!this.sceneManager,\n isInitialized: this.sceneManager?.isInitialized() ?? false,\n });\n }\n\n this.emit('sourceAdded', { source });\n this.updateOutputStreamFromSources();\n\n return source;\n }\n\n /**\n * Remove a source by ID\n */\n removeSource(id: string): void {\n const source = this.sources.get(id);\n if (!source) return;\n\n const wasPrimaryVideo = source.primaryVideo;\n\n // Stop all tracks\n source.stream.getTracks().forEach((track) => track.stop());\n\n // Remove from audio mixer\n if (this.config.audioMixing) {\n this.audioMixer.removeSource(id);\n }\n\n // Unbind from compositor\n if (this.sceneManager) {\n this.sceneManager.unbindSource(id);\n // Remove layer from active scene\n const activeScene = this.sceneManager.getActiveScene();\n if (activeScene) {\n const layer = activeScene.layers.find(l => l.sourceId === id);\n if (layer) {\n this.sceneManager.removeLayer(activeScene.id, layer.id);\n }\n }\n }\n\n this.sources.delete(id);\n this.log(`Removed source: ${id}`);\n\n // If this was the primary video, reassign to first available video source\n if (wasPrimaryVideo) {\n const videoSources = Array.from(this.sources.values()).filter(\n (s) => s.stream.getVideoTracks().length > 0\n );\n if (videoSources.length > 0) {\n videoSources[0].primaryVideo = true;\n this.sources.set(videoSources[0].id, videoSources[0]);\n this.log(`Reassigned primary video to: ${videoSources[0].id}`);\n }\n }\n\n this.emit('sourceRemoved', { sourceId: id });\n this.updateOutputStreamFromSources();\n }\n\n /**\n * Set a source as the primary video source\n */\n setPrimaryVideoSource(sourceId: string): void {\n const source = this.sources.get(sourceId);\n if (!source) return;\n\n // Check if this source has video\n if (source.stream.getVideoTracks().length === 0) {\n this.log(`Cannot set source ${sourceId} as primary - no video track`);\n return;\n }\n\n // Clear primary from all sources\n for (const [id, s] of this.sources) {\n if (s.primaryVideo) {\n s.primaryVideo = false;\n this.sources.set(id, s);\n }\n }\n\n // Set new primary\n source.primaryVideo = true;\n this.sources.set(sourceId, source);\n\n this.log(`Set primary video source: ${sourceId}`);\n this.emit('sourceUpdated', { source, changes: { primaryVideo: true } });\n this.updateOutputStreamFromSources();\n }\n\n /**\n * Get the current primary video source\n */\n getPrimaryVideoSource(): MediaSource | null {\n for (const source of this.sources.values()) {\n if (source.primaryVideo) return source;\n }\n return null;\n }\n\n /**\n * Update output stream from all sources\n * Phase 2: Primary video + mixed audio\n * Phase 3: Compositor for multi-source composition\n */\n private updateOutputStreamFromSources(): void {\n const sourcesArray = Array.from(this.sources.values()).filter((s) => s.active);\n\n if (sourcesArray.length === 0) {\n this.outputStream = null;\n return;\n }\n\n // Create new output stream\n const tracks: MediaStreamTrack[] = [];\n\n // Phase 3: Use compositor when enabled\n if (this.sceneManager && this.sceneManager.isInitialized()) {\n const compositedTrack = this.sceneManager.getOutputTrack();\n if (compositedTrack) {\n tracks.push(compositedTrack);\n }\n } else {\n // Legacy path: Get video track from primary video source\n const videoSourcesWithVideo = sourcesArray.filter(\n (s) => s.stream.getVideoTracks().length > 0\n );\n const primaryVideoSource = videoSourcesWithVideo.find((s) => s.primaryVideo) ||\n videoSourcesWithVideo[0];\n\n if (primaryVideoSource) {\n const videoTrack = primaryVideoSource.stream.getVideoTracks()[0];\n if (videoTrack) {\n tracks.push(videoTrack);\n }\n }\n }\n\n // Get audio (mixed or primary)\n if (this.config.audioMixing && this.audioMixer.getState() === 'running') {\n const mixedAudioTrack = this.audioMixer.getOutputTrack();\n if (mixedAudioTrack) {\n tracks.push(mixedAudioTrack);\n }\n } else {\n // Use first available audio track\n for (const source of sourcesArray) {\n const audioTrack = source.stream.getAudioTracks()[0];\n if (audioTrack && !source.muted) {\n tracks.push(audioTrack);\n break;\n }\n }\n }\n\n this.outputStream = tracks.length > 0 ? new MediaStream(tracks) : null;\n\n // Update WHIP client if streaming\n if (this.whipClient && this.state === 'streaming') {\n this.updateWhipTracks();\n }\n\n this.log('Output stream updated', {\n videoTracks: this.outputStream?.getVideoTracks().length ?? 0,\n audioTracks: this.outputStream?.getAudioTracks().length ?? 0,\n usingCompositor: !!this.sceneManager,\n });\n }\n\n /**\n * Update WHIP client tracks when sources change\n */\n private async updateWhipTracks(): Promise<void> {\n if (!this.whipClient || !this.outputStream) return;\n\n try {\n const pc = this.whipClient.getPeerConnection();\n if (!pc) return;\n\n const senders = pc.getSenders();\n\n // Update video track\n const newVideoTrack = this.outputStream.getVideoTracks()[0];\n const videoSender = senders.find((s) => s.track?.kind === 'video');\n if (videoSender && newVideoTrack) {\n await videoSender.replaceTrack(newVideoTrack);\n }\n\n // Update audio track\n const newAudioTrack = this.outputStream.getAudioTracks()[0];\n const audioSender = senders.find((s) => s.track?.kind === 'audio');\n if (audioSender && newAudioTrack) {\n await audioSender.replaceTrack(newAudioTrack);\n }\n } catch (error) {\n this.log('Error updating WHIP tracks', error);\n }\n }\n\n /**\n * Start camera capture\n */\n async startCamera(options: CaptureOptions = {}): Promise<MediaSource> {\n this.log('Starting camera capture', options);\n this.setState('requesting_permissions');\n\n try {\n await this.ensureAudioMixer();\n\n const profile = options.profile || this.currentProfile;\n\n // If encoder overrides are set, use them for capture constraints\n let captureOptions: CaptureOptions = { ...options, profile };\n\n if (this.encoderOverrides?.video) {\n const videoOverrides = this.encoderOverrides.video;\n const baseConstraints = getVideoConstraints(profile);\n\n // Merge encoder overrides into custom video constraints\n captureOptions.customConstraints = {\n video: {\n ...baseConstraints,\n ...(videoOverrides.width && { width: { ideal: videoOverrides.width } }),\n ...(videoOverrides.height && { height: { ideal: videoOverrides.height } }),\n ...(videoOverrides.framerate && { frameRate: { ideal: videoOverrides.framerate } }),\n },\n audio: true,\n };\n this.log('Using encoder overrides for capture constraints:', captureOptions.customConstraints);\n }\n\n const stream = await this.deviceManager.getUserMedia(captureOptions);\n\n const label = await this.getCameraLabel(stream);\n const source = this.addMediaSource('camera', stream, label);\n\n this.setState('capturing', {\n hasVideo: stream.getVideoTracks().length > 0,\n hasAudio: stream.getAudioTracks().length > 0,\n });\n\n return source;\n } catch (error) {\n this.setState('error', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Get camera label from stream\n */\n private async getCameraLabel(stream: MediaStream): Promise<string> {\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n return videoTrack.label || 'Camera';\n }\n return 'Camera';\n }\n\n /**\n * Start screen share capture\n */\n async startScreenShare(options: ScreenCaptureOptions = {}): Promise<MediaSource | null> {\n this.log('Starting screen share', options);\n this.setState('requesting_permissions');\n\n try {\n await this.ensureAudioMixer();\n\n // If encoder overrides are set, use them for capture constraints\n let captureOptions: ScreenCaptureOptions = { ...options };\n\n if (this.encoderOverrides?.video) {\n const videoOverrides = this.encoderOverrides.video;\n\n // Build custom video constraints from encoder overrides\n captureOptions.video = {\n ...(videoOverrides.width && { width: { ideal: videoOverrides.width } }),\n ...(videoOverrides.height && { height: { ideal: videoOverrides.height } }),\n ...(videoOverrides.framerate && { frameRate: { ideal: videoOverrides.framerate } }),\n };\n this.log('Using encoder overrides for screen capture constraints:', captureOptions.video);\n }\n\n const stream = await this.screenCapture.start(captureOptions);\n\n if (stream) {\n // Get actual label from video track (e.g., \"Screen 1\", \"window:App Name\")\n const videoTrack = stream.getVideoTracks()[0];\n const label = videoTrack?.label || `Screen ${this.screenCapture.getCaptureCount()}`;\n\n const source = this.addMediaSource('screen', stream, label);\n\n this.setState('capturing', {\n hasVideo: true,\n isScreenShare: true,\n });\n\n return source;\n } else {\n // User cancelled\n if (this.sources.size > 0) {\n this.setState('capturing');\n } else {\n this.setState('idle');\n }\n return null;\n }\n } catch (error) {\n this.setState('error', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Add a custom media source\n */\n addCustomSource(stream: MediaStream, label: string): MediaSource {\n return this.addMediaSource('custom', stream, label);\n }\n\n /**\n * Set source volume (for audio mixing)\n */\n setSourceVolume(sourceId: string, volume: number): void {\n const source = this.sources.get(sourceId);\n if (!source) return;\n\n // Allow boost up to 200% (+6dB)\n source.volume = Math.max(0, Math.min(2, volume));\n this.sources.set(sourceId, source);\n\n if (this.config.audioMixing) {\n this.audioMixer.setVolume(sourceId, source.volume);\n }\n\n this.emit('sourceUpdated', { source, changes: { volume: source.volume } });\n }\n\n /**\n * Mute/unmute a source\n */\n setSourceMuted(sourceId: string, muted: boolean): void {\n const source = this.sources.get(sourceId);\n if (!source) return;\n\n source.muted = muted;\n this.sources.set(sourceId, source);\n\n if (this.config.audioMixing) {\n if (muted) {\n this.audioMixer.mute(sourceId);\n } else {\n this.audioMixer.unmute(sourceId);\n }\n } else {\n // Mute the track directly\n source.stream.getAudioTracks().forEach((track) => {\n track.enabled = !muted;\n });\n }\n\n this.emit('sourceUpdated', { source, changes: { muted } });\n this.updateOutputStreamFromSources();\n }\n\n /**\n * Set source active state\n */\n setSourceActive(sourceId: string, active: boolean): void {\n const source = this.sources.get(sourceId);\n if (!source) return;\n\n source.active = active;\n this.sources.set(sourceId, source);\n\n this.emit('sourceUpdated', { source, changes: { active } });\n this.updateOutputStreamFromSources();\n }\n\n /**\n * Set master output volume (0-2 for up to +6dB boost)\n */\n setMasterVolume(volume: number): void {\n if (!this.config.audioMixing) return;\n this.audioMixer.setMasterVolume(volume);\n }\n\n /**\n * Get current master output volume\n */\n getMasterVolume(): number {\n if (!this.config.audioMixing) return 1;\n return this.audioMixer.getMasterVolume();\n }\n\n /**\n * Stop all capture\n */\n async stopCapture(): Promise<void> {\n this.log('Stopping all capture');\n\n // Remove all sources\n for (const id of Array.from(this.sources.keys())) {\n this.removeSource(id);\n }\n\n this.deviceManager.stopAllTracks();\n this.screenCapture.stop();\n this.outputStream = null;\n\n if (this.state !== 'streaming') {\n this.setState('idle', {\n hasVideo: false,\n hasAudio: false,\n isScreenShare: false,\n });\n }\n }\n\n /**\n * Change quality profile\n */\n async setQualityProfile(profile: QualityProfile): Promise<void> {\n if (profile === this.currentProfile) return;\n\n const previousProfile = this.currentProfile;\n this.currentProfile = profile;\n\n this.log(`Changing quality profile: ${previousProfile} -> ${profile}`);\n\n // Update existing camera sources with new constraints\n for (const [id, source] of this.sources) {\n if (source.type === 'camera') {\n const videoTrack = source.stream.getVideoTracks()[0];\n if (videoTrack) {\n try {\n const constraints = getVideoConstraints(profile);\n await videoTrack.applyConstraints(constraints);\n } catch (error) {\n this.log('Failed to apply new constraints', error);\n }\n }\n }\n }\n\n this.emit('qualityChanged', { profile, previousProfile });\n this.setState(this.state, { activeProfile: profile });\n }\n\n /**\n * Start streaming to WHIP endpoint\n */\n async startStreaming(): Promise<void> {\n if (!this.outputStream) {\n throw new Error('No media source available. Add a camera or screen share first.');\n }\n\n this.log('Starting streaming');\n this.setState('connecting');\n\n try {\n // Create WHIP client\n this.whipClient = new WhipClient({\n whipUrl: this.config.whipUrl,\n iceServers: this.config.iceServers,\n debug: this.config.debug,\n });\n\n // Set up WHIP event handlers\n this.whipClient.on('stateChange', (event) => {\n this.log('WHIP state changed', event);\n this.stateContext = {\n ...this.stateContext,\n connectionState: event.state,\n };\n\n if (event.state === 'connected') {\n this.setState('streaming');\n this.startStatsPolling();\n this.reconnectionManager.reset();\n\n // Attach WebCodecs encoder transform if supported and codecs are aligned\n // This must happen AFTER connection is established (senders exist)\n if (this.useWebCodecs && this.encoderManager && this.whipClient) {\n this.log('Attempting to attach WebCodecs encoder transform');\n // Check if codec alignment allows encoded frame insertion\n const canUseEncoded = this.whipClient.canUseEncodedInsertion();\n this.log('canUseEncodedInsertion result:', canUseEncoded);\n if (canUseEncoded) {\n try {\n this.whipClient.attachEncoderTransform(this.encoderManager);\n this.encoderManager.start();\n this.log('WebCodecs encoder transform attached', {\n videoCodec: this.whipClient.getNegotiatedVideoCodec(),\n audioCodec: this.whipClient.getNegotiatedAudioCodec(),\n });\n // Emit event so UI can update\n this.emit('webCodecsActive', { active: true });\n } catch (err) {\n this.log('Failed to attach encoder transform, continuing with browser encoding', err);\n // Clean up encoder on failure\n if (this.encoderManager) {\n this.encoderManager.destroy();\n this.encoderManager = null;\n }\n }\n } else {\n this.log('Codec alignment check failed, using browser encoding', {\n videoCodec: this.whipClient.getNegotiatedVideoCodec(),\n audioCodec: this.whipClient.getNegotiatedAudioCodec(),\n });\n // Clean up encoder since we won't use it\n if (this.encoderManager) {\n this.encoderManager.destroy();\n this.encoderManager = null;\n }\n }\n }\n } else if (event.state === 'failed' || event.state === 'disconnected') {\n if (this.state === 'streaming' && this.config.reconnection?.enabled !== false) {\n this.handleConnectionLost();\n } else if (event.state === 'failed') {\n this.setState('error', { error: 'Connection failed' });\n this.stopStatsPolling();\n }\n }\n });\n\n this.whipClient.on('error', (event) => {\n this.emit('error', { error: event.message, recoverable: false });\n });\n\n // Resume audio context if needed\n if (this.config.audioMixing) {\n await this.audioMixer.resume();\n }\n\n // Initialize WebCodecs encoder if enabled and RTCRtpScriptTransform is supported\n if (this.useWebCodecs && isRTCRtpScriptTransformSupported()) {\n this.log('Initializing WebCodecs encoder (Path C: RTCRtpScriptTransform)');\n try {\n this.encoderManager = new EncoderManager({ debug: this.config.debug });\n\n // Set up encoder event forwarding\n this.encoderManager.on('error', (event) => {\n this.emit('error', { error: event.message, recoverable: !event.fatal });\n\n // On fatal encoder error during streaming, reconnect without WebCodecs\n if (event.fatal && this.state === 'streaming') {\n this.log('Fatal encoder error, reconnecting without WebCodecs');\n this.handleEncoderFailure();\n }\n });\n\n this.encoderManager.on('stats', (stats) => {\n this.log('Encoder stats', stats);\n });\n\n // Initialize encoder with output stream\n // Map quality profile to encoder profile (handle 'auto' by defaulting to 'broadcast')\n const encoderProfile = this.currentProfile === 'auto' ? 'broadcast' : this.currentProfile;\n const encoderConfig = createEncoderConfig(encoderProfile, this.encoderOverrides);\n this.log('Encoder config with overrides:', encoderConfig);\n await this.encoderManager.initialize(this.outputStream, encoderConfig);\n this.log('WebCodecs encoder initialized');\n } catch (err) {\n // If encoder initialization fails, continue without it\n this.log('WebCodecs encoder initialization failed, falling back to browser encoding', err);\n if (this.encoderManager) {\n this.encoderManager.destroy();\n this.encoderManager = null;\n }\n }\n } else if (this.useWebCodecs) {\n this.log('WebCodecs requested but RTCRtpScriptTransform not supported, using browser encoding');\n }\n\n // Connect via standard MediaStream path\n // The encoder transform will be attached after connection is established\n await this.whipClient.connect(this.outputStream);\n } catch (error) {\n // Clean up encoder if connection fails\n if (this.encoderManager) {\n this.encoderManager.destroy();\n this.encoderManager = null;\n }\n this.setState('error', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Handle encoder failure - reconnect without WebCodecs\n */\n private async handleEncoderFailure(): Promise<void> {\n this.log('Handling encoder failure - reconnecting without WebCodecs');\n this.setState('reconnecting');\n this.stopStatsPolling();\n\n // Clean up encoder\n if (this.encoderManager) {\n this.encoderManager.destroy();\n this.encoderManager = null;\n }\n\n // Disable WebCodecs for this session\n this.useWebCodecs = false;\n\n // Clean up old WHIP client\n if (this.whipClient) {\n this.whipClient.destroy();\n this.whipClient = null;\n }\n\n // Reconnect without WebCodecs\n if (!this.outputStream) {\n this.setState('error', { error: 'No output stream available for reconnection' });\n return;\n }\n\n try {\n this.whipClient = new WhipClient({\n whipUrl: this.config.whipUrl,\n iceServers: this.config.iceServers,\n debug: this.config.debug,\n });\n\n // Set up simplified event handlers (no WebCodecs attachment)\n this.whipClient.on('stateChange', (event) => {\n if (event.state === 'connected') {\n this.setState('streaming');\n this.startStatsPolling();\n this.log('Reconnected without WebCodecs (browser encoding)');\n } else if (event.state === 'failed' || event.state === 'disconnected') {\n if (this.state === 'streaming' && this.config.reconnection?.enabled !== false) {\n this.handleConnectionLost();\n } else if (event.state === 'failed') {\n this.setState('error', { error: 'Reconnection failed' });\n }\n }\n });\n\n this.whipClient.on('error', (event) => {\n this.emit('error', { error: event.message, recoverable: false });\n });\n\n await this.whipClient.connect(this.outputStream);\n } catch (error) {\n this.setState('error', {\n error: `Reconnection failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n /**\n * Handle connection lost - trigger reconnection\n */\n private handleConnectionLost(): void {\n this.log('Connection lost, starting reconnection');\n this.setState('reconnecting');\n this.stopStatsPolling();\n\n this.reconnectionManager.start(async () => {\n // Clean up old client\n if (this.whipClient) {\n this.whipClient.destroy();\n this.whipClient = null;\n }\n\n // Create new client and reconnect\n if (!this.outputStream) {\n throw new Error('No output stream available');\n }\n\n this.whipClient = new WhipClient({\n whipUrl: this.config.whipUrl,\n iceServers: this.config.iceServers,\n debug: this.config.debug,\n });\n\n // Wait for connection\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('Connection timeout'));\n }, 30000);\n\n this.whipClient!.on('stateChange', (event) => {\n if (event.state === 'connected') {\n clearTimeout(timeout);\n resolve();\n } else if (event.state === 'failed') {\n clearTimeout(timeout);\n reject(new Error('Connection failed'));\n }\n });\n\n this.whipClient!.connect(this.outputStream!).catch(reject);\n });\n });\n }\n\n /**\n * Stop streaming\n */\n async stopStreaming(): Promise<void> {\n this.log('Stopping streaming');\n this.stopStatsPolling();\n this.reconnectionManager.stop();\n\n // Stop encoder\n if (this.encoderManager) {\n await this.encoderManager.stop();\n this.encoderManager.destroy();\n this.encoderManager = null;\n }\n\n if (this.whipClient) {\n await this.whipClient.disconnect();\n this.whipClient.destroy();\n this.whipClient = null;\n }\n\n if (this.sources.size > 0) {\n this.setState('capturing');\n } else {\n this.setState('idle');\n }\n\n this.stateContext = {\n ...this.stateContext,\n connectionState: 'disconnected',\n };\n }\n\n /**\n * Switch video device\n */\n async switchVideoDevice(deviceId: string): Promise<void> {\n const newTrack = await this.deviceManager.replaceVideoTrack(deviceId, this.currentProfile);\n\n if (newTrack && this.whipClient) {\n const pc = this.whipClient.getPeerConnection();\n if (pc) {\n const sender = pc.getSenders().find((s) => s.track?.kind === 'video');\n if (sender) {\n await sender.replaceTrack(newTrack);\n }\n }\n }\n }\n\n /**\n * Switch audio device\n */\n async switchAudioDevice(deviceId: string): Promise<void> {\n const newTrack = await this.deviceManager.replaceAudioTrack(deviceId, this.currentProfile);\n\n if (newTrack && this.whipClient) {\n const pc = this.whipClient.getPeerConnection();\n if (pc) {\n const sender = pc.getSenders().find((s) => s.track?.kind === 'audio');\n if (sender) {\n await sender.replaceTrack(newTrack);\n }\n }\n }\n }\n\n /**\n * Start stats polling\n */\n private startStatsPolling(): void {\n if (this.statsInterval) return;\n\n this.statsInterval = setInterval(async () => {\n const stats = await this.getStats();\n if (stats) {\n this.lastStats = stats;\n this.emit('statsUpdate', stats);\n }\n }, 1000);\n }\n\n /**\n * Stop stats polling\n */\n private stopStatsPolling(): void {\n if (this.statsInterval) {\n clearInterval(this.statsInterval);\n this.statsInterval = null;\n }\n }\n\n /**\n * Get current stats\n */\n async getStats(): Promise<IngestStats | null> {\n if (!this.whipClient) return null;\n\n const report = await this.whipClient.getStats();\n if (!report) return null;\n\n const stats: IngestStats = {\n video: {\n bytesSent: 0,\n packetsSent: 0,\n packetsLost: 0,\n framesEncoded: 0,\n framesPerSecond: 0,\n bitrate: 0,\n },\n audio: {\n bytesSent: 0,\n packetsSent: 0,\n packetsLost: 0,\n bitrate: 0,\n },\n connection: {\n rtt: 0,\n state: this.whipClient.getPeerConnection()?.connectionState ?? 'new',\n iceState: this.whipClient.getPeerConnection()?.iceConnectionState ?? 'new',\n },\n timestamp: Date.now(),\n };\n\n // Calculate bitrate from previous stats\n const prevStats = this.lastStats;\n\n report.forEach((stat) => {\n if (stat.type === 'outbound-rtp') {\n const rtpStat = stat as RTCOutboundRtpStreamStats;\n if (rtpStat.kind === 'video') {\n stats.video.bytesSent = rtpStat.bytesSent ?? 0;\n stats.video.packetsSent = rtpStat.packetsSent ?? 0;\n stats.video.framesEncoded = rtpStat.framesEncoded ?? 0;\n stats.video.framesPerSecond = rtpStat.framesPerSecond ?? 0;\n\n // Calculate bitrate\n if (prevStats) {\n const timeDiff = (stats.timestamp - prevStats.timestamp) / 1000;\n const bytesDiff = stats.video.bytesSent - prevStats.video.bytesSent;\n stats.video.bitrate = Math.round((bytesDiff * 8) / timeDiff);\n }\n } else if (rtpStat.kind === 'audio') {\n stats.audio.bytesSent = rtpStat.bytesSent ?? 0;\n stats.audio.packetsSent = rtpStat.packetsSent ?? 0;\n\n if (prevStats) {\n const timeDiff = (stats.timestamp - prevStats.timestamp) / 1000;\n const bytesDiff = stats.audio.bytesSent - prevStats.audio.bytesSent;\n stats.audio.bitrate = Math.round((bytesDiff * 8) / timeDiff);\n }\n }\n } else if (\n stat.type === 'candidate-pair' &&\n (stat as RTCIceCandidatePairStats).state === 'succeeded'\n ) {\n stats.connection.rtt = (stat as RTCIceCandidatePairStats).currentRoundTripTime ?? 0;\n }\n });\n\n return stats;\n }\n\n // ============================================================================\n // Phase 3: Compositor\n // ============================================================================\n\n /**\n * Enable the compositor for multi-source composition\n * Call this before adding sources if you want compositor-based output\n */\n async enableCompositor(config?: Partial<CompositorConfig>): Promise<void> {\n this.log('enableCompositor called', { alreadyEnabled: !!this.sceneManager });\n\n if (this.sceneManager) {\n this.log('Compositor already enabled');\n return;\n }\n\n const compositorConfig = { ...DEFAULT_COMPOSITOR_CONFIG, ...this.config.compositor, ...config };\n this.log('Creating SceneManager with config', compositorConfig);\n this.sceneManager = new SceneManager(compositorConfig);\n this.compositorBaseConfig = compositorConfig;\n\n // Initialize the compositor\n try {\n this.log('Initializing SceneManager...');\n await this.sceneManager.initialize();\n this.log('SceneManager initialized successfully');\n } catch (e) {\n // If initialization fails, clean up and re-throw\n this.sceneManager = null;\n const message = e instanceof Error ? e.message : String(e);\n this.log('Compositor initialization failed:', message);\n throw new Error(`Compositor initialization failed: ${message}`);\n }\n\n // Verify sceneManager is still set after async initialize\n if (!this.sceneManager) {\n this.log('ERROR: SceneManager was unexpectedly null after initialization');\n throw new Error('SceneManager was unexpectedly null after initialization');\n }\n\n this.log('SceneManager is valid, getting active scene...');\n\n // Bind existing sources to the compositor and add as layers\n const activeScene = this.sceneManager.getActiveScene();\n this.log('Compositor active scene:', activeScene?.id ?? 'none');\n\n for (const [id, source] of this.sources) {\n if (!this.sceneManager) break; // Guard against concurrent disable\n // Bind source for frame extraction\n this.sceneManager.bindSource(id, source.stream);\n // Add layer to active scene\n if (activeScene) {\n this.sceneManager.addLayer(activeScene.id, id);\n }\n }\n\n // Forward compositor events\n if (this.sceneManager) {\n this.sceneManager.on('error', (event) => {\n this.emit('error', { error: event.message, recoverable: true });\n });\n }\n\n this.log('Compositor enabled', compositorConfig);\n\n // Update output to use compositor\n this.updateOutputStreamFromSources();\n }\n\n /**\n * Disable the compositor\n */\n disableCompositor(): void {\n if (this.sceneManager) {\n this.sceneManager.destroy();\n this.sceneManager = null;\n this.log('Compositor disabled');\n this.updateOutputStreamFromSources();\n }\n }\n\n /**\n * Get the scene manager for compositor control\n */\n getSceneManager(): SceneManager | null {\n return this.sceneManager;\n }\n\n /**\n * Check if compositor is enabled\n */\n isCompositorEnabled(): boolean {\n return this.sceneManager !== null && this.sceneManager.isInitialized();\n }\n\n // ============================================================================\n // Getters\n // ============================================================================\n\n getState(): IngestState {\n return this.state;\n }\n\n getStateContext(): IngestStateContextV2 {\n return { ...this.stateContext };\n }\n\n getMediaStream(): MediaStream | null {\n return this.outputStream;\n }\n\n getSources(): MediaSource[] {\n return Array.from(this.sources.values());\n }\n\n getSource(id: string): MediaSource | undefined {\n return this.sources.get(id);\n }\n\n getQualityProfile(): QualityProfile {\n return this.currentProfile;\n }\n\n getDeviceManager(): DeviceManager {\n return this.deviceManager;\n }\n\n getScreenCapture(): ScreenCapture {\n return this.screenCapture;\n }\n\n getAudioMixer(): AudioMixer {\n return this.audioMixer;\n }\n\n getReconnectionManager(): ReconnectionManager {\n return this.reconnectionManager;\n }\n\n async getDevices(): Promise<DeviceInfo[]> {\n return this.deviceManager.enumerateDevices();\n }\n\n isStreaming(): boolean {\n return this.state === 'streaming';\n }\n\n isCapturing(): boolean {\n return this.state === 'capturing' || this.state === 'streaming';\n }\n\n isReconnecting(): boolean {\n return this.state === 'reconnecting';\n }\n\n /**\n * Set whether to use WebCodecs encoding\n * Only takes effect before streaming starts (cannot change mid-stream)\n */\n setUseWebCodecs(enabled: boolean): void {\n if (this.state === 'streaming') {\n this.log('Cannot change useWebCodecs while streaming');\n return;\n }\n this.useWebCodecs = enabled;\n this.log('useWebCodecs set to', enabled);\n }\n\n /**\n * Set encoder overrides (resolution, bitrate, framerate, etc.)\n * Only takes effect before streaming starts (cannot change mid-stream)\n */\n setEncoderOverrides(overrides: EncoderOverrides): void {\n if (this.state === 'streaming') {\n this.log('Cannot change encoder overrides while streaming');\n return;\n }\n this.encoderOverrides = overrides;\n this.log('Encoder overrides set:', overrides);\n\n if (this.sceneManager) {\n const baseConfig = this.compositorBaseConfig ?? this.sceneManager.getConfig();\n const targetWidth = overrides.video?.width ?? baseConfig.width;\n const targetHeight = overrides.video?.height ?? baseConfig.height;\n const targetFrameRate = overrides.video?.framerate ?? baseConfig.frameRate;\n const updated = this.sceneManager.updateOutputConfig({\n width: targetWidth,\n height: targetHeight,\n frameRate: targetFrameRate,\n });\n if (updated) {\n this.updateOutputStreamFromSources();\n }\n }\n }\n\n /**\n * Get current encoder overrides\n */\n getEncoderOverrides(): EncoderOverrides {\n return this.encoderOverrides;\n }\n\n /**\n * Get current useWebCodecs setting\n */\n getUseWebCodecs(): boolean {\n return this.useWebCodecs;\n }\n\n /**\n * Get the encoder manager (for advanced use cases)\n */\n getEncoderManager(): EncoderManager | null {\n return this.encoderManager;\n }\n\n /**\n * Check if WebCodecs encoding is active\n */\n isWebCodecsActive(): boolean {\n return this.encoderManager !== null && this.whipClient?.hasEncoderTransform() === true;\n }\n\n /**\n * Destroy the controller\n */\n destroy(): void {\n this.log('Destroying IngestControllerV2');\n this.stopStatsPolling();\n this.reconnectionManager.destroy();\n\n // Destroy encoder\n if (this.encoderManager) {\n this.encoderManager.destroy();\n this.encoderManager = null;\n }\n\n if (this.whipClient) {\n this.whipClient.destroy();\n this.whipClient = null;\n }\n\n // Destroy compositor\n if (this.sceneManager) {\n this.sceneManager.destroy();\n this.sceneManager = null;\n }\n\n // Remove all sources\n for (const id of Array.from(this.sources.keys())) {\n this.removeSource(id);\n }\n\n this.deviceManager.destroy();\n this.screenCapture.destroy();\n this.audioMixer.destroy();\n this.removeAllListeners();\n\n this.setState('destroyed');\n }\n}\n"],"names":[],"mappings":"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"}