iso8583_esm
Version:
A javascript library for messaging in iso 8583 messaging format.
208 lines (207 loc) • 6.57 kB
JavaScript
import { DefaultError } from './errors';
import { Formats as formats } from './formats';
import { checkDataType as checkTypes } from './types';
import { accntTypes as accTypes } from './accountTypes';
import { transType as transTypes } from './transactionTypes';
import { transStatus } from './transactionStatus';
/**
* Handy Utils for transforming data
* @module Tools
*/
export const Tools = {
/**
* Convert TCP message string length to a buffer, should be a number that fits in one byte.
* @method getTCPHeaderBuffer
* @param {integer} indicator length of ISO 8583 message string.
* @returns {buffer} 1 byte buffer representing the message length indicator
*/
getTCPHeaderBuffer: (indicator) => {
const integer = Number(indicator);
return Buffer.alloc(1, integer, 'hex');
},
/**
* Format error to a universal object. Can take an array of strings to join or just a string.
* @method toErrorObject
* @param {string|string[]} errors
* @returns {object} Object having property error
* @example Tools.toErrorObject("some error") -> {error: "some error"}
* @example Tools.toErrorObject("some error on field", 67, "happened" ) -> {error: "some error on field 67 happened"}
*/
toErrorObject: (errors) => {
if (Array.isArray(errors))
return new DefaultError(errors.join(''));
// @ts-ignore
else
return new DefaultError(errors);
},
toInvalidLengthErrorObject: (field, invalidLength) => {
return new DefaultError(`invalid length ${invalidLength} of data on field ${field}`);
},
/**
* Convert a hexadecimal string in to binary string: To a string of 0s and 1s
* @method getHex
* @param {string} hexaString
* @returns {string} A string of 0s and 1s representing the hexadecimal string input
* @example Tools.getHex("EF") -> "11101111"
* @example Tools.getHex("EFEF") -> "1110111111101111"
*/
getHex: (hexaString) => {
const mapping = {
'0': '0000',
'1': '0001',
'2': '0010',
'3': '0011',
'4': '0100',
'5': '0101',
'6': '0110',
'7': '0111',
'8': '1000',
'9': '1001',
a: '1010',
b: '1011',
c: '1100',
d: '1101',
e: '1110',
f: '1111',
A: '1010',
B: '1011',
C: '1100',
D: '1101',
E: '1110',
F: '1111',
};
let bitmaps = '';
for (let i = 0; i < hexaString.length; i++)
bitmaps += mapping[hexaString[i]];
return bitmaps;
},
/**
* Convert a string of integers to hexadecimal string.
* @method getHexString
* @param {string} string A string of integers
* @returns {string} A hexadecimal string representation of the string of integers received
* @example T.getHexString("123456") -> "1e240"
*/
getHexString: (string) => {
return parseInt(string, 10).toString(16);
},
getLenType: (lentype) => {
switch (lentype) {
case 'lvar':
return 1;
case 'llvar':
return 2;
case 'lllvar':
return 3;
case 'llllvar':
return 4;
case 'lllllvar':
return 5;
case 'llllllvar':
return 6;
default:
return 0;
}
},
validateFields: (self) => {
const obj = self.Msg;
const customFormats = self.formats;
let state = false;
for (const field in obj) {
if (parseInt(field, 10) > 64)
self.includesSecondaryBitmap = true;
if (obj.hasOwnProperty(field)) {
// @ts-ignore
const this_format = customFormats[field] || formats[field];
if (this_format && checkTypes(this_format, obj[field], field)) {
state = true;
}
else {
return new Error('field ' + field + ' error');
}
}
}
return state;
},
/**
* Get the expected response MTI of an MTI
* @method getResType
* @param {string} reqType The request or outgoing MTI
* @returns {string|object} The expected response MTI | Error object
* @example T.getResType("0100") -> "0110"
* @example T.getResType("01000") -> {error: 'mti invalid'}
*/
getResType: (reqType) => {
switch (reqType) {
case '0100':
case '0101':
return '0110';
case '0120':
case '0121':
return '0130';
case '0200':
case '0201':
return '0210';
case '0202':
case '0203':
return '0212';
case '0220':
case '0221':
return '0230';
case '0332':
// '0323' ignored
return '0322';
case '0400':
case '0401':
return '0410';
case '0410':
case '0420':
case '0421':
return '0430';
case '0500':
case '0501':
return '0510';
case '0520':
case '0521':
return '0530';
case '0532':
// '0523' ignored
return '0522';
case '0600':
case '0601':
return '0610';
case '0620':
case '0621':
return '0630';
default:
return '';
}
},
getTransType: (id) => {
if (transTypes[id])
return transTypes[id];
else
return 'Code ' + id + ' Name Undefined';
},
getAccType: (id) => {
if (accTypes[id])
return accTypes[id];
else
return 'Code ' + id + ' Name Undefined';
},
getTranStatus: (id) => {
if (transStatus[id])
return transStatus[id];
else
return 'Code ' + id + ' Name Undefined';
},
isXmlEncoded: (s) => {
if (!s)
return false;
if (s.startsWith('<') && s.endsWith('>'))
return true;
if (s.startsWith("'<") && s.endsWith(">'"))
return true;
return false;
},
};