jspurefix
Version:
pure node js fix engine
187 lines • 8.12 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.QuickFixXmlFileParser = void 0;
const definition_1 = require("../../definition");
const field_definition_parser_1 = require("./field-definition-parser");
const field_set_parser_1 = require("./field-set-parser");
const message_parser_1 = require("./message-parser");
const fix_parser_1 = require("../../fix-parser");
const util_1 = require("util");
const contained_1 = require("../../contained");
const fix_definition_source_1 = require("../../fix-definition-source");
const version_util_1 = require("../../version-util");
const parse_state_1 = require("./parse-state");
const parse_progress_1 = require("./parse-progress");
class QuickFixXmlFileParser extends fix_parser_1.FixParser {
constructor(make, getLogger) {
super();
this.make = make;
this.getLogger = getLogger;
this.singlePass = (0, util_1.promisify)(QuickFixXmlFileParser.subscribe);
this.state = new parse_progress_1.ParseProgress();
}
static subscribe(progress, saxStream, done) {
let parser;
const saxParser = saxStream._parser;
saxStream.on('error', (e) => {
done(e, null);
});
saxStream.on('closetag', (name) => {
if (parser != null) {
parser.close(saxParser.line, name);
}
switch (name) {
case 'repository':
case 'messages':
case 'components':
case 'header':
case 'trailer': {
parser = null;
break;
}
}
});
saxStream.on('opentag', (saxNode) => {
switch (saxNode.name) {
case 'fix': {
switch (progress.parseState) {
case parse_state_1.ParseState.FieldDefinitions: {
const major = saxNode.attributes.major;
const minor = saxNode.attributes.minor;
const servicepack = saxNode.attributes.servicepack;
const description = (major !== '5' || !servicepack) ? `FIX.${major}.${minor}` : `FIX.${major}.${minor}SP${servicepack}`;
progress.definitions = new definition_1.FixDefinitions(fix_definition_source_1.FixDefinitionSource.QuickFix, version_util_1.VersionUtil.resolve(description));
break;
}
}
break;
}
case 'fields': {
switch (progress.parseState) {
case parse_state_1.ParseState.FieldDefinitions: {
parser = new field_definition_parser_1.FieldDefinitionParser(progress);
break;
}
default: {
parser = null;
}
}
break;
}
case 'messages': {
switch (progress.parseState) {
case parse_state_1.ParseState.Messages: {
parser = new message_parser_1.MessageParser(progress);
break;
}
default:
break;
}
break;
}
case 'components': {
switch (progress.parseState) {
case parse_state_1.ParseState.Components:
parser = new field_set_parser_1.FieldSetParser(progress);
break;
}
break;
}
case 'field':
case 'value':
case 'component':
case 'group': {
if (parser != null) {
parser.open(saxParser.line, saxNode);
}
break;
}
case 'message': {
switch (progress.parseState) {
case parse_state_1.ParseState.Messages: {
if (parser != null) {
parser.open(saxParser.line, saxNode);
}
break;
}
default:
break;
}
break;
}
case 'header':
case 'trailer': {
switch (progress.parseState) {
case parse_state_1.ParseState.Messages: {
parser = new field_set_parser_1.FieldSetParser(progress);
parser.open(saxParser.line, saxNode);
break;
}
}
break;
}
}
});
saxStream.on('ready', () => {
if (done) {
parser = null;
done(undefined, progress.definitions);
}
});
}
encloseMessages() {
const messages = this.state.definitions.message;
const keys = Array.from(messages.keys());
const trailerName = 'StandardTrailer';
keys.forEach(k => {
var _a, _b;
const message = messages.get(k);
const builder = new contained_1.ContainedSetBuilder(message);
const trailer = this.state.definitions.component.get(trailerName);
if (trailer && !(message === null || message === void 0 ? void 0 : message.components.has(trailerName))) {
const contained = new contained_1.ContainedComponentField(trailer, (_b = (_a = message === null || message === void 0 ? void 0 : message.fields) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0, true);
this.state.newAdds++;
builder === null || builder === void 0 ? void 0 : builder.add(contained);
}
});
}
parse() {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
this.state.next();
while (this.state.parseState !== parse_state_1.ParseState.End) {
this.state.reset();
yield this.onePass();
this.state.next();
}
this.encloseMessages();
resolve(this.state.definitions);
}
catch (e) {
reject(e);
}
}));
});
}
onePass() {
return __awaiter(this, void 0, void 0, function* () {
const duplex = this.make();
const pass = duplex.readable;
const saxStream = require('sax').createStream(true, {});
pass.pipe(saxStream);
return yield this.singlePass(this.state, saxStream);
});
}
}
exports.QuickFixXmlFileParser = QuickFixXmlFileParser;
//# sourceMappingURL=quick-fix-xml-file-parser.js.map