remove unnecessary redis client, set up dynamic redis connection

This commit is contained in:
AlecM33
2023-01-21 16:25:21 -05:00
parent 3b707c8601
commit b81c7dfb8a
4 changed files with 70 additions and 58 deletions

View File

@@ -32,15 +32,9 @@
singletons.eventManager.timerManager = timerManager.instance; singletons.eventManager.timerManager = timerManager.instance;
singletons.eventManager.gameManager = GameManager.instance; singletons.eventManager.gameManager = GameManager.instance;
try {
await singletons.eventManager.client.connect();
logger.info('Root Redis client connected');
} catch(e) {
reject(new Error('UNABLE TO CONNECT TO REDIS because: '+ e));
}
await singletons.eventManager.createGameSyncSubscriber(singletons.gameManager, singletons.eventManager);
await singletons.eventManager.createRedisPublisher(); await singletons.eventManager.createRedisPublisher();
await singletons.eventManager.createGameSyncSubscriber(singletons.gameManager, singletons.eventManager);
const socketServer = singletons.eventManager.createSocketServer(webServer, app, port); const socketServer = singletons.eventManager.createSocketServer(webServer, app, port);
singletons.gameManager.setGameSocketNamespace(singletons.eventManager.createGameSocketNamespace(socketServer, logger, singletons.gameManager)); singletons.gameManager.setGameSocketNamespace(singletons.eventManager.createGameSocketNamespace(socketServer, logger, singletons.gameManager));

View File

