import type { BoardView, Color, GameId, GameStatus, Mode, PlayerToken, PromotionType, Square, EndReason, } from './types.js'; import type { Announcement } from './moderator.js'; export type ClientMessage = | { type: 'hello'; gameId: GameId; token?: PlayerToken; joinAs?: Color | 'auto' } | { type: 'commit'; from: Square; to?: Square; promotion?: PromotionType } | { type: 'resign' } | { type: 'offer-draw' } | { type: 'respond-draw'; accept: boolean } | { type: 'pong' }; export type ErrorCode = | 'game_not_found' | 'slot_taken' | 'spectators_disabled' | 'not_your_turn' | 'malformed' | 'promotion_required' | 'must_move_touched_piece' | 'rate_limited' | 'invalid_token'; export type ServerMessage = | { type: 'joined'; you: Color | 'spectator-rejected'; token: PlayerToken; view: BoardView; announcements: Announcement[]; gameStatus: GameStatus; mode: Mode; highlightingEnabled: boolean; opponentConnected: boolean; } | { type: 'update'; view: BoardView; newAnnouncements: Announcement[]; gameStatus: GameStatus; touchedPiece?: Square; drawOffer?: { from: Color } | null; endReason?: EndReason; winner?: Color | null; } | { type: 'peer-status'; color: Color; connected: boolean; graceUntil?: number } | { type: 'error'; code: ErrorCode; message: string } | { type: 'ping' }; export interface CreateGameRequest { mode: Mode; side: Color | 'random'; highlightingEnabled: boolean; } export interface CreateGameResponse { gameId: GameId; creatorToken: PlayerToken; joinUrl: string; }