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.
Files changed (65) hide show
  1. package/dist/base_server.d.ts +110 -110
  2. package/dist/base_server.js +473 -473
  3. package/dist/factory.d.ts +12 -12
  4. package/dist/factory.js +23 -23
  5. package/dist/history_server_capabilities.d.ts +35 -35
  6. package/dist/history_server_capabilities.js +43 -43
  7. package/dist/i_channel_data.d.ts +13 -13
  8. package/dist/i_channel_data.js +2 -2
  9. package/dist/i_register_server_manager.d.ts +16 -16
  10. package/dist/i_register_server_manager.js +2 -2
  11. package/dist/i_server_side_publish_engine.d.ts +36 -36
  12. package/dist/i_server_side_publish_engine.js +49 -49
  13. package/dist/i_socket_data.d.ts +11 -11
  14. package/dist/i_socket_data.js +2 -2
  15. package/dist/index.d.ts +15 -15
  16. package/dist/index.js +31 -31
  17. package/dist/monitored_item.d.ts +177 -177
  18. package/dist/monitored_item.js +998 -998
  19. package/dist/node_sampler.d.ts +3 -3
  20. package/dist/node_sampler.js +75 -75
  21. package/dist/opcua_server.d.ts +650 -647
  22. package/dist/opcua_server.js +2392 -2385
  23. package/dist/opcua_server.js.map +1 -1
  24. package/dist/queue.d.ts +11 -11
  25. package/dist/queue.js +71 -71
  26. package/dist/register_server_manager.d.ts +96 -96
  27. package/dist/register_server_manager.js +584 -584
  28. package/dist/register_server_manager_hidden.d.ts +17 -17
  29. package/dist/register_server_manager_hidden.js +27 -27
  30. package/dist/register_server_manager_mdns_only.d.ts +22 -22
  31. package/dist/register_server_manager_mdns_only.js +55 -55
  32. package/dist/server_capabilities.d.ts +148 -61
  33. package/dist/server_capabilities.js +91 -108
  34. package/dist/server_capabilities.js.map +1 -1
  35. package/dist/server_end_point.d.ts +183 -183
  36. package/dist/server_end_point.js +817 -816
  37. package/dist/server_end_point.js.map +1 -1
  38. package/dist/server_engine.d.ts +317 -316
  39. package/dist/server_engine.js +1716 -1688
  40. package/dist/server_engine.js.map +1 -1
  41. package/dist/server_publish_engine.d.ts +112 -112
  42. package/dist/server_publish_engine.js +530 -530
  43. package/dist/server_publish_engine_for_orphan_subscriptions.d.ts +16 -16
  44. package/dist/server_publish_engine_for_orphan_subscriptions.js +49 -49
  45. package/dist/server_session.d.ts +181 -181
  46. package/dist/server_session.js +738 -738
  47. package/dist/server_session.js.map +1 -1
  48. package/dist/server_subscription.d.ts +415 -395
  49. package/dist/server_subscription.js +1334 -1316
  50. package/dist/server_subscription.js.map +1 -1
  51. package/dist/sessions_compatible_for_transfer.d.ts +2 -2
  52. package/dist/sessions_compatible_for_transfer.js +36 -36
  53. package/dist/user_manager.d.ts +32 -32
  54. package/dist/user_manager.js +74 -74
  55. package/dist/user_manager_ua.d.ts +3 -3
  56. package/dist/user_manager_ua.js +39 -39
  57. package/dist/validate_filter.d.ts +5 -5
  58. package/dist/validate_filter.js +60 -60
  59. package/package.json +26 -26
  60. package/source/opcua_server.ts +27 -16
  61. package/source/server_capabilities.ts +178 -91
  62. package/source/server_end_point.ts +9 -8
  63. package/source/server_engine.ts +30 -1
  64. package/source/server_session.ts +1 -0
  65. 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
  }
@@ -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
@@ -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
- public static maxMonitoredItemCount = 20000;
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
- // xx var monitoringMode = monitoredItemCreateRequest.monitoringMode; // Disabled, Sampling, Reporting
972
- // xx var requestedParameters = monitoredItemCreateRequest.requestedParameters;
1004
+
973
1005
  // do we have enough room for new monitored items ?
974
- if (this.monitoredItemCount >= Subscription.maxMonitoredItemCount) {
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);