From 6f5e3c2711f8835c181b3d257ab54e6822b38b15 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 13 Jun 2020 11:00:22 +0200 Subject: [PATCH] Close websocket connection after being hidden for 5 minutes (#6149) Co-authored-by: Paulus Schoutsen --- package.json | 2 +- src/state/hass-element.ts | 2 ++ src/state/suspend-mixin.ts | 48 ++++++++++++++++++++++++++++++++++++++ yarn.lock | 8 +++---- 4 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src/state/suspend-mixin.ts diff --git a/package.json b/package.json index 43658529fa..78d0f054ff 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "fuse.js": "^6.0.0", "google-timezones-json": "^1.0.2", "hls.js": "^0.12.4", - "home-assistant-js-websocket": "^5.2.1", + "home-assistant-js-websocket": "^5.3.0", "idb-keyval": "^3.2.0", "intl-messageformat": "^8.3.9", "js-yaml": "^3.13.1", diff --git a/src/state/hass-element.ts b/src/state/hass-element.ts index a5cb0992ae..3b702e7bb1 100644 --- a/src/state/hass-element.ts +++ b/src/state/hass-element.ts @@ -12,6 +12,7 @@ import SidebarMixin from "./sidebar-mixin"; import ThemesMixin from "./themes-mixin"; import TranslationsMixin from "./translations-mixin"; import { urlSyncMixin } from "./url-sync-mixin"; +import { suspendMixin } from "./suspend-mixin"; const ext = (baseClass: T, mixins): T => mixins.reduceRight((base, mixin) => mixin(base), baseClass); @@ -24,6 +25,7 @@ export class HassElement extends ext(HassBaseEl, [ SidebarMixin, DisconnectToastMixin, connectionMixin, + suspendMixin, NotificationMixin, dialogManagerMixin, urlSyncMixin, diff --git a/src/state/suspend-mixin.ts b/src/state/suspend-mixin.ts new file mode 100644 index 0000000000..774a77a45f --- /dev/null +++ b/src/state/suspend-mixin.ts @@ -0,0 +1,48 @@ +import { Constructor } from "../types"; +import { HassBaseEl } from "./hass-base-mixin"; + +export const suspendMixin = >( + superClass: T +) => + class extends superClass { + private __hiddenTimeout?: number; + + private __visiblePromiseResolve?: () => void; + + protected hassConnected() { + super.hassConnected(); + + document.addEventListener( + "visibilitychange", + () => this.__handleVisibilityChange(), + false + ); + } + + private __handleVisibilityChange() { + if (document.hidden) { + // If the document is hidden, we will prevent reconnects until we are visible again + this.hass!.connection.suspendReconnectUntil( + new Promise((resolve) => { + this.__visiblePromiseResolve = resolve; + }) + ); + // We close the connection to Home Assistant after being hidden for 5 minutes + this.__hiddenTimeout = window.setTimeout(() => { + this.__hiddenTimeout = undefined; + this.hass!.connection.suspend(); + }, 300000); + } else { + // Clear timer to close the connection + if (this.__hiddenTimeout) { + clearTimeout(this.__hiddenTimeout); + this.__hiddenTimeout = undefined; + } + // Unsuspend the reconnect + if (this.__visiblePromiseResolve) { + this.__visiblePromiseResolve(); + this.__visiblePromiseResolve = undefined; + } + } + } + }; diff --git a/yarn.lock b/yarn.lock index 40e0b87b48..14318d7282 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6613,10 +6613,10 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -home-assistant-js-websocket@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-5.2.1.tgz#88c06738416e041dfd805f2543722458d9c3a391" - integrity sha512-azPiR+KABxaow1sMS70+Jk12KOaKSJY9KSKSGljkAArJmbWum3PEMNXXaG+XJnYmNuDnyzLAwi3/e1cwvVqocA== +home-assistant-js-websocket@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-5.3.0.tgz#261d371c72746ec8b0eb8768b286d4f865e408b7" + integrity sha512-treEjeKpHB7JNrLddOf4FJudcm7hf9y23bNv/9GKiOvmmWIbblKt7UN+2V0WjPmBkSRvLmGprA/xxh5cgS8S1g== homedir-polyfill@^1.0.1: version "1.0.3"