UNPKG

jspurefix

Version:
187 lines 8.12 kB
"use strict"; 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