@iotize/tap
Version:
IoTize Device client for Javascript
139 lines • 11.9 kB
JavaScript
import { TapStreamReader, TapStreamWriter } from '@iotize/tap/client/impl';
import { TlvJsonCompressorError } from './errors';
import { DBIOT_UINT_CONVERTER } from './tlv-json-base-type-compressor';
import { findCodeDefinition } from './utility';
export function writeFieldLength(stream, length) {
if (length > 0b01111111) {
if (length > 0x7fff) {
throw TlvJsonCompressorError.maxDataLengthReach(length, 0x7fff);
}
stream.writeBits(1, 1);
stream.writeBits(length, 15);
}
else {
stream.writeBits(0, 1);
stream.writeBits(length, 7);
}
}
export function readFieldLength(stream) {
const extendedFieldLength = stream.readBits(1);
return stream.readBits(extendedFieldLength ? 15 : 7);
}
export class TLVMappedJsonObjectCompressor {
constructor(mapping) {
this.mapping = mapping;
this.strictMode = false;
}
encode(input, stream = new TapStreamWriter()) {
const entries = Object.entries(input);
const fieldsStream = new TapStreamWriter();
entries.forEach(([fieldName, value]) => {
const definition = this.mapping[fieldName];
if (!definition) {
throw TlvJsonCompressorError.unknownFieldName(fieldName);
}
fieldsStream.writeU1(definition.code.charCodeAt(0));
const encodedValue = definition.converter.encode(value);
writeFieldLength(fieldsStream, encodedValue.length);
fieldsStream.writeBytes(encodedValue);
});
const bytes = fieldsStream.toBytes;
writeFieldLength(stream, bytes.length);
stream.writeBytes(bytes);
return stream.toBytes;
}
decode(streamOrBuffer) {
const stream = TapStreamReader.create(streamOrBuffer);
const result = {};
const totalLength = readFieldLength(stream);
const initialPosition = stream.pos;
while (stream.pos - initialPosition < totalLength) {
const tag = stream.readU1();
const entry = findCodeDefinition(tag, this.mapping);
const length = readFieldLength(stream);
if (!entry) {
if (this.strictMode) {
throw TlvJsonCompressorError.unknownFieldCode(tag);
}
else {
stream.forward(length);
}
}
else {
const [fieldName, definition] = entry;
result[fieldName] = definition.converter.decode(stream);
}
}
return result;
}
}
export class TLVMappedJsonArrayCompressor {
constructor(options) {
this.options = options;
}
encode(input, stream = new TapStreamWriter()) {
const itemsStream = new TapStreamWriter();
input.forEach((v) => {
this.options.itemConverter.encode(v, itemsStream);
});
const encodedItems = itemsStream.toBytes;
writeFieldLength(stream, encodedItems.length);
stream.writeBytes(encodedItems);
return stream.toBytes;
}
decode(streamOrBuffer) {
const stream = TapStreamReader.create(streamOrBuffer);
const length = readFieldLength(stream);
const itemsStream = stream.subStream(length);
const result = [];
while (!itemsStream.isEof()) {
const item = this.options.itemConverter.decode(itemsStream);
result.push(item);
}
return result;
}
}
/**
* Optimization for an array of object,
* It will not duplicate object/field information for each items
*/
export class TLVMappedJsonArrayOfObjectCompressor {
constructor(options) {
this.options = options;
}
encode(input, stream = new TapStreamWriter()) {
const itemsStream = new TapStreamWriter();
DBIOT_UINT_CONVERTER.encode(input.length, itemsStream);
this.options.fields.forEach(({ fieldName, converter }) => {
input.forEach((item, index) => {
if (!(fieldName in item)) {
writeFieldLength(itemsStream, 0);
// throw new Error(`Field ${fieldName} is missing for item ${index}`);
}
else {
converter.encode(item[fieldName], itemsStream);
}
});
});
const encodedItems = itemsStream.toBytes;
writeFieldLength(stream, encodedItems.length);
stream.writeBytes(encodedItems);
return stream.toBytes;
}
decode(streamOrBuffer) {
const stream = TapStreamReader.create(streamOrBuffer);
const length = readFieldLength(stream);
const itemCount = DBIOT_UINT_CONVERTER.decode(stream);
const result = new Array(itemCount)
.fill(undefined)
.map(() => ({}));
this.options.fields.forEach(({ fieldName, converter }) => {
result.forEach((value, index) => {
const fieldValue = converter.decode(stream);
value[fieldName] = fieldValue;
});
});
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGx2LW1hcHBlZC1qc29uLWNvbXByZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9leHRyYS9kYmlvdC9zcmMvbGliL2pzb24tY29tcHJlc3Nvci90bHYtbWFwcGVkLWpzb24tY29tcHJlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFL0MsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXVCLEVBQUUsTUFBYztJQUN0RSxJQUFJLE1BQU0sR0FBRyxVQUFVLEVBQUU7UUFDdkIsSUFBSSxNQUFNLEdBQUcsTUFBTSxFQUFFO1lBQ25CLE1BQU0sc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDOUI7U0FBTTtRQUNMLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzdCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBdUI7SUFDckQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxt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