ravel
Version:
Ravel Rapid Application Development Framework
92 lines (81 loc) • 2.94 kB
JavaScript
'use strict';
const EventEmitter = require('events').EventEmitter;
const sRavelInstance = Symbol('ravelInstance');
/**
* Shorthand for adapting callbacks to `Promise`s.
*
* @param {Function} resolve - A resolve function.
* @param {Function} reject - A reject function.
* @private
*/
function finishBasicPromise(resolve, reject) {
return (err, res) => {
if (err) {
return reject(err);
} else {
return resolve(res);
}
};
}
/**
* Replacement for koa-redis
*
* @private
*/let
RedisSessionStore = class RedisSessionStore extends EventEmitter {
constructor(ravelInstance) {
super();
this[sRavelInstance] = ravelInstance;
this[sRavelInstance].kvstore.on('connect', this.emit.bind(this, 'connect'));
if (this[sRavelInstance].kvstore.connected) {
this.emit('connect');
}
this[sRavelInstance].kvstore.on('error', this.emit.bind(this, 'error'));
this[sRavelInstance].kvstore.on('end', this.emit.bind(this, 'end'));
this[sRavelInstance].kvstore.on('end', this.emit.bind(this, 'disconnect')); // For backwards compatibility
this[sRavelInstance].kvstore.on('connect', this.emit.bind(this, 'connect'));
this[sRavelInstance].kvstore.on('reconnecting', this.emit.bind(this, 'reconnecting'));
this[sRavelInstance].kvstore.on('ready', this.emit.bind(this, 'ready'));
this[sRavelInstance].kvstore.on('warning', this.emit.bind(this, 'warning'));
}
get connected() {
return this[sRavelInstance].kvstore.connected;
}
get(sid) {
return new Promise((resolve, reject) => {
this[sRavelInstance].kvstore.get(sid, (err, res) => {
if (err) {
return reject(err);
} else if (res !== null && res !== undefined) {
return resolve(JSON.parse(res));
} else {
return resolve(null);
}
});
});
}
set(sid, sess, ttl) {
return new Promise((resolve, reject) => {
if (typeof ttl === 'number') {
ttl = Math.ceil(ttl / 1000);
}
const jsess = JSON.stringify(sess);
if (ttl !== undefined) {
this[sRavelInstance].kvstore.setex(sid, ttl, jsess, finishBasicPromise(resolve, reject));
} else {
this[sRavelInstance].kvstore.set(sid, jsess, finishBasicPromise(resolve, reject));
}
});
}
destroy(sid) {
return new Promise((resolve, reject) => {
this[sRavelInstance].kvstore.del(sid, finishBasicPromise(resolve, reject));
});
}
quit() {
// Do nothing. We'll let ravel manage its own redis connection - we're just borrowing it.
}
end() {
this.quit();
}};
module.exports = RedisSessionStore;