opcjs-base 0.1.38-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,9 +17870,13 @@ 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
17881
  validateSequenceNumber(sequenceNumber, msgType, controller) {
17878
17882
  const last = this.context.lastRemoteSequenceNumber;
@@ -17881,14 +17885,18 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17881
17885
  this.logger.debug(`[${msgType}] Sequence number initialized to ${sequenceNumber}`);
17882
17886
  return true;
17883
17887
  }
17884
- const isIncrement = sequenceNumber === last + 1;
17885
17888
  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
+ 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}`));
17889
17893
  return false;
17890
17894
  }
17891
- this.logger.debug(`[${msgType}] Sequence number advanced: ${last} \u2192 ${sequenceNumber}`);
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
+ }
17892
17900
  this.context.lastRemoteSequenceNumber = sequenceNumber;
17893
17901
  return true;
17894
17902
  }