opcjs-base 0.1.37-alpha → 0.1.39-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,23 +17870,33 @@ 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
17873
+ * Validates that `sequenceNumber` is monotonically increasing from the last
17874
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.
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
17880
  */
17877
- validateSequenceNumber(sequenceNumber, controller) {
17881
+ validateSequenceNumber(sequenceNumber, msgType, controller) {
17878
17882
  const last = this.context.lastRemoteSequenceNumber;
17879
17883
  if (last === void 0) {
17880
17884
  this.context.lastRemoteSequenceNumber = sequenceNumber;
17885
+ this.logger.debug(`[${msgType}] Sequence number initialized to ${sequenceNumber}`);
17881
17886
  return true;
17882
17887
  }
17883
- const isIncrement = sequenceNumber === last + 1;
17884
17888
  const isWrap = last >= SEQ_WRAP_THRESHOLD2 && sequenceNumber < SEQ_WRAP_MAX;
17885
- if (!isIncrement && !isWrap) {
17886
- this.logger.error(`Invalid remote sequence number: expected ${last + 1}, got ${sequenceNumber}`);
17887
- controller.error(new Error(`Invalid remote sequence number: expected ${last + 1}, got ${sequenceNumber}`));
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}`));
17888
17893
  return false;
17889
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 {
17898
+ this.logger.debug(`[${msgType}] Sequence number advanced: ${last} \u2192 ${sequenceNumber}`);
17899
+ }
17890
17900
  this.context.lastRemoteSequenceNumber = sequenceNumber;
17891
17901
  return true;
17892
17902
  }
@@ -17904,8 +17914,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17904
17914
  secHeader,
17905
17915
  this.context.securityAlgorithm
17906
17916
  );
17907
- this.context.lastRemoteSequenceNumber = void 0;
17908
- if (!this.validateSequenceNumber(msgAsym.sequenceHeader.sequenceNumber, controller)) return;
17917
+ if (!this.validateSequenceNumber(msgAsym.sequenceHeader.sequenceNumber, "OPN", controller)) return;
17909
17918
  controller.enqueue(msgAsym);
17910
17919
  break;
17911
17920
  }
@@ -17913,7 +17922,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17913
17922
  this.logger.warn("SecureChannel received Abort message");
17914
17923
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17915
17924
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17916
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, controller)) return;
17925
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-A", controller)) return;
17917
17926
  controller.enqueue(msgSym);
17918
17927
  break;
17919
17928
  }
@@ -17921,7 +17930,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17921
17930
  this.logger.debug("SecureChannel received Chunk message.");
17922
17931
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17923
17932
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17924
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, controller)) return;
17933
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-C", controller)) return;
17925
17934
  controller.enqueue(msgSym);
17926
17935
  break;
17927
17936
  }
@@ -17929,7 +17938,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17929
17938
  this.logger.debug("SecureChannel received Final message");
17930
17939
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17931
17940
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17932
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, controller)) return;
17941
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-F", controller)) return;
17933
17942
  controller.enqueue(msgSym);
17934
17943
  break;
17935
17944
  }
@@ -17937,7 +17946,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17937
17946
  this.logger.warn("SecureChannel received CloseFinal message.");
17938
17947
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17939
17948
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17940
- this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, controller);
17949
+ this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "CLO-F", controller);
17941
17950
  break;
17942
17951
  }
17943
17952
  default: