web: debounce offline hint and enable moq-watch reload
This commit is contained in:
parent
c2db3c6727
commit
00eaf46a87
1 changed files with 18 additions and 1 deletions
|
|
@ -57,6 +57,14 @@ function clearPlayerSignals() {
|
||||||
|
|
||||||
function bindPlayerSignals(watch, name) {
|
function bindPlayerSignals(watch, name) {
|
||||||
const cleanup = [];
|
const cleanup = [];
|
||||||
|
let offlineTimer = null;
|
||||||
|
|
||||||
|
const clearOfflineTimer = () => {
|
||||||
|
if (offlineTimer) {
|
||||||
|
window.clearTimeout(offlineTimer);
|
||||||
|
offlineTimer = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const maybeWatch = (signal, onValue) => {
|
const maybeWatch = (signal, onValue) => {
|
||||||
if (!signal || typeof signal.watch !== "function") return;
|
if (!signal || typeof signal.watch !== "function") return;
|
||||||
|
|
@ -67,16 +75,23 @@ function bindPlayerSignals(watch, name) {
|
||||||
let sawLoading = false;
|
let sawLoading = false;
|
||||||
maybeWatch(watch?.broadcast?.status, (status) => {
|
maybeWatch(watch?.broadcast?.status, (status) => {
|
||||||
if (status === "loading") {
|
if (status === "loading") {
|
||||||
|
clearOfflineTimer();
|
||||||
sawLoading = true;
|
sawLoading = true;
|
||||||
setHint(`Connecting to relay and subscribing: ${name}`, "ok");
|
setHint(`Connecting to relay and subscribing: ${name}`, "ok");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (status === "live") {
|
if (status === "live") {
|
||||||
|
clearOfflineTimer();
|
||||||
setHint(`Live: subscribed to ${name}`, "ok");
|
setHint(`Live: subscribed to ${name}`, "ok");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (status === "offline" && sawLoading) {
|
if (status === "offline" && sawLoading) {
|
||||||
setHint(`Stream offline or ended: ${name}`, "warn");
|
clearOfflineTimer();
|
||||||
|
// Avoid flashing a false negative during short reconnect windows.
|
||||||
|
offlineTimer = window.setTimeout(() => {
|
||||||
|
setHint(`Connection interrupted, retrying: ${name}`, "warn");
|
||||||
|
offlineTimer = null;
|
||||||
|
}, 8000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -91,6 +106,7 @@ function bindPlayerSignals(watch, name) {
|
||||||
|
|
||||||
if (cleanup.length) {
|
if (cleanup.length) {
|
||||||
disposePlayerSignals = () => {
|
disposePlayerSignals = () => {
|
||||||
|
clearOfflineTimer();
|
||||||
for (const fn of cleanup) {
|
for (const fn of cleanup) {
|
||||||
try {
|
try {
|
||||||
fn();
|
fn();
|
||||||
|
|
@ -111,6 +127,7 @@ function mountPlayer(relayUrl, name) {
|
||||||
const watch = document.createElement("moq-watch");
|
const watch = document.createElement("moq-watch");
|
||||||
watch.setAttribute("url", relayUrl);
|
watch.setAttribute("url", relayUrl);
|
||||||
watch.setAttribute("path", name);
|
watch.setAttribute("path", name);
|
||||||
|
watch.setAttribute("reload", "");
|
||||||
|
|
||||||
// A canvas enables video rendering. Without it, only audio is played.
|
// A canvas enables video rendering. Without it, only audio is played.
|
||||||
const canvas = document.createElement("canvas");
|
const canvas = document.createElement("canvas");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue