| '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; |