UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

150 lines 10.6 kB
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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