'use strict'; const net = require('net'), tls = require('tls'), eventParser = require('./eventParser.js'), Events = require('event-pubsub'), Message = require('js-message'), fs = require('fs'), Queue = require('js-queue'); class Client extends Events{ constructor(config,log,socket){ super(); Object.assign( this, { Client : Client, config : config, queue : new Queue, socket : typeof socket == 'undefined' ? false : socket, connect : connect, emit : emit, log : log, retriesRemaining:config.maxRetries||0, explicitlyDisconnected: false } ); } } function emit(type,data){ this.log('dispatching event to ', this.id, this.path, ' : ', type, ',', data); let message=new Message; message.type=type; message.data=data; if(this.config.rawBuffer){ message=new Buffer(type,this.config.encoding); }else{ message=eventParser.format(message); } if(!this.config.sync){ this.socket.write(message); return; } this.queue.add( syncEmit.bind(this,message) ); } function syncEmit(message){ this.log('dispatching event to ', this.id, this.path, ' : ', message); this.socket.write(message); } function connect(){ //init client object for scope persistance especially inside of socket events. let client=this; client.log('requested connection to ', client.id, client.path); if(!this.path){ client.log('\n\n######\nerror: ', client.id ,' client has not specified socket path it wishes to connect to.'); return; } // TODO: Typeof + is connection up check if (client.socket !== false) { client.log('Connection already set'); return; } if(!client.port){ client.log('Connecting client on Unix Socket :', client.path); let path = client.path; if (process.platform ==='win32' && !client.path.startsWith('\\\\.\\pipe\\')){ path = path.replace(/^\//, ''); path = path.replace(/\//g, '-'); path= `\\\\.\\pipe\\${path}`; } client.socket = net.connect( { path: path } ); }else{ if(!client.config.tls){ client.log('Connecting client via TCP to', client.path ,client.port); client.socket = net.connect( { port:client.port, host:client.path } ); }else{ client.log('Connecting client via TLS to', client.path ,client.port,client.config.tls); if(client.config.tls.private){ client.config.tls.key=fs.readFileSync(client.config.tls.private); } if(client.config.tls.public){ client.config.tls.cert=fs.readFileSync(client.config.tls.public); } if(client.config.tls.trustedConnections){ if(typeof client.config.tls.trustedConnections === 'string'){ client.config.tls.trustedConnections=[client.config.tls.trustedConnections]; } client.config.tls.ca=[]; for(let i=0; i