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>
13 lines
530 B
TypeScript
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 })
|