@iotize/tap
Version:
IoTize Device client for Javascript
72 lines • 6.22 kB
JavaScript
import { chunkArray } from '@iotize/common/array';
import { KaitaiStreamWriter } from '@iotize/common/byte-stream';
import { SinglePacketChunk } from '../generated/models';
import { SinglePacketBuilder } from './single-packet-builder';
import { computePadding } from './util';
/**
* Utility class to split a big single packet data into {@link SinglePacketChunk}
*/
export class SinglePacketSplitter {
/**
* @throws {@link #chunkSize} < {@link #unitBlockSize}
*/
constructor(options = {}) {
if (!options.sizeMultiplicator) {
options.sizeMultiplicator = SinglePacketSplitter.SIZE_MULTIPLICATOR;
}
if (!options.chunkSize) {
options.chunkSize = SinglePacketBuilder.MAX_PART_SIZE;
}
if (!options.format) {
options.format = SinglePacketChunk.Format.OFFSET_ON_2_BYTES;
}
if (!options.pad) {
options.pad = false;
}
this.options = options;
this.checkOptions();
}
get sizeMultiplicator() {
return this.options.sizeMultiplicator;
}
checkOptions() {
// Maybe we should force chunk size to be a multiple of unitBlockSize ?
if (this.options.chunkSize < this.sizeMultiplicator) {
throw new Error(`Chunk size must be greater than ${this.sizeMultiplicator}. Given: ${this.options.chunkSize}`);
}
if (!this.options.pad &&
this.options.chunkSize % this.sizeMultiplicator !== 0) {
throw new Error(`Chunk size "${this.options.chunkSize}" is not a multiple of length multiplicator "${this.sizeMultiplicator}"`);
}
}
/**
* @return an array of single packet parts
*/
chunk(data) {
if (!this.options.pad) {
if (data.length % this.sizeMultiplicator !== 0) {
throw new Error(`Padding is disabled and data length (${data.length} byte(s)) is not a multiple of length multiplicator ${this.sizeMultiplicator})`);
}
}
else {
const padding = computePadding(data.length, this.sizeMultiplicator);
if (padding > 0) {
data = KaitaiStreamWriter.mergeArrays(data, new Uint8Array(padding));
}
}
const packets = chunkArray(Array.from(data), this.options.chunkSize).map((value) => Uint8Array.from(value));
let offset = 0;
return packets.map((chunk) => {
const part = {
data: chunk,
length: Math.ceil(chunk.length / this.sizeMultiplicator),
offset: Math.ceil(offset / this.sizeMultiplicator),
format: this.options.format,
};
offset += chunk.length;
return part;
});
}
}
SinglePacketSplitter.SIZE_MULTIPLICATOR = 16;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXBhY2tldC1zcGxpdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NlcnZpY2UvaW1wbC9zaW5nbGUtcGFja2V0L3NyYy9saWIvY3VzdG9tL3NpbmdsZS1wYWNrZXQtc3BsaXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxRQUFRLENBQUM7QUF1QnhDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUsvQjs7T0FFRztJQUNILFlBQW1CLFVBQWlELEVBQUU7UUFDcEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUM5QixPQUFPLENBQUMsaUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsa0JBQWtCLENBQUM7U0FDckU7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN0QixPQUFPLENBQUMsU0FBUyxHQUFHLG1CQUFtQixDQUFDLGFBQWEsQ0FBQztTQUN2RDtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1NBQzdEO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7U0FDckI7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQXVDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlB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