Connecteur Desktop
Vue d’ensemble
Section titled “Vue d’ensemble”Le Connecteur HerVe est une application desktop multi-plateforme (Windows, macOS) construite avec Tauri v2. Son rôle principal est de faire le pont entre les équipements médicaux du cabinet et l’API HerVe.
Repository : herve-connector
Stack :
- Frontend : Next.js (Pages Router) + TypeScript + shadcn/ui
- Backend natif : Rust (Tauri v2)
- Persistance locale :
tauri-plugin-store(settings.dat) - Sécurité :
tauri-plugin-stronghold(stockage chiffré)
Fonctionnalités
Section titled “Fonctionnalités”| Page | Description |
|---|---|
/login | Authentification via deep link ou token manuel |
/ (Home) | Historique des imports matériels |
/settings | Configuration des équipements, proxy, scanners |
/scan | Numérisation de documents |
/lock | Écran de verrouillage multi-compte |
/patients | Recherche patients |
Architecture
Section titled “Architecture”graph TD
subgraph Tauri["Connecteur (Tauri)"]
subgraph Frontend["Frontend (Next.js)"]
Historique
Settings["Settings"]
Login
end
subgraph Rust["Backend Rust"]
dir_listener["directories_listener"]
serial_listener["serials_listener"]
scanner
auth
proxy
end
Frontend <-->|"Tauri commands & events"| Rust
end
Frontend -->|"WebSocket (Echo)"| API
Rust -->|"HTTP (reqwest)"| API
API["API HerVe<br/>POST /appointments/{id}/hardware-import<br/>POST /appointments/{id}/documents<br/>GET /hardware-histories"]
Flux d’authentification
Section titled “Flux d’authentification”sequenceDiagram
actor U as Utilisateur
participant C as Connecteur
participant W as Webapp HerVe
participant API as API
U->>C: Clic "Se connecter"
C->>W: Ouvre le navigateur<br/>/software/login?software-auth=request&hostname=PC-01
W-->>C: Deep link herve://auth?token=xxx
C->>C: set_auth_token(token)
C->>C: Store: tenant_id, site_id, user
Note over U,C: Fallback : token manuel<br/>via clic droit + dialog (après 20s)
- L’auth utilise un deep link (
herve://) pour recevoir le token depuis la webapp - Fallback : saisie manuelle du token (dialog après 20s ou clic droit)
- Le token est stocké en mémoire dans
AuthState(Rust) et utilisé pour les appels API - Support multi-comptes : plusieurs comptes stockés, écran de verrouillage
Flux d’import : Directory Listener
Section titled “Flux d’import : Directory Listener”Le flux principal. Surveille des dossiers configurés et envoie automatiquement les fichiers à l’API.
sequenceDiagram
participant HW as Équipement médical
participant C as Connecteur (Rust)
participant API as API HerVe
HW->>C: Écrit un fichier dans le dossier surveillé
C->>C: notify: détecte la création
C->>C: Attend écriture complète
C->>C: Anti-duplication (2s)
C->>C: Routing par extension<br/>.xml → /hardware-import<br/>.jpg/.png → /documents (rétino)<br/>autre → /documents
C->>API: POST multipart<br/>Authorization: Bearer token<br/>X-Tenant / X-Site<br/>body: file + appointment_id
API-->>C: 200 / 201
C->>C: Copie dans backup (optionnel)
C->>C: Supprime le fichier original
C->>C: Émet event listener://activity
Configuration directory
Section titled “Configuration directory”Stockée dans settings.dat → directories :
[ { "uuid": "abc-123", "path": "/chemin/vers/dossier/surveille", "copy": "/chemin/vers/backup" }]Extensions supportées
Section titled “Extensions supportées”jpg, jpeg, png, xml, pdf, docx, doc, xlsx, xls, txt
Routing par extension
Section titled “Routing par extension”| Extension | Endpoint API | Comportement |
|---|---|---|
.xml | POST /appointments/{id}/hardware-import | Import de données matérielles (mesures) |
.jpg, .png | POST /appointments/{id}/documents | Upload document image (rétinographie) |
| Autre | POST /appointments/{id}/documents | Upload document générique |
Flux d’import : Serial Listener
Section titled “Flux d’import : Serial Listener”Écoute des ports série (RS-232, USB série) connectés aux équipements médicaux.
sequenceDiagram
participant HW as Équipement médical<br/>(tonomètre, réfractomètre)
participant C as Connecteur (Rust)
participant FE as Frontend
participant API as API HerVe
HW->>C: Données série (RS-232 / USB)
C->>C: Lit le port en continu
C->>C: Accumule dans un buffer
C->>FE: Émet serial://{id}/chunk (temps réel)
Note over C: Après 1.5s d'inactivité :<br/>données considérées complètes
C->>FE: Émet serial://{id}/final (buffer complet)
C->>API: POST JSON /hardware-import<br/>body: { appointment_id, raw }
API-->>C: 200 / 201
Configuration serial
Section titled “Configuration serial”Stockée dans settings.dat → serials :
[ { "uuid": "def-456", "path": "/dev/tty.usbserial-1234", "baudRate": 9600, "dataBits": 8, "stopBits": 1, "parity": "none" }]Paramètres port série
Section titled “Paramètres port série”| Paramètre | Valeurs | Default |
|---|---|---|
baudRate | 1200-115200 | Variable par appareil |
dataBits | 5, 6, 7, 8 | 8 |
stopBits | 1, 2 | 1 |
parity | none, even, odd | none |
Scanner de documents
Section titled “Scanner de documents”Le connecteur intègre un module de numérisation (scan) directe.
| Commande Tauri | Description |
|---|---|
list_scanners | Liste les scanners détectés (macOS + Windows) |
start_scan | Lance un scan avec le scanner sélectionné |
Implémentations spécifiques par OS :
scanner/macos.rs— utilise les APIs macOS (ImageCaptureCore)scanner/windows.rs— utilise les APIs Windows (WIA)
Communication Frontend ↔ Backend
Section titled “Communication Frontend ↔ Backend”Commands Tauri (front → Rust)
Section titled “Commands Tauri (front → Rust)”| Command | Description |
|---|---|
greet | Test de communication |
get_available_ports | Liste des ports série disponibles |
directory_test | Teste un dossier (existe, lecture, écriture) |
list_scanners | Liste les scanners |
start_scan | Lance un scan |
set_auth_token | Stocke le token d’auth en mémoire |
Events Tauri (Rust → front)
Section titled “Events Tauri (Rust → front)”| Event | Description |
|---|---|
listener://activity | Activité d’un listener (succès/erreur) |
serial://{uuid}/chunk | Données série en temps réel |
serial://{uuid}/final | Buffer série complet |
deep-link://new-url | Deep link reçu |
deep-link-rv | Deep link reçu (alias) |
WebSocket (front → API)
Section titled “WebSocket (front → API)”Le frontend écoute les events Laravel Echo pour les mises à jour en temps réel :
appointment.hardware.import-progression— progression de l’import côté APIappointment.hardware.import-ignored— import ignoré
Le connecteur supporte la configuration d’un proxy HTTP pour les environnements réseau contraints (hôpitaux, cliniques).
Configuration dans settings.dat → proxy :
{ "scheme": "http", "host": "proxy.hospital.local", "port": "8080", "username": "user", "password": "pass"}Le proxy est appliqué à tous les appels API (directory listener + serial listener).
Plugins Tauri utilisés
Section titled “Plugins Tauri utilisés”| Plugin | Rôle |
|---|---|
tauri-plugin-store | Persistance locale (settings, config hardware) |
tauri-plugin-stronghold | Stockage chiffré (salt Argon2) |
tauri-plugin-autostart | Lancement au démarrage du système |
tauri-plugin-deep-link | Deep links herve:// pour l’auth |
tauri-plugin-single-instance | Empêche les instances multiples |
tauri-plugin-updater | Mises à jour automatiques |
tauri-plugin-shell | Ouverture navigateur externe |
tauri-plugin-fs | Accès système de fichiers |
tauri-plugin-http | Client HTTP (reqwest) |
tauri-plugin-dialog | Dialogues natifs |
tauri-plugin-os | Infos système (hostname) |
tauri-plugin-process | Gestion du processus (relaunch) |
tauri-plugin-log | Logging (stdout + fichier en prod) |
Flux réseau à ouvrir (environnements hospitaliers)
Section titled “Flux réseau à ouvrir (environnements hospitaliers)”En environnement réseau restreint (hôpitaux, cliniques, établissements de santé), les flux suivants doivent être autorisés pour que le connecteur et la webapp fonctionnent correctement.
Connecteur Desktop
Section titled “Connecteur Desktop”| FQDN | Port | Protocole | Usage |
|---|---|---|---|
api.herve-med.com | 443 | HTTPS | API principale (import hardware, documents, auth) |
app.herve-med.com | 443 | HTTPS | Webapp (deep link auth, ouverture navigateur) |
ws.herve-med.com | 443 | WSS | WebSocket temps réel (progression imports) |
Configuration proxy
Section titled “Configuration proxy”Si l’établissement impose un proxy HTTP, le connecteur supporte la configuration via Paramètres > Proxy (schéma, hôte, port, authentification). Le proxy s’applique à tous les appels API du connecteur (directory listener + serial listener).
Feature gate
Section titled “Feature gate”Le connecteur vérifie que le tenant a la feature desktop-app activée dans son plan (FeatureKey::DESKTOP_APP). Si la feature n’est pas active, un message d’avertissement s’affiche sur la page d’accueil.