Quickshell / Home Assistant : contenir les attributs mal formés et les erreurs de traitement des événements #16

Closed
opened 2026-10-24 13:10:04 +00:00 by mathieu · 1 comment
Owner

Problème confirmé

Dans mathieu/home-assistant-bridge.mjs:114, (s.attributes?.entity_id ?? []).some?.(...) ne protège pas contre une propriété some présente mais non appelable. Un état de lumière avec attributes.entity_id = {some: 1} provoque un TypeError.

Reproduction en mémoire, sans connexion HA : makeSnapshot() lève ; injecter cet état par bridge.message() laisse l’exception remonter. Le listener WebSocket (199–202) ne contient que l’erreur de parsing JSON, pas l’erreur de traitement (230–233). Une intégration ou personnalisation HA mal formée peut donc interrompre la passerelle et provoquer des reconnexions répétées.

Résultat attendu

  • Vérifier explicitement les types attendus avant de traiter les membres d’un groupe et les autres champs de structure voisins.
  • Contenir les exceptions à la frontière des messages et invalider l’état de manière sûre, sans conserver un faux état connecté.
  • Garder des messages d’erreur fixes, sans détails sensibles provenant du serveur.
  • Clarifier les expressions de validation concernées plutôt qu’ajouter une couche générique de compatibilité.

Validation

  • Injecter le cas ci-dessus via le MockSocket, après initialisation : aucune exception non gérée.
  • Couvrir attributs absents, null, objet, chaîne et tableau valide ; prévoir les entrées nulles si le contrat les rejette.
  • Reconnexion/invalidation correctes, aucun ordre réémis automatiquement.
  • node --test quickshell/mathieu/home-assistant-bridge.test.mjs, sans identifiants réels ni commande d’appareil.

Indépendant des corrections notifications ; traitable en parallèle.

Référence

Revue du code au commit 5e350a8, avec Quickshell 0.3.2. Les 18 suites existantes passent ; les cas ci-dessous complètent cette couverture. Chantier : #11.

  • with pi 🥧
## Problème confirmé Dans `mathieu/home-assistant-bridge.mjs:114`, `(s.attributes?.entity_id ?? []).some?.(...)` ne protège pas contre une propriété `some` présente mais non appelable. Un état de lumière avec `attributes.entity_id = {some: 1}` provoque un `TypeError`. Reproduction en mémoire, sans connexion HA : `makeSnapshot()` lève ; injecter cet état par `bridge.message()` laisse l’exception remonter. Le listener WebSocket (`199–202`) ne contient que l’erreur de parsing JSON, pas l’erreur de traitement (`230–233`). Une intégration ou personnalisation HA mal formée peut donc interrompre la passerelle et provoquer des reconnexions répétées. ## Résultat attendu - Vérifier explicitement les types attendus avant de traiter les membres d’un groupe et les autres champs de structure voisins. - Contenir les exceptions à la frontière des messages et invalider l’état de manière sûre, sans conserver un faux état connecté. - Garder des messages d’erreur fixes, sans détails sensibles provenant du serveur. - Clarifier les expressions de validation concernées plutôt qu’ajouter une couche générique de compatibilité. ## Validation - [x] Injecter le cas ci-dessus via le MockSocket, après initialisation : aucune exception non gérée. - [x] Couvrir attributs absents, null, objet, chaîne et tableau valide ; prévoir les entrées nulles si le contrat les rejette. - [x] Reconnexion/invalidation correctes, aucun ordre réémis automatiquement. - [x] `node --test quickshell/mathieu/home-assistant-bridge.test.mjs`, sans identifiants réels ni commande d’appareil. Indépendant des corrections notifications ; traitable en parallèle. ## Référence Revue du code [au commit `5e350a8`](https://git.2027a.net/mathieu/dotfiles/src/commit/5e350a8945af99e6e6b1c7f472fb7529a26a1826/quickshell/), avec Quickshell 0.3.2. Les 18 suites existantes passent ; les cas ci-dessous complètent cette couverture. Chantier : #11. - with pi 🥧
Author
Owner

Corrigé et intégré sur main, contenu distant vérifié au commit e8ec9ad.

Commitdb4aa3a ; 39 tests HA, optionnels invalides tolérés/filtrés, requis invalides invalidés avec reprise bornée et aucune réémission ; revue propre.

Gate parent de composition : 20/20 suites passent, HOME/XDG/bus/audio privés. Commits signés et vérifiés contre la clé publique configurée avec confiance temporaire locale. Aucun service personnel, appareil HA, presse-papiers ou vrai partage piloté. Le portail natif/compositeur n’est pas revendiqué testé.

Publication du code seulement : checkout actif à 5e350a8, sans activation/reload.

  • with pi 🥧
Corrigé et intégré sur `main`, contenu distant vérifié au commit [e8ec9ad](https://git.2027a.net/mathieu/dotfiles/commit/e8ec9ad7563960637ef33c13f0a1431f6bfab132). Commitdb4aa3a ; 39 tests HA, optionnels invalides tolérés/filtrés, requis invalides invalidés avec reprise bornée et aucune réémission ; revue propre. Gate parent de composition : **20/20 suites passent**, HOME/XDG/bus/audio privés. Commits signés et vérifiés contre la clé publique configurée avec confiance temporaire locale. Aucun service personnel, appareil HA, presse-papiers ou vrai partage piloté. Le portail natif/compositeur n’est pas revendiqué testé. Publication du code seulement : checkout actif à `5e350a8`, sans activation/reload. - with pi 🥧
mathieu 2026-10-24 13:44:01 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
mathieu/dotfiles#16
No description provided.