pub enum ServerMessage {
Show 49 variants
Hello {
heartbeat_interval_ms: u32,
server_version: Option<String>,
},
Ready {
session_id: String,
player_id: i64,
lobby: Option<LobbySnapshot>,
game: Option<GameSnapshot>,
},
Resumed {
missed_events: Vec<ServerMessage>,
},
HeartbeatAck {
server_time: u64,
},
InvalidSession {
reason: String,
},
LobbyJoined {
lobby_id: String,
lobby_code: Option<String>,
lobby: LobbySnapshot,
},
LobbySnapshot {
lobby: LobbySnapshot,
},
LobbyDelta {
changes: Vec<LobbyChange>,
},
LobbyLeft,
CustomLobbyCreated {
lobby_id: String,
lobby_code: String,
},
GameStarted {
game_id: String,
grid: Grid,
players: Vec<GamePlayerInfo>,
your_turn_order: u8,
current_turn: i64,
round: u8,
max_rounds: u8,
turn_time_limit: Option<u32>,
},
GameSnapshot {
game_id: String,
game: GameSnapshot,
},
GameDelta {
game_id: String,
changes: Vec<GameChange>,
},
GameOver {
game_id: String,
final_scores: Vec<ScoreInfo>,
winner_id: i64,
is_draw: bool,
},
GameCancelled {
game_id: String,
reason: String,
},
PlayerJoined {
player: LobbyPlayerInfo,
},
PlayerLeft {
player_id: i64,
reason: Option<String>,
},
PlayerReconnected {
player_id: i64,
},
PlayerDisconnected {
game_id: Option<String>,
player_id: i64,
grace_period_seconds: u32,
},
WordScored {
player_id: i64,
game_id: String,
word: String,
score: i32,
path: Vec<Position>,
total_score: i32,
gems_earned: i32,
total_gems: i32,
new_grid: Grid,
},
TurnChanged {
player_id: i64,
game_id: String,
round: u8,
time_remaining: Option<u32>,
},
TurnPassed {
player_id: i64,
game_id: String,
},
RoundChanged {
game_id: String,
round: u8,
max_rounds: u8,
new_grid: Option<Grid>,
},
BoardShuffled {
player_id: i64,
game_id: String,
new_grid: Grid,
gems_spent: i32,
total_gems: i32,
},
TileSwapped {
player_id: i64,
game_id: String,
row: usize,
col: usize,
old_letter: char,
new_letter: char,
gems_spent: i32,
total_gems: i32,
},
SwapModeEntered {
player_id: i64,
game_id: String,
},
SwapModeExited {
player_id: i64,
game_id: String,
},
SpectatorJoined {
game_id: String,
game: GameSnapshot,
},
SpectatorAdded {
spectator: SpectatorInfo,
game_id: String,
},
SpectatorRemoved {
spectator_id: i64,
game_id: String,
},
SpectatorBecamePlayer {
player_id: i64,
username: String,
game_id: String,
},
SpectatorLeft,
SelectionUpdate {
player_id: i64,
game_id: String,
positions: Vec<Position>,
},
TimerVoteUpdate {
state: TimerVoteState,
game_id: String,
},
TurnTimerStarted {
target_player_id: i64,
game_id: String,
seconds: u32,
},
TurnTimerExpired {
player_id: i64,
game_id: String,
},
RematchCountdownUpdate {
state: RematchCountdownState,
previous_game_id: String,
},
PlayerLeftRematch {
player_id: i64,
previous_game_id: String,
},
RematchStarting {
triggered_by: Option<i64>,
previous_game_id: String,
},
PlayerPoolChanged {
player_id: i64,
old_pool: Option<GameType>,
new_pool: Option<GameType>,
},
PoolJoined {
position: i32,
total_in_pool: i32,
game_id: String,
},
PoolUpdate {
position: i32,
total_in_pool: i32,
game_id: String,
},
PoolLeft,
AdminGamesList {
games: Vec<AdminGameInfo>,
},
AdminGameDeleted {
game_id: String,
},
GameStateUpdate {
game_id: String,
state: String,
grid: Grid,
players: Vec<PlayerInfo>,
current_turn: i64,
round: i32,
max_rounds: i32,
used_words: Vec<String>,
spectators: Vec<SpectatorInfo>,
timer_vote_state: TimerVoteState,
},
LobbyStateUpdate {
lobby_id: String,
players: Vec<LobbyPlayerInfo>,
games: Vec<LobbyGameInfo>,
},
DebugStateResponse {
timestamp: String,
player: DebugPlayerInfo,
websocket_context: DebugWebsocketContext,
lobby_state: Option<DebugLobbyState>,
backend_game_state: Option<DebugBackendGameState>,
handler_game_state: Option<DebugHandlerGameState>,
},
Error {
code: ErrorCode,
message: String,
details: Option<Value>,
},
}Expand description
Messages sent from server to client.
Variants§
Hello
Initial server greeting after WebSocket connect.
Sent immediately upon connection, before Identify.
Fields
Ready
Successful authentication response.
Contains the full initial state snapshot.
Fields
lobby: Option<LobbySnapshot>Full lobby state (if in a lobby)
game: Option<GameSnapshot>Full game state (if in a game)
Resumed
Session resumed successfully after reconnect.
Contains any events missed during disconnection.
Fields
missed_events: Vec<ServerMessage>Events that occurred while disconnected
HeartbeatAck
Heartbeat response.
Echoes back for latency calculation.
InvalidSession
Session is invalid or expired.
Client should re-authenticate.
LobbyJoined
Sent when successfully joining a lobby.
Fields
lobby: LobbySnapshotFull lobby state
LobbySnapshot
Full lobby state snapshot.
Sent on initial join or when delta sync fails.
Fields
lobby: LobbySnapshotLobbyDelta
Incremental lobby state update.
More efficient than full snapshots for small changes.
Fields
changes: Vec<LobbyChange>LobbyLeft
Confirmation of leaving lobby.
CustomLobbyCreated
Custom lobby was created successfully.
GameStarted
A new game has started.
Contains initial game state for all participants.
Fields
players: Vec<GamePlayerInfo>GameSnapshot
Full game state snapshot.
Sent when joining as spectator or when delta sync fails.
GameDelta
Incremental game state update.
GameOver
Game has ended normally.
Fields
GameCancelled
Game was cancelled (not enough players, host left, etc.).
PlayerJoined
A player joined the lobby.
Fields
player: LobbyPlayerInfoPlayerLeft
A player left the lobby.
PlayerReconnected
A player reconnected after disconnection.
PlayerDisconnected
A player disconnected (may reconnect).
Fields
WordScored
A word was successfully scored.
Fields
TurnChanged
Turn changed to another player.
Fields
TurnPassed
A player passed their turn.
RoundChanged
Round number changed.
Fields
BoardShuffled
Board was shuffled.
Fields
TileSwapped
A tile was swapped.
Fields
SwapModeEntered
Player entered swap mode (for animation).
SwapModeExited
Player exited swap mode.
SpectatorJoined
Successfully joined as spectator.
SpectatorAdded
A new spectator joined (broadcast to others).
SpectatorRemoved
A spectator left.
SpectatorBecamePlayer
Spectator joined as player.
SpectatorLeft
Confirmation of leaving spectator mode.
SelectionUpdate
Another player’s tile selection (for live preview).
TimerVoteUpdate
Timer vote state changed.
TurnTimerStarted
Turn timer started (vote passed).
TurnTimerExpired
Turn timer expired - player auto-passed.
RematchCountdownUpdate
Rematch countdown state update.
Sent to all players on the results screen after a game ends.
Fields
state: RematchCountdownStateCurrent countdown state
PlayerLeftRematch
A player opted out of rematch pool.
Broadcast to remaining players so they can update the player list.
RematchStarting
Rematch is starting (sent right before GameStarted).
Allows frontend to show “Starting…” before the new game begins.
Fields
PlayerPoolChanged
PoolJoined
Player joined the game pool.
PoolUpdate
Pool position updated.
PoolLeft
Left the pool.
AdminGamesList
Response to admin game list request.
Fields
games: Vec<AdminGameInfo>AdminGameDeleted
Game was deleted by admin.
GameStateUpdate
Generic state update (legacy format).
Used for backward compatibility with existing frontend.
LobbyStateUpdate
Lobby state update (legacy format).
DebugStateResponse
Debug state response with player context diagnostics.
Fields
player: DebugPlayerInfowebsocket_context: DebugWebsocketContextlobby_state: Option<DebugLobbyState>backend_game_state: Option<DebugBackendGameState>handler_game_state: Option<DebugHandlerGameState>Error
Error response.
Implementations§
Source§impl ServerMessage
impl ServerMessage
Sourcepub fn error_with_message(code: ErrorCode, message: impl Into<String>) -> Self
pub fn error_with_message(code: ErrorCode, message: impl Into<String>) -> Self
Create an error message with custom message.
Sourcepub fn error_with_details(
code: ErrorCode,
message: impl Into<String>,
details: Value,
) -> Self
pub fn error_with_details( code: ErrorCode, message: impl Into<String>, details: Value, ) -> Self
Create an error message with details.
Sourcepub fn message_type(&self) -> &'static str
pub fn message_type(&self) -> &'static str
Get the message type as a string (for logging/debugging).
Sourcepub fn should_store_for_replay(&self) -> bool
pub fn should_store_for_replay(&self) -> bool
Check if this message should be stored for reconnection replay.
Some messages are transient and don’t need to be replayed.
Trait Implementations§
Source§impl Clone for ServerMessage
impl Clone for ServerMessage
Source§fn clone(&self) -> ServerMessage
fn clone(&self) -> ServerMessage
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ServerMessage
impl Debug for ServerMessage
Source§impl<'de> Deserialize<'de> for ServerMessage
impl<'de> Deserialize<'de> for ServerMessage
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl From<ServerMessage> for Value
Convert a ServerMessage to a serde_json::Value.
impl From<ServerMessage> for Value
Convert a ServerMessage to a serde_json::Value.