opcjs-base 0.1.38-alpha → 0.1.40-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.cjs CHANGED
@@ -17870,26 +17870,39 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17870
17870
  }
17871
17871
  logger = getLogger("secureChannel.SecureChannelMessageDecoder");
17872
17872
  /**
17873
- * Validates that `sequenceNumber` is strictly increasing from the last
17874
- * seen remote sequence. Allows exactly one UInt32 wrap-around per token.
17875
- * Returns false and logs an error if the number is a duplicate or out of order.
17873
+ * Validates that `sequenceNumber` is monotonically increasing from the
17874
+ * highest seen remote sequence. Allows UInt32 wrap-around per token.
17875
+ *
17876
+ * Over TLS/WSS the transport already provides integrity and replay
17877
+ * protection, so small out-of-order deliveries (caused by multi-threaded
17878
+ * server writes) are tolerated with a warning rather than tearing down the
17879
+ * channel. Only truly anomalous conditions (e.g. a very large backward
17880
+ * jump that could indicate corruption) are treated as errors.
17876
17881
  */
17877
- validateSequenceNumber(sequenceNumber, msgType, controller) {
17882
+ validateSequenceNumber(sequenceNumber, msgType) {
17878
17883
  const last = this.context.lastRemoteSequenceNumber;
17879
17884
  if (last === void 0) {
17880
17885
  this.context.lastRemoteSequenceNumber = sequenceNumber;
17881
17886
  this.logger.debug(`[${msgType}] Sequence number initialized to ${sequenceNumber}`);
17882
17887
  return true;
17883
17888
  }
17884
- const isIncrement = sequenceNumber === last + 1;
17885
17889
  const isWrap = last >= SEQ_WRAP_THRESHOLD2 && sequenceNumber < SEQ_WRAP_MAX;
17886
- if (!isIncrement && !isWrap) {
17887
- this.logger.error(`[${msgType}] Invalid remote sequence number: expected ${last + 1}, got ${sequenceNumber}`);
17888
- controller.error(new Error(`Invalid remote sequence number: expected ${last + 1}, got ${sequenceNumber}`));
17889
- return false;
17890
+ if (isWrap) {
17891
+ this.context.lastRemoteSequenceNumber = sequenceNumber;
17892
+ this.logger.debug(`[${msgType}] Sequence number wrapped: ${last} \u2192 ${sequenceNumber}`);
17893
+ return true;
17894
+ }
17895
+ if (sequenceNumber === last + 1) {
17896
+ this.context.lastRemoteSequenceNumber = sequenceNumber;
17897
+ this.logger.debug(`[${msgType}] Sequence number advanced: ${last} \u2192 ${sequenceNumber}`);
17898
+ return true;
17899
+ }
17900
+ if (sequenceNumber > last + 1) {
17901
+ this.logger.warn(`[${msgType}] Remote sequence number gap: expected ${last + 1}, got ${sequenceNumber} (skipped ${sequenceNumber - last - 1})`);
17902
+ this.context.lastRemoteSequenceNumber = sequenceNumber;
17903
+ return true;
17890
17904
  }
17891
- this.logger.debug(`[${msgType}] Sequence number advanced: ${last} \u2192 ${sequenceNumber}`);
17892
- this.context.lastRemoteSequenceNumber = sequenceNumber;
17905
+ this.logger.warn(`[${msgType}] Out-of-order remote sequence number: highest seen ${last}, got ${sequenceNumber}`);
17893
17906
  return true;
17894
17907
  }
17895
17908
  transform(data, controller) {
@@ -17906,7 +17919,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17906
17919
  secHeader,
17907
17920
  this.context.securityAlgorithm
17908
17921
  );
17909
- if (!this.validateSequenceNumber(msgAsym.sequenceHeader.sequenceNumber, "OPN", controller)) return;
17922
+ if (!this.validateSequenceNumber(msgAsym.sequenceHeader.sequenceNumber, "OPN")) return;
17910
17923
  controller.enqueue(msgAsym);
17911
17924
  break;
17912
17925
  }
@@ -17914,7 +17927,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17914
17927
  this.logger.warn("SecureChannel received Abort message");
17915
17928
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17916
17929
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17917
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-A", controller)) return;
17930
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-A")) return;
17918
17931
  controller.enqueue(msgSym);
17919
17932
  break;
17920
17933
  }
@@ -17922,7 +17935,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17922
17935
  this.logger.debug("SecureChannel received Chunk message.");
17923
17936
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17924
17937
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17925
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-C", controller)) return;
17938
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-C")) return;
17926
17939
  controller.enqueue(msgSym);
17927
17940
  break;
17928
17941
  }
@@ -17930,7 +17943,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17930
17943
  this.logger.debug("SecureChannel received Final message");
17931
17944
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17932
17945
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17933
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-F", controller)) return;
17946
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-F")) return;
17934
17947
  controller.enqueue(msgSym);
17935
17948
  break;
17936
17949
  }
@@ -17938,7 +17951,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17938
17951
  this.logger.warn("SecureChannel received CloseFinal message.");
17939
17952
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17940
17953
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17941
- this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "CLO-F", controller);
17954
+ this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "CLO-F");
17942
17955
  break;
17943
17956
  }
17944
17957
  default: