@livepeer-frameworks/player-wc 0.1.9 → 0.2.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/dist/esm/components/controls/fw-fullscreen-button.js +76 -0
- package/dist/esm/components/controls/fw-fullscreen-button.js.map +1 -0
- package/dist/esm/components/controls/fw-live-badge.js +109 -0
- package/dist/esm/components/controls/fw-live-badge.js.map +1 -0
- package/dist/esm/components/controls/fw-play-button.js +76 -0
- package/dist/esm/components/controls/fw-play-button.js.map +1 -0
- package/dist/esm/components/controls/fw-skip-button.js +62 -0
- package/dist/esm/components/controls/fw-skip-button.js.map +1 -0
- package/dist/esm/components/controls/fw-time-display.js +77 -0
- package/dist/esm/components/controls/fw-time-display.js.map +1 -0
- package/dist/esm/components/controls/fw-volume-control.js +76 -0
- package/dist/esm/components/controls/fw-volume-control.js.map +1 -0
- package/dist/esm/components/fw-dev-mode-panel.js +11 -15
- package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
- package/dist/esm/components/fw-error-overlay.js +13 -5
- package/dist/esm/components/fw-error-overlay.js.map +1 -1
- package/dist/esm/components/fw-idle-screen.js +10 -2
- package/dist/esm/components/fw-idle-screen.js.map +1 -1
- package/dist/esm/components/fw-loading-screen.js +89 -42
- package/dist/esm/components/fw-loading-screen.js.map +1 -1
- package/dist/esm/components/fw-loading-spinner.js +20 -9
- package/dist/esm/components/fw-loading-spinner.js.map +1 -1
- package/dist/esm/components/fw-player-controls.js +18 -13
- package/dist/esm/components/fw-player-controls.js.map +1 -1
- package/dist/esm/components/fw-player.js +165 -59
- package/dist/esm/components/fw-player.js.map +1 -1
- package/dist/esm/components/fw-settings-menu.js +44 -9
- package/dist/esm/components/fw-settings-menu.js.map +1 -1
- package/dist/esm/components/fw-stream-state-overlay.js +13 -5
- package/dist/esm/components/fw-stream-state-overlay.js.map +1 -1
- package/dist/esm/components/fw-toast.js +11 -1
- package/dist/esm/components/fw-toast.js.map +1 -1
- package/dist/esm/components/fw-volume-control.js +13 -3
- package/dist/esm/components/fw-volume-control.js.map +1 -1
- package/dist/esm/controllers/player-controller-host.js +14 -1
- package/dist/esm/controllers/player-controller-host.js.map +1 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/styles/shared-styles.js +401 -304
- package/dist/esm/styles/shared-styles.js.map +1 -1
- package/dist/fw-player.iife.js +707 -488
- package/dist/types/components/controls/fw-fullscreen-button.d.ts +18 -0
- package/dist/types/components/controls/fw-live-badge.d.ts +19 -0
- package/dist/types/components/controls/fw-play-button.d.ts +18 -0
- package/dist/types/components/controls/fw-skip-button.d.ts +17 -0
- package/dist/types/components/controls/fw-time-display.d.ts +17 -0
- package/dist/types/components/controls/fw-volume-control.d.ts +18 -0
- package/dist/types/components/controls/index.d.ts +6 -0
- package/dist/types/components/fw-dev-mode-panel.d.ts +1 -1
- package/dist/types/components/fw-error-overlay.d.ts +4 -0
- package/dist/types/components/fw-idle-screen.d.ts +4 -0
- package/dist/types/components/fw-loading-screen.d.ts +5 -1
- package/dist/types/components/fw-loading-spinner.d.ts +4 -0
- package/dist/types/components/fw-player-controls.d.ts +2 -1
- package/dist/types/components/fw-player.d.ts +10 -1
- package/dist/types/components/fw-settings-menu.d.ts +3 -1
- package/dist/types/components/fw-stream-state-overlay.d.ts +4 -0
- package/dist/types/components/fw-toast.d.ts +4 -0
- package/dist/types/controllers/player-controller-host.d.ts +7 -1
- package/dist/types/index.d.ts +1 -0
- package/package.json +22 -25
- package/src/components/controls/fw-fullscreen-button.ts +75 -0
- package/src/components/controls/fw-live-badge.ts +109 -0
- package/src/components/controls/fw-play-button.ts +75 -0
- package/src/components/controls/fw-skip-button.ts +59 -0
- package/src/components/controls/fw-time-display.ts +74 -0
- package/src/components/controls/fw-volume-control.ts +75 -0
- package/src/components/controls/index.ts +6 -0
- package/src/components/fw-dev-mode-panel.ts +10 -17
- package/src/components/fw-error-overlay.ts +13 -5
- package/src/components/fw-idle-screen.ts +10 -2
- package/src/components/fw-loading-screen.ts +90 -46
- package/src/components/fw-loading-spinner.ts +18 -9
- package/src/components/fw-player-controls.ts +17 -13
- package/src/components/fw-player.ts +166 -64
- package/src/components/fw-settings-menu.ts +49 -9
- package/src/components/fw-stream-state-overlay.ts +13 -5
- package/src/components/fw-toast.ts +11 -1
- package/src/components/fw-volume-control.ts +14 -3
- package/src/controllers/player-controller-host.ts +18 -0
- package/src/index.ts +10 -0
- package/src/styles/shared-styles.ts +401 -304
- package/LICENSE.md +0 -24
- package/dist/cjs/components/fw-context-menu.js +0 -17
- package/dist/cjs/components/fw-context-menu.js.map +0 -1
- package/dist/cjs/components/fw-dev-mode-panel.js +0 -907
- package/dist/cjs/components/fw-dev-mode-panel.js.map +0 -1
- package/dist/cjs/components/fw-dvd-logo.js +0 -211
- package/dist/cjs/components/fw-dvd-logo.js.map +0 -1
- package/dist/cjs/components/fw-error-overlay.js +0 -101
- package/dist/cjs/components/fw-error-overlay.js.map +0 -1
- package/dist/cjs/components/fw-idle-screen.js +0 -726
- package/dist/cjs/components/fw-idle-screen.js.map +0 -1
- package/dist/cjs/components/fw-loading-screen.js +0 -513
- package/dist/cjs/components/fw-loading-screen.js.map +0 -1
- package/dist/cjs/components/fw-loading-spinner.js +0 -62
- package/dist/cjs/components/fw-loading-spinner.js.map +0 -1
- package/dist/cjs/components/fw-player-controls.js +0 -451
- package/dist/cjs/components/fw-player-controls.js.map +0 -1
- package/dist/cjs/components/fw-player.js +0 -832
- package/dist/cjs/components/fw-player.js.map +0 -1
- package/dist/cjs/components/fw-seek-bar.js +0 -383
- package/dist/cjs/components/fw-seek-bar.js.map +0 -1
- package/dist/cjs/components/fw-settings-menu.js +0 -253
- package/dist/cjs/components/fw-settings-menu.js.map +0 -1
- package/dist/cjs/components/fw-skip-indicator.js +0 -143
- package/dist/cjs/components/fw-skip-indicator.js.map +0 -1
- package/dist/cjs/components/fw-speed-indicator.js +0 -61
- package/dist/cjs/components/fw-speed-indicator.js.map +0 -1
- package/dist/cjs/components/fw-stats-panel.js +0 -205
- package/dist/cjs/components/fw-stats-panel.js.map +0 -1
- package/dist/cjs/components/fw-stream-state-overlay.js +0 -338
- package/dist/cjs/components/fw-stream-state-overlay.js.map +0 -1
- package/dist/cjs/components/fw-subtitle-renderer.js +0 -217
- package/dist/cjs/components/fw-subtitle-renderer.js.map +0 -1
- package/dist/cjs/components/fw-thumbnail-overlay.js +0 -161
- package/dist/cjs/components/fw-thumbnail-overlay.js.map +0 -1
- package/dist/cjs/components/fw-title-overlay.js +0 -72
- package/dist/cjs/components/fw-title-overlay.js.map +0 -1
- package/dist/cjs/components/fw-toast.js +0 -74
- package/dist/cjs/components/fw-toast.js.map +0 -1
- package/dist/cjs/components/fw-volume-control.js +0 -276
- package/dist/cjs/components/fw-volume-control.js.map +0 -1
- package/dist/cjs/components/shared/hitmarker-audio.js +0 -76
- package/dist/cjs/components/shared/hitmarker-audio.js.map +0 -1
- package/dist/cjs/constants/media-assets.js +0 -11
- package/dist/cjs/constants/media-assets.js.map +0 -1
- package/dist/cjs/controllers/player-controller-host.js +0 -364
- package/dist/cjs/controllers/player-controller-host.js.map +0 -1
- package/dist/cjs/define.js +0 -53
- package/dist/cjs/define.js.map +0 -1
- package/dist/cjs/icons/index.js +0 -180
- package/dist/cjs/icons/index.js.map +0 -1
- package/dist/cjs/index.js +0 -108
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js +0 -33
- package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js.map +0 -1
- package/dist/cjs/styles/shared-styles.js +0 -1985
- package/dist/cjs/styles/shared-styles.js.map +0 -1
- package/dist/cjs/styles/utility-styles.js +0 -725
- package/dist/cjs/styles/utility-styles.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fw-dev-mode-panel.js","sources":["../../../../src/components/fw-dev-mode-panel.ts"],"sourcesContent":["/**\n * <fw-dev-mode-panel> — Developer mode side panel.\n * Feature parity with React/Svelte advanced panel.\n */\nimport { LitElement, html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport { closeIcon } from \"../icons/index.js\";\nimport {\n QualityMonitor,\n globalPlayerManager,\n type MistStreamInfo,\n type PlaybackMode,\n type PlayerCombination,\n type StreamInfo,\n} from \"@livepeer-frameworks/player-core\";\nimport type { PlayerControllerHost } from \"../controllers/player-controller-host.js\";\n\nconst SOURCE_TYPE_LABELS: Record<string, string> = {\n \"html5/application/vnd.apple.mpegurl\": \"HLS\",\n \"dash/video/mp4\": \"DASH\",\n \"html5/video/mp4\": \"MP4\",\n \"html5/video/webm\": \"WebM\",\n whep: \"WHEP\",\n \"mist/html\": \"Mist\",\n \"mist/legacy\": \"Auto\",\n \"ws/video/mp4\": \"MEWS\",\n};\n\n@customElement(\"fw-dev-mode-panel\")\nexport class FwDevModePanel extends LitElement {\n @property({ attribute: false }) pc!: PlayerControllerHost;\n @property({ type: String }) playbackMode: PlaybackMode = \"auto\";\n\n @state() private _activeTab: \"config\" | \"stats\" = \"config\";\n @state() private _hoveredComboIndex: number | null = null;\n @state() private _tooltipAbove = false;\n @state() private _showDisabledPlayers = false;\n\n @state() private _playbackScore = 1;\n @state() private _qualityScore = 100;\n @state() private _stallCount = 0;\n @state() private _frameDropRate = 0;\n\n @state()\n private _videoStats: {\n resolution: string;\n buffered: string;\n playbackRate: string;\n currentTime: string;\n duration: string;\n readyState: number;\n networkState: number;\n } | null = null;\n\n @state() private _playerStats: unknown = null;\n\n private _qualityMonitor: QualityMonitor | null = null;\n private _qualityMonitorVideo: HTMLVideoElement | null = null;\n private _videoStatsInterval: ReturnType<typeof setInterval> | null = null;\n private _playerStatsInterval: ReturnType<typeof setInterval> | null = null;\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: block;\n height: 100%;\n min-height: 0;\n }\n `,\n ];\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._stopQualityMonitor();\n this._stopStatsPolling();\n }\n\n protected updated(_changed: PropertyValues<this>): void {\n this._syncQualityMonitor();\n this._syncStatsPolling();\n }\n\n private _getMistStreamInfo(): MistStreamInfo | undefined {\n return this.pc.s.streamState?.streamInfo as MistStreamInfo | undefined;\n }\n\n private _getAllCombinations(): PlayerCombination[] {\n const streamInfo = this.pc.s.streamInfo as StreamInfo | null;\n if (!streamInfo) {\n return [];\n }\n\n try {\n return globalPlayerManager.getAllCombinations(streamInfo, this.playbackMode);\n } catch {\n return [];\n }\n }\n\n private _getCompatibleCombinations(): PlayerCombination[] {\n return this._getAllCombinations().filter((combo) => combo.compatible);\n }\n\n private _getActiveComboIndex(combinations: PlayerCombination[]): number {\n const currentPlayer = this.pc.s.currentPlayerInfo;\n const currentSource = this.pc.s.currentSourceInfo;\n\n if (!currentPlayer || !currentSource || combinations.length === 0) {\n return -1;\n }\n\n return combinations.findIndex(\n (combo) => combo.player === currentPlayer.shortname && combo.sourceType === currentSource.type\n );\n }\n\n private _syncQualityMonitor(): void {\n const video = this.pc.s.videoElement;\n\n if (!video) {\n this._stopQualityMonitor();\n return;\n }\n\n if (!this._qualityMonitor) {\n this._qualityMonitor = new QualityMonitor({\n sampleInterval: 500,\n onSample: (quality) => {\n this._qualityScore = quality.score;\n this._stallCount = quality.stallCount;\n this._frameDropRate = quality.frameDropRate;\n this._playbackScore = this._qualityMonitor?.getPlaybackScore() ?? 1;\n this.requestUpdate();\n },\n });\n }\n\n if (this._qualityMonitorVideo !== video) {\n this._qualityMonitor.stop();\n this._qualityMonitor.start(video);\n this._qualityMonitorVideo = video;\n }\n }\n\n private _stopQualityMonitor(): void {\n this._qualityMonitor?.stop();\n this._qualityMonitorVideo = null;\n }\n\n private _syncStatsPolling(): void {\n if (this._activeTab !== \"stats\") {\n this._stopStatsPolling();\n return;\n }\n\n if (!this._videoStatsInterval) {\n this._updateVideoStats();\n this._videoStatsInterval = setInterval(() => {\n this._updateVideoStats();\n }, 500);\n }\n\n if (!this._playerStatsInterval) {\n void this._pollPlayerStats();\n this._playerStatsInterval = setInterval(() => {\n void this._pollPlayerStats();\n }, 500);\n }\n }\n\n private _stopStatsPolling(): void {\n if (this._videoStatsInterval) {\n clearInterval(this._videoStatsInterval);\n this._videoStatsInterval = null;\n }\n\n if (this._playerStatsInterval) {\n clearInterval(this._playerStatsInterval);\n this._playerStatsInterval = null;\n }\n }\n\n private _updateVideoStats(): void {\n const video = this.pc.s.videoElement;\n if (!video) {\n this._videoStats = null;\n return;\n }\n\n this._videoStats = {\n resolution: `${video.videoWidth}x${video.videoHeight}`,\n buffered:\n video.buffered.length > 0\n ? (video.buffered.end(video.buffered.length - 1) - video.currentTime).toFixed(1)\n : \"0\",\n playbackRate: video.playbackRate.toFixed(2),\n currentTime: video.currentTime.toFixed(1),\n duration: Number.isFinite(video.duration) ? video.duration.toFixed(1) : \"live\",\n readyState: video.readyState,\n networkState: video.networkState,\n };\n }\n\n private async _pollPlayerStats(): Promise<void> {\n try {\n const stats = await this.pc.getStats();\n if (stats) {\n this._playerStats = stats;\n }\n } catch {\n // No-op for optional stats backends.\n }\n }\n\n private _handleComboMouseEnter(index: number, event: MouseEvent): void {\n this._hoveredComboIndex = index;\n\n const container = this.renderRoot.querySelector(\".fw-dev-body\") as HTMLElement | null;\n if (!container) {\n return;\n }\n\n const row = event.currentTarget as HTMLElement;\n const containerRect = container.getBoundingClientRect();\n const rowRect = row.getBoundingClientRect();\n const relativePosition = (rowRect.top - containerRect.top) / containerRect.height;\n\n this._tooltipAbove = relativePosition > 0.6;\n }\n\n private _handleModeChange(mode: \"auto\" | \"low-latency\" | \"quality\"): void {\n this.playbackMode = mode;\n void this.pc.setDevModeOptions({ playbackMode: mode });\n this.dispatchEvent(\n new CustomEvent(\"fw-playback-mode-change\", {\n detail: { mode },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _handleReload(): void {\n this.pc.clearError();\n void this.pc.reload();\n }\n\n private _handleNextCombo(): void {\n const compatible = this._getCompatibleCombinations();\n if (compatible.length === 0) {\n return;\n }\n\n const activeCompatibleIndex = this._getActiveComboIndex(compatible);\n const startIndex = activeCompatibleIndex >= 0 ? activeCompatibleIndex : -1;\n const nextIndex = (startIndex + 1) % compatible.length;\n const next = compatible[nextIndex];\n\n void this.pc.setDevModeOptions({\n forcePlayer: next.player,\n forceType: next.sourceType,\n forceSource: next.sourceIndex,\n });\n }\n\n private _handleSelectCombo(index: number): void {\n const allCombinations = this._getAllCombinations();\n const combo = allCombinations[index];\n if (!combo) {\n return;\n }\n\n void this.pc.setDevModeOptions({\n forcePlayer: combo.player,\n forceType: combo.sourceType,\n forceSource: combo.sourceIndex,\n });\n }\n\n private _renderStatsTab(): unknown {\n const primaryEndpoint = (this.pc.s.endpoints?.primary ?? null) as {\n protocol?: string;\n nodeId?: string;\n } | null;\n\n const stats = this._videoStats;\n const playerStats = this._playerStats as any;\n const mistStreamInfo = this._getMistStreamInfo();\n const trackEntries = Object.entries(mistStreamInfo?.meta?.tracks ?? {});\n\n return html`\n <div class=\"fw-dev-body\">\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Playback Rate</div>\n <div class=\"fw-dev-rate\">\n <div\n class=${classMap({\n \"fw-dev-rate-value\": true,\n \"fw-dev-stat-value--good\":\n this._playbackScore >= 0.95 && this._playbackScore <= 1.05,\n \"fw-dev-stat-value--accent\": this._playbackScore > 1.05,\n \"fw-dev-stat-value--warn\":\n this._playbackScore >= 0.75 && this._playbackScore < 0.95,\n \"fw-dev-stat-value--bad\": this._playbackScore < 0.75,\n })}\n >\n ${this._playbackScore.toFixed(2)}x\n </div>\n <div class=\"fw-dev-rate-status\">\n ${this._playbackScore >= 0.95 && this._playbackScore <= 1.05\n ? \"realtime\"\n : this._playbackScore > 1.05\n ? \"catching up\"\n : this._playbackScore >= 0.75\n ? \"slightly slow\"\n : \"stalling\"}\n </div>\n </div>\n <div class=\"fw-dev-rate-stats\">\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._qualityScore >= 75,\n \"fw-dev-stat-value--bad\": this._qualityScore < 75,\n })}\n >\n Quality: ${this._qualityScore}/100\n </span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._stallCount === 0,\n \"fw-dev-stat-value--warn\": this._stallCount > 0,\n })}\n >\n Stalls: ${this._stallCount}\n </span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._frameDropRate < 1,\n \"fw-dev-stat-value--bad\": this._frameDropRate >= 1,\n })}\n >\n Drops: ${this._frameDropRate.toFixed(1)}%\n </span>\n </div>\n </div>\n\n ${stats\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Resolution</span>\n <span class=\"fw-dev-stat-value\">${stats.resolution}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Buffer</span>\n <span class=\"fw-dev-stat-value\">${stats.buffered}s</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Playback Rate</span>\n <span class=\"fw-dev-stat-value\">${stats.playbackRate}x</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Time</span>\n <span class=\"fw-dev-stat-value\">${stats.currentTime} / ${stats.duration}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Ready State</span>\n <span class=\"fw-dev-stat-value\">${stats.readyState}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Network State</span>\n <span class=\"fw-dev-stat-value\">${stats.networkState}</span>\n </div>\n ${primaryEndpoint?.protocol\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Protocol</span>\n <span class=\"fw-dev-stat-value\">${primaryEndpoint.protocol}</span>\n </div>\n `\n : nothing}\n ${primaryEndpoint?.nodeId\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Node ID</span>\n <span\n class=\"fw-dev-stat-value\"\n style=\"max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\"\n >${primaryEndpoint.nodeId}</span\n >\n </div>\n `\n : nothing}\n `\n : html`<div class=\"fw-dev-list-empty\">No video element available</div>`}\n ${playerStats\n ? html`\n <div class=\"fw-dev-list-header fw-dev-section-header\">\n <span class=\"fw-dev-list-title\"\n >${playerStats.type === \"hls\"\n ? \"HLS.js Stats\"\n : playerStats.type === \"webrtc\"\n ? \"WebRTC Stats\"\n : \"Player Stats\"}</span\n >\n </div>\n\n ${playerStats.type === \"hls\"\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Bitrate</span>\n <span class=\"fw-dev-stat-value--accent\"\n >${typeof playerStats.currentBitrate === \"number\" &&\n playerStats.currentBitrate > 0\n ? `${Math.round(playerStats.currentBitrate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Bandwidth Est.</span>\n <span class=\"fw-dev-stat-value\"\n >${typeof playerStats.bandwidthEstimate === \"number\" &&\n playerStats.bandwidthEstimate > 0\n ? `${Math.round(playerStats.bandwidthEstimate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Level</span>\n <span class=\"fw-dev-stat-value\"\n >${typeof playerStats.currentLevel === \"number\" &&\n playerStats.currentLevel >= 0\n ? playerStats.currentLevel\n : \"Auto\"}\n / ${Array.isArray(playerStats.levels) ? playerStats.levels.length : 0}</span\n >\n </div>\n ${typeof playerStats.latency === \"number\"\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Latency</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\": playerStats.latency > 5000,\n })}\n >${Math.round(playerStats.latency)} ms</span\n >\n </div>\n `\n : nothing}\n `\n : nothing}\n ${playerStats.type === \"webrtc\"\n ? html`\n ${playerStats.video\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Video Bitrate</span>\n <span class=\"fw-dev-stat-value--accent\"\n >${typeof playerStats.video.bitrate === \"number\" &&\n playerStats.video.bitrate > 0\n ? `${Math.round(playerStats.video.bitrate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">FPS</span>\n <span class=\"fw-dev-stat-value\"\n >${Math.round(\n (playerStats.video.framesPerSecond as number) || 0\n )}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Frames</span>\n <span class=\"fw-dev-stat-value\"\n >${playerStats.video.framesDecoded as number} decoded,\n <span\n class=${classMap({\n \"fw-dev-stat-value--bad\":\n ((playerStats.video.frameDropRate as number) || 0) > 1,\n \"fw-dev-stat-value--good\":\n ((playerStats.video.frameDropRate as number) || 0) <= 1,\n })}\n >${playerStats.video.framesDropped as number} dropped</span\n ></span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Packet Loss</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--bad\":\n ((playerStats.video.packetLossRate as number) || 0) > 1,\n \"fw-dev-stat-value--good\":\n ((playerStats.video.packetLossRate as number) || 0) <= 1,\n })}\n >${(\n ((playerStats.video.packetLossRate as number) || 0) as number\n ).toFixed(2)}%</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Jitter</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\":\n ((playerStats.video.jitter as number) || 0) > 30,\n })}\n >${(((playerStats.video.jitter as number) || 0) as number).toFixed(1)}\n ms</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Jitter Buffer</span>\n <span class=\"fw-dev-stat-value\"\n >${(\n ((playerStats.video.jitterBufferDelay as number) || 0) as number\n ).toFixed(1)}\n ms</span\n >\n </div>\n `\n : nothing}\n ${playerStats.network\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">RTT</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\":\n ((playerStats.network.rtt as number) || 0) > 200,\n })}\n >${Math.round(((playerStats.network.rtt as number) || 0) as number)}\n ms</span\n >\n </div>\n `\n : nothing}\n `\n : nothing}\n `\n : nothing}\n ${trackEntries.length > 0\n ? html`\n <div class=\"fw-dev-list-header fw-dev-section-header\">\n <span class=\"fw-dev-list-title\">Tracks (${trackEntries.length})</span>\n </div>\n ${trackEntries.map(([id, track]) => {\n const typedTrack = track as {\n type: string;\n codec: string;\n width?: number;\n height?: number;\n bps?: number;\n fpks?: number;\n channels?: number;\n rate?: number;\n lang?: string;\n };\n\n return html`\n <div class=\"fw-dev-track\">\n <div class=\"fw-dev-track-header\">\n <span\n class=${classMap({\n \"fw-dev-track-badge\": true,\n \"fw-dev-track-badge--video\": typedTrack.type === \"video\",\n \"fw-dev-track-badge--audio\": typedTrack.type === \"audio\",\n \"fw-dev-track-badge--other\":\n typedTrack.type !== \"video\" && typedTrack.type !== \"audio\",\n })}\n >${typedTrack.type}</span\n >\n <span class=\"fw-dev-track-codec\">${typedTrack.codec}</span>\n <span class=\"fw-dev-track-id\">#${id}</span>\n </div>\n <div class=\"fw-dev-track-meta\">\n ${typedTrack.type === \"video\" && typedTrack.width && typedTrack.height\n ? html`<span>${typedTrack.width}x${typedTrack.height}</span>`\n : nothing}\n ${typedTrack.bps\n ? html`<span>${Math.round(typedTrack.bps / 1000)} kbps</span>`\n : nothing}\n ${typedTrack.fpks\n ? html`<span>${Math.round(typedTrack.fpks / 1000)} fps</span>`\n : nothing}\n ${typedTrack.type === \"audio\" && typedTrack.channels\n ? html`<span>${typedTrack.channels}ch</span>`\n : nothing}\n ${typedTrack.type === \"audio\" && typedTrack.rate\n ? html`<span>${typedTrack.rate} Hz</span>`\n : nothing}\n ${typedTrack.lang ? html`<span>${typedTrack.lang}</span>` : nothing}\n </div>\n </div>\n `;\n })}\n `\n : nothing}\n ${mistStreamInfo && trackEntries.length === 0\n ? html`\n <div class=\"fw-dev-no-tracks\">\n <span class=\"fw-dev-no-tracks-text\"\n >No track data available\n ${mistStreamInfo.type\n ? html`<span class=\"fw-dev-no-tracks-type\">(${mistStreamInfo.type})</span>`\n : nothing}</span\n >\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n private _renderConfigTab(): unknown {\n const allCombinations = this._getAllCombinations();\n const compatibleCombinations = allCombinations.filter((combo) => combo.compatible);\n const activeComboIndex = this._getActiveComboIndex(allCombinations);\n\n const currentPlayer = this.pc.s.currentPlayerInfo;\n const currentSource = this.pc.s.currentSourceInfo;\n\n return html`\n <div class=\"fw-dev-body\">\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Active</div>\n <div class=\"fw-dev-value\">\n ${currentPlayer?.name || \"None\"}\n <span class=\"fw-dev-value-arrow\">${\"\\u2192\"}</span>\n ${SOURCE_TYPE_LABELS[currentSource?.type || \"\"] || currentSource?.type || \"-\"}\n </div>\n ${(this.pc.s.endpoints?.primary as { nodeId?: string } | undefined)?.nodeId\n ? html`\n <div class=\"fw-dev-value-muted\">\n Node: ${(this.pc.s.endpoints?.primary as { nodeId?: string }).nodeId}\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Playback Mode</div>\n <div class=\"fw-dev-mode-group\">\n ${([\"auto\", \"low-latency\", \"quality\"] as const).map(\n (mode) => html`\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-mode-btn\": true,\n \"fw-dev-mode-btn--active\": this.playbackMode === mode,\n })}\n @click=${() => this._handleModeChange(mode)}\n >\n ${mode === \"low-latency\"\n ? \"Low Lat\"\n : `${mode.charAt(0).toUpperCase()}${mode.slice(1)}`}\n </button>\n `\n )}\n </div>\n <div class=\"fw-dev-mode-desc\">\n ${this.playbackMode === \"auto\"\n ? \"Balanced: MP4/WS \\u2192 WHEP \\u2192 HLS\"\n : this.playbackMode === \"low-latency\"\n ? \"WHEP/WebRTC first (<1s delay)\"\n : \"MP4/WS first, HLS fallback\"}\n </div>\n </div>\n\n <div class=\"fw-dev-actions\">\n <button type=\"button\" class=\"fw-dev-action-btn\" @click=${this._handleReload}>\n Reload\n </button>\n <button type=\"button\" class=\"fw-dev-action-btn\" @click=${this._handleNextCombo}>\n Next Option\n </button>\n </div>\n\n <div class=\"fw-dev-section\" style=\"padding:0;border-bottom:0;\">\n <div class=\"fw-dev-list-header\">\n <span class=\"fw-dev-list-title\">Player Options (${compatibleCombinations.length})</span>\n ${allCombinations.length > compatibleCombinations.length\n ? html`\n <button\n type=\"button\"\n class=\"fw-dev-list-toggle\"\n @click=${() => {\n this._showDisabledPlayers = !this._showDisabledPlayers;\n }}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n class=${classMap({\n \"fw-dev-chevron\": true,\n \"fw-dev-chevron--open\": this._showDisabledPlayers,\n })}\n >\n <path d=\"M6 9l6 6 6-6\"></path>\n </svg>\n ${this._showDisabledPlayers ? \"Hide\" : \"Show\"} disabled\n (${allCombinations.length - compatibleCombinations.length})\n </button>\n `\n : nothing}\n </div>\n\n ${allCombinations.length === 0\n ? html`<div class=\"fw-dev-list-empty\">No stream info available</div>`\n : html`\n ${allCombinations.map((combo, index) => {\n const isCodecIncompatible = combo.codecIncompatible === true;\n if (!combo.compatible && !isCodecIncompatible && !this._showDisabledPlayers) {\n return nothing;\n }\n\n const isActive = activeComboIndex === index;\n const typeLabel =\n SOURCE_TYPE_LABELS[combo.sourceType] || combo.sourceType.split(\"/\").pop();\n\n const scoreClass =\n !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-score--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-score--low\"\n : combo.score >= 2\n ? \"fw-dev-combo-score--high\"\n : combo.score >= 1.5\n ? \"fw-dev-combo-score--mid\"\n : \"fw-dev-combo-score--low\";\n\n const rankClass = isActive\n ? \"fw-dev-combo-rank--active\"\n : !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-rank--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-rank--warn\"\n : \"\";\n\n const typeClass =\n !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-type--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-type--warn\"\n : \"\";\n\n return html`\n <div\n class=\"fw-dev-combo\"\n @mouseenter=${(event: MouseEvent) =>\n this._handleComboMouseEnter(index, event)}\n @mouseleave=${() => {\n this._hoveredComboIndex = null;\n }}\n >\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-combo-btn\": true,\n \"fw-dev-combo-btn--active\": isActive,\n \"fw-dev-combo-btn--disabled\": !combo.compatible && !isCodecIncompatible,\n \"fw-dev-combo-btn--codec-warn\": isCodecIncompatible,\n })}\n @click=${() => this._handleSelectCombo(index)}\n >\n <span\n class=${classMap({\n \"fw-dev-combo-rank\": true,\n [rankClass]: rankClass.length > 0,\n })}\n >${combo.compatible\n ? index + 1\n : isCodecIncompatible\n ? \"\\u26A0\"\n : \"\\u2014\"}</span\n >\n\n <span class=\"fw-dev-combo-name\"\n >${combo.playerName} <span class=\"fw-dev-combo-arrow\">${\"\\u2192\"}</span>\n <span\n class=${classMap({\n \"fw-dev-combo-type\": true,\n [typeClass]: typeClass.length > 0,\n })}\n >${typeLabel}</span\n ></span\n >\n\n <span class=${classMap({ \"fw-dev-combo-score\": true, [scoreClass]: true })}\n >${combo.score.toFixed(2)}</span\n >\n </button>\n\n ${this._hoveredComboIndex === index\n ? html`\n <div\n class=${classMap({\n \"fw-dev-tooltip\": true,\n \"fw-dev-tooltip--above\": this._tooltipAbove,\n \"fw-dev-tooltip--below\": !this._tooltipAbove,\n })}\n >\n <div class=\"fw-dev-tooltip-header\">\n <div class=\"fw-dev-tooltip-title\">${combo.playerName}</div>\n <div class=\"fw-dev-tooltip-subtitle\">${combo.sourceType}</div>\n ${combo.scoreBreakdown?.trackTypes &&\n combo.scoreBreakdown.trackTypes.length > 0\n ? html`\n <div class=\"fw-dev-tooltip-tracks\">\n Tracks:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.trackTypes.join(\", \")}</span\n >\n </div>\n `\n : nothing}\n </div>\n\n ${combo.compatible && combo.scoreBreakdown\n ? html`\n <div class=\"fw-dev-tooltip-score\">\n Score: ${combo.score.toFixed(2)}\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Tracks [${combo.scoreBreakdown.trackTypes.join(\", \")}]:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.trackScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.tracks}</span\n >\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Priority:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.priorityScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.priority}</span\n >\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Source:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.sourceScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.source}</span\n >\n </div>\n\n ${typeof combo.scoreBreakdown.reliabilityScore === \"number\"\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Reliability:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.reliabilityScore.toFixed(\n 2\n )}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.reliability ??\n 0}</span\n >\n </div>\n `\n : nothing}\n ${typeof combo.scoreBreakdown.modeBonus === \"number\" &&\n combo.scoreBreakdown.modeBonus !== 0\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Mode (${this.playbackMode}):\n <span class=\"fw-dev-tooltip-bonus\"\n >+${combo.scoreBreakdown.modeBonus.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.mode ?? 0}</span\n >\n </div>\n `\n : nothing}\n ${typeof combo.scoreBreakdown.routingBonus === \"number\" &&\n combo.scoreBreakdown.routingBonus !== 0\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Routing:\n <span\n class=${classMap({\n \"fw-dev-tooltip-bonus\":\n combo.scoreBreakdown.routingBonus > 0,\n \"fw-dev-tooltip-penalty\":\n combo.scoreBreakdown.routingBonus < 0,\n })}\n >${combo.scoreBreakdown.routingBonus > 0\n ? \"+\"\n : \"\"}${combo.scoreBreakdown.routingBonus.toFixed(\n 2\n )}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.routing ?? 0}</span\n >\n </div>\n `\n : nothing}\n `\n : html`\n <div class=\"fw-dev-tooltip-error\">\n ${combo.incompatibleReason || \"Incompatible\"}\n </div>\n `}\n </div>\n `\n : nothing}\n </div>\n `;\n })}\n `}\n </div>\n </div>\n `;\n }\n\n protected render() {\n return html`\n <div class=\"fw-dev-panel\">\n <div class=\"fw-dev-header\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-tab\": true,\n \"fw-dev-tab--active\": this._activeTab === \"config\",\n })}\n @click=${() => {\n this._activeTab = \"config\";\n }}\n >\n Config\n </button>\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-tab\": true,\n \"fw-dev-tab--active\": this._activeTab === \"stats\",\n })}\n @click=${() => {\n this._activeTab = \"stats\";\n }}\n >\n Stats\n </button>\n <div class=\"fw-dev-spacer\"></div>\n <button\n type=\"button\"\n class=\"fw-dev-close\"\n aria-label=\"Close dev mode panel\"\n @click=${() =>\n this.dispatchEvent(new CustomEvent(\"fw-close\", { bubbles: true, composed: true }))}\n >\n ${closeIcon()}\n </button>\n </div>\n\n ${this._activeTab === \"config\" ? this._renderConfigTab() : this._renderStatsTab()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-dev-mode-panel\": FwDevModePanel;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fw-dev-mode-panel.js","sources":["../../../../src/components/fw-dev-mode-panel.ts"],"sourcesContent":["/**\n * <fw-dev-mode-panel> — Developer mode side panel.\n * Feature parity with React/Svelte advanced panel.\n */\nimport { LitElement, html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport { closeIcon } from \"../icons/index.js\";\nimport {\n QualityMonitor,\n globalPlayerManager,\n type MistStreamInfo,\n type PlaybackMode,\n type PlayerCombination,\n type StreamInfo,\n} from \"@livepeer-frameworks/player-core\";\nimport type { PlayerControllerHost } from \"../controllers/player-controller-host.js\";\n\nconst SOURCE_TYPE_LABELS: Record<string, string> = {\n \"html5/application/vnd.apple.mpegurl\": \"HLS\",\n \"dash/video/mp4\": \"DASH\",\n \"html5/video/mp4\": \"MP4\",\n \"html5/video/webm\": \"WebM\",\n whep: \"WHEP\",\n \"mist/html\": \"Mist\",\n \"mist/legacy\": \"Auto\",\n \"ws/video/mp4\": \"MEWS\",\n};\n\n@customElement(\"fw-dev-mode-panel\")\nexport class FwDevModePanel extends LitElement {\n @property({ attribute: false }) pc!: PlayerControllerHost;\n @property({ type: String }) playbackMode: PlaybackMode = \"auto\";\n\n @state() private _activeTab: \"config\" | \"stats\" = \"config\";\n @state() private _hoveredComboIndex: number | null = null;\n @state() private _tooltipPos: { top: number; left: number } | null = null;\n @state() private _showDisabledPlayers = false;\n\n @state() private _playbackScore = 1;\n @state() private _qualityScore = 100;\n @state() private _stallCount = 0;\n @state() private _frameDropRate = 0;\n\n @state()\n private _videoStats: {\n resolution: string;\n buffered: string;\n playbackRate: string;\n currentTime: string;\n duration: string;\n readyState: number;\n networkState: number;\n } | null = null;\n\n @state() private _playerStats: unknown = null;\n\n private _qualityMonitor: QualityMonitor | null = null;\n private _qualityMonitorVideo: HTMLVideoElement | null = null;\n private _videoStatsInterval: ReturnType<typeof setInterval> | null = null;\n private _playerStatsInterval: ReturnType<typeof setInterval> | null = null;\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: block;\n height: 100%;\n min-height: 0;\n }\n `,\n ];\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._stopQualityMonitor();\n this._stopStatsPolling();\n }\n\n protected updated(_changed: PropertyValues<this>): void {\n this._syncQualityMonitor();\n this._syncStatsPolling();\n }\n\n private _getMistStreamInfo(): MistStreamInfo | undefined {\n return this.pc.s.streamState?.streamInfo as MistStreamInfo | undefined;\n }\n\n private _getAllCombinations(): PlayerCombination[] {\n const streamInfo = this.pc.s.streamInfo as StreamInfo | null;\n if (!streamInfo) {\n return [];\n }\n\n try {\n return globalPlayerManager.getAllCombinations(streamInfo, this.playbackMode);\n } catch {\n return [];\n }\n }\n\n private _getCompatibleCombinations(): PlayerCombination[] {\n return this._getAllCombinations().filter((combo) => combo.compatible);\n }\n\n private _getActiveComboIndex(combinations: PlayerCombination[]): number {\n const currentPlayer = this.pc.s.currentPlayerInfo;\n const currentSource = this.pc.s.currentSourceInfo;\n\n if (!currentPlayer || !currentSource || combinations.length === 0) {\n return -1;\n }\n\n return combinations.findIndex(\n (combo) => combo.player === currentPlayer.shortname && combo.sourceType === currentSource.type\n );\n }\n\n private _syncQualityMonitor(): void {\n const video = this.pc.s.videoElement;\n\n if (!video) {\n this._stopQualityMonitor();\n return;\n }\n\n if (!this._qualityMonitor) {\n this._qualityMonitor = new QualityMonitor({\n sampleInterval: 500,\n onSample: (quality) => {\n this._qualityScore = quality.score;\n this._stallCount = quality.stallCount;\n this._frameDropRate = quality.frameDropRate;\n this._playbackScore = this._qualityMonitor?.getPlaybackScore() ?? 1;\n this.requestUpdate();\n },\n });\n }\n\n if (this._qualityMonitorVideo !== video) {\n this._qualityMonitor.stop();\n this._qualityMonitor.start(video);\n this._qualityMonitorVideo = video;\n }\n }\n\n private _stopQualityMonitor(): void {\n this._qualityMonitor?.stop();\n this._qualityMonitorVideo = null;\n }\n\n private _syncStatsPolling(): void {\n if (this._activeTab !== \"stats\") {\n this._stopStatsPolling();\n return;\n }\n\n if (!this._videoStatsInterval) {\n this._updateVideoStats();\n this._videoStatsInterval = setInterval(() => {\n this._updateVideoStats();\n }, 500);\n }\n\n if (!this._playerStatsInterval) {\n void this._pollPlayerStats();\n this._playerStatsInterval = setInterval(() => {\n void this._pollPlayerStats();\n }, 500);\n }\n }\n\n private _stopStatsPolling(): void {\n if (this._videoStatsInterval) {\n clearInterval(this._videoStatsInterval);\n this._videoStatsInterval = null;\n }\n\n if (this._playerStatsInterval) {\n clearInterval(this._playerStatsInterval);\n this._playerStatsInterval = null;\n }\n }\n\n private _updateVideoStats(): void {\n const video = this.pc.s.videoElement;\n if (!video) {\n this._videoStats = null;\n return;\n }\n\n this._videoStats = {\n resolution: `${video.videoWidth}x${video.videoHeight}`,\n buffered:\n video.buffered.length > 0\n ? (video.buffered.end(video.buffered.length - 1) - video.currentTime).toFixed(1)\n : \"0\",\n playbackRate: video.playbackRate.toFixed(2),\n currentTime: video.currentTime.toFixed(1),\n duration: Number.isFinite(video.duration) ? video.duration.toFixed(1) : \"live\",\n readyState: video.readyState,\n networkState: video.networkState,\n };\n }\n\n private async _pollPlayerStats(): Promise<void> {\n try {\n const stats = await this.pc.getStats();\n if (stats) {\n this._playerStats = stats;\n }\n } catch {\n // No-op for optional stats backends.\n }\n }\n\n private _handleComboMouseEnter(index: number, event: MouseEvent): void {\n this._hoveredComboIndex = index;\n const row = event.currentTarget as HTMLElement;\n const rowRect = row.getBoundingClientRect();\n this._tooltipPos = {\n top: Math.max(8, Math.min(rowRect.top, window.innerHeight - 200)),\n left: Math.max(8, rowRect.left - 228),\n };\n }\n\n private _handleModeChange(mode: \"auto\" | \"low-latency\" | \"quality\"): void {\n this.playbackMode = mode;\n void this.pc.setDevModeOptions({ playbackMode: mode });\n this.dispatchEvent(\n new CustomEvent(\"fw-playback-mode-change\", {\n detail: { mode },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _handleReload(): void {\n this.pc.clearError();\n void this.pc.reload();\n }\n\n private _handleNextCombo(): void {\n const compatible = this._getCompatibleCombinations();\n if (compatible.length === 0) {\n return;\n }\n\n const activeCompatibleIndex = this._getActiveComboIndex(compatible);\n const startIndex = activeCompatibleIndex >= 0 ? activeCompatibleIndex : -1;\n const nextIndex = (startIndex + 1) % compatible.length;\n const next = compatible[nextIndex];\n\n void this.pc.setDevModeOptions({\n forcePlayer: next.player,\n forceType: next.sourceType,\n forceSource: next.sourceIndex,\n });\n }\n\n private _handleSelectCombo(index: number): void {\n const allCombinations = this._getAllCombinations();\n const combo = allCombinations[index];\n if (!combo) {\n return;\n }\n\n void this.pc.setDevModeOptions({\n forcePlayer: combo.player,\n forceType: combo.sourceType,\n forceSource: combo.sourceIndex,\n });\n }\n\n private _renderStatsTab(): unknown {\n const primaryEndpoint = (this.pc.s.endpoints?.primary ?? null) as {\n protocol?: string;\n nodeId?: string;\n } | null;\n\n const stats = this._videoStats;\n const playerStats = this._playerStats as any;\n const mistStreamInfo = this._getMistStreamInfo();\n const trackEntries = Object.entries(mistStreamInfo?.meta?.tracks ?? {});\n\n return html`\n <div class=\"fw-dev-body\">\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Playback Rate</div>\n <div class=\"fw-dev-rate\">\n <div\n class=${classMap({\n \"fw-dev-rate-value\": true,\n \"fw-dev-stat-value--good\":\n this._playbackScore >= 0.95 && this._playbackScore <= 1.05,\n \"fw-dev-stat-value--accent\": this._playbackScore > 1.05,\n \"fw-dev-stat-value--warn\":\n this._playbackScore >= 0.75 && this._playbackScore < 0.95,\n \"fw-dev-stat-value--bad\": this._playbackScore < 0.75,\n })}\n >\n ${this._playbackScore.toFixed(2)}x\n </div>\n <div class=\"fw-dev-rate-status\">\n ${this._playbackScore >= 0.95 && this._playbackScore <= 1.05\n ? \"realtime\"\n : this._playbackScore > 1.05\n ? \"catching up\"\n : this._playbackScore >= 0.75\n ? \"slightly slow\"\n : \"stalling\"}\n </div>\n </div>\n <div class=\"fw-dev-rate-stats\">\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._qualityScore >= 75,\n \"fw-dev-stat-value--bad\": this._qualityScore < 75,\n })}\n >\n Quality: ${this._qualityScore}/100\n </span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._stallCount === 0,\n \"fw-dev-stat-value--warn\": this._stallCount > 0,\n })}\n >\n Stalls: ${this._stallCount}\n </span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._frameDropRate < 1,\n \"fw-dev-stat-value--bad\": this._frameDropRate >= 1,\n })}\n >\n Drops: ${this._frameDropRate.toFixed(1)}%\n </span>\n </div>\n </div>\n\n ${stats\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Resolution</span>\n <span class=\"fw-dev-stat-value\">${stats.resolution}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Buffer</span>\n <span class=\"fw-dev-stat-value\">${stats.buffered}s</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Playback Rate</span>\n <span class=\"fw-dev-stat-value\">${stats.playbackRate}x</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Time</span>\n <span class=\"fw-dev-stat-value\">${stats.currentTime} / ${stats.duration}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Ready State</span>\n <span class=\"fw-dev-stat-value\">${stats.readyState}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Network State</span>\n <span class=\"fw-dev-stat-value\">${stats.networkState}</span>\n </div>\n ${primaryEndpoint?.protocol\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Protocol</span>\n <span class=\"fw-dev-stat-value\">${primaryEndpoint.protocol}</span>\n </div>\n `\n : nothing}\n ${primaryEndpoint?.nodeId\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Node ID</span>\n <span\n class=\"fw-dev-stat-value\"\n style=\"max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\"\n >${primaryEndpoint.nodeId}</span\n >\n </div>\n `\n : nothing}\n `\n : html`<div class=\"fw-dev-list-empty\">No video element available</div>`}\n ${playerStats\n ? html`\n <div class=\"fw-dev-list-header fw-dev-section-header\">\n <span class=\"fw-dev-list-title\"\n >${playerStats.type === \"hls\"\n ? \"HLS.js Stats\"\n : playerStats.type === \"webrtc\"\n ? \"WebRTC Stats\"\n : \"Player Stats\"}</span\n >\n </div>\n\n ${playerStats.type === \"hls\"\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Bitrate</span>\n <span class=\"fw-dev-stat-value--accent\"\n >${typeof playerStats.currentBitrate === \"number\" &&\n playerStats.currentBitrate > 0\n ? `${Math.round(playerStats.currentBitrate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Bandwidth Est.</span>\n <span class=\"fw-dev-stat-value\"\n >${typeof playerStats.bandwidthEstimate === \"number\" &&\n playerStats.bandwidthEstimate > 0\n ? `${Math.round(playerStats.bandwidthEstimate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Level</span>\n <span class=\"fw-dev-stat-value\"\n >${typeof playerStats.currentLevel === \"number\" &&\n playerStats.currentLevel >= 0\n ? playerStats.currentLevel\n : \"Auto\"}\n / ${Array.isArray(playerStats.levels) ? playerStats.levels.length : 0}</span\n >\n </div>\n ${typeof playerStats.latency === \"number\"\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Latency</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\": playerStats.latency > 5000,\n })}\n >${Math.round(playerStats.latency)} ms</span\n >\n </div>\n `\n : nothing}\n `\n : nothing}\n ${playerStats.type === \"webrtc\"\n ? html`\n ${playerStats.video\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Video Bitrate</span>\n <span class=\"fw-dev-stat-value--accent\"\n >${typeof playerStats.video.bitrate === \"number\" &&\n playerStats.video.bitrate > 0\n ? `${Math.round(playerStats.video.bitrate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">FPS</span>\n <span class=\"fw-dev-stat-value\"\n >${Math.round(\n (playerStats.video.framesPerSecond as number) || 0\n )}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Frames</span>\n <span class=\"fw-dev-stat-value\"\n >${playerStats.video.framesDecoded as number} decoded,\n <span\n class=${classMap({\n \"fw-dev-stat-value--bad\":\n ((playerStats.video.frameDropRate as number) || 0) > 1,\n \"fw-dev-stat-value--good\":\n ((playerStats.video.frameDropRate as number) || 0) <= 1,\n })}\n >${playerStats.video.framesDropped as number} dropped</span\n ></span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Packet Loss</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--bad\":\n ((playerStats.video.packetLossRate as number) || 0) > 1,\n \"fw-dev-stat-value--good\":\n ((playerStats.video.packetLossRate as number) || 0) <= 1,\n })}\n >${(\n ((playerStats.video.packetLossRate as number) || 0) as number\n ).toFixed(2)}%</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Jitter</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\":\n ((playerStats.video.jitter as number) || 0) > 30,\n })}\n >${(((playerStats.video.jitter as number) || 0) as number).toFixed(1)}\n ms</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Jitter Buffer</span>\n <span class=\"fw-dev-stat-value\"\n >${(\n ((playerStats.video.jitterBufferDelay as number) || 0) as number\n ).toFixed(1)}\n ms</span\n >\n </div>\n `\n : nothing}\n ${playerStats.network\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">RTT</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\":\n ((playerStats.network.rtt as number) || 0) > 200,\n })}\n >${Math.round(((playerStats.network.rtt as number) || 0) as number)}\n ms</span\n >\n </div>\n `\n : nothing}\n `\n : nothing}\n `\n : nothing}\n ${trackEntries.length > 0\n ? html`\n <div class=\"fw-dev-list-header fw-dev-section-header\">\n <span class=\"fw-dev-list-title\">Tracks (${trackEntries.length})</span>\n </div>\n ${trackEntries.map(([id, track]) => {\n const typedTrack = track as {\n type: string;\n codec: string;\n width?: number;\n height?: number;\n bps?: number;\n fpks?: number;\n channels?: number;\n rate?: number;\n lang?: string;\n };\n\n return html`\n <div class=\"fw-dev-track\">\n <div class=\"fw-dev-track-header\">\n <span\n class=${classMap({\n \"fw-dev-track-badge\": true,\n \"fw-dev-track-badge--video\": typedTrack.type === \"video\",\n \"fw-dev-track-badge--audio\": typedTrack.type === \"audio\",\n \"fw-dev-track-badge--other\":\n typedTrack.type !== \"video\" && typedTrack.type !== \"audio\",\n })}\n >${typedTrack.type}</span\n >\n <span class=\"fw-dev-track-codec\">${typedTrack.codec}</span>\n <span class=\"fw-dev-track-id\">#${id}</span>\n </div>\n <div class=\"fw-dev-track-meta\">\n ${typedTrack.type === \"video\" && typedTrack.width && typedTrack.height\n ? html`<span>${typedTrack.width}x${typedTrack.height}</span>`\n : nothing}\n ${typedTrack.bps\n ? html`<span>${Math.round(typedTrack.bps / 1000)} kbps</span>`\n : nothing}\n ${typedTrack.fpks\n ? html`<span>${Math.round(typedTrack.fpks / 1000)} fps</span>`\n : nothing}\n ${typedTrack.type === \"audio\" && typedTrack.channels\n ? html`<span>${typedTrack.channels}ch</span>`\n : nothing}\n ${typedTrack.type === \"audio\" && typedTrack.rate\n ? html`<span>${typedTrack.rate} Hz</span>`\n : nothing}\n ${typedTrack.lang ? html`<span>${typedTrack.lang}</span>` : nothing}\n </div>\n </div>\n `;\n })}\n `\n : nothing}\n ${mistStreamInfo && trackEntries.length === 0\n ? html`\n <div class=\"fw-dev-no-tracks\">\n <span class=\"fw-dev-no-tracks-text\"\n >No track data available\n ${mistStreamInfo.type\n ? html`<span class=\"fw-dev-no-tracks-type\">(${mistStreamInfo.type})</span>`\n : nothing}</span\n >\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n private _renderConfigTab(): unknown {\n const allCombinations = this._getAllCombinations();\n const compatibleCombinations = allCombinations.filter((combo) => combo.compatible);\n const activeComboIndex = this._getActiveComboIndex(allCombinations);\n\n const currentPlayer = this.pc.s.currentPlayerInfo;\n const currentSource = this.pc.s.currentSourceInfo;\n\n return html`\n <div class=\"fw-dev-body\">\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Active</div>\n <div class=\"fw-dev-value\">\n ${currentPlayer?.name || \"None\"}\n <span class=\"fw-dev-value-arrow\">${\"\\u2192\"}</span>\n ${SOURCE_TYPE_LABELS[currentSource?.type || \"\"] || currentSource?.type || \"-\"}\n </div>\n ${(this.pc.s.endpoints?.primary as { nodeId?: string } | undefined)?.nodeId\n ? html`\n <div class=\"fw-dev-value-muted\">\n Node: ${(this.pc.s.endpoints?.primary as { nodeId?: string }).nodeId}\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Playback Mode</div>\n <div class=\"fw-dev-mode-group\">\n ${([\"auto\", \"low-latency\", \"quality\"] as const).map(\n (mode) => html`\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-mode-btn\": true,\n \"fw-dev-mode-btn--active\": this.playbackMode === mode,\n })}\n @click=${() => this._handleModeChange(mode)}\n >\n ${mode === \"low-latency\"\n ? \"Low Lat\"\n : `${mode.charAt(0).toUpperCase()}${mode.slice(1)}`}\n </button>\n `\n )}\n </div>\n <div class=\"fw-dev-mode-desc\">\n ${this.playbackMode === \"auto\"\n ? \"Balanced: MP4/WS \\u2192 WHEP \\u2192 HLS\"\n : this.playbackMode === \"low-latency\"\n ? \"WHEP/WebRTC first (<1s delay)\"\n : \"MP4/WS first, HLS fallback\"}\n </div>\n </div>\n\n <div class=\"fw-dev-actions\">\n <button type=\"button\" class=\"fw-dev-action-btn\" @click=${this._handleReload}>\n Reload\n </button>\n <button type=\"button\" class=\"fw-dev-action-btn\" @click=${this._handleNextCombo}>\n Next Option\n </button>\n </div>\n\n <div class=\"fw-dev-section\" style=\"padding:0;border-bottom:0;\">\n <div class=\"fw-dev-list-header\">\n <span class=\"fw-dev-list-title\">Player Options (${compatibleCombinations.length})</span>\n ${allCombinations.length > compatibleCombinations.length\n ? html`\n <button\n type=\"button\"\n class=\"fw-dev-list-toggle\"\n @click=${() => {\n this._showDisabledPlayers = !this._showDisabledPlayers;\n }}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n class=${classMap({\n \"fw-dev-chevron\": true,\n \"fw-dev-chevron--open\": this._showDisabledPlayers,\n })}\n >\n <path d=\"M6 9l6 6 6-6\"></path>\n </svg>\n ${this._showDisabledPlayers ? \"Hide\" : \"Show\"} disabled\n (${allCombinations.length - compatibleCombinations.length})\n </button>\n `\n : nothing}\n </div>\n\n ${allCombinations.length === 0\n ? html`<div class=\"fw-dev-list-empty\">No stream info available</div>`\n : html`\n ${allCombinations.map((combo, index) => {\n const isCodecIncompatible = combo.codecIncompatible === true;\n if (!combo.compatible && !isCodecIncompatible && !this._showDisabledPlayers) {\n return nothing;\n }\n\n const isActive = activeComboIndex === index;\n const typeLabel =\n SOURCE_TYPE_LABELS[combo.sourceType] || combo.sourceType.split(\"/\").pop();\n\n const scoreClass =\n !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-score--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-score--low\"\n : combo.score >= 2\n ? \"fw-dev-combo-score--high\"\n : combo.score >= 1.5\n ? \"fw-dev-combo-score--mid\"\n : \"fw-dev-combo-score--low\";\n\n const rankClass = isActive\n ? \"fw-dev-combo-rank--active\"\n : !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-rank--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-rank--warn\"\n : \"\";\n\n const typeClass =\n !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-type--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-type--warn\"\n : \"\";\n\n return html`\n <div\n class=\"fw-dev-combo\"\n @mouseenter=${(event: MouseEvent) =>\n this._handleComboMouseEnter(index, event)}\n @mouseleave=${() => {\n this._hoveredComboIndex = null;\n this._tooltipPos = null;\n }}\n >\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-combo-btn\": true,\n \"fw-dev-combo-btn--active\": isActive,\n \"fw-dev-combo-btn--disabled\": !combo.compatible && !isCodecIncompatible,\n \"fw-dev-combo-btn--codec-warn\": isCodecIncompatible,\n })}\n @click=${() => this._handleSelectCombo(index)}\n >\n <span\n class=${classMap({\n \"fw-dev-combo-rank\": true,\n [rankClass]: rankClass.length > 0,\n })}\n >${combo.compatible\n ? index + 1\n : isCodecIncompatible\n ? \"\\u26A0\"\n : \"\\u2014\"}</span\n >\n\n <span class=\"fw-dev-combo-name\"\n >${combo.playerName} <span class=\"fw-dev-combo-arrow\">${\"\\u2192\"}</span>\n <span\n class=${classMap({\n \"fw-dev-combo-type\": true,\n [typeClass]: typeClass.length > 0,\n })}\n >${typeLabel}</span\n ></span\n >\n\n <span class=${classMap({ \"fw-dev-combo-score\": true, [scoreClass]: true })}\n >${combo.score.toFixed(2)}</span\n >\n </button>\n\n ${this._hoveredComboIndex === index && this._tooltipPos\n ? html`\n <div\n class=\"fw-dev-tooltip\"\n style=\"top: ${this._tooltipPos.top}px; left: ${this._tooltipPos\n .left}px;\"\n >\n <div class=\"fw-dev-tooltip-header\">\n <div class=\"fw-dev-tooltip-title\">${combo.playerName}</div>\n <div class=\"fw-dev-tooltip-subtitle\">${combo.sourceType}</div>\n ${combo.scoreBreakdown?.trackTypes &&\n combo.scoreBreakdown.trackTypes.length > 0\n ? html`\n <div class=\"fw-dev-tooltip-tracks\">\n Tracks:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.trackTypes.join(\", \")}</span\n >\n </div>\n `\n : nothing}\n </div>\n\n ${combo.compatible && combo.scoreBreakdown\n ? html`\n <div class=\"fw-dev-tooltip-score\">\n Score: ${combo.score.toFixed(2)}\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Tracks [${combo.scoreBreakdown.trackTypes.join(\", \")}]:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.trackScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.tracks}</span\n >\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Priority:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.priorityScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.priority}</span\n >\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Source:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.sourceScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.source}</span\n >\n </div>\n\n ${typeof combo.scoreBreakdown.reliabilityScore === \"number\"\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Reliability:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.reliabilityScore.toFixed(\n 2\n )}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.reliability ??\n 0}</span\n >\n </div>\n `\n : nothing}\n ${typeof combo.scoreBreakdown.modeBonus === \"number\" &&\n combo.scoreBreakdown.modeBonus !== 0\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Mode (${this.playbackMode}):\n <span class=\"fw-dev-tooltip-bonus\"\n >+${combo.scoreBreakdown.modeBonus.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.mode ?? 0}</span\n >\n </div>\n `\n : nothing}\n ${typeof combo.scoreBreakdown.routingBonus === \"number\" &&\n combo.scoreBreakdown.routingBonus !== 0\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Routing:\n <span\n class=${classMap({\n \"fw-dev-tooltip-bonus\":\n combo.scoreBreakdown.routingBonus > 0,\n \"fw-dev-tooltip-penalty\":\n combo.scoreBreakdown.routingBonus < 0,\n })}\n >${combo.scoreBreakdown.routingBonus > 0\n ? \"+\"\n : \"\"}${combo.scoreBreakdown.routingBonus.toFixed(\n 2\n )}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.routing ?? 0}</span\n >\n </div>\n `\n : nothing}\n `\n : html`\n <div class=\"fw-dev-tooltip-error\">\n ${combo.incompatibleReason || \"Incompatible\"}\n </div>\n `}\n </div>\n `\n : nothing}\n </div>\n `;\n })}\n `}\n </div>\n </div>\n `;\n }\n\n protected render() {\n return html`\n <div class=\"fw-dev-panel\">\n <div class=\"fw-dev-header\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-tab\": true,\n \"fw-dev-tab--active\": this._activeTab === \"config\",\n })}\n @click=${() => {\n this._activeTab = \"config\";\n }}\n >\n Config\n </button>\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-tab\": true,\n \"fw-dev-tab--active\": this._activeTab === \"stats\",\n })}\n @click=${() => {\n this._activeTab = \"stats\";\n }}\n >\n Stats\n </button>\n <div class=\"fw-dev-spacer\"></div>\n <button\n type=\"button\"\n class=\"fw-dev-close\"\n aria-label=\"Close dev mode panel\"\n @click=${() =>\n this.dispatchEvent(new CustomEvent(\"fw-close\", { bubbles: true, composed: true }))}\n >\n ${closeIcon()}\n </button>\n </div>\n\n ${this._activeTab === \"config\" ? this._renderConfigTab() : this._renderStatsTab()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-dev-mode-panel\": FwDevModePanel;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,17 @@ import { classMap } from 'lit/directives/class-map.js';
|
|
|
5
5
|
import { sharedStyles } from '../styles/shared-styles.js';
|
|
6
6
|
import { utilityStyles } from '../styles/utility-styles.js';
|
|
7
7
|
import { closeIcon } from '../icons/index.js';
|
|
8
|
+
import { createTranslator } from '@livepeer-frameworks/player-core';
|
|
8
9
|
|
|
9
10
|
let FwErrorOverlay = class FwErrorOverlay extends LitElement {
|
|
10
11
|
constructor() {
|
|
11
12
|
super(...arguments);
|
|
12
13
|
this.error = null;
|
|
13
14
|
this.isPassive = false;
|
|
15
|
+
this._defaultTranslator = createTranslator({ locale: "en" });
|
|
16
|
+
}
|
|
17
|
+
get _t() {
|
|
18
|
+
return this.translator ?? this._defaultTranslator;
|
|
14
19
|
}
|
|
15
20
|
render() {
|
|
16
21
|
return html `
|
|
@@ -43,28 +48,28 @@ let FwErrorOverlay = class FwErrorOverlay extends LitElement {
|
|
|
43
48
|
"fw-error-title--warning": this.isPassive,
|
|
44
49
|
"fw-error-title--error": !this.isPassive,
|
|
45
50
|
})}
|
|
46
|
-
>${this.isPassive ? "
|
|
51
|
+
>${this.isPassive ? this._t("warning") : this._t("error")}</span
|
|
47
52
|
>
|
|
48
53
|
<button
|
|
49
54
|
type="button"
|
|
50
55
|
class="fw-error-close"
|
|
51
56
|
@click=${this._clearError}
|
|
52
|
-
aria-label
|
|
57
|
+
aria-label=${this._t("dismiss")}
|
|
53
58
|
>
|
|
54
59
|
${closeIcon()}
|
|
55
60
|
</button>
|
|
56
61
|
</div>
|
|
57
62
|
<div class="fw-error-body">
|
|
58
|
-
<p class="fw-error-message"
|
|
63
|
+
<p class="fw-error-message">${this.error || this._t("playbackIssue")}</p>
|
|
59
64
|
</div>
|
|
60
65
|
<div class="fw-error-actions">
|
|
61
66
|
<button
|
|
62
67
|
type="button"
|
|
63
68
|
class="fw-error-btn"
|
|
64
|
-
aria-label
|
|
69
|
+
aria-label=${this._t("retry")}
|
|
65
70
|
@click=${this._retry}
|
|
66
71
|
>
|
|
67
|
-
|
|
72
|
+
${this._t("retry")}
|
|
68
73
|
</button>
|
|
69
74
|
</div>
|
|
70
75
|
</div>
|
|
@@ -93,6 +98,9 @@ __decorate([
|
|
|
93
98
|
__decorate([
|
|
94
99
|
property({ type: Boolean, attribute: "is-passive" })
|
|
95
100
|
], FwErrorOverlay.prototype, "isPassive", void 0);
|
|
101
|
+
__decorate([
|
|
102
|
+
property({ attribute: false })
|
|
103
|
+
], FwErrorOverlay.prototype, "translator", void 0);
|
|
96
104
|
FwErrorOverlay = __decorate([
|
|
97
105
|
customElement("fw-error-overlay")
|
|
98
106
|
], FwErrorOverlay);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fw-error-overlay.js","sources":["../../../../src/components/fw-error-overlay.ts"],"sourcesContent":["import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport { closeIcon } from \"../icons/index.js\";\n\n@customElement(\"fw-error-overlay\")\nexport class FwErrorOverlay extends LitElement {\n @property({ type: String }) error: string | null = null;\n @property({ type: Boolean, attribute: \"is-passive\" }) isPassive = false;\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: contents;\n }\n `,\n ];\n\n protected render() {\n return html`\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n class=${classMap({\n \"fw-error-overlay\": true,\n \"fw-error-overlay--passive\": this.isPassive,\n \"fw-error-overlay--fullscreen\": !this.isPassive,\n })}\n >\n <div\n class=${classMap({\n \"fw-error-popup\": true,\n \"fw-error-popup--passive\": this.isPassive,\n \"fw-error-popup--fullscreen\": !this.isPassive,\n })}\n >\n <div\n class=${classMap({\n \"fw-error-header\": true,\n \"fw-error-header--warning\": this.isPassive,\n \"fw-error-header--error\": !this.isPassive,\n })}\n >\n <span\n class=${classMap({\n \"fw-error-title\": true,\n \"fw-error-title--warning\": this.isPassive,\n \"fw-error-title--error\": !this.isPassive,\n })}\n >${this.isPassive ? \"
|
|
1
|
+
{"version":3,"file":"fw-error-overlay.js","sources":["../../../../src/components/fw-error-overlay.ts"],"sourcesContent":["import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport { closeIcon } from \"../icons/index.js\";\nimport { createTranslator, type TranslateFn } from \"@livepeer-frameworks/player-core\";\n\n@customElement(\"fw-error-overlay\")\nexport class FwErrorOverlay extends LitElement {\n @property({ type: String }) error: string | null = null;\n @property({ type: Boolean, attribute: \"is-passive\" }) isPassive = false;\n @property({ attribute: false }) translator?: TranslateFn;\n\n private _defaultTranslator: TranslateFn = createTranslator({ locale: \"en\" });\n\n private get _t(): TranslateFn {\n return this.translator ?? this._defaultTranslator;\n }\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: contents;\n }\n `,\n ];\n\n protected render() {\n return html`\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n class=${classMap({\n \"fw-error-overlay\": true,\n \"fw-error-overlay--passive\": this.isPassive,\n \"fw-error-overlay--fullscreen\": !this.isPassive,\n })}\n >\n <div\n class=${classMap({\n \"fw-error-popup\": true,\n \"fw-error-popup--passive\": this.isPassive,\n \"fw-error-popup--fullscreen\": !this.isPassive,\n })}\n >\n <div\n class=${classMap({\n \"fw-error-header\": true,\n \"fw-error-header--warning\": this.isPassive,\n \"fw-error-header--error\": !this.isPassive,\n })}\n >\n <span\n class=${classMap({\n \"fw-error-title\": true,\n \"fw-error-title--warning\": this.isPassive,\n \"fw-error-title--error\": !this.isPassive,\n })}\n >${this.isPassive ? this._t(\"warning\") : this._t(\"error\")}</span\n >\n <button\n type=\"button\"\n class=\"fw-error-close\"\n @click=${this._clearError}\n aria-label=${this._t(\"dismiss\")}\n >\n ${closeIcon()}\n </button>\n </div>\n <div class=\"fw-error-body\">\n <p class=\"fw-error-message\">${this.error || this._t(\"playbackIssue\")}</p>\n </div>\n <div class=\"fw-error-actions\">\n <button\n type=\"button\"\n class=\"fw-error-btn\"\n aria-label=${this._t(\"retry\")}\n @click=${this._retry}\n >\n ${this._t(\"retry\")}\n </button>\n </div>\n </div>\n </div>\n `;\n }\n\n private _clearError() {\n this.dispatchEvent(new CustomEvent(\"fw-clear-error\", { bubbles: true, composed: true }));\n }\n\n private _retry() {\n this.dispatchEvent(new CustomEvent(\"fw-retry\", { bubbles: true, composed: true }));\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-error-overlay\": FwErrorOverlay;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { sharedStyles } from '../styles/shared-styles.js';
|
|
|
5
5
|
import { utilityStyles } from '../styles/utility-styles.js';
|
|
6
6
|
import { LOGOMARK_DATA_URL } from '../constants/media-assets.js';
|
|
7
7
|
import { playHitmarkerSound } from './shared/hitmarker-audio.js';
|
|
8
|
+
import { createTranslator } from '@livepeer-frameworks/player-core';
|
|
8
9
|
import './fw-dvd-logo.js';
|
|
9
10
|
|
|
10
11
|
const BUBBLE_COLORS = [
|
|
@@ -31,6 +32,7 @@ let FwIdleScreen = class FwIdleScreen extends LitElement {
|
|
|
31
32
|
constructor() {
|
|
32
33
|
super(...arguments);
|
|
33
34
|
this.retryEnabled = false;
|
|
35
|
+
this._defaultTranslator = createTranslator({ locale: "en" });
|
|
34
36
|
this._logoSize = 100;
|
|
35
37
|
this._logoOffset = { x: 0, y: 0 };
|
|
36
38
|
this._isLogoHovered = false;
|
|
@@ -91,6 +93,9 @@ let FwIdleScreen = class FwIdleScreen extends LitElement {
|
|
|
91
93
|
}));
|
|
92
94
|
};
|
|
93
95
|
}
|
|
96
|
+
get _t() {
|
|
97
|
+
return this.translator ?? this._defaultTranslator;
|
|
98
|
+
}
|
|
94
99
|
connectedCallback() {
|
|
95
100
|
super.connectedCallback();
|
|
96
101
|
this._clearBubbleTimers();
|
|
@@ -197,7 +202,7 @@ let FwIdleScreen = class FwIdleScreen extends LitElement {
|
|
|
197
202
|
return this._isError && (this.retryEnabled || typeof this.onRetry === "function");
|
|
198
203
|
}
|
|
199
204
|
get _displayMessage() {
|
|
200
|
-
return this.error || this.message || "
|
|
205
|
+
return this.error || this.message || this._t("waitingForStream");
|
|
201
206
|
}
|
|
202
207
|
_renderStatusIcon() {
|
|
203
208
|
if (this._isLoading) {
|
|
@@ -377,7 +382,7 @@ let FwIdleScreen = class FwIdleScreen extends LitElement {
|
|
|
377
382
|
: nothing}
|
|
378
383
|
${this._showRetry
|
|
379
384
|
? html `<button type="button" class="retry-btn" @click=${this._handleRetry}>
|
|
380
|
-
|
|
385
|
+
${this._t("retry")}
|
|
381
386
|
</button>`
|
|
382
387
|
: nothing}
|
|
383
388
|
</div>
|
|
@@ -700,6 +705,9 @@ __decorate([
|
|
|
700
705
|
__decorate([
|
|
701
706
|
property({ attribute: false })
|
|
702
707
|
], FwIdleScreen.prototype, "onRetry", void 0);
|
|
708
|
+
__decorate([
|
|
709
|
+
property({ attribute: false })
|
|
710
|
+
], FwIdleScreen.prototype, "translator", void 0);
|
|
703
711
|
__decorate([
|
|
704
712
|
query(".idle-container")
|
|
705
713
|
], FwIdleScreen.prototype, "_containerEl", void 0);
|