UNPKG

shoehive

Version:

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

161 lines (160 loc) 7.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createGameServer = exports.Hand = exports.Deck = exports.CardRank = exports.CardSuit = exports.EVENTS = exports.LOBBY_EVENTS = exports.TABLE_EVENTS = exports.PLAYER_EVENTS = exports.CLIENT_MESSAGE_TYPES = exports.CLIENT_COMMAND_TYPES = exports.Lobby = exports.GameManager = exports.MessageRouter = exports.EventBus = exports.WebSocketManager = exports.TableFactory = exports.TableState = exports.Seat = exports.Table = exports.Player = void 0; const Player_1 = require("./core/Player"); Object.defineProperty(exports, "Player", { enumerable: true, get: function () { return Player_1.Player; } }); const Table_1 = require("./core/Table"); Object.defineProperty(exports, "Table", { enumerable: true, get: function () { return Table_1.Table; } }); Object.defineProperty(exports, "TableState", { enumerable: true, get: function () { return Table_1.TableState; } }); const index_1 = require("./core/card/index"); Object.defineProperty(exports, "CardSuit", { enumerable: true, get: function () { return index_1.CardSuit; } }); Object.defineProperty(exports, "CardRank", { enumerable: true, get: function () { return index_1.CardRank; } }); Object.defineProperty(exports, "Deck", { enumerable: true, get: function () { return index_1.Deck; } }); Object.defineProperty(exports, "Hand", { enumerable: true, get: function () { return index_1.Hand; } }); const Seat_1 = require("./core/Seat"); Object.defineProperty(exports, "Seat", { enumerable: true, get: function () { return Seat_1.Seat; } }); const TableFactory_1 = require("./core/TableFactory"); Object.defineProperty(exports, "TableFactory", { enumerable: true, get: function () { return TableFactory_1.TableFactory; } }); const WebSocketManager_1 = require("./core/WebSocketManager"); Object.defineProperty(exports, "WebSocketManager", { enumerable: true, get: function () { return WebSocketManager_1.WebSocketManager; } }); const EventBus_1 = require("./events/EventBus"); Object.defineProperty(exports, "EventBus", { enumerable: true, get: function () { return EventBus_1.EventBus; } }); const MessageRouter_1 = require("./events/MessageRouter"); Object.defineProperty(exports, "MessageRouter", { enumerable: true, get: function () { return MessageRouter_1.MessageRouter; } }); const GameManager_1 = require("./core/GameManager"); Object.defineProperty(exports, "GameManager", { enumerable: true, get: function () { return GameManager_1.GameManager; } }); const Lobby_1 = require("./core/Lobby"); Object.defineProperty(exports, "Lobby", { enumerable: true, get: function () { return Lobby_1.Lobby; } }); const index_2 = require("./core/commands/index"); Object.defineProperty(exports, "CLIENT_COMMAND_TYPES", { enumerable: true, get: function () { return index_2.CLIENT_COMMAND_TYPES; } }); Object.defineProperty(exports, "CLIENT_MESSAGE_TYPES", { enumerable: true, get: function () { return index_2.CLIENT_MESSAGE_TYPES; } }); // Import all events-related exports const events_1 = require("./events"); Object.defineProperty(exports, "PLAYER_EVENTS", { enumerable: true, get: function () { return events_1.PLAYER_EVENTS; } }); Object.defineProperty(exports, "TABLE_EVENTS", { enumerable: true, get: function () { return events_1.TABLE_EVENTS; } }); Object.defineProperty(exports, "LOBBY_EVENTS", { enumerable: true, get: function () { return events_1.LOBBY_EVENTS; } }); Object.defineProperty(exports, "EVENTS", { enumerable: true, get: function () { return events_1.EVENTS; } }); function createGameServer({ server, authModule, serverTransportModule, options, }) { const eventBus = new EventBus_1.EventBus(); const messageRouter = new MessageRouter_1.MessageRouter(eventBus); const tableFactory = new TableFactory_1.TableFactory(eventBus); const gameManager = new GameManager_1.GameManager(eventBus, tableFactory); const lobby = new Lobby_1.Lobby(eventBus, gameManager, tableFactory); const wsManager = new WebSocketManager_1.WebSocketManager(server, eventBus, messageRouter, gameManager, authModule, options?.reconnectionTimeoutMs || 600000, lobby, tableFactory); // Register default Lobby message handlers /** * Table commands */ messageRouter.registerCommandHandler({ action: index_2.CLIENT_COMMAND_TYPES.TABLE.GET_STATE, handler: (player, data) => { if (!data.tableId) return; const tableId = data.tableId; const table = gameManager.getTableById({ tableId: tableId }); if (table) { player.sendMessage({ message: { type: index_2.CLIENT_MESSAGE_TYPES.TABLE.STATE, data: table.getTableState({}), }, }); } else { console.error(`Failed to get table state: ${tableId}`); } }, }); messageRouter.registerCommandHandler({ action: index_2.CLIENT_COMMAND_TYPES.TABLE.JOIN, handler: (player, data) => { if (!data.tableId) return; const tableId = data.tableId; const table = gameManager.getTableById({ tableId: tableId }); if (table) { table.addPlayer({ player: player }); } else { console.error(`Failed to join table: ${tableId}`); } }, }); messageRouter.registerCommandHandler({ action: index_2.CLIENT_COMMAND_TYPES.TABLE.CREATE, handler: (player, data) => { if (!data.gameId) { console.error(`Failed to create table (no gameId provided)`); return; } const gameId = data.gameId; const table = lobby.createTable({ gameId: gameId, options: data.options, }); if (table) { table.addPlayer({ player: player }); } else { console.error(`Failed to create table: ${gameId}`); } }, }); messageRouter.registerCommandHandler({ action: index_2.CLIENT_COMMAND_TYPES.TABLE.LEAVE, handler: (player, data) => { const table = player.getTable(); if (table) { table.removePlayer({ playerId: player.id }); } else { console.error(`Failed to leave table`); } }, }); /** * Seat commands */ messageRouter.registerCommandHandler({ action: index_2.CLIENT_COMMAND_TYPES.TABLE.SEAT_SIT, handler: (player, data) => { if (typeof data.seatIndex !== 'number') return; const table = player.getTable(); if (table) { table.sitPlayerAtSeat({ playerId: player.id, seatIndex: data.seatIndex }); } else { console.error(`Failed to sit player at seat: ${data.seatIndex}`); } }, }); messageRouter.registerCommandHandler({ action: index_2.CLIENT_COMMAND_TYPES.TABLE.SEAT_STAND, handler: (player, data) => { if (typeof data.seatIndex !== 'number') return; const table = player.getTable(); if (table) { table.removePlayerFromSeat({ seatIndex: data.seatIndex }); } else { console.error(`Failed to stand up from seat: ${data.seatIndex}`); } }, }); return { eventBus, messageRouter, tableFactory, gameManager, lobby, wsManager, // Add transport modules to the returned object transport: { auth: authModule, server: serverTransportModule, }, }; } exports.createGameServer = createGameServer;