node-opcua-client 2.116.0 → 2.118.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 (35) hide show
  1. package/dist/alarms_and_conditions/client_alarm_tools_dump_event.d.ts +2 -2
  2. package/dist/alarms_and_conditions/client_alarm_tools_dump_event.js.map +1 -1
  3. package/dist/alarms_and_conditions/client_alarm_tools_extractConditionFields.d.ts +2 -2
  4. package/dist/alarms_and_conditions/client_alarm_tools_extractConditionFields.js.map +1 -1
  5. package/dist/alarms_and_conditions/client_tools.js +5 -25
  6. package/dist/alarms_and_conditions/client_tools.js.map +1 -1
  7. package/dist/client_utils.d.ts +2 -2
  8. package/dist/client_utils.js +2 -2
  9. package/dist/client_utils.js.map +1 -1
  10. package/dist/private/client_base_impl.js +12 -35
  11. package/dist/private/client_base_impl.js.map +1 -1
  12. package/dist/private/client_publish_engine.js +3 -26
  13. package/dist/private/client_publish_engine.js.map +1 -1
  14. package/dist/private/client_session_impl.js +7 -1
  15. package/dist/private/client_session_impl.js.map +1 -1
  16. package/dist/private/client_subscription_impl.js +4 -27
  17. package/dist/private/client_subscription_impl.js.map +1 -1
  18. package/dist/private/opcua_client_impl.js +2 -25
  19. package/dist/private/opcua_client_impl.js.map +1 -1
  20. package/dist/reconnection.js +31 -29
  21. package/dist/reconnection.js.map +1 -1
  22. package/dist/tools/findservers.js +4 -24
  23. package/dist/tools/findservers.js.map +1 -1
  24. package/package.json +47 -47
  25. package/source/alarms_and_conditions/client_alarm_tools_dump_event.ts +5 -5
  26. package/source/alarms_and_conditions/client_alarm_tools_extractConditionFields.ts +2 -2
  27. package/source/alarms_and_conditions/client_tools.ts +1 -1
  28. package/source/client_utils.ts +8 -5
  29. package/source/private/client_base_impl.ts +3 -3
  30. package/source/private/client_publish_engine.ts +1 -1
  31. package/source/private/client_session_impl.ts +17 -8
  32. package/source/private/client_subscription_impl.ts +5 -5
  33. package/source/private/opcua_client_impl.ts +1 -1
  34. package/source/reconnection.ts +47 -50
  35. package/source/tools/findservers.ts +1 -1
