You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
338 lines
7.9 KiB
338 lines
7.9 KiB
'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;
|
|
|