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.cjs +43 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -7
- package/dist/index.d.ts +8 -7
- package/dist/index.js +43 -40
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
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:
|
|
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
|
|
8285
|
-
* seen remote sequence. Allows
|
|
8284
|
+
* Validates that `sequenceNumber` is monotonically increasing from the
|
|
8285
|
+
* highest seen remote sequence. Allows UInt32 wrap-around per token.
|
|
8286
8286
|
*
|
|
8287
|
-
*
|
|
8288
|
-
*
|
|
8289
|
-
*
|
|
8290
|
-
*
|
|
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:
|
|
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
|
|
8285
|
-
* seen remote sequence. Allows
|
|
8284
|
+
* Validates that `sequenceNumber` is monotonically increasing from the
|
|
8285
|
+
* highest seen remote sequence. Allows UInt32 wrap-around per token.
|
|
8286
8286
|
*
|
|
8287
|
-
*
|
|
8288
|
-
*
|
|
8289
|
-
*
|
|
8290
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
17872
|
-
* seen remote sequence. Allows
|
|
17869
|
+
* Validates that `sequenceNumber` is monotonically increasing from the
|
|
17870
|
+
* highest seen remote sequence. Allows UInt32 wrap-around per token.
|
|
17873
17871
|
*
|
|
17874
|
-
*
|
|
17875
|
-
*
|
|
17876
|
-
*
|
|
17877
|
-
*
|
|
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
|
|
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
|
-
|
|
17888
|
-
|
|
17889
|
-
this.logger.
|
|
17890
|
-
|
|
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
|
|
17894
|
-
this.
|
|
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.
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
17950
|
+
this.validateSequenceNumber(msgSym.sequenceHeader.sequenceNumber, "CLO-F");
|
|
17948
17951
|
break;
|
|
17949
17952
|
}
|
|
17950
17953
|
default:
|