opcjs-base 0.1.26-alpha → 0.1.32-alpha

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/index.js CHANGED
@@ -1,5 +1,39 @@
1
1
  import { XMLParser } from 'fast-xml-parser';
2
2
 
3
+ // src/types/expandedNodeId.ts
4
+ var ExpandedNodeId = class {
5
+ /** The wrapped NodeId. */
6
+ nodeId;
7
+ /** The server index (optional, for cross-server references). */
8
+ serverIndex;
9
+ /** The namespace URI (optional, alternative to the namespace index on nodeId). */
10
+ namespaceUri;
11
+ /**
12
+ * Create a new ExpandedNodeId.
13
+ *
14
+ * @param nodeId - The wrapped NodeId
15
+ * @param namespaceUri - Optional namespace URI
16
+ * @param serverIndex - Optional server index
17
+ */
18
+ constructor(nodeId, namespaceUri, serverIndex) {
19
+ this.nodeId = nodeId;
20
+ this.namespaceUri = namespaceUri;
21
+ this.serverIndex = serverIndex;
22
+ }
23
+ /** Convert ExpandedNodeId to string representation. */
24
+ toString() {
25
+ let result = "";
26
+ if (this.serverIndex !== void 0) {
27
+ result += `svr=${this.serverIndex};`;
28
+ }
29
+ if (this.namespaceUri !== void 0) {
30
+ result += `nsu=${this.namespaceUri};`;
31
+ }
32
+ result += this.nodeId.toString();
33
+ return result;
34
+ }
35
+ };
36
+
3
37
  // src/types/nodeId.ts
4
38
  var NodeIdType = /* @__PURE__ */ ((NodeIdType2) => {
5
39
  NodeIdType2[NodeIdType2["Numeric"] = 0] = "Numeric";
@@ -170,47 +204,6 @@ var NodeId = class _NodeId {
170
204
  }
171
205
  };
172
206
 
173
- // src/types/expandedNodeId.ts
174
- var ExpandedNodeId = class extends NodeId {
175
- /**
176
- * The server index (optional, for cross-server references)
177
- */
178
- serverIndex;
179
- /**
180
- * The namespace URI (optional, alternative to namespace index)
181
- */
182
- namespaceUri;
183
- /**
184
- * Create a new ExpandedNodeId
185
- *
186
- * @param namespace - The namespace index
187
- * @param identifier - The identifier
188
- * @param namespaceUri - Optional namespace URI
189
- * @param serverIndex - Optional server index
190
- */
191
- constructor(namespace = 0, identifier = 0, namespaceUri, serverIndex) {
192
- super(namespace, identifier);
193
- this.namespaceUri = namespaceUri;
194
- this.serverIndex = serverIndex;
195
- }
196
- /**
197
- * Convert ExpandedNodeId to string representation
198
- *
199
- * @returns String representation of the ExpandedNodeId
200
- */
201
- toString() {
202
- let result = "";
203
- if (this.serverIndex !== void 0) {
204
- result += `svr=${this.serverIndex};`;
205
- }
206
- if (this.namespaceUri !== void 0) {
207
- result += `nsu=${this.namespaceUri};`;
208
- }
209
- result += super.toString();
210
- return result;
211
- }
212
- };
213
-
214
207
  // src/codecs/encoder.ts
215
208
  var Encoder = class {
216
209
  encoders = /* @__PURE__ */ new Map();
@@ -228,7 +221,7 @@ var Encoder = class {
228
221
  }
229
222
  const writer = writerFactory();
230
223
  const encodingId = value.getBinaryEncodingId();
231
- const eid = new ExpandedNodeId(0, encodingId);
224
+ const eid = new ExpandedNodeId(new NodeId(0, encodingId));
232
225
  writer.writeExpandedNodeId(eid);
233
226
  const typeId = value.getTypeId();
234
227
  const encodingFunction = this.encoders.get(typeId);
@@ -275,7 +268,7 @@ var Decoder = class {
275
268
  }
276
269
  const reader = readerFactory(data);
277
270
  const eid = reader.readExpandedNodeId();
278
- return this.decodeWithEncodingId(eid.identifier, reader);
271
+ return this.decodeWithEncodingId(eid.nodeId.identifier, reader);
279
272
  }
280
273
  decodeWithEncodingId(encodingId, reader) {
281
274
  const decodingInfo = this.encodingIdMap.get(encodingId);
@@ -491,7 +484,7 @@ function decodeExpandedNodeId(reader) {
491
484
  if (hasServerIndex) {
492
485
  serverIndex = reader.readUInt32();
493
486
  }
494
- return new ExpandedNodeId(nodeId.namespace, nodeId.identifier, namespaceUri, serverIndex);
487
+ return new ExpandedNodeId(nodeId, namespaceUri, serverIndex);
495
488
  }
496
489
  function encodeExpandedNodeId(writer, value) {
497
490
  let extraFlags = 0;
@@ -502,9 +495,9 @@ function encodeExpandedNodeId(writer, value) {
502
495
  extraFlags |= ExpandedNodeIdMask.ServerIndexFlag;
503
496
  }
504
497
  if (extraFlags === 0) {
505
- encodeNodeId(writer, value);
498
+ encodeNodeId(writer, value.nodeId);
506
499
  } else {
507
- encodeNodeIdWithExtraFlags(writer, value, extraFlags);
500
+ encodeNodeIdWithExtraFlags(writer, value.nodeId, extraFlags);
508
501
  }
509
502
  if (value.namespaceUri !== void 0) {
510
503
  writer.writeString(value.namespaceUri);
@@ -725,7 +718,7 @@ function encodeLocalizedText(writer, value) {
725
718
  // src/types/extensionObject.ts
726
719
  var ExtensionObject = class _ExtensionObject {
727
720
  /**
728
- * The NodeId that identifies the type of structure encoded in the body.
721
+ * The NodeId (or ExpandedNodeId) that identifies the type of structure encoded in the body.
729
722
  */
730
723
  typeId;
731
724
  /**
@@ -1054,7 +1047,7 @@ function decodeExtensionObject(reader, decoder) {
1054
1047
  }
1055
1048
  function encodeExtensionObject(writer, value, encoder) {
1056
1049
  const typeId = value.typeId;
1057
- if ("namespaceUri" in typeId || "serverIndex" in typeId) {
1050
+ if (typeId instanceof ExpandedNodeId) {
1058
1051
  encodeExpandedNodeId(writer, typeId);
1059
1052
  } else {
1060
1053
  encodeNodeId(writer, typeId);
@@ -1370,7 +1363,7 @@ function StatusCodeToString(statusCode) {
1370
1363
  if (statusCode === void 0) {
1371
1364
  return "Unknown";
1372
1365
  }
1373
- const baseCode = statusCode & 4294901760;
1366
+ const baseCode = (statusCode & 4294901760) >>> 0;
1374
1367
  const name = Object.entries(StatusCode).find(([, v]) => v === baseCode)?.[0];
1375
1368
  return name ?? `0x${baseCode.toString(16).toUpperCase().padStart(8, "0")}`;
1376
1369
  }
@@ -1393,7 +1386,7 @@ function StatusCodeGetFlagBits(statusCode) {
1393
1386
  };
1394
1387
  }
1395
1388
  function StatusCodeIs(statusCode, expected) {
1396
- return (statusCode & 4294901760) === expected;
1389
+ return (statusCode & 4294901760) >>> 0 === expected;
1397
1390
  }
1398
1391
 
1399
1392
  // src/types/dataValue.ts
@@ -2937,12 +2930,22 @@ var SecureChannelTypeEncoder = class extends TransformStream {
2937
2930
  }
2938
2931
  };
2939
2932
 
2933
+ // src/secureChannel/messages/msgType.ts
2934
+ var MsgTypeOpenFinal = "O".charCodeAt(0) | "P".charCodeAt(0) << 8 | "N".charCodeAt(0) << 16 | "F".charCodeAt(0) << 24;
2935
+ var MsgTypeOpenChunk = "O".charCodeAt(0) | "P".charCodeAt(0) << 8 | "N".charCodeAt(0) << 16 | "C".charCodeAt(0) << 24;
2936
+ var MsgTypeAbort = "M".charCodeAt(0) | "S".charCodeAt(0) << 8 | "G".charCodeAt(0) << 16 | "A".charCodeAt(0) << 24;
2937
+ var MsgTypeChunk = "M".charCodeAt(0) | "S".charCodeAt(0) << 8 | "G".charCodeAt(0) << 16 | "C".charCodeAt(0) << 24;
2938
+ var MsgTypeFinal = "M".charCodeAt(0) | "S".charCodeAt(0) << 8 | "G".charCodeAt(0) << 16 | "F".charCodeAt(0) << 24;
2939
+ var MsgTypeCloseFinal = "C".charCodeAt(0) | "L".charCodeAt(0) << 8 | "O".charCodeAt(0) << 16 | "F".charCodeAt(0) << 24;
2940
+
2940
2941
  // src/secureChannel/secureChannelTypeDecoder.ts
2941
2942
  var SecureChannelTypeDecoder = class extends TransformStream {
2942
2943
  constructor(decoder) {
2943
2944
  super({
2944
2945
  transform(msg, controller) {
2945
- msg.body = decoder.decode(msg.body, "binary");
2946
+ if (msg.header.msgType !== MsgTypeAbort) {
2947
+ msg.body = decoder.decode(msg.body, "binary");
2948
+ }
2946
2949
  controller.enqueue(msg);
2947
2950
  }
2948
2951
  });
@@ -17404,13 +17407,6 @@ var MsgSymmetric = class _MsgSymmetric extends MsgBase2 {
17404
17407
  }
17405
17408
  };
17406
17409
 
17407
- // src/secureChannel/messages/msgType.ts
17408
- var MsgTypeOpenFinal = "O".charCodeAt(0) | "P".charCodeAt(0) << 8 | "N".charCodeAt(0) << 16 | "F".charCodeAt(0) << 24;
17409
- var MsgTypeAbort = "M".charCodeAt(0) | "S".charCodeAt(0) << 8 | "G".charCodeAt(0) << 16 | "A".charCodeAt(0) << 24;
17410
- var MsgTypeChunk = "M".charCodeAt(0) | "S".charCodeAt(0) << 8 | "G".charCodeAt(0) << 16 | "C".charCodeAt(0) << 24;
17411
- var MsgTypeFinal = "M".charCodeAt(0) | "S".charCodeAt(0) << 8 | "G".charCodeAt(0) << 16 | "F".charCodeAt(0) << 24;
17412
- var MsgTypeCloseFinal = "C".charCodeAt(0) | "L".charCodeAt(0) << 8 | "O".charCodeAt(0) << 16 | "F".charCodeAt(0) << 24;
17413
-
17414
17410
  // src/secureChannel/pendingRequests.ts
17415
17411
  var PendingRequests = class {
17416
17412
  map = /* @__PURE__ */ new Map();
@@ -17462,6 +17458,7 @@ var Certificate = class {
17462
17458
  };
17463
17459
 
17464
17460
  // src/secureChannel/secureChannelFacade.ts
17461
+ var TOKEN_RENEW_FRACTION = 0.75;
17465
17462
  var SecureChannelFacade = class {
17466
17463
  // ─── Constructor ────────────────────────────────────────────────────────────────
17467
17464
  constructor(context, readerTransform, writerTransform) {
@@ -17476,11 +17473,17 @@ var SecureChannelFacade = class {
17476
17473
  logger = getLogger("secureChannel.SecureChannelFacade");
17477
17474
  writer;
17478
17475
  reader;
17476
+ /** Timer handle for the scheduled token renewal; undefined when no renewal is pending. */
17477
+ renewalTimer;
17479
17478
  /**
17480
- * Sends the OpenSecureChannel request and resolves once the server replies.
17481
- * Updates `context.channelId` and `context.tokenId` on success.
17479
+ * Builds and sends an OpenSecureChannel request.
17480
+ * Called for both the initial Issue and subsequent Renew requests.
17481
+ *
17482
+ * On success the context `channelId` and `tokenId` are updated and a new
17483
+ * renewal is scheduled at 75 % of the server-revised token lifetime, per
17484
+ * OPC UA Part 4 Section 5.4.1 / Part 6 Section 6.7.3.
17482
17485
  */
17483
- async openSecureChannel() {
17486
+ async sendOpenSecureChannel(requestType) {
17484
17487
  const requestHeader = new RequestHeader();
17485
17488
  requestHeader.authenticationToken = NodeId.newTwoByte(0);
17486
17489
  requestHeader.timestamp = /* @__PURE__ */ new Date();
@@ -17492,31 +17495,72 @@ var SecureChannelFacade = class {
17492
17495
  const request = new OpenSecureChannelRequest();
17493
17496
  request.requestHeader = requestHeader;
17494
17497
  request.clientProtocolVersion = 0;
17495
- request.requestType = 0 /* Issue */;
17498
+ request.requestType = requestType;
17496
17499
  request.securityMode = this.context.securityPolicy.getSecurityMode();
17497
17500
  request.clientNonce = null;
17498
17501
  request.requestedLifetime = 36e5;
17499
17502
  const { sequenceNumber, requestId } = this.context.nextIds();
17500
- this.context.securityAlgorithm = this.context.securityPolicy.getAlgorithmAsymmetric(new Uint8Array(), new Uint8Array());
17503
+ this.context.securityAlgorithm = this.context.securityPolicy.getAlgorithmAsymmetric(
17504
+ new Uint8Array(),
17505
+ new Uint8Array()
17506
+ );
17501
17507
  const msg = new MsgAsymmetric(
17502
- new MsgHeader2(MsgTypeOpenFinal, 0, 0),
17508
+ new MsgHeader2(MsgTypeOpenFinal, 0, this.context.channelId),
17503
17509
  new MsgSecurityHeaderAsymmetric(
17504
17510
  "http://opcfoundation.org/UA/SecurityPolicy#None"
17505
17511
  ),
17506
17512
  new MsgSequenceHeader(sequenceNumber, requestId),
17507
17513
  request
17508
17514
  );
17509
- this.logger.debug("Sending OpenSecureChannelRequest...");
17510
- return this.pushMessage(msg).then((response) => {
17511
- const openResponse = response;
17512
- this.logger.debug("OpenSecureChannelResponse received");
17513
- this.context.channelId = openResponse.securityToken?.channelId;
17514
- this.context.tokenId = openResponse.securityToken?.tokenId;
17515
- this.context.securityAlgorithm = this.context.securityPolicy.getAlgorithmSymmetric(
17516
- new Certificate(),
17517
- new Certificate()
17518
- );
17519
- });
17515
+ const response = await this.pushMessage(msg);
17516
+ this.context.channelId = response.securityToken?.channelId;
17517
+ this.context.tokenId = response.securityToken?.tokenId;
17518
+ this.context.securityAlgorithm = this.context.securityPolicy.getAlgorithmSymmetric(
17519
+ new Certificate(),
17520
+ new Certificate()
17521
+ );
17522
+ const revisedLifetimeMs = response.securityToken?.revisedLifetime;
17523
+ this.scheduleRenewal(revisedLifetimeMs);
17524
+ }
17525
+ /**
17526
+ * Schedules a proactive token renewal at {@link TOKEN_RENEW_FRACTION} of
17527
+ * `lifetimeMs`. Any previously scheduled renewal is cancelled first.
17528
+ */
17529
+ scheduleRenewal(lifetimeMs) {
17530
+ if (this.renewalTimer !== void 0) {
17531
+ clearTimeout(this.renewalTimer);
17532
+ }
17533
+ const delayMs = Math.floor(lifetimeMs * TOKEN_RENEW_FRACTION);
17534
+ this.logger.debug(
17535
+ `Scheduling SecurityToken renewal in ${delayMs} ms (75 % of ${lifetimeMs} ms lifetime).`
17536
+ );
17537
+ this.renewalTimer = setTimeout(() => {
17538
+ this.renewalTimer = void 0;
17539
+ this.logger.info("Renewing SecurityToken...");
17540
+ this.sendOpenSecureChannel(1 /* Renew */).catch((err) => {
17541
+ this.logger.error("SecurityToken renewal failed:", err);
17542
+ });
17543
+ }, delayMs);
17544
+ }
17545
+ /**
17546
+ * Sends the initial OpenSecureChannel request and resolves once the server
17547
+ * replies. Updates `context.channelId` and `context.tokenId` on success
17548
+ * and schedules automatic renewal at 75 % of the token lifetime.
17549
+ */
17550
+ openSecureChannel() {
17551
+ this.logger.debug("Sending OpenSecureChannelRequest (Issue)...");
17552
+ return this.sendOpenSecureChannel(0 /* Issue */);
17553
+ }
17554
+ /**
17555
+ * Cancels any pending token renewal timer and releases the stream writer.
17556
+ * Call this when the secure channel is no longer needed.
17557
+ */
17558
+ close() {
17559
+ if (this.renewalTimer !== void 0) {
17560
+ clearTimeout(this.renewalTimer);
17561
+ this.renewalTimer = void 0;
17562
+ }
17563
+ this.writer.releaseLock();
17520
17564
  }
17521
17565
  // ─── ISecureChannel implementation ─────────────────────────────────────────────
17522
17566
  getSecurityPolicy() {
@@ -17553,14 +17597,20 @@ var SecureChannelFacade = class {
17553
17597
  if (!value) {
17554
17598
  this.logger.error("Received empty frame");
17555
17599
  }
17556
- const response = value.body;
17557
- if (response instanceof ServiceFault) {
17558
- this.pending.failAll(
17559
- // todo: create a human readable error message based on the ServiceFault content
17560
- new Error(`ServiceFault: ${JSON.stringify(response)}`)
17561
- );
17600
+ const requestId = value.sequenceHeader.requestId;
17601
+ if (value.header.msgType === MsgTypeAbort) {
17602
+ const reader = new BinaryReader(value.body);
17603
+ const statusCode = reader.readUInt32();
17604
+ const reason = reader.readString();
17605
+ this.context.chunkBuffers.delete(requestId);
17606
+ this.pending.fail(requestId, new Error(`Abort 0x${statusCode.toString(16).toUpperCase()}: ${reason}`));
17562
17607
  } else {
17563
- this.pending.settle(value.sequenceHeader.requestId, response);
17608
+ const response = value.body;
17609
+ if (response instanceof ServiceFault) {
17610
+ this.pending.fail(requestId, new Error(`ServiceFault: ${JSON.stringify(response)}`));
17611
+ } else {
17612
+ this.pending.settle(requestId, response);
17613
+ }
17564
17614
  }
17565
17615
  }
17566
17616
  } catch (e) {
@@ -17691,33 +17741,67 @@ var SecurityPolicyNone = class {
17691
17741
  };
17692
17742
 
17693
17743
  // src/secureChannel/secureChannelContext.ts
17694
- var INT32_MAX = 2147483647;
17744
+ var SEQ_WRAP_THRESHOLD = 4294967295 - 1024;
17745
+ var SEQ_WRAP_START = 1;
17695
17746
  var SecureChannelContext = class {
17696
17747
  constructor(endpointUrl) {
17697
17748
  this.endpointUrl = endpointUrl;
17698
17749
  }
17699
- sequenceNumber = 0;
17700
- requestNumber = 1;
17750
+ /**
17751
+ * Next outgoing sequence number. Starts at 1 for non-ECC legacy profiles
17752
+ * per OPC UA Part 6, Section 6.7.2.4. The value 0 is used only as the
17753
+ * LastSequenceNumber sentinel in the OPN request ("no prior sequence").
17754
+ */
17755
+ sequenceNumber = 1;
17756
+ /** Next outgoing request ID. The value 0 is reserved and must be skipped. */
17757
+ requestId = 1;
17701
17758
  channelId = 0;
17702
17759
  tokenId = 0;
17703
- maxSendBufferSize = INT32_MAX;
17704
- maxRecvBufferSize = INT32_MAX;
17705
- chunkBuffers = [];
17760
+ maxSendBufferSize = 2147483647;
17761
+ maxRecvBufferSize = 2147483647;
17762
+ /** Pending chunk bodies keyed by requestId, for reassembling multi-chunk messages. */
17763
+ chunkBuffers = /* @__PURE__ */ new Map();
17706
17764
  securityAlgorithm;
17765
+ /** Last remote sequence number seen; undefined before the first received message. */
17766
+ lastRemoteSequenceNumber = void 0;
17707
17767
  securityPolicy = new SecurityPolicyNone();
17708
17768
  /**
17709
- * Atomically increments and returns the next sequence number and request id.
17710
- * Call once per outgoing message so both counters stay in sync.
17769
+ * Returns the current outgoing sequence number then advances it with
17770
+ * UInt32 wrap-around per OPC UA Part 6, Section 6.7.2.4. Only advances
17771
+ * the sequence counter — use when creating additional chunks for the same
17772
+ * message (each chunk needs its own sequence number but the same requestId).
17773
+ */
17774
+ nextSequenceNumber() {
17775
+ const seq = this.sequenceNumber;
17776
+ if (this.sequenceNumber >= SEQ_WRAP_THRESHOLD) {
17777
+ this.sequenceNumber = SEQ_WRAP_START;
17778
+ } else {
17779
+ this.sequenceNumber++;
17780
+ }
17781
+ return seq;
17782
+ }
17783
+ /**
17784
+ * Returns the next outgoing sequence number and request ID, then advances
17785
+ * both counters. Call once per outgoing message; use {@link nextSequenceNumber}
17786
+ * for additional chunks of the same message.
17787
+ *
17788
+ * Handles UInt32 wrap-around per OPC UA Part 6, Section 6.7.2.4:
17789
+ * sequence numbers reset to 1 after reaching 0xFFFFFFFF-1024; request IDs
17790
+ * skip the reserved value 0 on wrap.
17711
17791
  */
17712
17792
  nextIds() {
17713
- return {
17714
- sequenceNumber: this.sequenceNumber++,
17715
- requestId: this.requestNumber++
17716
- };
17793
+ const result = { sequenceNumber: this.nextSequenceNumber(), requestId: this.requestId };
17794
+ this.requestId++;
17795
+ if (this.requestId === 0) {
17796
+ this.requestId = 1;
17797
+ }
17798
+ return result;
17717
17799
  }
17718
17800
  };
17719
17801
 
17720
17802
  // src/secureChannel/secureChannelMessageDecoder.ts
17803
+ var SEQ_WRAP_THRESHOLD2 = 4294967295 - 1024;
17804
+ var SEQ_WRAP_MAX = 1024;
17721
17805
  var SecureChannelMessageDecoder = class extends TransformStream {
17722
17806
  constructor(context) {
17723
17807
  super({
@@ -17726,12 +17810,34 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17726
17810
  this.context = context;
17727
17811
  }
17728
17812
  logger = getLogger("secureChannel.SecureChannelMessageDecoder");
17813
+ /**
17814
+ * Validates that `sequenceNumber` is strictly increasing from the last
17815
+ * seen remote sequence. Allows exactly one UInt32 wrap-around per token.
17816
+ * Returns false and logs an error if the number is a duplicate or out of order.
17817
+ */
17818
+ validateSequenceNumber(sequenceNumber, controller) {
17819
+ const last = this.context.lastRemoteSequenceNumber;
17820
+ if (last === void 0) {
17821
+ this.context.lastRemoteSequenceNumber = sequenceNumber;
17822
+ return true;
17823
+ }
17824
+ const isIncrement = sequenceNumber === last + 1;
17825
+ const isWrap = last >= SEQ_WRAP_THRESHOLD2 && sequenceNumber < SEQ_WRAP_MAX;
17826
+ if (!isIncrement && !isWrap) {
17827
+ this.logger.error(`Invalid remote sequence number: expected ${last + 1}, got ${sequenceNumber}`);
17828
+ controller.error(new Error(`Invalid remote sequence number: expected ${last + 1}, got ${sequenceNumber}`));
17829
+ return false;
17830
+ }
17831
+ this.context.lastRemoteSequenceNumber = sequenceNumber;
17832
+ return true;
17833
+ }
17729
17834
  transform(data, controller) {
17730
17835
  const buffer = new BinaryReader(data);
17731
17836
  const header = MsgHeader2.decode(buffer);
17732
17837
  switch (header.msgType) {
17733
- case MsgTypeOpenFinal: {
17734
- this.logger.debug("SecureChannel received OpenFinal message");
17838
+ case MsgTypeOpenFinal:
17839
+ case MsgTypeOpenChunk: {
17840
+ this.logger.debug("SecureChannel received OpenFinal/OpenChunk message");
17735
17841
  const secHeader = MsgSecurityHeaderAsymmetric.decode(buffer);
17736
17842
  const msgAsym = MsgAsymmetric.decode(
17737
17843
  buffer,
@@ -17739,16 +17845,22 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17739
17845
  secHeader,
17740
17846
  this.context.securityAlgorithm
17741
17847
  );
17848
+ if (!this.validateSequenceNumber(msgAsym.sequenceHeader.sequenceNumber, controller)) return;
17742
17849
  controller.enqueue(msgAsym);
17743
17850
  break;
17744
17851
  }
17745
- case MsgTypeAbort:
17746
- this.logger.warn("Unimplemented Abort message");
17852
+ case MsgTypeAbort: {
17853
+ this.logger.warn("SecureChannel received Abort message");
17854
+ const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17855
+ const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17856
+ controller.enqueue(msgSym);
17747
17857
  break;
17858
+ }
17748
17859
  case MsgTypeChunk: {
17749
17860
  this.logger.debug("SecureChannel received Chunk message.");
17750
17861
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17751
17862
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17863
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, controller)) return;
17752
17864
  controller.enqueue(msgSym);
17753
17865
  break;
17754
17866
  }
@@ -17756,11 +17868,12 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17756
17868
  this.logger.debug("SecureChannel received Final message");
17757
17869
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17758
17870
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17871
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, controller)) return;
17759
17872
  controller.enqueue(msgSym);
17760
17873
  break;
17761
17874
  }
17762
17875
  case MsgTypeCloseFinal:
17763
- this.logger.warn("Unimplemented CloseFinal message. ");
17876
+ this.logger.warn("Unimplemented CloseFinal message.");
17764
17877
  break;
17765
17878
  default:
17766
17879
  this.logger.warn("SecureChannel received unknown message type:", header.msgType);
@@ -17770,7 +17883,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17770
17883
  };
17771
17884
 
17772
17885
  // src/secureChannel/secureChannelMessageEncoder.ts
17773
- var SecureChannelMesssageEncoder = class extends TransformStream {
17886
+ var SecureChannelMessageEncoder = class extends TransformStream {
17774
17887
  constructor(context) {
17775
17888
  super({
17776
17889
  transform(msg, controller) {
@@ -17785,24 +17898,33 @@ var SecureChannelMesssageEncoder = class extends TransformStream {
17785
17898
  // src/secureChannel/secureChannelChunkReader.ts
17786
17899
  var SecureChannelChunkReader = class extends TransformStream {
17787
17900
  logger = getLogger("secureChannel.SecureChannelChunkReader");
17788
- prependChunk(chunk, body) {
17789
- const result = new Uint8Array(chunk.byteLength + body.byteLength);
17790
- result.set(chunk, 0);
17791
- result.set(body, chunk.byteLength);
17792
- return result;
17793
- }
17794
17901
  transform(msg, context, controller) {
17902
+ const requestId = msg.sequenceHeader.requestId;
17795
17903
  switch (msg.header.msgType) {
17796
- case MsgTypeChunk: {
17904
+ case MsgTypeChunk:
17905
+ case MsgTypeOpenChunk: {
17797
17906
  this.logger.debug("Received Chunk message");
17798
- context.chunkBuffers.push(msg.body);
17907
+ const chunks = context.chunkBuffers.get(requestId) ?? [];
17908
+ chunks.push(msg.body);
17909
+ context.chunkBuffers.set(requestId, chunks);
17799
17910
  break;
17800
17911
  }
17801
- case MsgTypeFinal: {
17912
+ case MsgTypeFinal:
17913
+ case MsgTypeOpenFinal: {
17802
17914
  this.logger.debug("Received Final message");
17803
- while (context.chunkBuffers.length > 0) {
17804
- const chunk = context.chunkBuffers.pop();
17805
- msg.body = this.prependChunk(chunk, msg.body);
17915
+ const chunks = context.chunkBuffers.get(requestId);
17916
+ if (chunks && chunks.length > 0) {
17917
+ const finalBody = msg.body;
17918
+ const totalLength = chunks.reduce((sum, c) => sum + c.byteLength, 0) + finalBody.byteLength;
17919
+ const assembled = new Uint8Array(totalLength);
17920
+ let offset = 0;
17921
+ for (const chunk of chunks) {
17922
+ assembled.set(chunk, offset);
17923
+ offset += chunk.byteLength;
17924
+ }
17925
+ assembled.set(finalBody, offset);
17926
+ msg.body = assembled;
17927
+ context.chunkBuffers.delete(requestId);
17806
17928
  }
17807
17929
  controller.enqueue(msg);
17808
17930
  break;
@@ -17836,33 +17958,43 @@ var SecureChannelChunkWriter = class extends TransformStream {
17836
17958
  this.logger.debug("Received Final message");
17837
17959
  const securityAlgorithm = this.context.securityAlgorithm;
17838
17960
  const maxCipherTextSize = this.context.maxSendBufferSize - MsgHeader2.Size - MsgSecurityHeaderSymmetric.Size;
17839
- const maxPlainTextSize = maxCipherTextSize / securityAlgorithm.GetEncryptedSize(maxCipherTextSize);
17840
- const maxPayloadSize = maxPlainTextSize - securityAlgorithm.GetSignatureLength() - 1 - MsgSecurityHeaderSymmetric.Size + (securityAlgorithm.IsAuthenticated() ? 1 : 0);
17961
+ const maxPayloadSize = securityAlgorithm.GetMaxPayload(maxCipherTextSize) - MsgSequenceHeader.Size;
17841
17962
  const data = msgSymmetric.body;
17842
- const chunkCount = data.byteLength / maxPayloadSize;
17843
- if (chunkCount > 1) {
17844
- this.logger.debug(`Message body exceeds max chunk size, splitting into ${chunkCount} chunks.`);
17845
- for (let i = 0; i < chunkCount; i++) {
17963
+ const numChunks = Math.ceil(data.byteLength / maxPayloadSize);
17964
+ if (numChunks > 1) {
17965
+ this.logger.debug(`Message body exceeds max chunk size, splitting into ${numChunks} chunks.`);
17966
+ for (let i = 0; i < numChunks - 1; i++) {
17846
17967
  const chunkMsg = new MsgSymmetric(
17847
- new MsgHeader2(MsgTypeChunk, -1, msgSymmetric.header.secureChannelId),
17968
+ // messageSize=0 is a placeholder: MsgBase.Encrypt() overwrites it at byte offset 4
17969
+ // with the actual encrypted size before writing to the wire.
17970
+ new MsgHeader2(MsgTypeChunk, 0, msgSymmetric.header.secureChannelId),
17848
17971
  msgSymmetric.securityHeader,
17849
- msgSymmetric.sequenceHeader,
17972
+ new MsgSequenceHeader(
17973
+ this.context.nextSequenceNumber(),
17974
+ msgSymmetric.sequenceHeader.requestId
17975
+ ),
17850
17976
  data.subarray(i * maxPayloadSize, (i + 1) * maxPayloadSize)
17851
17977
  );
17852
- this.logger.trace(`Enqueuing chunk ${i + 1}/${chunkCount} with size ${chunkMsg.body.byteLength} bytes.`);
17978
+ this.logger.trace(
17979
+ `Enqueuing chunk ${i + 1}/${numChunks} with size ${chunkMsg.body.byteLength} bytes.`
17980
+ );
17853
17981
  controller.enqueue(chunkMsg);
17854
17982
  }
17855
- msg.body = data.subarray(chunkCount * maxPayloadSize);
17983
+ msg.sequenceHeader = new MsgSequenceHeader(
17984
+ this.context.nextSequenceNumber(),
17985
+ msgSymmetric.sequenceHeader.requestId
17986
+ );
17987
+ msg.body = data.subarray((numChunks - 1) * maxPayloadSize);
17856
17988
  }
17857
17989
  break;
17858
17990
  }
17859
17991
  }
17860
17992
  }
17861
- this.logger.trace(`Enqueuing message default message with body size ${msg.body.byteLength} bytes.`);
17993
+ this.logger.trace(`Enqueuing final message with body size ${msg.body.byteLength} bytes.`);
17862
17994
  controller.enqueue(msg);
17863
17995
  }
17864
17996
  };
17865
17997
 
17866
- export { ActionMethodDataType, ActionStateEnum, ActionTargetDataType, ActivateSessionRequest, ActivateSessionResponse, AddNodesItem, AddNodesRequest, AddNodesResponse, AddNodesResult, AddReferencesItem, AddReferencesRequest, AddReferencesResponse, AdditionalParametersType, AggregateConfiguration, AggregateFilter, AggregateFilterResult, AliasNameDataType, Annotation, AnnotationDataType, AnonymousIdentityToken, ApplicationConfigurationDataType, ApplicationDescription, ApplicationIdentityDataType, ApplicationTypeEnum, Argument, AttributeOperand, AuthorizationServiceConfigurationDataType, AxisInformation, AxisScaleEnumerationEnum, BaseConfigurationDataType, BaseConfigurationRecordDataType, SecureChannelTypeDecoder as BinaryDecoderTransform, SecureChannelTypeEncoder as BinaryEncoderTransform, BinaryReader, BinaryWriter, BitFieldDefinition, BrokerConnectionTransportDataType, BrokerDataSetReaderTransportDataType, BrokerDataSetWriterTransportDataType, BrokerTransportQualityOfServiceEnum, BrokerWriterGroupTransportDataType, BrowseDescription, BrowseDirectionEnum, BrowseNextRequest, BrowseNextResponse, BrowsePath, BrowsePathResult, BrowsePathTarget, BrowseRequest, BrowseResponse, BrowseResult, BrowseResultMaskEnum, BuildInfo, CallMethodRequest, CallMethodResult, CallRequest, CallResponse, CancelRequest, CancelResponse, CartesianCoordinates, CertificateGroupDataType, ChannelSecurityToken, ChassisIdSubtypeEnum, CloseSecureChannelRequest, CloseSecureChannelResponse, CloseSessionRequest, CloseSessionResponse, ComplexNumberType, Configuration, ConfigurationUpdateTargetType, ConfigurationUpdateTypeEnum, ConfigurationVersionDataType, ConnectionTransportDataType, ConsoleSink, ContentFilter, ContentFilterElement, ContentFilterElementResult, ContentFilterResult, ConversionLimitEnumEnum, CreateMonitoredItemsRequest, CreateMonitoredItemsResponse, CreateSessionRequest, CreateSessionResponse, CreateSubscriptionRequest, CreateSubscriptionResponse, CurrencyUnitType, DataChangeFilter, DataChangeNotification, DataChangeTriggerEnum, DataSetMetaDataType, DataSetOrderingTypeEnum, DataSetReaderDataType, DataSetReaderMessageDataType, DataSetReaderTransportDataType, DataSetWriterDataType, DataSetWriterMessageDataType, DataSetWriterTransportDataType, DataTypeAttributes, DataTypeDefinition, DataTypeDescription, DataTypeNode, DataTypeSchemaHeader, DataValue, DatagramConnectionTransport2DataType, DatagramConnectionTransportDataType, DatagramDataSetReaderTransportDataType, DatagramWriterGroupTransport2DataType, DatagramWriterGroupTransportDataType, DeadbandTypeEnum, DecimalDataType, Decoder, DeleteAtTimeDetails, DeleteEventDetails, DeleteMonitoredItemsRequest, DeleteMonitoredItemsResponse, DeleteNodesItem, DeleteNodesRequest, DeleteNodesResponse, DeleteRawModifiedDetails, DeleteReferencesItem, DeleteReferencesRequest, DeleteReferencesResponse, DeleteSubscriptionsRequest, DeleteSubscriptionsResponse, DiagnosticInfo, DiagnosticsLevelEnum, DiscoveryConfiguration, DoubleComplexNumberType, DtlsPubSubConnectionDataType, DuplexEnum, EUInformation, ElementOperand, Encoder, EndpointConfiguration, EndpointDataType, EndpointDescription, EndpointType, EndpointUrlListDataType, EnumDefinition, EnumDescription, EnumField, EnumValueType, EphemeralKeyType, EventFieldList, EventFilter, EventFilterResult, EventNotificationList, ExceptionDeviationFormatEnum, ExpandedNodeId, ExtensionObject, FieldMetaData, FieldTargetDataType, FilterOperand, FilterOperatorEnum, FindServersOnNetworkRequest, FindServersOnNetworkResponse, FindServersRequest, FindServersResponse, Frame, GenericAttributeValue, GenericAttributes, GetEndpointsRequest, GetEndpointsResponse, HistoryData, HistoryEvent, HistoryEventFieldList, HistoryModifiedData, HistoryModifiedEvent, HistoryReadDetails, HistoryReadRequest, HistoryReadResponse, HistoryReadResult, HistoryReadValueId, HistoryUpdateDetails, HistoryUpdateRequest, HistoryUpdateResponse, HistoryUpdateResult, HistoryUpdateTypeEnum, IdTypeEnum, IdentityCriteriaTypeEnum, IdentityMappingRuleType, InstanceNode, InterfaceAdminStatusEnum, InterfaceOperStatusEnum, IssuedIdentityToken, JsonActionMetaDataMessage, JsonActionNetworkMessage, JsonActionRequestMessage, JsonActionResponderMessage, JsonActionResponseMessage, JsonApplicationDescriptionMessage, JsonDataSetMessage, JsonDataSetMetaDataMessage, JsonDataSetReaderMessageDataType, JsonDataSetWriterMessageDataType, JsonNetworkMessage, JsonPubSubConnectionMessage, JsonServerEndpointsMessage, JsonStatusMessage, JsonWriterGroupMessageDataType, KeyValuePair, LinearConversionDataType, LiteralOperand, LldpManagementAddressTxPortType, LldpManagementAddressType, LldpTlvType, LocalizedText, LogRecordsDataType, LoggerFactory, ManAddrIfSubtypeEnum, MdnsDiscoveryConfiguration, MessageSecurityModeEnum, MethodAttributes, MethodNode, ModelChangeStructureDataType, ModelChangeStructureVerbMaskEnum, ModificationInfo, ModifyMonitoredItemsRequest, ModifyMonitoredItemsResponse, ModifySubscriptionRequest, ModifySubscriptionResponse, MonitoredItemCreateRequest, MonitoredItemCreateResult, MonitoredItemModifyRequest, MonitoredItemModifyResult, MonitoredItemNotification, MonitoringFilter, MonitoringFilterResult, MonitoringModeEnum, MonitoringParameters, NameValuePair, NamingRuleTypeEnum, NegotiationStatusEnum, NetworkAddressDataType, NetworkAddressUrlDataType, NetworkGroupDataType, Node, NodeAttributes, NodeAttributesMaskEnum, NodeClassEnum, NodeId, NodeIdType, NodeReference, NodeTypeDescription, NotificationData, NotificationMessage, ObjectAttributes, ObjectNode, ObjectTypeAttributes, ObjectTypeNode, OpenFileModeEnum, OpenSecureChannelRequest, OpenSecureChannelResponse, OptionSet, Orientation, OverrideValueHandlingEnum, ParsingResult, PerformUpdateTypeEnum, PortIdSubtypeEnum, PortableNodeId, PortableQualifiedName, PriorityMappingEntryType, ProgramDiagnostic2DataType, ProgramDiagnosticDataType, PubSubConfiguration2DataType, PubSubConfigurationDataType, PubSubConfigurationRefDataType, PubSubConfigurationValueDataType, PubSubConnectionDataType, PubSubDiagnosticsCounterClassificationEnum, PubSubGroupDataType, PubSubKeyPushTargetDataType, PubSubStateEnum, PublishRequest, PublishResponse, PublishedActionDataType, PublishedActionMethodDataType, PublishedDataItemsDataType, PublishedDataSetCustomSourceDataType, PublishedDataSetDataType, PublishedDataSetSourceDataType, PublishedEventsDataType, PublishedVariableDataType, QosDataType, QualifiedName, QuantityDimension, QueryDataDescription, QueryDataSet, QueryFirstRequest, QueryFirstResponse, QueryNextRequest, QueryNextResponse, Range, RationalNumber, ReadAnnotationDataDetails, ReadAtTimeDetails, ReadEventDetails, ReadEventDetails2, ReadEventDetailsSorted, ReadProcessedDetails, ReadRawModifiedDetails, ReadRequest, ReadResponse, ReadValueId, ReaderGroupDataType, ReaderGroupMessageDataType, ReaderGroupTransportDataType, ReceiveQosDataType, ReceiveQosPriorityDataType, RedundancySupportEnum, RedundantServerDataType, RedundantServerModeEnum, ReferenceDescription, ReferenceDescriptionDataType, ReferenceListEntryDataType, ReferenceNode, ReferenceTypeAttributes, ReferenceTypeNode, RegisterNodesRequest, RegisterNodesResponse, RegisterServer2Request, RegisterServer2Response, RegisterServerRequest, RegisterServerResponse, RegisteredServer, RelativePath, RelativePathElement, RepublishRequest, RepublishResponse, RequestHeader, ResponseHeader, RolePermissionType, SamplingIntervalDiagnosticsDataType, SecureChannelChunkReader, SecureChannelChunkWriter, SecureChannelContext, SecureChannelFacade, SecureChannelMessageDecoder, SecureChannelMesssageEncoder, SecureChannelTypeDecoder, SecureChannelTypeEncoder, SecurityGroupDataType, SecuritySettingsDataType, SecurityTokenRequestTypeEnum, SemanticChangeStructureDataType, ServerDiagnosticsSummaryDataType, ServerEndpointDataType, ServerOnNetwork, ServerStateEnum, ServerStatusDataType, ServiceCertificateDataType, ServiceCounterDataType, ServiceFault, SessionDiagnosticsDataType, SessionSecurityDiagnosticsDataType, SessionlessInvokeRequestType, SessionlessInvokeResponseType, SetMonitoringModeRequest, SetMonitoringModeResponse, SetPublishingModeRequest, SetPublishingModeResponse, SetTriggeringRequest, SetTriggeringResponse, SignatureData, SignedSoftwareCertificate, SimpleAttributeOperand, SimpleTypeDescription, SortOrderTypeEnum, SortRuleElement, SpanContextDataType, StandaloneSubscribedDataSetDataType, StandaloneSubscribedDataSetRefDataType, StatusChangeNotification, StatusCode, StatusCodeGetFlagBits, StatusCodeIs, StatusCodeToString, StatusCodeToStringNumber, StatusResult, Structure, StructureDefinition, StructureDescription, StructureField, StructureTypeEnum, SubscribedDataSetDataType, SubscribedDataSetMirrorDataType, SubscriptionAcknowledgement, SubscriptionDiagnosticsDataType, TargetVariablesDataType, TcpConnectionHandler, TcpMessageDecoupler, TcpMessageInjector, TimeZoneDataType, TimestampsToReturnEnum, TraceContextDataType, TransactionErrorType, TransferResult, TransferSubscriptionsRequest, TransferSubscriptionsResponse, TranslateBrowsePathsToNodeIdsRequest, TranslateBrowsePathsToNodeIdsResponse, TransmitQosDataType, TransmitQosPriorityDataType, TrustListDataType, TrustListMasksEnum, TsnFailureCodeEnum, TsnListenerStatusEnum, TsnStreamStateEnum, TsnTalkerStatusEnum, TypeNode, UABinaryFileDataType, UadpDataSetReaderMessageDataType, UadpDataSetWriterMessageDataType, UadpWriterGroupMessageDataType, Union, UnregisterNodesRequest, UnregisterNodesResponse, UnsignedRationalNumber, UpdateDataDetails, UpdateEventDetails, UpdateStructureDataDetails, UserIdentityToken, UserManagementDataType, UserNameIdentityToken, UserTokenPolicy, UserTokenSettingsDataType, UserTokenTypeEnum, VariableAttributes, VariableNode, VariableTypeAttributes, VariableTypeNode, Variant, Vector, ViewAttributes, ViewDescription, ViewNode, WebSocketFascade, WebSocketReadableStream, WebSocketWritableStream, WriteRequest, WriteResponse, WriteValue, WriterGroupDataType, WriterGroupMessageDataType, WriterGroupTransportDataType, X509IdentityToken, XVType, XmlElement, _3DCartesianCoordinates, _3DFrame, _3DOrientation, _3DVector, getLogger, initLoggerProvider, registerBinaryDecoders, registerEncoders, registerJsonDecoders, registerTypeDecoders, registerXmlDecoders, uaByte, uaDouble, uaFloat, uaGuid, uaInt16, uaInt32, uaInt64, uaSbyte, uaUint16, uaUint32, uaUint64 };
17998
+ export { ActionMethodDataType, ActionStateEnum, ActionTargetDataType, ActivateSessionRequest, ActivateSessionResponse, AddNodesItem, AddNodesRequest, AddNodesResponse, AddNodesResult, AddReferencesItem, AddReferencesRequest, AddReferencesResponse, AdditionalParametersType, AggregateConfiguration, AggregateFilter, AggregateFilterResult, AliasNameDataType, Annotation, AnnotationDataType, AnonymousIdentityToken, ApplicationConfigurationDataType, ApplicationDescription, ApplicationIdentityDataType, ApplicationTypeEnum, Argument, AttributeOperand, AuthorizationServiceConfigurationDataType, AxisInformation, AxisScaleEnumerationEnum, BaseConfigurationDataType, BaseConfigurationRecordDataType, SecureChannelTypeDecoder as BinaryDecoderTransform, SecureChannelTypeEncoder as BinaryEncoderTransform, BinaryReader, BinaryWriter, BitFieldDefinition, BrokerConnectionTransportDataType, BrokerDataSetReaderTransportDataType, BrokerDataSetWriterTransportDataType, BrokerTransportQualityOfServiceEnum, BrokerWriterGroupTransportDataType, BrowseDescription, BrowseDirectionEnum, BrowseNextRequest, BrowseNextResponse, BrowsePath, BrowsePathResult, BrowsePathTarget, BrowseRequest, BrowseResponse, BrowseResult, BrowseResultMaskEnum, BuildInfo, CallMethodRequest, CallMethodResult, CallRequest, CallResponse, CancelRequest, CancelResponse, CartesianCoordinates, CertificateGroupDataType, ChannelSecurityToken, ChassisIdSubtypeEnum, CloseSecureChannelRequest, CloseSecureChannelResponse, CloseSessionRequest, CloseSessionResponse, ComplexNumberType, Configuration, ConfigurationUpdateTargetType, ConfigurationUpdateTypeEnum, ConfigurationVersionDataType, ConnectionTransportDataType, ConsoleSink, ContentFilter, ContentFilterElement, ContentFilterElementResult, ContentFilterResult, ConversionLimitEnumEnum, CreateMonitoredItemsRequest, CreateMonitoredItemsResponse, CreateSessionRequest, CreateSessionResponse, CreateSubscriptionRequest, CreateSubscriptionResponse, CurrencyUnitType, DataChangeFilter, DataChangeNotification, DataChangeTriggerEnum, DataSetMetaDataType, DataSetOrderingTypeEnum, DataSetReaderDataType, DataSetReaderMessageDataType, DataSetReaderTransportDataType, DataSetWriterDataType, DataSetWriterMessageDataType, DataSetWriterTransportDataType, DataTypeAttributes, DataTypeDefinition, DataTypeDescription, DataTypeNode, DataTypeSchemaHeader, DataValue, DatagramConnectionTransport2DataType, DatagramConnectionTransportDataType, DatagramDataSetReaderTransportDataType, DatagramWriterGroupTransport2DataType, DatagramWriterGroupTransportDataType, DeadbandTypeEnum, DecimalDataType, Decoder, DeleteAtTimeDetails, DeleteEventDetails, DeleteMonitoredItemsRequest, DeleteMonitoredItemsResponse, DeleteNodesItem, DeleteNodesRequest, DeleteNodesResponse, DeleteRawModifiedDetails, DeleteReferencesItem, DeleteReferencesRequest, DeleteReferencesResponse, DeleteSubscriptionsRequest, DeleteSubscriptionsResponse, DiagnosticInfo, DiagnosticsLevelEnum, DiscoveryConfiguration, DoubleComplexNumberType, DtlsPubSubConnectionDataType, DuplexEnum, EUInformation, ElementOperand, Encoder, EndpointConfiguration, EndpointDataType, EndpointDescription, EndpointType, EndpointUrlListDataType, EnumDefinition, EnumDescription, EnumField, EnumValueType, EphemeralKeyType, EventFieldList, EventFilter, EventFilterResult, EventNotificationList, ExceptionDeviationFormatEnum, ExpandedNodeId, ExtensionObject, FieldMetaData, FieldTargetDataType, FilterOperand, FilterOperatorEnum, FindServersOnNetworkRequest, FindServersOnNetworkResponse, FindServersRequest, FindServersResponse, Frame, GenericAttributeValue, GenericAttributes, GetEndpointsRequest, GetEndpointsResponse, HistoryData, HistoryEvent, HistoryEventFieldList, HistoryModifiedData, HistoryModifiedEvent, HistoryReadDetails, HistoryReadRequest, HistoryReadResponse, HistoryReadResult, HistoryReadValueId, HistoryUpdateDetails, HistoryUpdateRequest, HistoryUpdateResponse, HistoryUpdateResult, HistoryUpdateTypeEnum, IdTypeEnum, IdentityCriteriaTypeEnum, IdentityMappingRuleType, InstanceNode, InterfaceAdminStatusEnum, InterfaceOperStatusEnum, IssuedIdentityToken, JsonActionMetaDataMessage, JsonActionNetworkMessage, JsonActionRequestMessage, JsonActionResponderMessage, JsonActionResponseMessage, JsonApplicationDescriptionMessage, JsonDataSetMessage, JsonDataSetMetaDataMessage, JsonDataSetReaderMessageDataType, JsonDataSetWriterMessageDataType, JsonNetworkMessage, JsonPubSubConnectionMessage, JsonServerEndpointsMessage, JsonStatusMessage, JsonWriterGroupMessageDataType, KeyValuePair, LinearConversionDataType, LiteralOperand, LldpManagementAddressTxPortType, LldpManagementAddressType, LldpTlvType, LocalizedText, LogRecordsDataType, LoggerFactory, ManAddrIfSubtypeEnum, MdnsDiscoveryConfiguration, MessageSecurityModeEnum, MethodAttributes, MethodNode, ModelChangeStructureDataType, ModelChangeStructureVerbMaskEnum, ModificationInfo, ModifyMonitoredItemsRequest, ModifyMonitoredItemsResponse, ModifySubscriptionRequest, ModifySubscriptionResponse, MonitoredItemCreateRequest, MonitoredItemCreateResult, MonitoredItemModifyRequest, MonitoredItemModifyResult, MonitoredItemNotification, MonitoringFilter, MonitoringFilterResult, MonitoringModeEnum, MonitoringParameters, NameValuePair, NamingRuleTypeEnum, NegotiationStatusEnum, NetworkAddressDataType, NetworkAddressUrlDataType, NetworkGroupDataType, Node, NodeAttributes, NodeAttributesMaskEnum, NodeClassEnum, NodeId, NodeIdType, NodeReference, NodeTypeDescription, NotificationData, NotificationMessage, ObjectAttributes, ObjectNode, ObjectTypeAttributes, ObjectTypeNode, OpenFileModeEnum, OpenSecureChannelRequest, OpenSecureChannelResponse, OptionSet, Orientation, OverrideValueHandlingEnum, ParsingResult, PerformUpdateTypeEnum, PortIdSubtypeEnum, PortableNodeId, PortableQualifiedName, PriorityMappingEntryType, ProgramDiagnostic2DataType, ProgramDiagnosticDataType, PubSubConfiguration2DataType, PubSubConfigurationDataType, PubSubConfigurationRefDataType, PubSubConfigurationValueDataType, PubSubConnectionDataType, PubSubDiagnosticsCounterClassificationEnum, PubSubGroupDataType, PubSubKeyPushTargetDataType, PubSubStateEnum, PublishRequest, PublishResponse, PublishedActionDataType, PublishedActionMethodDataType, PublishedDataItemsDataType, PublishedDataSetCustomSourceDataType, PublishedDataSetDataType, PublishedDataSetSourceDataType, PublishedEventsDataType, PublishedVariableDataType, QosDataType, QualifiedName, QuantityDimension, QueryDataDescription, QueryDataSet, QueryFirstRequest, QueryFirstResponse, QueryNextRequest, QueryNextResponse, Range, RationalNumber, ReadAnnotationDataDetails, ReadAtTimeDetails, ReadEventDetails, ReadEventDetails2, ReadEventDetailsSorted, ReadProcessedDetails, ReadRawModifiedDetails, ReadRequest, ReadResponse, ReadValueId, ReaderGroupDataType, ReaderGroupMessageDataType, ReaderGroupTransportDataType, ReceiveQosDataType, ReceiveQosPriorityDataType, RedundancySupportEnum, RedundantServerDataType, RedundantServerModeEnum, ReferenceDescription, ReferenceDescriptionDataType, ReferenceListEntryDataType, ReferenceNode, ReferenceTypeAttributes, ReferenceTypeNode, RegisterNodesRequest, RegisterNodesResponse, RegisterServer2Request, RegisterServer2Response, RegisterServerRequest, RegisterServerResponse, RegisteredServer, RelativePath, RelativePathElement, RepublishRequest, RepublishResponse, RequestHeader, ResponseHeader, RolePermissionType, SamplingIntervalDiagnosticsDataType, SecureChannelChunkReader, SecureChannelChunkWriter, SecureChannelContext, SecureChannelFacade, SecureChannelMessageDecoder, SecureChannelMessageEncoder, SecureChannelTypeDecoder, SecureChannelTypeEncoder, SecurityGroupDataType, SecuritySettingsDataType, SecurityTokenRequestTypeEnum, SemanticChangeStructureDataType, ServerDiagnosticsSummaryDataType, ServerEndpointDataType, ServerOnNetwork, ServerStateEnum, ServerStatusDataType, ServiceCertificateDataType, ServiceCounterDataType, ServiceFault, SessionDiagnosticsDataType, SessionSecurityDiagnosticsDataType, SessionlessInvokeRequestType, SessionlessInvokeResponseType, SetMonitoringModeRequest, SetMonitoringModeResponse, SetPublishingModeRequest, SetPublishingModeResponse, SetTriggeringRequest, SetTriggeringResponse, SignatureData, SignedSoftwareCertificate, SimpleAttributeOperand, SimpleTypeDescription, SortOrderTypeEnum, SortRuleElement, SpanContextDataType, StandaloneSubscribedDataSetDataType, StandaloneSubscribedDataSetRefDataType, StatusChangeNotification, StatusCode, StatusCodeGetFlagBits, StatusCodeIs, StatusCodeToString, StatusCodeToStringNumber, StatusResult, Structure, StructureDefinition, StructureDescription, StructureField, StructureTypeEnum, SubscribedDataSetDataType, SubscribedDataSetMirrorDataType, SubscriptionAcknowledgement, SubscriptionDiagnosticsDataType, TargetVariablesDataType, TcpConnectionHandler, TcpMessageDecoupler, TcpMessageInjector, TimeZoneDataType, TimestampsToReturnEnum, TraceContextDataType, TransactionErrorType, TransferResult, TransferSubscriptionsRequest, TransferSubscriptionsResponse, TranslateBrowsePathsToNodeIdsRequest, TranslateBrowsePathsToNodeIdsResponse, TransmitQosDataType, TransmitQosPriorityDataType, TrustListDataType, TrustListMasksEnum, TsnFailureCodeEnum, TsnListenerStatusEnum, TsnStreamStateEnum, TsnTalkerStatusEnum, TypeNode, UABinaryFileDataType, UadpDataSetReaderMessageDataType, UadpDataSetWriterMessageDataType, UadpWriterGroupMessageDataType, Union, UnregisterNodesRequest, UnregisterNodesResponse, UnsignedRationalNumber, UpdateDataDetails, UpdateEventDetails, UpdateStructureDataDetails, UserIdentityToken, UserManagementDataType, UserNameIdentityToken, UserTokenPolicy, UserTokenSettingsDataType, UserTokenTypeEnum, VariableAttributes, VariableNode, VariableTypeAttributes, VariableTypeNode, Variant, Vector, ViewAttributes, ViewDescription, ViewNode, WebSocketFascade, WebSocketReadableStream, WebSocketWritableStream, WriteRequest, WriteResponse, WriteValue, WriterGroupDataType, WriterGroupMessageDataType, WriterGroupTransportDataType, X509IdentityToken, XVType, XmlElement, _3DCartesianCoordinates, _3DFrame, _3DOrientation, _3DVector, getLogger, initLoggerProvider, registerBinaryDecoders, registerEncoders, registerJsonDecoders, registerTypeDecoders, registerXmlDecoders, uaByte, uaDouble, uaFloat, uaGuid, uaInt16, uaInt32, uaInt64, uaSbyte, uaUint16, uaUint32, uaUint64 };
17867
17999
  //# sourceMappingURL=index.js.map
17868
18000
  //# sourceMappingURL=index.js.map