UNPKG

fix-over-tcp

Version:

Custom TCP FIX protocol(beta

98 lines (82 loc) 2.89 kB
/* * fixparser * https://gitlab.com/logotype/fixparser.git * * Copyright 2019 Victor Norgren * Released under the MIT license */ import Field from './fields/Field'; import { Fields as FieldsCache } from './fields/Fields'; import { Enums as EnumsCache } from './enums/Enums'; import Message from './message/Message'; import { SOH, RE_FIND, RE_ESCAPE, STRING_EQUALS } from './util/util'; export default 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; } }