opcjs-base 0.1.39-alpha → 0.1.41-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.d.cts CHANGED
@@ -1655,7 +1655,7 @@ interface IWriter {
1655
1655
  * Binary: Int32 length prefix + bytes
1656
1656
  * @param value The byte array; null or undefined is encoded as length -1 (OPC UA null)
1657
1657
  */
1658
- writeByteString(value: Buffer | Uint8Array | null | undefined): void;
1658
+ writeByteString(value: Uint8Array | null | undefined): void;
1659
1659
  /**
1660
1660
  * Encode an XmlElement value.
1661
1661
  * Binary: Int32 length prefix + UTF-8 encoded XML
@@ -8281,13 +8281,14 @@ declare class SecureChannelMessageDecoder extends TransformStream<Uint8Array, Ms
8281
8281
  private context;
8282
8282
  private logger;
8283
8283
  /**
8284
- * Validates that `sequenceNumber` is monotonically increasing from the last
8285
- * seen remote sequence. Allows exactly one UInt32 wrap-around per token.
8284
+ * Validates that `sequenceNumber` is monotonically increasing from the
8285
+ * highest seen remote sequence. Allows UInt32 wrap-around per token.
8286
8286
  *
8287
- * Forward gaps are tolerated with a warning because some server implementations
8288
- * may consume sequence numbers internally (e.g. cancelled responses) without
8289
- * sending them on the wire. Backward jumps and duplicates are rejected as
8290
- * errors since they indicate replay or reordering.
8287
+ * Over TLS/WSS the transport already provides integrity and replay
8288
+ * protection, so small out-of-order deliveries (caused by multi-threaded
8289
+ * server writes) are tolerated with a warning rather than tearing down the
8290
+ * channel. Only truly anomalous conditions (e.g. a very large backward
8291
+ * jump that could indicate corruption) are treated as errors.
8291
8292
  */
8292
8293
  private validateSequenceNumber;
8293
8294
  private transform;
package/dist/index.d.ts CHANGED
@@ -1655,7 +1655,7 @@ interface IWriter {
1655
1655
  * Binary: Int32 length prefix + bytes
1656
1656
  * @param value The byte array; null or undefined is encoded as length -1 (OPC UA null)
1657
1657
  */
1658
- writeByteString(value: Buffer | Uint8Array | null | undefined): void;
1658
+ writeByteString(value: Uint8Array | null | undefined): void;
1659
1659
  /**
1660
1660
  * Encode an XmlElement value.
1661
1661
  * Binary: Int32 length prefix + UTF-8 encoded XML
@@ -8281,13 +8281,14 @@ declare class SecureChannelMessageDecoder extends TransformStream<Uint8Array, Ms
8281
8281
  private context;
8282
8282
  private logger;
8283
8283
  /**
8284
- * Validates that `sequenceNumber` is monotonically increasing from the last
8285
- * seen remote sequence. Allows exactly one UInt32 wrap-around per token.
8284
+ * Validates that `sequenceNumber` is monotonically increasing from the
8285
+ * highest seen remote sequence. Allows UInt32 wrap-around per token.
8286
8286
  *
8287
- * Forward gaps are tolerated with a warning because some server implementations
8288
- * may consume sequence numbers internally (e.g. cancelled responses) without
8289
- * sending them on the wire. Backward jumps and duplicates are rejected as
8290
- * errors since they indicate replay or reordering.
8287
+ * Over TLS/WSS the transport already provides integrity and replay
8288
+ * protection, so small out-of-order deliveries (caused by multi-threaded
8289
+ * server writes) are tolerated with a warning rather than tearing down the
8290
+ * channel. Only truly anomalous conditions (e.g. a very large backward
8291
+ * jump that could indicate corruption) are treated as errors.
8291
8292
  */
8292
8293
  private validateSequenceNumber;
8293
8294
  private transform;
package/dist/index.js CHANGED
@@ -84,9 +84,7 @@ var NodeId = class _NodeId {
84
84
  break;
85
85
  case 3 /* ByteString */:
86
86
  prefix = "b";
87
- if (typeof Buffer !== "undefined") {
88
- value = Buffer.from(this.identifier).toString("base64");
89
- } else {
87
+ {
90
88
  const bytes = this.identifier;
91
89
  let binary = "";
92
90
  for (let i = 0; i < bytes.length; i++) {
@@ -146,17 +144,14 @@ var NodeId = class _NodeId {
146
144
  case "g":
147
145
  return new _NodeId(namespace, value);
148
146
  // GUID as string
149
- case "b":
150
- if (typeof Buffer !== "undefined") {
151
- return new _NodeId(namespace, new Uint8Array(Buffer.from(value, "base64")));
152
- } else {
153
- const binary = atob(value);
154
- const bytes = new Uint8Array(binary.length);
155
- for (let i = 0; i < binary.length; i++) {
156
- bytes[i] = binary.charCodeAt(i);
157
- }
158
- return new _NodeId(namespace, bytes);
147
+ case "b": {
148
+ const binary = atob(value);
149
+ const bytes = new Uint8Array(binary.length);
150
+ for (let i = 0; i < binary.length; i++) {
151
+ bytes[i] = binary.charCodeAt(i);
159
152
  }
153
+ return new _NodeId(namespace, bytes);
154
+ }
160
155
  default:
161
156
  throw new Error(`Unknown NodeId type: ${type}`);
162
157
  }
@@ -316,9 +311,7 @@ var CodecError = class _CodecError extends Error {
316
311
  this.suggestedAction = options?.suggestedAction;
317
312
  this.typeName = options?.typeName;
318
313
  this.cause = options?.cause;
319
- if (Error.captureStackTrace) {
320
- Error.captureStackTrace(this, _CodecError);
321
- }
314
+ Error.captureStackTrace?.(this, _CodecError);
322
315
  }
323
316
  /**
324
317
  * Returns a detailed error message including all context.
@@ -901,7 +894,10 @@ var XmlReader = class {
901
894
  const text = this.getTextContent();
902
895
  if (text === "") return null;
903
896
  try {
904
- return Buffer.from(text, "base64");
897
+ const binary = atob(text);
898
+ const bytes = new Uint8Array(binary.length);
899
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
900
+ return bytes;
905
901
  } catch {
906
902
  throw new CodecError(`Invalid Base64 ByteString: ${text}`);
907
903
  }
@@ -16601,10 +16597,12 @@ var UserTokenTypeEnum = /* @__PURE__ */ ((UserTokenTypeEnum2) => {
16601
16597
 
16602
16598
  // src/utils/logger/consoleSink.ts
16603
16599
  function isNodeLike() {
16604
- return typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions?.node !== "undefined";
16600
+ const g = globalThis;
16601
+ return typeof g.process !== "undefined" && typeof g.process?.versions !== "undefined" && typeof g.process?.versions?.node !== "undefined";
16605
16602
  }
16606
16603
  function supportsAnsiColors() {
16607
- return isNodeLike() && !!process.stdout?.isTTY;
16604
+ const g = globalThis;
16605
+ return isNodeLike() && !!g.process?.stdout?.isTTY;
16608
16606
  }
16609
16607
  function pad2(n) {
16610
16608
  return n < 10 ? `0${n}` : `${n}`;
@@ -17868,15 +17866,16 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17868
17866
  }
17869
17867
  logger = getLogger("secureChannel.SecureChannelMessageDecoder");
17870
17868
  /**
17871
- * Validates that `sequenceNumber` is monotonically increasing from the last
17872
- * seen remote sequence. Allows exactly one UInt32 wrap-around per token.
17869
+ * Validates that `sequenceNumber` is monotonically increasing from the
17870
+ * highest seen remote sequence. Allows UInt32 wrap-around per token.
17873
17871
  *
17874
- * Forward gaps are tolerated with a warning because some server implementations
17875
- * may consume sequence numbers internally (e.g. cancelled responses) without
17876
- * sending them on the wire. Backward jumps and duplicates are rejected as
17877
- * errors since they indicate replay or reordering.
17872
+ * Over TLS/WSS the transport already provides integrity and replay
17873
+ * protection, so small out-of-order deliveries (caused by multi-threaded
17874
+ * server writes) are tolerated with a warning rather than tearing down the
17875
+ * channel. Only truly anomalous conditions (e.g. a very large backward
17876
+ * jump that could indicate corruption) are treated as errors.
17878
17877
  */
17879
- validateSequenceNumber(sequenceNumber, msgType, controller) {
17878
+ validateSequenceNumber(sequenceNumber, msgType) {
17880
17879
  const last = this.context.lastRemoteSequenceNumber;
17881
17880
  if (last === void 0) {
17882
17881
  this.context.lastRemoteSequenceNumber = sequenceNumber;
@@ -17884,18 +17883,22 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17884
17883
  return true;
17885
17884
  }
17886
17885
  const isWrap = last >= SEQ_WRAP_THRESHOLD2 && sequenceNumber < SEQ_WRAP_MAX;
17887
- const isForward = sequenceNumber > last;
17888
- if (!isForward && !isWrap) {
17889
- this.logger.error(`[${msgType}] Invalid remote sequence number: expected > ${last}, got ${sequenceNumber}`);
17890
- controller.error(new Error(`Invalid remote sequence number: expected > ${last}, got ${sequenceNumber}`));
17891
- return false;
17886
+ if (isWrap) {
17887
+ this.context.lastRemoteSequenceNumber = sequenceNumber;
17888
+ this.logger.debug(`[${msgType}] Sequence number wrapped: ${last} \u2192 ${sequenceNumber}`);
17889
+ return true;
17892
17890
  }
17893
- if (sequenceNumber !== last + 1 && !isWrap) {
17894
- this.logger.warn(`[${msgType}] Remote sequence number gap: expected ${last + 1}, got ${sequenceNumber} (skipped ${sequenceNumber - last - 1})`);
17895
- } else {
17891
+ if (sequenceNumber === last + 1) {
17892
+ this.context.lastRemoteSequenceNumber = sequenceNumber;
17896
17893
  this.logger.debug(`[${msgType}] Sequence number advanced: ${last} \u2192 ${sequenceNumber}`);
17894
+ return true;
17895
+ }
17896
+ if (sequenceNumber > last + 1) {
17897
+ this.logger.warn(`[${msgType}] Remote sequence number gap: expected ${last + 1}, got ${sequenceNumber} (skipped ${sequenceNumber - last - 1})`);
17898
+ this.context.lastRemoteSequenceNumber = sequenceNumber;
17899
+ return true;
17897
17900
  }
17898
- this.context.lastRemoteSequenceNumber = sequenceNumber;
17901
+ this.logger.warn(`[${msgType}] Out-of-order remote sequence number: highest seen ${last}, got ${sequenceNumber}`);
17899
17902
  return true;
17900
17903
  }
17901
17904
  transform(data, controller) {
@@ -17912,7 +17915,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17912
17915
  secHeader,
17913
17916
  this.context.securityAlgorithm
17914
17917
  );
17915
- if (!this.validateSequenceNumber(msgAsym.sequenceHeader.sequenceNumber, "OPN", controller)) return;
17918
+ if (!this.validateSequenceNumber(msgAsym.sequenceHeader.sequenceNumber, "OPN")) return;
17916
17919
  controller.enqueue(msgAsym);
17917
17920
  break;
17918
17921
  }
@@ -17920,7 +17923,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17920
17923
  this.logger.warn("SecureChannel received Abort message");
17921
17924
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17922
17925
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17923
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-A", controller)) return;
17926
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-A")) return;
17924
17927
  controller.enqueue(msgSym);
17925
17928
  break;
17926
17929
  }
@@ -17928,7 +17931,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17928
17931
  this.logger.debug("SecureChannel received Chunk message.");
17929
17932
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17930
17933
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17931
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-C", controller)) return;
17934
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-C")) return;
17932
17935
  controller.enqueue(msgSym);
17933
17936
  break;
17934
17937
  }
@@ -17936,7 +17939,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17936
17939
  this.logger.debug("SecureChannel received Final message");
17937
17940
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17938
17941
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17939
- if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-F", controller)) return;
17942
+ if (!this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "MSG-F")) return;
17940
17943
  controller.enqueue(msgSym);
17941
17944
  break;
17942
17945
  }
@@ -17944,7 +17947,7 @@ var SecureChannelMessageDecoder = class extends TransformStream {
17944
17947
  this.logger.warn("SecureChannel received CloseFinal message.");
17945
17948
  const secHeader = MsgSecurityHeaderSymmetric.decode(buffer);
17946
17949
  const msgSym = MsgSymmetric.decode(buffer, header, secHeader, this.context.securityAlgorithm);
17947
- this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "CLO-F", controller);
17950
+ this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "CLO-F");
17948
17951
  break;
17949
17952
  }
17950
17953
  default: