node-opcua-server 2.166.0 → 2.168.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 (111) hide show
  1. package/dist/addressSpace_accessor.d.ts +6 -6
  2. package/dist/addressSpace_accessor.js +2 -2
  3. package/dist/addressSpace_accessor.js.map +1 -1
  4. package/dist/base_server.d.ts +14 -3
  5. package/dist/base_server.js +64 -44
  6. package/dist/base_server.js.map +1 -1
  7. package/dist/extract_password_from_blob.js +1 -3
  8. package/dist/extract_password_from_blob.js.map +1 -1
  9. package/dist/factory.d.ts +2 -3
  10. package/dist/factory.js.map +1 -1
  11. package/dist/filter/check_where_clause_on_address_space.d.ts +2 -2
  12. package/dist/filter/check_where_clause_on_address_space.js +1 -2
  13. package/dist/filter/check_where_clause_on_address_space.js.map +1 -1
  14. package/dist/filter/extract_event_fields.d.ts +3 -3
  15. package/dist/filter/extract_event_fields.js +1 -2
  16. package/dist/filter/extract_event_fields.js.map +1 -1
  17. package/dist/helper.d.ts +3 -3
  18. package/dist/helper.js +4 -8
  19. package/dist/helper.js.map +1 -1
  20. package/dist/i_address_space_accessor.d.ts +4 -4
  21. package/dist/i_channel_data.d.ts +1 -1
  22. package/dist/i_register_server_manager.d.ts +1 -1
  23. package/dist/i_server_side_publish_engine.d.ts +8 -6
  24. package/dist/i_server_side_publish_engine.js +7 -2
  25. package/dist/i_server_side_publish_engine.js.map +1 -1
  26. package/dist/index.d.ts +8 -7
  27. package/dist/index.js +8 -7
  28. package/dist/index.js.map +1 -1
  29. package/dist/invalidate_server_certificate_cache.d.ts +16 -0
  30. package/dist/invalidate_server_certificate_cache.js +28 -0
  31. package/dist/invalidate_server_certificate_cache.js.map +1 -0
  32. package/dist/monitored_item.d.ts +10 -11
  33. package/dist/monitored_item.js +38 -39
  34. package/dist/monitored_item.js.map +1 -1
  35. package/dist/node_sampler.d.ts +1 -1
  36. package/dist/node_sampler.js +2 -4
  37. package/dist/node_sampler.js.map +1 -1
  38. package/dist/opcua_server.d.ts +57 -62
  39. package/dist/opcua_server.js +10 -10
  40. package/dist/opcua_server.js.map +1 -1
  41. package/dist/register_server_manager.d.ts +8 -8
  42. package/dist/register_server_manager.js +40 -40
  43. package/dist/register_server_manager.js.map +1 -1
  44. package/dist/register_server_manager_hidden.d.ts +1 -1
  45. package/dist/register_server_manager_hidden.js +2 -4
  46. package/dist/register_server_manager_hidden.js.map +1 -1
  47. package/dist/register_server_manager_mdns_only.d.ts +1 -1
  48. package/dist/register_server_manager_mdns_only.js.map +1 -1
  49. package/dist/sampling_func.d.ts +2 -2
  50. package/dist/server_capabilities.d.ts +3 -3
  51. package/dist/server_capabilities.js.map +1 -1
  52. package/dist/server_end_point.d.ts +47 -4
  53. package/dist/server_end_point.js +133 -42
  54. package/dist/server_end_point.js.map +1 -1
  55. package/dist/server_engine.js +29 -25
  56. package/dist/server_engine.js.map +1 -1
  57. package/dist/server_publish_engine.d.ts +5 -5
  58. package/dist/server_publish_engine.js +29 -23
  59. package/dist/server_publish_engine.js.map +1 -1
  60. package/dist/server_publish_engine_for_orphan_subscriptions.d.ts +2 -2
  61. package/dist/server_publish_engine_for_orphan_subscriptions.js.map +1 -1
  62. package/dist/server_session.d.ts +9 -10
  63. package/dist/server_session.js +11 -12
  64. package/dist/server_session.js.map +1 -1
  65. package/dist/server_subscription.d.ts +13 -13
  66. package/dist/server_subscription.js +100 -79
  67. package/dist/server_subscription.js.map +1 -1
  68. package/dist/sessions_compatible_for_transfer.d.ts +1 -1
  69. package/dist/sessions_compatible_for_transfer.js +1 -1
  70. package/dist/sessions_compatible_for_transfer.js.map +1 -1
  71. package/dist/user_manager.d.ts +4 -4
  72. package/dist/user_manager.js +1 -1
  73. package/dist/user_manager.js.map +1 -1
  74. package/dist/user_manager_ua.d.ts +2 -2
  75. package/dist/user_manager_ua.js +2 -2
  76. package/dist/user_manager_ua.js.map +1 -1
  77. package/dist/validate_filter.d.ts +7 -4
  78. package/dist/validate_filter.js +5 -6
  79. package/dist/validate_filter.js.map +1 -1
  80. package/package.json +51 -50
  81. package/source/addressSpace_accessor.ts +24 -24
  82. package/source/base_server.ts +75 -63
  83. package/source/extract_password_from_blob.ts +3 -11
  84. package/source/factory.ts +2 -4
  85. package/source/filter/check_where_clause_on_address_space.ts +4 -7
  86. package/source/filter/extract_event_fields.ts +4 -5
  87. package/source/helper.ts +9 -13
  88. package/source/i_address_space_accessor.ts +13 -4
  89. package/source/i_channel_data.ts +1 -1
  90. package/source/i_register_server_manager.ts +2 -4
  91. package/source/i_server_side_publish_engine.ts +16 -9
  92. package/source/index.ts +10 -9
  93. package/source/invalidate_server_certificate_cache.ts +26 -0
  94. package/source/monitored_item.ts +44 -42
  95. package/source/node_sampler.ts +9 -11
  96. package/source/opcua_server.ts +86 -99
  97. package/source/register_server_manager.ts +75 -72
  98. package/source/register_server_manager_hidden.ts +3 -5
  99. package/source/register_server_manager_mdns_only.ts +1 -3
  100. package/source/sampling_func.ts +2 -2
  101. package/source/server_capabilities.ts +9 -6
  102. package/source/server_end_point.ts +143 -50
  103. package/source/server_engine.ts +22 -22
  104. package/source/server_publish_engine.ts +35 -30
  105. package/source/server_publish_engine_for_orphan_subscriptions.ts +3 -3
  106. package/source/server_session.ts +36 -33
  107. package/source/server_subscription.ts +182 -184
  108. package/source/sessions_compatible_for_transfer.ts +9 -9
  109. package/source/user_manager.ts +7 -7
  110. package/source/user_manager_ua.ts +3 -5
  111. package/source/validate_filter.ts +9 -11
