grind-cache
Version:
Cache provider for Grind, powered by node-cache-manager
106 lines (86 loc) • 10.8 kB
JavaScript
"use strict";
function _isnil(val) { return val === null || typeof val === 'undefined'; }
class DatabaseStore {
constructor(options) {
this.db = null;
this.name = 'database';
this.table = null;
this.ttl = null;
this.usePromises = true;
this.db = options.connection;
this.table = options.table || 'cache';
this.ttl = options.ttl || 60;
this.usePromises = options.noPromises !== true;
}
set(key, value, options, callback) {
if (typeof options === 'function') {
callback = options;
options = {};
}
options = options || {};
value = JSON.stringify(value) || null;
const expires = new Date(Date.now() + (options.ttl || this.ttl) * 1000);
const values = {
key,
value,
expires_at: expires
};
return this._wrapPromise(callback, this.db(this.table).insert(values).catch(() => this.db(this.table).where({
key
}).update(values)));
}
get(key, options, callback) {
if (typeof options === 'function') {
callback = options;
}
return this._wrapPromise(callback, this.db(this.table).where({
key
}).first().then(value => {
if (_isnil(value)) {
return null;
}
if (value.expires_at < Date.now()) {
return this.del(key).catch(() => null).then(() => null);
}
value = JSON.parse(value.value);
if (typeof value.type === 'string' && value.type === 'Buffer') {
return new Buffer(value.data);
}
return value;
}));
}
del(key, options, callback) {
if (typeof options === 'function') {
callback = options;
}
return this._wrapPromise(callback, this.db(this.table).where({
key
}).delete());
}
reset(callback) {
return this._wrapPromise(callback, this.db(this.table).delete());
}
keys(callback) {
return this._wrapPromise(callback, this.db(this.table).select('key').then(keys => keys.map(key => key.key)));
}
_wrapPromise(callback, promise) {
return promise.then(value => {
if (_isnil(callback)) {
return value;
}
process.nextTick(callback.bind(null, null, value));
}).catch(err => {
if (_isnil(callback)) {
throw err;
}
process.nextTick(callback.bind(null, err));
});
}
static create(options) {
return new this(options.options);
}
}
module.exports = {
create: DatabaseStore.create.bind(DatabaseStore)
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9EYXRhYmFzZVN0b3JlLmpzIl0sIm5hbWVzIjpbIkRhdGFiYXNlU3RvcmUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJkYiIsIm5hbWUiLCJ0YWJsZSIsInR0bCIsInVzZVByb21pc2VzIiwiY29ubmVjdGlvbiIsIm5vUHJvbWlzZXMiLCJzZXQiLCJrZXkiLCJ2YWx1ZSIsImNhbGxiYWNrIiwiSlNPTiIsInN0cmluZ2lmeSIsImV4cGlyZXMiLCJEYXRlIiwibm93IiwidmFsdWVzIiwiZXhwaXJlc19hdCIsIl93cmFwUHJvbWlzZSIsImluc2VydCIsImNhdGNoIiwid2hlcmUiLCJ1cGRhdGUiLCJnZXQiLCJmaXJzdCIsInRoZW4iLCJkZWwiLCJwYXJzZSIsInR5cGUiLCJCdWZmZXIiLCJkYXRhIiwiZGVsZXRlIiwicmVzZXQiLCJrZXlzIiwic2VsZWN0IiwibWFwIiwicHJvbWlzZSIsInByb2Nlc3MiLCJuZXh0VGljayIsImJpbmQiLCJlcnIiLCJjcmVhdGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsTUFBTUEsYUFBTixDQUFvQjtBQU9uQkMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVU7QUFBQSxTQU5yQkMsRUFNcUIsR0FOaEIsSUFNZ0I7QUFBQSxTQUxyQkMsSUFLcUIsR0FMZCxVQUtjO0FBQUEsU0FKckJDLEtBSXFCLEdBSmIsSUFJYTtBQUFBLFNBSHJCQyxHQUdxQixHQUhmLElBR2U7QUFBQSxTQUZyQkMsV0FFcUIsR0FGUCxJQUVPO0FBQ3BCLFNBQUtKLEVBQUwsR0FBVUQsT0FBTyxDQUFDTSxVQUFsQjtBQUNBLFNBQUtILEtBQUwsR0FBYUgsT0FBTyxDQUFDRyxLQUFSLElBQWlCLE9BQTlCO0FBQ0EsU0FBS0MsR0FBTCxHQUFXSixPQUFPLENBQUNJLEdBQVIsSUFBZSxFQUExQjtBQUNBLFNBQUtDLFdBQUwsR0FBbUJMLE9BQU8sQ0FBQ08sVUFBUixLQUF1QixJQUExQztBQUNBOztBQUVEQyxFQUFB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Q29udGVudCI6WyJjbGFzcyBEYXRhYmFzZVN0b3JlIHtcblx0ZGIgPSBudWxsXG5cdG5hbWUgPSAnZGF0YWJhc2UnXG5cdHRhYmxlID0gbnVsbFxuXHR0dGwgPSBudWxsXG5cdHVzZVByb21pc2VzID0gdHJ1ZVxuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHR0aGlzLmRiID0gb3B0aW9ucy5jb25uZWN0aW9uXG5cdFx0dGhpcy50YWJsZSA9IG9wdGlvbnMudGFibGUgfHwgJ2NhY2hlJ1xuXHRcdHRoaXMudHRsID0gb3B0aW9ucy50dGwgfHwgNjBcblx0XHR0aGlzLnVzZVByb21pc2VzID0gb3B0aW9ucy5ub1Byb21pc2VzICE9PSB0cnVlXG5cdH1cblxuXHRzZXQoa2V5LCB2YWx1ZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcblx0XHRpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNhbGxiYWNrID0gb3B0aW9uc1xuXHRcdFx0b3B0aW9ucyA9IHt9XG5cdFx0fVxuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblx0XHR2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKSB8fCBudWxsXG5cblx0XHRjb25zdCBleHBpcmVzID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIChvcHRpb25zLnR0bCB8fCB0aGlzLnR0bCkgKiAxMDAwKVxuXHRcdGNvbnN0IHZhbHVlcyA9IHsga2V5LCB2YWx1ZSwgZXhwaXJlc19hdDogZXhwaXJlcyB9XG5cblx0XHRyZXR1cm4gdGhpcy5fd3JhcFByb21pc2UoXG5cdFx0XHRjYWxsYmFjayxcblx0XHRcdHRoaXMuZGIodGhpcy50YWJsZSlcblx0XHRcdFx0Lmluc2VydCh2YWx1ZXMpXG5cdFx0XHRcdC5jYXRjaCgoKSA9PiB0aGlzLmRiKHRoaXMudGFibGUpLndoZXJlKHsga2V5IH0pLnVwZGF0ZSh2YWx1ZXMpKSxcblx0XHQpXG5cdH1cblxuXHRnZXQoa2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y2FsbGJhY2sgPSBvcHRpb25zXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX3dyYXBQcm9taXNlKFxuXHRcdFx0Y2FsbGJhY2ssXG5cdFx0XHR0aGlzLmRiKHRoaXMudGFibGUpXG5cdFx0XHRcdC53aGVyZSh7IGtleSB9KVxuXHRcdFx0XHQuZmlyc3QoKVxuXHRcdFx0XHQudGhlbih2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0aWYgKHZhbHVlLmlzTmlsKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbnVsbFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh2YWx1ZS5leHBpcmVzX2F0IDwgRGF0ZS5ub3coKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuZGVsKGtleSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKCgpID0+IG51bGwpXG5cdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IG51bGwpXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlLnZhbHVlKVxuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZS50eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50eXBlID09PSAnQnVmZmVyJykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG5ldyBCdWZmZXIodmFsdWUuZGF0YSlcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWVcblx0XHRcdFx0fSksXG5cdFx0KVxuXHR9XG5cblx0ZGVsKGtleSwgb3B0aW9ucywgY2FsbGJhY2spIHtcblx0XHRpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNhbGxiYWNrID0gb3B0aW9uc1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl93cmFwUHJvbWlzZShjYWxsYmFjaywgdGhpcy5kYih0aGlzLnRhYmxlKS53aGVyZSh7IGtleSB9KS5kZWxldGUoKSlcblx0fVxuXG5cdHJlc2V0KGNhbGxiYWNrKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3dyYXBQcm9taXNlKGNhbGxiYWNrLCB0aGlzLmRiKHRoaXMudGFibGUpLmRlbGV0ZSgpKVxuXHR9XG5cblx0a2V5cyhjYWxsYmFjaykge1xuXHRcdHJldHVybiB0aGlzLl93cmFwUHJvbWlzZShcblx0XHRcdGNhbGxiYWNrLFxuXHRcdFx0dGhpcy5kYih0aGlzLnRhYmxlKVxuXHRcdFx0XHQuc2VsZWN0KCdrZXknKVxuXHRcdFx0XHQudGhlbihrZXlzID0+IGtleXMubWFwKGtleSA9PiBrZXkua2V5KSksXG5cdFx0KVxuXHR9XG5cblx0X3dyYXBQcm9taXNlKGNhbGxiYWNrLCBwcm9taXNlKSB7XG5cdFx0cmV0dXJuIHByb21pc2Vcblx0XHRcdC50aGVuKHZhbHVlID0+IHtcblx0XHRcdFx0aWYgKGNhbGxiYWNrLmlzTmlsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLmJpbmQobnVsbCwgbnVsbCwgdmFsdWUpKVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChlcnIgPT4ge1xuXHRcdFx0XHRpZiAoY2FsbGJhY2suaXNOaWwpIHtcblx0XHRcdFx0XHR0aHJvdyBlcnJcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2suYmluZChudWxsLCBlcnIpKVxuXHRcdFx0fSlcblx0fVxuXG5cdHN0YXRpYyBjcmVhdGUob3B0aW9ucykge1xuXHRcdHJldHVybiBuZXcgdGhpcyhvcHRpb25zLm9wdGlvbnMpXG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGNyZWF0ZTogRGF0YWJhc2VTdG9yZS5jcmVhdGUuYmluZChEYXRhYmFzZVN0b3JlKSxcbn1cbiJdfQ==