shoehive
Version:
WebSocket-based multiplayer game framework for real-time, event-driven gameplay
161 lines (160 loc) • 7.93 kB
JavaScript
;
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;