339 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			7.6 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(...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;
 |