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.6 KiB
						
					
					
				
			
		
		
	
	
							338 lines
						
					
					
						
							7.6 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;
 | 
						|
 |