UNPKG

@iotize/tap-scripts

Version:

IoTize Tap scripts

125 lines 10.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CheckInstruction = exports.CheckFailedError = void 0; const byte_converter_1 = require("@iotize/common/byte-converter"); const definitions_1 = require("../definitions"); const errors_1 = require("../errors"); const logger_1 = require("../logger"); const util_1 = require("../util"); const abstract_instruction_1 = require("./abstract-instruction"); class CheckFailedError extends Error { constructor(ctx, lastResponse) { super(`${(0, util_1.contextToString)(ctx)} check was not evaluated to true. ${lastResponse ? `Last response body: 0x${(0, byte_converter_1.bufferToHexString)(lastResponse.rawBody())}` : ''}`); } } exports.CheckFailedError = CheckFailedError; /** * Throw an error if check confition is not met */ class CheckInstruction extends abstract_instruction_1.AbstractInstruction { constructor(node, dataSizeOf, parserContext) { super(parserContext ? parserContext.text : undefined); this.node = node; this.parserContext = parserContext; this.arrayEql = (a, b) => { if (a === b) return true; if (a == null || b == null) return false; if (a.length != b.length) return false; // If you don't care about the order of the elements inside // the array, you should sort both arrays here. // Please note that calling sort on an array will modify that array. // you might want to clone your array first. for (var i = 0; i < a.length; ++i) { if (a[i] !== b[i]) return false; } return true; }; if (!dataSizeOf) { this.dataSizeOf = 0; } else { this.dataSizeOf = dataSizeOf; } } /** * Return true if check passed, false otherwise * @param context */ run(context) { if (!context.lastLwm2mGetResponse) { throw errors_1.ScriptError.invalidRunState('Cannot run check before left operand if there is no lwm2m GET command before'); } let leftValue = context.lastLwm2mGetResponse.rawBody() || new Uint8Array(0); let isValid = this.evaluate(leftValue); if (!isValid) { throw new CheckFailedError(this.parserContext, context.lastLwm2mGetResponse); } return isValid; } evaluate(leftValue) { if (typeof this.node.endOffset == 'number' && !isNaN(this.node.endOffset)) { (0, logger_1.debug)('CheckInstruction', `subarray for left ${this.node.endOffset} (${typeof this.node .endOffset})`); leftValue = leftValue.subarray(0, this.node.endOffset); } let right = this.node.right; let isTrue = this.evalComparison(leftValue, this.node.operator, right, this.dataSizeOf); return isTrue; } /** * TODO */ evalComparison(left, op, right, dataSizeOf) { if (typeof right === 'string') { let newLeft = (0, byte_converter_1.bufferToAsciiString)(left); let javascript = `"${newLeft}" ${op.toString()} "${right}"`; if (op === definitions_1.ComparisonOperatorType.EQ) { return newLeft.startsWith(right); } return this._eval(javascript); } else if (Array.isArray(right) && right.length == 1) { let rightNumber = right[0]; if (!dataSizeOf) { dataSizeOf = left.length; } let newLeft = (0, byte_converter_1.bufferToHexString)(left); let javascript = `0x${newLeft || '0'} ${op.toString()} ${rightNumber}`; return this._eval(javascript); } else if (Array.isArray(right)) { // TODO check wordsize (0, logger_1.debug)(`Array check `, left, this.node.operator, right); switch (this.node.operator) { case definitions_1.ComparisonOperatorType.EQ: return this.arrayEql(Array.from(left), right); case definitions_1.ComparisonOperatorType.NQ: case definitions_1.ComparisonOperatorType.NQ2: return !this.arrayEql(Array.from(left), right); default: throw errors_1.ScriptError.invalidRunState(`Operator ${this.node.operator} is not available for array comparaison`); } } else { throw errors_1.ScriptError.instructionPartiallyImplemented(this, `Comparaison with operator ${op} on right operand type ${typeof right} is not implemented yet`); } } _eval(input) { (0, logger_1.debug)(`CheckInstruction`, `_eval`, `${input}`); let isTrue = eval(input); return isTrue; } describe() { return `Check last LWM2M response`; } } exports.CheckInstruction = CheckInstruction; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2staW5zdHJ1Y3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2luc3RydWN0aW9ucy9jaGVjay1pbnN0cnVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrRUFBdUY7QUFJdkYsZ0RBQTRFO0FBQzVFLHNDQUF3QztBQUN4QyxzQ0FBa0M7QUFFbEMsa0NBQTBDO0FBQzFDLGlFQUE2RDtBQUU3RCxNQUFhLGdCQUFpQixTQUFRLEtBQUs7SUFDdkMsWUFDSSxHQUE2QixFQUM3QixZQUErQjtRQUUvQixLQUFLLENBQ0QsR0FBRyxJQUFBLHNCQUFlLEVBQUMsR0FBRyxDQUFDLHFDQUN2QixZQUFZO1lBQ1IsQ0FBQyxDQUFDLHlCQUF5QixJQUFBLGtDQUFpQixFQUN4QyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQ3pCLEVBQUU7WUFDSCxDQUFDLENBQUMsRUFDTixFQUFFLENBQ0wsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQWZELDRDQWVDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGdCQUFpQixTQUFRLDBDQUE0QjtJQW1COUQsWUFDYyxJQUF3QixFQUNsQyxVQUFtQixFQUNaLGFBQXVDO1FBRTlDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBSjVDLFNBQUksR0FBSixJQUFJLENBQW9CO1FBRTNCLGtCQUFhLEdBQWIsYUFBYSxDQUEwQjtRQXJCM0MsYUFBUSxHQUFvQyxDQUFDLENBQVEsRUFBRSxDQUFRLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN6QyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1B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