@@ -1,36 +1,36 @@
1
1
  /**
2
2
  * @module node-opcua-server
3
3
  */
4
- import { EventEmitter } from "events";
4
+
5
5
  import chalk from "chalk";
6
+ import { EventEmitter } from "events";
7
+ import {
8
+ type AddressSpace,
9
+ type BaseNode,
10
+ type IEventData,
11
+ makeAttributeEventName,
12
+ SessionContext,
13
+ type UAVariable
14
+ } from "node-opcua-address-space";
15
+ import type { ISessionContext, UAMethod, UAObject } from "node-opcua-address-space-base";
6
16
  import { assert } from "node-opcua-assert";
7
- import { ISessionContext, UAMethod, UAObject } from "node-opcua-address-space-base";
8
- import { BaseNode, IEventData, makeAttributeEventName, SessionContext, UAVariable, AddressSpace } from "node-opcua-address-space";
9
- import { extractEventFields } from "node-opcua-service-filter";
10
- import { DateTime, UInt32 } from "node-opcua-basic-types";
11
- import { NodeClass, QualifiedNameOptions } from "node-opcua-data-model";
12
- import { AttributeIds } from "node-opcua-data-model";
17
+ import type { DateTime, UInt32 } from "node-opcua-basic-types";
18
+ import { AttributeIds, NodeClass, type QualifiedNameOptions } from "node-opcua-data-model";
13
19
  import {
14
20
  apply_timestamps,
21
+ coerceTimestampsToReturn,
15
22
  DataValue,
16
23
  extractRange,
17
24
  sameDataValue,
18
- coerceTimestampsToReturn,
19
25
  sameStatusCode
20
26
  } from "node-opcua-data-value";
21
27
  import { checkDebugFlag, make_debugLog, make_errorLog, make_warningLog } from "node-opcua-debug";
