walnut.js/lib/master.js

99 lines
2.5 KiB
JavaScript

'use strict';
var cluster = require('cluster');
var PromiseA = require('bluebird');
var path = require('path');
var os = require('os');
function init(conf, state) {
var newConf = {};
function rand(n) {
var HEX = 16;
var BASE_36 = 36;
var rnd = require('crypto').randomBytes(n || 16).toString('hex');
return parseInt(rnd, HEX).toString(BASE_36);
}
if (!conf.ipcKey) {
conf.ipcKey = newConf.ipcKey = rand(16);
}
if (!conf.sqlite3Sock) {
conf.sqlite3Sock = newConf.sqlite3Sock = path.join(os.tmpdir(), 'sqlite3.' + rand(8) + '.sock');
}
if (!conf.memstoreSock) {
conf.memstoreSock = newConf.memstoreSock = path.join(os.tmpdir(), 'memstore.' + rand(8) + '.sock');
}
try {
require('fs').unlinkSync(conf.memstoreSock);
} catch(e) {
if ('ENOENT' !== e.code) {
console.error(e.stack);
console.error(JSON.stringify(e));
}
// ignore
}
try {
require('fs').unlinkSync(conf.sqlite3Sock);
} catch(e) {
if ('ENOENT' !== e.code) {
console.error(e.stack);
console.error(JSON.stringify(e));
}
// ignore
}
var cstore = require('cluster-store');
var sqlite3 = require('sqlite3-cluster/server');
var cstoreOpts = {
sock: conf.memstoreSock
, serve: cluster.isMaster && conf.memstoreSock
, store: cluster.isMaster && null //new require('express-session/session/memory')()
// TODO implement
, key: conf.ipcKey
};
var cstorePromise = cstore.create(cstoreOpts);
var promise = PromiseA.all([
cstorePromise.then(function (store) {
console.log('[walnut] [master] cstore created');
//console.log(cstoreOpts);
//console.log(store);
return store;
})
, sqlite3.createServer({
verbose: null
, sock: conf.sqlite3Sock
, ipcKey: conf.ipcKey
})/*.then(function () {
var sqlite3 = require('sqlite3-cluster/client');
return sqliet3.createClientFactory(...);
})*/
]).then(function (args) {
state.memstore = args[0];
//state.sqlstore = args[1];
newConf.addWorker = function (w) {
return cstorePromise.addWorker(w);
};
return newConf;
});
return promise;
}
function touch(conf, state) {
if (!state.initialize) {
state.initialize = init(conf, state);
}
// TODO if no xyz worker, start on xyz worker (unlock, for example)
return state.initialize.then(function (newConf) {
// TODO conf.locked = true|false;
conf.initialized = true;
return newConf;
});
}
module.exports.init = init;
module.exports.touch = touch;