feat: Add hardened error handling and retries (#2451)

- Closes #1830
 - Closes #2099
This commit is contained in:
Dermot Duffy
2026-06-30 17:45:12 -07:00
committed by dermotduffy
parent 4bc787e2b7
commit 47bcce93d3
182 changed files with 7877 additions and 4043 deletions
-14
View File
@@ -1,14 +0,0 @@
import { HomeAssistant } from './types';
/**
* Determine if HA connection state has changed.
* @param newHass The new HA object.
* @param oldHass The old HA object.
* @returns `true` if the connection state has changed.
*/
export const hasHAConnectionStateChanged = (
oldHass?: HomeAssistant | null,
newHass?: HomeAssistant | null,
): boolean => {
return oldHass?.connected !== newHass?.connected;
};
+11 -6
View File
@@ -1,12 +1,19 @@
import { localize } from '../localize/localize';
import { AdvancedCameraCardError } from '../types';
import { CardHelpers, LovelaceCardWithEditor } from '../types';
class HomeAssistantElementsLoadError extends AdvancedCameraCardError {
constructor() {
super(localize('error.home_assistant_elements_load_failed'));
}
}
/**
* Side loads the HA elements this card needs. This trickery is unfortunate
* necessary, see:
* - https://github.com/thomasloven/hass-config/wiki/PreLoading-Lovelace-Elements
* @returns `true` if the load is successful, `false` otherwise.
*/
export const sideLoadHomeAssistantElements = async (): Promise<boolean> => {
export const sideLoadHomeAssistantElements = async (): Promise<void> => {
const neededElements = [
'ha-button',
'ha-camera-stream',
@@ -27,7 +34,7 @@ export const sideLoadHomeAssistantElements = async (): Promise<boolean> => {
];
if (neededElements.every((element) => customElements.get(element))) {
return true;
return;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -49,12 +56,10 @@ export const sideLoadHomeAssistantElements = async (): Promise<boolean> => {
await customElements.whenDefined('hui-picture-glance-card');
const pgcConstructor = customElements.get('hui-picture-glance-card');
if (!pgcConstructor) {
return false;
throw new HomeAssistantElementsLoadError();
}
const pgc = new pgcConstructor() as LovelaceCardWithEditor;
await pgc.constructor.getConfigElement();
return true;
};