mirror of
https://github.com/AlecM33/Werewolf.git
synced 2026-02-10 04:03:33 +01:00
Remove comments, delete TimerManager, and simplify SOURCE_TIMER_EVENT
Co-authored-by: AlecM33 <24642328+AlecM33@users.noreply.github.com>
This commit is contained in:
@@ -2,7 +2,6 @@ const GameStateCurator = require('./GameStateCurator');
|
||||
const GameCreationRequest = require('../model/GameCreationRequest');
|
||||
const { EVENT_IDS, STATUS, USER_TYPES, GAME_PROCESS_COMMANDS, REDIS_CHANNELS, PRIMITIVES } = require('../config/globals');
|
||||
|
||||
// Helper function to handle timer commands
|
||||
async function handleTimerCommand (timerEventSubtype, game, socketId, vars) {
|
||||
switch (timerEventSubtype) {
|
||||
case GAME_PROCESS_COMMANDS.PAUSE_TIMER:
|
||||
@@ -376,9 +375,8 @@ const Events = [
|
||||
communicate: async (game, socketArgs, vars) => {
|
||||
const timer = vars.gameManager.timers[game.accessCode];
|
||||
if (timer) {
|
||||
// Timer is running on this instance, handle the request directly
|
||||
await handleTimerCommand(vars.timerEventSubtype, game, vars.requestingSocketId, vars);
|
||||
} else { // we need to consult another container for the timer data
|
||||
} else {
|
||||
await vars.eventManager.publisher?.publish(
|
||||
REDIS_CHANNELS.ACTIVE_GAME_STREAM,
|
||||
vars.eventManager.createMessageToPublish(
|
||||
@@ -399,23 +397,7 @@ const Events = [
|
||||
communicate: async (game, socketArgs, vars) => {
|
||||
const timer = vars.gameManager.timers[game.accessCode];
|
||||
if (timer) {
|
||||
// Timer is running on this instance, handle the request
|
||||
await handleTimerCommand(socketArgs.timerEventSubtype, game, socketArgs.socketId, vars);
|
||||
} else {
|
||||
// Timer not running here, publish stored timer state
|
||||
await vars.eventManager.publisher.publish(
|
||||
REDIS_CHANNELS.ACTIVE_GAME_STREAM,
|
||||
vars.eventManager.createMessageToPublish(
|
||||
game.accessCode,
|
||||
socketArgs.timerEventSubtype,
|
||||
vars.instanceId,
|
||||
JSON.stringify({
|
||||
socketId: socketArgs.socketId,
|
||||
timeRemaining: game.timerParams.timeRemaining,
|
||||
paused: game.timerParams.paused
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -6,14 +6,12 @@ const fs = require('fs');
|
||||
const crypto = require('crypto');
|
||||
const EventManager = require('./singletons/EventManager.js');
|
||||
const GameManager = require('./singletons/GameManager.js');
|
||||
const TimerManager = require('./singletons/TimerManager.js');
|
||||
const rateLimit = require('express-rate-limit').default;
|
||||
|
||||
const ServerBootstrapper = {
|
||||
|
||||
singletons: (logger, instanceId) => {
|
||||
return {
|
||||
timerManager: new TimerManager(logger, instanceId),
|
||||
eventManager: new EventManager(logger, instanceId),
|
||||
gameManager: process.env.NODE_ENV.trim() === 'development'
|
||||
? new GameManager(logger, ENVIRONMENTS.LOCAL, instanceId)
|
||||
@@ -22,12 +20,9 @@ const ServerBootstrapper = {
|
||||
},
|
||||
|
||||
injectDependencies: (singletons) => {
|
||||
const timerManager = require('./singletons/TimerManager').instance;
|
||||
const gameManager = require('./singletons/GameManager').instance;
|
||||
const eventManager = require('./singletons/EventManager').instance;
|
||||
singletons.gameManager.timerManager = timerManager;
|
||||
singletons.gameManager.eventManager = eventManager;
|
||||
singletons.eventManager.timerManager = timerManager;
|
||||
singletons.eventManager.gameManager = gameManager;
|
||||
},
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ class EventManager {
|
||||
this.io = null;
|
||||
this.publisher = null;
|
||||
this.subscriber = null;
|
||||
this.timerManager = null;
|
||||
this.gameManager = null;
|
||||
this.instanceId = instanceId;
|
||||
EventManager.instance = this;
|
||||
@@ -185,7 +184,6 @@ class EventManager {
|
||||
const event = Events.find((event) => event.id === eventId);
|
||||
const additionalVars = {
|
||||
gameManager: this.gameManager,
|
||||
timerManager: this.timerManager,
|
||||
eventManager: this,
|
||||
requestingSocketId: requestingSocketId,
|
||||
ackFn: ackFn,
|
||||
|
||||
@@ -22,18 +22,16 @@ class GameManager {
|
||||
logger.info('CREATING SINGLETON GAME MANAGER');
|
||||
this.logger = logger;
|
||||
this.environment = environment;
|
||||
this.timerManager = null;
|
||||
this.eventManager = null;
|
||||
this.namespace = null;
|
||||
this.instanceId = instanceId;
|
||||
this.timers = {}; // Map of accessCode -> ServerTimer instance
|
||||
this.timers = {};
|
||||
GameManager.instance = this;
|
||||
}
|
||||
|
||||
getActiveGame = async (accessCode) => {
|
||||
const r = await this.eventManager.publisher.get(accessCode);
|
||||
if (r === null && this.timers[accessCode]) {
|
||||
// Clean up orphaned timer
|
||||
this.timers[accessCode].stopTimer();
|
||||
delete this.timers[accessCode];
|
||||
}
|
||||
@@ -119,11 +117,8 @@ class GameManager {
|
||||
);
|
||||
this.timers[game.accessCode] = timer;
|
||||
|
||||
// Start timer in paused state initially (pausedInitially = true)
|
||||
// Timer must be explicitly resumed by moderator
|
||||
timer.runTimer(true).then(async () => {
|
||||
this.logger.debug('Timer finished for ' + game.accessCode);
|
||||
// Trigger END_TIMER event
|
||||
game = await this.getActiveGame(game.accessCode);
|
||||
if (game) {
|
||||
await this.eventManager.handleEventById(
|
||||
@@ -147,7 +142,6 @@ class GameManager {
|
||||
)
|
||||
);
|
||||
}
|
||||
// Clean up timer instance
|
||||
delete this.timers[game.accessCode];
|
||||
});
|
||||
game.startTime = new Date().toJSON();
|
||||
@@ -157,7 +151,6 @@ class GameManager {
|
||||
const timer = this.timers[game.accessCode];
|
||||
if (timer) {
|
||||
this.logger.debug('Timer found for game ' + game.accessCode);
|
||||
// stopTimer() pauses the timer by clearing the setTimeout
|
||||
timer.stopTimer();
|
||||
return timer.currentTimeInMillis;
|
||||
}
|
||||
@@ -178,14 +171,12 @@ class GameManager {
|
||||
if (socketId) {
|
||||
const timer = this.timers[game.accessCode];
|
||||
if (timer) {
|
||||
// Timer is running on this instance, emit directly
|
||||
this.namespace.to(socketId).emit(
|
||||
GAME_PROCESS_COMMANDS.GET_TIME_REMAINING,
|
||||
timer.currentTimeInMillis,
|
||||
game.timerParams.paused
|
||||
);
|
||||
} else {
|
||||
// Timer not running on this instance, return stored value
|
||||
if (game.timerParams) {
|
||||
this.namespace.to(socketId).emit(
|
||||
GAME_PROCESS_COMMANDS.GET_TIME_REMAINING,
|
||||
@@ -295,7 +286,6 @@ class GameManager {
|
||||
}
|
||||
|
||||
restartGame = async (game, namespace) => {
|
||||
// stop any outstanding timers
|
||||
const timer = this.timers[game.accessCode];
|
||||
if (timer) {
|
||||
this.logger.info('Stopping timer for: ' + game.accessCode);
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
// TimerManager is now deprecated - timer logic has been moved to GameManager
|
||||
// This class is kept as a stub to maintain compatibility with existing dependency injection
|
||||
class TimerManager {
|
||||
constructor (logger, instanceId) {
|
||||
if (TimerManager.instance) {
|
||||
throw new Error('The server tried to instantiate more than one TimerManager');
|
||||
}
|
||||
logger.info('CREATING SINGLETON TIMER MANAGER (deprecated - timers now managed by GameManager)');
|
||||
this.logger = logger;
|
||||
this.instanceId = instanceId;
|
||||
TimerManager.instance = this;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = TimerManager;
|
||||
@@ -2,14 +2,13 @@
|
||||
const Game = require('../../../../server/model/Game');
|
||||
const { ENVIRONMENTS, EVENT_IDS, USER_TYPES, STATUS, GAME_PROCESS_COMMANDS } = require('../../../../server/config/globals.js');
|
||||
const GameManager = require('../../../../server/modules/singletons/GameManager.js');
|
||||
const TimerManager = require('../../../../server/modules/singletons/TimerManager.js');
|
||||
const EventManager = require('../../../../server/modules/singletons/EventManager.js');
|
||||
const Events = require('../../../../server/modules/Events.js');
|
||||
const GameStateCurator = require('../../../../server/modules/GameStateCurator.js');
|
||||
const logger = require('../../../../server/modules/Logger.js')(false);
|
||||
|
||||
describe('Events', () => {
|
||||
let gameManager, namespace, socket, game, timerManager, eventManager;
|
||||
let gameManager, namespace, socket, game, eventManager;
|
||||
|
||||
beforeAll(() => {
|
||||
spyOn(logger, 'debug');
|
||||
@@ -19,7 +18,6 @@ describe('Events', () => {
|
||||
namespace = { in: () => { return inObj; }, to: () => { return toObj; }, sockets: new Map() };
|
||||
socket = { id: '123', emit: () => {}, to: () => { return { emit: () => {} }; } };
|
||||
gameManager = GameManager.instance ? GameManager.instance : new GameManager(logger, ENVIRONMENTS.PRODUCTION, 'test');
|
||||
timerManager = TimerManager.instance ? TimerManager.instance : new TimerManager(logger, 'test');
|
||||
eventManager = EventManager.instance ? EventManager.instance : new EventManager(logger, 'test');
|
||||
gameManager.setGameSocketNamespace(namespace);
|
||||
eventManager.publisher = { publish: (...args) => {} };
|
||||
@@ -55,7 +53,6 @@ describe('Events', () => {
|
||||
spyOn(eventManager.publisher, 'publish').and.callThrough();
|
||||
spyOn(eventManager, 'createMessageToPublish').and.stub();
|
||||
namespace.sockets = new Map();
|
||||
timerManager.timerThreads = {};
|
||||
gameManager.timers = {};
|
||||
});
|
||||
|
||||
@@ -275,7 +272,7 @@ describe('Events', () => {
|
||||
game.timerParams = {};
|
||||
spyOn(gameManager, 'runTimer').and.callFake(() => {});
|
||||
await Events.find((e) => e.id === EVENT_IDS.START_GAME)
|
||||
.stateChange(game, { id: 'b', assigned: true }, { gameManager: gameManager, timerManager: timerManager });
|
||||
.stateChange(game, { id: 'b', assigned: true }, { gameManager: gameManager });
|
||||
expect(game.status).toEqual(STATUS.IN_PROGRESS);
|
||||
expect(game.timerParams.paused).toEqual(true);
|
||||
expect(gameManager.runTimer).toHaveBeenCalled();
|
||||
@@ -368,7 +365,7 @@ describe('Events', () => {
|
||||
gameManager.timers = { ABCD: mockTimer };
|
||||
const stopTimerSpy = spyOn(mockTimer, 'stopTimer').and.callThrough();
|
||||
await Events.find((e) => e.id === EVENT_IDS.END_GAME)
|
||||
.stateChange(game, { id: 'b', assigned: true }, { gameManager: gameManager, timerManager: timerManager, logger: { trace: () => {} } });
|
||||
.stateChange(game, { id: 'b', assigned: true }, { gameManager: gameManager, logger: { trace: () => {} } });
|
||||
expect(game.status).toEqual(STATUS.ENDED);
|
||||
expect(game.people.find(p => p.id === 'b').revealed).toBeTrue();
|
||||
expect(stopTimerSpy).toHaveBeenCalled();
|
||||
@@ -537,7 +534,7 @@ describe('Events', () => {
|
||||
gameManager.timers = { ABCD: mockTimer };
|
||||
spyOn(gameManager.timers.ABCD, 'stopTimer').and.callThrough();
|
||||
await Events.find((e) => e.id === EVENT_IDS.RESTART_GAME)
|
||||
.stateChange(game, { personId: 'b' }, { gameManager: gameManager, timerManager: timerManager, instanceId: '111', senderInstanceId: '222' });
|
||||
.stateChange(game, { personId: 'b' }, { gameManager: gameManager, instanceId: '111', senderInstanceId: '222' });
|
||||
expect(mockTimer.stopTimer).toHaveBeenCalled();
|
||||
expect(Object.keys(gameManager.timers).length).toEqual(0);
|
||||
});
|
||||
@@ -546,7 +543,7 @@ describe('Events', () => {
|
||||
gameManager.timers = { ABCD: mockTimer };
|
||||
spyOn(gameManager.timers.ABCD, 'stopTimer').and.callThrough();
|
||||
await Events.find((e) => e.id === EVENT_IDS.RESTART_GAME)
|
||||
.stateChange(game, { personId: 'b' }, { gameManager: gameManager, timerManager: timerManager, instanceId: '111', senderInstanceId: '111' });
|
||||
.stateChange(game, { personId: 'b' }, { gameManager: gameManager, instanceId: '111', senderInstanceId: '111' });
|
||||
expect(mockTimer.stopTimer).not.toHaveBeenCalled();
|
||||
expect(Object.keys(gameManager.timers).length).toEqual(1);
|
||||
});
|
||||
@@ -577,7 +574,6 @@ describe('Events', () => {
|
||||
await Events.find((e) => e.id === EVENT_IDS.TIMER_EVENT)
|
||||
.communicate(game, {}, {
|
||||
gameManager: gameManager,
|
||||
timerManager: timerManager,
|
||||
eventManager: eventManager,
|
||||
instanceId: 'test',
|
||||
timerEventSubtype: GAME_PROCESS_COMMANDS.GET_TIME_REMAINING,
|
||||
@@ -592,7 +588,6 @@ describe('Events', () => {
|
||||
await Events.find((e) => e.id === EVENT_IDS.TIMER_EVENT)
|
||||
.communicate(game, {}, {
|
||||
gameManager: gameManager,
|
||||
timerManager: timerManager,
|
||||
eventManager: eventManager,
|
||||
timerEventSubtype: GAME_PROCESS_COMMANDS.GET_TIME_REMAINING,
|
||||
requestingSocketId: '2',
|
||||
|
||||
@@ -4,12 +4,11 @@ const globals = require('../../../../../server/config/globals');
|
||||
const USER_TYPES = globals.USER_TYPES;
|
||||
const STATUS = globals.STATUS;
|
||||
const GameManager = require('../../../../../server/modules/singletons/GameManager.js');
|
||||
const TimerManager = require('../../../../../server/modules/singletons/TimerManager.js');
|
||||
const EventManager = require('../../../../../server/modules/singletons/EventManager.js');
|
||||
const logger = require('../../../../../server/modules/Logger.js')(false);
|
||||
|
||||
describe('GameManager', () => {
|
||||
let gameManager, timerManager, eventManager, namespace, socket, game;
|
||||
let gameManager, eventManager, namespace, socket, game;
|
||||
|
||||
beforeAll(() => {
|
||||
spyOn(logger, 'debug');
|
||||
@@ -19,11 +18,9 @@ describe('GameManager', () => {
|
||||
namespace = { in: () => { return inObj; }, to: () => { return inObj; } };
|
||||
socket = { id: '123', emit: () => {}, to: () => { return { emit: () => {} }; } };
|
||||
gameManager = GameManager.instance ? GameManager.instance : new GameManager(logger, globals.ENVIRONMENTS.PRODUCTION, 'test');
|
||||
timerManager = TimerManager.instance ? TimerManager.instance : new TimerManager(logger, 'test');
|
||||
eventManager = EventManager.instance ? EventManager.instance : new EventManager(logger, 'test');
|
||||
eventManager.publisher = { publish: async (...a) => {} };
|
||||
gameManager.eventManager = eventManager;
|
||||
gameManager.timerManager = timerManager;
|
||||
gameManager.setGameSocketNamespace(namespace);
|
||||
spyOn(gameManager, 'refreshGame').and.callFake(async () => {});
|
||||
spyOn(eventManager.publisher, 'publish').and.callFake(async () => {});
|
||||
@@ -32,7 +29,7 @@ describe('GameManager', () => {
|
||||
beforeEach(() => {
|
||||
spyOn(namespace, 'to').and.callThrough();
|
||||
spyOn(socket, 'to').and.callThrough();
|
||||
timerManager.timerThreads = {};
|
||||
gameManager.timers = {};
|
||||
game = new Game(
|
||||
'ABCD',
|
||||
STATUS.LOBBY,
|
||||
|
||||
Reference in New Issue
Block a user