restartable
Version:
a simple way to restart your app without actually restarting node.js
81 lines (66 loc) • 1.98 kB
JavaScript
var cluster = require("cluster");
var MessageAdapter = require("message-adapter");
var _restartable = function(parClusterCode, parMainCode){
this.isRestartable = !cluster.isMaster;
if (!this.isRestartable){
this._fork.apply(this);
if (parMainCode){
parMainCode(this);
};
};
if (this.isRestartable){
this._initWorker(parClusterCode);
};
};
_restartable.prototype._initWorker = function(parFun){
this._messageAdapter = new MessageAdapter();
this._messageAdapter.on("_data", function(parJsn){
process.send(parJsn);
});
var self = this;
process.on("message", function(parJsn){
self._messageAdapter.jsonData(parJsn);
});
if (parFun){
parFun(this);
};
};
_restartable.prototype.restart = function(){
if (this.isRestartable){
cluster.worker.kill();
}else{
this.clusterInstance.kill();
};
};
_restartable.prototype._fork = function(){
var self = this;
if (this._messageAdapter){
//this._messageAdapter.destroy();
};
this._messageAdapter = new MessageAdapter();
this.clusterInstance = cluster.fork();
this.clusterInstance.on("exit", function(){
self._fork();
});
this.clusterInstance.on("message", function(parJsn){
//console.log(self._messageAdapter);
self._messageAdapter.jsonData(parJsn);
});
this._messageAdapter.on("_data", function(parJsn){
self.clusterInstance.send(parJsn);
});
};
// simply forward the emit / on functions to the adapter
_restartable.prototype.emit = function(){
return this._messageAdapter.emit.apply(this._messageAdapter, arguments);
};
_restartable.prototype.on = function(){
return this._messageAdapter.on.apply(this._messageAdapter, arguments);
};
_restartable.prototype.getSub = function(){
return this._messageAdapter.getSub.apply(this._messageAdapter, arguments);
};
var restartable = function(parClusterCode, parMainCode){
return new _restartable(parClusterCode, parMainCode);
};
module.exports = restartable;