@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
JavaScript
;
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