node-opcua-client 2.124.0 → 2.126.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/alarms_and_conditions/client_alarm_tools.js.map +1 -1
- package/dist/alarms_and_conditions/client_tools.js.map +1 -1
- package/dist/client_monitored_item_toolbox.js.map +1 -1
- package/dist/client_session_keepalive_manager.js.map +1 -1
- package/dist/client_utils.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/opcua_client.d.ts +11 -1
- package/dist/opcua_client.js.map +1 -1
- package/dist/private/client_base_impl.js +2 -2
- package/dist/private/client_base_impl.js.map +1 -1
- package/dist/private/client_monitored_item_group_impl.js.map +1 -1
- package/dist/private/client_monitored_item_impl.js.map +1 -1
- package/dist/private/client_publish_engine.js +1 -1
- package/dist/private/client_publish_engine.js.map +1 -1
- package/dist/private/client_session_impl.d.ts +2 -1
- package/dist/private/client_session_impl.js +17 -29
- package/dist/private/client_session_impl.js.map +1 -1
- package/dist/private/client_subscription_impl.js.map +1 -1
- package/dist/private/opcua_client_impl.d.ts +7 -7
- package/dist/private/opcua_client_impl.js +8 -105
- package/dist/private/opcua_client_impl.js.map +1 -1
- package/dist/private/performance.js.map +1 -1
- package/dist/private/reconnection/client_publish_engine_reconnection.js +1 -1
- package/dist/private/reconnection/client_publish_engine_reconnection.js.map +1 -1
- package/dist/private/reconnection/client_reconnection.js.map +1 -1
- package/dist/private/reconnection/client_subscription_reconnection.d.ts +1 -2
- package/dist/private/reconnection/client_subscription_reconnection.js +65 -89
- package/dist/private/reconnection/client_subscription_reconnection.js.map +1 -1
- package/dist/private/reconnection/reconnection.js +4 -11
- package/dist/private/reconnection/reconnection.js.map +1 -1
- package/dist/tools/findservers.js.map +1 -1
- package/dist/tools/read_history_server_capabilities.js.map +1 -1
- package/dist/verify.js.map +1 -1
- package/package.json +43 -43
- package/source/index.ts +4 -1
- package/source/opcua_client.ts +11 -5
- package/source/private/client_session_impl.ts +33 -48
- package/source/private/opcua_client_impl.ts +15 -148
- package/source/private/reconnection/client_publish_engine_reconnection.ts +2 -2
- package/source/private/reconnection/client_subscription_reconnection.ts +80 -103
- package/source/private/reconnection/reconnection.ts +6 -9
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { promisify } from "util";
|
|
2
2
|
import assert from "node-opcua-assert";
|
|
3
3
|
import { TimestampsToReturn } from "node-opcua-data-value";
|
|
4
4
|
import { make_debugLog, checkDebugFlag } from "node-opcua-debug";
|
|
5
5
|
import { warningLog } from "node-opcua-pki";
|
|
6
6
|
import { MonitoredItemCreateRequestOptions, CreateMonitoredItemsRequest, CreateMonitoredItemsResponse } from "node-opcua-types";
|
|
7
|
-
import { ErrorCallback } from "node-opcua-status-code";
|
|
8
7
|
|
|
9
8
|
import {
|
|
10
9
|
IBasicSessionReadAsync,
|
|
@@ -20,128 +19,106 @@ import { _shouldNotContinue } from "./reconnection";
|
|
|
20
19
|
const debugLog = make_debugLog("RECONNECTION");
|
|
21
20
|
const doDebug = checkDebugFlag("RECONNECTION");
|
|
22
21
|
|
|
23
|
-
function createMonitoredItemsAndRespectOperationalLimits(
|
|
22
|
+
async function createMonitoredItemsAndRespectOperationalLimits(
|
|
24
23
|
session: IBasicSessionReadAsync & IBasicSessionWithSubscription,
|
|
25
|
-
createMonitorItemsRequest: CreateMonitoredItemsRequest
|
|
26
|
-
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
.catch(callback);
|
|
24
|
+
createMonitorItemsRequest: CreateMonitoredItemsRequest
|
|
25
|
+
): Promise<CreateMonitoredItemsResponse> {
|
|
26
|
+
const operationalLimits = await readOperationLimits(session);
|
|
27
|
+
const createMonitoredItemResponse = await createMonitoredItemsLimit(
|
|
28
|
+
operationalLimits.maxMonitoredItemsPerCall || 0,
|
|
29
|
+
session,
|
|
30
|
+
createMonitorItemsRequest
|
|
31
|
+
);
|
|
32
|
+
return createMonitoredItemResponse;
|
|
35
33
|
}
|
|
36
34
|
|
|
35
|
+
async function adjustMonitoredItemNodeIds(subscription: ClientSubscription, oldMonitoredItems: any) {
|
|
36
|
+
// to Do
|
|
37
|
+
}
|
|
37
38
|
/**
|
|
38
39
|
* utility function to recreate new subscription
|
|
39
40
|
* @method recreateSubscriptionAndMonitoredItem
|
|
40
41
|
*/
|
|
41
|
-
export function recreateSubscriptionAndMonitoredItem(_subscription: ClientSubscription
|
|
42
|
+
export async function recreateSubscriptionAndMonitoredItem(_subscription: ClientSubscription): Promise<void>
|
|
43
|
+
{
|
|
42
44
|
debugLog("recreateSubscriptionAndMonitoredItem", _subscription.subscriptionId.toString());
|
|
43
45
|
|
|
44
46
|
const subscription = _subscription as ClientSubscriptionImpl;
|
|
45
47
|
if (subscription.subscriptionId === TERMINATED_SUBSCRIPTION_ID) {
|
|
46
48
|
debugLog("Subscription is not in a valid state");
|
|
47
|
-
return
|
|
49
|
+
return;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
const oldMonitoredItems = subscription.monitoredItems;
|
|
51
53
|
const oldSubscriptionId = subscription.subscriptionId;
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
55
|
subscription.publishEngine.unregisterSubscription(oldSubscriptionId);
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
},
|
|
62
|
-
(innerCallback: ErrorCallback) => {
|
|
63
|
-
// prettier-ignore
|
|
64
|
-
{ const _err = _shouldNotContinue(subscription.session); if (_err) { return innerCallback(_err); } }
|
|
57
|
+
await promisify(__create_subscription)(subscription);
|
|
58
|
+
|
|
59
|
+
const _err = _shouldNotContinue(subscription.session);
|
|
60
|
+
if (_err) { throw _err; }
|
|
65
61
|
|
|
66
|
-
|
|
62
|
+
const test = subscription.publishEngine.getSubscription(subscription.subscriptionId);
|
|
67
63
|
|
|
68
|
-
|
|
64
|
+
debugLog("recreating ", Object.keys(oldMonitoredItems).length, " monitored Items");
|
|
69
65
|
// re-create monitored items
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
let _errCount = 0;
|
|
110
|
-
monitoredItemResults.forEach((monitoredItemResult, index) => {
|
|
111
|
-
const itemToCreate = itemsToCreate[index];
|
|
112
|
-
/* istanbul ignore next */
|
|
113
|
-
if (!itemToCreate || !itemToCreate.requestedParameters) {
|
|
114
|
-
_errCount++;
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
const clientHandle = itemToCreate.requestedParameters.clientHandle;
|
|
118
|
-
/* istanbul ignore next */
|
|
119
|
-
if (!clientHandle) {
|
|
120
|
-
_errCount++;
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
const monitoredItem = subscription.monitoredItems[clientHandle] as ClientMonitoredItemImpl;
|
|
124
|
-
if (monitoredItem) {
|
|
125
|
-
monitoredItem._applyResult(monitoredItemResult);
|
|
126
|
-
} else {
|
|
127
|
-
_errCount++;
|
|
128
|
-
warningLog("cannot find monitored item for clientHandle !:", clientHandle);
|
|
129
|
-
warningLog("itemsToCreate = ", itemsToCreate[index].toString());
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
if (_errCount > 0) {
|
|
133
|
-
warningLog("Warning: some monitored items have not been recreated properly");
|
|
134
|
-
}
|
|
135
|
-
innerCallback();
|
|
136
|
-
}
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
],
|
|
140
|
-
(err) => {
|
|
141
|
-
if (err) {
|
|
142
|
-
warningLog("!!recreateSubscriptionAndMonitoredItem has failed", err.message);
|
|
143
|
-
}
|
|
144
|
-
callback(err!);
|
|
66
|
+
const itemsToCreate: MonitoredItemCreateRequestOptions[] = [];
|
|
67
|
+
|
|
68
|
+
await adjustMonitoredItemNodeIds(subscription, oldMonitoredItems);
|
|
69
|
+
|
|
70
|
+
for (const monitoredItem of Object.values(oldMonitoredItems)) {
|
|
71
|
+
assert(monitoredItem.monitoringParameters.clientHandle > 0);
|
|
72
|
+
itemsToCreate.push({
|
|
73
|
+
itemToMonitor: monitoredItem.itemToMonitor,
|
|
74
|
+
monitoringMode: monitoredItem.monitoringMode,
|
|
75
|
+
requestedParameters: monitoredItem.monitoringParameters
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const createMonitorItemsRequest = new CreateMonitoredItemsRequest({
|
|
80
|
+
itemsToCreate,
|
|
81
|
+
subscriptionId: subscription.subscriptionId,
|
|
82
|
+
timestampsToReturn: TimestampsToReturn.Both // this.timestampsToReturn,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const session = subscription.session;
|
|
86
|
+
// istanbul ignore next
|
|
87
|
+
if (!session) {
|
|
88
|
+
throw new Error("no session");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
debugLog("Recreating ", itemsToCreate.length, " monitored items");
|
|
92
|
+
|
|
93
|
+
const response = await createMonitoredItemsAndRespectOperationalLimits(
|
|
94
|
+
session,
|
|
95
|
+
createMonitorItemsRequest);
|
|
96
|
+
const monitoredItemResults = response.results || [];
|
|
97
|
+
|
|
98
|
+
let _errCount = 0;
|
|
99
|
+
monitoredItemResults.forEach((monitoredItemResult, index) => {
|
|
100
|
+
const itemToCreate = itemsToCreate[index];
|
|
101
|
+
/* istanbul ignore next */
|
|
102
|
+
if (!itemToCreate || !itemToCreate.requestedParameters) {
|
|
103
|
+
_errCount++;
|
|
104
|
+
return;
|
|
145
105
|
}
|
|
146
|
-
|
|
106
|
+
const clientHandle = itemToCreate.requestedParameters.clientHandle;
|
|
107
|
+
/* istanbul ignore next */
|
|
108
|
+
if (!clientHandle) {
|
|
109
|
+
_errCount++;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const monitoredItem = subscription.monitoredItems[clientHandle] as ClientMonitoredItemImpl;
|
|
113
|
+
if (monitoredItem) {
|
|
114
|
+
monitoredItem._applyResult(monitoredItemResult);
|
|
115
|
+
} else {
|
|
116
|
+
_errCount++;
|
|
117
|
+
warningLog("cannot find monitored item for clientHandle !:", clientHandle);
|
|
118
|
+
warningLog("itemsToCreate = ", itemsToCreate[index].toString());
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
if (_errCount > 0) {
|
|
122
|
+
warningLog("Warning: some monitored items have not been recreated properly");
|
|
123
|
+
}
|
|
147
124
|
}
|
|
@@ -216,22 +216,19 @@ function repair_client_session_by_recreating_a_new_session(
|
|
|
216
216
|
doDebug && debugLog(chalk.red(" => RECREATING SUBSCRIPTION "), subscriptionId);
|
|
217
217
|
assert(subscription.session === newSession, "must have the new session");
|
|
218
218
|
|
|
219
|
-
recreateSubscriptionAndMonitoredItem(subscription
|
|
220
|
-
// prettier-ignore
|
|
221
|
-
{ const err = _shouldNotContinue(session); if (err) { return next(err); } }
|
|
222
|
-
|
|
223
|
-
if (err1) {
|
|
224
|
-
doDebug && debugLog("_recreateSubscription failed !" + err1.message);
|
|
225
|
-
}
|
|
226
|
-
|
|
219
|
+
recreateSubscriptionAndMonitoredItem(subscription).then(() => {
|
|
227
220
|
doDebug &&
|
|
228
221
|
debugLog(
|
|
229
222
|
chalk.cyan(" => RECREATING SUBSCRIPTION AND MONITORED ITEM DONE subscriptionId="),
|
|
230
223
|
subscriptionId
|
|
231
224
|
);
|
|
225
|
+
next();
|
|
232
226
|
|
|
227
|
+
}).catch((err) => {
|
|
228
|
+
doDebug && debugLog("_recreateSubscription failed !" + (err as Error).message);
|
|
233
229
|
next();
|
|
234
230
|
});
|
|
231
|
+
|
|
235
232
|
},
|
|
236
233
|
(err1?: Error | null) => {
|
|
237
234
|
// prettier-ignore
|
|
@@ -495,7 +492,7 @@ export function repair_client_session(client: IClientBase, session: ClientSessio
|
|
|
495
492
|
|
|
496
493
|
const repeatedAction = (callback: EmptyCallback) => {
|
|
497
494
|
// prettier-ignore
|
|
498
|
-
{
|
|
495
|
+
{ const err = _shouldNotContinue(session); if (err) { return callback(err); } }
|
|
499
496
|
|
|
500
497
|
_repair_client_session(client, session, (err) => {
|
|
501
498
|
// prettier-ignore
|