devir-mbclient
Version:
MB client
137 lines (99 loc) • 3.04 kB
JavaScript
/**
* Created by mac on 17.09.15.
*/
var net = require("net");
module.exports = function(remoteAddress, remotePort, onData,onConnected){
var _delimiterBegin = String.fromCharCode(191);
var _delimiterEnd = String.fromCharCode(161);
var _writeBuffer = [];
var _remoteAddress = remoteAddress;
var _remotePort = remotePort;
var _onData = onData;
var _onConnected = onConnected;
var parentclient = new net.Socket();
var connected = false;
var isReconecting = false;
var _readBuffer = "";
var _sending = false;
var getMessage = function(){
var startIndex = _readBuffer.indexOf(_delimiterBegin);
var endIndex = _readBuffer.indexOf(_delimiterEnd);
if(startIndex>-1 && endIndex>-1){
var message = _readBuffer.substring(startIndex+1, endIndex);
_readBuffer = _readBuffer.substr(endIndex+1);
return message;
}else{
return null;
}
};
var connect = function(){
var client = new net.Socket();
parentclient = client;
connected = false;
client.connect(_remotePort, _remoteAddress);
client.on('data', function(data){
var s = data.toString();
if(s.charCodeAt(0)==191 && s.charCodeAt(s.length-1)==161 && s.lastIndexOf(191)==0){
if (onData) {
onData(s.substring(1, s.length-1));
}
} else{
_readBuffer += data;
var message = getMessage();
while (message) {
if (_onData) {
_onData(message);
}
message = getMessage();
}
}
});
client.on('close', function(had_error) {
connected = false;
console.log('Timeout for 5 seconds before trying MessageBroker at:'+_remoteAddress+ ":" + _remotePort + ' again');
client.destroy();
client = null;
setTimeout(function() {
isReconecting = true;
connect(_remoteAddress, _remotePort, _onData, _onConnected);
}, 4000);
});
client.on("connect", function(){
console.log("connected");
connected = true;
if(_onConnected)
_onConnected(isReconecting);
})
client.on('error', function(e) {
});
parentclient.on('drain', function(){
isSendingFalse();
doSend();
});
}
var isSendingFalse = function(){
_sending = false;
}
var doSend = function(){
if(_writeBuffer.length>0){
if(connected){
_sending = !parentclient.write(_writeBuffer.pop());
}
else{
setTimeout(function(){
doSend();
}, 1000);
}
}
}
var send = function(object){
_writeBuffer.push(_delimiterBegin+JSON.stringify(object)+_delimiterEnd);
if(!_sending){
doSend();
}
}
return {
send: send,
connect: connect
}
}