haro-memcached
Version:
Memcached persistent storage adapter for Harō
70 lines (60 loc) • 1.59 kB
JavaScript
/**
* Memcached persistent storage adapter for Harō
*
* @author Jason Mulligan <jason.mulligan@avoidwork.com>
* @copyright 2015
* @license BSD-3-Clause
* @link https://github.com/avoidwork/haro-memcached
* @version 1.0.5
*/
;
var deferred = require("tiny-defer");
var Map = require("es6-map");
var Memcached = require("memcached");
var registry = new Map();
function getClient(id, locations, options) {
if (!registry.has(id)) {
registry.set(id, new Memcached(locations, options));
}
return registry.get(id);
}
function adapter(store, op, key, data) {
var defer = deferred(),
record = key !== undefined,
config = store.adapters.memcached,
prefix = config.prefix || store.id,
lkey = prefix + (record ? "_" + key : ""),
client = getClient(store.id, config.locations, config.options);
if (op === "get") {
client.get(lkey, function (e, reply) {
var result = JSON.parse(reply ? reply.toString() : null);
if (e) {
defer.reject(e);
} else if (result) {
defer.resolve(result);
} else if (record) {
defer.reject(new Error("Record not found in memcached"));
} else {
defer.resolve([]);
}
});
} else if (op === "remove") {
client.del(lkey, function (e) {
if (e) {
defer.reject(e);
} else {
defer.resolve(true);
}
});
} else if (op === "set") {
client.set(lkey, JSON.stringify(record ? data : store.toArray()), config.ttl || 0, function (e) {
if (e) {
defer.reject(e);
} else {
defer.resolve(true);
}
});
}
return defer.promise;
}
module.exports = adapter;