UNPKG

restartable

Version:

a simple way to restart your app without actually restarting node.js

81 lines (66 loc) 1.98 kB
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;