Skip to content

Connecteur Desktop

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é)

PageDescription
/loginAuthentification via deep link ou token manuel
/ (Home)Historique des imports matériels
/settingsConfiguration des équipements, proxy, scanners
/scanNumérisation de documents
/lockÉcran de verrouillage multi-compte
/patientsRecherche patients

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"]

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

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

Stockée dans settings.datdirectories :

[
{
"uuid": "abc-123",
"path": "/chemin/vers/dossier/surveille",
"copy": "/chemin/vers/backup"
}
]

jpg, jpeg, png, xml, pdf, docx, doc, xlsx, xls, txt

ExtensionEndpoint APIComportement
.xmlPOST /appointments/{id}/hardware-importImport de données matérielles (mesures)
.jpg, .pngPOST /appointments/{id}/documentsUpload document image (rétinographie)
AutrePOST /appointments/{id}/documentsUpload document générique

É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

Stockée dans settings.datserials :

[
{
"uuid": "def-456",
"path": "/dev/tty.usbserial-1234",
"baudRate": 9600,
"dataBits": 8,
"stopBits": 1,
"parity": "none"
}
]
ParamètreValeursDefault
baudRate1200-115200Variable par appareil
dataBits5, 6, 7, 88
stopBits1, 21
paritynone, even, oddnone

Le connecteur intègre un module de numérisation (scan) directe.

Commande TauriDescription
list_scannersListe les scanners détectés (macOS + Windows)
start_scanLance 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)

CommandDescription
greetTest de communication
get_available_portsListe des ports série disponibles
directory_testTeste un dossier (existe, lecture, écriture)
list_scannersListe les scanners
start_scanLance un scan
set_auth_tokenStocke le token d’auth en mémoire
EventDescription
listener://activityActivité d’un listener (succès/erreur)
serial://{uuid}/chunkDonnées série en temps réel
serial://{uuid}/finalBuffer série complet
deep-link://new-urlDeep link reçu
deep-link-rvDeep link reçu (alias)

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é API
  • appointment.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.datproxy :

{
"scheme": "http",
"host": "proxy.hospital.local",
"port": "8080",
"username": "user",
"password": "pass"
}

Le proxy est appliqué à tous les appels API (directory listener + serial listener).


PluginRôle
tauri-plugin-storePersistance locale (settings, config hardware)
tauri-plugin-strongholdStockage chiffré (salt Argon2)
tauri-plugin-autostartLancement au démarrage du système
tauri-plugin-deep-linkDeep links herve:// pour l’auth
tauri-plugin-single-instanceEmpêche les instances multiples
tauri-plugin-updaterMises à jour automatiques
tauri-plugin-shellOuverture navigateur externe
tauri-plugin-fsAccès système de fichiers
tauri-plugin-httpClient HTTP (reqwest)
tauri-plugin-dialogDialogues natifs
tauri-plugin-osInfos système (hostname)
tauri-plugin-processGestion du processus (relaunch)
tauri-plugin-logLogging (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.

FQDNPortProtocoleUsage
api.herve-med.com443HTTPSAPI principale (import hardware, documents, auth)
app.herve-med.com443HTTPSWebapp (deep link auth, ouverture navigateur)
ws.herve-med.com443WSSWebSocket temps réel (progression imports)

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).


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.