UNPKG

node-opcua-server

Version:

pure nodejs OPCUA SDK - module server

82 lines 4.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateFilter = validateFilter; /** * @module node-opcua-server */ const node_opcua_assert_1 = require("node-opcua-assert"); const node_opcua_data_model_1 = require("node-opcua-data-model"); const node_opcua_data_model_2 = require("node-opcua-data-model"); const node_opcua_nodeid_1 = require("node-opcua-nodeid"); const node_opcua_service_filter_1 = require("node-opcua-service-filter"); const node_opcua_service_subscription_1 = require("node-opcua-service-subscription"); const node_opcua_status_code_1 = require("node-opcua-status-code"); const node_opcua_basic_types_1 = require("node-opcua-basic-types"); const node_opcua_debug_1 = require("node-opcua-debug"); const warningLog = (0, node_opcua_debug_1.make_warningLog)(__filename); function isNumberDataType(node) { const n = node.dataType; if (n.namespace === 0 && n.identifierType === node_opcua_nodeid_1.NodeIdType.NUMERIC && n.value < 22) { switch (n.value) { case node_opcua_basic_types_1.DataType.Float: case node_opcua_basic_types_1.DataType.Double: case node_opcua_basic_types_1.DataType.Byte: case node_opcua_basic_types_1.DataType.SByte: case node_opcua_basic_types_1.DataType.Int16: case node_opcua_basic_types_1.DataType.Int32: case node_opcua_basic_types_1.DataType.Int64: case node_opcua_basic_types_1.DataType.UInt16: case node_opcua_basic_types_1.DataType.UInt32: case node_opcua_basic_types_1.DataType.UInt64: return true; default: return false; } } const dataType = node.addressSpace.findDataType(node.dataType); const dataTypeNumber = node.addressSpace.findDataType("Number"); return dataType.isSubtypeOf(dataTypeNumber); } function __validateDataChangeFilter(filter, itemToMonitor, node) { (0, node_opcua_assert_1.assert)(itemToMonitor.attributeId === node_opcua_data_model_1.AttributeIds.Value); if (node.nodeClass !== node_opcua_data_model_2.NodeClass.Variable) { return node_opcua_status_code_1.StatusCodes.BadNodeIdInvalid; } if (filter.deadbandType !== node_opcua_service_subscription_1.DeadbandType.None) { // if node is not Numerical=> DataChangeFilter (0, node_opcua_assert_1.assert)(node.dataType instanceof node_opcua_nodeid_1.NodeId); if (!isNumberDataType(node)) { return node_opcua_status_code_1.StatusCodes.BadFilterNotAllowed; } } if (filter.deadbandType === node_opcua_service_subscription_1.DeadbandType.Percent) { if (filter.deadbandValue < 0 || filter.deadbandValue > 100) { return node_opcua_status_code_1.StatusCodes.BadDeadbandFilterInvalid; } // node must also have a valid euRange if (!node.getChildByName("EURange", 0)) { warningLog(" node has no euRange ! Dead band Percent cannot be used on node " + node.nodeId.toString()); return node_opcua_status_code_1.StatusCodes.BadMonitoredItemFilterUnsupported; } } return node_opcua_status_code_1.StatusCodes.Good; } function validateFilter(filter, itemToMonitor, node) { // handle filter information if (filter && filter instanceof node_opcua_service_filter_1.EventFilter && itemToMonitor.attributeId !== node_opcua_data_model_1.AttributeIds.EventNotifier) { // invalid filter on Event return node_opcua_status_code_1.StatusCodes.BadFilterNotAllowed; } if (filter && filter instanceof node_opcua_service_filter_1.DataChangeFilter && itemToMonitor.attributeId !== node_opcua_data_model_1.AttributeIds.Value) { // invalid DataChange filter on non Value Attribute return node_opcua_status_code_1.StatusCodes.BadFilterNotAllowed; } if (filter && itemToMonitor.attributeId !== node_opcua_data_model_1.AttributeIds.EventNotifier && itemToMonitor.attributeId !== node_opcua_data_model_1.AttributeIds.Value) { return node_opcua_status_code_1.StatusCodes.BadFilterNotAllowed; } if (filter instanceof node_opcua_service_filter_1.DataChangeFilter) { return __validateDataChangeFilter(filter, itemToMonitor, node); } return node_opcua_status_code_1.StatusCodes.Good; } //# sourceMappingURL=validate_filter.js.map