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