UNPKG

global-event-handler

Version:

A hierarchical global event handler. Runs as its own fork or standalone server and syncs events acros forks and or servers

116 lines (104 loc) 4.64 kB
//import {globalEventHandlerServer} from './server'; import {globalEventHandlerClient, globalEvent, globalEventLissener} from './client' import {Observable,Subject} from 'rxjs' export {globalEventHandlerClient, globalEvent, globalEventLissener} from './client'; export class globalEventHandler implements globalEventHandlerOptions { private _port:number = 9838; public get port() : number { return this._port; } private _client:boolean = true; public get client() : boolean { return this._client; } private _server:boolean = true; public get server() : boolean { return this._server; } private _serverAddress:string = 'localhost'; public get serverAddress() : string { return this._serverAddress; } private _globalEventHandlerClient:globalEventHandlerClient; public get globalEventHandlerClient() : globalEventHandlerClient { return this._globalEventHandlerClient } private _debug = false; private _pm2 = false; pm2:any constructor(options:globalEventHandlerOptions = {}){ let me = this; for(var _o in options){ this['_' + _o] = options[_o]; } if(this._pm2) this.pm2 = require('pm2'); if(this._server){ const cluster = require('cluster'); if(cluster.isMaster){ let args = []; if(this._debug) args.push('--debug=5859') if(!this._pm2) this.loanchServer(require('child_process').fork(__dirname + '/server.js',[], {execArgv: args})); else{ this.pm2.connect(function(err){ console.log({err:err}) me.pm2.list(function(err,pList){ //console.log(pList) var pi = pList.find(function(pp){ console.log(pp.pm2_env.status) return pp.name == 'server' && pp.pm2_env.status != 'stopped' }) if(pi) console.log(pi.pm2_env.pm_id) if(pi) me.pm2.sendDataToProcessId(pi.pm2_env.pm_id,{topic:'process:msg',data:{ event: 'connect', port: me._port }},function(err){ console.log({err:err}) }) else{ var c = me.pm2.start({script:__dirname + '/server.js',function (error,apps) { console.log({error:error}) console.log({apps:apps}) }}) var pi = pList.find(function(pp){ //console.log(pp.name) return pp.name == 'server' && pp.pm2_env.status != 'stopped' }) if(pi) me.pm2.sendDataToProcessId({type:'process:msg',data:{ event: 'connect', port: me.port },id:pi.pm2_env.pm_id},function(err){ console.log({err:err}) }) } }) }) } } } if(this._client){ this._globalEventHandlerClient = new globalEventHandlerClient(this._port,this._serverAddress) ; } } private loanchServer(server){ let me = this; server.send({event:'connect',port:this._port}); server.on('exit', (code, signal) => { if( signal ) { if(me._debug) console.log(`globalEventServer was killed by signal: ${signal}`); } else if( code !== 0 ) { if(me._debug) console.log(`globalEventServer exited with error code: ${code}`); let args = []; if(me._debug) args.push('--debug=5859'); me.loanchServer(require('child_process').fork(__dirname + '/server.js',[], {execArgv: args})); } else { if(me._debug) console.log('globalEventServer died!'); } }); let ON_DEATH = require('death')({uncaughtException: true}) ON_DEATH(function(signal, err) { server.kill('SIGINT'); }) } } export interface globalEventHandlerOptions{ port?:number, client?:boolean, server?:boolean, serverAddress?:string, debug?:boolean, pm2?:boolean }