node-opcua-client 2.168.0 → 2.169.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 (34) hide show
  1. package/dist/client_monitored_item.d.ts +4 -4
  2. package/dist/client_monitored_item.js +6 -5
  3. package/dist/client_monitored_item.js.map +1 -1
  4. package/dist/client_monitored_item_base.d.ts +7 -7
  5. package/dist/client_monitored_item_toolbox.d.ts +5 -5
  6. package/dist/client_monitored_item_toolbox.js +26 -19
  7. package/dist/client_monitored_item_toolbox.js.map +1 -1
  8. package/dist/private/client_base_impl.js +28 -4
  9. package/dist/private/client_base_impl.js.map +1 -1
  10. package/dist/private/client_monitored_item_group_impl.d.ts +7 -6
  11. package/dist/private/client_monitored_item_group_impl.js +6 -8
  12. package/dist/private/client_monitored_item_group_impl.js.map +1 -1
  13. package/dist/private/client_monitored_item_impl.d.ts +10 -9
  14. package/dist/private/client_monitored_item_impl.js +40 -26
  15. package/dist/private/client_monitored_item_impl.js.map +1 -1
  16. package/dist/private/client_session_impl.d.ts +1 -0
  17. package/dist/private/client_session_impl.js +12 -0
  18. package/dist/private/client_session_impl.js.map +1 -1
  19. package/dist/private/client_subscription_impl.d.ts +7 -4
  20. package/dist/private/client_subscription_impl.js +101 -77
  21. package/dist/private/client_subscription_impl.js.map +1 -1
  22. package/dist/private/opcua_client_impl.d.ts +1 -0
  23. package/dist/private/opcua_client_impl.js +11 -0
  24. package/dist/private/opcua_client_impl.js.map +1 -1
  25. package/package.json +42 -42
  26. package/source/client_monitored_item.ts +5 -4
  27. package/source/client_monitored_item_base.ts +13 -8
  28. package/source/client_monitored_item_toolbox.ts +24 -20
  29. package/source/private/client_base_impl.ts +27 -6
  30. package/source/private/client_monitored_item_group_impl.ts +15 -16
  31. package/source/private/client_monitored_item_impl.ts +56 -38
  32. package/source/private/client_session_impl.ts +29 -14
  33. package/source/private/client_subscription_impl.ts +151 -91
  34. package/source/private/opcua_client_impl.ts +13 -0
@@ -3,14 +3,14 @@
3
3
  */
4
4
  // tslint:disable:unified-signatures
5
5
 
6
+ import { EventEmitter } from "node:events";
6
7
  import chalk from "chalk";
7
- import { EventEmitter } from "events";
8
8
 
9
9
  import { assert } from "node-opcua-assert";
10
10
  import { promoteOpaqueStructureInNotificationData } from "node-opcua-client-dynamic-extension-object";
11
11
  import { AttributeIds } from "node-opcua-data-model";
12
12
  import { checkDebugFlag, make_debugLog, make_warningLog } from "node-opcua-debug";
13
- import { resolveNodeId } from "node-opcua-nodeid";
13
+ import { NodeId, resolveNodeId } from "node-opcua-nodeid";
14
14
  import type { ReadValueIdOptions, TimestampsToReturn } from "node-opcua-service-read";
