import * as redis from 'redis'; import { getLogger } from './loggers'; const logger = getLogger('redis'); export default class { private client: redis.RedisClient; private expireAfter: number; constructor(opt: IRedisConfig) { this.client = redis.createClient({ host: opt.redisHost, port: opt.redisPort, }); this.expireAfter = opt.redisExpireTime; logger.info(`loaded redis service at ${opt.redisHost}:${opt.redisPort}`); } private chatAsString = (chat: IChat) => `${chat.chatType}:${chat.chatID.toString()}`; public cacheContent = (contentId: string, content: string) => new Promise<'OK'>((resolve, reject) => this.client.set(`content/${contentId}`, content, 'EX', 3600 * 24, (err, res) => err ? reject(err) : resolve(res) ) ).then(res => { logger.debug(`cached content ${contentId}, result: ${res}`); }).catch((err: Error) => { logger.error(`failed to cache content ${contentId}, error: ${err}`); }); public cacheForChat = (postId: string, target: IChat) => { const targetStr = this.chatAsString(target); return new Promise<'OK'>((resolve, reject) => this.client.set(`sent/${targetStr}/${postId}`, 'true', 'EX', this.expireAfter, (err, res) => err ? reject(err) : resolve(res) ) ).then(res => { logger.debug(`cached post ${postId} for ${targetStr}, result: ${res}`); }).catch((err: Error) => { logger.error(`failed to cache post ${postId} for ${targetStr}, error: ${err}`); }); }; public getContent = (contentId: string) => new Promise((resolve, reject) => this.client.get(`content/${contentId}`, (err, res) => err ? reject(err) : resolve(res)) ).then(res => { logger.debug(`retrieved cached content ${contentId}, result: ${res}`); return res; }).catch((err: Error) => { logger.error(`failed to retrieve cached content ${contentId}, error: ${err}`); throw err; }); public isCachedForChat = (postId: string, target: IChat) => { const targetStr = this.chatAsString(target); return new Promise((resolve, reject) => this.client.exists(`sent/${targetStr}/${postId}`, (err, res) => err ? reject(err) : resolve(res)) ).then(res => { logger.debug(`retrieved status of post ${postId} for ${targetStr}, result: ${res}`); return Boolean(res); }).catch((err: Error) => { logger.error(`failed to retrieve status of post ${postId} for ${targetStr}, error: ${err}`); return false; }); }; }