UNPKG

@acuris/leprechaun-cache

Version:

Caching library that supports double checked caching and stale returns to avoid stampede and slow responses

80 lines 2.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const uuid_1 = require("uuid"); function lockKey(key) { return `LOCK-${key}`; } class RedisCacheStore { constructor(redisClient) { this.redisClient = redisClient; } get(key) { return new Promise((resolve, reject) => { this.redisClient.get(key, (error, result) => { if (error) { reject(error); } if (!result) { resolve(null); } resolve(JSON.parse(result)); }); }); } set(key, data, ttl) { return new Promise((resolve, reject) => { this.redisClient.set(key, JSON.stringify(data), 'PX', ttl, (error, result) => { if (error) { reject(error); } if (result === 'OK') { resolve(true); } resolve(false); }); }); } del(key) { return new Promise((resolve, reject) => { this.redisClient.del(key, (error, res) => { if (error) { reject(error); } resolve(res > 0); }); }); } lock(key, ttl) { const lockId = uuid_1.v4(); return new Promise((resolve, reject) => { this.redisClient.set(lockKey(key), lockId, 'PX', ttl, 'NX', (error, result) => { if (error) { reject(error); } if (result === 'OK') { resolve(lockId); } resolve(false); }); }); } unlock(key, lockId) { return new Promise((resolve, reject) => { this.redisClient.get(lockKey(key), (error, result) => { if (!error && result && result === lockId) { this.redisClient.del(lockKey(key), err => { if (err) { reject(err); } resolve(true); }); } else { resolve(false); } }); }); } } exports.RedisCacheStore = RedisCacheStore; //# sourceMappingURL=redis-cache-store.js.map