node-opcua-client 2.98.0 → 2.98.2

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 (106) hide show
  1. package/dist/alarms_and_conditions/client_alarm.d.ts +49 -0
  2. package/dist/alarms_and_conditions/client_alarm.js +110 -0
  3. package/dist/alarms_and_conditions/client_alarm.js.map +1 -0
  4. package/dist/alarms_and_conditions/client_alarm_list.d.ts +25 -0
  5. package/dist/alarms_and_conditions/client_alarm_list.js +98 -0
  6. package/dist/alarms_and_conditions/client_alarm_list.js.map +1 -0
  7. package/dist/alarms_and_conditions/client_alarm_tools.d.ts +4 -0
  8. package/dist/alarms_and_conditions/client_alarm_tools.js +157 -0
  9. package/dist/alarms_and_conditions/client_alarm_tools.js.map +1 -0
  10. package/dist/alarms_and_conditions/client_alarm_tools_acknowledge_all_conditions.d.ts +18 -0
  11. package/dist/alarms_and_conditions/client_alarm_tools_acknowledge_all_conditions.js +193 -0
  12. package/dist/alarms_and_conditions/client_alarm_tools_acknowledge_all_conditions.js.map +1 -0
  13. package/dist/alarms_and_conditions/client_alarm_tools_dump_event.d.ts +9 -0
  14. package/dist/alarms_and_conditions/client_alarm_tools_dump_event.js +73 -0
  15. package/dist/alarms_and_conditions/client_alarm_tools_dump_event.js.map +1 -0
  16. package/dist/alarms_and_conditions/client_alarm_tools_extractConditionFields.d.ts +3 -0
  17. package/dist/alarms_and_conditions/client_alarm_tools_extractConditionFields.js +119 -0
  18. package/dist/alarms_and_conditions/client_alarm_tools_extractConditionFields.js.map +1 -0
  19. package/dist/alarms_and_conditions/client_tools.d.ts +7 -0
  20. package/dist/alarms_and_conditions/client_tools.js +180 -0
  21. package/dist/alarms_and_conditions/client_tools.js.map +1 -0
  22. package/dist/client_base.d.ts +277 -0
  23. package/dist/client_base.js +15 -0
  24. package/dist/client_base.js.map +1 -0
  25. package/dist/client_monitored_item.d.ts +21 -0
  26. package/dist/client_monitored_item.js +12 -0
  27. package/dist/client_monitored_item.js.map +1 -0
  28. package/dist/client_monitored_item_base.d.ts +39 -0
  29. package/dist/client_monitored_item_base.js +3 -0
  30. package/dist/client_monitored_item_base.js.map +1 -0
  31. package/dist/client_monitored_item_group.d.ts +21 -0
  32. package/dist/client_monitored_item_group.js +14 -0
  33. package/dist/client_monitored_item_group.js.map +1 -0
  34. package/dist/client_monitored_item_toolbox.d.ts +15 -0
  35. package/dist/client_monitored_item_toolbox.js +117 -0
  36. package/dist/client_monitored_item_toolbox.js.map +1 -0
  37. package/dist/client_session.d.ts +529 -0
  38. package/dist/client_session.js +11 -0
  39. package/dist/client_session.js.map +1 -0
  40. package/dist/client_session_keepalive_manager.d.ts +34 -0
  41. package/dist/client_session_keepalive_manager.js +150 -0
  42. package/dist/client_session_keepalive_manager.js.map +1 -0
  43. package/dist/client_subscription.d.ts +241 -0
  44. package/dist/client_subscription.js +15 -0
  45. package/dist/client_subscription.js.map +1 -0
  46. package/dist/client_utils.d.ts +22 -0
  47. package/dist/client_utils.js +88 -0
  48. package/dist/client_utils.js.map +1 -0
  49. package/dist/common.d.ts +17 -0
  50. package/dist/common.js +6 -0
  51. package/dist/common.js.map +1 -0
  52. package/dist/index.d.ts +56 -0
  53. package/dist/index.js +95 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/opcua_client.d.ts +118 -0
  56. package/dist/opcua_client.js +34 -0
  57. package/dist/opcua_client.js.map +1 -0
  58. package/dist/private/client_base_impl.d.ts +160 -0
  59. package/dist/private/client_base_impl.js +1349 -0
  60. package/dist/private/client_base_impl.js.map +1 -0
  61. package/dist/private/client_monitored_item_base_impl.d.ts +3 -0
  62. package/dist/private/client_monitored_item_base_impl.js +5 -0
  63. package/dist/private/client_monitored_item_base_impl.js.map +1 -0
  64. package/dist/private/client_monitored_item_group_impl.d.ts +53 -0
  65. package/dist/private/client_monitored_item_group_impl.js +162 -0
  66. package/dist/private/client_monitored_item_group_impl.js.map +1 -0
  67. package/dist/private/client_monitored_item_impl.d.ts +93 -0
  68. package/dist/private/client_monitored_item_impl.js +305 -0
  69. package/dist/private/client_monitored_item_impl.js.map +1 -0
  70. package/dist/private/client_publish_engine.d.ts +62 -0
  71. package/dist/private/client_publish_engine.js +409 -0
  72. package/dist/private/client_publish_engine.js.map +1 -0
  73. package/dist/private/client_session_impl.d.ts +631 -0
  74. package/dist/private/client_session_impl.js +1349 -0
  75. package/dist/private/client_session_impl.js.map +1 -0
  76. package/dist/private/client_subscription_impl.d.ts +93 -0
  77. package/dist/private/client_subscription_impl.js +780 -0
  78. package/dist/private/client_subscription_impl.js.map +1 -0
  79. package/dist/private/i_private_client.d.ts +21 -0
  80. package/dist/private/i_private_client.js +3 -0
  81. package/dist/private/i_private_client.js.map +1 -0
  82. package/dist/private/opcua_client_impl.d.ts +166 -0
  83. package/dist/private/opcua_client_impl.js +1001 -0
  84. package/dist/private/opcua_client_impl.js.map +1 -0
  85. package/dist/private/performance.d.ts +1 -0
  86. package/dist/private/performance.js +19 -0
  87. package/dist/private/performance.js.map +1 -0
  88. package/dist/reconnection.d.ts +9 -0
  89. package/dist/reconnection.js +382 -0
  90. package/dist/reconnection.js.map +1 -0
  91. package/dist/tools/findservers.d.ts +20 -0
  92. package/dist/tools/findservers.js +62 -0
  93. package/dist/tools/findservers.js.map +1 -0
  94. package/dist/tools/read_history_server_capabilities.d.ts +6 -0
  95. package/dist/tools/read_history_server_capabilities.js +99 -0
  96. package/dist/tools/read_history_server_capabilities.js.map +1 -0
  97. package/dist/user_identity_info.d.ts +1 -0
  98. package/dist/user_identity_info.js +3 -0
  99. package/dist/user_identity_info.js.map +1 -0
  100. package/dist/verify.d.ts +5 -0
  101. package/dist/verify.js +135 -0
  102. package/dist/verify.js.map +1 -0
  103. package/package.json +48 -44
  104. package/.nycrc.json +0 -14
  105. package/test_helpers/create_certificates.js +0 -1
  106. package/typedoc.js +0 -20
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientSidePublishEngine = void 0;
4
+ /**
5
+ * @module node-opcua-client-private
6
+ */
7
+ const async = require("async");
8
+ const chalk = require("chalk");
9
+ const node_opcua_assert_1 = require("node-opcua-assert");
10
+ const node_opcua_debug_1 = require("node-opcua-debug");
11
+ const node_opcua_service_subscription_1 = require("node-opcua-service-subscription");
12
+ const node_opcua_status_code_1 = require("node-opcua-status-code");
13
+ const debugLog = (0, node_opcua_debug_1.make_debugLog)(__filename);
14
+ const doDebug = (0, node_opcua_debug_1.checkDebugFlag)(__filename);
15
+ const warningLog = (0, node_opcua_debug_1.make_warningLog)(__filename);
16
+ /**
17
+ * A client side implementation to deal with publish service.
18
+ *
19
+ * @class ClientSidePublishEngine
20
+ * The ClientSidePublishEngine encapsulates the mechanism to
21
+ * deal with a OPCUA Server and constantly sending PublishRequest
22
+ * The ClientSidePublishEngine also performs notification acknowledgements.
23
+ * Finally, ClientSidePublishEngine dispatch PublishResponse to the correct
24
+ * Subscription id callback
25
+ *
26
+ * @param session {ClientSession} - the client session
27
+ *
28
+ *
29
+ * @constructor
30
+ */
31
+ class ClientSidePublishEngine {
32
+ constructor(session) {
33
+ this.session = session;
34
+ this.subscriptionAcknowledgements = [];
35
+ this.subscriptionMap = {};
36
+ this.timeoutHint = 10000; // 10 s by default
37
+ this.activeSubscriptionCount = 0;
38
+ // number of pending Publish request sent to the server and awaited for being processed by the server
39
+ this.nbPendingPublishRequests = 0;
40
+ // the maximum number of publish requests we think that the server can queue.
41
+ // we will adjust this value .
42
+ this.nbMaxPublishRequestsAcceptedByServer = 1000;
43
+ this.isSuspended = false;
44
+ (0, node_opcua_assert_1.assert)(this.session, "Session must exist");
45
+ }
46
+ /**
47
+ * the number of active subscriptions managed by this publish engine.
48
+ * @property subscriptionCount
49
+ * @type {Number}
50
+ */
51
+ get subscriptionCount() {
52
+ return Object.keys(this.subscriptionMap).length;
53
+ }
54
+ suspend(suspendedState) {
55
+ if (this.isSuspended === suspendedState) {
56
+ // nothing to do ...
57
+ return;
58
+ }
59
+ this.isSuspended = suspendedState;
60
+ if (!this.isSuspended) {
61
+ this.replenish_publish_request_queue();
62
+ }
63
+ }
64
+ acknowledge_notification(subscriptionId, sequenceNumber) {
65
+ this.subscriptionAcknowledgements.push({ subscriptionId, sequenceNumber });
66
+ }
67
+ cleanup_acknowledgment_for_subscription(subscriptionId) {
68
+ this.subscriptionAcknowledgements = this.subscriptionAcknowledgements.filter((a) => a.subscriptionId !== subscriptionId);
69
+ }
70
+ /**
71
+ * @method send_publish_request
72
+ */
73
+ send_publish_request() {
74
+ if (this.isSuspended) {
75
+ return;
76
+ }
77
+ if (this.nbPendingPublishRequests >= this.nbMaxPublishRequestsAcceptedByServer) {
78
+ return;
79
+ }
80
+ const session = this.session;
81
+ if (session && !session.isChannelValid()) {
82
+ // wait for channel to be valid
83
+ setTimeout(() => {
84
+ if (this.subscriptionCount) {
85
+ this.send_publish_request();
86
+ }
87
+ }, 100);
88
+ }
89
+ else {
90
+ setImmediate(() => {
91
+ if (!this.session || this.isSuspended) {
92
+ // session has been terminated or suspended
93
+ return;
94
+ }
95
+ this.internalSendPublishRequest();
96
+ });
97
+ }
98
+ }
99
+ terminate() {
100
+ debugLog("Terminated ClientPublishEngine ");
101
+ this.session = null;
102
+ }
103
+ registerSubscription(subscription) {
104
+ debugLog("ClientSidePublishEngine#registerSubscription ", subscription.subscriptionId);
105
+ const _subscription = subscription;
106
+ (0, node_opcua_assert_1.assert)(arguments.length === 1);
107
+ (0, node_opcua_assert_1.assert)(isFinite(subscription.subscriptionId));
108
+ (0, node_opcua_assert_1.assert)(!Object.prototype.hasOwnProperty.call(this.subscriptionMap, subscription.subscriptionId)); // already registered ?
109
+ (0, node_opcua_assert_1.assert)(typeof _subscription.onNotificationMessage === "function");
110
+ (0, node_opcua_assert_1.assert)(isFinite(subscription.timeoutHint));
111
+ this.activeSubscriptionCount += 1;
112
+ this.subscriptionMap[subscription.subscriptionId] = _subscription;
113
+ this.timeoutHint = Math.min(Math.max(this.timeoutHint, subscription.timeoutHint), 0x7ffffff);
114
+ debugLog(" setting timeoutHint = ", this.timeoutHint, subscription.timeoutHint);
115
+ this.replenish_publish_request_queue();
116
+ }
117
+ replenish_publish_request_queue() {
118
+ // Spec 1.03 part 4 5.13.5 Publish
119
+ // [..] in high latency networks, the Client may wish to pipeline Publish requests
120
+ // to ensure cyclic reporting from the Server. Pipe-lining involves sending more than one Publish
121
+ // request for each Subscription before receiving a response. For example, if the network introduces a
122
+ // delay between the Client and the Server of 5 seconds and the publishing interval for a Subscription
123
+ // is one second, then the Client will have to issue Publish requests every second instead of waiting for
124
+ // a response to be received before sending the next request.
125
+ this.send_publish_request();
126
+ // send more than one publish request to server to cope with latency
127
+ for (let i = 0; i < ClientSidePublishEngine.publishRequestCountInPipeline - 1; i++) {
128
+ this.send_publish_request();
129
+ }
130
+ }
131
+ /**
132
+ * @method unregisterSubscription
133
+ *
134
+ * @param subscriptionId
135
+ */
136
+ unregisterSubscription(subscriptionId) {
137
+ debugLog("ClientSidePublishEngine#unregisterSubscription ", subscriptionId);
138
+ (0, node_opcua_assert_1.assert)(isFinite(subscriptionId) && subscriptionId > 0);
139
+ this.activeSubscriptionCount -= 1;
140
+ // note : it is possible that we get here while the server has already requested
141
+ // a session shutdown ... in this case it is possible that subscriptionId is already
142
+ // removed
143
+ if (Object.prototype.hasOwnProperty.call(this.subscriptionMap, subscriptionId)) {
144
+ delete this.subscriptionMap[subscriptionId];
145
+ }
146
+ else {
147
+ debugLog("ClientSidePublishEngine#unregisterSubscription cannot find subscription ", subscriptionId);
148
+ }
149
+ }
150
+ getSubscriptionIds() {
151
+ return Object.keys(this.subscriptionMap).map((a) => parseInt(a, 10));
152
+ }
153
+ /***
154
+ * get the client subscription from Id
155
+ */
156
+ getSubscription(subscriptionId) {
157
+ (0, node_opcua_assert_1.assert)(isFinite(subscriptionId) && subscriptionId > 0);
158
+ (0, node_opcua_assert_1.assert)(Object.prototype.hasOwnProperty.call(this.subscriptionMap, subscriptionId));
159
+ return this.subscriptionMap[subscriptionId];
160
+ }
161
+ hasSubscription(subscriptionId) {
162
+ (0, node_opcua_assert_1.assert)(isFinite(subscriptionId) && subscriptionId > 0);
163
+ return Object.prototype.hasOwnProperty.call(this.subscriptionMap, subscriptionId);
164
+ }
165
+ republish(callback) {
166
+ // After re-establishing the connection the Client shall call Republish in a loop, starting with
167
+ // the next expected sequence number and incrementing the sequence number until the Server returns
168
+ // the status BadMessageNotAvailable.
169
+ // After receiving this status, the Client shall start sending Publish requests with the normal Publish
170
+ // handling.
171
+ // This sequence ensures that the lost NotificationMessages queued in the Server are not overwritten
172
+ // by newPublish responses
173
+ /**
174
+ * call Republish continuously until all Notification messages of
175
+ * un-acknowledged notifications are reprocessed.
176
+ * @private
177
+ */
178
+ const repairSubscription = (subscription, subscriptionId, innerCallback) => {
179
+ subscriptionId = parseInt(subscriptionId, 10);
180
+ this.__repairSubscription(subscription, subscriptionId, innerCallback);
181
+ };
182
+ async.forEachOf(this.subscriptionMap, repairSubscription, callback);
183
+ }
184
+ internalSendPublishRequest() {
185
+ (0, node_opcua_assert_1.assert)(this.session, "ClientSidePublishEngine terminated ?");
186
+ this.nbPendingPublishRequests += 1;
187
+ debugLog(chalk.yellow("sending publish request "), this.nbPendingPublishRequests);
188
+ const subscriptionAcknowledgements = this.subscriptionAcknowledgements;
189
+ this.subscriptionAcknowledgements = [];
190
+ // as started in the spec (Spec 1.02 part 4 page 81 5.13.2.2 Function DequeuePublishReq())
191
+ // the server will dequeue the PublishRequest in first-in first-out order
192
+ // and will validate if the publish request is still valid by checking the timeoutHint in the RequestHeader.
193
+ // If the request timed out, the server will send a BadTimeout service result for the request and de-queue
194
+ // another publish request.
195
+ //
196
+ // in Part 4. page 144 Request Header the timeoutHint is described this way.
197
+ // timeoutHint UInt32 This timeout in milliseconds is used in the Client side Communication Stack to
198
+ // set the timeout on a per-call base.
199
+ // For a Server this timeout is only a hint and can be used to cancel long running
200
+ // operations to free resources. If the Server detects a timeout, he can cancel the
201
+ // operation by sending the Service result BadTimeout. The Server should wait
202
+ // at minimum the timeout after he received the request before cancelling the operation.
203
+ // The value of 0 indicates no timeout.
204
+ // In issue#40 (MonitoredItem on changed not fired), we have found that some server might wrongly interpret
205
+ // the timeoutHint of the request header ( and will bang a BadTimeout regardless if client send timeoutHint=0)
206
+ // as a work around here , we force the timeoutHint to be set to a suitable value.
207
+ //
208
+ // see https://github.com/node-opcua/node-opcua/issues/141
209
+ // This suitable value shall be at least the time between two keep alive signal that the server will send.
210
+ // (i.e revisedLifetimeCount * revisedPublishingInterval)
211
+ // also ( part 3 - Release 1.03 page 140)
212
+ // The Server shall check the timeoutHint parameter of a PublishRequest before processing a PublishResponse.
213
+ // If the request timed out, a BadTimeout Service result is sent and another PublishRequest is used.
214
+ // The value of 0 indicates no timeout
215
+ // in our case:
216
+ (0, node_opcua_assert_1.assert)(this.nbPendingPublishRequests > 0);
217
+ const calculatedTimeout = Math.min(0x7FFFFFFF, this.nbPendingPublishRequests * this.timeoutHint);
218
+ const publishRequest = new node_opcua_service_subscription_1.PublishRequest({
219
+ requestHeader: { timeoutHint: calculatedTimeout },
220
+ subscriptionAcknowledgements
221
+ });
222
+ let active = true;
223
+ const session = this.session;
224
+ session.publish(publishRequest, (err, response) => {
225
+ this.nbPendingPublishRequests -= 1;
226
+ if (err) {
227
+ debugLog(chalk.cyan("ClientSidePublishEngine.prototype.internalSendPublishRequest callback : "), chalk.yellow(err.message));
228
+ debugLog("'" + err.message + "'");
229
+ if (err.message.match("not connected")) {
230
+ debugLog(chalk.bgWhite.red(" WARNING : CLIENT IS NOT CONNECTED :" + " MAY BE RECONNECTION IS IN PROGRESS"));
231
+ debugLog("this.activeSubscriptionCount =", this.activeSubscriptionCount);
232
+ // the previous publish request has ended up with an error because
233
+ // the connection has failed ...
234
+ // There is no need to send more publish request for the time being until reconnection is completed
235
+ active = false;
236
+ }
237
+ // istanbul ignore next
238
+ if (err.message.match(/BadNoSubscription/) && this.activeSubscriptionCount >= 1) {
239
+ // there is something wrong happening here.
240
+ // the server tells us that there is no subscription for this session
241
+ // but the client have some active subscription left.
242
+ // This could happen if the client has missed or not received the StatusChange Notification
243
+ debugLog(chalk.bgWhite.red(" WARNING : SERVER TELLS THAT IT HAS NO SUBSCRIPTION , " + "BUT CLIENT DISAGREE"));
244
+ debugLog("this.activeSubscriptionCount =", this.activeSubscriptionCount);
245
+ active = false;
246
+ }
247
+ if (err.message.match(/BadSessionClosed|BadSessionIdInvalid/)) {
248
+ //
249
+ // server has closed the session ....
250
+ // may be the session timeout is shorted than the subscription life time
251
+ // and the client does not send intermediate keepAlive request to keep the connection working.
252
+ //
253
+ debugLog(chalk.bgWhite.red(" WARNING : SERVER TELLS THAT THE SESSION HAS CLOSED ..."));
254
+ debugLog(" the ClientSidePublishEngine shall now be disabled," + " as server will reject any further request");
255
+ // close all active subscription....
256
+ active = false;
257
+ }
258
+ if (err.message.match(/BadTooManyPublishRequests/)) {
259
+ // preventing queue overflow
260
+ // -------------------------
261
+ // if the client send too many publish requests that the server can queue, the server returns
262
+ // a Service result of BadTooManyPublishRequests.
263
+ //
264
+ // let adjust the nbMaxPublishRequestsAcceptedByServer value so we never overflow the server
265
+ // with extraneous publish requests in the future.
266
+ //
267
+ this.nbMaxPublishRequestsAcceptedByServer = Math.min(this.nbPendingPublishRequests, this.nbMaxPublishRequestsAcceptedByServer);
268
+ active = false;
269
+ warningLog(chalk.bgWhite.red(" WARNING : SERVER TELLS THAT TOO MANY" + " PUBLISH REQUEST HAS BEEN SEND ..."));
270
+ warningLog(" On our side nbPendingPublishRequests = ", this.nbPendingPublishRequests);
271
+ warningLog(" => nbMaxPublishRequestsAcceptedByServer =", this.nbMaxPublishRequestsAcceptedByServer);
272
+ }
273
+ }
274
+ else {
275
+ if (doDebug) {
276
+ debugLog(chalk.cyan("ClientSidePublishEngine.prototype.internalSendPublishRequest callback "));
277
+ }
278
+ this._receive_publish_response(response);
279
+ }
280
+ // feed the server with a new publish Request to the server
281
+ if (!this.isSuspended && active && this.activeSubscriptionCount > 0) {
282
+ if (err && err.message.match(/Connection Break/)) {
283
+ // do not renew when connection is broken
284
+ }
285
+ else {
286
+ this.send_publish_request();
287
+ }
288
+ }
289
+ });
290
+ }
291
+ _receive_publish_response(response) {
292
+ debugLog(chalk.yellow("receive publish response"));
293
+ // the id of the subscription sending the notification message
294
+ const subscriptionId = response.subscriptionId;
295
+ // the sequence numbers available in this subscription
296
+ // for retransmission and not acknowledged by the client
297
+ // -- var available_seq = response.availableSequenceNumbers;
298
+ // has the server more notification for us ?
299
+ // -- var moreNotifications = response.moreNotifications;
300
+ const notificationMessage = response.notificationMessage;
301
+ // notificationMessage.sequenceNumber
302
+ // notificationMessage.publishTime
303
+ // notificationMessage.notificationData[]
304
+ notificationMessage.notificationData = notificationMessage.notificationData || [];
305
+ if (notificationMessage.notificationData.length !== 0) {
306
+ this.acknowledge_notification(subscriptionId, notificationMessage.sequenceNumber);
307
+ }
308
+ // else {
309
+ // this is a keep-alive notification
310
+ // in this case , we shall not acknowledge notificationMessage.sequenceNumber
311
+ // which is only an information of what will be the future sequenceNumber.
312
+ // }
313
+ const subscription = this.subscriptionMap[subscriptionId];
314
+ if (subscription && this.session !== null) {
315
+ try {
316
+ // delegate notificationData to the subscription callback
317
+ subscription.onNotificationMessage(notificationMessage);
318
+ }
319
+ catch (err) {
320
+ if (doDebug) {
321
+ debugLog(err);
322
+ debugLog("Exception in onNotificationMessage");
323
+ }
324
+ }
325
+ }
326
+ else {
327
+ debugLog(" ignoring notificationMessage", notificationMessage, " for subscription", subscriptionId);
328
+ debugLog(" because there is no subscription.");
329
+ debugLog(" or because there is no session for the subscription (session terminated ?).");
330
+ }
331
+ }
332
+ _republish(subscription, subscriptionId, callback) {
333
+ (0, node_opcua_assert_1.assert)(subscription.subscriptionId === +subscriptionId);
334
+ let isDone = false;
335
+ const session = this.session;
336
+ const sendRepublishFunc = (callback2) => {
337
+ (0, node_opcua_assert_1.assert)(isFinite(subscription.lastSequenceNumber) && subscription.lastSequenceNumber + 1 >= 0);
338
+ const request = new node_opcua_service_subscription_1.RepublishRequest({
339
+ retransmitSequenceNumber: subscription.lastSequenceNumber + 1,
340
+ subscriptionId: subscription.subscriptionId
341
+ });
342
+ // istanbul ignore next
343
+ if (doDebug) {
344
+ debugLog(chalk.bgCyan.yellow.bold(" republish Request for subscription"), request.subscriptionId, " retransmitSequenceNumber=", request.retransmitSequenceNumber);
345
+ }
346
+ if (!session || session._closeEventHasBeenEmitted) {
347
+ debugLog("ClientPublishEngine#_republish aborted ");
348
+ // has client been disconnected in the mean time ?
349
+ isDone = true;
350
+ return callback2();
351
+ }
352
+ session.republish(request, (err, response) => {
353
+ const statusCode = err ? node_opcua_status_code_1.StatusCodes.Bad : response.responseHeader.serviceResult;
354
+ if (!err && (statusCode.equals(node_opcua_status_code_1.StatusCodes.Good) || statusCode.equals(node_opcua_status_code_1.StatusCodes.BadMessageNotAvailable))) {
355
+ // reprocess notification message and keep going
356
+ if (statusCode.equals(node_opcua_status_code_1.StatusCodes.Good)) {
357
+ subscription.onNotificationMessage(response.notificationMessage);
358
+ }
359
+ }
360
+ else {
361
+ if (!err) {
362
+ err = new Error(response.responseHeader.serviceResult.toString());
363
+ }
364
+ debugLog(" _send_republish ends with ", err.message);
365
+ isDone = true;
366
+ }
367
+ callback2(err ? err : undefined);
368
+ });
369
+ };
370
+ setImmediate(() => {
371
+ (0, node_opcua_assert_1.assert)(typeof callback === "function");
372
+ async.whilst((cb) => cb(null, !isDone), sendRepublishFunc, ((err) => {
373
+ debugLog("nbPendingPublishRequest = ", this.nbPendingPublishRequests);
374
+ debugLog(" _republish ends with ", err ? err.message : "null");
375
+ callback(err);
376
+ }) // Wait for @type/async bug to be fixed !
377
+ );
378
+ });
379
+ }
380
+ __repairSubscription(subscription, subscriptionId, callback) {
381
+ debugLog("__repairSubscription for SubscriptionId ", subscriptionId);
382
+ this._republish(subscription, subscriptionId, (err) => {
383
+ (0, node_opcua_assert_1.assert)(!err || err instanceof Error);
384
+ debugLog("__repairSubscription--------------------- err =", err ? err.message : null);
385
+ if (err && err.message.match(/BadSessionInvalid/)) {
386
+ // _republish failed because session is not valid anymore on server side.
387
+ return callback(err);
388
+ }
389
+ if (err && err.message.match(/SubscriptionIdInvalid/)) {
390
+ // _republish failed because subscriptionId is not valid anymore on server side.
391
+ //
392
+ // This could happen when the subscription has timed out and has been deleted by server
393
+ // Subscription may time out if the duration of the connection break exceed the max life time
394
+ // of the subscription.
395
+ //
396
+ // In this case, Client must recreate a subscription and recreate monitored item without altering
397
+ // the event handlers
398
+ //
399
+ debugLog(chalk.bgWhite.red("_republish failed " + " subscriptionId is not valid anymore on server side."));
400
+ const subscriptionI = subscription;
401
+ return subscriptionI.recreateSubscriptionAndMonitoredItem(callback);
402
+ }
403
+ callback();
404
+ });
405
+ }
406
+ }
407
+ ClientSidePublishEngine.publishRequestCountInPipeline = 5;
408
+ exports.ClientSidePublishEngine = ClientSidePublishEngine;
409
+ //# sourceMappingURL=client_publish_engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client_publish_engine.js","sourceRoot":"","sources":["../../source/private/client_publish_engine.ts"],"names":[],"mappings":"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"}