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
|
@@ -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
|
|
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(
|
|
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 (
|
|
254
|
+
if (
|
|
255
|
+
this.subscriptionId === TERMINATED_SUBSCRIPTION_ID ||
|
|
256
|
+
this.subscriptionId === TERMINATING_SUBSCRIPTION_ID
|
|
257
|
+
) {
|
|
252
258
|
// already terminated... just ignore
|
|
253
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
326
|
+
callback: Callback<ClientMonitoredItemBase>
|
|
314
327
|
): void;
|
|
315
|
-
public monitor(
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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,
|
|
353
|
+
(err1?: Error | null, _monitoredItem2?: ClientMonitoredItem) => {
|
|
333
354
|
if (err1) {
|
|
334
|
-
|
|
355
|
+
callback?.(err1);
|
|
356
|
+
return;
|
|
335
357
|
}
|
|
336
|
-
|
|
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
|
-
|
|
373
|
+
callback: Callback<ClientMonitoredItemGroup>
|
|
352
374
|
): void;
|
|
353
|
-
public monitorItems(
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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
|
-
|
|
386
|
+
callback?.(err);
|
|
387
|
+
return;
|
|
364
388
|
}
|
|
365
389
|
monitoredItemGroup._monitor((err1?: Error) => {
|
|
366
390
|
if (err1) {
|
|
367
|
-
|
|
391
|
+
callback?.(err1);
|
|
392
|
+
return;
|
|
368
393
|
}
|
|
369
|
-
|
|
394
|
+
callback?.(null, monitoredItemGroup);
|
|
370
395
|
});
|
|
371
396
|
});
|
|
397
|
+
return undefined;
|
|
372
398
|
}
|
|
373
399
|
|
|
374
|
-
public _delete_monitored_items(
|
|
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,
|
|
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(
|
|
398
|
-
|
|
399
|
-
|
|
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
|
-
|
|
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
|
-
|
|
438
|
+
callback?.(err);
|
|
439
|
+
return;
|
|
410
440
|
}
|
|
411
441
|
/* c8 ignore next */
|
|
412
442
|
if (!statusCode) {
|
|
413
|
-
|
|
443
|
+
callback?.(new Error("Internal Error"));
|
|
444
|
+
return;
|
|
414
445
|
}
|
|
415
446
|
if (statusCode.isNotGood()) {
|
|
416
|
-
|
|
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(
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
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
|
-
|
|
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
|
|
452
|
-
linksToRemove: linksToRemove ? linksToRemove.map((i) => i.monitoredItemId
|
|
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
|
-
|
|
498
|
+
callback?.(null, response);
|
|
499
|
+
return;
|
|
461
500
|
} else {
|
|
462
|
-
|
|
501
|
+
callback?.(err);
|
|
502
|
+
return;
|
|
463
503
|
}
|
|
464
504
|
}
|
|
465
505
|
// c8 ignore next
|
|
466
506
|
if (!response) {
|
|
467
|
-
|
|
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(
|
|
477
|
-
|
|
478
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
519
|
-
this.session.getMonitoredItems(this.subscriptionId,
|
|
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 +=
|
|
525
|
-
str +=
|
|
526
|
-
str +=
|
|
527
|
-
str +=
|
|
528
|
-
str +=
|
|
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 +=
|
|
532
|
-
str +=
|
|
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 +=
|
|
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(
|
|
540
|
-
: chalk.green(
|
|
596
|
+
? chalk.red(` expired since ${(duration - timeToLive) / 1000} seconds`)
|
|
597
|
+
: chalk.green(` valid for ${-(duration - timeToLive) / 1000} seconds`);
|
|
541
598
|
|
|
542
|
-
str +=
|
|
543
|
-
str +=
|
|
599
|
+
str += `timeSinceLast PR : ${duration}ms${extra}\n`;
|
|
600
|
+
str += `has expired : ${duration > timeToLive}\n`;
|
|
544
601
|
|
|
545
|
-
str +=
|
|
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
|
|
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
|
|
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
|