'use strict'; const Defaults = require('../entities/Defaults.js'), Client = require('../dao/client.js'), Server = require('../dao/socketServer.js'), util = require('util'); class IPC{ constructor(){ Object.defineProperties( this, { config : { enumerable:true, writable:true, value:new Defaults }, connectTo : { enumerable:true, writable:false, value:connect }, connectToNet: { enumerable:true, writable:false, value:connectNet }, disconnect : { enumerable:true, writable:false, value:disconnect }, serve : { enumerable:true, writable:false, value:serve }, serveNet : { enumerable:true, writable:false, value:serveNet }, of : { enumerable:true, writable:true, value:{} }, server : { enumerable:true, writable:true, configurable:true, value:false }, log : { enumerable:true, writable:false, value:log } } ); } } function log(...args){ if(this.config.silent){ return; } for(let i=0, count=args.length; i<count; i++){ if(typeof args[i] != 'object'){ continue; } args[i]=util.inspect( args[i], { depth:this.config.logDepth, colors:this.config.logInColor } ); } this.config.logger( args.join(' ') ); } function disconnect(id){ if(!this.of[id]){ return; } this.of[id].explicitlyDisconnected=true; this.of[id].off('*','*'); if(this.of[id].socket){ if(this.of[id].socket.destroy){ this.of[id].socket.destroy(); } } delete this.of[id]; } function serve(path,callback){ if(typeof path=='function'){ callback=path; path=false; } if(!path){ this.log( 'Server path not specified, so defaulting to', 'ipc.config.socketRoot + ipc.config.appspace + ipc.config.id', this.config.socketRoot+this.config.appspace+this.config.id ); path=this.config.socketRoot+this.config.appspace+this.config.id; } if(!callback){ callback=emptyCallback; } this.server=new Server( path, this.config, log ); this.server.on( 'start', callback ); } function emptyCallback(){ //Do Nothing } function serveNet(host,port,UDPType,callback){ if(typeof host=='number'){ callback=UDPType; UDPType=port; port=host; host=false; } if(typeof host=='function'){ callback=host; UDPType=false; host=false; port=false; } if(!host){ this.log( 'Server host not specified, so defaulting to', 'ipc.config.networkHost', this.config.networkHost ); host=this.config.networkHost; } if(host.toLowerCase()=='udp4' || host.toLowerCase()=='udp6'){ callback=port; UDPType=host.toLowerCase(); port=false; host=this.config.networkHost; } if(typeof port=='string'){ callback=UDPType; UDPType=port; port=false; } if(typeof port=='function'){ callback=port; UDPType=false; port=false; } if(!port){ this.log( 'Server port not specified, so defaulting to', 'ipc.config.networkPort', this.config.networkPort ); port=this.config.networkPort; } if(typeof UDPType=='function'){ callback=UDPType; UDPType=false; } if(!callback){ callback=emptyCallback; } this.server=new Server( host, this.config, log, port ); if(UDPType){ this.server[UDPType]=true; if(UDPType === "udp4" && host === "::1") { // bind udp4 socket to an ipv4 address this.server.path = "127.0.0.1"; } } this.server.on( 'start', callback ); } function connect(id,path,callback){ if(typeof path == 'function'){ callback=path; path=false; } if(!callback){ callback=emptyCallback; } if(!id){ this.log( 'Service id required', 'Requested service connection without specifying service id. Aborting connection attempt' ); return; } if(!path){ this.log( 'Service path not specified, so defaulting to', 'ipc.config.socketRoot + ipc.config.appspace + id', (this.config.socketRoot+this.config.appspace+id).data ); path=this.config.socketRoot+this.config.appspace+id; } if(this.of[id]){ if(!this.of[id].socket.destroyed){ this.log( 'Already Connected to', id, '- So executing success without connection' ); callback(); return; } this.of[id].socket.destroy(); } this.of[id] = new Client(this.config,this.log); this.of[id].id = id; this.of[id].path = path; this.of[id].connect(); callback(this); } function connectNet(id,host,port,callback){ if(!id){ this.log( 'Service id required', 'Requested service connection without specifying service id. Aborting connection attempt' ); return; } if(typeof host=='number'){ callback=port; port=host; host=false; } if(typeof host=='function'){ callback=host; host=false; port=false; } if(!host){ this.log( 'Server host not specified, so defaulting to', 'ipc.config.networkHost', this.config.networkHost ); host=this.config.networkHost; } if(typeof port=='function'){ callback=port; port=false; } if(!port){ this.log( 'Server port not specified, so defaulting to', 'ipc.config.networkPort', this.config.networkPort ); port=this.config.networkPort; } if(typeof callback == 'string'){ UDPType=callback; callback=false; } if(!callback){ callback=emptyCallback; } if(this.of[id]){ if(!this.of[id].socket.destroyed){ this.log( 'Already Connected to', id, '- So executing success without connection' ); callback(); return; } this.of[id].socket.destroy(); } this.of[id] = new Client(this.config,this.log); this.of[id].id = id; (this.of[id].socket)? this.of[id].socket.id=id:null; this.of[id].path = host; this.of[id].port = port; this.of[id].connect(); callback(this); } module.exports=IPC;