@nodefony/http-bundle
Version:
Nodefony Framework Bundle HTTP
209 lines (187 loc) • 6.2 kB
JavaScript
const Memcached = require('memcached');
nodefony.register.call(nodefony.session.storage, "memcached", function() {
const checkClient = function(contextSession) {
let client = null;
if (contextSession && contextSession !== "undefined") {
if (this.clients[contextSession]) {
client = this.clients[contextSession];
} else {
throw ("client Memcached not found error context : " + contextSession);
}
} else {
if (this.clients["default"]) {
client = this.clients["default"];
} else {
throw ("client Memcached not found error context ", null);
}
}
return client;
};
const memcacheGC = function( /*client, msMaxlifetime*/ ) {};
const memcachedSessionStorage = class memcachedSessionStorage {
constructor(manager) {
this.manager = manager;
this.gc_maxlifetime = manager.settings.gc_maxlifetime;
this.contextSessions = [];
this.settings = manager.settings.memcached;
this.options = this.settings.options;
this.servers = {};
this.clients = {};
for (let server in this.settings.servers) {
let port = this.settings.servers[server].port ? this.settings.servers[server].port : 11211;
let host = this.settings.servers[server].location;
let weight = this.settings.servers[server].weight ? this.settings.servers[server].weight : 1;
this.servers[host + ":" + port] = weight;
}
}
log(pci, severity, msgid, msg) {
let syslog = this.manager;
if (!msgid) {
msgid = "MEMCACHED SESSION STORAGE";
}
return syslog.log(pci, severity || "DEBUG", msgid, msg);
}
start(id, contextSession) {
try {
return this.read(id, contextSession);
} catch (e) {
throw e;
}
}
open(contextSession) {
this.clients[contextSession] = new Memcached(this.servers, nodefony.extend({}, this.options, {
namespace: contextSession
}));
/*this.clients[contextSession].stats(function(error, stats){
this.stats = stats ;
}.bind(this));*/
this.clients[contextSession].on('issue', (details) => {
if (details.failures) {
this.log(details.message, "ERROR");
} else {
this.log(details.message, "INFO");
}
});
this.clients[contextSession].on('failure', (details) => {
this.log("Server " + details.server + "went down due to: " + details.messages.join(''), "ERROR");
});
this.clients[contextSession].on('reconnecting', (details) => {
this.log("Total downtime caused by server " + details.server + " :" + details.totalDownTime + "ms", "INFO");
});
this.gc(this.gc_maxlifetime, contextSession);
return true;
}
close() {
this.gc(this.gc_maxlifetime);
return true;
}
destroy(id, contextSession) {
return new Promise((resolve, reject) => {
let client = null;
try {
client = checkClient.call(this, contextSession);
} catch (e) {
this.log(e, "ERROR");
return reject(e);
}
client.get(id, (err /*, data*/ ) => {
if (err) {
this.log(" context : " + contextSession + " ID : " + id + " DESTROY ERROR", "ERROR");
return reject(err);
}
client.del(id, (err) => {
if (err) {
this.log(" context : " + contextSession + " ID : " + id + " DESTROY ERROR", "ERROR");
return reject(err);
}
this.log(" DESTROY SESSION context : " + contextSession + " ID : " + id + " DELETED");
return resolve(id);
});
});
});
}
gc(maxlifetime, contextSession) {
let msMaxlifetime = ((maxlifetime || this.gc_maxlifetime) * 1000);
if (contextSession) {
if (this.clients[contextSession]) {
memcacheGC.call(this, this.clients[contextSession], msMaxlifetime);
}
} else {
for (var client in this.clients) {
memcacheGC.call(this, this.clients[client], msMaxlifetime);
}
}
}
read(id, contextSession /*, callback*/ ) {
return new Promise((resolve, reject) => {
let client = null;
try {
client = checkClient.call(this, contextSession);
} catch (e) {
this.log(e, "ERROR");
return reject(e);
}
try {
client.get(id, function(err, data) {
if (err) {
return reject(err);
}
if (data) {
return resolve(JSON.parse(data));
} else {
return resolve({});
}
});
} catch (e) {
this.log(e, "ERROR");
return reject(e);
}
});
}
write(id, serialize, contextSession /*, callback*/ ) {
return new Promise((resolve, reject) => {
let client = null;
try {
client = checkClient.call(this, contextSession);
} catch (e) {
this.log(e, "ERROR");
return reject(e);
}
try {
client.get(id, (err, data) => {
if (err) {
return reject(err);
}
if (data) {
try {
client.replace(id, JSON.stringify(serialize), this.gc_maxlifetime, (err /*, result*/ ) => {
if (err) {
return reject(err);
}
return resolve(serialize);
});
} catch (e) {
return reject(e);
}
} else {
try {
client.set(id, JSON.stringify(serialize), this.gc_maxlifetime, (err /*, result*/ ) => {
if (err) {
return reject(err);
}
return resolve(serialize);
});
} catch (e) {
return reject(e);
}
}
});
} catch (e) {
this.log(e, "ERROR");
return reject(e);
}
});
}
};
return memcachedSessionStorage;
});