node-opcua-client 2.168.0 → 2.170.1
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/client_monitored_item.d.ts +4 -4
- package/dist/client_monitored_item.js +6 -5
- package/dist/client_monitored_item.js.map +1 -1
- package/dist/client_monitored_item_base.d.ts +7 -7
- package/dist/client_monitored_item_toolbox.d.ts +5 -5
- package/dist/client_monitored_item_toolbox.js +26 -19
- package/dist/client_monitored_item_toolbox.js.map +1 -1
- package/dist/client_session_keepalive_manager.d.ts +2 -0
- package/dist/client_session_keepalive_manager.js +33 -5
- package/dist/client_session_keepalive_manager.js.map +1 -1
- package/dist/private/client_base_impl.js +28 -4
- package/dist/private/client_base_impl.js.map +1 -1
- package/dist/private/client_monitored_item_group_impl.d.ts +7 -6
- package/dist/private/client_monitored_item_group_impl.js +6 -8
- package/dist/private/client_monitored_item_group_impl.js.map +1 -1
- package/dist/private/client_monitored_item_impl.d.ts +10 -9
- package/dist/private/client_monitored_item_impl.js +40 -26
- package/dist/private/client_monitored_item_impl.js.map +1 -1
- package/dist/private/client_session_impl.d.ts +1 -0
- package/dist/private/client_session_impl.js +12 -0
- package/dist/private/client_session_impl.js.map +1 -1
- package/dist/private/client_subscription_impl.d.ts +7 -4
- package/dist/private/client_subscription_impl.js +101 -77
- package/dist/private/client_subscription_impl.js.map +1 -1
- package/dist/private/opcua_client_impl.d.ts +1 -0
- package/dist/private/opcua_client_impl.js +11 -0
- package/dist/private/opcua_client_impl.js.map +1 -1
- package/package.json +42 -42
- package/source/client_monitored_item.ts +5 -4
- package/source/client_monitored_item_base.ts +13 -8
- package/source/client_monitored_item_toolbox.ts +24 -20
- package/source/client_session_keepalive_manager.ts +44 -11
- package/source/private/client_base_impl.ts +27 -6
- package/source/private/client_monitored_item_group_impl.ts +15 -16
- package/source/private/client_monitored_item_impl.ts +56 -38
- package/source/private/client_session_impl.ts +29 -14
- package/source/private/client_subscription_impl.ts +151 -91
- package/source/private/opcua_client_impl.ts +13 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module node-opcua-client
|
|
3
3
|
*/
|
|
4
|
-
import type { EventEmitter } from "events";
|
|
4
|
+
import type { EventEmitter } from "node:events";
|
|
5
5
|
import { type DataValue, TimestampsToReturn } from "node-opcua-data-value";
|
|
6
6
|
import type { ReadValueIdOptions } from "node-opcua-service-read";
|
|
7
|
-
import {
|
|
7
|
+
import type { MonitoringParametersOptions } from "node-opcua-types";
|
|
8
8
|
import type { Variant } from "node-opcua-variant";
|
|
9
9
|
import type { ClientMonitoredItemBase, ClientMonitoredItemOrGroupAction } from "./client_monitored_item_base";
|
|
10
10
|
import type { ClientSubscription } from "./client_subscription";
|
|
@@ -15,6 +15,6 @@ export interface ClientMonitoredItem extends ClientMonitoredItemBase, ClientMoni
|
|
|
15
15
|
on(event: "initialized", eventHandler: () => void): this;
|
|
16
16
|
on(event: "err", eventHandler: (message: string) => void): this;
|
|
17
17
|
}
|
|
18
|
-
export declare
|
|
19
|
-
|
|
18
|
+
export declare namespace ClientMonitoredItem {
|
|
19
|
+
let create: (subscription: ClientSubscription, itemToMonitor: ReadValueIdOptions, monitoringParameters: MonitoringParametersOptions, timestampsToReturn?: TimestampsToReturn) => ClientMonitoredItem;
|
|
20
20
|
}
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ClientMonitoredItem = void 0;
|
|
4
4
|
const node_opcua_data_value_1 = require("node-opcua-data-value");
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
6
|
+
var ClientMonitoredItem;
|
|
7
|
+
(function (ClientMonitoredItem) {
|
|
8
|
+
ClientMonitoredItem.create = function (subscription, itemToMonitor, monitoringParameters, timestampsToReturn = node_opcua_data_value_1.TimestampsToReturn.Neither) {
|
|
7
9
|
/* c8 ignore next*/
|
|
8
10
|
throw new Error("unimplemented");
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
exports.ClientMonitoredItem = ClientMonitoredItem;
|
|
11
|
+
};
|
|
12
|
+
})(ClientMonitoredItem || (exports.ClientMonitoredItem = ClientMonitoredItem = {}));
|
|
12
13
|
//# sourceMappingURL=client_monitored_item.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client_monitored_item.js","sourceRoot":"","sources":["../source/client_monitored_item.ts"],"names":[],"mappings":";;;AAKA,iEAA2E;AAmB3E,
|
|
1
|
+
{"version":3,"file":"client_monitored_item.js","sourceRoot":"","sources":["../source/client_monitored_item.ts"],"names":[],"mappings":";;;AAKA,iEAA2E;AAmB3E,2DAA2D;AAC3D,IAAiB,mBAAmB,CAUnC;AAVD,WAAiB,mBAAmB;IACrB,0BAAM,GAAG,UAChB,YAAgC,EAChC,aAAiC,EACjC,oBAAiD,EACjD,qBAAyC,0CAAkB,CAAC,OAAO;QAEnE,mBAAmB;QACnB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC,CAAA;AACL,CAAC,EAVgB,mBAAmB,mCAAnB,mBAAmB,QAUnC"}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module node-opcua-client
|
|
3
3
|
*/
|
|
4
|
-
import type { EventEmitter } from "events";
|
|
5
|
-
import {
|
|
4
|
+
import type { EventEmitter } from "node:events";
|
|
5
|
+
import type { AttributeIds } from "node-opcua-basic-types";
|
|
6
6
|
import type { QualifiedNameLike } from "node-opcua-data-model";
|
|
7
7
|
import type { DataValue } from "node-opcua-data-value";
|
|
8
8
|
import type { ExtensionObject } from "node-opcua-extension-object";
|
|
9
9
|
import type { NodeId } from "node-opcua-nodeid";
|
|
10
10
|
import type { NumericRange } from "node-opcua-numeric-range";
|
|
11
11
|
import type { TimestampsToReturn } from "node-opcua-service-read";
|
|
12
|
-
import type { MonitoredItemCreateResult, MonitoringMode, MonitoringParameters, MonitoringParametersOptions } from "node-opcua-service-subscription";
|
|
12
|
+
import type { MonitoredItemCreateResult, MonitoredItemModifyResult, MonitoringMode, MonitoringParameters, MonitoringParametersOptions } from "node-opcua-service-subscription";
|
|
13
13
|
import type { Callback, ErrorCallback, StatusCode } from "node-opcua-status-code";
|
|
14
14
|
import type { Variant } from "node-opcua-variant";
|
|
15
15
|
import type { ClientSubscription } from "./client_subscription";
|
|
16
16
|
export interface ClientMonitoredItemOrGroupAction {
|
|
17
|
-
modify(parameters: MonitoringParametersOptions, timestampsToReturn?: TimestampsToReturn): Promise<
|
|
18
|
-
modify(parameters: MonitoringParametersOptions, callback: Callback<
|
|
19
|
-
modify(parameters: MonitoringParametersOptions, timestampsToReturn: TimestampsToReturn | null, callback: Callback<
|
|
17
|
+
modify(parameters: MonitoringParametersOptions, timestampsToReturn?: TimestampsToReturn): Promise<MonitoredItemModifyResult>;
|
|
18
|
+
modify(parameters: MonitoringParametersOptions, callback: Callback<MonitoredItemModifyResult>): void;
|
|
19
|
+
modify(parameters: MonitoringParametersOptions, timestampsToReturn: TimestampsToReturn | null, callback: Callback<MonitoredItemModifyResult>): void;
|
|
20
20
|
setMonitoringMode(monitoringMode: MonitoringMode): Promise<StatusCode>;
|
|
21
21
|
setMonitoringMode(monitoringMode: MonitoringMode, callback: Callback<StatusCode>): void;
|
|
22
22
|
terminate(): Promise<void>;
|
|
@@ -40,7 +40,7 @@ export interface ClientMonitoredItemBase {
|
|
|
40
40
|
readonly subscription: ClientSubscription;
|
|
41
41
|
readonly monitoringMode: MonitoringMode;
|
|
42
42
|
readonly statusCode: StatusCode;
|
|
43
|
-
readonly monitoredItemId?:
|
|
43
|
+
readonly monitoredItemId?: number;
|
|
44
44
|
readonly result?: MonitoredItemCreateResult;
|
|
45
45
|
readonly filterResult?: ExtensionObject;
|
|
46
46
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { TimestampsToReturn } from "node-opcua-data-value";
|
|
2
2
|
import { type MonitoredItemModifyResult, type MonitoringMode } from "node-opcua-service-subscription";
|
|
3
|
-
import {
|
|
3
|
+
import type { Callback, ErrorCallback, StatusCode } from "node-opcua-status-code";
|
|
4
4
|
import type { MonitoringParametersOptions } from "node-opcua-types";
|
|
5
5
|
import type { ClientMonitoredItemBase } from "./client_monitored_item_base";
|
|
6
6
|
import type { ClientSubscription } from "./client_subscription";
|
|
@@ -10,8 +10,8 @@ export interface ClientMonitoredItemBaseEx extends ClientMonitoredItemBase {
|
|
|
10
10
|
/**
|
|
11
11
|
* @internal
|
|
12
12
|
*/
|
|
13
|
-
export declare
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
export declare namespace ClientMonitoredItemToolbox {
|
|
14
|
+
function _toolbox_monitor(subscription: ClientSubscription, timestampsToReturn: TimestampsToReturn, monitoredItems: ClientMonitoredItemBase[], done: ErrorCallback): void;
|
|
15
|
+
function _toolbox_modify(subscription: ClientSubscription, monitoredItems: ClientMonitoredItemBase[], parameters: MonitoringParametersOptions, timestampsToReturn: TimestampsToReturn, callback: Callback<MonitoredItemModifyResult[]>): void;
|
|
16
|
+
function _toolbox_setMonitoringMode(subscription: ClientSubscription, monitoredItems: ClientMonitoredItemBaseEx[], monitoringMode: MonitoringMode, callback: Callback<StatusCode[]>): void;
|
|
17
17
|
}
|
|
@@ -12,27 +12,24 @@ const node_opcua_assert_1 = require("node-opcua-assert");
|
|
|
12
12
|
const node_opcua_debug_1 = require("node-opcua-debug");
|
|
13
13
|
const node_opcua_service_subscription_1 = require("node-opcua-service-subscription");
|
|
14
14
|
const debugLog = (0, node_opcua_debug_1.make_debugLog)(__filename);
|
|
15
|
-
const
|
|
15
|
+
const _doDebug = (0, node_opcua_debug_1.checkDebugFlag)(__filename);
|
|
16
16
|
/**
|
|
17
17
|
* @internal
|
|
18
18
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
var ClientMonitoredItemToolbox;
|
|
20
|
+
(function (ClientMonitoredItemToolbox) {
|
|
21
|
+
function _toolbox_monitor(subscription, timestampsToReturn, monitoredItems, done) {
|
|
21
22
|
(0, node_opcua_assert_1.assert)(typeof done === "function");
|
|
22
23
|
// we expect subscription to be valid and have a valid session
|
|
23
24
|
if (!subscription.hasSession) {
|
|
24
25
|
const err0 = new Error("Invalid subscription");
|
|
25
|
-
|
|
26
|
-
return done(err0);
|
|
27
|
-
}
|
|
26
|
+
done(err0);
|
|
28
27
|
return;
|
|
29
28
|
}
|
|
30
29
|
// may be the subscription has been terminated or is not fully initialize, in the meantime
|
|
31
30
|
if (!subscription.isActive) {
|
|
32
31
|
const err1 = new Error("Subscription has been terminated or is not fully initialized");
|
|
33
|
-
|
|
34
|
-
return done(err1);
|
|
35
|
-
}
|
|
32
|
+
done(err1);
|
|
36
33
|
return;
|
|
37
34
|
}
|
|
38
35
|
const itemsToCreate = [];
|
|
@@ -40,7 +37,8 @@ class ClientMonitoredItemToolbox {
|
|
|
40
37
|
const monitoredItemI = monitoredItem;
|
|
41
38
|
const itemToCreate = monitoredItemI._prepare_for_monitoring();
|
|
42
39
|
if (typeof itemToCreate.error === "string") {
|
|
43
|
-
|
|
40
|
+
done(new Error(itemToCreate.error));
|
|
41
|
+
return;
|
|
44
42
|
}
|
|
45
43
|
itemsToCreate.push(itemToCreate);
|
|
46
44
|
}
|
|
@@ -75,7 +73,8 @@ class ClientMonitoredItemToolbox {
|
|
|
75
73
|
done(err ? err : undefined);
|
|
76
74
|
});
|
|
77
75
|
}
|
|
78
|
-
|
|
76
|
+
ClientMonitoredItemToolbox._toolbox_monitor = _toolbox_monitor;
|
|
77
|
+
function _toolbox_modify(subscription, monitoredItems, parameters, timestampsToReturn, callback) {
|
|
79
78
|
(0, node_opcua_assert_1.assert)(callback === undefined || typeof callback === "function");
|
|
80
79
|
const itemsToModify = monitoredItems.map((monitoredItem) => {
|
|
81
80
|
const clientHandle = monitoredItem.monitoringParameters.clientHandle;
|
|
@@ -98,22 +97,26 @@ class ClientMonitoredItemToolbox {
|
|
|
98
97
|
session.modifyMonitoredItems(modifyMonitoredItemsRequest, (err, response) => {
|
|
99
98
|
/* c8 ignore next */
|
|
100
99
|
if (err) {
|
|
101
|
-
|
|
100
|
+
callback(err);
|
|
101
|
+
return;
|
|
102
102
|
}
|
|
103
103
|
if (!response || !(response instanceof node_opcua_service_subscription_1.ModifyMonitoredItemsResponse)) {
|
|
104
|
-
|
|
104
|
+
callback(new Error("internal error"));
|
|
105
|
+
return;
|
|
105
106
|
}
|
|
106
107
|
response.results = response.results || [];
|
|
107
108
|
(0, node_opcua_assert_1.assert)(response.results.length === monitoredItems.length);
|
|
108
109
|
const res = response.results[0];
|
|
109
110
|
/* c8 ignore next */
|
|
110
111
|
if (response.results.length === 1 && res.statusCode.isNotGood()) {
|
|
111
|
-
|
|
112
|
+
callback(new Error(`Error${res.statusCode.toString()}`));
|
|
113
|
+
return;
|
|
112
114
|
}
|
|
113
115
|
callback(null, response.results);
|
|
114
116
|
});
|
|
115
117
|
}
|
|
116
|
-
|
|
118
|
+
ClientMonitoredItemToolbox._toolbox_modify = _toolbox_modify;
|
|
119
|
+
function _toolbox_setMonitoringMode(subscription, monitoredItems, monitoringMode, callback) {
|
|
117
120
|
const monitoredItemIds = monitoredItems.map((monitoredItem) => monitoredItem.monitoredItemId);
|
|
118
121
|
const setMonitoringModeRequest = {
|
|
119
122
|
monitoredItemIds,
|
|
@@ -124,16 +127,20 @@ class ClientMonitoredItemToolbox {
|
|
|
124
127
|
(0, node_opcua_assert_1.assert)(session, "expecting a valid session attached to the subscription ");
|
|
125
128
|
session.setMonitoringMode(setMonitoringModeRequest, (err, response) => {
|
|
126
129
|
if (err) {
|
|
127
|
-
|
|
130
|
+
callback(err);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!response) {
|
|
134
|
+
callback(new Error("internal error"));
|
|
135
|
+
return;
|
|
128
136
|
}
|
|
129
137
|
monitoredItems.forEach((monitoredItem) => {
|
|
130
138
|
monitoredItem.internalSetMonitoringMode(monitoringMode);
|
|
131
139
|
});
|
|
132
|
-
response = response;
|
|
133
140
|
response.results = response.results || [];
|
|
134
141
|
callback(null, response.results);
|
|
135
142
|
});
|
|
136
143
|
}
|
|
137
|
-
|
|
138
|
-
exports.ClientMonitoredItemToolbox = ClientMonitoredItemToolbox;
|
|
144
|
+
ClientMonitoredItemToolbox._toolbox_setMonitoringMode = _toolbox_setMonitoringMode;
|
|
145
|
+
})(ClientMonitoredItemToolbox || (exports.ClientMonitoredItemToolbox = ClientMonitoredItemToolbox = {}));
|
|
139
146
|
//# sourceMappingURL=client_monitored_item_toolbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client_monitored_item_toolbox.js","sourceRoot":"","sources":["../source/client_monitored_item_toolbox.ts"],"names":[],"mappings":";;;;;;AAAA;;GAEG;AACH,kDAA0B;AAE1B,yDAA2C;
|
|
1
|
+
{"version":3,"file":"client_monitored_item_toolbox.js","sourceRoot":"","sources":["../source/client_monitored_item_toolbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import type { ClientSessionImpl } from "./private/client_session_impl";
|
|
|
7
7
|
export interface ClientSessionKeepAliveManagerEvents {
|
|
8
8
|
on(event: "keepalive", eventHandler: (lastKnownServerState: ServerState, count: number) => void): this;
|
|
9
9
|
on(event: "failure", eventHandler: () => void): this;
|
|
10
|
+
on(event: "keepalive_failure", eventHandler: () => void): this;
|
|
10
11
|
}
|
|
11
12
|
export declare class ClientSessionKeepAliveManager extends EventEmitter implements ClientSessionKeepAliveManagerEvents {
|
|
12
13
|
private readonly session;
|
|
@@ -14,6 +15,7 @@ export declare class ClientSessionKeepAliveManager extends EventEmitter implemen
|
|
|
14
15
|
private pingTimeout;
|
|
15
16
|
private lastKnownState?;
|
|
16
17
|
private transactionInProgress;
|
|
18
|
+
private consecutiveFailures;
|
|
17
19
|
count: number;
|
|
18
20
|
checkInterval: number;
|
|
19
21
|
constructor(session: ClientSessionImpl);
|
|
@@ -16,16 +16,19 @@ const node_opcua_constants_1 = require("node-opcua-constants");
|
|
|
16
16
|
const node_opcua_debug_1 = require("node-opcua-debug");
|
|
17
17
|
const node_opcua_nodeid_1 = require("node-opcua-nodeid");
|
|
18
18
|
const node_opcua_secure_channel_1 = require("node-opcua-secure-channel");
|
|
19
|
+
const node_opcua_status_code_1 = require("node-opcua-status-code");
|
|
19
20
|
const serverStatusStateNodeId = (0, node_opcua_nodeid_1.coerceNodeId)(node_opcua_constants_1.VariableIds.Server_ServerStatus_State);
|
|
20
21
|
const debugLog = (0, node_opcua_debug_1.make_debugLog)(__filename);
|
|
21
22
|
const doDebug = (0, node_opcua_debug_1.checkDebugFlag)(__filename);
|
|
22
23
|
const warningLog = (0, node_opcua_debug_1.make_warningLog)(__filename);
|
|
24
|
+
const maxBackoffInterval = 60_000;
|
|
23
25
|
class ClientSessionKeepAliveManager extends events_1.EventEmitter {
|
|
24
26
|
session;
|
|
25
27
|
timerId;
|
|
26
28
|
pingTimeout;
|
|
27
29
|
lastKnownState;
|
|
28
30
|
transactionInProgress = false;
|
|
31
|
+
consecutiveFailures = 0;
|
|
29
32
|
count = 0;
|
|
30
33
|
checkInterval;
|
|
31
34
|
constructor(session) {
|
|
@@ -69,7 +72,9 @@ class ClientSessionKeepAliveManager extends events_1.EventEmitter {
|
|
|
69
72
|
return; // stop here
|
|
70
73
|
}
|
|
71
74
|
if (this.timerId) {
|
|
72
|
-
|
|
75
|
+
// When delta exceeds checkInterval it is an explicit backoff requested by _ping_server;
|
|
76
|
+
// otherwise delta is the time already consumed this cycle.
|
|
77
|
+
const timeout = delta > this.checkInterval ? delta : Math.max(1, this.checkInterval - delta);
|
|
73
78
|
this.timerId = setTimeout(() => this.ping_server(), timeout);
|
|
74
79
|
}
|
|
75
80
|
});
|
|
@@ -118,17 +123,39 @@ class ClientSessionKeepAliveManager extends events_1.EventEmitter {
|
|
|
118
123
|
attributeId: node_opcua_basic_types_1.AttributeIds.Value
|
|
119
124
|
}, (err, dataValue) => {
|
|
120
125
|
this.transactionInProgress = false;
|
|
121
|
-
if (err
|
|
122
|
-
|
|
123
|
-
|
|
126
|
+
if (err) {
|
|
127
|
+
warningLog(chalk_1.default.cyan(" warning : ClientSessionKeepAliveManager#ping_server "), chalk_1.default.yellow(err.message));
|
|
128
|
+
const serviceFaultResponse = err.response;
|
|
129
|
+
if (serviceFaultResponse) {
|
|
130
|
+
const sc = serviceFaultResponse.responseHeader?.serviceResult;
|
|
131
|
+
if (sc?.equals(node_opcua_status_code_1.StatusCodes.BadSessionIdInvalid) || sc?.equals(node_opcua_status_code_1.StatusCodes.BadSessionClosed)) {
|
|
132
|
+
this.emit("failure");
|
|
133
|
+
warningLog("Keep alive has failed, considering a network outage is in place, forcing a reconnection");
|
|
134
|
+
terminateConnection(session._client);
|
|
135
|
+
resolve(0);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
this.consecutiveFailures++;
|
|
139
|
+
warningLog("Keep alive received ServiceFault from server (session intact):", sc?.toString());
|
|
140
|
+
this.emit("keepalive_failure");
|
|
141
|
+
resolve(Math.min(this.checkInterval * 2 ** this.consecutiveFailures, maxBackoffInterval));
|
|
142
|
+
}
|
|
124
143
|
}
|
|
144
|
+
else {
|
|
145
|
+
this.emit("failure");
|
|
146
|
+
warningLog("Keep alive has failed, considering a network outage is in place, forcing a reconnection");
|
|
147
|
+
terminateConnection(session._client);
|
|
148
|
+
resolve(0);
|
|
149
|
+
}
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (!dataValue || !dataValue.value) {
|
|
125
153
|
/**
|
|
126
154
|
* @event failure
|
|
127
155
|
* raised when the server is not responding or is responding with en error to
|
|
128
156
|
* the keep alive read Variable value transaction
|
|
129
157
|
*/
|
|
130
158
|
this.emit("failure");
|
|
131
|
-
// also simulate a connection by closing the channel abruptly from our end ...
|
|
132
159
|
warningLog("Keep alive has failed, considering a network outage is in place, forcing a reconnection");
|
|
133
160
|
terminateConnection(session._client);
|
|
134
161
|
resolve(0);
|
|
@@ -143,6 +170,7 @@ class ClientSessionKeepAliveManager extends events_1.EventEmitter {
|
|
|
143
170
|
this.lastKnownState = newState;
|
|
144
171
|
this.count++; // increase successful counter
|
|
145
172
|
}
|
|
173
|
+
this.consecutiveFailures = 0;
|
|
146
174
|
debugLog("emit keepalive");
|
|
147
175
|
this.emit("keepalive", this.lastKnownState, this.count);
|
|
148
176
|
resolve(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client_session_keepalive_manager.js","sourceRoot":"","sources":["../source/client_session_keepalive_manager.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAEH,kDAA0B;AAC1B,mCAAsC;AACtC,yDAA2C;AAC3C,mEAAsD;AACtD,yDAAgD;AAChD,+DAAmD;AAEnD,uDAAkF;AAClF,yDAAiD;AACjD,yEAAqE;
|
|
1
|
+
{"version":3,"file":"client_session_keepalive_manager.js","sourceRoot":"","sources":["../source/client_session_keepalive_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -161,7 +161,7 @@ function __findEndpoint(endpointUrl, params, _callback) {
|
|
|
161
161
|
*/
|
|
162
162
|
async function _verify_serverCertificate(certificateManager, serverCertificate) {
|
|
163
163
|
const status = await certificateManager.checkCertificate(serverCertificate);
|
|
164
|
-
if (status
|
|
164
|
+
if (!status.isGood()) {
|
|
165
165
|
// c8 ignore next
|
|
166
166
|
if (doDebug) {
|
|
167
167
|
// do it again for debug purposes
|
|
@@ -1166,12 +1166,36 @@ class ClientBaseImpl extends node_opcua_common_1.OPCUASecureObject {
|
|
|
1166
1166
|
.catch((err1) => {
|
|
1167
1167
|
warningLog("[NODE-OPCUA-W25] client's server certificate verification has failed ", err1.message);
|
|
1168
1168
|
warningLog(" clientCertificateManager.rootDir = ", this.clientCertificateManager.rootDir);
|
|
1169
|
-
const f = (b) => ` ${b.toString("base64").replace(/(.{80})/g, "$1\n ")}`;
|
|
1170
1169
|
const chain = (0, web_1.split_der)(endpoint.serverCertificate);
|
|
1171
|
-
warningLog(`
|
|
1170
|
+
warningLog(` server certificate chain contains ${chain.length} element(s)`);
|
|
1172
1171
|
for (let i = 0; i < chain.length; i++) {
|
|
1173
1172
|
const c = chain[i];
|
|
1174
|
-
|
|
1173
|
+
const thumbprint = (0, web_1.makeSHA1Thumbprint)(c).toString("hex");
|
|
1174
|
+
try {
|
|
1175
|
+
const { exploreCertificate } = require("node-opcua-crypto");
|
|
1176
|
+
const info = exploreCertificate(c);
|
|
1177
|
+
const tbs = info.tbsCertificate;
|
|
1178
|
+
const cn = tbs.subject?.commonName ?? "unknown";
|
|
1179
|
+
const issuerCN = tbs.issuer?.commonName ?? "unknown";
|
|
1180
|
+
const isCA = tbs.extensions?.basicConstraints?.cA === true;
|
|
1181
|
+
const isSelfSigned = JSON.stringify(tbs.subject) === JSON.stringify(tbs.issuer);
|
|
1182
|
+
const certType = isCA
|
|
1183
|
+
? (isSelfSigned ? "Root CA" : "Intermediate CA")
|
|
1184
|
+
: (isSelfSigned ? "Application (self-signed)" : "Application (CA-signed)");
|
|
1185
|
+
const ski = tbs.extensions?.subjectKeyIdentifier ?? "-";
|
|
1186
|
+
const aki = tbs.extensions?.authorityKeyIdentifier?.keyIdentifier ?? "-";
|
|
1187
|
+
const notBefore = tbs.validity.notBefore.toISOString();
|
|
1188
|
+
const notAfter = tbs.validity.notAfter.toISOString();
|
|
1189
|
+
warningLog(` [${i + 1}/${chain.length}] "${cn}" (${certType})`);
|
|
1190
|
+
warningLog(` thumbprint: ${thumbprint}`);
|
|
1191
|
+
warningLog(` issuer: "${issuerCN}"`);
|
|
1192
|
+
warningLog(` SKI: ${ski}`);
|
|
1193
|
+
warningLog(` AKI: ${aki}`);
|
|
1194
|
+
warningLog(` validity: ${notBefore} → ${notAfter}`);
|
|
1195
|
+
}
|
|
1196
|
+
catch {
|
|
1197
|
+
warningLog(` [${i + 1}/${chain.length}] thumbprint: ${thumbprint} (details unavailable)`);
|
|
1198
|
+
}
|
|
1175
1199
|
}
|
|
1176
1200
|
if (chain.length > 1) {
|
|
1177
1201
|
warningLog(" verify also that the issuer certificate is trusted and the issuer's certificate is present in the issuer.cert folder\n" +
|