@livepeer-frameworks/player-core 0.0.3

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 (120) hide show
  1. package/dist/cjs/index.js +19493 -0
  2. package/dist/cjs/index.js.map +1 -0
  3. package/dist/esm/index.js +19398 -0
  4. package/dist/esm/index.js.map +1 -0
  5. package/dist/player.css +2140 -0
  6. package/dist/types/core/ABRController.d.ts +164 -0
  7. package/dist/types/core/CodecUtils.d.ts +54 -0
  8. package/dist/types/core/Disposable.d.ts +61 -0
  9. package/dist/types/core/EventEmitter.d.ts +73 -0
  10. package/dist/types/core/GatewayClient.d.ts +144 -0
  11. package/dist/types/core/InteractionController.d.ts +121 -0
  12. package/dist/types/core/LiveDurationProxy.d.ts +102 -0
  13. package/dist/types/core/MetaTrackManager.d.ts +220 -0
  14. package/dist/types/core/MistReporter.d.ts +163 -0
  15. package/dist/types/core/MistSignaling.d.ts +148 -0
  16. package/dist/types/core/PlayerController.d.ts +665 -0
  17. package/dist/types/core/PlayerInterface.d.ts +230 -0
  18. package/dist/types/core/PlayerManager.d.ts +182 -0
  19. package/dist/types/core/PlayerRegistry.d.ts +27 -0
  20. package/dist/types/core/QualityMonitor.d.ts +184 -0
  21. package/dist/types/core/ScreenWakeLockManager.d.ts +70 -0
  22. package/dist/types/core/SeekingUtils.d.ts +142 -0
  23. package/dist/types/core/StreamStateClient.d.ts +108 -0
  24. package/dist/types/core/SubtitleManager.d.ts +111 -0
  25. package/dist/types/core/TelemetryReporter.d.ts +79 -0
  26. package/dist/types/core/TimeFormat.d.ts +97 -0
  27. package/dist/types/core/TimerManager.d.ts +83 -0
  28. package/dist/types/core/UrlUtils.d.ts +81 -0
  29. package/dist/types/core/detector.d.ts +149 -0
  30. package/dist/types/core/index.d.ts +49 -0
  31. package/dist/types/core/scorer.d.ts +167 -0
  32. package/dist/types/core/selector.d.ts +9 -0
  33. package/dist/types/index.d.ts +45 -0
  34. package/dist/types/lib/utils.d.ts +2 -0
  35. package/dist/types/players/DashJsPlayer.d.ts +102 -0
  36. package/dist/types/players/HlsJsPlayer.d.ts +70 -0
  37. package/dist/types/players/MewsWsPlayer/SourceBufferManager.d.ts +119 -0
  38. package/dist/types/players/MewsWsPlayer/WebSocketManager.d.ts +60 -0
  39. package/dist/types/players/MewsWsPlayer/index.d.ts +220 -0
  40. package/dist/types/players/MewsWsPlayer/types.d.ts +89 -0
  41. package/dist/types/players/MistPlayer.d.ts +25 -0
  42. package/dist/types/players/MistWebRTCPlayer/index.d.ts +133 -0
  43. package/dist/types/players/NativePlayer.d.ts +143 -0
  44. package/dist/types/players/VideoJsPlayer.d.ts +59 -0
  45. package/dist/types/players/WebCodecsPlayer/JitterBuffer.d.ts +118 -0
  46. package/dist/types/players/WebCodecsPlayer/LatencyProfiles.d.ts +64 -0
  47. package/dist/types/players/WebCodecsPlayer/RawChunkParser.d.ts +63 -0
  48. package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +174 -0
  49. package/dist/types/players/WebCodecsPlayer/WebSocketController.d.ts +164 -0
  50. package/dist/types/players/WebCodecsPlayer/index.d.ts +149 -0
  51. package/dist/types/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.d.ts +105 -0
  52. package/dist/types/players/WebCodecsPlayer/types.d.ts +395 -0
  53. package/dist/types/players/WebCodecsPlayer/worker/decoder.worker.d.ts +13 -0
  54. package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +197 -0
  55. package/dist/types/players/index.d.ts +14 -0
  56. package/dist/types/styles/index.d.ts +11 -0
  57. package/dist/types/types.d.ts +363 -0
  58. package/dist/types/vanilla/FrameWorksPlayer.d.ts +143 -0
  59. package/dist/types/vanilla/index.d.ts +19 -0
  60. package/dist/workers/decoder.worker.js +989 -0
  61. package/dist/workers/decoder.worker.js.map +1 -0
  62. package/package.json +80 -0
  63. package/src/core/ABRController.ts +550 -0
  64. package/src/core/CodecUtils.ts +257 -0
  65. package/src/core/Disposable.ts +120 -0
  66. package/src/core/EventEmitter.ts +113 -0
  67. package/src/core/GatewayClient.ts +439 -0
  68. package/src/core/InteractionController.ts +712 -0
  69. package/src/core/LiveDurationProxy.ts +270 -0
  70. package/src/core/MetaTrackManager.ts +753 -0
  71. package/src/core/MistReporter.ts +543 -0
  72. package/src/core/MistSignaling.ts +346 -0
  73. package/src/core/PlayerController.ts +2829 -0
  74. package/src/core/PlayerInterface.ts +432 -0
  75. package/src/core/PlayerManager.ts +900 -0
  76. package/src/core/PlayerRegistry.ts +149 -0
  77. package/src/core/QualityMonitor.ts +597 -0
  78. package/src/core/ScreenWakeLockManager.ts +163 -0
  79. package/src/core/SeekingUtils.ts +364 -0
  80. package/src/core/StreamStateClient.ts +457 -0
  81. package/src/core/SubtitleManager.ts +297 -0
  82. package/src/core/TelemetryReporter.ts +308 -0
  83. package/src/core/TimeFormat.ts +205 -0
  84. package/src/core/TimerManager.ts +209 -0
  85. package/src/core/UrlUtils.ts +179 -0
  86. package/src/core/detector.ts +382 -0
  87. package/src/core/index.ts +140 -0
  88. package/src/core/scorer.ts +553 -0
  89. package/src/core/selector.ts +16 -0
  90. package/src/global.d.ts +11 -0
  91. package/src/index.ts +75 -0
  92. package/src/lib/utils.ts +6 -0
  93. package/src/players/DashJsPlayer.ts +642 -0
  94. package/src/players/HlsJsPlayer.ts +483 -0
  95. package/src/players/MewsWsPlayer/SourceBufferManager.ts +572 -0
  96. package/src/players/MewsWsPlayer/WebSocketManager.ts +241 -0
  97. package/src/players/MewsWsPlayer/index.ts +1065 -0
  98. package/src/players/MewsWsPlayer/types.ts +106 -0
  99. package/src/players/MistPlayer.ts +188 -0
  100. package/src/players/MistWebRTCPlayer/index.ts +703 -0
  101. package/src/players/NativePlayer.ts +820 -0
  102. package/src/players/VideoJsPlayer.ts +643 -0
  103. package/src/players/WebCodecsPlayer/JitterBuffer.ts +299 -0
  104. package/src/players/WebCodecsPlayer/LatencyProfiles.ts +151 -0
  105. package/src/players/WebCodecsPlayer/RawChunkParser.ts +151 -0
  106. package/src/players/WebCodecsPlayer/SyncController.ts +456 -0
  107. package/src/players/WebCodecsPlayer/WebSocketController.ts +564 -0
  108. package/src/players/WebCodecsPlayer/index.ts +1650 -0
  109. package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +379 -0
  110. package/src/players/WebCodecsPlayer/types.ts +542 -0
  111. package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +1360 -0
  112. package/src/players/WebCodecsPlayer/worker/types.ts +276 -0
  113. package/src/players/index.ts +22 -0
  114. package/src/styles/animations.css +21 -0
  115. package/src/styles/index.ts +52 -0
  116. package/src/styles/player.css +2126 -0
  117. package/src/styles/tailwind.css +1015 -0
  118. package/src/types.ts +421 -0
  119. package/src/vanilla/FrameWorksPlayer.ts +367 -0
  120. package/src/vanilla/index.ts +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/core/CodecUtils.ts","../../src/core/detector.ts","../../src/core/scorer.ts","../../src/core/PlayerManager.ts","../../src/core/EventEmitter.ts","../../src/core/GatewayClient.ts","../../src/core/TimerManager.ts","../../src/core/StreamStateClient.ts","../../src/core/PlayerInterface.ts","../../src/core/LiveDurationProxy.ts","../../src/core/UrlUtils.ts","../../src/players/NativePlayer.ts","../../src/players/HlsJsPlayer.ts","../../src/players/DashJsPlayer.ts","../../src/players/VideoJsPlayer.ts","../../src/players/MistPlayer.ts","../../src/players/MewsWsPlayer/WebSocketManager.ts","../../src/players/MewsWsPlayer/SourceBufferManager.ts","../../src/players/MewsWsPlayer/index.ts","../../src/core/MistSignaling.ts","../../src/players/MistWebRTCPlayer/index.ts","../../src/players/WebCodecsPlayer/RawChunkParser.ts","../../src/players/WebCodecsPlayer/WebSocketController.ts","../../src/players/WebCodecsPlayer/JitterBuffer.ts","../../src/players/WebCodecsPlayer/LatencyProfiles.ts","../../src/players/WebCodecsPlayer/SyncController.ts","../../src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts","../../src/players/WebCodecsPlayer/types.ts","../../src/players/WebCodecsPlayer/index.ts","../../src/core/PlayerRegistry.ts","../../src/core/ABRController.ts","../../src/core/InteractionController.ts","../../src/core/MistReporter.ts","../../src/core/QualityMonitor.ts","../../src/core/MetaTrackManager.ts","../../src/core/SeekingUtils.ts","../../src/core/PlayerController.ts","../../src/core/SubtitleManager.ts","../../src/core/TelemetryReporter.ts","../../src/core/TimeFormat.ts","../../src/styles/index.ts","../../../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../../../node_modules/.pnpm/tailwind-merge@2.6.0/node_modules/tailwind-merge/dist/bundle-mjs.mjs","../../src/lib/utils.ts"],"sourcesContent":["/**\n * CodecUtils - Codec string translation utilities\n *\n * Based on MistMetaPlayer's MistUtil.tracks.translateCodec functionality.\n * Translates MistServer codec names to browser-compatible codec strings.\n */\n\nexport interface TrackInfo {\n type: string; // 'video' | 'audio' | 'meta' - loosened for compatibility\n codec: string;\n init?: string;\n codecstring?: string;\n width?: number;\n height?: number;\n bps?: number;\n fpks?: number;\n}\n\n/**\n * Translate a MistServer codec name to a browser-compatible codec string\n *\n * @param track - Track info from MistServer\n * @returns Browser-compatible codec string (e.g., \"avc1.64001f\")\n *\n * @example\n * ```ts\n * translateCodec({ codec: 'H264', type: 'video' })\n * // => 'avc1.42E01E' (baseline profile, level 3.0 default)\n *\n * translateCodec({ codec: 'AAC', type: 'audio' })\n * // => 'mp4a.40.2'\n * ```\n */\nexport function translateCodec(track: TrackInfo): string {\n const codec = track.codec.toUpperCase();\n\n // Use codecstring if available (MistServer provides this for some tracks)\n if (track.codecstring) {\n return track.codecstring;\n }\n\n // Audio codecs\n if (track.type === 'audio') {\n switch (codec) {\n case 'AAC':\n case 'MP4A':\n return 'mp4a.40.2'; // AAC-LC\n case 'MP3':\n return 'mp4a.40.34'; // MP3 in MP4 container\n case 'AC3':\n case 'AC-3':\n return 'ac-3';\n case 'EAC3':\n case 'EC3':\n case 'E-AC3':\n case 'EC-3':\n return 'ec-3';\n case 'OPUS':\n return 'opus';\n case 'VORBIS':\n return 'vorbis';\n case 'FLAC':\n return 'flac';\n case 'PCM':\n case 'PCMS16LE':\n return 'pcm';\n default:\n return codec.toLowerCase();\n }\n }\n\n // Video codecs\n if (track.type === 'video') {\n switch (codec) {\n case 'H264':\n case 'AVC':\n case 'AVC1': {\n // Try to extract profile/level from init data\n const profileLevel = extractH264Profile(track.init);\n return profileLevel || 'avc1.42E01E'; // Default: Baseline Profile, Level 3.0\n }\n case 'H265':\n case 'HEVC':\n case 'HEV1':\n case 'HVC1': {\n // Try to extract profile/level from init data\n const profileLevel = extractHEVCProfile(track.init);\n return profileLevel || 'hev1.1.6.L93.B0'; // Default: Main Profile, Level 3.1\n }\n case 'VP8':\n return 'vp8';\n case 'VP9':\n return 'vp09.00.10.08'; // Profile 0, Level 1.0, 8-bit\n case 'AV1':\n return 'av01.0.01M.08'; // Main Profile, Level 2.1, 8-bit\n case 'THEORA':\n return 'theora';\n default:\n return codec.toLowerCase();\n }\n }\n\n return codec.toLowerCase();\n}\n\n/**\n * Extract H264 profile and level from init data (SPS)\n * The init data contains the SPS NAL unit which has profile/level info\n *\n * @param init - Base64 encoded init data from MistServer\n * @returns Codec string like \"avc1.64001f\" or null\n */\nfunction extractH264Profile(init?: string): string | null {\n if (!init) return null;\n\n try {\n // Decode base64 init data\n const bytes = base64ToBytes(init);\n\n // Look for SPS NAL unit (starts with 0x67 for H264)\n // Format: NAL type (1 byte) + profile_idc (1 byte) + constraint flags (1 byte) + level_idc (1 byte)\n for (let i = 0; i < bytes.length - 4; i++) {\n // Check for NAL start code (0x00 0x00 0x01 or 0x00 0x00 0x00 0x01)\n if (bytes[i] === 0x00 && bytes[i + 1] === 0x00) {\n let offset = i + 2;\n if (bytes[offset] === 0x00) offset++;\n if (bytes[offset] === 0x01) offset++;\n\n // Check if this is SPS (NAL type 7)\n const nalType = bytes[offset] & 0x1f;\n if (nalType === 7 && offset + 3 < bytes.length) {\n const profileIdc = bytes[offset + 1];\n const constraintFlags = bytes[offset + 2];\n const levelIdc = bytes[offset + 3];\n\n return `avc1.${toHex(profileIdc)}${toHex(constraintFlags)}${toHex(levelIdc)}`;\n }\n }\n }\n\n // If no NAL start code found, try raw format\n if (bytes.length >= 4) {\n // Assume first bytes are profile/constraint/level\n const profileIdc = bytes[0];\n const constraintFlags = bytes[1];\n const levelIdc = bytes[2];\n\n // Validate reasonable values\n if (profileIdc > 0 && profileIdc < 255 && levelIdc > 0 && levelIdc < 100) {\n return `avc1.${toHex(profileIdc)}${toHex(constraintFlags)}${toHex(levelIdc)}`;\n }\n }\n } catch {\n // Ignore parsing errors\n }\n\n return null;\n}\n\n/**\n * Extract HEVC profile and level from init data (VPS/SPS)\n *\n * @param init - Base64 encoded init data from MistServer\n * @returns Codec string like \"hev1.1.6.L93.B0\" or null\n */\nfunction extractHEVCProfile(init?: string): string | null {\n if (!init) return null;\n\n try {\n // Decode base64 init data\n const bytes = base64ToBytes(init);\n\n // HEVC profile/level extraction is more complex\n // For now, return a sensible default based on data presence\n if (bytes.length > 0) {\n // Look for profile_tier_level in VPS/SPS\n // This is a simplified extraction - full parsing would be more complex\n for (let i = 0; i < bytes.length - 3; i++) {\n // Look for general_profile_idc (usually in first few bytes after NAL header)\n const profileIdc = bytes[i];\n if (profileIdc >= 1 && profileIdc <= 5) {\n // Valid profile IDC (1=Main, 2=Main10, 3=MainStill, 4=Range Extensions, 5=High Throughput)\n const tierFlag = 0; // Assume main tier\n const levelIdc = bytes[i + 1] || 93; // Default to level 3.1\n\n // Format: hev1.{profile}.{tier_flag}{compatibility}.L{level}.{constraints}\n return `hev1.${profileIdc}.6.L${levelIdc}.B0`;\n }\n }\n }\n } catch {\n // Ignore parsing errors\n }\n\n return null;\n}\n\n/**\n * Convert byte to 2-digit hex string\n */\nfunction toHex(byte: number): string {\n return byte.toString(16).padStart(2, '0').toUpperCase();\n}\n\n/**\n * Decode base64 string to Uint8Array\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Check if a codec is supported by the browser via MediaSource\n *\n * @param codecString - Codec string to check\n * @param containerType - Container type (default: 'video/mp4')\n * @returns true if supported\n */\nexport function isCodecSupported(codecString: string, containerType = 'video/mp4'): boolean {\n if (typeof MediaSource === 'undefined' || !MediaSource.isTypeSupported) {\n return false;\n }\n\n const mimeType = `${containerType}; codecs=\"${codecString}\"`;\n return MediaSource.isTypeSupported(mimeType);\n}\n\n/**\n * Get the best supported codec from a list of tracks\n *\n * @param tracks - Array of track info\n * @param type - Track type to filter ('video' or 'audio')\n * @returns Best supported track or null\n */\nexport function getBestSupportedTrack(tracks: TrackInfo[], type: 'video' | 'audio'): TrackInfo | null {\n const filteredTracks = tracks.filter(t => t.type === type);\n\n for (const track of filteredTracks) {\n const codecString = translateCodec(track);\n if (isCodecSupported(codecString)) {\n return track;\n }\n }\n\n return null;\n}\n\nexport default {\n translateCodec,\n isCodecSupported,\n getBestSupportedTrack,\n};\n","/**\n * Browser and Codec Detection\n * Ported from MistMetaPlayer v3.1.0\n *\n * Detects browser capabilities and codec support\n * Removes legacy IE/Flash detection code\n */\n\nimport { translateCodec } from './CodecUtils';\n\nexport interface BrowserInfo {\n isChrome: boolean;\n isFirefox: boolean;\n isSafari: boolean;\n isEdge: boolean;\n isAndroid: boolean;\n isIOS: boolean;\n isMobile: boolean;\n supportsMediaSource: boolean;\n supportsWebRTC: boolean;\n supportsWebSocket: boolean;\n}\n\nexport interface CodecSupport {\n h264: boolean;\n h265: boolean;\n vp8: boolean;\n vp9: boolean;\n av1: boolean;\n aac: boolean;\n mp3: boolean;\n opus: boolean;\n}\n\n/**\n * Detect browser information\n */\nexport function getBrowserInfo(): BrowserInfo {\n const ua = navigator.userAgent.toLowerCase();\n \n return {\n isChrome: /chrome|crios/.test(ua) && !/edge|edg/.test(ua),\n isFirefox: /firefox/.test(ua),\n isSafari: /safari/.test(ua) && !/chrome|crios/.test(ua),\n isEdge: /edge|edg/.test(ua),\n isAndroid: /android/.test(ua),\n isIOS: /iphone|ipad|ipod/.test(ua),\n isMobile: /mobile|android|iphone|ipad|ipod/.test(ua),\n supportsMediaSource: 'MediaSource' in window,\n supportsWebRTC: 'RTCPeerConnection' in window,\n supportsWebSocket: 'WebSocket' in window\n };\n}\n\n// Re-export translateCodec from CodecUtils for backwards compatibility\nexport { translateCodec };\n\n/**\n * Test codec support using MediaSource API\n */\nexport function testCodecSupport(mimeType: string, codec: string): boolean {\n if (!('MediaSource' in window)) {\n return false;\n }\n\n if (!MediaSource.isTypeSupported) {\n return true; // Can't test, assume it works\n }\n\n const fullType = `${mimeType};codecs=\"${codec}\"`;\n return MediaSource.isTypeSupported(fullType);\n}\n\n/**\n * Get comprehensive codec support info\n */\nexport function getCodecSupport(): CodecSupport {\n return {\n h264: testCodecSupport('video/mp4', 'avc1.42E01E'),\n h265: testCodecSupport('video/mp4', 'hev1.1.6.L93.90'),\n vp8: testCodecSupport('video/webm', 'vp8'),\n vp9: testCodecSupport('video/webm', 'vp09.00.10.08'),\n av1: testCodecSupport('video/mp4', 'av01.0.04M.08'),\n aac: testCodecSupport('video/mp4', 'mp4a.40.2'),\n mp3: testCodecSupport('audio/mpeg', 'mp3'),\n opus: testCodecSupport('audio/webm', 'opus')\n };\n}\n\n/**\n * Check if tracks are playable by testing codecs\n */\nexport function checkTrackPlayability(\n tracks: Array<{ type: string; codec: string; codecstring?: string; init?: string }>,\n containerType: string\n): { playable: string[]; supported: string[] } {\n const playable: string[] = [];\n const supported: string[] = [];\n\n const tracksByType: Record<string, typeof tracks> = {};\n \n // Group tracks by type\n for (const track of tracks) {\n if (track.type === 'meta') continue;\n \n if (!tracksByType[track.type]) {\n tracksByType[track.type] = [];\n }\n tracksByType[track.type].push(track);\n }\n\n // Test each track type\n for (const [trackType, typeTracks] of Object.entries(tracksByType)) {\n let hasPlayableTrack = false;\n \n for (const track of typeTracks) {\n const codecString = translateCodec(track);\n if (testCodecSupport(containerType, codecString)) {\n supported.push(track.codec);\n hasPlayableTrack = true;\n }\n }\n \n if (hasPlayableTrack) {\n playable.push(trackType);\n }\n }\n\n return { playable, supported };\n}\n\n/**\n * Check protocol/scheme mismatch (http/https)\n */\nexport function checkProtocolMismatch(sourceUrl: string): boolean {\n const pageProtocol = window.location.protocol;\n const sourceProtocol = new URL(sourceUrl).protocol;\n \n // Allow file:// to access http://\n if (pageProtocol === 'file:' && sourceProtocol === 'http:') {\n return false; // No mismatch\n }\n \n return pageProtocol !== sourceProtocol;\n}\n\n/**\n * Check if current page is loaded over file://\n */\nexport function isFileProtocol(): boolean {\n return window.location.protocol === 'file:';\n}\n\n/**\n * Get Android version (returns null if not Android)\n */\nexport function getAndroidVersion(): number | null {\n const match = navigator.userAgent.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i);\n if (!match) return null;\n \n const major = parseInt(match[1], 10);\n const minor = match[2] ? parseInt(match[2], 10) : 0;\n \n return major + (minor / 10);\n}\n\n/**\n * Browser-specific compatibility checks\n */\nexport function getBrowserCompatibility() {\n const browser = getBrowserInfo();\n const android = getAndroidVersion();\n\n return {\n // Native HLS support\n supportsNativeHLS: browser.isSafari || browser.isIOS || (android && android >= 7),\n\n // MSE support\n supportsMSE: browser.supportsMediaSource,\n\n // WebSocket support\n supportsWebSocket: browser.supportsWebSocket,\n\n // WebRTC support\n supportsWebRTC: browser.supportsWebRTC && 'RTCRtpReceiver' in window,\n\n // Specific player recommendations\n preferVideoJs: android && android < 7, // VideoJS better for older Android\n avoidMEWSOnMac: browser.isSafari, // MEWS breaks often on Safari/macOS\n\n // File protocol limitations\n fileProtocolLimitations: isFileProtocol()\n };\n}\n\n// ============================================================================\n// WebRTC Codec Compatibility\n// ============================================================================\n\n/**\n * Codecs that are compatible with WebRTC (WHEP/MistServer native)\n * These are the only codecs that can be used in RTP streams\n */\nexport const WEBRTC_COMPATIBLE_CODECS = {\n video: ['H264', 'VP8', 'VP9', 'AV1'],\n // Note: AAC is NOT natively supported in browser WebRTC - OPUS is standard\n // MistServer may transcode to OPUS for WebRTC output\n audio: ['OPUS', 'PCMU', 'PCMA', 'G711', 'G722'],\n} as const;\n\n/**\n * Codecs that are explicitly incompatible with WebRTC\n */\nexport const WEBRTC_INCOMPATIBLE_CODECS = {\n video: ['HEVC', 'H265', 'THEORA', 'MPEG2'],\n audio: ['AC3', 'EAC3', 'EC3', 'MP3', 'FLAC', 'VORBIS', 'DTS'],\n} as const;\n\nexport interface WebRTCCodecCompatibility {\n /** Whether at least one video track is WebRTC-compatible */\n videoCompatible: boolean;\n /** Whether at least one audio track is WebRTC-compatible (or no audio tracks) */\n audioCompatible: boolean;\n /** Overall compatibility - both video and audio must be compatible */\n compatible: boolean;\n /** List of incompatible codecs found */\n incompatibleCodecs: string[];\n /** Detailed breakdown per track type */\n details: {\n videoTracks: number;\n audioTracks: number;\n compatibleVideoCodecs: string[];\n compatibleAudioCodecs: string[];\n };\n}\n\n/**\n * Check if browser supports a codec via WebRTC\n * Uses RTCRtpReceiver.getCapabilities() for dynamic browser detection (reference: webrtc.js:38-46)\n * Falls back to static list if API unavailable\n */\nfunction isBrowserWebRTCCodecSupported(type: 'video' | 'audio', codec: string): boolean {\n // Try dynamic browser API first (reference: webrtc.js:39)\n if (typeof RTCRtpReceiver !== 'undefined' && RTCRtpReceiver.getCapabilities) {\n try {\n const capabilities = RTCRtpReceiver.getCapabilities(type);\n if (capabilities?.codecs) {\n const targetMime = `${type}/${codec}`.toLowerCase();\n return capabilities.codecs.some(c => c.mimeType.toLowerCase() === targetMime);\n }\n } catch {\n // Fall through to static list\n }\n }\n\n // Fallback to static list for older browsers/SSR\n const compatibleCodecs = WEBRTC_COMPATIBLE_CODECS[type] as readonly string[];\n return compatibleCodecs.includes(codec.toUpperCase());\n}\n\n/**\n * Check if stream tracks are compatible with WebRTC playback\n *\n * Uses RTCRtpReceiver.getCapabilities() to dynamically query browser support,\n * matching the reference MistServer implementation (webrtc.js:38-46).\n *\n * @param tracks - Array of track metadata from MistServer\n * @returns Compatibility assessment\n */\nexport function checkWebRTCCodecCompatibility(\n tracks: Array<{ type: string; codec: string }>\n): WebRTCCodecCompatibility {\n const videoTracks = tracks.filter(t => t.type === 'video');\n const audioTracks = tracks.filter(t => t.type === 'audio');\n\n const compatibleVideoCodecs: string[] = [];\n const compatibleAudioCodecs: string[] = [];\n const incompatibleCodecs: string[] = [];\n\n // Check video tracks using dynamic browser detection\n for (const track of videoTracks) {\n if (isBrowserWebRTCCodecSupported('video', track.codec)) {\n compatibleVideoCodecs.push(track.codec);\n } else {\n incompatibleCodecs.push(`video:${track.codec}`);\n }\n }\n\n // Check audio tracks using dynamic browser detection\n for (const track of audioTracks) {\n if (isBrowserWebRTCCodecSupported('audio', track.codec)) {\n compatibleAudioCodecs.push(track.codec);\n } else {\n incompatibleCodecs.push(`audio:${track.codec}`);\n }\n }\n\n // Video is compatible if there's at least one compatible video codec\n // (or no video tracks at all - audio-only streams are fine)\n const videoCompatible = videoTracks.length === 0 || compatibleVideoCodecs.length > 0;\n\n // Audio is compatible if there's at least one compatible audio codec\n // (or no audio tracks at all - video-only streams are fine)\n const audioCompatible = audioTracks.length === 0 || compatibleAudioCodecs.length > 0;\n\n return {\n videoCompatible,\n audioCompatible,\n compatible: videoCompatible && audioCompatible,\n incompatibleCodecs,\n details: {\n videoTracks: videoTracks.length,\n audioTracks: audioTracks.length,\n compatibleVideoCodecs,\n compatibleAudioCodecs,\n },\n };\n}\n\n// ============================================================================\n// MSE Codec Compatibility (for HLS.js, DASH.js)\n// ============================================================================\n\nexport interface MSECodecCompatibility {\n /** Whether at least one video track is MSE-compatible in this browser */\n videoCompatible: boolean;\n /** Whether at least one audio track is MSE-compatible in this browser */\n audioCompatible: boolean;\n /** Overall compatibility */\n compatible: boolean;\n /** Codecs that failed browser support test */\n unsupportedCodecs: string[];\n}\n\n/**\n * Check if stream tracks are compatible with MSE playback in this browser\n *\n * Unlike WebRTC, MSE compatibility varies by browser. HEVC works in Safari\n * but not Firefox. This function actually tests MediaSource.isTypeSupported().\n *\n * @param tracks - Array of track metadata\n * @param containerType - MIME type (e.g., 'video/mp4')\n */\nexport function checkMSECodecCompatibility(\n tracks: Array<{ type: string; codec: string; codecstring?: string; init?: string }>,\n containerType = 'video/mp4'\n): MSECodecCompatibility {\n const videoTracks = tracks.filter(t => t.type === 'video');\n const audioTracks = tracks.filter(t => t.type === 'audio');\n const unsupportedCodecs: string[] = [];\n\n let hasCompatibleVideo = videoTracks.length === 0;\n let hasCompatibleAudio = audioTracks.length === 0;\n\n // Test each video track\n for (const track of videoTracks) {\n const codecString = translateCodec(track);\n if (testCodecSupport(containerType, codecString)) {\n hasCompatibleVideo = true;\n } else {\n unsupportedCodecs.push(`video:${track.codec}`);\n }\n }\n\n // Test each audio track\n for (const track of audioTracks) {\n const codecString = translateCodec(track);\n const audioContainer = track.codec === 'MP3' ? 'audio/mpeg' : containerType;\n if (testCodecSupport(audioContainer, codecString)) {\n hasCompatibleAudio = true;\n } else {\n unsupportedCodecs.push(`audio:${track.codec}`);\n }\n }\n\n return {\n videoCompatible: hasCompatibleVideo,\n audioCompatible: hasCompatibleAudio,\n compatible: hasCompatibleVideo && hasCompatibleAudio,\n unsupportedCodecs,\n };\n}","/**\n * Player Scoring System\n * Enhanced from MistMetaPlayer v3.1.0 with reliability and mode-aware scoring\n *\n * Implements the scoring algorithm for player selection with:\n * - Track type scoring\n * - Player priority scoring\n * - Source order scoring\n * - Player reliability scoring (new)\n * - Playback mode bonuses (new)\n * - Protocol-specific routing (new)\n */\n\nimport type { PlaybackMode } from '../types';\n\nexport interface TrackScore {\n video: number;\n audio: number;\n subtitle: number;\n}\n\nexport interface PlayerScore {\n base: number;\n trackTypes: string[];\n total: number;\n // Extended score breakdown for debugging\n breakdown?: {\n trackScore: number;\n priorityScore: number;\n sourceScore: number;\n reliabilityScore: number;\n modeBonus: number;\n routingBonus: number;\n protocolPenalty: number;\n };\n}\n\n/**\n * Default track type scores\n */\nexport const DEFAULT_TRACK_SCORES: TrackScore = {\n video: 2.0,\n audio: 1.0,\n subtitle: 0.5\n};\n\n/**\n * Calculate score for supported track types\n */\nexport function calculateTrackScore(\n supportedTracks: string[] | boolean,\n scores: TrackScore = DEFAULT_TRACK_SCORES\n): number {\n if (supportedTracks === true) {\n // Player supports something but doesn't specify what\n return 1.9; // Slightly less than perfect video score\n }\n\n if (supportedTracks === false || supportedTracks.length === 0) {\n return 0;\n }\n\n let totalScore = 0;\n for (const trackType of supportedTracks) {\n const score = scores[trackType as keyof TrackScore];\n if (score !== undefined) {\n totalScore += score;\n }\n }\n\n return totalScore;\n}\n\n/**\n * Calculate maximum possible score for a stream\n */\nexport function calculateMaxScore(\n availableTracks: string[],\n scores: TrackScore = DEFAULT_TRACK_SCORES\n): number {\n return calculateTrackScore(availableTracks, scores);\n}\n\n/**\n * Player priority scoring\n */\nexport function calculatePriorityScore(priority: number, maxPriority: number): number {\n // Lower priority number = higher score\n // Normalize to 0-1 range, then invert\n return 1 - (priority / Math.max(maxPriority, 1));\n}\n\n/**\n * Source preference scoring based on MistServer ordering\n */\nexport function calculateSourceScore(\n sourceIndex: number,\n totalSources: number\n): number {\n // Earlier sources (lower index) get higher scores\n return 1 - (sourceIndex / Math.max(totalSources - 1, 1));\n}\n\n/**\n * Bandwidth/quality scoring\n */\nexport function calculateQualityScore(\n bandwidth?: number,\n targetBandwidth?: number\n): number {\n if (!bandwidth || !targetBandwidth) {\n return 1.0; // Neutral score if no bandwidth info\n }\n\n // Score based on how close to target bandwidth\n const ratio = Math.min(bandwidth, targetBandwidth) / Math.max(bandwidth, targetBandwidth);\n return ratio;\n}\n\n/**\n * Protocol blacklist - completely excluded from selection\n * These protocols are truly broken and should never be considered.\n *\n * NOTE: Protocols that ARE supported by reference implementation but unreliable\n * should be in PROTOCOL_PENALTIES instead (heavily penalized but still selectable).\n */\nexport const PROTOCOL_BLACKLIST: Set<string> = new Set([\n // Flash - browsers removed support in 2020\n 'flash/7',\n 'flash/10',\n 'flash/11',\n // Silverlight - dead technology\n 'silverlight',\n // SDP is WebRTC signaling format, not a playback source type\n 'html5/application/sdp',\n 'sdp',\n // MPEG-TS - no browser support, no wrapper implementation in reference\n 'html5/video/mpeg',\n // Smooth Streaming - intentionally disabled in reference (commented out in dashjs.js!)\n 'html5/application/vnd.ms-sstr+xml',\n // Server-side only protocols - browsers can't connect to these directly\n 'srt',\n 'rtsp',\n 'rtmp',\n // MistServer internal protocols - not for browser playback\n 'dtsc',\n // NOTE: ws/video/raw is supported by WebCodecs player\n // Image formats - not video playback\n 'html5/image/jpeg',\n // Script/metadata formats - not playback sources\n 'html5/text/javascript',\n // Subtitle-only formats - not standalone playback sources (used as tracks)\n 'html5/text/vtt',\n 'html5/text/plain',\n]);\n\n/**\n * Check if a protocol is blacklisted\n */\nexport function isProtocolBlacklisted(mimeType: string): boolean {\n return PROTOCOL_BLACKLIST.has(mimeType);\n}\n\n/**\n * Protocol penalties for problematic protocols (not blacklisted, but deprioritized)\n * These get subtracted from the total score to deprioritize certain protocols.\n *\n * Heavy penalties (0.50+): Reference-supported but consistently unreliable\n * Medium penalties (0.20): Experimental or spotty support\n */\nexport const PROTOCOL_PENALTIES: Record<string, number> = {\n // WebCodecs raw - NOW PREFERRED for low-latency (no penalty)\n // 'ws/video/raw': 0,\n // 'wss/video/raw': 0,\n // 'ws/video/h264': 0,\n // 'wss/video/h264': 0,\n // WebM - reference supports but unreliable in practice\n 'html5/video/webm': 0.80, // Heavy penalty - very broken\n 'html5/audio/webm': 0.60,\n 'ws/video/webm': 0.80,\n 'wss/video/webm': 0.80,\n // MEWS - heavy penalty, prefer HLS/WebRTC (reference mews.js has issues)\n 'ws/video/mp4': 0.50,\n 'wss/video/mp4': 0.50,\n // DASH - heavy penalty, broken implementation\n 'dash/video/mp4': 0.90, // Below legacy\n 'dash/video/webm': 0.95,\n // CMAF-style protocols (fMP4 over HLS/DASH) - fragmentation issues\n 'html5/application/vnd.apple.mpegurl;version=7': 0.20, // HLSv7 is CMAF-based\n // LL-HLS specific - experimental, spotty support\n 'll-hls': 0.20,\n 'cmaf': 0.20,\n};\n\n/**\n * Calculate protocol penalty based on known problematic protocols\n */\nexport function calculateProtocolPenalty(mimeType: string): number {\n // Direct match\n if (PROTOCOL_PENALTIES[mimeType]) {\n return PROTOCOL_PENALTIES[mimeType];\n }\n // Pattern-based penalties for protocols not explicitly listed\n const lowerMime = mimeType.toLowerCase();\n if (lowerMime.includes('webm')) {\n return 0.50; // Heavy penalty for any WebM variant\n }\n if (lowerMime.startsWith('dash/')) {\n return 0.40; // DASH penalty\n }\n if (lowerMime.includes('cmaf') || lowerMime.includes('ll-hls')) {\n return 0.20;\n }\n return 0;\n}\n\n/**\n * Player reliability scores\n * Based on library maturity, error recovery, and overall stability\n */\nexport const PLAYER_RELIABILITY: Record<string, number> = {\n 'webcodecs': 0.95, // Stable, lowest latency option\n 'videojs': 0.95, // Fast loading, built-in HLS via VHS\n 'hlsjs': 0.90, // Battle-tested but slower to load\n 'native': 0.85, // Native is lightweight but has edge cases\n 'mist-webrtc': 0.85, // Full signaling features\n 'mews': 0.75, // Custom protocol, less tested\n 'mist-legacy': 0.70, // Ultimate fallback, delegates everything\n 'dashjs': 0.50, // Broken, lowest reliability\n};\n\n/**\n * Calculate player reliability score\n */\nexport function calculateReliabilityScore(playerShortname: string): number {\n return PLAYER_RELIABILITY[playerShortname] ?? 0.5;\n}\n\n/**\n * Protocol bonuses for each playback mode\n *\n * IMPORTANT: Track compatibility is enforced by trackScore (50% weight).\n * Mode bonuses (12% weight) only affect ordering among compatible options.\n * A protocol missing required tracks will never be selected regardless of mode bonus.\n *\n * Priority rationale:\n * - Low-latency: WHEP/WebRTC first (<1s), then MP4/WS (2-5s), HLS last (10-30s)\n * - Quality: MP4/WS first (stable + low latency), HLS fallback, WHEP minimal\n * - VOD: MP4/HLS first (seekable), WHEP hard penalty (no seek support)\n * - Auto: MP4/WS balanced choice, WHEP for low latency, HLS last resort\n */\nexport const MODE_PROTOCOL_BONUSES: Record<PlaybackMode, Record<string, number>> = {\n 'low-latency': {\n // WebCodecs raw/h264: HIGHEST PRIORITY - ultra-low latency via WebCodecs API\n 'ws/video/raw': 0.55,\n 'wss/video/raw': 0.55,\n 'ws/video/h264': 0.52,\n 'wss/video/h264': 0.52,\n // WHEP/WebRTC: sub-second latency\n 'whep': 0.50,\n 'webrtc': 0.45,\n 'mist/webrtc': 0.45,\n // MP4/WS (MEWS): 2-5s latency, good fallback\n 'ws/video/mp4': 0.30,\n 'wss/video/mp4': 0.30,\n // Progressive MP4: lower latency than HLS (5-10s vs 10-30s)\n 'html5/video/mp4': 0.15,\n // HLS: high latency, minimal bonus\n 'html5/application/vnd.apple.mpegurl': 0.05,\n },\n 'quality': {\n // MP4/WS: stable + lower latency than HLS, preferred when supported\n 'ws/video/mp4': 0.45,\n 'wss/video/mp4': 0.45,\n // WebCodecs raw: below MEWS but above HLS - good quality + low latency\n 'ws/video/raw': 0.40,\n 'wss/video/raw': 0.40,\n 'ws/video/h264': 0.38,\n 'wss/video/h264': 0.38,\n // HLS: ABR support, universal fallback\n 'html5/application/vnd.apple.mpegurl': 0.30,\n 'html5/video/mp4': 0.20,\n // WebRTC: minimal for quality mode\n 'whep': 0.05,\n 'webrtc': 0.05,\n },\n 'vod': {\n // VOD/Clip: Prefer seekable protocols, EXCLUDE WebRTC (no seek support)\n 'html5/video/mp4': 0.50, // Progressive MP4 - best for clips\n 'html5/application/vnd.apple.mpegurl': 0.45, // HLS - ABR support\n 'dash/video/mp4': 0.40, // DASH - ABR support\n 'ws/video/mp4': 0.35, // MEWS - seekable via MSE\n 'wss/video/mp4': 0.35,\n // WHEP/WebRTC: HARD PENALTY - no seek support, inappropriate for VOD\n 'whep': -1.0,\n 'webrtc': -1.0,\n 'mist/webrtc': -1.0,\n },\n 'auto': {\n // WebCodecs raw: highest priority for low-latency live streams\n 'ws/video/raw': 0.50,\n 'wss/video/raw': 0.50,\n 'ws/video/h264': 0.48,\n 'wss/video/h264': 0.48,\n // Direct MP4: simple, reliable, preferred over HLS when available\n 'html5/video/mp4': 0.42,\n // WHEP/WebRTC: good for low latency\n 'whep': 0.38,\n 'webrtc': 0.35,\n 'mist/webrtc': 0.35,\n // MP4/WS (MEWS): lower latency than HLS\n 'ws/video/mp4': 0.30,\n 'wss/video/mp4': 0.30,\n // HLS: high latency, fallback option (but reliable)\n 'html5/application/vnd.apple.mpegurl': 0.20,\n }\n};\n\n/**\n * Calculate mode-specific bonus for a protocol\n */\nexport function calculateModeBonus(mimeType: string, mode: PlaybackMode): number {\n if (!mode) return 0;\n return MODE_PROTOCOL_BONUSES[mode]?.[mimeType] ?? 0;\n}\n\n/**\n * Protocol routing rules - certain players are preferred for certain protocols\n */\nexport const PROTOCOL_ROUTING: Record<string, { prefer: string[]; avoid?: string[] }> = {\n 'whep': { prefer: ['native'] },\n 'webrtc': { prefer: ['mist-webrtc', 'native'] },\n 'mist/webrtc': { prefer: ['mist-webrtc'] },\n\n // Raw WebSocket (12-byte header + AVCC NAL units) - WebCodecs only\n 'ws/video/raw': { prefer: ['webcodecs'] },\n 'wss/video/raw': { prefer: ['webcodecs'] },\n\n // Annex B WebSocket (H.264 NAL units) - WebCodecs\n 'ws/video/h264': { prefer: ['webcodecs'] },\n 'wss/video/h264': { prefer: ['webcodecs'] },\n\n // MP4-muxed WebSocket - MEWS (uses MSE for demuxing)\n 'ws/video/mp4': { prefer: ['mews'] },\n 'wss/video/mp4': { prefer: ['mews'] },\n 'ws/video/webm': { prefer: ['mews'] },\n 'wss/video/webm': { prefer: ['mews'] },\n\n // HLS\n 'html5/application/vnd.apple.mpegurl': {\n prefer: ['videojs', 'native'], // VideoJS loads faster than HLS.js, native for Safari\n },\n 'html5/application/vnd.apple.mpegurl;version=7': {\n prefer: ['videojs', 'native'],\n },\n\n // DASH\n 'dash/video/mp4': { prefer: ['dashjs', 'videojs'] },\n\n // Progressive download\n 'html5/video/mp4': { prefer: ['native'] },\n 'html5/video/webm': { prefer: ['native'] },\n\n // Audio-only formats\n 'html5/audio/aac': { prefer: ['native'] },\n 'html5/audio/mp3': { prefer: ['native'] },\n 'html5/audio/flac': { prefer: ['native'] },\n 'html5/audio/wav': { prefer: ['native'] },\n};\n\n/**\n * Calculate routing bonus based on protocol+player pairing\n */\nexport function calculateRoutingBonus(mimeType: string, playerShortname: string): number {\n const rules = PROTOCOL_ROUTING[mimeType];\n if (!rules) return 0;\n\n // Check if player is avoided\n if (rules.avoid?.includes(playerShortname)) {\n return -0.1; // Penalty for avoided players\n }\n\n // Check if player is preferred\n if (rules.prefer?.includes(playerShortname)) {\n const preferIndex = rules.prefer.indexOf(playerShortname);\n // First preferred player gets 0.15, second gets 0.10, etc.\n return 0.15 - (preferIndex * 0.05);\n }\n\n return 0;\n}\n\n/**\n * Comprehensive player scoring with enhanced factors\n */\nexport function scorePlayer(\n supportedTracks: string[] | boolean,\n priority: number,\n sourceIndex: number,\n options: {\n maxPriority?: number;\n totalSources?: number;\n trackScores?: Partial<TrackScore>;\n bandwidth?: number;\n targetBandwidth?: number;\n // New options for enhanced scoring\n playerShortname?: string;\n mimeType?: string;\n playbackMode?: PlaybackMode;\n weights?: {\n tracks: number;\n priority: number;\n source: number;\n quality: number;\n reliability?: number;\n mode?: number;\n routing?: number;\n protocolPenalty?: number;\n };\n } = {}\n): PlayerScore {\n const {\n maxPriority = 10,\n totalSources = 1,\n trackScores = {},\n bandwidth,\n targetBandwidth,\n playerShortname,\n mimeType,\n playbackMode = 'auto',\n weights = {\n tracks: 0.50, // Reduced from 0.70 to make room for new factors\n priority: 0.10, // Reduced from 0.15\n source: 0.05, // Reduced from 0.10\n quality: 0.05, // Unchanged\n reliability: 0.10, // NEW: Player stability\n mode: 0.10, // Playback mode bonus (reduced slightly)\n routing: 0.08, // Protocol routing preference\n protocolPenalty: 1.0, // Protocol penalty weight (applied as subtraction)\n }\n } = options;\n\n const finalTrackScores = { ...DEFAULT_TRACK_SCORES, ...trackScores };\n\n // Individual component scores\n const trackScore = calculateTrackScore(supportedTracks, finalTrackScores);\n const priorityScore = calculatePriorityScore(priority, maxPriority);\n const sourceScore = calculateSourceScore(sourceIndex, totalSources);\n const qualityScore = calculateQualityScore(bandwidth, targetBandwidth);\n\n // New enhanced scores\n const reliabilityScore = playerShortname ? calculateReliabilityScore(playerShortname) : 0.5;\n const modeBonus = mimeType ? calculateModeBonus(mimeType, playbackMode) : 0;\n const routingBonus = mimeType && playerShortname ? calculateRoutingBonus(mimeType, playerShortname) : 0;\n const protocolPenalty = mimeType ? calculateProtocolPenalty(mimeType) : 0;\n\n // Weighted total score (penalty is subtracted)\n const total =\n trackScore * weights.tracks +\n priorityScore * weights.priority +\n sourceScore * weights.source +\n qualityScore * weights.quality +\n reliabilityScore * (weights.reliability ?? 0) +\n modeBonus * (weights.mode ?? 0) +\n routingBonus * (weights.routing ?? 0) -\n protocolPenalty * (weights.protocolPenalty ?? 1.0);\n\n return {\n base: trackScore,\n trackTypes: Array.isArray(supportedTracks) ? supportedTracks : [],\n total,\n breakdown: {\n trackScore,\n priorityScore,\n sourceScore,\n reliabilityScore,\n modeBonus,\n routingBonus,\n protocolPenalty,\n }\n };\n}\n\n/**\n * Compare two player scores\n */\nexport function compareScores(a: PlayerScore, b: PlayerScore): number {\n return b.total - a.total; // Higher scores first\n}\n\n/**\n * Batch score multiple players and return sorted by best score\n */\nexport function scoreAndRankPlayers<T extends { priority: number }>(\n players: Array<{\n player: T;\n supportedTracks: string[] | boolean;\n sourceIndex: number;\n }>,\n options?: Parameters<typeof scorePlayer>[3]\n): Array<{\n player: T;\n score: PlayerScore;\n}> {\n const scoredPlayers = players.map(({ player, supportedTracks, sourceIndex }) => ({\n player,\n score: scorePlayer(supportedTracks, player.priority, sourceIndex, options)\n }));\n\n return scoredPlayers.sort((a, b) => compareScores(a.score, b.score));\n}\n\n/**\n * Utility to check if a score meets minimum thresholds\n */\nexport function meetsMinimumScore(\n score: PlayerScore,\n requirements: {\n minTotal?: number;\n requireVideo?: boolean;\n requireAudio?: boolean;\n minTrackTypes?: number;\n }\n): boolean {\n const {\n minTotal = 0,\n requireVideo = false,\n requireAudio = false,\n minTrackTypes = 0\n } = requirements;\n\n // Check total score\n if (score.total < minTotal) {\n return false;\n }\n\n // Check track type requirements\n if (requireVideo && !score.trackTypes.includes('video')) {\n return false;\n }\n\n if (requireAudio && !score.trackTypes.includes('audio')) {\n return false;\n }\n\n if (score.trackTypes.length < minTrackTypes) {\n return false;\n }\n\n return true;\n}\n","/**\n * PlayerManager\n *\n * Central orchestrator for player selection and lifecycle management.\n * Single source of truth for all scoring logic.\n *\n * Architecture:\n * - `getAllCombinations()` is THE single function that computes player+source scores\n * - Results are cached by content (source types + track codecs), not object identity\n * - Events fire only when selection actually changes (no render spam)\n * - `selectBestPlayer()` returns cached winner without recomputation\n */\n\nimport { getBrowserInfo, getBrowserCompatibility } from './detector';\nimport { IPlayer, StreamSource, StreamInfo, PlayerOptions } from './PlayerInterface';\nimport { scorePlayer, isProtocolBlacklisted } from './scorer';\nimport type { PlaybackMode } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PlayerSelection {\n score: number;\n player: string;\n source: StreamSource;\n source_index: number;\n}\n\nexport interface PlayerManagerOptions {\n /** Force a specific player */\n forcePlayer?: string;\n /** Force a specific source index */\n forceSource?: number;\n /** Force a specific MIME type */\n forceType?: string;\n /** Enable debug logging (logs selection changes only, not every render) */\n debug?: boolean;\n /** Automatic fallback on player failure */\n autoFallback?: boolean;\n /** Maximum fallback attempts */\n maxFallbackAttempts?: number;\n /** Playback mode for protocol selection */\n playbackMode?: PlaybackMode;\n}\n\nexport interface PlayerManagerEvents {\n playerSelected: { player: string; source: StreamSource; score: number };\n playerInitialized: { player: IPlayer; videoElement: HTMLVideoElement };\n playerFailed: { player: string; error: string };\n fallbackAttempted: { fromPlayer: string; toPlayer: string };\n /** Fires when selection changes (different player+source than before) */\n 'selection-changed': PlayerSelection | null;\n /** Fires when combinations are recomputed (cache miss) */\n 'combinations-updated': PlayerCombination[];\n}\n\n/** Full combination info including scoring breakdown */\nexport interface PlayerCombination {\n player: string;\n playerName: string;\n source: StreamSource;\n sourceIndex: number;\n sourceType: string;\n score: number;\n compatible: boolean;\n incompatibleReason?: string;\n /** True when player supports MIME but codec is incompatible */\n codecIncompatible?: boolean;\n scoreBreakdown?: {\n trackScore: number;\n trackTypes: string[];\n priorityScore: number;\n sourceScore: number;\n reliabilityScore?: number;\n modeBonus?: number;\n routingBonus?: number;\n weights: {\n tracks: number;\n priority: number;\n source: number;\n reliability?: number;\n mode?: number;\n routing?: number;\n };\n };\n}\n\n// ============================================================================\n// PlayerManager Class\n// ============================================================================\n\nexport class PlayerManager {\n private players: Map<string, IPlayer> = new Map();\n private currentPlayer: IPlayer | null = null;\n private listeners: Map<string, Set<Function>> = new Map();\n private fallbackAttempts = 0;\n private options: PlayerManagerOptions;\n\n // Caching: prevents recalculation on every render\n private cachedCombinations: PlayerCombination[] | null = null;\n private cachedSelection: PlayerSelection | null = null;\n private cacheKey: string | null = null;\n private lastLoggedWinner: string | null = null;\n\n // Fallback state\n private lastContainer: HTMLElement | null = null;\n private lastStreamInfo: StreamInfo | null = null;\n private lastPlayerOptions: PlayerOptions = {};\n private lastManagerOptions: PlayerManagerOptions = {};\n private excludedPlayers: Set<string> = new Set();\n\n // Serializes lifecycle operations to prevent race conditions\n private opQueue: Promise<void> = Promise.resolve();\n\n constructor(options: PlayerManagerOptions = {}) {\n this.options = {\n debug: false,\n autoFallback: true,\n maxFallbackAttempts: 3,\n ...options,\n };\n }\n\n // ==========================================================================\n // Player Registration\n // ==========================================================================\n\n registerPlayer(player: IPlayer): void {\n this.players.set(player.capability.shortname, player);\n this.invalidateCache();\n this.log(`Registered player: ${player.capability.name}`);\n }\n\n unregisterPlayer(shortname: string): void {\n const player = this.players.get(shortname);\n if (player) {\n player.destroy();\n this.players.delete(shortname);\n this.invalidateCache();\n this.log(`Unregistered player: ${shortname}`);\n }\n }\n\n getRegisteredPlayers(): IPlayer[] {\n return Array.from(this.players.values());\n }\n\n // ==========================================================================\n // Caching\n // ==========================================================================\n\n /**\n * Compute cache key based on CONTENT, not object identity.\n * Prevents recalculation when streamInfo is a new object with same data.\n */\n private computeCacheKey(streamInfo: StreamInfo, mode: PlaybackMode): string {\n return JSON.stringify({\n sources: streamInfo.source.map((s) => s.type).sort(),\n tracks: streamInfo.meta?.tracks?.map((t) => t.codec).sort() ?? [],\n mode,\n forcePlayer: this.options.forcePlayer,\n forceSource: this.options.forceSource,\n forceType: this.options.forceType,\n });\n }\n\n /** Invalidate cache (called when player registrations change) */\n invalidateCache(): void {\n this.cachedCombinations = null;\n this.cachedSelection = null;\n this.cacheKey = null;\n }\n\n /** Get cached selection without recomputing */\n getCurrentSelection(): PlayerSelection | null {\n return this.cachedSelection;\n }\n\n /** Get cached combinations without recomputing */\n getCachedCombinations(): PlayerCombination[] | null {\n return this.cachedCombinations;\n }\n\n // ==========================================================================\n // Selection Logic (Single Source of Truth)\n // ==========================================================================\n\n /**\n * THE single source of truth for player+source scoring.\n * Returns ALL combinations (compatible and incompatible) with scores.\n * Results are cached - won't recompute if source types/tracks haven't changed.\n */\n getAllCombinations(\n streamInfo: StreamInfo,\n playbackMode?: PlaybackMode\n ): PlayerCombination[] {\n // Determine effective playback mode\n const explicitMode = playbackMode || this.options.playbackMode;\n const effectiveMode: PlaybackMode =\n explicitMode && explicitMode !== 'auto'\n ? explicitMode\n : streamInfo.type === 'vod'\n ? 'vod'\n : 'auto';\n\n // Check cache\n const key = this.computeCacheKey(streamInfo, effectiveMode);\n if (key === this.cacheKey && this.cachedCombinations) {\n return this.cachedCombinations;\n }\n\n // Cache miss - compute all combinations\n const combinations = this.computeAllCombinations(streamInfo, effectiveMode);\n\n // Update cache\n this.cachedCombinations = combinations;\n this.cacheKey = key;\n\n // Update selection and emit events if changed\n const newSelection = this.pickBestFromCombinations(combinations);\n const selectionChanged = this.hasSelectionChanged(newSelection);\n\n if (selectionChanged) {\n this.cachedSelection = newSelection;\n\n // Log only on actual change\n if (this.options.debug && newSelection) {\n const winnerKey = `${newSelection.player}:${newSelection.source?.type}`;\n if (winnerKey !== this.lastLoggedWinner) {\n console.log(\n `[PlayerManager] Selection: ${newSelection.player} + ${newSelection.source?.type} (score: ${newSelection.score.toFixed(3)})`\n );\n this.lastLoggedWinner = winnerKey;\n }\n }\n\n this.emit('selection-changed', newSelection);\n }\n\n this.emit('combinations-updated', combinations);\n return combinations;\n }\n\n /**\n * Select the best player for given stream info.\n * Uses cached combinations - won't recompute if data hasn't changed.\n */\n selectBestPlayer(\n streamInfo: StreamInfo,\n options?: PlayerManagerOptions\n ): PlayerSelection | false {\n // Merge options\n const mergedOptions = { ...this.options, ...options };\n\n // Special handling for Legacy player - bypass normal selection\n if (\n mergedOptions.forcePlayer === 'mist-legacy' ||\n mergedOptions.forceType === 'mist/legacy'\n ) {\n const legacyPlayer = this.players.get('mist-legacy');\n if (legacyPlayer && streamInfo.source.length > 0) {\n const firstSource = streamInfo.source[0];\n const legacySource: StreamSource = {\n url: firstSource.url,\n type: 'mist/legacy',\n streamName: firstSource.streamName,\n mistPlayerUrl: firstSource.mistPlayerUrl,\n };\n const result: PlayerSelection = {\n score: 0.1,\n player: 'mist-legacy',\n source: legacySource,\n source_index: 0,\n };\n this.emit('playerSelected', {\n player: result.player,\n source: result.source,\n score: result.score,\n });\n return result;\n }\n }\n\n // Get combinations (will use cache if available)\n const combinations = this.getAllCombinations(\n streamInfo,\n mergedOptions.playbackMode\n );\n\n // Apply force filters\n let filtered = combinations.filter((c) => c.compatible);\n\n if (mergedOptions.forcePlayer) {\n filtered = filtered.filter((c) => c.player === mergedOptions.forcePlayer);\n }\n if (mergedOptions.forceType) {\n filtered = filtered.filter(\n (c) => c.sourceType === mergedOptions.forceType\n );\n }\n if (mergedOptions.forceSource !== undefined) {\n filtered = filtered.filter(\n (c) => c.sourceIndex === mergedOptions.forceSource\n );\n }\n\n if (filtered.length === 0) {\n this.log('No suitable player found');\n return false;\n }\n\n const best = filtered[0];\n const result: PlayerSelection = {\n score: best.score,\n player: best.player,\n source: best.source,\n source_index: best.sourceIndex,\n };\n\n this.emit('playerSelected', {\n player: result.player,\n source: result.source,\n score: result.score,\n });\n\n return result;\n }\n\n /**\n * Internal: compute all combinations (no caching)\n */\n private computeAllCombinations(\n streamInfo: StreamInfo,\n effectiveMode: PlaybackMode\n ): PlayerCombination[] {\n const combinations: PlayerCombination[] = [];\n const players = Array.from(this.players.values());\n const maxPriority = Math.max(\n ...players.map((p) => p.capability.priority),\n 1\n );\n\n // Filter blacklisted sources for scoring index calculation\n const selectionSources = streamInfo.source.filter(\n (s) => !isProtocolBlacklisted(s.type)\n );\n const selectionIndexBySource = new Map<StreamSource, number>();\n selectionSources.forEach((s, idx) => selectionIndexBySource.set(s, idx));\n const totalSources = selectionSources.length;\n\n // Track seen player+sourceType pairs to avoid duplicates\n const seenPairs = new Set<string>();\n\n for (const player of players) {\n for (let sourceIndex = 0; sourceIndex < streamInfo.source.length; sourceIndex++) {\n const source = streamInfo.source[sourceIndex];\n const pairKey = `${player.capability.shortname}:${source.type}`;\n\n // Skip duplicate player+sourceType combinations\n if (seenPairs.has(pairKey)) continue;\n seenPairs.add(pairKey);\n\n // Blacklisted protocols: show as incompatible\n const sourceListIndex = selectionIndexBySource.get(source);\n if (sourceListIndex === undefined) {\n combinations.push({\n player: player.capability.shortname,\n playerName: player.capability.name,\n source,\n sourceIndex,\n sourceType: source.type,\n score: 0,\n compatible: false,\n incompatibleReason: `Protocol \"${source.type}\" is blacklisted`,\n });\n continue;\n }\n\n // Check MIME support\n const mimeSupported = player.isMimeSupported(source.type);\n if (!mimeSupported) {\n combinations.push({\n player: player.capability.shortname,\n playerName: player.capability.name,\n source,\n sourceIndex,\n sourceType: source.type,\n score: 0,\n compatible: false,\n incompatibleReason: `MIME type \"${source.type}\" not supported`,\n });\n continue;\n }\n\n // Check browser/codec compatibility\n const tracktypes = player.isBrowserSupported(\n source.type,\n source,\n streamInfo\n );\n if (!tracktypes) {\n // Codec incompatible - still score for UI display\n const priorityScore =\n 1 - player.capability.priority / Math.max(maxPriority, 1);\n const sourceScore =\n 1 - sourceListIndex / Math.max(totalSources - 1, 1);\n const playerScore = scorePlayer(\n ['video', 'audio'],\n player.capability.priority,\n sourceListIndex,\n {\n maxPriority,\n totalSources,\n playerShortname: player.capability.shortname,\n mimeType: source.type,\n playbackMode: effectiveMode,\n }\n );\n\n combinations.push({\n player: player.capability.shortname,\n playerName: player.capability.name,\n source,\n sourceIndex,\n sourceType: source.type,\n score: playerScore.total,\n compatible: false,\n codecIncompatible: true,\n incompatibleReason: 'Codec not supported by browser',\n scoreBreakdown: {\n trackScore: 0,\n trackTypes: [],\n priorityScore,\n sourceScore,\n weights: { tracks: 0.5, priority: 0.1, source: 0.05 },\n },\n });\n continue;\n }\n\n // Compatible - calculate full score\n const trackScore = Array.isArray(tracktypes)\n ? tracktypes.reduce(\n (sum, t) =>\n sum + ({ video: 2.0, audio: 1.0, subtitle: 0.5 }[t] || 0),\n 0\n )\n : 1.9;\n const priorityScore =\n 1 - player.capability.priority / Math.max(maxPriority, 1);\n const sourceScore =\n 1 - sourceListIndex / Math.max(totalSources - 1, 1);\n\n const playerScore = scorePlayer(\n tracktypes,\n player.capability.priority,\n sourceListIndex,\n {\n maxPriority,\n totalSources,\n playerShortname: player.capability.shortname,\n mimeType: source.type,\n playbackMode: effectiveMode,\n }\n );\n\n combinations.push({\n player: player.capability.shortname,\n playerName: player.capability.name,\n source,\n sourceIndex,\n sourceType: source.type,\n score: playerScore.total,\n compatible: true,\n scoreBreakdown: {\n trackScore,\n trackTypes: Array.isArray(tracktypes)\n ? tracktypes\n : ['video', 'audio'],\n priorityScore,\n sourceScore,\n reliabilityScore: playerScore.breakdown?.reliabilityScore ?? 0,\n modeBonus: playerScore.breakdown?.modeBonus ?? 0,\n routingBonus: playerScore.breakdown?.routingBonus ?? 0,\n weights: {\n tracks: 0.5,\n priority: 0.1,\n source: 0.05,\n reliability: 0.1,\n mode: 0.12,\n routing: 0.08,\n },\n },\n });\n }\n }\n\n // Add Legacy player option\n const legacyPlayer = this.players.get('mist-legacy');\n if (legacyPlayer && streamInfo.source.length > 0) {\n const firstSource = streamInfo.source[0];\n const legacySource: StreamSource = {\n url: firstSource.url,\n type: 'mist/legacy',\n streamName: firstSource.streamName,\n mistPlayerUrl: firstSource.mistPlayerUrl,\n };\n\n combinations.push({\n player: legacyPlayer.capability.shortname,\n playerName: legacyPlayer.capability.name,\n source: legacySource,\n sourceIndex: 0,\n sourceType: 'mist/legacy',\n score: 0.1,\n compatible: true,\n scoreBreakdown: {\n trackScore: 2.0,\n trackTypes: ['video', 'audio'],\n priorityScore: 0,\n sourceScore: 0,\n weights: { tracks: 0.5, priority: 0.1, source: 0.05 },\n },\n });\n }\n\n // Sort: compatible first by score descending, then incompatible alphabetically\n return combinations.sort((a, b) => {\n if (a.compatible !== b.compatible) return a.compatible ? -1 : 1;\n if (a.compatible) return b.score - a.score;\n return a.playerName.localeCompare(b.playerName);\n });\n }\n\n /**\n * Pick best compatible combination\n */\n private pickBestFromCombinations(\n combinations: PlayerCombination[]\n ): PlayerSelection | null {\n const compatible = combinations.filter((c) => c.compatible);\n if (compatible.length === 0) return null;\n\n const best = compatible[0];\n return {\n score: best.score,\n player: best.player,\n source: best.source,\n source_index: best.sourceIndex,\n };\n }\n\n /**\n * Check if selection changed\n */\n private hasSelectionChanged(newSelection: PlayerSelection | null): boolean {\n if (!this.cachedSelection && !newSelection) return false;\n if (!this.cachedSelection || !newSelection) return true;\n return (\n this.cachedSelection.player !== newSelection.player ||\n this.cachedSelection.source?.type !== newSelection.source?.type\n );\n }\n\n // ==========================================================================\n // Player Initialization\n // ==========================================================================\n\n private enqueueOp<T>(op: () => Promise<T>): Promise<T> {\n const run = this.opQueue.then(op, op);\n this.opQueue = run.then(\n () => undefined,\n () => undefined\n );\n return run;\n }\n\n async initializePlayer(\n container: HTMLElement,\n streamInfo: StreamInfo,\n playerOptions: PlayerOptions = {},\n managerOptions?: PlayerManagerOptions\n ): Promise<HTMLVideoElement> {\n console.log('[PlayerManager] initializePlayer() called');\n return this.enqueueOp(async () => {\n console.log('[PlayerManager] Inside enqueueOp - starting');\n this.fallbackAttempts = 0;\n this.excludedPlayers.clear();\n\n // Save for fallback (strip force settings - they're one-shot, not for fallback)\n this.lastContainer = container;\n this.lastStreamInfo = streamInfo;\n this.lastPlayerOptions = playerOptions;\n // Keep playback mode (persistent preference) but clear force settings\n this.lastManagerOptions = {\n playbackMode: managerOptions?.playbackMode,\n debug: managerOptions?.debug,\n autoFallback: managerOptions?.autoFallback,\n maxFallbackAttempts: managerOptions?.maxFallbackAttempts,\n // forcePlayer, forceType, forceSource are intentionally NOT saved\n // They are one-shot selections that shouldn't persist through fallback\n };\n\n return this.tryInitializePlayer(\n container,\n streamInfo,\n playerOptions,\n managerOptions\n );\n });\n }\n\n private async tryInitializePlayer(\n container: HTMLElement,\n streamInfo: StreamInfo,\n playerOptions: PlayerOptions,\n managerOptions?: PlayerManagerOptions,\n excludePlayers: Set<string> = new Set()\n ): Promise<HTMLVideoElement> {\n console.log('[PlayerManager] tryInitializePlayer() starting');\n\n // Clean up previous player\n if (this.currentPlayer) {\n console.log('[PlayerManager] Cleaning up previous player...');\n await Promise.resolve(this.currentPlayer.destroy());\n this.currentPlayer = null;\n }\n container.innerHTML = '';\n\n // Filter excluded players\n const availableSources = streamInfo.source.filter((_, index) => {\n if (excludePlayers.size === 0) return true;\n const selection = this.selectBestPlayer(\n { ...streamInfo, source: [streamInfo.source[index]] },\n managerOptions\n );\n return selection && !excludePlayers.has(selection.player);\n });\n\n if (availableSources.length === 0) {\n console.log('[PlayerManager] No available sources after filtering');\n throw new Error('No available players after fallback attempts');\n }\n\n console.log(`[PlayerManager] Available sources: ${availableSources.length}`);\n const modifiedStreamInfo = { ...streamInfo, source: availableSources };\n const selection = this.selectBestPlayer(modifiedStreamInfo, managerOptions);\n\n if (!selection) {\n console.log('[PlayerManager] No suitable player selected');\n throw new Error('No suitable player found for stream');\n }\n\n console.log(`[PlayerManager] Selected: ${selection.player} for ${selection.source.type}`);\n const player = this.players.get(selection.player);\n if (!player) {\n console.log(`[PlayerManager] Player ${selection.player} not registered`);\n throw new Error(`Player ${selection.player} not found`);\n }\n\n console.log(`[PlayerManager] Calling ${selection.player}.initialize()...`);\n try {\n const videoElement = await player.initialize(\n container,\n selection.source,\n playerOptions,\n streamInfo\n );\n console.log(`[PlayerManager] ${selection.player}.initialize() completed successfully`);\n this.currentPlayer = player;\n this.emit('playerInitialized', { player, videoElement });\n return videoElement;\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.log(`Player ${selection.player} failed: ${errorMessage}`);\n this.emit('playerFailed', { player: selection.player, error: errorMessage });\n\n // Attempt fallback\n if (\n this.options.autoFallback &&\n this.fallbackAttempts < (this.options.maxFallbackAttempts || 3)\n ) {\n this.fallbackAttempts++;\n excludePlayers.add(selection.player);\n this.log(`Attempting fallback (attempt ${this.fallbackAttempts})`);\n this.emit('fallbackAttempted', {\n fromPlayer: selection.player,\n toPlayer: 'auto',\n });\n\n return this.tryInitializePlayer(\n container,\n streamInfo,\n playerOptions,\n managerOptions,\n excludePlayers\n );\n }\n\n throw error;\n }\n }\n\n // ==========================================================================\n // Fallback Management\n // ==========================================================================\n\n async tryPlaybackFallback(): Promise<boolean> {\n return this.enqueueOp(async () => {\n if (!this.lastContainer || !this.lastStreamInfo) {\n this.log('Cannot attempt fallback: no previous init params');\n return false;\n }\n\n const maxAttempts = this.options.maxFallbackAttempts || 3;\n if (this.fallbackAttempts >= maxAttempts) {\n this.log(`Fallback exhausted (${this.fallbackAttempts}/${maxAttempts})`);\n return false;\n }\n\n if (this.currentPlayer) {\n this.excludedPlayers.add(this.currentPlayer.capability.shortname);\n await Promise.resolve(this.currentPlayer.destroy());\n this.currentPlayer = null;\n }\n\n this.fallbackAttempts++;\n this.lastContainer.innerHTML = '';\n\n try {\n await this.tryInitializePlayer(\n this.lastContainer,\n this.lastStreamInfo,\n this.lastPlayerOptions,\n this.lastManagerOptions,\n this.excludedPlayers\n );\n\n const current = this.getCurrentPlayer();\n this.emit('fallbackAttempted', {\n fromPlayer: Array.from(this.excludedPlayers).pop() || 'unknown',\n toPlayer: current?.capability.shortname || 'unknown',\n });\n\n return true;\n } catch {\n this.log('Playback fallback failed');\n return false;\n }\n });\n }\n\n getRemainingFallbackAttempts(): number {\n return Math.max(\n 0,\n (this.options.maxFallbackAttempts || 3) - this.fallbackAttempts\n );\n }\n\n canAttemptFallback(): boolean {\n return this.getRemainingFallbackAttempts() > 0 && this.lastStreamInfo !== null;\n }\n\n getCurrentPlayer(): IPlayer | null {\n return this.currentPlayer;\n }\n\n // ==========================================================================\n // Browser Capabilities\n // ==========================================================================\n\n getBrowserCapabilities() {\n const browser = getBrowserInfo();\n const compatibility = getBrowserCompatibility();\n\n return {\n browser,\n compatibility,\n supportedMimeTypes: this.getSupportedMimeTypes(),\n availablePlayers: this.getAvailablePlayerInfo(),\n };\n }\n\n private getSupportedMimeTypes(): string[] {\n const mimes = new Set<string>();\n for (const player of this.players.values()) {\n player.capability.mimes.forEach((mime) => mimes.add(mime));\n }\n return Array.from(mimes).sort();\n }\n\n private getAvailablePlayerInfo() {\n return Array.from(this.players.values())\n .map((player) => ({\n name: player.capability.name,\n shortname: player.capability.shortname,\n priority: player.capability.priority,\n mimes: player.capability.mimes,\n }))\n .sort((a, b) => a.priority - b.priority);\n }\n\n // ==========================================================================\n // Lifecycle\n // ==========================================================================\n\n async destroy(): Promise<void> {\n await this.enqueueOp(async () => {\n if (this.currentPlayer) {\n await Promise.resolve(this.currentPlayer.destroy());\n this.currentPlayer = null;\n }\n });\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n\n // ==========================================================================\n // Event System\n // ==========================================================================\n\n on<K extends keyof PlayerManagerEvents>(\n event: K,\n listener: (data: PlayerManagerEvents[K]) => void\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n\n // Return unsubscribe function\n return () => this.off(event, listener);\n }\n\n off<K extends keyof PlayerManagerEvents>(\n event: K,\n listener: (data: PlayerManagerEvents[K]) => void\n ): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n private emit<K extends keyof PlayerManagerEvents>(\n event: K,\n data: PlayerManagerEvents[K]\n ): void {\n this.listeners.get(event)?.forEach((listener) => {\n try {\n listener(data);\n } catch (e) {\n console.error(`Error in PlayerManager ${event} listener:`, e);\n }\n });\n }\n\n // ==========================================================================\n // Logging\n // ==========================================================================\n\n private log(message: string): void {\n if (this.options.debug) {\n console.log(`[PlayerManager] ${message}`);\n }\n }\n\n // ==========================================================================\n // Testing\n // ==========================================================================\n\n async testSource(\n source: StreamSource,\n streamInfo: StreamInfo\n ): Promise<{ canPlay: boolean; players: string[] }> {\n const testStreamInfo = { ...streamInfo, source: [source] };\n const selection = this.selectBestPlayer(testStreamInfo);\n\n if (!selection) {\n return { canPlay: false, players: [] };\n }\n\n const capablePlayers: string[] = [];\n for (const player of this.players.values()) {\n if (player.isMimeSupported(source.type)) {\n const browserSupport = player.isBrowserSupported(\n source.type,\n source,\n streamInfo\n );\n if (browserSupport) {\n capablePlayers.push(player.capability.shortname);\n }\n }\n }\n\n return { canPlay: true, players: capablePlayers };\n }\n}\n","/**\n * EventEmitter.ts\n *\n * A lightweight, typed event emitter for framework-agnostic components.\n * Used by GatewayClient, StreamStateClient, and PlayerController.\n */\n\ntype Listener<T> = (data: T) => void;\n\n/**\n * Typed event emitter that provides type-safe event handling.\n *\n * @example\n * ```typescript\n * interface MyEvents {\n * stateChange: { state: string };\n * error: { message: string };\n * }\n *\n * class MyClass extends TypedEventEmitter<MyEvents> {\n * doSomething() {\n * this.emit('stateChange', { state: 'ready' });\n * }\n * }\n *\n * const instance = new MyClass();\n * const unsub = instance.on('stateChange', ({ state }) => console.log(state));\n * unsub(); // unsubscribe\n * ```\n */\nexport class TypedEventEmitter<Events extends Record<string, any>> {\n private listeners = new Map<keyof Events, Set<Function>>();\n\n /**\n * Subscribe to an event.\n * @param event - The event name to listen for\n * @param listener - Callback function invoked when the event is emitted\n * @returns Unsubscribe function\n */\n on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n\n // Return unsubscribe function\n return () => this.off(event, listener);\n }\n\n /**\n * Subscribe to an event only once.\n * The listener is automatically removed after the first invocation.\n * @param event - The event name to listen for\n * @param listener - Callback function invoked when the event is emitted\n * @returns Unsubscribe function\n */\n once<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void {\n const onceListener = (data: Events[K]) => {\n this.off(event, onceListener);\n listener(data);\n };\n return this.on(event, onceListener);\n }\n\n /**\n * Unsubscribe from an event.\n * @param event - The event name\n * @param listener - The callback to remove\n */\n off<K extends keyof Events>(event: K, listener: Listener<Events[K]>): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n /**\n * Emit an event to all subscribers.\n * @param event - The event name\n * @param data - The event payload\n */\n protected emit<K extends keyof Events>(event: K, data: Events[K]): void {\n this.listeners.get(event)?.forEach(listener => {\n try {\n listener(data);\n } catch (e) {\n console.error(`[EventEmitter] Error in ${String(event)} listener:`, e);\n }\n });\n }\n\n /**\n * Remove all listeners for all events.\n */\n removeAllListeners(): void {\n this.listeners.clear();\n }\n\n /**\n * Remove all listeners for a specific event.\n * @param event - The event name\n */\n removeListeners<K extends keyof Events>(event: K): void {\n this.listeners.delete(event);\n }\n\n /**\n * Check if there are any listeners for an event.\n * @param event - The event name\n */\n hasListeners<K extends keyof Events>(event: K): boolean {\n return (this.listeners.get(event)?.size ?? 0) > 0;\n }\n}\n\nexport default TypedEventEmitter;\n","/**\n * GatewayClient.ts\n *\n * Framework-agnostic client for resolving viewer endpoints from the Gateway GraphQL API.\n * Extracted from useViewerEndpoints.ts for use in headless core.\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport type { ContentEndpoints, ContentType } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type GatewayStatus = 'idle' | 'loading' | 'ready' | 'error';\n\nexport interface GatewayClientConfig {\n /** Gateway GraphQL endpoint URL */\n gatewayUrl: string;\n /** Content type to resolve */\n contentType: ContentType;\n /** Content identifier (stream name) */\n contentId: string;\n /** Optional auth token for private streams */\n authToken?: string;\n /** Maximum retry attempts (default: 3) */\n maxRetries?: number;\n /** Initial retry delay in ms (default: 500) */\n initialDelayMs?: number;\n}\n\nexport interface GatewayClientEvents {\n /** Emitted when status changes */\n statusChange: { status: GatewayStatus; error?: string };\n /** Emitted when endpoints are successfully resolved */\n endpointsResolved: { endpoints: ContentEndpoints };\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_INITIAL_DELAY_MS = 500;\n// F2: Cache TTL for resolved endpoints\nconst DEFAULT_CACHE_TTL_MS = 10000;\n// F3: Circuit breaker constants\nconst CIRCUIT_BREAKER_THRESHOLD = 5; // Open after 5 consecutive failures\nconst CIRCUIT_BREAKER_TIMEOUT_MS = 30000; // Half-open after 30 seconds\n\ntype CircuitBreakerState = 'closed' | 'open' | 'half-open';\n\nconst RESOLVE_VIEWER_QUERY = `\n query ResolveViewer($contentType: String!, $contentId: String!) {\n resolveViewerEndpoint(contentType: $contentType, contentId: $contentId) {\n primary { nodeId baseUrl protocol url geoDistance loadScore outputs }\n fallbacks { nodeId baseUrl protocol url geoDistance loadScore outputs }\n metadata { contentType contentId title description durationSeconds status isLive viewers recordingSizeBytes clipSource createdAt }\n }\n }\n`;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Fetch with exponential backoff retry logic.\n */\nasync function fetchWithRetry(\n url: string,\n options: RequestInit,\n maxRetries: number,\n initialDelay: number\n): Promise<Response> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const response = await fetch(url, options);\n return response;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error('Fetch failed');\n\n // Don't retry on abort\n if (options.signal?.aborted) {\n throw lastError;\n }\n\n // Wait before retrying (exponential backoff)\n if (attempt < maxRetries - 1) {\n const delay = initialDelay * Math.pow(2, attempt);\n console.warn(`[GatewayClient] Retry ${attempt + 1}/${maxRetries - 1} after ${delay}ms`);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError ?? new Error('Gateway unreachable after retries');\n}\n\n// ============================================================================\n// GatewayClient Class\n// ============================================================================\n\n/**\n * Client for resolving viewer endpoints from the Gateway GraphQL API.\n *\n * @example\n * ```typescript\n * const client = new GatewayClient({\n * gatewayUrl: 'https://gateway.example.com/graphql',\n * contentType: 'live',\n * contentId: 'my-stream',\n * });\n *\n * client.on('statusChange', ({ status }) => console.log('Status:', status));\n * client.on('endpointsResolved', ({ endpoints }) => console.log('Endpoints:', endpoints));\n *\n * const endpoints = await client.resolve();\n * ```\n */\nexport class GatewayClient extends TypedEventEmitter<GatewayClientEvents> {\n private config: GatewayClientConfig;\n private status: GatewayStatus = 'idle';\n private endpoints: ContentEndpoints | null = null;\n private error: string | null = null;\n private abortController: AbortController | null = null;\n\n // F2: Request deduplication - in-flight request tracking\n private inFlightRequest: Promise<ContentEndpoints> | null = null;\n // F2: Cache with TTL for resolved endpoints\n private cacheTimestamp = 0;\n private cacheTtlMs: number;\n\n // F3: Circuit breaker state\n private circuitState: CircuitBreakerState = 'closed';\n private consecutiveFailures = 0;\n private circuitOpenedAt = 0;\n\n constructor(config: GatewayClientConfig) {\n super();\n this.config = config;\n this.cacheTtlMs = DEFAULT_CACHE_TTL_MS;\n }\n\n /**\n * Resolve endpoints from the gateway.\n * F2: Returns cached result if still valid, deduplicates concurrent requests.\n * F3: Respects circuit breaker state.\n * @param forceRefresh - If true, bypasses cache and fetches fresh data\n * @returns Promise resolving to ContentEndpoints\n * @throws Error if resolution fails after retries or circuit is open\n */\n async resolve(forceRefresh = false): Promise<ContentEndpoints> {\n // F2: Return cached result if still valid\n if (!forceRefresh && this.endpoints && this.isCacheValid()) {\n return this.endpoints;\n }\n\n // F3: Check circuit breaker\n if (!this.canAttemptRequest()) {\n throw new Error('Circuit breaker is open - too many recent failures');\n }\n\n // F2: Return in-flight request if one exists (deduplication)\n if (this.inFlightRequest) {\n return this.inFlightRequest;\n }\n\n // Create a new request and track it\n this.inFlightRequest = this.doResolve();\n\n try {\n const result = await this.inFlightRequest;\n // F3: Success - close circuit\n this.onSuccess();\n return result;\n } catch (e) {\n // F3: Failure - record for circuit breaker\n this.onFailure();\n throw e;\n } finally {\n this.inFlightRequest = null;\n }\n }\n\n /**\n * F2: Check if cache is still valid\n */\n private isCacheValid(): boolean {\n return Date.now() - this.cacheTimestamp < this.cacheTtlMs;\n }\n\n /**\n * F2: Set cache TTL (for testing or custom requirements)\n */\n setCacheTtl(ttlMs: number): void {\n this.cacheTtlMs = ttlMs;\n }\n\n /**\n * F2: Invalidate the cache manually\n */\n invalidateCache(): void {\n this.cacheTimestamp = 0;\n }\n\n // ==========================================================================\n // F3: Circuit Breaker Methods\n // ==========================================================================\n\n /**\n * F3: Check if a request can be attempted based on circuit state\n */\n private canAttemptRequest(): boolean {\n switch (this.circuitState) {\n case 'closed':\n return true;\n\n case 'open':\n // Check if enough time has passed to try half-open\n if (Date.now() - this.circuitOpenedAt >= CIRCUIT_BREAKER_TIMEOUT_MS) {\n this.circuitState = 'half-open';\n return true;\n }\n return false;\n\n case 'half-open':\n // Allow one request to test the circuit\n return true;\n }\n }\n\n /**\n * F3: Record a successful request\n */\n private onSuccess(): void {\n this.consecutiveFailures = 0;\n this.circuitState = 'closed';\n }\n\n /**\n * F3: Record a failed request\n */\n private onFailure(): void {\n this.consecutiveFailures++;\n\n if (this.circuitState === 'half-open') {\n // Failed during half-open - re-open the circuit\n this.circuitState = 'open';\n this.circuitOpenedAt = Date.now();\n } else if (this.consecutiveFailures >= CIRCUIT_BREAKER_THRESHOLD) {\n // Threshold reached - open the circuit\n this.circuitState = 'open';\n this.circuitOpenedAt = Date.now();\n console.warn(`[GatewayClient] Circuit breaker opened after ${this.consecutiveFailures} consecutive failures`);\n }\n }\n\n /**\n * F3: Get current circuit breaker state (for monitoring/debugging)\n */\n getCircuitState(): { state: CircuitBreakerState; failures: number; openedAt: number | null } {\n return {\n state: this.circuitState,\n failures: this.consecutiveFailures,\n openedAt: this.circuitState === 'open' ? this.circuitOpenedAt : null,\n };\n }\n\n /**\n * F3: Manually reset the circuit breaker\n */\n resetCircuitBreaker(): void {\n this.circuitState = 'closed';\n this.consecutiveFailures = 0;\n this.circuitOpenedAt = 0;\n }\n\n /**\n * Internal method to perform the actual resolution.\n * @returns Promise resolving to ContentEndpoints\n */\n private async doResolve(): Promise<ContentEndpoints> {\n // Abort any in-flight fetch (different from inFlightRequest promise tracking)\n this.abort();\n\n const {\n gatewayUrl,\n contentType,\n contentId,\n authToken,\n maxRetries = DEFAULT_MAX_RETRIES,\n initialDelayMs = DEFAULT_INITIAL_DELAY_MS,\n } = this.config;\n\n // Validate required params\n if (!gatewayUrl || !contentType || !contentId) {\n const error = 'Missing required parameters: gatewayUrl, contentType, or contentId';\n this.setStatus('error', error);\n throw new Error(error);\n }\n\n this.setStatus('loading');\n\n const ac = new AbortController();\n this.abortController = ac;\n\n try {\n const graphqlEndpoint = gatewayUrl.replace(/\\/$/, '');\n\n const res = await fetchWithRetry(\n graphqlEndpoint,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify({\n query: RESOLVE_VIEWER_QUERY,\n variables: { contentType, contentId },\n }),\n signal: ac.signal,\n },\n maxRetries,\n initialDelayMs\n );\n\n if (!res.ok) {\n throw new Error(`Gateway GQL error ${res.status}`);\n }\n\n const payload = await res.json();\n\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message || 'GraphQL error');\n }\n\n const resp = payload.data?.resolveViewerEndpoint;\n const primary = resp?.primary;\n const fallbacks = Array.isArray(resp?.fallbacks) ? resp.fallbacks : [];\n\n if (!primary) {\n throw new Error('No endpoints available');\n }\n\n const endpoints: ContentEndpoints = {\n primary,\n fallbacks,\n metadata: resp?.metadata,\n };\n\n this.endpoints = endpoints;\n // F2: Update cache timestamp\n this.cacheTimestamp = Date.now();\n this.setStatus('ready');\n this.emit('endpointsResolved', { endpoints });\n\n return endpoints;\n } catch (e) {\n // Ignore abort errors\n if (ac.signal.aborted) {\n throw new Error('Request aborted');\n }\n\n const message = e instanceof Error ? e.message : 'Unknown gateway error';\n console.error('[GatewayClient] Gateway resolution failed:', message);\n this.setStatus('error', message);\n throw new Error(message);\n }\n }\n\n /**\n * Abort any in-flight request.\n */\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n }\n\n /**\n * Get current status.\n */\n getStatus(): GatewayStatus {\n return this.status;\n }\n\n /**\n * Get resolved endpoints (null if not yet resolved).\n */\n getEndpoints(): ContentEndpoints | null {\n return this.endpoints;\n }\n\n /**\n * Get error message (null if no error).\n */\n getError(): string | null {\n return this.error;\n }\n\n /**\n * Update configuration and reset state.\n * F2: Also clears cache and in-flight request\n * F3: Resets circuit breaker (new config = fresh start)\n */\n updateConfig(config: Partial<GatewayClientConfig>): void {\n this.abort();\n this.config = { ...this.config, ...config };\n this.endpoints = null;\n this.error = null;\n // F2: Clear cache and in-flight tracking\n this.cacheTimestamp = 0;\n this.inFlightRequest = null;\n // F3: Reset circuit breaker for new config\n this.resetCircuitBreaker();\n this.setStatus('idle');\n }\n\n /**\n * Clean up resources.\n */\n destroy(): void {\n this.abort();\n this.removeAllListeners();\n }\n\n private setStatus(status: GatewayStatus, error?: string): void {\n this.status = status;\n this.error = error ?? null;\n this.emit('statusChange', { status, error });\n }\n}\n\nexport default GatewayClient;\n","/**\n * TimerManager - Centralized timer management for memory leak prevention\n *\n * Tracks all setTimeout/setInterval calls and provides bulk cleanup.\n * Based on MistMetaPlayer's MistVideo.timers pattern.\n *\n * Usage:\n * ```ts\n * const timers = new TimerManager();\n *\n * // Start a timeout\n * const id = timers.start(() => console.log('fired'), 1000);\n *\n * // Start an interval\n * const intervalId = timers.startInterval(() => console.log('tick'), 500);\n *\n * // Stop a specific timer\n * timers.stop(id);\n *\n * // Stop all timers (on cleanup/destroy)\n * timers.stopAll();\n * ```\n */\n\ninterface TimerEntry {\n /** Timer ID from setTimeout/setInterval */\n id: ReturnType<typeof setTimeout>;\n /** Expected end time (for timeouts) */\n endTime: number;\n /** Whether this is an interval */\n isInterval: boolean;\n /** Optional label for debugging */\n label?: string;\n}\n\nexport class TimerManager {\n private timers: Map<number, TimerEntry> = new Map();\n private nextId = 1;\n private debug: boolean;\n\n constructor(options?: { debug?: boolean }) {\n this.debug = options?.debug ?? false;\n }\n\n /**\n * Start a timeout\n * @param callback Function to call after delay\n * @param delay Delay in milliseconds\n * @param label Optional label for debugging\n * @returns Timer ID (internal, not the native timeout ID)\n */\n start(callback: () => void, delay: number, label?: string): number {\n const internalId = this.nextId++;\n const endTime = Date.now() + delay;\n\n const nativeId = setTimeout(() => {\n this.timers.delete(internalId);\n try {\n callback();\n } catch (e) {\n console.error('[TimerManager] Callback error:', e);\n }\n }, delay);\n\n this.timers.set(internalId, {\n id: nativeId,\n endTime,\n isInterval: false,\n label,\n });\n\n if (this.debug) {\n console.debug(`[TimerManager] Started timeout ${internalId}${label ? ` (${label})` : ''} for ${delay}ms`);\n }\n\n return internalId;\n }\n\n /**\n * Start an interval\n * @param callback Function to call repeatedly\n * @param interval Interval in milliseconds\n * @param label Optional label for debugging\n * @returns Timer ID (internal, not the native interval ID)\n */\n startInterval(callback: () => void, interval: number, label?: string): number {\n const internalId = this.nextId++;\n\n const nativeId = setInterval(() => {\n try {\n callback();\n } catch (e) {\n console.error('[TimerManager] Interval callback error:', e);\n }\n }, interval);\n\n this.timers.set(internalId, {\n id: nativeId,\n endTime: Infinity, // Intervals don't have an end time\n isInterval: true,\n label,\n });\n\n if (this.debug) {\n console.debug(`[TimerManager] Started interval ${internalId}${label ? ` (${label})` : ''} every ${interval}ms`);\n }\n\n return internalId;\n }\n\n /**\n * Stop a specific timer\n * @param internalId The timer ID returned by start() or startInterval()\n */\n stop(internalId: number): boolean {\n const entry = this.timers.get(internalId);\n if (!entry) {\n return false;\n }\n\n if (entry.isInterval) {\n clearInterval(entry.id);\n } else {\n clearTimeout(entry.id);\n }\n\n this.timers.delete(internalId);\n\n if (this.debug) {\n console.debug(`[TimerManager] Stopped ${entry.isInterval ? 'interval' : 'timeout'} ${internalId}${entry.label ? ` (${entry.label})` : ''}`);\n }\n\n return true;\n }\n\n /**\n * Stop all active timers\n * Call this on component unmount/destroy to prevent memory leaks\n */\n stopAll(): void {\n const count = this.timers.size;\n\n for (const [internalId, entry] of this.timers) {\n if (entry.isInterval) {\n clearInterval(entry.id);\n } else {\n clearTimeout(entry.id);\n }\n }\n\n this.timers.clear();\n\n if (this.debug && count > 0) {\n console.debug(`[TimerManager] Stopped all ${count} timers`);\n }\n }\n\n /**\n * Get count of active timers\n */\n get activeCount(): number {\n return this.timers.size;\n }\n\n /**\n * Check if a timer is active\n */\n isActive(internalId: number): boolean {\n return this.timers.has(internalId);\n }\n\n /**\n * Get remaining time for a timeout (0 for intervals or expired)\n */\n getRemainingTime(internalId: number): number {\n const entry = this.timers.get(internalId);\n if (!entry || entry.isInterval) {\n return 0;\n }\n return Math.max(0, entry.endTime - Date.now());\n }\n\n /**\n * Get debug info about all active timers\n */\n getDebugInfo(): Array<{ id: number; type: 'timeout' | 'interval'; label?: string; remainingMs?: number }> {\n const info: Array<{ id: number; type: 'timeout' | 'interval'; label?: string; remainingMs?: number }> = [];\n\n for (const [internalId, entry] of this.timers) {\n info.push({\n id: internalId,\n type: entry.isInterval ? 'interval' : 'timeout',\n label: entry.label,\n remainingMs: entry.isInterval ? undefined : Math.max(0, entry.endTime - Date.now()),\n });\n }\n\n return info;\n }\n\n /**\n * Cleanup - alias for stopAll()\n */\n destroy(): void {\n this.stopAll();\n }\n}\n\nexport default TimerManager;\n","/**\n * StreamStateClient.ts\n *\n * Framework-agnostic client for polling MistServer stream status via WebSocket or HTTP.\n * Extracted from useStreamState.ts for use in headless core.\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport { TimerManager } from './TimerManager';\nimport type { StreamState, StreamStatus, MistStreamInfo } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface StreamStateClientConfig {\n /** MistServer base URL (e.g., https://mist.example.com) */\n mistBaseUrl: string;\n /** Stream name to poll */\n streamName: string;\n /** Poll interval in ms for HTTP fallback (default: 3000) */\n pollInterval?: number;\n /** Use WebSocket if available (default: true) */\n useWebSocket?: boolean;\n}\n\ntype StreamStateClientResolvedConfig = Omit<\n StreamStateClientConfig,\n 'pollInterval' | 'useWebSocket'\n> & {\n pollInterval: number;\n useWebSocket: boolean;\n};\n\nexport interface StreamStateClientEvents {\n /** Emitted when stream state changes */\n stateChange: { state: StreamState };\n /** Emitted when stream comes online */\n online: void;\n /** Emitted when stream goes offline */\n offline: void;\n /** Emitted on connection error */\n error: { error: string };\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_POLL_INTERVAL = 3000;\n\nconst initialState: StreamState = {\n status: 'OFFLINE',\n isOnline: false,\n message: 'Connecting...',\n lastUpdate: 0,\n};\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Parse MistServer error string into StreamStatus enum.\n */\nfunction parseErrorToStatus(error: string): StreamStatus {\n const lowerError = error.toLowerCase();\n\n if (lowerError.includes('offline')) return 'OFFLINE';\n if (lowerError.includes('initializing')) return 'INITIALIZING';\n if (lowerError.includes('booting')) return 'BOOTING';\n if (lowerError.includes('waiting for data')) return 'WAITING_FOR_DATA';\n if (lowerError.includes('shutting down')) return 'SHUTTING_DOWN';\n if (lowerError.includes('invalid')) return 'INVALID';\n\n return 'ERROR';\n}\n\n/**\n * Get human-readable message for stream status.\n */\nfunction getStatusMessage(status: StreamStatus, percentage?: number): string {\n switch (status) {\n case 'ONLINE':\n return 'Stream is online';\n case 'OFFLINE':\n return 'Stream is offline';\n case 'INITIALIZING':\n return percentage !== undefined\n ? `Initializing... ${Math.round(percentage * 10) / 10}%`\n : 'Stream is initializing';\n case 'BOOTING':\n return 'Stream is starting up';\n case 'WAITING_FOR_DATA':\n return 'Waiting for stream data';\n case 'SHUTTING_DOWN':\n return 'Stream is shutting down';\n case 'INVALID':\n return 'Stream status is invalid';\n case 'ERROR':\n default:\n return 'Stream error';\n }\n}\n\n// ============================================================================\n// StreamStateClient Class\n// ============================================================================\n\n/**\n * Client for polling MistServer stream status via WebSocket or HTTP.\n *\n * @example\n * ```typescript\n * const client = new StreamStateClient({\n * mistBaseUrl: 'https://mist.example.com',\n * streamName: 'my-stream',\n * });\n *\n * client.on('stateChange', ({ state }) => console.log('State:', state));\n * client.on('online', () => console.log('Stream is online!'));\n * client.on('offline', () => console.log('Stream is offline'));\n *\n * client.start();\n * // ...later\n * client.stop();\n * ```\n */\nexport class StreamStateClient extends TypedEventEmitter<StreamStateClientEvents> {\n private config: StreamStateClientResolvedConfig;\n private state: StreamState = { ...initialState };\n private ws: WebSocket | null = null;\n private timers = new TimerManager();\n private isRunning: boolean = false;\n private wasOnline: boolean = false;\n private connectionId: number = 0; // Track connection attempts to prevent stale callbacks\n\n // Debounce time for rapid mount/unmount cycles (ms)\n private static readonly CONNECTION_DEBOUNCE_MS = 100;\n\n constructor(config: StreamStateClientConfig) {\n super();\n this.config = {\n pollInterval: DEFAULT_POLL_INTERVAL,\n useWebSocket: true,\n ...config,\n };\n }\n\n /**\n * Start polling/WebSocket connection.\n * Always does initial HTTP poll to get full stream info (including sources),\n * then connects WebSocket for real-time status updates.\n *\n * Debounced to prevent orphaned connections during rapid mount/unmount cycles.\n */\n start(): void {\n if (this.isRunning) return;\n this.isRunning = true;\n\n const { mistBaseUrl, streamName, useWebSocket } = this.config;\n\n if (!mistBaseUrl || !streamName) {\n console.warn('[StreamStateClient] Missing mistBaseUrl or streamName');\n return;\n }\n\n // Reset state\n this.setState({\n ...initialState,\n message: 'Connecting...',\n lastUpdate: Date.now(),\n });\n\n // Increment connection ID to invalidate any pending callbacks from previous attempts\n const currentConnectionId = ++this.connectionId;\n\n // Debounce connection to prevent rapid reconnects during mount/unmount cycles\n this.timers.start(() => {\n // Check if this connection attempt is still valid\n if (!this.isRunning || this.connectionId !== currentConnectionId) {\n return;\n }\n\n // Always do initial HTTP poll to get full data (including sources)\n // Then connect WebSocket for real-time updates\n this.pollHttp().then(() => {\n // Verify still valid before WebSocket connection\n if (useWebSocket && this.isRunning && this.connectionId === currentConnectionId) {\n this.connectWebSocket();\n }\n });\n }, StreamStateClient.CONNECTION_DEBOUNCE_MS, 'connect');\n }\n\n /**\n * Stop polling and close connections.\n */\n stop(): void {\n this.isRunning = false;\n\n // Close WebSocket\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n // Clear all timers\n this.timers.destroy();\n }\n\n /**\n * Manual refresh - trigger an immediate poll.\n */\n refresh(): void {\n if (this.config.useWebSocket && this.ws?.readyState === WebSocket.OPEN) {\n // WebSocket will receive updates automatically\n return;\n }\n this.pollHttp();\n }\n\n /**\n * Get the underlying WebSocket connection (for MistReporter integration).\n * Returns null if WebSocket is not connected.\n */\n getSocket(): WebSocket | null {\n return this.ws;\n }\n\n /**\n * Check if the WebSocket is connected and ready.\n */\n isSocketReady(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get current stream state.\n */\n getState(): StreamState {\n return { ...this.state };\n }\n\n /**\n * Check if stream is online.\n */\n isOnline(): boolean {\n return this.state.isOnline;\n }\n\n /**\n * Update configuration (stops and restarts if running).\n */\n updateConfig(config: Partial<StreamStateClientConfig>): void {\n const wasRunning = this.isRunning;\n this.stop();\n this.config = { ...this.config, ...config };\n if (wasRunning) {\n this.start();\n }\n }\n\n /**\n * Clean up resources.\n */\n destroy(): void {\n this.stop();\n this.removeAllListeners();\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private connectWebSocket(): void {\n if (!this.isRunning) return;\n\n const { mistBaseUrl, streamName } = this.config;\n\n // Clean up existing connection\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n try {\n // Convert http(s) to ws(s)\n const wsUrl = mistBaseUrl\n .replace(/^http:/, 'ws:')\n .replace(/^https:/, 'wss:')\n .replace(/\\/$/, '');\n\n const ws = new WebSocket(`${wsUrl}/json_${encodeURIComponent(streamName)}.js`);\n this.ws = ws;\n\n ws.onopen = () => {\n console.debug('[StreamStateClient] WebSocket connected');\n };\n\n ws.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data) as MistStreamInfo;\n this.processStreamInfo(data);\n } catch (e) {\n console.warn('[StreamStateClient] Failed to parse WebSocket message:', e);\n }\n };\n\n ws.onerror = () => {\n console.warn('[StreamStateClient] WebSocket error, falling back to HTTP polling');\n ws.close();\n };\n\n ws.onclose = () => {\n this.ws = null;\n\n if (!this.isRunning) return;\n\n // Disable WebSocket and switch to HTTP polling\n // This ensures pollHttp() schedules repeat polls (see line 365 condition)\n this.config.useWebSocket = false;\n console.debug('[StreamStateClient] WebSocket closed, switching to HTTP polling');\n this.pollHttp();\n };\n } catch (error) {\n console.warn('[StreamStateClient] WebSocket connection failed:', error);\n // Disable WebSocket and switch to HTTP polling\n this.config.useWebSocket = false;\n this.pollHttp();\n }\n }\n\n private async pollHttp(): Promise<void> {\n if (!this.isRunning) return;\n\n const { mistBaseUrl, streamName, pollInterval } = this.config;\n\n try {\n const url = `${mistBaseUrl.replace(/\\/$/, '')}/json_${encodeURIComponent(streamName)}.js`;\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n // MistServer returns JSON with potential JSONP wrapper\n let text = await response.text();\n // Strip JSONP callback if present\n const jsonpMatch = text.match(/^[^(]+\\(([\\s\\S]*)\\);?$/);\n if (jsonpMatch) {\n text = jsonpMatch[1];\n }\n\n const data = JSON.parse(text) as MistStreamInfo;\n this.processStreamInfo(data);\n } catch (error) {\n if (!this.isRunning) return;\n\n const errorMessage = error instanceof Error ? error.message : 'Connection failed';\n this.setState({\n ...this.state,\n status: 'ERROR',\n isOnline: false,\n message: errorMessage,\n lastUpdate: Date.now(),\n error: errorMessage,\n });\n this.emit('error', { error: errorMessage });\n }\n\n // Schedule next poll\n if (this.isRunning && !this.config.useWebSocket) {\n this.timers.start(() => this.pollHttp(), pollInterval, 'poll');\n }\n }\n\n private processStreamInfo(data: MistStreamInfo): void {\n if (!this.isRunning) return;\n\n let newState: StreamState;\n\n if (data.error) {\n // Stream has an error state - preserve existing streamInfo\n const status = parseErrorToStatus(data.error);\n const message = data.on_error || getStatusMessage(status, data.perc);\n\n newState = {\n status,\n isOnline: false,\n message,\n percentage: data.perc,\n lastUpdate: Date.now(),\n error: data.error,\n streamInfo: this.state.streamInfo, // Preserve existing source/tracks\n };\n } else {\n // Stream is online with valid metadata\n // Merge new data with existing streamInfo to preserve source/tracks from initial fetch\n // WebSocket updates may not include source array\n const mergedStreamInfo: MistStreamInfo = {\n ...this.state.streamInfo, // Keep existing source/meta if present\n ...data, // Override with new data\n // Explicitly preserve source if not in new data\n source: data.source || this.state.streamInfo?.source,\n // Merge meta to preserve tracks\n meta: {\n ...this.state.streamInfo?.meta,\n ...data.meta,\n // Preserve tracks if not in new data\n tracks: data.meta?.tracks || this.state.streamInfo?.meta?.tracks,\n },\n };\n\n newState = {\n status: 'ONLINE',\n isOnline: true,\n message: 'Stream is online',\n lastUpdate: Date.now(),\n streamInfo: mergedStreamInfo,\n };\n }\n\n this.setState(newState);\n\n // Emit online/offline events on state transitions\n if (newState.isOnline && !this.wasOnline) {\n this.emit('online', undefined as never);\n } else if (!newState.isOnline && this.wasOnline) {\n this.emit('offline', undefined as never);\n }\n this.wasOnline = newState.isOnline;\n }\n\n private setState(state: StreamState): void {\n const prevState = this.state;\n this.state = state;\n\n // Emit if ANY state field changed - including streamInfo (track data)\n // Previously only checked status/isOnline/message, causing track updates to be lost\n const hasChanged =\n prevState.status !== state.status ||\n prevState.isOnline !== state.isOnline ||\n prevState.message !== state.message ||\n prevState.streamInfo !== state.streamInfo ||\n prevState.lastUpdate !== state.lastUpdate;\n\n if (hasChanged) {\n this.emit('stateChange', { state });\n }\n }\n}\n\nexport default StreamStateClient;\n","/**\n * Common Player Interface\n * \n * All player implementations must implement this interface to ensure\n * consistent behavior and enable the PlayerManager selection system\n */\n\nexport interface StreamSource {\n url: string;\n type: string;\n index?: number;\n streamName?: string;\n mistPlayerUrl?: string;\n}\n\nexport interface StreamTrack {\n type: 'video' | 'audio' | 'meta';\n codec: string;\n codecstring?: string;\n init?: string;\n /** Track index from MistServer (used for binary chunk routing) */\n idx?: number;\n // Video-specific\n width?: number;\n height?: number;\n fpks?: number; // frames per kilosecond\n // Audio-specific\n channels?: number;\n rate?: number; // sample rate\n size?: number; // bits per sample\n}\n\nexport interface StreamInfo {\n source: StreamSource[];\n meta: {\n tracks: StreamTrack[];\n };\n type?: 'live' | 'vod';\n}\n\nexport interface PlayerOptions {\n autoplay?: boolean;\n muted?: boolean;\n controls?: boolean;\n loop?: boolean;\n poster?: string;\n width?: number;\n height?: number;\n /** Enable dev mode - for Legacy player, uses MistServer's dev skin with source selection */\n devMode?: boolean;\n onReady?: (element: HTMLVideoElement) => void;\n onError?: (error: string | Error) => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (currentTime: number) => void;\n // New callbacks for buffering/state management\n onWaiting?: () => void;\n onPlaying?: () => void;\n onCanPlay?: () => void;\n onDurationChange?: (duration: number) => void;\n}\n\nexport interface PlayerCapability {\n /** Player name for display */\n name: string;\n /** Unique identifier */\n shortname: string;\n /** Priority (lower number = higher priority) */\n priority: number;\n /** MIME types this player can handle */\n mimes: string[];\n}\n\nexport interface PlayerEvents {\n ready: HTMLVideoElement;\n error: string | Error;\n play: void;\n pause: void;\n ended: void;\n timeupdate: number;\n /** Request to reload the player (e.g., Firefox segment error recovery) */\n reloadrequested: { reason: string };\n /** Seekable range changed */\n seekablechange: { start: number; end: number; bufferWindow: number };\n}\n\n/**\n * Base interface all players must implement\n */\nexport interface IPlayer {\n /** Player metadata */\n readonly capability: PlayerCapability;\n \n /**\n * Check if this player supports the given MIME type\n */\n isMimeSupported(mimetype: string): boolean;\n \n /**\n * Check if this player can play in the current browser environment\n * @param mimetype - MIME type to test\n * @param source - Source information\n * @param streamInfo - Stream metadata\n * @returns false if not supported, true if supported (no track info), \n * or array of supported track types\n */\n isBrowserSupported(\n mimetype: string, \n source: StreamSource, \n streamInfo: StreamInfo\n ): boolean | string[];\n \n /**\n * Initialize the player with given source and options\n * @param container - Container element to render in\n * @param source - Source to play\n * @param options - Player options\n * @param streamInfo - Full stream metadata (optional, for players that need track details)\n * @returns Promise resolving to video element\n */\n initialize(\n container: HTMLElement,\n source: StreamSource,\n options: PlayerOptions,\n streamInfo?: StreamInfo\n ): Promise<HTMLVideoElement>;\n \n /**\n * Clean up and destroy the player.\n * May be async if cleanup requires network requests (e.g., WHEP session DELETE).\n */\n destroy(): void | Promise<void>;\n \n /**\n * Get the underlying video element (if available)\n */\n getVideoElement(): HTMLVideoElement | null;\n \n /**\n * Set video size\n */\n setSize?(width: number, height: number): void;\n \n /**\n * Add event listener\n */\n on<K extends keyof PlayerEvents>(event: K, listener: (data: PlayerEvents[K]) => void): void;\n \n /**\n * Remove event listener\n */\n off<K extends keyof PlayerEvents>(event: K, listener: (data: PlayerEvents[K]) => void): void;\n \n /**\n * Get current playback state\n */\n getCurrentTime?(): number;\n getDuration?(): number;\n isPaused?(): boolean;\n isMuted?(): boolean;\n /** Optional: provide an override seekable range (seconds) */\n getSeekableRange?(): { start: number; end: number } | null;\n /** Optional: provide buffered ranges override */\n getBufferedRanges?(): TimeRanges | null;\n \n /**\n * Control playback\n */\n play?(): Promise<void>;\n pause?(): void;\n seek?(time: number): void;\n setVolume?(volume: number): void;\n setMuted?(muted: boolean): void;\n setPlaybackRate?(rate: number): void;\n\n // Optional: captions/text tracks\n getTextTracks?(): Array<{ id: string; label: string; lang?: string; active: boolean }>;\n selectTextTrack?(id: string | null): void;\n\n // Optional: quality/level selection\n getQualities?(): Array<{ id: string; label: string; bitrate?: number; width?: number; height?: number; isAuto?: boolean; active?: boolean }>;\n selectQuality?(id: string): void; // use 'auto' to enable ABR\n getCurrentQuality?(): string | null;\n\n // Optional: live edge helpers\n isLive?(): boolean;\n jumpToLive?(): void;\n\n // Optional: PiP\n requestPiP?(): Promise<void>;\n\n /**\n * Optional: Retrieve player-specific stats (e.g., WebRTC inbound-rtp)\n */\n getStats?(): Promise<any>;\n\n /**\n * Optional: Retrieve approximate playback latency stats\n */\n getLatency?(): Promise<any>;\n}\n\n/**\n * Base class providing common functionality\n */\nexport abstract class BasePlayer implements IPlayer {\n abstract readonly capability: PlayerCapability;\n \n protected listeners: Map<string, Set<Function>> = new Map();\n protected videoElement: HTMLVideoElement | null = null;\n \n abstract isMimeSupported(mimetype: string): boolean;\n abstract isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[];\n abstract initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions, streamInfo?: StreamInfo): Promise<HTMLVideoElement>;\n abstract destroy(): void | Promise<void>;\n \n getVideoElement(): HTMLVideoElement | null {\n return this.videoElement;\n }\n \n on<K extends keyof PlayerEvents>(event: K, listener: (data: PlayerEvents[K]) => void): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n }\n \n off<K extends keyof PlayerEvents>(event: K, listener: (data: PlayerEvents[K]) => void): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n eventListeners.delete(listener);\n }\n }\n \n protected emit<K extends keyof PlayerEvents>(event: K, data: PlayerEvents[K]): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n eventListeners.forEach(listener => {\n try {\n listener(data);\n } catch (e) {\n console.error(`Error in ${event} listener:`, e);\n }\n });\n }\n }\n \n protected setupVideoEventListeners(video: HTMLVideoElement, options: PlayerOptions): void {\n const handleEvent = (eventName: keyof PlayerEvents, handler: () => void) => {\n const listener = () => {\n handler();\n this.emit(eventName as any, undefined as any);\n };\n video.addEventListener(eventName, listener);\n };\n\n // Core playback events\n handleEvent('play', () => options.onPlay?.());\n handleEvent('pause', () => options.onPause?.());\n handleEvent('ended', () => options.onEnded?.());\n\n // Buffering/state events (previously duplicated in Player.tsx onReady)\n video.addEventListener('waiting', () => options.onWaiting?.());\n video.addEventListener('playing', () => options.onPlaying?.());\n video.addEventListener('canplay', () => options.onCanPlay?.());\n\n video.addEventListener('durationchange', () => {\n options.onDurationChange?.(video.duration);\n });\n\n video.addEventListener('timeupdate', () => {\n const currentTime = video.currentTime;\n options.onTimeUpdate?.(currentTime);\n this.emit('timeupdate', currentTime);\n });\n\n video.addEventListener('error', () => {\n const error = video.error ?\n `Video error: ${video.error.message}` :\n 'Unknown video error';\n options.onError?.(error);\n this.emit('error', error);\n });\n\n // Call onReady LAST - after all listeners are attached\n // This prevents race conditions where events fire before handlers exist\n this.emit('ready', video);\n if (options.onReady) {\n options.onReady(video);\n }\n }\n \n // Default implementations for optional methods\n getCurrentTime(): number {\n return this.videoElement?.currentTime || 0;\n }\n \n getDuration(): number {\n return this.videoElement?.duration || 0;\n }\n\n getSeekableRange(): { start: number; end: number } | null {\n return null;\n }\n\n getBufferedRanges(): TimeRanges | null {\n return this.videoElement?.buffered ?? null;\n }\n \n isPaused(): boolean {\n return this.videoElement?.paused ?? true;\n }\n \n isMuted(): boolean {\n return this.videoElement?.muted ?? false;\n }\n \n async play(): Promise<void> {\n if (this.videoElement) {\n return this.videoElement.play();\n }\n }\n \n pause(): void {\n this.videoElement?.pause();\n }\n \n seek(time: number): void {\n if (this.videoElement) {\n this.videoElement.currentTime = time;\n }\n }\n \n setVolume(volume: number): void {\n if (this.videoElement) {\n this.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n }\n \n setMuted(muted: boolean): void {\n if (this.videoElement) {\n this.videoElement.muted = muted;\n }\n }\n setPlaybackRate(rate: number): void {\n if (this.videoElement) {\n this.videoElement.playbackRate = rate;\n }\n }\n \n // Default captions/text tracks using native TextTrack API\n getTextTracks(): Array<{ id: string; label: string; lang?: string; active: boolean }> {\n const video = this.videoElement;\n if (!video || !video.textTracks) return [];\n const out: Array<{ id: string; label: string; lang?: string; active: boolean }> = [];\n const list = video.textTracks as any as TextTrackList;\n for (let i = 0; i < list.length; i++) {\n const tt = list[i];\n out.push({ id: String(i), label: tt.label || `CC ${i+1}`, lang: (tt as any).language, active: tt.mode === 'showing' });\n }\n return out;\n }\n\n selectTextTrack(id: string | null): void {\n const video = this.videoElement;\n if (!video || !video.textTracks) return;\n const list = video.textTracks as any as TextTrackList;\n for (let i = 0; i < list.length; i++) {\n const tt = list[i];\n if (id !== null && String(i) === id) {\n tt.mode = 'showing';\n } else {\n tt.mode = 'disabled';\n }\n }\n }\n\n // Default live helpers\n isLive(): boolean {\n const v = this.videoElement;\n if (!v) return false;\n return !isFinite(v.duration) || v.duration === Infinity;\n }\n\n jumpToLive(): void {\n const v = this.videoElement;\n if (!v) return;\n const seekable = v.seekable;\n if (seekable && seekable.length > 0) {\n try { v.currentTime = seekable.end(seekable.length - 1); } catch {}\n }\n }\n\n // Default PiP helper\n async requestPiP(): Promise<void> {\n const v: any = this.videoElement as any;\n if (!v) return;\n // Exit if already in PiP\n if (document.pictureInPictureElement === v) {\n try { await (document as any).exitPictureInPicture?.(); } catch {}\n return;\n }\n try {\n if (v.requestPictureInPicture) {\n await v.requestPictureInPicture();\n } else if (v.webkitSetPresentationMode) {\n v.webkitSetPresentationMode('picture-in-picture');\n }\n } catch {}\n }\n \n setSize(width: number, height: number): void {\n if (this.videoElement) {\n this.videoElement.style.width = `${width}px`;\n this.videoElement.style.height = `${height}px`;\n }\n }\n\n // Default optional stats methods\n async getStats(): Promise<any> {\n return undefined;\n }\n\n async getLatency(): Promise<any> {\n return undefined;\n }\n}\n","/**\n * LiveDurationProxy - Wraps video element to provide meaningful duration for live streams\n *\n * Live streams report `Infinity` or `NaN` for duration, breaking seek bars and time display.\n * This proxy intercepts the duration getter and returns a calculated value based on:\n * - Buffer end position\n * - Elapsed time since last progress event\n *\n * Based on MistMetaPlayer reference implementation (wrappers/html5.js, dashjs.js)\n */\n\nexport interface LiveDurationProxyOptions {\n /** Whether to constrain seeking to buffered range (default: true) */\n constrainSeek?: boolean;\n /** Live offset from buffer end in seconds (default: 0) */\n liveOffset?: number;\n /** Callback when duration changes */\n onDurationChange?: (duration: number) => void;\n}\n\nexport interface LiveDurationState {\n /** Calculated duration */\n duration: number;\n /** Whether stream is live */\n isLive: boolean;\n /** Buffer end position */\n bufferEnd: number;\n /** Time since last progress */\n elapsed: number;\n}\n\n/**\n * Creates a proxy wrapper around a video element that provides meaningful\n * duration values for live streams.\n */\nexport class LiveDurationProxy {\n private video: HTMLVideoElement;\n private options: Required<LiveDurationProxyOptions>;\n private lastProgressTime: number = 0;\n private lastBufferEnd: number = 0;\n private listeners: Array<() => void> = [];\n private _calculatedDuration: number = 0;\n\n constructor(video: HTMLVideoElement, options: LiveDurationProxyOptions = {}) {\n this.video = video;\n this.options = {\n constrainSeek: options.constrainSeek ?? true,\n liveOffset: options.liveOffset ?? 0,\n onDurationChange: options.onDurationChange ?? (() => {}),\n };\n\n this.setupListeners();\n this.updateDuration();\n }\n\n /**\n * Check if the stream is live\n */\n isLive(): boolean {\n const nativeDuration = this.video.duration;\n return !isFinite(nativeDuration) || nativeDuration === Infinity;\n }\n\n /**\n * Get the calculated duration\n * For live: bufferEnd + elapsedSinceLastProgress\n * For VOD: native duration\n */\n getDuration(): number {\n if (!this.isLive()) {\n return this.video.duration;\n }\n return this._calculatedDuration;\n }\n\n /**\n * Get the current buffer end position\n */\n getBufferEnd(): number {\n const buffered = this.video.buffered;\n if (buffered.length === 0) return 0;\n\n // Find the buffer range containing current time, or the last one\n for (let i = 0; i < buffered.length; i++) {\n if (buffered.start(i) <= this.video.currentTime && buffered.end(i) > this.video.currentTime) {\n return buffered.end(i);\n }\n }\n\n // Return the end of the last buffer range\n return buffered.end(buffered.length - 1);\n }\n\n /**\n * Get the live edge position (where live is)\n */\n getLiveEdge(): number {\n return this.getBufferEnd() - this.options.liveOffset;\n }\n\n /**\n * Get the current latency (distance from live edge)\n */\n getLatency(): number {\n if (!this.isLive()) return 0;\n return Math.max(0, this.getLiveEdge() - this.video.currentTime);\n }\n\n /**\n * Seek to a position, respecting live constraints\n */\n seek(time: number): void {\n if (!this.isLive() || !this.options.constrainSeek) {\n this.video.currentTime = time;\n return;\n }\n\n // Constrain to buffered range for live\n const buffered = this.video.buffered;\n if (buffered.length === 0) {\n this.video.currentTime = time;\n return;\n }\n\n // Find valid seek range\n const bufferStart = buffered.start(0);\n const bufferEnd = this.getBufferEnd();\n const liveEdge = this.getLiveEdge();\n\n // Clamp to valid range\n const clampedTime = Math.max(bufferStart, Math.min(time, liveEdge));\n this.video.currentTime = clampedTime;\n }\n\n /**\n * Jump to live edge\n */\n jumpToLive(): void {\n if (!this.isLive()) return;\n this.video.currentTime = this.getLiveEdge();\n }\n\n /**\n * Check if currently at live edge (within threshold)\n */\n isAtLiveEdge(threshold: number = 2): boolean {\n if (!this.isLive()) return false;\n return this.getLatency() <= threshold;\n }\n\n /**\n * Get current state\n */\n getState(): LiveDurationState {\n return {\n duration: this.getDuration(),\n isLive: this.isLive(),\n bufferEnd: this.getBufferEnd(),\n elapsed: this.lastProgressTime > 0 ? (Date.now() - this.lastProgressTime) / 1000 : 0,\n };\n }\n\n /**\n * Update the calculated duration\n */\n private updateDuration(): void {\n if (!this.isLive()) {\n this._calculatedDuration = this.video.duration;\n return;\n }\n\n const bufferEnd = this.getBufferEnd();\n const now = Date.now();\n const elapsedSinceProgress = this.lastProgressTime > 0\n ? (now - this.lastProgressTime) / 1000\n : 0;\n\n // MistPlayer formula: buffer_end + elapsed_since_last_progress\n const newDuration = bufferEnd + elapsedSinceProgress;\n\n // Only update if changed significantly (avoid constant updates)\n if (Math.abs(newDuration - this._calculatedDuration) > 0.1) {\n this._calculatedDuration = newDuration;\n this.options.onDurationChange(newDuration);\n }\n\n this.lastBufferEnd = bufferEnd;\n }\n\n /**\n * Setup event listeners for tracking\n */\n private setupListeners(): void {\n const onProgress = () => {\n this.lastProgressTime = Date.now();\n this.updateDuration();\n };\n\n const onTimeUpdate = () => {\n this.updateDuration();\n };\n\n const onDurationChange = () => {\n this.updateDuration();\n };\n\n const onLoadedMetadata = () => {\n this.updateDuration();\n };\n\n this.video.addEventListener('progress', onProgress);\n this.video.addEventListener('timeupdate', onTimeUpdate);\n this.video.addEventListener('durationchange', onDurationChange);\n this.video.addEventListener('loadedmetadata', onLoadedMetadata);\n\n this.listeners = [\n () => this.video.removeEventListener('progress', onProgress),\n () => this.video.removeEventListener('timeupdate', onTimeUpdate),\n () => this.video.removeEventListener('durationchange', onDurationChange),\n () => this.video.removeEventListener('loadedmetadata', onLoadedMetadata),\n ];\n }\n\n /**\n * Cleanup\n */\n destroy(): void {\n this.listeners.forEach(cleanup => cleanup());\n this.listeners = [];\n }\n}\n\n/**\n * Create a Proxy wrapper for a video element that intercepts duration/currentTime\n * This allows existing code to work transparently with live streams.\n *\n * Note: This is an advanced feature - for most cases, use LiveDurationProxy directly.\n */\nexport function createLiveVideoProxy(\n video: HTMLVideoElement,\n options: LiveDurationProxyOptions = {}\n): { proxy: HTMLVideoElement; controller: LiveDurationProxy } {\n const controller = new LiveDurationProxy(video, options);\n\n const proxy = new Proxy(video, {\n get(target, prop, receiver) {\n if (prop === 'duration') {\n return controller.getDuration();\n }\n\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n },\n\n set(target, prop, value, receiver) {\n if (prop === 'currentTime' && controller.isLive()) {\n controller.seek(value as number);\n return true;\n }\n return Reflect.set(target, prop, value, receiver);\n },\n });\n\n return { proxy: proxy as HTMLVideoElement, controller };\n}\n\nexport default LiveDurationProxy;\n","/**\n * UrlUtils - URL manipulation utilities\n *\n * Based on MistMetaPlayer's urlappend functionality.\n * Provides helpers for appending query parameters to URLs.\n */\n\n/**\n * Append query parameters to a URL\n * Handles URLs that already have query parameters\n *\n * @param url - Base URL\n * @param params - Parameters to append (string or object)\n * @returns URL with appended parameters\n *\n * @example\n * ```ts\n * appendUrlParams('https://example.com/video.m3u8', 'token=abc&session=123')\n * // => 'https://example.com/video.m3u8?token=abc&session=123'\n *\n * appendUrlParams('https://example.com/video.m3u8?existing=param', 'token=abc')\n * // => 'https://example.com/video.m3u8?existing=param&token=abc'\n *\n * appendUrlParams('https://example.com/video.m3u8', { token: 'abc', session: '123' })\n * // => 'https://example.com/video.m3u8?token=abc&session=123'\n * ```\n */\nexport function appendUrlParams(\n url: string,\n params: string | Record<string, string | number | boolean | undefined | null>\n): string {\n if (!params) {\n return url;\n }\n\n // Convert object to query string\n let queryString: string;\n if (typeof params === 'object') {\n const entries = Object.entries(params)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n\n if (entries.length === 0) {\n return url;\n }\n queryString = entries.join('&');\n } else {\n queryString = params;\n // Strip leading ? or & if present\n if (queryString.startsWith('?') || queryString.startsWith('&')) {\n queryString = queryString.slice(1);\n }\n }\n\n if (!queryString) {\n return url;\n }\n\n // Determine separator (? or &)\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${queryString}`;\n}\n\n/**\n * Parse query parameters from a URL\n *\n * @param url - URL to parse\n * @returns Object with query parameters\n */\nexport function parseUrlParams(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n\n try {\n const urlObj = new URL(url);\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n } catch {\n // If URL parsing fails, try manual parsing\n const queryIndex = url.indexOf('?');\n if (queryIndex === -1) {\n return params;\n }\n\n const queryString = url.slice(queryIndex + 1);\n const pairs = queryString.split('&');\n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (key) {\n params[decodeURIComponent(key)] = value ? decodeURIComponent(value) : '';\n }\n }\n }\n\n return params;\n}\n\n/**\n * Remove query parameters from a URL\n *\n * @param url - URL to strip\n * @returns URL without query parameters\n */\nexport function stripUrlParams(url: string): string {\n const queryIndex = url.indexOf('?');\n return queryIndex === -1 ? url : url.slice(0, queryIndex);\n}\n\n/**\n * Build a URL with query parameters\n *\n * @param baseUrl - Base URL\n * @param params - Query parameters\n * @returns Complete URL\n */\nexport function buildUrl(baseUrl: string, params: Record<string, string | number | boolean | undefined | null>): string {\n return appendUrlParams(stripUrlParams(baseUrl), params);\n}\n\n/**\n * Check if URL uses secure protocol (https/wss)\n */\nexport function isSecureUrl(url: string): boolean {\n return url.startsWith('https://') || url.startsWith('wss://');\n}\n\n/**\n * Convert HTTP URL to WebSocket URL\n * http:// -> ws://\n * https:// -> wss://\n */\nexport function httpToWs(url: string): string {\n return url.replace(/^http/, 'ws');\n}\n\n/**\n * Convert WebSocket URL to HTTP URL\n * ws:// -> http://\n * wss:// -> https://\n */\nexport function wsToHttp(url: string): string {\n return url.replace(/^ws/, 'http');\n}\n\n/**\n * Ensure URL uses the same protocol as the current page\n * Useful for avoiding mixed content issues\n */\nexport function matchPageProtocol(url: string): string {\n if (typeof window === 'undefined') {\n return url;\n }\n\n const pageIsSecure = window.location.protocol === 'https:';\n const urlIsSecure = isSecureUrl(url);\n\n if (pageIsSecure && !urlIsSecure) {\n // Upgrade to secure\n return url.replace(/^http:/, 'https:').replace(/^ws:/, 'wss:');\n }\n\n if (!pageIsSecure && urlIsSecure) {\n // Downgrade to insecure (not recommended, but avoids issues)\n return url.replace(/^https:/, 'http:').replace(/^wss:/, 'ws:');\n }\n\n return url;\n}\n\nexport default {\n appendUrlParams,\n parseUrlParams,\n stripUrlParams,\n buildUrl,\n isSecureUrl,\n httpToWs,\n wsToHttp,\n matchPageProtocol,\n};\n","import { BasePlayer } from '../core/PlayerInterface';\nimport { LiveDurationProxy } from '../core/LiveDurationProxy';\nimport { appendUrlParams, parseUrlParams, stripUrlParams } from '../core/UrlUtils';\nimport { checkProtocolMismatch, getBrowserInfo, checkWebRTCCodecCompatibility } from '../core/detector';\nimport type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../core/PlayerInterface';\n\n/**\n * Native Player Implementation\n *\n * Handles direct playback using native browser APIs:\n * - HTML5 video element for direct media\n * - WHEP (WebRTC HTTP Egress Protocol) for WebRTC streams\n *\n * Ported from reference html5.js with:\n * - Live duration proxy for meaningful seek bar\n * - Auto-recovery on long pause (reload after 5s)\n * - MP3 seeking restriction\n * - Dynamic source switching via setSource()\n */\nexport class NativePlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: \"Native Player\",\n shortname: \"native\",\n priority: 1, // Highest priority as it's most compatible\n mimes: [\n \"html5/video/mp4\",\n \"html5/video/webm\",\n \"html5/video/ogg\",\n \"html5/audio/mp3\",\n \"html5/audio/webm\",\n \"html5/audio/ogg\",\n \"html5/audio/wav\",\n \"html5/application/vnd.apple.mpegurl\", // Native HLS on Safari/iOS\n \"html5/application/vnd.apple.mpegurl;version=7\",\n \"whep\"\n ]\n };\n\n private peerConnection: RTCPeerConnection | null = null;\n private sessionUrl: string | null = null;\n private lastInboundStats: any = null;\n private reconnectEnabled = false;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 3;\n private reconnectTimer: any = null;\n private currentWhepUrl: string | null = null;\n private currentHeaders: Record<string,string> | null = null;\n private currentIceServers: RTCIceServer[] | null = null;\n private container: HTMLElement | null = null;\n private destroyed = false;\n\n // Reference html5.js features\n private liveDurationProxy: LiveDurationProxy | null = null;\n private pausedAt: number | null = null;\n private currentSourceUrl: string | null = null;\n private currentMimeType: string | null = null;\n private isMP3Source = false;\n private liveSeekEnabled = false;\n private liveSeekOffsetSec = 0;\n private liveSeekBaseUrl: string | null = null;\n private liveSeekListeners: Array<() => void> = [];\n private liveSeekTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingLiveSeekOffset: number | null = null;\n\n // Auto-recovery threshold (reference: 5 seconds)\n private static readonly PAUSE_RECOVERY_THRESHOLD = 5000;\n private static readonly LIVE_SEEK_DEBOUNCE_MS = 300;\n\n isMimeSupported(mimetype: string): boolean {\n return this.capability.mimes.indexOf(mimetype) !== -1;\n }\n\n isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[] {\n if (mimetype === 'whep') {\n // Check basic WebRTC support\n if (!('RTCPeerConnection' in window) || !('fetch' in window)) return false;\n\n // Check codec compatibility - WebRTC can only carry certain codecs\n const codecCompat = checkWebRTCCodecCompatibility(streamInfo.meta.tracks);\n if (!codecCompat.compatible) {\n // Log why we're skipping WebRTC for this stream\n if (codecCompat.incompatibleCodecs.length > 0) {\n console.debug('[WHEP] Skipping - incompatible codecs:', codecCompat.incompatibleCodecs.join(', '));\n }\n return false;\n }\n\n // Return which track types we can play\n const playable: string[] = [];\n if (codecCompat.details.compatibleVideoCodecs.length > 0) {\n playable.push('video');\n }\n if (codecCompat.details.compatibleAudioCodecs.length > 0) {\n playable.push('audio');\n }\n\n // If stream has tracks but we found compatible ones, we can play\n return playable.length > 0 ? playable : false;\n }\n // Check protocol mismatch\n if (checkProtocolMismatch(source.url)) {\n // Allow file:// -> http:// but warn\n if (!(window.location.protocol === 'file:' && source.url.startsWith('http:'))) {\n return false;\n }\n }\n\n const browser = getBrowserInfo();\n\n // Safari cannot play WebM - skip entirely\n // Reference: html5.js:28-29\n if (mimetype === 'html5/video/webm' && browser.name === 'safari') {\n return false;\n }\n\n // Special handling for HLS\n if (mimetype === \"html5/application/vnd.apple.mpegurl\") {\n // Check for native HLS support\n const testVideo = document.createElement('video');\n if (testVideo.canPlayType('application/vnd.apple.mpegurl')) {\n // Prefer VideoJS for older Android\n const androidVersion = this.getAndroidVersion();\n if (androidVersion && androidVersion < 7) {\n return false; // Let VideoJS handle it\n }\n return ['video', 'audio'];\n }\n return false;\n }\n\n // Test codec support for regular media types\n const supportedTracks: string[] = [];\n const testVideo = document.createElement('video');\n\n // Extract the actual mime type from the format\n const shortMime = mimetype.replace('html5/', '');\n\n // For codec testing, we need to check against stream info\n const tracksByType: Record<string, typeof streamInfo.meta.tracks> = {};\n for (const track of streamInfo.meta.tracks) {\n if (track.type === 'meta') {\n if (track.codec === 'subtitle') {\n supportedTracks.push('subtitle');\n }\n continue;\n }\n\n if (!tracksByType[track.type]) {\n tracksByType[track.type] = [];\n }\n tracksByType[track.type].push(track);\n }\n\n // Test each track type\n for (const [trackType, tracks] of Object.entries(tracksByType)) {\n let hasPlayableTrack = false;\n\n for (const track of tracks) {\n // Build codec string for testing\n let codecString = '';\n if (track.codecstring) {\n codecString = track.codecstring;\n } else {\n codecString = this.translateCodecForHtml5(track);\n }\n\n const testMimeType = `${shortMime};codecs=\"${codecString}\"`;\n\n // Special handling for WebM - Chrome reports issues with codec strings\n if (shortMime === 'video/webm') {\n if (testVideo.canPlayType(shortMime) !== '') {\n hasPlayableTrack = true;\n break;\n }\n } else {\n if (testVideo.canPlayType(testMimeType) !== '') {\n hasPlayableTrack = true;\n break;\n }\n }\n }\n\n if (hasPlayableTrack) {\n supportedTracks.push(trackType);\n }\n }\n\n return supportedTracks.length > 0 ? supportedTracks : false;\n }\n\n private translateCodecForHtml5(track: { codec: string; codecstring?: string; init?: string }): string {\n if (track.codecstring) return track.codecstring;\n\n const bin2hex = (index: number) => {\n if (!track.init || index >= track.init.length) return '00';\n return ('0' + track.init.charCodeAt(index).toString(16)).slice(-2);\n };\n\n switch (track.codec) {\n case 'AAC':\n return 'mp4a.40.2';\n case 'MP3':\n return 'mp4a.40.34';\n case 'AC3':\n return 'ec-3';\n case 'H264':\n return `avc1.${bin2hex(1)}${bin2hex(2)}${bin2hex(3)}`;\n case 'HEVC':\n return `hev1.${bin2hex(1)}${bin2hex(6)}${bin2hex(7)}${bin2hex(8)}${bin2hex(9)}${bin2hex(10)}${bin2hex(11)}${bin2hex(12)}`;\n case 'VP8':\n return 'vp8';\n case 'VP9':\n return 'vp09.00.10.08';\n case 'AV1':\n return 'av01.0.04M.08';\n case 'Opus':\n return 'opus';\n default:\n return track.codec.toLowerCase();\n }\n }\n\n private getAndroidVersion(): number | null {\n const match = navigator.userAgent.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i);\n if (!match) return null;\n\n const major = parseInt(match[1], 10);\n const minor = match[2] ? parseInt(match[2], 10) : 0;\n\n return major + (minor / 10);\n }\n\n async initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions, streamInfo?: StreamInfo): Promise<HTMLVideoElement> {\n // Reset destroyed flag for reuse\n this.destroyed = false;\n this.container = container;\n this.currentSourceUrl = source.url;\n this.currentMimeType = source.type;\n this.isMP3Source = source.type === 'html5/audio/mp3';\n container.classList.add('fw-player-container');\n\n // Create video element\n const video = document.createElement('video');\n video.classList.add('fw-player-video');\n video.setAttribute('playsinline', '');\n video.setAttribute('crossorigin', 'anonymous');\n\n // Apply options\n if (options.autoplay) video.autoplay = true;\n if (options.muted) video.muted = true;\n video.controls = options.controls === true; // Explicit false to hide native controls\n if (options.loop) video.loop = true;\n if (options.poster) video.poster = options.poster;\n\n this.videoElement = video;\n container.appendChild(video);\n\n // Set up event listeners\n this.setupVideoEventListeners(video, options);\n\n // Setup reference features for HTML5 playback\n // Use LiveDurationProxy for all live streams (non-WHEP)\n // WHEP handles its own live edge via signaling\n // This enables seeking and jump-to-live for native MP4/WebM/HLS live streams\n const isLiveStream = streamInfo?.type === 'live' || !isFinite(streamInfo?.duration ?? Infinity);\n if (source.type !== 'whep' && isLiveStream) {\n this.setupLiveDurationProxy(video);\n this.setupAutoRecovery(video);\n this.liveSeekEnabled = true;\n this.liveSeekOffsetSec = 0;\n this.liveSeekBaseUrl = this.stripStartUnixParam(source.url);\n } else {\n this.liveSeekEnabled = false;\n this.liveSeekOffsetSec = 0;\n this.liveSeekBaseUrl = null;\n }\n\n // Optional subtitle tracks helper from source extras\n try {\n const subs = (source as any).subtitles as Array<{ label: string; lang: string; src: string }>;\n if (Array.isArray(subs)) {\n subs.forEach((s, idx) => {\n const track = document.createElement('track');\n track.kind = 'subtitles';\n track.label = s.label;\n track.srclang = s.lang;\n track.src = s.src;\n if (idx === 0) track.default = true;\n video.appendChild(track);\n });\n }\n } catch {}\n\n try {\n if (source.type === 'whep') {\n // Read optional settings from source\n const s: any = source as any;\n const headers = (s && s.headers) ? (s.headers as Record<string,string>) : {};\n const iceServers = (s && s.iceServers) ? (s.iceServers as RTCIceServer[]) : [];\n this.reconnectEnabled = !!(s && s.reconnect);\n this.currentWhepUrl = source.url;\n this.currentHeaders = headers;\n this.currentIceServers = iceServers;\n await this.startWhep(video, source.url, headers, iceServers);\n return video;\n } else {\n // Set the source for direct HTML5 playback\n video.src = source.url;\n if (options.autoplay) {\n video.play().catch(e => console.warn('HTML5 autoplay failed:', e));\n }\n return video;\n }\n\n } catch (error: any) {\n this.emit('error', error.message || String(error));\n throw error;\n }\n }\n\n /**\n * Setup live duration proxy for meaningful seek bar on live streams\n * Ported from reference html5.js:194-202\n */\n private setupLiveDurationProxy(video: HTMLVideoElement): void {\n this.liveDurationProxy = new LiveDurationProxy(video, {\n constrainSeek: true,\n // Duration changes are handled by UI polling getDuration()\n });\n }\n\n /**\n * Setup auto-recovery on long pause\n * Ported from reference html5.js:227-239\n *\n * If the stream has been paused for more than 5 seconds,\n * reload the stream on play to recover from stale buffer.\n */\n private setupAutoRecovery(video: HTMLVideoElement): void {\n video.addEventListener('pause', () => {\n if (this.destroyed) return;\n this.pausedAt = Date.now();\n });\n\n video.addEventListener('play', () => {\n if (this.destroyed) return;\n\n // Check if we need to recover from long pause\n if (this.pausedAt && this.liveDurationProxy?.isLive()) {\n const pauseDuration = Date.now() - this.pausedAt;\n if (pauseDuration > NativePlayerImpl.PAUSE_RECOVERY_THRESHOLD) {\n console.debug('[NativePlayer] Auto-recovery: reloading stream after', pauseDuration, 'ms pause');\n video.load();\n }\n }\n this.pausedAt = null;\n });\n }\n\n /**\n * Set a new source URL dynamically\n * Ported from reference html5.js:276-281\n */\n setSource(url: string): void {\n if (!this.videoElement) return;\n this.currentSourceUrl = url;\n if (this.liveSeekEnabled) {\n this.liveSeekBaseUrl = this.stripStartUnixParam(url);\n this.liveSeekOffsetSec = 0;\n }\n this.videoElement.src = url;\n this.videoElement.load();\n }\n\n /**\n * Override seek for MP3 files (seeking not supported)\n * Ported from reference html5.js:185-191\n */\n seek(time: number): void {\n if (this.isMP3Source) {\n console.warn('[NativePlayer] Seek not supported for MP3 files');\n return;\n }\n\n if (this.liveSeekEnabled && this.liveDurationProxy?.isLive()) {\n const duration = this.getDuration();\n let offset = time - duration;\n if (offset > 0) offset = 0;\n this.scheduleLiveSeekOffset(offset, false);\n return;\n }\n\n if (this.liveDurationProxy?.isLive()) {\n // Use live duration proxy for constrained seeking\n this.liveDurationProxy.seek(time);\n return;\n }\n\n if (this.videoElement) {\n this.videoElement.currentTime = time;\n }\n }\n\n /**\n * Get the calculated duration (live-aware)\n */\n getDuration(): number {\n if (this.liveSeekEnabled && this.liveDurationProxy?.isLive()) {\n const base = this.liveDurationProxy.getDuration();\n const offset = this.pendingLiveSeekOffset ?? this.liveSeekOffsetSec;\n return Math.max(0, base - offset);\n }\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.getDuration();\n }\n return this.videoElement?.duration ?? 0;\n }\n\n getCurrentTime(): number {\n if (this.liveSeekEnabled && this.liveDurationProxy?.isLive() && this.videoElement) {\n const offset = this.pendingLiveSeekOffset ?? this.liveSeekOffsetSec;\n return Math.max(0, this.videoElement.currentTime - offset);\n }\n return this.videoElement?.currentTime ?? 0;\n }\n\n getSeekableRange(): { start: number; end: number } | null {\n if (!this.liveSeekEnabled || !this.liveDurationProxy?.isLive() || !this.videoElement) {\n return null;\n }\n const buffered = this.videoElement.buffered;\n if (!buffered || buffered.length === 0) return null;\n const offset = this.pendingLiveSeekOffset ?? this.liveSeekOffsetSec;\n const start = buffered.start(0) - offset;\n const end = buffered.end(buffered.length - 1) - offset;\n if (!Number.isFinite(start) || !Number.isFinite(end)) return null;\n return { start: Math.max(0, start), end: Math.max(0, end) };\n }\n\n getBufferedRanges(): TimeRanges | null {\n const video = this.videoElement;\n if (!video) return null;\n const buffered = video.buffered;\n if (!this.liveSeekEnabled || !this.liveDurationProxy?.isLive()) {\n return buffered;\n }\n if (!buffered || buffered.length === 0) return buffered;\n const offset = this.pendingLiveSeekOffset ?? this.liveSeekOffsetSec;\n const shifted: [number, number][] = [];\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i) - offset;\n const end = buffered.end(i) - offset;\n if (Number.isFinite(start) && Number.isFinite(end)) {\n shifted.push([Math.max(0, start), Math.max(0, end)]);\n }\n }\n return this.createTimeRanges(shifted);\n }\n\n /**\n * Check if current stream is live\n */\n isLive(): boolean {\n return this.liveDurationProxy?.isLive() ?? false;\n }\n\n /**\n * Get live latency in seconds\n */\n getLiveLatency(): number {\n return this.liveDurationProxy?.getLatency() ?? 0;\n }\n\n /**\n * Jump to live edge\n */\n jumpToLive(): void {\n if (this.liveSeekEnabled && this.liveDurationProxy?.isLive()) {\n this.scheduleLiveSeekOffset(0, true);\n return;\n }\n this.liveDurationProxy?.jumpToLive();\n }\n\n async destroy(): Promise<void> {\n // Set destroyed flag immediately to guard against async callbacks\n this.destroyed = true;\n\n // Cleanup live duration proxy\n if (this.liveDurationProxy) {\n this.liveDurationProxy.destroy();\n this.liveDurationProxy = null;\n }\n\n if (this.reconnectTimer) {\n try { clearTimeout(this.reconnectTimer); } catch {}\n this.reconnectTimer = null;\n }\n\n // Best-effort WHEP session DELETE (CORS may block this)\n if (this.sessionUrl) {\n const url = this.sessionUrl;\n this.sessionUrl = null;\n fetch(url, { method: 'DELETE' }).catch(() => {\n // Silently ignore - CORS often blocks DELETE, session will timeout on server\n });\n }\n\n if (this.peerConnection) {\n try { this.peerConnection.close(); } catch {}\n this.peerConnection = null;\n }\n\n if (this.videoElement) {\n try { (this.videoElement as any).srcObject = null; } catch {}\n this.videoElement.pause();\n this.videoElement.removeAttribute('src');\n // Note: Don't call load() - it triggers \"Empty src attribute\" error event\n\n if (this.container) {\n try { this.container.removeChild(this.videoElement); } catch {}\n }\n }\n\n this.videoElement = null;\n this.container = null;\n this.pausedAt = null;\n this.currentSourceUrl = null;\n this.currentMimeType = null;\n this.liveSeekEnabled = false;\n this.liveSeekOffsetSec = 0;\n this.liveSeekBaseUrl = null;\n this.liveSeekListeners.forEach(cleanup => cleanup());\n this.liveSeekListeners = [];\n if (this.liveSeekTimer) {\n clearTimeout(this.liveSeekTimer);\n this.liveSeekTimer = null;\n }\n this.pendingLiveSeekOffset = null;\n this.listeners.clear();\n }\n\n private stripStartUnixParam(url: string): string {\n const params = parseUrlParams(url);\n delete params.startunix;\n return appendUrlParams(stripUrlParams(url), params);\n }\n\n private buildLiveSeekUrl(offsetSec: number): string {\n const base = this.liveSeekBaseUrl || this.currentSourceUrl || '';\n if (!base) return '';\n if (!offsetSec || offsetSec >= 0) {\n return this.stripStartUnixParam(base);\n }\n const params = parseUrlParams(base);\n params.startunix = String(offsetSec);\n return appendUrlParams(stripUrlParams(base), params);\n }\n\n private applyLiveSeekOffset(offsetSec: number): void {\n if (!this.videoElement) return;\n const clamped = Math.min(0, offsetSec);\n if (Math.abs(clamped - this.liveSeekOffsetSec) < 0.05) {\n return;\n }\n this.liveSeekOffsetSec = clamped;\n const nextUrl = this.buildLiveSeekUrl(clamped);\n if (!nextUrl) return;\n const wasPlaying = !this.videoElement.paused;\n this.currentSourceUrl = nextUrl;\n this.videoElement.src = nextUrl;\n this.videoElement.load();\n if (wasPlaying) {\n this.videoElement.play().catch(() => {});\n }\n }\n\n private createTimeRanges(ranges: [number, number][]): TimeRanges {\n return {\n length: ranges.length,\n start(index: number): number {\n if (index < 0 || index >= ranges.length) throw new DOMException('Index out of bounds');\n return ranges[index][0];\n },\n end(index: number): number {\n if (index < 0 || index >= ranges.length) throw new DOMException('Index out of bounds');\n return ranges[index][1];\n },\n };\n }\n\n private scheduleLiveSeekOffset(offsetSec: number, immediate: boolean): void {\n const clamped = Math.min(0, offsetSec);\n if (immediate) {\n if (this.liveSeekTimer) {\n clearTimeout(this.liveSeekTimer);\n this.liveSeekTimer = null;\n }\n this.pendingLiveSeekOffset = null;\n this.applyLiveSeekOffset(clamped);\n return;\n }\n\n this.pendingLiveSeekOffset = clamped;\n if (this.liveSeekTimer) {\n clearTimeout(this.liveSeekTimer);\n }\n this.liveSeekTimer = setTimeout(() => {\n this.liveSeekTimer = null;\n if (this.pendingLiveSeekOffset !== null) {\n const pending = this.pendingLiveSeekOffset;\n this.pendingLiveSeekOffset = null;\n this.applyLiveSeekOffset(pending);\n }\n }, NativePlayerImpl.LIVE_SEEK_DEBOUNCE_MS);\n }\n\n /**\n * Get WebRTC-specific stats including RTT, packet loss, jitter, bitrate\n */\n async getStats(): Promise<{\n type: 'webrtc';\n video?: {\n bytesReceived: number;\n packetsReceived: number;\n packetsLost: number;\n packetLossRate: number;\n jitter: number;\n framesDecoded: number;\n framesDropped: number;\n frameDropRate: number;\n frameWidth: number;\n frameHeight: number;\n framesPerSecond: number;\n bitrate: number;\n jitterBufferDelay: number;\n };\n audio?: {\n bytesReceived: number;\n packetsReceived: number;\n packetsLost: number;\n packetLossRate: number;\n jitter: number;\n bitrate: number;\n };\n network?: {\n rtt: number;\n availableOutgoingBitrate: number;\n availableIncomingBitrate: number;\n bytesSent: number;\n bytesReceived: number;\n };\n timestamp: number;\n } | undefined> {\n if (!this.peerConnection) return undefined;\n try {\n const stats = await this.peerConnection.getStats();\n const now = Date.now();\n const result: any = { type: 'webrtc', timestamp: now };\n\n stats.forEach((report: any) => {\n if (report.type === 'inbound-rtp') {\n const packetLossRate = report.packetsReceived > 0\n ? (report.packetsLost / (report.packetsReceived + report.packetsLost)) * 100\n : 0;\n\n // Calculate bitrate from previous sample\n let bitrate = 0;\n if (this.lastInboundStats && this.lastInboundStats[report.kind]) {\n const prev = this.lastInboundStats[report.kind];\n const timeDelta = (now - (this.lastInboundStats.timestamp || 0)) / 1000;\n if (timeDelta > 0) {\n const bytesDelta = report.bytesReceived - (prev.bytesReceived || 0);\n bitrate = Math.round((bytesDelta * 8) / timeDelta); // bits per second\n }\n }\n\n if (report.kind === 'video') {\n const frameDropRate = report.framesDecoded > 0\n ? (report.framesDropped / (report.framesDecoded + report.framesDropped)) * 100\n : 0;\n\n result.video = {\n bytesReceived: report.bytesReceived || 0,\n packetsReceived: report.packetsReceived || 0,\n packetsLost: report.packetsLost || 0,\n packetLossRate,\n jitter: (report.jitter || 0) * 1000, // Convert to ms\n framesDecoded: report.framesDecoded || 0,\n framesDropped: report.framesDropped || 0,\n frameDropRate,\n frameWidth: report.frameWidth || 0,\n frameHeight: report.frameHeight || 0,\n framesPerSecond: report.framesPerSecond || 0,\n bitrate,\n jitterBufferDelay: report.jitterBufferDelay && report.jitterBufferEmittedCount\n ? (report.jitterBufferDelay / report.jitterBufferEmittedCount) * 1000 // ms\n : 0,\n };\n }\n if (report.kind === 'audio') {\n result.audio = {\n bytesReceived: report.bytesReceived || 0,\n packetsReceived: report.packetsReceived || 0,\n packetsLost: report.packetsLost || 0,\n packetLossRate,\n jitter: (report.jitter || 0) * 1000, // Convert to ms\n bitrate,\n };\n }\n }\n if (report.type === 'candidate-pair' && report.nominated) {\n result.network = {\n rtt: report.currentRoundTripTime ? report.currentRoundTripTime * 1000 : 0, // ms\n availableOutgoingBitrate: report.availableOutgoingBitrate || 0,\n availableIncomingBitrate: report.availableIncomingBitrate || 0,\n bytesSent: report.bytesSent || 0,\n bytesReceived: report.bytesReceived || 0,\n };\n }\n });\n\n // Store for next sample's bitrate calculation\n this.lastInboundStats = {\n video: result.video ? { bytesReceived: result.video.bytesReceived } : undefined,\n audio: result.audio ? { bytesReceived: result.audio.bytesReceived } : undefined,\n timestamp: now,\n };\n\n return result;\n } catch {\n return undefined;\n }\n }\n\n async getLatency(): Promise<{ estimatedMs: number; jitterBufferMs: number; rttMs: number } | undefined> {\n const s = await this.getStats();\n if (!s) return undefined;\n\n return {\n estimatedMs: s.video?.jitterBufferDelay || 0,\n jitterBufferMs: s.video?.jitterBufferDelay || 0,\n rttMs: s.network?.rtt || 0,\n };\n }\n\n private async startWhep(video: HTMLVideoElement, url: string, headers: Record<string,string>, iceServers: RTCIceServer[]) {\n // Clean previous sessionUrl\n if (this.sessionUrl) {\n try { fetch(this.sessionUrl, { method: 'DELETE' }).catch(() => {}); } catch {}\n this.sessionUrl = null;\n }\n\n // Create peer connection\n const pc = new RTCPeerConnection({ iceServers });\n this.peerConnection = pc;\n\n pc.ontrack = (event: RTCTrackEvent) => {\n if (this.destroyed) return; // Guard against zombie callbacks\n if (video && event.streams[0]) {\n video.srcObject = event.streams[0];\n }\n };\n\n pc.oniceconnectionstatechange = () => {\n if (this.destroyed) return; // Guard against zombie callbacks\n const state = pc.iceConnectionState;\n if (state === 'failed' || state === 'disconnected') {\n this.emit('error', 'WHEP connection failed');\n if (this.reconnectEnabled && this.reconnectAttempts < this.maxReconnectAttempts && this.currentWhepUrl) {\n const backoff = Math.min(5000, 500 * Math.pow(2, this.reconnectAttempts));\n this.reconnectAttempts++;\n this.reconnectTimer = setTimeout(() => {\n if (this.destroyed) return; // Guard inside timer callback too\n this.startWhep(video, this.currentWhepUrl!, this.currentHeaders || {}, this.currentIceServers || []);\n }, backoff);\n }\n }\n if (state === 'connected') {\n this.reconnectAttempts = 0;\n }\n };\n\n pc.addTransceiver('video', { direction: 'recvonly' });\n pc.addTransceiver('audio', { direction: 'recvonly' });\n\n const offer = await pc.createOffer();\n await pc.setLocalDescription(offer);\n\n const requestHeaders: Record<string,string> = { 'Content-Type': 'application/sdp' };\n for (const k in headers) requestHeaders[k] = headers[k];\n\n const response = await fetch(url, {\n method: 'POST',\n headers: requestHeaders,\n body: offer.sdp || ''\n });\n if (!response.ok) {\n throw new Error(`WHEP request failed: ${response.status}`);\n }\n const answerSdp = await response.text();\n await pc.setRemoteDescription(new RTCSessionDescription({ type: 'answer', sdp: answerSdp }));\n\n // Resolve sessionUrl against the WHEP endpoint URL (Location header may be relative)\n const locationHeader = response.headers.get('Location');\n if (locationHeader) {\n try {\n // Use URL constructor to resolve relative path against the WHEP endpoint\n this.sessionUrl = new URL(locationHeader, url).href;\n } catch {\n this.sessionUrl = locationHeader;\n }\n } else {\n this.sessionUrl = null;\n }\n }\n}\n\n// Backwards compatibility alias\nexport { NativePlayerImpl as DirectPlaybackPlayerImpl };\n","import { BasePlayer } from '../core/PlayerInterface';\nimport { checkProtocolMismatch, getBrowserInfo } from '../core/detector';\nimport { translateCodec } from '../core/CodecUtils';\nimport { LiveDurationProxy } from '../core/LiveDurationProxy';\nimport type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../core/PlayerInterface';\n\n// Player implementation class\nexport class HlsJsPlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: \"HLS.js Player\",\n shortname: \"hlsjs\",\n priority: 3,\n mimes: [\"html5/application/vnd.apple.mpegurl\", \"html5/application/vnd.apple.mpegurl;version=7\"]\n };\n\n private hls: any = null;\n private container: HTMLElement | null = null;\n private failureCount = 0;\n private destroyed = false;\n private liveDurationProxy: LiveDurationProxy | null = null;\n\n isMimeSupported(mimetype: string): boolean {\n return this.capability.mimes.includes(mimetype);\n }\n\n isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[] {\n // Check protocol mismatch\n if (checkProtocolMismatch(source.url)) {\n return false;\n }\n\n // Check if HLS.js is supported or native HLS is available\n const browser = getBrowserInfo();\n\n // If native HLS is supported (Safari/iOS), prefer that for older Android\n if (browser.isAndroid && browser.isMobile) {\n // Let VideoJS handle older Android instead\n return false;\n }\n\n // Check MediaSource support (required for HLS.js)\n if (!browser.supportsMediaSource) {\n // Fall back to native if available\n const testVideo = document.createElement('video');\n if (testVideo.canPlayType('application/vnd.apple.mpegurl')) {\n return ['video', 'audio'];\n }\n return false;\n }\n\n // Check codec compatibility\n const playableTracks: string[] = [];\n const tracksByType: Record<string, typeof streamInfo.meta.tracks> = {};\n\n // If no track info available yet, assume compatible (like upstream does)\n // Track info comes async from MistServer - don't block on it\n if (!streamInfo.meta.tracks || streamInfo.meta.tracks.length === 0) {\n return ['video', 'audio']; // Assume standard tracks until we know better\n }\n\n // Group tracks by type\n for (const track of streamInfo.meta.tracks) {\n if (track.type === 'meta') {\n if (track.codec === 'subtitle') {\n // Check for WebVTT subtitle support\n for (const src of streamInfo.source) {\n if (src.type === 'html5/text/vtt') {\n playableTracks.push('subtitle');\n break;\n }\n }\n }\n continue;\n }\n\n if (!tracksByType[track.type]) {\n tracksByType[track.type] = [];\n }\n tracksByType[track.type].push(track);\n }\n\n // HLS-incompatible audio codecs (even if browser MSE supports them in fMP4)\n // HLS standard only supports: AAC, MP3, AC-3/E-AC-3\n const HLS_INCOMPATIBLE_AUDIO = ['OPUS', 'Opus', 'opus', 'VORBIS', 'Vorbis', 'FLAC'];\n\n // Test codec support for video/audio tracks\n for (const [trackType, tracks] of Object.entries(tracksByType)) {\n let hasPlayableTrack = false;\n\n for (const track of tracks) {\n // Explicit HLS codec filtering - OPUS doesn't work in HLS even if MSE supports it\n if (trackType === 'audio' && HLS_INCOMPATIBLE_AUDIO.includes(track.codec)) {\n console.debug(`[HLS.js] Codec incompatible with HLS: ${track.codec}`);\n continue;\n }\n\n const codecString = translateCodec(track);\n // Use correct container type for audio vs video tracks\n const container = trackType === 'audio' ? 'audio/mp4' : 'video/mp4';\n const mimeType = `${container};codecs=\"${codecString}\"`;\n\n if (MediaSource.isTypeSupported && MediaSource.isTypeSupported(mimeType)) {\n hasPlayableTrack = true;\n break;\n } else {\n console.debug(`[HLS.js] Codec not supported: ${mimeType}`);\n }\n }\n\n if (hasPlayableTrack) {\n playableTracks.push(trackType);\n }\n }\n\n return playableTracks.length > 0 ? playableTracks : false;\n }\n\n async initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement> {\n console.log('[HLS.js] initialize() starting for', source.url.slice(0, 60) + '...');\n this.destroyed = false;\n this.container = container;\n container.classList.add('fw-player-container');\n\n // Create video element\n const video = document.createElement('video');\n video.classList.add('fw-player-video');\n video.setAttribute('playsinline', '');\n video.setAttribute('crossorigin', 'anonymous');\n\n // Apply options\n if (options.autoplay) video.autoplay = true;\n if (options.muted) video.muted = true;\n video.controls = options.controls === true; // Explicit false to hide native controls\n if (options.loop) video.loop = true;\n if (options.poster) video.poster = options.poster;\n\n this.videoElement = video;\n container.appendChild(video);\n\n // Set up event listeners\n this.setupVideoEventListeners(video, options);\n\n try {\n // Dynamic import of HLS.js\n console.log('[HLS.js] Dynamically importing hls.js module...');\n const mod = await import('hls.js');\n const Hls = (mod as any).default || (mod as any);\n console.log('[HLS.js] hls.js module imported, Hls.isSupported():', Hls.isSupported?.());\n\n if (Hls.isSupported()) {\n this.hls = new Hls({\n enableWorker: false,\n lowLatencyMode: true,\n maxBufferLength: 15,\n maxMaxBufferLength: 60,\n backBufferLength: 30 // Reduced from 90 to prevent memory issues on long streams\n });\n\n this.hls.attachMedia(video);\n\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls.loadSource(source.url);\n });\n\n this.hls.on(Hls.Events.ERROR, (_: any, data: any) => {\n if (this.destroyed) return; // Guard against zombie callbacks\n if (data?.fatal) {\n if (this.failureCount < 3) {\n this.failureCount++;\n try { this.hls.recoverMediaError(); } catch {}\n } else {\n const error = `HLS fatal error: ${data?.type || 'unknown'}`;\n this.emit('error', error);\n }\n }\n });\n\n this.hls.on(Hls.Events.MANIFEST_PARSED, () => {\n if (this.destroyed) return; // Guard against zombie callbacks\n\n // Set up LiveDurationProxy for live streams\n // HLS.js sets video.duration to Infinity for live streams\n const isLive = !isFinite(video.duration) || this.hls.levels?.[0]?.details?.live;\n if (isLive && !this.liveDurationProxy) {\n this.liveDurationProxy = new LiveDurationProxy(video, {\n constrainSeek: true,\n liveOffset: 0,\n });\n console.debug('[HLS.js] LiveDurationProxy initialized for live stream');\n }\n\n if (options.autoplay) {\n video.play().catch(e => console.warn('HLS autoplay failed:', e));\n }\n });\n\n } else if (video.canPlayType('application/vnd.apple.mpegurl')) {\n // Use native HLS support\n video.src = source.url;\n if (options.autoplay) {\n video.play().catch(e => console.warn('Native HLS autoplay failed:', e));\n }\n } else {\n throw new Error('HLS not supported in this browser');\n }\n\n // Optional subtitle tracks helper from source extras\n try {\n const subs = (source as any).subtitles as Array<{ label: string; lang: string; src: string }>;\n if (Array.isArray(subs)) {\n subs.forEach((s, idx) => {\n const track = document.createElement('track');\n track.kind = 'subtitles';\n track.label = s.label;\n track.srclang = s.lang;\n track.src = s.src;\n if (idx === 0) track.default = true;\n video.appendChild(track);\n });\n }\n } catch {}\n\n console.log('[HLS.js] initialize() complete, returning video element');\n return video;\n\n } catch (error: any) {\n this.emit('error', error.message || String(error));\n throw error;\n }\n }\n\n async destroy(): Promise<void> {\n console.debug('[HLS.js] destroy() called');\n this.destroyed = true;\n\n if (this.liveDurationProxy) {\n this.liveDurationProxy.destroy();\n this.liveDurationProxy = null;\n }\n\n if (this.hls) {\n try {\n this.hls.destroy();\n console.debug('[HLS.js] hls.destroy() completed');\n } catch (e) {\n console.warn('[HLS.js] Error destroying:', e);\n }\n this.hls = null;\n }\n\n if (this.videoElement && this.container) {\n try { this.container.removeChild(this.videoElement); } catch {}\n }\n\n this.videoElement = null;\n this.container = null;\n this.listeners.clear();\n }\n\n // ============================================================================\n // Live Stream Support\n // ============================================================================\n\n /**\n * Get the calculated duration for live streams\n * Falls back to native duration for VOD\n */\n getDuration(): number {\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.getDuration();\n }\n return this.videoElement?.duration ?? 0;\n }\n\n /**\n * Check if the stream is live\n */\n isLiveStream(): boolean {\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.isLive();\n }\n const video = this.videoElement;\n if (!video) return false;\n return !isFinite(video.duration);\n }\n\n /**\n * Seek to a position with live-aware constraints\n */\n seek(time: number): void {\n const video = this.videoElement;\n if (!video) return;\n\n // For live streams, use the proxy which constrains to buffer\n if (this.liveDurationProxy && this.liveDurationProxy.isLive()) {\n this.liveDurationProxy.seek(time);\n return;\n }\n\n // For VOD, seek directly\n video.currentTime = time;\n }\n\n /**\n * Jump to live edge\n * Uses HLS.js liveSyncPosition when available (more accurate)\n */\n jumpToLive(): void {\n const video = this.videoElement;\n if (!video) return;\n\n // HLS.js provides liveSyncPosition for live streams - use that first\n if (this.hls && typeof this.hls.liveSyncPosition === 'number' && this.hls.liveSyncPosition > 0) {\n console.debug('[HLS.js] jumpToLive using liveSyncPosition:', this.hls.liveSyncPosition);\n video.currentTime = this.hls.liveSyncPosition;\n return;\n }\n\n // Fall back to LiveDurationProxy\n if (this.liveDurationProxy && this.liveDurationProxy.isLive()) {\n console.debug('[HLS.js] jumpToLive using LiveDurationProxy');\n this.liveDurationProxy.jumpToLive();\n return;\n }\n\n // Last resort: use seekable end\n if (video.seekable && video.seekable.length > 0) {\n const liveEdge = video.seekable.end(video.seekable.length - 1);\n if (isFinite(liveEdge) && liveEdge > 0) {\n console.debug('[HLS.js] jumpToLive using seekable.end:', liveEdge);\n video.currentTime = liveEdge;\n }\n }\n }\n\n /**\n * Get latency from live edge (for live streams)\n */\n getLiveLatency(): number {\n const video = this.videoElement;\n if (!video) return 0;\n\n // HLS.js provides liveSyncPosition\n if (this.hls && typeof this.hls.liveSyncPosition === 'number') {\n return Math.max(0, (this.hls.liveSyncPosition - video.currentTime) * 1000);\n }\n\n // Fall back to proxy\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.getLatency() * 1000;\n }\n\n return 0;\n }\n\n // ============================================================================\n // Quality API (Auto + levels)\n // ============================================================================\n getQualities(): Array<{ id: string; label: string; bitrate?: number; width?: number; height?: number; isAuto?: boolean; active?: boolean }> {\n const qualities: any[] = [];\n const video = this.videoElement;\n if (!this.hls || !video) return qualities;\n const levels = this.hls.levels || [];\n const auto = { id: 'auto', label: 'Auto', isAuto: true, active: this.hls.autoLevelEnabled };\n qualities.push(auto);\n levels.forEach((lvl: any, idx: number) => {\n qualities.push({ id: String(idx), label: lvl.height ? `${lvl.height}p` : `${Math.round((lvl.bitrate||0)/1000)}kbps`, bitrate: lvl.bitrate, width: lvl.width, height: lvl.height, active: this.hls.currentLevel === idx });\n });\n return qualities;\n }\n\n selectQuality(id: string): void {\n if (!this.hls) return;\n if (id === 'auto') {\n this.hls.currentLevel = -1;\n this.hls.autoLevelEnabled = true;\n return;\n }\n const idx = parseInt(id, 10);\n if (!isNaN(idx)) {\n this.hls.autoLevelEnabled = false;\n this.hls.currentLevel = idx;\n }\n }\n\n // Captions via native textTracks if rendered; hls.js can also manage subtitles tracks\n getTextTracks(): Array<{ id: string; label: string; lang?: string; active: boolean }> {\n const v = this.videoElement;\n if (!v) return [];\n const list = v.textTracks;\n const out: any[] = [];\n for (let i = 0; i < list.length; i++) {\n const tt = list[i];\n out.push({ id: String(i), label: tt.label || `CC ${i+1}`, lang: (tt as any).language, active: tt.mode === 'showing' });\n }\n return out;\n }\n\n selectTextTrack(id: string | null): void {\n const v = this.videoElement as any;\n if (!v) return;\n const list = v.textTracks as TextTrackList;\n for (let i = 0; i < list.length; i++) {\n const tt = list[i];\n if (id !== null && String(i) === id) tt.mode = 'showing'; else tt.mode = 'disabled';\n }\n }\n\n /**\n * Get HLS.js-specific stats for accurate bitrate and bandwidth\n */\n async getStats(): Promise<{\n type: 'hls';\n bandwidthEstimate: number;\n currentLevel: number;\n currentBitrate: number;\n loadLevel: number;\n levels: Array<{ bitrate: number; width: number; height: number }>;\n buffered: number;\n latency?: number;\n } | undefined> {\n if (!this.hls) return undefined;\n\n const levels = (this.hls.levels || []).map((lvl: any) => ({\n bitrate: lvl.bitrate || 0,\n width: lvl.width || 0,\n height: lvl.height || 0,\n }));\n\n const currentLevel = this.hls.currentLevel;\n const currentLevelData = levels[currentLevel];\n\n // Calculate buffered ahead\n let buffered = 0;\n const video = this.videoElement;\n if (video && video.buffered.length > 0) {\n for (let i = 0; i < video.buffered.length; i++) {\n if (video.buffered.start(i) <= video.currentTime && video.buffered.end(i) > video.currentTime) {\n buffered = video.buffered.end(i) - video.currentTime;\n break;\n }\n }\n }\n\n // Latency for live streams\n let latency: number | undefined;\n if (video && this.hls.liveSyncPosition !== undefined && !isFinite(video.duration)) {\n latency = (this.hls.liveSyncPosition - video.currentTime) * 1000;\n }\n\n return {\n type: 'hls',\n bandwidthEstimate: this.hls.bandwidthEstimate || 0,\n currentLevel,\n currentBitrate: currentLevelData?.bitrate || 0,\n loadLevel: this.hls.loadLevel || 0,\n levels,\n buffered,\n latency,\n };\n }\n}\n","import { BasePlayer } from '../core/PlayerInterface';\nimport { checkProtocolMismatch, getBrowserInfo, isFileProtocol } from '../core/detector';\nimport { translateCodec } from '../core/CodecUtils';\nimport type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../core/PlayerInterface';\n\n// Player implementation class\nexport class DashJsPlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: \"Dash.js Player\",\n shortname: \"dashjs\",\n priority: 100, // Below legacy (99) - DASH support is experimental\n mimes: [\"dash/video/mp4\"]\n };\n\n private dashPlayer: any = null;\n private container: HTMLElement | null = null;\n private destroyed = false;\n private debugging = false;\n\n // Live duration proxy state (ported from reference dashjs.js:81-122)\n private lastProgress = Date.now();\n private videoProxy: HTMLVideoElement | null = null;\n private streamType: 'live' | 'vod' | 'unknown' = 'unknown';\n\n // Subtitle deferred loading (ported from reference dashjs.js:173-197)\n private subsLoaded = false;\n private pendingSubtitleId: string | null = null;\n\n isMimeSupported(mimetype: string): boolean {\n return this.capability.mimes.includes(mimetype);\n }\n\n isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[] {\n // Check protocol mismatch\n if (checkProtocolMismatch(source.url)) {\n return false;\n }\n\n // Don't use DASH.js if loaded via file://\n if (isFileProtocol()) {\n return false;\n }\n\n const browser = getBrowserInfo();\n\n // Check MediaSource support (required for DASH.js)\n if (!browser.supportsMediaSource) {\n return false;\n }\n\n // Check codec compatibility\n const playableTracks: string[] = [];\n const tracksByType: Record<string, typeof streamInfo.meta.tracks> = {};\n\n // Group tracks by type\n for (const track of streamInfo.meta.tracks) {\n if (track.type === 'meta') {\n if (track.codec === 'subtitle') {\n // Check for WebVTT subtitle support\n for (const src of streamInfo.source) {\n if (src.type === 'html5/text/vtt') {\n playableTracks.push('subtitle');\n break;\n }\n }\n }\n continue;\n }\n\n if (!tracksByType[track.type]) {\n tracksByType[track.type] = [];\n }\n tracksByType[track.type].push(track);\n }\n\n // DASH-incompatible audio codecs for fMP4 segments (even if browser MSE supports them)\n // Standard DASH audio: AAC, MP3, AC-3/E-AC-3. OPUS only works in WebM DASH (not fMP4)\n const DASH_INCOMPATIBLE_AUDIO = ['OPUS', 'Opus', 'opus', 'VORBIS', 'Vorbis'];\n\n // Test codec support for video/audio tracks\n for (const [trackType, tracks] of Object.entries(tracksByType)) {\n let hasPlayableTrack = false;\n\n for (const track of tracks) {\n // Explicit DASH codec filtering - OPUS in fMP4 DASH doesn't work reliably\n if (trackType === 'audio' && DASH_INCOMPATIBLE_AUDIO.includes(track.codec)) {\n console.debug(`[DashJS] Codec incompatible with DASH fMP4: ${track.codec}`);\n continue;\n }\n\n const codecString = translateCodec(track);\n // Use correct container type for audio vs video tracks\n const container = trackType === 'audio' ? 'audio/mp4' : 'video/mp4';\n const mimeType = `${container};codecs=\"${codecString}\"`;\n\n if (MediaSource.isTypeSupported && MediaSource.isTypeSupported(mimeType)) {\n hasPlayableTrack = true;\n break;\n } else {\n console.debug(`[DashJS] Codec not supported: ${mimeType}`);\n }\n }\n\n if (hasPlayableTrack) {\n playableTracks.push(trackType);\n }\n }\n\n return playableTracks.length > 0 ? playableTracks : false;\n }\n\n /**\n * Check if current stream is live.\n * Ported from reference dashjs.js live detection.\n */\n private isLiveStream(): boolean {\n if (this.streamType === 'live') return true;\n if (this.streamType === 'vod') return false;\n // Fallback: check video duration\n const v = this.videoElement;\n if (v && (v.duration === Infinity || !isFinite(v.duration))) {\n return true;\n }\n return false;\n }\n\n /**\n * Create a Proxy wrapper for the video element that intercepts duration for live streams.\n * Ported from reference dashjs.js:81-122.\n *\n * For live streams, returns synthetic duration = buffer_end + time_since_last_progress\n * This makes the seek bar usable for live content.\n */\n private createVideoProxy(video: HTMLVideoElement): HTMLVideoElement {\n if (!('Proxy' in window)) {\n // Fallback for older browsers\n return video;\n }\n\n // Track buffer progress for duration extrapolation\n video.addEventListener('progress', () => {\n this.lastProgress = Date.now();\n });\n\n const self = this;\n return new Proxy(video, {\n get(target, key, receiver) {\n // Override duration for live streams (reference dashjs.js:108-116)\n if (key === 'duration' && self.isLiveStream()) {\n const buffered = target.buffered;\n if (buffered.length > 0) {\n const bufferEnd = buffered.end(buffered.length - 1);\n const timeSinceBuffer = (Date.now() - self.lastProgress) / 1000;\n return bufferEnd + timeSinceBuffer;\n }\n }\n const value = Reflect.get(target, key, receiver);\n // Bind functions to the original target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n },\n set(target, key, value) {\n return Reflect.set(target, key, value);\n }\n }) as HTMLVideoElement;\n }\n\n /**\n * Set up comprehensive event logging.\n * Ported from reference dashjs.js:152-160.\n */\n private setupEventLogging(dashjs: any): void {\n const skipEvents = [\n 'METRIC_ADDED', 'METRIC_UPDATED', 'METRIC_CHANGED', 'METRICS_CHANGED',\n 'FRAGMENT_LOADING_STARTED', 'FRAGMENT_LOADING_COMPLETED',\n 'LOG', 'PLAYBACK_TIME_UPDATED', 'PLAYBACK_PROGRESS'\n ];\n\n const events = dashjs.MediaPlayer?.events || {};\n for (const eventKey of Object.keys(events)) {\n if (!skipEvents.includes(eventKey)) {\n this.dashPlayer.on(events[eventKey], (e: any) => {\n if (this.destroyed) return;\n if (this.debugging) {\n console.log('DASH event:', e.type);\n }\n });\n }\n }\n }\n\n /**\n * Set up subtitle deferred loading.\n * Ported from reference dashjs.js:173-197.\n */\n private setupSubtitleHandling(): void {\n this.dashPlayer.on('allTextTracksAdded', () => {\n if (this.destroyed) return;\n this.subsLoaded = true;\n if (this.pendingSubtitleId !== null) {\n this.selectTextTrack(this.pendingSubtitleId);\n this.pendingSubtitleId = null;\n }\n });\n }\n\n /**\n * Set up stalled indicator handling.\n * Ported from reference dashjs.js:207-211.\n */\n private setupStalledHandling(): void {\n this.videoElement?.addEventListener('progress', () => {\n // Clear any stalled state when buffer advances\n // This integrates with the loading indicator system\n });\n }\n\n async initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement> {\n this.destroyed = false;\n this.container = container;\n this.subsLoaded = false;\n this.pendingSubtitleId = null;\n container.classList.add('fw-player-container');\n\n // Detect stream type from source if available (reference dashjs.js live detection)\n const sourceType = (source as any).type;\n if (sourceType === 'live') {\n this.streamType = 'live';\n } else if (sourceType === 'vod') {\n this.streamType = 'vod';\n } else {\n this.streamType = 'unknown';\n }\n\n // Create video element\n const video = document.createElement('video');\n video.classList.add('fw-player-video');\n video.setAttribute('playsinline', '');\n video.setAttribute('crossorigin', 'anonymous');\n\n // Apply options (ported from reference dashjs.js:129-142)\n if (options.autoplay) video.autoplay = true;\n if (options.muted) video.muted = true;\n video.controls = options.controls === true;\n // Loop only for VoD (reference dashjs.js: live streams don't loop)\n if (options.loop && this.streamType !== 'live') video.loop = true;\n if (options.poster) video.poster = options.poster;\n\n // Create proxy for live duration handling (reference dashjs.js:81-122)\n this.videoProxy = this.createVideoProxy(video);\n this.videoElement = video;\n container.appendChild(video);\n\n // Set up event listeners\n this.setupVideoEventListeners(video, options);\n this.setupStalledHandling();\n\n try {\n // Dynamic import of DASH.js\n console.debug('[DashJS] Importing dashjs module...');\n const mod = await import('dashjs');\n const dashjs = (mod as any).default || (mod as any);\n console.debug('[DashJS] Module imported:', dashjs);\n\n this.dashPlayer = dashjs.MediaPlayer().create();\n console.debug('[DashJS] MediaPlayer created');\n\n // Set up event logging (reference dashjs.js:152-160)\n this.setupEventLogging(dashjs);\n\n // Set up subtitle handling (reference dashjs.js:173-197)\n this.setupSubtitleHandling();\n\n this.dashPlayer.on('error', (e: any) => {\n if (this.destroyed) return;\n const error = `DASH error: ${e?.event?.message || e?.message || 'unknown'}`;\n console.error('[DashJS] Error event:', e);\n this.emit('error', error);\n });\n\n // Log key dashjs events for debugging\n this.dashPlayer.on('manifestLoaded', (e: any) => {\n console.debug('[DashJS] manifestLoaded:', e);\n });\n this.dashPlayer.on('canPlay', () => {\n console.debug('[DashJS] canPlay event');\n });\n\n // Log stream initialization for debugging\n this.dashPlayer.on('streamInitialized', () => {\n if (this.destroyed) return;\n const isDynamic = this.dashPlayer.isDynamic?.() ?? false;\n console.debug('[DashJS v5] streamInitialized - isDynamic:', isDynamic);\n });\n\n // Configure dashjs v5 streaming settings BEFORE initialization\n this.dashPlayer.updateSettings({\n streaming: {\n // Buffer settings\n buffer: {\n fastSwitchEnabled: true,\n stableBufferTime: 16,\n bufferTimeAtTopQuality: 30,\n bufferTimeAtTopQualityLongForm: 60,\n bufferToKeep: 30,\n bufferPruningInterval: 30,\n },\n // Gaps/stall handling\n gaps: {\n jumpGaps: true,\n jumpLargeGaps: true,\n smallGapLimit: 1.5,\n threshold: 0.3,\n },\n // ABR - try disabling to isolate the issue\n abr: {\n autoSwitchBitrate: { video: true, audio: true },\n limitBitrateByPortal: false,\n useDefaultABRRules: true,\n initialBitrate: { video: -1, audio: -1 }, // Let dashjs choose\n },\n // Retry settings - more aggressive\n retryAttempts: {\n MPD: 5,\n MediaSegment: 5,\n InitializationSegment: 5,\n BitstreamSwitchingSegment: 5,\n IndexSegment: 5,\n XLinkExpansion: 3,\n other: 3,\n },\n retryIntervals: {\n MPD: 1000,\n MediaSegment: 1000,\n InitializationSegment: 1000,\n BitstreamSwitchingSegment: 1000,\n IndexSegment: 1000,\n XLinkExpansion: 1000,\n other: 1000,\n },\n // Timeout settings - faster abandonment of slow segments\n timeoutAttempts: {\n MPD: 2,\n MediaSegment: 2, // Abandon after 2 timeout attempts\n InitializationSegment: 2,\n BitstreamSwitchingSegment: 2,\n IndexSegment: 2,\n XLinkExpansion: 1,\n other: 1,\n },\n // Abandon slow segment downloads more quickly\n abandonLoadTimeout: 5000, // 5 seconds instead of default 10\n xhrWithCredentials: false,\n text: { defaultEnabled: false },\n // Live delay settings for live streams\n delay: {\n liveDelay: 4, // Target 4 seconds behind live edge\n liveDelayFragmentCount: null,\n useSuggestedPresentationDelay: true,\n },\n },\n debug: {\n logLevel: 4, // Always debug for now to see what's happening\n },\n });\n\n // Add fragment loading event listeners to debug the pending issue\n this.dashPlayer.on('fragmentLoadingStarted', (e: any) => {\n console.debug('[DashJS] Fragment loading started:', e.request?.url?.split('/').pop());\n });\n this.dashPlayer.on('fragmentLoadingCompleted', (e: any) => {\n console.debug('[DashJS] Fragment loading completed:', e.request?.url?.split('/').pop());\n });\n this.dashPlayer.on('fragmentLoadingAbandoned', (e: any) => {\n console.warn('[DashJS] Fragment loading ABANDONED:', e.request?.url?.split('/').pop(), e);\n });\n this.dashPlayer.on('fragmentLoadingFailed', (e: any) => {\n console.error('[DashJS] Fragment loading FAILED:', e.request?.url?.split('/').pop(), e);\n });\n\n // dashjs v5: Initialize with URL\n console.debug('[DashJS v5] Initializing with URL:', source.url);\n this.dashPlayer.initialize(video, source.url, options.autoplay ?? false);\n console.debug('[DashJS v5] Initialize called');\n\n // Optional subtitle tracks helper from source extras (external tracks)\n try {\n const subs = (source as any).subtitles as Array<{ label: string; lang: string; src: string }>;\n if (Array.isArray(subs)) {\n subs.forEach((s, idx) => {\n const track = document.createElement('track');\n track.kind = 'subtitles';\n track.label = s.label;\n track.srclang = s.lang;\n track.src = s.src;\n if (idx === 0) track.default = true;\n video.appendChild(track);\n });\n }\n } catch {}\n\n return video;\n\n } catch (error: any) {\n this.emit('error', error.message || String(error));\n throw error;\n }\n }\n\n /**\n * Get DASH.js-specific stats for ABR and playback monitoring\n * Updated for dashjs v5 API\n */\n async getStats(): Promise<{\n type: 'dash';\n currentQuality: number;\n bufferLevel: number;\n bitrateInfoList: Array<{ bitrate: number; width: number; height: number }>;\n currentBitrate: number;\n playbackRate: number;\n } | undefined> {\n if (!this.dashPlayer || !this.videoElement) return undefined;\n\n try {\n // dashjs v5: getCurrentRepresentationForType returns Representation object\n const currentRep = this.dashPlayer.getCurrentRepresentationForType?.('video');\n // dashjs v5: getRepresentationsByType returns Representation[] (bandwidth instead of bitrate)\n const representations = this.dashPlayer.getRepresentationsByType?.('video') || [];\n const bufferLevel = this.dashPlayer.getBufferLength('video') || 0;\n\n // Find current quality index\n const currentIndex = currentRep ? representations.findIndex((r: any) => r.id === currentRep.id) : 0;\n\n return {\n type: 'dash',\n currentQuality: currentIndex >= 0 ? currentIndex : 0,\n bufferLevel,\n bitrateInfoList: representations.map((r: any) => ({\n bitrate: r.bandwidth || 0, // v5 uses 'bandwidth' not 'bitrate'\n width: r.width || 0,\n height: r.height || 0,\n })),\n currentBitrate: currentRep?.bandwidth || 0,\n playbackRate: this.videoElement.playbackRate,\n };\n } catch {\n return undefined;\n }\n }\n\n /**\n * Set playback rate\n */\n setPlaybackRate(rate: number): void {\n if (this.videoElement) {\n this.videoElement.playbackRate = rate;\n }\n }\n\n /**\n * Set source URL for seamless source switching.\n * Ported from reference dashjs.js:166-168.\n */\n setSource(url: string): void {\n if (this.dashPlayer) {\n this.dashPlayer.attachSource(url);\n }\n }\n\n /**\n * Get duration using proxy for live streams.\n * Returns synthetic growing duration for live content.\n */\n getDuration(): number {\n // Use proxy if available for live duration handling\n if (this.videoProxy && this.isLiveStream()) {\n return (this.videoProxy as any).duration ?? 0;\n }\n return this.videoElement?.duration ?? 0;\n }\n\n /**\n * Jump to live edge for live streams.\n * Uses DASH.js seekToLive API when available.\n */\n jumpToLive(): void {\n const video = this.videoElement;\n if (!video || !this.isLiveStream()) return;\n\n // DASH.js has a seekToLive method for live streams\n if (this.dashPlayer && typeof this.dashPlayer.seekToLive === 'function') {\n console.debug('[DashJS] jumpToLive using seekToLive()');\n this.dashPlayer.seekToLive();\n return;\n }\n\n // Fallback: seek to end of seekable range\n if (video.seekable && video.seekable.length > 0) {\n const liveEdge = video.seekable.end(video.seekable.length - 1);\n if (isFinite(liveEdge) && liveEdge > 0) {\n console.debug('[DashJS] jumpToLive using seekable.end:', liveEdge);\n video.currentTime = liveEdge;\n }\n }\n }\n\n /**\n * Get latency from live edge (for live streams)\n */\n getLiveLatency(): number {\n const video = this.videoElement;\n if (!video || !this.isLiveStream()) return 0;\n\n // DASH.js provides live delay metrics\n if (this.dashPlayer && typeof this.dashPlayer.getCurrentLiveLatency === 'function') {\n return this.dashPlayer.getCurrentLiveLatency() * 1000;\n }\n\n // Fallback: calculate from seekable end\n if (video.seekable && video.seekable.length > 0) {\n const liveEdge = video.seekable.end(video.seekable.length - 1);\n if (isFinite(liveEdge)) {\n return Math.max(0, (liveEdge - video.currentTime) * 1000);\n }\n }\n\n return 0;\n }\n\n async destroy(): Promise<void> {\n this.destroyed = true;\n this.subsLoaded = false;\n this.pendingSubtitleId = null;\n this.videoProxy = null;\n\n if (this.dashPlayer) {\n try {\n this.dashPlayer.reset();\n } catch (e) {\n console.warn('Error destroying DASH.js:', e);\n }\n this.dashPlayer = null;\n }\n\n if (this.videoElement && this.container) {\n try { this.container.removeChild(this.videoElement); } catch {}\n }\n\n this.videoElement = null;\n this.container = null;\n this.listeners.clear();\n }\n\n getQualities(): Array<{ id: string; label: string; bitrate?: number; width?: number; height?: number; isAuto?: boolean; active?: boolean }> {\n const out: any[] = [];\n const v = this.videoElement;\n if (!this.dashPlayer || !v) return out;\n try {\n // dashjs v5: getRepresentationsByType returns Representation[] (bandwidth instead of bitrate)\n const representations = this.dashPlayer.getRepresentationsByType?.('video') || [];\n const settings = this.dashPlayer.getSettings?.();\n const isAutoEnabled = settings?.streaming?.abr?.autoSwitchBitrate?.video !== false;\n\n out.push({ id: 'auto', label: 'Auto', isAuto: true, active: isAutoEnabled });\n representations.forEach((rep: any, i: number) => {\n out.push({\n id: String(i),\n label: rep.height ? `${rep.height}p` : `${Math.round((rep.bandwidth || 0) / 1000)}kbps`,\n bitrate: rep.bandwidth, // v5 uses 'bandwidth'\n width: rep.width,\n height: rep.height\n });\n });\n } catch {}\n return out;\n }\n\n selectQuality(id: string): void {\n if (!this.dashPlayer) return;\n if (id === 'auto') {\n this.dashPlayer.updateSettings({ streaming: { abr: { autoSwitchBitrate: { video: true } } } });\n return;\n }\n const idx = parseInt(id, 10);\n if (!isNaN(idx)) {\n this.dashPlayer.updateSettings({ streaming: { abr: { autoSwitchBitrate: { video: false } } } });\n // dashjs v5: setRepresentationForTypeByIndex instead of setQualityFor\n try { this.dashPlayer.setRepresentationForTypeByIndex?.('video', idx); } catch {}\n }\n }\n\n // Captions via native text tracks or dash.js API\n getTextTracks(): Array<{ id: string; label: string; lang?: string; active: boolean }> {\n const v = this.videoElement;\n if (!this.dashPlayer || !v) return [];\n const out: any[] = [];\n try {\n const textTracks = (v.textTracks || []) as any;\n for (let i = 0; i < textTracks.length; i++) {\n const tt = textTracks[i];\n out.push({ id: String(i), label: tt.label || `CC ${i+1}`, lang: (tt as any).language, active: tt.mode === 'showing' });\n }\n } catch {}\n return out;\n }\n\n selectTextTrack(id: string | null): void {\n const v = this.videoElement;\n if (!this.dashPlayer || !v) return;\n\n // Deferred loading: wait for allTextTracksAdded (reference dashjs.js:180-186)\n if (!this.subsLoaded) {\n this.pendingSubtitleId = id;\n return;\n }\n\n // Try dash.js API first (reference dashjs.js:193-197)\n try {\n const dashTracks = this.dashPlayer.getTracksFor('text');\n if (dashTracks && dashTracks.length > 0) {\n const idx = id === null ? -1 : parseInt(id, 10);\n if (idx >= 0 && idx < dashTracks.length) {\n this.dashPlayer.setTextTrack(idx);\n return;\n } else if (id === null || idx < 0) {\n // Disable all dash.js text tracks\n this.dashPlayer.setTextTrack(-1);\n return;\n }\n }\n } catch {}\n\n // Fallback to native text tracks\n const list = v.textTracks as TextTrackList;\n for (let i = 0; i < list.length; i++) {\n const tt = list[i];\n if (id !== null && String(i) === id) tt.mode = 'showing'; else tt.mode = 'disabled';\n }\n }\n}\n","import { BasePlayer } from '../core/PlayerInterface';\nimport { LiveDurationProxy } from '../core/LiveDurationProxy';\nimport type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../core/PlayerInterface';\n\nexport class VideoJsPlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: \"Video.js Player\",\n shortname: \"videojs\",\n priority: 2,\n // VideoJS only has built-in HLS support via VHS (videojs-http-streaming)\n // DASH requires videojs-contrib-dash plugin which wraps dash.js - we use DashJsPlayer directly instead\n mimes: [\n \"html5/application/vnd.apple.mpegurl\",\n \"html5/application/vnd.apple.mpegurl;version=7\",\n ]\n };\n\n private videojsPlayer: any = null;\n private container: HTMLElement | null = null;\n private destroyed = false;\n private timeCorrection: number = 0;\n private proxyElement: HTMLVideoElement | null = null;\n private currentStreamInfo: StreamInfo | null = null;\n private liveDurationProxy: LiveDurationProxy | null = null;\n\n isMimeSupported(mimetype: string): boolean {\n return this.capability.mimes.includes(mimetype);\n }\n\n isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[] {\n // Check for HTTP/HTTPS protocol mismatch\n try {\n const sourceProtocol = new URL(source.url).protocol;\n if (typeof location !== 'undefined' && location.protocol !== sourceProtocol) {\n console.debug('[VideoJS] HTTP/HTTPS mismatch - skipping');\n return false;\n }\n } catch {\n // URL parsing failed, continue with other checks\n }\n\n // Test codec support properly - don't just assume compatibility\n const playableTracks: string[] = [];\n const tracksByType: Record<string, typeof streamInfo.meta.tracks> = {};\n\n // Group tracks by type\n for (const track of streamInfo.meta.tracks) {\n if (track.type === 'meta') {\n if (track.codec === 'subtitle') {\n playableTracks.push('subtitle');\n }\n continue;\n }\n\n if (!tracksByType[track.type]) {\n tracksByType[track.type] = [];\n }\n tracksByType[track.type].push(track);\n }\n\n // HLS-incompatible audio codecs (VideoJS uses VHS for HLS)\n // HLS standard only supports: AAC, MP3, AC-3/E-AC-3\n const HLS_INCOMPATIBLE_AUDIO = ['OPUS', 'Opus', 'opus', 'VORBIS', 'Vorbis', 'FLAC'];\n\n // Test codec support for video/audio tracks using canPlayType\n const testVideo = document.createElement('video');\n for (const [trackType, tracks] of Object.entries(tracksByType)) {\n let hasPlayableTrack = false;\n\n for (const track of tracks) {\n // Explicit HLS codec filtering - OPUS doesn't work in HLS even if canPlayType says yes\n if (trackType === 'audio' && HLS_INCOMPATIBLE_AUDIO.includes(track.codec)) {\n console.debug(`[VideoJS] Codec incompatible with HLS: ${track.codec}`);\n continue;\n }\n\n // Build codec string\n let codecString = track.codec;\n if (track.init) {\n // Use init data for accurate codec string like HLS.js does\n const bin2hex = (idx: number) => {\n if (!track.init || idx >= track.init.length) return '00';\n return ('0' + track.init.charCodeAt(idx).toString(16)).slice(-2);\n };\n switch (track.codec) {\n case 'H264':\n codecString = `avc1.${bin2hex(1)}${bin2hex(2)}${bin2hex(3)}`;\n break;\n case 'AAC':\n codecString = 'mp4a.40.2';\n break;\n case 'MP3':\n codecString = 'mp4a.40.34';\n break;\n case 'HEVC':\n codecString = 'hev1.1.6.L93.B0';\n break;\n }\n }\n\n // Test with video element canPlayType\n const mimeToTest = trackType === 'audio'\n ? `audio/mp4;codecs=\"${codecString}\"`\n : `video/mp4;codecs=\"${codecString}\"`;\n\n if (testVideo.canPlayType(mimeToTest) !== '') {\n hasPlayableTrack = true;\n break;\n } else {\n console.debug(`[VideoJS] Codec not supported: ${mimeToTest}`);\n }\n }\n\n if (hasPlayableTrack) {\n playableTracks.push(trackType);\n }\n }\n\n // If no tracks to test, assume basic support (fallback behavior)\n if (Object.keys(tracksByType).length === 0) {\n return ['video', 'audio'];\n }\n\n return playableTracks.length > 0 ? playableTracks : false;\n }\n\n async initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions, streamInfo?: StreamInfo): Promise<HTMLVideoElement> {\n this.destroyed = false;\n this.container = container;\n this.currentStreamInfo = streamInfo || null;\n container.classList.add('fw-player-container');\n\n const video = document.createElement('video');\n video.classList.add('fw-player-video');\n video.setAttribute('playsinline', '');\n video.setAttribute('crossorigin', 'anonymous');\n video.className = 'video-js vjs-default-skin fw-player-video';\n\n if (options.autoplay) video.autoplay = true;\n if (options.muted) video.muted = true;\n video.controls = options.controls === true; // Explicit false to hide native controls\n if (options.loop) video.loop = true;\n if (options.poster) video.poster = options.poster;\n\n this.videoElement = video;\n container.appendChild(video);\n\n this.setupVideoEventListeners(video, options);\n\n try {\n const mod = await import('video.js');\n const videojs = (mod as any).default || (mod as any);\n\n // When using custom controls (controls: false), disable ALL VideoJS UI elements\n const useVideoJsControls = options.controls === true;\n\n // Build VideoJS options\n // NOTE: We disable UI components but NOT children array - that breaks playback\n const vjsOptions: Record<string, any> = {\n autoplay: options.autoplay,\n controls: useVideoJsControls,\n muted: options.muted,\n sources: [{ src: source.url, type: this.getVideoJsType(source.type) }],\n // Disable VideoJS UI components when using custom controls\n loadingSpinner: useVideoJsControls,\n bigPlayButton: useVideoJsControls,\n textTrackDisplay: useVideoJsControls, // We handle subtitles ourselves\n errorDisplay: useVideoJsControls,\n controlBar: useVideoJsControls,\n liveTracker: useVideoJsControls,\n // Don't set children: [] - that can break internal VideoJS components\n };\n\n // Android < 7 workaround: enable overrideNative for HLS\n const androidMatch = navigator.userAgent.match(/android\\s([\\d.]*)/i);\n const androidVersion = androidMatch ? parseFloat(androidMatch[1]) : null;\n if (androidVersion && androidVersion < 7) {\n console.debug('[VideoJS] Android < 7 detected, enabling overrideNative');\n vjsOptions.html5 = { hls: { overrideNative: true } };\n vjsOptions.nativeAudioTracks = false;\n vjsOptions.nativeVideoTracks = false;\n }\n\n console.debug('[VideoJS] Creating player with options:', vjsOptions);\n this.videojsPlayer = videojs(video, vjsOptions);\n console.debug('[VideoJS] Player created');\n\n // Hide VideoJS UI completely when using custom controls\n if (!useVideoJsControls) {\n // Add class to hide all VideoJS chrome\n const wrapper = this.videojsPlayer.el();\n if (wrapper) {\n wrapper.classList.add('vjs-fw-custom-controls');\n }\n }\n\n // Error handling with Firefox NS_ERROR detection\n this.videojsPlayer.on('error', () => {\n if (this.destroyed) return; // Guard against zombie callbacks\n const err = this.videojsPlayer?.error();\n const errorMsg = err?.message || '';\n\n // Firefox-specific segment error - trigger reload\n if (errorMsg.includes('NS_ERROR_DOM_MEDIA_OVERFLOW_ERR')) {\n console.warn('[VideoJS] Firefox segment error, requesting reload');\n this.emit('reloadrequested', { reason: 'NS_ERROR_DOM_MEDIA_OVERFLOW_ERR' });\n return;\n }\n\n this.emit('error', errorMsg || 'VideoJS playback error');\n });\n\n // FIX: Explicitly trigger play after VideoJS is ready\n // VideoJS autoplay option alone doesn't always work (browser policies)\n this.videojsPlayer.ready(() => {\n if (this.destroyed) return; // Guard against zombie callbacks\n\n // Debug: Log VideoJS tech info\n const tech = this.videojsPlayer.tech?.({ IWillNotUseThisInPlugins: true });\n console.debug('[VideoJS] ready - tech:', tech?.name || 'unknown',\n 'videoWidth:', video.videoWidth,\n 'videoHeight:', video.videoHeight,\n 'readyState:', video.readyState,\n 'networkState:', video.networkState);\n\n // Create time-corrected proxy for external consumers\n if (this.currentStreamInfo) {\n this.proxyElement = this.createTimeCorrectedProxy(video, this.currentStreamInfo);\n }\n\n // Check if live stream and set up LiveDurationProxy\n const duration = this.videojsPlayer.duration();\n if (!isFinite(duration) && !this.liveDurationProxy) {\n this.liveDurationProxy = new LiveDurationProxy(video, {\n constrainSeek: true,\n liveOffset: 0,\n });\n console.debug('[VideoJS] LiveDurationProxy initialized for live stream');\n }\n\n if (options.autoplay) {\n // Ensure muted for autoplay - browsers block unmuted autoplay\n if (!video.muted) {\n video.muted = true;\n }\n this.videojsPlayer.play().catch((e: any) => {\n console.warn('VideoJS autoplay failed:', e);\n // Emit a warning but don't fail - user can click play\n });\n }\n });\n\n // Listen for VideoJS loadedmetadata to track loading progress\n this.videojsPlayer.on('loadedmetadata', () => {\n console.debug('[VideoJS] loadedmetadata - duration:', this.videojsPlayer.duration(),\n 'videoWidth:', video.videoWidth, 'videoHeight:', video.videoHeight);\n });\n\n // Debug: Track VHS (video.js http-streaming) state\n this.videojsPlayer.on('loadeddata', () => {\n const tech = this.videojsPlayer.tech?.({ IWillNotUseThisInPlugins: true });\n const vhs = tech?.vhs || tech?.hls;\n if (vhs) {\n console.debug('[VideoJS] VHS state -',\n 'bandwidth:', vhs.bandwidth,\n 'seekable:', vhs.seekable?.()?.length > 0 ? `${vhs.seekable().start(0)}-${vhs.seekable().end(0)}` : 'none',\n 'buffered:', video.buffered.length > 0 ? `${video.buffered.end(0)}s` : 'none');\n }\n });\n\n // Listen for canplay from VideoJS to ensure we transition out of buffering\n this.videojsPlayer.on('canplay', () => {\n console.debug('[VideoJS] canplay');\n });\n\n // Additional debug events\n this.videojsPlayer.on('playing', () => {\n console.debug('[VideoJS] playing - currentTime:', this.videojsPlayer.currentTime());\n });\n\n this.videojsPlayer.on('waiting', () => {\n console.debug('[VideoJS] waiting/buffering');\n });\n\n this.videojsPlayer.on('stalled', () => {\n console.debug('[VideoJS] stalled');\n });\n\n // Log video element state\n video.addEventListener('loadeddata', () => {\n console.debug('[VideoJS] video loadeddata - readyState:', video.readyState,\n 'videoWidth:', video.videoWidth, 'videoHeight:', video.videoHeight);\n });\n\n // Emit seekable range updates for live streams (DVR support)\n this.videojsPlayer.on('progress', () => {\n if (this.destroyed) return;\n try {\n const seekable = this.videojsPlayer.seekable();\n if (seekable && seekable.length > 0) {\n const start = seekable.start(0);\n const end = seekable.end(seekable.length - 1);\n const bufferWindow = (end - start) * 1000; // Convert to ms\n this.emit('seekablechange', {\n start: start + this.timeCorrection,\n end: end + this.timeCorrection,\n bufferWindow\n });\n }\n } catch {\n // Seekable not available yet\n }\n });\n\n return this.proxyElement || video;\n\n } catch (error: any) {\n this.emit('error', error.message || String(error));\n throw error;\n }\n }\n\n /**\n * Creates a Proxy wrapper around the video element that corrects\n * currentTime/duration/buffered using the firstms offset from MistServer.\n * This ensures timestamps align with MistServer's track metadata.\n */\n private createTimeCorrectedProxy(video: HTMLVideoElement, streamInfo: StreamInfo): HTMLVideoElement {\n // Calculate correction from minimum firstms across all tracks\n let firstms = Infinity;\n for (const track of streamInfo.meta.tracks) {\n if ((track as any).firstms !== undefined && (track as any).firstms < firstms) {\n firstms = (track as any).firstms;\n }\n }\n this.timeCorrection = firstms !== Infinity ? firstms / 1000 : 0;\n\n // No correction needed or Proxy not supported\n if (this.timeCorrection === 0 || typeof Proxy === 'undefined') {\n return video;\n }\n\n console.debug(`[VideoJS] Applying timestamp correction: ${this.timeCorrection}s (firstms=${firstms})`);\n\n const correction = this.timeCorrection;\n const vjsPlayer = this.videojsPlayer;\n\n return new Proxy(video, {\n get: (target, prop) => {\n if (prop === 'currentTime') {\n const time = vjsPlayer ? vjsPlayer.currentTime() : target.currentTime;\n return isNaN(time) ? 0 : time + correction;\n }\n if (prop === 'duration') {\n const duration = target.duration;\n return isNaN(duration) ? 0 : duration + correction;\n }\n if (prop === 'buffered') {\n const buffered = target.buffered;\n return {\n length: buffered.length,\n start: (i: number) => buffered.start(i) + correction,\n end: (i: number) => buffered.end(i) + correction,\n };\n }\n const value = target[prop as keyof HTMLVideoElement];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n },\n set: (target, prop, value) => {\n if (prop === 'currentTime') {\n // Use VideoJS API for seeking (fixes backwards seeking in HLS)\n const correctedValue = value - correction;\n if (vjsPlayer) {\n vjsPlayer.currentTime(correctedValue);\n } else {\n target.currentTime = correctedValue;\n }\n return true;\n }\n (target as any)[prop] = value;\n return true;\n }\n }) as HTMLVideoElement;\n }\n\n private getVideoJsType(mimeType?: string): string {\n if (!mimeType) return 'application/x-mpegURL';\n\n // Convert our mime types to VideoJS types\n if (mimeType.includes('mpegurl')) return 'application/x-mpegURL';\n if (mimeType.includes('dash')) return 'application/dash+xml';\n if (mimeType.includes('mp4')) return 'video/mp4';\n if (mimeType.includes('webm')) return 'video/webm';\n\n return mimeType.replace('html5/', '');\n }\n\n setPlaybackRate(rate: number): void {\n super.setPlaybackRate(rate);\n try {\n if (this.videojsPlayer) this.videojsPlayer.playbackRate(rate);\n } catch {}\n }\n\n getCurrentTime(): number {\n const v = this.proxyElement || this.videoElement;\n return v?.currentTime ?? 0;\n }\n\n getDuration(): number {\n const v = this.proxyElement || this.videoElement;\n return v?.duration ?? 0;\n }\n\n getSeekableRange(): { start: number; end: number } | null {\n if (this.videojsPlayer?.seekable) {\n try {\n const seekable = this.videojsPlayer.seekable();\n if (seekable && seekable.length > 0) {\n const start = seekable.start(0) + this.timeCorrection;\n const end = seekable.end(seekable.length - 1) + this.timeCorrection;\n if (Number.isFinite(start) && Number.isFinite(end) && end >= start) {\n return { start, end };\n }\n }\n } catch {}\n }\n return null;\n }\n\n /**\n * Seek to time using VideoJS API (fixes backwards seeking in HLS).\n * Time should be in the corrected coordinate space (with firstms offset applied).\n */\n seek(time: number): void {\n const correctedTime = time - this.timeCorrection;\n if (this.videojsPlayer) {\n this.videojsPlayer.currentTime(correctedTime);\n } else if (this.videoElement) {\n this.videoElement.currentTime = correctedTime;\n }\n }\n\n /**\n * Get VideoJS-specific stats for playback monitoring\n */\n async getStats(): Promise<{\n type: 'videojs';\n buffered: number;\n currentTime: number;\n duration: number;\n readyState: number;\n networkState: number;\n playbackRate: number;\n } | undefined> {\n const video = this.videoElement;\n if (!video) return undefined;\n\n // Calculate buffered ahead of current position\n let buffered = 0;\n if (video.buffered.length > 0) {\n for (let i = 0; i < video.buffered.length; i++) {\n if (video.buffered.start(i) <= video.currentTime && video.buffered.end(i) > video.currentTime) {\n buffered = video.buffered.end(i) - video.currentTime;\n break;\n }\n }\n }\n\n return {\n type: 'videojs',\n buffered,\n currentTime: video.currentTime,\n duration: video.duration,\n readyState: video.readyState,\n networkState: video.networkState,\n playbackRate: video.playbackRate,\n };\n }\n\n // ============================================================================\n // Live Stream Support\n // ============================================================================\n\n /**\n * Check if the stream is live\n */\n isLiveStream(): boolean {\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.isLive();\n }\n const video = this.videoElement;\n if (!video) return false;\n return !isFinite(video.duration);\n }\n\n /**\n * Get the calculated duration for live streams\n */\n getDuration(): number {\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.getDuration();\n }\n return this.videoElement?.duration ?? 0;\n }\n\n /**\n * Jump to live edge\n * Uses VideoJS liveTracker when available, otherwise LiveDurationProxy\n */\n jumpToLive(): void {\n const video = this.videoElement;\n if (!video) return;\n\n // VideoJS has a liveTracker module for live streams\n if (this.videojsPlayer && this.videojsPlayer.liveTracker) {\n const tracker = this.videojsPlayer.liveTracker;\n if (tracker.isLive && tracker.isLive()) {\n const liveCurrentTime = tracker.liveCurrentTime?.();\n if (typeof liveCurrentTime === 'number' && liveCurrentTime > 0) {\n console.debug('[VideoJS] jumpToLive using liveTracker:', liveCurrentTime);\n this.videojsPlayer.currentTime(liveCurrentTime);\n return;\n }\n }\n }\n\n // Fall back to LiveDurationProxy\n if (this.liveDurationProxy && this.liveDurationProxy.isLive()) {\n console.debug('[VideoJS] jumpToLive using LiveDurationProxy');\n this.liveDurationProxy.jumpToLive();\n return;\n }\n\n // VideoJS seekable fallback\n if (this.videojsPlayer) {\n try {\n const seekable = this.videojsPlayer.seekable();\n if (seekable && seekable.length > 0) {\n const liveEdge = seekable.end(seekable.length - 1);\n if (isFinite(liveEdge) && liveEdge > 0) {\n console.debug('[VideoJS] jumpToLive using seekable.end:', liveEdge);\n this.videojsPlayer.currentTime(liveEdge);\n return;\n }\n }\n } catch {}\n }\n\n // Native video seekable fallback\n if (video.seekable && video.seekable.length > 0) {\n const liveEdge = video.seekable.end(video.seekable.length - 1);\n if (isFinite(liveEdge) && liveEdge > 0) {\n console.debug('[VideoJS] jumpToLive using video.seekable.end:', liveEdge);\n video.currentTime = liveEdge;\n }\n }\n }\n\n /**\n * Get latency from live edge (for live streams)\n */\n getLiveLatency(): number {\n const video = this.videoElement;\n if (!video) return 0;\n\n // VideoJS liveTracker provides seekableEnd\n if (this.videojsPlayer && this.videojsPlayer.liveTracker) {\n const tracker = this.videojsPlayer.liveTracker;\n if (tracker.isLive?.() && typeof tracker.seekableEnd === 'function') {\n const liveEdge = tracker.seekableEnd();\n if (typeof liveEdge === 'number' && isFinite(liveEdge)) {\n return Math.max(0, (liveEdge - video.currentTime) * 1000);\n }\n }\n }\n\n // Fall back to proxy\n if (this.liveDurationProxy) {\n return this.liveDurationProxy.getLatency() * 1000;\n }\n\n return 0;\n }\n\n async destroy(): Promise<void> {\n this.destroyed = true;\n\n if (this.liveDurationProxy) {\n this.liveDurationProxy.destroy();\n this.liveDurationProxy = null;\n }\n\n if (this.videojsPlayer) {\n try {\n this.videojsPlayer.dispose();\n } catch (e) {\n console.warn('Error disposing VideoJS:', e);\n }\n this.videojsPlayer = null;\n }\n\n if (this.videoElement && this.container) {\n try { this.container.removeChild(this.videoElement); } catch {}\n }\n\n this.videoElement = null;\n this.container = null;\n this.proxyElement = null;\n this.currentStreamInfo = null;\n this.timeCorrection = 0;\n this.listeners.clear();\n }\n}\n","import { BasePlayer } from '../core/PlayerInterface';\nimport type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../core/PlayerInterface';\n\n/**\n * MistPlayerImpl - Legacy fallback player\n *\n * Simple passthrough to MistServer's native player.js embed.\n * No codec preferences or fancy params - just let MistServer handle everything.\n * This is the final fallback when other players fail.\n */\nexport class MistPlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: \"Legacy\",\n shortname: \"mist-legacy\",\n priority: 99, // Final fallback - lowest priority\n // Single special type - PlayerManager adds this as ONE option\n mimes: [\"mist/legacy\"]\n };\n\n private container: HTMLElement | null = null;\n private mistDiv: HTMLDivElement | null = null;\n private proxyVideo: HTMLVideoElement | null = null;\n private previousContainerOverflow: string | null = null;\n private destroyed = false;\n\n isMimeSupported(mimetype: string): boolean {\n // Only match our special type - PlayerManager handles adding us once\n return mimetype === \"mist/legacy\";\n }\n\n isBrowserSupported(mimetype: string, _source: StreamSource, _streamInfo: StreamInfo): boolean | string[] {\n // Only compatible with our special type\n if (mimetype !== \"mist/legacy\") return false;\n return ['video', 'audio'];\n }\n\n async initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement> {\n this.destroyed = false;\n this.container = container;\n container.classList.add('fw-player-container');\n\n // Generate unique ID for this embed\n const streamName = source.streamName || 'stream';\n const uniqueId = `${streamName.replace(/[^a-zA-Z0-9]/g, '_')}_${Math.random().toString(36).slice(2, 10)}`;\n\n // Create the mistvideo div\n this.mistDiv = document.createElement('div');\n this.mistDiv.className = 'mistvideo fw-player-container';\n this.mistDiv.id = uniqueId;\n this.mistDiv.style.width = '100%';\n this.mistDiv.style.height = '100%';\n this.mistDiv.style.overflow = 'hidden'; // Prevent legacy player overflow\n // Also on container, but restore on destroy (don't clobber consumer styles permanently)\n this.previousContainerOverflow = container.style.overflow ?? '';\n container.style.overflow = 'hidden';\n container.appendChild(this.mistDiv);\n\n // Derive player.js URL from source URL\n const playerJsUrl = this.getPlayerJsUrl(source);\n\n // Load and call mistPlay - simple passthrough, no extra params\n await this.loadAndPlay(streamName, uniqueId, playerJsUrl, options);\n\n // Find the video element MistServer created (for compatibility)\n const video = this.findVideoElement() || this.createProxyVideo(container);\n this.videoElement = video;\n this.setupVideoEventListeners(video, options);\n\n return video;\n }\n\n private getPlayerJsUrl(source: StreamSource): string {\n // Try to derive player.js URL from source\n if (source.mistPlayerUrl) return source.mistPlayerUrl;\n\n try {\n const url = new URL(source.url);\n // Use same protocol, different path\n return `${url.protocol}//${url.host}/player.js`;\n } catch {\n // Fallback: relative path\n return '/player.js';\n }\n }\n\n private async loadAndPlay(streamName: string, targetId: string, playerJsUrl: string, options: PlayerOptions): Promise<void> {\n const play = () => {\n if (this.destroyed) return;\n if ((window as any).mistPlay) {\n // Let MistServer handle source selection - no forcePriority\n const mistOptions: any = {\n target: document.getElementById(targetId),\n fillSpace: true,\n // MistServer's player.js has its own UI - always enable controls\n controls: true,\n // Use dev skin when devMode is enabled - shows MistServer's source selection UI\n skin: options.devMode ? 'dev' : 'default',\n // Only pass basic playback options\n ...(options.autoplay !== undefined && { autoplay: options.autoplay }),\n ...(options.muted !== undefined && { muted: options.muted }),\n ...(options.poster && { poster: options.poster }),\n };\n\n console.debug('[Legacy] mistPlay options:', mistOptions);\n (window as any).mistPlay(streamName, mistOptions);\n }\n };\n\n if (!(window as any).mistplayers) {\n // Load player.js\n await new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = playerJsUrl;\n script.onload = () => {\n play();\n resolve();\n };\n script.onerror = () => reject(new Error(`Failed to load MistServer player from ${playerJsUrl}`));\n document.head.appendChild(script);\n });\n } else {\n play();\n }\n }\n\n private findVideoElement(): HTMLVideoElement | null {\n if (!this.mistDiv) return null;\n return this.mistDiv.querySelector('video');\n }\n\n private createProxyVideo(container: HTMLElement): HTMLVideoElement {\n const video = document.createElement('video');\n video.style.display = 'none';\n container.appendChild(video);\n this.proxyVideo = video;\n return video;\n }\n\n async destroy(): Promise<void> {\n this.destroyed = true;\n\n // Try to unload via MistServer API\n if (this.mistDiv) {\n try {\n const ref = (this.mistDiv as any).MistVideoObject?.reference;\n if (ref && typeof ref.unload === 'function') {\n ref.unload();\n }\n } catch (e) {\n // Ignore cleanup errors\n }\n try {\n this.mistDiv.remove();\n } catch {\n // Fallback for older DOM implementations\n try {\n this.mistDiv.parentNode?.removeChild(this.mistDiv);\n } catch {}\n }\n this.mistDiv = null;\n }\n\n if (this.proxyVideo) {\n try {\n this.proxyVideo.remove();\n } catch {\n try {\n this.proxyVideo.parentNode?.removeChild(this.proxyVideo);\n } catch {}\n }\n this.proxyVideo = null;\n }\n\n if (this.container) {\n // Restore container overflow if we changed it.\n try {\n if (this.previousContainerOverflow !== null) {\n this.container.style.overflow = this.previousContainerOverflow;\n }\n } catch {}\n }\n\n this.videoElement = null;\n this.container = null;\n this.previousContainerOverflow = null;\n this.listeners.clear();\n }\n}\n","/**\n * WebSocket Manager for MEWS Player\n *\n * Handles WebSocket connection, reconnection with exponential backoff,\n * message sending, and typed message listeners.\n *\n * Ported from reference: mews.js:387-883\n */\n\nimport type { WebSocketManagerOptions, MewsMessage, MewsMessageListener } from './types';\n\nexport class WebSocketManager {\n private ws: WebSocket | null = null;\n private url: string;\n private maxReconnectAttempts: number;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private wasConnected = false;\n private isDestroyed = false;\n\n // Track pending retry timers so they can be cancelled on destroy\n private pendingRetryTimers: Set<ReturnType<typeof setTimeout>> = new Set();\n\n // Message listener registry (ported from mews.js:440-451)\n // Allows multiple listeners per message type for proper seek/play sequencing\n private listeners: Record<string, MewsMessageListener[]> = {};\n\n private onMessage: (data: ArrayBuffer | string) => void;\n private onOpen: () => void;\n private onClose: () => void;\n private onError: (message: string) => void;\n\n constructor(options: WebSocketManagerOptions) {\n this.url = options.url;\n this.maxReconnectAttempts = options.maxReconnectAttempts ?? 5;\n this.onMessage = options.onMessage;\n this.onOpen = options.onOpen;\n this.onClose = options.onClose;\n this.onError = options.onError;\n }\n\n connect(): void {\n if (this.isDestroyed) return;\n\n // Protocol mismatch check (non-fatal warning)\n try {\n const pageProto = window.location.protocol.replace(/^http/, 'ws');\n const srcProto = new URL(this.url, window.location.href).protocol;\n if (pageProto !== srcProto) {\n this.onError(`Protocol mismatch ${pageProto} vs ${srcProto}`);\n }\n } catch {}\n\n const ws = new WebSocket(this.url);\n ws.binaryType = 'arraybuffer';\n this.ws = ws;\n\n ws.onopen = () => {\n this.wasConnected = true;\n this.reconnectAttempts = 0;\n this.clearReconnectTimer();\n this.onOpen();\n };\n\n ws.onmessage = (e: MessageEvent<ArrayBuffer | string>) => {\n this.onMessage(e.data);\n };\n\n ws.onerror = () => {\n this.onError('WebSocket error');\n };\n\n ws.onclose = () => {\n if (this.isDestroyed) return;\n\n if (this.wasConnected && this.reconnectAttempts < this.maxReconnectAttempts) {\n const backoff = Math.min(5000, 500 * Math.pow(2, this.reconnectAttempts));\n this.reconnectAttempts++;\n this.reconnectTimer = setTimeout(() => {\n if (!this.isDestroyed) {\n this.connect();\n }\n }, backoff);\n } else {\n this.onClose();\n this.onError('WebSocket closed');\n }\n };\n }\n\n /**\n * Send a command with retry logic (3.3.6).\n * If not connected, will retry up to 5 times with 500ms delay.\n * If connection is closing/closed, will attempt reconnect then retry.\n */\n send(cmd: object, retry = 0): boolean {\n const MAX_RETRIES = 5;\n const RETRY_DELAY = 500;\n\n // Early exit if destroyed - don't schedule any retries\n if (this.isDestroyed) return false;\n\n if (retry > MAX_RETRIES) {\n this.onError('Too many send retries');\n return false;\n }\n\n // Helper to schedule retry with tracking\n const scheduleRetry = (delay: number) => {\n const timer = setTimeout(() => {\n this.pendingRetryTimers.delete(timer);\n if (!this.isDestroyed) {\n this.send(cmd, retry + 1);\n }\n }, delay);\n this.pendingRetryTimers.add(timer);\n };\n\n if (!this.ws) {\n // No socket at all, try to connect and retry\n if (!this.isDestroyed && retry < MAX_RETRIES) {\n scheduleRetry(RETRY_DELAY);\n }\n return false;\n }\n\n if (this.ws.readyState < WebSocket.OPEN) {\n // Still connecting, wait and retry (if not destroyed)\n if (!this.isDestroyed && retry < MAX_RETRIES) {\n scheduleRetry(RETRY_DELAY);\n }\n return false;\n }\n\n if (this.ws.readyState >= WebSocket.CLOSING) {\n // Closing or closed, trigger reconnect and retry\n if (!this.isDestroyed && retry < MAX_RETRIES) {\n this.connect();\n scheduleRetry(RETRY_DELAY * 2);\n }\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(cmd));\n return true;\n } catch {\n return false;\n }\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n destroy(): void {\n console.debug('[WebSocketManager] destroy() called');\n this.isDestroyed = true;\n this.clearReconnectTimer();\n\n // Cancel ALL pending retry timers to prevent any scheduled sends\n for (const timer of this.pendingRetryTimers) {\n clearTimeout(timer);\n }\n this.pendingRetryTimers.clear();\n\n // Clear all listeners to prevent memory leaks\n this.listeners = {};\n\n if (this.ws) {\n try {\n this.ws.close();\n } catch {}\n this.ws = null;\n }\n console.debug('[WebSocketManager] destroy() completed');\n }\n\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Add a listener for a specific message type.\n * Ported from mews.js:441-444\n *\n * @param type - Message type to listen for (e.g., 'on_time', 'codec_data', 'seek')\n * @param callback - Function to call when message is received\n */\n addListener(type: string, callback: MewsMessageListener): void {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n this.listeners[type].push(callback);\n }\n\n /**\n * Remove a listener for a specific message type.\n * Ported from mews.js:445-450\n *\n * @param type - Message type\n * @param callback - The exact callback function to remove\n * @returns true if listener was found and removed\n */\n removeListener(type: string, callback: MewsMessageListener): boolean {\n if (!(type in this.listeners)) {\n return false;\n }\n const index = this.listeners[type].indexOf(callback);\n if (index < 0) {\n return false;\n }\n this.listeners[type].splice(index, 1);\n return true;\n }\n\n /**\n * Notify all listeners for a given message type.\n * Called internally when a JSON message is received.\n * Ported from mews.js:795-799\n *\n * @param msg - Parsed message object\n */\n notifyListeners(msg: MewsMessage): void {\n if (msg.type in this.listeners) {\n // Iterate backwards in case listeners remove themselves\n const callbacks = this.listeners[msg.type];\n for (let i = callbacks.length - 1; i >= 0; i--) {\n try {\n callbacks[i](msg);\n } catch (e) {\n // Don't let one listener crash others\n console.error('MEWS listener error:', e);\n }\n }\n }\n }\n}\n","/**\n * SourceBuffer Manager for MEWS Player\n *\n * Handles MediaSource Extension (MSE) buffer operations.\n * Ported from reference: mews.js:206-384\n *\n * Key features:\n * - Buffer creation and codec configuration\n * - Append queue management with _append/_do/_doNext pattern\n * - QuotaExceededError handling\n * - Buffer cleanup (_clean)\n * - Track switch msgqueue handling\n */\n\nimport type { SourceBufferManagerOptions } from './types';\n\nexport class SourceBufferManager {\n private mediaSource: MediaSource;\n private videoElement: HTMLVideoElement;\n private sourceBuffer: SourceBuffer | null = null;\n private onError: (message: string) => void;\n\n // Append queue for when buffer is busy (ported from mews.js:218)\n private queue: Uint8Array[] = [];\n\n // Busy flag to prevent concurrent appends (ported from mews.js:296, 266, 301)\n private _busy = false;\n\n // Operations to run after updateend (ported from mews.js:219, 247-262)\n private do_on_updateend: Array<(remaining?: Array<() => void>) => void> = [];\n\n // Message queue for track switches (ported from mews.js:452, 689-693)\n // Array of arrays to handle rapid switches. Binary data goes to latest array.\n // On reinit, oldest array is drained first to preserve order.\n private msgqueue: Uint8Array[][] | false = false;\n\n // Track current codecs to skip unnecessary reinits\n private _codecs: string[] = [];\n\n // Fragment counter for proactive buffer cleaning (ported from mews.js:223, 237-245)\n private fragmentCount = 0;\n\n // Paused flag for browser pause detection (ported from mews.js:506, 791)\n public paused = false;\n\n // Debugging mode\n private debugging = false;\n\n constructor(options: SourceBufferManagerOptions) {\n this.mediaSource = options.mediaSource;\n this.videoElement = options.videoElement;\n this.onError = options.onError;\n }\n\n /**\n * Initialize the SourceBuffer with the given codecs.\n * Ported from mews.js:206-384 (sbinit function)\n */\n initWithCodecs(codecs: string[]): boolean {\n if (this.sourceBuffer) {\n // Already initialized\n return true;\n }\n if (!codecs || !codecs.length) {\n this.onError('No codecs provided');\n return false;\n }\n\n const container = 'mp4'; // Could be 'webm' for WebM container\n const mime = `video/${container};codecs=\"${codecs.join(',')}\"`;\n\n if (!MediaSource.isTypeSupported(mime)) {\n this.onError(`Unsupported MSE codec: ${mime}`);\n return false;\n }\n\n try {\n // Create SourceBuffer (mews.js:211)\n this.sourceBuffer = this.mediaSource.addSourceBuffer(mime);\n // Use segments mode - fragments will be put at correct time (mews.js:212)\n this.sourceBuffer.mode = 'segments';\n // Save current codecs (mews.js:215)\n this._codecs = codecs.slice();\n\n this.installEventHandlers();\n\n // Drain any pre-buffered messages from track switch queue (mews.js:341-367)\n this.drainMessageQueue();\n\n // Flush any data that was queued before sourceBuffer was ready\n this.flushQueue();\n\n return true;\n } catch (e: any) {\n this.onError(e?.message || 'Failed to create SourceBuffer');\n return false;\n }\n }\n\n /**\n * Get current codecs\n */\n getCodecs(): string[] {\n return this._codecs;\n }\n\n /**\n * Queue data for appending to the buffer.\n * If a track switch is in progress (msgqueue active), data goes to the latest queue.\n * Ported from mews.js:809-824\n */\n append(data: Uint8Array): void {\n if (!data || !data.byteLength) return;\n\n // If track switch in progress, queue to msgqueue instead (mews.js:818-824)\n if (this.msgqueue) {\n this.msgqueue[this.msgqueue.length - 1].push(data);\n return;\n }\n\n // No sourceBuffer yet, queue for later (mews.js:809-816)\n if (!this.sourceBuffer) {\n this.queue.push(data);\n return;\n }\n\n // Check if we can append now\n if (this.sourceBuffer.updating || this.queue.length || this._busy) {\n this.queue.push(data);\n return;\n }\n\n // Append directly\n this._append(data);\n }\n\n /**\n * Internal append with error handling.\n * Ported from mews.js:292-339\n */\n private _append(data: Uint8Array): void {\n if (!data || !data.buffer) return;\n if (!this.sourceBuffer) return;\n\n if (this._busy) {\n // Still busy, put back in queue (mews.js:296-300)\n if (this.debugging) console.warn('MEWS: wanted to append but busy, requeuing');\n this.queue.unshift(data);\n return;\n }\n\n this._busy = true;\n\n try {\n // Handle SharedArrayBuffer edge case (mews.js doesn't have this, but we need it)\n if (data.buffer instanceof SharedArrayBuffer) {\n const buffer = new ArrayBuffer(data.byteLength);\n new Uint8Array(buffer).set(data);\n this.sourceBuffer.appendBuffer(buffer);\n } else {\n this.sourceBuffer.appendBuffer(\n data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)\n );\n }\n } catch (e: any) {\n // Error handling (mews.js:306-338)\n switch (e?.name) {\n case 'QuotaExceededError': {\n // Buffer is full - clean up and retry (mews.js:308-324)\n const buffered = this.videoElement.buffered;\n if (buffered.length && this.videoElement.currentTime - buffered.start(0) > 1) {\n // Clear as much from buffer as we can\n if (this.debugging) {\n console.log('MEWS: QuotaExceededError, cleaning buffer');\n }\n this._clean(1); // Keep 1 second\n this._busy = false;\n this._append(data); // Retry\n return;\n } else if (buffered.length) {\n // Can't clean more, skip ahead (mews.js:316-319)\n const bufferEnd = buffered.end(buffered.length - 1);\n if (this.debugging) {\n console.log('MEWS: QuotaExceededError, skipping ahead');\n }\n this.videoElement.currentTime = bufferEnd;\n this._busy = false;\n this._append(data);\n return;\n }\n break;\n }\n case 'InvalidStateError': {\n // Playback is borked (mews.js:326-334)\n if (this.videoElement.error) {\n // Video element error will handle this\n this._busy = false;\n return;\n }\n break;\n }\n }\n this.onError(e?.message || 'Append buffer failed');\n this._busy = false;\n }\n }\n\n /**\n * Schedule an operation to run on next updateend.\n * Ported from mews.js:281-283\n */\n _doNext(func: () => void): void {\n this.do_on_updateend.push(func);\n }\n\n /**\n * Run operation now if not busy, otherwise schedule for updateend.\n * Ported from mews.js:284-291\n */\n _do(func: (remaining?: Array<() => void>) => void): void {\n if (!this.sourceBuffer) {\n this._doNext(func);\n return;\n }\n if (this.sourceBuffer.updating || this._busy) {\n this._doNext(func);\n } else {\n func();\n }\n }\n\n /**\n * Schedule an operation to run after the current SourceBuffer update completes.\n * Public API for external callers.\n */\n scheduleAfterUpdate(fn: () => void): void {\n this._doNext(fn);\n }\n\n /**\n * Change codecs mid-stream (track switch).\n * Uses message queue to prevent data loss during rapid switches.\n * Ported from mews.js:623-788\n */\n changeCodecs(codecs: string[], switchPointMs?: number): void {\n // Skip reinit if codecs are identical (mews.js:676)\n if (this.codecsEqual(this._codecs, codecs)) {\n if (this.debugging) console.log('MEWS: keeping source buffer, codecs same');\n return;\n }\n\n const container = 'mp4';\n const mime = `video/${container};codecs=\"${codecs.join(',')}\"`;\n if (!MediaSource.isTypeSupported(mime)) {\n this.onError(`Unsupported codec for switch: ${mime}`);\n return;\n }\n\n // Start message queue for track switch (mews.js:689-693)\n if (this.msgqueue) {\n this.msgqueue.push([]); // Add new queue for rapid switch\n } else {\n this.msgqueue = [[]];\n }\n\n const pendingCodecs = codecs.slice();\n\n if (typeof switchPointMs === 'number' && switchPointMs > 0) {\n // Wait for playback to reach switching point (mews.js:751-785)\n this.awaitSwitchingPoint(mime, switchPointMs, pendingCodecs);\n } else {\n // Clear and reinit immediately\n this.clearAndReinit(mime, pendingCodecs);\n }\n }\n\n /**\n * Check if two codec arrays are equivalent (order-independent)\n */\n private codecsEqual(arr1: string[], arr2: string[]): boolean {\n if (arr1.length !== arr2.length) return false;\n for (const codec of arr1) {\n if (!arr2.includes(codec)) return false;\n }\n return true;\n }\n\n /**\n * Find which buffer range contains the given position.\n * Ported from mews.js:947-956\n */\n findBufferIndex(position: number): number | false {\n const buffered = this.videoElement.buffered;\n for (let i = 0; i < buffered.length; i++) {\n if (buffered.start(i) <= position && buffered.end(i) >= position) {\n return i;\n }\n }\n return false;\n }\n\n /**\n * Remove buffer content before keepaway seconds from current position.\n * Ported from mews.js:370-379\n */\n _clean(keepaway: number = 180): void {\n if (!this.sourceBuffer) return;\n\n const currentTime = this.videoElement.currentTime;\n if (currentTime <= keepaway) return;\n\n this._do(() => {\n if (!this.sourceBuffer) return;\n try {\n // Make sure end time is never 0 (mews.js:376)\n this.sourceBuffer.remove(0, Math.max(0.1, currentTime - keepaway));\n } catch (e) {\n // Ignore errors during cleanup\n }\n });\n }\n\n /**\n * Clear buffer and reinitialize with new codecs.\n * Ported from mews.js:696-730\n */\n private clearAndReinit(mime: string, newCodecs: string[]): void {\n this._do((remaining_do_on_updateend) => {\n if (!this.sourceBuffer) {\n // No sourceBuffer to clear, just reinit\n this.reinitBuffer(mime, newCodecs, remaining_do_on_updateend);\n return;\n }\n\n if (this.sourceBuffer.updating) {\n // Still updating, schedule for later\n this._doNext(() => this.clearAndReinit(mime, newCodecs));\n return;\n }\n\n try {\n // Clear buffer (mews.js:701)\n if (!isNaN(this.mediaSource.duration)) {\n this.sourceBuffer.remove(0, Infinity);\n }\n } catch (e) {\n // Ignore\n }\n\n // Wait for remove to complete, then reinit\n this._doNext(() => {\n this.reinitBuffer(mime, newCodecs, remaining_do_on_updateend);\n });\n });\n }\n\n /**\n * Reinitialize buffer with new codecs.\n * Ported from mews.js:703-724\n */\n private reinitBuffer(\n mime: string,\n newCodecs: string[],\n remaining_do_on_updateend?: Array<() => void>\n ): void {\n // Save queue\n const remaining = this.queue.slice();\n this.queue = [];\n\n // Remove old sourceBuffer\n if (this.sourceBuffer && this.mediaSource.readyState === 'open') {\n try {\n this.mediaSource.removeSourceBuffer(this.sourceBuffer);\n } catch (e) {\n // Ignore\n }\n }\n this.sourceBuffer = null;\n this._busy = false;\n\n try {\n // Create new sourceBuffer (mews.js:713-715)\n this.sourceBuffer = this.mediaSource.addSourceBuffer(mime);\n this.sourceBuffer.mode = 'segments';\n this._codecs = newCodecs;\n\n this.installEventHandlers();\n\n // Restore any remaining do_on_updateend functions (mews.js:715)\n if (remaining_do_on_updateend?.length) {\n this.do_on_updateend = remaining_do_on_updateend;\n }\n\n // Drain message queue (mews.js:341-367)\n this.drainMessageQueue();\n\n // Restore queued data\n for (const frag of remaining) {\n this.append(frag);\n }\n } catch (e: any) {\n this.onError(e?.message || 'Failed to reinit SourceBuffer');\n }\n }\n\n /**\n * Wait for playback to reach switch point, then clear and reinit.\n * Ported from mews.js:751-785\n */\n private awaitSwitchingPoint(mime: string, switchPointMs: number, newCodecs: string[]): void {\n const tSec = switchPointMs / 1000;\n\n const clearAndReinit = () => {\n this.clearAndReinit(mime, newCodecs);\n };\n\n // Wait for video.currentTime to reach switch point\n const onTimeUpdate = () => {\n if (this.videoElement.currentTime >= tSec) {\n this.videoElement.removeEventListener('timeupdate', onTimeUpdate);\n this.videoElement.removeEventListener('waiting', onWaiting);\n clearAndReinit();\n }\n };\n\n // Or if video is waiting (buffer empty before switch point)\n const onWaiting = () => {\n this.videoElement.removeEventListener('timeupdate', onTimeUpdate);\n this.videoElement.removeEventListener('waiting', onWaiting);\n clearAndReinit();\n };\n\n this.videoElement.addEventListener('timeupdate', onTimeUpdate);\n this.videoElement.addEventListener('waiting', onWaiting);\n }\n\n /**\n * Drain the oldest message queue and append its data.\n * Called after source buffer reinit to flush queued track switch data.\n * Ported from mews.js:341-367\n */\n private drainMessageQueue(): void {\n if (!this.msgqueue || this.msgqueue.length === 0) return;\n\n // Get oldest queue\n const oldest = this.msgqueue[0];\n\n let do_do = false; // If no messages, trigger updateend manually (mews.js:357-358)\n\n if (oldest.length) {\n // Append all data from oldest queue (mews.js:346-355)\n for (const frag of oldest) {\n if (this.sourceBuffer && (this.sourceBuffer.updating || this.queue.length || this._busy)) {\n this.queue.push(frag);\n } else {\n this._append(frag);\n }\n }\n } else {\n do_do = true;\n }\n\n // Remove oldest queue (mews.js:360)\n this.msgqueue.shift();\n if (this.msgqueue.length === 0) {\n this.msgqueue = false;\n }\n\n if (this.debugging) {\n console.log(\n 'MEWS: drained msgqueue',\n this.msgqueue ? `${this.msgqueue.length} more queue(s) remain` : ''\n );\n }\n\n // Manually trigger updateend if queue was empty (mews.js:363-366)\n if (do_do && this.sourceBuffer) {\n this.sourceBuffer.dispatchEvent(new Event('updateend'));\n }\n }\n\n /**\n * Install event handlers on the sourceBuffer.\n * Ported from mews.js:224-279\n */\n private installEventHandlers(): void {\n if (!this.sourceBuffer) return;\n\n this.sourceBuffer.addEventListener('updateend', () => {\n if (!this.sourceBuffer) {\n if (this.debugging) console.log('MEWS: updateend but sourceBuffer is null');\n return;\n }\n\n // Every 500 fragments, clean the buffer (mews.js:237-245)\n if (this.fragmentCount >= 500) {\n this.fragmentCount = 0;\n this._clean(10); // Keep 10 seconds\n } else {\n this.fragmentCount++;\n }\n\n // Execute queued operations (mews.js:247-262)\n const do_funcs = this.do_on_updateend.slice();\n this.do_on_updateend = [];\n\n for (let i = 0; i < do_funcs.length; i++) {\n if (!this.sourceBuffer) {\n if (this.debugging) console.warn('MEWS: doing updateend but sb was reset');\n break;\n }\n if (this.sourceBuffer.updating) {\n // Still updating, requeue remaining functions (mews.js:255-259)\n this.do_on_updateend = this.do_on_updateend.concat(do_funcs.slice(i));\n if (this.debugging) console.warn('MEWS: doing updateend but was interrupted');\n break;\n }\n try {\n // Pass remaining functions as argument (mews.js:261)\n do_funcs[i](i < do_funcs.length - 1 ? do_funcs.slice(i + 1) : []);\n } catch (e) {\n console.error('MEWS: error in do_on_updateend:', e);\n }\n }\n\n this._busy = false;\n\n // Process queued data (mews.js:269-272)\n if (this.sourceBuffer && this.queue.length > 0 && !this.sourceBuffer.updating && !this.videoElement.error) {\n this._append(this.queue.shift()!);\n }\n });\n\n this.sourceBuffer.addEventListener('error', () => {\n this.onError('SourceBuffer error');\n });\n }\n\n /**\n * Flush any pending queue data.\n */\n private flushQueue(): void {\n if (!this.sourceBuffer) return;\n\n const pending = this.queue.slice();\n this.queue = [];\n for (const frag of pending) {\n this.append(frag);\n }\n }\n\n /**\n * Check if there's an active message queue (track switch in progress)\n */\n hasActiveMessageQueue(): boolean {\n return this.msgqueue !== false;\n }\n\n destroy(): void {\n if (this.sourceBuffer) {\n try {\n this.sourceBuffer.abort();\n } catch {}\n }\n this.sourceBuffer = null;\n this.queue = [];\n this._busy = false;\n this.do_on_updateend = [];\n this.msgqueue = false;\n this.paused = false;\n }\n}\n","/**\n * MEWS WebSocket Player Implementation\n *\n * Low-latency WebSocket MP4 streaming using MediaSource Extensions.\n * Protocol: Custom MEWS (MistServer Extended WebSocket)\n *\n * Ported from reference: mews.js (MistMetaPlayer)\n */\n\nimport { BasePlayer } from '../../core/PlayerInterface';\nimport type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../../core/PlayerInterface';\nimport { WebSocketManager } from './WebSocketManager';\nimport { SourceBufferManager } from './SourceBufferManager';\nimport { translateCodec } from '../../core/CodecUtils';\nimport type { MewsMessage, AnalyticsConfig, OnTimeMessage, MewsMessageListener } from './types';\n\nexport class MewsWsPlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: \"MEWS WebSocket Player\",\n shortname: \"mews\",\n priority: 2, // High priority - low latency protocol\n mimes: [\"ws/video/mp4\", \"wss/video/mp4\", \"ws/video/webm\", \"wss/video/webm\"]\n };\n\n private wsManager: WebSocketManager | null = null;\n private sbManager: SourceBufferManager | null = null;\n private mediaSource: MediaSource | null = null;\n private objectUrl: string | null = null;\n private container: HTMLElement | null = null;\n private isDestroyed = false;\n private debugging = false;\n\n // Server delay estimation (ported from mews.js:833-882)\n private serverDelays: number[] = [];\n private pendingDelayTypes: Record<string, number> = {};\n\n // Supported codecs (short names for MistServer protocol)\n private supportedCodecs: string[] = [];\n\n // Ready state - true after codec_data received and SourceBuffer initialized\n private isReady = false;\n private readyResolvers: Array<() => void> = [];\n\n // Duration tracking (ported from mews.js:1113)\n private lastDuration = Infinity;\n\n // Live vs VoD detection (ported from mews.js:105-107, 508)\n private streamType: 'live' | 'vod' | 'unknown' = 'unknown';\n\n // Current tracks for change detection (ported from mews.js:455, 593-619)\n private currentTracks: string[] = [];\n\n // Last codecs for track switch comparison (ported from mews.js:687)\n private lastCodecs: string[] | null = null;\n\n // Playback rate tuning (ported from mews.js:453, 509-545)\n private requestedRate = 1;\n\n // ABR state (ported from mews.js:1266-1314)\n private bitCounter: number[] = [];\n private bitsSince: number[] = [];\n private currentBps: number | null = null;\n private nWaiting = 0;\n private nWaitingThreshold = 3;\n\n // Seeking state (ported from mews.js:1169-1175)\n private seeking = false;\n\n // Analytics\n private analyticsConfig: AnalyticsConfig = { enabled: false, endpoint: null };\n private analyticsTimer: ReturnType<typeof setInterval> | null = null;\n\n isMimeSupported(mimetype: string): boolean {\n return this.capability.mimes.includes(mimetype);\n }\n\n isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[] {\n // Basic requirements check (mews.js:10)\n if (!('WebSocket' in window) || !('MediaSource' in window) || !('Promise' in window)) {\n return false;\n }\n\n // MacOS exemption (reference mews.js behavior)\n // MediaSource has bugs on Safari/MacOS - prefer HLS\n const isMac = /Mac OS X/.test(navigator.userAgent);\n if (isMac) {\n return false;\n }\n\n // Check codec compatibility using ACTUAL stream codecs (mews.js:45-83)\n const container = mimetype.split('/')[2] || 'mp4';\n const playableTracks: Record<string, number> = {};\n let hasSubtitles = false;\n\n // Test actual stream codecs against MediaSource\n this.supportedCodecs = [];\n for (const track of streamInfo.meta.tracks) {\n if (track.type === 'meta') {\n if (track.codec === 'subtitle') hasSubtitles = true;\n continue;\n }\n\n const codecString = translateCodec(track as any);\n const testMime = `video/${container};codecs=\"${codecString}\"`;\n\n if (MediaSource.isTypeSupported(testMime)) {\n this.supportedCodecs.push(track.codec);\n playableTracks[track.type] = 1;\n }\n }\n\n // Check for subtitle source (mews.js:73-80)\n if (hasSubtitles) {\n const hasVttSource = streamInfo.source?.some(s => s.type === 'html5/text/vtt');\n if (hasVttSource) {\n playableTracks['subtitle'] = 1;\n }\n }\n\n if (Object.keys(playableTracks).length === 0) return false;\n return Object.keys(playableTracks);\n }\n\n async initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement> {\n this.container = container;\n container.classList.add('fw-player-container');\n\n const video = document.createElement('video');\n video.classList.add('fw-player-video');\n video.setAttribute('playsinline', ''); // iphones (mews.js:92)\n video.setAttribute('crossorigin', 'anonymous'); // mews.js:111\n\n // Apply options (mews.js:95-110)\n if (options.autoplay) video.autoplay = true;\n if (options.muted) video.muted = true;\n video.controls = options.controls === true;\n if (options.loop) video.loop = true;\n if (options.poster) video.poster = options.poster;\n\n // Live streams don't loop (mews.js:105-107)\n if (this.streamType === 'live') {\n video.loop = false;\n }\n\n this.videoElement = video;\n container.appendChild(video);\n this.setupVideoEventListeners(video, options);\n\n // Analytics configuration\n const anyOpts = options as any;\n this.analyticsConfig = {\n enabled: !!anyOpts.analytics?.enabled,\n endpoint: anyOpts.analytics?.endpoint || null\n };\n\n // Get stream type from options if available\n if ((source as any).type === 'live') {\n this.streamType = 'live';\n } else if ((source as any).type === 'vod') {\n this.streamType = 'vod';\n }\n\n try {\n // Initialize MediaSource (mews.js:138-196)\n this.mediaSource = new MediaSource();\n\n // Set up MediaSource event handlers (mews.js:143-195)\n this.mediaSource.addEventListener('sourceopen', () => this.handleSourceOpen(source));\n this.mediaSource.addEventListener('sourceclose', () => this.handleSourceClose());\n this.mediaSource.addEventListener('sourceended', () => this.handleSourceEnded());\n\n this.objectUrl = URL.createObjectURL(this.mediaSource);\n video.src = this.objectUrl;\n this.isDestroyed = false;\n this.startTelemetry();\n return video;\n } catch (error: any) {\n this.emit('error', error.message || String(error));\n throw error;\n }\n }\n\n /**\n * Handle MediaSource sourceopen event.\n * Ported from mews.js:143-148, 198-204, 885-902\n */\n private handleSourceOpen(source: StreamSource): void {\n if (!this.mediaSource || !this.videoElement) return;\n\n // Create SourceBufferManager\n this.sbManager = new SourceBufferManager({\n mediaSource: this.mediaSource,\n videoElement: this.videoElement,\n onError: (msg) => this.emit('error', msg)\n });\n\n // Install browser event handlers\n this.installWaitingHandler();\n this.installSeekingHandler();\n this.installPauseHandler();\n this.installLoopHandler();\n\n // Create WebSocketManager with listener support\n this.wsManager = new WebSocketManager({\n url: source.url,\n maxReconnectAttempts: 5,\n onMessage: (data) => this.handleMessage(data),\n onOpen: () => this.handleWsOpen(),\n onClose: () => this.handleWsClose(),\n onError: (msg) => this.emit('error', msg)\n });\n\n this.wsManager.connect();\n }\n\n /**\n * Handle MediaSource sourceclose event.\n * Ported from mews.js:150-153\n */\n private handleSourceClose(): void {\n if (this.debugging) console.log('MEWS: MediaSource closed');\n this.send({ type: 'stop' });\n }\n\n /**\n * Handle MediaSource sourceended event.\n * Ported from mews.js:154-194\n */\n private handleSourceEnded(): void {\n if (this.debugging) console.log('MEWS: MediaSource ended');\n this.send({ type: 'stop' });\n }\n\n /**\n * Handle WebSocket open event.\n * Ported from mews.js:401-403, 885-902\n */\n private handleWsOpen(): void {\n // Request codec data (mews.js:885-902)\n const listener: MewsMessageListener = (msg) => {\n // Got codec data, set up source buffer\n if (this.mediaSource?.readyState === 'open') {\n const codecs = msg.data?.codecs || [];\n const initialized = this.sbManager?.initWithCodecs(codecs);\n\n if (initialized && !this.isReady) {\n this.isReady = true;\n // Resolve any waiting play() calls\n for (const resolve of this.readyResolvers) {\n resolve();\n }\n this.readyResolvers = [];\n }\n }\n this.wsManager?.removeListener('codec_data', listener);\n };\n\n this.wsManager?.addListener('codec_data', listener);\n this.logDelay('codec_data');\n\n // Send request with SHORT codec names (mews.js:901)\n // CRITICAL: MistServer expects short names like \"H264\", not browser codec strings\n this.send({ type: 'request_codec_data', supported_codecs: this.supportedCodecs });\n }\n\n /**\n * Handle WebSocket close event with reconnection logic.\n * Ported from mews.js:408-431\n */\n private handleWsClose(): void {\n if (this.debugging) console.log('MEWS: WebSocket closed');\n // Reconnection is handled by WebSocketManager\n }\n\n /**\n * Handle incoming WebSocket message.\n * Routes to binary append or JSON control message handler.\n * Ported from mews.js:456-830\n */\n private handleMessage(data: ArrayBuffer | string): void {\n if (typeof data === 'string') {\n try {\n const msg = JSON.parse(data) as MewsMessage;\n this.handleControlMessage(msg);\n // Notify listeners (mews.js:795-799)\n this.wsManager?.notifyListeners(msg);\n } catch (e) {\n if (this.debugging) console.error('MEWS: Failed to parse message', e);\n }\n return;\n }\n\n // Binary data - MP4 segment (mews.js:802-829)\n const bytes = new Uint8Array(data);\n this.sbManager?.append(bytes);\n this.trackBits(data);\n }\n\n /**\n * Handle JSON control messages.\n * Ported from mews.js:461-799\n */\n private handleControlMessage(msg: MewsMessage): void {\n if (this.debugging && msg.type !== 'on_time') {\n console.log('MEWS: message', msg);\n }\n\n switch (msg.type) {\n case 'on_stop':\n this.handleOnStop();\n break;\n\n case 'on_time':\n this.handleOnTime(msg as OnTimeMessage);\n break;\n\n case 'tracks':\n this.handleTracks(msg);\n break;\n\n case 'pause':\n this.handlePause();\n break;\n\n case 'codec_data':\n this.resolveDelay('codec_data');\n break;\n\n case 'seek':\n this.resolveDelay('seek');\n break;\n\n case 'set_speed':\n this.resolveDelay('set_speed');\n break;\n }\n }\n\n /**\n * Handle on_stop message - stream ended (VoD).\n * Ported from mews.js:462-471\n */\n private handleOnStop(): void {\n // Mark as VoD (stream ended)\n this.streamType = 'vod';\n\n // Wait for buffer to finish playing (mews.js:465-469)\n const onWaiting = () => {\n if (this.sbManager) {\n this.sbManager.paused = true;\n }\n this.emit('ended', undefined);\n this.videoElement?.removeEventListener('waiting', onWaiting);\n };\n this.videoElement?.addEventListener('waiting', onWaiting);\n }\n\n /**\n * Handle on_time message - playback time sync.\n * Ported from mews.js:473-621\n */\n private handleOnTime(msg: OnTimeMessage): void {\n const data = msg.data;\n if (!data || !this.videoElement) return;\n\n const currentMs = data.current;\n const endMs = data.end;\n const jitter = data.jitter || 0;\n\n // Buffer calculation (mews.js:474)\n const buffer = currentMs - this.videoElement.currentTime * 1000;\n const serverDelay = this.getServerDelay();\n // Chrome needs larger base buffer (mews.js:482)\n const isChrome = /Chrome/.test(navigator.userAgent) && !/Edge|Edg/.test(navigator.userAgent);\n const baseBuffer = isChrome ? 1000 : 100;\n const desiredBuffer = Math.max(baseBuffer + serverDelay, serverDelay * 2);\n const desiredBufferWithJitter = desiredBuffer + jitter;\n\n // VoD gets extra buffer (mews.js:480)\n const actualDesiredBuffer = this.streamType !== 'live' ? desiredBuffer + 2000 : desiredBuffer;\n\n if (this.debugging) {\n console.log(\n 'MEWS: on_time',\n 'current:', currentMs / 1000,\n 'video:', this.videoElement.currentTime,\n 'rate:', this.requestedRate + 'x',\n 'buffer:', Math.round(buffer), '/', Math.round(desiredBuffer),\n this.streamType === 'live' ? 'latency:' + Math.round((endMs || 0) - this.videoElement.currentTime * 1000) + 'ms' : ''\n );\n }\n\n if (!this.sbManager) {\n if (this.debugging) console.log('MEWS: on_time but no sourceBuffer');\n return;\n }\n\n // Update duration (mews.js:501-504)\n if (endMs !== undefined && this.lastDuration !== endMs / 1000) {\n this.lastDuration = endMs / 1000;\n // Duration is updated via native video element durationchange event\n }\n\n // Mark source buffer as not paused\n this.sbManager.paused = false;\n\n // Playback rate tuning for LIVE streams (mews.js:508-545)\n if (this.streamType === 'live') {\n this.tuneLivePlaybackRate(buffer, desiredBufferWithJitter, data.play_rate_curr);\n } else {\n // VoD - adjust server delivery speed (mews.js:547-586)\n this.tuneVodDeliverySpeed(buffer, actualDesiredBuffer, data.play_rate_curr);\n }\n\n // Track change detection (mews.js:593-619)\n if (data.tracks && this.currentTracks.join(',') !== data.tracks.join(',')) {\n if (this.debugging) {\n for (const trackId of data.tracks) {\n if (!this.currentTracks.includes(trackId)) {\n console.log('MEWS: track changed', trackId);\n }\n }\n }\n this.currentTracks = data.tracks;\n }\n }\n\n /**\n * Tune playback rate for live streams.\n * Ported from mews.js:508-545\n *\n * Fixed: Use direct assignment instead of multiplication to prevent\n * compounding rate adjustments on each on_time message.\n */\n private tuneLivePlaybackRate(buffer: number, desiredBuffer: number, playRateCurr?: 'auto' | number): void {\n if (!this.videoElement) return;\n\n if (this.requestedRate === 1) {\n if (playRateCurr === 'auto' && this.videoElement.currentTime > 0) {\n // Assume we want to be as live as possible\n if (buffer > desiredBuffer * 2) {\n // Buffer too big, speed up (mews.js:513-516)\n this.requestedRate = 1 + Math.min(1, (buffer - desiredBuffer) / desiredBuffer) * 0.08;\n this.videoElement.playbackRate = this.requestedRate;\n if (this.debugging) console.log('MEWS: speeding up to', this.requestedRate);\n } else if (buffer < 0) {\n // Negative buffer, slow down (mews.js:518-521)\n this.requestedRate = 0.8;\n this.videoElement.playbackRate = this.requestedRate;\n if (this.debugging) console.log('MEWS: slowing down to', this.requestedRate);\n } else if (buffer < desiredBuffer / 2) {\n // Buffer too small, slow down (mews.js:523-526)\n this.requestedRate = 1 + Math.min(1, (buffer - desiredBuffer) / desiredBuffer) * 0.08;\n this.videoElement.playbackRate = this.requestedRate;\n if (this.debugging) console.log('MEWS: adjusting to', this.requestedRate);\n }\n }\n } else if (this.requestedRate > 1) {\n // Return to normal when buffer is small enough (mews.js:531-536)\n if (buffer < desiredBuffer) {\n this.videoElement.playbackRate = 1;\n this.requestedRate = 1;\n if (this.debugging) console.log('MEWS: returning to normal rate');\n }\n } else {\n // requestedRate < 1, return to normal when buffer is big enough (mews.js:538-544)\n if (buffer > desiredBuffer) {\n this.videoElement.playbackRate = 1;\n this.requestedRate = 1;\n if (this.debugging) console.log('MEWS: returning to normal rate');\n }\n }\n }\n\n /**\n * Tune server delivery speed for VoD.\n * Ported from mews.js:547-586\n */\n private tuneVodDeliverySpeed(buffer: number, desiredBuffer: number, playRateCurr?: 'auto' | number): void {\n if (this.requestedRate === 1) {\n if (playRateCurr === 'auto') {\n if (buffer < desiredBuffer / 2) {\n if (buffer < -10000) {\n // Way behind, seek to current position (mews.js:553-554)\n this.send({ type: 'seek', seek_time: Math.round((this.videoElement?.currentTime || 0) * 1000) });\n } else {\n // Request faster delivery (mews.js:557-560)\n this.requestedRate = 2;\n this.send({ type: 'set_speed', play_rate: this.requestedRate });\n if (this.debugging) console.log('MEWS: requesting faster delivery');\n }\n } else if (buffer - desiredBuffer > desiredBuffer) {\n // Too much buffer, slow down (mews.js:563-566)\n this.requestedRate = 0.5;\n this.send({ type: 'set_speed', play_rate: this.requestedRate });\n if (this.debugging) console.log('MEWS: requesting slower delivery');\n }\n }\n } else if (this.requestedRate > 1) {\n if (buffer > desiredBuffer) {\n // Enough buffer, return to realtime (mews.js:571-575)\n this.send({ type: 'set_speed', play_rate: 'auto' });\n this.requestedRate = 1;\n if (this.debugging) console.log('MEWS: returning to realtime delivery');\n }\n } else {\n if (buffer < desiredBuffer) {\n // Buffer small enough, return to realtime (mews.js:579-583)\n this.send({ type: 'set_speed', play_rate: 'auto' });\n this.requestedRate = 1;\n if (this.debugging) console.log('MEWS: returning to realtime delivery');\n }\n }\n }\n\n /**\n * Handle tracks message - codec switch.\n * Ported from mews.js:623-788\n */\n private handleTracks(msg: MewsMessage): void {\n const codecs: string[] = msg.data?.codecs || [];\n const switchPointMs = msg.data?.current;\n\n if (!codecs.length) {\n this.emit('error', 'Track switch contains no codecs');\n return;\n }\n\n // Check if codecs are same as before (mews.js:676)\n const prevCodecs = this.lastCodecs || this.sbManager?.getCodecs() || [];\n if (this.codecsEqual(prevCodecs, codecs)) {\n if (this.debugging) console.log('MEWS: keeping buffer, codecs same');\n // If at position 0 and switch point is not 0, seek to switch point (mews.js:678-679)\n if (this.videoElement?.currentTime === 0 && switchPointMs && switchPointMs !== 0) {\n this.setSeekingPosition(switchPointMs / 1000);\n }\n return;\n }\n\n // Different codecs, save for next comparison (mews.js:687)\n this.lastCodecs = codecs;\n\n // Change codecs (will handle msgqueue internally)\n this.sbManager?.changeCodecs(codecs, switchPointMs);\n }\n\n /**\n * Handle pause message.\n * Ported from mews.js:790-792\n */\n private handlePause(): void {\n if (this.sbManager) {\n this.sbManager.paused = true;\n }\n }\n\n /**\n * Set video currentTime with retry logic.\n * Ported from mews.js:635-672\n */\n private setSeekingPosition(tSec: number): void {\n if (!this.videoElement || !this.sbManager) return;\n\n const currPos = this.videoElement.currentTime;\n if (currPos > tSec) {\n // Don't seek backwards (mews.js:637-639)\n tSec = currPos;\n }\n\n const buffered = this.videoElement.buffered;\n if (!buffered.length || buffered.end(buffered.length - 1) < tSec) {\n // Desired position not in buffer yet, wait for more data (mews.js:641-644)\n this.sbManager.scheduleAfterUpdate(() => this.setSeekingPosition(tSec));\n return;\n }\n\n this.videoElement.currentTime = tSec;\n\n if (this.videoElement.currentTime < tSec - 0.001) {\n // Didn't reach target, retry (mews.js:648-651)\n this.sbManager.scheduleAfterUpdate(() => this.setSeekingPosition(tSec));\n }\n }\n\n /**\n * Check if two codec arrays are equivalent (order-independent)\n */\n private codecsEqual(arr1: string[], arr2: string[]): boolean {\n if (arr1.length !== arr2.length) return false;\n for (const codec of arr1) {\n if (!arr2.includes(codec)) return false;\n }\n return true;\n }\n\n // ========== PUBLIC API ==========\n\n /**\n * Play with optional skip to live edge.\n * Ported from mews.js:959-1023\n */\n async play(): Promise<void> {\n const v = this.videoElement;\n if (!v) return;\n\n // If already playing, nothing to do (mews.js:961-964)\n if (!v.paused) return;\n\n // Wait for ready state (codec_data received) with timeout\n if (!this.isReady) {\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('MEWS: Timeout waiting for codec data'));\n }, 5000);\n this.readyResolvers.push(() => {\n clearTimeout(timeout);\n resolve();\n });\n });\n }\n\n // Use listener to wait for on_time before playing (mews.js:973-1017)\n return new Promise((resolve, reject) => {\n // Flag to prevent race condition where multiple on_time messages\n // could trigger seek before the first completes\n let handled = false;\n\n const onTime: MewsMessageListener = (msg) => {\n // Remove listener immediately to prevent race condition (single-use pattern)\n if (handled) return;\n handled = true;\n this.wsManager?.removeListener('on_time', onTime);\n\n if (!this.sbManager) {\n if (this.debugging) console.log('MEWS: play waiting for sourceBuffer');\n handled = false; // Allow retry\n this.wsManager?.addListener('on_time', onTime);\n return;\n }\n\n const data = (msg as OnTimeMessage).data;\n\n if (this.streamType === 'live') {\n // Live stream - wait for buffer then seek to live edge (mews.js:978-998)\n const waitForBuffer = () => {\n if (!v.buffered.length) return;\n\n const bufferIdx = this.sbManager?.findBufferIndex(data.current / 1000);\n if (typeof bufferIdx === 'number') {\n // Check if current position is in buffer\n if (v.buffered.start(bufferIdx) > v.currentTime || v.buffered.end(bufferIdx) < v.currentTime) {\n v.currentTime = data.current / 1000;\n if (this.debugging) console.log('MEWS: seeking to live position', v.currentTime);\n }\n\n v.play().then(resolve).catch((err) => {\n this.pause();\n reject(err);\n });\n\n this.sbManager!.paused = false;\n }\n };\n\n // Wait for buffer via updateend\n this.sbManager?.scheduleAfterUpdate(waitForBuffer);\n } else {\n // VoD - just play when we have data (mews.js:1010-1016)\n this.sbManager!.paused = false;\n if (v.buffered.length && v.buffered.start(0) > v.currentTime) {\n v.currentTime = v.buffered.start(0);\n }\n v.play().then(resolve).catch(reject);\n }\n };\n\n this.wsManager?.addListener('on_time', onTime);\n\n // Send play command (mews.js:1020-1022)\n const skipToLive = this.streamType === 'live' && v.currentTime === 0;\n if (skipToLive) {\n this.send({ type: 'play', seek_time: 'live' });\n } else {\n this.send({ type: 'play' });\n }\n });\n }\n\n /**\n * Pause playback and server delivery.\n * Ported from mews.js:1025-1029\n */\n pause(): void {\n this.videoElement?.pause();\n this.send({ type: 'hold' });\n if (this.sbManager) {\n this.sbManager.paused = true;\n }\n }\n\n /**\n * Seek to position with server sync.\n * Ported from mews.js:1071-1111\n */\n seek(time: number): void {\n if (!this.videoElement || isNaN(time) || time < 0) return;\n\n // Calculate seek time with server delay compensation (mews.js:1082)\n const seekMs = Math.round(Math.max(0, time * 1000 - (250 + this.getServerDelay())));\n\n this.logDelay('seek');\n this.send({ type: 'seek', seek_time: seekMs });\n\n // Wait for seek acknowledgment then on_time (mews.js:1084-1108)\n const onSeek: MewsMessageListener = () => {\n this.wsManager?.removeListener('seek', onSeek);\n\n const onTime: MewsMessageListener = (msg) => {\n this.wsManager?.removeListener('on_time', onTime);\n\n // Use server's actual position (mews.js:1089)\n const actualTime = (msg as OnTimeMessage).data.current / 1000;\n this.trySetCurrentTime(actualTime);\n };\n\n this.wsManager?.addListener('on_time', onTime);\n };\n\n this.wsManager?.addListener('seek', onSeek);\n\n // Also set directly as fallback\n this.videoElement.currentTime = time;\n if (this.debugging) console.log('MEWS: seeking to', time);\n }\n\n /**\n * Try to set currentTime with retry logic.\n * Ported from mews.js:1092-1103\n */\n private trySetCurrentTime(tSec: number, retries = 10): void {\n const v = this.videoElement;\n if (!v) return;\n\n v.currentTime = tSec;\n\n if (v.currentTime < tSec - 0.001 && retries > 0) {\n // Failed to seek, retry (mews.js:1095-1100)\n this.sbManager?.scheduleAfterUpdate(() => this.trySetCurrentTime(tSec, retries - 1));\n }\n }\n\n getCurrentTime(): number {\n return this.videoElement?.currentTime ?? 0;\n }\n\n getDuration(): number {\n return isFinite(this.lastDuration) ? this.lastDuration : super.getDuration();\n }\n\n /**\n * Set playback rate.\n * Ported from mews.js:1119-1129\n */\n setPlaybackRate(rate: number): void {\n super.setPlaybackRate(rate);\n const playRate = rate === 1 ? 'auto' : rate;\n this.logDelay('set_speed');\n this.send({ type: 'set_speed', play_rate: playRate });\n }\n\n getQualities(): Array<{ id: string; label: string; isAuto?: boolean; active?: boolean }> {\n return [{ id: 'auto', label: 'Auto', isAuto: true, active: true }];\n }\n\n selectQuality(id: string): void {\n if (id === 'auto') {\n this.send({ type: 'set_speed', play_rate: 'auto' });\n }\n }\n\n /**\n * Set tracks for ABR or quality selection.\n * Ported from mews.js:1030-1037\n */\n setTracks(obj: { video?: string; audio?: string; subtitle?: string }): void {\n if (!Object.keys(obj).length) return;\n this.send({ type: 'tracks', ...obj });\n }\n\n /**\n * Select a subtitle track.\n */\n selectTextTrack(id: string | null): void {\n if (id === null) {\n this.send({ type: 'tracks', subtitle: 'none' });\n } else {\n this.send({ type: 'tracks', subtitle: id });\n }\n }\n\n isLive(): boolean {\n return this.streamType === 'live';\n }\n\n /**\n * Jump to live edge.\n */\n jumpToLive(): void {\n if (this.streamType !== 'live' || !this.wsManager) return;\n this.send({ type: 'play', seek_time: 'live' });\n this.videoElement?.play().catch(() => {});\n }\n\n async getStats(): Promise<any> {\n return {\n currentBps: this.currentBps,\n waitingEvents: this.nWaiting,\n isLive: this.streamType === 'live',\n serverDelay: this.getServerDelay()\n };\n }\n\n // ========== EVENT HANDLERS ==========\n\n /**\n * Install waiting event handler.\n * Handles buffer gaps and ABR.\n * Ported from mews.js:1177-1186, 1272-1278\n */\n private installWaitingHandler(): void {\n if (!this.videoElement) return;\n\n this.videoElement.addEventListener('waiting', () => {\n if (this.seeking) return;\n\n const v = this.videoElement!;\n if (!v.buffered || !v.buffered.length) return;\n\n // Check for buffer gap and jump it (mews.js:1180-1186)\n const bufferIdx = this.sbManager?.findBufferIndex(v.currentTime);\n if (bufferIdx !== false && typeof bufferIdx === 'number') {\n if (bufferIdx + 1 < v.buffered.length) {\n const nextStart = v.buffered.start(bufferIdx + 1);\n if (nextStart - v.currentTime < 10) {\n if (this.debugging) console.log('MEWS: skipping buffer gap to', nextStart);\n v.currentTime = nextStart;\n }\n }\n }\n\n // ABR trigger (mews.js:1272-1278)\n this.nWaiting++;\n if (this.nWaiting >= this.nWaitingThreshold && this.currentBps) {\n this.nWaiting = 0;\n if (this.debugging) console.log('MEWS: ABR triggered, requesting lower bitrate');\n this.setTracks({ video: `<${Math.round(this.currentBps)}bps,minbps` });\n }\n });\n }\n\n /**\n * Install seeking event handlers.\n * Ported from mews.js:1169-1175\n */\n private installSeekingHandler(): void {\n if (!this.videoElement) return;\n\n this.videoElement.addEventListener('seeking', () => {\n this.seeking = true;\n });\n\n this.videoElement.addEventListener('seeked', () => {\n this.seeking = false;\n });\n }\n\n /**\n * Install pause event handler for browser pause detection.\n * Ported from mews.js:1188-1200\n */\n private installPauseHandler(): void {\n if (!this.videoElement) return;\n\n this.videoElement.addEventListener('pause', () => {\n if (this.sbManager && !this.sbManager.paused) {\n // Browser paused (probably tab hidden) - pause download (mews.js:1189-1192)\n if (this.debugging) console.log('MEWS: browser paused, pausing download');\n this.send({ type: 'hold' });\n this.sbManager.paused = true;\n\n // Resume on play (mews.js:1193-1197)\n const onPlay = () => {\n if (this.sbManager?.paused) {\n this.send({ type: 'play' });\n }\n this.videoElement?.removeEventListener('play', onPlay);\n };\n this.videoElement?.addEventListener('play', onPlay);\n }\n });\n }\n\n /**\n * Install loop handler for VoD content.\n * Ported from mews.js:1157-1167\n */\n private installLoopHandler(): void {\n if (!this.videoElement) return;\n\n this.videoElement.addEventListener('ended', () => {\n const v = this.videoElement;\n if (!v) return;\n\n if (v.loop && this.streamType !== 'live') {\n // Loop VoD content (mews.js:1159-1166)\n this.seek(0);\n this.sbManager?._do(() => {\n try {\n // Clear buffer for clean loop\n } catch (e) {}\n });\n }\n });\n }\n\n // ========== UTILITIES ==========\n\n /**\n * Send command to server with retry.\n * Ported from mews.js:904-944\n */\n private send(cmd: object): void {\n if (this.wsManager) {\n this.wsManager.send(cmd);\n }\n }\n\n /**\n * Log delay for server RTT estimation.\n * Ported from mews.js:835-862\n */\n private logDelay(type: string): void {\n this.pendingDelayTypes[type] = Date.now();\n }\n\n /**\n * Resolve delay measurement.\n * Ported from mews.js:855-861, 863-867\n */\n private resolveDelay(type: string): void {\n const start = this.pendingDelayTypes[type];\n if (start) {\n const delay = Date.now() - start;\n this.serverDelays.unshift(delay);\n if (this.serverDelays.length > 5) {\n this.serverDelays.pop();\n }\n delete this.pendingDelayTypes[type];\n }\n }\n\n /**\n * Get average server delay.\n * Ported from mews.js:869-881\n */\n private getServerDelay(): number {\n if (!this.serverDelays.length) return 500;\n const n = Math.min(3, this.serverDelays.length);\n let sum = 0;\n for (let i = 0; i < n; i++) {\n sum += this.serverDelays[i];\n }\n return sum / n;\n }\n\n /**\n * Track bandwidth for ABR.\n * Ported from mews.js:1280-1303\n */\n private trackBits(buf: ArrayBuffer): void {\n this.bitCounter.push(buf.byteLength * 8);\n this.bitsSince.push(Date.now());\n\n // Keep window size of 5 samples\n if (this.bitCounter.length > 5) {\n this.bitCounter.shift();\n this.bitsSince.shift();\n }\n\n // Calculate current bitrate\n if (this.bitCounter.length >= 2) {\n const bits = this.bitCounter[this.bitCounter.length - 1];\n const dt = (this.bitsSince[this.bitsSince.length - 1] - this.bitsSince[0]) / 1000;\n if (dt > 0) {\n this.currentBps = Math.round(bits / dt);\n }\n }\n }\n\n private startTelemetry(): void {\n if (!this.analyticsConfig.enabled || !this.analyticsConfig.endpoint) return;\n\n const endpoint = this.analyticsConfig.endpoint;\n\n this.analyticsTimer = setInterval(async () => {\n if (!this.videoElement) return;\n\n const stats = await this.getStats();\n const payload = {\n t: Date.now(),\n bps: stats.currentBps || 0,\n waiting: stats.waitingEvents || 0\n };\n\n try {\n await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload)\n });\n } catch {}\n }, 5000);\n }\n\n async destroy(): Promise<void> {\n console.debug('[MEWS] destroy() called');\n this.isDestroyed = true;\n this.isReady = false;\n this.readyResolvers = [];\n\n if (this.analyticsTimer) {\n clearInterval(this.analyticsTimer);\n this.analyticsTimer = null;\n }\n\n // CRITICAL: Close WebSocket FIRST to stop all network activity immediately\n // Don't send 'stop' message - it can trigger retry logic and delay cleanup\n this.wsManager?.destroy();\n this.wsManager = null;\n\n this.sbManager?.destroy();\n this.sbManager = null;\n\n if (this.mediaSource?.readyState === 'open') {\n try {\n this.mediaSource.endOfStream();\n } catch {}\n }\n\n if (this.objectUrl) {\n URL.revokeObjectURL(this.objectUrl);\n this.objectUrl = null;\n }\n\n if (this.videoElement && this.container) {\n try { this.container.removeChild(this.videoElement); } catch {}\n }\n\n this.videoElement = null;\n this.container = null;\n this.mediaSource = null;\n this.listeners.clear();\n console.debug('[MEWS] destroy() completed');\n }\n}\n","/**\n * MistSignaling - WebSocket signaling for MistServer's native WebRTC protocol\n *\n * Protocol messages (from MistServer):\n * - on_connected: WebSocket opened successfully\n * - on_disconnected: WebSocket closed\n * - on_answer_sdp: SDP answer received, { result: boolean, answer_sdp: string }\n * - on_time: Time update { current: ms, end: ms, begin: ms, tracks: string[] }\n * - on_stop: Stream ended\n * - on_error: Error occurred { message: string }\n *\n * Protocol messages (to MistServer):\n * - offer_sdp: SDP offer { offer_sdp: string }\n * - seek: Seek to position { seek_time: number | \"live\" }\n * - hold: Pause playback\n * - stop: Stop playback\n * - tracks: Select tracks { video: string, audio: string }\n * - set_speed: Set playback rate { play_rate: number | \"auto\" }\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\n\nexport interface MistSignalingConfig {\n /** WebSocket URL (will convert http to ws) */\n url: string;\n /** Connection timeout in ms (default: 5000) */\n timeout?: number;\n /** Callback for debug logging */\n onLog?: (message: string) => void;\n}\n\nexport interface MistTimeUpdate {\n /** Current playback position in ms */\n current: number;\n /** End position in ms (0 for live) */\n end: number;\n /** Begin position in ms (buffer start) */\n begin: number;\n /** Currently active track IDs */\n tracks?: string[];\n /** Whether playback is paused */\n paused?: boolean;\n /** Whether at live point */\n live_point?: boolean;\n}\n\nexport interface MistSignalingEvents {\n /** Connection established */\n 'connected': void;\n /** Connection closed */\n 'disconnected': { code: number };\n /** SDP answer received */\n 'answer_sdp': { result: boolean; answer_sdp: string };\n /** Time/track update */\n 'time_update': MistTimeUpdate;\n /** Seek completed */\n 'seeked': { live_point?: boolean };\n /** Playback speed changed */\n 'speed_changed': { play_rate: number; play_rate_curr: number };\n /** Stream ended */\n 'stopped': void;\n /** Error occurred */\n 'error': { message: string };\n}\n\nexport type MistSignalingState = 'connecting' | 'connected' | 'disconnected' | 'closed';\n\n/**\n * MistSignaling handles WebSocket communication with MistServer for WebRTC\n */\nexport class MistSignaling extends TypedEventEmitter<MistSignalingEvents> {\n private ws: WebSocket | null = null;\n private url: string;\n private timeout: number;\n private timeoutId: ReturnType<typeof setTimeout> | null = null;\n private onLog: (message: string) => void;\n private _state: MistSignalingState = 'disconnected';\n\n // Promise for seek operation\n public seekPromise: {\n resolve: (msg: string) => void;\n reject: (msg: string) => void;\n } | null = null;\n\n constructor(config: MistSignalingConfig) {\n super();\n // Convert http(s) to ws(s)\n this.url = config.url.replace(/^http/, 'ws');\n this.timeout = config.timeout ?? 5000;\n this.onLog = config.onLog ?? (() => {});\n }\n\n /**\n * Get current connection state\n */\n get state(): MistSignalingState {\n return this._state;\n }\n\n /**\n * Check if connected\n */\n get isConnected(): boolean {\n return this._state === 'connected';\n }\n\n /**\n * Connect to MistServer WebSocket\n */\n connect(): void {\n if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {\n this.onLog('Already connected or connecting');\n return;\n }\n\n this._state = 'connecting';\n this.onLog(`Connecting to ${this.url}`);\n\n try {\n this.ws = new WebSocket(this.url);\n } catch (e) {\n this.onLog(`Failed to create WebSocket: ${e}`);\n this._state = 'disconnected';\n return;\n }\n\n // Connection timeout\n this.timeoutId = setTimeout(() => {\n if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {\n this.onLog('WebSocket connection timeout');\n this.ws.close();\n this._state = 'disconnected';\n this.emit('error', { message: 'Connection timeout' });\n }\n }, this.timeout);\n\n this.ws.onopen = () => {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this._state = 'connected';\n this.onLog('WebSocket connected');\n this.emit('connected', undefined);\n };\n\n this.ws.onmessage = (event) => {\n try {\n const cmd = JSON.parse(event.data);\n this.handleMessage(cmd);\n } catch (err) {\n this.onLog(`Failed to parse message: ${err}`);\n }\n };\n\n this.ws.onclose = (event) => {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this._state = 'closed';\n this.onLog(`WebSocket closed (code: ${event.code})`);\n this.emit('disconnected', { code: event.code });\n };\n\n this.ws.onerror = (event) => {\n this.onLog(`WebSocket error: ${event}`);\n };\n }\n\n /**\n * Handle incoming message from MistServer\n */\n private handleMessage(cmd: Record<string, unknown>): void {\n const type = cmd.type as string;\n\n switch (type) {\n case 'on_connected':\n // Already handled by onopen\n break;\n\n case 'on_disconnected':\n this._state = 'disconnected';\n this.emit('disconnected', { code: (cmd.code as number) || 0 });\n break;\n\n case 'on_answer_sdp':\n this.emit('answer_sdp', {\n result: cmd.result as boolean,\n answer_sdp: cmd.answer_sdp as string,\n });\n break;\n\n case 'on_time':\n this.emit('time_update', {\n current: cmd.current as number,\n end: cmd.end as number,\n begin: cmd.begin as number,\n tracks: cmd.tracks as string[] | undefined,\n paused: cmd.paused as boolean | undefined,\n live_point: cmd.live_point as boolean | undefined,\n });\n break;\n\n case 'seek':\n this.emit('seeked', {\n live_point: (cmd as Record<string, unknown>).live_point as boolean | undefined,\n });\n // Resolve seek promise if pending\n if (this.seekPromise) {\n this.seekPromise.resolve('Seeked');\n this.seekPromise = null;\n }\n break;\n\n case 'set_speed':\n this.emit('speed_changed', {\n play_rate: (cmd as Record<string, unknown>).play_rate as number,\n play_rate_curr: (cmd as Record<string, unknown>).play_rate_curr as number,\n });\n break;\n\n case 'on_stop':\n this.emit('stopped', undefined);\n break;\n\n case 'on_error':\n this.emit('error', { message: cmd.message as string });\n break;\n\n default:\n this.onLog(`Unhandled message type: ${type}`);\n }\n }\n\n /**\n * Send a message to MistServer\n */\n send(cmd: Record<string, unknown>): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.onLog('Cannot send: WebSocket not connected');\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(cmd));\n return true;\n } catch (e) {\n this.onLog(`Failed to send message: ${e}`);\n return false;\n }\n }\n\n /**\n * Send SDP offer to MistServer\n */\n sendOfferSDP(sdp: string): boolean {\n return this.send({ type: 'offer_sdp', offer_sdp: sdp });\n }\n\n /**\n * Seek to position (in seconds or \"live\")\n */\n seek(time: number | 'live'): Promise<string> {\n return new Promise((resolve, reject) => {\n if (!this.isConnected) {\n reject('Not connected');\n return;\n }\n\n // Cancel previous seek if pending\n if (this.seekPromise) {\n this.seekPromise.reject('New seek requested');\n }\n\n // Send seek command (time in ms for MistServer)\n const seekTime = time === 'live' ? 'live' : time * 1000;\n this.send({ type: 'seek', seek_time: seekTime });\n\n // Store promise handlers\n this.seekPromise = { resolve, reject };\n });\n }\n\n /**\n * Pause playback (hold)\n */\n pause(): boolean {\n return this.send({ type: 'hold' });\n }\n\n /**\n * Stop playback\n */\n stop(): boolean {\n return this.send({ type: 'stop' });\n }\n\n /**\n * Set track selection\n * @param video - Video track selection (e.g., \"~1080x720\", \"|500000\", \"none\")\n * @param audio - Audio track selection (e.g., \"eng\", \"none\")\n */\n setTracks(options: { video?: string; audio?: string }): boolean {\n return this.send({ type: 'tracks', ...options });\n }\n\n /**\n * Set playback speed\n * @param rate - Playback rate (1.0 normal, \"auto\" for live catch-up)\n */\n setSpeed(rate: number | 'auto'): boolean {\n return this.send({ type: 'set_speed', play_rate: rate });\n }\n\n /**\n * Close the connection\n */\n close(): void {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n\n if (this.seekPromise) {\n this.seekPromise.reject('Connection closed');\n this.seekPromise = null;\n }\n\n if (this.ws) {\n this._state = 'closed';\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Destroy and cleanup\n */\n destroy(): void {\n this.close();\n this.removeAllListeners();\n }\n}\n\nexport default MistSignaling;\n","/**\n * MistWebRTCPlayerImpl - IPlayer implementation for MistServer native WebRTC\n *\n * Uses MistServer's WebSocket signaling protocol instead of WHEP.\n * Key advantages over WHEP:\n * - Server-side track selection via signaling\n * - Playback speed control (including \"auto\" for live catch-up)\n * - Seeking via signaling (DVR support)\n * - Real-time buffer_window updates\n * - DataChannel for timed metadata\n */\n\nimport { BasePlayer } from '../../core/PlayerInterface';\nimport type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../../core/PlayerInterface';\nimport { MistSignaling, type MistTimeUpdate } from '../../core/MistSignaling';\nimport { checkWebRTCCodecCompatibility } from '../../core/detector';\n\nexport class MistWebRTCPlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: \"MistServer WebRTC\",\n shortname: \"mist-webrtc\",\n priority: 2, // After direct (WHEP=1), before HLS.js (3)\n mimes: [\"webrtc\", \"mist/webrtc\"]\n };\n\n private signaling: MistSignaling | null = null;\n private peerConnection: RTCPeerConnection | null = null;\n private dataChannel: RTCDataChannel | null = null;\n private container: HTMLElement | null = null;\n private destroyed = false;\n\n // Time tracking\n private seekOffset = 0;\n private durationMs = 0;\n private isLiveStream = true;\n private playRate: number | 'auto' = 'auto';\n\n // Buffer window tracking (P2)\n private bufferWindow = 0;\n\n // Track change detection (P1)\n private currentTracks: string[] = [];\n\n // Store source/options for loop reconnect (P1)\n private currentSource: StreamSource | null = null;\n private currentOptions: PlayerOptions | null = null;\n\n // Stats tracking\n private lastInboundStats: { video?: { bytesReceived: number }; audio?: { bytesReceived: number }; timestamp: number } | null = null;\n\n /**\n * Chrome on Android has a bug where H264 is not available immediately\n * after the tab is opened. Retry up to 5 times with 100ms intervals.\n * https://bugs.chromium.org/p/webrtc/issues/detail?id=11620\n */\n private async checkH264Available(retries = 5): Promise<boolean> {\n for (let i = 0; i < retries; i++) {\n try {\n const caps = RTCRtpReceiver.getCapabilities?.('video');\n if (caps?.codecs.some(c => c.mimeType === 'video/H264')) {\n return true;\n }\n } catch {}\n if (i < retries - 1) {\n await new Promise(r => setTimeout(r, 100));\n }\n }\n console.warn('[MistWebRTC] H264 not available after retries');\n return false;\n }\n\n /**\n * Load MistServer's WebRTC browser equalizer script for browser-specific fixes.\n * This is non-fatal if it fails to load.\n */\n private async loadBrowserEqualizer(host: string): Promise<void> {\n if ((window as any).WebRTCBrowserEqualizerLoaded) return;\n\n return new Promise((resolve) => {\n const script = document.createElement('script');\n script.src = `${host}/webrtc.js`;\n script.onload = () => {\n console.debug('[MistWebRTC] Browser equalizer loaded');\n resolve();\n };\n script.onerror = () => {\n console.warn('[MistWebRTC] Failed to load browser equalizer');\n resolve(); // Non-fatal\n };\n document.head.appendChild(script);\n });\n }\n\n /**\n * Compare two arrays for equality (order-independent)\n */\n private arraysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n const sortedA = [...a].sort();\n const sortedB = [...b].sort();\n return sortedA.every((v, i) => v === sortedB[i]);\n }\n\n isMimeSupported(mimetype: string): boolean {\n return this.capability.mimes.includes(mimetype);\n }\n\n isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[] {\n // Check basic WebRTC support\n if (!('RTCPeerConnection' in window) || !('WebSocket' in window)) return false;\n\n // Check codec compatibility\n const codecCompat = checkWebRTCCodecCompatibility(streamInfo.meta.tracks);\n if (!codecCompat.compatible) {\n console.debug('[MistWebRTC] Skipping - incompatible codecs:', codecCompat.incompatibleCodecs.join(', '));\n return false;\n }\n\n // Return which track types we can play\n const playable: string[] = [];\n if (codecCompat.details.compatibleVideoCodecs.length > 0) {\n playable.push('video');\n }\n if (codecCompat.details.compatibleAudioCodecs.length > 0) {\n playable.push('audio');\n }\n\n return playable.length > 0 ? playable : false;\n }\n\n async initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement> {\n this.destroyed = false;\n this.container = container;\n this.currentSource = source;\n this.currentOptions = options;\n container.classList.add('fw-player-container');\n\n // Load browser equalizer script (P0) - extract host from source URL\n try {\n const url = new URL(source.url, window.location.href);\n const host = `${url.protocol}//${url.host}`;\n await this.loadBrowserEqualizer(host);\n } catch {}\n\n // Check H264 availability with retry for Chrome Android bug (P0)\n await this.checkH264Available();\n\n // Create video element\n const video = document.createElement('video');\n video.classList.add('fw-player-video');\n video.setAttribute('playsinline', '');\n video.setAttribute('crossorigin', 'anonymous');\n\n if (options.autoplay) video.autoplay = true;\n if (options.muted) video.muted = true;\n video.controls = options.controls === true; // Explicit false to hide native controls\n if (options.loop) video.loop = true;\n if (options.poster) video.poster = options.poster;\n\n this.videoElement = video;\n container.appendChild(video);\n this.setupVideoEventListeners(video, options);\n\n try {\n await this.setupWebRTC(video, source, options);\n return video;\n } catch (error: any) {\n this.emit('error', error.message || String(error));\n throw error;\n }\n }\n\n async destroy(): Promise<void> {\n this.destroyed = true;\n\n // Close signaling\n if (this.signaling) {\n try {\n this.signaling.stop();\n this.signaling.close();\n } catch {}\n this.signaling = null;\n }\n\n // Close data channel\n if (this.dataChannel) {\n try { this.dataChannel.close(); } catch {}\n this.dataChannel = null;\n }\n\n // Close peer connection\n if (this.peerConnection) {\n try { this.peerConnection.close(); } catch {}\n this.peerConnection = null;\n }\n\n // Clean up video element\n if (this.videoElement) {\n try { (this.videoElement as any).srcObject = null; } catch {}\n this.videoElement.pause();\n\n if (this.container) {\n try { this.container.removeChild(this.videoElement); } catch {}\n }\n }\n\n this.videoElement = null;\n this.container = null;\n this.listeners.clear();\n }\n\n // Override seek to use signaling\n seek(time: number): void {\n if (!this.signaling?.isConnected || !this.videoElement) return;\n\n this.videoElement.pause();\n this.seekOffset = time - this.videoElement.currentTime;\n this.signaling.seek(time).catch((e) => {\n console.warn('[MistWebRTC] Seek failed:', e);\n });\n }\n\n // Override setPlaybackRate to use signaling\n setPlaybackRate(rate: number): void {\n this.signaling?.setSpeed(rate);\n this.playRate = rate;\n }\n\n // Implement jumpToLive via signaling\n jumpToLive(): void {\n if (!this.signaling?.isConnected || !this.videoElement) return;\n\n this.videoElement.pause();\n this.seekOffset = 0;\n this.signaling.seek('live').catch((e) => {\n console.warn('[MistWebRTC] Jump to live failed:', e);\n });\n }\n\n // Override isLive\n isLive(): boolean {\n return this.isLiveStream;\n }\n\n // Override getDuration to use signaling data\n getDuration(): number {\n return this.durationMs > 0 ? this.durationMs / 1000 : super.getDuration();\n }\n\n // Override getCurrentTime to include seek offset\n getCurrentTime(): number {\n const v = this.videoElement;\n if (!v) return 0;\n return this.seekOffset + v.currentTime;\n }\n\n /**\n * Get available quality levels from signaling\n */\n getQualities(): Array<{ id: string; label: string; isAuto?: boolean; active?: boolean }> {\n // Always offer auto as first option\n const qualities: Array<{ id: string; label: string; isAuto?: boolean; active?: boolean }> = [\n { id: 'auto', label: 'Auto', isAuto: true, active: this.playRate === 'auto' }\n ];\n\n // If we have track info from signaling, add quality options\n // MistServer provides track selection via ~widthxheight or |bitrate patterns\n // For now, we expose auto mode - full track enumeration would require\n // parsing the signaling track info which varies by stream\n return qualities;\n }\n\n // Track selection via signaling\n selectQuality(id: string): void {\n if (!this.signaling?.isConnected) return;\n\n if (id === 'auto') {\n this.signaling.setSpeed('auto');\n } else {\n // Track selection: ~widthxheight or |bitrate\n this.signaling.setTracks({ video: id });\n }\n }\n\n // Text track selection via signaling\n selectTextTrack(id: string | null): void {\n if (!this.signaling?.isConnected) return;\n\n if (id === null) {\n this.signaling.setTracks({ video: 'none' });\n } else {\n this.signaling.setTracks({ video: id });\n }\n }\n\n async getStats(): Promise<{\n type: 'webrtc';\n video?: {\n bytesReceived: number;\n packetsReceived: number;\n packetsLost: number;\n packetLossRate: number;\n jitter: number;\n framesDecoded: number;\n framesDropped: number;\n frameDropRate: number;\n frameWidth: number;\n frameHeight: number;\n framesPerSecond: number;\n bitrate: number;\n jitterBufferDelay: number;\n };\n audio?: {\n bytesReceived: number;\n packetsReceived: number;\n packetsLost: number;\n packetLossRate: number;\n jitter: number;\n bitrate: number;\n };\n network?: {\n rtt: number;\n availableOutgoingBitrate: number;\n availableIncomingBitrate: number;\n bytesSent: number;\n bytesReceived: number;\n };\n timestamp: number;\n } | undefined> {\n if (!this.peerConnection) return undefined;\n\n try {\n const stats = await this.peerConnection.getStats();\n const now = Date.now();\n const result: any = { type: 'webrtc', timestamp: now };\n\n stats.forEach((report: any) => {\n if (report.type === 'inbound-rtp') {\n const packetLossRate = report.packetsReceived > 0\n ? (report.packetsLost / (report.packetsReceived + report.packetsLost)) * 100\n : 0;\n\n // Calculate bitrate from previous sample\n let bitrate = 0;\n if (this.lastInboundStats && this.lastInboundStats[report.kind as 'video' | 'audio']) {\n const prev = this.lastInboundStats[report.kind as 'video' | 'audio'];\n const timeDelta = (now - this.lastInboundStats.timestamp) / 1000;\n if (timeDelta > 0 && prev) {\n const bytesDelta = report.bytesReceived - prev.bytesReceived;\n bitrate = Math.round((bytesDelta * 8) / timeDelta);\n }\n }\n\n if (report.kind === 'video') {\n const frameDropRate = report.framesDecoded > 0\n ? (report.framesDropped / (report.framesDecoded + report.framesDropped)) * 100\n : 0;\n\n result.video = {\n bytesReceived: report.bytesReceived || 0,\n packetsReceived: report.packetsReceived || 0,\n packetsLost: report.packetsLost || 0,\n packetLossRate,\n jitter: (report.jitter || 0) * 1000,\n framesDecoded: report.framesDecoded || 0,\n framesDropped: report.framesDropped || 0,\n frameDropRate,\n frameWidth: report.frameWidth || 0,\n frameHeight: report.frameHeight || 0,\n framesPerSecond: report.framesPerSecond || 0,\n bitrate,\n jitterBufferDelay: report.jitterBufferDelay && report.jitterBufferEmittedCount\n ? (report.jitterBufferDelay / report.jitterBufferEmittedCount) * 1000\n : 0,\n };\n }\n if (report.kind === 'audio') {\n result.audio = {\n bytesReceived: report.bytesReceived || 0,\n packetsReceived: report.packetsReceived || 0,\n packetsLost: report.packetsLost || 0,\n packetLossRate,\n jitter: (report.jitter || 0) * 1000,\n bitrate,\n };\n }\n }\n if (report.type === 'candidate-pair' && report.nominated) {\n result.network = {\n rtt: report.currentRoundTripTime ? report.currentRoundTripTime * 1000 : 0,\n availableOutgoingBitrate: report.availableOutgoingBitrate || 0,\n availableIncomingBitrate: report.availableIncomingBitrate || 0,\n bytesSent: report.bytesSent || 0,\n bytesReceived: report.bytesReceived || 0,\n };\n }\n });\n\n // Store for next sample's bitrate calculation\n this.lastInboundStats = {\n video: result.video ? { bytesReceived: result.video.bytesReceived } : undefined,\n audio: result.audio ? { bytesReceived: result.audio.bytesReceived } : undefined,\n timestamp: now,\n };\n\n return result;\n } catch {\n return undefined;\n }\n }\n\n async getLatency(): Promise<{ estimatedMs: number; jitterBufferMs: number; rttMs: number } | undefined> {\n const s = await this.getStats();\n if (!s) return undefined;\n\n return {\n estimatedMs: s.video?.jitterBufferDelay || 0,\n jitterBufferMs: s.video?.jitterBufferDelay || 0,\n rttMs: s.network?.rtt || 0,\n };\n }\n\n /**\n * Get the current buffer window in milliseconds (P2)\n * This is the difference between buffer end and begin from on_time messages.\n */\n getBufferWindow(): number {\n return this.bufferWindow;\n }\n\n /**\n * Request video track matching the given player size (P2 - ABR_resize)\n * Uses MistServer's ~widthxheight track selection syntax.\n */\n setQualityForSize(size: { width: number; height: number }): void {\n if (!this.signaling?.isConnected) return;\n this.signaling.setTracks({ video: `~${size.width}x${size.height}` });\n }\n\n /**\n * Get the metadata DataChannel for timed metadata (P2)\n * Returns the RTCDataChannel or null if not available.\n */\n getMetaDataChannel(): RTCDataChannel | null {\n return this.dataChannel;\n }\n\n /**\n * Override to add WebRTC-specific event handling:\n * - Loop reconnect for VoD (P1)\n * - Proper autoplay disable (P2)\n */\n protected setupVideoEventListeners(video: HTMLVideoElement, options: PlayerOptions): void {\n // Call parent implementation first\n super.setupVideoEventListeners(video, options);\n\n // Proper autoplay disable handling (P2)\n // WebRTC may auto-start even with autoplay=false\n if (!options.autoplay) {\n const pauseOnFirstPlay = () => {\n video.pause();\n this.signaling?.pause();\n video.removeEventListener('play', pauseOnFirstPlay);\n };\n video.addEventListener('play', pauseOnFirstPlay);\n }\n\n // Loop reconnect for VoD content (P1)\n video.addEventListener('ended', async () => {\n if (video.loop && !this.isLiveStream && this.currentSource && this.currentOptions) {\n console.debug('[MistWebRTC] VoD ended with loop enabled, reconnecting...');\n try {\n // Partial cleanup - keep container and video element\n if (this.signaling) {\n try {\n this.signaling.stop();\n this.signaling.close();\n } catch {}\n this.signaling = null;\n }\n if (this.dataChannel) {\n try { this.dataChannel.close(); } catch {}\n this.dataChannel = null;\n }\n if (this.peerConnection) {\n try { this.peerConnection.close(); } catch {}\n this.peerConnection = null;\n }\n\n // Reconnect WebRTC\n await this.setupWebRTC(video, this.currentSource, this.currentOptions);\n } catch (e) {\n console.error('[MistWebRTC] Failed to reconnect for loop:', e);\n this.emit('error', 'Failed to reconnect for loop');\n }\n }\n });\n }\n\n // Private methods\n\n private async setupWebRTC(video: HTMLVideoElement, source: StreamSource, options: PlayerOptions): Promise<void> {\n const sourceAny = source as any;\n const iceServers: RTCIceServer[] = sourceAny?.iceServers || [];\n\n // Create signaling\n this.signaling = new MistSignaling({\n url: source.url,\n timeout: 5000,\n onLog: (msg) => console.debug(`[MistWebRTC] ${msg}`),\n });\n\n // Create peer connection\n const pc = new RTCPeerConnection({ iceServers });\n this.peerConnection = pc;\n\n // Create data channel for metadata\n this.dataChannel = pc.createDataChannel('*', { protocol: 'JSON' });\n this.dataChannel.onmessage = (event) => {\n if (this.destroyed) return;\n console.debug('[MistWebRTC] DataChannel message:', event.data);\n // Handle timed metadata here if needed\n };\n\n // Handle incoming tracks\n pc.ontrack = (event) => {\n if (this.destroyed) return;\n if (video && event.streams[0]) {\n video.srcObject = event.streams[0];\n }\n };\n\n // Connection state changes\n pc.onconnectionstatechange = () => {\n if (this.destroyed) return;\n const state = pc.connectionState;\n console.debug(`[MistWebRTC] Connection state: ${state}`);\n\n if (state === 'failed') {\n this.emit('error', 'WebRTC connection failed (firewall?)');\n }\n };\n\n // ICE connection state\n pc.oniceconnectionstatechange = () => {\n if (this.destroyed) return;\n const state = pc.iceConnectionState;\n console.debug(`[MistWebRTC] ICE state: ${state}`);\n\n if (state === 'failed') {\n this.emit('error', 'ICE connection failed');\n }\n };\n\n // Set up signaling event handlers\n this.setupSignalingHandlers(pc, video);\n\n // Connect signaling\n this.signaling.connect();\n\n // Wait for signaling to connect\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('Signaling connection timeout'));\n }, 10000);\n\n this.signaling!.once('connected', () => {\n clearTimeout(timeout);\n resolve();\n });\n\n this.signaling!.once('error', ({ message }) => {\n clearTimeout(timeout);\n reject(new Error(message));\n });\n });\n\n // Create and send offer\n await this.createAndSendOffer(pc);\n\n // Wait for answer\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('SDP answer timeout'));\n }, 10000);\n\n this.signaling!.once('answer_sdp', async ({ result, answer_sdp }) => {\n clearTimeout(timeout);\n if (!result) {\n reject(new Error('Failed to get SDP answer'));\n return;\n }\n\n try {\n await pc.setRemoteDescription({ type: 'answer', sdp: answer_sdp });\n resolve();\n } catch (err) {\n reject(err);\n }\n });\n });\n }\n\n private setupSignalingHandlers(pc: RTCPeerConnection, video: HTMLVideoElement): void {\n if (!this.signaling) return;\n\n // Dispatch webrtc_connected event (P2)\n this.signaling.on('connected', () => {\n if (this.destroyed) return;\n video.dispatchEvent(new Event('webrtc_connected'));\n });\n\n this.signaling.on('time_update', (update: MistTimeUpdate) => {\n if (this.destroyed) return;\n this.handleTimeUpdate(update, video);\n });\n\n this.signaling.on('seeked', ({ live_point }) => {\n if (this.destroyed) return;\n // Dispatch seeked event\n video.dispatchEvent(new CustomEvent('seeked', { detail: { seekOffset: this.seekOffset } }));\n // Set playback rate to auto if seeked to live point\n if (live_point && this.signaling) {\n this.signaling.setSpeed('auto');\n }\n video.play().catch(() => {});\n });\n\n this.signaling.on('speed_changed', ({ play_rate_curr }) => {\n if (this.destroyed) return;\n this.playRate = play_rate_curr;\n video.dispatchEvent(new CustomEvent('ratechange', { detail: { play_rate_curr } }));\n });\n\n this.signaling.on('stopped', () => {\n if (this.destroyed) return;\n this.isLiveStream = false;\n video.pause();\n this.emit('ended', undefined);\n });\n\n this.signaling.on('error', ({ message }) => {\n if (this.destroyed) return;\n this.emit('error', message);\n });\n\n // Dispatch webrtc_disconnected event (P2)\n this.signaling.on('disconnected', () => {\n if (this.destroyed) return;\n video.dispatchEvent(new Event('webrtc_disconnected'));\n video.pause();\n });\n }\n\n private handleTimeUpdate(update: MistTimeUpdate, video: HTMLVideoElement): void {\n // Update seek offset\n this.seekOffset = update.current / 1000 - video.currentTime;\n\n // Update duration\n const newDuration = update.end === 0 ? Infinity : update.end;\n this.durationMs = newDuration;\n this.isLiveStream = !isFinite(newDuration) || newDuration === 0;\n\n // Track buffer window (P2)\n this.bufferWindow = update.end - update.begin;\n\n // Fire track changed events (P1)\n if (update.tracks && !this.arraysEqual(update.tracks, this.currentTracks)) {\n for (const trackId of update.tracks) {\n if (!this.currentTracks.includes(trackId)) {\n video.dispatchEvent(new CustomEvent('playerUpdate_trackChanged', {\n detail: { trackId }\n }));\n }\n }\n this.currentTracks = [...update.tracks];\n }\n\n // Resume playback if not paused on server\n if (!update.paused && video.paused) {\n video.play().catch(() => {});\n }\n }\n\n private async createAndSendOffer(pc: RTCPeerConnection): Promise<void> {\n if (!this.signaling) return;\n\n // Add transceivers for receiving\n pc.addTransceiver('video', { direction: 'recvonly' });\n pc.addTransceiver('audio', { direction: 'recvonly' });\n\n const offer = await pc.createOffer({\n offerToReceiveAudio: true,\n offerToReceiveVideo: true,\n });\n\n await pc.setLocalDescription(offer);\n\n if (offer.sdp) {\n this.signaling.sendOfferSDP(offer.sdp);\n }\n }\n}\n","/**\n * RawChunkParser - Binary Frame Header Parser\n *\n * Parses the 12-byte binary header from MistServer's raw WebSocket stream.\n *\n * Header format:\n * Byte 0: Track index (uint8)\n * Byte 1: Chunk type: 0=delta, 1=key, 2=init\n * Bytes 2-9: Timestamp in milliseconds (uint64 big-endian)\n * Bytes 10-11: Offset in milliseconds (int16 big-endian, signed)\n *\n * The offset is server-calculated and used for A/V synchronization.\n * Combined presentation time = timestamp + offset\n */\n\nimport type { RawChunk, ChunkType } from './types';\n\nconst HEADER_LENGTH = 12;\n\n/**\n * Parse chunk type byte to string\n */\nfunction parseChunkType(typeByte: number): ChunkType {\n switch (typeByte) {\n case 1:\n return 'key';\n case 2:\n return 'init';\n default:\n return 'delta';\n }\n}\n\n/**\n * Parse a raw binary chunk from MistServer\n *\n * @param data - ArrayBuffer containing header + frame data\n * @returns Parsed RawChunk object\n * @throws Error if data is too short\n */\nexport function parseRawChunk(data: ArrayBuffer): RawChunk {\n if (data.byteLength < HEADER_LENGTH) {\n throw new Error(\n `Invalid chunk: expected at least ${HEADER_LENGTH} bytes, got ${data.byteLength}`\n );\n }\n\n const headerView = new DataView(data, 0, HEADER_LENGTH);\n\n // Byte 0: track index\n const trackIndex = headerView.getUint8(0);\n\n // Byte 1: chunk type\n const type = parseChunkType(headerView.getUint8(1));\n\n // Bytes 2-9: timestamp (uint64 big-endian)\n // getBigUint64 returns BigInt, convert to Number (safe for values < 2^53)\n const timestampBig = headerView.getBigUint64(2, false); // false = big-endian\n const timestamp = Number(timestampBig);\n\n // Bytes 10-11: offset (int16 big-endian, signed)\n const offset = headerView.getInt16(10, false); // false = big-endian\n\n // Remaining bytes: actual frame data\n // Use slice() to create a copy (like reference rawws.js line 462)\n // This ensures the data survives buffer transfers\n const frameData = new Uint8Array(data.slice(HEADER_LENGTH));\n\n return {\n trackIndex,\n type,\n timestamp,\n offset,\n data: frameData,\n };\n}\n\n/**\n * Calculate the presentation timestamp for a chunk\n * This combines the server timestamp with the sync offset\n *\n * @param chunk - Parsed raw chunk\n * @returns Presentation timestamp in microseconds (for WebCodecs API)\n */\nexport function getPresentationTimestamp(chunk: RawChunk): number {\n // timestamp and offset are in milliseconds\n // WebCodecs expects microseconds\n return (chunk.timestamp + chunk.offset) * 1000;\n}\n\n/**\n * Check if this chunk is a keyframe\n */\nexport function isKeyframe(chunk: RawChunk): boolean {\n return chunk.type === 'key';\n}\n\n/**\n * Check if this chunk contains codec initialization data\n */\nexport function isInitData(chunk: RawChunk): boolean {\n return chunk.type === 'init';\n}\n\n/**\n * Format chunk for debug logging\n */\nexport function formatChunkForLog(chunk: RawChunk): string {\n const pts = (chunk.timestamp + chunk.offset) / 1000; // seconds\n const ptsFormatted = pts.toFixed(3);\n return `[Track ${chunk.trackIndex}] ${chunk.type.toUpperCase()} @ ${ptsFormatted}s (${chunk.data.byteLength} bytes)`;\n}\n\n/**\n * RawChunkParser class for stateful parsing with validation\n */\nexport class RawChunkParser {\n private debug: boolean;\n\n constructor(options: { debug?: boolean } = {}) {\n this.debug = options.debug ?? false;\n }\n\n /**\n * Parse binary data from WebSocket\n *\n * @param data - ArrayBuffer from WebSocket message\n * @returns Parsed chunk or null if invalid\n */\n parse(data: ArrayBuffer): RawChunk | null {\n try {\n const chunk = parseRawChunk(data);\n\n if (this.debug) {\n console.log('▶️', formatChunkForLog(chunk));\n }\n\n return chunk;\n } catch (err) {\n console.error('▶️ Failed to parse chunk:', err);\n return null;\n }\n }\n\n /**\n * Set debug mode\n */\n setDebug(enabled: boolean | 'verbose'): void {\n this.debug = enabled === 'verbose' || enabled === true;\n }\n}\n","/**\n * WebSocketController - Control Channel & Binary Frame Routing\n *\n * Manages WebSocket connection to MistServer for raw frame streaming.\n * Handles:\n * - JSON control messages (play, hold, seek, etc.)\n * - Binary frame routing to chunk parser\n * - Reconnection with exponential backoff\n * - Server delay estimation\n *\n * Based on MewsWsPlayer WebSocketManager with raw frame protocol support.\n */\n\nimport type {\n ControlMessage,\n ControlCommand,\n CodecDataMessage,\n InfoMessage,\n OnTimeMessage,\n RawChunk,\n TrackInfo,\n} from './types';\nimport { parseRawChunk, formatChunkForLog } from './RawChunkParser';\n\n/** Connection states */\nexport type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';\n\n/** Event types emitted by WebSocketController */\nexport interface WebSocketControllerEvents {\n statechange: ConnectionState;\n codecdata: CodecDataMessage;\n info: InfoMessage;\n ontime: OnTimeMessage;\n tracks: TrackInfo[];\n chunk: RawChunk;\n stop: void;\n error: Error;\n}\n\ntype EventListener<K extends keyof WebSocketControllerEvents> = (\n data: WebSocketControllerEvents[K]\n) => void;\n\n/** Options for WebSocketController */\nexport interface WebSocketControllerOptions {\n /** Enable debug logging */\n debug?: boolean;\n /** Maximum reconnection attempts (0 = unlimited) */\n maxReconnectAttempts?: number;\n /** Initial reconnection delay (ms) */\n reconnectDelayMs?: number;\n /** Maximum reconnection delay (ms) */\n maxReconnectDelayMs?: number;\n /** Connection timeout (ms) */\n connectionTimeoutMs?: number;\n}\n\n/** Default options */\nconst DEFAULTS: Required<WebSocketControllerOptions> = {\n debug: false,\n maxReconnectAttempts: 5,\n reconnectDelayMs: 1000,\n maxReconnectDelayMs: 30000,\n connectionTimeoutMs: 5000,\n};\n\n/**\n * Server delay tracker for estimating round-trip time\n */\nclass ServerDelayTracker {\n private delays: number[] = [];\n private pending = new Map<string, number>();\n private maxSamples = 3;\n\n /**\n * Start timing a request\n */\n startTiming(requestType: string): void {\n this.pending.set(requestType, performance.now());\n }\n\n /**\n * Complete timing and record delay\n */\n completeTiming(requestType: string): number | null {\n const startTime = this.pending.get(requestType);\n if (startTime === undefined) {\n return null;\n }\n\n this.pending.delete(requestType);\n const delay = performance.now() - startTime;\n\n this.delays.push(delay);\n if (this.delays.length > this.maxSamples) {\n this.delays.shift();\n }\n\n return delay;\n }\n\n /**\n * Get average server delay\n */\n getAverageDelay(): number {\n if (this.delays.length === 0) {\n return 0;\n }\n return this.delays.reduce((sum, d) => sum + d, 0) / this.delays.length;\n }\n\n /**\n * Clear all pending timings\n */\n clear(): void {\n this.pending.clear();\n this.delays = [];\n }\n}\n\n/**\n * WebSocketController - Manages raw frame WebSocket connection\n */\nexport class WebSocketController {\n private ws: WebSocket | null = null;\n private url: string;\n private options: Required<WebSocketControllerOptions>;\n private state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private connectionTimer: ReturnType<typeof setTimeout> | null = null;\n private listeners = new Map<keyof WebSocketControllerEvents, Set<Function>>();\n private serverDelay = new ServerDelayTracker();\n private intentionalClose = false;\n\n constructor(url: string, options: WebSocketControllerOptions = {}) {\n this.url = url;\n this.options = { ...DEFAULTS, ...options };\n }\n\n /**\n * Connect to WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.ws && this.state === 'connected') {\n resolve();\n return;\n }\n\n this.intentionalClose = false;\n this.setState('connecting');\n\n try {\n this.ws = new WebSocket(this.url);\n this.ws.binaryType = 'arraybuffer';\n\n // Connection timeout\n this.connectionTimer = setTimeout(() => {\n if (this.state === 'connecting') {\n this.log('Connection timeout');\n this.ws?.close();\n reject(new Error('Connection timeout'));\n }\n }, this.options.connectionTimeoutMs);\n\n this.ws.onopen = () => {\n this.clearConnectionTimer();\n this.setState('connected');\n this.reconnectAttempts = 0;\n this.log('Connected');\n resolve();\n };\n\n this.ws.onclose = (event) => {\n this.clearConnectionTimer();\n this.log(`Disconnected: ${event.code} ${event.reason}`);\n\n if (!this.intentionalClose && this.shouldReconnect()) {\n this.scheduleReconnect();\n } else {\n this.setState('disconnected');\n }\n };\n\n this.ws.onerror = (event) => {\n this.log('WebSocket error');\n this.emit('error', new Error('WebSocket error'));\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event);\n };\n } catch (err) {\n this.setState('error');\n reject(err);\n }\n });\n }\n\n /**\n * Disconnect from WebSocket server\n */\n disconnect(): void {\n this.intentionalClose = true;\n this.clearReconnectTimer();\n this.clearConnectionTimer();\n\n if (this.ws) {\n // Send hold command before closing\n try {\n this.send({ type: 'hold' });\n } catch {\n // Ignore send errors during close\n }\n\n this.ws.close();\n this.ws = null;\n }\n\n this.serverDelay.clear();\n this.setState('disconnected');\n }\n\n /**\n * Send a control command\n */\n send(command: ControlCommand): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.log(`Cannot send ${command.type}: not connected`);\n return false;\n }\n\n // Track timing for certain commands\n const timedCommands = ['seek', 'set_speed', 'request_codec_data'];\n if (timedCommands.includes(command.type)) {\n this.serverDelay.startTiming(command.type);\n }\n\n const message = JSON.stringify(command);\n this.log(`Sending: ${message}`);\n this.ws.send(message);\n return true;\n }\n\n /**\n * Request playback start\n */\n play(): boolean {\n return this.send({ type: 'play' });\n }\n\n /**\n * Request playback pause\n */\n hold(): boolean {\n return this.send({ type: 'hold' });\n }\n\n /**\n * Seek to position\n * @param timeMs - Target time in milliseconds\n * @param fastForwardMs - Additional buffer to request (ms)\n */\n seek(timeMs: number, fastForwardMs?: number): boolean {\n const cmd: ControlCommand = {\n type: 'seek',\n seek_time: Math.round(timeMs),\n };\n if (fastForwardMs !== undefined) {\n cmd.ff_add = Math.round(fastForwardMs);\n }\n return this.send(cmd);\n }\n\n /**\n * Set playback speed\n */\n setSpeed(rate: number | 'auto'): boolean {\n return this.send({ type: 'set_speed', play_rate: rate });\n }\n\n /**\n * Request codec initialization data\n * @param supportedCombinations - Array of codec combinations we can play\n * Format: [[ [\"H264\"], [\"AAC\"] ]] means \"H264 video AND AAC audio\"\n * Per MistServer rawws.js line 1544\n */\n requestCodecData(supportedCombinations?: string[][][]): boolean {\n if (supportedCombinations && supportedCombinations.length > 0) {\n return this.send({\n type: 'request_codec_data',\n supported_combinations: supportedCombinations,\n });\n }\n return this.send({ type: 'request_codec_data' });\n }\n\n /**\n * Request additional data (fast-forward for buffer recovery)\n */\n fastForward(ms: number): boolean {\n return this.send({ type: 'fast_forward', ff_add: Math.round(ms) });\n }\n\n /**\n * Get current connection state\n */\n getState(): ConnectionState {\n return this.state;\n }\n\n /**\n * Get estimated server delay\n */\n getServerDelay(): number {\n return this.serverDelay.getAverageDelay();\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.state === 'connected' && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Add event listener\n */\n on<K extends keyof WebSocketControllerEvents>(\n event: K,\n listener: EventListener<K>\n ): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n }\n\n /**\n * Remove event listener\n */\n off<K extends keyof WebSocketControllerEvents>(\n event: K,\n listener: EventListener<K>\n ): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n /**\n * Emit event to listeners\n */\n private emit<K extends keyof WebSocketControllerEvents>(\n event: K,\n data: WebSocketControllerEvents[K]\n ): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n for (const listener of eventListeners) {\n try {\n listener(data);\n } catch (err) {\n console.error(`Error in ${event} listener:`, err);\n }\n }\n }\n }\n\n /**\n * Handle incoming WebSocket message\n */\n private handleMessage(event: MessageEvent): void {\n if (event.data instanceof ArrayBuffer) {\n // Binary data - parse as raw chunk\n this.handleBinaryMessage(event.data);\n } else if (typeof event.data === 'string') {\n // JSON control message\n this.handleControlMessage(event.data);\n }\n }\n\n // Rate limit delta frame logging (log at most once per 5 seconds per track)\n private lastDeltaLogTime: Record<number, number> = {};\n private deltaLogInterval = 5000; // ms\n\n /**\n * Handle binary frame data\n */\n private handleBinaryMessage(data: ArrayBuffer): void {\n try {\n const chunk = parseRawChunk(data);\n if (this.options.debug) {\n // Only log KEY/INIT frames, rate-limit DELTA logs\n if (chunk.type !== 'delta') {\n this.log(formatChunkForLog(chunk));\n } else {\n const now = performance.now();\n const lastLog = this.lastDeltaLogTime[chunk.trackIndex] || 0;\n if (now - lastLog > this.deltaLogInterval) {\n this.lastDeltaLogTime[chunk.trackIndex] = now;\n // Don't log delta frames at all - too spammy\n }\n }\n }\n this.emit('chunk', chunk);\n } catch (err) {\n this.log(`Failed to parse binary chunk: ${err}`);\n }\n }\n\n /**\n * Handle JSON control message\n *\n * Per MistServer util.js line 1301, we need to unwrap the `data` field:\n * MistServer sends: { type: \"codec_data\", data: { codecs: [...], tracks: [...] } }\n * We need to emit: { type: \"codec_data\", codecs: [...], tracks: [...] }\n */\n private handleControlMessage(data: string): void {\n try {\n const raw = JSON.parse(data);\n\n // Match MistServer util.js line 1301: unwrap data field if present\n // Some messages (like on_answer_sdp) don't have the data key\n const payload = 'data' in raw ? raw.data : raw;\n const message: ControlMessage = { type: raw.type, ...payload };\n\n this.log(`Received: ${message.type}`);\n\n // Complete timing for responses\n if (message.type === 'codec_data') {\n this.serverDelay.completeTiming('request_codec_data');\n } else if (message.type === 'on_time') {\n this.serverDelay.completeTiming('seek');\n this.serverDelay.completeTiming('set_speed');\n }\n\n // Route to appropriate handler\n switch (message.type) {\n case 'codec_data':\n this.emit('codecdata', message as CodecDataMessage);\n break;\n\n case 'info':\n this.log(`Info message tracks: ${JSON.stringify(Object.keys((message as InfoMessage).meta?.tracks ?? {}))}`);\n this.emit('info', message as InfoMessage);\n break;\n\n case 'on_time':\n if ((message as OnTimeMessage).tracks?.length) {\n this.log(`on_time tracks: ${JSON.stringify((message as OnTimeMessage).tracks)}`);\n }\n this.emit('ontime', message as OnTimeMessage);\n break;\n\n case 'tracks':\n this.emit('tracks', (message as any).tracks);\n break;\n\n case 'on_stop':\n this.emit('stop', undefined);\n break;\n\n case 'error':\n this.emit('error', new Error((message as any).message));\n break;\n\n case 'pause':\n case 'set_speed':\n // Acknowledgments - no action needed\n break;\n\n default:\n this.log(`Unknown message type: ${(message as any).type}`);\n }\n } catch (err) {\n this.log(`Failed to parse control message: ${err}`);\n }\n }\n\n /**\n * Set connection state and emit event\n */\n private setState(state: ConnectionState): void {\n if (this.state !== state) {\n this.state = state;\n this.emit('statechange', state);\n }\n }\n\n /**\n * Check if should attempt reconnection\n */\n private shouldReconnect(): boolean {\n if (this.intentionalClose) {\n return false;\n }\n\n if (this.options.maxReconnectAttempts === 0) {\n return true; // Unlimited retries\n }\n\n return this.reconnectAttempts < this.options.maxReconnectAttempts;\n }\n\n /**\n * Schedule reconnection with exponential backoff\n */\n private scheduleReconnect(): void {\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n // Exponential backoff with jitter\n const baseDelay = this.options.reconnectDelayMs;\n const maxDelay = this.options.maxReconnectDelayMs;\n const delay = Math.min(\n baseDelay * Math.pow(2, this.reconnectAttempts - 1),\n maxDelay\n );\n const jitter = delay * 0.2 * Math.random(); // +/- 20% jitter\n\n this.log(`Reconnecting in ${Math.round(delay + jitter)}ms (attempt ${this.reconnectAttempts})`);\n\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((err) => {\n this.log(`Reconnect failed: ${err.message}`);\n if (this.shouldReconnect()) {\n this.scheduleReconnect();\n } else {\n this.setState('error');\n this.emit('error', new Error('Max reconnection attempts exceeded'));\n }\n });\n }, delay + jitter);\n }\n\n /**\n * Clear reconnect timer\n */\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n /**\n * Clear connection timer\n */\n private clearConnectionTimer(): void {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = null;\n }\n }\n\n /**\n * Log message (if debug enabled)\n */\n private log(message: string): void {\n if (this.options.debug) {\n console.log(`[WebCodecsWS] ${message}`);\n }\n }\n}\n","/**\n * JitterBuffer - Network Jitter Estimation\n *\n * Tracks network jitter to inform buffer sizing decisions.\n * Ported from legacy rawws.js JitterTracker with improvements:\n * - Per-track jitter tracking (audio/video can differ)\n * - TypeScript types\n * - Better edge case handling\n *\n * Algorithm:\n * 1. Track arrival time vs media time for last N chunks\n * 2. Calculate jitter = (mediaTimePassed / speed) - clockTimePassed\n * 3. Maintain sliding window of peak jitter per second\n * 4. Weighted average: (avgPeak + maxPeak * 2) / 3 + 1ms\n * 5. Limit lowering rate to prevent oscillation\n */\n\nimport type { JitterState } from './types';\n\n/** Default sliding window size for chunk tracking */\nconst DEFAULT_CHUNK_WINDOW = 8;\n\n/** Default sliding window size for peak tracking */\nconst DEFAULT_PEAK_WINDOW = 8;\n\n/** Interval between peak calculations (ms) */\nconst PEAK_INTERVAL_MS = 1000;\n\n/** Maximum jitter decrease per interval (ms) */\nconst MAX_JITTER_DECREASE = 500;\n\n/** Initial jitter estimate (ms) */\nconst INITIAL_JITTER = 120;\n\n/** Minimum jitter floor (ms) */\nconst MIN_JITTER = 1;\n\ninterface ChunkTiming {\n /** Wall clock time when chunk arrived (performance.now()) */\n receiveTime: number;\n /** Media timestamp from chunk (ms) */\n mediaTime: number;\n}\n\nexport interface JitterTrackerOptions {\n /** Initial jitter estimate (ms) */\n initialJitter?: number;\n /** Sliding window size for chunks */\n chunkWindowSize?: number;\n /** Sliding window size for peaks */\n peakWindowSize?: number;\n}\n\n/**\n * JitterTracker - Estimates network jitter for a single track\n */\nexport class JitterTracker {\n /** Sliding window of chunk timings */\n private chunks: ChunkTiming[] = [];\n\n /** Current playback speed (1 = realtime) */\n private speed = 1;\n\n /** Last time a peak was recorded */\n private lastPeakTime = 0;\n\n /** Maximum jitter observed in current interval */\n private currentPeak = 0;\n\n /** Sliding window of peak jitter values */\n private peaks: number[] = [];\n\n /** Weighted average jitter estimate */\n private maxJitter: number;\n\n /** Configuration */\n private readonly chunkWindowSize: number;\n private readonly peakWindowSize: number;\n\n constructor(options: JitterTrackerOptions = {}) {\n this.maxJitter = options.initialJitter ?? INITIAL_JITTER;\n this.chunkWindowSize = options.chunkWindowSize ?? DEFAULT_CHUNK_WINDOW;\n this.peakWindowSize = options.peakWindowSize ?? DEFAULT_PEAK_WINDOW;\n }\n\n /**\n * Add a received chunk to jitter calculation\n *\n * @param mediaTime - Media timestamp from chunk (ms)\n * @param receiveTime - Wall clock time (performance.now())\n */\n addChunk(mediaTime: number, receiveTime: number = performance.now()): void {\n // Add to sliding window\n this.chunks.push({ receiveTime, mediaTime });\n if (this.chunks.length > this.chunkWindowSize) {\n this.chunks.shift();\n }\n\n // Calculate instantaneous jitter\n const jitter = this.calculateJitter();\n if (jitter > this.currentPeak) {\n this.currentPeak = jitter;\n }\n\n // Update peaks every second\n const now = performance.now();\n if (now > this.lastPeakTime + PEAK_INTERVAL_MS) {\n this.recordPeak();\n this.lastPeakTime = now;\n }\n }\n\n /**\n * Calculate current instantaneous jitter\n */\n private calculateJitter(): number {\n if (this.chunks.length <= 1) {\n return 0;\n }\n\n // Skip calculation during fast-forward\n if (this.speed === 0 || !isFinite(this.speed)) {\n return 0;\n }\n\n const oldest = this.chunks[0];\n const newest = this.chunks[this.chunks.length - 1];\n\n // Time passed on wall clock\n const clockTimePassed = newest.receiveTime - oldest.receiveTime;\n\n // Time that should have passed based on media timestamps\n const mediaTimePassed = newest.mediaTime - oldest.mediaTime;\n\n // Jitter = expected - actual\n // Positive jitter means chunks arriving faster than expected (buffering)\n // Negative jitter means chunks arriving slower than expected (starving)\n const jitter = mediaTimePassed / this.speed - clockTimePassed;\n\n return Math.max(0, jitter);\n }\n\n /**\n * Record current peak and update weighted average\n */\n private recordPeak(): void {\n // Add current peak to sliding window\n this.peaks.push(this.currentPeak);\n if (this.peaks.length > this.peakWindowSize) {\n this.peaks.shift();\n }\n\n // Reset for next interval\n this.currentPeak = 0;\n\n // Calculate new weighted average\n if (this.peaks.length > 0) {\n const maxPeak = Math.max(...this.peaks);\n const avgPeak =\n this.peaks.reduce((sum, p) => sum + p, 0) / this.peaks.length;\n\n // Weighted: emphasize max peak for safety\n let weighted = (avgPeak + maxPeak * 2) / 3 + MIN_JITTER;\n\n // Limit rate of decrease to prevent oscillation\n if (this.maxJitter > weighted + MAX_JITTER_DECREASE) {\n weighted = this.maxJitter - MAX_JITTER_DECREASE;\n }\n\n // Smooth transition\n this.maxJitter = (this.maxJitter + weighted) / 2;\n }\n }\n\n /**\n * Get current jitter estimate (ms)\n */\n get(): number {\n return this.maxJitter;\n }\n\n /**\n * Get detailed jitter state\n */\n getState(): JitterState {\n return {\n current: this.calculateJitter(),\n peak: this.currentPeak,\n weighted: this.maxJitter,\n };\n }\n\n /**\n * Set playback speed for jitter calculation\n */\n setSpeed(speed: number | 'auto'): void {\n const newSpeed = speed === 'auto' ? 1 : speed;\n if (newSpeed !== this.speed) {\n this.speed = newSpeed;\n this.reset();\n }\n }\n\n /**\n * Reset jitter tracking (e.g., after seek)\n */\n reset(): void {\n this.chunks = [];\n this.currentPeak = 0;\n // Don't reset maxJitter - keep the learned estimate\n }\n\n /**\n * Full reset including learned jitter estimate\n */\n fullReset(): void {\n this.reset();\n this.peaks = [];\n this.maxJitter = INITIAL_JITTER;\n this.lastPeakTime = 0;\n }\n}\n\n/**\n * MultiTrackJitterTracker - Manages jitter tracking for multiple tracks\n */\nexport class MultiTrackJitterTracker {\n private trackers = new Map<number, JitterTracker>();\n private globalSpeed = 1;\n private options: JitterTrackerOptions;\n\n constructor(options: JitterTrackerOptions = {}) {\n this.options = options;\n }\n\n /**\n * Add a chunk for a specific track\n */\n addChunk(trackIndex: number, mediaTime: number, receiveTime?: number): void {\n let tracker = this.trackers.get(trackIndex);\n if (!tracker) {\n tracker = new JitterTracker(this.options);\n tracker.setSpeed(this.globalSpeed);\n this.trackers.set(trackIndex, tracker);\n }\n tracker.addChunk(mediaTime, receiveTime);\n }\n\n /**\n * Get maximum jitter across all tracks\n */\n getMax(): number {\n let max = 0;\n for (const tracker of this.trackers.values()) {\n max = Math.max(max, tracker.get());\n }\n return max;\n }\n\n /**\n * Get jitter for a specific track\n */\n getForTrack(trackIndex: number): number {\n return this.trackers.get(trackIndex)?.get() ?? INITIAL_JITTER;\n }\n\n /**\n * Set playback speed for all trackers\n */\n setSpeed(speed: number | 'auto'): void {\n this.globalSpeed = speed === 'auto' ? 1 : speed;\n for (const tracker of this.trackers.values()) {\n tracker.setSpeed(speed);\n }\n }\n\n /**\n * Reset all trackers\n */\n reset(): void {\n for (const tracker of this.trackers.values()) {\n tracker.reset();\n }\n }\n\n /**\n * Remove a track's tracker\n */\n removeTrack(trackIndex: number): void {\n this.trackers.delete(trackIndex);\n }\n\n /**\n * Clear all trackers\n */\n clear(): void {\n this.trackers.clear();\n }\n}\n","/**\n * Latency Profiles for WebCodecs Player\n *\n * Presets for trading off latency vs stability.\n *\n * Buffer calculation: desiredBuffer = keepAway + serverDelay + (jitter * jitterMultiplier)\n *\n * Speed tweaking:\n * - If buffer > desired * speedUpThreshold → speed up to maxSpeedUp\n * - If buffer < desired * speedDownThreshold → slow down to minSpeedDown\n */\n\nimport type { LatencyProfile, LatencyProfileName } from './types';\n\n/**\n * Ultra-low latency profile\n * Target: <200ms end-to-end latency\n * Use case: Real-time conferencing, remote control\n * Trade-offs: May stutter on poor networks\n */\nexport const ULTRA_LOW_PROFILE: LatencyProfile = {\n name: 'Ultra Low Latency',\n keepAway: 50, // 50ms base buffer\n jitterMultiplier: 1.0, // Full jitter protection (no extra margin)\n speedUpThreshold: 1.5, // Speed up when buffer > 150% of desired\n speedDownThreshold: 0.5, // Slow down when buffer < 50% of desired\n maxSpeedUp: 1.08, // 8% speed up max\n minSpeedDown: 0.95, // 5% slow down max\n audioBufferMs: 100, // 100ms audio ring buffer\n optimizeForLatency: true, // Tell decoders to optimize for latency\n};\n\n/**\n * Low latency profile\n * Target: ~300-500ms end-to-end latency\n * Use case: Live sports, gaming streams\n * Trade-offs: Balanced latency/stability\n */\nexport const LOW_PROFILE: LatencyProfile = {\n name: 'Low Latency',\n keepAway: 100, // 100ms base buffer\n jitterMultiplier: 1.2, // 20% extra jitter protection\n speedUpThreshold: 2.0, // Speed up when buffer > 200% of desired\n speedDownThreshold: 0.6, // Slow down when buffer < 60% of desired\n maxSpeedUp: 1.05, // 5% speed up max (legacy default)\n minSpeedDown: 0.98, // 2% slow down max (legacy default)\n audioBufferMs: 150, // 150ms audio ring buffer\n optimizeForLatency: true,\n};\n\n/**\n * Balanced profile\n * Target: ~500-1000ms end-to-end latency\n * Use case: General live streaming\n * Trade-offs: Prioritizes stability over latency\n */\nexport const BALANCED_PROFILE: LatencyProfile = {\n name: 'Balanced',\n keepAway: 200, // 200ms base buffer\n jitterMultiplier: 1.5, // 50% extra jitter protection\n speedUpThreshold: 2.5, // Speed up when buffer > 250% of desired\n speedDownThreshold: 0.5, // Slow down when buffer < 50% of desired\n maxSpeedUp: 1.03, // 3% speed up max\n minSpeedDown: 0.97, // 3% slow down max\n audioBufferMs: 200, // 200ms audio ring buffer\n optimizeForLatency: false, // Let decoders optimize for quality\n};\n\n/**\n * Quality priority profile\n * Target: ~1-2s end-to-end latency\n * Use case: VOD, recorded content, poor networks\n * Trade-offs: Maximum stability, higher latency\n */\nexport const QUALITY_PROFILE: LatencyProfile = {\n name: 'Quality Priority',\n keepAway: 500, // 500ms base buffer (legacy VOD default)\n jitterMultiplier: 2.0, // Double jitter protection\n speedUpThreshold: 3.0, // Speed up when buffer > 300% of desired\n speedDownThreshold: 0.4, // Slow down when buffer < 40% of desired\n maxSpeedUp: 1.02, // 2% speed up max\n minSpeedDown: 0.98, // 2% slow down max\n audioBufferMs: 300, // 300ms audio ring buffer\n optimizeForLatency: false,\n};\n\n/**\n * All available latency profiles\n */\nexport const LATENCY_PROFILES: Record<LatencyProfileName, LatencyProfile> = {\n 'ultra-low': ULTRA_LOW_PROFILE,\n 'low': LOW_PROFILE,\n 'balanced': BALANCED_PROFILE,\n 'quality': QUALITY_PROFILE,\n};\n\n/**\n * Get a latency profile by name\n * @param name - Profile name\n * @returns The profile, or 'low' as default\n */\nexport function getLatencyProfile(name?: LatencyProfileName): LatencyProfile {\n if (name && name in LATENCY_PROFILES) {\n return LATENCY_PROFILES[name];\n }\n return LATENCY_PROFILES['low'];\n}\n\n/**\n * Merge a custom partial profile with a base profile\n * @param base - Base profile name or profile object\n * @param custom - Partial overrides\n * @returns Merged profile\n */\nexport function mergeLatencyProfile(\n base: LatencyProfileName | LatencyProfile,\n custom?: Partial<LatencyProfile>\n): LatencyProfile {\n const baseProfile = typeof base === 'string' ? getLatencyProfile(base) : base;\n\n if (!custom) {\n return baseProfile;\n }\n\n return {\n ...baseProfile,\n ...custom,\n name: custom.name ?? `${baseProfile.name} (Custom)`,\n };\n}\n\n/**\n * Select appropriate profile based on stream type\n * @param isLive - Whether the stream is live\n * @param preferLowLatency - Whether to prefer low latency (e.g., WebRTC source)\n * @returns Recommended profile name\n */\nexport function selectDefaultProfile(\n isLive: boolean,\n preferLowLatency = false\n): LatencyProfileName {\n if (!isLive) {\n return 'quality';\n }\n\n if (preferLowLatency) {\n return 'low';\n }\n\n return 'balanced';\n}\n","/**\n * SyncController - Buffer Management & Playback Timing\n *\n * Orchestrates:\n * - Buffer level monitoring\n * - Adaptive playback speed (catchup/slowdown)\n * - Jitter tracking integration\n * - Server delay estimation\n * - Seek coordination\n *\n * Based on legacy rawws.js FrameTiming + buffer management with improvements:\n * - Post-decode drift correction\n * - Better seek cancellation\n * - TypeScript types\n */\n\nimport type {\n LatencyProfile,\n BufferState,\n SyncState,\n TrackInfo,\n} from './types';\nimport { MultiTrackJitterTracker } from './JitterBuffer';\nimport { getLatencyProfile } from './LatencyProfiles';\n\n/** Events emitted by SyncController */\nexport interface SyncControllerEvents {\n speedchange: { speed: number; reason: 'catchup' | 'slowdown' | 'normal' };\n bufferlow: { current: number; desired: number };\n bufferhigh: { current: number; desired: number };\n underrun: void;\n livecatchup: { fastForwardMs: number };\n seekstart: { seekId: number; time: number };\n seekcomplete: { seekId: number };\n}\n\ntype EventListener<K extends keyof SyncControllerEvents> = (\n data: SyncControllerEvents[K]\n) => void;\n\n/** Seek state tracking */\ninterface SeekState {\n active: boolean;\n id: number;\n targetTime: number;\n startedAt: number;\n}\n\n/**\n * SyncController - Manages playback synchronization\n */\nexport class SyncController {\n private profile: LatencyProfile;\n private jitterTracker: MultiTrackJitterTracker;\n private listeners = new Map<keyof SyncControllerEvents, Set<Function>>();\n\n // Playback speed state\n private mainSpeed = 1;\n private tweakSpeed = 1;\n\n // Buffer state\n private lastBufferCheck = 0;\n private bufferCheckInterval = 100; // ms\n\n // Server delay tracking\n private serverDelays: number[] = [];\n private maxServerDelaysSamples = 3;\n\n // Live catchup tracking\n // Reference: rawws.js:489-503 - proactively request 5s fast forward\n private lastLiveCatchup = 0;\n private liveCatchupCooldown = 2000; // Minimum ms between catchup requests\n private liveCatchupThresholdMs = 5000; // Request catchup when within 5s of live\n private liveCatchupRequestMs = 5000; // Request 5 seconds of fast forward\n\n // Time tracking\n private serverTime = 0;\n private localTimeAtServerUpdate = 0;\n\n // Seek state\n private seekState: SeekState = {\n active: false,\n id: 0,\n targetTime: 0,\n startedAt: 0,\n };\n\n // Stream info\n private isLive = true;\n\n // Callbacks for external control\n private onSpeedChange?: (main: number, tweak: number) => void;\n private onFastForwardRequest?: (ms: number) => void;\n\n constructor(options: {\n profile?: LatencyProfile;\n isLive?: boolean;\n onSpeedChange?: (main: number, tweak: number) => void;\n onFastForwardRequest?: (ms: number) => void;\n } = {}) {\n this.profile = options.profile ?? getLatencyProfile('low');\n this.isLive = options.isLive ?? true;\n this.onSpeedChange = options.onSpeedChange;\n this.onFastForwardRequest = options.onFastForwardRequest;\n\n this.jitterTracker = new MultiTrackJitterTracker({\n initialJitter: 120,\n });\n }\n\n /**\n * Update latency profile\n */\n setProfile(profile: LatencyProfile): void {\n this.profile = profile;\n }\n\n /**\n * Update stream type (live vs VOD)\n */\n setLive(isLive: boolean): void {\n this.isLive = isLive;\n }\n\n /**\n * Record a chunk arrival for jitter tracking\n */\n recordChunkArrival(trackIndex: number, mediaTimeMs: number): void {\n this.jitterTracker.addChunk(trackIndex, mediaTimeMs);\n }\n\n /**\n * Update server time from on_time message\n */\n updateServerTime(currentTime: number): void {\n this.serverTime = currentTime;\n this.localTimeAtServerUpdate = performance.now();\n }\n\n /**\n * Record server delay measurement\n */\n recordServerDelay(delayMs: number): void {\n this.serverDelays.push(delayMs);\n if (this.serverDelays.length > this.maxServerDelaysSamples) {\n this.serverDelays.shift();\n }\n }\n\n /**\n * Get current server delay estimate\n */\n getServerDelay(): number {\n if (this.serverDelays.length === 0) return 0;\n return this.serverDelays.reduce((sum, d) => sum + d, 0) / this.serverDelays.length;\n }\n\n /**\n * Get estimated current server time (interpolated)\n */\n getEstimatedServerTime(): number {\n const elapsed = (performance.now() - this.localTimeAtServerUpdate) / 1000;\n return this.serverTime + elapsed * this.getCombinedSpeed();\n }\n\n /**\n * Calculate desired buffer size based on profile + jitter + server delay\n * Matches MistServer mews.js pattern with Chrome-specific handling\n */\n getDesiredBuffer(): number {\n // Chrome needs larger base buffer (per mews.js:482)\n const isChrome = typeof navigator !== 'undefined' &&\n /Chrome/.test(navigator.userAgent) && !/Edge|Edg/.test(navigator.userAgent);\n const baseBuffer = isChrome ? 1000 : 100;\n\n const serverDelay = this.getServerDelay();\n const jitter = this.jitterTracker.getMax() * this.profile.jitterMultiplier;\n\n // Match mews.js formula: Math.max(baseBuffer + serverDelay, serverDelay * 2) + jitter\n const liveBuffer = Math.max(baseBuffer + serverDelay, serverDelay * 2) + jitter;\n\n // VoD gets extra buffer (mews.js:480)\n return this.isLive ? liveBuffer : liveBuffer + 2000;\n }\n\n /**\n * Evaluate buffer state and adjust playback speed if needed\n *\n * @param currentBufferMs - Current buffer level in milliseconds\n * @returns Updated sync state\n */\n evaluateBuffer(currentBufferMs: number): SyncState {\n const now = performance.now();\n\n // Rate limit buffer checks\n if (now - this.lastBufferCheck < this.bufferCheckInterval) {\n return this.getState(currentBufferMs);\n }\n this.lastBufferCheck = now;\n\n const desired = this.getDesiredBuffer();\n const ratio = currentBufferMs / desired;\n const jitterMs = this.jitterTracker.getMax();\n\n // Proactive live catchup logic\n // Reference: rawws.js:489-503 - request 5s fast forward when close to live\n // distanceToLive = how much buffer we have (close to live = small buffer)\n // Conditions:\n // - Within liveCatchupThreshold of live edge (small buffer)\n // - Buffer is more than jitter + safety margin (not stalled)\n // - Buffer is less than 1s above desired\n // - Cooldown period has passed\n if (this.isLive &&\n currentBufferMs < this.liveCatchupThresholdMs &&\n currentBufferMs > Math.max(jitterMs * 1.1, jitterMs + 250) &&\n (currentBufferMs - desired) < 1000 &&\n (now - this.lastLiveCatchup) > this.liveCatchupCooldown) {\n this.lastLiveCatchup = now;\n this.requestFastForward(this.liveCatchupRequestMs);\n this.emit('livecatchup', { fastForwardMs: this.liveCatchupRequestMs });\n }\n\n // Determine if speed adjustment needed\n if (ratio > this.profile.speedUpThreshold && this.isLive) {\n // Buffer too high - speed up to catch up to live edge\n this.setTweakSpeed(this.profile.maxSpeedUp, 'catchup');\n } else if (ratio < this.profile.speedDownThreshold) {\n // Buffer too low - slow down to build buffer\n this.setTweakSpeed(this.profile.minSpeedDown, 'slowdown');\n\n // Request additional data if critically low\n if (ratio < 0.3 && this.isLive) {\n this.requestFastForward(desired - currentBufferMs);\n this.emit('underrun', undefined);\n }\n\n this.emit('bufferlow', { current: currentBufferMs, desired });\n } else {\n // Buffer in acceptable range - return to normal speed\n if (this.tweakSpeed !== 1) {\n this.setTweakSpeed(1, 'normal');\n }\n }\n\n return this.getState(currentBufferMs);\n }\n\n /**\n * Get current sync state\n */\n getState(currentBufferMs?: number): SyncState {\n const buffer = currentBufferMs ?? 0;\n const desired = this.getDesiredBuffer();\n\n return {\n buffer: {\n current: buffer,\n desired,\n ratio: desired > 0 ? buffer / desired : 1,\n },\n jitter: this.jitterTracker.getMax() > 0\n ? {\n current: 0, // Would need per-frame tracking\n peak: 0,\n weighted: this.jitterTracker.getMax(),\n }\n : { current: 0, peak: 0, weighted: 0 },\n playbackSpeed: this.getCombinedSpeed(),\n serverTime: this.serverTime,\n serverDelay: this.getServerDelay(),\n avOffset: 0, // Server handles A/V sync via timestamp+offset\n };\n }\n\n /**\n * Get combined playback speed (main * tweak)\n */\n getCombinedSpeed(): number {\n return this.mainSpeed * this.tweakSpeed;\n }\n\n /**\n * Set main playback speed (user-controlled)\n */\n setMainSpeed(speed: number): void {\n this.mainSpeed = speed;\n this.jitterTracker.setSpeed(speed);\n this.notifySpeedChange();\n }\n\n /**\n * Set tweak speed (automatic adjustment)\n */\n private setTweakSpeed(\n speed: number,\n reason: 'catchup' | 'slowdown' | 'normal'\n ): void {\n if (this.tweakSpeed !== speed) {\n this.tweakSpeed = speed;\n this.notifySpeedChange();\n this.emit('speedchange', { speed: this.getCombinedSpeed(), reason });\n }\n }\n\n /**\n * Notify external listeners of speed change\n */\n private notifySpeedChange(): void {\n this.onSpeedChange?.(this.mainSpeed, this.tweakSpeed);\n }\n\n /**\n * Request additional data from server\n */\n private requestFastForward(ms: number): void {\n this.onFastForwardRequest?.(Math.max(0, ms));\n }\n\n // ============================================================================\n // Seek Management\n // ============================================================================\n\n /**\n * Start a seek operation\n * Returns a seek ID that can be used to check if seek is still active\n */\n startSeek(targetTimeMs: number): number {\n // Cancel any existing seek\n this.seekState.id++;\n\n this.seekState = {\n active: true,\n id: this.seekState.id,\n targetTime: targetTimeMs,\n startedAt: performance.now(),\n };\n\n // Reset jitter tracking on seek\n this.jitterTracker.reset();\n\n this.emit('seekstart', { seekId: this.seekState.id, time: targetTimeMs });\n\n return this.seekState.id;\n }\n\n /**\n * Check if a seek is still the active one\n */\n isSeekActive(seekId: number): boolean {\n return this.seekState.active && this.seekState.id === seekId;\n }\n\n /**\n * Complete a seek operation\n */\n completeSeek(seekId: number): void {\n if (this.seekState.id === seekId) {\n this.seekState.active = false;\n this.emit('seekcomplete', { seekId });\n }\n }\n\n /**\n * Cancel any active seek\n */\n cancelSeek(): void {\n if (this.seekState.active) {\n this.seekState.active = false;\n }\n }\n\n /**\n * Check if currently seeking\n */\n isSeeking(): boolean {\n return this.seekState.active;\n }\n\n // ============================================================================\n // Track Management\n // ============================================================================\n\n /**\n * Register a new track\n */\n addTrack(trackIndex: number, track: TrackInfo): void {\n // Jitter tracking will be initialized on first chunk\n }\n\n /**\n * Remove a track\n */\n removeTrack(trackIndex: number): void {\n this.jitterTracker.removeTrack(trackIndex);\n }\n\n // ============================================================================\n // Reset\n // ============================================================================\n\n /**\n * Reset all state\n */\n reset(): void {\n this.mainSpeed = 1;\n this.tweakSpeed = 1;\n this.serverDelays = [];\n this.serverTime = 0;\n this.localTimeAtServerUpdate = 0;\n this.lastLiveCatchup = 0;\n this.jitterTracker.reset();\n this.seekState = {\n active: false,\n id: 0,\n targetTime: 0,\n startedAt: 0,\n };\n }\n\n // ============================================================================\n // Event Emitter\n // ============================================================================\n\n on<K extends keyof SyncControllerEvents>(\n event: K,\n listener: EventListener<K>\n ): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n }\n\n off<K extends keyof SyncControllerEvents>(\n event: K,\n listener: EventListener<K>\n ): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n private emit<K extends keyof SyncControllerEvents>(\n event: K,\n data: SyncControllerEvents[K]\n ): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n for (const listener of eventListeners) {\n try {\n listener(data);\n } catch (err) {\n console.error(`Error in ${event} listener:`, err);\n }\n }\n }\n }\n}\n","/**\n * MediaStreamTrackGenerator Polyfill\n *\n * Provides fallback for browsers without native MediaStreamTrackGenerator (Firefox).\n *\n * Video: Uses Canvas2D + captureStream()\n * Audio: Uses AudioWorklet + createMediaStreamDestination()\n *\n * Based on legacy rawws.js polyfill with improvements:\n * - TypeScript types\n * - Pull-based audio to prevent tin-can distortion\n * - Better resource cleanup\n */\n\n/**\n * Check if native MediaStreamTrackGenerator is available\n */\nexport function hasNativeMediaStreamTrackGenerator(): boolean {\n return typeof (globalThis as any).MediaStreamTrackGenerator !== 'undefined';\n}\n\n/**\n * Polyfill for MediaStreamTrackGenerator (video)\n *\n * Uses an offscreen canvas and captureStream() to create a MediaStreamTrack\n * that can be fed VideoFrames via a WritableStream.\n */\nexport class VideoTrackGeneratorPolyfill {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private track: MediaStreamTrack;\n private _writable: WritableStream<VideoFrame>;\n private closed = false;\n\n constructor() {\n // Create offscreen canvas\n this.canvas = document.createElement('canvas');\n this.canvas.width = 1920; // Will be resized on first frame\n this.canvas.height = 1080;\n\n const ctx = this.canvas.getContext('2d', { desynchronized: true });\n if (!ctx) {\n throw new Error('Failed to create canvas 2D context');\n }\n this.ctx = ctx;\n\n // Capture stream from canvas\n const stream = this.canvas.captureStream();\n const tracks = stream.getVideoTracks();\n if (tracks.length === 0) {\n throw new Error('Failed to capture stream from canvas');\n }\n this.track = tracks[0];\n\n // Create writable stream that draws frames to canvas\n this._writable = new WritableStream<VideoFrame>({\n write: (frame: VideoFrame) => {\n if (this.closed) {\n frame.close();\n return;\n }\n\n // Resize canvas to match frame if needed\n if (\n this.canvas.width !== frame.displayWidth ||\n this.canvas.height !== frame.displayHeight\n ) {\n this.canvas.width = frame.displayWidth;\n this.canvas.height = frame.displayHeight;\n }\n\n // Draw frame to canvas\n this.ctx.drawImage(\n frame as unknown as CanvasImageSource,\n 0,\n 0,\n this.canvas.width,\n this.canvas.height\n );\n\n // Close the frame to release resources\n frame.close();\n },\n close: () => {\n this.close();\n },\n abort: () => {\n this.close();\n },\n });\n }\n\n /**\n * Get the writable stream for writing VideoFrames\n */\n get writable(): WritableStream<VideoFrame> {\n return this._writable;\n }\n\n /**\n * Get the MediaStreamTrack for adding to MediaStream\n */\n getTrack(): MediaStreamTrack {\n return this.track;\n }\n\n /**\n * Close and cleanup resources\n */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n this.track.stop();\n }\n}\n\n/**\n * Polyfill for MediaStreamTrackGenerator (audio)\n *\n * Uses AudioWorklet to create a pull-based audio output that prevents\n * the \"tin-can\" distortion issue from the legacy implementation.\n *\n * Key improvement: Audio samples are pulled by the worklet at a fixed rate,\n * and we feed samples proactively rather than pushing them as they arrive.\n */\nexport class AudioTrackGeneratorPolyfill {\n private audioContext: AudioContext;\n private destination: MediaStreamAudioDestinationNode;\n private workletNode: AudioWorkletNode | null = null;\n private track: MediaStreamTrack;\n private _writable: WritableStream<AudioData>;\n private closed = false;\n private initialized = false;\n private initPromise: Promise<void>;\n\n // Ring buffer for samples (main thread side)\n private sampleBuffer: Float32Array[] = [];\n private maxBufferChunks = 20; // ~400ms at 48kHz with 1024 samples/chunk\n\n constructor() {\n // Create audio context\n this.audioContext = new AudioContext({ latencyHint: 'interactive' });\n\n // Create destination for MediaStreamTrack\n this.destination = this.audioContext.createMediaStreamDestination();\n const tracks = this.destination.stream.getAudioTracks();\n if (tracks.length === 0) {\n throw new Error('Failed to create audio destination');\n }\n this.track = tracks[0];\n\n // Initialize worklet\n this.initPromise = this.initializeWorklet();\n\n // Create writable stream for AudioData\n this._writable = new WritableStream<AudioData>({\n write: (data: AudioData) => {\n if (this.closed) {\n data.close();\n return;\n }\n\n // Convert AudioData to Float32Array\n const samples = this.audioDataToSamples(data);\n data.close();\n\n // Add to ring buffer\n this.sampleBuffer.push(samples);\n if (this.sampleBuffer.length > this.maxBufferChunks) {\n this.sampleBuffer.shift(); // Drop oldest\n }\n\n // Feed samples to worklet\n this.feedSamples();\n },\n close: () => {\n this.close();\n },\n abort: () => {\n this.close();\n },\n });\n }\n\n /**\n * Initialize the AudioWorklet\n */\n private async initializeWorklet(): Promise<void> {\n // Create worklet code as blob\n const workletCode = `\n class SyncedAudioProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this.ringBuffer = [];\n this.maxBufferSize = 10;\n\n this.port.onmessage = (e) => {\n if (e.data.type === 'samples') {\n // Add samples to ring buffer\n this.ringBuffer.push(e.data.samples);\n if (this.ringBuffer.length > this.maxBufferSize) {\n this.ringBuffer.shift(); // Drop oldest\n }\n }\n };\n }\n\n process(inputs, outputs, parameters) {\n const output = outputs[0];\n if (!output || output.length === 0) return true;\n\n const channel = output[0];\n\n if (this.ringBuffer.length > 0) {\n const samples = this.ringBuffer.shift();\n const len = Math.min(samples.length, channel.length);\n for (let i = 0; i < len; i++) {\n channel[i] = samples[i];\n }\n // Fill remainder with last sample (smooth transition)\n for (let i = len; i < channel.length; i++) {\n channel[i] = samples[len - 1] || 0;\n }\n } else {\n // No samples - output silence\n channel.fill(0);\n }\n\n return true;\n }\n }\n\n registerProcessor('synced-audio-processor', SyncedAudioProcessor);\n `;\n\n const blob = new Blob([workletCode], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n\n try {\n await this.audioContext.audioWorklet.addModule(url);\n\n this.workletNode = new AudioWorkletNode(\n this.audioContext,\n 'synced-audio-processor'\n );\n this.workletNode.connect(this.destination);\n\n this.initialized = true;\n } finally {\n URL.revokeObjectURL(url);\n }\n }\n\n /**\n * Convert AudioData to mono Float32Array\n */\n private audioDataToSamples(data: AudioData): Float32Array {\n const channels = data.numberOfChannels;\n const frames = data.numberOfFrames;\n\n // Get all samples\n const allSamples = new Float32Array(frames * channels);\n data.copyTo(allSamples, { planeIndex: 0 });\n\n // Convert to mono if needed\n if (channels === 1) {\n return allSamples;\n }\n\n // Mix down to mono\n const mono = new Float32Array(frames);\n for (let i = 0; i < frames; i++) {\n let sum = 0;\n for (let ch = 0; ch < channels; ch++) {\n sum += allSamples[i * channels + ch];\n }\n mono[i] = sum / channels;\n }\n\n return mono;\n }\n\n /**\n * Feed samples to the worklet\n */\n private feedSamples(): void {\n if (!this.initialized || !this.workletNode || this.sampleBuffer.length === 0) {\n return;\n }\n\n // Send oldest chunk to worklet\n const samples = this.sampleBuffer.shift();\n if (samples) {\n this.workletNode.port.postMessage(\n { type: 'samples', samples },\n { transfer: [samples.buffer] }\n );\n }\n }\n\n /**\n * Get the writable stream for writing AudioData\n */\n get writable(): WritableStream<AudioData> {\n return this._writable;\n }\n\n /**\n * Get the MediaStreamTrack for adding to MediaStream\n */\n getTrack(): MediaStreamTrack {\n return this.track;\n }\n\n /**\n * Wait for initialization to complete\n */\n async waitForInit(): Promise<void> {\n await this.initPromise;\n }\n\n /**\n * Close and cleanup resources\n */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n this.track.stop();\n this.workletNode?.disconnect();\n this.audioContext.close();\n this.sampleBuffer = [];\n }\n}\n\n/**\n * Create appropriate track generator based on browser support\n *\n * @param kind - 'video' or 'audio'\n * @returns Native generator or polyfill\n */\nexport function createTrackGenerator(\n kind: 'video' | 'audio'\n): {\n writable: WritableStream<VideoFrame | AudioData>;\n getTrack: () => MediaStreamTrack;\n close: () => void;\n waitForInit?: () => Promise<void>;\n} {\n // Try native first\n if (hasNativeMediaStreamTrackGenerator()) {\n const Generator = (globalThis as any).MediaStreamTrackGenerator;\n const generator = new Generator({ kind });\n return {\n writable: generator.writable,\n getTrack: () => generator,\n close: () => generator.stop?.(),\n };\n }\n\n // Fall back to polyfill\n if (kind === 'video') {\n const polyfill = new VideoTrackGeneratorPolyfill();\n return {\n writable: polyfill.writable as WritableStream<VideoFrame | AudioData>,\n getTrack: () => polyfill.getTrack(),\n close: () => polyfill.close(),\n };\n } else {\n const polyfill = new AudioTrackGeneratorPolyfill();\n return {\n writable: polyfill.writable as WritableStream<VideoFrame | AudioData>,\n getTrack: () => polyfill.getTrack(),\n close: () => polyfill.close(),\n waitForInit: () => polyfill.waitForInit(),\n };\n }\n}\n","/**\n * WebCodecs Player Types\n *\n * Type definitions for the WebCodecs-based low-latency player.\n */\n\n// ============================================================================\n// Latency Profile Types\n// ============================================================================\n\nexport type LatencyProfileName = 'ultra-low' | 'low' | 'balanced' | 'quality';\n\nexport interface LatencyProfile {\n name: string;\n /** Base buffer before decoding (ms) */\n keepAway: number;\n /** Multiplier for jitter in buffer calculation */\n jitterMultiplier: number;\n /** Buffer ratio threshold to trigger speed up (e.g., 2.0 = 200%) */\n speedUpThreshold: number;\n /** Buffer ratio threshold to trigger slow down (e.g., 0.6 = 60%) */\n speedDownThreshold: number;\n /** Maximum playback speed for catchup */\n maxSpeedUp: number;\n /** Minimum playback speed for slowdown */\n minSpeedDown: number;\n /** AudioWorklet ring buffer duration (ms) */\n audioBufferMs: number;\n /** Whether to use optimizeForLatency hint for decoders */\n optimizeForLatency: boolean;\n}\n\n// ============================================================================\n// Raw Chunk Types (12-byte binary header protocol)\n// ============================================================================\n\nexport type ChunkType = 'key' | 'delta' | 'init';\n\nexport interface RawChunk {\n /** Track index from server */\n trackIndex: number;\n /** Frame type: key (keyframe), delta (P/B frame), init (codec init data) */\n type: ChunkType;\n /** Presentation timestamp in milliseconds */\n timestamp: number;\n /** Server-calculated offset in milliseconds (for A/V sync) */\n offset: number;\n /** Actual frame data */\n data: Uint8Array;\n}\n\n// ============================================================================\n// Track Types\n// ============================================================================\n\nexport type TrackType = 'video' | 'audio' | 'meta';\n\nexport interface TrackInfo {\n idx: number;\n type: TrackType;\n codec: string;\n codecstring?: string;\n init?: string;\n // Video-specific\n width?: number;\n height?: number;\n fpks?: number; // frames per kilosecond\n // Audio-specific\n channels?: number;\n rate?: number; // sample rate\n size?: number; // bits per sample\n}\n\n// ============================================================================\n// WebSocket Control Messages\n// ============================================================================\n\nexport type ControlMessageType =\n | 'codec_data'\n | 'info'\n | 'on_time'\n | 'tracks'\n | 'set_speed'\n | 'pause'\n | 'on_stop'\n | 'error';\n\nexport interface CodecDataMessage {\n type: 'codec_data';\n /** Current stream position in milliseconds */\n current?: number;\n /** List of WebCodecs-compatible codec strings (e.g., \"avc1.42001f\", \"mp4a.40.2\") */\n codecs?: string[];\n /** Track indices selected by server based on supported_combinations */\n tracks?: number[];\n}\n\n/**\n * Stream info message with track metadata\n * Sent by MistServer with full stream information\n */\nexport interface InfoMessage {\n type: 'info';\n /** Stream metadata including tracks */\n meta?: {\n tracks?: Record<string, TrackInfo>;\n };\n /** Stream type ('live' or 'vod') */\n type_?: string;\n}\n\nexport interface OnTimeMessage {\n type: 'on_time';\n /** Current playback time (seconds) */\n current: number;\n /** Total duration (seconds, Infinity for live) */\n total: number;\n /** Available buffer end time (seconds) */\n available?: number;\n /** End time of available content (seconds) */\n end?: number;\n /** Server-reported jitter (ms) */\n jitter?: number;\n /** Current play rate */\n play_rate?: number | 'auto';\n /** Current play rate (alias) */\n play_rate_curr?: number | 'auto' | 'fast-forward';\n /** Active track indices */\n tracks?: number[];\n}\n\nexport interface TracksMessage {\n type: 'tracks';\n tracks: TrackInfo[];\n codecs?: string[];\n}\n\nexport interface SetSpeedMessage {\n type: 'set_speed';\n play_rate: number | 'auto';\n}\n\nexport interface PauseMessage {\n type: 'pause';\n}\n\nexport interface OnStopMessage {\n type: 'on_stop';\n}\n\nexport interface ErrorMessage {\n type: 'error';\n message: string;\n}\n\nexport type ControlMessage =\n | CodecDataMessage\n | InfoMessage\n | OnTimeMessage\n | TracksMessage\n | SetSpeedMessage\n | PauseMessage\n | OnStopMessage\n | ErrorMessage;\n\n// Outbound control commands\nexport interface PlayCommand {\n type: 'play';\n}\n\nexport interface HoldCommand {\n type: 'hold';\n}\n\nexport interface SeekCommand {\n type: 'seek';\n seek_time: number; // milliseconds\n ff_add?: number; // fast-forward buffer request (ms)\n}\n\nexport interface SetSpeedCommand {\n type: 'set_speed';\n play_rate: number | 'auto';\n}\n\nexport interface RequestCodecDataCommand {\n type: 'request_codec_data';\n /** Supported codec combinations - array of [video codecs[], audio codecs[]] */\n supported_combinations?: string[][][];\n}\n\nexport interface FastForwardCommand {\n type: 'fast_forward';\n ff_add: number; // milliseconds of additional data to request\n}\n\nexport type ControlCommand =\n | PlayCommand\n | HoldCommand\n | SeekCommand\n | SetSpeedCommand\n | RequestCodecDataCommand\n | FastForwardCommand;\n\n// ============================================================================\n// Worker Message Types\n// ============================================================================\n\n// Main thread -> Worker messages\nexport interface CreatePipelineMessage {\n type: 'create';\n idx: number;\n track: TrackInfo;\n opts: {\n optimizeForLatency: boolean;\n };\n uid?: number;\n}\n\nexport interface ConfigurePipelineMessage {\n type: 'configure';\n idx: number;\n header: Uint8Array;\n uid?: number;\n}\n\nexport interface ReceiveChunkMessage {\n type: 'receive';\n idx: number;\n chunk: {\n type: 'key' | 'delta';\n timestamp: number; // microseconds\n data: Uint8Array;\n };\n uid?: number;\n}\n\nexport interface SetWritableMessage {\n type: 'setwritable';\n idx: number;\n writable: WritableStream;\n uid?: number;\n}\n\nexport interface CreateGeneratorMessage {\n type: 'creategenerator';\n idx: number;\n uid?: number;\n}\n\nexport interface ClosePipelineMessage {\n type: 'close';\n idx: number;\n waitEmpty?: boolean;\n uid?: number;\n}\n\nexport interface FrameTimingMessage {\n type: 'frametiming';\n action: 'setSpeed' | 'reset';\n speed?: number;\n tweak?: number;\n uid?: number;\n}\n\nexport interface SeekWorkerMessage {\n type: 'seek';\n seekTime: number; // milliseconds\n uid?: number;\n}\n\nexport interface DebuggingMessage {\n type: 'debugging';\n value: boolean | 'verbose';\n uid?: number;\n}\n\nexport type MainToWorkerMessage =\n | CreatePipelineMessage\n | ConfigurePipelineMessage\n | ReceiveChunkMessage\n | SetWritableMessage\n | CreateGeneratorMessage\n | ClosePipelineMessage\n | FrameTimingMessage\n | SeekWorkerMessage\n | DebuggingMessage;\n\n// Worker -> Main thread messages\nexport interface AddTrackMessage {\n type: 'addtrack';\n idx: number;\n track?: MediaStreamTrack; // Safari only\n uid?: number;\n}\n\nexport interface RemoveTrackMessage {\n type: 'removetrack';\n idx: number;\n uid?: number;\n}\n\nexport interface SetPlaybackRateMessage {\n type: 'setplaybackrate';\n speed: number;\n uid?: number;\n}\n\nexport interface ClosedMessage {\n type: 'closed';\n idx: number;\n uid?: number;\n}\n\nexport interface LogMessage {\n type: 'log';\n msg: string;\n level?: 'info' | 'warn' | 'error';\n uid?: number;\n}\n\nexport interface SendEventMessage {\n type: 'sendevent';\n kind: string;\n message?: string;\n idx?: number;\n uid?: number;\n}\n\nexport interface StatsMessage {\n type: 'stats';\n stats: WorkerStats;\n uid?: number;\n}\n\nexport interface AckMessage {\n type: 'ack';\n idx?: number;\n uid?: number;\n status?: 'ok' | 'error';\n error?: string;\n}\n\nexport type WorkerToMainMessage =\n | AddTrackMessage\n | RemoveTrackMessage\n | SetPlaybackRateMessage\n | ClosedMessage\n | LogMessage\n | SendEventMessage\n | StatsMessage\n | AckMessage;\n\n// ============================================================================\n// Stats Types\n// ============================================================================\n\nexport interface FrameTimingStats {\n /** Timestamp when frame entered decoder (microseconds) */\n in: number;\n /** Timestamp when frame exited decoder (microseconds) */\n decoded: number;\n /** Timestamp when frame reached trackwriter (microseconds) */\n out: number;\n speed: {\n main: number;\n tweak: number;\n combined: number;\n };\n seeking: boolean;\n paused: boolean;\n}\n\nexport interface PipelineStats {\n /** How early frames arrive at trackwriter (negative = late) */\n early: number | null;\n /** Duration between frames (ms) */\n frameDuration: number | null;\n frames: {\n in: number;\n decoded: number;\n out: number;\n };\n queues: {\n in: number;\n decoder: number;\n out: number;\n };\n timing: {\n decoder: FrameTrackerStats;\n writable: FrameTrackerStats;\n };\n}\n\nexport interface FrameTrackerStats {\n lastIn: number | undefined;\n lastOut: number | undefined;\n delay: number | undefined;\n delta: number | undefined;\n shift: number | undefined;\n}\n\nexport interface WorkerStats {\n frameTiming: FrameTimingStats;\n pipelines: Record<number, PipelineStats>;\n}\n\n// ============================================================================\n// Sync Controller Types\n// ============================================================================\n\nexport interface BufferState {\n /** Current buffer level (ms) */\n current: number;\n /** Desired buffer level (ms) */\n desired: number;\n /** Ratio of current/desired */\n ratio: number;\n}\n\nexport interface JitterState {\n /** Current jitter estimate (ms) */\n current: number;\n /** Peak jitter over sliding window (ms) */\n peak: number;\n /** Weighted average jitter (ms) */\n weighted: number;\n}\n\nexport interface SyncState {\n buffer: BufferState;\n jitter: JitterState;\n /** Current playback speed (main * tweak) */\n playbackSpeed: number;\n /** Server-reported current time (seconds) */\n serverTime: number;\n /** Server delay estimate (ms) */\n serverDelay: number;\n /** A/V sync offset (ms, positive = audio ahead) */\n avOffset: number;\n}\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\nexport interface WebCodecsPlayerEvents {\n ready: HTMLVideoElement;\n error: string | Error;\n play: void;\n pause: void;\n ended: void;\n timeupdate: number;\n waiting: void;\n playing: void;\n seeking: void;\n seeked: void;\n progress: void;\n trackchange: { trackIndex: number; type: TrackType };\n statsupdate: SyncState;\n}\n\n// ============================================================================\n// Player Options Extensions\n// ============================================================================\n\nexport interface WebCodecsPlayerOptions {\n /** Latency profile preset */\n latencyProfile?: LatencyProfileName;\n /** Custom latency profile (overrides preset) */\n customLatencyProfile?: Partial<LatencyProfile>;\n /** Enable debug logging */\n debug?: boolean;\n /** Enable verbose frame logging */\n verboseDebug?: boolean;\n /** Stats update interval (ms), 0 to disable */\n statsInterval?: number;\n}\n\n// ============================================================================\n// Public Stats API (Phase 2A)\n// ============================================================================\n\n/**\n * Comprehensive player statistics for monitoring and debugging\n */\nexport interface WebCodecsStats {\n /** Latency/buffer statistics */\n latency: {\n /** Current buffer level (ms) */\n buffer: number;\n /** Target buffer level (ms) */\n target: number;\n /** Estimated network jitter (ms) */\n jitter: number;\n };\n /** Audio/Video sync statistics */\n sync: {\n /** A/V drift (ms, positive = video ahead of audio) */\n avDrift: number;\n /** Current playback speed (including adjustments) */\n playbackSpeed: number;\n };\n /** Decoder statistics */\n decoder: {\n /** Video decoder queue size */\n videoQueueSize: number;\n /** Audio decoder queue size */\n audioQueueSize: number;\n /** Total frames dropped */\n framesDropped: number;\n /** Total frames decoded */\n framesDecoded: number;\n };\n /** Network statistics */\n network: {\n /** Total bytes received */\n bytesReceived: number;\n /** Total messages received */\n messagesReceived: number;\n };\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\nexport interface DeferredPromise<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason?: any) => void;\n}\n\nexport function createDeferredPromise<T>(): DeferredPromise<T> {\n let resolve!: (value: T) => void;\n let reject!: (reason?: any) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n","/**\n * WebCodecs Player Implementation\n *\n * Low-latency WebSocket streaming using WebCodecs API for video/audio decoding.\n * Decoding runs in a Web Worker for optimal performance.\n *\n * Features:\n * - Ultra-low latency streaming (configurable via profiles)\n * - Worker-based VideoDecoder/AudioDecoder\n * - Adaptive playback speed for live catchup/slowdown\n * - Jitter compensation\n * - Firefox polyfill for MediaStreamTrackGenerator\n *\n * Protocol: MistServer raw WebSocket frames (12-byte header + data)\n */\n\nimport { BasePlayer } from '../../core/PlayerInterface';\nimport type {\n StreamSource,\n StreamInfo,\n PlayerOptions,\n PlayerCapability,\n} from '../../core/PlayerInterface';\nimport type {\n TrackInfo,\n CodecDataMessage,\n InfoMessage,\n OnTimeMessage,\n RawChunk,\n LatencyProfileName,\n WebCodecsPlayerOptions,\n WebCodecsStats,\n MainToWorkerMessage,\n WorkerToMainMessage,\n} from './types';\nimport { WebSocketController } from './WebSocketController';\nimport { SyncController } from './SyncController';\nimport { getPresentationTimestamp, isInitData } from './RawChunkParser';\nimport { getLatencyProfile, mergeLatencyProfile, selectDefaultProfile } from './LatencyProfiles';\nimport { createTrackGenerator, hasNativeMediaStreamTrackGenerator } from './polyfills/MediaStreamTrackGenerator';\n\n/**\n * Detect if running on Safari (which has VideoTrackGenerator in worker but not MediaStreamTrackGenerator on main thread)\n */\nfunction isSafari(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent;\n return /^((?!chrome|android).)*safari/i.test(ua);\n}\n\n// Import inline worker (bundled via rollup-plugin-web-worker-loader)\n\n/**\n * Convert string (ASCII with escaped chars) to Uint8Array\n * Reference: rawws.js:76-84 - init data is raw ASCII from stream info JSON\n */\nfunction str2bin(str: string): Uint8Array {\n const out = new Uint8Array(str.length);\n for (let i = 0; i < str.length; i++) {\n out[i] = str.charCodeAt(i);\n }\n return out;\n}\n\n/**\n * Create a TimeRanges-like object from an array of [start, end] pairs\n */\nfunction createTimeRanges(ranges: [number, number][]): TimeRanges {\n return {\n length: ranges.length,\n start(index: number): number {\n if (index < 0 || index >= ranges.length) throw new DOMException('Index out of bounds');\n return ranges[index][0];\n },\n end(index: number): number {\n if (index < 0 || index >= ranges.length) throw new DOMException('Index out of bounds');\n return ranges[index][1];\n },\n };\n}\n\n/**\n * Type for requestVideoFrameCallback metadata\n */\ninterface VideoFrameCallbackMetadata {\n presentationTime: DOMHighResTimeStamp;\n expectedDisplayTime: DOMHighResTimeStamp;\n width: number;\n height: number;\n mediaTime: number;\n presentedFrames: number;\n processingDuration?: number;\n}\n\n/**\n * Pipeline state for tracking per-track resources\n */\ninterface PipelineInfo {\n idx: number;\n track: TrackInfo;\n generator: ReturnType<typeof createTrackGenerator> | null;\n configured: boolean;\n /** Safari audio: writer for audio frames relayed from worker */\n safariAudioWriter?: WritableStreamDefaultWriter<AudioData>;\n /** Safari audio: the audio generator created on main thread */\n safariAudioGenerator?: MediaStreamTrack;\n}\n\n/**\n * WebCodecsPlayerImpl - WebCodecs-based low-latency player\n */\nexport class WebCodecsPlayerImpl extends BasePlayer {\n readonly capability: PlayerCapability = {\n name: 'WebCodecs Player',\n shortname: 'webcodecs',\n priority: 0, // Highest priority - lowest latency option\n // Raw WebSocket (12-byte header + AVCC NAL units) - NOT MP4-muxed\n // MistServer's output_wsraw.cpp provides full codec negotiation (audio + video)\n // NOTE: ws/video/mp4 is MP4-fragmented which needs MEWS player (uses MSE)\n mimes: [\n 'ws/video/raw', 'wss/video/raw', // Raw codec frames (audio + video)\n ],\n };\n\n private wsController: WebSocketController | null = null;\n private syncController: SyncController | null = null;\n private worker: Worker | null = null;\n private mediaStream: MediaStream | null = null;\n private container: HTMLElement | null = null;\n private pipelines = new Map<number, PipelineInfo>();\n private tracks: TrackInfo[] = [];\n private tracksByIndex = new Map<number, TrackInfo>(); // Track metadata indexed by track idx\n private queuedInitData = new Map<number, Uint8Array>(); // Queued INIT data waiting for track info\n private queuedChunks = new Map<number, RawChunk[]>(); // Queued chunks waiting for decoder config\n private isDestroyed = false;\n private debugging = false;\n private verboseDebugging = false;\n private streamType: 'live' | 'vod' = 'live';\n private workerUidCounter = 0;\n private workerListeners = new Map<number, (msg: WorkerToMainMessage) => void>();\n\n // Playback state\n private _duration = Infinity;\n private _currentTime = 0;\n private _bufferMs = 0;\n private _avDrift = 0;\n private _frameCallbackId: number | null = null;\n private _statsInterval: ReturnType<typeof setInterval> | null = null;\n private _framesDropped = 0;\n private _framesDecoded = 0;\n private _bytesReceived = 0;\n private _messagesReceived = 0;\n\n // Codec support cache - keyed by \"codec|init_hash\"\n private static codecCache = new Map<string, boolean>();\n\n /**\n * Get cache key for a track's codec configuration\n */\n private static getCodecCacheKey(track: { codec: string; codecstring?: string; init?: string }): string {\n const codecStr = track.codecstring ?? track.codec?.toLowerCase() ?? '';\n // Simple hash of init data for cache key (just first/last bytes + length)\n const init = track.init ?? '';\n const initHash = init.length > 0 ? `${init.length}_${init.charCodeAt(0)}_${init.charCodeAt(init.length - 1)}` : '';\n return `${codecStr}|${initHash}`;\n }\n\n /**\n * Test if a track's codec is supported by WebCodecs\n * Reference: rawws.js:75-137 - isTrackSupported()\n */\n static async isTrackSupported(track: TrackInfo): Promise<{ supported: boolean; config: any }> {\n const cacheKey = WebCodecsPlayerImpl.getCodecCacheKey(track);\n\n // Check cache first\n if (WebCodecsPlayerImpl.codecCache.has(cacheKey)) {\n const cached = WebCodecsPlayerImpl.codecCache.get(cacheKey)!;\n return { supported: cached, config: { codec: track.codecstring ?? track.codec } };\n }\n\n // Build codec config\n const codecStr = track.codecstring ?? (track.codec ?? '').toLowerCase();\n const config: any = { codec: codecStr };\n\n // Add description (init data) if present\n if (track.init && track.init !== '') {\n config.description = str2bin(track.init);\n }\n\n let result: { supported: boolean; config: any };\n\n try {\n switch (track.type) {\n case 'video': {\n // Special handling for JPEG - uses ImageDecoder\n if (track.codec === 'JPEG') {\n if (!('ImageDecoder' in window)) {\n result = { supported: false, config: { codec: 'image/jpeg' } };\n } else {\n // @ts-ignore - ImageDecoder may not have types\n const isSupported = await (window as any).ImageDecoder.isTypeSupported('image/jpeg');\n result = { supported: isSupported, config: { codec: 'image/jpeg' } };\n }\n } else {\n // Use VideoDecoder.isConfigSupported()\n result = await VideoDecoder.isConfigSupported(config as VideoDecoderConfig);\n }\n break;\n }\n case 'audio': {\n // Audio requires numberOfChannels and sampleRate\n config.numberOfChannels = track.channels ?? 2;\n config.sampleRate = track.rate ?? 48000;\n result = await AudioDecoder.isConfigSupported(config as AudioDecoderConfig);\n break;\n }\n default:\n result = { supported: false, config };\n }\n } catch (err) {\n console.warn(`[WebCodecs] isConfigSupported failed for ${track.codec}:`, err);\n result = { supported: false, config };\n }\n\n // Cache the result\n WebCodecsPlayerImpl.codecCache.set(cacheKey, result.supported);\n return result;\n }\n\n /**\n * Validate all tracks and return which are supported\n * Returns array of supported track types ('video', 'audio')\n */\n static async validateTracks(tracks: TrackInfo[]): Promise<string[]> {\n const supportedTypes: Set<string> = new Set();\n\n const validationPromises = tracks\n .filter(t => t.type === 'video' || t.type === 'audio')\n .map(async (track) => {\n const result = await WebCodecsPlayerImpl.isTrackSupported(track);\n if (result.supported) {\n supportedTypes.add(track.type);\n }\n return { track, supported: result.supported };\n });\n\n const results = await Promise.all(validationPromises);\n\n // Log validation results for debugging\n for (const { track, supported } of results) {\n console.debug(`[WebCodecs] Track ${track.idx} (${track.type} ${track.codec}): ${supported ? 'supported' : 'UNSUPPORTED'}`);\n }\n\n return Array.from(supportedTypes);\n }\n\n isMimeSupported(mimetype: string): boolean {\n return this.capability.mimes.includes(mimetype);\n }\n\n isBrowserSupported(\n mimetype: string,\n source: StreamSource,\n streamInfo: StreamInfo\n ): boolean | string[] {\n // Basic requirements\n if (!('WebSocket' in window)) {\n return false;\n }\n if (!('Worker' in window)) {\n return false;\n }\n if (!('VideoDecoder' in window) || !('AudioDecoder' in window)) {\n // WebCodecs not available (requires HTTPS)\n return false;\n }\n\n // Check for HTTP/HTTPS mismatch\n const sourceUrl = new URL(source.url.replace(/^ws/, 'http'), location.href);\n if (location.protocol === 'https:' && sourceUrl.protocol === 'http:') {\n return false;\n }\n\n // Check track codec support using cache when available\n // Reference: rawws.js tests codecs via isConfigSupported() before selection\n const playableTracks: Record<string, boolean> = {};\n\n for (const track of streamInfo.meta.tracks) {\n if (track.type === 'video' || track.type === 'audio') {\n // Check cache for this track's codec\n const cacheKey = WebCodecsPlayerImpl.getCodecCacheKey(track as any);\n if (WebCodecsPlayerImpl.codecCache.has(cacheKey)) {\n // Use cached result\n if (WebCodecsPlayerImpl.codecCache.get(cacheKey)) {\n playableTracks[track.type] = true;\n }\n } else {\n // Not in cache - assume supported for now, validate in initialize()\n // This is necessary because isBrowserSupported is synchronous\n playableTracks[track.type] = true;\n }\n } else if (track.type === 'meta' && track.codec === 'subtitle') {\n // Subtitles supported via text track\n playableTracks['subtitle'] = true;\n }\n }\n\n if (Object.keys(playableTracks).length === 0) {\n return false;\n }\n\n return Object.keys(playableTracks);\n }\n\n async initialize(\n container: HTMLElement,\n source: StreamSource,\n options: PlayerOptions,\n streamInfo?: StreamInfo\n ): Promise<HTMLVideoElement> {\n // Clear any leftover state from previous initialization FIRST\n // This fixes race condition where async destroy() clears state after new initialize()\n this.tracksByIndex.clear();\n this.pipelines.clear();\n this.tracks = [];\n this.queuedInitData.clear();\n this.queuedChunks.clear();\n this.isDestroyed = false;\n this._duration = Infinity;\n this._currentTime = 0;\n this._bufferMs = 0;\n this._avDrift = 0;\n this._framesDropped = 0;\n this._framesDecoded = 0;\n this._bytesReceived = 0;\n this._messagesReceived = 0;\n\n this.container = container;\n container.classList.add('fw-player-container');\n\n // Pre-populate track metadata from streamInfo (fetched via HTTP before WebSocket)\n // This is how the reference player (rawws.js) gets track info - from MistVideo.info.meta.tracks\n if (streamInfo?.meta?.tracks) {\n this.log(`Pre-populating ${streamInfo.meta.tracks.length} tracks from streamInfo`);\n for (const track of streamInfo.meta.tracks) {\n if (track.idx !== undefined) {\n // Convert StreamTrack to TrackInfo (WebCodecs format)\n const trackInfo: TrackInfo = {\n idx: track.idx,\n type: track.type as TrackInfo['type'],\n codec: track.codec,\n codecstring: track.codecstring,\n init: track.init,\n width: track.width,\n height: track.height,\n fpks: track.fpks,\n channels: track.channels,\n rate: track.rate,\n size: track.size,\n };\n this.tracksByIndex.set(track.idx, trackInfo);\n this.log(`Pre-registered track ${track.idx}: ${track.type} ${track.codec}`);\n }\n }\n }\n\n // Parse WebCodecs-specific options\n const wcOptions = options as PlayerOptions & WebCodecsPlayerOptions;\n this.debugging = wcOptions.debug ?? wcOptions.devMode ?? false;\n this.verboseDebugging = wcOptions.verboseDebug ?? false;\n\n // Determine stream type\n this.streamType = (source as any).type === 'live' ? 'live' : 'vod';\n\n // Select latency profile\n const profileName = wcOptions.latencyProfile ?? selectDefaultProfile(this.streamType === 'live');\n const profile = mergeLatencyProfile(profileName, wcOptions.customLatencyProfile);\n\n this.log(`Initializing WebCodecs player with ${profile.name} profile`);\n\n // Create video element\n const video = document.createElement('video');\n video.classList.add('fw-player-video');\n video.setAttribute('playsinline', '');\n video.setAttribute('crossorigin', 'anonymous');\n\n if (options.autoplay) video.autoplay = true;\n if (options.muted) video.muted = true;\n video.controls = options.controls === true;\n if (options.loop && this.streamType !== 'live') video.loop = true;\n if (options.poster) video.poster = options.poster;\n\n this.videoElement = video;\n container.appendChild(video);\n\n // Create MediaStream for output\n this.mediaStream = new MediaStream();\n video.srcObject = this.mediaStream;\n\n // Initialize worker\n await this.initializeWorker();\n\n // Initialize sync controller\n this.syncController = new SyncController({\n profile,\n isLive: this.streamType === 'live',\n onSpeedChange: (main, tweak) => {\n this.sendToWorker({\n type: 'frametiming',\n action: 'setSpeed',\n speed: main,\n tweak,\n uid: this.workerUidCounter++,\n });\n if (this.videoElement) {\n this.videoElement.playbackRate = main * tweak;\n }\n },\n onFastForwardRequest: (ms) => {\n this.wsController?.fastForward(ms);\n },\n });\n\n // Initialize WebSocket - URL should already be .raw from source selection\n this.wsController = new WebSocketController(source.url, {\n debug: this.debugging,\n });\n\n this.setupWebSocketHandlers();\n\n // Validate track codecs using isConfigSupported() BEFORE connecting\n // Reference: rawws.js:75-137 tests each track's codec support\n // This fixes \"codec unsupported\" errors by only sending verified codecs\n const supportedAudioCodecs: Set<string> = new Set();\n const supportedVideoCodecs: Set<string> = new Set();\n\n if (streamInfo?.meta?.tracks) {\n this.log('Validating track codecs with isConfigSupported()...');\n\n for (const track of streamInfo.meta.tracks) {\n if (track.type === 'video' || track.type === 'audio') {\n const trackInfo: TrackInfo = {\n idx: track.idx ?? 0,\n type: track.type as 'video' | 'audio',\n codec: track.codec,\n codecstring: track.codecstring,\n init: track.init,\n width: track.width,\n height: track.height,\n channels: track.channels,\n rate: track.rate,\n };\n\n const result = await WebCodecsPlayerImpl.isTrackSupported(trackInfo);\n if (result.supported) {\n if (track.type === 'audio') {\n supportedAudioCodecs.add(track.codec);\n } else {\n supportedVideoCodecs.add(track.codec);\n }\n this.log(`Track ${track.idx} (${track.type} ${track.codec}): SUPPORTED`);\n } else {\n this.log(`Track ${track.idx} (${track.type} ${track.codec}): NOT SUPPORTED`, 'warn');\n }\n }\n }\n }\n\n // If no codecs validated, check if we have any tracks at all\n if (supportedAudioCodecs.size === 0 && supportedVideoCodecs.size === 0) {\n // Fallback: Use default codec list if no tracks provided or all failed\n // This handles streams where track info isn't available until WebSocket connects\n this.log('No validated codecs, using default codec list');\n ['AAC', 'MP3', 'opus', 'FLAC', 'AC3'].forEach(c => supportedAudioCodecs.add(c));\n ['H264', 'HEVC', 'VP8', 'VP9', 'AV1', 'JPEG'].forEach(c => supportedVideoCodecs.add(c));\n }\n\n // Connect and request codec data\n // Per MistServer rawws.js line 1544, we need to tell the server what codecs we support\n // Format: [[ [audio codecs], [video codecs] ]] - audio FIRST per Object.values({audio:[], video:[]}) order\n const supportedCombinations: string[][][] = [[\n Array.from(supportedAudioCodecs), // Audio codecs (position 0)\n Array.from(supportedVideoCodecs), // Video codecs (position 1)\n ]];\n\n this.log(`Requesting codecs: audio=[${supportedCombinations[0][0].join(', ')}], video=[${supportedCombinations[0][1].join(', ')}]`);\n\n try {\n await this.wsController.connect();\n this.wsController.requestCodecData(supportedCombinations);\n } catch (err) {\n this.log(`Failed to connect: ${err}`, 'error');\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n\n // Proactively create pipelines for pre-populated tracks\n // This ensures pipelines exist when first chunks arrive, they just need init data\n for (const [idx, track] of this.tracksByIndex) {\n if (track.type === 'video' || track.type === 'audio') {\n this.log(`Creating pipeline proactively for track ${idx} (${track.type} ${track.codec})`);\n await this.createPipeline(track);\n }\n }\n\n // Set up video event listeners\n this.setupVideoEventListeners(video, options);\n\n // Set up requestVideoFrameCallback for accurate frame timing\n this.setupFrameCallback();\n\n this.isDestroyed = false;\n return video;\n }\n\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n this.log('Destroying WebCodecs player');\n\n // Cancel frame callback\n this.cancelFrameCallback();\n\n // Stop stats interval\n if (this._statsInterval) {\n clearInterval(this._statsInterval);\n this._statsInterval = null;\n }\n\n // Stop WebSocket\n this.wsController?.disconnect();\n this.wsController = null;\n\n // Close all pipelines\n for (const pipeline of this.pipelines.values()) {\n await this.closePipeline(pipeline.idx, false);\n }\n this.pipelines.clear();\n\n // Terminate worker\n this.worker?.terminate();\n this.worker = null;\n this.workerListeners.clear();\n\n // Clean up MediaStream\n if (this.mediaStream) {\n for (const track of this.mediaStream.getTracks()) {\n track.stop();\n this.mediaStream.removeTrack(track);\n }\n this.mediaStream = null;\n }\n\n // Clean up video element\n if (this.videoElement) {\n this.videoElement.srcObject = null;\n this.videoElement.remove();\n this.videoElement = null;\n }\n\n this.syncController = null;\n // NOTE: Don't clear tracks/tracksByIndex/queues here!\n // Since PlayerManager reuses instances, a concurrent initialize() may have\n // already pre-populated these. Clearing happens at the START of initialize().\n }\n\n // ============================================================================\n // Worker Management\n // ============================================================================\n\n /**\n * Try to load a worker from a URL with proper async error detection.\n * new Worker() doesn't throw on invalid URLs - it fires error events async.\n */\n private tryLoadWorker(url: string): Promise<Worker> {\n return new Promise((resolve, reject) => {\n let worker: Worker;\n try {\n worker = new Worker(url, { type: 'module' });\n } catch (e) {\n reject(e);\n return;\n }\n\n const cleanup = () => {\n clearTimeout(timeout);\n worker.removeEventListener('error', onError);\n worker.removeEventListener('message', onMessage);\n };\n\n const onError = (e: ErrorEvent) => {\n cleanup();\n worker.terminate();\n reject(new Error(e.message || 'Worker failed to load'));\n };\n\n const onMessage = () => {\n cleanup();\n resolve(worker);\n };\n\n // Timeout: if no error after 500ms, assume loaded (worker may not send immediate message)\n const timeout = setTimeout(() => {\n cleanup();\n resolve(worker);\n }, 500);\n\n worker.addEventListener('error', onError);\n worker.addEventListener('message', onMessage);\n });\n }\n\n private async initializeWorker(): Promise<void> {\n // Worker paths to try in order:\n // 1. Dev server path (Vite plugin serves /workers/* from source)\n // 2. Production npm package path (relative to built module)\n const paths = [\n '/workers/decoder.worker.js',\n ];\n\n // Add production path (may fail in dev but that's ok)\n try {\n paths.push(new URL('../workers/decoder.worker.js', import.meta.url).href);\n } catch {\n // import.meta.url may not work in all environments\n }\n\n let lastError: Error | null = null;\n for (const path of paths) {\n try {\n this.log(`Trying worker path: ${path}`);\n this.worker = await this.tryLoadWorker(path);\n this.log(`Worker loaded from: ${path}`);\n break;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n this.log(`Worker path failed: ${path} - ${lastError.message}`, 'warn');\n }\n }\n\n if (!this.worker) {\n throw new Error(\n 'Failed to initialize WebCodecs worker. ' +\n `Last error: ${lastError?.message ?? 'unknown'}`\n );\n }\n\n // Set up worker event handlers (replace the ones from tryLoadWorker)\n this.worker.onmessage = (event: MessageEvent<WorkerToMainMessage>) => {\n this.handleWorkerMessage(event.data);\n };\n\n this.worker.onerror = (err) => {\n this.log(`Worker error: ${err?.message ?? 'unknown error'}`, 'error');\n this.emit('error', new Error(`Worker error: ${err?.message ?? 'unknown'}`));\n };\n\n // Configure debugging mode in worker\n this.sendToWorker({\n type: 'debugging',\n value: this.verboseDebugging ? 'verbose' : this.debugging,\n uid: this.workerUidCounter++,\n });\n }\n\n private sendToWorker(msg: MainToWorkerMessage & { uid: number }, transfer?: Transferable[]): Promise<WorkerToMainMessage> {\n return new Promise((resolve, reject) => {\n // Reject with proper error if destroyed or no worker\n // This prevents silent failures and allows callers to handle errors appropriately\n if (this.isDestroyed) {\n reject(new Error('Player destroyed'));\n return;\n }\n if (!this.worker) {\n reject(new Error('Worker not initialized'));\n return;\n }\n\n const uid = msg.uid;\n\n // Register listener for response\n this.workerListeners.set(uid, (response) => {\n this.workerListeners.delete(uid);\n if (response.type === 'ack' && response.status === 'error') {\n reject(new Error(response.error));\n } else {\n resolve(response);\n }\n });\n\n if (transfer) {\n this.worker.postMessage(msg, transfer);\n } else {\n this.worker.postMessage(msg);\n }\n });\n }\n\n private handleWorkerMessage(msg: WorkerToMainMessage): void {\n // Check for specific listener\n if (msg.uid !== undefined && this.workerListeners.has(msg.uid)) {\n this.workerListeners.get(msg.uid)!(msg);\n }\n\n // Handle message by type\n switch (msg.type) {\n case 'addtrack': {\n const pipeline = this.pipelines.get(msg.idx);\n if (pipeline && this.mediaStream) {\n // If track was created in worker (Safari), use it directly\n if (msg.track) {\n this.mediaStream.addTrack(msg.track);\n } else if (pipeline.generator) {\n // Otherwise use generator's track\n this.mediaStream.addTrack(pipeline.generator.getTrack());\n }\n }\n break;\n }\n\n case 'removetrack': {\n const pipeline = this.pipelines.get(msg.idx);\n if (pipeline?.generator && this.mediaStream) {\n const track = pipeline.generator.getTrack();\n this.mediaStream.removeTrack(track);\n }\n break;\n }\n\n case 'setplaybackrate': {\n if (this.videoElement) {\n this.videoElement.playbackRate = msg.speed;\n }\n break;\n }\n\n case 'sendevent': {\n if (msg.kind === 'timeupdate' && this.videoElement) {\n this.emit('timeupdate', this.videoElement.currentTime);\n } else if (msg.kind === 'error') {\n this.emit('error', new Error(msg.message ?? 'Unknown error'));\n }\n break;\n }\n\n case 'writeframe': {\n // Safari audio: worker sends frames via postMessage, we write them here\n // Reference: rawws.js line 897-918\n const pipeline = this.pipelines.get(msg.idx);\n if (pipeline?.safariAudioWriter) {\n const frame = msg.frame;\n const frameUid = msg.uid;\n pipeline.safariAudioWriter.write(frame).then(() => {\n this.worker?.postMessage({\n type: 'writeframe',\n idx: msg.idx,\n uid: frameUid,\n status: 'ok',\n });\n }).catch((err: Error) => {\n this.worker?.postMessage({\n type: 'writeframe',\n idx: msg.idx,\n uid: frameUid,\n status: 'error',\n error: err.message,\n });\n });\n } else {\n this.worker?.postMessage({\n type: 'writeframe',\n idx: msg.idx,\n uid: msg.uid,\n status: 'error',\n error: 'Pipeline not active or no audio writer',\n });\n }\n break;\n }\n\n case 'log': {\n if (this.debugging) {\n const level = (msg as any).level ?? 'info';\n const logFn = level === 'error' ? console.error : level === 'warn' ? console.warn : console.log;\n logFn(`[WebCodecs Worker] ${msg.msg}`);\n }\n break;\n }\n\n case 'stats': {\n // Could emit stats for monitoring\n break;\n }\n\n case 'closed': {\n this.pipelines.delete(msg.idx);\n break;\n }\n }\n }\n\n // ============================================================================\n // WebSocket Handlers\n // ============================================================================\n\n private setupWebSocketHandlers(): void {\n if (!this.wsController) return;\n\n this.wsController.on('codecdata', (msg) => this.handleCodecData(msg));\n this.wsController.on('info', (msg) => this.handleInfo(msg));\n this.wsController.on('ontime', (msg) => this.handleOnTime(msg));\n this.wsController.on('tracks', (tracks) => this.handleTracksChange(tracks));\n this.wsController.on('chunk', (chunk) => this.handleChunk(chunk));\n this.wsController.on('stop', () => this.handleStop());\n this.wsController.on('error', (err) => this.handleError(err));\n this.wsController.on('statechange', (state) => {\n this.log(`Connection state: ${state}`);\n if (state === 'error') {\n this.emit('error', new Error('WebSocket connection failed'));\n }\n });\n }\n\n private async handleCodecData(msg: CodecDataMessage): Promise<void> {\n const codecs = msg.codecs ?? [];\n const trackIndices = msg.tracks ?? []; // Array of track indices (numbers), NOT TrackInfo\n this.log(`Received codec data: codecs=[${codecs.join(', ') || 'none'}], tracks=[${trackIndices.join(', ') || 'none'}]`);\n\n if (codecs.length === 0 || trackIndices.length === 0) {\n this.log('No playable codecs/tracks selected by server', 'warn');\n // Still start playback - info message may populate tracks later\n this.wsController?.play();\n return;\n }\n\n // Store codec strings by track index for later lookup\n // Per rawws.js: codecs[i] corresponds to tracks[i]\n for (let i = 0; i < trackIndices.length; i++) {\n const trackIdx = trackIndices[i];\n const codec = codecs[i];\n if (codec) {\n // If we have track metadata from info message, update it with codec\n const existingTrack = this.tracksByIndex.get(trackIdx);\n if (existingTrack) {\n existingTrack.codec = codec;\n } else {\n // Create minimal track info - will be filled in by info message\n this.tracksByIndex.set(trackIdx, {\n idx: trackIdx,\n type: codec.match(/^(H264|HEVC|VP[89]|AV1|JPEG)/i) ? 'video' :\n codec.match(/^(AAC|MP3|opus|FLAC|AC3|pcm)/i) ? 'audio' : 'meta',\n codec,\n });\n }\n this.log(`Track ${trackIdx}: codec=${codec}`);\n }\n }\n\n // Create pipelines for selected tracks that have metadata\n for (const trackIdx of trackIndices) {\n const track = this.tracksByIndex.get(trackIdx);\n if (track && (track.type === 'video' || track.type === 'audio')) {\n await this.createPipeline(track);\n }\n }\n\n // Start playback\n this.wsController?.play();\n }\n\n /**\n * Handle stream info message containing track metadata\n * This is sent by MistServer with full track information\n */\n private async handleInfo(msg: InfoMessage): Promise<void> {\n this.log('Received stream info');\n\n // Extract tracks from meta.tracks object\n if (msg.meta?.tracks) {\n const tracksObj = msg.meta.tracks;\n this.log(`Info contains ${Object.keys(tracksObj).length} tracks`);\n\n for (const [name, track] of Object.entries(tracksObj)) {\n // Store track by its index for lookup when chunks arrive\n if (track.idx !== undefined) {\n this.tracksByIndex.set(track.idx, track);\n this.log(`Registered track ${track.idx}: ${track.type} ${track.codec}`);\n\n // Process any queued init data for this track\n if (this.queuedInitData.has(track.idx)) {\n if (track.type === 'video' || track.type === 'audio') {\n this.log(`Processing queued INIT data for track ${track.idx}`);\n await this.createPipeline(track);\n const initData = this.queuedInitData.get(track.idx)!;\n this.configurePipeline(track.idx, initData);\n this.queuedInitData.delete(track.idx);\n }\n }\n }\n }\n\n // Also update tracks array\n this.tracks = Object.values(tracksObj);\n }\n }\n\n private handleOnTime(msg: OnTimeMessage): void {\n // Update sync controller with server time\n this.syncController?.updateServerTime(msg.current);\n\n // Update current time if no frame callback available\n if (this._frameCallbackId === null) {\n this._currentTime = msg.current;\n }\n\n // Record server delay\n const delay = this.wsController?.getServerDelay() ?? 0;\n if (delay > 0) {\n this.syncController?.recordServerDelay(delay);\n }\n\n // Update duration from server (VOD streams have finite duration)\n if (msg.total !== undefined && isFinite(msg.total) && msg.total > 0) {\n this._duration = msg.total;\n }\n\n // Update buffer level\n const syncState = this.syncController?.getState();\n if (syncState) {\n this._bufferMs = syncState.buffer.current;\n }\n\n // Create pipelines for tracks mentioned in on_time.tracks (like reference player)\n if (msg.tracks && msg.tracks.length > 0) {\n for (const trackIdx of msg.tracks) {\n if (!this.pipelines.has(trackIdx)) {\n const track = this.tracksByIndex.get(trackIdx);\n if (track && (track.type === 'video' || track.type === 'audio')) {\n this.log(`Creating pipeline from on_time for track ${track.idx} (${track.type} ${track.codec})`);\n this.createPipeline(track).then(() => {\n // Process any queued init data\n const queuedInit = this.queuedInitData.get(track.idx);\n if (queuedInit) {\n this.configurePipeline(track.idx, queuedInit);\n this.queuedInitData.delete(track.idx);\n }\n });\n }\n }\n }\n }\n }\n\n private async handleTracksChange(tracks: TrackInfo[]): Promise<void> {\n this.log(`Tracks changed: ${tracks.map(t => `${t.idx}:${t.type}`).join(', ')}`);\n\n // Check if codecs changed\n const newTrackIds = new Set(tracks.map(t => t.idx));\n const oldTrackIds = new Set(this.pipelines.keys());\n\n // Remove old pipelines\n for (const idx of oldTrackIds) {\n if (!newTrackIds.has(idx)) {\n await this.closePipeline(idx, true);\n }\n }\n\n // Update tracksByIndex and create new pipelines\n for (const track of tracks) {\n this.tracksByIndex.set(track.idx, track);\n\n if (track.type === 'video' || track.type === 'audio') {\n if (!this.pipelines.has(track.idx)) {\n await this.createPipeline(track);\n }\n }\n }\n\n this.tracks = tracks;\n }\n\n private handleChunk(chunk: RawChunk): void {\n if (this.isDestroyed) return;\n\n let pipeline = this.pipelines.get(chunk.trackIndex);\n\n // Create pipeline if missing - look up track from tracksByIndex (populated by info message)\n if (!pipeline) {\n let track = this.tracksByIndex.get(chunk.trackIndex);\n\n // If track info not available, try to infer from chunk type\n // MistServer track indices: video typically 1, audio typically 2, meta typically 9\n if (!track) {\n // INIT data for an unknown track - we need to infer the track type\n // For now, create a placeholder track entry based on common MistServer patterns\n if (isInitData(chunk)) {\n this.log(`Received INIT for unknown track ${chunk.trackIndex}, queuing for later`);\n // Queue the init data - it will be processed when track info becomes available\n this.queuedInitData.set(chunk.trackIndex, chunk.data);\n return;\n }\n\n // For regular chunks without track info, we can't decode without codec config\n this.log(`Received chunk for unknown track ${chunk.trackIndex} without track info`, 'warn');\n return;\n }\n\n if (track.type === 'video' || track.type === 'audio') {\n this.log(`Creating pipeline for discovered track ${track.idx} (${track.type} ${track.codec})`);\n this.createPipeline(track).then(() => {\n if (this.isDestroyed) return; // Guard against async completion after destroy\n // Process any queued init data for this track\n const queuedInit = this.queuedInitData.get(track!.idx);\n if (queuedInit) {\n this.configurePipeline(track!.idx, queuedInit);\n this.queuedInitData.delete(track!.idx);\n }\n // Re-process this chunk now that pipeline exists\n this.handleChunk(chunk);\n });\n }\n return;\n }\n\n // Handle init data\n if (isInitData(chunk)) {\n this.configurePipeline(pipeline.idx, chunk.data);\n return;\n }\n\n // Queue chunks until pipeline is configured (decoder needs init data first)\n // Per rawws.js: frames are queued when decoder is \"unconfigured\" (line 1408-1410)\n if (!pipeline.configured) {\n // For AUDIO tracks: configure on FIRST frame (audio doesn't have key/delta distinction)\n // Audio chunks are sent as type 0 (delta) by the server even though they're independent\n // Reference: rawws.js line 768-769 forces audio type to 'key'\n const isAudioTrack = pipeline.track.type === 'audio';\n\n // For VIDEO tracks: wait for KEY frame before configuring\n // This handles Annex B streams where SPS/PPS is inline with keyframes\n const shouldConfigure = isAudioTrack || chunk.type === 'key';\n\n if (shouldConfigure) {\n this.log(`Received ${chunk.type.toUpperCase()} frame for unconfigured ${pipeline.track.type} track ${chunk.trackIndex}, configuring`);\n\n // Queue this frame at the FRONT so it's sent before any DELTAs\n if (!this.queuedChunks.has(chunk.trackIndex)) {\n this.queuedChunks.set(chunk.trackIndex, []);\n }\n this.queuedChunks.get(chunk.trackIndex)!.unshift(chunk);\n\n // Configure without description (or with description from track.init if available)\n // For audio codecs like opus/mp3 that don't need init data, this works fine\n // For AAC, the description should come from track.init or the server will send INIT\n const initData = pipeline.track.init ? str2bin(pipeline.track.init) : new Uint8Array(0);\n this.configurePipeline(chunk.trackIndex, initData).catch(err => {\n this.log(`Failed to configure track ${chunk.trackIndex}: ${err}`, 'error');\n });\n return;\n }\n\n // Otherwise queue the chunk (video delta before first keyframe)\n if (!this.queuedChunks.has(chunk.trackIndex)) {\n this.queuedChunks.set(chunk.trackIndex, []);\n }\n this.queuedChunks.get(chunk.trackIndex)!.push(chunk);\n if (this.verboseDebugging) {\n this.log(`Queued chunk for track ${chunk.trackIndex} (waiting for decoder config)`);\n }\n return;\n }\n\n // Track jitter\n this.syncController?.recordChunkArrival(chunk.trackIndex, chunk.timestamp);\n\n // Send to worker for decoding\n this.sendChunkToWorker(chunk);\n }\n\n private sendChunkToWorker(chunk: RawChunk): void {\n const msg: MainToWorkerMessage = {\n type: 'receive',\n idx: chunk.trackIndex,\n chunk: {\n type: chunk.type === 'key' ? 'key' : 'delta',\n timestamp: getPresentationTimestamp(chunk),\n data: chunk.data,\n },\n uid: this.workerUidCounter++,\n };\n\n this.worker?.postMessage(msg, [chunk.data.buffer]);\n }\n\n private handleStop(): void {\n this.log('Stream stopped');\n this.emit('ended', undefined);\n }\n\n private handleError(err: Error): void {\n this.log(`WebSocket error: ${err.message}`, 'error');\n this.emit('error', err);\n }\n\n // ============================================================================\n // Pipeline Management\n // ============================================================================\n\n private async createPipeline(track: TrackInfo): Promise<void> {\n if (this.pipelines.has(track.idx)) return;\n\n this.log(`Creating pipeline for track ${track.idx} (${track.type} ${track.codec})`);\n\n const pipeline: PipelineInfo = {\n idx: track.idx,\n track,\n generator: null,\n configured: false,\n };\n\n this.pipelines.set(track.idx, pipeline);\n this.syncController?.addTrack(track.idx, track);\n\n // Create worker pipeline\n await this.sendToWorker({\n type: 'create',\n idx: track.idx,\n track,\n opts: {\n optimizeForLatency: this.streamType === 'live',\n },\n uid: this.workerUidCounter++,\n });\n\n // Create track generator - three paths:\n // 1. Chrome/Edge: MediaStreamTrackGenerator on main thread, transfer writable to worker\n // 2. Safari: VideoTrackGenerator in worker (video) or frame relay (audio)\n // 3. Firefox: Use canvas/AudioWorklet polyfill\n if (hasNativeMediaStreamTrackGenerator()) {\n // Chrome/Edge: Create generator and transfer writable to worker\n // @ts-ignore\n const generator = new MediaStreamTrackGenerator({ kind: track.type });\n pipeline.generator = {\n writable: generator.writable,\n getTrack: () => generator,\n close: () => generator.stop?.(),\n };\n\n await this.sendToWorker(\n {\n type: 'setwritable',\n idx: track.idx,\n writable: generator.writable,\n uid: this.workerUidCounter++,\n },\n [generator.writable]\n );\n } else if (isSafari()) {\n // Safari: Worker uses VideoTrackGenerator (video) or frame relay (audio)\n // Reference: rawws.js line 1012-1037\n this.log(`Safari detected - using worker-based track generator for ${track.type}`);\n\n if (track.type === 'audio') {\n // Safari audio: create generator on main thread, frames relayed from worker\n // @ts-ignore - Safari has MediaStreamTrackGenerator for audio\n if (typeof MediaStreamTrackGenerator !== 'undefined') {\n // @ts-ignore\n const audioGen = new MediaStreamTrackGenerator({ kind: 'audio' });\n pipeline.safariAudioGenerator = audioGen;\n pipeline.safariAudioWriter = audioGen.writable.getWriter();\n\n // Add track to stream\n if (this.mediaStream) {\n this.mediaStream.addTrack(audioGen);\n }\n }\n }\n\n // Ask worker to create generator (video uses VideoTrackGenerator, audio sets up relay)\n await this.sendToWorker({\n type: 'creategenerator',\n idx: track.idx,\n uid: this.workerUidCounter++,\n });\n } else {\n // Firefox/other: Use canvas/AudioWorklet polyfill\n pipeline.generator = createTrackGenerator(track.type as 'video' | 'audio');\n\n if (pipeline.generator.waitForInit) {\n await pipeline.generator.waitForInit();\n }\n\n // For polyfill, writable stays on main thread\n // Worker would need different architecture - for now, fall back to main thread decode\n this.log('Using MediaStreamTrackGenerator polyfill - main thread decode');\n\n // Add track to stream directly\n if (this.mediaStream && pipeline.generator) {\n this.mediaStream.addTrack(pipeline.generator.getTrack());\n }\n }\n\n // Per rawws.js: Do NOT configure from HTTP info automatically.\n // Wait for WebSocket binary INIT frames to configure decoders.\n // This ensures we use the exact init data the server sends for this session.\n //\n // However, if track.init is empty/undefined, the codec doesn't need init data\n // and we can configure immediately (per rawws.js line 1239-1241).\n // This applies to codecs like opus, mp3, vp8, vp9 that don't need init data.\n if (!track.init || track.init === '') {\n this.log(`Track ${track.idx} (${track.codec}) doesn't need init data, configuring immediately`);\n await this.configurePipeline(track.idx, new Uint8Array(0));\n } else {\n // For codecs that need init data (H264, HEVC, AAC), we have two paths:\n // 1. WebSocket sends INIT frame -> handleChunk triggers configurePipeline\n // 2. First frame arrives without prior INIT -> handleChunk uses track.init\n this.log(`Track ${track.idx} (${track.codec}) has init data (${track.init.length} bytes), waiting for first frame`);\n }\n }\n\n private async configurePipeline(idx: number, header: Uint8Array): Promise<void> {\n const pipeline = this.pipelines.get(idx);\n if (!pipeline || pipeline.configured) return;\n\n this.log(`Configuring decoder for track ${idx}`);\n\n // Copy the header to avoid transfer issues (neutered buffers)\n // The structured clone will copy this automatically\n const headerCopy = new Uint8Array(header);\n\n await this.sendToWorker({\n type: 'configure',\n idx,\n header: headerCopy,\n uid: this.workerUidCounter++,\n });\n\n pipeline.configured = true;\n\n // Flush any queued chunks now that decoder is configured\n const queued = this.queuedChunks.get(idx);\n if (queued && queued.length > 0) {\n this.log(`Flushing ${queued.length} queued chunks for track ${idx}`);\n // Find first keyframe to start from (can't decode deltas without reference)\n let startIdx = 0;\n for (let i = 0; i < queued.length; i++) {\n if (queued[i].type === 'key') {\n startIdx = i;\n break;\n }\n }\n if (startIdx > 0) {\n this.log(`Skipping ${startIdx} delta frames, starting from keyframe`);\n }\n for (let i = startIdx; i < queued.length; i++) {\n this.sendChunkToWorker(queued[i]);\n }\n this.queuedChunks.delete(idx);\n }\n }\n\n private async closePipeline(idx: number, waitEmpty: boolean): Promise<void> {\n const pipeline = this.pipelines.get(idx);\n if (!pipeline) return;\n\n this.log(`Closing pipeline ${idx}`);\n\n // Close worker pipeline\n await this.sendToWorker({\n type: 'close',\n idx,\n waitEmpty,\n uid: this.workerUidCounter++,\n });\n\n // Close generator\n pipeline.generator?.close();\n\n // Remove from sync controller\n this.syncController?.removeTrack(idx);\n\n this.pipelines.delete(idx);\n }\n\n // ============================================================================\n // Playback Control\n // ============================================================================\n\n async play(): Promise<void> {\n this.wsController?.play();\n await this.videoElement?.play();\n }\n\n pause(): void {\n this.wsController?.hold();\n this.videoElement?.pause();\n }\n\n seek(time: number): void {\n if (!this.wsController || !this.syncController) return;\n\n const timeMs = time * 1000;\n const seekId = this.syncController.startSeek(timeMs);\n\n // Flush worker queues\n this.sendToWorker({\n type: 'seek',\n seekTime: timeMs,\n uid: this.workerUidCounter++,\n });\n\n // Send seek to server\n const desiredBuffer = this.syncController.getDesiredBuffer();\n this.wsController.seek(timeMs, desiredBuffer);\n\n // Mark seek complete after first frame (handled by worker)\n // In practice, we'd wait for first frame callback\n setTimeout(() => {\n if (this.syncController?.isSeekActive(seekId)) {\n this.syncController.completeSeek(seekId);\n this.sendToWorker({\n type: 'frametiming',\n action: 'reset',\n uid: this.workerUidCounter++,\n });\n }\n }, 100);\n }\n\n setPlaybackRate(rate: number): void {\n this.syncController?.setMainSpeed(rate);\n }\n\n isLive(): boolean {\n return this.streamType === 'live';\n }\n\n jumpToLive(): void {\n if (this.streamType === 'live' && this.wsController) {\n // For WebCodecs live, request fresh data from live edge\n // Send fast_forward to request 5 seconds of new data\n // Reference: rawws.js live catchup sends fast_forward\n const desiredBuffer = this.syncController?.getDesiredBuffer() ?? 2000;\n this.wsController.send({\n type: 'fast_forward',\n ff_add: 5000, // Request 5 seconds ahead\n });\n\n // Also request buffer from current time to rebuild\n const serverTime = this.syncController?.getEstimatedServerTime() ?? 0;\n if (serverTime > 0) {\n this.wsController.seek(serverTime * 1000, desiredBuffer);\n }\n\n this.log('Jump to live: requested fresh data from server');\n }\n }\n\n /**\n * Check if seeking is supported.\n * WebCodecs can seek via server commands when connected.\n * Reference: rawws.js line 1294-1304 implements seeking via control channel\n */\n canSeek(): boolean {\n // WebCodecs CAN seek via server commands when WebSocket is connected\n // This overrides the default MediaStream check in SeekingUtils\n return this.wsController !== null && !this.isDestroyed;\n }\n\n // ============================================================================\n // Media Properties (Phase 2A)\n // ============================================================================\n\n /**\n * Get stream duration (Infinity for live streams)\n */\n get duration(): number {\n return this._duration;\n }\n\n getDuration(): number {\n return this._duration;\n }\n\n /**\n * Get current playback time (seconds)\n * Uses requestVideoFrameCallback for accurate timing when available\n */\n get currentTime(): number {\n return this._currentTime;\n }\n\n getCurrentTime(): number {\n return this._currentTime;\n }\n\n /**\n * Get buffered time ranges\n * Returns single range from current time to current + buffer\n */\n get buffered(): TimeRanges {\n if (this._bufferMs <= 0) {\n return createTimeRanges([]);\n }\n const start = this._currentTime;\n const end = start + (this._bufferMs / 1000);\n return createTimeRanges([[start, end]]);\n }\n\n /**\n * Get comprehensive player statistics\n */\n async getStats(): Promise<WebCodecsStats> {\n const syncState = this.syncController?.getState();\n return {\n latency: {\n buffer: syncState?.buffer.current ?? 0,\n target: syncState?.buffer.desired ?? 0,\n jitter: syncState?.jitter.weighted ?? 0,\n },\n sync: {\n avDrift: this._avDrift,\n playbackSpeed: syncState?.playbackSpeed ?? 1,\n },\n decoder: {\n videoQueueSize: 0, // Will be populated from worker stats\n audioQueueSize: 0,\n framesDropped: this._framesDropped,\n framesDecoded: this._framesDecoded,\n },\n network: {\n bytesReceived: this._bytesReceived,\n messagesReceived: this._messagesReceived,\n },\n };\n }\n\n // ============================================================================\n // Frame Timing (requestVideoFrameCallback)\n // ============================================================================\n\n /**\n * Set up requestVideoFrameCallback for accurate frame timing\n * This provides vsync-aligned frame metadata for A/V sync\n */\n private setupFrameCallback(): void {\n if (!this.videoElement) return;\n\n // Check if requestVideoFrameCallback is available\n if ('requestVideoFrameCallback' in HTMLVideoElement.prototype) {\n const callback = (_now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata) => {\n if (this.isDestroyed || !this.videoElement) return;\n\n this.onVideoFrame(metadata);\n\n // Schedule next callback\n this._frameCallbackId = (this.videoElement as any).requestVideoFrameCallback(callback);\n };\n\n this._frameCallbackId = (this.videoElement as any).requestVideoFrameCallback(callback);\n this.log('requestVideoFrameCallback enabled for accurate frame timing');\n } else {\n // Fallback: Use video element's currentTime directly\n this.log('requestVideoFrameCallback not available, using fallback timing');\n }\n }\n\n /**\n * Handle video frame presentation callback\n * Updates current time\n */\n private onVideoFrame(metadata: VideoFrameCallbackMetadata): void {\n // Update current time from actual frame presentation\n this._currentTime = metadata.mediaTime;\n\n // Update buffer level from sync controller\n const syncState = this.syncController?.getState();\n if (syncState) {\n this._bufferMs = syncState.buffer.current;\n }\n\n // Emit timeupdate event\n this.emit('timeupdate', this._currentTime);\n\n // Update frame stats\n this._framesDecoded = metadata.presentedFrames;\n }\n\n /**\n * Cancel frame callback on cleanup\n */\n private cancelFrameCallback(): void {\n if (this._frameCallbackId !== null && this.videoElement) {\n if ('cancelVideoFrameCallback' in HTMLVideoElement.prototype) {\n (this.videoElement as any).cancelVideoFrameCallback(this._frameCallbackId);\n }\n this._frameCallbackId = null;\n }\n }\n\n // ============================================================================\n // Logging\n // ============================================================================\n\n private log(message: string, level: 'info' | 'warn' | 'error' = 'info'): void {\n if (!this.debugging && level === 'info') return;\n console[level](`[WebCodecs] ${message}`);\n }\n}\n\n// Export for direct use\nexport { WebSocketController } from './WebSocketController';\nexport { SyncController } from './SyncController';\nexport { JitterTracker, MultiTrackJitterTracker } from './JitterBuffer';\nexport { getLatencyProfile, mergeLatencyProfile, LATENCY_PROFILES } from './LatencyProfiles';\nexport { parseRawChunk, RawChunkParser } from './RawChunkParser';\nexport * from './types';\n","/**\n * Player Registry\n *\n * Central registration of all available player implementations\n */\n\nimport { PlayerManager } from './PlayerManager';\nimport type { IPlayer } from './PlayerInterface';\n\n/**\n * Shared registration state per manager instance. Ensures that we only\n * dynamically import and attach transport adapters once per manager.\n */\nconst managerRegistrationPromises = new WeakMap<PlayerManager, Promise<void>>();\n\nasync function registerPlayersForManager(manager: PlayerManager): Promise<void> {\n console.log('[PlayerRegistry] registerPlayersForManager starting...');\n if (manager.getRegisteredPlayers().length > 0) {\n console.log('[PlayerRegistry] Players already registered');\n return;\n }\n\n console.log('[PlayerRegistry] Dynamically importing player modules...');\n const [\n nativeModule,\n videoModule,\n hlsModule,\n dashModule,\n mistModule,\n mewsModule,\n mistWebRTCModule,\n webCodecsModule\n ] = await Promise.all([\n import('../players/NativePlayer'),\n import('../players/VideoJsPlayer'),\n import('../players/HlsJsPlayer'),\n import('../players/DashJsPlayer'),\n import('../players/MistPlayer'),\n import('../players/MewsWsPlayer'),\n import('../players/MistWebRTCPlayer'),\n import('../players/WebCodecsPlayer')\n ]);\n\n console.log('[PlayerRegistry] All player modules imported, instantiating...');\n const instantiatedPlayers: IPlayer[] = [\n new nativeModule.NativePlayerImpl(),\n new webCodecsModule.WebCodecsPlayerImpl(), // Priority 1 - lowest latency\n new mistWebRTCModule.MistWebRTCPlayerImpl(), // Priority 2\n new videoModule.VideoJsPlayerImpl(),\n new hlsModule.HlsJsPlayerImpl(),\n new dashModule.DashJsPlayerImpl(),\n new mistModule.MistPlayerImpl(),\n new mewsModule.MewsWsPlayerImpl()\n ];\n\n for (const player of instantiatedPlayers) {\n const alreadyRegistered = manager\n .getRegisteredPlayers()\n .some(existing => existing.capability.shortname === player.capability.shortname);\n\n if (!alreadyRegistered) {\n manager.registerPlayer(player);\n }\n }\n console.log(`[PlayerRegistry] Registration complete. ${manager.getRegisteredPlayers().length} players registered.`);\n}\n\nexport function ensurePlayersRegistered(manager: PlayerManager = globalPlayerManager): Promise<void> {\n console.log('[PlayerRegistry] ensurePlayersRegistered called');\n if (manager.getRegisteredPlayers().length > 0) {\n console.log('[PlayerRegistry] Already registered, returning');\n return Promise.resolve();\n }\n\n const existing = managerRegistrationPromises.get(manager);\n if (existing) {\n console.log('[PlayerRegistry] Using existing registration promise');\n return existing;\n }\n\n console.log('[PlayerRegistry] Starting new registration...');\n const registrationPromise = registerPlayersForManager(manager).catch(error => {\n console.error('[PlayerRegistry] Registration failed:', error);\n managerRegistrationPromises.delete(manager);\n throw error;\n });\n\n managerRegistrationPromises.set(manager, registrationPromise);\n return registrationPromise;\n}\n\nconst originalInitialize = PlayerManager.prototype.initializePlayer;\nPlayerManager.prototype.initializePlayer = async function (...args: Parameters<PlayerManager['initializePlayer']>) {\n console.log('[PlayerRegistry] initializePlayer wrapper - calling ensurePlayersRegistered...');\n await ensurePlayersRegistered(this);\n console.log('[PlayerRegistry] ensurePlayersRegistered done, calling original initializePlayer...');\n return originalInitialize.apply(this, args);\n};\n\n/**\n * Global PlayerManager instance with deferred registration\n */\nconst isDev = (() => {\n try {\n // In browser builds, process may be undefined; guard access\n // @ts-ignore\n return typeof process !== 'undefined' && process && process.env && process.env.NODE_ENV === 'development';\n } catch {\n return false;\n }\n})();\n\nexport const globalPlayerManager = new PlayerManager({\n debug: isDev,\n autoFallback: true,\n maxFallbackAttempts: 3\n});\n\n/**\n * Register all available players (async for backwards compatibility)\n */\nexport async function registerAllPlayers(manager: PlayerManager = globalPlayerManager): Promise<void> {\n await ensurePlayersRegistered(manager);\n}\n\n/**\n * Create a new PlayerManager instance with all players registered\n */\nexport function createPlayerManager(options?: ConstructorParameters<typeof PlayerManager>[0]): PlayerManager {\n const manager = new PlayerManager(options);\n ensurePlayersRegistered(manager).catch(error => {\n if (isDev) {\n console.warn('Player registration failed:', error);\n }\n });\n return manager;\n}\n\n/**\n * Export individual player classes for direct use\n */\nexport { NativePlayerImpl, DirectPlaybackPlayerImpl } from '../players/NativePlayer';\nexport { HlsJsPlayerImpl } from '../players/HlsJsPlayer';\nexport { DashJsPlayerImpl } from '../players/DashJsPlayer';\nexport { VideoJsPlayerImpl } from '../players/VideoJsPlayer';\nexport { MistPlayerImpl } from '../players/MistPlayer';\nexport { MewsWsPlayerImpl } from '../players/MewsWsPlayer';\nexport { MistWebRTCPlayerImpl } from '../players/MistWebRTCPlayer';\nexport { WebCodecsPlayerImpl } from '../players/WebCodecsPlayer';\n","import type { ABRMode, ABROptions, PlaybackQuality, QualityLevel } from '../types';\nimport { TimerManager } from './TimerManager';\n\n/**\n * Default ABR options\n */\nconst DEFAULT_OPTIONS: Required<ABROptions> = {\n mode: 'auto',\n maxResolution: { width: 1920, height: 1080 },\n maxBitrate: 8000000, // 8 Mbps\n minBufferForUpgrade: 10,\n downgradeThreshold: 60,\n};\n\nexport interface ABRControllerConfig {\n /** ABR options */\n options?: Partial<ABROptions>;\n /** Callback to get available qualities */\n getQualities: () => QualityLevel[];\n /** Callback to select a quality */\n selectQuality: (id: string | 'auto') => void;\n /** Callback to get current quality */\n getCurrentQuality?: () => QualityLevel | null;\n /** Callback to get bandwidth estimate (bits per second) - typically from player stats */\n getBandwidthEstimate?: () => Promise<number>;\n /** Debug logging */\n debug?: boolean;\n}\n\nexport type ABRDecision = 'upgrade' | 'downgrade' | 'maintain' | 'none';\n\n/**\n * ABRController - Adaptive Bitrate Controller\n *\n * Manages automatic quality selection based on:\n * - ABR_resize: Matches video resolution to viewport size\n * - ABR_bitrate: Switches quality based on playback performance\n * - auto: Combines both modes\n * - manual: No automatic switching\n *\n * @example\n * ```ts\n * const abr = new ABRController({\n * options: { mode: 'auto' },\n * getQualities: () => player.getQualities(),\n * selectQuality: (id) => player.selectQuality(id),\n * });\n *\n * abr.start(videoElement);\n * abr.onQualityChange((quality) => console.log('Quality:', quality.score));\n * ```\n */\nexport class ABRController {\n private options: Required<ABROptions>;\n private config: ABRControllerConfig;\n private videoElement: HTMLVideoElement | null = null;\n private currentQualityId: string | 'auto' = 'auto';\n private lastDecision: ABRDecision = 'none';\n private lastDecisionTime = 0;\n private resizeObserver: ResizeObserver | null = null;\n private qualityChangeCallbacks: Array<(level: QualityLevel) => void> = [];\n private debug: boolean;\n\n // Active monitoring\n private timers = new TimerManager();\n private bandwidthHistory: number[] = [];\n private static readonly BANDWIDTH_HISTORY_SIZE = 10;\n private static readonly MONITORING_INTERVAL_MS = 1000;\n\n // D3: Separate upgrade/downgrade cooldowns\n // Downgrade is immediate (0ms) for quick response to problems\n // Upgrade requires 5s stability to prevent flapping\n private static readonly UPGRADE_COOLDOWN_MS = 5000;\n private static readonly DOWNGRADE_COOLDOWN_MS = 0;\n private lastUpgradeTime = 0;\n private lastDowngradeTime = 0;\n\n // D2: Hysteresis bands to prevent oscillation at boundaries\n // Upgrade: must exceed 1.5x to upgrade, stay until drops below 1.2x\n // Downgrade: must drop below 0.8x to downgrade\n private static readonly UPGRADE_HEADROOM = 1.5;\n private static readonly UPGRADE_HOLD_THRESHOLD = 1.2;\n private static readonly DOWNGRADE_THRESHOLD = 0.8;\n private currentQualityBitrate = 0;\n\n constructor(config: ABRControllerConfig) {\n this.options = { ...DEFAULT_OPTIONS, ...config.options };\n this.config = config;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Start ABR control\n */\n start(videoElement: HTMLVideoElement): void {\n this.stop();\n this.videoElement = videoElement;\n\n if (this.options.mode === 'manual') {\n this.log('Manual mode - no automatic ABR');\n return;\n }\n\n // Setup resize observer for ABR_resize mode\n if (this.options.mode === 'resize' || this.options.mode === 'auto') {\n this.setupResizeObserver();\n }\n\n // Start active bandwidth monitoring for bitrate mode\n if (this.options.mode === 'bitrate' || this.options.mode === 'auto') {\n this.startActiveMonitoring();\n }\n }\n\n /**\n * Stop ABR control\n */\n stop(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n this.timers.destroy();\n this.videoElement = null;\n this.bandwidthHistory = [];\n }\n\n /**\n * Start active bandwidth monitoring loop\n * Continuously monitors bandwidth and proactively switches quality\n */\n private startActiveMonitoring(): void {\n this.timers.startInterval(\n () => this.checkBandwidthAndSwitch(),\n ABRController.MONITORING_INTERVAL_MS,\n 'monitoring'\n );\n\n // Initial check\n this.checkBandwidthAndSwitch();\n }\n\n /**\n * Check current bandwidth and switch quality if needed\n *\n * Uses hysteresis (D2) and separate cooldowns (D3) to prevent oscillation:\n * - Downgrade: immediate response (0ms cooldown), triggers at 0.8x\n * - Upgrade: 5s cooldown, requires 1.5x headroom, holds until 1.2x\n */\n private async checkBandwidthAndSwitch(): Promise<void> {\n if (!this.videoElement) return;\n\n const now = Date.now();\n\n // Get bandwidth estimate from player stats\n const bandwidth = await this.getBandwidthEstimate();\n if (bandwidth <= 0) return;\n\n // Add to history\n this.bandwidthHistory.push(bandwidth);\n if (this.bandwidthHistory.length > ABRController.BANDWIDTH_HISTORY_SIZE) {\n this.bandwidthHistory.shift();\n }\n\n // Use smoothed bandwidth (average of history)\n const smoothedBandwidth = this.getSmoothedBandwidth();\n if (smoothedBandwidth <= 0) return;\n\n const qualities = this.config.getQualities();\n const currentQuality = this.config.getCurrentQuality?.();\n if (!currentQuality || qualities.length === 0) return;\n\n const currentBitrate = currentQuality.bitrate || 0;\n\n // Track current quality bitrate for hysteresis\n if (this.currentQualityBitrate !== currentBitrate) {\n this.currentQualityBitrate = currentBitrate;\n }\n\n // D3: Check for downgrade (immediate, no cooldown)\n if (now - this.lastDowngradeTime >= ABRController.DOWNGRADE_COOLDOWN_MS) {\n if (smoothedBandwidth < currentBitrate * ABRController.DOWNGRADE_THRESHOLD) {\n const lowerQuality = this.findLowerQuality(qualities, currentQuality);\n if (lowerQuality) {\n this.log(`ABR: bandwidth ${Math.round(smoothedBandwidth / 1000)}kbps < ${Math.round(currentBitrate * ABRController.DOWNGRADE_THRESHOLD / 1000)}kbps threshold -> downgrading to ${lowerQuality.label}`);\n this.lastDecision = 'downgrade';\n this.lastDecisionTime = now;\n this.lastDowngradeTime = now;\n this.selectQuality(lowerQuality.id);\n return;\n }\n }\n }\n\n // D3: Check for upgrade (5s cooldown required)\n if (now - this.lastUpgradeTime >= ABRController.UPGRADE_COOLDOWN_MS) {\n const higherQuality = this.findHigherQuality(qualities, currentQuality);\n if (higherQuality && this.isWithinConstraints(higherQuality)) {\n const targetBitrate = higherQuality.bitrate || 0;\n\n // D2: Hysteresis - require 1.5x headroom to upgrade\n // Once at a quality level, stay until bandwidth drops below 1.2x (not 1.0x)\n const shouldUpgrade = smoothedBandwidth >= targetBitrate * ABRController.UPGRADE_HEADROOM;\n const canHoldHigher = smoothedBandwidth >= targetBitrate * ABRController.UPGRADE_HOLD_THRESHOLD;\n\n if (shouldUpgrade) {\n this.log(`ABR: bandwidth ${Math.round(smoothedBandwidth / 1000)}kbps >= ${Math.round(targetBitrate * ABRController.UPGRADE_HEADROOM / 1000)}kbps headroom -> upgrading to ${higherQuality.label}`);\n this.lastDecision = 'upgrade';\n this.lastDecisionTime = now;\n this.lastUpgradeTime = now;\n this.selectQuality(higherQuality.id);\n return;\n }\n }\n }\n }\n\n /**\n * Get bandwidth estimate from player stats\n */\n private async getBandwidthEstimate(): Promise<number> {\n // Try to get bandwidth from player stats\n if (this.config.getBandwidthEstimate) {\n const estimate = await this.config.getBandwidthEstimate();\n if (estimate > 0) return estimate;\n }\n\n // Fallback: estimate from buffer growth (rough)\n const video = this.videoElement;\n if (!video || video.buffered.length === 0) return 0;\n\n // This is a rough fallback - prefer player-specific estimates\n return 0;\n }\n\n /**\n * Get smoothed bandwidth from history\n */\n private getSmoothedBandwidth(): number {\n if (this.bandwidthHistory.length === 0) return 0;\n if (this.bandwidthHistory.length < 3) {\n // Need at least 3 samples for reliable estimate\n return 0;\n }\n const sum = this.bandwidthHistory.reduce((a, b) => a + b, 0);\n return sum / this.bandwidthHistory.length;\n }\n\n /**\n * Get current bandwidth estimate (for external use)\n */\n getCurrentBandwidth(): number {\n return this.getSmoothedBandwidth();\n }\n\n /**\n * Setup resize observer for viewport-based quality selection\n */\n private setupResizeObserver(): void {\n const video = this.videoElement;\n if (!video) return;\n\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n this.handleResize(width, height);\n }\n });\n\n // Observe the video element's container\n const container = video.parentElement;\n if (container) {\n this.resizeObserver.observe(container);\n }\n\n // Initial resize handling\n const rect = video.getBoundingClientRect();\n this.handleResize(rect.width, rect.height);\n }\n\n /**\n * Handle viewport resize (ABR_resize mode)\n */\n private handleResize(width: number, height: number): void {\n if (this.options.mode !== 'resize' && this.options.mode !== 'auto') {\n return;\n }\n\n const qualities = this.config.getQualities();\n if (qualities.length === 0) return;\n\n // Find best quality for viewport size\n const targetWidth = Math.min(width * window.devicePixelRatio, this.options.maxResolution.width);\n const targetHeight = Math.min(height * window.devicePixelRatio, this.options.maxResolution.height);\n\n const bestQuality = this.findBestQualityForResolution(qualities, targetWidth, targetHeight);\n\n if (bestQuality && bestQuality.id !== this.currentQualityId) {\n this.log(`Resize ABR: ${width}x${height} -> selecting ${bestQuality.label}`);\n this.selectQuality(bestQuality.id);\n }\n }\n\n /**\n * Handle quality degradation (ABR_bitrate mode)\n *\n * Called by QualityMonitor when playback quality drops\n */\n handleQualityDegraded(quality: PlaybackQuality): void {\n if (this.options.mode !== 'bitrate' && this.options.mode !== 'auto') {\n return;\n }\n\n // D3: Downgrade should be fast (0ms default), but still respects configured cooldown\n const now = Date.now();\n if (now - this.lastDowngradeTime < ABRController.DOWNGRADE_COOLDOWN_MS) {\n return;\n }\n\n if (quality.score < this.options.downgradeThreshold) {\n const qualities = this.config.getQualities();\n const currentQuality = this.config.getCurrentQuality?.();\n\n if (currentQuality) {\n // Find a lower quality level\n const lowerQuality = this.findLowerQuality(qualities, currentQuality);\n\n if (lowerQuality) {\n this.log(`Bitrate ABR: score ${quality.score} -> downgrading to ${lowerQuality.label}`);\n this.lastDecision = 'downgrade';\n this.lastDecisionTime = now;\n this.lastDowngradeTime = now;\n this.selectQuality(lowerQuality.id);\n }\n }\n }\n }\n\n /**\n * Handle quality improvement opportunity\n *\n * Called when conditions are good enough to try higher quality\n */\n handleQualityImproved(quality: PlaybackQuality): void {\n if (this.options.mode !== 'bitrate' && this.options.mode !== 'auto') {\n return;\n }\n\n // D3: Upgrade requires sustained stability (5s default) to prevent flapping\n const now = Date.now();\n if (now - this.lastUpgradeTime < ABRController.UPGRADE_COOLDOWN_MS) {\n return;\n }\n\n // Only upgrade if buffer is healthy and quality is good\n if (quality.score >= 90 && quality.bufferedAhead >= this.options.minBufferForUpgrade) {\n const qualities = this.config.getQualities();\n const currentQuality = this.config.getCurrentQuality?.();\n\n if (currentQuality) {\n // Find a higher quality level\n const higherQuality = this.findHigherQuality(qualities, currentQuality);\n\n if (higherQuality && this.isWithinConstraints(higherQuality)) {\n this.log(`Bitrate ABR: score ${quality.score} -> upgrading to ${higherQuality.label}`);\n this.lastDecision = 'upgrade';\n this.lastDecisionTime = now;\n this.lastUpgradeTime = now;\n this.selectQuality(higherQuality.id);\n }\n }\n }\n }\n\n /**\n * Find best quality level for given resolution\n */\n private findBestQualityForResolution(\n qualities: QualityLevel[],\n targetWidth: number,\n targetHeight: number\n ): QualityLevel | null {\n // Filter out qualities that exceed constraints\n const validQualities = qualities.filter(q => this.isWithinConstraints(q));\n\n if (validQualities.length === 0) return null;\n\n // Sort by resolution (ascending)\n const sorted = [...validQualities].sort((a, b) => {\n const aPixels = (a.width ?? 0) * (a.height ?? 0);\n const bPixels = (b.width ?? 0) * (b.height ?? 0);\n return aPixels - bPixels;\n });\n\n // Find smallest quality that is >= target resolution\n for (const q of sorted) {\n const qWidth = q.width ?? 0;\n const qHeight = q.height ?? 0;\n\n if (qWidth >= targetWidth && qHeight >= targetHeight) {\n return q;\n }\n }\n\n // If no quality is large enough, return the highest available\n return sorted[sorted.length - 1];\n }\n\n /**\n * Find a lower quality level\n */\n private findLowerQuality(\n qualities: QualityLevel[],\n current: QualityLevel\n ): QualityLevel | null {\n const currentBitrate = current.bitrate ?? 0;\n\n // Sort by bitrate descending\n const sorted = [...qualities].sort((a, b) => (b.bitrate ?? 0) - (a.bitrate ?? 0));\n\n // Find next lower bitrate\n for (const q of sorted) {\n if ((q.bitrate ?? 0) < currentBitrate) {\n return q;\n }\n }\n\n return null;\n }\n\n /**\n * Find a higher quality level\n */\n private findHigherQuality(\n qualities: QualityLevel[],\n current: QualityLevel\n ): QualityLevel | null {\n const currentBitrate = current.bitrate ?? 0;\n\n // Sort by bitrate ascending\n const sorted = [...qualities].sort((a, b) => (a.bitrate ?? 0) - (b.bitrate ?? 0));\n\n // Find next higher bitrate\n for (const q of sorted) {\n if ((q.bitrate ?? 0) > currentBitrate) {\n return q;\n }\n }\n\n return null;\n }\n\n /**\n * Check if quality is within configured constraints\n */\n private isWithinConstraints(quality: QualityLevel): boolean {\n const { maxResolution, maxBitrate } = this.options;\n\n if (quality.width && quality.width > maxResolution.width) return false;\n if (quality.height && quality.height > maxResolution.height) return false;\n if (quality.bitrate && quality.bitrate > maxBitrate) return false;\n\n return true;\n }\n\n /**\n * Select a quality level\n */\n private selectQuality(id: string | 'auto'): void {\n this.currentQualityId = id;\n this.config.selectQuality(id);\n\n // Notify callbacks\n const qualities = this.config.getQualities();\n const selected = qualities.find(q => q.id === id);\n if (selected) {\n this.qualityChangeCallbacks.forEach(cb => cb(selected));\n }\n }\n\n /**\n * Register callback for quality changes\n */\n onQualityChange(callback: (level: QualityLevel) => void): () => void {\n this.qualityChangeCallbacks.push(callback);\n return () => {\n const idx = this.qualityChangeCallbacks.indexOf(callback);\n if (idx >= 0) {\n this.qualityChangeCallbacks.splice(idx, 1);\n }\n };\n }\n\n /**\n * Manually set quality (switches to manual mode temporarily)\n */\n setQuality(id: string | 'auto'): void {\n this.selectQuality(id);\n }\n\n /**\n * Get current ABR mode\n */\n getMode(): ABRMode {\n return this.options.mode;\n }\n\n /**\n * Set ABR mode at runtime.\n * Restarts monitoring if video element is attached.\n */\n setMode(mode: ABRMode): void {\n if (this.options.mode === mode) return;\n\n this.options.mode = mode;\n this.log(`Mode changed to: ${mode}`);\n\n // Restart with new mode if we have a video element\n if (this.videoElement) {\n const video = this.videoElement;\n this.stop();\n this.start(video);\n }\n }\n\n /**\n * Update ABR options\n */\n updateOptions(options: Partial<ABROptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Get last ABR decision\n */\n getLastDecision(): ABRDecision {\n return this.lastDecision;\n }\n\n /**\n * Debug logging\n */\n private log(message: string): void {\n if (this.debug) {\n console.debug(`[ABRController] ${message}`);\n }\n }\n}\n\nexport default ABRController;\n","/**\n * InteractionController - Unified keyboard and gesture handling for video players\n *\n * Features:\n * - Hold space for 2x speed (VOD/clips only, tap = play/pause)\n * - Click/touch and hold for 2x speed\n * - Comprehensive keyboard shortcuts\n * - Double-tap to skip on mobile\n * - All interactions disabled for live streams (where applicable)\n */\n\nexport interface InteractionControllerConfig {\n container: HTMLElement;\n videoElement: HTMLVideoElement;\n isLive: boolean;\n onPlayPause: () => void;\n onSeek: (delta: number) => void;\n onVolumeChange: (delta: number) => void;\n onMuteToggle: () => void;\n onFullscreenToggle: () => void;\n onCaptionsToggle?: () => void;\n onLoopToggle?: () => void;\n onSpeedChange: (speed: number, isHolding: boolean) => void;\n onSeekPercent?: (percent: number) => void;\n speedHoldValue?: number;\n /** Idle timeout in ms (default 5000). Set to 0 to disable. */\n idleTimeout?: number;\n /** Callback fired when user becomes idle */\n onIdle?: () => void;\n /** Callback fired when user becomes active after being idle */\n onActive?: () => void;\n}\n\nexport interface InteractionState {\n isHoldingSpeed: boolean;\n previousSpeed: number;\n holdSpeed: number;\n /** Whether the user is currently idle (no interaction for idleTimeout) */\n isIdle: boolean;\n}\n\n// Timing constants\nconst HOLD_THRESHOLD_MS = 200; // Time before keydown becomes \"hold\" vs \"tap\"\nconst LONG_PRESS_THRESHOLD_MS = 300; // Time for touch/click to become \"hold\"\nconst DOUBLE_TAP_WINDOW_MS = 300; // Window for detecting double-tap\nconst SKIP_AMOUNT_SECONDS = 10; // Skip forward/backward amount\nconst VOLUME_STEP = 0.1; // Volume change per arrow press (10%)\nconst DEFAULT_IDLE_TIMEOUT_MS = 5000; // Default idle timeout (5 seconds)\n\nexport class InteractionController {\n private config: InteractionControllerConfig;\n private state: InteractionState;\n private isAttached = false;\n\n // Keyboard tracking\n private spaceKeyDownTime = 0;\n private spaceIsHeld = false;\n private holdCheckTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Touch/click tracking\n private pointerDownTime = 0;\n private pointerIsHeld = false;\n private pointerHoldTimeout: ReturnType<typeof setTimeout> | null = null;\n private lastTapTime = 0;\n private lastTapX = 0;\n private pendingTapTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Idle tracking\n private idleTimeout: ReturnType<typeof setTimeout> | null = null;\n private lastInteractionTime = 0;\n\n // Bound event handlers\n private boundKeyDown: (e: KeyboardEvent) => void;\n private boundKeyUp: (e: KeyboardEvent) => void;\n private boundPointerDown: (e: PointerEvent) => void;\n private boundPointerUp: (e: PointerEvent) => void;\n private boundPointerCancel: (e: PointerEvent) => void;\n private boundContextMenu: (e: Event) => void;\n private boundMouseMove: (e: MouseEvent) => void;\n\n constructor(config: InteractionControllerConfig) {\n this.config = config;\n this.state = {\n isHoldingSpeed: false,\n previousSpeed: 1,\n holdSpeed: config.speedHoldValue ?? 2,\n isIdle: false,\n };\n\n // Bind handlers\n this.boundKeyDown = this.handleKeyDown.bind(this);\n this.boundKeyUp = this.handleKeyUp.bind(this);\n this.boundPointerDown = this.handlePointerDown.bind(this);\n this.boundPointerUp = this.handlePointerUp.bind(this);\n this.boundPointerCancel = this.handlePointerCancel.bind(this);\n this.boundContextMenu = this.handleContextMenu.bind(this);\n this.boundMouseMove = this.handleMouseMove.bind(this);\n }\n\n /**\n * Attach event listeners to container\n */\n attach(): void {\n if (this.isAttached) return;\n\n const { container } = this.config;\n\n // Make container focusable for keyboard events\n if (!container.hasAttribute('tabindex')) {\n container.setAttribute('tabindex', '0');\n }\n\n // Keyboard events\n container.addEventListener('keydown', this.boundKeyDown);\n container.addEventListener('keyup', this.boundKeyUp);\n\n // Pointer events (unified mouse + touch)\n container.addEventListener('pointerdown', this.boundPointerDown);\n container.addEventListener('pointerup', this.boundPointerUp);\n container.addEventListener('pointercancel', this.boundPointerCancel);\n container.addEventListener('pointerleave', this.boundPointerCancel);\n\n // Mouse move for idle detection\n container.addEventListener('mousemove', this.boundMouseMove);\n\n // Prevent context menu on long press\n container.addEventListener('contextmenu', this.boundContextMenu);\n\n // Start idle tracking\n this.resetIdleTimer();\n\n this.isAttached = true;\n }\n\n /**\n * Detach event listeners and cleanup\n */\n detach(): void {\n if (!this.isAttached) return;\n\n const { container } = this.config;\n\n container.removeEventListener('keydown', this.boundKeyDown);\n container.removeEventListener('keyup', this.boundKeyUp);\n container.removeEventListener('pointerdown', this.boundPointerDown);\n container.removeEventListener('pointerup', this.boundPointerUp);\n container.removeEventListener('pointercancel', this.boundPointerCancel);\n container.removeEventListener('pointerleave', this.boundPointerCancel);\n container.removeEventListener('mousemove', this.boundMouseMove);\n container.removeEventListener('contextmenu', this.boundContextMenu);\n\n // Clear any pending timeouts\n if (this.holdCheckTimeout) {\n clearTimeout(this.holdCheckTimeout);\n this.holdCheckTimeout = null;\n }\n if (this.pointerHoldTimeout) {\n clearTimeout(this.pointerHoldTimeout);\n this.pointerHoldTimeout = null;\n }\n if (this.pendingTapTimeout) {\n clearTimeout(this.pendingTapTimeout);\n this.pendingTapTimeout = null;\n }\n if (this.idleTimeout) {\n clearTimeout(this.idleTimeout);\n this.idleTimeout = null;\n }\n\n // Restore speed if holding\n if (this.state.isHoldingSpeed) {\n this.releaseSpeedHold();\n }\n\n this.isAttached = false;\n }\n\n /**\n * Check if currently holding for speed boost\n */\n isHoldingSpeed(): boolean {\n return this.state.isHoldingSpeed;\n }\n\n /**\n * Check if user is currently idle (no interaction for idleTimeout)\n */\n isIdle(): boolean {\n return this.state.isIdle;\n }\n\n /**\n * Get current interaction state\n */\n getState(): InteractionState {\n return { ...this.state };\n }\n\n /**\n * Update config (e.g., when isLive changes)\n */\n updateConfig(updates: Partial<InteractionControllerConfig>): void {\n this.config = { ...this.config, ...updates };\n\n // If we switched to live mode while holding, release\n if (updates.isLive && this.state.isHoldingSpeed) {\n this.releaseSpeedHold();\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Keyboard Handling\n // ─────────────────────────────────────────────────────────────────\n\n private handleKeyDown(e: KeyboardEvent): void {\n // Ignore if focus is on an input element\n if (this.isInputElement(e.target)) return;\n\n // Record interaction for idle detection\n this.recordInteraction();\n\n const { isLive } = this.config;\n\n switch (e.key) {\n case ' ':\n case 'Spacebar':\n e.preventDefault();\n this.handleSpaceDown();\n break;\n\n case 'ArrowLeft':\n case 'j':\n case 'J':\n e.preventDefault();\n if (!isLive) {\n this.config.onSeek(-SKIP_AMOUNT_SECONDS);\n }\n break;\n\n case 'ArrowRight':\n case 'l':\n case 'L':\n e.preventDefault();\n if (!isLive) {\n this.config.onSeek(SKIP_AMOUNT_SECONDS);\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n this.config.onVolumeChange(VOLUME_STEP);\n break;\n\n case 'ArrowDown':\n e.preventDefault();\n this.config.onVolumeChange(-VOLUME_STEP);\n break;\n\n case 'm':\n case 'M':\n e.preventDefault();\n this.config.onMuteToggle();\n break;\n\n case 'f':\n case 'F':\n e.preventDefault();\n this.config.onFullscreenToggle();\n break;\n\n case 'c':\n case 'C':\n e.preventDefault();\n this.config.onCaptionsToggle?.();\n break;\n\n case 'k':\n case 'K':\n // YouTube-style: K = play/pause (no hold behavior)\n e.preventDefault();\n this.config.onPlayPause();\n break;\n\n case '<':\n case ',':\n // Decrease speed (shift+, = <)\n e.preventDefault();\n if (!isLive) {\n this.adjustPlaybackSpeed(-0.25);\n }\n break;\n\n case '>':\n case '.':\n // Increase speed (shift+. = >)\n e.preventDefault();\n if (!isLive) {\n this.adjustPlaybackSpeed(0.25);\n }\n break;\n\n // Number keys for seeking to percentage\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n e.preventDefault();\n if (!isLive && this.config.onSeekPercent) {\n const percent = parseInt(e.key, 10) / 10;\n this.config.onSeekPercent(percent);\n }\n break;\n }\n }\n\n private handleKeyUp(e: KeyboardEvent): void {\n if (this.isInputElement(e.target)) return;\n\n if (e.key === ' ' || e.key === 'Spacebar') {\n e.preventDefault();\n this.handleSpaceUp();\n }\n }\n\n private handleSpaceDown(): void {\n if (this.spaceKeyDownTime > 0) return; // Already tracking\n\n this.spaceKeyDownTime = Date.now();\n this.spaceIsHeld = false;\n\n // Only enable hold-for-speed on VOD/clips\n if (!this.config.isLive) {\n this.holdCheckTimeout = setTimeout(() => {\n this.spaceIsHeld = true;\n this.engageSpeedHold();\n }, HOLD_THRESHOLD_MS);\n }\n }\n\n private handleSpaceUp(): void {\n const downTime = this.spaceKeyDownTime;\n this.spaceKeyDownTime = 0;\n\n if (this.holdCheckTimeout) {\n clearTimeout(this.holdCheckTimeout);\n this.holdCheckTimeout = null;\n }\n\n if (this.spaceIsHeld) {\n // Was holding - release speed boost\n this.releaseSpeedHold();\n this.spaceIsHeld = false;\n } else {\n // Was a quick tap - toggle play/pause\n const elapsed = Date.now() - downTime;\n if (elapsed < HOLD_THRESHOLD_MS || this.config.isLive) {\n this.config.onPlayPause();\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Pointer (Mouse/Touch) Handling\n // ─────────────────────────────────────────────────────────────────\n\n private handlePointerDown(e: PointerEvent): void {\n // Only handle primary button / single touch on the video area\n if (e.button !== 0) return;\n if (this.isControlElement(e.target)) return;\n\n // Record interaction for idle detection\n this.recordInteraction();\n\n // Ensure container has focus for keyboard events\n this.config.container.focus();\n\n const now = Date.now();\n const rect = this.config.container.getBoundingClientRect();\n const relativeX = (e.clientX - rect.left) / rect.width;\n\n // Check for double-tap\n if (now - this.lastTapTime < DOUBLE_TAP_WINDOW_MS) {\n // Clear pending single-tap\n if (this.pendingTapTimeout) {\n clearTimeout(this.pendingTapTimeout);\n this.pendingTapTimeout = null;\n }\n\n // Handle double-tap to skip (mobile-style)\n if (!this.config.isLive) {\n if (relativeX < 0.33) {\n // Left third - skip back\n this.config.onSeek(-SKIP_AMOUNT_SECONDS);\n } else if (relativeX > 0.67) {\n // Right third - skip forward\n this.config.onSeek(SKIP_AMOUNT_SECONDS);\n } else {\n // Center - treat as play/pause\n this.config.onPlayPause();\n }\n }\n\n this.lastTapTime = 0;\n return;\n }\n\n this.lastTapTime = now;\n this.lastTapX = relativeX;\n this.pointerDownTime = now;\n this.pointerIsHeld = false;\n\n // Start long-press detection for 2x speed (VOD only)\n if (!this.config.isLive) {\n this.pointerHoldTimeout = setTimeout(() => {\n this.pointerIsHeld = true;\n this.engageSpeedHold();\n }, LONG_PRESS_THRESHOLD_MS);\n }\n }\n\n private handlePointerUp(e: PointerEvent): void {\n if (e.button !== 0) return;\n\n const wasHeld = this.pointerIsHeld;\n this.cancelPointerHold();\n\n if (wasHeld) {\n // Was long-pressing - just release speed\n this.releaseSpeedHold();\n } else if (this.pointerDownTime > 0) {\n // Was a quick tap - delay to check for double-tap\n this.pendingTapTimeout = setTimeout(() => {\n this.pendingTapTimeout = null;\n this.config.onPlayPause();\n }, DOUBLE_TAP_WINDOW_MS);\n }\n\n this.pointerDownTime = 0;\n }\n\n private handlePointerCancel(_e: PointerEvent): void {\n if (this.pointerIsHeld) {\n this.releaseSpeedHold();\n }\n this.cancelPointerHold();\n this.pointerDownTime = 0;\n }\n\n private cancelPointerHold(): void {\n if (this.pointerHoldTimeout) {\n clearTimeout(this.pointerHoldTimeout);\n this.pointerHoldTimeout = null;\n }\n this.pointerIsHeld = false;\n }\n\n private handleContextMenu(e: Event): void {\n // Prevent context menu during long-press\n if (this.pointerIsHeld || this.pointerDownTime > 0) {\n e.preventDefault();\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Speed Hold Logic\n // ─────────────────────────────────────────────────────────────────\n\n private engageSpeedHold(): void {\n if (this.state.isHoldingSpeed) return;\n if (this.config.isLive) return;\n\n // Save current speed\n this.state.previousSpeed = this.config.videoElement.playbackRate;\n this.state.isHoldingSpeed = true;\n\n // Apply hold speed\n this.config.onSpeedChange(this.state.holdSpeed, true);\n }\n\n private releaseSpeedHold(): void {\n if (!this.state.isHoldingSpeed) return;\n\n this.state.isHoldingSpeed = false;\n\n // Restore previous speed\n this.config.onSpeedChange(this.state.previousSpeed, false);\n }\n\n private adjustPlaybackSpeed(delta: number): void {\n if (this.state.isHoldingSpeed) return;\n\n const currentSpeed = this.config.videoElement.playbackRate;\n const newSpeed = Math.max(0.25, Math.min(4, currentSpeed + delta));\n\n // Round to avoid floating point issues\n const roundedSpeed = Math.round(newSpeed * 100) / 100;\n\n this.config.onSpeedChange(roundedSpeed, false);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Idle Detection\n // ─────────────────────────────────────────────────────────────────\n\n private handleMouseMove(_e: MouseEvent): void {\n this.recordInteraction();\n }\n\n /**\n * Record that an interaction occurred and reset idle timer\n */\n recordInteraction(): void {\n this.lastInteractionTime = Date.now();\n\n // If was idle, become active\n if (this.state.isIdle) {\n this.state.isIdle = false;\n this.config.onActive?.();\n }\n\n // Reset idle timer\n this.resetIdleTimer();\n }\n\n /**\n * Reset the idle timer\n */\n private resetIdleTimer(): void {\n // Clear existing timer\n if (this.idleTimeout) {\n clearTimeout(this.idleTimeout);\n this.idleTimeout = null;\n }\n\n // Get timeout value (0 means disabled)\n const timeout = this.config.idleTimeout ?? DEFAULT_IDLE_TIMEOUT_MS;\n if (timeout <= 0) return;\n\n // Set new timer\n this.idleTimeout = setTimeout(() => {\n this.idleTimeout = null;\n if (!this.state.isIdle) {\n this.state.isIdle = true;\n this.config.onIdle?.();\n }\n }, timeout);\n }\n\n /**\n * Manually mark as active (e.g., when controls become visible)\n */\n markActive(): void {\n this.recordInteraction();\n }\n\n /**\n * Pause idle tracking (e.g., when controls are visible)\n */\n pauseIdleTracking(): void {\n if (this.idleTimeout) {\n clearTimeout(this.idleTimeout);\n this.idleTimeout = null;\n }\n }\n\n /**\n * Resume idle tracking\n */\n resumeIdleTracking(): void {\n if (this.isAttached) {\n this.resetIdleTimer();\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Utilities\n // ─────────────────────────────────────────────────────────────────\n\n private isInputElement(target: EventTarget | null): boolean {\n if (!target || !(target instanceof HTMLElement)) return false;\n const tagName = target.tagName.toLowerCase();\n return tagName === 'input' || tagName === 'textarea' || tagName === 'select' || target.isContentEditable;\n }\n\n private isControlElement(target: EventTarget | null): boolean {\n if (!target || !(target instanceof HTMLElement)) return false;\n\n // Check if clicking on player controls (buttons, sliders, etc.)\n const controlSelectors = [\n 'button',\n '[role=\"button\"]',\n '[role=\"slider\"]',\n 'input',\n 'select',\n '.fw-player-controls',\n '[data-player-controls]',\n '.fw-control-bar',\n '.fw-player-surface',\n ];\n\n return controlSelectors.some(selector => {\n return target.matches(selector) || target.closest(selector) !== null;\n });\n }\n}\n","/**\n * MistReporter - Reports playback stats to MistServer\n *\n * Implements the same reporting protocol as MistPlayer reference:\n * - Sends initial report on player selection (player, sourceType, sourceUrl, pageUrl)\n * - Reports deltas every 5 seconds\n * - Tracks waiting/stalled events and durations\n * - Integrates with QualityMonitor for playbackScore\n * - Sends final report on unload\n *\n * Reports are sent over the same WebSocket used for stream state.\n */\n\nimport { TimerManager } from './TimerManager';\n\nexport interface MistReporterStats {\n nWaiting: number;\n timeWaiting: number;\n nStalled: number;\n timeStalled: number;\n timeUnpaused: number;\n nError: number;\n lastError: string | null;\n firstPlayback: number | null;\n playbackScore: number;\n autoplay: 'success' | 'muted' | 'failed' | null;\n videoHeight: number | null;\n videoWidth: number | null;\n playerHeight: number | null;\n playerWidth: number | null;\n tracks: string | null;\n nLog: number;\n}\n\nexport interface MistReporterInitialReport {\n player: string;\n sourceType: string;\n sourceUrl: string;\n pageUrl: string;\n}\n\nexport interface MistReporterOptions {\n /** WebSocket to send reports through (shared with stream state) */\n socket?: WebSocket | null;\n /** Report interval in ms (default: 5000) */\n reportInterval?: number;\n /** E2: Batch flush interval in ms (default: 1000) - max rate for non-critical reports */\n batchFlushInterval?: number;\n /** Boot timestamp for firstPlayback calculation */\n bootMs?: number;\n /** Log array reference for including logs in reports */\n logs?: string[];\n}\n\ntype StatsKey = keyof MistReporterStats;\n\n/**\n * MistReporter - Playback telemetry to MistServer\n */\nexport class MistReporter {\n private socket: WebSocket | null = null;\n private videoElement: HTMLVideoElement | null = null;\n private containerElement: HTMLElement | null = null;\n private reportInterval: number;\n private batchFlushInterval: number;\n private bootMs: number;\n private logs: string[] = [];\n\n // Internal stats storage (different structure for time tracking)\n private _stats: {\n _nWaiting: number;\n _nStalled: number;\n _nError: number;\n lastError: string | null;\n firstPlayback: number | null;\n playbackScore: number;\n autoplay: 'success' | 'muted' | 'failed' | null;\n tracks: string | null;\n };\n\n // Time tracking state\n private waitingSince: number = 0;\n private stalledSince: number = 0;\n private unpausedSince: number = 0;\n private timeWaitingAccum: number = 0;\n private timeStalledAccum: number = 0;\n private timeUnpausedAccum: number = 0;\n\n // Last reported values for delta detection\n private lastReported: Partial<MistReporterStats> = {};\n\n // Timer manager for periodic reporting\n private timers = new TimerManager();\n\n // Event listener cleanup functions\n private listeners: Array<() => void> = [];\n\n // Track if first playback has been recorded\n private firstPlaybackRecorded = false;\n\n // E2: Batch reporting state\n private pendingBatch: Record<string, unknown> = {};\n private hasPendingBatch = false;\n private lastFlushTime = 0;\n private batchFlushTimerId: number | null = null;\n\n // E3: Offline queue for telemetry\n private offlineQueue: Record<string, unknown>[] = [];\n private static readonly MAX_OFFLINE_QUEUE_SIZE = 100;\n\n constructor(options: MistReporterOptions = {}) {\n this.socket = options.socket ?? null;\n this.reportInterval = options.reportInterval ?? 5000;\n this.batchFlushInterval = options.batchFlushInterval ?? 1000;\n this.bootMs = options.bootMs ?? Date.now();\n this.logs = options.logs ?? [];\n\n // Initialize stats\n this._stats = {\n _nWaiting: 0,\n _nStalled: 0,\n _nError: 0,\n lastError: null,\n firstPlayback: null,\n playbackScore: 1.0,\n autoplay: null,\n tracks: null,\n };\n\n // Initialize lastReported to empty\n this.lastReported = {\n nWaiting: 0,\n timeWaiting: 0,\n nStalled: 0,\n timeStalled: 0,\n timeUnpaused: 0,\n nError: 0,\n lastError: null,\n firstPlayback: null,\n playbackScore: 1,\n autoplay: null,\n videoHeight: null,\n videoWidth: null,\n playerHeight: null,\n playerWidth: null,\n tracks: null,\n nLog: 0,\n };\n }\n\n /**\n * Set the WebSocket to use for reporting\n * E3: Flushes offline queue when socket becomes available\n */\n setSocket(socket: WebSocket | null): void {\n const wasDisconnected = !this.socket || this.socket.readyState !== WebSocket.OPEN;\n this.socket = socket;\n\n // E3: Flush offline queue when reconnecting\n if (wasDisconnected && socket?.readyState === WebSocket.OPEN) {\n this.flushOfflineQueue();\n }\n }\n\n /**\n * E3: Flush queued reports that were collected while offline\n */\n private flushOfflineQueue(): void {\n if (this.offlineQueue.length === 0) {\n return;\n }\n\n // Send all queued reports\n for (const report of this.offlineQueue) {\n this.sendReport(report);\n }\n\n this.offlineQueue = [];\n }\n\n /**\n * Get current stats object with computed getters\n * E1: Uses performance.now() for sub-millisecond precision in duration tracking\n */\n getStats(): MistReporterStats {\n const now = performance.now();\n\n return {\n nWaiting: this._stats._nWaiting,\n timeWaiting: Math.round(this.timeWaitingAccum + (this.waitingSince > 0 ? now - this.waitingSince : 0)),\n nStalled: this._stats._nStalled,\n timeStalled: Math.round(this.timeStalledAccum + (this.stalledSince > 0 ? now - this.stalledSince : 0)),\n timeUnpaused: Math.round(this.timeUnpausedAccum + (this.unpausedSince > 0 ? now - this.unpausedSince : 0)),\n nError: this._stats._nError,\n lastError: this._stats.lastError,\n firstPlayback: this._stats.firstPlayback,\n playbackScore: Math.round(this._stats.playbackScore * 10) / 10,\n autoplay: this._stats.autoplay,\n videoHeight: this.videoElement?.videoHeight ?? null,\n videoWidth: this.videoElement?.videoWidth ?? null,\n playerHeight: this.containerElement?.clientHeight ?? null,\n playerWidth: this.containerElement?.clientWidth ?? null,\n tracks: this._stats.tracks,\n nLog: this.logs.length,\n };\n }\n\n /**\n * Set a stat value\n */\n set<K extends StatsKey>(key: K, value: MistReporterStats[K]): void {\n if (key === 'nWaiting') {\n this._stats._nWaiting = value as number;\n } else if (key === 'nStalled') {\n this._stats._nStalled = value as number;\n } else if (key === 'nError') {\n this._stats._nError = value as number;\n } else if (key === 'lastError') {\n this._stats.lastError = value as string | null;\n } else if (key === 'firstPlayback') {\n this._stats.firstPlayback = value as number | null;\n } else if (key === 'playbackScore') {\n this._stats.playbackScore = value as number;\n } else if (key === 'autoplay') {\n this._stats.autoplay = value as 'success' | 'muted' | 'failed' | null;\n } else if (key === 'tracks') {\n this._stats.tracks = value as string | null;\n }\n // Other keys (computed) are read-only\n }\n\n /**\n * Increment a counter stat\n */\n add(key: 'nWaiting' | 'nStalled' | 'nError', amount = 1): void {\n if (key === 'nWaiting') {\n this._stats._nWaiting += amount;\n } else if (key === 'nStalled') {\n this._stats._nStalled += amount;\n } else if (key === 'nError') {\n this._stats._nError += amount;\n }\n }\n\n /**\n * Initialize reporting for a video element\n */\n init(videoElement: HTMLVideoElement, containerElement?: HTMLElement): void {\n this.videoElement = videoElement;\n this.containerElement = containerElement ?? videoElement.parentElement ?? null;\n this.firstPlaybackRecorded = false;\n\n // Set up event listeners like MistPlayer reference\n // E1: Use performance.now() for sub-millisecond precision in duration tracking\n const onPlaying = () => {\n const now = performance.now();\n const isFirstPlay = !this.firstPlaybackRecorded;\n\n // Record first playback time (still uses Date.now for absolute timestamp)\n if (isFirstPlay) {\n this._stats.firstPlayback = Date.now() - this.bootMs;\n this.firstPlaybackRecorded = true;\n }\n\n // End waiting state if active\n if (this.waitingSince > 0) {\n this.timeWaitingAccum += now - this.waitingSince;\n this.waitingSince = 0;\n }\n\n // End stalled state if active\n if (this.stalledSince > 0) {\n this.timeStalledAccum += now - this.stalledSince;\n this.stalledSince = 0;\n }\n\n // Start unpaused timer\n if (this.unpausedSince === 0) {\n this.unpausedSince = now;\n }\n\n // E2: Flush immediately on first playback\n if (isFirstPlay) {\n this.reportStats();\n this.flushBatch();\n }\n };\n\n const onWaiting = () => {\n this._stats._nWaiting++;\n if (this.waitingSince === 0) {\n this.waitingSince = performance.now();\n }\n };\n\n const onStalled = () => {\n this._stats._nStalled++;\n if (this.stalledSince === 0) {\n this.stalledSince = performance.now();\n }\n };\n\n const onPause = () => {\n // End unpaused timer\n if (this.unpausedSince > 0) {\n this.timeUnpausedAccum += performance.now() - this.unpausedSince;\n this.unpausedSince = 0;\n }\n };\n\n const onError = (e: Event) => {\n this._stats._nError++;\n const error = (e as ErrorEvent).message || 'Unknown error';\n this._stats.lastError = error;\n\n // E2: Flush immediately on error\n this.reportStats();\n this.flushBatch();\n };\n\n const onCanPlay = () => {\n // End waiting state if active\n if (this.waitingSince > 0) {\n this.timeWaitingAccum += performance.now() - this.waitingSince;\n this.waitingSince = 0;\n }\n };\n\n videoElement.addEventListener('playing', onPlaying);\n videoElement.addEventListener('waiting', onWaiting);\n videoElement.addEventListener('stalled', onStalled);\n videoElement.addEventListener('pause', onPause);\n videoElement.addEventListener('error', onError);\n videoElement.addEventListener('canplay', onCanPlay);\n\n this.listeners = [\n () => videoElement.removeEventListener('playing', onPlaying),\n () => videoElement.removeEventListener('waiting', onWaiting),\n () => videoElement.removeEventListener('stalled', onStalled),\n () => videoElement.removeEventListener('pause', onPause),\n () => videoElement.removeEventListener('error', onError),\n () => videoElement.removeEventListener('canplay', onCanPlay),\n ];\n\n // Start periodic reporting\n this.startReporting();\n }\n\n /**\n * Send initial report when player is selected\n */\n sendInitialReport(info: MistReporterInitialReport): void {\n this.report(info as unknown as Record<string, unknown>);\n }\n\n /**\n * Update playback score (call from QualityMonitor)\n */\n setPlaybackScore(score: number): void {\n this._stats.playbackScore = score;\n }\n\n /**\n * Update autoplay status\n */\n setAutoplayStatus(status: 'success' | 'muted' | 'failed'): void {\n this._stats.autoplay = status;\n }\n\n /**\n * Update current tracks\n */\n setTracks(tracks: string[]): void {\n this._stats.tracks = tracks.join(',');\n }\n\n /**\n * Send a report over WebSocket immediately\n * E3: Queues reports when socket is unavailable (up to MAX_OFFLINE_QUEUE_SIZE)\n */\n private sendReport(data: Record<string, unknown>): void {\n // If socket not available, queue for later\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n // E3: Queue report for when socket reconnects\n if (this.offlineQueue.length < MistReporter.MAX_OFFLINE_QUEUE_SIZE) {\n this.offlineQueue.push(data);\n }\n // If queue is full, oldest reports are lost (FIFO overflow)\n return;\n }\n\n try {\n this.socket.send(JSON.stringify(data));\n } catch {\n // E3: Queue on send failure too\n if (this.offlineQueue.length < MistReporter.MAX_OFFLINE_QUEUE_SIZE) {\n this.offlineQueue.push(data);\n }\n }\n }\n\n /**\n * E2: Queue data for batched reporting\n * Merges with pending batch, schedules flush if not already pending\n */\n private report(data: Record<string, unknown>): void {\n // Merge into pending batch\n Object.assign(this.pendingBatch, data);\n this.hasPendingBatch = true;\n\n // Schedule flush if not already scheduled\n if (this.batchFlushTimerId === null) {\n const now = performance.now();\n const timeSinceLastFlush = now - this.lastFlushTime;\n const delay = Math.max(0, this.batchFlushInterval - timeSinceLastFlush);\n\n this.batchFlushTimerId = this.timers.start(() => {\n this.batchFlushTimerId = null;\n this.flushBatch();\n }, delay, 'batchFlush');\n }\n }\n\n /**\n * E2: Flush pending batch immediately\n * Used for critical events (error, first play, unload)\n */\n flushBatch(): void {\n if (this.batchFlushTimerId !== null) {\n this.timers.stop(this.batchFlushTimerId);\n this.batchFlushTimerId = null;\n }\n\n if (!this.hasPendingBatch) {\n return;\n }\n\n this.sendReport(this.pendingBatch);\n this.pendingBatch = {};\n this.hasPendingBatch = false;\n this.lastFlushTime = performance.now();\n }\n\n /**\n * Report stats delta (only changed values)\n * E2: Now queues to batch instead of sending immediately\n */\n reportStats(): void {\n const current = this.getStats();\n const delta: Record<string, unknown> = {};\n let hasChanges = false;\n\n // Compare each stat and include only changed values\n const keys: StatsKey[] = [\n 'nWaiting', 'timeWaiting', 'nStalled', 'timeStalled', 'timeUnpaused',\n 'nError', 'lastError', 'firstPlayback', 'playbackScore', 'autoplay',\n 'videoHeight', 'videoWidth', 'playerHeight', 'playerWidth', 'tracks', 'nLog'\n ];\n\n for (const key of keys) {\n const currentValue = current[key];\n const lastValue = this.lastReported[key];\n\n if (currentValue !== lastValue) {\n delta[key] = currentValue;\n (this.lastReported as Record<string, unknown>)[key] = currentValue;\n hasChanges = true;\n }\n }\n\n // Include logs if there are new ones\n const lastLogCount = this.lastReported.nLog ?? 0;\n if (this.logs.length > lastLogCount) {\n const newLogs = this.logs.slice(lastLogCount);\n if (newLogs.length > 0) {\n delta.logs = newLogs;\n hasChanges = true;\n }\n }\n\n if (hasChanges) {\n this.report(delta);\n }\n\n // Schedule next report\n this.scheduleNextReport();\n }\n\n /**\n * Start periodic reporting\n */\n private startReporting(): void {\n this.scheduleNextReport();\n }\n\n /**\n * Schedule the next report\n */\n private scheduleNextReport(): void {\n this.timers.start(() => {\n this.reportStats();\n }, this.reportInterval, 'report');\n }\n\n /**\n * Send final report and cleanup\n * E2: Flushes immediately since this is a critical event\n */\n sendFinalReport(reason?: string): void {\n // Report final stats\n this.reportStats();\n\n // Queue unload report\n this.report({ unload: reason ?? null });\n\n // E2: Flush immediately - don't wait for batch interval\n this.flushBatch();\n }\n\n /**\n * Stop reporting and cleanup\n */\n destroy(): void {\n // Stop all timers\n this.timers.destroy();\n\n // Remove event listeners\n this.listeners.forEach(cleanup => cleanup());\n this.listeners = [];\n\n this.videoElement = null;\n this.containerElement = null;\n }\n\n /**\n * Add a log entry\n */\n log(message: string): void {\n this.logs.push(message);\n }\n}\n\nexport default MistReporter;\n","import type { PlaybackQuality, QualityThresholds } from '../types';\nimport { TimerManager } from './TimerManager';\n\n/**\n * Default quality thresholds\n */\nconst DEFAULT_THRESHOLDS: QualityThresholds = {\n minScore: 60,\n maxStalls: 3,\n minBuffer: 2,\n};\n\n/**\n * Rolling average window size\n */\nconst ROLLING_WINDOW_SIZE = 20;\n\n/**\n * Playback score history entry (for MistPlayer-style 0-2.0 score)\n */\ninterface PlaybackScoreEntry {\n clock: number; // Wall clock time in seconds\n video: number; // Video currentTime\n score: number; // Calculated score for this sample\n}\n\n/** Protocol type for threshold selection */\nexport type PlayerProtocol = 'webrtc' | 'hls' | 'dash' | 'html5' | 'unknown';\n\n/** Protocol-specific playback score thresholds (MistMetaPlayer reference) */\nexport const PROTOCOL_THRESHOLDS: Record<PlayerProtocol, number> = {\n webrtc: 0.95, // Very strict for low-latency\n hls: 0.75, // More lenient for adaptive streaming\n dash: 0.75, // More lenient for adaptive streaming\n html5: 0.75, // Standard threshold\n unknown: 0.75, // Default\n};\n\nexport interface QualityMonitorOptions {\n /** Sample interval in ms */\n sampleInterval?: number;\n /** Quality thresholds */\n thresholds?: Partial<QualityThresholds>;\n /** Callback when quality degrades */\n onQualityDegraded?: (quality: PlaybackQuality) => void;\n /** Callback on every sample */\n onSample?: (quality: PlaybackQuality) => void;\n /** Current player protocol for threshold selection */\n protocol?: PlayerProtocol;\n /** Custom playback score threshold (overrides protocol default) */\n playbackScoreThreshold?: number;\n /**\n * Callback when sustained poor quality triggers a fallback request\n * Reference: player.js:654-665 - \"nextCombo\" action\n */\n onFallbackRequest?: (reason: { score: number; consecutivePoorSamples: number }) => void;\n /**\n * Number of consecutive poor samples before requesting fallback\n * Default: 5 (2.5 seconds at 500ms sample interval)\n */\n poorSamplesBeforeFallback?: number;\n}\n\nexport interface QualityMonitorState {\n isMonitoring: boolean;\n quality: PlaybackQuality | null;\n history: PlaybackQuality[];\n}\n\n/**\n * QualityMonitor - Tracks playback quality metrics\n *\n * Monitors:\n * - Buffer health (seconds ahead)\n * - Stall count (waiting events)\n * - Frame drop rate (via video.getVideoPlaybackQuality())\n * - Estimated bitrate\n * - Latency (for live streams)\n *\n * Calculates a composite quality score (0-100) and triggers\n * callbacks when quality degrades below thresholds.\n */\nexport class QualityMonitor {\n private videoElement: HTMLVideoElement | null = null;\n private options: Required<Omit<QualityMonitorOptions, 'protocol' | 'playbackScoreThreshold'>> & {\n protocol: PlayerProtocol;\n playbackScoreThreshold: number | null;\n };\n private thresholds: QualityThresholds;\n private timers = new TimerManager();\n private stallCount = 0;\n private lastStallTime = 0;\n private totalStallMs = 0;\n private history: PlaybackQuality[] = [];\n private lastBytesLoaded = 0;\n private lastBytesTime = 0;\n private listeners: Array<() => void> = [];\n\n // MistPlayer-style playback score (0-2.0 scale)\n private playbackScoreHistory: PlaybackScoreEntry[] = [];\n private playbackScore = 1.0;\n private readonly PLAYBACK_SCORE_AVERAGING_STEPS = 10;\n\n // Automatic fallback tracking\n // Reference: player.js:654-665 - triggers \"nextCombo\" after sustained poor quality\n private consecutivePoorSamples = 0;\n private fallbackTriggered = false;\n\n constructor(options: QualityMonitorOptions = {}) {\n this.options = {\n sampleInterval: options.sampleInterval ?? 500,\n thresholds: options.thresholds ?? {},\n onQualityDegraded: options.onQualityDegraded ?? (() => {}),\n onSample: options.onSample ?? (() => {}),\n protocol: options.protocol ?? 'unknown',\n playbackScoreThreshold: options.playbackScoreThreshold ?? null,\n onFallbackRequest: options.onFallbackRequest ?? (() => {}),\n poorSamplesBeforeFallback: options.poorSamplesBeforeFallback ?? 5,\n };\n this.thresholds = { ...DEFAULT_THRESHOLDS, ...options.thresholds };\n }\n\n /**\n * Set the current player protocol for threshold selection\n */\n setProtocol(protocol: PlayerProtocol): void {\n this.options.protocol = protocol;\n }\n\n /**\n * Get the current player protocol\n */\n getProtocol(): PlayerProtocol {\n return this.options.protocol;\n }\n\n /**\n * Get the playback score threshold for the current protocol\n */\n getPlaybackScoreThreshold(): number {\n // Custom threshold takes precedence\n if (this.options.playbackScoreThreshold !== null) {\n return this.options.playbackScoreThreshold;\n }\n return PROTOCOL_THRESHOLDS[this.options.protocol];\n }\n\n /**\n * Set a custom playback score threshold (overrides protocol default)\n */\n setPlaybackScoreThreshold(threshold: number | null): void {\n this.options.playbackScoreThreshold = threshold;\n }\n\n /**\n * Start monitoring a video element\n */\n start(videoElement: HTMLVideoElement): void {\n this.stop();\n\n this.videoElement = videoElement;\n this.stallCount = 0;\n this.totalStallMs = 0;\n this.lastStallTime = 0;\n this.history = [];\n this.lastBytesLoaded = 0;\n this.lastBytesTime = 0;\n this.consecutivePoorSamples = 0;\n this.fallbackTriggered = false;\n this.playbackScoreHistory = [];\n this.playbackScore = 1.0;\n\n // Listen for stall events\n const onWaiting = () => {\n this.stallCount++;\n this.lastStallTime = performance.now();\n };\n\n const onPlaying = () => {\n if (this.lastStallTime > 0) {\n this.totalStallMs += performance.now() - this.lastStallTime;\n this.lastStallTime = 0;\n }\n };\n\n const onCanPlay = () => {\n if (this.lastStallTime > 0) {\n this.totalStallMs += performance.now() - this.lastStallTime;\n this.lastStallTime = 0;\n }\n };\n\n videoElement.addEventListener('waiting', onWaiting);\n videoElement.addEventListener('playing', onPlaying);\n videoElement.addEventListener('canplay', onCanPlay);\n\n this.listeners = [\n () => videoElement.removeEventListener('waiting', onWaiting),\n () => videoElement.removeEventListener('playing', onPlaying),\n () => videoElement.removeEventListener('canplay', onCanPlay),\n ];\n\n // Start sampling interval\n this.timers.startInterval(() => this.sample(), this.options.sampleInterval, 'sampling');\n\n // Take initial sample\n this.sample();\n }\n\n /**\n * Stop monitoring\n */\n stop(): void {\n this.timers.destroy();\n\n this.listeners.forEach(cleanup => cleanup());\n this.listeners = [];\n\n this.videoElement = null;\n }\n\n /**\n * Take a quality sample\n */\n private sample(): void {\n const video = this.videoElement;\n if (!video) return;\n\n // Update MistPlayer-style playback score\n this.updatePlaybackScore();\n\n const quality = this.calculateQuality(video);\n this.history.push(quality);\n\n // Keep rolling window\n if (this.history.length > ROLLING_WINDOW_SIZE) {\n this.history.shift();\n }\n\n // Notify listeners\n this.options.onSample(quality);\n\n // Check for quality degradation\n if (quality.score < this.thresholds.minScore ||\n quality.stallCount > this.thresholds.maxStalls ||\n quality.bufferedAhead < this.thresholds.minBuffer) {\n this.options.onQualityDegraded(quality);\n }\n\n // Track sustained poor quality for automatic fallback\n // Reference: player.js:654-665 - \"nextCombo\" after sustained poor playback\n if (this.isPlaybackPoor()) {\n this.consecutivePoorSamples++;\n\n // Trigger fallback after sustained poor quality\n // Only trigger once until quality improves or reset\n if (!this.fallbackTriggered &&\n this.consecutivePoorSamples >= this.options.poorSamplesBeforeFallback) {\n this.fallbackTriggered = true;\n console.warn(\n `[QualityMonitor] Poor playback detected: ${Math.round(this.playbackScore * 100)}% ` +\n `(threshold: ${Math.round(this.getPlaybackScoreThreshold() * 100)}%, ` +\n `protocol: ${this.options.protocol})`\n );\n this.options.onFallbackRequest({\n score: this.playbackScore,\n consecutivePoorSamples: this.consecutivePoorSamples,\n });\n }\n } else {\n // Quality recovered - reset counters\n this.consecutivePoorSamples = 0;\n this.fallbackTriggered = false;\n }\n }\n\n /**\n * Calculate current quality metrics\n */\n private calculateQuality(video: HTMLVideoElement): PlaybackQuality {\n const now = Date.now();\n\n // Calculate buffered ahead\n let bufferedAhead = 0;\n if (video.buffered.length > 0) {\n for (let i = 0; i < video.buffered.length; i++) {\n if (video.buffered.start(i) <= video.currentTime && video.buffered.end(i) > video.currentTime) {\n bufferedAhead = video.buffered.end(i) - video.currentTime;\n break;\n }\n }\n }\n\n // Get frame stats if available\n let framesDecoded = 0;\n let framesDropped = 0;\n let frameDropRate = 0;\n\n if ('getVideoPlaybackQuality' in video) {\n const stats = video.getVideoPlaybackQuality();\n framesDecoded = stats.totalVideoFrames;\n framesDropped = stats.droppedVideoFrames;\n frameDropRate = framesDecoded > 0 ? (framesDropped / framesDecoded) * 100 : 0;\n }\n\n // Estimate bitrate from buffer loading\n let bitrate = 0;\n if (video.buffered.length > 0 && this.lastBytesTime > 0) {\n const timeElapsed = (now - this.lastBytesTime) / 1000;\n if (timeElapsed > 0) {\n // Estimate from buffer growth\n // This is a rough approximation - real bitrate tracking would use MSE\n const bufferEnd = video.buffered.end(video.buffered.length - 1);\n const bufferDuration = bufferEnd - video.currentTime;\n // Assume average bitrate based on buffer size\n bitrate = bufferDuration > 0 ? Math.round((bufferDuration * 1000000) / timeElapsed) : 0;\n }\n }\n this.lastBytesTime = now;\n\n // Calculate latency for live streams\n let latency = 0;\n if (video.duration === Infinity || !isFinite(video.duration)) {\n // Live stream - estimate latency from buffer\n if (video.buffered.length > 0) {\n const liveEdge = video.buffered.end(video.buffered.length - 1);\n latency = (liveEdge - video.currentTime) * 1000;\n }\n }\n\n // Calculate composite quality score (0-100) with duration-weighted stalls\n const score = this.calculateScore({\n bufferedAhead,\n stallCount: this.stallCount,\n stallDurationMs: this.totalStallMs,\n frameDropRate,\n latency,\n });\n\n return {\n score,\n bitrate,\n bufferedAhead,\n stallCount: this.stallCount,\n frameDropRate,\n latency,\n timestamp: now,\n };\n }\n\n /**\n * Calculate composite quality score\n *\n * D4: Duration-weighted stall tracking - stall penalty considers both\n * count AND duration. 10x 0.1s stalls (1s total) weighs less than 1x 1s stall.\n */\n private calculateScore(metrics: {\n bufferedAhead: number;\n stallCount: number;\n stallDurationMs: number;\n frameDropRate: number;\n latency: number;\n }): number {\n let score = 100;\n\n // Buffer penalty (max -40 points)\n if (metrics.bufferedAhead < this.thresholds.minBuffer) {\n const bufferPenalty = Math.min(40, (this.thresholds.minBuffer - metrics.bufferedAhead) * 20);\n score -= bufferPenalty;\n }\n\n // D4: Duration-weighted stall penalty (max -30 points)\n // Base: 5 points per stall + 2 points per second of total stall time\n // This weights duration: 1x 2s stall = 5 + 4 = 9 points\n // 10x 0.2s stalls = 50 + 4 = 54 points (capped at 30)\n // So many short stalls are penalized more than few long stalls of same duration\n const countPenalty = metrics.stallCount * 5;\n const durationPenalty = (metrics.stallDurationMs / 1000) * 2;\n const stallPenalty = Math.min(30, countPenalty + durationPenalty);\n score -= stallPenalty;\n\n // Frame drop penalty (max -20 points)\n const framePenalty = Math.min(20, metrics.frameDropRate * 2);\n score -= framePenalty;\n\n // Latency penalty for live streams (max -10 points)\n if (metrics.latency > 5000) {\n const latencyPenalty = Math.min(10, (metrics.latency - 5000) / 1000);\n score -= latencyPenalty;\n }\n\n return Math.max(0, Math.round(score));\n }\n\n /**\n * Get current quality metrics\n */\n getCurrentQuality(): PlaybackQuality | null {\n return this.history.length > 0 ? this.history[this.history.length - 1] : null;\n }\n\n /**\n * Get rolling average quality\n */\n getAverageQuality(): PlaybackQuality | null {\n if (this.history.length === 0) return null;\n\n const avg: PlaybackQuality = {\n score: 0,\n bitrate: 0,\n bufferedAhead: 0,\n stallCount: this.stallCount,\n frameDropRate: 0,\n latency: 0,\n timestamp: Date.now(),\n };\n\n for (const q of this.history) {\n avg.score += q.score;\n avg.bitrate += q.bitrate;\n avg.bufferedAhead += q.bufferedAhead;\n avg.frameDropRate += q.frameDropRate;\n avg.latency += q.latency;\n }\n\n const len = this.history.length;\n avg.score = Math.round(avg.score / len);\n avg.bitrate = Math.round(avg.bitrate / len);\n avg.bufferedAhead = avg.bufferedAhead / len;\n avg.frameDropRate = avg.frameDropRate / len;\n avg.latency = avg.latency / len;\n\n return avg;\n }\n\n /**\n * Get quality history\n */\n getHistory(): PlaybackQuality[] {\n return [...this.history];\n }\n\n /**\n * Reset stall counters\n */\n resetStallCounters(): void {\n this.stallCount = 0;\n this.totalStallMs = 0;\n }\n\n /**\n * Get total stall time in ms\n */\n getTotalStallMs(): number {\n return this.totalStallMs;\n }\n\n /**\n * Check if currently monitoring\n */\n isMonitoring(): boolean {\n return this.videoElement !== null && this.timers.activeCount > 0;\n }\n\n // ========================================\n // MistPlayer-style Playback Score (0-2.0)\n // ========================================\n\n /**\n * Calculate playback score entry value\n * Compares video time progress vs wall clock time\n */\n private getPlaybackScoreValue(): PlaybackScoreEntry {\n const video = this.videoElement;\n const clock = performance.now() / 1000;\n const videoTime = video?.currentTime ?? 0;\n\n const result: PlaybackScoreEntry = {\n clock,\n video: videoTime,\n score: 1.0,\n };\n\n if (this.playbackScoreHistory.length > 0) {\n const prev = this.playbackScoreHistory[this.playbackScoreHistory.length - 1];\n result.score = this.calculatePlaybackScoreFromEntries(prev, result);\n }\n\n return result;\n }\n\n /**\n * Calculate score between two entries\n * Returns 1.0 for normal playback, >1.0 if faster, <1.0 if stalled, <0 if backwards\n */\n private calculatePlaybackScoreFromEntries(a: PlaybackScoreEntry, b: PlaybackScoreEntry): number {\n const video = this.videoElement;\n let rate = 1;\n if (video) {\n rate = video.playbackRate || 1;\n }\n\n const clockDelta = b.clock - a.clock;\n const videoDelta = b.video - a.video;\n\n if (clockDelta <= 0) return 1.0;\n\n return (videoDelta / clockDelta) / rate;\n }\n\n /**\n * Calculate and update the playback score\n * Like MistPlayer's calcScore function\n */\n private updatePlaybackScore(): number {\n const entry = this.getPlaybackScoreValue();\n this.playbackScoreHistory.push(entry);\n\n if (this.playbackScoreHistory.length <= 1) {\n return 1.0;\n }\n\n // Calculate score from oldest to newest\n const first = this.playbackScoreHistory[0];\n const last = this.playbackScoreHistory[this.playbackScoreHistory.length - 1];\n let score = this.calculatePlaybackScoreFromEntries(first, last);\n\n // Trim history\n if (this.playbackScoreHistory.length > this.PLAYBACK_SCORE_AVERAGING_STEPS) {\n this.playbackScoreHistory.shift();\n }\n\n // Final score is max of averaged and current\n score = Math.max(score, entry.score);\n this.playbackScore = score;\n\n return score;\n }\n\n /**\n * Get current playback score (MistPlayer-style 0-2.0 scale)\n *\n * - 1.0 = normal playback (video progresses at expected rate)\n * - > 1.0 = faster than expected (catching up)\n * - < 1.0 = slower than expected (stalling/buffering)\n * - < 0 = video went backwards\n *\n * Threshold recommendations:\n * - WebRTC: warn below 0.95\n * - HLS/DASH: warn below 0.75\n */\n getPlaybackScore(): number {\n return this.playbackScore;\n }\n\n /**\n * Check if playback quality is poor based on score\n * Uses protocol-specific thresholds (MistPlayer-style)\n * WebRTC: 0.95 (strict), HLS/DASH/HTML5: 0.75 (lenient)\n */\n isPlaybackPoor(): boolean {\n return this.playbackScore < this.getPlaybackScoreThreshold();\n }\n\n /**\n * Reset playback score tracking\n */\n resetPlaybackScore(): void {\n this.playbackScoreHistory = [];\n this.playbackScore = 1.0;\n }\n\n /**\n * Reset fallback state\n * Call after a player switch to allow fallback to trigger again\n */\n resetFallbackState(): void {\n this.consecutivePoorSamples = 0;\n this.fallbackTriggered = false;\n }\n\n /**\n * Get consecutive poor sample count (for debugging)\n */\n getConsecutivePoorSamples(): number {\n return this.consecutivePoorSamples;\n }\n\n /**\n * Check if fallback has been triggered (for debugging)\n */\n hasFallbackTriggered(): boolean {\n return this.fallbackTriggered;\n }\n}\n\nexport default QualityMonitor;\n","import type { MetaTrackEvent, MetaTrackEventType } from '../types';\nimport { TimerManager } from './TimerManager';\n\nexport interface MetaTrackSubscription {\n trackId: string;\n callback: (event: MetaTrackEvent) => void;\n}\n\nexport interface MetaTrackManagerConfig {\n /** MistServer base URL */\n mistBaseUrl: string;\n /** Stream name */\n streamName: string;\n /** Initial subscriptions */\n subscriptions?: MetaTrackSubscription[];\n /** Debug logging */\n debug?: boolean;\n /** Buffer ahead duration in seconds (default: 5) */\n bufferAhead?: number;\n /** Max age for messages in seconds before filtering (default: 5) */\n maxMessageAge?: number;\n /** Fast-forward interval in seconds for catching up (default: 5) */\n fastForwardInterval?: number;\n}\n\ntype ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';\n\n/**\n * MetaTrackManager - Handles real-time metadata subscriptions via MistServer WebSocket\n *\n * Uses native MistServer WebSocket protocol (from embed/player.js):\n * - Connect: ws://{baseUrl}/json_{streamName}.js?rate=1\n * - Set tracks: {type:\"tracks\", meta:\"1,2,3\"} (comma-separated indices)\n * - Seek: {type:\"seek\", seek_time:<ms>, ff_to:<ms>}\n * - Receive: {time:<ms>, track:<index>, data:{...}}\n * - Control: {type:\"hold\"}, {type:\"play\"}, {type:\"fast_forward\", ff_to:<ms>}\n *\n * Features:\n * - Automatic reconnection with exponential backoff\n * - Message buffering during reconnection\n * - Type detection for subtitle/score/event/chapter data\n * - Stay-ahead buffering for smooth playback\n *\n * @example\n * ```ts\n * const manager = new MetaTrackManager({\n * mistBaseUrl: 'https://mist.example.com',\n * streamName: 'my-stream',\n * });\n *\n * manager.subscribe('1', (event) => {\n * if (event.type === 'subtitle') {\n * console.log('Subtitle:', event.data);\n * }\n * });\n *\n * manager.connect();\n * ```\n */\nexport class MetaTrackManager {\n private config: MetaTrackManagerConfig;\n private ws: WebSocket | null = null;\n private state: ConnectionState = 'disconnected';\n private subscriptions: Map<string, Set<(event: MetaTrackEvent) => void>> = new Map();\n private pendingSubscriptions: Set<string> = new Set();\n private reconnectAttempt = 0;\n private timers = new TimerManager();\n private messageBuffer: MetaTrackEvent[] = [];\n private debug: boolean;\n private connectionId: number = 0; // Track connection attempts to prevent stale callbacks\n\n // Debounce time for rapid mount/unmount cycles (ms)\n private static readonly CONNECTION_DEBOUNCE_MS = 100;\n\n // Reconnection settings\n private static readonly MAX_RECONNECT_ATTEMPTS = 5;\n private static readonly INITIAL_RECONNECT_DELAY = 1000;\n private static readonly MAX_RECONNECT_DELAY = 30000;\n private static readonly MESSAGE_BUFFER_SIZE = 100;\n\n // Buffer management (MistMetaPlayer feature backport)\n private currentPlaybackTime = 0;\n private bufferAhead: number;\n private maxMessageAge: number;\n private fastForwardInterval: number;\n private lastFastForwardTime = 0;\n private timedEventBuffer: Map<string, MetaTrackEvent[]> = new Map(); // trackId -> events sorted by time\n\n constructor(config: MetaTrackManagerConfig) {\n this.config = config;\n this.debug = config.debug ?? false;\n\n // Buffer management settings (MistMetaPlayer defaults)\n this.bufferAhead = config.bufferAhead ?? 5;\n this.maxMessageAge = config.maxMessageAge ?? 5;\n this.fastForwardInterval = config.fastForwardInterval ?? 5;\n\n // Add initial subscriptions\n if (config.subscriptions) {\n for (const sub of config.subscriptions) {\n this.subscribe(sub.trackId, sub.callback);\n }\n }\n }\n\n /**\n * Connect to MistServer WebSocket\n * Debounced to prevent orphaned connections during rapid mount/unmount cycles.\n */\n connect(): void {\n if (this.state === 'connecting' || this.state === 'connected') {\n return;\n }\n\n this.state = 'connecting';\n this.log('Connecting...');\n\n // Increment connection ID to invalidate any pending callbacks\n const currentConnectionId = ++this.connectionId;\n\n // Debounce connection\n this.timers.start(() => {\n // Check if this connection attempt is still valid\n if (this.state !== 'connecting' || this.connectionId !== currentConnectionId) {\n return;\n }\n\n this.createWebSocket(currentConnectionId);\n }, MetaTrackManager.CONNECTION_DEBOUNCE_MS, 'connect');\n }\n\n /**\n * Internal method to create WebSocket after debounce\n */\n private createWebSocket(connectionId: number): void {\n try {\n const wsUrl = this.buildWsUrl();\n this.ws = new WebSocket(wsUrl);\n\n this.ws.onopen = () => {\n // Verify still valid\n if (this.connectionId !== connectionId) {\n this.ws?.close();\n return;\n }\n\n this.log('Connected');\n this.state = 'connected';\n this.reconnectAttempt = 0;\n\n // Merge pending subscriptions into existing\n for (const trackId of this.pendingSubscriptions) {\n if (!this.subscriptions.has(trackId)) {\n this.subscriptions.set(trackId, new Set());\n }\n }\n this.pendingSubscriptions.clear();\n\n // Send all subscribed tracks at once (MistServer protocol)\n this.sendTracksUpdate();\n\n // Send initial seek to current playback position\n this.sendSeek(this.currentPlaybackTime);\n\n // Flush message buffer\n this.flushMessageBuffer();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n this.log('WebSocket error');\n console.warn('[MetaTrackManager] WebSocket error:', event);\n };\n\n this.ws.onclose = () => {\n this.log('Disconnected');\n this.ws = null;\n\n if (this.state !== 'disconnected') {\n this.scheduleReconnect();\n }\n };\n } catch (error) {\n this.log(`Connection error: ${error}`);\n this.scheduleReconnect();\n }\n }\n\n /**\n * Disconnect from MistServer\n */\n disconnect(): void {\n this.state = 'disconnected';\n\n // Clear all timers\n this.timers.destroy();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Subscribe to a meta track\n * @param trackId Track index (number as string) or \"all\" for all meta tracks\n */\n subscribe(trackId: string, callback: (event: MetaTrackEvent) => void): () => void {\n const isNewTrack = !this.subscriptions.has(trackId);\n\n if (isNewTrack) {\n this.subscriptions.set(trackId, new Set());\n }\n\n this.subscriptions.get(trackId)!.add(callback);\n\n // Send updated track list if connected and this is a new track\n if (this.state === 'connected' && this.ws && isNewTrack) {\n this.sendTracksUpdate();\n } else if (isNewTrack) {\n this.pendingSubscriptions.add(trackId);\n }\n\n // Return unsubscribe function\n return () => this.unsubscribe(trackId, callback);\n }\n\n /**\n * Unsubscribe from a meta track\n */\n unsubscribe(trackId: string, callback: (event: MetaTrackEvent) => void): void {\n const callbacks = this.subscriptions.get(trackId);\n if (callbacks) {\n callbacks.delete(callback);\n\n // If no more callbacks, remove subscription and update MistServer\n if (callbacks.size === 0) {\n this.subscriptions.delete(trackId);\n // Send updated track list (MistServer doesn't have explicit unsubscribe)\n if (this.state === 'connected' && this.ws) {\n this.sendTracksUpdate();\n }\n }\n }\n }\n\n /**\n * Get list of subscribed track IDs\n */\n getSubscribedTracks(): string[] {\n return Array.from(this.subscriptions.keys());\n }\n\n /**\n * Get connection state\n */\n getState(): ConnectionState {\n return this.state;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.state === 'connected';\n }\n\n // ========================================\n // Buffer Management (MistMetaPlayer backport)\n // ========================================\n\n /**\n * Update current playback time\n * Call this on video timeupdate events to keep buffer in sync\n */\n setPlaybackTime(timeInSeconds: number): void {\n this.currentPlaybackTime = timeInSeconds;\n\n // Process any buffered events that are now due\n this.processTimedEvents();\n }\n\n /**\n * Get current playback time\n */\n getPlaybackTime(): number {\n return this.currentPlaybackTime;\n }\n\n /**\n * Handle seek event - clears buffer and sends seek command to MistServer\n * Call this when video seeks to a new position\n */\n onSeek(newTimeInSeconds: number): void {\n this.log(`Seek to ${newTimeInSeconds}s - clearing buffer and notifying server`);\n this.currentPlaybackTime = newTimeInSeconds;\n\n // Clear all timed event buffers\n this.timedEventBuffer.clear();\n\n // Reset fast-forward tracking\n this.lastFastForwardTime = 0;\n\n // Tell MistServer to seek its metadata stream\n this.sendSeek(newTimeInSeconds);\n }\n\n /**\n * Process buffered events up to current playback time\n * Dispatches events that are ready to be shown\n */\n private processTimedEvents(): void {\n const now = this.currentPlaybackTime * 1000; // Convert to ms\n\n for (const [trackId, events] of this.timedEventBuffer) {\n // Find events that should be dispatched\n const dueEvents: MetaTrackEvent[] = [];\n const remainingEvents: MetaTrackEvent[] = [];\n\n for (const event of events) {\n if (event.timestamp <= now) {\n // Check if event is too old (filter stale events)\n const ageSeconds = (now - event.timestamp) / 1000;\n if (ageSeconds <= this.maxMessageAge) {\n dueEvents.push(event);\n } else {\n this.log(`Filtering stale event (${ageSeconds.toFixed(1)}s old)`);\n }\n } else {\n remainingEvents.push(event);\n }\n }\n\n // Dispatch due events\n for (const event of dueEvents) {\n this.dispatchEvent(event);\n }\n\n // Update buffer with remaining events\n if (remainingEvents.length > 0) {\n this.timedEventBuffer.set(trackId, remainingEvents);\n } else {\n this.timedEventBuffer.delete(trackId);\n }\n }\n }\n\n /**\n * Add event to timed buffer (sorted by timestamp)\n * Used for events that should be dispatched at specific playback times\n */\n private addToTimedBuffer(event: MetaTrackEvent): void {\n const trackId = event.trackId;\n\n if (!this.timedEventBuffer.has(trackId)) {\n this.timedEventBuffer.set(trackId, []);\n }\n\n const buffer = this.timedEventBuffer.get(trackId)!;\n\n // Insert in sorted order by timestamp\n let insertIndex = buffer.length;\n for (let i = 0; i < buffer.length; i++) {\n if (buffer[i].timestamp > event.timestamp) {\n insertIndex = i;\n break;\n }\n }\n buffer.splice(insertIndex, 0, event);\n\n // Limit buffer size per track\n while (buffer.length > MetaTrackManager.MESSAGE_BUFFER_SIZE) {\n buffer.shift();\n }\n }\n\n /**\n * Check if we need to request more data (stay bufferAhead seconds ahead)\n * Returns true if buffer is running low\n */\n needsMoreData(trackId: string): boolean {\n const buffer = this.timedEventBuffer.get(trackId);\n if (!buffer || buffer.length === 0) return true;\n\n const lastEventTime = buffer[buffer.length - 1].timestamp / 1000;\n const currentTime = this.currentPlaybackTime;\n const bufferedAhead = lastEventTime - currentTime;\n\n return bufferedAhead < this.bufferAhead;\n }\n\n /**\n * Fast-forward through buffered events (rate-limited)\n * Used when playback jumps ahead and needs to catch up\n * Also notifies MistServer to fast-forward its metadata stream\n */\n fastForward(): void {\n const now = Date.now();\n\n // Rate limit fast-forward (once per fastForwardInterval seconds)\n if (now - this.lastFastForwardTime < this.fastForwardInterval * 1000) {\n return;\n }\n\n this.lastFastForwardTime = now;\n this.log('Fast-forwarding through buffered events');\n\n // Process all events up to current time + bufferAhead\n const targetTime = (this.currentPlaybackTime + this.bufferAhead) * 1000;\n\n for (const [trackId, events] of this.timedEventBuffer) {\n const processEvents: MetaTrackEvent[] = [];\n const remainingEvents: MetaTrackEvent[] = [];\n\n for (const event of events) {\n if (event.timestamp <= targetTime) {\n // Only dispatch if not too old\n const ageSeconds = (this.currentPlaybackTime * 1000 - event.timestamp) / 1000;\n if (ageSeconds <= this.maxMessageAge) {\n processEvents.push(event);\n }\n } else {\n remainingEvents.push(event);\n }\n }\n\n // Dispatch events\n for (const event of processEvents) {\n this.dispatchEvent(event);\n }\n\n // Update buffer\n if (remainingEvents.length > 0) {\n this.timedEventBuffer.set(trackId, remainingEvents);\n } else {\n this.timedEventBuffer.delete(trackId);\n }\n }\n\n // Tell MistServer to fast-forward as well\n this.sendFastForward(this.currentPlaybackTime + this.bufferAhead);\n }\n\n /**\n * Get buffer status for debugging\n */\n getBufferStatus(): Record<string, { count: number; oldestMs: number; newestMs: number }> {\n const status: Record<string, { count: number; oldestMs: number; newestMs: number }> = {};\n\n for (const [trackId, events] of this.timedEventBuffer) {\n if (events.length > 0) {\n status[trackId] = {\n count: events.length,\n oldestMs: events[0].timestamp,\n newestMs: events[events.length - 1].timestamp,\n };\n }\n }\n\n return status;\n }\n\n /**\n * Build WebSocket URL for MistServer meta track subscription\n * Uses the same endpoint as JSON info polling, just over WebSocket\n */\n private buildWsUrl(): string {\n const baseUrl = this.config.mistBaseUrl\n .replace(/^http:/, 'ws:')\n .replace(/^https:/, 'wss:')\n .replace(/\\/$/, '');\n\n // MistServer meta track WebSocket uses /json_<streamname>.js endpoint\n // The rate=1 param tells MistServer to stream metadata in real-time\n return `${baseUrl}/json_${this.config.streamName}.js?rate=1`;\n }\n\n /**\n * Send tracks update to MistServer\n * MistServer protocol: {type:\"tracks\", meta:\"1,2,3\"} (comma-separated track indices)\n */\n private sendTracksUpdate(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n const trackIds = Array.from(this.subscriptions.keys());\n // Support \"all\" as special track ID to subscribe to all meta tracks\n const metaValue = trackIds.includes('all') ? 'all' : trackIds.join(',');\n\n const message = JSON.stringify({\n type: 'tracks',\n meta: metaValue\n });\n this.ws.send(message);\n this.log(`Set tracks: ${metaValue}`);\n }\n }\n\n /**\n * Send seek command to MistServer\n * MistServer protocol: {type:\"seek\", seek_time:<ms>, ff_to:<ms>}\n */\n private sendSeek(timeInSeconds: number): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n const seekTimeMs = Math.round(timeInSeconds * 1000);\n const ffToMs = Math.round((timeInSeconds + this.bufferAhead) * 1000);\n\n const message = JSON.stringify({\n type: 'seek',\n seek_time: seekTimeMs,\n ff_to: ffToMs\n });\n this.ws.send(message);\n this.log(`Seek to ${timeInSeconds}s, buffer ahead to ${timeInSeconds + this.bufferAhead}s`);\n }\n }\n\n /**\n * Send hold command (pause metadata delivery)\n */\n private sendHold(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify({ type: 'hold' }));\n this.log('Sent hold');\n }\n }\n\n /**\n * Send play command (resume metadata delivery)\n */\n private sendPlay(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify({ type: 'play' }));\n this.log('Sent play');\n }\n }\n\n /**\n * Send fast-forward command\n */\n private sendFastForward(targetTimeSeconds: number): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n const message = JSON.stringify({\n type: 'fast_forward',\n ff_to: Math.round(targetTimeSeconds * 1000)\n });\n this.ws.send(message);\n this.log(`Fast-forward to ${targetTimeSeconds}s`);\n }\n }\n\n /**\n * Handle incoming WebSocket message\n * MistServer format:\n * - Metadata: {time:<ms>, track:<index>, data:{...}}\n * - Status: {type:\"on_time\", data:{current:<ms>}}\n * - Seek complete: {type:\"seek\", ...}\n */\n private handleMessage(data: string): void {\n try {\n const parsed = JSON.parse(data);\n\n // Handle metadata event: {time, track, data}\n if ('time' in parsed && 'track' in parsed && 'data' in parsed) {\n const event = this.parseMetaTrackEvent(parsed);\n\n // Check if we're subscribed to this track (or \"all\")\n const trackId = String(parsed.track);\n if (this.subscriptions.has(trackId) || this.subscriptions.has('all')) {\n // Subtitles and chapters should be buffered for timed playback\n // Other events (scores, generic events) dispatch immediately\n if (event.type === 'subtitle' || event.type === 'chapter') {\n this.addToTimedBuffer(event);\n // Also process immediately in case we're already past this time\n this.processTimedEvents();\n } else {\n // Dispatch immediately for non-timed events\n this.dispatchEvent(event);\n }\n }\n return;\n }\n\n // Handle server status messages: {type:..., ...}\n if ('type' in parsed) {\n switch (parsed.type) {\n case 'on_time':\n // Server time update - can be used for buffer management\n if (parsed.data?.current) {\n const serverTimeMs = parsed.data.current;\n const playerTimeMs = this.currentPlaybackTime * 1000;\n const aheadMs = serverTimeMs - playerTimeMs;\n\n // If server is too far ahead, pause and wait\n if (aheadMs > this.bufferAhead * 6 * 1000) {\n this.log(`Server ${aheadMs}ms ahead, sending hold`);\n this.sendHold();\n }\n }\n break;\n\n case 'seek':\n // Seek completed - clear buffers\n this.log('Server confirmed seek, clearing buffers');\n this.timedEventBuffer.clear();\n break;\n\n default:\n this.log(`Unknown message type: ${parsed.type}`);\n }\n }\n } catch (error) {\n this.log(`Failed to parse message: ${error}`);\n }\n }\n\n /**\n * Parse meta track event from MistServer message\n * MistServer format: {time:<ms>, track:<index>, data:{...}}\n */\n private parseMetaTrackEvent(message: {\n track: string | number;\n time: number;\n data?: unknown;\n [key: string]: unknown;\n }): MetaTrackEvent {\n const trackId = String(message.track);\n const timestamp = Number(message.time);\n const data = message.data ?? message;\n\n // Detect event type from data shape\n const type = this.detectEventType(data);\n\n return {\n type,\n timestamp,\n trackId,\n data,\n };\n }\n\n /**\n * Detect event type from data shape\n */\n private detectEventType(data: unknown): MetaTrackEventType {\n if (typeof data !== 'object' || data === null) {\n return 'unknown';\n }\n\n const obj = data as Record<string, unknown>;\n\n // Subtitle: has text, startTime/endTime\n if ('text' in obj && ('startTime' in obj || 'start' in obj)) {\n return 'subtitle';\n }\n\n // Score: has key and value\n if ('key' in obj && 'value' in obj) {\n return 'score';\n }\n\n // Chapter: has title and startTime\n if ('title' in obj && 'startTime' in obj) {\n return 'chapter';\n }\n\n // Event: has name\n if ('name' in obj) {\n return 'event';\n }\n\n return 'unknown';\n }\n\n /**\n * Dispatch event to subscribers\n */\n private dispatchEvent(event: MetaTrackEvent): void {\n const callbacks = this.subscriptions.get(event.trackId);\n if (callbacks) {\n for (const callback of callbacks) {\n try {\n callback(event);\n } catch (error) {\n console.error('[MetaTrackManager] Callback error:', error);\n }\n }\n }\n }\n\n /**\n * Schedule reconnection attempt\n */\n private scheduleReconnect(): void {\n if (this.state === 'disconnected') return;\n\n if (this.reconnectAttempt >= MetaTrackManager.MAX_RECONNECT_ATTEMPTS) {\n this.log('Max reconnect attempts reached');\n this.state = 'disconnected';\n return;\n }\n\n this.state = 'reconnecting';\n this.reconnectAttempt++;\n\n const delay = Math.min(\n MetaTrackManager.INITIAL_RECONNECT_DELAY * Math.pow(2, this.reconnectAttempt - 1),\n MetaTrackManager.MAX_RECONNECT_DELAY\n );\n\n this.log(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempt})`);\n\n this.timers.start(() => {\n this.connect();\n }, delay, 'reconnect');\n }\n\n /**\n * Buffer message for later delivery\n */\n private bufferMessage(event: MetaTrackEvent): void {\n this.messageBuffer.push(event);\n\n // Limit buffer size\n while (this.messageBuffer.length > MetaTrackManager.MESSAGE_BUFFER_SIZE) {\n this.messageBuffer.shift();\n }\n }\n\n /**\n * Flush buffered messages to subscribers\n */\n private flushMessageBuffer(): void {\n const buffered = [...this.messageBuffer];\n this.messageBuffer = [];\n\n for (const event of buffered) {\n this.dispatchEvent(event);\n }\n }\n\n /**\n * Debug logging\n */\n private log(message: string): void {\n if (this.debug) {\n console.debug(`[MetaTrackManager] ${message}`);\n }\n }\n}\n\nexport default MetaTrackManager;\n","/**\n * SeekingUtils.ts\n *\n * Centralized seeking and live detection logic for player controls.\n * Used by React, Svelte, and Vanilla wrappers to ensure consistent behavior.\n *\n * Key concepts:\n * - Seekable range: The portion of the stream that can be seeked to\n * - Live edge: The furthest point in time that can be played (live point)\n * - Near live: Whether playback is close enough to live edge to show \"LIVE\" badge\n * - Latency tier: Protocol-based classification affecting live detection thresholds\n */\n\nimport type { MistStreamInfo, MistTrackInfo } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type LatencyTier = 'ultra-low' | 'low' | 'medium' | 'high';\n\nexport interface LiveThresholds {\n /** Seconds behind live edge to exit \"LIVE\" state (become clickable) */\n exitLive: number;\n /** Seconds behind live edge to enter \"LIVE\" state (become non-clickable) */\n enterLive: number;\n}\n\nexport interface SeekableRange {\n /** Start of seekable range in seconds */\n seekableStart: number;\n /** End of seekable range (live edge) in seconds */\n liveEdge: number;\n}\n\nexport interface SeekableRangeParams {\n isLive: boolean;\n video: HTMLVideoElement | null;\n mistStreamInfo?: MistStreamInfo;\n currentTime: number;\n duration: number;\n}\n\nexport interface CanSeekParams {\n video: HTMLVideoElement | null;\n isLive: boolean;\n duration: number;\n bufferWindowMs?: number;\n playerCanSeek?: () => boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Latency tier thresholds for \"near live\" detection.\n * Different protocols have vastly different latency expectations.\n *\n * exitLive: How far behind (seconds) before we show \"behind live\" indicator\n * enterLive: How close to live (seconds) before we show \"LIVE\" badge again\n *\n * The gap between exitLive and enterLive creates hysteresis to prevent flicker.\n */\nexport const LATENCY_TIERS: Record<LatencyTier, LiveThresholds> = {\n // WebRTC/WHEP: sub-second latency\n 'ultra-low': { exitLive: 2, enterLive: 0.5 },\n // MEWS (WebSocket MP4): 2-5s latency\n 'low': { exitLive: 5, enterLive: 1.5 },\n // HLS/DASH: 10-30s latency (segment-based)\n 'medium': { exitLive: 15, enterLive: 5 },\n // Fallback for unknown protocols\n 'high': { exitLive: 30, enterLive: 10 },\n};\n\n/**\n * Playback speed presets for UI controls.\n */\nexport const SPEED_PRESETS = [0.5, 1, 1.5, 2] as const;\n\n/**\n * Default fallback buffer window when no other info available (in seconds).\n * Aligned with MistServer reference player's 60-second default.\n */\nexport const DEFAULT_BUFFER_WINDOW_SEC = 60;\n\n// ============================================================================\n// Pure Functions\n// ============================================================================\n\n/**\n * Detect latency tier from source type string.\n *\n * @param sourceType - MIME type or protocol identifier (e.g., 'whep', 'ws/video/mp4')\n * @returns Latency tier classification\n */\nexport function getLatencyTier(sourceType?: string): LatencyTier {\n if (!sourceType) return 'medium';\n const t = sourceType.toLowerCase();\n\n // Ultra-low: WebRTC protocols (sub-second latency)\n if (t === 'whep' || t === 'webrtc' || t.includes('mist/webrtc')) {\n return 'ultra-low';\n }\n\n // Low: WebSocket-based streaming (2-5s latency)\n if (t.startsWith('ws/') || t.startsWith('wss/')) {\n return 'low';\n }\n\n // Medium: HLS/DASH (segment-based, 10-30s latency)\n if (t.includes('mpegurl') || t.includes('dash')) {\n return 'medium';\n }\n\n // Progressive MP4/WebM - use medium defaults\n if (t.includes('video/mp4') || t.includes('video/webm')) {\n return 'medium';\n }\n\n return 'medium';\n}\n\n/**\n * Check if video element is using WebRTC/MediaStream source.\n * WebRTC streams have special constraints (no seeking, no playback rate changes).\n *\n * @param video - HTML video element\n * @returns true if source is a MediaStream\n */\nexport function isMediaStreamSource(video: HTMLVideoElement | null): boolean {\n if (!video) return false;\n return video.srcObject instanceof MediaStream;\n}\n\n/**\n * Check if playback rate adjustment is supported.\n * WebRTC/MediaStream sources don't support playback rate changes.\n *\n * @param video - HTML video element\n * @returns true if playback rate can be changed\n */\nexport function supportsPlaybackRate(video: HTMLVideoElement | null): boolean {\n if (!video) return true;\n return !isMediaStreamSource(video);\n}\n\n/**\n * Calculate seekable range for live or VOD streams.\n *\n * Priority order:\n * 1. Browser's video.seekable ranges (most accurate for MSE-based players)\n * 2. Track firstms/lastms from MistServer metadata\n * 3. buffer_window from MistServer signaling\n * 4. Fallback (only for non-WebRTC sources)\n *\n * @param params - Calculation parameters\n * @returns Seekable range with start and live edge\n */\nexport function calculateSeekableRange(params: SeekableRangeParams): SeekableRange {\n const { isLive, video, mistStreamInfo, currentTime, duration } = params;\n\n // VOD: full duration is seekable\n if (!isLive) {\n return { seekableStart: 0, liveEdge: duration };\n }\n\n const isMediaStream = isMediaStreamSource(video);\n\n // PRIORITY 1: Browser's video.seekable (most reliable - reflects actual browser state)\n if (video?.seekable && video.seekable.length > 0) {\n const start = video.seekable.start(0);\n const end = video.seekable.end(video.seekable.length - 1);\n if (Number.isFinite(start) && Number.isFinite(end) && end > start) {\n return { seekableStart: start, liveEdge: end };\n }\n }\n\n // PRIORITY 2: Track firstms/lastms from MistServer (accurate when available)\n // Skip for MediaStream - track data doesn't indicate seekable buffer\n if (!isMediaStream && mistStreamInfo?.meta?.tracks) {\n const tracks = Object.values(mistStreamInfo.meta.tracks) as MistTrackInfo[];\n if (tracks.length > 0) {\n const firstmsValues = tracks.map(t => t.firstms).filter((v): v is number => v !== undefined);\n const lastmsValues = tracks.map(t => t.lastms).filter((v): v is number => v !== undefined);\n\n if (firstmsValues.length > 0 && lastmsValues.length > 0) {\n const firstms = Math.max(...firstmsValues);\n const lastms = Math.min(...lastmsValues);\n return { seekableStart: firstms / 1000, liveEdge: lastms / 1000 };\n }\n }\n }\n\n // PRIORITY 3: buffer_window from MistServer signaling\n const bufferWindowMs = mistStreamInfo?.meta?.buffer_window;\n if (bufferWindowMs && bufferWindowMs > 0 && currentTime > 0) {\n const bufferWindowSec = bufferWindowMs / 1000;\n return {\n seekableStart: Math.max(0, currentTime - bufferWindowSec),\n liveEdge: currentTime,\n };\n }\n\n // PRIORITY 4: Fallback for non-WebRTC sources only\n // WebRTC has no DVR buffer by default, so don't create a fake seekable window\n // Use reference player's 60s default for other protocols\n if (!isMediaStream && currentTime > 0) {\n return {\n seekableStart: Math.max(0, currentTime - DEFAULT_BUFFER_WINDOW_SEC),\n liveEdge: currentTime,\n };\n }\n\n // For WebRTC or unknown: no seekable range (live only)\n return { seekableStart: currentTime, liveEdge: currentTime };\n}\n\n/**\n * Determine if seeking is supported for the current stream.\n *\n * @param params - Check parameters\n * @returns true if seeking is available\n */\nexport function canSeekStream(params: CanSeekParams): boolean {\n const { video, isLive, duration, bufferWindowMs, playerCanSeek } = params;\n\n // Player API says no\n if (playerCanSeek && !playerCanSeek()) {\n return false;\n }\n\n // Player API says yes - trust it for VOD, but require buffer for live\n if (playerCanSeek && playerCanSeek()) {\n if (!isLive) return true;\n return bufferWindowMs !== undefined && bufferWindowMs > 0;\n }\n\n // No video element\n if (!video) {\n return false;\n }\n\n // WebRTC/MediaStream: only if buffer_window explicitly configured\n if (isMediaStreamSource(video)) {\n return bufferWindowMs !== undefined && bufferWindowMs > 0;\n }\n\n // Browser reports seekable ranges\n if (video.seekable && video.seekable.length > 0) {\n return true;\n }\n\n // VOD with valid duration\n if (!isLive && Number.isFinite(duration) && duration > 0) {\n return true;\n }\n\n // Live with buffer_window configured\n if (isLive && bufferWindowMs !== undefined && bufferWindowMs > 0) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Calculate live detection thresholds, optionally scaled by buffer_window.\n *\n * For medium/high latency tiers, scales thresholds based on the actual\n * buffer window to provide more appropriate \"near live\" detection.\n *\n * @param sourceType - Protocol/MIME type for tier detection\n * @param isWebRTC - Whether source is WebRTC (overrides tier to ultra-low)\n * @param bufferWindowMs - Optional buffer window in milliseconds\n * @returns Thresholds for entering/exiting \"LIVE\" state\n */\nexport function calculateLiveThresholds(\n sourceType?: string,\n isWebRTC?: boolean,\n bufferWindowMs?: number\n): LiveThresholds {\n // Determine tier from source type, or use ultra-low for WebRTC\n const tier = sourceType ? getLatencyTier(sourceType) : (isWebRTC ? 'ultra-low' : 'medium');\n const tierThresholds = LATENCY_TIERS[tier];\n\n // For medium/high tiers, scale thresholds based on buffer_window\n if ((tier === 'medium' || tier === 'high') && bufferWindowMs && bufferWindowMs > 0) {\n const bufferWindowSec = bufferWindowMs / 1000;\n // Scale thresholds proportionally to buffer, with reasonable bounds\n return {\n exitLive: Math.max(tierThresholds.exitLive, Math.min(30, bufferWindowSec / 3)),\n enterLive: Math.max(tierThresholds.enterLive, Math.min(10, bufferWindowSec / 10)),\n };\n }\n\n return tierThresholds;\n}\n\n/**\n * Calculate whether playback is \"near live\" using hysteresis.\n *\n * Hysteresis prevents flip-flopping when hovering near the threshold:\n * - To EXIT \"LIVE\" state: must be > exitLive + margin behind\n * - To ENTER \"LIVE\" state: must be < enterLive - margin behind\n *\n * @param currentTime - Current playback position in seconds\n * @param liveEdge - Live edge position in seconds\n * @param thresholds - Enter/exit thresholds\n * @param currentState - Current isNearLive state\n * @returns New isNearLive state\n */\nexport function calculateIsNearLive(\n currentTime: number,\n liveEdge: number,\n thresholds: LiveThresholds,\n currentState: boolean\n): boolean {\n // Invalid state - assume live\n if (!Number.isFinite(liveEdge) || liveEdge <= 0) {\n return true;\n }\n\n const behindSeconds = liveEdge - currentTime;\n\n // Hysteresis margins for extra stability\n const exitMargin = 0.5;\n const enterMargin = 0.2;\n\n if (currentState && behindSeconds > thresholds.exitLive + exitMargin) {\n // Currently \"LIVE\" - switch to \"behind\" when significantly behind\n return false;\n } else if (!currentState && behindSeconds < thresholds.enterLive - enterMargin) {\n // Currently \"behind\" - switch to \"LIVE\" when close to live edge\n return true;\n }\n\n // No change\n return currentState;\n}\n\n/**\n * Determine if content is live based on available metadata.\n *\n * Priority:\n * 1. Explicit isContentLive flag (highest priority)\n * 2. MistServer stream type\n * 3. Duration check (non-finite = live)\n *\n * @param isContentLive - Explicit live flag from content metadata\n * @param mistStreamInfo - MistServer stream info\n * @param duration - Video duration\n * @returns true if content is live\n */\nexport function isLiveContent(\n isContentLive?: boolean,\n mistStreamInfo?: MistStreamInfo,\n duration?: number\n): boolean {\n // Explicit flag wins\n if (isContentLive !== undefined) {\n return isContentLive;\n }\n\n // MistServer type\n if (mistStreamInfo?.type) {\n return mistStreamInfo.type === 'live';\n }\n\n // Fallback: non-finite duration indicates live\n return !Number.isFinite(duration);\n}\n","/**\n * PlayerController.ts\n *\n * Main headless orchestrator for the player. This class encapsulates all business logic\n * (gateway resolution, stream state polling, player selection/initialization) in a\n * framework-agnostic manner.\n *\n * Both React and Vanilla wrappers use this class internally.\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport { GatewayClient, GatewayStatus } from './GatewayClient';\nimport { StreamStateClient } from './StreamStateClient';\nimport { PlayerManager } from './PlayerManager';\nimport { globalPlayerManager, ensurePlayersRegistered } from './PlayerRegistry';\nimport { ABRController } from './ABRController';\nimport { InteractionController, type InteractionControllerConfig } from './InteractionController';\nimport { MistReporter } from './MistReporter';\nimport { QualityMonitor } from './QualityMonitor';\nimport { MetaTrackManager } from './MetaTrackManager';\nimport {\n calculateSeekableRange,\n calculateLiveThresholds,\n calculateIsNearLive,\n canSeekStream,\n isMediaStreamSource,\n supportsPlaybackRate,\n isLiveContent,\n getLatencyTier,\n type LatencyTier,\n type LiveThresholds,\n} from './SeekingUtils';\nimport type { ABRMode, PlaybackQuality, ContentType } from '../types';\nimport type {\n ContentEndpoints,\n ContentMetadata,\n EndpointInfo,\n OutputEndpoint,\n OutputCapabilities,\n PlayerState,\n PlayerStateContext,\n StreamState,\n} from '../types';\nimport type { StreamInfo, StreamSource, StreamTrack, IPlayer, PlayerOptions as CorePlayerOptions } from './PlayerInterface';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PlayerControllerConfig {\n /** Content identifier (stream name) */\n contentId: string;\n /** Content type */\n contentType: ContentType;\n\n /** Pre-resolved endpoints (skip gateway) */\n endpoints?: ContentEndpoints;\n\n /** Gateway URL (for FrameWorks Gateway resolution) */\n gatewayUrl?: string;\n /** Direct MistServer base URL (bypasses Gateway, fetches json_{contentId}.js directly) */\n mistUrl?: string;\n /** Auth token for private streams */\n authToken?: string;\n\n /** Playback options */\n autoplay?: boolean;\n muted?: boolean;\n controls?: boolean;\n poster?: string;\n\n /** Debug logging */\n debug?: boolean;\n\n /** Custom PlayerManager instance (optional, uses global by default) */\n playerManager?: PlayerManager;\n\n // Dev mode overrides - passed to PlayerManager during player selection\n /** Force a specific player (e.g., 'hlsjs', 'dashjs', 'native') */\n forcePlayer?: string;\n /** Force a specific MIME type (e.g., 'html5/application/vnd.apple.mpegurl') */\n forceType?: string;\n /** Force a specific source index */\n forceSource?: number;\n /** Playback mode preference */\n playbackMode?: 'auto' | 'low-latency' | 'quality' | 'vod';\n}\n\nexport interface PlayerControllerEvents {\n /** Player state changed */\n stateChange: { state: PlayerState; context?: PlayerStateContext };\n /** Stream state changed (for live streams) */\n streamStateChange: { state: StreamState };\n /** Time update during playback */\n timeUpdate: { currentTime: number; duration: number };\n /** Error occurred */\n error: { error: string; code?: string };\n /** Error was cleared (auto-cleared or manually) */\n errorCleared: void;\n /** Player ready with video element */\n ready: { videoElement: HTMLVideoElement };\n /** Controller destroyed */\n destroyed: void;\n\n // ============================================================================\n // Playback Events (Phase A5)\n // ============================================================================\n\n /** Player/source was selected */\n playerSelected: { player: string; source: StreamSource; score: number };\n /** Quality level changed (ABR switch) */\n qualityChanged: { fromLevel?: string; toLevel: string };\n /** Volume or mute state changed */\n volumeChange: { volume: number; muted: boolean };\n /** Fullscreen state changed */\n fullscreenChange: { isFullscreen: boolean };\n /** Picture-in-Picture state changed */\n pipChange: { isPiP: boolean };\n /** Loop mode changed */\n loopChange: { isLoopEnabled: boolean };\n /** Playback rate changed */\n speedChange: { rate: number };\n /** User skipped forward */\n skipForward: { seconds: number };\n /** User skipped backward */\n skipBackward: { seconds: number };\n /** Speed hold started (hold-for-2x gesture) */\n holdSpeedStart: { speed: number };\n /** Speed hold ended */\n holdSpeedEnd: void;\n /** Captions/subtitles toggled */\n captionsChange: { enabled: boolean };\n\n // ============================================================================\n // Seeking & Live State Events (Centralized from wrappers)\n // ============================================================================\n\n /** Seeking/live state changed - emitted on timeupdate when values change */\n seekingStateChange: {\n seekableStart: number;\n liveEdge: number;\n canSeek: boolean;\n isNearLive: boolean;\n isLive: boolean;\n isWebRTC: boolean;\n latencyTier: LatencyTier;\n buffered: TimeRanges | null;\n hasAudio: boolean;\n supportsPlaybackRate: boolean;\n };\n\n // ============================================================================\n // Interaction Events (Phase A5)\n // ============================================================================\n\n /** User started hovering over player */\n hoverStart: void;\n /** User stopped hovering (after timeout) */\n hoverEnd: void;\n /** User became idle (no interaction for N seconds) */\n interactionIdle: void;\n /** User resumed interaction after being idle */\n interactionActive: void;\n\n // ============================================================================\n // Metadata Events (Phase A5)\n // ============================================================================\n\n /** Playback metadata updated */\n metadataUpdate: {\n currentTime: number;\n duration: number;\n bufferedAhead: number;\n qualityScore?: number;\n playerInfo?: { name: string; shortname: string };\n sourceInfo?: { url: string; type: string };\n isLive: boolean;\n isBuffering: boolean;\n isPaused: boolean;\n volume: number;\n muted: boolean;\n };\n}\n\n// ============================================================================\n// MistServer Source Type Mapping\n// ============================================================================\n\n/**\n * Complete MistServer source type mapping\n * Maps MistServer's `source[].type` field to player selection info\n *\n * type field = MIME type used for player selection\n * hrn = human readable name for UI\n * player = recommended player implementation\n * supported = whether we have a working player for it\n */\nexport const MIST_SOURCE_TYPES: Record<string, { hrn: string; player: string; supported: boolean }> = {\n // ===== VIDEO STREAMING (Primary) =====\n 'html5/application/vnd.apple.mpegurl': { hrn: 'HLS (TS)', player: 'hlsjs', supported: true },\n 'html5/application/vnd.apple.mpegurl;version=7': { hrn: 'HLS (CMAF)', player: 'hlsjs', supported: true },\n 'dash/video/mp4': { hrn: 'DASH', player: 'dashjs', supported: true },\n 'html5/video/mp4': { hrn: 'MP4 progressive', player: 'native', supported: true },\n 'html5/video/webm': { hrn: 'WebM progressive', player: 'native', supported: true },\n\n // ===== WEBSOCKET STREAMING =====\n 'ws/video/mp4': { hrn: 'MP4 WebSocket', player: 'mews', supported: true },\n 'wss/video/mp4': { hrn: 'MP4 WebSocket (SSL)', player: 'mews', supported: true },\n 'ws/video/raw': { hrn: 'Raw WebSocket', player: 'webcodecs', supported: true },\n 'wss/video/raw': { hrn: 'Raw WebSocket (SSL)', player: 'webcodecs', supported: true },\n 'ws/video/h264': { hrn: 'Annex B WebSocket', player: 'webcodecs', supported: true },\n 'wss/video/h264': { hrn: 'Annex B WebSocket (SSL)', player: 'webcodecs', supported: true },\n\n // ===== WEBRTC =====\n 'whep': { hrn: 'WebRTC (WHEP)', player: 'native', supported: true },\n 'webrtc': { hrn: 'WebRTC (WebSocket)', player: 'mist-webrtc', supported: true },\n\n // ===== AUDIO ONLY =====\n 'html5/audio/aac': { hrn: 'AAC progressive', player: 'native', supported: true },\n 'html5/audio/mp3': { hrn: 'MP3 progressive', player: 'native', supported: true },\n 'html5/audio/flac': { hrn: 'FLAC progressive', player: 'native', supported: true },\n 'html5/audio/wav': { hrn: 'WAV progressive', player: 'native', supported: true },\n\n // ===== SUBTITLES/TEXT =====\n 'html5/text/vtt': { hrn: 'WebVTT subtitles', player: 'track', supported: true },\n 'html5/text/plain': { hrn: 'SRT subtitles', player: 'track', supported: true },\n\n // ===== IMAGES =====\n 'html5/image/jpeg': { hrn: 'JPEG thumbnail', player: 'image', supported: true },\n\n // ===== METADATA =====\n 'html5/text/javascript': { hrn: 'JSON metadata', player: 'fetch', supported: true },\n\n // ===== LEGACY/UNSUPPORTED =====\n 'html5/video/mpeg': { hrn: 'TS progressive', player: 'none', supported: false },\n 'html5/video/h264': { hrn: 'Annex B progressive', player: 'none', supported: false },\n 'html5/application/sdp': { hrn: 'SDP', player: 'none', supported: false },\n 'html5/application/vnd.ms-sstr+xml': { hrn: 'Smooth Streaming', player: 'none', supported: false },\n 'flash/7': { hrn: 'FLV', player: 'none', supported: false },\n 'flash/10': { hrn: 'RTMP', player: 'none', supported: false },\n 'flash/11': { hrn: 'HDS', player: 'none', supported: false },\n\n // ===== SERVER-SIDE ONLY =====\n 'rtsp': { hrn: 'RTSP', player: 'none', supported: false },\n 'srt': { hrn: 'SRT', player: 'none', supported: false },\n 'dtsc': { hrn: 'DTSC', player: 'none', supported: false },\n};\n\n/**\n * Map Gateway protocol names to MistServer MIME types\n * Gateway outputs use simplified protocol names like \"HLS\", \"WHEP\"\n * while MistServer uses full MIME types\n */\nexport const PROTOCOL_TO_MIME: Record<string, string> = {\n // Standard protocols\n 'HLS': 'html5/application/vnd.apple.mpegurl',\n 'DASH': 'dash/video/mp4',\n 'MP4': 'html5/video/mp4',\n 'WEBM': 'html5/video/webm',\n 'WHEP': 'whep',\n 'WebRTC': 'webrtc',\n\n // WebSocket variants\n 'MEWS': 'ws/video/mp4',\n 'MEWS_WS': 'ws/video/mp4',\n 'MEWS_WSS': 'wss/video/mp4',\n 'RAW_WS': 'ws/video/raw',\n 'RAW_WSS': 'wss/video/raw',\n\n // Audio\n 'AAC': 'html5/audio/aac',\n 'MP3': 'html5/audio/mp3',\n 'FLAC': 'html5/audio/flac',\n 'WAV': 'html5/audio/wav',\n\n // Subtitles\n 'VTT': 'html5/text/vtt',\n 'SRT': 'html5/text/plain',\n\n // CMAF variants\n 'CMAF': 'html5/application/vnd.apple.mpegurl;version=7',\n 'HLS_CMAF': 'html5/application/vnd.apple.mpegurl;version=7',\n\n // Images\n 'JPEG': 'html5/image/jpeg',\n 'JPG': 'html5/image/jpeg',\n\n // MistServer specific\n 'HTTP': 'html5/video/mp4', // Default HTTP is MP4\n 'MIST_HTML': 'mist/html',\n 'PLAYER_JS': 'mist/html',\n};\n\n/**\n * Get the MIME type for a Gateway protocol name\n */\nexport function getMimeTypeForProtocol(protocol: string): string {\n return PROTOCOL_TO_MIME[protocol] || PROTOCOL_TO_MIME[protocol.toUpperCase()] || protocol;\n}\n\n/**\n * Get source type info for a MIME type\n */\nexport function getSourceTypeInfo(mimeType: string): { hrn: string; player: string; supported: boolean } | undefined {\n return MIST_SOURCE_TYPES[mimeType];\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction mapCodecLabel(codecstr: string): string {\n const c = codecstr.toLowerCase();\n if (c.startsWith('avc1')) return 'H264';\n if (c.startsWith('hev1') || c.startsWith('hvc1')) return 'HEVC';\n if (c.startsWith('av01')) return 'AV1';\n if (c.startsWith('vp09')) return 'VP9';\n if (c.startsWith('vp8')) return 'VP8';\n if (c.startsWith('mp4a')) return 'AAC';\n if (c.includes('opus')) return 'Opus';\n if (c.includes('ec-3') || c.includes('ac3')) return 'AC3';\n return codecstr;\n}\n\n// ============================================================================\n// Standalone Stream Info Builder\n// ============================================================================\n\n/**\n * Build StreamInfo from Gateway ContentEndpoints.\n *\n * This function extracts playback sources and track information from\n * the Gateway's resolved endpoint data. It handles:\n * - Parsing `outputs` JSON string (GraphQL returns JSON scalar as string)\n * - Converting output protocols to StreamSource format\n * - Deriving track info from capabilities\n *\n * Use this for VOD/clip content where Gateway data is sufficient,\n * without waiting for MistServer to load the stream.\n *\n * @param endpoints - ContentEndpoints from Gateway resolution\n * @param contentId - Stream/content identifier\n * @returns StreamInfo with sources and tracks, or null if no valid data\n */\nexport function buildStreamInfoFromEndpoints(\n endpoints: ContentEndpoints,\n contentId: string\n): StreamInfo | null {\n const primary = endpoints.primary as EndpointInfo | undefined;\n if (!primary) return null;\n\n // Parse outputs if it's a JSON string (GraphQL returns JSON scalar as string)\n let outputs: Record<string, OutputEndpoint> = {};\n if (primary.outputs) {\n if (typeof primary.outputs === 'string') {\n try {\n outputs = JSON.parse(primary.outputs);\n } catch (e) {\n console.warn('[buildStreamInfoFromEndpoints] Failed to parse outputs JSON');\n outputs = {};\n }\n } else {\n outputs = primary.outputs as Record<string, OutputEndpoint>;\n }\n }\n\n const sources: StreamSource[] = [];\n const oKeys = Object.keys(outputs);\n\n // Helper to attach MistServer sources\n const attachMistSource = (html?: string, playerJs?: string) => {\n if (!html && !playerJs) return;\n const src: StreamSource = {\n url: html || playerJs || '',\n type: 'mist/html',\n streamName: contentId,\n } as StreamSource;\n if (playerJs) {\n (src as any).mistPlayerUrl = playerJs;\n }\n sources.push(src);\n };\n\n if (oKeys.length) {\n const html = outputs['MIST_HTML']?.url;\n const pjs = outputs['PLAYER_JS']?.url;\n attachMistSource(html, pjs);\n\n // Process all outputs using PROTOCOL_TO_MIME mapping\n // Skip MIST_HTML and PLAYER_JS (already handled above)\n const skipProtocols = new Set(['MIST_HTML', 'PLAYER_JS']);\n\n for (const protocol of oKeys) {\n if (skipProtocols.has(protocol)) continue;\n\n const output = outputs[protocol];\n if (!output?.url) continue;\n\n // Convert Gateway protocol name to MistServer MIME type\n const mimeType = getMimeTypeForProtocol(protocol);\n\n // Check if this source type is supported\n const sourceInfo = getSourceTypeInfo(mimeType);\n if (sourceInfo && !sourceInfo.supported) {\n // Skip unsupported source types\n continue;\n }\n\n sources.push({ url: output.url, type: mimeType });\n }\n } else if (primary) {\n // Fallback: single primary URL\n sources.push({\n url: primary.url,\n type: primary.protocol || 'mist/html',\n streamName: contentId,\n } as StreamSource);\n }\n\n // Derive tracks from capabilities\n const tracks: StreamTrack[] = [];\n const pushCodecTracks = (cap?: OutputCapabilities) => {\n if (!cap) return;\n const codecs = cap.codecs || [];\n const addTrack = (type: 'video' | 'audio', codecstr: string) => {\n tracks.push({ type, codec: mapCodecLabel(codecstr), codecstring: codecstr });\n };\n codecs.forEach((c) => {\n const lc = c.toLowerCase();\n if (\n lc.startsWith('avc1') ||\n lc.startsWith('hev1') ||\n lc.startsWith('hvc1') ||\n lc.startsWith('vp') ||\n lc.startsWith('av01')\n ) {\n addTrack('video', c);\n } else if (\n lc.startsWith('mp4a') ||\n lc.includes('opus') ||\n lc.includes('vorbis') ||\n lc.includes('ac3') ||\n lc.includes('ec-3')\n ) {\n addTrack('audio', c);\n }\n });\n if (!codecs.length) {\n // Fallback codecs with valid codecstrings for cold-start playback\n if (cap.hasVideo) tracks.push({ type: 'video', codec: 'H264', codecstring: 'avc1.42E01E' });\n if (cap.hasAudio) tracks.push({ type: 'audio', codec: 'AAC', codecstring: 'mp4a.40.2' });\n }\n };\n Object.values(outputs).forEach((out) => pushCodecTracks(out.capabilities));\n if (!tracks.length) {\n // Fallback with valid codecstring for cold-start playback\n tracks.push({ type: 'video', codec: 'H264', codecstring: 'avc1.42E01E' });\n }\n\n // Determine content type from metadata\n const contentType: 'live' | 'vod' = endpoints.metadata?.isLive === false ? 'vod' : 'live';\n\n return sources.length ? { source: sources, meta: { tracks }, type: contentType } : null;\n}\n\n// ============================================================================\n// PlayerController Class\n// ============================================================================\n\n/**\n * Headless player controller that manages the entire player lifecycle.\n *\n * @example\n * ```typescript\n * const controller = new PlayerController({\n * contentId: 'my-stream',\n * contentType: 'live',\n * gatewayUrl: 'https://gateway.example.com/graphql',\n * });\n *\n * controller.on('stateChange', ({ state }) => console.log('State:', state));\n * controller.on('ready', ({ videoElement }) => console.log('Ready!'));\n *\n * const container = document.getElementById('player');\n * await controller.attach(container);\n *\n * // Later...\n * controller.destroy();\n * ```\n */\nexport class PlayerController extends TypedEventEmitter<PlayerControllerEvents> {\n private config: PlayerControllerConfig;\n private state: PlayerState = 'booting';\n private lastEmittedState: PlayerState | null = null;\n\n private gatewayClient: GatewayClient | null = null;\n private streamStateClient: StreamStateClient | null = null;\n private playerManager: PlayerManager;\n\n private currentPlayer: IPlayer | null = null;\n private videoElement: HTMLVideoElement | null = null;\n private container: HTMLElement | null = null;\n\n private endpoints: ContentEndpoints | null = null;\n private streamInfo: StreamInfo | null = null;\n private streamState: StreamState | null = null;\n /** Tracks parsed from MistServer JSON response (used for direct MistServer mode) */\n private mistTracks: StreamTrack[] | null = null;\n\n private cleanupFns: Array<() => void> = [];\n private isDestroyed: boolean = false;\n private isAttached: boolean = false;\n\n // ============================================================================\n // Internal State Tracking (Phase A1)\n // ============================================================================\n private _isBuffering: boolean = false;\n private _hasPlaybackStarted: boolean = false;\n private _errorText: string | null = null;\n private _isPassiveError: boolean = false;\n private _isHoldingSpeed: boolean = false;\n private _holdSpeed: number = 2;\n private _isLoopEnabled: boolean = false;\n private _currentPlayerInfo: { name: string; shortname: string } | null = null;\n private _currentSourceInfo: { url: string; type: string } | null = null;\n\n // One-shot force options (used once by selectCombo, then cleared)\n private _pendingForceOptions: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n } | null = null;\n\n // ============================================================================\n // Error Handling State (Phase A3)\n // ============================================================================\n private _errorShownAt: number = 0;\n private _errorCleared: boolean = false;\n private _isTransitioning: boolean = false;\n private _errorCount: number = 0;\n private _lastErrorTime: number = 0;\n\n // ============================================================================\n // Stream State Tracking (Phase A4)\n // ============================================================================\n private _prevStreamIsOnline: boolean | undefined = undefined;\n\n // ============================================================================\n // Hover/Controls Visibility (Phase A5b)\n // ============================================================================\n private _isHovering: boolean = false;\n private _hoverTimeout: ReturnType<typeof setTimeout> | null = null;\n private static readonly HOVER_HIDE_DELAY_MS = 3000;\n private static readonly HOVER_LEAVE_DELAY_MS = 200;\n\n // ============================================================================\n // Subtitles/Captions (Phase A5b audit)\n // ============================================================================\n private _subtitlesEnabled: boolean = false;\n\n // ============================================================================\n // Stall Detection (Phase A5b audit)\n // ============================================================================\n private _stallStartTime: number = 0;\n private static readonly HARD_FAILURE_STALL_THRESHOLD_MS = 30000; // 30 seconds sustained stall\n\n // ============================================================================\n // Seeking & Live Detection State (Centralized from wrappers)\n // ============================================================================\n private _seekableStart: number = 0;\n private _liveEdge: number = 0;\n private _canSeek: boolean = false;\n private _isNearLive: boolean = true;\n private _latencyTier: LatencyTier = 'medium';\n private _liveThresholds: LiveThresholds = { exitLive: 15, enterLive: 5 };\n private _buffered: TimeRanges | null = null;\n private _hasAudio: boolean = true;\n private _supportsPlaybackRate: boolean = true;\n private _isWebRTC: boolean = false;\n\n // Error handling constants\n private static readonly AUTO_CLEAR_ERROR_DELAY_MS = 2000;\n private static readonly HARD_FAILURE_ERROR_THRESHOLD = 5;\n private static readonly HARD_FAILURE_ERROR_WINDOW_MS = 60000;\n private static readonly FATAL_ERROR_KEYWORDS = [\n 'fatal', 'network error', 'media error', 'decode error', 'source not supported'\n ];\n\n // ============================================================================\n // Sub-Controllers (Phase A2)\n // ============================================================================\n private abrController: ABRController | null = null;\n private interactionController: InteractionController | null = null;\n private mistReporter: MistReporter | null = null;\n private qualityMonitor: QualityMonitor | null = null;\n private metaTrackManager: MetaTrackManager | null = null;\n private _playbackQuality: PlaybackQuality | null = null;\n private bootMs: number = Date.now();\n\n constructor(config: PlayerControllerConfig) {\n super();\n this.config = config;\n this.playerManager = config.playerManager || globalPlayerManager;\n\n // Load loop state from localStorage\n try {\n if (typeof localStorage !== 'undefined') {\n this._isLoopEnabled = localStorage.getItem('frameworks-player-loop') === 'true';\n }\n } catch {\n // localStorage not available\n }\n }\n\n // ============================================================================\n // Lifecycle Methods\n // ============================================================================\n\n /**\n * Attach to a container element and start the player lifecycle.\n * This is the main entry point after construction.\n */\n async attach(container: HTMLElement): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('PlayerController is destroyed and cannot be reused');\n }\n if (this.isAttached) {\n this.log('Already attached, detaching first');\n this.detach();\n }\n\n this.container = container;\n this.isAttached = true;\n this.setState('booting');\n\n try {\n // Ensure players are registered\n ensurePlayersRegistered();\n\n // Step 1: Resolve endpoints\n await this.resolveEndpoints();\n\n // Guard against zombie operations (React Strict Mode cleanup)\n if (this.isDestroyed || !this.container) {\n this.log('[attach] Aborted - controller destroyed during endpoint resolution');\n return;\n }\n\n if (!this.endpoints?.primary) {\n this.setState('no_endpoint', { gatewayStatus: 'error' });\n return;\n }\n\n // Step 2: Start stream state polling (for live content)\n this.startStreamStatePolling();\n\n // Step 3: Build StreamInfo and initialize player\n this.streamInfo = this.buildStreamInfo(this.endpoints);\n\n if (!this.streamInfo || this.streamInfo.source.length === 0) {\n this.setState('error', { error: 'No playable sources found' });\n this.emit('error', { error: 'No playable sources found' });\n return;\n }\n\n // Guard again before player init (async boundary)\n if (this.isDestroyed || !this.container) {\n this.log('[attach] Aborted - controller destroyed before player init');\n return;\n }\n\n await this.initializePlayer();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n this.setState('error', { error: message });\n this.emit('error', { error: message });\n\n // Even if initial resolution failed (e.g., stream offline), start polling\n // so we can detect when the stream comes online and re-initialize\n if (this.config.mistUrl && !this.streamStateClient) {\n this.log('[attach] Starting stream polling despite resolution failure');\n this.startStreamStatePolling();\n }\n }\n }\n\n /**\n * Detach from the current container and clean up resources.\n * The controller can be re-attached to a new container.\n */\n detach(): void {\n this.cleanup();\n this.clearHoverTimeout();\n this.isAttached = false;\n this.container = null;\n this.endpoints = null;\n this.streamInfo = null;\n this.streamState = null;\n this.videoElement = null;\n this.currentPlayer = null;\n this.lastEmittedState = null;\n this._isHovering = false;\n }\n\n /**\n * Fully destroy the controller. Cannot be reused after this.\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n this.detach();\n this.setState('destroyed');\n this.emit('destroyed', undefined as never);\n this.removeAllListeners();\n this.isDestroyed = true;\n }\n\n // ============================================================================\n // State Getters\n // ============================================================================\n\n /** Get current player state */\n getState(): PlayerState {\n return this.state;\n }\n\n /** Get current stream state (for live streams) */\n getStreamState(): StreamState | null {\n return this.streamState;\n }\n\n /** Get resolved endpoints */\n getEndpoints(): ContentEndpoints | null {\n return this.endpoints;\n }\n\n /** Get content metadata (title, description, duration, etc.) */\n getMetadata(): ContentMetadata | null {\n return this.endpoints?.metadata ?? null;\n }\n\n /** Get stream info (sources + tracks for player selection) */\n getStreamInfo(): StreamInfo | null {\n return this.streamInfo;\n }\n\n /** Get video element (null if not ready) */\n getVideoElement(): HTMLVideoElement | null {\n return this.videoElement;\n }\n\n /** Get current player instance */\n getPlayer(): IPlayer | null {\n return this.currentPlayer;\n }\n\n /** Check if player is ready */\n isReady(): boolean {\n return this.videoElement !== null;\n }\n\n // ============================================================================\n // Extended State Getters (Phase A1)\n // ============================================================================\n\n /** Check if video is currently playing (not paused) */\n isPlaying(): boolean {\n return this.videoElement ? !this.videoElement.paused : false;\n }\n\n /** Check if currently buffering */\n isBuffering(): boolean {\n return this._isBuffering;\n }\n\n /** Get current error message (null if no error) */\n getError(): string | null {\n return this._errorText;\n }\n\n /** Check if error is passive (video still playing despite error) */\n isPassiveError(): boolean {\n return this._isPassiveError;\n }\n\n /** Check if playback has ever started (for idle screen logic) */\n hasPlaybackStarted(): boolean {\n return this._hasPlaybackStarted;\n }\n\n /** Check if currently holding for speed boost */\n isHoldingSpeed(): boolean {\n return this._isHoldingSpeed;\n }\n\n /** Get current hold speed value */\n getHoldSpeed(): number {\n return this._holdSpeed;\n }\n\n /** Get current player implementation info */\n getCurrentPlayerInfo(): { name: string; shortname: string } | null {\n return this._currentPlayerInfo;\n }\n\n /** Get current source info (URL and type) */\n getCurrentSourceInfo(): { url: string; type: string } | null {\n return this._currentSourceInfo;\n }\n\n /** Get current volume (0-1) */\n getVolume(): number {\n return this.videoElement?.volume ?? 1;\n }\n\n /** Check if loop mode is enabled */\n isLoopEnabled(): boolean {\n return this._isLoopEnabled;\n }\n\n /** Check if subtitles/captions are enabled */\n isSubtitlesEnabled(): boolean {\n return this._subtitlesEnabled;\n }\n\n /** Set subtitles/captions enabled state */\n setSubtitlesEnabled(enabled: boolean): void {\n if (this._subtitlesEnabled === enabled) return;\n this._subtitlesEnabled = enabled;\n // Apply to video text tracks if available\n if (this.videoElement) {\n const tracks = this.videoElement.textTracks;\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n if (track.kind === 'subtitles' || track.kind === 'captions') {\n track.mode = enabled ? 'showing' : 'hidden';\n }\n }\n }\n this.emit('captionsChange', { enabled });\n }\n\n /** Toggle subtitles/captions */\n toggleSubtitles(): void {\n this.setSubtitlesEnabled(!this._subtitlesEnabled);\n }\n\n // ============================================================================\n // Seeking & Live State Getters (Centralized from wrappers)\n // ============================================================================\n\n /** Get start of seekable range (seconds) */\n getSeekableStart(): number {\n return this._seekableStart;\n }\n\n /** Get live edge / end of seekable range (seconds) */\n getLiveEdge(): number {\n return this._liveEdge;\n }\n\n /** Check if seeking is currently available */\n canSeekStream(): boolean {\n return this._canSeek;\n }\n\n /** Check if playback is near the live edge (for live badge display) */\n isNearLive(): boolean {\n return this._isNearLive;\n }\n\n /** Get buffered ranges, preferring player override when available */\n getBufferedRanges(): TimeRanges | null {\n if (this.currentPlayer && typeof this.currentPlayer.getBufferedRanges === 'function') {\n return this.currentPlayer.getBufferedRanges();\n }\n return this.videoElement?.buffered ?? null;\n }\n\n /** Get current latency tier based on protocol */\n getLatencyTier(): LatencyTier {\n return this._latencyTier;\n }\n\n /** Get live thresholds for entering/exiting \"LIVE\" state */\n getLiveThresholds(): LiveThresholds {\n return this._liveThresholds;\n }\n\n /** Get buffered time ranges */\n getBuffered(): TimeRanges | null {\n return this._buffered;\n }\n\n /** Check if stream has audio track */\n hasAudioTrack(): boolean {\n return this._hasAudio;\n }\n\n /** Check if playback rate adjustment is supported */\n canAdjustPlaybackRate(): boolean {\n return this._supportsPlaybackRate;\n }\n\n /** Check if source is WebRTC/MediaStream */\n isWebRTCSource(): boolean {\n return this._isWebRTC;\n }\n\n /** Check if currently in fullscreen mode */\n isFullscreen(): boolean {\n if (typeof document === 'undefined') return false;\n return document.fullscreenElement === this.container;\n }\n\n /** Check if content is effectively live (live or DVR still recording) */\n isEffectivelyLive(): boolean {\n const { contentType } = this.config;\n const metadata = this.getMetadata();\n return contentType === 'live' || (contentType === 'dvr' && metadata?.dvrStatus === 'recording');\n }\n\n /** Check if content is strictly live (not DVR/clip/vod) */\n isLive(): boolean {\n return this.config.contentType === 'live';\n }\n\n /**\n * Check if content needs cold start (VOD-like loading).\n * True for: clips, DVR (recording OR completed) - any stored/VOD content\n * False for: live streams only (real-time MistServer stream)\n * DVR-while-recording needs cold start because MistServer may not be serving the VOD yet\n */\n needsColdStart(): boolean {\n return this.config.contentType !== 'live';\n }\n\n /**\n * Check if we should show idle/loading screen.\n * Logic:\n * - For cold start content (VOD/DVR): Show loading only while waiting for Gateway sources\n * - For live streams: Show loading while waiting for MistServer to come online\n * - Never show idle after playback has started (unless explicit error)\n */\n shouldShowIdleScreen(): boolean {\n // Never show idle after playback has started\n if (this._hasPlaybackStarted) return false;\n\n if (this.needsColdStart()) {\n // VOD content (clips, DVR recording or completed): DON'T wait for MistServer\n // Use Gateway sources immediately - MistServer will cold start when player requests\n // Show loading only while waiting for Gateway sources (not MistServer)\n const sources = this.streamInfo?.source ?? [];\n return sources.length === 0;\n } else {\n // Live streams: Wait for MistServer online status\n if (!this.streamState?.isOnline || this.streamState?.status !== 'ONLINE') {\n return true;\n }\n // Show loading if no stream info or sources\n if (!this.streamInfo || (this.streamInfo.source?.length ?? 0) === 0) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Get the effective content type for playback mode selection.\n * This ensures WHEP/WebRTC gets penalized for VOD content (no seek support)\n * while HLS/MP4 are preferred for clips and completed DVR recordings.\n */\n getEffectiveContentType(): 'live' | 'vod' {\n return this.isEffectivelyLive() ? 'live' : 'vod';\n }\n\n // ============================================================================\n // Hover/Controls Visibility (Phase A5b)\n // ============================================================================\n\n /** Check if user is currently hovering over the player */\n isHovering(): boolean {\n return this._isHovering;\n }\n\n /**\n * Check if controls should be visible.\n * Controls are visible when:\n * - User is hovering over the player\n * - Video is paused\n * - There's an error\n */\n shouldShowControls(): boolean {\n return this._isHovering || this.isPaused() || this._errorText !== null;\n }\n\n /**\n * Handle mouse enter event - show controls immediately.\n * Call this from your UI wrapper's onMouseEnter handler.\n */\n handleMouseEnter(): void {\n this.clearHoverTimeout();\n if (!this._isHovering) {\n this._isHovering = true;\n this.emit('hoverStart', undefined as never);\n }\n }\n\n /**\n * Handle mouse leave event - hide controls after delay.\n * Call this from your UI wrapper's onMouseLeave handler.\n */\n handleMouseLeave(): void {\n this.clearHoverTimeout();\n this._hoverTimeout = setTimeout(() => {\n if (this._isHovering) {\n this._isHovering = false;\n this.emit('hoverEnd', undefined as never);\n }\n }, PlayerController.HOVER_LEAVE_DELAY_MS);\n }\n\n /**\n * Handle mouse move event - show controls and reset hide timer.\n * Call this from your UI wrapper's onMouseMove handler.\n */\n handleMouseMove(): void {\n if (!this._isHovering) {\n this._isHovering = true;\n this.emit('hoverStart', undefined as never);\n }\n // Reset hide timeout on any movement\n this.clearHoverTimeout();\n this._hoverTimeout = setTimeout(() => {\n if (this._isHovering) {\n this._isHovering = false;\n this.emit('hoverEnd', undefined as never);\n }\n }, PlayerController.HOVER_HIDE_DELAY_MS);\n }\n\n /**\n * Handle touch start event - show controls.\n * Call this from your UI wrapper's onTouchStart handler.\n */\n handleTouchStart(): void {\n this.handleMouseEnter();\n // Reset hide timer for touch\n this.clearHoverTimeout();\n this._hoverTimeout = setTimeout(() => {\n if (this._isHovering) {\n this._isHovering = false;\n this.emit('hoverEnd', undefined as never);\n }\n }, PlayerController.HOVER_HIDE_DELAY_MS);\n }\n\n /** Clear hover timeout */\n private clearHoverTimeout(): void {\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n this._hoverTimeout = null;\n }\n }\n\n /** Get current playback rate */\n getPlaybackRate(): number {\n return this.videoElement?.playbackRate ?? 1;\n }\n\n /** Get playback quality metrics from QualityMonitor */\n getPlaybackQuality(): PlaybackQuality | null {\n return this._playbackQuality;\n }\n\n /** Get current ABR mode */\n getABRMode(): ABRMode {\n return this.abrController?.getMode() ?? 'auto';\n }\n\n /** Set ABR mode at runtime */\n setABRMode(mode: ABRMode): void {\n this.abrController?.setMode(mode);\n }\n\n // ============================================================================\n // Playback Control\n // ============================================================================\n\n /** Start playback */\n async play(): Promise<void> {\n if (this.videoElement) {\n await this.videoElement.play();\n }\n }\n\n /** Pause playback */\n pause(): void {\n this.videoElement?.pause();\n }\n\n /** Seek to time */\n seek(time: number): void {\n // Use player-specific seek if available (for WebCodecs, MEWS, etc.)\n if (this.currentPlayer?.seek) {\n this.currentPlayer.seek(time);\n return;\n }\n // Fallback to direct video element seek\n if (this.videoElement) {\n this.videoElement.currentTime = time;\n }\n }\n\n /** Set volume (0-1) */\n setVolume(volume: number): void {\n if (this.videoElement) {\n const newVolume = Math.max(0, Math.min(1, volume));\n this.videoElement.volume = newVolume;\n this.emit('volumeChange', { volume: newVolume, muted: this.videoElement.muted });\n }\n }\n\n /** Set muted state */\n setMuted(muted: boolean): void {\n if (this.currentPlayer?.setMuted) {\n this.currentPlayer.setMuted(muted);\n } else if (this.videoElement) {\n this.videoElement.muted = muted;\n }\n if (this.videoElement) {\n this.emit('volumeChange', { volume: this.videoElement.volume, muted });\n }\n }\n\n /** Set playback rate */\n setPlaybackRate(rate: number): void {\n if (this.currentPlayer?.setPlaybackRate) {\n this.currentPlayer.setPlaybackRate(rate);\n } else if (this.videoElement) {\n this.videoElement.playbackRate = rate;\n }\n this.emit('speedChange', { rate });\n }\n\n /** Jump to live edge (for live streams) */\n jumpToLive(): void {\n // Try player-specific implementation first (WebCodecs uses server time)\n if (this.currentPlayer?.jumpToLive) {\n this.currentPlayer.jumpToLive();\n this._isNearLive = true;\n this.emitSeekingState();\n return;\n }\n\n const el = this.videoElement;\n if (!el) return;\n\n // For WebRTC/MediaStream: we're always at live, nothing to do\n if (isMediaStreamSource(el)) {\n this._isNearLive = true;\n this.emitSeekingState();\n return;\n }\n\n // Try browser's seekable range first (most reliable for HLS/DASH/MEWS)\n if (el.seekable && el.seekable.length > 0) {\n const liveEdge = el.seekable.end(el.seekable.length - 1);\n if (Number.isFinite(liveEdge) && liveEdge > 0) {\n el.currentTime = liveEdge;\n this._isNearLive = true;\n this.emitSeekingState();\n return;\n }\n }\n\n // Try our computed live edge (from MistServer metadata)\n if (this._liveEdge > 0 && Number.isFinite(this._liveEdge)) {\n el.currentTime = this._liveEdge;\n this._isNearLive = true;\n this.emitSeekingState();\n return;\n }\n\n // Fallback: seek to duration (for VOD or finite-duration live)\n if (Number.isFinite(el.duration) && el.duration > 0) {\n el.currentTime = el.duration;\n this._isNearLive = true;\n this.emitSeekingState();\n }\n }\n\n /** Emit current seeking state */\n private emitSeekingState(): void {\n this.emit('seekingStateChange', {\n seekableStart: this._seekableStart,\n liveEdge: this._liveEdge,\n canSeek: this._canSeek,\n isNearLive: this._isNearLive,\n isLive: this.isEffectivelyLive(),\n isWebRTC: this._isWebRTC,\n latencyTier: this._latencyTier,\n buffered: this._buffered,\n hasAudio: this._hasAudio,\n supportsPlaybackRate: this._supportsPlaybackRate,\n });\n }\n\n /** Request fullscreen */\n async requestFullscreen(): Promise<void> {\n if (this.container) {\n await this.container.requestFullscreen();\n }\n }\n\n /** Request Picture-in-Picture */\n async requestPiP(): Promise<void> {\n if (this.currentPlayer?.requestPiP) {\n await this.currentPlayer.requestPiP();\n } else if (this.videoElement && 'requestPictureInPicture' in this.videoElement) {\n await (this.videoElement as any).requestPictureInPicture();\n }\n }\n\n /** Get available quality levels */\n getQualities(): Array<{ id: string; label: string; bitrate?: number; width?: number; height?: number; isAuto?: boolean; active?: boolean }> {\n return this.currentPlayer?.getQualities?.() ?? [];\n }\n\n /** Select a quality level */\n selectQuality(id: string): void {\n this.currentPlayer?.selectQuality?.(id);\n }\n\n /** Get available text tracks */\n getTextTracks(): Array<{ id: string; label: string; lang?: string; active: boolean }> {\n return this.currentPlayer?.getTextTracks?.() ?? [];\n }\n\n /** Select a text track */\n selectTextTrack(id: string | null): void {\n this.currentPlayer?.selectTextTrack?.(id);\n }\n\n private getEffectiveCurrentTime(): number {\n if (this.currentPlayer && typeof this.currentPlayer.getCurrentTime === 'function') {\n const t = this.currentPlayer.getCurrentTime();\n if (Number.isFinite(t)) return t;\n }\n return this.videoElement?.currentTime ?? 0;\n }\n\n private getEffectiveDuration(): number {\n if (this.currentPlayer && typeof this.currentPlayer.getDuration === 'function') {\n const d = this.currentPlayer.getDuration();\n if (Number.isFinite(d) || d === Infinity) return d;\n }\n return this.videoElement?.duration ?? NaN;\n }\n\n private getPlayerSeekableRange(): { start: number; end: number } | null {\n if (this.currentPlayer && typeof this.currentPlayer.getSeekableRange === 'function') {\n const range = this.currentPlayer.getSeekableRange();\n if (range && Number.isFinite(range.start) && Number.isFinite(range.end) && range.end >= range.start) {\n return range;\n }\n }\n return null;\n }\n\n private deriveBufferWindowMsFromTracks(tracks?: Record<string, { firstms?: number; lastms?: number }>): number | undefined {\n if (!tracks) return undefined;\n const trackList = Object.values(tracks);\n if (trackList.length === 0) return undefined;\n const firstmsValues = trackList.map(t => t.firstms).filter((v): v is number => v !== undefined);\n const lastmsValues = trackList.map(t => t.lastms).filter((v): v is number => v !== undefined);\n if (firstmsValues.length === 0 || lastmsValues.length === 0) return undefined;\n const firstms = Math.max(...firstmsValues);\n const lastms = Math.min(...lastmsValues);\n const window = lastms - firstms;\n if (!Number.isFinite(window) || window <= 0) return undefined;\n return window;\n }\n\n /** Get current time */\n getCurrentTime(): number {\n return this.getEffectiveCurrentTime();\n }\n\n /** Get duration */\n getDuration(): number {\n return this.getEffectiveDuration();\n }\n\n /** Check if paused */\n isPaused(): boolean {\n return this.videoElement?.paused ?? true;\n }\n\n /** Check if muted */\n isMuted(): boolean {\n return this.videoElement?.muted ?? true;\n }\n\n /** Skip backward by specified seconds (default 10) */\n skipBack(seconds: number = 10): void {\n this.seekBy(-seconds);\n this.emit('skipBackward', { seconds });\n }\n\n /** Skip forward by specified seconds (default 10) */\n skipForward(seconds: number = 10): void {\n this.seekBy(seconds);\n this.emit('skipForward', { seconds });\n }\n\n /** Toggle play/pause */\n togglePlay(): void {\n if (this.videoElement?.paused) {\n this.videoElement.play().catch(() => {});\n } else {\n this.videoElement?.pause();\n }\n }\n\n /** Toggle mute */\n toggleMute(): void {\n if (this.videoElement) {\n this.videoElement.muted = !this.videoElement.muted;\n }\n }\n\n /** Seek relative to current position */\n seekBy(delta: number): void {\n const currentTime = this.getEffectiveCurrentTime();\n const duration = this.getEffectiveDuration();\n const newTime = currentTime + delta;\n const maxTime = isFinite(duration) ? duration : currentTime + Math.abs(delta);\n this.seek(Math.max(0, Math.min(maxTime, newTime)));\n }\n\n /** Seek to percentage (0-1) of duration */\n seekPercent(percent: number): void {\n const duration = this.getEffectiveDuration();\n if (isFinite(duration)) {\n this.seek(duration * Math.max(0, Math.min(1, percent)));\n }\n }\n\n /** Toggle loop mode */\n toggleLoop(): void {\n this._isLoopEnabled = !this._isLoopEnabled;\n if (this.videoElement) {\n this.videoElement.loop = this._isLoopEnabled;\n }\n // Persist to localStorage\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('frameworks-player-loop', String(this._isLoopEnabled));\n }\n } catch {\n // localStorage not available\n }\n this.emit('loopChange', { isLoopEnabled: this._isLoopEnabled });\n }\n\n /** Set loop mode */\n setLoopEnabled(enabled: boolean): void {\n if (this._isLoopEnabled === enabled) return;\n this._isLoopEnabled = enabled;\n if (this.videoElement) {\n this.videoElement.loop = enabled;\n }\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('frameworks-player-loop', String(enabled));\n }\n } catch {}\n this.emit('loopChange', { isLoopEnabled: enabled });\n }\n\n /** Clear current error */\n clearError(): void {\n this._errorText = null;\n this._isPassiveError = false;\n this._errorCleared = true;\n }\n\n // ============================================================================\n // Seeking & Live State Update (Centralized from wrappers)\n // ============================================================================\n\n /**\n * Update seeking and live detection state.\n * Called on timeupdate and progress events.\n * Emits seekingStateChange event when values change.\n */\n private updateSeekingState(): void {\n const el = this.videoElement;\n if (!el) return;\n\n const currentTime = this.getEffectiveCurrentTime();\n const duration = this.getEffectiveDuration();\n const isLive = this.isEffectivelyLive();\n const sourceType = this._currentSourceInfo?.type;\n const mistStreamInfo = this.streamState?.streamInfo;\n\n // Update WebRTC detection\n const wasWebRTC = this._isWebRTC;\n this._isWebRTC = isMediaStreamSource(el);\n\n // Update playback rate support\n this._supportsPlaybackRate = supportsPlaybackRate(el);\n\n // Update latency tier based on source type\n this._latencyTier = sourceType ? getLatencyTier(sourceType) : (this._isWebRTC ? 'ultra-low' : 'medium');\n\n // Update live thresholds (with buffer window scaling)\n const bufferWindowMs = mistStreamInfo?.meta?.buffer_window\n ?? this.deriveBufferWindowMsFromTracks(mistStreamInfo?.meta?.tracks as Record<string, { firstms?: number; lastms?: number }> | undefined);\n this._liveThresholds = calculateLiveThresholds(sourceType, this._isWebRTC, bufferWindowMs);\n\n // Calculate seekable range using centralized logic (allow player overrides)\n const playerRange = this.getPlayerSeekableRange();\n const { seekableStart, liveEdge } = playerRange\n ? { seekableStart: playerRange.start, liveEdge: playerRange.end }\n : calculateSeekableRange({\n isLive,\n video: el,\n mistStreamInfo,\n currentTime,\n duration,\n });\n\n // Update can seek - pass player's canSeek if available (e.g., WebCodecs uses server commands)\n const playerCanSeek = this.currentPlayer && typeof (this.currentPlayer as any).canSeek === 'function'\n ? () => (this.currentPlayer as any).canSeek()\n : undefined;\n this._canSeek = canSeekStream({\n video: el,\n isLive,\n duration,\n bufferWindowMs,\n playerCanSeek,\n });\n\n // Update buffered ranges\n this._buffered = el.buffered.length > 0 ? el.buffered : null;\n\n // Check if values changed\n const seekableChanged = this._seekableStart !== seekableStart || this._liveEdge !== liveEdge;\n const canSeekChanged = this._canSeek !== this._canSeek; // Already updated above\n\n this._seekableStart = seekableStart;\n this._liveEdge = liveEdge;\n\n // Update isNearLive using hysteresis\n if (isLive) {\n const newIsNearLive = calculateIsNearLive(\n currentTime,\n liveEdge,\n this._liveThresholds,\n this._isNearLive\n );\n if (newIsNearLive !== this._isNearLive) {\n this._isNearLive = newIsNearLive;\n }\n } else {\n this._isNearLive = true; // Always \"at live\" for VOD\n }\n\n // Emit event for wrappers to consume\n // Only emit if something meaningful changed to avoid spam\n if (seekableChanged || wasWebRTC !== this._isWebRTC) {\n this.emit('seekingStateChange', {\n seekableStart: this._seekableStart,\n liveEdge: this._liveEdge,\n canSeek: this._canSeek,\n isNearLive: this._isNearLive,\n isLive,\n isWebRTC: this._isWebRTC,\n latencyTier: this._latencyTier,\n buffered: this._buffered,\n hasAudio: this._hasAudio,\n supportsPlaybackRate: this._supportsPlaybackRate,\n });\n }\n }\n\n /**\n * Detect audio tracks on the video element.\n * Called after video metadata is loaded.\n */\n private detectAudioTracks(): void {\n const el = this.videoElement;\n if (!el) return;\n\n // Check MediaStream audio tracks\n if (el.srcObject instanceof MediaStream) {\n const audioTracks = el.srcObject.getAudioTracks();\n this._hasAudio = audioTracks.length > 0;\n return;\n }\n\n // Check HTML5 audio tracks (if available)\n // audioTracks is only available in some browsers (Safari, Edge)\n const elWithAudio = el as HTMLVideoElement & { audioTracks?: { length: number } };\n if (elWithAudio.audioTracks && elWithAudio.audioTracks.length !== undefined) {\n this._hasAudio = elWithAudio.audioTracks.length > 0;\n return;\n }\n\n // Default to true if we can't detect\n this._hasAudio = true;\n }\n\n // ============================================================================\n // Error Handling (Phase A3)\n // ============================================================================\n\n /**\n * Attempt to clear error automatically if playback is progressing.\n * Called on timeupdate, playing, and canplay events.\n */\n private attemptClearError(): void {\n if (!this._errorText || this._errorCleared) return;\n\n const now = Date.now();\n const elapsed = now - this._errorShownAt;\n\n if (elapsed >= PlayerController.AUTO_CLEAR_ERROR_DELAY_MS) {\n this._errorCleared = true;\n this._errorText = null;\n this._isPassiveError = false;\n this.log('Error auto-cleared after playback resumed');\n this.emit('errorCleared', undefined as never);\n }\n }\n\n /**\n * Check if we should attempt playback fallback due to hard failure.\n * Returns true if:\n * - Error count exceeds threshold (5+) within time window (60s)\n * - Error contains fatal keywords\n * - Sustained stall for 30+ seconds\n */\n private shouldAttemptFallback(error: string): boolean {\n const now = Date.now();\n\n // Track error count within window\n if (now - this._lastErrorTime > PlayerController.HARD_FAILURE_ERROR_WINDOW_MS) {\n this._errorCount = 0; // Reset counter if outside window\n }\n this._errorCount++;\n this._lastErrorTime = now;\n\n // Check for repeated errors (5+ errors within 60s)\n if (this._errorCount >= PlayerController.HARD_FAILURE_ERROR_THRESHOLD) {\n this.log(`Hard failure: repeated errors (${this._errorCount})`);\n return true;\n }\n\n // Check for fatal error keywords\n const lowerError = error.toLowerCase();\n for (const keyword of PlayerController.FATAL_ERROR_KEYWORDS) {\n if (lowerError.includes(keyword)) {\n this.log(`Hard failure: fatal keyword \"${keyword}\" detected`);\n return true;\n }\n }\n\n // Check for sustained stall (30+ seconds of continuous buffering)\n if (this._stallStartTime > 0) {\n const stallDuration = now - this._stallStartTime;\n if (stallDuration >= PlayerController.HARD_FAILURE_STALL_THRESHOLD_MS) {\n this.log(`Hard failure: sustained stall for ${stallDuration}ms`);\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Set error with passive mode support.\n * - Ignores errors during player transitions\n * - Marks error as passive if video is still playing\n * - Attempts automatic fallback on hard failures\n */\n async setPassiveError(error: string): Promise<void> {\n // Ignore errors during player switching transitions (old player cleanup can fire errors)\n if (this._isTransitioning) {\n this.log(`Ignoring error during player transition: ${error}`);\n return;\n }\n\n // Check if video is still playing (passive error scenario)\n const video = this.videoElement;\n const isVideoPlaying = video && !video.paused && video.currentTime > 0;\n\n // Attempt fallback on hard failures before showing error UI\n if (this.shouldAttemptFallback(error) && this.playerManager.canAttemptFallback()) {\n this.log('Attempting playback fallback...');\n this._isTransitioning = true;\n\n const fallbackSucceeded = await this.playerManager.tryPlaybackFallback();\n\n this._isTransitioning = false;\n\n if (fallbackSucceeded) {\n // Fallback succeeded - clear error state and reset counters\n this._errorCount = 0;\n this._errorText = null;\n this._isPassiveError = false;\n this.log('Fallback succeeded');\n return;\n }\n // Fallback failed or exhausted - fall through to show error\n this.log('Fallback exhausted, showing error UI');\n }\n\n // Set error state\n this._errorShownAt = Date.now();\n this._errorCleared = false;\n this._errorText = error;\n this._isPassiveError = isVideoPlaying ?? false;\n\n this.setState('error', { error });\n this.emit('error', { error });\n }\n\n /**\n * Retry playback with fallback to next player/source.\n * Returns true if a fallback option was available and attempted.\n */\n async retryWithFallback(): Promise<boolean> {\n if (!this.playerManager.canAttemptFallback()) {\n return false;\n }\n\n this._isTransitioning = true;\n const success = await this.playerManager.tryPlaybackFallback();\n this._isTransitioning = false;\n\n if (success) {\n this._errorCount = 0;\n this.clearError();\n }\n\n return success;\n }\n\n /** Toggle fullscreen */\n async toggleFullscreen(): Promise<void> {\n if (typeof document === 'undefined') return;\n\n if (document.fullscreenElement) {\n await document.exitFullscreen().catch(() => {});\n } else if (this.container) {\n await this.container.requestFullscreen().catch(() => {});\n }\n }\n\n /** Toggle Picture-in-Picture */\n async togglePictureInPicture(): Promise<void> {\n if (typeof document === 'undefined') return;\n\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture().catch(() => {});\n } else if (this.videoElement && 'requestPictureInPicture' in this.videoElement) {\n await (this.videoElement as any).requestPictureInPicture().catch(() => {});\n }\n }\n\n /** Check if Picture-in-Picture is supported */\n isPiPSupported(): boolean {\n if (typeof document === 'undefined') return false;\n return document.pictureInPictureEnabled ?? false;\n }\n\n /** Check if currently in Picture-in-Picture mode */\n isPiPActive(): boolean {\n if (typeof document === 'undefined') return false;\n return document.pictureInPictureElement === this.videoElement;\n }\n\n // ============================================================================\n // Advanced Control\n // ============================================================================\n\n /** Force a retry of the current playback */\n async retry(): Promise<void> {\n if (!this.container || !this.streamInfo) return;\n\n try {\n this.playerManager.destroy();\n } catch {\n // Ignore cleanup errors\n }\n\n this.container.innerHTML = '';\n this.videoElement = null;\n this.currentPlayer = null;\n\n try {\n await this.initializePlayer();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Retry failed';\n this.setState('error', { error: message });\n this.emit('error', { error: message });\n }\n }\n\n /** Get playback statistics */\n async getStats(): Promise<unknown> {\n return this.currentPlayer?.getStats?.();\n }\n\n /** Get current latency (for live streams) */\n async getLatency(): Promise<unknown> {\n return this.currentPlayer?.getLatency?.();\n }\n\n // ============================================================================\n // Runtime Configuration (Phase A5)\n // ============================================================================\n\n /**\n * Update configuration at runtime without full re-initialization.\n * Only certain options can be updated without re-init.\n */\n updateConfig(partialConfig: Partial<Pick<PlayerControllerConfig, 'debug' | 'autoplay' | 'muted'>>): void {\n if (partialConfig.debug !== undefined) {\n this.config.debug = partialConfig.debug;\n }\n if (partialConfig.autoplay !== undefined) {\n this.config.autoplay = partialConfig.autoplay;\n }\n if (partialConfig.muted !== undefined) {\n this.config.muted = partialConfig.muted;\n if (this.videoElement) {\n this.videoElement.muted = partialConfig.muted;\n }\n }\n }\n\n /**\n * Force a complete re-initialization with current config.\n * Stops and re-initializes the entire player.\n */\n async reload(): Promise<void> {\n if (!this.container || this.isDestroyed) return;\n\n const container = this.container;\n this.detach();\n await this.attach(container);\n }\n\n /**\n * Select a specific player/source combination (one-shot).\n * Used by DevModePanel to manually pick a combo.\n *\n * Note: This is a ONE-SHOT selection. The force settings are used for\n * the next initialization only. If that player fails, normal fallback\n * logic proceeds without the force settings.\n */\n async selectCombo(options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n }): Promise<void> {\n const container = this.container;\n if (!container) return;\n\n this.log(`[selectCombo] One-shot selection: player=${options.forcePlayer}, type=${options.forceType}, source=${options.forceSource}`);\n\n // Store as one-shot options (will be cleared after use)\n this._pendingForceOptions = {\n forcePlayer: options.forcePlayer,\n forceType: options.forceType,\n forceSource: options.forceSource,\n };\n\n // Detach and re-attach - initializePlayer will use pending options once\n this.detach();\n await this.attach(container);\n }\n\n /**\n * Set playback mode preference.\n * Unlike selectCombo, this is a persistent preference that affects scoring.\n */\n setPlaybackMode(mode: 'auto' | 'low-latency' | 'quality' | 'vod'): void {\n this.config.playbackMode = mode;\n this.log(`[setPlaybackMode] Mode set to: ${mode}`);\n }\n\n /**\n * @deprecated Use selectCombo() for one-shot selection or setPlaybackMode() for mode changes.\n * This method exists for backwards compatibility but may override fallback behavior.\n */\n async setDevModeOptions(options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n playbackMode?: 'auto' | 'low-latency' | 'quality' | 'vod';\n }): Promise<void> {\n // Update playback mode if provided (this is a persistent preference)\n if (options.playbackMode) {\n this.setPlaybackMode(options.playbackMode);\n }\n\n // Use selectCombo for the force settings (one-shot)\n if (options.forcePlayer !== undefined || options.forceType !== undefined || options.forceSource !== undefined) {\n await this.selectCombo({\n forcePlayer: options.forcePlayer,\n forceType: options.forceType,\n forceSource: options.forceSource,\n });\n } else if (options.playbackMode) {\n // Mode-only change, trigger reload\n const container = this.container;\n if (container) {\n this.detach();\n await this.attach(container);\n }\n }\n }\n\n /**\n * Get metadata update payload for external consumers.\n * Combines current state into a single metadata object.\n */\n getMetadataPayload(): PlayerControllerEvents['metadataUpdate'] {\n const video = this.videoElement;\n const bufferedAhead = video && video.buffered.length > 0\n ? video.buffered.end(video.buffered.length - 1) - video.currentTime\n : 0;\n\n return {\n currentTime: video?.currentTime ?? 0,\n duration: video?.duration ?? NaN,\n bufferedAhead: Math.max(0, bufferedAhead),\n qualityScore: this._playbackQuality?.score,\n playerInfo: this._currentPlayerInfo ?? undefined,\n sourceInfo: this._currentSourceInfo ?? undefined,\n isLive: this.isEffectivelyLive(),\n isBuffering: this._isBuffering,\n isPaused: video?.paused ?? true,\n volume: video?.volume ?? 1,\n muted: video?.muted ?? true,\n };\n }\n\n /**\n * Emit a metadata update event with current state.\n * Useful for periodic telemetry/reporting.\n */\n emitMetadataUpdate(): void {\n this.emit('metadataUpdate', this.getMetadataPayload());\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private async resolveEndpoints(): Promise<void> {\n const { endpoints, gatewayUrl, mistUrl, contentType, contentId, authToken } = this.config;\n\n // Priority 1: Use pre-resolved endpoints if provided\n if (endpoints?.primary) {\n this.endpoints = endpoints;\n this.setState('gateway_ready', { gatewayStatus: 'ready' });\n return;\n }\n\n // Priority 2: Direct MistServer resolution (playground/standalone mode)\n if (mistUrl) {\n await this.resolveFromMistServer(mistUrl, contentId);\n return;\n }\n\n // Priority 3: Gateway resolution\n if (gatewayUrl) {\n await this.resolveFromGateway(gatewayUrl, contentType, contentId, authToken);\n return;\n }\n\n throw new Error('No endpoints provided and no gatewayUrl or mistUrl configured');\n }\n\n /**\n * Resolve endpoints directly from MistServer (bypasses Gateway)\n * Fetches json_{contentId}.js and builds ContentEndpoints from source array\n */\n private async resolveFromMistServer(mistUrl: string, contentId: string): Promise<void> {\n this.setState('gateway_loading', { gatewayStatus: 'loading' });\n\n try {\n const jsonUrl = `${mistUrl.replace(/\\/+$/, '')}/json_${encodeURIComponent(contentId)}.js`;\n this.log(`[resolveFromMistServer] Fetching ${jsonUrl}`);\n\n const response = await fetch(jsonUrl, { cache: 'no-store' });\n if (!response.ok) {\n throw new Error(`MistServer HTTP ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n const sources: Array<{ url: string; type: string }> = Array.isArray(data.source) ? data.source : [];\n if (sources.length === 0) {\n throw new Error('No sources available from MistServer');\n }\n\n // Build outputs map from all sources\n const outputs: Record<string, { protocol: string; url: string }> = {};\n for (const source of sources) {\n const protocol = this.mapMistTypeToProtocol(source.type);\n if (!outputs[protocol]) {\n outputs[protocol] = { protocol, url: source.url };\n }\n }\n\n // Select primary source (prefer HLS/DASH over WebSocket-based)\n const httpSources = sources.filter(s => !s.url.startsWith('ws://'));\n const primarySource = httpSources.length > 0\n ? this.selectBestSource(httpSources)\n : sources[0];\n\n const primary = {\n nodeId: `mist-${contentId}`,\n protocol: this.mapMistTypeToProtocol(primarySource.type),\n url: primarySource.url,\n baseUrl: mistUrl,\n outputs,\n };\n\n this.endpoints = { primary, fallbacks: [] };\n\n // Parse track metadata from MistServer response\n if (data.meta?.tracks && typeof data.meta.tracks === 'object') {\n const tracks = this.parseMistTracks(data.meta.tracks);\n this.mistTracks = tracks.length > 0 ? tracks : null;\n this.log(`[resolveFromMistServer] Parsed ${tracks.length} tracks from MistServer`);\n }\n\n this.setState('gateway_ready', { gatewayStatus: 'ready' });\n this.log(`[resolveFromMistServer] Resolved: ${primary.protocol} @ ${primary.url}`);\n\n } catch (error) {\n const message = error instanceof Error ? error.message : 'MistServer resolution failed';\n this.setState('gateway_error', { gatewayStatus: 'error', error: message });\n throw error;\n }\n }\n\n /**\n * Map MistServer type to protocol identifier\n */\n private mapMistTypeToProtocol(mistType: string): string {\n // WebCodecs raw streams - check BEFORE generic ws/ catch-all\n // MistServer rawws.js uses 'ws/video/raw', mews.js uses 'ws/video/mp4' and 'ws/video/webm'\n if (mistType === 'ws/video/raw') return 'RAW_WS';\n if (mistType === 'wss/video/raw') return 'RAW_WSS';\n // MEWS (MP4/WebM over WebSocket) - catches remaining ws/* types\n if (mistType.startsWith('ws/') || mistType.startsWith('wss/')) return 'MEWS_WS';\n if (mistType.includes('webrtc')) return 'MIST_WEBRTC';\n if (mistType.includes('mpegurl') || mistType.includes('m3u8')) return 'HLS';\n if (mistType.includes('dash') || mistType.includes('mpd')) return 'DASH';\n if (mistType.includes('whep')) return 'WHEP';\n if (mistType.includes('mp4')) return 'MP4';\n if (mistType.includes('webm')) return 'WEBM';\n return mistType;\n }\n\n /**\n * Select best source based on protocol priority\n */\n private selectBestSource(sources: Array<{ url: string; type: string }>): { url: string; type: string } {\n const priority: Record<string, number> = {\n HLS: 1, DASH: 2, MP4: 3, WEBM: 4, WHEP: 5, MIST_WEBRTC: 6, MEWS_WS: 99,\n };\n return sources.sort((a, b) => {\n const pa = priority[this.mapMistTypeToProtocol(a.type)] ?? 50;\n const pb = priority[this.mapMistTypeToProtocol(b.type)] ?? 50;\n return pa - pb;\n })[0];\n }\n\n /**\n * Resolve endpoints from Gateway GraphQL API\n */\n private async resolveFromGateway(\n gatewayUrl: string,\n contentType: ContentType,\n contentId: string,\n authToken?: string\n ): Promise<void> {\n this.setState('gateway_loading', { gatewayStatus: 'loading' });\n\n this.gatewayClient = new GatewayClient({\n gatewayUrl,\n contentType,\n contentId,\n authToken,\n });\n\n // Subscribe to status changes\n const unsub = this.gatewayClient.on('statusChange', ({ status, error }) => {\n if (status === 'error') {\n this.setState('gateway_error', { gatewayStatus: status, error });\n }\n });\n this.cleanupFns.push(unsub);\n this.cleanupFns.push(() => this.gatewayClient?.destroy());\n\n try {\n this.endpoints = await this.gatewayClient.resolve();\n this.setState('gateway_ready', { gatewayStatus: 'ready' });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Gateway resolution failed';\n this.setState('gateway_error', { gatewayStatus: 'error', error: message });\n throw error;\n }\n }\n\n private startStreamStatePolling(): void {\n const { contentType, contentId, mistUrl } = this.config;\n\n // Only poll for live-like content. DVR should only poll while recording.\n if (contentType !== 'live' && contentType !== 'dvr') return;\n if (contentType === 'dvr') {\n const dvrStatus = this.getMetadata()?.dvrStatus;\n if (dvrStatus && dvrStatus !== 'recording') return;\n }\n\n // Use endpoint baseUrl if available, otherwise fall back to config.mistUrl\n // This allows polling to start even when initial endpoint resolution failed\n const mistBaseUrl = this.endpoints?.primary?.baseUrl || mistUrl;\n if (!mistBaseUrl) return;\n\n // Use playback ID from metadata if available\n const metadata = this.getMetadata();\n const streamName = metadata?.contentId || contentId;\n\n // For effectively live content, use WebSocket for real-time updates\n // For completed VOD content, use HTTP polling only\n const useWebSocket = this.isEffectivelyLive();\n const pollInterval = this.isEffectivelyLive() ? 3000 : 5000;\n\n this.streamStateClient = new StreamStateClient({\n mistBaseUrl,\n streamName,\n useWebSocket,\n pollInterval,\n });\n\n // Subscribe to state changes\n const unsubState = this.streamStateClient.on('stateChange', ({ state }) => {\n const wasOnline = this._prevStreamIsOnline;\n const isNowOnline = state.isOnline;\n\n this.streamState = state;\n this._prevStreamIsOnline = isNowOnline;\n\n // Update track metadata if MistServer provides better data\n // This handles cold-start: Gateway gives fallback codecs, MistServer gives real ones\n if (state.streamInfo?.meta?.tracks && this.streamInfo) {\n const mistTracks = this.parseMistTracks(state.streamInfo.meta.tracks);\n if (mistTracks.length > 0) {\n this.streamInfo.meta.tracks = mistTracks;\n this.log(`[stateChange] Updated ${mistTracks.length} tracks from MistServer`);\n }\n }\n\n this.emit('streamStateChange', { state });\n\n // Auto-play when stream transitions from offline to online\n // This handles the case where user is watching IdleScreen and stream comes online\n if (wasOnline === false && isNowOnline === true && this.isEffectivelyLive()) {\n this.log('Stream came online, triggering auto-play');\n if (this.videoElement) {\n // Player already initialized - just play\n this.videoElement.play().catch(e =>\n this.log(`Auto-play on online transition failed: ${e}`)\n );\n } else if (this.container && !this.endpoints?.primary) {\n // Player wasn't initialized because stream was offline - re-attempt full initialization\n this.log('Stream came online, attempting late initialization');\n this.initializeLateFromStreamState(state.streamInfo);\n }\n }\n });\n this.cleanupFns.push(unsubState);\n this.cleanupFns.push(() => this.streamStateClient?.destroy());\n\n this.streamStateClient.start();\n }\n\n /**\n * Initialize player late when stream comes online after initial attach failed.\n * Uses MistStreamInfo from stream state polling instead of re-fetching.\n */\n private async initializeLateFromStreamState(streamInfo: MistStreamInfo | undefined): Promise<void> {\n if (!streamInfo?.source || !Array.isArray(streamInfo.source) || streamInfo.source.length === 0) {\n this.log('[initializeLateFromStreamState] No sources in stream info');\n return;\n }\n\n if (!this.container || !this.config.mistUrl) {\n this.log('[initializeLateFromStreamState] Missing container or mistUrl');\n return;\n }\n\n try {\n const sources = streamInfo.source;\n const mistUrl = this.config.mistUrl;\n const contentId = this.config.contentId;\n\n // Build outputs map from all sources\n const outputs: Record<string, { protocol: string; url: string }> = {};\n for (const source of sources) {\n const protocol = this.mapMistTypeToProtocol(source.type);\n if (!outputs[protocol]) {\n outputs[protocol] = { protocol, url: source.url };\n }\n }\n\n // Select primary source (prefer HLS/DASH over WebSocket-based)\n const httpSources = sources.filter(s => !s.url.startsWith('ws://'));\n const primarySource = httpSources.length > 0\n ? this.selectBestSource(httpSources)\n : sources[0];\n\n const primary = {\n nodeId: `mist-${contentId}`,\n protocol: this.mapMistTypeToProtocol(primarySource.type),\n url: primarySource.url,\n baseUrl: mistUrl,\n outputs,\n };\n\n this.endpoints = { primary, fallbacks: [] };\n\n // Parse track metadata from stream info\n if (streamInfo.meta?.tracks && typeof streamInfo.meta.tracks === 'object') {\n const tracks = this.parseMistTracks(streamInfo.meta.tracks);\n this.mistTracks = tracks.length > 0 ? tracks : null;\n this.log(`[initializeLateFromStreamState] Parsed ${tracks.length} tracks`);\n }\n\n this.setState('gateway_ready', { gatewayStatus: 'ready' });\n this.log(`[initializeLateFromStreamState] Built endpoints from stream state: ${primary.protocol}`);\n\n // Build StreamInfo and initialize player\n this.streamInfo = this.buildStreamInfo(this.endpoints);\n\n if (!this.streamInfo || this.streamInfo.source.length === 0) {\n this.setState('error', { error: 'No playable sources found' });\n return;\n }\n\n await this.initializePlayer();\n this.log('[initializeLateFromStreamState] Player initialized successfully');\n\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Late initialization failed';\n this.log(`[initializeLateFromStreamState] Failed: ${message}`);\n this.setState('error', { error: message });\n }\n }\n\n private buildStreamInfo(endpoints: ContentEndpoints): StreamInfo | null {\n // Delegate to standalone exported function\n const info = buildStreamInfoFromEndpoints(endpoints, this.config.contentId);\n\n // If we have tracks from direct MistServer resolution, use those instead\n // (they have accurate codecstring and init data for proper codec detection)\n if (info && this.mistTracks && this.mistTracks.length > 0) {\n info.meta.tracks = this.mistTracks;\n this.log(`[buildStreamInfo] Using ${this.mistTracks.length} tracks from MistServer`);\n }\n\n return info;\n }\n\n /**\n * Parse MistServer track metadata from the tracks object.\n * MistServer returns tracks as a Record keyed by track name (e.g., \"video_H264_800x600_25fps_1\").\n * This converts to our StreamTrack[] format with codecstring and init data.\n */\n private parseMistTracks(tracksObj: Record<string, unknown>): StreamTrack[] {\n const tracks: StreamTrack[] = [];\n for (const [, trackData] of Object.entries(tracksObj)) {\n const t = trackData as Record<string, unknown>;\n const trackType = t.type as string;\n if (trackType === 'video' || trackType === 'audio' || trackType === 'meta') {\n tracks.push({\n type: trackType,\n codec: t.codec as string,\n codecstring: t.codecstring as string | undefined,\n init: t.init as string | undefined,\n idx: t.idx as number | undefined,\n width: t.width as number | undefined,\n height: t.height as number | undefined,\n fpks: t.fpks as number | undefined,\n channels: t.channels as number | undefined,\n rate: t.rate as number | undefined,\n size: t.size as number | undefined,\n });\n }\n }\n return tracks;\n }\n\n private async initializePlayer(): Promise<void> {\n const container = this.container;\n const streamInfo = this.streamInfo;\n\n this.log(`[initializePlayer] Starting - container: ${!!container}, streamInfo: ${!!streamInfo}, sources: ${streamInfo?.source?.length ?? 0}`);\n\n if (!container || !streamInfo) {\n throw new Error('Container or streamInfo not available');\n }\n\n // Log source details for debugging\n this.log(`[initializePlayer] Sources: ${JSON.stringify(streamInfo.source.map(s => ({ type: s.type, url: s.url.slice(0, 60) + '...' })))}`);\n this.log(`[initializePlayer] Tracks: ${streamInfo.meta.tracks.map(t => `${t.type}:${t.codec}`).join(', ')}`);\n\n const { autoplay, muted, controls, poster } = this.config;\n\n // Clear container\n container.innerHTML = '';\n\n // Listen for player selection\n const onSelected = (e: { player: string; source: StreamSource; score: number }) => {\n // Track current player info\n const playerImpl = this.playerManager.getRegisteredPlayers().find(\n p => p.capability.shortname === e.player\n );\n if (playerImpl) {\n this._currentPlayerInfo = {\n name: playerImpl.capability.name,\n shortname: playerImpl.capability.shortname,\n };\n }\n\n // Track current source info\n if (e.source) {\n this._currentSourceInfo = {\n url: e.source.url,\n type: e.source.type,\n };\n }\n\n this.setState('connecting', {\n selectedPlayer: e.player,\n selectedProtocol: (e.source?.type || '').toString(),\n endpointUrl: e.source?.url,\n });\n\n // Bubble up playerSelected event\n this.emit('playerSelected', { player: e.player, source: e.source, score: e.score });\n };\n try {\n (this.playerManager as any).on?.('playerSelected', onSelected);\n } catch {}\n this.cleanupFns.push(() => {\n try {\n (this.playerManager as any).off?.('playerSelected', onSelected);\n } catch {}\n });\n\n this.setState('selecting_player');\n\n const playerOptions: CorePlayerOptions = {\n autoplay: autoplay !== false,\n muted: muted !== false,\n controls: controls !== false,\n poster: poster,\n onReady: (el) => {\n // Guard against zombie callbacks after destroy\n if (this.isDestroyed || !this.container) {\n this.log('[initializePlayer] onReady callback aborted - controller destroyed');\n return;\n }\n // Defensive: some flows (e.g. failed fallback attempt) can temporarily detach\n // the current video element from the container while playback continues.\n // Ensure the element is actually attached for rendering.\n try {\n if (this.container && !this.container.contains(el)) {\n this.log('[initializePlayer] Video element was detached; re-attaching to container');\n this.container.appendChild(el);\n }\n } catch {}\n this.videoElement = el;\n this.currentPlayer = this.playerManager.getCurrentPlayer();\n this.setupVideoEventListeners(el);\n // Initialize sub-controllers after video is ready\n this.initializeSubControllers();\n this.emit('ready', { videoElement: el });\n },\n onTimeUpdate: (t) => {\n if (this.isDestroyed) return;\n // Defensive: keep video element attached even if some other lifecycle cleared the container.\n // (Playback can continue even when detached, which looks like \"audio only\".)\n try {\n if (this.container && this.videoElement && !this.container.contains(this.videoElement)) {\n this.log('[initializePlayer] Video element was detached during playback; re-attaching to container');\n this.container.appendChild(this.videoElement);\n }\n } catch {}\n this.emit('timeUpdate', {\n currentTime: this.getEffectiveCurrentTime(),\n duration: this.getEffectiveDuration(),\n });\n },\n onError: (err) => {\n if (this.isDestroyed) return;\n const message = typeof err === 'string' ? err : String(err);\n // Use setPassiveError for smart error handling with fallback support\n this.setPassiveError(message);\n },\n };\n\n // Manager options for player selection\n // Use pending force options (one-shot from selectCombo) if available, otherwise use config\n const pendingForce = this._pendingForceOptions;\n this._pendingForceOptions = null; // Clear immediately - one-shot only\n\n const managerOptions = {\n // One-shot force options take precedence, then fall back to config\n forcePlayer: pendingForce?.forcePlayer ?? this.config.forcePlayer,\n forceType: pendingForce?.forceType ?? this.config.forceType,\n forceSource: pendingForce?.forceSource ?? this.config.forceSource,\n // Playback mode is a persistent preference\n playbackMode: this.config.playbackMode,\n };\n\n this.log(`[initializePlayer] Calling playerManager.initializePlayer...`);\n this.log(`[initializePlayer] Manager options: ${JSON.stringify(managerOptions)} (pending force: ${pendingForce ? 'yes' : 'no'})`);\n try {\n await this.playerManager.initializePlayer(container, streamInfo, playerOptions, managerOptions);\n this.log(`[initializePlayer] Player initialized successfully`);\n } catch (e) {\n this.log(`[initializePlayer] Player initialization FAILED: ${e}`);\n throw e;\n }\n }\n\n private setupVideoEventListeners(el: HTMLVideoElement): void {\n // Apply loop setting\n el.loop = this._isLoopEnabled;\n\n const onWaiting = () => {\n this._isBuffering = true;\n // Start stall timer if not already started\n if (this._stallStartTime === 0) {\n this._stallStartTime = Date.now();\n this.log('Stall started');\n }\n this.setState('buffering');\n };\n const onPlaying = () => {\n this._isBuffering = false;\n this._hasPlaybackStarted = true;\n // Clear stall timer on successful playback\n if (this._stallStartTime > 0) {\n this.log(`Stall cleared after ${Date.now() - this._stallStartTime}ms`);\n this._stallStartTime = 0;\n }\n this.setState('playing');\n // Attempt to clear error on playback resume\n this.attemptClearError();\n };\n const onCanPlay = () => {\n this._isBuffering = false;\n // Clear stall timer on canplay\n this._stallStartTime = 0;\n this.setState('playing');\n // Attempt to clear error on canplay\n this.attemptClearError();\n };\n const onPause = () => this.setState('paused');\n const onEnded = () => this.setState('ended');\n const onError = () => {\n const message = el.error ? el.error.message || 'Playback error' : 'Playback error';\n // Use setPassiveError for smart error handling with fallback support\n this.setPassiveError(message);\n };\n const onTimeUpdate = () => {\n this.emit('timeUpdate', {\n currentTime: this.getEffectiveCurrentTime(),\n duration: this.getEffectiveDuration(),\n });\n // Update seeking state (seekable range, isNearLive, etc.)\n this.updateSeekingState();\n // Attempt to clear error when playback is progressing\n if (this.getEffectiveCurrentTime() > 0) {\n this.attemptClearError();\n }\n };\n const onDurationChange = () => {\n this.emit('timeUpdate', {\n currentTime: this.getEffectiveCurrentTime(),\n duration: this.getEffectiveDuration(),\n });\n // Update seeking state on duration change\n this.updateSeekingState();\n };\n const onProgress = () => {\n // Update buffered ranges\n this._buffered = el.buffered;\n // Recalculate seeking state when buffer updates\n this.updateSeekingState();\n };\n const onLoadedMetadata = () => {\n // Detect audio tracks and WebRTC source\n this.detectAudioTracks();\n this._isWebRTC = isMediaStreamSource(el);\n this._supportsPlaybackRate = !this._isWebRTC;\n // Initial seeking state calculation\n this.updateSeekingState();\n };\n\n // Fullscreen change handler\n const onFullscreenChange = () => {\n const isFullscreen = document.fullscreenElement === this.container;\n this.emit('fullscreenChange', { isFullscreen });\n };\n\n // PiP change handlers\n const onEnterPiP = () => this.emit('pipChange', { isPiP: true });\n const onLeavePiP = () => this.emit('pipChange', { isPiP: false });\n\n // Volume change handler (for external changes, e.g., via native controls)\n const onVolumeChange = () => {\n this.emit('volumeChange', { volume: el.volume, muted: el.muted });\n };\n\n el.addEventListener('waiting', onWaiting);\n el.addEventListener('playing', onPlaying);\n el.addEventListener('canplay', onCanPlay);\n el.addEventListener('pause', onPause);\n el.addEventListener('ended', onEnded);\n el.addEventListener('error', onError);\n el.addEventListener('timeupdate', onTimeUpdate);\n el.addEventListener('durationchange', onDurationChange);\n el.addEventListener('progress', onProgress);\n el.addEventListener('loadedmetadata', onLoadedMetadata);\n el.addEventListener('volumechange', onVolumeChange);\n el.addEventListener('enterpictureinpicture', onEnterPiP);\n el.addEventListener('leavepictureinpicture', onLeavePiP);\n document.addEventListener('fullscreenchange', onFullscreenChange);\n\n this.cleanupFns.push(() => {\n el.removeEventListener('waiting', onWaiting);\n el.removeEventListener('playing', onPlaying);\n el.removeEventListener('canplay', onCanPlay);\n el.removeEventListener('pause', onPause);\n el.removeEventListener('ended', onEnded);\n el.removeEventListener('error', onError);\n el.removeEventListener('timeupdate', onTimeUpdate);\n el.removeEventListener('durationchange', onDurationChange);\n el.removeEventListener('progress', onProgress);\n el.removeEventListener('loadedmetadata', onLoadedMetadata);\n el.removeEventListener('volumechange', onVolumeChange);\n el.removeEventListener('enterpictureinpicture', onEnterPiP);\n el.removeEventListener('leavepictureinpicture', onLeavePiP);\n document.removeEventListener('fullscreenchange', onFullscreenChange);\n });\n }\n\n // ============================================================================\n // Sub-Controller Initialization (Phase A2)\n // ============================================================================\n\n private initializeSubControllers(): void {\n if (!this.videoElement || !this.container) return;\n\n // Initialize ABRController\n this.initializeABRController();\n\n // Initialize QualityMonitor\n this.initializeQualityMonitor();\n\n // Initialize InteractionController\n this.initializeInteractionController();\n\n // Initialize MistReporter (needs WebSocket from StreamStateClient)\n this.initializeMistReporter();\n\n // Initialize MetaTrackManager\n this.initializeMetaTrackManager();\n }\n\n private initializeABRController(): void {\n const player = this.currentPlayer;\n if (!player || !this.videoElement) return;\n\n this.abrController = new ABRController({\n options: { mode: 'auto' },\n getQualities: () => player.getQualities?.() ?? [],\n selectQuality: (id) => player.selectQuality?.(id),\n getCurrentQuality: () => {\n const qualities = player.getQualities?.() ?? [];\n const currentId = player.getCurrentQuality?.();\n return qualities.find(q => q.id === currentId) ?? null;\n },\n // Wire up bandwidth estimate from player stats\n getBandwidthEstimate: async () => {\n if (!this.currentPlayer?.getStats) return 0;\n try {\n const stats = await this.currentPlayer.getStats();\n // HLS.js provides bandwidthEstimate directly\n if (stats?.bandwidthEstimate) {\n return stats.bandwidthEstimate;\n }\n // DASH.js provides throughput info\n if (stats?.averageThroughput) {\n return stats.averageThroughput;\n }\n return 0;\n } catch {\n return 0;\n }\n },\n debug: this.config.debug,\n });\n\n this.abrController.start(this.videoElement);\n this.cleanupFns.push(() => {\n this.abrController?.stop();\n this.abrController = null;\n });\n }\n\n private initializeQualityMonitor(): void {\n if (!this.videoElement) return;\n\n this.qualityMonitor = new QualityMonitor({ sampleInterval: 1000 });\n this.qualityMonitor.start(this.videoElement);\n\n // Subscribe to quality updates\n const handleQualityUpdate = () => {\n if (this.qualityMonitor) {\n this._playbackQuality = this.qualityMonitor.getCurrentQuality();\n\n // Feed quality score to MistReporter\n if (this.mistReporter && this._playbackQuality) {\n // Convert 0-100 score to MistPlayer-style 0-2.0 scale\n const mistScore = this._playbackQuality.score / 100;\n this.mistReporter.setPlaybackScore(mistScore);\n }\n }\n };\n\n // Sample quality periodically\n const qualityInterval = setInterval(handleQualityUpdate, 1000);\n this.cleanupFns.push(() => {\n clearInterval(qualityInterval);\n this.qualityMonitor?.stop();\n this.qualityMonitor = null;\n });\n }\n\n private initializeInteractionController(): void {\n if (!this.container || !this.videoElement) return;\n\n const isLive = this.isEffectivelyLive();\n\n this.interactionController = new InteractionController({\n container: this.container,\n videoElement: this.videoElement,\n isLive,\n onPlayPause: () => this.togglePlay(),\n onSeek: (delta) => {\n // End any speed hold before seeking\n if (this._isHoldingSpeed) {\n this._isHoldingSpeed = false;\n this.emit('holdSpeedEnd', undefined as never);\n }\n this.seekBy(delta);\n // Emit skip events\n if (delta > 0) {\n this.emit('skipForward', { seconds: delta });\n } else {\n this.emit('skipBackward', { seconds: Math.abs(delta) });\n }\n },\n onVolumeChange: (delta) => {\n if (this.videoElement) {\n const newVolume = Math.max(0, Math.min(1, this.videoElement.volume + delta));\n this.videoElement.volume = newVolume;\n this.emit('volumeChange', { volume: newVolume, muted: this.videoElement.muted });\n }\n },\n onMuteToggle: () => this.toggleMute(),\n onFullscreenToggle: () => this.toggleFullscreen(),\n onCaptionsToggle: () => {\n this.toggleSubtitles();\n },\n onSpeedChange: (speed, isHolding) => {\n const wasHolding = this._isHoldingSpeed;\n this._isHoldingSpeed = isHolding;\n this._holdSpeed = speed;\n this.setPlaybackRate(speed);\n\n // Emit holdSpeed events on state transitions\n if (isHolding && !wasHolding) {\n this.emit('holdSpeedStart', { speed });\n } else if (!isHolding && wasHolding) {\n this.emit('holdSpeedEnd', undefined as never);\n }\n },\n onSeekPercent: (percent) => this.seekPercent(percent),\n speedHoldValue: this._holdSpeed,\n });\n\n this.interactionController.attach();\n this.cleanupFns.push(() => {\n this.interactionController?.detach();\n this.interactionController = null;\n });\n }\n\n private initializeMistReporter(): void {\n if (!this.streamStateClient) return;\n\n const socket = this.streamStateClient.getSocket();\n if (!socket) return;\n\n this.mistReporter = new MistReporter({\n socket,\n bootMs: this.bootMs,\n reportInterval: 5000,\n });\n\n // Initialize with video element\n if (this.videoElement) {\n this.mistReporter.init(this.videoElement, this.container ?? undefined);\n }\n\n // Send initial report\n if (this._currentSourceInfo) {\n this.mistReporter.sendInitialReport({\n player: this._currentPlayerInfo?.shortname || 'unknown',\n sourceType: this._currentSourceInfo.type,\n sourceUrl: this._currentSourceInfo.url,\n pageUrl: typeof window !== 'undefined' ? window.location.href : '',\n });\n }\n\n this.cleanupFns.push(() => {\n this.mistReporter?.sendFinalReport('unmount');\n this.mistReporter?.destroy();\n this.mistReporter = null;\n });\n }\n\n private initializeMetaTrackManager(): void {\n const mistUrl = this.endpoints?.primary?.baseUrl;\n if (!mistUrl) return;\n\n this.metaTrackManager = new MetaTrackManager({\n mistBaseUrl: mistUrl,\n streamName: this.config.contentId,\n debug: this.config.debug,\n });\n\n this.metaTrackManager.connect();\n\n // Wire video timeupdate to MetaTrackManager\n if (this.videoElement) {\n const handleTimeUpdate = () => {\n if (this.videoElement && this.metaTrackManager) {\n this.metaTrackManager.setPlaybackTime(this.videoElement.currentTime);\n }\n };\n const handleSeeking = () => {\n if (this.videoElement && this.metaTrackManager) {\n this.metaTrackManager.onSeek(this.videoElement.currentTime);\n }\n };\n\n this.videoElement.addEventListener('timeupdate', handleTimeUpdate);\n this.videoElement.addEventListener('seeking', handleSeeking);\n\n this.cleanupFns.push(() => {\n this.videoElement?.removeEventListener('timeupdate', handleTimeUpdate);\n this.videoElement?.removeEventListener('seeking', handleSeeking);\n });\n }\n\n this.cleanupFns.push(() => {\n this.metaTrackManager?.disconnect();\n this.metaTrackManager = null;\n });\n }\n\n private cleanup(): void {\n // Run all cleanup functions\n this.cleanupFns.forEach((fn) => {\n try {\n fn();\n } catch {}\n });\n this.cleanupFns = [];\n\n // Destroy player manager's current player\n try {\n this.playerManager.destroy();\n } catch {}\n }\n\n private setState(state: PlayerState, context?: PlayerStateContext): void {\n this.state = state;\n\n // Only emit if state actually changed\n if (this.lastEmittedState !== state) {\n this.lastEmittedState = state;\n this.emit('stateChange', { state, context });\n }\n }\n\n private log(message: string): void {\n if (this.config.debug) {\n console.log(`[PlayerController] ${message}`);\n }\n }\n}\n\nexport default PlayerController;\n","/**\n * SubtitleManager - WebVTT subtitle track management\n *\n * Based on MistMetaPlayer's subtitle handling (wrappers/html5.js, webrtc.js).\n * Manages text tracks on video elements with support for:\n * - Loading WebVTT from MistServer URLs\n * - Multiple subtitle track selection\n * - Sync correction for WebRTC seek offsets\n */\n\nexport interface SubtitleTrackInfo {\n /** Track ID (from MistServer) */\n id: string;\n /** Display label */\n label: string;\n /** Language code (e.g., 'en', 'es') */\n lang: string;\n /** Source URL for WebVTT file */\n src: string;\n /** Whether this is the default track */\n default?: boolean;\n}\n\nexport interface SubtitleManagerConfig {\n /** Base URL for MistServer (for constructing track URLs) */\n mistBaseUrl?: string;\n /** Stream name */\n streamName?: string;\n /** URL append string (auth tokens, etc.) */\n urlAppend?: string;\n /** Debug logging */\n debug?: boolean;\n}\n\n/**\n * SubtitleManager handles text track lifecycle on a video element\n */\nexport class SubtitleManager {\n private video: HTMLVideoElement | null = null;\n private config: SubtitleManagerConfig;\n private currentTrackId: string | null = null;\n private seekOffset = 0;\n private debug: boolean;\n private listeners: Array<() => void> = [];\n\n constructor(config: SubtitleManagerConfig = {}) {\n this.config = config;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Attach to a video element\n */\n attach(video: HTMLVideoElement): void {\n this.detach();\n this.video = video;\n\n // Listen for events that may require sync correction\n const onLoadedData = () => this.correctSubtitleSync();\n const onSeeked = () => this.correctSubtitleSync();\n\n video.addEventListener('loadeddata', onLoadedData);\n video.addEventListener('seeked', onSeeked);\n\n this.listeners = [\n () => video.removeEventListener('loadeddata', onLoadedData),\n () => video.removeEventListener('seeked', onSeeked),\n ];\n }\n\n /**\n * Detach from video element\n */\n detach(): void {\n this.listeners.forEach(fn => fn());\n this.listeners = [];\n this.removeAllTracks();\n this.video = null;\n this.currentTrackId = null;\n }\n\n /**\n * Get available text tracks from the video element\n */\n getTextTracks(): TextTrack[] {\n if (!this.video) return [];\n return Array.from(this.video.textTracks);\n }\n\n /**\n * Get all track elements from the video\n */\n getTrackElements(): HTMLTrackElement[] {\n if (!this.video) return [];\n return Array.from(this.video.querySelectorAll('track'));\n }\n\n /**\n * Set the active subtitle track\n * Pass null to disable subtitles\n */\n setSubtitle(track: SubtitleTrackInfo | null): void {\n if (!this.video) {\n this.log('Cannot set subtitle: no video element attached');\n return;\n }\n\n // Remove existing subtitle tracks\n this.removeAllTracks();\n\n if (!track) {\n this.currentTrackId = null;\n this.log('Subtitles disabled');\n return;\n }\n\n // Create new track element\n const trackElement = document.createElement('track');\n trackElement.kind = 'subtitles';\n trackElement.label = track.label;\n trackElement.srclang = track.lang;\n trackElement.src = this.buildTrackUrl(track.src);\n trackElement.default = true;\n\n // Set up load handler for sync correction\n trackElement.addEventListener('load', () => {\n this.correctSubtitleSync();\n });\n\n this.video.appendChild(trackElement);\n this.currentTrackId = track.id;\n\n // Enable the track\n const textTrack = this.video.textTracks[this.video.textTracks.length - 1];\n if (textTrack) {\n textTrack.mode = 'showing';\n }\n\n this.log(`Subtitle track set: ${track.label} (${track.lang})`);\n }\n\n /**\n * Build track URL with base URL and append params\n */\n private buildTrackUrl(src: string): string {\n let url = src;\n\n // If relative URL and base URL provided, construct full URL\n if (!url.startsWith('http') && this.config.mistBaseUrl) {\n const base = this.config.mistBaseUrl.replace(/\\/$/, '');\n url = url.startsWith('/') ? `${base}${url}` : `${base}/${url}`;\n }\n\n // Append URL params if configured\n if (this.config.urlAppend) {\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}${this.config.urlAppend}`;\n }\n\n return url;\n }\n\n /**\n * Create subtitle track info from MistServer track metadata\n */\n static createTrackInfo(\n trackId: string,\n label: string,\n lang: string,\n baseUrl: string,\n streamName: string\n ): SubtitleTrackInfo {\n // MistServer WebVTT URL format\n const src = `${baseUrl}/${streamName}.vtt?track=${trackId}`;\n return { id: trackId, label, lang, src };\n }\n\n /**\n * Remove all track elements from video\n */\n removeAllTracks(): void {\n if (!this.video) return;\n\n const tracks = this.video.querySelectorAll('track');\n tracks.forEach(track => track.remove());\n }\n\n /**\n * Get currently active track ID\n */\n getCurrentTrackId(): string | null {\n return this.currentTrackId;\n }\n\n /**\n * Set seek offset for WebRTC sync correction\n * WebRTC playback has a seek offset that needs to be applied to subtitle timing\n */\n setSeekOffset(offset: number): void {\n const oldOffset = this.seekOffset;\n this.seekOffset = offset;\n\n // Re-sync if offset changed significantly\n if (Math.abs(oldOffset - offset) > 1) {\n this.correctSubtitleSync();\n }\n }\n\n /**\n * Correct subtitle timing based on seek offset\n * This is needed for WebRTC where video.currentTime doesn't match actual playback position\n */\n private correctSubtitleSync(): void {\n if (!this.video || this.video.textTracks.length === 0) return;\n\n const textTrack = this.video.textTracks[0];\n if (!textTrack || !textTrack.cues) return;\n\n const currentOffset = (textTrack as any).currentOffset || 0;\n\n // Don't bother if change is small\n if (Math.abs(this.seekOffset - currentOffset) < 1) return;\n\n this.log(`Correcting subtitle sync: offset ${currentOffset} -> ${this.seekOffset}`);\n\n // Collect and re-add cues with corrected timing\n const newCues: VTTCue[] = [];\n\n for (let i = textTrack.cues.length - 1; i >= 0; i--) {\n const cue = textTrack.cues[i] as VTTCue;\n textTrack.removeCue(cue);\n\n // Store original timing if not already stored\n if (!(cue as any).orig) {\n (cue as any).orig = { start: cue.startTime, end: cue.endTime };\n }\n\n // Apply offset correction\n cue.startTime = (cue as any).orig.start - this.seekOffset;\n cue.endTime = (cue as any).orig.end - this.seekOffset;\n\n newCues.push(cue);\n }\n\n // Re-add cues\n for (const cue of newCues) {\n try {\n textTrack.addCue(cue);\n } catch (e) {\n // Ignore errors from invalid cue timing\n }\n }\n\n (textTrack as any).currentOffset = this.seekOffset;\n }\n\n /**\n * Parse subtitle tracks from MistServer stream info\n */\n static parseTracksFromStreamInfo(\n streamInfo: { meta?: { tracks?: Record<string, { type: string; codec: string; lang?: string }> } },\n baseUrl: string,\n streamName: string\n ): SubtitleTrackInfo[] {\n const tracks: SubtitleTrackInfo[] = [];\n\n if (!streamInfo.meta?.tracks) return tracks;\n\n for (const [trackId, trackData] of Object.entries(streamInfo.meta.tracks)) {\n if (trackData.type === 'meta' && trackData.codec === 'subtitle') {\n const lang = trackData.lang || 'und';\n const label = lang === 'und' ? `Subtitles ${trackId}` : lang.toUpperCase();\n tracks.push(SubtitleManager.createTrackInfo(trackId, label, lang, baseUrl, streamName));\n }\n }\n\n return tracks;\n }\n\n /**\n * Debug logging\n */\n private log(message: string): void {\n if (this.debug) {\n console.debug(`[SubtitleManager] ${message}`);\n }\n }\n\n /**\n * Cleanup\n */\n destroy(): void {\n this.detach();\n }\n}\n\nexport default SubtitleManager;\n","import type { TelemetryPayload, TelemetryOptions, PlaybackQuality, ContentType } from '../types';\n\n/**\n * Generate a unique session ID\n */\nfunction generateSessionId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\nexport interface TelemetryReporterConfig {\n /** Telemetry endpoint URL */\n endpoint: string;\n /** Auth token for endpoint */\n authToken?: string;\n /** Report interval in ms (default: 5000) */\n interval?: number;\n /** Batch size before flush (default: 1) */\n batchSize?: number;\n /** Content ID being played */\n contentId: string;\n /** Content type */\n contentType: ContentType;\n /** Player type name */\n playerType: string;\n /** Protocol being used */\n protocol: string;\n}\n\n/**\n * TelemetryReporter - Sends playback metrics to server\n *\n * Features:\n * - Batched reporting at configurable interval\n * - Retry with exponential backoff on failure\n * - Uses navigator.sendBeacon() for reliable page unload reporting\n * - Tracks errors during playback\n */\nexport class TelemetryReporter {\n private config: Required<TelemetryReporterConfig>;\n private sessionId: string;\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private pendingPayloads: TelemetryPayload[] = [];\n private errors: Array<{ code: string; message: string; timestamp: number }> = [];\n private stallCount = 0;\n private totalStallMs = 0;\n private lastStallStart = 0;\n private videoElement: HTMLVideoElement | null = null;\n private qualityGetter: (() => PlaybackQuality | null) | null = null;\n private listeners: Array<() => void> = [];\n\n constructor(config: TelemetryReporterConfig) {\n this.config = {\n endpoint: config.endpoint,\n authToken: config.authToken ?? '',\n interval: config.interval ?? 5000,\n batchSize: config.batchSize ?? 1,\n contentId: config.contentId,\n contentType: config.contentType,\n playerType: config.playerType,\n protocol: config.protocol,\n };\n this.sessionId = generateSessionId();\n }\n\n /**\n * Start telemetry reporting\n */\n start(\n videoElement: HTMLVideoElement,\n qualityGetter?: () => PlaybackQuality | null\n ): void {\n this.stop();\n\n this.videoElement = videoElement;\n this.qualityGetter = qualityGetter ?? null;\n this.stallCount = 0;\n this.totalStallMs = 0;\n this.errors = [];\n\n // Track stalls\n const onWaiting = () => {\n this.stallCount++;\n this.lastStallStart = performance.now();\n };\n\n const onPlaying = () => {\n if (this.lastStallStart > 0) {\n this.totalStallMs += performance.now() - this.lastStallStart;\n this.lastStallStart = 0;\n }\n };\n\n const onError = () => {\n const error = videoElement.error;\n if (error) {\n this.errors.push({\n code: String(error.code),\n message: error.message || 'Unknown error',\n timestamp: Date.now(),\n });\n }\n };\n\n videoElement.addEventListener('waiting', onWaiting);\n videoElement.addEventListener('playing', onPlaying);\n videoElement.addEventListener('error', onError);\n\n this.listeners = [\n () => videoElement.removeEventListener('waiting', onWaiting),\n () => videoElement.removeEventListener('playing', onPlaying),\n () => videoElement.removeEventListener('error', onError),\n ];\n\n // Setup unload handler for reliable final report\n const onUnload = () => this.flushSync();\n window.addEventListener('beforeunload', onUnload);\n window.addEventListener('pagehide', onUnload);\n this.listeners.push(\n () => window.removeEventListener('beforeunload', onUnload),\n () => window.removeEventListener('pagehide', onUnload)\n );\n\n // Start reporting interval\n this.intervalId = setInterval(() => this.report(), this.config.interval);\n\n // Take initial report\n this.report();\n }\n\n /**\n * Stop telemetry reporting\n */\n stop(): void {\n // Final report before stopping\n this.flushSync();\n\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n this.listeners.forEach(cleanup => cleanup());\n this.listeners = [];\n\n this.videoElement = null;\n this.qualityGetter = null;\n }\n\n /**\n * Record a custom error\n */\n recordError(code: string, message: string): void {\n this.errors.push({\n code,\n message,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Generate telemetry payload\n */\n private generatePayload(): TelemetryPayload | null {\n const video = this.videoElement;\n if (!video) return null;\n\n // Get quality metrics if available\n const quality = this.qualityGetter?.() ?? null;\n\n // Get frame stats if available\n let framesDecoded = 0;\n let framesDropped = 0;\n\n if ('getVideoPlaybackQuality' in video) {\n const stats = video.getVideoPlaybackQuality();\n framesDecoded = stats.totalVideoFrames;\n framesDropped = stats.droppedVideoFrames;\n }\n\n // Calculate buffered seconds\n let bufferedSeconds = 0;\n if (video.buffered.length > 0) {\n for (let i = 0; i < video.buffered.length; i++) {\n if (video.buffered.start(i) <= video.currentTime && video.buffered.end(i) > video.currentTime) {\n bufferedSeconds = video.buffered.end(i) - video.currentTime;\n break;\n }\n }\n }\n\n return {\n timestamp: Date.now(),\n sessionId: this.sessionId,\n contentId: this.config.contentId,\n contentType: this.config.contentType,\n metrics: {\n currentTime: video.currentTime,\n duration: isFinite(video.duration) ? video.duration : -1,\n bufferedSeconds,\n stallCount: this.stallCount,\n totalStallMs: this.totalStallMs,\n bitrate: quality?.bitrate ?? 0,\n qualityScore: quality?.score ?? 100,\n framesDecoded,\n framesDropped,\n playerType: this.config.playerType,\n protocol: this.config.protocol,\n resolution: video.videoWidth > 0 ? {\n width: video.videoWidth,\n height: video.videoHeight,\n } : undefined,\n },\n errors: this.errors.length > 0 ? [...this.errors] : undefined,\n };\n }\n\n /**\n * Send telemetry report\n */\n private async report(): Promise<void> {\n const payload = this.generatePayload();\n if (!payload) return;\n\n this.pendingPayloads.push(payload);\n\n // Flush if batch size reached\n if (this.pendingPayloads.length >= this.config.batchSize) {\n await this.flush();\n }\n }\n\n /**\n * Flush pending payloads (async)\n */\n private async flush(): Promise<void> {\n if (this.pendingPayloads.length === 0) return;\n\n const payloads = [...this.pendingPayloads];\n this.pendingPayloads = [];\n\n try {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(this.config.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(payloads.length === 1 ? payloads[0] : payloads),\n });\n\n if (!response.ok) {\n console.warn('[TelemetryReporter] Report failed:', response.status);\n // Re-queue failed payloads (up to a limit)\n if (this.pendingPayloads.length < 10) {\n this.pendingPayloads.unshift(...payloads);\n }\n } else {\n // Clear reported errors\n this.errors = [];\n }\n } catch (error) {\n console.warn('[TelemetryReporter] Report error:', error);\n // Re-queue failed payloads\n if (this.pendingPayloads.length < 10) {\n this.pendingPayloads.unshift(...payloads);\n }\n }\n }\n\n /**\n * Flush synchronously using sendBeacon (for page unload)\n */\n private flushSync(): void {\n const payload = this.generatePayload();\n if (!payload) return;\n\n const payloads = [...this.pendingPayloads, payload];\n this.pendingPayloads = [];\n\n try {\n const data = JSON.stringify(payloads.length === 1 ? payloads[0] : payloads);\n navigator.sendBeacon(this.config.endpoint, new Blob([data], { type: 'application/json' }));\n } catch (error) {\n console.warn('[TelemetryReporter] Beacon failed:', error);\n }\n }\n\n /**\n * Get session ID\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Check if reporting is active\n */\n isActive(): boolean {\n return this.intervalId !== null;\n }\n}\n\nexport default TelemetryReporter;\n","/**\n * TimeFormat.ts\n *\n * Time formatting utilities for player controls.\n * Used by React, Svelte, and Vanilla wrappers.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TimeDisplayParams {\n isLive: boolean;\n currentTime: number;\n duration: number;\n liveEdge: number;\n seekableStart: number;\n /** Unix timestamp (ms) at stream time 0 - for wall-clock display */\n unixoffset?: number;\n}\n\n// ============================================================================\n// Pure Functions\n// ============================================================================\n\n/**\n * Format seconds as MM:SS or HH:MM:SS.\n *\n * @param seconds - Time in seconds\n * @returns Formatted time string, or \"LIVE\" for invalid input\n *\n * @example\n * formatTime(65) // \"01:05\"\n * formatTime(3665) // \"1:01:05\"\n * formatTime(-1) // \"LIVE\"\n * formatTime(NaN) // \"LIVE\"\n */\nexport function formatTime(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) {\n return 'LIVE';\n }\n\n const total = Math.floor(seconds);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n\n if (hours > 0) {\n return `${hours}:${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n }\n\n return `${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n}\n\n/**\n * Format a Date as wall-clock time (HH:MM:SS).\n *\n * @param date - Date object\n * @returns Formatted time string in HH:MM:SS format\n *\n * @example\n * formatClockTime(new Date('2024-01-15T14:30:45')) // \"14:30:45\"\n */\nexport function formatClockTime(date: Date): string {\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n return `${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * Format time display for player controls.\n *\n * For live streams:\n * - With unixoffset: Shows actual wall-clock time (HH:MM:SS)\n * - With seekable window: Shows time behind live (-MM:SS) or \"LIVE\"\n * - Fallback: Shows elapsed time\n *\n * For VOD:\n * - Shows \"current / duration\" (MM:SS / MM:SS)\n *\n * @param params - Display parameters\n * @returns Formatted time display string\n *\n * @example\n * // Live with unixoffset\n * formatTimeDisplay({ isLive: true, currentTime: 60, unixoffset: 1705330245000, ... })\n * // \"14:30:45\"\n *\n * // Live behind\n * formatTimeDisplay({ isLive: true, currentTime: 50, liveEdge: 60, ... })\n * // \"-00:10\"\n *\n * // VOD\n * formatTimeDisplay({ isLive: false, currentTime: 65, duration: 300, ... })\n * // \"01:05 / 05:00\"\n */\nexport function formatTimeDisplay(params: TimeDisplayParams): string {\n const { isLive, currentTime, duration, liveEdge, seekableStart, unixoffset } = params;\n\n if (isLive) {\n // For live: show actual wall-clock time using unixoffset\n if (unixoffset && unixoffset > 0) {\n // unixoffset is Unix timestamp in ms at timestamp 0 of the stream\n // currentTime is playback position in seconds\n const actualTimeMs = unixoffset + (currentTime * 1000);\n const actualDate = new Date(actualTimeMs);\n return formatClockTime(actualDate);\n }\n\n // Fallback: show relative time if no unixoffset\n const seekableWindow = liveEdge - seekableStart;\n if (seekableWindow > 0) {\n const behindSeconds = liveEdge - currentTime;\n if (behindSeconds < 1) {\n return 'LIVE';\n }\n return `-${formatTime(Math.abs(behindSeconds))}`;\n }\n\n return formatTime(currentTime);\n }\n\n // VOD: show current / total\n if (Number.isFinite(duration) && duration > 0) {\n return `${formatTime(currentTime)} / ${formatTime(duration)}`;\n }\n\n return formatTime(currentTime);\n}\n\n/**\n * Format time for seek bar tooltip.\n * For live streams, can show time relative to live edge.\n *\n * @param time - Time position in seconds\n * @param isLive - Whether stream is live\n * @param liveEdge - Live edge position (for relative display)\n * @returns Formatted tooltip time\n */\nexport function formatTooltipTime(\n time: number,\n isLive: boolean,\n liveEdge?: number\n): string {\n if (isLive && liveEdge !== undefined && Number.isFinite(liveEdge)) {\n const behindSeconds = liveEdge - time;\n if (behindSeconds < 1) {\n return 'LIVE';\n }\n return `-${formatTime(Math.abs(behindSeconds))}`;\n }\n\n return formatTime(time);\n}\n\n/**\n * Format duration for display (e.g., in stats panel).\n * Handles edge cases like infinite duration for live streams.\n *\n * @param duration - Duration in seconds\n * @param isLive - Whether content is live\n * @returns Formatted duration string\n */\nexport function formatDuration(duration: number, isLive?: boolean): string {\n if (isLive || !Number.isFinite(duration)) {\n return 'LIVE';\n }\n\n return formatTime(duration);\n}\n\n/**\n * Parse time string (HH:MM:SS or MM:SS) to seconds.\n *\n * @param timeStr - Time string to parse\n * @returns Time in seconds, or NaN if invalid\n *\n * @example\n * parseTime(\"01:30\") // 90\n * parseTime(\"1:30:45\") // 5445\n * parseTime(\"invalid\") // NaN\n */\nexport function parseTime(timeStr: string): number {\n const parts = timeStr.split(':').map(Number);\n\n if (parts.some(isNaN)) {\n return NaN;\n }\n\n if (parts.length === 2) {\n // MM:SS\n const [minutes, seconds] = parts;\n return minutes * 60 + seconds;\n }\n\n if (parts.length === 3) {\n // HH:MM:SS\n const [hours, minutes, seconds] = parts;\n return hours * 3600 + minutes * 60 + seconds;\n }\n\n return NaN;\n}\n","let stylesInjected = false;\nconst STYLE_URL = \"player.css\";\n\n/**\n * Ensures the compiled player stylesheet is imported once. When bundling with\n * tools that respect package `style` fields, simply importing the module is enough.\n * For host environments that do not, calling this helper will inject a link tag.\n */\nexport function ensurePlayerStyles(): void {\n if (typeof document === \"undefined\") return;\n if (stylesInjected) return;\n const existing = document.querySelector<HTMLLinkElement>('link[data-fw-player-style=\"true\"]');\n if (existing) {\n stylesInjected = true;\n return;\n }\n\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = getStylesheetUrl();\n link.setAttribute(\"data-fw-player-style\", \"true\");\n document.head.appendChild(link);\n stylesInjected = true;\n}\n\n/**\n * For SSR-first apps, inject the CSS manually and mark it as applied.\n */\nexport function injectPlayerStyles(href?: string): void {\n if (typeof document === \"undefined\") return;\n stylesInjected = true;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href ?? getStylesheetUrl();\n link.setAttribute(\"data-fw-player-style\", \"true\");\n document.head.appendChild(link);\n}\n\nfunction getStylesheetUrl(): string {\n const current = typeof document !== \"undefined\" ? document.currentScript : null;\n const src = current && \"src\" in current ? (current as HTMLScriptElement).src : undefined;\n if (!src) return STYLE_URL;\n try {\n const url = new URL(src);\n url.pathname = url.pathname.replace(/\\/[^/]*$/, `/${STYLE_URL}`);\n return url.toString();\n } catch {\n return STYLE_URL;\n }\n}\n\nexport default ensurePlayerStyles;\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","const CLASS_PART_SEPARATOR = '-';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift();\n }\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n const conflicts = conflictingClassGroups[classGroupId] || [];\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];\n }\n return conflicts;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, classPartObject) => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[0];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart;\n }\n if (classPartObject.validators.length === 0) {\n return undefined;\n }\n const classRest = classParts.join(CLASS_PART_SEPARATOR);\n return classPartObject.validators.find(({\n validator\n }) => validator(classRest))?.classGroupId;\n};\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/;\nconst getGroupIdForArbitraryProperty = className => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];\n const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property;\n }\n }\n};\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n prefix\n } = config;\n const classMap = {\n nextPart: new Map(),\n validators: []\n };\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme);\n });\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n classGroup.forEach(classDefinition => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n return;\n }\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId\n });\n return;\n }\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);\n });\n });\n};\nconst getPart = (classPartObject, path) => {\n let currentClassPartObject = classPartObject;\n path.split(CLASS_PART_SEPARATOR).forEach(pathPart => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: []\n });\n }\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);\n });\n return currentClassPartObject;\n};\nconst isThemeGetter = func => func.isThemeGetter;\nconst getPrefixedClassGroupEntries = (classGroupEntries, prefix) => {\n if (!prefix) {\n return classGroupEntries;\n }\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map(classDefinition => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition;\n }\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]));\n }\n return classDefinition;\n });\n return [classGroupId, prefixedClassGroup];\n });\n};\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = new Map();\n let previousCache = new Map();\n const update = (key, value) => {\n cache.set(key, value);\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = new Map();\n }\n };\n return {\n get(key) {\n let value = cache.get(key);\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value);\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst createParseClassName = config => {\n const {\n separator,\n experimentalParseClassName\n } = config;\n const isSeparatorSingleCharacter = separator.length === 1;\n const firstSeparatorCharacter = separator[0];\n const separatorLength = separator.length;\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = className => {\n const modifiers = [];\n let bracketDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index];\n if (bracketDepth === 0) {\n if (currentCharacter === firstSeparatorCharacter && (isSeparatorSingleCharacter || className.slice(index, index + separatorLength) === separator)) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + separatorLength;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') {\n bracketDepth++;\n } else if (currentCharacter === ']') {\n bracketDepth--;\n }\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);\n const hasImportantModifier = baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);\n const baseClassName = hasImportantModifier ? baseClassNameWithImportantModifier.substring(1) : baseClassNameWithImportantModifier;\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n };\n };\n if (experimentalParseClassName) {\n return className => experimentalParseClassName({\n className,\n parseClassName\n });\n }\n return parseClassName;\n};\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst sortModifiers = modifiers => {\n if (modifiers.length <= 1) {\n return modifiers;\n }\n const sortedModifiers = [];\n let unsortedModifiers = [];\n modifiers.forEach(modifier => {\n const isArbitraryVariant = modifier[0] === '[';\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier);\n unsortedModifiers = [];\n } else {\n unsortedModifiers.push(modifier);\n }\n });\n sortedModifiers.push(...unsortedModifiers.sort());\n return sortedModifiers;\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition);\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n const variantModifier = sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nfunction twJoin() {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < arguments.length) {\n if (argument = arguments[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n}\nconst toValue = mix => {\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nfunction createTailwindMerge(createConfigFirst, ...createConfigRest) {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall = initTailwindMerge;\n function initTailwindMerge(classList) {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n }\n function tailwindMerge(classList) {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n }\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments));\n };\n}\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || [];\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i;\nconst fractionRegex = /^\\d+\\/\\d+$/;\nconst stringLengths = /*#__PURE__*/new Set(['px', 'full', 'screen']);\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isLength = value => isNumber(value) || stringLengths.has(value) || fractionRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, 'length', isLengthOnly);\nconst isNumber = value => Boolean(value) && !Number.isNaN(Number(value));\nconst isArbitraryNumber = value => getIsArbitraryValue(value, 'number', isNumber);\nconst isInteger = value => Boolean(value) && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst sizeLabels = /*#__PURE__*/new Set(['length', 'size', 'percentage']);\nconst isArbitrarySize = value => getIsArbitraryValue(value, sizeLabels, isNever);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, 'position', isNever);\nconst imageLabels = /*#__PURE__*/new Set(['image', 'url']);\nconst isArbitraryImage = value => getIsArbitraryValue(value, imageLabels, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, '', isShadow);\nconst isAny = () => true;\nconst getIsArbitraryValue = (value, label, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n const colors = fromTheme('colors');\n const spacing = fromTheme('spacing');\n const blur = fromTheme('blur');\n const brightness = fromTheme('brightness');\n const borderColor = fromTheme('borderColor');\n const borderRadius = fromTheme('borderRadius');\n const borderSpacing = fromTheme('borderSpacing');\n const borderWidth = fromTheme('borderWidth');\n const contrast = fromTheme('contrast');\n const grayscale = fromTheme('grayscale');\n const hueRotate = fromTheme('hueRotate');\n const invert = fromTheme('invert');\n const gap = fromTheme('gap');\n const gradientColorStops = fromTheme('gradientColorStops');\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions');\n const inset = fromTheme('inset');\n const margin = fromTheme('margin');\n const opacity = fromTheme('opacity');\n const padding = fromTheme('padding');\n const saturate = fromTheme('saturate');\n const scale = fromTheme('scale');\n const sepia = fromTheme('sepia');\n const skew = fromTheme('skew');\n const space = fromTheme('space');\n const translate = fromTheme('translate');\n const getOverscroll = () => ['auto', 'contain', 'none'];\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing];\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing];\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength];\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue];\n const getPositions = () => ['bottom', 'center', 'left', 'left-bottom', 'left-top', 'right', 'right-bottom', 'right-top', 'top'];\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'];\n const getBlendModes = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const getAlign = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'];\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue];\n const getBreaks = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue];\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary()\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', 'video', isArbitraryValue]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isTshirtSize]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': getBreaks()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': getBreaks()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: [...getPositions(), isArbitraryValue]\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: getOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': getOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': getOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: getOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': getOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': getOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: [inset]\n }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': [inset]\n }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': [inset]\n }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{\n start: [inset]\n }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{\n end: [inset]\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: [inset]\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: [inset]\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: [inset]\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: [inset]\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: ['auto', isInteger, isArbitraryValue]\n }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: getSpacingWithAutoAndArbitrary()\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['wrap', 'wrap-reverse', 'nowrap']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: ['1', 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: getZeroAndEmpty()\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: getZeroAndEmpty()\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: ['first', 'last', 'none', isInteger, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': [isAny]\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: ['auto', {\n span: ['full', isInteger, isArbitraryValue]\n }, isArbitraryValue]\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': [isAny]\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: ['auto', {\n span: [isInteger, isArbitraryValue]\n }, isArbitraryValue]\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: [gap]\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': [gap]\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': [gap]\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: ['normal', ...getAlign()]\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': ['start', 'end', 'center', 'stretch']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', 'start', 'end', 'center', 'stretch']\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...getAlign(), 'baseline']\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: ['start', 'end', 'center', 'baseline', 'stretch']\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline']\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': [...getAlign(), 'baseline']\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': ['start', 'end', 'center', 'baseline', 'stretch']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', 'start', 'end', 'center', 'stretch']\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: [padding]\n }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: [padding]\n }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: [padding]\n }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: [padding]\n }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: [padding]\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: [padding]\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: [padding]\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: [padding]\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: [padding]\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: [margin]\n }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: [margin]\n }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: [margin]\n }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: [margin]\n }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: [margin]\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: [margin]\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: [margin]\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: [margin]\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: [margin]\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{\n 'space-x': [space]\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{\n 'space-y': [space]\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: ['auto', 'min', 'max', 'fit', 'svw', 'lvw', 'dvw', isArbitraryValue, spacing]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit']\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [isArbitraryValue, spacing, 'none', 'full', 'min', 'max', 'fit', 'prose', {\n screen: [isTshirtSize]\n }, isTshirtSize]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{\n size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit']\n }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', isTshirtSize, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black', isArbitraryNumber]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isAny]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest', isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': ['none', isNumber, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose', isLength, isArbitraryValue]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryValue]\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['none', 'disc', 'decimal', isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: [colors]\n }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{\n 'placeholder-opacity': [opacity]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: [colors]\n }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{\n 'text-opacity': [opacity]\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...getLineStyles(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: ['auto', 'from-font', isLength, isArbitraryLength]\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': ['auto', isLength, isArbitraryValue]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: [colors]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: getSpacingWithArbitrary()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryValue]\n }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{\n 'bg-opacity': [opacity]\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: [...getPositions(), isArbitraryPosition]\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: ['no-repeat', {\n repeat: ['', 'x', 'y', 'round', 'space']\n }]\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: ['auto', 'cover', 'contain', isArbitrarySize]\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: [colors]\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: [gradientColorStops]\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: [gradientColorStops]\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: [gradientColorStops]\n }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: [borderRadius]\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': [borderRadius]\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': [borderRadius]\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': [borderRadius]\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': [borderRadius]\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': [borderRadius]\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': [borderRadius]\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': [borderRadius]\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': [borderRadius]\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': [borderRadius]\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': [borderRadius]\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': [borderRadius]\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': [borderRadius]\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': [borderRadius]\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': [borderRadius]\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: [borderWidth]\n }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': [borderWidth]\n }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': [borderWidth]\n }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': [borderWidth]\n }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': [borderWidth]\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': [borderWidth]\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': [borderWidth]\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': [borderWidth]\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': [borderWidth]\n }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{\n 'border-opacity': [opacity]\n }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...getLineStyles(), 'hidden']\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{\n 'divide-x': [borderWidth]\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{\n 'divide-y': [borderWidth]\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{\n 'divide-opacity': [opacity]\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{\n divide: getLineStyles()\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: [borderColor]\n }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': [borderColor]\n }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': [borderColor]\n }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': [borderColor]\n }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': [borderColor]\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': [borderColor]\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': [borderColor]\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': [borderColor]\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': [borderColor]\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: [borderColor]\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: ['', ...getLineStyles()]\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isLength, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: [isLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: [colors]\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{\n ring: getLengthWithEmptyAndArbitrary()\n }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{\n ring: [colors]\n }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{\n 'ring-opacity': [opacity]\n }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{\n 'ring-offset': [isLength, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{\n 'ring-offset': [colors]\n }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{\n shadow: [isAny]\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [opacity]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': getBlendModes()\n }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: ['', 'none']\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: [blur]\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [brightness]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [contrast]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue]\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: [grayscale]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [hueRotate]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: [invert]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [saturate]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: [sepia]\n }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': ['', 'none']\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': [blur]\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [brightness]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [contrast]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': [grayscale]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [hueRotate]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': [invert]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [opacity]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [saturate]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': [sepia]\n }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': [borderSpacing]\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': [borderSpacing]\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': [borderSpacing]\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['none', 'all', '', 'colors', 'opacity', 'shadow', 'transform', isArbitraryValue]\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: getNumberAndArbitrary()\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: getNumberAndArbitrary()\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue]\n }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: ['', 'gpu', 'none']\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: [scale]\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': [scale]\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': [scale]\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: [isInteger, isArbitraryValue]\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': [translate]\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': [translate]\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': [skew]\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': [skew]\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: ['center', 'top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', isArbitraryValue]\n }],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: ['auto', colors]\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryValue]\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: [colors]\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['none', 'auto']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', 'y', 'x', '']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue]\n }],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: [colors, 'none']\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: [colors, 'none']\n }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n }\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n separator,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'separator', separator);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n for (const configKey in override) {\n overrideConfigProperties(baseConfig[configKey], override[configKey]);\n }\n for (const key in extend) {\n mergeConfigProperties(baseConfig[key], extend[key]);\n }\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = (baseObject[key] || []).concat(mergeValue);\n }\n }\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n"],"names":[],"mappings":"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","x_google_ignoreList":[41,42]}