UNPKG

iso8583_esm

Version:

A javascript library for messaging in iso 8583 messaging format.

83 lines (82 loc) 3.87 kB
import { Tools as T } from '../tools'; import { Formats as formats } from '../formats'; /** * Unpack fields 0-127 from an ISO 8583 encoded string into a JSON * @method unpack_0_127 * @memberof module:Message-UnPackage */ export function unpack_0_127(incoming, isoJSON, config) { if (Buffer.isBuffer(incoming)) { const mti = incoming.slice(0, 4).toString(); isoJSON['0'] = mti; if (!this._checkMTI(mti)) { return T.toErrorObject('failed to unpack at get mti'); } let bitmapEnd; // Does data contain a secondary bitmap? const secondaryBitmap = this.hasSecondaryBitmap(incoming.slice(4, 8), config); if (secondaryBitmap === false) bitmapEnd = 12; else bitmapEnd = 20; if (config.bitmapEncoding === 'utf8') bitmapEnd = (bitmapEnd - 4) * 2 + 4; // @ts-ignore const slice = incoming.slice(4, bitmapEnd).toString(config.bitmapEncoding || 'hex'); const bitmap = T.getHex(slice).split('').map(Number); let thisBuff = incoming.slice(bitmapEnd, incoming.byteLength); for (let i = 1; i < bitmap.length; i++) { if (bitmap[i] === 1) { // format defined const field = i + 1; const this_format = this.formats[field] || formats[field]; if (field === 127 && this_format?.hasExtentions !== false) { const get127Exts = this.unpack_127_1_63(thisBuff, isoJSON); if (get127Exts.error) { return get127Exts; } else { isoJSON = get127Exts.json; thisBuff = get127Exts.remSlice; continue; } } if (this_format) { if (this_format.LenType === 'fixed') { if (this_format.ContentType === 'b') { isoJSON[field] = thisBuff.slice(0, this_format.MaxLen / 2).toString('hex'); thisBuff = thisBuff.slice(this_format.MaxLen / 2, thisBuff.byteLength); } else { isoJSON[field] = thisBuff.slice(0, this_format.MaxLen).toString(); thisBuff = thisBuff.slice(this_format.MaxLen, thisBuff.byteLength); } } else { const thisLen = T.getLenType(this_format.LenType); if (!this_format.MaxLen) return T.toErrorObject(['max length not implemented for ', this_format.LenType, field]); if (this.Msg[field] && this.Msg[field].length > this_format.MaxLen) { return T.toInvalidLengthErrorObject(field, this.Msg[field].length); } if (thisLen === 0) { return T.toErrorObject(['field ', field, ' format not implemented']); } else { const len = thisBuff.slice(0, thisLen).toString(); thisBuff = thisBuff.slice(thisLen, thisBuff.byteLength); isoJSON[field] = thisBuff.slice(0, Number(len)).toString(); thisBuff = thisBuff.slice(Number(len), thisBuff.byteLength); } } } else return T.toErrorObject(['field ', field, ' format not implemented']); } } this.remainingBuffer = thisBuff; return isoJSON; } else return T.toErrorObject(['expecting buffer but got ', typeof incoming]); }