@iotize/tap-scripts
Version:
IoTize Tap scripts
125 lines • 10.4 kB
JavaScript
;
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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