@@ -125,6 +125,8 @@ function _ask_for_subscription_republish(session: ClientSessionImpl, callback: (
125
125
  }
126
126
  doDebug && debugLog(chalk.bgCyan.green.bold("_ask_for_subscription_republish done "), err ? err.message : "OK");
127
127
  if (err) {
128
+ warningLog("republish has failed with error :", err.message);
129
+
128
130
  doDebug && debugLog("_ask_for_subscription_republish has : recreating subscription");
129
131
  return repair_client_session_by_recreating_a_new_session(session._client!, session, callback);
130
132
  }
@@ -190,6 +192,36 @@ function repair_client_session_by_recreating_a_new_session(
190
192
 
191
193
  const listenerCountBefore = session.listenerCount("");
192
194
 
195
+ function recreateSubscription(subscriptionsToRecreate: number[], innerCallback: ErrorCallback) {
196
+ async.forEach(
197
+ subscriptionsToRecreate,
198
+ (subscriptionId: SubscriptionId, next: ErrorCallback) => {
199
+ if (!session.getPublishEngine().hasSubscription(subscriptionId)) {
200
+ doDebug && debugLog(chalk.red(" => CANNOT RECREATE SUBSCRIPTION "), subscriptionId);
201
+ return next();
202
+ }
203
+ const subscription = session.getPublishEngine().getSubscription(subscriptionId);
204
+ assert(subscription.constructor.name === "ClientSubscriptionImpl");
205
+ doDebug && debugLog(chalk.red(" => RECREATING SUBSCRIPTION "), subscriptionId);
206
+ assert(subscription.session === newSession, "must have the session");
207
+
208
+ (subscription as ClientSubscriptionImpl).recreateSubscriptionAndMonitoredItem((err1?: Error) => {
209
+ if (err1) {
210
+ doDebug && debugLog("_recreateSubscription failed !" + err1.message);
211
+ }
212
+
213
+ doDebug &&
214
+ debugLog(chalk.cyan(" => RECREATING SUBSCRIPTION AND MONITORED ITEM DONE "), subscriptionId);
215
+
216
+ next();
217
+ });
218
+ },
219
+ (err1?: Error | null) => {
220
+ innerCallback(err1!);
221
+ }
222
+ );
223
+ }
224
+
193
225
  async.series(
194
226
  [
195
227
  function suspend_old_session_publish_engine(innerCallback: ErrorCallback) {
@@ -278,28 +310,24 @@ function repair_client_session_by_recreating_a_new_session(
278
310
  newSession.transferSubscriptions(
279
311
  subscriptionsToTransfer,
280
312
  (err: Error | null, transferSubscriptionsResponse?: TransferSubscriptionsResponse) => {
281
- if (err) {
282
- warningLog(chalk.bgCyan("Warning TransferSubscription has failed " + err.message));
313
+ if (err || !transferSubscriptionsResponse) {
314
+ warningLog(chalk.bgCyan("Warning TransferSubscription has failed " + err?.message));
283
315
  warningLog(chalk.bgCyan("May be the server is not supporting this feature"));
284
316
  // when transfer subscription has failed, we have no other choice but
285
317
  // recreate the subscriptions on the server side
286
- return innerCallback();
287
- }
288
-
289
- // istanbul ignore next
290
- if (!transferSubscriptionsResponse) {
291
- return innerCallback(new Error("Internal Error"));
318
+ const subscriptionsToRecreate = [...(subscriptionsToTransfer.subscriptionIds || [])];
319
+ warningLog(chalk.bgCyan("We need to recreate entirely the subscription"));
320
+ recreateSubscription(subscriptionsToRecreate, innerCallback);
321
+ return;
292
322
  }
293
323
 
294
324
  const results = transferSubscriptionsResponse.results || [];
295
-
296
325
  // istanbul ignore next
297
326
  if (doDebug) {
298
- doDebug &&
299
- debugLog(
300
- chalk.cyan(" => transfer subscriptions done"),
301
- results.map((x: any) => x.statusCode.toString()).join(" ")
302
- );
327
+ debugLog(
328
+ chalk.cyan(" => transfer subscriptions done"),
329
+ results.map((x: any) => x.statusCode.toString()).join(" ")
330
+ );
303
331
  }
304
332
 
305
333
  const subscriptionsToRecreate = [];
@@ -333,36 +361,7 @@ function repair_client_session_by_recreating_a_new_session(
333
361
  }
334
362
  doDebug && debugLog(" new session subscriptionCount = ", newSession.getPublishEngine().subscriptionCount);
335
363
 
336
- async.forEach(
337
- subscriptionsToRecreate,
338
- (subscriptionId: SubscriptionId, next: ErrorCallback) => {
339
- if (!session.getPublishEngine().hasSubscription(subscriptionId)) {
340
- doDebug && debugLog(chalk.red(" => CANNOT RECREATE SUBSCRIPTION "), subscriptionId);
341
- return next();
342
- }
343
- const subscription = session.getPublishEngine().getSubscription(subscriptionId);
344
- assert(subscription.constructor.name === "ClientSubscriptionImpl");
345
- doDebug && debugLog(chalk.red(" => RECREATING SUBSCRIPTION "), subscriptionId);
346
- assert(subscription.session === newSession, "must have the session");
347
-
348
- (subscription as ClientSubscriptionImpl).recreateSubscriptionAndMonitoredItem((err1?: Error) => {
349
- if (err1) {
350
- doDebug && debugLog("_recreateSubscription failed !" + err1.message);
351
- }
352
-
353
- doDebug &&
354
- debugLog(
355
- chalk.cyan(" => RECREATING SUBSCRIPTION AND MONITORED ITEM DONE "),
356
- subscriptionId
357
- );
358
-
359
- next();
360
- });
361
- },
362
- (err1?: Error | null) => {
363
- innerCallback(err1!);
364
- }
365
- );
364
+ recreateSubscription(subscriptionsToRecreate, innerCallback);
366
365
  }
367
366
  );
368
367
  },
@@ -432,12 +431,11 @@ function _repair_client_session(client: IClientBase, session: ClientSessionImpl,
432
431
  type EmptyCallback = (err?: Error) => void;
433
432
 
434
433
  export function repair_client_session(client: IClientBase, session: ClientSessionImpl, callback: EmptyCallback): void {
435
-
436
434
  if (!client) {
437
435
  doDebug && debugLog("Aborting reactivation of old session because user requested session to be close");
438
436
  return callback();
439
437
  }
440
-
438
+
441
439
  doDebug && debugLog(chalk.yellow("Starting client session repair"));
442
440
 
443
441
  const privateSession = session as any as Reconnectable;
@@ -448,13 +446,12 @@ export function repair_client_session(client: IClientBase, session: ClientSessio
448
446
  privateSession._reconnecting.pendingCallbacks.push(callback);
449
447
  return;
450
448
  }
451
-
449
+
452
450
  privateSession._reconnecting.reconnecting = true;
453
451
 
454
452
  // get old transaction queue ...
455
453
  const transactionQueue = privateSession.pendingTransactions ? privateSession.pendingTransactions.splice(0) : [];
456
454
 
457
-
458
455
  const repeatedAction = (callback: EmptyCallback) => {
459
456
  _repair_client_session(client, session, (err) => {
460
457
  if (err) {
@@ -490,10 +487,10 @@ export function repair_client_session(client: IClientBase, session: ClientSessio
490
487
  privateSession._reconnecting.pendingCallbacks = [];
491
488
 
492
489
  // re-inject element in queue
493
-
490
+
494
491
  // istanbul ignore next
495
492
  doDebug && debugLog(chalk.yellow("re-injecting transaction queue"), transactionQueue.length);
496
-
493
+
497
494
  transactionQueue.forEach((e: any) => privateSession.pendingTransactions.push(e));
498
495
  otherCallbacks.forEach((c: EmptyCallback) => c(err));
499
496
  callback(err);
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @module node-opcua-client
3
3
  */
4
- import * as async from "async";
4
+ import async from "async";
5
5
 
6
6
  import { ErrorCallback } from "node-opcua-status-code";
7
7
  import { ServerOnNetwork } from "node-opcua-service-discovery";