@iotize/tap
Version:
IoTize Device client for Javascript
150 lines • 10.6 kB
JavaScript
import { TLV } from '@iotize/common/tlv';
import { TLVConverter } from '../tlv-converter';
export class TlvBundleConverter {
constructor(variables = [], tlvConverter = new TLVConverter()) {
this.variables = variables;
this.tlvConverter = tlvConverter;
this.bundleId = 0;
}
decode(data, context) {
if (data instanceof Uint8Array) {
// Why this?
// const buffer = Buffer.from(data.buffer);
data = this.tlvConverter.decode(data);
}
const result = this._convertFromTlvTree(data);
if (!result || typeof result !== 'object' || result instanceof Uint8Array) {
throw new Error(`Invalid TLV frame`); // TODO proper error code
}
return result;
}
// {
// "header": {
// "id": 1,
// "type": 2,
// "len": 12
// },
// "children": [
// {
// "header": {
// "id": 1,
// "type": 3,
// "len": 4
// },
// "payload": {
// "type": "Buffer",
// "data": [
// 64,
// 83,
// 127,
// 58
// ]
// }
// },
// {
// "header": {
// "id": 2,
// "type": 3,
// "len": 4
// },
// "payload": {
// "type": "Buffer",
// "data": [
// 65,
// 243,
// 141,
// 114
// ]
// }
// }
// ]
// }
encode(data) {
var _a;
const tree = {
header: {
id: this.bundleId,
len: 0,
type: TLV.IdentifierType.MULTIPLE_RESOURCE,
},
children: [],
};
let totalLength = 0;
for (const key in data) {
const value = data[key];
let encodedValue;
let meta = this.variables.find((m) => m.name === key);
if (!meta) {
meta = this.variables.find((m) => m.id === parseInt(key, 10));
}
// if (!meta) {
// // TODO use proper error with ErrorCode
// throw new Error(`Cannot find variable by identifier "${key}"`);
// }
if (meta === null || meta === void 0 ? void 0 : meta.converter) {
encodedValue = (_a = meta.converter) === null || _a === void 0 ? void 0 : _a.encode(value);
}
else {
if (!(value instanceof Uint8Array)) {
throw new Error(`Add converter for variable with identifier "${key}"`);
}
encodedValue = value;
}
if (!tree.children) {
tree.children = [];
}
const id = (meta === null || meta === void 0 ? void 0 : meta.id) || parseInt(key, 10);
if (isNaN(id)) {
throw new Error(`Cannot find variable by identifier "${key}"`);
}
tree.children.push({
header: {
id,
len: encodedValue.length,
type: TLV.IdentifierType.RESOURCE_VALUE,
},
payload: encodedValue,
});
totalLength += encodedValue.length + 2; // 2 for header length
}
tree.header.len = totalLength;
return this.tlvConverter.encode(tree);
}
/**
* Converter tlv tree to variable name => value
*/
_convertFromTlvTree(tree, variableMeta) {
// console.log('TLV =>', JSON.stringify(tree, null, 4));
let result = {};
// Recursive call to decode children
if (tree.children) {
result = {};
for (const child of tree.children) {
const variableMetas = this.variables.filter((v) => v.id == child.header.id);
if (variableMetas.length == 0) {
variableMetas.push({
id: child.header.id,
});
}
for (const variableMeta of variableMetas) {
const key = variableMeta && variableMeta.name
? variableMeta.name
: child.header.id.toString();
result[key] = this._convertFromTlvTree(child, variableMeta);
}
}
}
// Decode current node
else if (tree.payload) {
const converter = variableMeta ? variableMeta.converter : undefined;
if (converter) {
result = converter.decode(tree.payload);
}
else {
result = Uint8Array.from(tree.payload);
}
}
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGx2LWJ1bmRsZS1jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jbGllbnQvaW1wbC9zcmMvbGliL2NvbnZlcnRlci9ib2R5L3Rsdi1idW5kbGUtY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUd6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFPaEQsTUFBTSxPQUFPLGtCQUFrQjtJQUs3QixZQUNZLFlBQTRCLEVBQUUsRUFDOUIsZUFBNkIsSUFBSSxZQUFZLEVBQUU7UUFEL0MsY0FBUyxHQUFULFNBQVMsQ0FBcUI7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQW1DO1FBSjNELGFBQVEsR0FBRyxDQUFDLENBQUM7SUFLVixDQUFDO0lBRUosTUFBTSxDQUFDLElBQThCLEVBQUUsT0FBYTtRQUNsRCxJQUFJLElBQUksWUFBWSxVQUFVLEVBQUU7WUFDOUIsWUFBWTtZQUNaLDJDQUEyQztZQUMzQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxZQUFZLFVBQVUsRUFBRTtZQUN6RSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyx5QkFBeUI7U0FDaEU7UUFDRCxPQUFPLE1BQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUk7SUFDSixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsU0FBUztJQUNULG9CQUFvQjtJQUNwQixZQUFZ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