PROJECT · 05/08 · scala-poll ← cd ..

// projet académique · décembre 2025

Realtime Poll.

Serveur de sondages en temps réel avec WebSockets, construit en Scala avec ZIO et Tapir.

Scala 3ZIOZIO Http TapirWebSocketSwagger UI
GitHub ↗

// Overview

Serveur HTTP fonctionnel pour créer des sondages, voter et voir les résultats se mettre à jour en temps réel. L'état des sondages est géré en mémoire via un Ref ZIO (immutable, thread-safe) et les mises à jour sont diffusées à tous les clients connectés via un Hub ZIO.

// Architecture

flowchart LR
  C["Client Web (static)\nHTML/JS vanilla"] -->|REST API| API
  subgraph API["REST API — Tapir endpoints"]
    R1["POST /poll (création)"]
    R2["GET /poll/{id} (consultation)"]
    R3["POST /poll/{id}/vote"]
  end
  API --> REF["Ref[Map[...]] (ZIO Ref)\nÉtat en mémoire (volatile)"]
  REF --> HUB["Hub ZIO\nBroadcast WebSocket\nWS /poll/{id}/results"]
        

// Fonctionnalités

// API REST

  • ▸ POST /poll — créer un sondage
  • ▸ GET /poll/{id} — consulter
  • ▸ POST /poll/{id}/vote — voter

// Temps réel

  • ▸ WS /poll/{id}/results
  • ▸ Broadcast via Hub ZIO
  • ▸ Mise à jour sans refresh

// Points techniques

// ZIO Ref & Hub

État partagé thread-safe (Ref) et diffusion concurrente (Hub) — patterns fonctionnels purs pour la concurrence.

// Tapir

Définition des endpoints REST + WebSocket de manière type-safe, avec génération auto de Swagger UI.

// Front-end vanilla

Client HTML/JS servi directement par le serveur — pas de framework front, pas de build step.

// Swagger UI

Documentation API auto-générée disponible sur /docs.