@hakit/core
Version:
A collection of React hooks and helpers for Home Assistant to easily communicate with the Home Assistant WebSocket API.
65 lines (64 loc) • 3.67 kB
JavaScript
function y(d, p = {}) {
const {
suspendWhenHidden: m = !0,
hiddenDelayMs: v = 3e5,
// default 5 minutes
debug: e = !1,
onStatusChange: l
} = p, f = v;
let n = null, i = null, t = !1, s = null;
d.connected ? (e && console.log("[SR] Connection is already active → handleSuspendResume will manage suspension"), l?.("connected")) : (e && console.log("[SR] Connection is not active"), l?.("disconnected"));
function R() {
if (e && console.log("[SR] onHidden() triggered"), !m) {
e && console.log("[SR] suspendWhenHidden is false → skipping suspension");
return;
}
if (t) {
e && console.log("[SR] Already suspended → skipping duplicate suspension");
return;
}
t = !0;
const w = new Promise((h) => {
n = () => {
e && console.log("[SR] pendingResolve() called → lifting suspension"), t = !1, n = null, u(), h(), l?.("connected");
};
});
e && console.log("[SR] Calling connection.suspendReconnectUntil(...)"), l?.("pending-suspension"), d.suspendReconnectUntil(w), e && console.log(`[SR] Starting hidden delay of ${f}ms before actual suspend()`), i = typeof window < "u" ? window.setTimeout(() => {
i = null, document.hidden ? (e && console.log("[SR] Hidden timeout elapsed → calling suspend()"), c(), S()) : n && (e && console.log("[SR] Hidden timeout elapsed but page is visible → resolving pendingResolve()"), n());
}, f) : null, typeof window < "u" && window.addEventListener("focus", o);
}
function o() {
e && console.log("[SR] onVisibleOrResume() fired (page became visible)"), i !== null && (clearTimeout(i), i = null, e && console.log("[SR] Cleared hiddenTimeoutId (user returned before allotted time)")), n && (e && console.log("[SR] Resolving pendingResolve() on actual resume"), n()), u();
}
function r() {
document.hidden ? (e && console.log("[SR] visibilitychange → HIDDEN"), R()) : (e && console.log("[SR] visibilitychange → VISIBLE"), o());
}
function a() {
e && console.log("[SR] resume event fired"), o();
}
function g() {
e && console.log("[SR] pageshow event fired"), o();
}
function S() {
s === null && (typeof window > "u" || (s = window.setInterval(() => {
document.hidden || (e && console.log("[SR] visibility polling detected VISIBLE"), o());
}, 2e3)));
}
function u() {
s !== null && typeof window < "u" && (clearInterval(s), s = null);
}
function c() {
if (!d.connected) {
e && console.log("[SR] Connection already suspended → skipping suspend()");
return;
}
l?.("suspended"), e && console.log("[SR] suspend() called → suspending connection"), typeof window < "u" && window.stop(), d.suspend();
}
return document.addEventListener("visibilitychange", r, !1), document.addEventListener("freeze", c), document.addEventListener("resume", a), document.addEventListener("pageshow", g), e && console.log("[SR] handleSuspendResume() initialized; debugging is ON"), () => {
e && console.log("[SR] cleanup() called → removing listeners & clearing timeouts"), document.removeEventListener("visibilitychange", r, !1), document.removeEventListener("freeze", c), document.removeEventListener("resume", a), document.removeEventListener("pageshow", g), typeof window < "u" && window.removeEventListener("focus", o), i !== null && (e && console.log("[SR] cleanup: Clearing hiddenTimeoutId"), clearTimeout(i), i = null), u(), n && (e && console.log("[SR] cleanup: Resolving pendingResolve() to let reconnection proceed"), n(), n = null, t = !1);
};
}
export {
y as handleSuspendResume
};
//# sourceMappingURL=handleSuspendResume.js.map