@livepeer-frameworks/player-core 0.1.0 → 0.1.2
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.
- package/README.md +11 -9
- package/dist/cjs/core/ABRController.js +456 -0
- package/dist/cjs/core/ABRController.js.map +1 -0
- package/dist/cjs/core/CodecUtils.js +195 -0
- package/dist/cjs/core/CodecUtils.js.map +1 -0
- package/dist/cjs/core/ErrorClassifier.js +410 -0
- package/dist/cjs/core/ErrorClassifier.js.map +1 -0
- package/dist/cjs/core/EventEmitter.js +108 -0
- package/dist/cjs/core/EventEmitter.js.map +1 -0
- package/dist/cjs/core/GatewayClient.js +342 -0
- package/dist/cjs/core/GatewayClient.js.map +1 -0
- package/dist/cjs/core/InteractionController.js +606 -0
- package/dist/cjs/core/InteractionController.js.map +1 -0
- package/dist/cjs/core/LiveDurationProxy.js +186 -0
- package/dist/cjs/core/LiveDurationProxy.js.map +1 -0
- package/dist/cjs/core/MetaTrackManager.js +624 -0
- package/dist/cjs/core/MetaTrackManager.js.map +1 -0
- package/dist/cjs/core/MistReporter.js +449 -0
- package/dist/cjs/core/MistReporter.js.map +1 -0
- package/dist/cjs/core/MistSignaling.js +264 -0
- package/dist/cjs/core/MistSignaling.js.map +1 -0
- package/dist/cjs/core/PlayerController.js +2658 -0
- package/dist/cjs/core/PlayerController.js.map +1 -0
- package/dist/cjs/core/PlayerInterface.js +269 -0
- package/dist/cjs/core/PlayerInterface.js.map +1 -0
- package/dist/cjs/core/PlayerManager.js +806 -0
- package/dist/cjs/core/PlayerManager.js.map +1 -0
- package/dist/cjs/core/PlayerRegistry.js +270 -0
- package/dist/cjs/core/PlayerRegistry.js.map +1 -0
- package/dist/cjs/core/QualityMonitor.js +474 -0
- package/dist/cjs/core/QualityMonitor.js.map +1 -0
- package/dist/cjs/core/SeekingUtils.js +292 -0
- package/dist/cjs/core/SeekingUtils.js.map +1 -0
- package/dist/cjs/core/StreamStateClient.js +381 -0
- package/dist/cjs/core/StreamStateClient.js.map +1 -0
- package/dist/cjs/core/SubtitleManager.js +227 -0
- package/dist/cjs/core/SubtitleManager.js.map +1 -0
- package/dist/cjs/core/TelemetryReporter.js +258 -0
- package/dist/cjs/core/TelemetryReporter.js.map +1 -0
- package/dist/cjs/core/TimeFormat.js +176 -0
- package/dist/cjs/core/TimeFormat.js.map +1 -0
- package/dist/cjs/core/TimerManager.js +176 -0
- package/dist/cjs/core/TimerManager.js.map +1 -0
- package/dist/cjs/core/UrlUtils.js +160 -0
- package/dist/cjs/core/UrlUtils.js.map +1 -0
- package/dist/cjs/core/detector.js +293 -0
- package/dist/cjs/core/detector.js.map +1 -0
- package/dist/cjs/core/scorer.js +443 -0
- package/dist/cjs/core/scorer.js.map +1 -0
- package/dist/cjs/index.js +121 -20134
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/utils.js +11 -0
- package/dist/cjs/lib/utils.js.map +1 -0
- package/dist/cjs/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js +6 -0
- package/dist/cjs/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/cjs/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js +3042 -0
- package/dist/cjs/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/cjs/players/DashJsPlayer.js +638 -0
- package/dist/cjs/players/DashJsPlayer.js.map +1 -0
- package/dist/cjs/players/HlsJsPlayer.js +482 -0
- package/dist/cjs/players/HlsJsPlayer.js.map +1 -0
- package/dist/cjs/players/MewsWsPlayer/SourceBufferManager.js +522 -0
- package/dist/cjs/players/MewsWsPlayer/SourceBufferManager.js.map +1 -0
- package/dist/cjs/players/MewsWsPlayer/WebSocketManager.js +215 -0
- package/dist/cjs/players/MewsWsPlayer/WebSocketManager.js.map +1 -0
- package/dist/cjs/players/MewsWsPlayer/index.js +987 -0
- package/dist/cjs/players/MewsWsPlayer/index.js.map +1 -0
- package/dist/cjs/players/MistPlayer.js +185 -0
- package/dist/cjs/players/MistPlayer.js.map +1 -0
- package/dist/cjs/players/MistWebRTCPlayer/index.js +635 -0
- package/dist/cjs/players/MistWebRTCPlayer/index.js.map +1 -0
- package/dist/cjs/players/NativePlayer.js +762 -0
- package/dist/cjs/players/NativePlayer.js.map +1 -0
- package/dist/cjs/players/VideoJsPlayer.js +585 -0
- package/dist/cjs/players/VideoJsPlayer.js.map +1 -0
- package/dist/cjs/players/WebCodecsPlayer/JitterBuffer.js +236 -0
- package/dist/cjs/players/WebCodecsPlayer/JitterBuffer.js.map +1 -0
- package/dist/cjs/players/WebCodecsPlayer/LatencyProfiles.js +143 -0
- package/dist/cjs/players/WebCodecsPlayer/LatencyProfiles.js.map +1 -0
- package/dist/cjs/players/WebCodecsPlayer/RawChunkParser.js +96 -0
- package/dist/cjs/players/WebCodecsPlayer/RawChunkParser.js.map +1 -0
- package/dist/cjs/players/WebCodecsPlayer/SyncController.js +359 -0
- package/dist/cjs/players/WebCodecsPlayer/SyncController.js.map +1 -0
- package/dist/cjs/players/WebCodecsPlayer/WebSocketController.js +460 -0
- package/dist/cjs/players/WebCodecsPlayer/WebSocketController.js.map +1 -0
- package/dist/cjs/players/WebCodecsPlayer/index.js +1467 -0
- package/dist/cjs/players/WebCodecsPlayer/index.js.map +1 -0
- package/dist/cjs/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js +320 -0
- package/dist/cjs/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js.map +1 -0
- package/dist/cjs/styles/index.js +57 -0
- package/dist/cjs/styles/index.js.map +1 -0
- package/dist/cjs/vanilla/FrameWorksPlayer.js +269 -0
- package/dist/cjs/vanilla/FrameWorksPlayer.js.map +1 -0
- package/dist/cjs/vanilla.js +11 -0
- package/dist/cjs/vanilla.js.map +1 -0
- package/dist/esm/core/ABRController.js +454 -0
- package/dist/esm/core/ABRController.js.map +1 -0
- package/dist/esm/core/CodecUtils.js +193 -0
- package/dist/esm/core/CodecUtils.js.map +1 -0
- package/dist/esm/core/ErrorClassifier.js +408 -0
- package/dist/esm/core/ErrorClassifier.js.map +1 -0
- package/dist/esm/core/EventEmitter.js +106 -0
- package/dist/esm/core/EventEmitter.js.map +1 -0
- package/dist/esm/core/GatewayClient.js +340 -0
- package/dist/esm/core/GatewayClient.js.map +1 -0
- package/dist/esm/core/InteractionController.js +604 -0
- package/dist/esm/core/InteractionController.js.map +1 -0
- package/dist/esm/core/LiveDurationProxy.js +184 -0
- package/dist/esm/core/LiveDurationProxy.js.map +1 -0
- package/dist/esm/core/MetaTrackManager.js +622 -0
- package/dist/esm/core/MetaTrackManager.js.map +1 -0
- package/dist/esm/core/MistReporter.js +447 -0
- package/dist/esm/core/MistReporter.js.map +1 -0
- package/dist/esm/core/MistSignaling.js +262 -0
- package/dist/esm/core/MistSignaling.js.map +1 -0
- package/dist/esm/core/PlayerController.js +2651 -0
- package/dist/esm/core/PlayerController.js.map +1 -0
- package/dist/esm/core/PlayerInterface.js +267 -0
- package/dist/esm/core/PlayerInterface.js.map +1 -0
- package/dist/esm/core/PlayerManager.js +804 -0
- package/dist/esm/core/PlayerManager.js.map +1 -0
- package/dist/esm/core/PlayerRegistry.js +264 -0
- package/dist/esm/core/PlayerRegistry.js.map +1 -0
- package/dist/esm/core/QualityMonitor.js +471 -0
- package/dist/esm/core/QualityMonitor.js.map +1 -0
- package/dist/esm/core/SeekingUtils.js +280 -0
- package/dist/esm/core/SeekingUtils.js.map +1 -0
- package/dist/esm/core/StreamStateClient.js +379 -0
- package/dist/esm/core/StreamStateClient.js.map +1 -0
- package/dist/esm/core/SubtitleManager.js +225 -0
- package/dist/esm/core/SubtitleManager.js.map +1 -0
- package/dist/esm/core/TelemetryReporter.js +256 -0
- package/dist/esm/core/TelemetryReporter.js.map +1 -0
- package/dist/esm/core/TimeFormat.js +169 -0
- package/dist/esm/core/TimeFormat.js.map +1 -0
- package/dist/esm/core/TimerManager.js +174 -0
- package/dist/esm/core/TimerManager.js.map +1 -0
- package/dist/esm/core/UrlUtils.js +151 -0
- package/dist/esm/core/UrlUtils.js.map +1 -0
- package/dist/esm/core/detector.js +279 -0
- package/dist/esm/core/detector.js.map +1 -0
- package/dist/esm/core/scorer.js +422 -0
- package/dist/esm/core/scorer.js.map +1 -0
- package/dist/esm/index.js +26 -20043
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/utils.js +9 -0
- package/dist/esm/lib/utils.js.map +1 -0
- package/dist/esm/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js +4 -0
- package/dist/esm/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/esm/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js +3036 -0
- package/dist/esm/node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/esm/players/DashJsPlayer.js +636 -0
- package/dist/esm/players/DashJsPlayer.js.map +1 -0
- package/dist/esm/players/HlsJsPlayer.js +480 -0
- package/dist/esm/players/HlsJsPlayer.js.map +1 -0
- package/dist/esm/players/MewsWsPlayer/SourceBufferManager.js +520 -0
- package/dist/esm/players/MewsWsPlayer/SourceBufferManager.js.map +1 -0
- package/dist/esm/players/MewsWsPlayer/WebSocketManager.js +213 -0
- package/dist/esm/players/MewsWsPlayer/WebSocketManager.js.map +1 -0
- package/dist/esm/players/MewsWsPlayer/index.js +985 -0
- package/dist/esm/players/MewsWsPlayer/index.js.map +1 -0
- package/dist/esm/players/MistPlayer.js +183 -0
- package/dist/esm/players/MistPlayer.js.map +1 -0
- package/dist/esm/players/MistWebRTCPlayer/index.js +633 -0
- package/dist/esm/players/MistWebRTCPlayer/index.js.map +1 -0
- package/dist/esm/players/NativePlayer.js +759 -0
- package/dist/esm/players/NativePlayer.js.map +1 -0
- package/dist/esm/players/VideoJsPlayer.js +583 -0
- package/dist/esm/players/VideoJsPlayer.js.map +1 -0
- package/dist/esm/players/WebCodecsPlayer/JitterBuffer.js +233 -0
- package/dist/esm/players/WebCodecsPlayer/JitterBuffer.js.map +1 -0
- package/dist/esm/players/WebCodecsPlayer/LatencyProfiles.js +134 -0
- package/dist/esm/players/WebCodecsPlayer/LatencyProfiles.js.map +1 -0
- package/dist/esm/players/WebCodecsPlayer/RawChunkParser.js +91 -0
- package/dist/esm/players/WebCodecsPlayer/RawChunkParser.js.map +1 -0
- package/dist/esm/players/WebCodecsPlayer/SyncController.js +357 -0
- package/dist/esm/players/WebCodecsPlayer/SyncController.js.map +1 -0
- package/dist/esm/players/WebCodecsPlayer/WebSocketController.js +458 -0
- package/dist/esm/players/WebCodecsPlayer/WebSocketController.js.map +1 -0
- package/dist/esm/players/WebCodecsPlayer/index.js +1458 -0
- package/dist/esm/players/WebCodecsPlayer/index.js.map +1 -0
- package/dist/esm/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js +315 -0
- package/dist/esm/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.js.map +1 -0
- package/dist/esm/styles/index.js +54 -0
- package/dist/esm/styles/index.js.map +1 -0
- package/dist/esm/vanilla/FrameWorksPlayer.js +264 -0
- package/dist/esm/vanilla/FrameWorksPlayer.js.map +1 -0
- package/dist/esm/vanilla.js +2 -0
- package/dist/esm/vanilla.js.map +1 -0
- package/dist/player.css +185 -42
- package/dist/types/core/ABRController.d.ts +4 -4
- package/dist/types/core/CodecUtils.d.ts +1 -1
- package/dist/types/core/ErrorClassifier.d.ts +77 -0
- package/dist/types/core/GatewayClient.d.ts +4 -4
- package/dist/types/core/MetaTrackManager.d.ts +2 -2
- package/dist/types/core/MistReporter.d.ts +3 -3
- package/dist/types/core/MistSignaling.d.ts +12 -12
- package/dist/types/core/PlayerController.d.ts +19 -14
- package/dist/types/core/PlayerInterface.d.ts +100 -2
- package/dist/types/core/PlayerManager.d.ts +36 -9
- package/dist/types/core/PlayerRegistry.d.ts +11 -11
- package/dist/types/core/QualityMonitor.d.ts +2 -2
- package/dist/types/core/SeekingUtils.d.ts +2 -2
- package/dist/types/core/StreamStateClient.d.ts +2 -2
- package/dist/types/core/TelemetryReporter.d.ts +1 -1
- package/dist/types/core/TimerManager.d.ts +1 -1
- package/dist/types/core/detector.d.ts +1 -1
- package/dist/types/core/index.d.ts +44 -44
- package/dist/types/core/scorer.d.ts +1 -1
- package/dist/types/core/selector.d.ts +2 -2
- package/dist/types/index.d.ts +35 -34
- package/dist/types/players/DashJsPlayer.d.ts +3 -3
- package/dist/types/players/HlsJsPlayer.d.ts +3 -3
- package/dist/types/players/MewsWsPlayer/SourceBufferManager.d.ts +1 -1
- package/dist/types/players/MewsWsPlayer/WebSocketManager.d.ts +1 -1
- package/dist/types/players/MewsWsPlayer/index.d.ts +2 -2
- package/dist/types/players/MewsWsPlayer/types.d.ts +15 -15
- package/dist/types/players/MistPlayer.d.ts +2 -2
- package/dist/types/players/MistWebRTCPlayer/index.d.ts +3 -3
- package/dist/types/players/NativePlayer.d.ts +3 -3
- package/dist/types/players/VideoJsPlayer.d.ts +3 -3
- package/dist/types/players/WebCodecsPlayer/JitterBuffer.d.ts +3 -3
- package/dist/types/players/WebCodecsPlayer/LatencyProfiles.d.ts +1 -1
- package/dist/types/players/WebCodecsPlayer/RawChunkParser.d.ts +2 -2
- package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +2 -2
- package/dist/types/players/WebCodecsPlayer/WebSocketController.d.ts +3 -3
- package/dist/types/players/WebCodecsPlayer/index.d.ts +9 -9
- package/dist/types/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.d.ts +1 -1
- package/dist/types/players/WebCodecsPlayer/types.d.ts +49 -49
- package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +31 -31
- package/dist/types/players/index.d.ts +5 -8
- package/dist/types/types.d.ts +15 -15
- package/dist/types/vanilla/FrameWorksPlayer.d.ts +2 -2
- package/dist/types/vanilla/index.d.ts +4 -4
- package/dist/workers/decoder.worker.js +129 -122
- package/dist/workers/decoder.worker.js.map +1 -1
- package/package.json +31 -15
- package/src/core/ABRController.ts +38 -36
- package/src/core/CodecUtils.ts +49 -46
- package/src/core/Disposable.ts +4 -4
- package/src/core/ErrorClassifier.ts +499 -0
- package/src/core/EventEmitter.ts +1 -1
- package/src/core/GatewayClient.ts +41 -39
- package/src/core/InteractionController.ts +89 -82
- package/src/core/LiveDurationProxy.ts +14 -15
- package/src/core/MetaTrackManager.ts +73 -65
- package/src/core/MistReporter.ts +72 -45
- package/src/core/MistSignaling.ts +59 -56
- package/src/core/PlayerController.ts +542 -384
- package/src/core/PlayerInterface.ts +192 -59
- package/src/core/PlayerManager.ts +354 -164
- package/src/core/PlayerRegistry.ts +238 -87
- package/src/core/QualityMonitor.ts +38 -31
- package/src/core/ScreenWakeLockManager.ts +8 -9
- package/src/core/SeekingUtils.ts +31 -22
- package/src/core/StreamStateClient.ts +74 -68
- package/src/core/SubtitleManager.ts +24 -22
- package/src/core/TelemetryReporter.ts +38 -32
- package/src/core/TimeFormat.ts +13 -17
- package/src/core/TimerManager.ts +24 -8
- package/src/core/UrlUtils.ts +20 -17
- package/src/core/detector.ts +44 -44
- package/src/core/index.ts +57 -48
- package/src/core/scorer.ts +136 -141
- package/src/core/selector.ts +2 -6
- package/src/global.d.ts +1 -1
- package/src/index.ts +56 -36
- package/src/players/DashJsPlayer.ts +164 -115
- package/src/players/HlsJsPlayer.ts +132 -78
- package/src/players/MewsWsPlayer/SourceBufferManager.ts +41 -36
- package/src/players/MewsWsPlayer/WebSocketManager.ts +9 -9
- package/src/players/MewsWsPlayer/index.ts +192 -152
- package/src/players/MewsWsPlayer/types.ts +21 -21
- package/src/players/MistPlayer.ts +45 -26
- package/src/players/MistWebRTCPlayer/index.ts +175 -129
- package/src/players/NativePlayer.ts +203 -143
- package/src/players/VideoJsPlayer.ts +170 -118
- package/src/players/WebCodecsPlayer/JitterBuffer.ts +6 -7
- package/src/players/WebCodecsPlayer/LatencyProfiles.ts +43 -43
- package/src/players/WebCodecsPlayer/RawChunkParser.ts +10 -10
- package/src/players/WebCodecsPlayer/SyncController.ts +45 -53
- package/src/players/WebCodecsPlayer/WebSocketController.ts +66 -68
- package/src/players/WebCodecsPlayer/index.ts +265 -223
- package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +12 -17
- package/src/players/WebCodecsPlayer/types.ts +56 -56
- package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +238 -182
- package/src/players/WebCodecsPlayer/worker/types.ts +31 -31
- package/src/players/index.ts +5 -16
- package/src/styles/animations.css +2 -1
- package/src/styles/player.css +185 -42
- package/src/styles/tailwind.css +473 -159
- package/src/types.ts +43 -43
- package/src/vanilla/FrameWorksPlayer.ts +26 -14
- package/src/vanilla/index.ts +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativePlayer.js","sources":["../../../../src/players/NativePlayer.ts"],"sourcesContent":["import { BasePlayer } from \"../core/PlayerInterface\";\nimport { LiveDurationProxy } from \"../core/LiveDurationProxy\";\nimport { appendUrlParams, parseUrlParams, stripUrlParams } from \"../core/UrlUtils\";\nimport {\n checkProtocolMismatch,\n getBrowserInfo,\n checkWebRTCCodecCompatibility,\n} from \"../core/detector\";\nimport type {\n StreamSource,\n StreamInfo,\n PlayerOptions,\n PlayerCapability,\n} 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(\n mimetype: string,\n source: StreamSource,\n streamInfo: StreamInfo\n ): 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(\n \"[WHEP] Skipping - incompatible codecs:\",\n codecCompat.incompatibleCodecs.join(\", \")\n );\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.isSafari) {\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: {\n codec: string;\n codecstring?: string;\n init?: string;\n }): 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(\n container: HTMLElement,\n source: StreamSource,\n options: PlayerOptions,\n streamInfo?: StreamInfo\n ): 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\";\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 } 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(\n \"[NativePlayer] Auto-recovery: reloading stream after\",\n pauseDuration,\n \"ms pause\"\n );\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 {\n clearTimeout(this.reconnectTimer);\n } 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 {\n this.peerConnection.close();\n } catch {}\n this.peerConnection = null;\n }\n\n if (this.videoElement) {\n try {\n (this.videoElement as any).srcObject = null;\n } 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 {\n this.container.removeChild(this.videoElement);\n } 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 | {\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 }\n | undefined\n > {\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 =\n 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 =\n 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:\n 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<\n { estimatedMs: number; jitterBufferMs: number; rttMs: number } | undefined\n > {\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(\n video: HTMLVideoElement,\n url: string,\n headers: Record<string, string>,\n iceServers: RTCIceServer[]\n ) {\n // Clean previous sessionUrl\n if (this.sessionUrl) {\n try {\n fetch(this.sessionUrl, { method: \"DELETE\" }).catch(() => {});\n } 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 (\n this.reconnectEnabled &&\n this.reconnectAttempts < this.maxReconnectAttempts &&\n this.currentWhepUrl\n ) {\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(\n video,\n this.currentWhepUrl!,\n this.currentHeaders || {},\n this.currentIceServers || []\n );\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"],"names":[],"mappings":"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"}
|