vue-express-mongo-boilerplate
Version:
Express NodeJS application server boilerplate with Mongo and VueJS
126 lines (112 loc) • 2.47 kB
JavaScript
;
let config = require("../../config");
let logger = require("../logger");
let redis = require("../redis");
let _ = require("lodash");
/**
* Cacher factory for memory cache
*
* Similar: https://github.com/mpneuried/nodecache/blob/master/_src/lib/node_cache.coffee
*
* @class Cacher
*/
class Cacher {
/**
* Creates an instance of Cacher.
*
* @param {any} type
* @param {any} prefix
* @param {any} ttl
*
* @memberOf Cacher
*/
constructor(prefix, ttl) {
//logger.debug("Memory Cacher created. Prefix: " + prefix);
// Cache container
this.cache = {};
this.prefix = prefix ? prefix + ":" : "";
this.ttl = ttl;
if (ttl) {
this.timer = setInterval(() => {
this.checkTTL();
}, 30 * 1000);
}
}
/**
* Get data from cache by key
*
* @param {any} key
* @returns {Promise}
*
* @memberOf Cacher
*/
get(key) {
return new Promise((resolve, reject) => {
let item = this.cache[this.prefix + key];
if (item) {
logger.debug(`[Cacher] GET ${this.prefix}${key}`);
resolve(item.data);
// Update expire time (hold in the cache if we are using it)
item.expire = Date.now() + this.ttl * 1000;
}
else
resolve(null);
});
}
/**
* Save data to cache by key
*
* @param {any} key
* @param {any} data JSON object
* @returns {Promise}
*
* @memberOf Cacher
*/
set(key, data) {
this.cache[this.prefix + key] = {
data: data,
expire: Date.now() + this.ttl * 1000
};
logger.debug(`[Cacher] SET ${this.prefix}${key}`);
return Promise.resolve(data);
}
/**
* Delete a key from cache
*
* @param {any} key
* @returns {Promise}
*
* @memberOf Cacher
*/
del(key) {
delete this.cache[this.prefix + key];
logger.debug(`[Cacher] DEL ${this.prefix}${key}`);
return Promise.resolve();
}
/**
* Clean cache. Remove every key by prefix
* @param {any} match Match string for SCAN. Default is "*"
* @returns {Promise}
*
* @memberOf Cacher
*/
clean(match) {
// TODO: match not supported yet
logger.debug(`[Cacher] CLEAR ${this.prefix}*`);
this.cache = {};
return Promise.resolve();
}
checkTTL() {
let self = this;
let now = Date.now();
let keys = Object.keys(this.cache);
keys.forEach((key) => {
let item = this.cache[key];
if (item.expire && item.expire < now) {
logger.debug(`[Cacher] EXPIRED ${key}`);
delete self.cache[key];
}
});
}
}
module.exports = Cacher;