Files
30-seconds-of-code/node_modules/cache-manager/lib/stores/memory.js
2019-08-20 15:52:05 +02:00

173 lines
4.3 KiB
JavaScript

var Lru = require("lru-cache");
var utils = require('../utils');
var isObject = utils.isObject;
var memoryStore = function(args) {
args = args || {};
var self = {};
self.name = 'memory';
var Promise = args.promiseDependency || global.Promise;
self.usePromises = (typeof Promise === 'undefined' || args.noPromises) ? false : true;
var ttl = args.ttl;
var lruOpts = {
max: args.max || 500,
maxAge: (ttl || ttl === 0) ? ttl * 1000 : null,
dispose: args.dispose,
length: args.length,
stale: args.stale
};
var lruCache = new Lru(lruOpts);
var setMultipleKeys = function setMultipleKeys(keysValues, maxAge) {
var length = keysValues.length;
var values = [];
for (var i = 0; i < length; i += 2) {
lruCache.set(keysValues[i], keysValues[i + 1], maxAge);
values.push(keysValues[i + 1]);
}
return values;
};
self.set = function(key, value, options, cb) {
if (typeof options === 'function') {
cb = options;
options = {};
}
options = options || {};
var maxAge = (options.ttl || options.ttl === 0) ? options.ttl * 1000 : lruOpts.maxAge;
lruCache.set(key, value, maxAge);
if (cb) {
process.nextTick(cb.bind(null, null));
} else if (self.usePromises) {
return Promise.resolve(value);
}
};
self.mset = function() {
var args = Array.prototype.slice.apply(arguments);
var cb;
var options = {};
if (typeof args[args.length - 1] === 'function') {
cb = args.pop();
}
if (args.length % 2 > 0 && isObject(args[args.length - 1])) {
options = args.pop();
}
var maxAge = (options.ttl || options.ttl === 0) ? options.ttl * 1000 : lruOpts.maxAge;
var values = setMultipleKeys(args, maxAge);
if (cb) {
process.nextTick(cb.bind(null, null));
} else if (self.usePromises) {
return Promise.resolve(values);
}
};
self.get = function(key, options, cb) {
if (typeof options === 'function') {
cb = options;
}
var value = lruCache.get(key);
if (cb) {
process.nextTick(cb.bind(null, null, value));
} else if (self.usePromises) {
return Promise.resolve(value);
} else {
return value;
}
};
self.mget = function() {
var args = Array.prototype.slice.apply(arguments);
var cb;
var options = {};
if (typeof args[args.length - 1] === 'function') {
cb = args.pop();
}
if (isObject(args[args.length - 1])) {
options = args.pop();
}
var values = args.map(function(key) {
return lruCache.get(key);
});
if (cb) {
process.nextTick(cb.bind(null, null, values));
} else if (self.usePromises) {
return Promise.resolve(values);
} else {
return values;
}
};
self.del = function() {
var args = Array.prototype.slice.apply(arguments);
var cb;
var options = {};
if (typeof args[args.length - 1] === 'function') {
cb = args.pop();
}
if (isObject(args[args.length - 1])) {
options = args.pop();
}
if (Array.isArray(args[0])) {
args = args[0];
}
args.forEach(function(key) {
lruCache.del(key);
});
if (cb) {
process.nextTick(cb.bind(null, null));
} else if (self.usePromises) {
return Promise.resolve();
}
};
self.reset = function(cb) {
lruCache.reset();
if (cb) {
process.nextTick(cb.bind(null, null));
} else if (self.usePromises) {
return Promise.resolve();
}
};
self.keys = function(cb) {
var keys = lruCache.keys();
if (cb) {
process.nextTick(cb.bind(null, null, keys));
} else if (self.usePromises) {
return Promise.resolve(keys);
} else {
return keys;
}
};
return self;
};
var methods = {
create: function(args) {
return memoryStore(args);
}
};
module.exports = methods;