15
15
  import {
16
16
  CreateSubscriptionRequest,
@@ -19,7 +19,6 @@ import {
19
19
  type DeleteMonitoredItemsResponse,
20
20
  type DeleteSubscriptionsResponse,
21
21
  type EventNotificationList,
22
- type ModifySubscriptionRequestOptions,
23
22
  type ModifySubscriptionResponse,
24
23
  MonitoringMode,
25
24
  type MonitoringParametersOptions,
@@ -48,6 +47,10 @@ import { ClientMonitoredItemGroupImpl } from "./client_monitored_item_group_impl
48
47
  import { ClientMonitoredItemImpl } from "./client_monitored_item_impl";
49
48
  import type { ClientSidePublishEngine } from "./client_publish_engine";
50
49
  import type { ClientSessionImpl } from "./client_session_impl";
50
+
51
+ interface ModifySubscriptionOptionsEx extends ModifySubscriptionOptions {
52
+ subscriptionId?: SubscriptionId;
53
+ }
51
54
  import { detectLongOperation } from "./performance";
52
55
 
53
56
  const debugLog = make_debugLog("CLIENT_SUBSCRIPTION");
@@ -121,7 +124,7 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
121
124
  */
122
125
  public get session(): ClientSessionImpl {
123
126
  assert(this.hasSession, "expecting a valid session");
124
- return this.publishEngine.session! as ClientSessionImpl;
127
+ return this.publishEngine.session as ClientSessionImpl;
125
128
  }
126
129
  public get hasSession(): boolean {
127
130
  return !!this.publishEngine?.session;
@@ -243,34 +246,39 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
243
246
  });
244
247
  }
245
248
 
