node-opcua-service-filter
Advanced tools
Comparing version 2.143.0 to 2.149.0
@@ -13,21 +13,41 @@ "use strict"; | ||
if (value instanceof node_opcua_variant_1.Variant) { | ||
return _coerceToBoolean(value.value); | ||
return !!value.value; | ||
} | ||
return !!value; | ||
} | ||
function _coerceToNumber(value) { | ||
function _coerceToCompareable(value) { | ||
if (value instanceof node_opcua_variant_1.Variant) { | ||
return _coerceToNumber(value.value); | ||
switch (value.dataType) { | ||
case node_opcua_variant_1.DataType.String: | ||
return value.value; | ||
case node_opcua_variant_1.DataType.Byte: | ||
case node_opcua_variant_1.DataType.SByte: | ||
case node_opcua_variant_1.DataType.Int16: | ||
case node_opcua_variant_1.DataType.Int32: | ||
case node_opcua_variant_1.DataType.UInt16: | ||
case node_opcua_variant_1.DataType.UInt32: | ||
return value.value; | ||
case node_opcua_variant_1.DataType.Double: | ||
return value.value; | ||
case node_opcua_variant_1.DataType.DateTime: | ||
return value.value.getTime(); | ||
case node_opcua_variant_1.DataType.Guid: | ||
return value.value.toLowerCase(); | ||
case node_opcua_variant_1.DataType.ByteString: | ||
return value.value.toString("hex"); | ||
case node_opcua_variant_1.DataType.XmlElement: | ||
return value.value; | ||
case node_opcua_variant_1.DataType.LocalizedText: | ||
return value.value.text; | ||
case node_opcua_variant_1.DataType.QualifiedName: | ||
return value.value.name; // not sure about this one | ||
default: | ||
return ""; | ||
} | ||
} | ||
if (typeof value === "string") { | ||
return parseInt(value, 10); | ||
} | ||
if (typeof value === "boolean") { | ||
return value ? 1 : 0; | ||
} | ||
if (typeof value === "number") { | ||
return value; | ||
} | ||
return 0; | ||
return ""; | ||
} | ||
function _coerceToEqualable(value) { | ||
return value; | ||
} | ||
function evaluateOperand(filterContext, filter, operand, coerce) { | ||
@@ -112,25 +132,65 @@ if (operand instanceof node_opcua_types_1.AttributeOperand) { | ||
function checkLessThan(filterContext, filter, filteredOperands) { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
return operandA < operandB; | ||
} | ||
function checkLessThanOrEqual(filterContext, filter, filteredOperands) { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
return operandA <= operandB; | ||
} | ||
function checkGreaterThan(filterContext, filter, filteredOperands) { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
return operandA > operandB; | ||
} | ||
function checkGreaterThanOrEqual(filterContext, filter, filteredOperands) { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
return operandA >= operandB; | ||
} | ||
const isVariantEqual = (a, b) => { | ||
switch (a.dataType) { | ||
case node_opcua_variant_1.DataType.Null: | ||
return b.dataType === node_opcua_variant_1.DataType.Null; | ||
case node_opcua_variant_1.DataType.Boolean: | ||
return a.value === b.value; | ||
case node_opcua_variant_1.DataType.Byte: | ||
case node_opcua_variant_1.DataType.SByte: | ||
case node_opcua_variant_1.DataType.Int16: | ||
case node_opcua_variant_1.DataType.Int32: | ||
case node_opcua_variant_1.DataType.UInt16: | ||
case node_opcua_variant_1.DataType.UInt32: | ||
return a.value === b.value; | ||
case node_opcua_variant_1.DataType.Double: | ||
return a.value === b.value; | ||
case node_opcua_variant_1.DataType.String: | ||
return a.value === b.value; | ||
case node_opcua_variant_1.DataType.NodeId: | ||
return (0, node_opcua_nodeid_1.sameNodeId)(a.value, b.value); | ||
case node_opcua_variant_1.DataType.DateTime: | ||
return a.value?.getTime() === b.value.getTime(); | ||
case node_opcua_variant_1.DataType.Guid: | ||
return a.value.toLowerCase() === ("" + (b.value || "")).toLowerCase(); | ||
case node_opcua_variant_1.DataType.ByteString: | ||
if (b.dataType !== node_opcua_variant_1.DataType.ByteString) { | ||
return false; | ||
} | ||
return a.value.toString("hex") === b.value.toString("hex"); | ||
case node_opcua_variant_1.DataType.XmlElement: | ||
return a.value === b.value; | ||
case node_opcua_variant_1.DataType.LocalizedText: | ||
return a.value?.text === b.value?.text; | ||
case node_opcua_variant_1.DataType.QualifiedName: | ||
return a.value?.namespaceIndex === b.value?.namespaceIndex && a.value?.name === b.value?.name; | ||
case node_opcua_variant_1.DataType.ExtensionObject: | ||
console.log("isVariantEqual: Not implemented for DataType.ExtensionObject"); | ||
default: | ||
return false; // not sure how to do | ||
} | ||
}; | ||
function checkEquals(filterContext, filter, filteredOperands) { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
return operandA === operandB; | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToEqualable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToEqualable); | ||
return isVariantEqual(operandA, operandB); | ||
} | ||
@@ -150,5 +210,5 @@ /** | ||
function checkBetween(filterContext, filter, filteredOperands) { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandLow = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandHigh = evaluateOperand(filterContext, filter, filteredOperands[2], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandLow = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
const operandHigh = evaluateOperand(filterContext, filter, filteredOperands[2], _coerceToCompareable); | ||
return operandA >= operandLow && operandA <= operandHigh; | ||
@@ -155,0 +215,0 @@ } |
{ | ||
"name": "node-opcua-service-filter", | ||
"version": "2.143.0", | ||
"version": "2.149.0", | ||
"description": "pure nodejs OPCUA SDK - module service-filter", | ||
@@ -13,3 +13,3 @@ "main": "./dist/index.js", | ||
"dependencies": { | ||
"node-opcua-address-space-base": "2.143.0", | ||
"node-opcua-address-space-base": "2.149.0", | ||
"node-opcua-assert": "2.139.0", | ||
@@ -47,3 +47,3 @@ "node-opcua-basic-types": "2.139.0", | ||
"homepage": "http://node-opcua.github.io/", | ||
"gitHead": "3bd85d4036f219f6f7e401d54e60afb3592ff1ba", | ||
"gitHead": "f88519f1ee215d924c051e86a8ccf0eca3be27bd", | ||
"files": [ | ||
@@ -50,0 +50,0 @@ "dist", |
@@ -21,24 +21,44 @@ import { | ||
function _coerceToBoolean(value: Variant | number | string | null | boolean): boolean { | ||
function _coerceToBoolean(value: Variant | string| number | null ): boolean { | ||
if (value instanceof Variant) { | ||
return _coerceToBoolean(value.value); | ||
return !!value.value; | ||
} | ||
return !!value; | ||
} | ||
function _coerceToNumber(value: Variant | number | string | null | boolean): number { | ||
function _coerceToCompareable(value: Variant): string | number { | ||
if (value instanceof Variant) { | ||
return _coerceToNumber(value.value); | ||
switch (value.dataType) { | ||
case DataType.String: | ||
return value.value; | ||
case DataType.Byte: | ||
case DataType.SByte: | ||
case DataType.Int16: | ||
case DataType.Int32: | ||
case DataType.UInt16: | ||
case DataType.UInt32: | ||
return value.value; | ||
case DataType.Double: | ||
return value.value; | ||
case DataType.DateTime: | ||
return value.value.getTime(); | ||
case DataType.Guid: | ||
return value.value.toLowerCase(); | ||
case DataType.ByteString: | ||
return value.value.toString("hex"); | ||
case DataType.XmlElement: | ||
return value.value; | ||
case DataType.LocalizedText: | ||
return value.value.text; | ||
case DataType.QualifiedName: | ||
return value.value.name; // not sure about this one | ||
default: | ||
return ""; | ||
} | ||
} | ||
if (typeof value === "string") { | ||
return parseInt(value, 10); | ||
} | ||
if (typeof value === "boolean") { | ||
return value ? 1 : 0; | ||
} | ||
if (typeof value === "number") { | ||
return value; | ||
} | ||
return 0; | ||
return ""; | ||
} | ||
function _coerceToEqualable(value: Variant): Variant { | ||
return value; | ||
} | ||
function evaluateOperand<T>( | ||
@@ -134,4 +154,4 @@ filterContext: FilterContext, | ||
function checkLessThan(filterContext: FilterContext, filter: ContentFilter, filteredOperands: FilterOperand[]): boolean { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
return operandA < operandB; | ||
@@ -141,4 +161,4 @@ } | ||
function checkLessThanOrEqual(filterContext: FilterContext, filter: ContentFilter, filteredOperands: FilterOperand[]): boolean { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
return operandA <= operandB; | ||
@@ -148,4 +168,4 @@ } | ||
function checkGreaterThan(filterContext: FilterContext, filter: ContentFilter, filteredOperands: FilterOperand[]): boolean { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
return operandA > operandB; | ||
@@ -155,10 +175,53 @@ } | ||
function checkGreaterThanOrEqual(filterContext: FilterContext, filter: ContentFilter, filteredOperands: FilterOperand[]): boolean { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
return operandA >= operandB; | ||
} | ||
const isVariantEqual = (a: Variant, b: Variant): boolean => { | ||
switch (a.dataType) { | ||
case DataType.Null: | ||
return b.dataType === DataType.Null; | ||
case DataType.Boolean: | ||
return a.value === b.value; | ||
case DataType.Byte: | ||
case DataType.SByte: | ||
case DataType.Int16: | ||
case DataType.Int32: | ||
case DataType.UInt16: | ||
case DataType.UInt32: | ||
return a.value === b.value; | ||
case DataType.Double: | ||
return a.value === b.value; | ||
case DataType.String: | ||
return a.value === b.value; | ||
case DataType.NodeId: | ||
return sameNodeId(a.value as NodeId, b.value as NodeId); | ||
case DataType.DateTime: | ||
return (a.value as Date)?.getTime() === (b.value as Date).getTime(); | ||
case DataType.Guid: | ||
return a.value.toLowerCase() === ("" + (b.value || "")).toLowerCase(); | ||
case DataType.ByteString: | ||
if (b.dataType !== DataType.ByteString) { | ||
return false; | ||
} | ||
return a.value.toString("hex") === b.value.toString("hex"); | ||
case DataType.XmlElement: | ||
return a.value === b.value; | ||
case DataType.LocalizedText: | ||
return a.value?.text === b.value?.text; | ||
case DataType.QualifiedName: | ||
return a.value?.namespaceIndex === b.value?.namespaceIndex && a.value?.name === b.value?.name; | ||
case DataType.ExtensionObject: | ||
console.log("isVariantEqual: Not implemented for DataType.ExtensionObject"); | ||
default: | ||
return false; // not sure how to do | ||
} | ||
} | ||
function checkEquals(filterContext: FilterContext, filter: ContentFilter, filteredOperands: FilterOperand[]): boolean { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
return operandA === operandB; | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToEqualable); | ||
const operandB = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToEqualable); | ||
return isVariantEqual(operandA, operandB); | ||
} | ||
@@ -178,5 +241,5 @@ /** | ||
function checkBetween(filterContext: FilterContext, filter: ContentFilter, filteredOperands: FilterOperand[]): boolean { | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToNumber); | ||
const operandLow = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToNumber); | ||
const operandHigh = evaluateOperand(filterContext, filter, filteredOperands[2], _coerceToNumber); | ||
const operandA = evaluateOperand(filterContext, filter, filteredOperands[0], _coerceToCompareable); | ||
const operandLow = evaluateOperand(filterContext, filter, filteredOperands[1], _coerceToCompareable); | ||
const operandHigh = evaluateOperand(filterContext, filter, filteredOperands[2], _coerceToCompareable); | ||
return operandA >= operandLow && operandA <= operandHigh; | ||
@@ -183,0 +246,0 @@ } |
Sorry, the diff of this file is not supported yet
120256
1919
+ Addednode-opcua-address-space-base@2.149.0(transitive)
- Removednode-opcua-address-space-base@2.143.0(transitive)