From 519988326b9aae2c38c1a26c897ad05eb68c2e68 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 16 Apr 2021 17:59:10 -1000 Subject: [PATCH] Do not throw warnings when a service calls disconnects the websocket (#8932) --- src/data/service.ts | 3 +++ .../service/developer-tools-service.ts | 15 ++++++++++++++- src/state/connection-mixin.ts | 8 ++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/data/service.ts b/src/data/service.ts index 120d3096c9..5e83fd6741 100644 --- a/src/data/service.ts +++ b/src/data/service.ts @@ -6,3 +6,6 @@ export const callExecuteScript = (hass: HomeAssistant, sequence: Action[]) => type: "execute_script", sequence, }); + +export const serviceCallWillDisconnect = (domain: string, service: string) => + domain === "homeassistant" && ["restart", "stop"].includes(service); diff --git a/src/panels/developer-tools/service/developer-tools-service.ts b/src/panels/developer-tools/service/developer-tools-service.ts index eef7f9ceb2..b72fb01a40 100644 --- a/src/panels/developer-tools/service/developer-tools-service.ts +++ b/src/panels/developer-tools/service/developer-tools-service.ts @@ -1,3 +1,4 @@ +import { ERR_CONNECTION_LOST } from "home-assistant-js-websocket"; import { safeLoad } from "js-yaml"; import { css, @@ -23,7 +24,11 @@ import "../../../components/ha-service-picker"; import "../../../components/ha-yaml-editor"; import type { HaYamlEditor } from "../../../components/ha-yaml-editor"; import { ServiceAction } from "../../../data/script"; -import { callExecuteScript } from "../../../data/service"; +import { forwardHaptic } from "../../../data/haptics"; +import { + callExecuteScript, + serviceCallWillDisconnect, +} from "../../../data/service"; import { haStyle } from "../../../resources/styles"; import "../../../styles/polymer-ha-style"; import { HomeAssistant } from "../../../types"; @@ -275,6 +280,14 @@ class HaPanelDevService extends LitElement { try { await callExecuteScript(this.hass, [this._serviceData]); } catch (err) { + const [domain, service] = this._serviceData.service.split(".", 2); + if ( + err.error.code === ERR_CONNECTION_LOST && + serviceCallWillDisconnect(domain, service) + ) { + return; + } + forwardHaptic("failure"); showToast(this, { message: this.hass.localize( diff --git a/src/state/connection-mixin.ts b/src/state/connection-mixin.ts index 52164b59a0..8785f4dada 100644 --- a/src/state/connection-mixin.ts +++ b/src/state/connection-mixin.ts @@ -3,6 +3,7 @@ import { callService, Connection, ERR_INVALID_AUTH, + ERR_CONNECTION_LOST, HassConfig, subscribeConfig, subscribeEntities, @@ -13,6 +14,7 @@ import { broadcastConnectionStatus } from "../data/connection-status"; import { subscribeFrontendUserData } from "../data/frontend"; import { forwardHaptic } from "../data/haptics"; import { DEFAULT_PANEL } from "../data/panel"; +import { serviceCallWillDisconnect } from "../data/service"; import { NumberFormat } from "../data/translation"; import { subscribePanels } from "../data/ws-panels"; import { translationMetadata } from "../resources/translations-metadata"; @@ -78,6 +80,12 @@ export const connectionMixin = >( target )) as Promise; } catch (err) { + if ( + err.error.code === ERR_CONNECTION_LOST && + serviceCallWillDisconnect(domain, service) + ) { + throw err; + } if (__DEV__) { // eslint-disable-next-line no-console console.error(