22
- import { ExtensionObject } from "node-opcua-extension-object";
23
- import { NodeId } from "node-opcua-nodeid";
24
- import { NumericalRange0, NumericRange } from "node-opcua-numeric-range";
28
+ import type { ExtensionObject } from "node-opcua-extension-object";
29
+ import type { NodeId } from "node-opcua-nodeid";
30
+ import { type NumericalRange0, NumericRange } from "node-opcua-numeric-range";
25
31
  import { ObjectRegistry } from "node-opcua-object-registry";
26
- import { EventFilter } from "node-opcua-service-filter";
27
- import { ReadValueId, TimestampsToReturn } from "node-opcua-service-read";
28
- import {
29
- MonitoredItemModifyResult,
30
- MonitoredItemNotification,
31
- MonitoringMode,
32
- MonitoringParameters
33
- } from "node-opcua-service-subscription";
32
+ import { EventFilter, extractEventFields } from "node-opcua-service-filter";
33
+ import { ReadValueId, type TimestampsToReturn } from "node-opcua-service-read";
34
34
  import {
35
35
  DataChangeFilter,
36
36
  DataChangeTrigger,
@@ -38,25 +38,28 @@ import {
38
38
  isOutsideDeadbandAbsolute,
39
39
  isOutsideDeadbandNone,
40
40
  isOutsideDeadbandPercent,
41
- PseudoRange
41
+ MonitoredItemModifyResult,
42
+ MonitoredItemNotification,
43
+ MonitoringMode,
44
+ MonitoringParameters,
45
+ type PseudoRange
42
46
  } from "node-opcua-service-subscription";
43
- import { CallbackT, StatusCode, StatusCodes } from "node-opcua-status-code";
47
+ import { type CallbackT, StatusCode, StatusCodes } from "node-opcua-status-code";
44
48
  import {
45
49
  DataChangeNotification,
46
50
  EventFieldList,
47
51
  EventNotificationList,
48
- MonitoringFilter,
49
- ReadValueIdOptions,
50
- SimpleAttributeOperand,
51
- SubscriptionDiagnosticsDataType
52
+ type MonitoringFilter,
53
+ type ReadValueIdOptions,
54
+ type SimpleAttributeOperand,
55
+ type SubscriptionDiagnosticsDataType
52
56
  } from "node-opcua-types";
53
57
  import { sameVariant, Variant, VariantArrayType } from "node-opcua-variant";
54
-
58
+ import { checkWhereClauseOnAdressSpace as checkWhereClauseOnAddressSpace } from "./filter/check_where_clause_on_address_space";
55
59
  import { appendToTimer, removeFromTimer } from "./node_sampler";
60
+ import type { SamplingFunc } from "./sampling_func";
61
+ import type { MonitoredItemBase } from "./server_subscription";
56
62
  import { validateFilter } from "./validate_filter";
57
- import { checkWhereClauseOnAdressSpace as checkWhereClauseOnAddressSpace } from "./filter/check_where_clause_on_address_space";
58
- import { SamplingFunc } from "./sampling_func";
59
- import { MonitoredItemBase } from "./server_subscription";
60
63
 
61
64
  const errorLog = make_errorLog(__filename);
62
65
 
@@ -100,8 +103,8 @@ function _adjust_queue_size(queueSize: number): number {
100
103
 
101
104
  function _validate_parameters(monitoringParameters: any) {
102
105
  // xx assert(options instanceof MonitoringParameters);
103
- assert(Object.prototype.hasOwnProperty.call(monitoringParameters, "clientHandle"));
104
- assert(Object.prototype.hasOwnProperty.call(monitoringParameters, "samplingInterval"));
106
+ assert(Object.hasOwn(monitoringParameters, "clientHandle"));
107
+ assert(Object.hasOwn(monitoringParameters, "samplingInterval"));
105
108
  assert(isFinite(monitoringParameters.clientHandle));
106
109
  assert(isFinite(monitoringParameters.samplingInterval));
107
110
  assert(typeof monitoringParameters.discardOldest === "boolean");
@@ -394,10 +397,11 @@ export class MonitoredItem extends EventEmitter implements MonitoredItemBase {
394
397
  public overflow: boolean;
395
398
  public oldDataValue: DataValue;
396
399
 
397
-
398
400
  #monitoringMode: MonitoringMode = MonitoringMode.Invalid;
399
401
 
400
- public get monitoringMode() { return this.#monitoringMode; }
402
+ public get monitoringMode() {
403
+ return this.#monitoringMode;
404
+ }
401
405
 
402
406
  public timestampsToReturn: TimestampsToReturn;
403
407
  public itemToMonitor: any;
@@ -424,7 +428,7 @@ export class MonitoredItem extends EventEmitter implements MonitoredItemBase {
424
428
  constructor(options: MonitoredItemOptions) {
425
429
  super();
426
430
 
427
- assert(Object.prototype.hasOwnProperty.call(options, "monitoredItemId"));
431
+ assert(Object.hasOwn(options, "monitoredItemId"));
428
432
  assert(!options.monitoringMode, "use setMonitoring mode explicitly to activate the monitored item");
429
433
 
430
434
  options.itemToMonitor = options.itemToMonitor || defaultItemToMonitor;
@@ -470,7 +474,6 @@ export class MonitoredItem extends EventEmitter implements MonitoredItemBase {
470
474
  }
471
475
 
472
476
  public setMonitoringMode(monitoringMode: MonitoringMode): StatusCode {
473
-
474
477
  if (monitoringMode === this.monitoringMode) {
475
478
  // nothing to do
476
479
  return StatusCodes.BadNothingToDo;
@@ -480,7 +483,6 @@ export class MonitoredItem extends EventEmitter implements MonitoredItemBase {
480
483
  }
481
484
  const old_monitoringMode = this.monitoringMode;
482
485
 
483
-
484
486
  if (monitoringMode === MonitoringMode.Disabled) {
485
487
  this.#monitoringMode = monitoringMode;
486
488
  this._stop_sampling();
@@ -1200,7 +1202,7 @@ export class MonitoredItem extends EventEmitter implements MonitoredItemBase {
1200
1202
  }
1201
1203
 
1202
1204
  private _setOverflowBit(notification: any) {
1203
- if (Object.prototype.hasOwnProperty.call(notification, "value")) {
1205
+ if (Object.hasOwn(notification, "value")) {
1204
1206
  assert(notification.value.statusCode.equals(StatusCodes.Good));
1205
1207
  notification.value.statusCode = StatusCode.makeStatusCode(
1206
1208
  notification.value.statusCode,
@@ -1301,11 +1303,11 @@ export class MonitoredItem extends EventEmitter implements MonitoredItemBase {
1301
1303
  ) {
1302
1304
  throw new Error(
1303
1305
  "dataValue.value.value cannot be the same object twice! " +
1304
- this.node!.browseName.toString() +
1305
- " " +
1306
- dataValue.toString() +
1307
- " " +
1308
- chalk.cyan(this.oldDataValue.toString())
1306
+ this.node!.browseName.toString() +
1307
+ " " +
1308
+ dataValue.toString() +
1309
+ " " +
1310
+ chalk.cyan(this.oldDataValue.toString())
1309
1311
  );
1310
1312
  }
1311
1313
 
@@ -9,14 +9,14 @@ import { hrtime } from "node-opcua-utils";
9
9
  const debugLog = make_debugLog(__filename);
10
10
  const doDebug = checkDebugFlag(__filename);
11
11
 
12
- import { MonitoredItem } from "./monitored_item";
12
+ import type { MonitoredItem } from "./monitored_item";
13
13
 
14
14
  interface ITimer {
15
- _samplingId: NodeJS.Timeout | false,
16
- monitoredItems: Record<string,any>,
15
+ _samplingId: NodeJS.Timeout | false;
16
+ monitoredItems: Record<string, any>;
17
17
  monitoredItemsCount: number;
18
- }
19
- const timers: Record<string,ITimer> = {};
18
+ }
19
+ const timers: Record<string, ITimer> = {};
20
20
  const NS_PER_SEC = 1e9;
21
21
 
22
22
  interface MonitoredItemPriv {
@@ -24,7 +24,7 @@ interface MonitoredItemPriv {
24
24
  }
25
25
  function sampleMonitoredItem(monitoredItem: MonitoredItem) {
26
26
  const _monitoredItem = monitoredItem as unknown as MonitoredItemPriv;
27
-
27
+
28
28
  if (monitoredItem.monitoringMode === MonitoringMode.Disabled) {
29
29
  return;
30
30
  }
@@ -50,7 +50,7 @@ export function appendToTimer(monitoredItem: MonitoredItem): string {
50
50
  const start = doDebug ? hrtime() : undefined;
51
51
  let counter = 0;
52
52
  for (const m in _t.monitoredItems) {
53
- if (Object.prototype.hasOwnProperty.call(_t.monitoredItems, m)) {
53
+ if (Object.hasOwn(_t.monitoredItems, m)) {
54
54
  sampleMonitoredItem(_t.monitoredItems[m]);
55
55
  counter++;
56
56
  }
@@ -60,9 +60,7 @@ export function appendToTimer(monitoredItem: MonitoredItem): string {
60
60
  const elapsed = hrtime(start);
61
61
  debugLog(
62
62
  `Sampler ${samplingInterval} ms : Benchmark took ${(
63
- (elapsed[0] * NS_PER_SEC + elapsed[1]) /
64
- 1000 /
65
- 1000.0
63
+ (elapsed[0] * NS_PER_SEC + elapsed[1]) / 1000 / 1000.0
66
64
  ).toFixed(3)} milliseconds for ${counter} elements`
67
65
  );
68
66
  }
@@ -91,7 +89,7 @@ export function removeFromTimer(monitoredItem: MonitoredItem): void {
91
89
  _t.monitoredItemsCount--;
92
90
  assert(_t.monitoredItemsCount >= 0);
93
91
  if (_t.monitoredItemsCount === 0) {
94
- if (_t._samplingId !==false) {
92
+ if (_t._samplingId !== false) {
95
93
  clearInterval(_t._samplingId);
96
94
  }
97
95
  delete timers[key];
@@ -36,8 +36,8 @@ import {
36
36
  import { assert } from "node-opcua-assert";
37
37
  import type { ByteString, UAString } from "node-opcua-basic-types";
38
38
  import { getDefaultCertificateManager, type OPCUACertificateManager } from "node-opcua-certificate-manager";
39
- import { ServerState } from "node-opcua-common";
40
- import { type Certificate, exploreCertificate, type Nonce } from "node-opcua-crypto/web";
39
+ import { SecretHolder, ServerState } from "node-opcua-common";
40
+ import { type Certificate, combine_der, exploreCertificate, type Nonce } from "node-opcua-crypto/web";
41
41
  import {
42
42
  AttributeIds,
43
43
  filterDiagnosticOperationLevel,
@@ -149,6 +149,7 @@ import { DataType, type Variant, VariantArrayType } from "node-opcua-variant";
149
149
  import { withCallback } from "thenify-ex";
150
150
 
151
151
  import { OPCUABaseServer, type OPCUABaseServerOptions } from "./base_server";
152
+ import { extractPasswordFromDecryptedBlob } from "./extract_password_from_blob";
152
153
  import { Factory } from "./factory";
153
154
  import type { IChannelData } from "./i_channel_data";
154
155
  import type { IRegisterServerManager } from "./i_register_server_manager";
@@ -158,9 +159,15 @@ import { RegisterServerManager } from "./register_server_manager";
158
159
  import { RegisterServerManagerHidden } from "./register_server_manager_hidden";
159
160
  import { RegisterServerManagerMDNSONLY } from "./register_server_manager_mdns_only";
160
161
  import type { SamplingFunc } from "./sampling_func";
161
- import { extractPasswordFromDecryptedBlob } from "./extract_password_from_blob";
162
162
  import type { ServerCapabilitiesOptions } from "./server_capabilities";
163
- import { type AdvertisedEndpoint, type EndpointDescriptionEx, type IServerTransportSettings, OPCUAServerEndPoint, normalizeAdvertisedEndpoints, parseOpcTcpUrl } from "./server_end_point";
163
+ import {
164
+ type AdvertisedEndpoint,
165
+ type EndpointDescriptionEx,
166
+ type IServerTransportSettings,
167
+ normalizeAdvertisedEndpoints,
168
+ OPCUAServerEndPoint,
169
+ parseOpcTcpUrl
170
+ } from "./server_end_point";
164
171
  import { type ClosingReason, type CreateSessionOption, ServerEngine } from "./server_engine";
165
172
  import type { ServerSession } from "./server_session";
166
173
  import type { CreateMonitoredItemHook, DeleteMonitoredItemHook, Subscription } from "./server_subscription";
@@ -951,10 +958,64 @@ export interface OPCUAServerOptions extends OPCUABaseServerOptions, OPCUAServerE
951
958
  }
952
959
 
953
960
  const g_requestExactEndpointUrl = !!process.env.NODEOPCUA_SERVER_REQUEST_EXACT_ENDPOINT_URL;
954
- /**
955
- *
956
- */
957
- export class OPCUAServer extends OPCUABaseServer {
961
+ export interface OPCUAServerEvents {
962
+ /** event raised when a new session is created */
963
+ create_session: [session: ServerSession];
964
+ /** event raised when a session is activated */
965
+ session_activated: [session: ServerSession, userIdentityToken: UserIdentityToken];
966
+ /** event raised when a session is closed */
967
+ session_closed: [session: ServerSession, deleteSubscriptions: boolean];
968
+ /** event raised after the server address space has been initialized */
969
+ post_initialize: [];
970
+ /**
971
+ * emitted when the server is trying to register with the LDS
972
+ * but the connection has failed (backoff signal)
973
+ */
974
+ serverRegistrationPending: [];
975
+ /** event raised when server has been successfully registered on the LDS */
976
+ serverRegistered: [];
977
+ /** event raised when server registration has been successfully renewed on the LDS */
978
+ serverRegistrationRenewed: [];
979
+ /** event raised when server has been successfully unregistered from the LDS */
980
+ serverUnregistered: [];
981
+ /** event raised after the server has raised an OPCUA event toward a client */
982
+ event: [eventData: unknown];
983
+ /**
984
+ * event raised when the server receives a request from a connected client.
985
+ * Useful for trace/diagnostics.
986
+ */
987
+ request: [request: Request, channel: ServerSecureChannelLayer];
988
+ /**
989
+ * event raised when the server sends a response to a connected client.
990
+ * Useful for trace/diagnostics.
991
+ */
992
+ response: [response: Response, channel: ServerSecureChannelLayer];
993
+ /**
994
+ * event raised when a new secure channel transport is initialized (HEL/ACK complete).
995
+ * Note: securityPolicy and securityMode are NOT yet established at this point.
996
+ * Use "channelSecured" for post-handshake notifications.
997
+ */
998
+ newChannel: [channel: ServerSecureChannelLayer, endpoint: OPCUAServerEndPoint];
999
+ /**
1000
+ * event raised when a secure channel has completed the OpenSecureChannel handshake.
1001
+ * At this point securityPolicy, securityMode, and clientCertificate are available.
1002
+ */
1003
+ channelSecured: [channel: ServerSecureChannelLayer, endpoint: OPCUAServerEndPoint];
1004
+ /** event raised when a secure channel is closed */
1005
+ closeChannel: [channel: ServerSecureChannelLayer, endpoint: OPCUAServerEndPoint];
1006
+ /**
1007
+ * event raised when the server refused a TCP connection from a client
1008
+ * (for instance because too many connections)
1009
+ */
1010
+ connectionRefused: [socketData: ISocketData, endpoint: OPCUAServerEndPoint];
1011
+ /**
1012
+ * event raised when an OpenSecureChannel has failed,
1013
+ * e.g. invalid certificate or malformed message
1014
+ */
1015
+ openSecureChannelFailure: [socketData: ISocketData, channelData: IChannelData, endpoint: OPCUAServerEndPoint];
1016
+ }
1017
+
1018
+ export class OPCUAServer extends OPCUABaseServer<OPCUAServerEvents> {
958
1019
  public engine!: ServerEngine;
959
1020
  public registerServerMethod: RegisterServerMethod;
960
1021
  public discoveryServerEndpointUrl!: string;
@@ -2113,7 +2174,7 @@ export class OPCUAServer extends OPCUABaseServer {
2113
2174
  // If the securityPolicyUri is None and none of the UserTokenPolicies requires
2114
2175
  // encryption, the Server shall not send an ApplicationInstanceCertificate and the Client
2115
2176
  // shall ignore the ApplicationInstanceCertificate.
2116
- serverCertificate: hasEncryption ? serverCertificateChain : undefined,
2177
+ serverCertificate: hasEncryption && serverCertificateChain.length > 0 ? combine_der(serverCertificateChain) : undefined,
2117
2178
 
2118
2179
  // The endpoints provided by the server.
2119
2180
  // The Server shall return a set of EndpointDescriptions available for the serverUri
@@ -3769,6 +3830,15 @@ export class OPCUAServer extends OPCUABaseServer {
3769
3830
  serverInfo: this.serverInfo,
3770
3831
  transportSettings: serverOptions.transportSettings
3771
3832
  });
3833
+
3834
+ // SecretHolder reads certificateFile/privateKeyFile from `this`
3835
+ // on each access, so it follows Object.defineProperty redirects
3836
+ // (e.g. from push cert management) automatically.
3837
+ // Note: creates a cycle (server → endpoint → SecretHolder → server)
3838
+ // which is harmless — V8 mark-and-sweep handles it, and
3839
+ // endpoint.dispose() breaks it by replacing #certProvider.
3840
+ endPoint.setCertificateProvider(new SecretHolder(this));
3841
+
3772
3842
  return endPoint;
3773
3843
  }
3774
3844
 
@@ -3818,7 +3888,7 @@ export class OPCUAServer extends OPCUABaseServer {
3818
3888
  // xx hostname,
3819
3889
  resourcePath: serverOption.resourcePath || "",
3820
3890
 
3821
- advertisedEndpoints: endpointOptions.advertisedEndpoints,
3891
+ advertisedEndpoints: endpointOptions.advertisedEndpoints
3822
3892
 
3823
3893
  // TODO userTokenTypes: endpointOptions.userTokenTypes || undefined,
3824
3894
 
@@ -3832,89 +3902,6 @@ export class OPCUAServer extends OPCUABaseServer {
3832
3902
  await this.userCertificateManager.initialize();
3833
3903
  }
3834
3904
 
3835
- public on(event: "create_session", eventHandler: (session: ServerSession) => void): this;
3836
-
3837
- public on(event: "session_activated", eventHandler: (session: ServerSession) => void): this;
3838
-
3839
- public on(event: "session_closed", eventHandler: (session: ServerSession, reason: string) => void): this;
3840
-
3841
- public on(event: "post_initialize", eventHandler: () => void): this;
3842
-
3843
- /**
3844
- * emitted when the server is trying to registered the LDS
3845
- * but when the connection to the lds has failed
3846
- * serverRegistrationPending is sent when the backoff signal of the
3847
- * connection process is raised
3848
- * @event serverRegistrationPending
3849
- */
3850
- public on(event: "serverRegistrationPending", eventHandler: () => void): this;
3851
-
3852
- /**
3853
- * event raised when server has been successfully registered on the local discovery server
3854
- * @event serverRegistered
3855
- */
3856
- public on(event: "serverRegistered", eventHandler: () => void): this;
3857
-
3858
- /**
3859
- * event raised when server registration has been successfully renewed on the local discovery server
3860
- * @event serverRegistered
3861
- */
3862
- public on(event: "serverRegistrationRenewed", eventHandler: () => void): this;
3863
-
3864
- /**
3865
- * event raised when server has been successfully unregistered from the local discovery server
3866
- * @event serverUnregistered
3867
- */
3868
- public on(event: "serverUnregistered", eventHandler: () => void): this;
3869
-
3870
- /**
3871
- * event raised after the server has raised an OPCUA event toward a client
3872
- */
3873
- public on(event: "event", eventHandler: (eventData: unknown) => void): this;
3874
-
3875
- /**
3876
- * event raised when the server received a request from one of its connected client.
3877
- * useful for trace purpose.
3878
- */
3879
- public on(event: "request", eventHandler: (request: Request, channel: ServerSecureChannelLayer) => void): this;
3880
-
3881
- /**
3882
- * event raised when the server send an response to a request to one of its connected client.
3883
- * useful for trace purpose.
3884
- */
3885
- public on(event: "response", eventHandler: (request: Response, channel: ServerSecureChannelLayer) => void): this;
3886
-
3887
- /**
3888
- * event raised when a new secure channel is opened
3889
- */
3890
- public on(event: "newChannel", eventHandler: (channel: ServerSecureChannelLayer, endpoint: OPCUAServerEndPoint) => void): this;
3891
-
3892
- /**
3893
- * event raised when a new secure channel is closed
3894
- */
3895
- public on(
3896
- event: "closeChannel",
3897
- eventHandler: (channel: ServerSecureChannelLayer, endpoint: OPCUAServerEndPoint) => void
3898
- ): this;
3899
-
3900
- /**
3901
- * event raised when the server refused a tcp connection from a client. ( for instance because too any connections)
3902
- */
3903
- public on(event: "connectionRefused", eventHandler: (socketData: ISocketData, endpoint: OPCUAServerEndPoint) => void): this;
3904
-
3905
- /**
3906
- * event raised when a OpenSecureChannel has failed, it could be a invalid certificate or malformed message
3907
- */
3908
- public on(
3909
- event: "openSecureChannelFailure",
3910
- eventHandler: (socketData: ISocketData, channelData: IChannelData, endpoint: OPCUAServerEndPoint) => void
3911
- ): this;
3912
-
3913
- public on(event: string, eventHandler: (...args: unknown[]) => void): this;
3914
- // biome-ignore lint/suspicious/noExplicitAny: must match EventEmitter.on() signature
3915
- public on(event: string, eventHandler: (...args: any[]) => void): this {
3916
- return super.on(event, eventHandler);
3917
- }
3918
3905
  }
3919
3906
 
3920
3907
  const userIdentityTokenPasswordRemoved = (userIdentityToken?: UserIdentityToken): UserIdentityToken => {
@@ -4047,7 +4034,7 @@ export interface RaiseEventAuditActivateSessionEventData extends RaiseEventAudit
4047
4034
  }
4048
4035
 
4049
4036
  // tslint:disable:no-empty-interface
4050
- export interface RaiseEventTransitionEventData extends RaiseEventData { }
4037
+ export interface RaiseEventTransitionEventData extends RaiseEventData {}
4051
4038
 
4052
4039
  export interface RaiseEventAuditUrlMismatchEventTypeData extends RaiseEventData {
4053
4040
  endpointUrl: PseudoVariantString;
@@ -4077,7 +4064,7 @@ export interface RaiseAuditCertificateDataMismatchEventData extends RaiseAuditCe
4077
4064
  */
4078
4065
  invalidUri: PseudoVariantString;
4079
4066
  }
4080
- export interface RaiseAuditCertificateUntrustedEventData extends RaiseAuditCertificateEventData { }
4067
+ export interface RaiseAuditCertificateUntrustedEventData extends RaiseAuditCertificateEventData {}
4081
4068
  /**
4082
4069
  * This EventType inherits all Properties of the AuditCertificateEventType.
4083
4070
  *
@@ -4089,7 +4076,7 @@ export interface RaiseAuditCertificateUntrustedEventData extends RaiseAuditCerti
4089
4076
  * There are no additional Properties defined for this EventType.
4090
4077
  *
4091
4078
  */
4092
- export interface RaiseAuditCertificateExpiredEventData extends RaiseAuditCertificateEventData { }
4079
+ export interface RaiseAuditCertificateExpiredEventData extends RaiseAuditCertificateEventData {}
4093
4080
  /**
4094
4081
  * This EventType inherits all Properties of the AuditCertificateEventType.
4095
4082
  *
@@ -4099,7 +4086,7 @@ export interface RaiseAuditCertificateExpiredEventData extends RaiseAuditCertifi
4099
4086
  *
4100
4087
  * There are no additional Properties defined for this EventType.
4101
4088
  */
4102
- export interface RaiseAuditCertificateInvalidEventData extends RaiseAuditCertificateEventData { }
4089
+ export interface RaiseAuditCertificateInvalidEventData extends RaiseAuditCertificateEventData {}
4103
4090
  /**
4104
4091
  * This EventType inherits all Properties of the AuditCertificateEventType.
4105
4092
  *
@@ -4109,7 +4096,7 @@ export interface RaiseAuditCertificateInvalidEventData extends RaiseAuditCertifi
4109
4096
  * If a trust chain is involved then the certificate that failed in the trust chain should be described.
4110
4097
  * There are no additional Properties defined for this EventType.
4111
4098
  */
4112
- export interface RaiseAuditCertificateUntrustedEventData extends RaiseAuditCertificateEventData { }
4099
+ export interface RaiseAuditCertificateUntrustedEventData extends RaiseAuditCertificateEventData {}
4113
4100
  /**
4114
4101
  * This EventType inherits all Properties of the AuditCertificateEventType.
4115
4102
  *
@@ -4132,7 +4119,7 @@ export interface RaiseAuditCertificateRevokedEventData extends RaiseAuditCertifi
4132
4119
  *
4133
4120
  * There are no additional Properties defined for this EventType
4134
4121
  */
4135
- export interface RaiseAuditCertificateMismatchEventData extends RaiseAuditCertificateEventData { }
4122
+ export interface RaiseAuditCertificateMismatchEventData extends RaiseAuditCertificateEventData {}
4136
4123
 
4137
4124
  const opts = { multiArgs: false };
4138
4125
  OPCUAServer.prototype.initialize = withCallback(OPCUAServer.prototype.initialize, opts);