/* abstract */ class MessageStore { saveMessage(message) {} findMessagesForUser(userID) {} } class InMemoryMessageStore extends MessageStore { constructor() { super(); this.messages = []; } saveMessage(message) { this.messages.push(message); } findMessagesForUser(userID) { return this.messages.filter( ({ from, to }) => from === userID || to === userID ); } } const CONVERSATION_TTL = 24 * 60 * 60; class RedisMessageStore extends MessageStore { constructor(redisClient) { super(); this.redisClient = redisClient; } saveMessage(message) { const value = JSON.stringify(message); const multi = this.redisClient.multi(); multi.rpush(`messages:${message.from}`, value); // Only push to recipient if different from sender if (message.from !== message.to) { multi.rpush(`messages:${message.to}`, value); } multi .expire(`messages:${message.from}`, CONVERSATION_TTL) .expire(`messages:${message.to}`, CONVERSATION_TTL) .exec(); } findMessagesForUser(userID) { return this.redisClient .lrange(`messages:${userID}`, 0, -1) .then((results) => { return results.map((result) => JSON.parse(result)); }); } } module.exports = { InMemoryMessageStore, RedisMessageStore, };