diff --git a/keyserver/src/utils/redis-cache.js b/keyserver/src/utils/redis-cache.js new file mode 100644 --- /dev/null +++ b/keyserver/src/utils/redis-cache.js @@ -0,0 +1,51 @@ +// @flow + +import type { RedisClient } from 'redis'; +import redis from 'redis'; + +import type { NeynarChannel } from 'lib/types/farcaster-types.js'; + +import { redisConfig } from '../socket/redis.js'; + +class RedisCache { + cacheClient: RedisClient; + + constructor() { + this.cacheClient = redis.createClient(redisConfig); + } + + setChannelInfo(fcChannelID: string, fcChannel: NeynarChannel): Promise { + const stringifiedChannelInfo = JSON.stringify(fcChannel); + return new Promise((resolve, reject) => { + this.cacheClient.set( + `channel:${fcChannelID}`, + stringifiedChannelInfo, + 'EX', + 600, // item expires after 10 minutes + err => { + if (err) { + return reject(err); + } + return resolve(); + }, + ); + }); + } + + getChannelInfo(fcChannelID: string): Promise { + return new Promise((resolve, reject) => { + this.cacheClient.get(`channel:${fcChannelID}`, (err, result) => { + if (err) { + return reject(err); + } + // Reset the expiration when the cached data is successfully retrieved + this.cacheClient.expire(`channel:${fcChannelID}`, 600); + return resolve(result ? JSON.parse(result) : null); + }); + }); + } +} + +const redisCache: RedisCache = new RedisCache(); + +export { redisCache };