node-opcua-server 2.84.0 → 2.86.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base_server.js +6 -6
- package/dist/base_server.js.map +1 -1
- package/dist/monitored_item.d.ts +2 -2
- package/dist/monitored_item.js +9 -13
- package/dist/monitored_item.js.map +1 -1
- package/dist/opcua_server.d.ts +1 -1
- package/dist/opcua_server.js +126 -140
- package/dist/opcua_server.js.map +1 -1
- package/dist/sampling_func.d.ts +1 -1
- package/dist/server_capabilities.d.ts +1 -1
- package/dist/server_end_point.d.ts +3 -3
- package/dist/server_end_point.js +4 -4
- package/dist/server_end_point.js.map +1 -1
- package/dist/server_engine.d.ts +3 -3
- package/dist/server_publish_engine.js +22 -22
- package/dist/server_publish_engine.js.map +1 -1
- package/dist/server_session.d.ts +1 -1
- package/dist/server_subscription.d.ts +4 -4
- package/dist/server_subscription.js +26 -26
- package/dist/server_subscription.js.map +1 -1
- package/dist/user_manager.d.ts +3 -3
- package/dist/validate_filter.js +1 -1
- package/dist/validate_filter.js.map +1 -1
- package/package.json +43 -43
- package/source/monitored_item.ts +3 -8
- package/source/opcua_server.ts +68 -82
- package/source/server_end_point.ts +9 -10
- package/source/server_subscription.ts +2 -2
- package/source/validate_filter.ts +1 -1
package/source/monitored_item.ts
CHANGED
|
@@ -108,7 +108,7 @@ function _validate_parameters(monitoringParameters: any) {
|
|
|
108
108
|
function statusCodeHasChanged(newDataValue: DataValue, oldDataValue: DataValue): boolean {
|
|
109
109
|
assert(newDataValue instanceof DataValue);
|
|
110
110
|
assert(oldDataValue instanceof DataValue);
|
|
111
|
-
return newDataValue.statusCode !== oldDataValue.statusCode;
|
|
111
|
+
return newDataValue.statusCode.value !== oldDataValue.statusCode.value;
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
function valueHasChanged(
|
|
@@ -145,7 +145,6 @@ function valueHasChanged(
|
|
|
145
145
|
// DataChange if (absolute value of (last cached value - current value) >
|
|
146
146
|
// (deadbandValue/100.0) * ((high-low) of EURange)))
|
|
147
147
|
//
|
|
148
|
-
// Specifying a deadbandValue outside of this range will be rejected and reported with the
|
|
149
148
|
// StatusCode BadDeadbandFilterInvalid (see Table 27).
|
|
150
149
|
// If the Value of the MonitoredItem is an array, then the deadband calculation logic shall be applied to
|
|
151
150
|
// each element of the array. If an element that requires a DataChange is found, then no further
|
|
@@ -180,10 +179,6 @@ function timestampHasChanged(t1: DateTime, t2: DateTime): boolean {
|
|
|
180
179
|
return (t1 as Date).getTime() !== (t2 as Date).getTime();
|
|
181
180
|
}
|
|
182
181
|
|
|
183
|
-
function isGoodish(statusCode: StatusCode): boolean {
|
|
184
|
-
return statusCode.value < 0x10000000;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
182
|
function apply_dataChange_filter(this: MonitoredItem, newDataValue: DataValue, oldDataValue: DataValue): boolean {
|
|
188
183
|
/* istanbul ignore next */
|
|
189
184
|
if (!this.filter || !(this.filter instanceof DataChangeFilter)) {
|
|
@@ -993,7 +988,7 @@ export class MonitoredItem extends EventEmitter {
|
|
|
993
988
|
return callback(new Error("Invalid "));
|
|
994
989
|
}
|
|
995
990
|
const variable = (this.node as UAVariable);
|
|
996
|
-
if (!this.oldDataValue || this.oldDataValue.statusCode == StatusCodes.BadDataUnavailable) {
|
|
991
|
+
if (!this.oldDataValue || this.oldDataValue.statusCode.value == StatusCodes.BadDataUnavailable.value) {
|
|
997
992
|
variable.readValueAsync(sessionContext, (err: Error | null, dataValue?: DataValue) => {
|
|
998
993
|
callback(err, dataValue);
|
|
999
994
|
});
|
|
@@ -1198,7 +1193,7 @@ export class MonitoredItem extends EventEmitter {
|
|
|
1198
1193
|
|
|
1199
1194
|
assert(dataValue instanceof DataValue);
|
|
1200
1195
|
// lets verify that, if status code is good then we have a valid Variant in the dataValue
|
|
1201
|
-
assert(!
|
|
1196
|
+
assert(!dataValue.statusCode.isGoodish() || dataValue.value instanceof Variant);
|
|
1202
1197
|
// xx assert(isGoodish(dataValue.statusCode) || util.isNullOrUndefined(dataValue.value) );
|
|
1203
1198
|
// let's check that data Value is really a different object
|
|
1204
1199
|
// we may end up with corrupted queue if dataValue are recycled and stored as is in notifications
|
package/source/opcua_server.ts
CHANGED
|
@@ -40,7 +40,9 @@ import {
|
|
|
40
40
|
UAView,
|
|
41
41
|
EventTypeLike,
|
|
42
42
|
UAObjectType,
|
|
43
|
-
PseudoVariantStringPredefined
|
|
43
|
+
PseudoVariantStringPredefined,
|
|
44
|
+
innerBrowse,
|
|
45
|
+
innerBrowseNext
|
|
44
46
|
} from "node-opcua-address-space";
|
|
45
47
|
import { getDefaultCertificateManager, OPCUACertificateManager } from "node-opcua-certificate-manager";
|
|
46
48
|
import { ServerState } from "node-opcua-common";
|
|
@@ -132,7 +134,7 @@ import {
|
|
|
132
134
|
TranslateBrowsePathsToNodeIdsResponse
|
|
133
135
|
} from "node-opcua-service-translate-browse-path";
|
|
134
136
|
import { WriteRequest, WriteResponse } from "node-opcua-service-write";
|
|
135
|
-
import { ErrorCallback, StatusCode, StatusCodes } from "node-opcua-status-code";
|
|
137
|
+
import { CallbackT, ErrorCallback, StatusCode, StatusCodes } from "node-opcua-status-code";
|
|
136
138
|
import {
|
|
137
139
|
ApplicationDescriptionOptions,
|
|
138
140
|
BrowseResult,
|
|
@@ -149,7 +151,8 @@ import {
|
|
|
149
151
|
IssuedIdentityToken,
|
|
150
152
|
BrowseResultOptions,
|
|
151
153
|
ServiceFault,
|
|
152
|
-
ServerDiagnosticsSummaryDataType
|
|
154
|
+
ServerDiagnosticsSummaryDataType,
|
|
155
|
+
BrowseDescriptionOptions
|
|
153
156
|
} from "node-opcua-types";
|
|
154
157
|
import { DataType } from "node-opcua-variant";
|
|
155
158
|
import { VariantArrayType } from "node-opcua-variant";
|
|
@@ -1577,16 +1580,17 @@ export class OPCUAServer extends OPCUABaseServer {
|
|
|
1577
1580
|
}
|
|
1578
1581
|
}
|
|
1579
1582
|
if (
|
|
1580
|
-
|
|
1581
|
-
StatusCodes.
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1583
|
+
certificateStatus &&
|
|
1584
|
+
(StatusCodes.BadCertificateUntrusted.equals(certificateStatus) ||
|
|
1585
|
+
StatusCodes.BadCertificateTimeInvalid.equals(certificateStatus) ||
|
|
1586
|
+
StatusCodes.BadCertificateIssuerTimeInvalid.equals(certificateStatus) ||
|
|
1587
|
+
StatusCodes.BadCertificateIssuerUseNotAllowed.equals(certificateStatus) ||
|
|
1588
|
+
StatusCodes.BadCertificateIssuerRevocationUnknown.equals(certificateStatus) ||
|
|
1589
|
+
StatusCodes.BadCertificateRevocationUnknown.equals(certificateStatus) ||
|
|
1590
|
+
StatusCodes.BadCertificateRevoked.equals(certificateStatus) ||
|
|
1591
|
+
StatusCodes.BadCertificateUseNotAllowed.equals(certificateStatus) ||
|
|
1592
|
+
StatusCodes.BadSecurityChecksFailed.equals(certificateStatus) ||
|
|
1593
|
+
!StatusCodes.Good.equals(certificateStatus))
|
|
1590
1594
|
) {
|
|
1591
1595
|
debugLog("isValidX509IdentityToken => certificateStatus = ", certificateStatus?.toString());
|
|
1592
1596
|
|
|
@@ -2029,7 +2033,7 @@ export class OPCUAServer extends OPCUABaseServer {
|
|
|
2029
2033
|
const session = this.getSession(authenticationToken);
|
|
2030
2034
|
|
|
2031
2035
|
function rejectConnection(server: OPCUAServer, statusCode: StatusCode): void {
|
|
2032
|
-
if (statusCode
|
|
2036
|
+
if (statusCode.equals(StatusCodes.BadSessionIdInvalid)) {
|
|
2033
2037
|
server.engine.incrementRejectedSessionCount();
|
|
2034
2038
|
} else {
|
|
2035
2039
|
server.engine.incrementRejectedSessionCount();
|
|
@@ -2125,7 +2129,7 @@ export class OPCUAServer extends OPCUABaseServer {
|
|
|
2125
2129
|
request.userTokenSignature,
|
|
2126
2130
|
session.endpoint!,
|
|
2127
2131
|
(err: Error | null, statusCode?: StatusCode) => {
|
|
2128
|
-
if (statusCode
|
|
2132
|
+
if (!statusCode || statusCode.isNotGood()) {
|
|
2129
2133
|
/* istanbul ignore next */
|
|
2130
2134
|
if (!(statusCode && statusCode instanceof StatusCode)) {
|
|
2131
2135
|
return rejectConnection(this, StatusCodes.BadCertificateInvalid);
|
|
@@ -2283,7 +2287,7 @@ export class OPCUAServer extends OPCUABaseServer {
|
|
|
2283
2287
|
return sendResponse(response);
|
|
2284
2288
|
}
|
|
2285
2289
|
|
|
2286
|
-
assert(message.session_statusCode
|
|
2290
|
+
assert(message.session_statusCode.isGood());
|
|
2287
2291
|
|
|
2288
2292
|
// OPC UA Specification 1.02 part 4 page 26
|
|
2289
2293
|
// When a Session is terminated, all outstanding requests on the Session are aborted and
|
|
@@ -2532,50 +2536,34 @@ export class OPCUAServer extends OPCUABaseServer {
|
|
|
2532
2536
|
assert(request.nodesToBrowse[0].schema.name === "BrowseDescription");
|
|
2533
2537
|
|
|
2534
2538
|
const context = session.sessionContext;
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
if (session.continuationPointManager.hasReachedMaximum(maxBrowseContinuationPoints)) {
|
|
2556
|
-
return new BrowseResult({ statusCode: StatusCodes.BadNoContinuationPoints });
|
|
2539
|
+
const browseAll = (nodesToBrowse: BrowseDescriptionOptions[], callack: CallbackT<BrowseResult[]>) => {
|
|
2540
|
+
const f = callbackify(this.engine.browseWithAutomaticExpansion).bind(this.engine);
|
|
2541
|
+
(f as any)(request.nodesToBrowse, context, callack);
|
|
2542
|
+
};
|
|
2543
|
+
// handle continuation point and requestedMaxReferencesPerNode
|
|
2544
|
+
const maxBrowseContinuationPoints = this.engine.serverCapabilities.maxBrowseContinuationPoints;
|
|
2545
|
+
|
|
2546
|
+
innerBrowse(
|
|
2547
|
+
{
|
|
2548
|
+
browseAll,
|
|
2549
|
+
context,
|
|
2550
|
+
continuationPointManager: session.continuationPointManager,
|
|
2551
|
+
requestedMaxReferencesPerNode,
|
|
2552
|
+
maxBrowseContinuationPoints
|
|
2553
|
+
},
|
|
2554
|
+
request.nodesToBrowse,
|
|
2555
|
+
(err, results) => {
|
|
2556
|
+
if (!results) {
|
|
2557
|
+
return sendError(StatusCodes.BadInternalError);
|
|
2557
2558
|
}
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
);
|
|
2563
|
-
let { statusCode } = truncatedResult;
|
|
2564
|
-
const { continuationPoint, values } = truncatedResult;
|
|
2565
|
-
statusCode = result.statusCode;
|
|
2566
|
-
return new BrowseResult({
|
|
2567
|
-
statusCode,
|
|
2568
|
-
continuationPoint,
|
|
2569
|
-
references: values
|
|
2559
|
+
assert(results[0].schema.name === "BrowseResult");
|
|
2560
|
+
response = new BrowseResponse({
|
|
2561
|
+
diagnosticInfos: undefined,
|
|
2562
|
+
results
|
|
2570
2563
|
});
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
diagnosticInfos: undefined,
|
|
2575
|
-
results
|
|
2576
|
-
});
|
|
2577
|
-
sendResponse(response);
|
|
2578
|
-
});
|
|
2564
|
+
sendResponse(response);
|
|
2565
|
+
}
|
|
2566
|
+
);
|
|
2579
2567
|
}
|
|
2580
2568
|
);
|
|
2581
2569
|
}
|
|
@@ -2597,28 +2585,23 @@ export class OPCUAServer extends OPCUABaseServer {
|
|
|
2597
2585
|
if (!request.continuationPoints || request.continuationPoints.length === 0) {
|
|
2598
2586
|
return sendError(StatusCodes.BadNothingToDo);
|
|
2599
2587
|
}
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
session.continuationPointManager
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
const response = new BrowseNextResponse({
|
|
2618
|
-
diagnosticInfos: undefined,
|
|
2619
|
-
results
|
|
2620
|
-
});
|
|
2621
|
-
sendResponse(response);
|
|
2588
|
+
innerBrowseNext(
|
|
2589
|
+
{
|
|
2590
|
+
continuationPointManager: session.continuationPointManager
|
|
2591
|
+
},
|
|
2592
|
+
request.continuationPoints,
|
|
2593
|
+
request.releaseContinuationPoints,
|
|
2594
|
+
(err, results) => {
|
|
2595
|
+
if (err) {
|
|
2596
|
+
return sendError(StatusCodes.BadInternalError);
|
|
2597
|
+
}
|
|
2598
|
+
const response = new BrowseNextResponse({
|
|
2599
|
+
diagnosticInfos: undefined,
|
|
2600
|
+
results
|
|
2601
|
+
});
|
|
2602
|
+
sendResponse(response);
|
|
2603
|
+
}
|
|
2604
|
+
);
|
|
2622
2605
|
}
|
|
2623
2606
|
);
|
|
2624
2607
|
}
|
|
@@ -3191,7 +3174,7 @@ export class OPCUAServer extends OPCUABaseServer {
|
|
|
3191
3174
|
linksToAdd,
|
|
3192
3175
|
linksToRemove
|
|
3193
3176
|
);
|
|
3194
|
-
if (statusCode
|
|
3177
|
+
if (statusCode.isNotGood()) {
|
|
3195
3178
|
const response = new ServiceFault({ responseHeader: { serviceResult: statusCode } });
|
|
3196
3179
|
sendResponse(response);
|
|
3197
3180
|
} else {
|
|
@@ -3506,7 +3489,10 @@ export class OPCUAServer extends OPCUABaseServer {
|
|
|
3506
3489
|
return g_sendError(channel, message, HistoryUpdateResponse, StatusCodes.BadServiceUnsupported);
|
|
3507
3490
|
}
|
|
3508
3491
|
|
|
3509
|
-
private createEndpoint(
|
|
3492
|
+
private createEndpoint(
|
|
3493
|
+
port1: number,
|
|
3494
|
+
serverOptions: { defaultSecureTokenLifetime?: number; timeout?: number }
|
|
3495
|
+
): OPCUAServerEndPoint {
|
|
3510
3496
|
// add the tcp/ip endpoint with no security
|
|
3511
3497
|
const endPoint = new OPCUAServerEndPoint({
|
|
3512
3498
|
port: port1,
|
|
@@ -10,7 +10,7 @@ import * as async from "async";
|
|
|
10
10
|
|
|
11
11
|
import { assert } from "node-opcua-assert";
|
|
12
12
|
import { ICertificateManager, OPCUACertificateManager } from "node-opcua-certificate-manager";
|
|
13
|
-
import { Certificate, convertPEMtoDER, makeSHA1Thumbprint, PrivateKeyPEM, split_der } from "node-opcua-crypto";
|
|
13
|
+
import { Certificate, convertPEMtoDER, makeSHA1Thumbprint, PrivateKey, PrivateKeyPEM, split_der } from "node-opcua-crypto";
|
|
14
14
|
import { checkDebugFlag, make_debugLog, make_errorLog, make_warningLog } from "node-opcua-debug";
|
|
15
15
|
import { getFullyQualifiedDomainName, resolveFullyQualifiedDomainName } from "node-opcua-hostname";
|
|
16
16
|
import {
|
|
@@ -112,7 +112,7 @@ function dumpChannelInfo(channels: ServerSecureChannelLayer[]): void {
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
const emptyCertificate = Buffer.alloc(0);
|
|
115
|
-
const
|
|
115
|
+
const emptyPrivateKey = null as any as PrivateKey;
|
|
116
116
|
|
|
117
117
|
let OPCUAServerEndPointCounter = 0;
|
|
118
118
|
|
|
@@ -129,7 +129,7 @@ export interface OPCUAServerEndPointOptions {
|
|
|
129
129
|
/**
|
|
130
130
|
* privateKey
|
|
131
131
|
*/
|
|
132
|
-
privateKey:
|
|
132
|
+
privateKey: PrivateKey;
|
|
133
133
|
|
|
134
134
|
certificateManager: OPCUACertificateManager;
|
|
135
135
|
|
|
@@ -169,7 +169,7 @@ export interface AddStandardEndpointDescriptionsParam {
|
|
|
169
169
|
allowAnonymous?: boolean;
|
|
170
170
|
disableDiscovery?: boolean;
|
|
171
171
|
securityModes?: MessageSecurityMode[];
|
|
172
|
-
|
|
172
|
+
|
|
173
173
|
restricted?: boolean;
|
|
174
174
|
allowUnsecurePassword?: boolean;
|
|
175
175
|
resourcePath?: string;
|
|
@@ -225,7 +225,7 @@ export class OPCUAServerEndPoint extends EventEmitter implements ServerSecureCha
|
|
|
225
225
|
public _on_openSecureChannelFailure?: (socketData: any, channelData: any) => void;
|
|
226
226
|
|
|
227
227
|
private _certificateChain: Certificate;
|
|
228
|
-
private _privateKey:
|
|
228
|
+
private _privateKey: PrivateKey;
|
|
229
229
|
private _channels: { [key: string]: ServerSecureChannelLayer };
|
|
230
230
|
private _server?: Server;
|
|
231
231
|
private _endpoints: EndpointDescription[];
|
|
@@ -277,7 +277,7 @@ export class OPCUAServerEndPoint extends EventEmitter implements ServerSecureCha
|
|
|
277
277
|
|
|
278
278
|
public dispose(): void {
|
|
279
279
|
this._certificateChain = emptyCertificate;
|
|
280
|
-
this._privateKey =
|
|
280
|
+
this._privateKey = emptyPrivateKey;
|
|
281
281
|
|
|
282
282
|
assert(Object.keys(this._channels).length === 0, "OPCUAServerEndPoint channels must have been deleted");
|
|
283
283
|
|
|
@@ -295,7 +295,7 @@ export class OPCUAServerEndPoint extends EventEmitter implements ServerSecureCha
|
|
|
295
295
|
}
|
|
296
296
|
|
|
297
297
|
public toString(): string {
|
|
298
|
-
const privateKey1 =
|
|
298
|
+
const privateKey1 = this.getPrivateKey().export({ format: "der", type: "pkcs1" });
|
|
299
299
|
|
|
300
300
|
const txt =
|
|
301
301
|
" end point" +
|
|
@@ -332,7 +332,7 @@ export class OPCUAServerEndPoint extends EventEmitter implements ServerSecureCha
|
|
|
332
332
|
/**
|
|
333
333
|
* the private key
|
|
334
334
|
*/
|
|
335
|
-
public getPrivateKey():
|
|
335
|
+
public getPrivateKey(): PrivateKey {
|
|
336
336
|
return this._privateKey;
|
|
337
337
|
}
|
|
338
338
|
|
|
@@ -439,12 +439,11 @@ export class OPCUAServerEndPoint extends EventEmitter implements ServerSecureCha
|
|
|
439
439
|
options.userTokenTypes = options.userTokenTypes || defaultUserTokenTypes;
|
|
440
440
|
|
|
441
441
|
options.allowAnonymous = options.allowAnonymous === undefined ? true : options.allowAnonymous;
|
|
442
|
-
// make sure we do not have anonymous
|
|
442
|
+
// make sure we do not have anonymous
|
|
443
443
|
if (!options.allowAnonymous) {
|
|
444
444
|
options.userTokenTypes = options.userTokenTypes.filter((r) => r !== UserTokenType.Anonymous);
|
|
445
445
|
}
|
|
446
446
|
|
|
447
|
-
|
|
448
447
|
const defaultHostname = options.hostname || getFullyQualifiedDomainName();
|
|
449
448
|
|
|
450
449
|
let hostnames: string[] = [defaultHostname];
|
|
@@ -961,7 +961,7 @@ export class Subscription extends EventEmitter {
|
|
|
961
961
|
);
|
|
962
962
|
|
|
963
963
|
// TODO if attributeId === AttributeIds.Value : sampling interval required here
|
|
964
|
-
if (dataValueSamplingInterval.statusCode
|
|
964
|
+
if (dataValueSamplingInterval.statusCode.isGood()) {
|
|
965
965
|
// node provides a Minimum sampling interval ...
|
|
966
966
|
samplingInterval = dataValueSamplingInterval.value.value;
|
|
967
967
|
assert(samplingInterval >= 0 && samplingInterval <= MonitoredItem.maximumSamplingInterval);
|
|
@@ -1056,7 +1056,7 @@ export class Subscription extends EventEmitter {
|
|
|
1056
1056
|
|
|
1057
1057
|
const createResult = this._createMonitoredItemStep2(timestampsToReturn, monitoredItemCreateRequest, node);
|
|
1058
1058
|
|
|
1059
|
-
assert(createResult.statusCode
|
|
1059
|
+
assert(createResult.statusCode.isGood());
|
|
1060
1060
|
|
|
1061
1061
|
const monitoredItem = this.getMonitoredItem(createResult.monitoredItemId);
|
|
1062
1062
|
// istanbul ignore next
|
|
@@ -57,7 +57,7 @@ function __validateDataChangeFilter(filter: DataChangeFilter, itemToMonitor: Rea
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// node must also have a valid euRange
|
|
60
|
-
if (!(
|
|
60
|
+
if (!node.getChildByName("EURange", 0)) {
|
|
61
61
|
// tslint:disable:no-console
|
|
62
62
|
console.log(" node has no euRange ! Dead band Percent cannot be used on node " + node.nodeId.toString());
|
|
63
63
|
return StatusCodes.BadMonitoredItemFilterUnsupported;
|