forked from coolaj86/walnut.js
		
	
		
			
				
	
	
		
			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;
 |