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.
- package/dist/addressSpace_accessor.d.ts +6 -6
- package/dist/addressSpace_accessor.js +2 -2
- package/dist/addressSpace_accessor.js.map +1 -1
- package/dist/base_server.d.ts +14 -3
- package/dist/base_server.js +64 -44
- package/dist/base_server.js.map +1 -1
- package/dist/extract_password_from_blob.js +1 -3
- package/dist/extract_password_from_blob.js.map +1 -1
- package/dist/factory.d.ts +2 -3
- package/dist/factory.js.map +1 -1
- package/dist/filter/check_where_clause_on_address_space.d.ts +2 -2
- package/dist/filter/check_where_clause_on_address_space.js +1 -2
- package/dist/filter/check_where_clause_on_address_space.js.map +1 -1
- package/dist/filter/extract_event_fields.d.ts +3 -3
- package/dist/filter/extract_event_fields.js +1 -2
- package/dist/filter/extract_event_fields.js.map +1 -1
- package/dist/helper.d.ts +3 -3
- package/dist/helper.js +4 -8
- package/dist/helper.js.map +1 -1
- package/dist/i_address_space_accessor.d.ts +4 -4
- package/dist/i_channel_data.d.ts +1 -1
- package/dist/i_register_server_manager.d.ts +1 -1
- package/dist/i_server_side_publish_engine.d.ts +8 -6
- package/dist/i_server_side_publish_engine.js +7 -2
- package/dist/i_server_side_publish_engine.js.map +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.js +8 -7
- package/dist/index.js.map +1 -1
- package/dist/invalidate_server_certificate_cache.d.ts +16 -0
- package/dist/invalidate_server_certificate_cache.js +28 -0
- package/dist/invalidate_server_certificate_cache.js.map +1 -0
- package/dist/monitored_item.d.ts +10 -11
- package/dist/monitored_item.js +38 -39
- package/dist/monitored_item.js.map +1 -1
- package/dist/node_sampler.d.ts +1 -1
- package/dist/node_sampler.js +2 -4
- package/dist/node_sampler.js.map +1 -1
- package/dist/opcua_server.d.ts +57 -62
- package/dist/opcua_server.js +10 -10
- package/dist/opcua_server.js.map +1 -1
- package/dist/register_server_manager.d.ts +8 -8
- package/dist/register_server_manager.js +40 -40
- package/dist/register_server_manager.js.map +1 -1
- package/dist/register_server_manager_hidden.d.ts +1 -1
- package/dist/register_server_manager_hidden.js +2 -4
- package/dist/register_server_manager_hidden.js.map +1 -1
- package/dist/register_server_manager_mdns_only.d.ts +1 -1
- package/dist/register_server_manager_mdns_only.js.map +1 -1
- package/dist/sampling_func.d.ts +2 -2
- package/dist/server_capabilities.d.ts +3 -3
- package/dist/server_capabilities.js.map +1 -1
- package/dist/server_end_point.d.ts +47 -4
- package/dist/server_end_point.js +133 -42
- package/dist/server_end_point.js.map +1 -1
- package/dist/server_engine.js +29 -25
- package/dist/server_engine.js.map +1 -1
- package/dist/server_publish_engine.d.ts +5 -5
- package/dist/server_publish_engine.js +29 -23
- package/dist/server_publish_engine.js.map +1 -1
- package/dist/server_publish_engine_for_orphan_subscriptions.d.ts +2 -2
- package/dist/server_publish_engine_for_orphan_subscriptions.js.map +1 -1
- package/dist/server_session.d.ts +9 -10
- package/dist/server_session.js +11 -12
- package/dist/server_session.js.map +1 -1
- package/dist/server_subscription.d.ts +13 -13
- package/dist/server_subscription.js +100 -79
- package/dist/server_subscription.js.map +1 -1
- package/dist/sessions_compatible_for_transfer.d.ts +1 -1
- package/dist/sessions_compatible_for_transfer.js +1 -1
- package/dist/sessions_compatible_for_transfer.js.map +1 -1
- package/dist/user_manager.d.ts +4 -4
- package/dist/user_manager.js +1 -1
- package/dist/user_manager.js.map +1 -1
- package/dist/user_manager_ua.d.ts +2 -2
- package/dist/user_manager_ua.js +2 -2
- package/dist/user_manager_ua.js.map +1 -1
- package/dist/validate_filter.d.ts +7 -4
- package/dist/validate_filter.js +5 -6
- package/dist/validate_filter.js.map +1 -1
- package/package.json +51 -50
- package/source/addressSpace_accessor.ts +24 -24
- package/source/base_server.ts +75 -63
- package/source/extract_password_from_blob.ts +3 -11
- package/source/factory.ts +2 -4
- package/source/filter/check_where_clause_on_address_space.ts +4 -7
- package/source/filter/extract_event_fields.ts +4 -5
- package/source/helper.ts +9 -13
- package/source/i_address_space_accessor.ts +13 -4
- package/source/i_channel_data.ts +1 -1
- package/source/i_register_server_manager.ts +2 -4
- package/source/i_server_side_publish_engine.ts +16 -9
- package/source/index.ts +10 -9
- package/source/invalidate_server_certificate_cache.ts +26 -0
- package/source/monitored_item.ts +44 -42
- package/source/node_sampler.ts +9 -11
- package/source/opcua_server.ts +86 -99
- package/source/register_server_manager.ts +75 -72
- package/source/register_server_manager_hidden.ts +3 -5
- package/source/register_server_manager_mdns_only.ts +1 -3
- package/source/sampling_func.ts +2 -2
- package/source/server_capabilities.ts +9 -6
- package/source/server_end_point.ts +143 -50
- package/source/server_engine.ts +22 -22
- package/source/server_publish_engine.ts +35 -30
- package/source/server_publish_engine_for_orphan_subscriptions.ts +3 -3
- package/source/server_session.ts +36 -33
- package/source/server_subscription.ts +182 -184
- package/source/sessions_compatible_for_transfer.ts +9 -9
- package/source/user_manager.ts +7 -7
- package/source/user_manager_ua.ts +3 -5
- package/source/validate_filter.ts +9 -11
|
@@ -1,38 +1,36 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
2
|
* @module node-opcua-server
|
|
3
3
|
*/
|
|
4
4
|
// tslint:disable:no-console
|
|
5
|
-
import { EventEmitter } from "events";
|
|
5
|
+
import { EventEmitter } from "node:events";
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
|
|
8
8
|
import { assert } from "node-opcua-assert";
|
|
9
|
-
import { UAString } from "node-opcua-basic-types";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
OPCUAClientBaseOptions,
|
|
15
|
-
ResponseCallback
|
|
16
|
-
} from "node-opcua-client";
|
|
17
|
-
import { make_debugLog, checkDebugFlag, make_warningLog } from "node-opcua-debug";
|
|
9
|
+
import type { UAString } from "node-opcua-basic-types";
|
|
10
|
+
import type { OPCUACertificateManager } from "node-opcua-certificate-manager";
|
|
11
|
+
import { coerceLocalizedText, type LocalizedTextOptions, OPCUAClientBase, type ResponseCallback } from "node-opcua-client";
|
|
12
|
+
import { exploreCertificate } from "node-opcua-crypto/web";
|
|
13
|
+
import { checkDebugFlag, make_debugLog, make_warningLog } from "node-opcua-debug";
|
|
18
14
|
import { resolveFullyQualifiedDomainName } from "node-opcua-hostname";
|
|
19
15
|
import { coerceSecurityPolicy, MessageSecurityMode, SecurityPolicy } from "node-opcua-secure-channel";
|
|
20
16
|
import {
|
|
21
17
|
RegisterServer2Request,
|
|
22
|
-
RegisterServer2Response,
|
|
18
|
+
type RegisterServer2Response,
|
|
23
19
|
RegisterServerRequest,
|
|
24
|
-
RegisterServerResponse
|
|
20
|
+
type RegisterServerResponse
|
|
25
21
|
} from "node-opcua-service-discovery";
|
|
26
|
-
import {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
22
|
+
import {
|
|
23
|
+
type ApplicationType,
|
|
24
|
+
type EndpointDescription,
|
|
25
|
+
MdnsDiscoveryConfiguration,
|
|
26
|
+
type RegisteredServerOptions
|
|
27
|
+
} from "node-opcua-types";
|
|
28
|
+
import { type IRegisterServerManager, RegisterServerManagerStatus } from "./i_register_server_manager";
|
|
29
|
+
|
|
30
|
+
const _doDebug = checkDebugFlag("REGISTER_LDS");
|
|
32
31
|
const debugLog = make_debugLog("REGISTER_LDS");
|
|
33
32
|
const warningLog = make_warningLog("REGISTER_LDS");
|
|
34
33
|
|
|
35
|
-
|
|
36
34
|
const g_DefaultRegistrationServerTimeout = 8 * 60 * 1000; // 8 minutes
|
|
37
35
|
|
|
38
36
|
function securityPolicyLevel(securityPolicy: UAString): number {
|
|
@@ -110,7 +108,7 @@ function constructRegisteredServer(server: IPartialServer, isOnline: boolean): R
|
|
|
110
108
|
assert(!isOnline || discoveryUrls.length >= 1, "expecting some discoveryUrls if we go online .... ");
|
|
111
109
|
|
|
112
110
|
const info = exploreCertificate(server.getCertificate());
|
|
113
|
-
const
|
|
111
|
+
const _commonName = info.tbsCertificate.subject.commonName ?? "";
|
|
114
112
|
|
|
115
113
|
const serverUri = info.tbsCertificate.extensions?.subjectAltName?.uniformResourceIdentifier[0];
|
|
116
114
|
// c8 ignore next
|
|
@@ -122,7 +120,7 @@ function constructRegisteredServer(server: IPartialServer, isOnline: boolean): R
|
|
|
122
120
|
"\n subjectAltName : ",
|
|
123
121
|
info.tbsCertificate.extensions?.subjectAltName,
|
|
124
122
|
"\n commonName : ",
|
|
125
|
-
info.tbsCertificate.subject.commonName
|
|
123
|
+
info.tbsCertificate.subject.commonName,
|
|
126
124
|
"\n serverInfo.applicationUri : ",
|
|
127
125
|
server.serverInfo.applicationUri
|
|
128
126
|
);
|
|
@@ -203,7 +201,7 @@ async function sendRegisterServerRequest(server: IPartialServer, client: ClientB
|
|
|
203
201
|
const request = constructRegisterServer2Request(server, isOnline);
|
|
204
202
|
|
|
205
203
|
await new Promise<void>((resolve, reject) => {
|
|
206
|
-
client.performMessageTransaction(request, (err: Error | null,
|
|
204
|
+
client.performMessageTransaction(request, (err: Error | null, _response?: RegisterServer2Response) => {
|
|
207
205
|
if (!err) {
|
|
208
206
|
// RegisterServerResponse
|
|
209
207
|
debugLog("RegisterServerManager#_registerServer sendRegisterServer2Request has succeeded (isOnline", isOnline, ")");
|
|
@@ -213,7 +211,7 @@ async function sendRegisterServerRequest(server: IPartialServer, client: ClientB
|
|
|
213
211
|
debugLog("RegisterServerManager#_registerServer" + " falling back to using sendRegisterServerRequest instead");
|
|
214
212
|
// fall back to
|
|
215
213
|
const request1 = constructRegisterServerRequest(server, isOnline);
|
|
216
|
-
client.performMessageTransaction(request1, (err1: Error | null,
|
|
214
|
+
client.performMessageTransaction(request1, (err1: Error | null, _response1?: RegisterServerResponse) => {
|
|
217
215
|
if (!err1) {
|
|
218
216
|
debugLog(
|
|
219
217
|
"RegisterServerManager#_registerServer sendRegisterServerRequest " + "has succeeded (isOnline",
|
|
@@ -227,10 +225,9 @@ async function sendRegisterServerRequest(server: IPartialServer, client: ClientB
|
|
|
227
225
|
isOnline,
|
|
228
226
|
")"
|
|
229
227
|
);
|
|
230
|
-
reject(err1
|
|
228
|
+
reject(err1);
|
|
231
229
|
});
|
|
232
230
|
});
|
|
233
|
-
|
|
234
231
|
});
|
|
235
232
|
}
|
|
236
233
|
|
|
@@ -256,7 +253,7 @@ export interface RegisterServerManagerOptions {
|
|
|
256
253
|
let g_registeringClientCounter = 0;
|
|
257
254
|
/**
|
|
258
255
|
* RegisterServerManager is responsible to Register an opcua server on a LDS or LDS-ME server
|
|
259
|
-
* This class takes in charge :
|
|
256
|
+
* This class takes in charge :
|
|
260
257
|
* - the initial registration of a server
|
|
261
258
|
* - the regular registration renewal (every 8 minutes or so ...)
|
|
262
259
|
* - dealing with cases where LDS is not up and running when server starts.
|
|
@@ -349,7 +346,7 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
349
346
|
public async start(): Promise<void> {
|
|
350
347
|
debugLog("RegisterServerManager#start");
|
|
351
348
|
if (this.state !== RegisterServerManagerStatus.INACTIVE) {
|
|
352
|
-
throw new Error(
|
|
349
|
+
throw new Error(`RegisterServer process already started: ${RegisterServerManagerStatus[this.state]}`);
|
|
353
350
|
}
|
|
354
351
|
this.discoveryServerEndpointUrl = resolveFullyQualifiedDomainName(this.discoveryServerEndpointUrl);
|
|
355
352
|
|
|
@@ -359,7 +356,7 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
359
356
|
// This method is called without await to ensure it is non-blocking.
|
|
360
357
|
// The catch block handles any synchronous errors.
|
|
361
358
|
this.#_runRegistrationProcess().catch((err) => {
|
|
362
|
-
warningLog("Synchronous error in #_runRegistrationProcess: ",
|
|
359
|
+
warningLog("Synchronous error in #_runRegistrationProcess: ", err?.message);
|
|
363
360
|
});
|
|
364
361
|
}
|
|
365
362
|
|
|
@@ -370,7 +367,12 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
370
367
|
*/
|
|
371
368
|
async #_runRegistrationProcess(): Promise<void> {
|
|
372
369
|
while (this.getState() !== RegisterServerManagerStatus.WAITING && !this.#_isTerminating()) {
|
|
373
|
-
debugLog(
|
|
370
|
+
debugLog(
|
|
371
|
+
"RegisterServerManager#_runRegistrationProcess - state =",
|
|
372
|
+
RegisterServerManagerStatus[this.state],
|
|
373
|
+
"isTerminating =",
|
|
374
|
+
this.#_isTerminating()
|
|
375
|
+
);
|
|
374
376
|
try {
|
|
375
377
|
if (this.getState() === RegisterServerManagerStatus.INACTIVE) {
|
|
376
378
|
this.#_setState(RegisterServerManagerStatus.INITIALIZING);
|
|
@@ -399,7 +401,7 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
399
401
|
this.#_trigger_next();
|
|
400
402
|
return;
|
|
401
403
|
} catch (err) {
|
|
402
|
-
debugLog("RegisterServerManager#_runRegistrationProcess - operation failed!", (
|
|
404
|
+
debugLog("RegisterServerManager#_runRegistrationProcess - operation failed!", (err as Error).message);
|
|
403
405
|
if (!this.#_isTerminating()) {
|
|
404
406
|
this.#_setState(RegisterServerManagerStatus.INACTIVE);
|
|
405
407
|
this.#_emitEvent("serverRegistrationFailure");
|
|
@@ -413,7 +415,10 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
413
415
|
}
|
|
414
416
|
}
|
|
415
417
|
#_isTerminating(): boolean {
|
|
416
|
-
return
|
|
418
|
+
return (
|
|
419
|
+
this.getState() === RegisterServerManagerStatus.UNREGISTERING ||
|
|
420
|
+
this.getState() === RegisterServerManagerStatus.DISPOSING
|
|
421
|
+
);
|
|
417
422
|
}
|
|
418
423
|
|
|
419
424
|
/**
|
|
@@ -435,30 +440,28 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
435
440
|
assert(typeof this.discoveryServerEndpointUrl === "string");
|
|
436
441
|
assert(this.state === RegisterServerManagerStatus.INITIALIZING);
|
|
437
442
|
|
|
438
|
-
|
|
439
443
|
this.selectedEndpoint = undefined;
|
|
440
444
|
|
|
441
|
-
const applicationName = coerceLocalizedText(this.server.serverInfo.applicationName
|
|
445
|
+
const applicationName = coerceLocalizedText(this.server.serverInfo.applicationName)?.text || undefined;
|
|
442
446
|
this.server.serverCertificateManager.referenceCounter++;
|
|
443
447
|
|
|
444
448
|
const server = this.server;
|
|
445
449
|
const prefix = `Client-${g_registeringClientCounter++}`;
|
|
446
450
|
const action = "initializing";
|
|
447
451
|
const ldsInfo = this.discoveryServerEndpointUrl;
|
|
448
|
-
const
|
|
449
|
-
const clientName = `${prefix} for server ${
|
|
452
|
+
const serverAppUri = this.server?.serverInfo.applicationUri ?? "";
|
|
453
|
+
const clientName = `${prefix} for server ${serverAppUri} to LDS ${ldsInfo} for ${action}`;
|
|
450
454
|
|
|
451
455
|
const registrationClient = OPCUAClientBase.create({
|
|
452
456
|
clientName,
|
|
453
457
|
applicationName,
|
|
454
|
-
applicationUri: server.serverInfo.applicationUri
|
|
458
|
+
applicationUri: server.serverInfo.applicationUri ?? "",
|
|
455
459
|
connectionStrategy: infinite_connectivity_strategy,
|
|
456
460
|
clientCertificateManager: server.serverCertificateManager,
|
|
457
461
|
certificateFile: server.certificateFile,
|
|
458
462
|
privateKeyFile: server.privateKeyFile
|
|
459
463
|
}) as ClientBaseEx;
|
|
460
464
|
|
|
461
|
-
|
|
462
465
|
registrationClient.on("backoff", (nbRetry: number, delay: number) => {
|
|
463
466
|
if (this.state !== RegisterServerManagerStatus.INITIALIZING) return; // Ignore event if state has changed
|
|
464
467
|
debugLog("RegisterServerManager - received backoff");
|
|
@@ -489,24 +492,18 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
489
492
|
return;
|
|
490
493
|
}
|
|
491
494
|
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
+
const endpoints = await registrationClient.getEndpoints();
|
|
496
|
+
if (!endpoints || endpoints.length === 0) {
|
|
497
|
+
throw new Error("Cannot retrieve endpoints from discovery server");
|
|
498
|
+
}
|
|
499
|
+
const endpoint = findSecureEndpoint(endpoints);
|
|
495
500
|
if (!endpoint) {
|
|
496
501
|
throw new Error("Cannot find Secure endpoint");
|
|
497
502
|
}
|
|
498
503
|
|
|
499
|
-
|
|
500
|
-
assert(endpoint.serverCertificate);
|
|
501
|
-
this.selectedEndpoint = endpoint;
|
|
502
|
-
} else {
|
|
503
|
-
this.selectedEndpoint = undefined;
|
|
504
|
-
}
|
|
504
|
+
this.selectedEndpoint = endpoint.serverCertificate ? endpoint : undefined;
|
|
505
505
|
|
|
506
506
|
this._serverEndpoints = registrationClient._serverEndpoints;
|
|
507
|
-
} catch (err) {
|
|
508
|
-
// Do not set state to INACTIVE or rethrow here, let the caller handle it.
|
|
509
|
-
throw err;
|
|
510
507
|
} finally {
|
|
511
508
|
if (this._registration_client) {
|
|
512
509
|
const tmp = this._registration_client;
|
|
@@ -557,7 +554,7 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
557
554
|
this.#_setState(RegisterServerManagerStatus.REGISTERING);
|
|
558
555
|
this.#_emitEvent("serverRegistrationPending");
|
|
559
556
|
|
|
560
|
-
this.#_registerOrUnregisterServer(/*isOnline=*/true)
|
|
557
|
+
this.#_registerOrUnregisterServer(/*isOnline=*/ true)
|
|
561
558
|
.then(() => after_register())
|
|
562
559
|
.catch((err) => after_register(err));
|
|
563
560
|
}, this.timeout);
|
|
@@ -577,7 +574,6 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
577
574
|
this._registrationTimerId = null;
|
|
578
575
|
}
|
|
579
576
|
|
|
580
|
-
|
|
581
577
|
// Immediately set state to signal a stop
|
|
582
578
|
this.#_setState(RegisterServerManagerStatus.UNREGISTERING);
|
|
583
579
|
|
|
@@ -586,7 +582,7 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
586
582
|
|
|
587
583
|
if (this.selectedEndpoint) {
|
|
588
584
|
try {
|
|
589
|
-
await this.#_registerOrUnregisterServer(/* isOnline= */false);
|
|
585
|
+
await this.#_registerOrUnregisterServer(/* isOnline= */ false);
|
|
590
586
|
this.#_setState(RegisterServerManagerStatus.UNREGISTERED);
|
|
591
587
|
this.#_emitEvent("serverUnregistered");
|
|
592
588
|
} catch (err) {
|
|
@@ -615,9 +611,12 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
615
611
|
debugLog("RegisterServerManager#_registerServer isOnline:", isOnline);
|
|
616
612
|
|
|
617
613
|
assert(this.selectedEndpoint, "must have a selected endpoint");
|
|
618
|
-
assert(this.server
|
|
614
|
+
assert(this.server?.serverType !== undefined, " must have a valid server Type");
|
|
619
615
|
|
|
620
|
-
|
|
616
|
+
if (!this.server) {
|
|
617
|
+
throw new Error("RegisterServerManager: server is not set");
|
|
618
|
+
}
|
|
619
|
+
const server = this.server;
|
|
621
620
|
const selectedEndpoint = this.selectedEndpoint;
|
|
622
621
|
if (!selectedEndpoint) {
|
|
623
622
|
warningLog("Warning: cannot register server - no endpoint available");
|
|
@@ -626,18 +625,18 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
626
625
|
}
|
|
627
626
|
|
|
628
627
|
server.serverCertificateManager.referenceCounter++;
|
|
629
|
-
const applicationName: string | undefined = coerceLocalizedText(server.serverInfo.applicationName
|
|
628
|
+
const applicationName: string | undefined = coerceLocalizedText(server.serverInfo.applicationName)?.text || undefined;
|
|
630
629
|
|
|
631
630
|
const prefix = `Client-${g_registeringClientCounter++}`;
|
|
632
631
|
const action = isOnline ? "registering" : "unregistering";
|
|
633
632
|
const ldsInfo = this.discoveryServerEndpointUrl;
|
|
634
|
-
const
|
|
635
|
-
const clientName = `${prefix} for server ${
|
|
633
|
+
const serverAppUri = server.serverInfo.applicationUri ?? "";
|
|
634
|
+
const clientName = `${prefix} for server ${serverAppUri} to LDS ${ldsInfo} for ${action}`;
|
|
636
635
|
|
|
637
636
|
const client = OPCUAClientBase.create({
|
|
638
637
|
clientName,
|
|
639
638
|
applicationName,
|
|
640
|
-
applicationUri: server.serverInfo.applicationUri
|
|
639
|
+
applicationUri: server.serverInfo.applicationUri ?? "",
|
|
641
640
|
connectionStrategy: no_retry_connectivity_strategy,
|
|
642
641
|
clientCertificateManager: server.serverCertificateManager,
|
|
643
642
|
|
|
@@ -645,8 +644,7 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
645
644
|
securityPolicy: coerceSecurityPolicy(selectedEndpoint.securityPolicyUri),
|
|
646
645
|
serverCertificate: selectedEndpoint.serverCertificate,
|
|
647
646
|
certificateFile: server.certificateFile,
|
|
648
|
-
privateKeyFile: server.privateKeyFile
|
|
649
|
-
|
|
647
|
+
privateKeyFile: server.privateKeyFile
|
|
650
648
|
}) as ClientBaseEx;
|
|
651
649
|
client.on("backoff", (nbRetry, delay) => {
|
|
652
650
|
debugLog(client.clientCertificateManager, "backoff trying to connect to the LDS has failed", nbRetry, delay);
|
|
@@ -654,30 +652,36 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
654
652
|
|
|
655
653
|
this._registration_client = client;
|
|
656
654
|
|
|
657
|
-
|
|
655
|
+
const endpointUrl = selectedEndpoint.endpointUrl;
|
|
656
|
+
if (!endpointUrl) {
|
|
657
|
+
throw new Error("selectedEndpoint.endpointUrl is missing — cannot connect to LDS");
|
|
658
|
+
}
|
|
659
|
+
debugLog("lds endpoint uri : ", endpointUrl);
|
|
658
660
|
|
|
659
|
-
const state = isOnline ? "
|
|
661
|
+
const state = isOnline ? "RegisterServer" : "UnRegisterServer";
|
|
660
662
|
try {
|
|
661
|
-
await client.connect(
|
|
663
|
+
await client.connect(endpointUrl);
|
|
662
664
|
|
|
663
665
|
// Check state again after connection is established
|
|
664
666
|
if (this.getState() === expectedState) {
|
|
665
667
|
try {
|
|
666
|
-
await sendRegisterServerRequest(server, client as ClientBaseEx, isOnline)
|
|
668
|
+
await sendRegisterServerRequest(server, client as ClientBaseEx, isOnline);
|
|
667
669
|
} catch (err) {
|
|
668
670
|
if (this.getState() !== expectedState) {
|
|
669
|
-
warningLog(
|
|
670
|
-
|
|
671
|
+
warningLog(
|
|
672
|
+
`${state} '${this.server?.serverInfo.applicationUri}' to the LDS has failed during secure connection to the LDS server`
|
|
673
|
+
);
|
|
674
|
+
warningLog(chalk.red(" Error message:"), (err as Error).message); // Do not rethrow here, let the caller
|
|
671
675
|
}
|
|
672
676
|
}
|
|
673
677
|
} else {
|
|
674
678
|
debugLog("RegisterServerManager#_registerServer: aborted ");
|
|
675
679
|
}
|
|
676
|
-
|
|
677
680
|
} catch (err) {
|
|
678
681
|
if (this.getState() !== expectedState) {
|
|
679
|
-
|
|
680
|
-
|
|
682
|
+
warningLog(
|
|
683
|
+
`${state} '${this.server?.serverInfo.applicationUri}' cannot connect to LDS at endpoint ${client.clientName}, ${selectedEndpoint.endpointUrl} :`
|
|
684
|
+
);
|
|
681
685
|
warningLog(chalk.red(" Error message:"), (err as Error).message);
|
|
682
686
|
}
|
|
683
687
|
} finally {
|
|
@@ -700,8 +704,7 @@ export class RegisterServerManager extends EventEmitter implements IRegisterServ
|
|
|
700
704
|
if (this._registration_client) {
|
|
701
705
|
const client = this._registration_client;
|
|
702
706
|
this._registration_client = null;
|
|
703
|
-
debugLog("RegisterServerManager#_cancel_pending_client_if_any "
|
|
704
|
-
+ "=> wee need to disconnect_registration_client");
|
|
707
|
+
debugLog("RegisterServerManager#_cancel_pending_client_if_any " + "=> wee need to disconnect_registration_client");
|
|
705
708
|
try {
|
|
706
709
|
await client.disconnect();
|
|
707
710
|
} catch (err) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module node-opcua-server
|
|
3
3
|
*/
|
|
4
4
|
import { EventEmitter } from "events";
|
|
5
|
-
import { IRegisterServerManager, RegisterServerManagerStatus } from "./i_register_server_manager";
|
|
5
|
+
import { type IRegisterServerManager, RegisterServerManagerStatus } from "./i_register_server_manager";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* a IRegisterServerManager that hides the server from any local discover server
|
|
@@ -17,11 +17,9 @@ export class RegisterServerManagerHidden extends EventEmitter implements IRegist
|
|
|
17
17
|
super();
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
public async stop(): Promise<void> {
|
|
21
|
-
}
|
|
20
|
+
public async stop(): Promise<void> {}
|
|
22
21
|
|
|
23
|
-
public async start(): Promise<void> {
|
|
24
|
-
}
|
|
22
|
+
public async start(): Promise<void> {}
|
|
25
23
|
|
|
26
24
|
public dispose(): void {
|
|
27
25
|
//
|
|
@@ -7,7 +7,7 @@ import { EventEmitter } from "events";
|
|
|
7
7
|
import { assert } from "node-opcua-assert";
|
|
8
8
|
import { BonjourHolder } from "node-opcua-service-discovery";
|
|
9
9
|
import { OPCUABaseServer } from "./base_server";
|
|
10
|
-
import { IRegisterServerManager, RegisterServerManagerStatus } from "./i_register_server_manager";
|
|
10
|
+
import { type IRegisterServerManager, RegisterServerManagerStatus } from "./i_register_server_manager";
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* a RegisterServerManager that declare the server the OPCUA Bonjour service
|
|
@@ -31,7 +31,6 @@ export class RegisterServerManagerMDNSONLY extends EventEmitter implements IRegi
|
|
|
31
31
|
|
|
32
32
|
public async stop(): Promise<void> {
|
|
33
33
|
if (this.bonjour) {
|
|
34
|
-
|
|
35
34
|
this._state = RegisterServerManagerStatus.UNREGISTERING;
|
|
36
35
|
await this.bonjour.stopAnnouncedOnMulticastSubnet();
|
|
37
36
|
this.emit("serverUnregistered");
|
|
@@ -51,7 +50,6 @@ export class RegisterServerManagerMDNSONLY extends EventEmitter implements IRegi
|
|
|
51
50
|
const name = this.server.serverInfo.applicationUri!;
|
|
52
51
|
const port = this.server.endpoints[0].port;
|
|
53
52
|
|
|
54
|
-
|
|
55
53
|
this._state = RegisterServerManagerStatus.REGISTERING;
|
|
56
54
|
await this.bonjour.announcedOnMulticastSubnet({
|
|
57
55
|
capabilities: capabilities,
|
package/source/sampling_func.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ISessionContext } from "node-opcua-address-space-base";
|
|
2
|
-
import { DataValue } from "node-opcua-data-value";
|
|
1
|
+
import type { ISessionContext } from "node-opcua-address-space-base";
|
|
2
|
+
import type { DataValue } from "node-opcua-data-value";
|
|
3
3
|
|
|
4
4
|
export type SamplingFunc = (
|
|
5
5
|
context: ISessionContext,
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* @module node-opcua-server
|
|
3
3
|
*/
|
|
4
4
|
// tslint:disable:max-classes-per-file
|
|
5
|
-
import { Double, UInt32 } from "node-opcua-basic-types";
|
|
5
|
+
import type { Double, UInt32 } from "node-opcua-basic-types";
|
|
6
6
|
import { BinaryStream } from "node-opcua-binary-stream";
|
|
7
|
-
import { QualifiedName } from "node-opcua-data-model";
|
|
7
|
+
import type { QualifiedName } from "node-opcua-data-model";
|
|
8
8
|
import { make_warningLog } from "node-opcua-debug";
|
|
9
|
-
import { SignedSoftwareCertificate } from "node-opcua-types";
|
|
9
|
+
import type { SignedSoftwareCertificate } from "node-opcua-types";
|
|
10
10
|
|
|
11
11
|
const warningLog = make_warningLog(__filename);
|
|
12
12
|
|
|
@@ -237,14 +237,17 @@ export class ServerCapabilities implements IServerCapabilities {
|
|
|
237
237
|
this.maxByteStringLength = options.maxByteStringLength || defaultServerCapabilities.maxByteStringLength;
|
|
238
238
|
|
|
239
239
|
if (BinaryStream.maxStringLength < this.maxStringLength) {
|
|
240
|
-
warningLog(
|
|
240
|
+
warningLog(
|
|
241
|
+
`ServerCapabilities.maxStringLength ${this.maxStringLength} is greater that the allowed limite BinaryStream.maxStringLength = ${BinaryStream.maxStringLength}\nPlease adjust the value.`
|
|
242
|
+
);
|
|
241
243
|
}
|
|
242
244
|
|
|
243
245
|
if (BinaryStream.maxByteStringLength < this.maxByteStringLength) {
|
|
244
|
-
warningLog(
|
|
246
|
+
warningLog(
|
|
247
|
+
`ServerCapabilities.maxByteStringLength ${this.maxByteStringLength} is greater that the allowed limite BinaryStream.maxByteStringLength = ${BinaryStream.maxByteStringLength}\nPlease adjust the value.`
|
|
248
|
+
);
|
|
245
249
|
}
|
|
246
250
|
|
|
247
|
-
|
|
248
251
|
this.maxBrowseContinuationPoints =
|
|
249
252
|
options.maxBrowseContinuationPoints || defaultServerCapabilities.maxBrowseContinuationPoints;
|
|
250
253
|
this.maxQueryContinuationPoints =
|