mirror of
https://github.com/AlecM33/Werewolf.git
synced 2025-12-26 15:57:50 +01:00
remove unnecessary redis client, set up dynamic redis connection
This commit is contained in:
10
index.js
10
index.js
@@ -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));
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user