UNPKG

@zapscloud/zapssession

Version:
204 lines (175 loc) 5.4 kB
/*! * Zapscloud Session */ var debug = require('debug')('zapssession:main') var noop = function () {}; /** * One day in seconds. */ var oneDay = 86400; function getTTL(store, sess) { var maxAge = sess.cookie && sess.cookie.maxAge ? sess.cookie.maxAge : null; return store.ttl || (typeof maxAge === 'number' ? Math.floor(maxAge / 1000) : oneDay); } module.exports = function (session) { var Store = session.Store function ZapsSession(options) { if (!(this instanceof ZapsSession)) { throw new TypeError('Cannot call ZapsSession constructor as a function'); } if (!options.zapsdb) { throw new Error('A client must be directly provided to the ZapsDB Session') } options = options || {}; this.prefix = options.prefix || 'sess'; Store.call(this, options); this.ttl = options.ttl; this.zapsdb = options.zapsdb this.collection = (options.collection == null ? 'zaps_session' : `zaps_${options.collection}`) debug('Check and create session ', this.collection) check_create_session_collection(this.zapsdb, this.collection) .then(function (response) { debug('Session collection created'); }) .catch(function (err) { debug('Error on GET', err); }); } ZapsSession.prototype.__proto__ = Store.prototype; ZapsSession.prototype.get = function (sid, fn) { debug('GET "%s"', sid); fn = fn || noop; sid = this.prefix + sid; var zapsdb = this.zapsdb; var collection = this.collection; zapsdb.getOne(collection, sid) .then(function (data) { return fn(null, data); }) .catch(function (err) { debug('Error on GET', err); if (err.error_code == '400') { debug('Error 400') return fn(); } else { debug('Error ', err.error_code ) return fn(err); } }); }; ZapsSession.prototype.set = function (sid, sess, fn) { debug('SET session "%s"', sid, this.collection); fn = fn || noop; sid = this.prefix + sid; var ttl = getTTL(this, sess); var zapsdb = this.zapsdb; var collection = this.collection; sess.sid = sid; sess.expiry = ttl; debug(sess); debug(collection, sid); zapsdb.getOne(collection, sid) .then(function (getresponse) { debug('Update ', sid, sess) delete sess._id; return zapsdb.updateOne(collection, sid, sess); }) .catch(function (err) { debug('Get One Err', err) debug('Insert', sess) return zapsdb.insertOne(collection, sess); }) .then(function (data) { debug('Data', data); fn(null, data); }) .catch(function (err) { debug('Error on SET', err); return fn(err); }) }; ZapsSession.prototype.destroy = function (sid, fn) { debug('DESTROY session "%s"', sid); fn = fn || noop; sid = this.prefix + sid; var zapsdb = this.zapsdb; var collection = this.collection; zapsdb.deleteOne(collection, sid) .then(function(data){ debug('Deleted ', data); return fn(null, data); }) .catch(function (err) { debug('Error on DESTROY', err); return fn(err); }); } ZapsSession.prototype.touch = function (sid, sess, fn) { // re-post data to refresh TTL debug('TOUCH session "%s"', sid); fn = fn || noop; sid = this.prefix + sid; var self = this; var zapsdb = this.zapsdb; var collection = this.collection; zapsdb.getOne(collection, sid) .then(function (data) { // update TTL var currentSession = data; currentSession.cookie = sess.cookie; var ttl = getTTL(self, sess); // update zapsdb.updateOne(collection, sid, ttl) .then(function () { fn(null, null); }) .catch(function (err) { debug('Error on TOUCH - failed updating', err); return fn(err); }); }) .catch(function (err) { debug('Error on TOUCH - session not found', err); return fn(err); }); }; ZapsSession.prototype.clear = function (fn) { fn = fn || noop; this.zapsdb.deleteMany(this.collection) .then(function (data) { debug('Response Query', data) fn(null, null); }) .catch(function (err) { debug('Error Get Details', err) return fn(err); }) } function check_create_session_collection(zapsdb, collection) { return new Promise((resolve, reject) => { debug('Get Collection ', collection) zapsdb.getCollection(collection) .then(function (response) { debug('Success Get collection ', response) resolve(response) }) .catch(function (err) { debug('Error Get Collection ', err.status) if (err.status && err.status == 410) { zapsdb.createCollection(collection, 'sid', 'Zaps Session Stroage') .then(function (response) { debug('Collection created for session ') resolve(response) }) .catch(function (err) { debug('Session collection create error ', err) reject(err); }) } else { reject(err); } }); }); } return ZapsSession; }