UNPKG

onionskin

Version:

Multilayer Cache Manager for JavaScript

99 lines (86 loc) 2.61 kB
module.exports = Memcached; var Promise = require('bluebird'); var Utils = require('./utils'); function Memcached(serverLocations, options) { var MemcachedLib = require('memcached'); this.client = new MemcachedLib(serverLocations, options); this._set = Promise.promisify(this.client.set, this.client); this._get = Promise.promisify(this.client.get, this.client); this._del = Promise.promisify(this.client.del, this.client); this._incr = Promise.promisify(this.client.incr, this.client); this.flush = Promise.promisify(this.client.flush, this.client); } Memcached.available = (function () { try { require.resolve('memcached'); return true; } catch (err) { return false; } })(); Memcached.prototype.put = function (key, value, expiration) { var that = this; value = Utils.assemble(value, expiration); return this._key(key).then(function (key) { that._set(key, value, expiration || 604800); }); }; Memcached.prototype.get = function (key) { var that = this; return this._key(key).then(function (key) { return that._get(key); }).then(function (data) { return data ? JSON.parse(data) : (data || null); }); }; Memcached.prototype.delete = function (key) { var that = this; return this._key(key).then(function (key) { key = key.replace(/\d+$/, '_ns'); return that._incr(key, 1); }); }; Memcached.prototype.isLocked = function (key) { var that = this; return this._key(key).then(function (key) { return that._get(key + '_lock').then(function (locked) { return Boolean(locked); }); }); }; Memcached.prototype.lock = function (key) { var that = this; return this._key(key).then(function (key) { return that._set(key + '_lock', 1, 60); }); }; Memcached.prototype.unlock = function (key) { var that = this; return this._key(key).then(function (key) { return that._del(key + '_lock'); }); }; Memcached.prototype._key = function (key) { var that = this; key = Utils.key([], key); return Promise.reduce(key.split('/'), function (path, key) { path.push(key); return that._get(path.join('/') + '_ns').then(function (count) { var commit = function (path, key, count) { path.pop(); path.push(key + count); return path; }; if (count === false) { count = Date.now(); return that._set(path.join('/') + '_ns', count, 0).then(function () { return commit(path, key, count); }); } else { return commit(path, key, count); } }); }, []).then(function (key) { return key.join('/'); }); };