node-ipc/services/IPC.js

339 lines
7.7 KiB
JavaScript
Raw Normal View History

2016-01-11 15:59:40 +11:00
'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);
2016-01-11 15:59:40 +11:00
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
}
);
2016-01-11 15:59:40 +11:00
}
2017-06-26 11:22:16 +10:00
this.config.logger(
2016-01-11 15:59:40 +11:00
args.join(' ')
);
}
function disconnect(id){
if(!this.of[id]){
return;
}
this.of[id].explicitlyDisconnected=true;
2016-01-11 15:59:40 +11:00
2016-08-13 07:07:03 +10:00
this.of[id].off('*','*');
2016-01-11 15:59:40 +11:00
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";
}
2016-01-11 15:59:40 +11:00
}
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;