node-ipc/services/IPC.js
Mostafa Samir ec45f36ae0 updated comment by removing mention of windows
any syetem that has it first network interface on ipv6 will also fail if udp4 was bound on it, not just windows
2016-04-01 22:06:00 +02:00

338 lines
7.7 KiB
JavaScript

'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(){
if(this.config.silent){
return;
}
const args=Array.prototype.slice.call(arguments);
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
}
);
}
console.log(
args.join(' ')
);
}
function disconnect(id){
if(!this.of[id]){
return;
}
this.of[id].config.stopRetrying=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'.notice,
'ipc.config.socketRoot + ipc.config.appspace + ipc.config.id'.variable,
(this.config.socketRoot+this.config.appspace+this.config.id).data
);
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'.notice,
'ipc.config.networkHost'.variable,
this.config.networkHost.data
);
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'.notice,
'ipc.config.networkPort'.variable,
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'.warn,
'Requested service connection without specifying service id. Aborting connection attempt'.notice
);
return;
}
if(!path){
this.log(
'Service path not specified, so defaulting to'.notice,
'ipc.config.socketRoot + ipc.config.appspace + id'.variable,
(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'.notice,
id.variable,
'- So executing success without connection'.notice
);
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'.warn,
'Requested service connection without specifying service id. Aborting connection attempt'.notice
);
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'.notice,
'ipc.config.networkHost'.variable,
this.config.networkHost.data
);
host=this.config.networkHost;
}
if(typeof port=='function'){
callback=port;
port=false;
}
if(!port){
this.log(
'Server port not specified, so defaulting to'.notice,
'ipc.config.networkPort'.variable,
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'.notice,
id.variable,
'- So executing success without connection'.notice
);
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 = host;
this.of[id].port = port;
this.of[id].connect();
callback(this);
}
module.exports=IPC;