node-opcua-server 2.71.0 → 2.72.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.d.ts +110 -110
- package/dist/base_server.js +473 -473
- package/dist/factory.d.ts +12 -12
- package/dist/factory.js +23 -23
- package/dist/history_server_capabilities.d.ts +35 -35
- package/dist/history_server_capabilities.js +43 -43
- package/dist/i_channel_data.d.ts +13 -13
- package/dist/i_channel_data.js +2 -2
- package/dist/i_register_server_manager.d.ts +16 -16
- package/dist/i_register_server_manager.js +2 -2
- package/dist/i_server_side_publish_engine.d.ts +36 -36
- package/dist/i_server_side_publish_engine.js +49 -49
- package/dist/i_socket_data.d.ts +11 -11
- package/dist/i_socket_data.js +2 -2
- package/dist/index.d.ts +15 -15
- package/dist/index.js +31 -31
- package/dist/monitored_item.d.ts +177 -177
- package/dist/monitored_item.js +998 -998
- package/dist/node_sampler.d.ts +3 -3
- package/dist/node_sampler.js +75 -75
- package/dist/opcua_server.d.ts +650 -647
- package/dist/opcua_server.js +2392 -2385
- package/dist/opcua_server.js.map +1 -1
- package/dist/queue.d.ts +11 -11
- package/dist/queue.js +71 -71
- package/dist/register_server_manager.d.ts +96 -96
- package/dist/register_server_manager.js +584 -584
- package/dist/register_server_manager_hidden.d.ts +17 -17
- package/dist/register_server_manager_hidden.js +27 -27
- package/dist/register_server_manager_mdns_only.d.ts +22 -22
- package/dist/register_server_manager_mdns_only.js +55 -55
- package/dist/server_capabilities.d.ts +148 -61
- package/dist/server_capabilities.js +91 -108
- package/dist/server_capabilities.js.map +1 -1
- package/dist/server_end_point.d.ts +183 -183
- package/dist/server_end_point.js +817 -816
- package/dist/server_end_point.js.map +1 -1
- package/dist/server_engine.d.ts +317 -316
- package/dist/server_engine.js +1716 -1688
- package/dist/server_engine.js.map +1 -1
- package/dist/server_publish_engine.d.ts +112 -112
- package/dist/server_publish_engine.js +530 -530
- package/dist/server_publish_engine_for_orphan_subscriptions.d.ts +16 -16
- package/dist/server_publish_engine_for_orphan_subscriptions.js +49 -49
- package/dist/server_session.d.ts +181 -181
- package/dist/server_session.js +738 -738
- package/dist/server_session.js.map +1 -1
- package/dist/server_subscription.d.ts +415 -395
- package/dist/server_subscription.js +1334 -1316
- package/dist/server_subscription.js.map +1 -1
- package/dist/sessions_compatible_for_transfer.d.ts +2 -2
- package/dist/sessions_compatible_for_transfer.js +36 -36
- package/dist/user_manager.d.ts +32 -32
- package/dist/user_manager.js +74 -74
- package/dist/user_manager_ua.d.ts +3 -3
- package/dist/user_manager_ua.js +39 -39
- package/dist/validate_filter.d.ts +5 -5
- package/dist/validate_filter.js +60 -60
- package/package.json +26 -26
- package/source/opcua_server.ts +27 -16
- package/source/server_capabilities.ts +178 -91
- package/source/server_end_point.ts +9 -8
- package/source/server_engine.ts +30 -1
- package/source/server_session.ts +1 -0
- package/source/server_subscription.ts +46 -5
|
@@ -11,7 +11,7 @@ import * as async from "async";
|
|
|
11
11
|
import { assert } from "node-opcua-assert";
|
|
12
12
|
import { ICertificateManager, OPCUACertificateManager } from "node-opcua-certificate-manager";
|
|
13
13
|
import { Certificate, convertPEMtoDER, makeSHA1Thumbprint, PrivateKeyPEM, split_der } from "node-opcua-crypto";
|
|
14
|
-
import { checkDebugFlag, make_debugLog, make_errorLog } from "node-opcua-debug";
|
|
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 {
|
|
17
17
|
fromURI,
|
|
@@ -32,6 +32,7 @@ import { ISocketData } from "./i_socket_data";
|
|
|
32
32
|
|
|
33
33
|
const debugLog = make_debugLog(__filename);
|
|
34
34
|
const errorLog = make_errorLog(__filename);
|
|
35
|
+
const warningLog = make_warningLog(__filename);
|
|
35
36
|
const doDebug = checkDebugFlag(__filename);
|
|
36
37
|
|
|
37
38
|
const default_transportProfileUri = "http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary";
|
|
@@ -704,14 +705,14 @@ export class OPCUAServerEndPoint extends EventEmitter implements ServerSecureCha
|
|
|
704
705
|
|
|
705
706
|
const establish_connection = () => {
|
|
706
707
|
const nbConnections = Object.keys(this._channels).length;
|
|
707
|
-
debugLog(
|
|
708
|
-
" nbConnections ",
|
|
709
|
-
nbConnections,
|
|
710
|
-
" self._server.maxConnections",
|
|
711
|
-
this._server!.maxConnections,
|
|
712
|
-
this.maxConnections
|
|
713
|
-
);
|
|
714
708
|
if (nbConnections >= this.maxConnections) {
|
|
709
|
+
warningLog(
|
|
710
|
+
" nbConnections ",
|
|
711
|
+
nbConnections,
|
|
712
|
+
" self._server.maxConnections",
|
|
713
|
+
this._server!.maxConnections,
|
|
714
|
+
this.maxConnections
|
|
715
|
+
);
|
|
715
716
|
deny_connection();
|
|
716
717
|
return;
|
|
717
718
|
}
|
package/source/server_engine.ts
CHANGED
|
@@ -314,6 +314,7 @@ export class ServerEngine extends EventEmitter {
|
|
|
314
314
|
private _applicationUri: string;
|
|
315
315
|
private _expectedShutdownTime!: Date;
|
|
316
316
|
private _serverStatus: ServerStatusDataType;
|
|
317
|
+
private _globalCounter: { totalMonitoredItemCount: number } = { totalMonitoredItemCount: 0 };
|
|
317
318
|
|
|
318
319
|
constructor(options: ServerEngineOptions) {
|
|
319
320
|
super();
|
|
@@ -964,6 +965,32 @@ export class ServerEngine extends EventEmitter {
|
|
|
964
965
|
return this.serverCapabilities.maxHistoryContinuationPoints;
|
|
965
966
|
});
|
|
966
967
|
|
|
968
|
+
// new in 1.05
|
|
969
|
+
bindStandardScalar(VariableIds.Server_ServerCapabilities_MaxSessions, DataType.UInt32, () => {
|
|
970
|
+
return this.serverCapabilities.maxSessions;
|
|
971
|
+
});
|
|
972
|
+
bindStandardScalar(VariableIds.Server_ServerCapabilities_MaxSubscriptions, DataType.UInt32, () => {
|
|
973
|
+
return this.serverCapabilities.maxSubscriptions;
|
|
974
|
+
});
|
|
975
|
+
bindStandardScalar(VariableIds.Server_ServerCapabilities_MaxMonitoredItems, DataType.UInt32, () => {
|
|
976
|
+
return this.serverCapabilities.maxMonitoredItems;
|
|
977
|
+
});
|
|
978
|
+
bindStandardScalar(VariableIds.Server_ServerCapabilities_MaxSubscriptionsPerSession, DataType.UInt32, () => {
|
|
979
|
+
return this.serverCapabilities.maxSubscriptionsPerSession;
|
|
980
|
+
});
|
|
981
|
+
bindStandardScalar(VariableIds.Server_ServerCapabilities_MaxSelectClauseParameters, DataType.UInt32, () => {
|
|
982
|
+
return this.serverCapabilities.maxSelectClauseParameters;
|
|
983
|
+
});
|
|
984
|
+
bindStandardScalar(VariableIds.Server_ServerCapabilities_MaxWhereClauseParameters, DataType.UInt32, () => {
|
|
985
|
+
return this.serverCapabilities.maxWhereClauseParameters;
|
|
986
|
+
});
|
|
987
|
+
//bindStandardArray(VariableIds.Server_ServerCapabilities_ConformanceUnits, DataType.QualifiedName, () => {
|
|
988
|
+
// return this.serverCapabilities.conformanceUnits;
|
|
989
|
+
//});
|
|
990
|
+
bindStandardScalar(VariableIds.Server_ServerCapabilities_MaxMonitoredItemsPerSubscription, DataType.UInt32, () => {
|
|
991
|
+
return this.serverCapabilities.maxMonitoredItemsPerSubscription;
|
|
992
|
+
});
|
|
993
|
+
|
|
967
994
|
// added by DI : Server-specific period of time in milliseconds until the Server will revoke a lock.
|
|
968
995
|
// TODO bindStandardScalar(VariableIds.Server_ServerCapabilities_MaxInactiveLockTime,
|
|
969
996
|
// TODO DataType.UInt16, function () {
|
|
@@ -2010,7 +2037,9 @@ export class ServerEngine extends EventEmitter {
|
|
|
2010
2037
|
publishingEnabled: request.publishingEnabled,
|
|
2011
2038
|
publishingInterval,
|
|
2012
2039
|
// -------------------
|
|
2013
|
-
sessionId: NodeId.nullNodeId
|
|
2040
|
+
sessionId: NodeId.nullNodeId,
|
|
2041
|
+
globalCounter: this._globalCounter,
|
|
2042
|
+
serverCapabilities: this.serverCapabilities // shared
|
|
2014
2043
|
});
|
|
2015
2044
|
|
|
2016
2045
|
// add subscriptionDiagnostics
|
package/source/server_session.ts
CHANGED
|
@@ -105,6 +105,7 @@ export class ServerSession extends EventEmitter implements ISubscriber, ISession
|
|
|
105
105
|
public nodeId: NodeId;
|
|
106
106
|
public sessionName = "";
|
|
107
107
|
|
|
108
|
+
|
|
108
109
|
public publishEngine: ServerSidePublishEngine;
|
|
109
110
|
public sessionObject: any;
|
|
110
111
|
public readonly creationDate: Date;
|
|
@@ -10,7 +10,7 @@ import { AddressSpace, BaseNode, Duration, UAObjectType } from "node-opcua-addre
|
|
|
10
10
|
import { checkSelectClauses } from "node-opcua-address-space";
|
|
11
11
|
import { SessionContext } from "node-opcua-address-space";
|
|
12
12
|
import { assert } from "node-opcua-assert";
|
|
13
|
-
import { Byte } from "node-opcua-basic-types";
|
|
13
|
+
import { Byte, UInt32 } from "node-opcua-basic-types";
|
|
14
14
|
import { SubscriptionDiagnosticsDataType } from "node-opcua-common";
|
|
15
15
|
import { NodeClass, AttributeIds, isValidDataEncoding } from "node-opcua-data-model";
|
|
16
16
|
import { TimestampsToReturn } from "node-opcua-data-value";
|
|
@@ -312,6 +312,10 @@ function createSubscriptionDiagnostics(subscription: Subscription): Subscription
|
|
|
312
312
|
return subscriptionDiagnostics as SubscriptionDiagnosticsDataTypePriv;
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
+
interface IGlobalMonitoredItemCounter {
|
|
316
|
+
totalMonitoredItemCount: number;
|
|
317
|
+
}
|
|
318
|
+
|
|
315
319
|
export interface SubscriptionOptions {
|
|
316
320
|
sessionId?: NodeId;
|
|
317
321
|
/**
|
|
@@ -342,6 +346,9 @@ export interface SubscriptionOptions {
|
|
|
342
346
|
* a unique identifier
|
|
343
347
|
*/
|
|
344
348
|
id?: number;
|
|
349
|
+
|
|
350
|
+
serverCapabilities: ServerCapabilitiesPartial;
|
|
351
|
+
globalCounter: IGlobalMonitoredItemCounter;
|
|
345
352
|
}
|
|
346
353
|
|
|
347
354
|
let g_monitoredItemId = Math.ceil(Math.random() * 100000);
|
|
@@ -435,6 +442,11 @@ export interface MonitoredItemBase {
|
|
|
435
442
|
export type CreateMonitoredItemHook = (subscription: Subscription, monitoredItem: MonitoredItemBase) => Promise<StatusCode>;
|
|
436
443
|
export type DeleteMonitoredItemHook = (subscription: Subscription, monitoredItem: MonitoredItemBase) => Promise<StatusCode>;
|
|
437
444
|
|
|
445
|
+
export interface ServerCapabilitiesPartial {
|
|
446
|
+
maxMonitoredItems: UInt32;
|
|
447
|
+
maxMonitoredItemsPerSubscription: UInt32;
|
|
448
|
+
}
|
|
449
|
+
|
|
438
450
|
/**
|
|
439
451
|
* The Subscription class used in the OPCUA server side.
|
|
440
452
|
*/
|
|
@@ -443,7 +455,19 @@ export class Subscription extends EventEmitter {
|
|
|
443
455
|
public static defaultPublishingInterval = 1000; // one second
|
|
444
456
|
public static maximumPublishingInterval: number = 1000 * 60 * 60 * 24 * 15; // 15 days
|
|
445
457
|
public static maxNotificationPerPublishHighLimit = 1000;
|
|
446
|
-
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* maximum number of monitored item in a subscription to be used
|
|
461
|
+
* when serverCapacity.maxMonitoredItems and serverCapacity.maxMonitoredItemsPerSubscription are not set.
|
|
462
|
+
*/
|
|
463
|
+
public static defaultMaxMonitoredItemCount = 20000;
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* @deprecated use serverCapacity.maxMonitoredItems and serverCapacity.maxMonitoredItemsPerSubscription instead
|
|
467
|
+
*/
|
|
468
|
+
protected static get maxMonitoredItemCount() {
|
|
469
|
+
return Subscription.defaultMaxMonitoredItemCount;
|
|
470
|
+
}
|
|
447
471
|
|
|
448
472
|
public static registry = new ObjectRegistry();
|
|
449
473
|
|
|
@@ -507,6 +531,9 @@ export class Subscription extends EventEmitter {
|
|
|
507
531
|
private timerId: any;
|
|
508
532
|
private _hasUncollectedMonitoredItemNotifications = false;
|
|
509
533
|
|
|
534
|
+
private globalCounter: IGlobalMonitoredItemCounter;
|
|
535
|
+
private serverCapabilities: ServerCapabilitiesPartial;
|
|
536
|
+
|
|
510
537
|
constructor(options: SubscriptionOptions) {
|
|
511
538
|
super();
|
|
512
539
|
|
|
@@ -566,6 +593,12 @@ export class Subscription extends EventEmitter {
|
|
|
566
593
|
this._start_timer();
|
|
567
594
|
|
|
568
595
|
debugLog(chalk.green(`creating subscription ${this.id}`));
|
|
596
|
+
|
|
597
|
+
this.serverCapabilities = options.serverCapabilities;
|
|
598
|
+
this.serverCapabilities.maxMonitoredItems = this.serverCapabilities.maxMonitoredItems || Subscription.defaultMaxMonitoredItemCount;
|
|
599
|
+
this.serverCapabilities.maxMonitoredItemsPerSubscription =
|
|
600
|
+
this.serverCapabilities.maxMonitoredItemsPerSubscription || Subscription.defaultMaxMonitoredItemCount;
|
|
601
|
+
this.globalCounter = options.globalCounter;
|
|
569
602
|
}
|
|
570
603
|
|
|
571
604
|
public getSessionId(): NodeId {
|
|
@@ -968,12 +1001,16 @@ export class Subscription extends EventEmitter {
|
|
|
968
1001
|
if (statusCodeFilter !== StatusCodes.Good) {
|
|
969
1002
|
return handle_error(statusCodeFilter);
|
|
970
1003
|
}
|
|
971
|
-
|
|
972
|
-
// xx var requestedParameters = monitoredItemCreateRequest.requestedParameters;
|
|
1004
|
+
|
|
973
1005
|
// do we have enough room for new monitored items ?
|
|
974
|
-
if (this.monitoredItemCount >=
|
|
1006
|
+
if (this.monitoredItemCount >= this.serverCapabilities.maxMonitoredItemsPerSubscription) {
|
|
1007
|
+
return handle_error(StatusCodes.BadTooManyMonitoredItems);
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
if (this.globalCounter.totalMonitoredItemCount >= this.serverCapabilities.maxMonitoredItems) {
|
|
975
1011
|
return handle_error(StatusCodes.BadTooManyMonitoredItems);
|
|
976
1012
|
}
|
|
1013
|
+
|
|
977
1014
|
const createResult = this._createMonitoredItemStep2(timestampsToReturn, monitoredItemCreateRequest, node);
|
|
978
1015
|
|
|
979
1016
|
assert(createResult.statusCode === StatusCodes.Good);
|
|
@@ -1052,6 +1089,7 @@ export class Subscription extends EventEmitter {
|
|
|
1052
1089
|
this.emit("removeMonitoredItem", monitoredItem);
|
|
1053
1090
|
|
|
1054
1091
|
delete this.monitoredItems[monitoredItemId];
|
|
1092
|
+
this.globalCounter.totalMonitoredItemCount -= 1;
|
|
1055
1093
|
|
|
1056
1094
|
this._removePendingNotificationsFor(monitoredItemId);
|
|
1057
1095
|
// flush pending notifications
|
|
@@ -1724,7 +1762,10 @@ export class Subscription extends EventEmitter {
|
|
|
1724
1762
|
monitoredItem.$subscription = this;
|
|
1725
1763
|
|
|
1726
1764
|
assert(monitoredItem.monitoredItemId === monitoredItemId);
|
|
1765
|
+
|
|
1727
1766
|
this.monitoredItems[monitoredItemId] = monitoredItem;
|
|
1767
|
+
this.globalCounter.totalMonitoredItemCount += 1;
|
|
1768
|
+
|
|
1728
1769
|
assert(monitoredItem.clientHandle !== 4294967295);
|
|
1729
1770
|
|
|
1730
1771
|
const filterResult = _process_filter(node, requestedParameters.filter);
|