node-cache-redis
Version:
Simplistic node redis cache ready can scale with generic-pool support
225 lines (224 loc) • 9.39 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.wrap = exports.deleteAll = exports.del = exports.keys = exports.get = exports.getset = exports.set = exports.unsetDefaultTtlInS = exports.setDefaultTtlInS = exports.getDefaultTtlInS = exports.getStatus = exports.getPoolOptions = exports.getRedisOptions = exports.getName = exports.getStore = exports.init = void 0;
var debug_1 = __importDefault(require("debug"));
var RedisStore_1 = __importDefault(require("./RedisStore"));
var NotInitialisedError_1 = __importDefault(require("./error/NotInitialisedError"));
var helpers_1 = require("./helpers");
var debug = debug_1.default('nodeCacheRedis');
var store;
/**
* @param options
* @param options.name - Name your cache store
* @param options.redisOptions - opts from [node_redis#options-object-properties]{@link https://github.com/NodeRedis/node_redis#options-object-properties}
* @param options.poolOptions - opts from [node-pool#createpool]{@link https://github.com/coopernurse/node-pool#createpool}
* @param options.logger - Inject your custom logger
* @param options.defaultTtlInS - Number of seconds to store by default
*/
var init = function (options) {
if (store)
return;
var _a = options || {}, name = _a.name, logger = _a.logger, defaultTtlInS = _a.defaultTtlInS;
store = new RedisStore_1.default(__assign(__assign({}, options), { name: name || "redisCache-" + helpers_1.genRandomStr(), logger: helpers_1.createLogger(logger), defaultTtlInS: helpers_1.validatedTtl(defaultTtlInS) }));
};
exports.init = init;
/**
* Returns cache store
*/
var getStore = function () {
if (!store)
throw new NotInitialisedError_1.default('RedisCache not initialised');
return store;
};
exports.getStore = getStore;
/**
* Returns name of this pool
*/
var getName = function () { return exports.getStore().getName(); };
exports.getName = getName;
/**
* Returns redisOptions of this pool
*/
var getRedisOptions = function () { return exports.getStore().getRedisOptions(); };
exports.getRedisOptions = getRedisOptions;
/**
* Returns poolOptions of this pool
*/
var getPoolOptions = function () { return exports.getStore().getPoolOptions(); };
exports.getPoolOptions = getPoolOptions;
/**
* Returns pool status and stats
*/
var getStatus = function () { return exports.getStore().status(); };
exports.getStatus = getStatus;
/**
* Return the defaultTtlInS
*/
var getDefaultTtlInS = function () {
return exports.getStore().getDefaultTtlInS();
};
exports.getDefaultTtlInS = getDefaultTtlInS;
/**
* Sets the defaultTtlInS
* @param ttl - new default ttl in seconds
*/
var setDefaultTtlInS = function (ttl) {
return exports.getStore().setDefaultTtlInS(ttl);
};
exports.setDefaultTtlInS = setDefaultTtlInS;
/**
* Unsets the defaultTtlInS
*/
var unsetDefaultTtlInS = function () { return exports.getStore().unsetDefaultTtlInS(); };
exports.unsetDefaultTtlInS = unsetDefaultTtlInS;
/**
* Returns 'OK' if successful
* @param key - key for the value stored
* @param value - value to stored
* @param ttlInSeconds - time to live in seconds
* @returns 'OK' if successful
*/
var set = function (key, value, ttlInSeconds) {
return exports.getStore().set(key, value, ttlInSeconds);
};
exports.set = set;
/**
* Returns 'OK' if successful
* @param key - key for the value stored
* @param value - value to stored
* @param ttlInSeconds - time to live in seconds
* @returns 'OK' if successful
*/
var getset = function (key, value, ttlInSeconds) {
return exports.getStore().getset(key, value, ttlInSeconds);
};
exports.getset = getset;
/**
* Returns value or null when the key is missing
* @param key - key for the value stored
* @returns value or null when the key is missing
*/
var get = function (key) { return exports.getStore().get(key); };
exports.get = get;
/**
* Returns all keys matching pattern
* @param pattern - glob-style patterns/default '*'
* @returns all keys matching pattern
*/
var keys = function (pattern) {
if (pattern === void 0) { pattern = '*'; }
return exports.getStore().keys(pattern);
};
exports.keys = keys;
/**
* Delete keys
* @param keys - keys for the value stored
* @returns The number of keys that were removed.
*/
var del = function (_keys) {
if (_keys === void 0) { _keys = []; }
return exports.getStore().del(_keys);
};
exports.del = del;
/**
* Deletes all keys matching pattern
* @param pattern - glob-style patterns/default '*'
* @returns The number of keys that were removed.
*/
var deleteAll = function (pattern) {
if (pattern === void 0) { pattern = '*'; }
return exports.getStore().deleteAll(pattern);
};
exports.deleteAll = deleteAll;
/**
* Wraps promise to set its value if not exists.
* @async
* @param key - key for the value stored
* @param fn - function to call if not cache found
* @param opts - options for wrap
* @param opts.ttlInSeconds - time to live in seconds
* @returns 'OK' if successful
*/
var wrap = function (key, fn, opts) {
if (opts === void 0) { opts = {}; }
return __awaiter(void 0, void 0, void 0, function () {
var ttl, cachedValue, value;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
ttl = helpers_1.validatedTtl(opts.ttlInSeconds, exports.getDefaultTtlInS());
if (!ttl) {
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
debug("Not caching, invalid ttl: " + ttl);
return [2 /*return*/, fn()];
}
return [4 /*yield*/, exports.getStore().get(key)];
case 1:
cachedValue = _a.sent();
if (!!cachedValue) return [3 /*break*/, 4];
debug('MISS', { key: key });
return [4 /*yield*/, Promise.resolve(fn())];
case 2:
value = _a.sent();
return [4 /*yield*/, exports.set(key, value, ttl)];
case 3:
_a.sent();
return [2 /*return*/, value];
case 4:
debug('HIT', { key: key });
return [2 /*return*/, cachedValue];
}
});
});
};
exports.wrap = wrap;