UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

165 lines 11.8 kB
import { typedArrayToBuffer } from '@iotize/common/byte-converter'; import { KaitaiStreamReader, KaitaiStreamWriter, } from '@iotize/common/byte-stream'; import { debug } from '../debug'; import { CRC } from '../error-detection/crc'; export function enumKeyOrValueToNumber(key, mapping) { if (typeof key === 'string') { // if (!(key in mapping)) { // throw new Error(``) // } return mapping[key]; } else { return key; } } export class TapStreamReader extends KaitaiStreamReader { static fromArray(array) { const buffer = typedArrayToBuffer(array); return new TapStreamReader(buffer); } static create(packet) { return packet instanceof Uint8Array ? TapStreamReader.fromArray(packet) : packet; } readStr(n) { return String.fromCharCode.apply(null, this.readBytes(n)); } /** * Read given byte size as string * @param n number of byte to read */ readString(n = this.byteLeft) { return this.readStr(n); } /** * Read string until terminator character is reached */ readStringTerminator(terminator) { let result = ''; while (true) { const lastByte = this.readU1(); const lastChar = String.fromCharCode(lastByte); if (lastChar !== terminator) { result += lastChar; } else { break; } } return result; } readU2() { return this._isBigEndian ? this.readU2be() : this.readU2le(); } readU4() { return this._isBigEndian ? this.readU4be() : this.readU4le(); } readF4() { return this._isBigEndian ? this.readF4be() : this.readF4le(); } subStream(length) { return TapStreamReader.fromArray(this.readBytes(length)); } } export class TapStreamWriter extends KaitaiStreamWriter { constructor(lengthOrBuffer = 512, byteOffset, isBigEndian = true) { if (typeof lengthOrBuffer === 'number') { lengthOrBuffer = new ArrayBuffer(lengthOrBuffer); } super(lengthOrBuffer, byteOffset, isBigEndian); } static create(size) { return new TapStreamWriter(new ArrayBuffer(size)); } writeFunction(type, options, fieldValue, fieldSize) { switch (type) { case 'crc32': return this.addCRC(options); case 'padding': if (fieldValue) { debug('Padding is already set'); return this.writeBytes(fieldValue); } else { if (typeof fieldSize == undefined) { throw new Error(`Padding function expect padding size as a second argument. Args: ${JSON.stringify(arguments)}`); } return this.addPadding(fieldSize); } default: throw new Error(`Invalid writer function type: ${type}`); } } addPadding(padSize) { this.writeBytes(new Uint8Array(padSize)); return this; } addCRC(options) { let buffer = this.toBytes; if (options && options.offset) { buffer = buffer.slice(options.offset); } const crc = CRC.fromBytes(buffer); this.writeU4(crc); // console.info(`TODO REMOVE Compute CRC from ${options ? options.offset : 0}:${buffer.length} 0x${bufferToHexString(buffer)} => 0x${crc.toString(16)}`) return this; } writeUnsigned(value, length) { this.writeU(value, length); return this; } writeU4(value) { this.writeU(value, 4); return this; } writeU2(value) { this.writeU(value, 2); return this; } writeU1(value) { this.writeU(value, 1); return this; } writeF4(value) { this.writeF(value, 4); return this; } writeFloat(value, length) { this.writeF(value, length); return this; } writeSigned(value, length) { this.writeSigned(value, length); return this; } writeString(value, length = (value === null || value === void 0 ? void 0 : value.length) || 0) { return this.writeStr(value || '', length); } writeStr(value, length = value.length) { let i = 1; const stringWriteLength = Math.min(value.length, length); for (; i <= stringWriteLength; i++) { this.writeByte(value.charCodeAt(i - 1)); } const remaining = length - stringWriteLength; if (remaining > 0) { this.writeBytes(new Uint8Array(remaining)); } return this; } writeBitsInt(value, n) { this.writeB(value, n); return this; } writeBits(value, n) { this.writeB(value, n); return this; } writeBoolean(value, n) { this.writeBits(value ? 1 : 0, n); return this; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXN0cmVhbS1jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY2xpZW50L2ltcGwvc3JjL2xpYi9mcmFtZS90YXAtc3RyZWFtLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQkFBa0IsR0FFbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3QyxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLEdBQXdCLEVBQ3hCLE9BQVk7SUFFWixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtRQUMzQiwyQkFBMkI7UUFDM0IsMEJBQTBCO1FBQzFCLElBQUk7UUFDSixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNyQjtTQUFNO1FBQ0wsT0FBTyxHQUFvQixDQUFDO0tBQzdCO0FBQ0gsQ0FBQztBQUtELE1BQU0sT0FBTyxlQUFnQixTQUFRLGtCQUFrQjtJQUNyRCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQWlCO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBb0M7UUFDaEQsT0FBTyxNQUFNLFlBQVksVUFBVTtZQUNqQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNiLENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBUztRQUNmLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQzlCLElBQUksRUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBb0IsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsSUFBWSxJQUFJLENBQUMsUUFBUTtRQUNsQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLENBQUMsVUFBa0I7UUFDckMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxFQUFFO1lBQ1gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsSUFBSSxRQUFRLEtBQUssVUFBVSxFQUFFO2dCQUMzQixNQUFNLElBQUksUUFBUSxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNMLE1BQU07YUFDUDtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLE9BQU8sZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsa0JBQWtCO0lBQ3JELFlBQ0UsaUJBQTRDLEdBQUcsRUFDL0MsVUFBbUIsRUFDbkIsV0FBVyxHQUFHLElBQUk7UUFFbEIsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUU7WUFDdEMsY0FBYyxHQUFHLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBWTtRQUMvQixPQUFPLElBQUksZUFBZSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFZLEVBQUUsT0FBWSxFQUFFLFVBQWdCLEVBQUUsU0FBZTtRQUN6RSxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsS0FBSyxTQUFTO2dCQUNaLElBQUksVUFBVSxFQUFFO29CQUNkLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO29CQUNoQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3BDO3FCQUFNO29CQUNMLElBQUksT0FBTyxTQUFTLElBQUksU0FBUyxFQUFFO3dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUNiLG9FQUFvRSxJQUFJLENBQUMsU0FBUyxDQUNoRixTQUFTLENBQ1YsRUFBRSxDQUNKLENBQUM7cUJBQ0g7b0JBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUNuQztZQUNIO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksRUFBRSxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQWU7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUE2QjtRQUNsQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzFCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDN0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLHdKQUF3SjtRQUN4SixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYSxFQUFFLE1BQWM7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBeUIsRUFBRSxTQUFpQixDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxNQUFNLEtBQUksQ0FBQztRQUN4RSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWEsRUFBRSxTQUFpQixLQUFLLENBQUMsTUFBTTtRQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekM7UUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsaUJBQWlCLENBQUM7UUFDN0MsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUM1QztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhLEVBQUUsQ0FBUztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYSxFQUFFLENBQVM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQXVCLEVBQUUsQ0FBUztRQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBTUYifQ==