@iotize/tap
Version:
IoTize Device client for Javascript
165 lines • 11.8 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXN0cmVhbS1jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY2xpZW50L2ltcGwvc3JjL2xpYi9mcmFtZS90YXAtc3RyZWFtLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQkFBa0IsR0FFbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3QyxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLEdBQXdCLEVBQ3hCLE9BQVk7SUFFWixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtRQUMzQiwyQkFBMkI7UUFDM0IsMEJBQTBCO1FBQzFCLElBQUk7UUFDSixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNyQjtTQUFNO1FBQ0wsT0FBTyxHQUFvQixDQUFDO0tBQzdCO0FBQ0gsQ0FBQztBQUtELE1BQU0sT0FBTyxlQUFnQixTQUFRLGtCQUFrQjtJQUNyRCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQWlCO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBb0M7UUFDaEQsT0FBTyxNQUFNLFlBQVksVUFBVTtZQUNqQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNiLENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBUztRQUNmLE9BQU8sTUFBTSxDQUFDLFlBQVks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