opcjs-base 0.1.39-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,15 +17870,16 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17870
17870
  }
17871
17871
  logger = getLogger("secureChannel.SecureChannelMessageDecoder");
17872
17872
  /**
17873
- * Validates that `sequenceNumber` is monotonically increasing from the last
17874
- * seen remote sequence. Allows exactly one UInt32 wrap-around per token.
17873
+ * Validates that `sequenceNumber` is monotonically increasing from the
17874
+ * highest seen remote sequence. Allows UInt32 wrap-around per token.
17875
17875
  *
17876
- * Forward gaps are tolerated with a warning because some server implementations
17877
- * may consume sequence numbers internally (e.g. cancelled responses) without
17878
- * sending them on the wire. Backward jumps and duplicates are rejected as
17879
- * errors since they indicate replay or reordering.
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.
17880
17881
  */
17881
- validateSequenceNumber(sequenceNumber, msgType, controller) {
17882
+ validateSequenceNumber(sequenceNumber, msgType) {
17882
17883
  const last = this.context.lastRemoteSequenceNumber;
17883
17884
  if (last === void 0) {
17884
17885
  this.context.lastRemoteSequenceNumber = sequenceNumber;
@@ -17886,18 +17887,22 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17886
17887
  return true;
17887
17888
  }
17888
17889
  const isWrap = last >= SEQ_WRAP_THRESHOLD2 && sequenceNumber < SEQ_WRAP_MAX;
17889
- const isForward = sequenceNumber > last;
17890
- if (!isForward && !isWrap) {
17891
- this.logger.error(`[${msgType}] Invalid remote sequence number: expected > ${last}, got ${sequenceNumber}`);
17892
- controller.error(new Error(`Invalid remote sequence number: expected > ${last}, got ${sequenceNumber}`));
17893
- 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
17894
  }
17895
- if (sequenceNumber !== last + 1 && !isWrap) {
17896
- this.logger.warn(`[${msgType}] Remote sequence number gap: expected ${last + 1}, got ${sequenceNumber} (skipped ${sequenceNumber - last - 1})`);
17897
- } else {
17895
+ if (sequenceNumber === last + 1) {
17896
+ this.context.lastRemoteSequenceNumber = sequenceNumber;
17898
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;
17899
17904
  }
17900
- this.context.lastRemoteSequenceNumber = sequenceNumber;
17905
+ this.logger.warn(`[${msgType}] Out-of-order remote sequence number: highest seen ${last}, got ${sequenceNumber}`);
17901
17906
  return true;
17902
17907
  }
17903
17908
  transform(data, controller) {
@@ -17914,7 +17919,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17914
17919
  secHeader,
17915
17920
  this.context.securityAlgorithm
17916
17921
  );
17917
- if (!this.validateSequenceNumber(msgAsym.sequenceHeader.sequenceNumber, "OPN", controller)) return;
17922
+ if (!this.validateSequenceNumber(msgAsym.sequenceHeader.sequenceNumber, "OPN")) return;
17918
17923
  controller.enqueue(msgAsym);
17919
17924
  break;
17920
17925
  }
@@ -17922,7 +17927,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17922
17927
  this.logger.warn("SecureChannel received Abort message");
17923
17928
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17924
17929
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17925
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-A", controller)) return;
17930
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-A")) return;
17926
17931
  controller.enqueue(msgSym);
17927
17932
  break;
17928
17933
  }
@@ -17930,7 +17935,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17930
17935
  this.logger.debug("SecureChannel received Chunk message.");
17931
17936
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17932
17937
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17933
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-C", controller)) return;
17938
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-C")) return;
17934
17939
  controller.enqueue(msgSym);
17935
17940
  break;
17936
17941
  }
@@ -17938,7 +17943,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17938
17943
  this.logger.debug("SecureChannel received Final message");
17939
17944
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17940
17945
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17941
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-F", controller)) return;
17946
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-F")) return;
17942
17947
  controller.enqueue(msgSym);
17943
17948
  break;
17944
17949
  }
@@ -17946,7 +17951,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17946
17951
  this.logger.warn("SecureChannel received CloseFinal message.");
17947
17952
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17948
17953
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17949
- this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "CLO-F", controller);
17954
+ this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "CLO-F");
17950
17955
  break;
17951
17956
  }
17952
17957
  default: