cloud-run-websockets/chat-with-sessions/storage.js (64 lines of code) (raw):

const { promisify } = require("util"); const redisClient = require('redis').createClient( process.env.REDISPORT, process.env.REDISHOST ); async function addMessageToCache(roomName, msg) { let room = await getRoomFromCache(roomName); if (room) { room.messages.push(msg); } else { room = { room: roomName, messages: [msg] } } redisClient.set(roomName, JSON.stringify(room)); addMessageToDb(room); } async function addMessageToDb(data) { const room = messageDb.find(messages => messages.room == data.room); if (room) { Object.assign(room, data); } else { messageDb.push(data); } } async function getRoomFromCache(roomName) { const redisGet = promisify(redisClient.get).bind(redisClient); const redisExists = promisify(redisClient.exists).bind(redisClient); if (!(await redisExists(roomName))) { const room = getRoomFromDatabase(roomName); if (room) { redisClient.set(roomName, JSON.stringify(room)); } } return JSON.parse(await redisGet(roomName)); } function getRoomFromDatabase(roomName) { return messageDb.find(messages => messages.room == roomName); } const messageDb = [ { room: 'my-room', messages: [ {user: 'Chris', text: 'Hi!'}, {user: 'Chris', text: 'How are you!?'}, {user: 'Megan', text: 'Doing well!'}, {user: 'Chris', text: 'That\'s great'}, ], }, { room: 'new-room', messages: [ {user: 'Chris', text: 'The project is due tomorrow'}, {user: 'Chris', text: 'I am wrapping up the final pieces'}, {user: 'Chris', text: 'Are you ready for the presentation'}, {user: 'Megan', text: 'Of course!'}, ], }, ]; module.exports = { getRoomFromCache, addMessageToCache }