99 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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;
 |