@calimero-network/mero-js 19.23.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.cjs CHANGED
@@ -1783,6 +1783,15 @@ var AdminApiClient = class {
1783
1783
  async setTeeAuthoringPolicy(groupId, request) {
1784
1784
  await this.httpClient.put(`/admin-api/groups/${groupId}/settings/tee-authoring-policy`, request);
1785
1785
  }
1786
+ /**
1787
+ * Turns TEE authorship off in the namespace: every TEE loses its authority,
1788
+ * and admitted TEEs stay members. The node applies the same op as
1789
+ * `setTeeAuthoringPolicy(groupId, { allowedMrtd: [] })`. `groupId` must be a
1790
+ * namespace root.
1791
+ */
1792
+ async disableTeeAuthoringPolicy(groupId) {
1793
+ await this.httpClient.delete(`/admin-api/groups/${groupId}/settings/tee-authoring-policy`);
1794
+ }
1786
1795
  // ---- Group / member / context metadata ----
1787
1796
  async setGroupMetadata(groupId, request) {
1788
1797
  await this.httpClient.put(`/admin-api/groups/${groupId}/metadata`, request);
@@ -6751,6 +6760,8 @@ var HEADER_LEN = 1 + SESSION_ID_LEN + 8;
6751
6760
  var FRAME_HEAD = 0;
6752
6761
  var FRAME_DATA = 1;
6753
6762
  var FRAME_END = 2;
6763
+ var MAX_FRAME_LEN = 1 + 64 * 1024 + 16;
6764
+ var MAX_HANDSHAKE_REPLY = 1024;
6754
6765
  var RENEW_BEFORE_MS = 6e4;
6755
6766
  var TRANSPORT_BINDING_DOMAIN = "calimero.tee-attest.transport-key.v1";
6756
6767
  var NULL_BODY_STATUSES = [101, 204, 205, 304];
@@ -6762,10 +6773,11 @@ var StaleTransportKeyError = class extends Error {
6762
6773
  }
6763
6774
  };
6764
6775
  var SealedTransportError = class extends Error {
6765
- constructor(status, code, message) {
6776
+ constructor(status, code, message, retryAfterMs) {
6766
6777
  super(message);
6767
6778
  this.status = status;
6768
6779
  this.code = code;
6780
+ this.retryAfterMs = retryAfterMs;
6769
6781
  this.name = "SealedTransportError";
6770
6782
  }
6771
6783
  };
@@ -6869,6 +6881,15 @@ async function checkedKey(key) {
6869
6881
  return bytes;
6870
6882
  }
6871
6883
  async function handshake(baseFetch, nodeUrl, transportKey) {
6884
+ try {
6885
+ return await handshakeOnce(baseFetch, nodeUrl, transportKey);
6886
+ } catch (error) {
6887
+ if (!(error instanceof SealedTransportError) || error.code !== "busy") throw error;
6888
+ await new Promise((resolve) => setTimeout(resolve, error.retryAfterMs ?? 1e3));
6889
+ return handshakeOnce(baseFetch, nodeUrl, transportKey);
6890
+ }
6891
+ }
6892
+ async function handshakeOnce(baseFetch, nodeUrl, transportKey) {
6872
6893
  const noise = await initiate(transportKey, PROLOGUE);
6873
6894
  const response = await baseFetch(`${nodeUrl}${HANDSHAKE_PATH}`, {
6874
6895
  method: "POST",
@@ -6878,7 +6899,7 @@ async function handshake(baseFetch, nodeUrl, transportKey) {
6878
6899
  if (response.headers.get("content-type") !== SEALED_CONTENT_TYPE) {
6879
6900
  throw await envelopeRefusal(response);
6880
6901
  }
6881
- const reply = new Uint8Array(await response.arrayBuffer());
6902
+ const reply = await readAtMost(response, MAX_HANDSHAKE_REPLY);
6882
6903
  return sessionFrom(noise, reply);
6883
6904
  }
6884
6905
  async function sessionFrom(noise, reply) {
@@ -7004,6 +7025,10 @@ function frameReader(reader) {
7004
7025
  async next() {
7005
7026
  if (!await fill(4)) return null;
7006
7027
  const length = new DataView(buffer.buffer, buffer.byteOffset).getUint32(0, false);
7028
+ if (length > MAX_FRAME_LEN) {
7029
+ await reader.cancel();
7030
+ throw new Error("The sealed response is malformed: a frame is larger than the node sends");
7031
+ }
7007
7032
  if (!await fill(4 + length)) return null;
7008
7033
  const frame = buffer.slice(4, 4 + length);
7009
7034
  buffer = buffer.slice(4 + length);
@@ -7012,6 +7037,20 @@ function frameReader(reader) {
7012
7037
  cancel: () => reader.cancel()
7013
7038
  };
7014
7039
  }
7040
+ async function readAtMost(response, limit) {
7041
+ if (!response.body) return new Uint8Array();
7042
+ const reader = response.body.getReader();
7043
+ let bytes = new Uint8Array();
7044
+ for (; ; ) {
7045
+ const { done, value } = await reader.read();
7046
+ if (done) return bytes;
7047
+ bytes = concat(bytes, value);
7048
+ if (bytes.length > limit) {
7049
+ await reader.cancel();
7050
+ throw new Error("The handshake reply is malformed: it is too long");
7051
+ }
7052
+ }
7053
+ }
7015
7054
  async function envelopeRefusal(response) {
7016
7055
  let code;
7017
7056
  let message = `Sealed request refused: HTTP ${response.status}`;
@@ -7022,7 +7061,9 @@ async function envelopeRefusal(response) {
7022
7061
  } catch {
7023
7062
  }
7024
7063
  if (code === "stale_transport_key") return new StaleTransportKeyError();
7025
- return new SealedTransportError(response.status, code, message);
7064
+ const retryAfter = Number(response.headers.get("retry-after"));
7065
+ const retryAfterMs = Number.isFinite(retryAfter) && retryAfter > 0 ? Math.min(retryAfter, 5) * 1e3 : void 0;
7066
+ return new SealedTransportError(response.status, code, message, retryAfterMs);
7026
7067
  }
7027
7068
 
7028
7069
  // src/namespace-op/namespace-op.ts