jspurefix
Version:
pure node js fix engine
207 lines • 11.5 kB
JavaScript
"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 });
const path = require("path");
const util_1 = require("./util");
const buffer_1 = require("./buffer");
const ascii_1 = require("./buffer/ascii");
const fixml_1 = require("./buffer/fixml");
const transport_1 = require("./transport");
const types_1 = require("./types");
const config_1 = require("./config");
const FIXML50SP2_1 = require("./types/FIXML50SP2");
const rp = require("request-promise-native");
const compiler_1 = require("./dictionary/compiler");
const ascii_msg_transmitter_1 = require("./transport/ascii/ascii-msg-transmitter");
function testEncodeDecode() {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
const msgType = 'W';
const root = path.join(__dirname, '../');
const sessionDescription = require('../data/session/test-initiator.json');
const definitions = yield new util_1.DefinitionFactory().getDefinitions(path.join(root, (_b = (_a = sessionDescription.application) === null || _a === void 0 ? void 0 : _a.dictionary) !== null && _b !== void 0 ? _b : ''));
const jh = new util_1.JsonHelper(definitions);
const msg = jh.fromJson(path.join(root, 'data/examples/FIXML/cme/tc/Initial Single Side Submission/fix.xml'), msgType);
const config = new config_1.JsFixConfig(null, definitions, sessionDescription, ascii_1.AsciiChars.Pipe);
const session = new ascii_msg_transmitter_1.AsciiMsgTransmitter(config);
const payload = new transport_1.MsgPayload(msgType, msg);
const encoderStream = session.encodeStream;
encoderStream.write(payload);
session.encodeMessage(msgType, msg);
const parser = new ascii_1.AsciiParser(config, encoderStream, new buffer_1.ElasticBuffer(160 * 1024));
const fix = session.buffer.toString();
console.log(fix);
return yield new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
parser.on('msg', (msgType, view) => {
resolve(view.toObject());
});
parser.on('error', (e) => {
reject(e);
});
}));
});
}
function testGenerator() {
return __awaiter(this, void 0, void 0, function* () {
const root = path.join(__dirname, '../');
const sessionDescription = require('../data/session/test-initiator.json');
const definitions = yield new util_1.DefinitionFactory().getDefinitions('C:/Users/Stephen/dev/ts/jsfix/data/fix_repo/FIX.4.4/Base');
const lipsum = yield (0, util_1.getWords)(path.join(root, 'data/examples/lipsum.txt'));
const generator = new util_1.MessageGenerator(lipsum, definitions);
const msgType = types_1.MsgType.NewOrderSingle;
const example = generator.generate(msgType);
console.log(JSON.stringify(example, null, 4));
const config = new config_1.JsFixConfig(null, definitions, sessionDescription, ascii_1.AsciiChars.Pipe);
const session = new ascii_msg_transmitter_1.AsciiMsgTransmitter(config);
session.encodeMessage(msgType, example);
const fix = session.buffer.toString();
const encoderStream = session.encodeStream;
const payload = new transport_1.MsgPayload(msgType, example);
encoderStream.write(payload);
const parser = new ascii_1.AsciiParser(config, encoderStream, new buffer_1.ElasticBuffer(160 * 1024));
parser.on('msg', (mt, view) => {
console.log(view.toString());
});
console.log(fix);
});
}
function repository() {
return __awaiter(this, void 0, void 0, function* () {
const root = path.join(__dirname, '../');
const definitions = yield new util_1.DefinitionFactory().getDefinitions('repofixml');
const file = path.join(root, 'data/examples/FIXML/cme/tc/Delivery Fixed Commodity Swap/');
const so = definitions.message.get('ExecutionReport');
const t855 = definitions.simple.get('SecondaryTrdType');
const reject = {
Text: 'no response',
BusinessRejectReason: FIXML50SP2_1.BusinessRejectReason.ApplicationNotAvailable
};
const fe = new fixml_1.FixmlEncoder(new buffer_1.ElasticBuffer(), definitions);
fe.encode(reject, 'BusinessMessageReject');
const fixml = fe.buffer.toString();
const jh = new util_1.JsonHelper(definitions);
const fs = require('fs');
const readStream = fs.createReadStream(`${file}/fix.xml`);
const sessionDescription = require('../data/session/test-initiator.json');
const config = new config_1.JsFixConfig(null, definitions, sessionDescription, ascii_1.AsciiChars.Pipe);
const xmlParser = new fixml_1.FiXmlParser(config, readStream);
xmlParser.on('batch', (msgType, v) => {
console.log(`received message ${msgType}`);
const o = v.toObject();
console.log(JSON.stringify(o, null, 4));
const fe = new fixml_1.FixmlEncoder(new buffer_1.ElasticBuffer(), definitions);
fe.encode(o, msgType);
const fixml = fe.buffer.toString();
console.log(fixml);
console.log(v.toString());
});
xmlParser.on('msg', (msgType, v) => {
console.log(`received message ${msgType}`);
const o = v.toObject();
console.log(JSON.stringify(o, null, 4));
console.log(v.toString());
const fe = new fixml_1.FixmlEncoder(new buffer_1.ElasticBuffer(), definitions);
fe.encode(o, msgType);
const fixml = fe.buffer.toString();
console.log(fixml);
});
});
}
function runTest() {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
const res = yield testGenerator();
resolve(res);
}
catch (e) {
console.log(e.message);
reject(e);
}
}));
});
}
function compileDefinitions(definitionPath, outputPath) {
return __awaiter(this, void 0, void 0, function* () {
const definitions = yield new util_1.DefinitionFactory().getDefinitions(definitionPath);
const compilerSettings = require('../data/compiler.json');
compilerSettings.output = outputPath;
const msgCompiler = new compiler_1.MsgCompiler(definitions, compilerSettings);
yield msgCompiler.generate();
const enumCompiler = new compiler_1.EnumCompiler(definitions, compilerSettings);
const writeFile = path.join(compilerSettings.output, './enum/all-enum.ts');
yield enumCompiler.generate(writeFile);
const writeFileTypes = path.join(compilerSettings.output, './enum/msg-type.ts');
yield enumCompiler.generate(writeFile);
});
}
function compiler() {
return __awaiter(this, void 0, void 0, function* () {
yield compileDefinitions('data/fix_repo/fixmlschema_FIX.5.0SP2_EP228', 'C:/Users/Stephen/dev/ts/jsfix/src/types/FIXML50SP2');
});
}
function generateMessage() {
return __awaiter(this, void 0, void 0, function* () {
yield testGenerator();
});
}
function decode() {
return __awaiter(this, void 0, void 0, function* () {
const definitions = yield new util_1.DefinitionFactory().getDefinitions('data/fix_repo/FIX.4.4/Base');
const txt = '8=FIX4.4|9=0001022|35=AE|49=init-comp|56=accept-comp|34=1|57=fix|52=20180909-14:22:09.841|571=Lorem|487=23513|856=1|568=ipsum|828=6|855=23619|830=dolor|150=F|748=17140|912=N|325=N|263=1|881=sit|818=amet,|820=consectetur|880=adipiscing|17=elit.|39=3|527=Nunc|570=N|423=8|55=odio|65=orci,|48=blandit|22=3|460=4|461=vel|167=MPT|762=semper|200=sed,|541=20180909|201=0|224=20180909|225=20180909|227=-8796.1|228=-23.537|255=bibendum|543=cursus|470=lectus.|471=Aenean|472=vel|240=20180909|202=891.7|947=-2928.1|231=5.7237|223=-1894.1|106=diam|348=9|349=6YYz0zu5s|350=8|351=TuH3tTNd|691=magna.|667=Aenean|875=99|876=et|873=20180909|874=20180909|913=viverra|914=leo,|915=20180909|916=20180909|919=0|898=0.5594|38=96682|152=19226|516=9.1251|854=0|235=PREVCLOSE|236=-2833.5|701=20180909|696=20180909|697=-6.095|698=26303|823=non|32=9253|31=2065.4|194=-73.233|30=iaculis|75=20180909|715=20180909|6=5.9279|218=0.0001953|221=neque.|222=Nullam|663=16216|699=arcu|761=lectus,|824=dignissim|63=3|64=20180909|573=0|574=M3|797=Y|852=Y|853=3|10=16|';
const startsAt = new Date();
const sessionDescription = require('../data/session/test-initiator.json');
const config = new config_1.JsFixConfig(null, definitions, sessionDescription, ascii_1.AsciiChars.Pipe);
let i = 0;
const repeats = 1;
const asciiParser = new ascii_1.AsciiParser(config, new transport_1.StringDuplex(txt.repeat(repeats)).readable, new buffer_1.ElasticBuffer(160 * 1024));
asciiParser.on('msg', (msgType, v) => {
++i;
console.log(v.toJson());
if (i === repeats) {
const elapsed = new Date().getTime() - startsAt.getTime();
console.log(`elapsed ms ${elapsed} ${(elapsed / repeats) * 1000} micros per msg`);
}
});
});
}
function http() {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
const sessionDescription = require('../data/session/test-http-acceptor.json');
const definitions = yield new util_1.DefinitionFactory().getDefinitions((_b = (_a = sessionDescription.application) === null || _a === void 0 ? void 0 : _a.dictionary) !== null && _b !== void 0 ? _b : '');
const logFactory = new config_1.JsFixWinstonLogFactory(config_1.WinstonLogger.consoleOptions('info'));
const config = new config_1.JsFixConfig(null, definitions, sessionDescription, ascii_1.AsciiChars.Pipe, logFactory);
const xml = '<?xml version="1.0" encoding="UTF-8"?>\n' +
'<FIXML v="5.0 SP2" s="20090815" xv="109" cv="CME.0001">\n' +
' <UserReq UserReqID="123456" UserReqTyp="1" Username="user123" Password="User!Pass5">\n' +
' <Hdr SID="BRKR" SSub="user123" TID="CME" TSub="CPAPI"/>\n' +
' </UserReq>\n' +
'</FIXML>';
rp({
method: 'POST',
uri: 'http://localhost:2343/session',
body: {
fixml: xml
},
json: true
}).then(function (parsedBody) {
console.log(parsedBody);
})
.catch((err) => {
console.log(err);
});
});
}
repository().then(() => { }).catch(e => {
console.error(e);
});
//# sourceMappingURL=dict-parser.js.map