nerdware/apps/web/src/lib/socket.ts
AyoubBenziza 29faa18731 feat(server,web): first real-time cycle — room create/join + lobby
Server (@nerdware/server):
- RoomManager: in-memory rooms (Map), code generation, create/join,
  disconnect handling, public snapshot projection (no secrets)
- Socket.IO handlers: room:create / room:join with typed acks,
  room:state broadcast on every change, lobby:updateSettings (host-only),
  player:left on disconnect

Web (web):
- typed Socket.IO client + Zustand store mirroring room:state
- wouter routing: home (create/join) + minimal lobby (live player list)
- @nerdware/shared wired into the client

Roadmap V1 step 2. Verified end-to-end (create/join/broadcast/disconnect).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 15:16:26 +02:00

13 lines
530 B
TypeScript

import { io, type Socket } from "socket.io-client"
import type {
ClientToServerEvents,
ServerToClientEvents,
} from "@nerdware/shared"
/** Socket typé : <events reçus, events émis>. Désync = erreur de compile. */
export type AppSocket = Socket<ServerToClientEvents, ClientToServerEvents>
const SERVER_URL = import.meta.env.VITE_SERVER_URL ?? "http://localhost:3001"
// Une seule connexion partagée pour toute l'app (reconnexion auto par défaut).
export const socket: AppSocket = io(SERVER_URL, { autoConnect: true })