StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.7 KiB
139 lines
4.7 KiB
exports.newFixFrameDecoder = function() {
|
|
return new fixFrameDecoder();
|
|
};
|
|
|
|
var util = require('util');
|
|
|
|
//static vars
|
|
var SOHCHAR = String.fromCharCode(1);
|
|
var ENDOFTAG8 = 10;
|
|
var STARTOFTAG9VAL = ENDOFTAG8 + 2;
|
|
var SIZEOFTAG10 = 8;
|
|
|
|
function fixFrameDecoder(){
|
|
this.buffer = '';
|
|
var self = this;
|
|
this.incoming = function(ctx, event){
|
|
if(event.type !== 'data'){
|
|
ctx.sendNext(event);
|
|
return;
|
|
}
|
|
|
|
var stream = ctx.stream;
|
|
self.buffer = self.buffer + event.data;
|
|
while (self.buffer.length > 0) {
|
|
//====================================Step 1: Extract complete FIX message====================================
|
|
|
|
//If we don't have enough data to start extracting body length, wait for more data
|
|
if (self.buffer.length <= ENDOFTAG8) {
|
|
return;
|
|
}
|
|
|
|
var _idxOfEndOfTag9Str = self.buffer.substring(ENDOFTAG8).indexOf(SOHCHAR);
|
|
var idxOfEndOfTag9 = parseInt(_idxOfEndOfTag9Str, 10) + ENDOFTAG8;
|
|
|
|
if (isNaN(idxOfEndOfTag9)) {
|
|
var error = '[ERROR] Unable to find the location of the end of tag 9. Message probably malformed: '
|
|
+ self.buffer.toString();
|
|
util.log(error);
|
|
stream.end();
|
|
ctx.sendNext({data:error, type:'error'});
|
|
return;
|
|
}
|
|
|
|
|
|
//If we don't have enough data to stop extracting body length AND we have received a lot of data
|
|
//then perhaps there is a problem with how the message is formatted and the session should be killed
|
|
if (idxOfEndOfTag9 < 0 && self.buffer.length > 100) {
|
|
var error ='[ERROR] Over 100 character received but body length still not extractable. Message malformed: '
|
|
+ databuffer.toString();
|
|
util.log(error);
|
|
stream.end();
|
|
ctx.sendNext({data:error, type:'error'});
|
|
return;
|
|
}
|
|
|
|
|
|
//If we don't have enough data to stop extracting body length, wait for more data
|
|
if (idxOfEndOfTag9 < 0) {
|
|
return;
|
|
}
|
|
|
|
var _bodyLengthStr = self.buffer.substring(STARTOFTAG9VAL, idxOfEndOfTag9);
|
|
var bodyLength = parseInt(_bodyLengthStr, 10);
|
|
if (isNaN(bodyLength)) {
|
|
var error = "[ERROR] Unable to parse bodyLength field. Message probably malformed: bodyLength='"
|
|
+ _bodyLengthStr + "', msg=" + self.buffer.toString()
|
|
util.log(error);
|
|
stream.end();
|
|
ctx.sendNext({data:error, type:'error'});
|
|
return;
|
|
}
|
|
|
|
var msgLength = bodyLength + idxOfEndOfTag9 + SIZEOFTAG10;
|
|
|
|
//If we don't have enough data for the whole message, wait for more data
|
|
if (self.buffer.length < msgLength) {
|
|
return;
|
|
}
|
|
|
|
//Message received!
|
|
var msg = self.buffer.substring(0, msgLength);
|
|
if (msgLength == self.buffer.length) {
|
|
self.buffer = '';
|
|
}
|
|
else {
|
|
var remainingBuffer = self.buffer.substring(msgLength);
|
|
self.buffer = remainingBuffer;
|
|
}
|
|
|
|
//====================================Step 2: Validate message====================================
|
|
|
|
var calculatedChecksum = checksum(msg.substr(0, msg.length - 7));
|
|
var extractedChecksum = msg.substr(msg.length - 4, 3);
|
|
|
|
if (calculatedChecksum !== extractedChecksum) {
|
|
var error = '[WARNING] Discarding message because body length or checksum are wrong (expected checksum: '
|
|
+ calculatedChecksum + ', received checksum: ' + extractedChecksum + '): [' + msg + ']'
|
|
util.log(error);
|
|
ctx.sendnext({data:error, type:'error'});
|
|
return;
|
|
}
|
|
|
|
|
|
ctx.sendNext({data:msg, type:'data'});
|
|
}
|
|
}
|
|
|
|
this.outgoing = function(ctx, event){
|
|
if(event.type !== 'data'){
|
|
ctx.sendNext(event);
|
|
return;
|
|
}
|
|
|
|
if(ctx.stream.writable){ ctx.stream.write(event.data); }
|
|
ctx.sendNext(event);
|
|
}
|
|
}
|
|
|
|
function checksum(str) {
|
|
var chksm = 0;
|
|
for (var i = 0; i < str.length; i++) {
|
|
chksm += str.charCodeAt(i);
|
|
}
|
|
|
|
chksm = chksm % 256;
|
|
|
|
var checksumstr = '';
|
|
if (chksm < 10) {
|
|
checksumstr = '00' + (chksm + '');
|
|
}
|
|
else if (chksm >= 10 && chksm < 100) {
|
|
checksumstr = '0' + (chksm + '');
|
|
}
|
|
else {
|
|
checksumstr = '' + (chksm + '');
|
|
}
|
|
|
|
return checksumstr;
|
|
}
|
|
|