@@ -21,8 +21,8 @@ router.post('/sockets/broadcast', function (req, res) {
router.get('/games/state', async (req, res) => { router.get('/games/state', async (req, res) => {
const gamesArray = []; const gamesArray = [];
const keys = await eventManager.client.keys('*'); const keys = await eventManager.publisher.keys('*');
const values = await eventManager.client.mGet(keys); const values = await eventManager.publisher.mGet(keys);
values.forEach((v) => { values.forEach((v) => {
let parsedGame; let parsedGame;
try { try {

View File

@@ -10,7 +10,6 @@ class EventManager {
} }
logger.info('CREATING SINGLETON EVENT MANAGER'); logger.info('CREATING SINGLETON EVENT MANAGER');
this.logger = logger; this.logger = logger;
this.client = redis.createClient();
this.io = null; this.io = null;
this.publisher = null; this.publisher = null;
this.subscriber = null; this.subscriber = null;
@@ -24,56 +23,75 @@ class EventManager {
this.io?.emit(globals.EVENTS.BROADCAST, message); this.io?.emit(globals.EVENTS.BROADCAST, message);
}; };
createRedisPublisher = async () => { createRedisPublisher = () => {
this.publisher = redis.createClient(); return new Promise((resolve, reject) => {
this.publisher.on('error', (e) => { this.publisher = process.env.NODE_ENV.trim() === 'development'
this.logger.error('REDIS PUBLISHER CLIENT ERROR:', e); ? redis.createClient()
: redis.createClient({
url: process.env.REDIS_URL
});
this.publisher.on('error', (e) => {
this.logger.error('REDIS PUBLISHER CLIENT ERROR:', e);
});
try {
this.publisher.connect();
resolve();
} catch (e) {
reject(new Error('UNABLE TO CONNECT TO REDIS because: ' + e));
}
this.logger.info('EVENT MANAGER - CREATED PUBLISHER');
}); });
await this.publisher.connect();
this.logger.info('EVENT MANAGER - CREATED PUBLISHER');
} }
createGameSyncSubscriber = async (gameManager, eventManager) => { createGameSyncSubscriber = (gameManager, eventManager) => {
this.subscriber = this.client.duplicate(); return new Promise((resolve, reject) => {
this.subscriber.on('error', (e) => { this.subscriber = this.publisher.duplicate();
this.logger.error('REDIS SUBSCRIBER CLIENT ERROR:', e); this.subscriber.on('error', (e) => {
}); this.logger.error('REDIS SUBSCRIBER CLIENT ERROR:', e);
await this.subscriber.connect(); });
await this.subscriber.subscribe(globals.REDIS_CHANNELS.ACTIVE_GAME_STREAM, async (message) => {
this.logger.debug('MESSAGE: ' + message);
let messageComponents, args;
try { try {
messageComponents = message.split(';', 3); this.subscriber.connect();
if (messageComponents[messageComponents.length - 1] === this.instanceId) { resolve();
this.logger.trace('Disregarding self-authored message'); this.logger.info('EVENT MANAGER - CREATED SUBSCRIBER');
} catch (e) {
reject(new Error('UNABLE TO CONNECT TO REDIS because: ' + e));
}
this.subscriber.subscribe(globals.REDIS_CHANNELS.ACTIVE_GAME_STREAM, async (message) => {
this.logger.debug('MESSAGE: ' + message);
let messageComponents, args;
try {
messageComponents = message.split(';', 3);
if (messageComponents[messageComponents.length - 1] === this.instanceId) {
this.logger.trace('Disregarding self-authored message');
return;
}
args = JSON.parse(
message.slice(
message.indexOf(messageComponents[messageComponents.length - 1]) + (globals.INSTANCE_ID_LENGTH + 1)
)
);
} catch (e) {
this.logger.error('MALFORMED MESSAGE RESULTED IN ERROR: ' + e + '; DISREGARDING');
return; return;
} }
args = JSON.parse( if (messageComponents) {
message.slice( const game = await gameManager.getActiveGame(messageComponents[0]);
message.indexOf(messageComponents[messageComponents.length - 1]) + (globals.INSTANCE_ID_LENGTH + 1) if (game) {
) await eventManager.handleEventById(
); messageComponents[1],
} catch (e) { messageComponents[messageComponents.length - 1],
this.logger.error('MALFORMED MESSAGE RESULTED IN ERROR: ' + e + '; DISREGARDING'); game,
return; null,
} game?.accessCode || messageComponents[0],
if (messageComponents) { args || null,
const game = await gameManager.getActiveGame(messageComponents[0]); null,
if (game) { true
await eventManager.handleEventById( );
messageComponents[1], }
messageComponents[messageComponents.length - 1],
game,
null,
game?.accessCode || messageComponents[0],
args || null,
null,
true
);
} }
} });
}); });
this.logger.info('EVENT MANAGER - CREATED SUBSCRIBER');
} }
createMessageToPublish = (...args) => { createMessageToPublish = (...args) => {

View File

@@ -21,7 +21,7 @@ class GameManager {
} }
getActiveGame = async (accessCode) => { getActiveGame = async (accessCode) => {
const r = await this.eventManager.client.get(accessCode); const r = await this.eventManager.publisher.get(accessCode);
if (r === null && this.timerManager.timerThreads[accessCode]) { if (r === null && this.timerManager.timerThreads[accessCode]) {
if (!this.timerManager.timerThreads[accessCode].killed) { if (!this.timerManager.timerThreads[accessCode].killed) {
this.timerManager.timerThreads[accessCode].kill(); this.timerManager.timerThreads[accessCode].kill();
@@ -45,7 +45,7 @@ class GameManager {
refreshGame = async (game) => { refreshGame = async (game) => {
this.logger.debug('PUSHING REFRESH OF ' + game.accessCode); this.logger.debug('PUSHING REFRESH OF ' + game.accessCode);
await this.eventManager.client.set(game.accessCode, JSON.stringify(game), { await this.eventManager.publisher.set(game.accessCode, JSON.stringify(game), {
KEEPTTL: true, KEEPTTL: true,
XX: true // only set the key if it already exists XX: true // only set the key if it already exists
}); });
@@ -85,7 +85,7 @@ class GameManager {
new Date().toJSON(), new Date().toJSON(),
req.timerParams req.timerParams
); );
await this.eventManager.client.set(newAccessCode, JSON.stringify(newGame), { await this.eventManager.publisher.set(newAccessCode, JSON.stringify(newGame), {
EX: globals.STALE_GAME_SECONDS EX: globals.STALE_GAME_SECONDS
}); });
return Promise.resolve({ accessCode: newAccessCode, cookie: moderator.cookie, environment: this.environment }); return Promise.resolve({ accessCode: newAccessCode, cookie: moderator.cookie, environment: this.environment });
@@ -151,7 +151,7 @@ class GameManager {
const charCount = charPool.length; const charCount = charPool.length;
let codeDigits, accessCode; let codeDigits, accessCode;
let attempts = 0; let attempts = 0;
while (!accessCode || ((await this.eventManager.client.keys('*')).includes(accessCode) while (!accessCode || ((await this.eventManager.publisher.keys('*')).includes(accessCode)
&& attempts < globals.ACCESS_CODE_GENERATION_ATTEMPTS)) { && attempts < globals.ACCESS_CODE_GENERATION_ATTEMPTS)) {
codeDigits = []; codeDigits = [];
let iterations = globals.ACCESS_CODE_LENGTH; let iterations = globals.ACCESS_CODE_LENGTH;
@@ -162,7 +162,7 @@ class GameManager {
accessCode = codeDigits.join(''); accessCode = codeDigits.join('');
attempts ++; attempts ++;
} }
return (await this.eventManager.client.keys('*')).includes(accessCode) return (await this.eventManager.publisher.keys('*')).includes(accessCode)
? null ? null
: accessCode; : accessCode;
}; };