fix-client
Version:
A minimalist FIX API client
92 lines (76 loc) • 2.89 kB
JavaScript
const Field = require('./fields/Field')
const { Fields: FieldsCache } = require('./fields/Fields')
const { Enums: EnumsCache } = require('./enums/Enums')
const { Message } = require('./message/Message')
const { SOH, RE_FIND, RE_ESCAPE, STRING_EQUALS } = require('./util/util')
class FIXParserBase {
// static version = {
// version: process.env.__PACKAGE_VERSION__,
// build: process.env.__BUILD_TIME__
// };
constructor() {
this.message = null;
this.messageTags = [];
this.messageString = '';
this.reBeginString = new RegExp(/(?=8=FIX)/g);
this.fields = new FieldsCache();
this.enums = new EnumsCache();
}
processMessage() {
const matches = RE_FIND.exec(this.messageString);
if (matches && matches.length === 2) {
const stringData = this.messageString.replace(
new RegExp(matches[1].replace(RE_ESCAPE, '\\$&'), 'g'),
SOH
);
this.message.setString(stringData);
this.messageTags = stringData.split(SOH);
} else {
this.message = null;
this.messageTags = [];
}
}
processFields() {
let tag = null,
value = null,
i = 0,
equalsOperator = '',
field = null;
for (i; i < this.messageTags.length - 1; i++) {
equalsOperator = this.messageTags[i].indexOf(STRING_EQUALS);
tag = this.messageTags[i].substring(0, equalsOperator);
value = this.messageTags[i].substring(equalsOperator + 1);
field = new Field(tag, value);
this.fields.processField(this.message, field);
this.enums.processEnum(field);
if (field.tag === 9) {
this.message.validateBodyLength(value);
} else if (field.tag === 10) {
this.message.validateChecksum(value);
}
this.message.addField(field);
}
}
parse(data) {
let i = 0;
const messageStrings = data ? data.split(this.reBeginString) : [];
const messages = [];
for (i; i < messageStrings.length; i++) {
this.message = new Message();
this.messageString = messageStrings[i];
if (this.messageString.indexOf(SOH) > -1) {
// SOH separator
this.message.setString(this.messageString);
this.messageTags = this.messageString.split(SOH);
} else {
this.processMessage();
}
if (this.message) {
this.processFields();
messages.push(this.message);
}
}
return messages;
}
}
module.exports = FIXParserBase