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.
		
		
		
		
			
				
					339 lines
				
				7.6 KiB
			
		
		
			
		
	
	
					339 lines
				
				7.6 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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;
							 |