@moq/watch 0.2.13 → 0.2.15
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 +10 -9
- package/audio/source.d.ts.map +1 -1
- package/broadcast-jtLUfuyL.js +4291 -0
- package/broadcast-jtLUfuyL.js.map +1 -0
- package/broadcast.d.ts.map +1 -1
- package/dom-Yz3UT5ap.js +29 -0
- package/dom-Yz3UT5ap.js.map +1 -0
- package/element.js +162 -178
- package/element.js.map +1 -1
- package/index.d.ts +1 -3
- package/index.d.ts.map +1 -1
- package/index.js +5 -254
- package/libav-opus-af-CzuaKpJb.js +252 -0
- package/libav-opus-af-CzuaKpJb.js.map +1 -0
- package/main-bFFHfuX4.js +1999 -0
- package/main-bFFHfuX4.js.map +1 -0
- package/package.json +5 -4
- package/support/element.js +122 -172
- package/support/element.js.map +1 -1
- package/support/index.js +52 -53
- package/support/index.js.map +1 -1
- package/ui/element.js +335 -359
- package/ui/element.js.map +1 -1
- package/video/source.d.ts.map +1 -1
- package/broadcast-CLjMphZS.js +0 -5000
- package/broadcast-CLjMphZS.js.map +0 -1
- package/chat/index.d.ts +0 -17
- package/chat/index.d.ts.map +0 -1
- package/chat/message.d.ts +0 -16
- package/chat/message.d.ts.map +0 -1
- package/chat/typing.d.ts +0 -16
- package/chat/typing.d.ts.map +0 -1
- package/dom-BsFrLb_F.js +0 -35
- package/dom-BsFrLb_F.js.map +0 -1
- package/index.js.map +0 -1
- package/libav-opus-af-BlMWboA7.js +0 -368
- package/libav-opus-af-BlMWboA7.js.map +0 -1
- package/location/index.d.ts +0 -17
- package/location/index.d.ts.map +0 -1
- package/location/peers.d.ts +0 -16
- package/location/peers.d.ts.map +0 -1
- package/location/window.d.ts +0 -17
- package/location/window.d.ts.map +0 -1
- package/main-DGBFe0O7.js +0 -2301
- package/main-DGBFe0O7.js.map +0 -1
- package/preview.d.ts +0 -23
- package/preview.d.ts.map +0 -1
- package/user.d.ts +0 -17
- package/user.d.ts.map +0 -1
package/ui/element.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element.js","sources":["../../src/ui/components/buffer-control.ts","../../src/ui/components/buffering-indicator.ts","../../src/ui/icons/audio.svg?raw","../../src/ui/icons/buffer.svg?raw","../../src/ui/icons/fullscreen-enter.svg?raw","../../src/ui/icons/fullscreen-exit.svg?raw","../../src/ui/icons/mute.svg?raw","../../src/ui/icons/network.svg?raw","../../src/ui/icons/pause.svg?raw","../../src/ui/icons/play.svg?raw","../../src/ui/icons/stats.svg?raw","../../src/ui/icons/video.svg?raw","../../src/ui/icons/volume-high.svg?raw","../../src/ui/icons/volume-low.svg?raw","../../src/ui/icons/volume-medium.svg?raw","../../src/ui/icons.ts","../../src/ui/components/fullscreen-button.ts","../../src/ui/components/offline-indicator.ts","../../src/ui/components/play-pause.ts","../../src/ui/components/quality-selector.ts","../../src/ui/components/stats-button.ts","../../src/ui/components/volume-slider.ts","../../src/ui/components/watch-status-indicator.ts","../../src/ui/stats.ts","../../src/ui/element.ts"],"sourcesContent":["import type { Moq } from \"@moq/hang\";\nimport type { Effect } from \"@moq/signals\";\nimport type { BufferedRanges } from \"../..\";\nimport type MoqWatch from \"../../element\";\n\nconst MIN_RANGE = 0 as Moq.Time.Milli;\nconst RANGE_STEP = 10 as Moq.Time.Milli;\nconst DEFAULT_MAX = 4000 as Moq.Time.Milli;\nconst LABEL_WIDTH = 48;\n\nfunction drawRanges(\n\tcanvas: HTMLCanvasElement,\n\tranges: BufferedRanges,\n\ttimestamp: Moq.Time.Milli | undefined,\n\tmax: Moq.Time.Milli,\n\tisBuffering: boolean,\n) {\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) return;\n\n\tconst dpr = window.devicePixelRatio || 1;\n\tconst rect = canvas.getBoundingClientRect();\n\tconst width = rect.width;\n\tconst height = rect.height;\n\n\tconst canvasW = Math.round(width * dpr);\n\tconst canvasH = Math.round(height * dpr);\n\tif (canvas.width !== canvasW || canvas.height !== canvasH) {\n\t\tcanvas.width = canvasW;\n\t\tcanvas.height = canvasH;\n\t}\n\n\tctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\tctx.clearRect(0, 0, width, height);\n\n\tif (timestamp === undefined) return;\n\n\tconst padding = 2;\n\tconst rangeHeight = height - padding * 2;\n\tconst radius = 2;\n\n\tfor (let i = 0; i < ranges.length; i++) {\n\t\tconst range = ranges[i];\n\t\tconst startMs = (range.start - timestamp) as Moq.Time.Milli;\n\t\tconst endMs = (range.end - timestamp) as Moq.Time.Milli;\n\t\tconst visibleStart = Math.max(0, startMs);\n\t\tconst visibleEnd = Math.min(endMs, max);\n\n\t\tif (visibleEnd <= visibleStart) continue;\n\n\t\tconst x = (visibleStart / max) * width;\n\t\tconst w = Math.max(2, ((visibleEnd - visibleStart) / max) * width);\n\n\t\tctx.globalAlpha = 0.85;\n\t\tctx.fillStyle = isBuffering ? \"#f87171\" : i > 0 ? \"#facc15\" : \"#4ade80\";\n\n\t\tif (typeof ctx.roundRect === \"function\") {\n\t\t\tctx.beginPath();\n\t\t\tctx.roundRect(x, padding, w, rangeHeight, radius);\n\t\t\tctx.fill();\n\t\t} else {\n\t\t\tctx.fillRect(x, padding, w, rangeHeight);\n\t\t}\n\n\t\tif (endMs > max) {\n\t\t\tconst overflowSec = ((endMs - max) / 1000).toFixed(1);\n\t\t\tctx.globalAlpha = 0.7;\n\t\t\tctx.fillStyle = \"black\";\n\t\t\tctx.font = \"500 9px system-ui, sans-serif\";\n\t\t\tctx.textAlign = \"right\";\n\t\t\tctx.textBaseline = \"middle\";\n\t\t\tctx.fillText(`+${overflowSec}s`, x + w - 4, height / 2);\n\t\t}\n\t}\n}\n\nexport function bufferControl(parent: Effect, watch: MoqWatch, max: Moq.Time.Milli = DEFAULT_MAX): HTMLElement {\n\tconst wrapper = document.createElement(\"div\");\n\twrapper.className = \"buffer\";\n\n\tconst viz = document.createElement(\"div\");\n\tviz.className = \"buffer-visualization\";\n\tviz.setAttribute(\"role\", \"slider\");\n\tviz.tabIndex = 0;\n\tviz.setAttribute(\"aria-valuemin\", MIN_RANGE.toString());\n\tviz.setAttribute(\"aria-valuemax\", max.toString());\n\tviz.setAttribute(\"aria-label\", \"Buffer jitter\");\n\n\tconst playhead = document.createElement(\"div\");\n\tplayhead.className = \"buffer-playhead\";\n\n\tconst videoTrack = document.createElement(\"div\");\n\tvideoTrack.className = \"buffer-track buffer-track--video\";\n\tconst videoLabel = document.createElement(\"span\");\n\tvideoLabel.className = \"buffer-track-label\";\n\tvideoLabel.textContent = \"Video\";\n\tconst videoCanvas = document.createElement(\"canvas\");\n\tvideoCanvas.className = \"buffer-canvas\";\n\tvideoTrack.append(videoLabel, videoCanvas);\n\n\tconst audioTrack = document.createElement(\"div\");\n\taudioTrack.className = \"buffer-track buffer-track--audio\";\n\tconst audioLabel = document.createElement(\"span\");\n\taudioLabel.className = \"buffer-track-label\";\n\taudioLabel.textContent = \"Audio\";\n\tconst audioCanvas = document.createElement(\"canvas\");\n\taudioCanvas.className = \"buffer-canvas\";\n\taudioTrack.append(audioLabel, audioCanvas);\n\n\tconst targetArea = document.createElement(\"div\");\n\ttargetArea.className = \"buffer-target-area\";\n\tconst targetLine = document.createElement(\"div\");\n\ttargetLine.className = \"buffer-target-line\";\n\tconst targetLabel = document.createElement(\"span\");\n\ttargetLabel.className = \"buffer-target-label\";\n\ttargetLine.appendChild(targetLabel);\n\ttargetArea.appendChild(targetLine);\n\n\tconst help = document.createElement(\"span\");\n\thelp.className = \"buffer-help\";\n\thelp.textContent = \"click to change latency\";\n\n\tviz.append(playhead, videoTrack, audioTrack, targetArea, help);\n\twrapper.appendChild(viz);\n\n\tlet dragging = false;\n\tlet hasInteracted = false;\n\n\tparent.run((effect) => {\n\t\tconst jitter = effect.get(watch.backend.jitter);\n\t\tconst pct = (jitter / max) * 100;\n\t\ttargetLine.style.left = `${pct}%`;\n\t\ttargetLabel.textContent = `${Math.round(jitter)}ms`;\n\t\tviz.setAttribute(\"aria-valuenow\", jitter.toString());\n\t});\n\n\tconst updateFromX = (clientX: number) => {\n\t\tconst rect = viz.getBoundingClientRect();\n\t\tconst trackWidth = rect.width - LABEL_WIDTH;\n\t\tconst x = Math.max(0, Math.min(clientX - rect.left - LABEL_WIDTH, trackWidth));\n\t\tconst ms = (x / trackWidth) * max;\n\t\tconst snapped = (Math.round(ms / RANGE_STEP) * RANGE_STEP) as Moq.Time.Milli;\n\t\tconst clamped = Math.max(MIN_RANGE, Math.min(max, snapped)) as Moq.Time.Milli;\n\t\twatch.backend.latency.set(clamped);\n\t};\n\n\tconst interact = () => {\n\t\tif (!hasInteracted) {\n\t\t\thasInteracted = true;\n\t\t\thelp.style.display = \"none\";\n\t\t}\n\t};\n\n\tparent.event(viz, \"mousedown\", (e) => {\n\t\tdragging = true;\n\t\tviz.classList.add(\"buffer-visualization--dragging\");\n\t\tinteract();\n\t\tupdateFromX(e.clientX);\n\t});\n\n\tparent.event(document, \"mousemove\", (e) => {\n\t\tif (dragging) updateFromX(e.clientX);\n\t});\n\n\tparent.event(document, \"mouseup\", () => {\n\t\tif (!dragging) return;\n\t\tdragging = false;\n\t\tviz.classList.remove(\"buffer-visualization--dragging\");\n\t});\n\n\tparent.event(viz, \"keydown\", (e) => {\n\t\tlet delta = 0 as Moq.Time.Milli;\n\t\tif (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n\t\t\tdelta = RANGE_STEP;\n\t\t} else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n\t\t\tdelta = -RANGE_STEP as Moq.Time.Milli;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\tinteract();\n\t\tconst current = watch.backend.jitter.peek();\n\t\tconst value = Math.max(MIN_RANGE, Math.min(max, current + delta)) as Moq.Time.Milli;\n\t\twatch.backend.latency.set(value);\n\t});\n\n\tconst draw = () => {\n\t\tconst timestamp = watch.backend.sync.now();\n\t\tconst isBuffering = watch.backend.video.stalled.peek();\n\t\tdrawRanges(videoCanvas, watch.backend.video.buffered.peek(), timestamp, max, isBuffering);\n\t\tdrawRanges(audioCanvas, watch.backend.audio.buffered.peek(), timestamp, max, isBuffering);\n\t\tparent.animate(draw);\n\t};\n\tparent.animate(draw);\n\n\treturn wrapper;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\n\nexport function bufferingIndicator(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst container = document.createElement(\"div\");\n\tcontainer.className = \"buffering\";\n\tconst spinner = document.createElement(\"div\");\n\tspinner.className = \"buffering-spinner\";\n\tcontainer.appendChild(spinner);\n\n\tparent.run((effect) => {\n\t\tconst buffering = effect.get(watch.backend.video.stalled);\n\t\tconst offline = effect.get(watch.broadcast.status) === \"offline\";\n\t\tcontainer.style.display = buffering && !offline ? \"\" : \"none\";\n\t});\n\n\treturn container;\n}\n","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M9 18V5l12-2v13\\\" />\\n\\t<circle cx=\\\"6\\\" cy=\\\"18\\\" r=\\\"3\\\" />\\n\\t<circle cx=\\\"18\\\" cy=\\\"16\\\" r=\\\"3\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M8 3H5a2 2 0 0 0-2 2v3\\\" />\\n\\t<path d=\\\"M21 8V5a2 2 0 0 0-2-2h-3\\\" />\\n\\t<path d=\\\"M3 16v3a2 2 0 0 0 2 2h3\\\" />\\n\\t<path d=\\\"M16 21h3a2 2 0 0 0 2-2v-3\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M8 3v3a2 2 0 0 1-2 2H3\\\" />\\n\\t<path d=\\\"M21 8h-3a2 2 0 0 1-2-2V3\\\" />\\n\\t<path d=\\\"M3 16h3a2 2 0 0 1 2 2v3\\\" />\\n\\t<path d=\\\"M16 21v-3a2 2 0 0 1 2-2h3\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"var(--color-white)\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M16 9a5 5 0 0 1 .95 2.293\\\" />\\n\\t<path d=\\\"M19.364 5.636a9 9 0 0 1 1.889 9.96\\\" />\\n\\t<path d=\\\"m2 2 20 20\\\" />\\n\\t<path d=\\\"m7 7-.587.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298V11\\\" />\\n\\t<path d=\\\"M9.828 4.172A.686.686 0 0 1 11 4.657v.686\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M16.247 7.761a6 6 0 0 1 0 8.478\\\" />\\n\\t<path d=\\\"M19.075 4.933a10 10 0 0 1 0 14.134\\\" />\\n\\t<path d=\\\"M4.925 19.067a10 10 0 0 1 0-14.134\\\" />\\n\\t<path d=\\\"M7.753 16.239a6 6 0 0 1 0-8.478\\\" />\\n\\t<circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"2\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"var(--color-white)\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<rect x=\\\"14\\\" y=\\\"3\\\" width=\\\"5\\\" height=\\\"18\\\" rx=\\\"1\\\" />\\n <rect x=\\\"5\\\" y=\\\"3\\\" width=\\\"5\\\" height=\\\"18\\\" rx=\\\"1\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"var(--color-white)\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M5 21v-6\\\" />\\n\\t<path d=\\\"M12 21V3\\\" />\\n\\t<path d=\\\"M19 21V9\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\\\" />\\n\\t<rect x=\\\"2\\\" y=\\\"6\\\" width=\\\"14\\\" height=\\\"12\\\" rx=\\\"2\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"var(--color-white)\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\\\" />\\n\\t<path d=\\\"M16 9a5 5 0 0 1 0 6\\\" />\\n\\t<path d=\\\"M19.364 18.364a9 9 0 0 0 0-12.728\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"var(--color-white)\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n\\t<path d=\\\"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\\\" />\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"var(--color-white)\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n <path d=\\\"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\\\" />\\n <path d=\\\"M16 9a5 5 0 0 1 0 6\\\" />\\n</svg>\"","import audio from \"./icons/audio.svg?raw\";\nimport buffer from \"./icons/buffer.svg?raw\";\nimport fullscreenEnter from \"./icons/fullscreen-enter.svg?raw\";\nimport fullscreenExit from \"./icons/fullscreen-exit.svg?raw\";\nimport mute from \"./icons/mute.svg?raw\";\nimport network from \"./icons/network.svg?raw\";\nimport pause from \"./icons/pause.svg?raw\";\nimport play from \"./icons/play.svg?raw\";\nimport stats from \"./icons/stats.svg?raw\";\nimport video from \"./icons/video.svg?raw\";\nimport volumeHigh from \"./icons/volume-high.svg?raw\";\nimport volumeLow from \"./icons/volume-low.svg?raw\";\nimport volumeMedium from \"./icons/volume-medium.svg?raw\";\n\nexport {\n\taudio,\n\tbuffer,\n\tfullscreenEnter,\n\tfullscreenExit,\n\tmute,\n\tnetwork,\n\tpause,\n\tplay,\n\tstats,\n\tvideo,\n\tvolumeHigh,\n\tvolumeLow,\n\tvolumeMedium,\n};\n\nexport function icon(svg: string): HTMLElement {\n\tconst span = document.createElement(\"span\");\n\tspan.className = \"flex-center\";\n\tspan.setAttribute(\"role\", \"img\");\n\tspan.setAttribute(\"aria-hidden\", \"true\");\n\tspan.innerHTML = svg;\n\treturn span;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\nimport { fullscreenEnter, fullscreenExit, icon } from \"../icons\";\n\nexport function fullscreenButton(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst button = document.createElement(\"button\");\n\tbutton.type = \"button\";\n\tbutton.className = \"button flex-center\";\n\tbutton.title = \"Fullscreen\";\n\tbutton.setAttribute(\"aria-label\", \"Fullscreen\");\n\tbutton.replaceChildren(icon(fullscreenEnter));\n\n\tconst updateIcon = () => {\n\t\tconst isFull = !!document.fullscreenElement;\n\t\tbutton.replaceChildren(icon(isFull ? fullscreenExit : fullscreenEnter));\n\t};\n\tparent.event(document, \"fullscreenchange\", updateIcon);\n\n\tparent.event(button, \"click\", () => {\n\t\tif (document.fullscreenElement) {\n\t\t\tdocument.exitFullscreen();\n\t\t} else {\n\t\t\twatch.requestFullscreen();\n\t\t}\n\t});\n\n\treturn button;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\n\nexport function offlineIndicator(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst container = document.createElement(\"div\");\n\tcontainer.className = \"watch-ui__offline-indicator\";\n\tcontainer.setAttribute(\"role\", \"status\");\n\tcontainer.setAttribute(\"aria-live\", \"polite\");\n\n\tconst text = document.createElement(\"span\");\n\ttext.className = \"watch-ui__offline-text\";\n\ttext.textContent = \"OFFLINE\";\n\tcontainer.appendChild(text);\n\n\tparent.run((effect) => {\n\t\tconst offline = effect.get(watch.broadcast.status) === \"offline\";\n\t\tcontainer.style.display = offline ? \"\" : \"none\";\n\t});\n\n\treturn container;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\nimport { icon, pause, play } from \"../icons\";\n\nexport function playPauseButton(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst button = document.createElement(\"button\");\n\tbutton.type = \"button\";\n\tbutton.className = \"button button--playback flex-center\";\n\n\tparent.run((effect) => {\n\t\tconst paused = effect.get(watch.backend.paused);\n\t\tbutton.title = paused ? \"Play\" : \"Pause\";\n\t\tbutton.setAttribute(\"aria-label\", paused ? \"Play\" : \"Pause\");\n\t\tbutton.replaceChildren(icon(paused ? play : pause));\n\t});\n\n\tparent.event(button, \"click\", () => {\n\t\twatch.paused = !watch.paused;\n\t});\n\n\treturn button;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\n\nfunction formatBitrate(bps: number): string {\n\tif (bps >= 1_000_000) return `${(bps / 1_000_000).toFixed(1)} Mbps`;\n\tif (bps >= 1_000) return `${(bps / 1_000).toFixed(0)} kbps`;\n\treturn `${bps} bps`;\n}\n\nexport function qualitySelector(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst wrapper = document.createElement(\"div\");\n\twrapper.className = \"quality-selector\";\n\n\tconst label = document.createElement(\"label\");\n\tlabel.htmlFor = \"moq-watch-quality-select\";\n\tlabel.className = \"quality-label\";\n\tlabel.textContent = \"Quality: \";\n\n\tconst select = document.createElement(\"select\");\n\tselect.id = \"moq-watch-quality-select\";\n\tselect.className = \"quality-select\";\n\n\twrapper.append(label, select);\n\n\tparent.run((effect) => {\n\t\tconst catalog = effect.get(watch.backend.video.source.catalog);\n\t\tconst active = effect.get(watch.backend.video.source.track);\n\t\tconst renditions = catalog?.renditions ?? {};\n\n\t\tselect.replaceChildren();\n\t\tconst auto = document.createElement(\"option\");\n\t\tauto.value = \"\";\n\t\tauto.textContent = \"Auto\";\n\t\tselect.appendChild(auto);\n\n\t\tfor (const [name, config] of Object.entries(renditions)) {\n\t\t\tconst opt = document.createElement(\"option\");\n\t\t\topt.value = name;\n\t\t\tconst dims = config.codedWidth && config.codedHeight ? ` (${config.codedWidth}x${config.codedHeight})` : \"\";\n\t\t\tconst rate = config.bitrate ? ` ${formatBitrate(config.bitrate)}` : \"\";\n\t\t\topt.textContent = `${name}${dims}${rate}`;\n\t\t\tselect.appendChild(opt);\n\t\t}\n\n\t\tselect.value = active ?? \"\";\n\t});\n\n\tparent.event(select, \"change\", () => {\n\t\tconst value = select.value || undefined;\n\t\twatch.backend.video.source.target.update((prev) => ({ ...prev, name: value }));\n\t});\n\n\treturn wrapper;\n}\n","import type { Effect, Signal } from \"@moq/signals\";\nimport { icon, stats } from \"../icons\";\n\nexport function statsButton(parent: Effect, visible: Signal<boolean>): HTMLElement {\n\tconst button = document.createElement(\"button\");\n\tbutton.type = \"button\";\n\tbutton.className = \"button flex-center\";\n\tbutton.replaceChildren(icon(stats));\n\n\tparent.run((effect) => {\n\t\tconst showing = effect.get(visible);\n\t\tbutton.title = showing ? \"Hide stats\" : \"Show stats\";\n\t\tbutton.setAttribute(\"aria-label\", button.title);\n\t});\n\n\tparent.event(button, \"click\", () => {\n\t\tvisible.update((v) => !v);\n\t});\n\n\treturn button;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\nimport { icon, mute, volumeHigh, volumeLow, volumeMedium } from \"../icons\";\n\nfunction volumeIcon(volumePct: number, muted: boolean): string {\n\tif (muted || volumePct === 0) return mute;\n\tif (volumePct <= 33) return volumeLow;\n\tif (volumePct <= 66) return volumeMedium;\n\treturn volumeHigh;\n}\n\nexport function volumeSlider(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst wrapper = document.createElement(\"div\");\n\twrapper.className = \"volume-slider flex-center\";\n\n\tconst button = document.createElement(\"button\");\n\tbutton.type = \"button\";\n\tbutton.className = \"button flex-center\";\n\n\tconst slider = document.createElement(\"input\");\n\tslider.type = \"range\";\n\tslider.min = \"0\";\n\tslider.max = \"100\";\n\n\tconst label = document.createElement(\"span\");\n\tlabel.className = \"volume-label\";\n\n\twrapper.append(button, slider, label);\n\n\tparent.run((effect) => {\n\t\tconst volume = effect.get(watch.backend.audio.volume);\n\t\tconst muted = effect.get(watch.backend.audio.muted);\n\t\tconst pct = Math.round(volume * 100);\n\t\tslider.value = pct.toString();\n\t\tlabel.textContent = pct.toString();\n\t\tbutton.title = muted ? \"Unmute\" : \"Mute\";\n\t\tbutton.setAttribute(\"aria-label\", button.title);\n\t\tbutton.replaceChildren(icon(volumeIcon(pct, muted)));\n\t});\n\n\tparent.event(slider, \"input\", () => {\n\t\twatch.backend.audio.volume.set(Number.parseFloat(slider.value) / 100);\n\t});\n\n\tparent.event(button, \"click\", () => {\n\t\twatch.backend.audio.muted.update((m) => !m);\n\t});\n\n\treturn wrapper;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\n\ntype StatusConfig = { variant: string; text: string };\n\nfunction deriveStatus(\n\turl: URL | undefined,\n\tconnection: \"connecting\" | \"connected\" | \"disconnected\",\n\tbroadcast: \"offline\" | \"loading\" | \"live\",\n): StatusConfig {\n\tif (!url) return { variant: \"error\", text: \"No URL\" };\n\tif (connection === \"disconnected\") return { variant: \"error\", text: \"Disconnected\" };\n\tif (connection === \"connecting\") return { variant: \"connecting\", text: \"Connecting...\" };\n\tif (broadcast === \"offline\") return { variant: \"error\", text: \"Offline\" };\n\tif (broadcast === \"loading\") return { variant: \"loading\", text: \"Loading...\" };\n\tif (broadcast === \"live\") return { variant: \"live\", text: \"Live\" };\n\treturn { variant: \"connected\", text: \"Connected\" };\n}\n\nexport function watchStatusIndicator(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst wrapper = document.createElement(\"div\");\n\twrapper.className = \"status-indicator flex-center\";\n\n\tconst dot = document.createElement(\"span\");\n\tconst text = document.createElement(\"span\");\n\twrapper.append(dot, text);\n\n\tparent.run((effect) => {\n\t\tconst url = effect.get(watch.connection.url);\n\t\tconst conn = effect.get(watch.connection.status);\n\t\tconst broadcast = effect.get(watch.broadcast.status);\n\t\tconst { variant, text: label } = deriveStatus(url, conn, broadcast);\n\n\t\tdot.className = `status-indicator-dot status-indicator-dot--${variant}`;\n\t\ttext.className = `status-indicator-text status-indicator-text--${variant}`;\n\t\ttext.textContent = label;\n\t});\n\n\treturn wrapper;\n}\n","import type { Effect, Signal } from \"@moq/signals\";\nimport * as DOM from \"@moq/signals/dom\";\nimport type MoqWatch from \"../element\";\nimport { audio, buffer, icon, network, video } from \"./icons\";\n\nconst POLL_MS = 250;\n\ntype Kind = \"network\" | \"video\" | \"audio\" | \"buffer\";\n\nfunction row(kind: Kind, label: string, svg: string): { el: HTMLElement; data: HTMLSpanElement } {\n\tconst el = DOM.create(\"div\", { className: `stats-item stats-item--${kind}` });\n\n\tconst iconWrap = DOM.create(\"div\", { className: \"stats-icon-wrapper\" });\n\ticonWrap.appendChild(icon(svg));\n\n\tconst title = DOM.create(\"span\", { className: \"stats-item-title\" }, label);\n\tconst data = DOM.create(\"span\", { className: \"stats-item-data\" }, \"N/A\");\n\n\tconst detail = DOM.create(\"div\", { className: \"stats-item-detail\" });\n\tdetail.append(title, data);\n\n\tel.append(iconWrap, detail);\n\treturn { el, data };\n}\n\nfunction formatBitrate(bps: number): string {\n\tif (bps >= 1_000_000) return `${(bps / 1_000_000).toFixed(1)}Mbps`;\n\tif (bps >= 1_000) return `${(bps / 1_000).toFixed(0)}kbps`;\n\treturn `${bps.toFixed(0)}bps`;\n}\n\nfunction formatBandwidth(bps: number | undefined, dir: \"up\" | \"down\"): string | null {\n\tif (bps === undefined || bps <= 0) return null;\n\tconst arrow = dir === \"down\" ? \"↓\" : \"↑\";\n\tif (bps >= 1_000_000_000) return `${arrow} ${(bps / 1_000_000_000).toFixed(1)}Gbps`;\n\treturn `${arrow} ${formatBitrate(bps)}`;\n}\n\nfunction networkRow(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst { el, data } = row(\"network\", \"network\", network);\n\n\tparent.interval(() => {\n\t\tconst conn = watch.connection.established.peek();\n\t\tif (!conn) {\n\t\t\tdata.textContent = \"N/A\";\n\t\t\treturn;\n\t\t}\n\t\tconst rtt = conn.rtt?.peek();\n\t\tconst parts = [\n\t\t\tformatBandwidth(conn.recvBandwidth?.peek(), \"down\"),\n\t\t\tformatBandwidth(conn.sendBandwidth?.peek(), \"up\"),\n\t\t\trtt !== undefined && rtt > 0 ? `${rtt.toFixed(0)}ms` : null,\n\t\t].filter((p): p is string => p !== null);\n\t\tdata.textContent = parts.length > 0 ? parts.join(\"\\n\") : \"N/A\";\n\t}, POLL_MS);\n\n\treturn el;\n}\n\nfunction videoRow(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst { el, data } = row(\"video\", \"video\", video);\n\tlet prevFrames = 0;\n\tlet prevBytes = 0;\n\tlet prevWhen = performance.now();\n\n\tparent.interval(() => {\n\t\tconst catalog = watch.backend.video.source.catalog.peek();\n\t\tconst stats = watch.backend.video.stats.peek();\n\t\tconst now = performance.now();\n\t\tconst elapsedMs = now - prevWhen;\n\n\t\tlet fps: number | undefined;\n\t\tif (stats && prevFrames > 0 && elapsedMs > 0) {\n\t\t\tconst delta = stats.frameCount - prevFrames;\n\t\t\tif (delta > 0) fps = delta / (elapsedMs / 1000);\n\t\t}\n\n\t\tlet bitrate: string | undefined;\n\t\tif (stats && prevBytes > 0 && elapsedMs > 0) {\n\t\t\tconst delta = stats.bytesReceived - prevBytes;\n\t\t\tif (delta > 0) bitrate = formatBitrate(delta * 8 * (1000 / elapsedMs));\n\t\t}\n\n\t\tif (stats) {\n\t\t\tprevFrames = stats.frameCount;\n\t\t\tprevBytes = stats.bytesReceived;\n\t\t\tprevWhen = now;\n\t\t}\n\n\t\tconst { width, height } = catalog?.display ?? {};\n\t\tdata.textContent = [\n\t\t\twidth && height ? `${width}x${height}` : \"N/A\",\n\t\t\tfps !== undefined ? `@${fps.toFixed(1)} fps` : \"N/A\",\n\t\t\tbitrate ?? \"N/A\",\n\t\t].join(\"\\n\");\n\t}, POLL_MS);\n\n\treturn el;\n}\n\nfunction audioRow(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst { el, data } = row(\"audio\", \"audio\", audio);\n\tlet prevBytes = 0;\n\tlet prevWhen = performance.now();\n\n\tparent.interval(() => {\n\t\tconst track = watch.backend.audio.source.track.peek();\n\t\tconst config = watch.backend.audio.source.config.peek();\n\t\tconst stats = watch.backend.audio.stats.peek();\n\n\t\tif (!track || !config) {\n\t\t\tdata.textContent = \"N/A\";\n\t\t\treturn;\n\t\t}\n\n\t\tconst now = performance.now();\n\t\tlet bitrate: string | undefined;\n\t\tif (stats && prevBytes > 0) {\n\t\t\tconst delta = stats.bytesReceived - prevBytes;\n\t\t\tconst elapsedMs = now - prevWhen;\n\t\t\tif (delta > 0 && elapsedMs > 0) bitrate = formatBitrate(delta * 8 * (1000 / elapsedMs));\n\t\t}\n\n\t\tif (stats) {\n\t\t\tprevBytes = stats.bytesReceived;\n\t\t\tprevWhen = now;\n\t\t}\n\n\t\tconst parts: string[] = [];\n\t\tif (config.sampleRate) parts.push(`${(config.sampleRate / 1000).toFixed(1)}kHz`);\n\t\tif (config.numberOfChannels) parts.push(`${config.numberOfChannels}ch`);\n\t\tparts.push(bitrate ?? \"N/A\");\n\t\tif (config.codec) parts.push(config.codec);\n\t\tdata.textContent = parts.length > 0 ? parts.join(\"\\n\") : \"N/A\";\n\t}, POLL_MS);\n\n\treturn el;\n}\n\nfunction bufferRow(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst { el, data } = row(\"buffer\", \"buffer\", buffer);\n\n\tparent.run((effect) => {\n\t\tconst jitter = effect.get(watch.backend.jitter);\n\t\tdata.textContent = `${Math.round(jitter)}ms`;\n\t});\n\n\treturn el;\n}\n\nexport function statsPanel(parent: Effect, watch: MoqWatch, visible: Signal<boolean>): HTMLElement {\n\tconst wrap = DOM.create(\"div\", { className: \"stats\" });\n\tconst panel = DOM.create(\"div\", { className: \"stats-panel\" });\n\twrap.appendChild(panel);\n\n\tparent.run((effect) => {\n\t\tconst showing = effect.get(visible);\n\t\twrap.style.display = showing ? \"\" : \"none\";\n\t\tif (!showing) return;\n\n\t\tDOM.render(effect, panel, networkRow(effect, watch));\n\t\tDOM.render(effect, panel, videoRow(effect, watch));\n\t\tDOM.render(effect, panel, audioRow(effect, watch));\n\t\tDOM.render(effect, panel, bufferRow(effect, watch));\n\t});\n\n\treturn wrap;\n}\n","import { Effect, Signal } from \"@moq/signals\";\nimport * as DOM from \"@moq/signals/dom\";\nimport type MoqWatch from \"../element\";\nimport { bufferControl } from \"./components/buffer-control\";\nimport { bufferingIndicator } from \"./components/buffering-indicator\";\nimport { fullscreenButton } from \"./components/fullscreen-button\";\nimport { offlineIndicator } from \"./components/offline-indicator\";\nimport { playPauseButton } from \"./components/play-pause\";\nimport { qualitySelector } from \"./components/quality-selector\";\nimport { statsButton } from \"./components/stats-button\";\nimport { volumeSlider } from \"./components/volume-slider\";\nimport { watchStatusIndicator } from \"./components/watch-status-indicator\";\nimport { statsPanel } from \"./stats\";\nimport styles from \"./styles/index.css?inline\";\n\nexport default class MoqWatchUi extends HTMLElement {\n\t#signals?: Effect;\n\t#root: ShadowRoot;\n\t#watch = new Signal<MoqWatch | undefined>(undefined);\n\t#observer: MutationObserver;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.#root = this.attachShadow({ mode: \"open\" });\n\n\t\tconst style = document.createElement(\"style\");\n\t\tstyle.textContent = styles;\n\t\tthis.#root.appendChild(style);\n\n\t\tthis.#observer = new MutationObserver(() => this.#updateWatch());\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#updateWatch();\n\t\tthis.#observer.observe(this, { childList: true });\n\n\t\tconst signals = new Effect();\n\t\tthis.#signals = signals;\n\t\tsignals.run(this.#render.bind(this));\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.#observer.disconnect();\n\t\tthis.#signals?.close();\n\t\tthis.#signals = undefined;\n\t}\n\n\t#updateWatch() {\n\t\tconst watch = this.querySelector(\"moq-watch\") as MoqWatch | null;\n\t\tthis.#watch.set(watch ?? undefined);\n\t}\n\n\t#render(effect: Effect) {\n\t\tconst watch = effect.get(this.#watch);\n\t\tif (!watch) return;\n\n\t\tconst visible = new Signal(false);\n\n\t\tconst videoContainer = DOM.create(\"div\", { className: \"video-container\" });\n\t\tvideoContainer.append(\n\t\t\tDOM.create(\"slot\"),\n\t\t\tstatsPanel(effect, watch, visible),\n\t\t\tbufferingIndicator(effect, watch),\n\t\t\tofflineIndicator(effect, watch),\n\t\t);\n\n\t\tconst controls = DOM.create(\"div\", { className: \"controls\" });\n\n\t\tconst playback = DOM.create(\"div\", { className: \"playback-controls flex-align-center\" });\n\t\tplayback.append(\n\t\t\tplayPauseButton(effect, watch),\n\t\t\tvolumeSlider(effect, watch),\n\t\t\twatchStatusIndicator(effect, watch),\n\t\t\tstatsButton(effect, visible),\n\t\t\tfullscreenButton(effect, watch),\n\t\t);\n\n\t\tconst latency = DOM.create(\"div\", { className: \"latency-controls\" });\n\t\tlatency.append(bufferControl(effect, watch), qualitySelector(effect, watch));\n\n\t\tcontrols.append(playback, latency);\n\n\t\tDOM.render(effect, this.#root, videoContainer);\n\t\tDOM.render(effect, this.#root, controls);\n\t}\n}\n\ncustomElements.define(\"moq-watch-ui\", MoqWatchUi);\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t\"moq-watch-ui\": MoqWatchUi;\n\t}\n}\n"],"names":["MIN_RANGE","RANGE_STEP","DEFAULT_MAX","LABEL_WIDTH","drawRanges","canvas","ranges","timestamp","max","isBuffering","ctx","dpr","rect","width","height","canvasW","canvasH","padding","rangeHeight","radius","i","range","startMs","endMs","visibleStart","visibleEnd","x","w","overflowSec","bufferControl","parent","watch","wrapper","viz","playhead","videoTrack","videoLabel","videoCanvas","audioTrack","audioLabel","audioCanvas","targetArea","targetLine","targetLabel","help","dragging","hasInteracted","effect","jitter","pct","updateFromX","clientX","trackWidth","ms","snapped","clamped","interact","e","delta","current","value","draw","bufferingIndicator","container","spinner","buffering","offline","audio","buffer","fullscreenEnter","fullscreenExit","mute","network","pause","play","stats","video","volumeHigh","volumeLow","volumeMedium","icon","svg","span","fullscreenButton","button","updateIcon","isFull","offlineIndicator","text","playPauseButton","paused","formatBitrate","bps","qualitySelector","label","select","catalog","active","renditions","auto","name","config","opt","dims","rate","prev","statsButton","visible","showing","v","volumeIcon","volumePct","muted","volumeSlider","slider","volume","m","deriveStatus","url","connection","broadcast","watchStatusIndicator","dot","conn","variant","POLL_MS","row","kind","el","DOM.create","iconWrap","title","data","detail","formatBandwidth","dir","arrow","networkRow","rtt","parts","p","videoRow","prevFrames","prevBytes","prevWhen","now","elapsedMs","fps","bitrate","audioRow","track","bufferRow","statsPanel","wrap","panel","DOM.render","MoqWatchUi","#signals","#root","#watch","Signal","#observer","style","styles","#updateWatch","signals","Effect","#render","videoContainer","controls","playback","latency"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"element.js","names":["#root","#observer","#updateWatch","#signals","#render","#watch"],"sources":["../../src/ui/components/buffer-control.ts","../../src/ui/components/buffering-indicator.ts","../../src/ui/icons.ts","../../src/ui/components/fullscreen-button.ts","../../src/ui/components/offline-indicator.ts","../../src/ui/components/play-pause.ts","../../src/ui/components/quality-selector.ts","../../src/ui/components/stats-button.ts","../../src/ui/components/volume-slider.ts","../../src/ui/components/watch-status-indicator.ts","../../src/ui/stats.ts","../../src/ui/styles/index.css?inline","../../src/ui/element.ts"],"sourcesContent":["import type { Moq } from \"@moq/hang\";\nimport type { Effect } from \"@moq/signals\";\nimport type { BufferedRanges } from \"../..\";\nimport type MoqWatch from \"../../element\";\n\nconst MIN_RANGE = 0 as Moq.Time.Milli;\nconst RANGE_STEP = 10 as Moq.Time.Milli;\nconst DEFAULT_MAX = 4000 as Moq.Time.Milli;\nconst LABEL_WIDTH = 48;\n\nfunction drawRanges(\n\tcanvas: HTMLCanvasElement,\n\tranges: BufferedRanges,\n\ttimestamp: Moq.Time.Milli | undefined,\n\tmax: Moq.Time.Milli,\n\tisBuffering: boolean,\n) {\n\tconst ctx = canvas.getContext(\"2d\");\n\tif (!ctx) return;\n\n\tconst dpr = window.devicePixelRatio || 1;\n\tconst rect = canvas.getBoundingClientRect();\n\tconst width = rect.width;\n\tconst height = rect.height;\n\n\tconst canvasW = Math.round(width * dpr);\n\tconst canvasH = Math.round(height * dpr);\n\tif (canvas.width !== canvasW || canvas.height !== canvasH) {\n\t\tcanvas.width = canvasW;\n\t\tcanvas.height = canvasH;\n\t}\n\n\tctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\tctx.clearRect(0, 0, width, height);\n\n\tif (timestamp === undefined) return;\n\n\tconst padding = 2;\n\tconst rangeHeight = height - padding * 2;\n\tconst radius = 2;\n\n\tfor (let i = 0; i < ranges.length; i++) {\n\t\tconst range = ranges[i];\n\t\tconst startMs = (range.start - timestamp) as Moq.Time.Milli;\n\t\tconst endMs = (range.end - timestamp) as Moq.Time.Milli;\n\t\tconst visibleStart = Math.max(0, startMs);\n\t\tconst visibleEnd = Math.min(endMs, max);\n\n\t\tif (visibleEnd <= visibleStart) continue;\n\n\t\tconst x = (visibleStart / max) * width;\n\t\tconst w = Math.max(2, ((visibleEnd - visibleStart) / max) * width);\n\n\t\tctx.globalAlpha = 0.85;\n\t\tctx.fillStyle = isBuffering ? \"#f87171\" : i > 0 ? \"#facc15\" : \"#4ade80\";\n\n\t\tif (typeof ctx.roundRect === \"function\") {\n\t\t\tctx.beginPath();\n\t\t\tctx.roundRect(x, padding, w, rangeHeight, radius);\n\t\t\tctx.fill();\n\t\t} else {\n\t\t\tctx.fillRect(x, padding, w, rangeHeight);\n\t\t}\n\n\t\tif (endMs > max) {\n\t\t\tconst overflowSec = ((endMs - max) / 1000).toFixed(1);\n\t\t\tctx.globalAlpha = 0.7;\n\t\t\tctx.fillStyle = \"black\";\n\t\t\tctx.font = \"500 9px system-ui, sans-serif\";\n\t\t\tctx.textAlign = \"right\";\n\t\t\tctx.textBaseline = \"middle\";\n\t\t\tctx.fillText(`+${overflowSec}s`, x + w - 4, height / 2);\n\t\t}\n\t}\n}\n\nexport function bufferControl(parent: Effect, watch: MoqWatch, max: Moq.Time.Milli = DEFAULT_MAX): HTMLElement {\n\tconst wrapper = document.createElement(\"div\");\n\twrapper.className = \"buffer\";\n\n\tconst viz = document.createElement(\"div\");\n\tviz.className = \"buffer-visualization\";\n\tviz.setAttribute(\"role\", \"slider\");\n\tviz.tabIndex = 0;\n\tviz.setAttribute(\"aria-valuemin\", MIN_RANGE.toString());\n\tviz.setAttribute(\"aria-valuemax\", max.toString());\n\tviz.setAttribute(\"aria-label\", \"Buffer jitter\");\n\n\tconst playhead = document.createElement(\"div\");\n\tplayhead.className = \"buffer-playhead\";\n\n\tconst videoTrack = document.createElement(\"div\");\n\tvideoTrack.className = \"buffer-track buffer-track--video\";\n\tconst videoLabel = document.createElement(\"span\");\n\tvideoLabel.className = \"buffer-track-label\";\n\tvideoLabel.textContent = \"Video\";\n\tconst videoCanvas = document.createElement(\"canvas\");\n\tvideoCanvas.className = \"buffer-canvas\";\n\tvideoTrack.append(videoLabel, videoCanvas);\n\n\tconst audioTrack = document.createElement(\"div\");\n\taudioTrack.className = \"buffer-track buffer-track--audio\";\n\tconst audioLabel = document.createElement(\"span\");\n\taudioLabel.className = \"buffer-track-label\";\n\taudioLabel.textContent = \"Audio\";\n\tconst audioCanvas = document.createElement(\"canvas\");\n\taudioCanvas.className = \"buffer-canvas\";\n\taudioTrack.append(audioLabel, audioCanvas);\n\n\tconst targetArea = document.createElement(\"div\");\n\ttargetArea.className = \"buffer-target-area\";\n\tconst targetLine = document.createElement(\"div\");\n\ttargetLine.className = \"buffer-target-line\";\n\tconst targetLabel = document.createElement(\"span\");\n\ttargetLabel.className = \"buffer-target-label\";\n\ttargetLine.appendChild(targetLabel);\n\ttargetArea.appendChild(targetLine);\n\n\tconst help = document.createElement(\"span\");\n\thelp.className = \"buffer-help\";\n\thelp.textContent = \"click to change latency\";\n\n\tviz.append(playhead, videoTrack, audioTrack, targetArea, help);\n\twrapper.appendChild(viz);\n\n\tlet dragging = false;\n\tlet hasInteracted = false;\n\n\tparent.run((effect) => {\n\t\tconst jitter = effect.get(watch.backend.jitter);\n\t\tconst pct = (jitter / max) * 100;\n\t\ttargetLine.style.left = `${pct}%`;\n\t\ttargetLabel.textContent = `${Math.round(jitter)}ms`;\n\t\tviz.setAttribute(\"aria-valuenow\", jitter.toString());\n\t});\n\n\tconst updateFromX = (clientX: number) => {\n\t\tconst rect = viz.getBoundingClientRect();\n\t\tconst trackWidth = rect.width - LABEL_WIDTH;\n\t\tconst x = Math.max(0, Math.min(clientX - rect.left - LABEL_WIDTH, trackWidth));\n\t\tconst ms = (x / trackWidth) * max;\n\t\tconst snapped = (Math.round(ms / RANGE_STEP) * RANGE_STEP) as Moq.Time.Milli;\n\t\tconst clamped = Math.max(MIN_RANGE, Math.min(max, snapped)) as Moq.Time.Milli;\n\t\twatch.backend.latency.set(clamped);\n\t};\n\n\tconst interact = () => {\n\t\tif (!hasInteracted) {\n\t\t\thasInteracted = true;\n\t\t\thelp.style.display = \"none\";\n\t\t}\n\t};\n\n\tparent.event(viz, \"mousedown\", (e) => {\n\t\tdragging = true;\n\t\tviz.classList.add(\"buffer-visualization--dragging\");\n\t\tinteract();\n\t\tupdateFromX(e.clientX);\n\t});\n\n\tparent.event(document, \"mousemove\", (e) => {\n\t\tif (dragging) updateFromX(e.clientX);\n\t});\n\n\tparent.event(document, \"mouseup\", () => {\n\t\tif (!dragging) return;\n\t\tdragging = false;\n\t\tviz.classList.remove(\"buffer-visualization--dragging\");\n\t});\n\n\tparent.event(viz, \"keydown\", (e) => {\n\t\tlet delta = 0 as Moq.Time.Milli;\n\t\tif (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n\t\t\tdelta = RANGE_STEP;\n\t\t} else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n\t\t\tdelta = -RANGE_STEP as Moq.Time.Milli;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\tinteract();\n\t\tconst current = watch.backend.jitter.peek();\n\t\tconst value = Math.max(MIN_RANGE, Math.min(max, current + delta)) as Moq.Time.Milli;\n\t\twatch.backend.latency.set(value);\n\t});\n\n\tconst draw = () => {\n\t\tconst timestamp = watch.backend.sync.now();\n\t\tconst isBuffering = watch.backend.video.stalled.peek();\n\t\tdrawRanges(videoCanvas, watch.backend.video.buffered.peek(), timestamp, max, isBuffering);\n\t\tdrawRanges(audioCanvas, watch.backend.audio.buffered.peek(), timestamp, max, isBuffering);\n\t\tparent.animate(draw);\n\t};\n\tparent.animate(draw);\n\n\treturn wrapper;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\n\nexport function bufferingIndicator(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst container = document.createElement(\"div\");\n\tcontainer.className = \"buffering\";\n\tconst spinner = document.createElement(\"div\");\n\tspinner.className = \"buffering-spinner\";\n\tcontainer.appendChild(spinner);\n\n\tparent.run((effect) => {\n\t\tconst buffering = effect.get(watch.backend.video.stalled);\n\t\tconst offline = effect.get(watch.broadcast.status) === \"offline\";\n\t\tcontainer.style.display = buffering && !offline ? \"\" : \"none\";\n\t});\n\n\treturn container;\n}\n","import audio from \"./icons/audio.svg?raw\";\nimport buffer from \"./icons/buffer.svg?raw\";\nimport fullscreenEnter from \"./icons/fullscreen-enter.svg?raw\";\nimport fullscreenExit from \"./icons/fullscreen-exit.svg?raw\";\nimport mute from \"./icons/mute.svg?raw\";\nimport network from \"./icons/network.svg?raw\";\nimport pause from \"./icons/pause.svg?raw\";\nimport play from \"./icons/play.svg?raw\";\nimport stats from \"./icons/stats.svg?raw\";\nimport video from \"./icons/video.svg?raw\";\nimport volumeHigh from \"./icons/volume-high.svg?raw\";\nimport volumeLow from \"./icons/volume-low.svg?raw\";\nimport volumeMedium from \"./icons/volume-medium.svg?raw\";\n\nexport {\n\taudio,\n\tbuffer,\n\tfullscreenEnter,\n\tfullscreenExit,\n\tmute,\n\tnetwork,\n\tpause,\n\tplay,\n\tstats,\n\tvideo,\n\tvolumeHigh,\n\tvolumeLow,\n\tvolumeMedium,\n};\n\nexport function icon(svg: string): HTMLElement {\n\tconst span = document.createElement(\"span\");\n\tspan.className = \"flex-center\";\n\tspan.setAttribute(\"role\", \"img\");\n\tspan.setAttribute(\"aria-hidden\", \"true\");\n\tspan.innerHTML = svg;\n\treturn span;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\nimport { fullscreenEnter, fullscreenExit, icon } from \"../icons\";\n\nexport function fullscreenButton(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst button = document.createElement(\"button\");\n\tbutton.type = \"button\";\n\tbutton.className = \"button flex-center\";\n\tbutton.title = \"Fullscreen\";\n\tbutton.setAttribute(\"aria-label\", \"Fullscreen\");\n\tbutton.replaceChildren(icon(fullscreenEnter));\n\n\tconst updateIcon = () => {\n\t\tconst isFull = !!document.fullscreenElement;\n\t\tbutton.replaceChildren(icon(isFull ? fullscreenExit : fullscreenEnter));\n\t};\n\tparent.event(document, \"fullscreenchange\", updateIcon);\n\n\tparent.event(button, \"click\", () => {\n\t\tif (document.fullscreenElement) {\n\t\t\tdocument.exitFullscreen();\n\t\t} else {\n\t\t\twatch.requestFullscreen();\n\t\t}\n\t});\n\n\treturn button;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\n\nexport function offlineIndicator(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst container = document.createElement(\"div\");\n\tcontainer.className = \"watch-ui__offline-indicator\";\n\tcontainer.setAttribute(\"role\", \"status\");\n\tcontainer.setAttribute(\"aria-live\", \"polite\");\n\n\tconst text = document.createElement(\"span\");\n\ttext.className = \"watch-ui__offline-text\";\n\ttext.textContent = \"OFFLINE\";\n\tcontainer.appendChild(text);\n\n\tparent.run((effect) => {\n\t\tconst offline = effect.get(watch.broadcast.status) === \"offline\";\n\t\tcontainer.style.display = offline ? \"\" : \"none\";\n\t});\n\n\treturn container;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\nimport { icon, pause, play } from \"../icons\";\n\nexport function playPauseButton(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst button = document.createElement(\"button\");\n\tbutton.type = \"button\";\n\tbutton.className = \"button button--playback flex-center\";\n\n\tparent.run((effect) => {\n\t\tconst paused = effect.get(watch.backend.paused);\n\t\tbutton.title = paused ? \"Play\" : \"Pause\";\n\t\tbutton.setAttribute(\"aria-label\", paused ? \"Play\" : \"Pause\");\n\t\tbutton.replaceChildren(icon(paused ? play : pause));\n\t});\n\n\tparent.event(button, \"click\", () => {\n\t\twatch.paused = !watch.paused;\n\t});\n\n\treturn button;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\n\nfunction formatBitrate(bps: number): string {\n\tif (bps >= 1_000_000) return `${(bps / 1_000_000).toFixed(1)} Mbps`;\n\tif (bps >= 1_000) return `${(bps / 1_000).toFixed(0)} kbps`;\n\treturn `${bps} bps`;\n}\n\nexport function qualitySelector(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst wrapper = document.createElement(\"div\");\n\twrapper.className = \"quality-selector\";\n\n\tconst label = document.createElement(\"label\");\n\tlabel.htmlFor = \"moq-watch-quality-select\";\n\tlabel.className = \"quality-label\";\n\tlabel.textContent = \"Quality: \";\n\n\tconst select = document.createElement(\"select\");\n\tselect.id = \"moq-watch-quality-select\";\n\tselect.className = \"quality-select\";\n\n\twrapper.append(label, select);\n\n\tparent.run((effect) => {\n\t\tconst catalog = effect.get(watch.backend.video.source.catalog);\n\t\tconst active = effect.get(watch.backend.video.source.track);\n\t\tconst renditions = catalog?.renditions ?? {};\n\n\t\tselect.replaceChildren();\n\t\tconst auto = document.createElement(\"option\");\n\t\tauto.value = \"\";\n\t\tauto.textContent = \"Auto\";\n\t\tselect.appendChild(auto);\n\n\t\tfor (const [name, config] of Object.entries(renditions)) {\n\t\t\tconst opt = document.createElement(\"option\");\n\t\t\topt.value = name;\n\t\t\tconst dims = config.codedWidth && config.codedHeight ? ` (${config.codedWidth}x${config.codedHeight})` : \"\";\n\t\t\tconst rate = config.bitrate ? ` ${formatBitrate(config.bitrate)}` : \"\";\n\t\t\topt.textContent = `${name}${dims}${rate}`;\n\t\t\tselect.appendChild(opt);\n\t\t}\n\n\t\tselect.value = active ?? \"\";\n\t});\n\n\tparent.event(select, \"change\", () => {\n\t\tconst value = select.value || undefined;\n\t\twatch.backend.video.source.target.update((prev) => ({ ...prev, name: value }));\n\t});\n\n\treturn wrapper;\n}\n","import type { Effect, Signal } from \"@moq/signals\";\nimport { icon, stats } from \"../icons\";\n\nexport function statsButton(parent: Effect, visible: Signal<boolean>): HTMLElement {\n\tconst button = document.createElement(\"button\");\n\tbutton.type = \"button\";\n\tbutton.className = \"button flex-center\";\n\tbutton.replaceChildren(icon(stats));\n\n\tparent.run((effect) => {\n\t\tconst showing = effect.get(visible);\n\t\tbutton.title = showing ? \"Hide stats\" : \"Show stats\";\n\t\tbutton.setAttribute(\"aria-label\", button.title);\n\t});\n\n\tparent.event(button, \"click\", () => {\n\t\tvisible.update((v) => !v);\n\t});\n\n\treturn button;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\nimport { icon, mute, volumeHigh, volumeLow, volumeMedium } from \"../icons\";\n\nfunction volumeIcon(volumePct: number, muted: boolean): string {\n\tif (muted || volumePct === 0) return mute;\n\tif (volumePct <= 33) return volumeLow;\n\tif (volumePct <= 66) return volumeMedium;\n\treturn volumeHigh;\n}\n\nexport function volumeSlider(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst wrapper = document.createElement(\"div\");\n\twrapper.className = \"volume-slider flex-center\";\n\n\tconst button = document.createElement(\"button\");\n\tbutton.type = \"button\";\n\tbutton.className = \"button flex-center\";\n\n\tconst slider = document.createElement(\"input\");\n\tslider.type = \"range\";\n\tslider.min = \"0\";\n\tslider.max = \"100\";\n\n\tconst label = document.createElement(\"span\");\n\tlabel.className = \"volume-label\";\n\n\twrapper.append(button, slider, label);\n\n\tparent.run((effect) => {\n\t\tconst volume = effect.get(watch.backend.audio.volume);\n\t\tconst muted = effect.get(watch.backend.audio.muted);\n\t\tconst pct = Math.round(volume * 100);\n\t\tslider.value = pct.toString();\n\t\tlabel.textContent = pct.toString();\n\t\tbutton.title = muted ? \"Unmute\" : \"Mute\";\n\t\tbutton.setAttribute(\"aria-label\", button.title);\n\t\tbutton.replaceChildren(icon(volumeIcon(pct, muted)));\n\t});\n\n\tparent.event(slider, \"input\", () => {\n\t\twatch.backend.audio.volume.set(Number.parseFloat(slider.value) / 100);\n\t});\n\n\tparent.event(button, \"click\", () => {\n\t\twatch.backend.audio.muted.update((m) => !m);\n\t});\n\n\treturn wrapper;\n}\n","import type { Effect } from \"@moq/signals\";\nimport type MoqWatch from \"../../element\";\n\ntype StatusConfig = { variant: string; text: string };\n\nfunction deriveStatus(\n\turl: URL | undefined,\n\tconnection: \"connecting\" | \"connected\" | \"disconnected\",\n\tbroadcast: \"offline\" | \"loading\" | \"live\",\n): StatusConfig {\n\tif (!url) return { variant: \"error\", text: \"No URL\" };\n\tif (connection === \"disconnected\") return { variant: \"error\", text: \"Disconnected\" };\n\tif (connection === \"connecting\") return { variant: \"connecting\", text: \"Connecting...\" };\n\tif (broadcast === \"offline\") return { variant: \"error\", text: \"Offline\" };\n\tif (broadcast === \"loading\") return { variant: \"loading\", text: \"Loading...\" };\n\tif (broadcast === \"live\") return { variant: \"live\", text: \"Live\" };\n\treturn { variant: \"connected\", text: \"Connected\" };\n}\n\nexport function watchStatusIndicator(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst wrapper = document.createElement(\"div\");\n\twrapper.className = \"status-indicator flex-center\";\n\n\tconst dot = document.createElement(\"span\");\n\tconst text = document.createElement(\"span\");\n\twrapper.append(dot, text);\n\n\tparent.run((effect) => {\n\t\tconst url = effect.get(watch.connection.url);\n\t\tconst conn = effect.get(watch.connection.status);\n\t\tconst broadcast = effect.get(watch.broadcast.status);\n\t\tconst { variant, text: label } = deriveStatus(url, conn, broadcast);\n\n\t\tdot.className = `status-indicator-dot status-indicator-dot--${variant}`;\n\t\ttext.className = `status-indicator-text status-indicator-text--${variant}`;\n\t\ttext.textContent = label;\n\t});\n\n\treturn wrapper;\n}\n","import type { Effect, Signal } from \"@moq/signals\";\nimport * as DOM from \"@moq/signals/dom\";\nimport type MoqWatch from \"../element\";\nimport { audio, buffer, icon, network, video } from \"./icons\";\n\nconst POLL_MS = 250;\n\ntype Kind = \"network\" | \"video\" | \"audio\" | \"buffer\";\n\nfunction row(kind: Kind, label: string, svg: string): { el: HTMLElement; data: HTMLSpanElement } {\n\tconst el = DOM.create(\"div\", { className: `stats-item stats-item--${kind}` });\n\n\tconst iconWrap = DOM.create(\"div\", { className: \"stats-icon-wrapper\" });\n\ticonWrap.appendChild(icon(svg));\n\n\tconst title = DOM.create(\"span\", { className: \"stats-item-title\" }, label);\n\tconst data = DOM.create(\"span\", { className: \"stats-item-data\" }, \"N/A\");\n\n\tconst detail = DOM.create(\"div\", { className: \"stats-item-detail\" });\n\tdetail.append(title, data);\n\n\tel.append(iconWrap, detail);\n\treturn { el, data };\n}\n\nfunction formatBitrate(bps: number): string {\n\tif (bps >= 1_000_000) return `${(bps / 1_000_000).toFixed(1)}Mbps`;\n\tif (bps >= 1_000) return `${(bps / 1_000).toFixed(0)}kbps`;\n\treturn `${bps.toFixed(0)}bps`;\n}\n\nfunction formatBandwidth(bps: number | undefined, dir: \"up\" | \"down\"): string | null {\n\tif (bps === undefined || bps <= 0) return null;\n\tconst arrow = dir === \"down\" ? \"↓\" : \"↑\";\n\tif (bps >= 1_000_000_000) return `${arrow} ${(bps / 1_000_000_000).toFixed(1)}Gbps`;\n\treturn `${arrow} ${formatBitrate(bps)}`;\n}\n\nfunction networkRow(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst { el, data } = row(\"network\", \"network\", network);\n\n\tparent.interval(() => {\n\t\tconst conn = watch.connection.established.peek();\n\t\tif (!conn) {\n\t\t\tdata.textContent = \"N/A\";\n\t\t\treturn;\n\t\t}\n\t\tconst rtt = conn.rtt?.peek();\n\t\tconst parts = [\n\t\t\tformatBandwidth(conn.recvBandwidth?.peek(), \"down\"),\n\t\t\tformatBandwidth(conn.sendBandwidth?.peek(), \"up\"),\n\t\t\trtt !== undefined && rtt > 0 ? `${rtt.toFixed(0)}ms` : null,\n\t\t].filter((p): p is string => p !== null);\n\t\tdata.textContent = parts.length > 0 ? parts.join(\"\\n\") : \"N/A\";\n\t}, POLL_MS);\n\n\treturn el;\n}\n\nfunction videoRow(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst { el, data } = row(\"video\", \"video\", video);\n\tlet prevFrames = 0;\n\tlet prevBytes = 0;\n\tlet prevWhen = performance.now();\n\n\tparent.interval(() => {\n\t\tconst catalog = watch.backend.video.source.catalog.peek();\n\t\tconst stats = watch.backend.video.stats.peek();\n\t\tconst now = performance.now();\n\t\tconst elapsedMs = now - prevWhen;\n\n\t\tlet fps: number | undefined;\n\t\tif (stats && prevFrames > 0 && elapsedMs > 0) {\n\t\t\tconst delta = stats.frameCount - prevFrames;\n\t\t\tif (delta > 0) fps = delta / (elapsedMs / 1000);\n\t\t}\n\n\t\tlet bitrate: string | undefined;\n\t\tif (stats && prevBytes > 0 && elapsedMs > 0) {\n\t\t\tconst delta = stats.bytesReceived - prevBytes;\n\t\t\tif (delta > 0) bitrate = formatBitrate(delta * 8 * (1000 / elapsedMs));\n\t\t}\n\n\t\tif (stats) {\n\t\t\tprevFrames = stats.frameCount;\n\t\t\tprevBytes = stats.bytesReceived;\n\t\t\tprevWhen = now;\n\t\t}\n\n\t\tconst { width, height } = catalog?.display ?? {};\n\t\tdata.textContent = [\n\t\t\twidth && height ? `${width}x${height}` : \"N/A\",\n\t\t\tfps !== undefined ? `@${fps.toFixed(1)} fps` : \"N/A\",\n\t\t\tbitrate ?? \"N/A\",\n\t\t].join(\"\\n\");\n\t}, POLL_MS);\n\n\treturn el;\n}\n\nfunction audioRow(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst { el, data } = row(\"audio\", \"audio\", audio);\n\tlet prevBytes = 0;\n\tlet prevWhen = performance.now();\n\n\tparent.interval(() => {\n\t\tconst track = watch.backend.audio.source.track.peek();\n\t\tconst config = watch.backend.audio.source.config.peek();\n\t\tconst stats = watch.backend.audio.stats.peek();\n\n\t\tif (!track || !config) {\n\t\t\tdata.textContent = \"N/A\";\n\t\t\treturn;\n\t\t}\n\n\t\tconst now = performance.now();\n\t\tlet bitrate: string | undefined;\n\t\tif (stats && prevBytes > 0) {\n\t\t\tconst delta = stats.bytesReceived - prevBytes;\n\t\t\tconst elapsedMs = now - prevWhen;\n\t\t\tif (delta > 0 && elapsedMs > 0) bitrate = formatBitrate(delta * 8 * (1000 / elapsedMs));\n\t\t}\n\n\t\tif (stats) {\n\t\t\tprevBytes = stats.bytesReceived;\n\t\t\tprevWhen = now;\n\t\t}\n\n\t\tconst parts: string[] = [];\n\t\tif (config.sampleRate) parts.push(`${(config.sampleRate / 1000).toFixed(1)}kHz`);\n\t\tif (config.numberOfChannels) parts.push(`${config.numberOfChannels}ch`);\n\t\tparts.push(bitrate ?? \"N/A\");\n\t\tif (config.codec) parts.push(config.codec);\n\t\tdata.textContent = parts.length > 0 ? parts.join(\"\\n\") : \"N/A\";\n\t}, POLL_MS);\n\n\treturn el;\n}\n\nfunction bufferRow(parent: Effect, watch: MoqWatch): HTMLElement {\n\tconst { el, data } = row(\"buffer\", \"buffer\", buffer);\n\n\tparent.run((effect) => {\n\t\tconst jitter = effect.get(watch.backend.jitter);\n\t\tdata.textContent = `${Math.round(jitter)}ms`;\n\t});\n\n\treturn el;\n}\n\nexport function statsPanel(parent: Effect, watch: MoqWatch, visible: Signal<boolean>): HTMLElement {\n\tconst wrap = DOM.create(\"div\", { className: \"stats\" });\n\tconst panel = DOM.create(\"div\", { className: \"stats-panel\" });\n\twrap.appendChild(panel);\n\n\tparent.run((effect) => {\n\t\tconst showing = effect.get(visible);\n\t\twrap.style.display = showing ? \"\" : \"none\";\n\t\tif (!showing) return;\n\n\t\tDOM.render(effect, panel, networkRow(effect, watch));\n\t\tDOM.render(effect, panel, videoRow(effect, watch));\n\t\tDOM.render(effect, panel, audioRow(effect, watch));\n\t\tDOM.render(effect, panel, bufferRow(effect, watch));\n\t});\n\n\treturn wrap;\n}\n","@import \"./base.css\";\n@import \"./stats.css\";\n@import \"./controls.css\";\n@import \"./volume-slider.css\";\n@import \"./quality-selector.css\";\n@import \"./buffer-control.css\";\n@import \"./buffering-indicator.css\";\n@import \"./offline-indicator.css\";\n@import \"./status-indicator.css\";\n","import { Effect, Signal } from \"@moq/signals\";\nimport * as DOM from \"@moq/signals/dom\";\nimport type MoqWatch from \"../element\";\nimport { bufferControl } from \"./components/buffer-control\";\nimport { bufferingIndicator } from \"./components/buffering-indicator\";\nimport { fullscreenButton } from \"./components/fullscreen-button\";\nimport { offlineIndicator } from \"./components/offline-indicator\";\nimport { playPauseButton } from \"./components/play-pause\";\nimport { qualitySelector } from \"./components/quality-selector\";\nimport { statsButton } from \"./components/stats-button\";\nimport { volumeSlider } from \"./components/volume-slider\";\nimport { watchStatusIndicator } from \"./components/watch-status-indicator\";\nimport { statsPanel } from \"./stats\";\nimport styles from \"./styles/index.css?inline\";\n\nexport default class MoqWatchUi extends HTMLElement {\n\t#signals?: Effect;\n\t#root: ShadowRoot;\n\t#watch = new Signal<MoqWatch | undefined>(undefined);\n\t#observer: MutationObserver;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.#root = this.attachShadow({ mode: \"open\" });\n\n\t\tconst style = document.createElement(\"style\");\n\t\tstyle.textContent = styles;\n\t\tthis.#root.appendChild(style);\n\n\t\tthis.#observer = new MutationObserver(() => this.#updateWatch());\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#updateWatch();\n\t\tthis.#observer.observe(this, { childList: true });\n\n\t\tconst signals = new Effect();\n\t\tthis.#signals = signals;\n\t\tsignals.run(this.#render.bind(this));\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.#observer.disconnect();\n\t\tthis.#signals?.close();\n\t\tthis.#signals = undefined;\n\t}\n\n\t#updateWatch() {\n\t\tconst watch = this.querySelector(\"moq-watch\") as MoqWatch | null;\n\t\tthis.#watch.set(watch ?? undefined);\n\t}\n\n\t#render(effect: Effect) {\n\t\tconst watch = effect.get(this.#watch);\n\t\tif (!watch) return;\n\n\t\tconst visible = new Signal(false);\n\n\t\tconst videoContainer = DOM.create(\"div\", { className: \"video-container\" });\n\t\tvideoContainer.append(\n\t\t\tDOM.create(\"slot\"),\n\t\t\tstatsPanel(effect, watch, visible),\n\t\t\tbufferingIndicator(effect, watch),\n\t\t\tofflineIndicator(effect, watch),\n\t\t);\n\n\t\tconst controls = DOM.create(\"div\", { className: \"controls\" });\n\n\t\tconst playback = DOM.create(\"div\", { className: \"playback-controls flex-align-center\" });\n\t\tplayback.append(\n\t\t\tplayPauseButton(effect, watch),\n\t\t\tvolumeSlider(effect, watch),\n\t\t\twatchStatusIndicator(effect, watch),\n\t\t\tstatsButton(effect, visible),\n\t\t\tfullscreenButton(effect, watch),\n\t\t);\n\n\t\tconst latency = DOM.create(\"div\", { className: \"latency-controls\" });\n\t\tlatency.append(bufferControl(effect, watch), qualitySelector(effect, watch));\n\n\t\tcontrols.append(playback, latency);\n\n\t\tDOM.render(effect, this.#root, videoContainer);\n\t\tDOM.render(effect, this.#root, controls);\n\t}\n}\n\ncustomElements.define(\"moq-watch-ui\", MoqWatchUi);\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t\"moq-watch-ui\": MoqWatchUi;\n\t}\n}\n"],"mappings":"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"}
|
package/video/source.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/video/source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG;IACzB,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAEpB,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA0JF;;;GAGG;AACH,qBAAa,MAAM;;IAClB,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/video/source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG;IACzB,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAEpB,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA0JF;;;GAGG;AACH,qBAAa,MAAM;;IAClB,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAGpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAmB;IAIlF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAe;IAGzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAgB;IAExE,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;gBAI7B,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,WAAW;IAgI3C,KAAK,IAAI,IAAI;CAGb"}
|