Skip to content

Commit

Permalink
Long mtm messages (Closes ing-bank#66)
Browse files Browse the repository at this point in the history
  • Loading branch information
atiplea committed Aug 2, 2019
1 parent 59a7ec1 commit d9b4569
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 108 deletions.
12 changes: 6 additions & 6 deletions src/mtm/mtm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -317,18 +317,18 @@ export class MtmConnection {
}

private async execute(detail: ServiceDetail, prepareString: string): Promise<string> {
let sendingMessage = this.prepareSendingMessage(detail, prepareString);
const sendingMessage = this.prepareSendingMessage(detail, prepareString);
await this.socket.send(sendingMessage);
let message = await this.socket.onceData();
let totalBytes = utils.unpack(message.readUInt8(0), message.readUInt8(1))
let messageLength = message.length
const {totalBytes, startByte} = utils.unpack(message);
let messageLength = message.length;

while (messageLength < totalBytes) {
let nextMessage = await this.socket.onceData();
const nextMessage = await this.socket.onceData();
messageLength = messageLength + nextMessage.length;
message = Buffer.concat([message, nextMessage], messageLength)
message = Buffer.concat([message, nextMessage], messageLength);
}
return (utils.parseResponse(detail.serviceClass, message.slice(3, message.length), this.encoding));
return (utils.parseResponse(detail.serviceClass, message.slice(startByte, message.length), this.encoding));
}

private prepareSendingMessage(detail: ServiceDetail, prepareString: string): string {
Expand Down
217 changes: 115 additions & 102 deletions src/mtm/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ interface FileDetails {
fileBaseName: string
}

export const extensionToDescription: {[key: string]: string} = {
export const extensionToDescription: { [key: string]: string } = {
'BATCH': 'Batch',
'COL': 'Column',
'DAT': 'Data',
Expand All @@ -34,41 +34,41 @@ export const extensionToDescription: {[key: string]: string} = {
}

export function v2lvFormat(messageValue: string[]) {
let lvMessage = ''
if (messageValue.length !== 0) {
messageValue.forEach(messageString => {
lvMessage = lvMessage + lvFormat(messageString)
})
}
return lvMessage
let lvMessage = ''
if (messageValue.length !== 0) {
messageValue.forEach(messageString => {
lvMessage = lvMessage + lvFormat(messageString)
})
}
return lvMessage
}

export function lvFormat(messagString: String): string {
let returnLvFormat = ''
let lvArray = []
let messageLength = messagString.length
let splitBytes

if (messageLength < 255) { splitBytes = 1 }
else if (messageLength < 65534) { splitBytes = 2 }
else if (messageLength < 16777213) { splitBytes = 3 }
else { splitBytes = 4 }

messageLength = splitBytes + messageLength

if (messageLength > 255) {
for (let loop = 0; loop < splitBytes; loop++) {
lvArray.push(messageLength % 256)
messageLength = Math.trunc(messageLength / 256)
}
returnLvFormat = String.fromCharCode(0) + String.fromCharCode(splitBytes);
for (let loop = splitBytes - 1; loop >= 0; loop--) {
returnLvFormat = returnLvFormat + String.fromCharCode(lvArray[loop])
}
let returnLvFormat = ''
let lvArray = []
let messageLength = messagString.length
let splitBytes

if (messageLength < 255) { splitBytes = 1 }
else if (messageLength < 65534) { splitBytes = 2 }
else if (messageLength < 16777213) { splitBytes = 3 }
else { splitBytes = 4 }

messageLength = splitBytes + messageLength

if (messageLength > 255) {
for (let loop = 0; loop < splitBytes; loop++) {
lvArray.push(messageLength % 256)
messageLength = Math.trunc(messageLength / 256)
}
returnLvFormat = String.fromCharCode(0) + String.fromCharCode(splitBytes);
for (let loop = splitBytes - 1; loop >= 0; loop--) {
returnLvFormat = returnLvFormat + String.fromCharCode(lvArray[loop])
}
else { returnLvFormat = String.fromCharCode(messageLength) }
return (returnLvFormat + messagString);
}
else { returnLvFormat = String.fromCharCode(messageLength) }
return (returnLvFormat + messagString);
}

/**
* This method does a thing.
Expand All @@ -78,60 +78,60 @@ export function lvFormat(messagString: String): string {
* @returns {Buffer[]} A buffer array
*/
export function lv2vFormat(messageString: Buffer): Buffer[] {
let returnString: Buffer[] = [];
let messageLength = messageString.length;

if (messageLength === 0) { return [] };

let bytePointer: number = 0;
let extractChar: number = 0;
let numberOfBufferedLine: number = 0;
let byteCalcNumber: number;

while (bytePointer < messageLength) {
extractChar = messageString.readUInt8(bytePointer);

numberOfBufferedLine = 1;

if (extractChar === 0) {
numberOfBufferedLine = messageString.readUInt8(bytePointer + 1);
bytePointer = bytePointer + 2;
if (numberOfBufferedLine === 0) {
continue;
}
byteCalcNumber = 1;
for (let loopFor = numberOfBufferedLine - 1; loopFor >= 0; loopFor--) {
extractChar = (messageString.readUInt8(bytePointer + loopFor) * byteCalcNumber) + extractChar;
byteCalcNumber = byteCalcNumber * 256
}
}
if (bytePointer > messageLength) {
let returnString: Buffer[] = [];
let messageLength = messageString.length;

if (messageLength === 0) { return [] };

let bytePointer: number = 0;
let extractChar: number = 0;
let numberOfBufferedLine: number = 0;
let byteCalcNumber: number;

while (bytePointer < messageLength) {
extractChar = messageString.readUInt8(bytePointer);

numberOfBufferedLine = 1;

if (extractChar === 0) {
numberOfBufferedLine = messageString.readUInt8(bytePointer + 1);
bytePointer = bytePointer + 2;
if (numberOfBufferedLine === 0) {
continue;
}
returnString.push(messageString.slice(bytePointer + numberOfBufferedLine, bytePointer + extractChar));
bytePointer = bytePointer + extractChar;
byteCalcNumber = 1;
for (let loopFor = numberOfBufferedLine - 1; loopFor >= 0; loopFor--) {
extractChar = (messageString.readUInt8(bytePointer + loopFor) * byteCalcNumber) + extractChar;
byteCalcNumber = byteCalcNumber * 256
}
}
if (bytePointer > messageLength) {
continue;
}
return returnString
returnString.push(messageString.slice(bytePointer + numberOfBufferedLine, bytePointer + extractChar));
bytePointer = bytePointer + extractChar;
}
return returnString
}

export function parseResponse(serviceClass: number, outputData: Buffer, encoding: BufferEncoding): string {
// unpacking multiple times to get the token, remove the endiness by extracting from position 2
let returnString: string = ''
let returnArray: Buffer[];
returnArray = lv2vFormat(outputData);
returnArray = lv2vFormat(returnArray[1]);
returnArray = lv2vFormat(returnArray[1]);
returnString = returnArray[0].toString(encoding)
if (returnString === 'ER') {
throw returnArray.map(x => x.toString(encoding)).join('')
}
if (serviceClass === 5) {
returnString = returnArray[2].toString(encoding) + String.fromCharCode(0) + returnArray[3].toString(encoding)
}
return returnString;
// unpacking multiple times to get the token, remove the endiness by extracting from position 2
let returnString: string = ''
let returnArray: Buffer[];
returnArray = lv2vFormat(outputData);
returnArray = lv2vFormat(returnArray[1]);
returnArray = lv2vFormat(returnArray[1]);
returnString = returnArray[0].toString(encoding)
if (returnString === 'ER') {
throw returnArray.map(x => x.toString(encoding)).join('')
}
if (serviceClass === 5) {
returnString = returnArray[2].toString(encoding) + String.fromCharCode(0) + returnArray[3].toString(encoding)
}
return returnString;
}

export function sendingMessage(tokenMessage: string, mrpcMessage: string): string {
export function sendingMessage(tokenMessage: string, mrpcMessage: string): string {
return v2lvFormat([tokenMessage, mrpcMessage])
}

Expand All @@ -147,29 +147,29 @@ export function mrpcMessage(mrpcId: string, version: string, prepareString: stri


export function tokenMessage(serviceClass: number, token: string, messageId: number): string {
let exchangeMessage = [
serviceClass.toString(),
token,
messageId.toString(),
'0',
''
]
return v2lvFormat(exchangeMessage);
}
let exchangeMessage = [
serviceClass.toString(),
token,
messageId.toString(),
'0',
''
]
return v2lvFormat(exchangeMessage);
}


export function connectionObject(envUser: string, envPassword: string): string {
let perpareString: string[] = [
'1',
envUser.toString(),
'nowhere',
envPassword,
'',
'',
netConnMessage()
]
return v2lvFormat(perpareString);
}
let perpareString: string[] = [
'1',
envUser.toString(),
'nowhere',
envPassword,
'',
'',
netConnMessage()
]
return v2lvFormat(perpareString);
}

export function checkObject(localFile: string, token: string): string {
let messageArray = [
Expand Down Expand Up @@ -285,9 +285,9 @@ export function getObjectType(fileName: string): FileDetails {
let elementExtension = elementBaseName.substr(elementBaseName.lastIndexOf('.') + 1, elementBaseName.length)
if (elementName.includes('.')) elementName = elementBaseName;
return {
fileId : getFileDetails(elementExtension),
fileName : elementName,
fileBaseName : elementBaseName
fileId: getFileDetails(elementExtension),
fileName: elementName,
fileBaseName: elementBaseName
}
}

Expand Down Expand Up @@ -315,9 +315,22 @@ export function pack(totalLength: number): string {
return (firstByte + secondByte);
}

export function unpack(firstByte: number, secondByte: number): number {
export function unpack(message: Buffer): { totalBytes: number, startByte: number } {
// For ING we use Big Endian !h which is 2 bytes
return ((firstByte * 256) + secondByte);
if (!message.readUInt8(0) && !message.readUInt8(1)) return longMessageLength(message);
return { totalBytes: (message.readUInt8(0) * 256) + message.readUInt8(1), startByte: 3 };
}

function longMessageLength(message: Buffer): { totalBytes: number, startByte: number } {
const numberOfBytes = message.readUInt8(2);
const lastLengthByte = 3 + numberOfBytes;
const messageLengthBytes = message.slice(3, lastLengthByte);
let totalBytes = 0;
for (let index = 0; index < messageLengthBytes.length; index++) {
const byte = messageLengthBytes.readUInt8(index);
totalBytes += byte * 256 ** (messageLengthBytes.length - 1 - index);
}
return { totalBytes, startByte: lastLengthByte + 1};
}

function mrpcConnMessage(): string {
Expand Down

0 comments on commit d9b4569

Please sign in to comment.