| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 | '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;
 |