UNPKG

shoehive

Version:

WebSocket-based multiplayer game framework for real-time, event-driven gameplay

137 lines (136 loc) 4.71 kB
/// <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; }