shoehive
Version:
WebSocket-based multiplayer game framework for real-time, event-driven gameplay
137 lines (136 loc) • 4.71 kB
TypeScript
/// <reference types="node" />
import * as http from 'http';
import { EventBus } from '../events/EventBus';
import { MessageRouter } from '../events/MessageRouter';
import { Player } from './Player';
import { GameManager } from './GameManager';
import { Lobby } from './Lobby';
import { AuthModule } from '../transport/AuthModule';
import { TableFactory } from './TableFactory';
export declare class WebSocketManager {
private wss;
private eventBus;
private messageRouter;
private gameManager;
private lobby;
private players;
private authModule?;
private disconnectionTimeouts;
private reconnectionTimeoutMs;
constructor(server: http.Server, eventBus: EventBus, messageRouter: MessageRouter, gameManager: GameManager, authModule?: AuthModule, reconnectionTimeoutMs?: number, lobby?: Lobby, tableFactory?: TableFactory);
/**
* Sets up the connection handler for the WebSocket server.
* This handler authenticates the connection, creates a new player or reconnects an existing one,
* and handles incoming messages.
*/
private setupConnectionHandler;
/**
* Sets up event listeners for the WebSocket manager.
* This listens for lobby state updates and player joined events,
* and sends the appropriate messages to all players.
*/
private setupEventListeners;
/**
* Sends the initial state to a player.
* This includes player details and lobby state.
*
* @param player The player to send the initial state to.
*/
private sendInitialState;
/**
* Distribute player updates to relevant players.
* This notifies the player about their own changes and also updates
* any tables they're part of.
*
* @param player The player whose state changed
* @param key The attribute that changed
* @param value The new value
* @param updateTableState Whether to update the table state
*/
distributePlayerUpdate({ player, key, value, updateTableState, }: {
player: Player;
key: string;
value: unknown;
updateTableState?: boolean;
}): void;
/**
* Distribute multiple player updates to relevant players.
*
* @param player The player whose state changed
* @param attributes The attributes that changed
* @param updateTableState Whether to update the table state
*/
distributePlayerUpdates({ player, attributes, updateTableState, }: {
player: Player;
attributes: Record<string, unknown>;
updateTableState?: boolean;
}): void;
/**
* Creates a new player or reconnects an existing one.
*
* @param socket The WebSocket connection.
* @param playerId The player ID.
* @returns The player object.
*/
private createOrReconnectPlayer;
/**
* Setup disconnect handler for a player to manage reconnection timeout
*
* @param player The player to set up disconnect handler for
*/
private setupPlayerDisconnectHandler;
/**
* Permanently remove a player from the game server
*
* @param playerId The ID of the player to remove
*/
private removePlayerPermanently;
/**
* Gets a player by their ID.
*
* @param playerId The ID of the player to get.
* @returns The player object or undefined if the player does not exist.
*/
getPlayer({ playerId }: {
playerId: string;
}): Player | undefined;
/**
* Disconnects a player by their ID without waiting for timeout.
* This bypasses the reconnection timeout and immediately removes the player.
*
* @param playerId The ID of the player to disconnect.
*/
disconnectPlayer({ playerId }: {
playerId: string;
}): void;
/**
* Gets the current reconnection timeout in milliseconds
*/
getReconnectionTimeout(): number;
/**
* Sets the reconnection timeout in milliseconds
*
* @param timeoutMs The timeout in milliseconds (0 to disable reconnection)
*/
setReconnectionTimeout({ timeoutMs }: {
timeoutMs: number;
}): void;
/**
* Gets information about temporarily disconnected players.
* This is useful for monitoring and debugging connection issues.
*
* @returns Array of objects containing information about disconnected players
*/
getDisconnectedPlayers(): Array<{
id: string;
disconnectedAt: number;
reconnectionAvailableUntil: number;
timeLeftMs: number;
}>;
/**
* Gets the current number of connected players.
*
* @returns The number of connected players
*/
getConnectedPlayerCount(): number;
}