246
- public terminate(...args: any[]): any {
249
+ public terminate(): Promise<void>;
250
+ public terminate(callback: ErrorCallback): void;
251
+ public terminate(callback?: ErrorCallback): Promise<void> | void {
247
252
  debugLog("Terminating client subscription ", this.subscriptionId);
248
- const callback = args[0];
249
- assert(typeof callback === "function", "expecting a callback function");
250
253
 
251
- if (this.subscriptionId === TERMINATED_SUBSCRIPTION_ID || this.subscriptionId === TERMINATING_SUBSCRIPTION_ID) {
254
+ if (
255
+ this.subscriptionId === TERMINATED_SUBSCRIPTION_ID ||
256
+ this.subscriptionId === TERMINATING_SUBSCRIPTION_ID
257
+ ) {
252
258
  // already terminated... just ignore
253
- return callback();
259
+ callback?.();
260
+ return;
254
261
  }
255
262
 
256
- if (isFinite(this.subscriptionId)) {
263
+ if (Number.isFinite(this.subscriptionId)) {
257
264
  const subscriptionId = this.subscriptionId;
258
265
  this.subscriptionId = TERMINATING_SUBSCRIPTION_ID;
259
266
  this.publishEngine.unregisterSubscription(subscriptionId);
260
267
 
261
268
  if (!this.hasSession) {
262
- return this._terminate_step2(callback);
269
+ this._terminate_step2(callback as ErrorCallback);
270
+ return;
263
271
  }
264
272
  const session = this.session;
265
273
  if (!session) {
266
- return callback(new Error("no session"));
274
+ return callback?.(new Error("no session"));
267
275
  }
268
276
  session.deleteSubscriptions(
269
277
  {
270
278
  subscriptionIds: [subscriptionId]
271
279
  },
272
280
  (err: Error | null, response?: DeleteSubscriptionsResponse) => {
273
- if (response && response!.results![0] !== StatusCodes.Good) {
281
+ if (response && response?.results?.[0] !== StatusCodes.Good) {
274
282
  debugLog("warning: deleteSubscription returned ", response.results);
275
283
  }
276
284
  if (err) {
@@ -281,13 +289,13 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
281
289
  */
282
290
  this.emit("internal_error", err);
283
291
  }
284
- this._terminate_step2(callback);
292
+ this._terminate_step2(callback as ErrorCallback);
285
293
  }
286
294
  );
287
295
  } else {
288
296
  debugLog("subscriptionId is not value ", this.subscriptionId);
289
297
  assert(this.subscriptionId === PENDING_SUBSCRIPTION_ID);
290
- this._terminate_step2(callback);
298
+ this._terminate_step2(callback as ErrorCallback);
291
299
  }
292
300
  }
293
301
 
@@ -299,6 +307,11 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
299
307
  return this.#nextClientHandle;
300
308
  }
301
309
 
310
+ public async monitor(
311
+ itemToMonitor: ReadValueIdOptions,
312
+ requestedParameters: MonitoringParametersOptions,
313
+ timestampsToReturn: TimestampsToReturn
314
+ ): Promise<ClientMonitoredItemBase>;
302
315
  public async monitor(
303
316
  itemToMonitor: ReadValueIdOptions,
304
317
  requestedParameters: MonitoringParametersOptions,
@@ -310,18 +323,26 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
310
323
  requestedParameters: MonitoringParametersOptions,
311
324
  timestampsToReturn: TimestampsToReturn,
312
325
  monitoringMode: MonitoringMode,
313
- done: Callback<ClientMonitoredItemBase>
326
+ callback: Callback<ClientMonitoredItemBase>
314
327
  ): void;
315
- public monitor(...args: any[]): any {
316
- const itemToMonitor = args[0] as ReadValueIdOptions;
317
- const requestedParameters = args[1] as MonitoringParametersOptions;
318
- const timestampsToReturn = args[2] as TimestampsToReturn;
319
- const monitoringMode = typeof args[3] === "function" ? MonitoringMode.Reporting : (args[3] as MonitoringMode);
320
- const done = (typeof args[3] === "function" ? args[3] : args[4]) as Callback<ClientMonitoredItemBase>;
321
-
322
- assert(typeof done === "function", "expecting a function here");
328
+ public monitor(
329
+ itemToMonitor: ReadValueIdOptions,
330
+ requestedParameters: MonitoringParametersOptions,
331
+ timestampsToReturn: TimestampsToReturn,
332
+ monitoringMode?: MonitoringMode | Callback<ClientMonitoredItemBase>,
333
+ callback?: Callback<ClientMonitoredItemBase>
334
+ ): Promise<ClientMonitoredItemBase> | undefined {
335
+
336
+ // When called with 3 args via the promise API, thenify
337
+ // injects its callback as the 4th argument (the
338
+ // monitoringMode slot). Detect this and shift.
339
+ if (typeof monitoringMode === "function") {
340
+ callback = monitoringMode as Callback<ClientMonitoredItemBase>;
341
+ monitoringMode = MonitoringMode.Reporting;
342
+ }
343
+ monitoringMode = monitoringMode ?? MonitoringMode.Reporting;
323
344
 
324
- itemToMonitor.nodeId = resolveNodeId(itemToMonitor.nodeId!);
345
+ itemToMonitor.nodeId = resolveNodeId(itemToMonitor.nodeId || NodeId.nullNodeId);
325
346
 
326
347
  const monitoredItem = ClientMonitoredItem_create(
327
348
  this,
@@ -329,13 +350,15 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
329
350
  requestedParameters,
330
351
  timestampsToReturn,
331
352
  monitoringMode,
332
- (err1?: Error | null, monitoredItem2?: ClientMonitoredItem) => {
353
+ (err1?: Error | null, _monitoredItem2?: ClientMonitoredItem) => {
333
354
  if (err1) {
334
- return done && done(err1);
355
+ callback?.(err1);
356
+ return;
335
357
  }
336
- done(err1 || null, monitoredItem);
358
+ callback?.(null, monitoredItem);
337
359
  }
338
360
  );
361
+ return undefined;
339
362
  }
340
363
 
341
364
  public async monitorItems(
@@ -343,35 +366,41 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
343
366
  requestedParameters: MonitoringParametersOptions,
344
367
  timestampsToReturn: TimestampsToReturn
345
368
  ): Promise<ClientMonitoredItemGroup>;
346
-
347
369
  public monitorItems(
348
370
  itemsToMonitor: ReadValueIdOptions[],
349
371
  requestedParameters: MonitoringParametersOptions,
350
372
  timestampsToReturn: TimestampsToReturn,
351
- done: Callback<ClientMonitoredItemGroup>
373
+ callback: Callback<ClientMonitoredItemGroup>
352
374
  ): void;
353
- public monitorItems(...args: any[]): any {
354
- const itemsToMonitor = args[0] as ReadValueIdOptions[];
355
- const requestedParameters = args[1] as MonitoringParametersOptions;
356
- const timestampsToReturn = args[2] as TimestampsToReturn;
357
- const done = args[3] as Callback<ClientMonitoredItemGroup>;
375
+ public monitorItems(
376
+ itemsToMonitor: ReadValueIdOptions[],
377
+ requestedParameters: MonitoringParametersOptions,
378
+ timestampsToReturn: TimestampsToReturn,
379
+ callback?: Callback<ClientMonitoredItemGroup>
380
+ ): Promise<ClientMonitoredItemGroup> | undefined {
358
381
 
359
382
  const monitoredItemGroup = new ClientMonitoredItemGroupImpl(this, itemsToMonitor, requestedParameters, timestampsToReturn);
360
383
 
361
384
  this._wait_for_subscription_to_be_ready((err?: Error) => {
362
385
  if (err) {
363
- return done(err);
386
+ callback?.(err);
387
+ return;
364
388
  }
365
389
  monitoredItemGroup._monitor((err1?: Error) => {
366
390
  if (err1) {
367
- return done && done(err1);
391
+ callback?.(err1);
392
+ return;
368
393
  }
369
- done(err1!, monitoredItemGroup);
394
+ callback?.(null, monitoredItemGroup);
370
395
  });
371
396
  });
397
+ return undefined;
372
398
  }
373
399
 
374
- public _delete_monitored_items(monitoredItems: ClientMonitoredItemBase[], callback: ErrorCallback): void {
400
+ public _delete_monitored_items(
401
+ monitoredItems: ClientMonitoredItemBase[],
402
+ callback: ErrorCallback
403
+ ): void {
375
404
  assert(typeof callback === "function");
376
405
  assert(Array.isArray(monitoredItems));
377
406
 
@@ -383,40 +412,44 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
383
412
  const session = this.session as ClientSessionImpl;
384
413
  session.deleteMonitoredItems(
385
414
  {
386
- monitoredItemIds: monitoredItems.map((monitoredItem) => monitoredItem.monitoredItemId),
415
+ monitoredItemIds: monitoredItems.map((monitoredItem) => monitoredItem.monitoredItemId as number),
387
416
  subscriptionId: this.subscriptionId
388
417
  },
389
- (err: Error | null, response?: DeleteMonitoredItemsResponse) => {
390
- callback(err!);
418
+ (err: Error | null, _response?: DeleteMonitoredItemsResponse) => {
419
+ callback(err || undefined);
391
420
  }
392
421
  );
393
422
  }
394
423
 
395
424
  public async setPublishingMode(publishingEnabled: boolean): Promise<StatusCode>;
396
425
  public setPublishingMode(publishingEnabled: boolean, callback: Callback<StatusCode>): void;
397
- public setPublishingMode(...args: any[]): any {
398
- const publishingEnabled = args[0] as boolean;
399
- const callback = args[1] as Callback<StatusCode>;
400
- assert(typeof callback === "function");
426
+ public setPublishingMode(
427
+ publishingEnabled: boolean, callback?: Callback<StatusCode>
428
+ ): Promise<StatusCode> | undefined {
401
429
 
402
430
  const session = this.session as ClientSessionImpl;
403
431
  if (!session) {
404
- return callback(new Error("no session"));
432
+ callback?.(new Error("no session"));
433
+ return;
405
434
  }
406
435
  const subscriptionId = this.subscriptionId as SubscriptionId;
407
436
  session.setPublishingMode(publishingEnabled, subscriptionId, (err: Error | null, statusCode?: StatusCode) => {
408
437
  if (err) {
409
- return callback(err);
438
+ callback?.(err);
439
+ return;
410
440
  }
411
441
  /* c8 ignore next */
412
442
  if (!statusCode) {
413
- return callback(new Error("Internal Error"));
443
+ callback?.(new Error("Internal Error"));
444
+ return;
414
445
  }
415
446
  if (statusCode.isNotGood()) {
416
- return callback(null, statusCode);
447
+ callback?.(null, statusCode);
448
+ return;
417
449
  }
418
- callback(null, StatusCodes.Good);
450
+ callback?.(null, StatusCodes.Good);
419
451
  });
452
+ return undefined;
420
453
  }
421
454
 
422
455
  /**
@@ -433,23 +466,28 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
433
466
  linksToRemove: ClientMonitoredItemBase[] | null,
434
467
  callback: Callback<SetTriggeringResponse>
435
468
  ): void;
436
- public setTriggering(...args: any[]): any {
437
- const triggeringItem = args[0] as ClientMonitoredItemBase;
438
- const linksToAdd = args[1] as ClientMonitoredItemBase[] | null;
439
- const linksToRemove = args[2] as ClientMonitoredItemBase[] | null;
440
- const callback = args[3] as Callback<SetTriggeringResponse>;
441
- assert(typeof callback === "function");
469
+ public setTriggering(
470
+ triggeringItem: ClientMonitoredItemBase,
471
+ linksToAdd: ClientMonitoredItemBase[] | null,
472
+ linksToRemove: ClientMonitoredItemBase[] | null,
473
+ callback?: Callback<SetTriggeringResponse>
474
+ ): Promise<SetTriggeringResponse> | undefined {
442
475
  const session = this.session as ClientSessionImpl;
443
476
  if (!session) {
444
- return callback(new Error("no session"));
477
+ callback?.(new Error("no session"));
478
+ return;
445
479
  }
446
480
  const subscriptionId = this.subscriptionId;
447
481
 
448
- const triggeringItemId = triggeringItem.monitoredItemId!;
482
+ const triggeringItemId = triggeringItem.monitoredItemId;
483
+ if (!triggeringItemId) {
484
+ callback?.(new Error("triggeringItem has no monitoredItemId"));
485
+ return;
486
+ }
449
487
 
450
488
  const setTriggeringRequest = new SetTriggeringRequest({
451
- linksToAdd: linksToAdd ? linksToAdd.map((i) => i.monitoredItemId!) : null,
452
- linksToRemove: linksToRemove ? linksToRemove.map((i) => i.monitoredItemId!) : null,
489
+ linksToAdd: linksToAdd ? linksToAdd.map((i) => i.monitoredItemId || 0) : null,
490
+ linksToRemove: linksToRemove ? linksToRemove.map((i) => i.monitoredItemId || 0) : null,
453
491
  subscriptionId,
454
492
  triggeringItemId
455
493
  });
@@ -457,31 +495,37 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
457
495
  if (err) {
458
496
  if (response) {
459
497
  // use soft error, no exceptions
460
- return callback(null, response);
498
+ callback?.(null, response);
499
+ return;
461
500
  } else {
462
- return callback(err);
501
+ callback?.(err);
502
+ return;
463
503
  }
464
504
  }
465
505
  // c8 ignore next
466
506
  if (!response) {
467
- return callback(new Error("Internal Error"));
507
+ callback?.(new Error("Internal Error"));
508
+ return;
468
509
  }
469
- callback(null, response);
510
+ callback?.(null, response);
470
511
  });
512
+ return undefined;
471
513
  }
472
514
 
473
515
  // public subscription service
474
516
  public modify(options: ModifySubscriptionOptions, callback: Callback<ModifySubscriptionResult>): void;
475
517
  public modify(options: ModifySubscriptionOptions): Promise<ModifySubscriptionResult>;
476
- public modify(...args: any[]): any {
477
- const modifySubscriptionRequest = args[0] as ModifySubscriptionRequestOptions;
478
- const callback = args[1] as Callback<ModifySubscriptionResult>;
518
+ public modify(
519
+ modifySubscriptionRequest: ModifySubscriptionOptions,
520
+ callback?: Callback<ModifySubscriptionResult>
521
+ ): Promise<ModifySubscriptionResult> | undefined {
479
522
  const session = this.session as ClientSessionImpl;
480
523
  if (!session) {
481
- return callback(new Error("no session"));
524
+ callback?.(new Error("no session"));
525
+ return undefined;
482
526
  }
483
527
 
484
- modifySubscriptionRequest.subscriptionId = this.subscriptionId;
528
+ (modifySubscriptionRequest as ModifySubscriptionOptionsEx).subscriptionId = this.subscriptionId;
485
529
 
486
530
  modifySubscriptionRequest.priority =
487
531
  modifySubscriptionRequest.priority === undefined ? this.priority : modifySubscriptionRequest.priority;
@@ -504,49 +548,66 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
504
548
 
505
549
  session.modifySubscription(modifySubscriptionRequest, (err: Error | null, response?: ModifySubscriptionResponse) => {
506
550
  if (err || !response) {
507
- return callback(err);
551
+ callback?.(err);
552
+ return;
508
553
  }
509
554
  this.publishingInterval = response.revisedPublishingInterval;
510
555
  this.lifetimeCount = response.revisedLifetimeCount;
511
556
  this.maxKeepAliveCount = response.revisedMaxKeepAliveCount;
512
- callback(null, response);
557
+ callback?.(null, response);
513
558
  });
559
+ return undefined;
514
560
  }
515
561
 
516
562
  public getMonitoredItems(): Promise<MonitoredItemData>;
517
563
  public getMonitoredItems(callback: Callback<MonitoredItemData>): void;
518
- public getMonitoredItems(...args: any[]): any {
519
- this.session.getMonitoredItems(this.subscriptionId, args[0]);
564
+ public getMonitoredItems(callback?: Callback<MonitoredItemData>): Promise<MonitoredItemData> | undefined {
565
+ this.session.getMonitoredItems(this.subscriptionId, callback as Callback<MonitoredItemData>);
566
+ return undefined;
567
+ }
568
+
569
+ public toJSON(): Record<string, string | number | boolean> {
570
+ return {
571
+ subscriptionId: this.subscriptionId.toString(),
572
+ publishingInterval: this.publishingInterval,
573
+ lifetimeCount: this.lifetimeCount,
574
+ maxKeepAliveCount: this.maxKeepAliveCount,
575
+ hasTimedOut: this.hasTimedOut
576
+ };
520
577
  }
521
578
 
522
579
  public toString(): string {
523
580
  let str = "";
524
- str += "subscriptionId : " + this.subscriptionId + "\n";
525
- str += "publishingInterval : " + this.publishingInterval + "\n";
526
- str += "lifetimeCount : " + this.lifetimeCount + "\n";
527
- str += "maxKeepAliveCount : " + this.maxKeepAliveCount + "\n";
528
- str += "hasTimedOut : " + this.hasTimedOut + "\n";
581
+ str += `subscriptionId : ${this.subscriptionId}\n`;
582
+ str += `publishingInterval : ${this.publishingInterval}\n`;
583
+ str += `lifetimeCount : ${this.lifetimeCount}\n`;
584
+ str += `maxKeepAliveCount : ${this.maxKeepAliveCount}\n`;
585
+ str += `hasTimedOut : ${this.hasTimedOut}\n`;
529
586
 
530
587
  const timeToLive = this.lifetimeCount * this.publishingInterval;
531
- str += "(maxKeepAliveCount*publishingInterval: " + this.publishingInterval * this.maxKeepAliveCount + " ms)\n";
532
- str += "(maxLifetimeCount*publishingInterval: " + timeToLive + " ms)\n";
588
+ str += `(maxKeepAliveCount*publishingInterval: ${this.publishingInterval * this.maxKeepAliveCount} ms)\n`;
589
+ str += `(maxLifetimeCount*publishingInterval: ${timeToLive} ms)\n`;
533
590
 
534
591
  const lastRequestSentTime = this.publishEngine.lastRequestSentTime;
535
- str += "lastRequestSentTime : " + lastRequestSentTime.toString() + "\n";
592
+ str += `lastRequestSentTime : ${lastRequestSentTime.toString()}\n`;
536
593
  const duration = Date.now() - lastRequestSentTime.getTime();
537
594
  const extra =
538
595
  duration - timeToLive > 0
539
- ? chalk.red(" expired since " + (duration - timeToLive) / 1000 + " seconds")
540
- : chalk.green(" valid for " + -(duration - timeToLive) / 1000 + " seconds");
596
+ ? chalk.red(` expired since ${(duration - timeToLive) / 1000} seconds`)
597
+ : chalk.green(` valid for ${-(duration - timeToLive) / 1000} seconds`);
541
598
 
542
- str += "timeSinceLast PR : " + duration + "ms" + extra + "\n";
543
- str += "has expired : " + (duration > timeToLive) + "\n";
599
+ str += `timeSinceLast PR : ${duration}ms${extra}\n`;
600
+ str += `has expired : ${duration > timeToLive}\n`;
544
601
 
545
- str += "(session timeout : " + this.session.timeout + " ms)\n";
602
+ str += `(session timeout : ${this.session.timeout} ms)\n`;
546
603
 
547
604
  return str;
548
605
  }
549
606
 
607
+ public [Symbol.for("nodejs.util.inspect.custom")](): string {
608
+ return this.toString();
609
+ }
610
+
550
611
  /**
551
612
  * returns the approximated remaining life time of this subscription in milliseconds
552
613
  */
@@ -757,8 +818,7 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
757
818
  if (s(this).$_slowNotifCount > 0 && s(this).$_slowNotifCount % 1000 !== 0) return;
758
819
  s(this).$_slowNotifCount++;
759
820
  warningLog(
760
- `[NODE-OPCUA-W32]}: monitored.item event handler takes too much time : operation duration ${duration} ms [repeated ${
761
- s(this).$_slowNotifCount
821
+ `[NODE-OPCUA-W32]}: monitored.item event handler takes too much time : operation duration ${duration} ms [repeated ${s(this).$_slowNotifCount
762
822
  } times]\n please ensure that your monitoredItem event handler is not blocking the event loop.`
763
823
  );
764
824
  }
@@ -805,7 +865,7 @@ export class ClientSubscriptionImpl extends EventEmitter implements ClientSubscr
805
865
  }
806
866
 
807
867
  public _removeGroup(monitoredItemGroup: ClientMonitoredItemGroup): void {
808
- (monitoredItemGroup as any)._terminate_and_emit();
868
+ (monitoredItemGroup as ClientMonitoredItemGroupImpl)._terminate_and_emit();
809
869
  this.#monitoredItemGroups = this.#monitoredItemGroups.filter((obj) => obj !== monitoredItemGroup);
810
870
  }
811
871
  /**
@@ -879,7 +939,7 @@ export function ClientMonitoredItem_create(
879
939
  // tslint:disable:max-line-length
880
940
  import { withCallback } from "thenify-ex";
881
941
 
882
- const opts = { multiArgs: false };
942
+ const _opts = { multiArgs: false };
883
943
 
884
944
  ClientSubscriptionImpl.prototype.setPublishingMode = withCallback(ClientSubscriptionImpl.prototype.setPublishingMode);
885
945
  ClientSubscriptionImpl.prototype.monitor = withCallback(ClientSubscriptionImpl.prototype.monitor);
@@ -570,6 +570,15 @@ export class OPCUAClientImpl extends ClientBaseImpl<OPCUAClientBaseEvents> {
570
570
  );
571
571
  }
572
572
 
573
+ public toJSON(): Record<string, string | number | boolean | undefined> {
574
+ return {
575
+ endpointUrl: this.endpointUrl,
576
+ serverUri: this.serverUri,
577
+ requestedSessionTimeout: this.requestedSessionTimeout,
578
+ status: this._internalState
579
+ };
580
+ }
581
+
573
582
  public toString(): string {
574
583
  let str = ClientBaseImpl.prototype.toString.call(this);
575
584
  str += ` requestedSessionTimeout....... ${this.requestedSessionTimeout}\n`;
@@ -578,6 +587,10 @@ export class OPCUAClientImpl extends ClientBaseImpl<OPCUAClientBaseEvents> {
578
587
  return str;
579
588
  }
580
589
 
590
+ public [Symbol.for("nodejs.util.inspect.custom")](): string {
591
+ return this.toString();
592
+ }
593
+
581
594
  /**
582
595
  *
583
596
  * @example