@calimero-network/mero-js 19.24.0 → 19.24.1
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.browser.mjs +2 -2
- package/dist/index.browser.mjs.map +3 -3
- package/dist/index.cjs +35 -3
- package/dist/index.cjs.map +2 -2
- package/dist/index.mjs +35 -3
- package/dist/index.mjs.map +2 -2
- package/dist/sealed/sealed.d.ts +5 -1
- package/dist/sealed/sealed.js +50 -3
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -6654,6 +6654,8 @@ var HEADER_LEN = 1 + SESSION_ID_LEN + 8;
|
|
|
6654
6654
|
var FRAME_HEAD = 0;
|
|
6655
6655
|
var FRAME_DATA = 1;
|
|
6656
6656
|
var FRAME_END = 2;
|
|
6657
|
+
var MAX_FRAME_LEN = 1 + 64 * 1024 + 16;
|
|
6658
|
+
var MAX_HANDSHAKE_REPLY = 1024;
|
|
6657
6659
|
var RENEW_BEFORE_MS = 6e4;
|
|
6658
6660
|
var TRANSPORT_BINDING_DOMAIN = "calimero.tee-attest.transport-key.v1";
|
|
6659
6661
|
var NULL_BODY_STATUSES = [101, 204, 205, 304];
|
|
@@ -6665,10 +6667,11 @@ var StaleTransportKeyError = class extends Error {
|
|
|
6665
6667
|
}
|
|
6666
6668
|
};
|
|
6667
6669
|
var SealedTransportError = class extends Error {
|
|
6668
|
-
constructor(status, code, message) {
|
|
6670
|
+
constructor(status, code, message, retryAfterMs) {
|
|
6669
6671
|
super(message);
|
|
6670
6672
|
this.status = status;
|
|
6671
6673
|
this.code = code;
|
|
6674
|
+
this.retryAfterMs = retryAfterMs;
|
|
6672
6675
|
this.name = "SealedTransportError";
|
|
6673
6676
|
}
|
|
6674
6677
|
};
|
|
@@ -6772,6 +6775,15 @@ async function checkedKey(key) {
|
|
|
6772
6775
|
return bytes;
|
|
6773
6776
|
}
|
|
6774
6777
|
async function handshake(baseFetch, nodeUrl, transportKey) {
|
|
6778
|
+
try {
|
|
6779
|
+
return await handshakeOnce(baseFetch, nodeUrl, transportKey);
|
|
6780
|
+
} catch (error) {
|
|
6781
|
+
if (!(error instanceof SealedTransportError) || error.code !== "busy") throw error;
|
|
6782
|
+
await new Promise((resolve) => setTimeout(resolve, error.retryAfterMs ?? 1e3));
|
|
6783
|
+
return handshakeOnce(baseFetch, nodeUrl, transportKey);
|
|
6784
|
+
}
|
|
6785
|
+
}
|
|
6786
|
+
async function handshakeOnce(baseFetch, nodeUrl, transportKey) {
|
|
6775
6787
|
const noise = await initiate(transportKey, PROLOGUE);
|
|
6776
6788
|
const response = await baseFetch(`${nodeUrl}${HANDSHAKE_PATH}`, {
|
|
6777
6789
|
method: "POST",
|
|
@@ -6781,7 +6793,7 @@ async function handshake(baseFetch, nodeUrl, transportKey) {
|
|
|
6781
6793
|
if (response.headers.get("content-type") !== SEALED_CONTENT_TYPE) {
|
|
6782
6794
|
throw await envelopeRefusal(response);
|
|
6783
6795
|
}
|
|
6784
|
-
const reply =
|
|
6796
|
+
const reply = await readAtMost(response, MAX_HANDSHAKE_REPLY);
|
|
6785
6797
|
return sessionFrom(noise, reply);
|
|
6786
6798
|
}
|
|
6787
6799
|
async function sessionFrom(noise, reply) {
|
|
@@ -6907,6 +6919,10 @@ function frameReader(reader) {
|
|
|
6907
6919
|
async next() {
|
|
6908
6920
|
if (!await fill(4)) return null;
|
|
6909
6921
|
const length = new DataView(buffer.buffer, buffer.byteOffset).getUint32(0, false);
|
|
6922
|
+
if (length > MAX_FRAME_LEN) {
|
|
6923
|
+
await reader.cancel();
|
|
6924
|
+
throw new Error("The sealed response is malformed: a frame is larger than the node sends");
|
|
6925
|
+
}
|
|
6910
6926
|
if (!await fill(4 + length)) return null;
|
|
6911
6927
|
const frame = buffer.slice(4, 4 + length);
|
|
6912
6928
|
buffer = buffer.slice(4 + length);
|
|
@@ -6915,6 +6931,20 @@ function frameReader(reader) {
|
|
|
6915
6931
|
cancel: () => reader.cancel()
|
|
6916
6932
|
};
|
|
6917
6933
|
}
|
|
6934
|
+
async function readAtMost(response, limit) {
|
|
6935
|
+
if (!response.body) return new Uint8Array();
|
|
6936
|
+
const reader = response.body.getReader();
|
|
6937
|
+
let bytes = new Uint8Array();
|
|
6938
|
+
for (; ; ) {
|
|
6939
|
+
const { done, value } = await reader.read();
|
|
6940
|
+
if (done) return bytes;
|
|
6941
|
+
bytes = concat(bytes, value);
|
|
6942
|
+
if (bytes.length > limit) {
|
|
6943
|
+
await reader.cancel();
|
|
6944
|
+
throw new Error("The handshake reply is malformed: it is too long");
|
|
6945
|
+
}
|
|
6946
|
+
}
|
|
6947
|
+
}
|
|
6918
6948
|
async function envelopeRefusal(response) {
|
|
6919
6949
|
let code;
|
|
6920
6950
|
let message = `Sealed request refused: HTTP ${response.status}`;
|
|
@@ -6925,7 +6955,9 @@ async function envelopeRefusal(response) {
|
|
|
6925
6955
|
} catch {
|
|
6926
6956
|
}
|
|
6927
6957
|
if (code === "stale_transport_key") return new StaleTransportKeyError();
|
|
6928
|
-
|
|
6958
|
+
const retryAfter = Number(response.headers.get("retry-after"));
|
|
6959
|
+
const retryAfterMs = Number.isFinite(retryAfter) && retryAfter > 0 ? Math.min(retryAfter, 5) * 1e3 : void 0;
|
|
6960
|
+
return new SealedTransportError(response.status, code, message, retryAfterMs);
|
|
6929
6961
|
}
|
|
6930
6962
|
|
|
6931
6963
|
// src/namespace-op/namespace-op.ts
|