feat(front): page d'état Svelte 5, PWA servie par le proxy, avec le bouton de mise à jour du script #5

Open
hermes-bot wants to merge 2 commits from hermes/page-etat-svelte into main
Collaborator

Ce que fait cette branche

La page d'état du proxy devient une application Svelte 5 (dossier front/), que le proxy sert
sur /__status : en-tête (fraîcheur du relevé, bouton d'actualisation, bascule de thème), cartes
Script TizenTube, Trafic déchiffré, Appareils, Santé du proxy et Journal.

  • Le bouton « Mettre à jour le script » appelle POST /api/script/maj et affiche le message
    rendu par le proxy : installed, up-to-date ou refused. C'est le champ status qui décide de
    l'affichage, pas ok seul ; un refus garde son message en français.
  • Aucune donnée d'état n'est mise en cache : chaque actualisation (30 s, ou bouton) relit
    /__status.json et /__metrics. Le service worker ne garde que la coque — la page s'ouvre encore
    quand le proxy est muet, et la coque est la seule chose en cache.
  • Une panne de lecture affiche le code HTTP et l'explication donnée par le proxy, bornée à une
    ligne (jamais une page web entière recopiée dans l'alerte).
  • PWA installable (public/manifeste.webmanifest, icônes, service worker), thème sombre par défaut
    avec bascule mémorisée, aucun emoji, toutes les valeurs de style en jetons.

Vérifications (sorties réelles)

svelte-check found 0 errors and 0 warnings
eslint : 0 problème
Test Files  7 passed (7)      Tests  94 passed (94)
Couverture : Statements 93,94 % | Branches 87,85 % | Fonctions 94,11 % | Lignes 95,16 %   (seuils 80 %)
vite build  : dist/index.html 1,29 kB · dist/assets/index-*.js 64,28 kB (gzip 23,58) ·
              dist/service-worker.js 1,55 kB
playwright  : 32 passed (bureau 1440×900 et téléphone 412×915), navigateur réel
axe         : 0 violation (wcag2a, wcag2aa, wcag21aa)

Captures (données simulées, captures prises par les essais)

Bureau, thème sombre :

bureau, thème sombre

Bureau, thème clair :

bureau, thème clair

Téléphone (412×915), thème sombre :

téléphone, thème sombre

Téléphone, thème clair :

téléphone, thème clair

Regardé dans les quatre cas : pas de chevauchement, pas de débordement horizontal, contrastes tenus,
aucun emoji. Le seul texte tronqué est le chemin du script sur le proxy, qui porte son chemin
complet en title.

Ce que cette branche ne fait pas

  • Le service des fichiers de front/dist par le proxy Rust et le paquet : carte t_a505c4b3.
  • Le travail front ajouté à .forgejo/workflows/ci.yml démarre dès qu'un exécutant est
    enregistré : pc-lourd n'existe pas encore, le travail Rust étant déjà en attente pour la même
    raison.
## Ce que fait cette branche La page d'état du proxy devient une application **Svelte 5** (dossier `front/`), que le proxy sert sur `/__status` : en-tête (fraîcheur du relevé, bouton d'actualisation, bascule de thème), cartes **Script TizenTube**, **Trafic déchiffré**, **Appareils**, **Santé du proxy** et **Journal**. - Le bouton **« Mettre à jour le script »** appelle `POST /api/script/maj` et affiche le message rendu par le proxy : `installed`, `up-to-date` ou `refused`. C'est le champ `status` qui décide de l'affichage, pas `ok` seul ; un refus garde son `message` en français. - **Aucune donnée d'état n'est mise en cache** : chaque actualisation (30 s, ou bouton) relit `/__status.json` et `/__metrics`. Le service worker ne garde que la coque — la page s'ouvre encore quand le proxy est muet, et la coque est la seule chose en cache. - Une panne de lecture affiche le code HTTP **et** l'explication donnée par le proxy, bornée à une ligne (jamais une page web entière recopiée dans l'alerte). - PWA installable (`public/manifeste.webmanifest`, icônes, service worker), thème sombre par défaut avec bascule mémorisée, aucun emoji, toutes les valeurs de style en jetons. ## Vérifications (sorties réelles) ``` svelte-check found 0 errors and 0 warnings eslint : 0 problème Test Files 7 passed (7) Tests 94 passed (94) Couverture : Statements 93,94 % | Branches 87,85 % | Fonctions 94,11 % | Lignes 95,16 % (seuils 80 %) vite build : dist/index.html 1,29 kB · dist/assets/index-*.js 64,28 kB (gzip 23,58) · dist/service-worker.js 1,55 kB playwright : 32 passed (bureau 1440×900 et téléphone 412×915), navigateur réel axe : 0 violation (wcag2a, wcag2aa, wcag21aa) ``` ## Captures (données simulées, captures prises par les essais) Bureau, thème sombre : ![bureau, thème sombre](http://192.168.1.70:3000/foXaCe/tizentube-proxy/raw/branch/hermes/page-etat-svelte/docs/captures/page-etat/bureau-sombre.jpg) Bureau, thème clair : ![bureau, thème clair](http://192.168.1.70:3000/foXaCe/tizentube-proxy/raw/branch/hermes/page-etat-svelte/docs/captures/page-etat/bureau-clair.jpg) Téléphone (412×915), thème sombre : ![téléphone, thème sombre](http://192.168.1.70:3000/foXaCe/tizentube-proxy/raw/branch/hermes/page-etat-svelte/docs/captures/page-etat/telephone-sombre.jpg) Téléphone, thème clair : ![téléphone, thème clair](http://192.168.1.70:3000/foXaCe/tizentube-proxy/raw/branch/hermes/page-etat-svelte/docs/captures/page-etat/telephone-clair.jpg) Regardé dans les quatre cas : pas de chevauchement, pas de débordement horizontal, contrastes tenus, aucun emoji. Le seul texte tronqué est le chemin du script sur le proxy, qui porte son chemin complet en `title`. ## Ce que cette branche ne fait pas - Le service des fichiers de `front/dist` par le proxy Rust et le paquet : carte `t_a505c4b3`. - Le travail `front` ajouté à `.forgejo/workflows/ci.yml` démarre dès qu'un exécutant est enregistré : `pc-lourd` n'existe pas encore, le travail Rust étant déjà en attente pour la même raison.
feat(proxy): socle Rust du proxy TizenTube, mesuré par le banc de référence
Some checks failed
CI du proxy TizenTube (Rust) / Rust (proxy) (push) Failing after 16s
CI du proxy TizenTube (Rust) / Rust (proxy) (pull_request) Successful in 59s
2685d188c3
Le proxy est réécrit en Rust (édition 2024, tokio, rustls, rcgen) : écoute sur
la boucle locale ou le LAN, refus des sources hors réseau local, déchiffrement
limité aux hôtes autorisés (expressions régulières, même sémantique que
mitmproxy), tunnel opaque pour tout le reste, autorité de certification reprise
du dossier ou engendrée au premier lancement, injection de la sonde et du script
dans la page /tv, service d'état et métriques Prometheus.

Deux pannes mesurées par le banc, corrigées ici :
- l'amont forcé ne valait que pour le relais, pas pour les tunnels : un hôte
  déclaré opaque partait tout droit sur le réseau ;
- les certificats servis n'avaient pas d'extension authorityKeyIdentifier, que
  la vérification stricte de Python 3.13 exige (RFC 5280 §4.2.1.1).
La sonde se pose désormais juste après la balise ouvrante `<head …>` (sans
casse) et le script avant le dernier `</body>`, aux places du proxy Python.

Mesures de ce socle : banc --exigence cible, 14 verts, 0 rouge, 1 non mesuré ;
35 tests unitaires et 4 d'intégration verts ; couverture des lignes 82,0 %.
La CI est posée dans .forgejo/workflows/ci.yml ; aucun exécutant n'étant
enregistré pour ce dépôt, elle n'a jamais tourné.
fix(proxy): relire le script injecté quand son fichier change, et n'installer que la version épinglée
Some checks failed
CI du proxy TizenTube (Rust) / Rust (proxy) (push) Has been cancelled
CI du proxy TizenTube (Rust) / Rust (proxy) (pull_request) Has been cancelled
d01ab33ce0
Trois causes, mesurées dans le banc : le script TizenTube n'était lu qu'une fois, au démarrage,
donc le remplacer sur le disque ne changeait rien pour la télévision ; une page /tv revalidée
recevait un 304 sans corps, donc sans TizenTube ; et rien ne disait quelle version de l'amont
tournait.

- injection.rs : CacheScript garde le script sous RwLock, avec une Signature (taille + mtime de
  la modification) ; Rechargement (Rien / Recharge / Echec) dit ce qui s'est passé. Un
  rechargement raté garde l'ancien script et le dit, dans le journal et sur la page d'état.
- proxy.rs : quand on injecte, les en-têtes conditionnels (If-None-Match, If-Modified-Since…)
  et les en-têtes d'empreinte du corps ne sont plus relayés vers /tv : la télévision reçoit
  toujours le corps porteur de TizenTube. L'URL du script porte l'empreinte de son contenu et
  peut donc être gardée en cache longtemps.
- maj.rs + --maj-script : le script s'installe depuis la version épinglée de tizentube/version.json
  (empreinte de l'archive — sha256 et intégrité du registre — puis taille et empreinte de chaque
  fichier). Rien n'est écrit avant la dernière vérification, chaque fichier passe par un fichier
  voisin puis un renommage, et un script déjà à l'empreinte épinglée n'est pas retéléchargé.
  tizentube/version.json épingle 1.15.1 avec les empreintes réelles du paquet amont.

Tests : cargo test --release --locked, 59 tests verts (53 en bibliothèque, 6 d'intégration).
Couverture : 82,71 % des lignes (cargo llvm-cov, seuil 80).
test(banc): profil du banc de référence pour la branche d injection
All checks were successful
CI du proxy TizenTube (Rust) / Rust (proxy) (push) Successful in 58s
CI du proxy TizenTube (Rust) / Rust (proxy) (pull_request) Successful in 56s
9226f62fa5
Le banc vit dans tests/ ; ce profil lance le binaire de cette branche avec l amont du banc
declare en clair, comme le profil du socle, pour que la parite soit rejouable telle quelle.

Banc : 14 ok, 0 rouge, 1 non mesuré, code 0 (injection 01..10 ok).
feat(front): page d'état Svelte 5 et bouton de mise à jour du script
Some checks failed
CI du proxy TizenTube (Rust) / Rust (proxy) (push) Has been cancelled
CI du proxy TizenTube (Rust) / Page d'état (Svelte) (push) Has been cancelled
CI du proxy TizenTube (Rust) / Rust (proxy) (pull_request) Has been cancelled
CI du proxy TizenTube (Rust) / Page d'état (Svelte) (pull_request) Has been cancelled
0f887516ce
Le proxy ne montrait son état que par une page HTML écrite à la main dans le
Rust : ni essai, ni lisibilité sur téléphone. La page devient une application
Svelte 5 (dossier `front/`) que le proxy sert sur `/__status` — en-tête, cartes
script, trafic, appareils, santé et journal — avec un bouton « Mettre à jour le
script » qui appelle `POST /api/script/maj` et affiche le message rendu par le
proxy : `installed`, `up-to-date` ou `refused` (le champ `status` est testé, pas
`ok` seul).

Aucune donnée d'état n'est mise en cache : chaque actualisation relit
`/__status.json` et `/__metrics`. Le service worker ne garde que la coque, pour
que la page s'ouvre encore quand le proxy est muet. Un refus de lecture affiche
le code et l'explication donnée par le proxy, bornée à une ligne.

Vérifications : svelte-check 0 erreur, eslint 0 problème, 94 essais unitaires
(couverture 95,2 % des lignes), 32 essais de bout en bout Playwright en bureau
(1440×900) et téléphone (412×915), dont un balayage axe sans violation. Un
travail `front` ajoute ces contrôles à `.forgejo/workflows/ci.yml`.

L'import du composant de la carte script est renommé `SectionScript` : sous le
nom `Script`, eslint le signalait comme inutilisé alors qu'il est bien utilisé
dans le balisage — le nom entre en collision avec l'élément `script` du parseur.
docs(front): captures de la page d'état en clair et en sombre, bureau et téléphone
Some checks failed
CI du proxy TizenTube (Rust) / Rust (proxy) (push) Successful in 56s
CI du proxy TizenTube (Rust) / Page d'état (Svelte) (push) Failing after 58s
CI du proxy TizenTube (Rust) / Rust (proxy) (pull_request) Successful in 54s
CI du proxy TizenTube (Rust) / Page d'état (Svelte) (pull_request) Failing after 10s
2c358a71af
Les quatre captures viennent de l'essai qui bascule les thèmes : elles montrent
la page telle qu'un opérateur la voit, sans donnée réelle. Réduites à 1200 px de
large pour rester légères dans le dépôt.
Collaborator

fusion-auto : pas de fusion, la CI est rouge (Page d'état, Page d'état). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.

`fusion-auto` : pas de fusion, la CI est rouge (Page d'état, Page d'état). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.
Some checks failed
CI du proxy TizenTube (Rust) / Rust (proxy) (push) Successful in 56s
CI du proxy TizenTube (Rust) / Page d'état (Svelte) (push) Failing after 58s
CI du proxy TizenTube (Rust) / Rust (proxy) (pull_request) Successful in 54s
CI du proxy TizenTube (Rust) / Page d'état (Svelte) (pull_request) Failing after 10s
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin "hermes/page-etat-svelte:hermes/page-etat-svelte"
git switch "hermes/page-etat-svelte"
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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
foXaCe/tizentube-proxy!5
No description provided.