'use strict'; const net = require('net'), tls = require('tls'), eventParser = require('./eventParser.js'), Pubsub = require('event-pubsub'), Message = require('js-message'), fs = require('fs'), Queue = require('js-queue'); function init(config,log){ let client={ config : config, queue : new Queue, socket : false, connect : connect, emit : emit, log : log, retriesRemaining:config.maxRetries||0 }; new Pubsub(client); return client; } function emit(type,data){ this.log('dispatching event to '.debug, (this.id).variable, this.path.variable,' : ', type.data,',', data); let message=new Message; message.type=type; message.data=data; if(this.config.rawBuffer){ message=new Buffer(type,this.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 '.debug, (this.id).variable, this.path.variable,' : ', message.data); 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 '.debug, client.id.variable, client.path.variable); if(!this.path){ client.log('\n\n######\nerror: '.error, client.id .info,' client has not specified socket path it wishes to connect to.'.error); return; } if(!client.port){ client.log('Connecting client on Unix Socket :'.debug, client.path.variable); 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'.debug, client.path.variable ,client.port); client.socket = net.connect( { port:client.port, host:client.path } ); }else{ client.log('Connecting client via TLS to'.debug, client.path.variable ,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