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.
Files changed (43) hide show
  1. package/dist/alarms_and_conditions/client_alarm_tools.js.map +1 -1
  2. package/dist/alarms_and_conditions/client_tools.js.map +1 -1
  3. package/dist/client_monitored_item_toolbox.js.map +1 -1
  4. package/dist/client_session_keepalive_manager.js.map +1 -1
  5. package/dist/client_utils.js.map +1 -1
  6. package/dist/index.d.ts +4 -2
  7. package/dist/index.js +7 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/opcua_client.d.ts +11 -1
  10. package/dist/opcua_client.js.map +1 -1
  11. package/dist/private/client_base_impl.js +2 -2
  12. package/dist/private/client_base_impl.js.map +1 -1
  13. package/dist/private/client_monitored_item_group_impl.js.map +1 -1
  14. package/dist/private/client_monitored_item_impl.js.map +1 -1
  15. package/dist/private/client_publish_engine.js +1 -1
  16. package/dist/private/client_publish_engine.js.map +1 -1
  17. package/dist/private/client_session_impl.d.ts +2 -1
  18. package/dist/private/client_session_impl.js +17 -29
  19. package/dist/private/client_session_impl.js.map +1 -1
  20. package/dist/private/client_subscription_impl.js.map +1 -1
  21. package/dist/private/opcua_client_impl.d.ts +7 -7
  22. package/dist/private/opcua_client_impl.js +8 -105
  23. package/dist/private/opcua_client_impl.js.map +1 -1
  24. package/dist/private/performance.js.map +1 -1
  25. package/dist/private/reconnection/client_publish_engine_reconnection.js +1 -1
  26. package/dist/private/reconnection/client_publish_engine_reconnection.js.map +1 -1
  27. package/dist/private/reconnection/client_reconnection.js.map +1 -1
  28. package/dist/private/reconnection/client_subscription_reconnection.d.ts +1 -2
  29. package/dist/private/reconnection/client_subscription_reconnection.js +65 -89
  30. package/dist/private/reconnection/client_subscription_reconnection.js.map +1 -1
  31. package/dist/private/reconnection/reconnection.js +4 -11
  32. package/dist/private/reconnection/reconnection.js.map +1 -1
  33. package/dist/tools/findservers.js.map +1 -1
  34. package/dist/tools/read_history_server_capabilities.js.map +1 -1
  35. package/dist/verify.js.map +1 -1
  36. package/package.json +43 -43
  37. package/source/index.ts +4 -1
  38. package/source/opcua_client.ts +11 -5
  39. package/source/private/client_session_impl.ts +33 -48
  40. package/source/private/opcua_client_impl.ts +15 -148
  41. package/source/private/reconnection/client_publish_engine_reconnection.ts +2 -2
  42. package/source/private/reconnection/client_subscription_reconnection.ts +80 -103
  43. package/source/private/reconnection/reconnection.ts +6 -9
@@ -1,10 +1,9 @@
1
- import async from "async";
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
- callback: (err: Error | null, response?: CreateMonitoredItemsResponse) => void
27
- ) {
28
- readOperationLimits(session)
29
- .then((operationalLimits) => {
30
- createMonitoredItemsLimit(operationalLimits.maxMonitoredItemsPerCall || 0, session, createMonitorItemsRequest)
31
- .then((createMonitoredItemResponse) => callback(null, createMonitoredItemResponse))
32
- .catch(callback);
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, callback: ErrorCallback): void {
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 callback();
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
- async.series(
58
- [
59
- (innerCallback: ErrorCallback) => {
60
- __create_subscription(subscription, innerCallback);
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
- const test = subscription.publishEngine.getSubscription(subscription.subscriptionId);
62
+ const test = subscription.publishEngine.getSubscription(subscription.subscriptionId);
67
63
 
68
- debugLog("recreating ", Object.keys(oldMonitoredItems).length, " monitored Items");
64
+ debugLog("recreating ", Object.keys(oldMonitoredItems).length, " monitored Items");
69
65
  // re-create monitored items
70
- const itemsToCreate: MonitoredItemCreateRequestOptions[] = [];
71
-
72
- for (const monitoredItem of Object.values(oldMonitoredItems)) {
73
- assert(monitoredItem.monitoringParameters.clientHandle > 0);
74
- itemsToCreate.push({
75
- itemToMonitor: monitoredItem.itemToMonitor,
76
- monitoringMode: monitoredItem.monitoringMode,
77
- requestedParameters: monitoredItem.monitoringParameters
78
- });
79
- }
80
-
81
- const createMonitorItemsRequest = new CreateMonitoredItemsRequest({
82
- itemsToCreate,
83
- subscriptionId: subscription.subscriptionId,
84
- timestampsToReturn: TimestampsToReturn.Both // this.timestampsToReturn,
85
- });
86
-
87
- const session = subscription.session;
88
- // istanbul ignore next
89
- if (!session) {
90
- return innerCallback(new Error("no session"));
91
- }
92
-
93
- debugLog("Recreating ", itemsToCreate.length, " monitored items");
94
-
95
- createMonitoredItemsAndRespectOperationalLimits(
96
- session,
97
- createMonitorItemsRequest,
98
- (err: Error | null, response?: CreateMonitoredItemsResponse) => {
99
- if (err) {
100
- debugLog("Recreating monitored item has failed with ", err.message);
101
- return innerCallback(err);
102
- }
103
- /* istanbul ignore next */
104
- if (!response) {
105
- return innerCallback(new Error("Internal Error"));
106
- }
107
- const monitoredItemResults = response.results || [];
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, (err1?: Error) => {
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
- { const err = _shouldNotContinue(session); if (err) { return callback(err); }}
495
+ { const err = _shouldNotContinue(session); if (err) { return callback(err); } }
499
496
 
500
497
  _repair_client_session(client, session, (err) => {
501
498
  // prettier-ignore