iso8583_esm
Version:
A javascript library for messaging in iso 8583 messaging format.
106 lines (105 loc) • 4.39 kB
JavaScript
import { Tools as T } from '../tools';
import { Formats as formats } from '../formats';
function unpackKeyValueStringField(self, slice_127, isoJSON) {
const length = parseInt(slice_127.slice(0, 6).toString(), 10);
slice_127 = slice_127.slice(6, slice_127.length);
if (!self.embededProperties.exclude127Bitmap) {
slice_127 = slice_127.slice(8, slice_127.length);
}
const dataString = slice_127.slice(0, length).toString();
slice_127 = slice_127.slice(length, slice_127.length);
const data = dataString?.split('; ');
if (data.length < 2) {
return {
json: isoJSON,
remSlice: slice_127,
};
}
data.reduce((_ignored, s) => {
const kv = s?.split('=');
const k = kv[0];
const v = kv.slice(1, kv.length).join('=');
isoJSON[`127.${k}`] = v;
}, {});
return {
json: isoJSON,
remSlice: slice_127,
};
}
/**
* Unpack fields 127.0-63 from an ISO 8583 encoded string into a JSON
* @method unpack_127_1_63
* @memberof module:Message-UnPackage
*/
export function unpack_127_1_63(slice_127, isoJSON) {
if (this.embededProperties.field_127_25_key_value_string) {
return unpackKeyValueStringField(this, slice_127, isoJSON);
}
slice_127 = slice_127.slice(6, slice_127.length);
//const bitmap = T.getHex(slice_127.slice(0, 8).toString('hex')).split('').map(Number);
let bitmap = '';
if (this.formats['127.1'] != undefined) {
if (this.formats['127.1'].ContentType === 'an') {
// @ts-ignore
bitmap = T.getHex(slice_127.slice(0, 16).toString('ascii')).split('').map(Number);
slice_127 = slice_127.slice(16, slice_127.length);
}
}
else {
// @ts-ignore
bitmap = T.getHex(slice_127.slice(0, 8).toString('hex')).split('').map(Number);
slice_127 = slice_127.slice(8, slice_127.length);
}
for (let i = 0; i < 40; i++) {
// @ts-ignore
if (bitmap[i] === 1) {
const subField = '127.' + (i + 1);
const this_format = this.formats[subField] || formats[subField];
if (subField === '127.25') {
const get127_25Exts = this.unpack_127_25_1_63(slice_127, isoJSON);
if (get127_25Exts.error) {
return get127_25Exts;
}
else {
isoJSON = get127_25Exts.json;
slice_127 = get127_25Exts.remSlice;
continue;
}
}
if (this_format) {
if (this_format.LenType === 'fixed') {
if (formats[subField].ContentType === 'b') {
isoJSON[subField] = slice_127.slice(0, this_format.MaxLen / 2).toString('hex');
slice_127 = slice_127.slice(this_format.MaxLen / 2, slice_127.length);
}
else {
isoJSON[subField] = slice_127.slice(0, this_format.MaxLen).toString();
slice_127 = slice_127.slice(this_format.MaxLen, slice_127.length);
}
}
else {
const thisLen = T.getLenType(this_format.LenType);
if (!this_format.MaxLen)
return T.toErrorObject(['max length not implemented for ', this_format.LenType, subField]);
if (this.Msg[subField] && this.Msg[subField].length > this_format.MaxLen)
return T.toInvalidLengthErrorObject(subField, this.Msg[subField].length);
if (thisLen === 0) {
throw T.toErrorObject(['field ', subField, ' format not implemented']);
}
else {
const len = slice_127.slice(0, thisLen).toString();
slice_127 = slice_127.slice(thisLen, slice_127.length);
isoJSON[subField] = slice_127.slice(0, Number(len)).toString();
slice_127 = slice_127.slice(Number(len), slice_127.length);
}
}
}
else
return T.toErrorObject(['field', subField, ' format not implemented']);
}
}
return {
json: isoJSON,
remSlice: slice_127,
};
}