@ghostlytools/cli 1.2.0 → 1.2.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.
@@ -764,12 +764,15 @@ var asker = (options, write) => ({
764
764
  write,
765
765
  signal: !!options.signal,
766
766
  watch: !!options.watch && !write,
767
- watchWrite: !!options.watch && write
767
+ watchWrite: !!options.watch && write,
768
+ departed: !!options.departed && !write
768
769
  });
769
770
  /** A 1:1 chat's request: neither a group's nor a background one. */
770
771
  var isChat = (who) => !who.background && !who.group;
771
772
  /** A 1:1 chat's offer or answer, or its read for the answer to its offer: it may use the allowance (`SIGNALING_ALLOWANCE_SHARE`). */
772
773
  var isChatSignal = (who) => who.signal && isChat(who);
774
+ /** A 1:1 chat's read of a contact that just went away: a few may use the chat's allowance (`DEPARTED_READS`). */
775
+ var isDepartedRead = (who) => who.departed && isChat(who);
773
776
  /** A group's edge looking fast for a signal (`GROUP_BURST_MS`). */
774
777
  var isGroupUrgentRead = (who) => who.group && who.urgent && !who.write && !who.background;
775
778
  /**
@@ -887,7 +890,8 @@ var CATCH_UP_ASKER = {
887
890
  write: true,
888
891
  signal: false,
889
892
  watch: false,
890
- watchWrite: false
893
+ watchWrite: false,
894
+ departed: false
891
895
  };
892
896
  /** Keys whose last relay is remembered for their next read (`resolve`): a profile's links and lookups, with room. */
893
897
  var READ_TURNS_KEPT = 512;
@@ -968,6 +972,8 @@ var RelayTransport = class {
968
972
  spentWatch = /* @__PURE__ */ new Map();
969
973
  /** Groups' reads past the limit on each relay in the last `GROUP_OVER_PACE_MS` (`GROUP_SIGNALING_ALLOWANCE_SHARE`). */
970
974
  spentGroupOver = /* @__PURE__ */ new Map();
975
+ /** Per contact, its departed reads past the limit in the last minute, every relay together (`DEPARTED_READS`). */
976
+ departedOver = /* @__PURE__ */ new Map();
971
977
  /**
972
978
  * Per key a group reads (not in the background), when a read of it last went out and when it last asked: whose turn
973
979
  * it is under the watch share (`WATCH_SHARE`) and while the groups' reads are rationed (`GROUP_RATION_WINDOW_MS`).
@@ -1575,6 +1581,7 @@ var RelayTransport = class {
1575
1581
  }
1576
1582
  if (writer) this.writeWaiting.delete(`${writer} ${relay}`);
1577
1583
  if (isGroupSignal(who) && !who.write && this.spent.get(relay).length >= this.limitOf(relay)) this.spentGroupOver.get(relay).push(now);
1584
+ if (isDepartedRead(who) && this.spent.get(relay).length >= this.limitOf(relay)) this.departedOverAdd(key, now);
1578
1585
  this.spent.get(relay).push(now);
1579
1586
  if (who.background) this.spentBackground.get(relay).push(now);
1580
1587
  if (isGroupUrgentRead(who)) this.spentGroupUrgent.get(relay).push(now);
@@ -1597,7 +1604,8 @@ var RelayTransport = class {
1597
1604
  *
1598
1605
  * Who goes first: a chat's refused write holds back everything but chat writes; a group's refused write holds back
1599
1606
  * group reads and background requests, never a chat's. Background requests yield to a link that signals. A chat's
1600
- * signaling goes over the limit by its allowance (`SIGNALING_ALLOWANCE_SHARE`).
1607
+ * signaling goes over the limit by its allowance (`SIGNALING_ALLOWANCE_SHARE`), and so do a few of its reads of a
1608
+ * contact that just went away (`DEPARTED_READS`).
1601
1609
  */
1602
1610
  heldFor(relay, who, now = Date.now(), key) {
1603
1611
  const recent = (this.spent.get(relay) ?? []).filter((at) => now - at < 6e4);
@@ -1606,7 +1614,8 @@ var RelayTransport = class {
1606
1614
  this.spentBackground.set(relay, recentBackground);
1607
1615
  const over = (list, limit) => list.length >= limit ? list[list.length - limit] + 6e4 - now : 0;
1608
1616
  const limit = this.limitOf(relay);
1609
- const share = isChatSignal(who) ? SIGNALING_ALLOWANCE_SHARE : isGroupSignal(who) ? GROUP_SIGNALING_ALLOWANCE_SHARE : 0;
1617
+ const departed = isDepartedRead(who) && key !== void 0 && recent.length >= limit && this.departedReads(key, now) < 6;
1618
+ const share = isChatSignal(who) || departed ? SIGNALING_ALLOWANCE_SHARE : isGroupSignal(who) ? GROUP_SIGNALING_ALLOWANCE_SHARE : 0;
1610
1619
  let wait = over(recent, limit + (share ? Math.max(0, Math.floor(limit * share) - (who.write ? 0 : 1)) : 0));
1611
1620
  const groupOver = (this.spentGroupOver.get(relay) ?? []).filter((at) => now - at < GROUP_OVER_PACE_MS);
1612
1621
  this.spentGroupOver.set(relay, groupOver);
@@ -1646,7 +1655,7 @@ var RelayTransport = class {
1646
1655
  const at = this.writeWaiting.get(`${lane} ${relay}`);
1647
1656
  return at !== void 0 && now - at < 5e3 ? at + WRITE_FIRST_MS - now : 0;
1648
1657
  };
1649
- if (writer !== "chat") wait = Math.max(wait, waiting("chat"));
1658
+ if (writer !== "chat" && !departed) wait = Math.max(wait, waiting("chat"));
1650
1659
  if (writer === null && who.group && !pastLimit || who.background) wait = Math.max(wait, waiting("group"));
1651
1660
  return Math.max(wait, 0);
1652
1661
  }
@@ -1677,6 +1686,18 @@ var RelayTransport = class {
1677
1686
  }
1678
1687
  return ahead;
1679
1688
  }
1689
+ /** This contact's departed reads past the limit in the last minute (`DEPARTED_READS`). */
1690
+ departedReads(key, now) {
1691
+ const reads = (this.departedOver.get(key) ?? []).filter((at) => now - at < 6e4);
1692
+ if (reads.length) this.departedOver.set(key, reads);
1693
+ else this.departedOver.delete(key);
1694
+ return reads.length;
1695
+ }
1696
+ /** One more, the contacts with none in the last minute dropped. */
1697
+ departedOverAdd(key, now) {
1698
+ for (const [other, reads] of this.departedOver) if (now - reads[reads.length - 1] >= 6e4) this.departedOver.delete(other);
1699
+ this.departedOver.set(key, [...this.departedOver.get(key) ?? [], now]);
1700
+ }
1680
1701
  chatNeed(key) {
1681
1702
  let need = this.chatNeeds.get(key);
1682
1703
  if (!need) this.chatNeeds.set(key, need = {
@@ -5532,6 +5553,13 @@ var WATCH_PEER_MS = 12e4;
5532
5553
  * past the 12 s such a connection is given (`DISCONNECT_GRACE_MS`), by when it is back or the session is gone.
5533
5554
  */
5534
5555
  var STALLED_LOOK_MS = 15e3;
5556
+ /**
5557
+ * For this long after its contact went away from a live session, a chat's reads of it say so (`PkarrRequestOptions.departed`):
5558
+ * a few may go over the relays' budget (`DEPARTED_READS` in relay.ts). The fast window that follows a goodbye
5559
+ * (`EXPECT_PEER_MS`): an app that restarts has its offer out well within it (2.5 to 10 s after its goodbye in the lab of
5560
+ * #1441, on a loaded host), and past it the race's DHT dial has brought the chat back anyway.
5561
+ */
5562
+ var DEPARTED_READ_MS = EXPECT_PEER_MS;
5535
5563
  var PUBLISH_RETRY_MS = 4e3;
5536
5564
  /**
5537
5565
  * A packet the relays' request budget held back goes again when the budget frees a request, and at least this often
@@ -5592,6 +5620,8 @@ var LinkSession = class {
5592
5620
  watchUntil = 0;
5593
5621
  /** The time of the peer's packet read last when it went away (`watchPeer`): a newer one that advertises says it is back. */
5594
5622
  watchFrom = 0;
5623
+ /** Until when the reads of a contact that went away are its first ones (`DEPARTED_READ_MS`). */
5624
+ departedUntil = 0;
5595
5625
  publishRetryTimer = null;
5596
5626
  active = false;
5597
5627
  connected = false;
@@ -5749,6 +5779,7 @@ var LinkSession = class {
5749
5779
  watchPeer() {
5750
5780
  this.watchUntil = Math.max(this.watchUntil, Date.now() + WATCH_PEER_MS);
5751
5781
  this.watchFrom = this.presence.lastPacketAt;
5782
+ this.departedUntil = Date.now() + DEPARTED_READ_MS;
5752
5783
  this.expectPeer();
5753
5784
  }
5754
5785
  /** The data link carries chat and services while it is up. */
@@ -6017,11 +6048,13 @@ var LinkSession = class {
6017
6048
  const pace = this.pace();
6018
6049
  const signal = pace === "fast" && this.fastStepsAfter > 0 && this.rtcSignalOut !== null;
6019
6050
  const watch = !signal && this.watching();
6051
+ const departed = !signal && Date.now() < this.departedUntil;
6020
6052
  const packet = await this.transport.resolve(this.peerPubKeyZ32, {
6021
6053
  background: pace === "background" || pace === "connected",
6022
6054
  urgent: pace === "fast",
6023
6055
  ...signal && { signal },
6024
- ...watch && { watch }
6056
+ ...watch && { watch },
6057
+ ...departed && { departed }
6025
6058
  });
6026
6059
  if (!this.running) return;
6027
6060
  this.discoveryResult("read");
@@ -16830,6 +16863,8 @@ var GhostLink = class {
16830
16863
  }
16831
16864
  /** The attempt (`connectionEpoch`) in which the data link began answering the contact's offer. */
16832
16865
  answeringEpoch = -1;
16866
+ /** Set while a dial waits for its WebRTC offer to be made: ends that wait, the contact's offer being answered instead. */
16867
+ offerReplaced;
16833
16868
  lastAutoConnectAt = 0;
16834
16869
  autoConnectFailures = 0;
16835
16870
  /** The look due when a failed dial's backoff ends (`lookAtRetry`). */
@@ -17175,6 +17210,7 @@ var GhostLink = class {
17175
17210
  }
17176
17211
  if (state === "answering") {
17177
17212
  this.answeringEpoch = this.connectionEpoch;
17213
+ this.offerReplaced?.();
17178
17214
  if (this.resumingOverRtc) {
17179
17215
  const epoch = this.connectionEpoch;
17180
17216
  setTimeout(() => this.maybeKnockAnswering(epoch), 0);
@@ -18352,7 +18388,12 @@ var GhostLink = class {
18352
18388
  } : void 0;
18353
18389
  const gate = this.dialGate;
18354
18390
  this.dialGate = void 0;
18355
- if (await this.dataLink.connect(gate) === "held") {
18391
+ const replaced = new Promise((resolve) => {
18392
+ this.offerReplaced = resolve;
18393
+ });
18394
+ const made = await Promise.race([this.dataLink.connect(gate), replaced]);
18395
+ this.offerReplaced = void 0;
18396
+ if (made === "held") {
18356
18397
  traceLink(this.myPubKeyZ32, "dial-held", {});
18357
18398
  this.afterRtc = void 0;
18358
18399
  this.offered = void 0;
@@ -20939,12 +20980,37 @@ function decodeBolt11(text) {
20939
20980
  var LNURL_LIMITS = {
20940
20981
  timeoutMs: 15e3,
20941
20982
  maxBytes: 65536,
20983
+ maxRedirects: 5,
20942
20984
  maxUrlLength: 2048,
20943
20985
  maxMetadataLength: 8192,
20944
20986
  maxComment: 2e3
20945
20987
  };
20946
20988
  var ADDRESS = /^([a-z0-9._+-]{1,64})@([a-z0-9-]+(?:\.[a-z0-9-]+)*(?::\d{1,5})?)$/i;
20947
20989
  var LNURL_BECH32 = /^lnurl1[02-9ac-hj-np-z]{6,}$/i;
20990
+ var REDIRECTS = [
20991
+ 301,
20992
+ 302,
20993
+ 303,
20994
+ 307,
20995
+ 308
20996
+ ];
20997
+ /**
20998
+ * A host that is not on the public internet, as far as its name tells: this machine, a single label, `.local` and its
20999
+ * kin, private and reserved IP addresses. (What a public name resolves to is checked where the client resolves names
21000
+ * itself, as Ghostly Desktop does.)
21001
+ */
21002
+ function isLocalHost(hostname) {
21003
+ const host = hostname.toLowerCase().replace(/\.$/, "").replace(/^\[|\]$/g, "");
21004
+ if (!host.includes(".") && !host.includes(":")) return true;
21005
+ if (/(^|\.)(localhost|local|internal|lan|home\.arpa)$/.test(host)) return true;
21006
+ const v4 = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(host);
21007
+ if (v4) {
21008
+ const [a, b] = [Number(v4[1]), Number(v4[2])];
21009
+ return a === 0 || a === 10 || a === 127 || a >= 224 || a === 169 && b === 254 || a === 172 && b >= 16 && b < 32 || a === 192 && b === 168 || a === 100 && b >= 64 && b < 128 || a === 198 && (b === 18 || b === 19) || a === 192 && b === 0;
21010
+ }
21011
+ if (host.includes(":")) return !/^[23][0-9a-f]{0,3}:/.test(host) || host.includes(".") || /^2001:0?db8:/.test(host);
21012
+ return false;
21013
+ }
20948
21014
  var isLoopback = (hostname) => [
20949
21015
  "localhost",
20950
21016
  "127.0.0.1",
@@ -21038,7 +21104,7 @@ async function readBounded(response, maxBytes) {
21038
21104
  }
21039
21105
  return new TextDecoder().decode(all);
21040
21106
  }
21041
- /** One GET to an LNURL service: bounded in time and size, no credentials, no referrer, and the answer must be JSON. */
21107
+ /** One GET to an LNURL service (and to each checked redirect of it): bounded in time and size, no credentials, no referrer, and the answer must be JSON. */
21042
21108
  async function fetchLnurlJson(url, options = {}) {
21043
21109
  const target = acceptUrl(url);
21044
21110
  const doFetch = options.fetch ?? globalThis.fetch;
@@ -21049,19 +21115,38 @@ async function fetchLnurlJson(url, options = {}) {
21049
21115
  options.signal?.addEventListener("abort", onAbort, { once: true });
21050
21116
  try {
21051
21117
  let response;
21052
- try {
21053
- response = await doFetch(target.href, {
21054
- signal: controller.signal,
21055
- headers: { accept: "application/json" },
21056
- credentials: "omit",
21057
- referrerPolicy: "no-referrer",
21058
- redirect: "follow"
21059
- });
21060
- } catch {
21061
- if (controller.signal.aborted) throw controller.signal.reason instanceof Error ? controller.signal.reason : /* @__PURE__ */ new Error("The request was cancelled");
21062
- throw engineError("lnurlUnreachable", { host: target.host });
21118
+ for (let at = target, hops = 0;; hops++) {
21119
+ try {
21120
+ response = await doFetch(at.href, {
21121
+ signal: controller.signal,
21122
+ headers: { accept: "application/json" },
21123
+ credentials: "omit",
21124
+ referrerPolicy: "no-referrer",
21125
+ redirect: "manual"
21126
+ });
21127
+ } catch {
21128
+ if (controller.signal.aborted) throw controller.signal.reason instanceof Error ? controller.signal.reason : /* @__PURE__ */ new Error("The request was cancelled");
21129
+ throw engineError("lnurlUnreachable", { host: target.host });
21130
+ }
21131
+ if (response.url) acceptUrl(response.url);
21132
+ if (response.type === "opaqueredirect") throw new Error(`${target.host} redirects to another address, which cannot be checked here`);
21133
+ const location = REDIRECTS.includes(response.status) ? response.headers.get("location") : null;
21134
+ if (!location) break;
21135
+ await response.body?.cancel().catch(() => {});
21136
+ if (hops >= LNURL_LIMITS.maxRedirects) throw new Error(`${target.host} redirects too many times`);
21137
+ let next;
21138
+ try {
21139
+ next = new URL(location, at);
21140
+ } catch {
21141
+ throw new Error(`${target.host} redirects to an invalid address`);
21142
+ }
21143
+ next = acceptUrl(next.href);
21144
+ if (next.host !== at.host) {
21145
+ if (next.protocol !== "https:") throw new Error("Lightning addresses and LNURLs must use HTTPS");
21146
+ if (isLocalHost(next.hostname)) throw new Error(`${target.host} redirects to a local address`);
21147
+ }
21148
+ at = next;
21063
21149
  }
21064
- if (response.url) acceptUrl(response.url);
21065
21150
  const text = await readBounded(response, options.maxBytes ?? LNURL_LIMITS.maxBytes);
21066
21151
  let body;
21067
21152
  try {
@@ -29600,6 +29685,6 @@ function appStoreDecision(held, read) {
29600
29685
  return read.digest === held.digest ? "same" : "equivocation";
29601
29686
  }
29602
29687
  //#endregion
29603
- export { SSHSIG_NAMESPACE as $, readAppRevocations as $a, parseImageMeta as $i, engineError as $n, handoffContextProof as $o, pinNumberHolds as $r, HANDOFF_CAPABILITY as $s, PaymentPreflightError as $t, decodeGroupEntryLink as A, pairedReplyAuthor as Aa, withRequestOptions as Ac, IDENTITY_REVOCATION_LABEL as Ai, encodeDnsQuery as An, signalHasVideo as Ao, mergeBeacon as Ar, ENROLL_HELLO as As, didJwsAlg as At, groupWakes as B, statusCardText as Ba, publicKeyFromZ32 as Bc, lastSharedWithMe as Bi, resolveLightningDestination as Bn, HANDOFF_OFFER as Bo, FILE_LIMITS as Br, readEnrollHello as Bs, parseDidSignaturePaste as Bt, COMMUNITY_LIMITS as C, nextReactionNumber as Ca, RelayTransport as Cc, readManifest as Ci, homeserverWebEndpoint as Cn, RTC_CONFIG as Co, COMMUNITY_TOPOLOGY as Cr, readSetUpdate as Cs, DID_DOCUMENT_MAX_BYTES as Ct, decodeCommunityLink as D, readReaction as Da, traceLink as Dc, dialDescriptors as Di, dnsProofName as Dn, callSignalHeardAt as Do, freshHubs as Dr, verifySetUpdate as Ds, checkDidJws as Dt, communityHasFrame as E, reactionIsNewer as Ea, setLinkTraceSink as Ec, capsDescriptors as Ei, decodeDnsResponse as En, callRtcConfig as Eo, doorHubs as Er, signTombstone as Es, DidError as Et, mergeKnocks as F, RUN_RESULTS as Fa, openRelayPayload as Fc, identityRevocationValue as Fi, recordsFromWellKnown as Fn, HANDOFF_ACK as Fo, readBeacon as Fr, enrollDoneFrame as Fs, didWebFileUrl as Ft, COMMUNITY_EDIT_FRAME as G, shownTime as Ga, fromBase64Url as Gc, automaticTransport as Gi, findEndpoint as Gn, HANDOFF_VERIFIED as Go, TypingSender as Gr, OwnInviteError as Gs, didDhtFromPublicKey as Gt, GROUP_REACTED_FRAME as H, claimedTime as Ha, MAX_AVATAR_LENGTH as Hc, emptyProofLedger as Hi, ENDPOINT as Hn, HANDOFF_PIECE_BYTES as Ho, transferStalled as Hr, createDeviceInvite as Hs, staticDidDocument as Ht, readKnocks as I, STATUS_CARD_LIMITS as Ia, parseRelayPayload as Ic, identityStatement as Ii, recordsName as In, HANDOFF_CANCEL as Io, readBeaconHead as Ir, enrollGrantFrame as Is, didWebHost as It, carryMentions as J, appFingerprint as Ja, toZ32 as Jc, DHT_FILE_TOO_LARGE as Ji, parseFedimintRequestPayload as Jn, handoffAttemptFailed as Jo, GROUP_PIN_FRAME as Jr, encodeInviteCode as Js, resolveDidDht as Jt, GROUP_EDIT_FRAME as K, APP_PREFIXES as Ka, randomBytes as Kc, irohDescriptor as Ki, isFederationId as Kn, filePartName as Ko, sanitizeTypingStatus as Kr, createChatInvite as Ks, encodeDidDhtDeactivated as Kt, GROUP_WAKE_FRAME as L, buttonLabelClash as La, createIdentity as Lc, newIdentityBinding as Li, txtValue as Ln, HANDOFF_DONE as Lo, readLobby as Lr, enrollHelloFrame as Ls, normalizeDid as Lt, entryParams as M, replySnippet as Ma, RELAY_PAYLOAD_MAX_BYTES as Mc, IdentityExchange as Mi, nip05RootKey as Mn, HTTP_SERVICE_PROTO as Mo, newerHead as Mr, enrollCancelFrame as Ms, didWebDocumentUrl as Mt, knockIdentity as N, BUTTON_ID as Na, createRelayPayload as Nc, boundVerifiedIdentity as Ni, normalizeDomain as Nn, LEGACY_SERVICES as No, pickHubs as Nr, enrollCancelReason as Ns, didWebFile as Nt, encodeCommunityLink as O, validReactionNumber as Oa, budgetRetryMs as Oc, IDENTITY_MAX_EVIDENCE as Oi, domainTxtRecord as On, extractParamsFromSdp as Oo, lobbyKeys as Or, ENROLL_DONE as Os, checkDidSignature as Ot, knockRecords as P, ITEM_STATES as Pa, newerPacket as Pc, emptyIdentityLedger as Pi, recordsFromTxt as Pn, serviceIdFromName as Po, rankHubs as Pr, enrollDigits as Ps, didWebFileNames as Pt, SSHSIG_MAX_ARMOR as Q, isAppRef as Qa, dhtFileId as Qi, pairedMessageFrame as Qn, handoffContext as Qo, pinIsNewer as Qr, ENROLL_CAPABILITY as Qs, ONCHAIN_PROVIDER as Qt, GroupWakeLimiter as R, checkStatusCard as Ra, identityFromSeed as Rc, receivedIdentityStatus as Ri, wellKnownUrl as Rn, HANDOFF_HAVE as Ro, shouldBeHub as Rr, enrollProofFrame as Rs, parseDid as Rt, sealGroupTyping as S, ReactionWindow as Sa, DEFAULT_RELAYS as Sc, newMailbox as Si, pubkyProofPath as Sn, CALL_SIGNAL_MAX_AGE_MS as So, pickMeshHubs as Sr, SET_UPDATE as Ss, verifyAtprotoRecordProof as St, GROUP_READ_NOTE_COMMUNITY as T, reactionEmoji as Ta, normalizeRelayUrl as Tc, DHT_TEXT_CAPABILITY as Ti, DOMAIN_FILE_MAX_BYTES as Tn, buildSdpFromSignal as To, beaconRecords as Tr, setUpdateFrame as Ts, DID_JWS_MAX_LENGTH as Tt, GROUP_READ_NOTE as U, heardTime as Ua, sanitizeAvatar as Uc, validExternalKey as Ui, cashuRequestPayload as Un, HANDOFF_REQUEST as Uo, TYPING_KINDS as Ur, deviceInviteJoinerParams as Us, strictBase64Url as Ut, parseGroupWakeFrame as V, arrivalKey as Va, verify as Vc, PeerProofs as Vi, decodeBolt11 as Vn, HANDOFF_PAKE as Vo, transferEnded as Vr, verifyEnrollProof as Vs, signingKeys as Vt, GroupSession as W, receivedTimestamp as Wa, bytesEqual as Wc, TRANSPORTS as Wi, fedimintRequestPayload as Wn, HANDOFF_TIMINGS as Wo, TYPING_REFRESH_MS as Wr, readDeviceInvite as Ws, didDhtDocument as Wt, mentionsMember as X, checkAppRevokeStatement as Xa, utf8Encode as Xc, peekDhtMailbox as Xi, INVITE_TAKEN as Xn, handoffBusyFrame as Xo, mayPin as Xr, inviteOwnership as Xs, ETHEREUM_USDT as Xt, parseCommunityEdit as Y, appRef as Ya, utf8Decode as Yc, DHT_MESSAGE_TTL as Yi, GhostLink as Yn, handoffAttemptSucceeded as Yo, PIN_LIMITS as Yr, inviteLink as Ys, signDidDhtPacket as Yt, groupName as Z, isAppKey as Za, DHT_FILE_CAPABILITY as Zi, LIVENESS_PING_MS as Zn, handoffCancelFrame as Zo, nextPinNumber as Zr, DEVICES_CAPABILITY as Zs, EVM_TEST_CHAINS as Zt, readAppBundle as _, forwardedAgain as _a, readTurnPacket as _c, HOLD_CAPABILITY as _i, isPubkyProofFolder as _n, parseLocalTarget as _o, groupSignalFrame as _r, readHandoffPake as _s, isAtprotoDid as _t, planAppUpdate as a, PLAYABLE_AUDIO as aa, newDeviceSetSecret as ac, parseWakeFrame as ai, assertTokenUnits as an, MAX_GROUP_CHAIN as ao, fetchesByItself as ar, handoffOfferFrame as as, verifySshSignature as at, groupTypingEpoch as b, GROUP_REACTION_FRAME as ba, turnKeys as bc, HoldKeys as bi, pubkyProofCapability as bn, decodeControl as bo, mayBeHub as br, sealHandoffPiece as bs, shortAtprotoDid as bt, signAppStore as c, fileMessageText as ca, TURN_PUT_WINDOW_MS as cc, checkPushEndpoint as ci, validatePaymentTarget as cn, verifyCommitSignature as co, readGroupFileMeta as cr, handoffRetryAfter as cs, decodeAnyBitcoinAddress as ct, APP_ICON_PATH as d, parseVideoMeta as da, classifyTurnRead as dc, isAppVersion as di, SPARK_PROVIDER as dn, DHT_POLL_INTERVALS as do, readGroupWantNo as dr, newHandoffId as ds, ATPROTO_PROOF_COLLECTION as dt, readImageMeta as ea, deviceEchoFrame as ec, readPin as ei, SEPOLIA_TEST_USDT as en, signAppObject as eo, engineText as er, handoffDataFrame as es, SshSigError as et, appDigest as f, EDIT_BUFFER_MS as fa, turnPutSummary as fc, APPS_CAPABILITY as fi, sparkAddressKind as fn, EXPECT_PEER_MS as fo, CarriedTransport as fr, readHandoffAck as fs, ATPROTO_PROOF_SCOPE as ft, isAppUrl as g, parseLinkPreview as ga, nextTurnPosition as gc, UPGRADE_CAPABILITY as gi, isPubkyKey as gn, formatLocalTarget as go, SIGNAL_REPLY_MS as gr, readHandoffHello as gs, checkAtprotoProofRecord as gt, checkAppManifest as h, dhtEditId as ha, firstDeviceSetSecret as hc, STATUS_CARD_CAPABILITY as hi, PUBKY_PROOF_MAX_BYTES as hn, GhostlyHttpError as ho, SIGNAL_HOLD_MS as hr, readHandoffHave as hs, atprotoProofRkey as ht, checkAppBeforeRun as i, sanitizeMime as ia, devicePingFrame as ic, newWakeToken as ii, WALLET_NETWORKS as in, GROUP_MEMBER_CAP as io, GROUP_WANT_NO_FRAME as ir, handoffManifestFrames as is, sshSignCommand as it, encodeGroupEntryLink as j, readReply as ja, PacketTooLargeError as jc, IdentityCheckUnavailable as ji, isPublicAddress as jn, emptyLinkRecords as jo, mergeLobby as jr, ENROLL_PROOF as js, didSignedMessages as jt, KNOCK_TTL_MS as k, wireReaction as ka, isDiscoveryBudgetError as kc, IDENTITY_MAX_VALIDITY as ki, domainWellKnownFile as kn, parseCallSignal as ko, lobbyRecords as kr, ENROLL_GRANT as ks, didGhostlyServiceEntry as kt, APP_BUNDLE_LIMITS as l, parseVoiceMeta as la, TURN_RAISE_READ_TIMEOUT_MS as lc, vapidKeysMatch as li, walletNetworkOf as ln, edgeParams as lo, readGroupHave as lr, handoffStreamKey as ls, ATPROTO_DECLARED_SCOPE as lt, assembleAppBundle as m, RateWindow as ma, TURN_MAX as mc, EDIT_CAPABILITY as mi, isBitcoinAddress as mn, presenceSeenAt as mo, SIGNAL_FRESH_MS as mr, readHandoffDone as ms, atprotoProofRecord as mt, appStoreDecision as n, safeBlobType as na, deviceKeyZ32 as nc, WakeLimiter as ni, TEST_USDT_FAUCET_AMOUNT as nn, canonicalJson as no, GROUP_HAVE_FRAME as nr, handoffEphemeral as ns, parseSshSignature as nt, checkAppStoreIndex as o, VOICE_LIMITS as oa, seedSigner as oc, relayRequest as oi, assertWholeSats as on, MEMBER_KEY as oo, groupFileFallback as or, handoffPakeFrame as os, verifyBitcoinMessage as ot, appViewOf as p, EDIT_RATE_WINDOW_MS as pa, TURN_LAST_SEQUENCE as pc, BUTTONS_CAPABILITY as pi, sparkInvoiceDetails as pn, RELAY_POLL_INTERVALS as po, GROUP_SIGNAL_FRAME as pr, readHandoffCancel as ps, atprotoDidMethod as pt, GROUP_EDIT_TEXT_BYTES as q, APP_STATEMENT_LIMITS as qa, toBase64Url as qc, irohRelayUrl as qi, parseCashuRequestPayload as qn, handoffAttemptAllowed as qo, typingActivity as qr, decodeInviteCode as qs, encodeDidDhtPacket as qt, appUpdateDecision as r, sanitizeFileName as ra, deviceLinkPairing as rc, deviceWakeRequest as ri, USDT_PUBLIC_RPC as rn, canonicalJsonBytes as ro, GROUP_WANT_FRAME as rr, handoffHelloFrame as rs, sameSshKey as rt, readAppStore as s, baseMime as sa, webCryptoSigner as sc, wakeRequest as si, formatPaymentAmount as sn, rosterHas as so, isGroupMessageId as sr, handoffReleaseFrame as ss, BitcoinAddressError as st, appRevocationFor as t, formatFileSize as ta, deviceEchoNonce as tc, WAKE_CALL_INTERVAL_MS as ti, SEPOLIA_TEST_USDT_FAUCET as tn, signAppRevocation as to, GROUP_FILE_LIMITS as tr, handoffDigest as ts, parseSshPublicKey as tt, APP_BUNDLE_MAGIC as u, voicePeaksOf as ua, TURN_SETTLE_MS as uc, chatAppId as ui, SPARK_NETWORKS as un, DirectPathWatch as uo, readGroupWant as ur, handoffVersions as us, ATPROTO_FULL_SCOPE as ut, GROUP_TYPING_FRAME as v, readForwarded as va, signTurnPacket as vc, HOLD_DATED_BACK_MS as vi, newPubkyProofFolder as vn, webLocalFetch as vo, readGroupSignal as vr, readHandoffTurnFrame as vs, normalizeAtprotoHandle as vt, CommunitySession as w, queueReaction as wa, currentRelays as wc, CapsExchange as wi, pubkyHomeserverOf as wn, answersOffer as wo, beaconKeys as wr, setAckFrame as ws, DID_FILE_MAX_BYTES as wt, openGroupTyping as x, REACTION_LIMITS as xa, turnName as xc, HoldRefusedError as xi, pubkyProofFile as xn, encodeControl as xo, meshHubs as xr, SET_ACK as xs, AtprotoProofError as xt, GroupTypingBoard as y, COMMUNITY_REACTION_FRAME as ya, signTurnRelease as yc, HOLD_LIMITS as yi, normalizePubkyKey as yn, LIMITS as yo, MESH_HUBS as yr, readHandoffVerified as ys, parseAtprotoDidDocument as yt, groupWakeFrame as z, sameButtonText as za, identityFromSeedB64 as zc, revokesIdentity as zi, requestLnurlInvoice as zn, HANDOFF_HELLO as zo, ChatFiles as zr, readEnrollGrant as zs, parseDidDocument as zt };
29688
+ export { SSHSIG_NAMESPACE as $, appRef as $a, randomBytes as $c, parseImageMeta as $i, engineError as $n, filePartName as $o, pinNumberHolds as $r, createChatInvite as $s, PaymentPreflightError as $t, decodeGroupEntryLink as A, pairedReplyAuthor as Aa, RelayTransport as Ac, IDENTITY_REVOCATION_LABEL as Ai, encodeDnsQuery as An, RTC_CONFIG as Ao, mergeBeacon as Ar, readSetUpdate as As, didJwsAlg as At, groupWakes as B, cardLine as Ba, createRelayPayload as Bc, lastSharedWithMe as Bi, resolveLightningDestination as Bn, LEGACY_SERVICES as Bo, FILE_LIMITS as Br, enrollCancelReason as Bs, parseDidSignaturePaste as Bt, COMMUNITY_LIMITS as C, nextReactionNumber as Ca, nextTurnPosition as Cc, readManifest as Ci, homeserverWebEndpoint as Cn, formatLocalTarget as Co, COMMUNITY_TOPOLOGY as Cr, readHandoffHello as Cs, DID_DOCUMENT_MAX_BYTES as Ct, decodeCommunityLink as D, readReaction as Da, turnKeys as Dc, dialDescriptors as Di, dnsProofName as Dn, decodeControl as Do, freshHubs as Dr, sealHandoffPiece as Ds, checkDidJws as Dt, communityHasFrame as E, reactionIsNewer as Ea, signTurnRelease as Ec, capsDescriptors as Ei, decodeDnsResponse as En, LIMITS as Eo, doorHubs as Er, readHandoffVerified as Es, DidError as Et, mergeKnocks as F, PR_CHECKS as Fa, budgetRetryMs as Fc, identityRevocationValue as Fi, recordsFromWellKnown as Fn, extractParamsFromSdp as Fo, readBeacon as Fr, ENROLL_DONE as Fs, didWebFileUrl as Ft, COMMUNITY_EDIT_FRAME as G, arrivalKey as Ga, identityFromSeed as Gc, automaticTransport as Gi, findEndpoint as Gn, HANDOFF_HAVE as Go, TypingSender as Gr, enrollProofFrame as Gs, didDhtFromPublicKey as Gt, GROUP_REACTED_FRAME as H, checkStatusCard as Ha, openRelayPayload as Hc, emptyProofLedger as Hi, ENDPOINT as Hn, HANDOFF_ACK as Ho, transferStalled as Hr, enrollDoneFrame as Hs, staticDidDocument as Ht, readKnocks as I, PR_STATES as Ia, isDiscoveryBudgetError as Ic, identityStatement as Ii, recordsName as In, parseCallSignal as Io, readBeaconHead as Ir, ENROLL_GRANT as Is, didWebHost as It, carryMentions as J, receivedTimestamp as Ja, verify as Jc, DHT_FILE_TOO_LARGE as Ji, parseFedimintRequestPayload as Jn, HANDOFF_PAKE as Jo, GROUP_PIN_FRAME as Jr, verifyEnrollProof as Js, resolveDidDht as Jt, GROUP_EDIT_FRAME as K, claimedTime as Ka, identityFromSeedB64 as Kc, irohDescriptor as Ki, isFederationId as Kn, HANDOFF_HELLO as Ko, sanitizeTypingStatus as Kr, readEnrollGrant as Ks, encodeDidDhtDeactivated as Kt, GROUP_WAKE_FRAME as L, RUN_RESULTS as La, withRequestOptions as Lc, newIdentityBinding as Li, txtValue as Ln, signalHasVideo as Lo, readLobby as Lr, ENROLL_HELLO as Ls, normalizeDid as Lt, entryParams as M, replySnippet as Ma, normalizeRelayUrl as Mc, IdentityExchange as Mi, nip05RootKey as Mn, buildSdpFromSignal as Mo, newerHead as Mr, setUpdateFrame as Ms, didWebDocumentUrl as Mt, knockIdentity as N, BUTTON_ID as Na, setLinkTraceSink as Nc, boundVerifiedIdentity as Ni, normalizeDomain as Nn, callRtcConfig as No, pickHubs as Nr, signTombstone as Ns, didWebFile as Nt, encodeCommunityLink as O, validReactionNumber as Oa, turnName as Oc, IDENTITY_MAX_EVIDENCE as Oi, domainTxtRecord as On, encodeControl as Oo, lobbyKeys as Or, SET_ACK as Os, checkDidSignature as Ot, knockRecords as P, ITEM_STATES as Pa, traceLink as Pc, emptyIdentityLedger as Pi, recordsFromTxt as Pn, callSignalHeardAt as Po, rankHubs as Pr, verifySetUpdate as Ps, didWebFileNames as Pt, SSHSIG_MAX_ARMOR as Q, appFingerprint as Qa, fromBase64Url as Qc, dhtFileId as Qi, pairedMessageFrame as Qn, HANDOFF_VERIFIED as Qo, pinIsNewer as Qr, OwnInviteError as Qs, ONCHAIN_PROVIDER as Qt, GroupWakeLimiter as R, STATUS_CARD_LIMITS as Ra, PacketTooLargeError as Rc, receivedIdentityStatus as Ri, wellKnownUrl as Rn, emptyLinkRecords as Ro, shouldBeHub as Rr, ENROLL_PROOF as Rs, parseDid as Rt, sealGroupTyping as S, ReactionWindow as Sa, firstDeviceSetSecret as Sc, newMailbox as Si, pubkyProofPath as Sn, GhostlyHttpError as So, pickMeshHubs as Sr, readHandoffHave as Ss, verifyAtprotoRecordProof as St, GROUP_READ_NOTE_COMMUNITY as T, reactionEmoji as Ta, signTurnPacket as Tc, DHT_TEXT_CAPABILITY as Ti, DOMAIN_FILE_MAX_BYTES as Tn, webLocalFetch as To, beaconRecords as Tr, readHandoffTurnFrame as Ts, DID_JWS_MAX_LENGTH as Tt, GROUP_READ_NOTE as U, sameButtonText as Ua, parseRelayPayload as Uc, validExternalKey as Ui, cashuRequestPayload as Un, HANDOFF_CANCEL as Uo, TYPING_KINDS as Ur, enrollGrantFrame as Us, strictBase64Url as Ut, parseGroupWakeFrame as V, cardUrl as Va, newerPacket as Vc, PeerProofs as Vi, decodeBolt11 as Vn, serviceIdFromName as Vo, transferEnded as Vr, enrollDigits as Vs, signingKeys as Vt, GroupSession as W, statusCardText as Wa, createIdentity as Wc, TRANSPORTS as Wi, fedimintRequestPayload as Wn, HANDOFF_DONE as Wo, TYPING_REFRESH_MS as Wr, enrollHelloFrame as Ws, didDhtDocument as Wt, mentionsMember as X, APP_PREFIXES as Xa, sanitizeAvatar as Xc, peekDhtMailbox as Xi, INVITE_TAKEN as Xn, HANDOFF_REQUEST as Xo, mayPin as Xr, deviceInviteJoinerParams as Xs, ETHEREUM_USDT as Xt, parseCommunityEdit as Y, shownTime as Ya, MAX_AVATAR_LENGTH as Yc, DHT_MESSAGE_TTL as Yi, GhostLink as Yn, HANDOFF_PIECE_BYTES as Yo, PIN_LIMITS as Yr, createDeviceInvite as Ys, signDidDhtPacket as Yt, groupName as Z, APP_STATEMENT_LIMITS as Za, bytesEqual as Zc, DHT_FILE_CAPABILITY as Zi, LIVENESS_PING_MS as Zn, HANDOFF_TIMINGS as Zo, nextPinNumber as Zr, readDeviceInvite as Zs, EVM_TEST_CHAINS as Zt, readAppBundle as _, forwardedAgain as _a, TURN_SETTLE_MS as _c, HOLD_CAPABILITY as _i, isPubkyProofFolder as _n, DirectPathWatch as _o, groupSignalFrame as _r, handoffVersions as _s, isAtprotoDid as _t, planAppUpdate as a, PLAYABLE_AUDIO as aa, ENROLL_CAPABILITY as ac, parseWakeFrame as ai, assertTokenUnits as an, signAppObject as ao, fetchesByItself as ar, handoffContext as as, verifySshSignature as at, groupTypingEpoch as b, GROUP_REACTION_FRAME as ba, TURN_LAST_SEQUENCE as bc, HoldKeys as bi, pubkyProofCapability as bn, RELAY_POLL_INTERVALS as bo, mayBeHub as br, readHandoffCancel as bs, shortAtprotoDid as bt, signAppStore as c, fileMessageText as ca, deviceEchoNonce as cc, checkPushEndpoint as ci, validatePaymentTarget as cn, canonicalJsonBytes as co, readGroupFileMeta as cr, handoffDigest as cs, decodeAnyBitcoinAddress as ct, APP_ICON_PATH as d, parseVideoMeta as da, devicePingFrame as dc, isAppVersion as di, SPARK_PROVIDER as dn, MAX_GROUP_CHAIN as do, readGroupWantNo as dr, handoffManifestFrames as ds, ATPROTO_PROOF_COLLECTION as dt, readImageMeta as ea, decodeInviteCode as ec, readPin as ei, toBase64Url as el, SEPOLIA_TEST_USDT as en, checkAppRevokeStatement as eo, engineText as er, handoffAttemptAllowed as es, SshSigError as et, appDigest as f, EDIT_BUFFER_MS as fa, newDeviceSetSecret as fc, APPS_CAPABILITY as fi, sparkAddressKind as fn, MEMBER_KEY as fo, CarriedTransport as fr, handoffOfferFrame as fs, ATPROTO_PROOF_SCOPE as ft, isAppUrl as g, parseLinkPreview as ga, TURN_RAISE_READ_TIMEOUT_MS as gc, UPGRADE_CAPABILITY as gi, isPubkyKey as gn, edgeParams as go, SIGNAL_REPLY_MS as gr, handoffStreamKey as gs, checkAtprotoProofRecord as gt, checkAppManifest as h, dhtEditId as ha, TURN_PUT_WINDOW_MS as hc, STATUS_CARD_CAPABILITY as hi, PUBKY_PROOF_MAX_BYTES as hn, verifyCommitSignature as ho, SIGNAL_HOLD_MS as hr, handoffRetryAfter as hs, atprotoProofRkey as ht, checkAppBeforeRun as i, sanitizeMime as ia, DEVICES_CAPABILITY as ic, newWakeToken as ii, WALLET_NETWORKS as in, readAppRevocations as io, GROUP_WANT_NO_FRAME as ir, handoffCancelFrame as is, sshSignCommand as it, encodeGroupEntryLink as j, readReply as ja, currentRelays as jc, IdentityCheckUnavailable as ji, isPublicAddress as jn, answersOffer as jo, mergeLobby as jr, setAckFrame as js, didSignedMessages as jt, KNOCK_TTL_MS as k, wireReaction as ka, DEFAULT_RELAYS as kc, IDENTITY_MAX_VALIDITY as ki, domainWellKnownFile as kn, CALL_SIGNAL_MAX_AGE_MS as ko, lobbyRecords as kr, SET_UPDATE as ks, didGhostlyServiceEntry as kt, APP_BUNDLE_LIMITS as l, parseVoiceMeta as la, deviceKeyZ32 as lc, vapidKeysMatch as li, walletNetworkOf as ln, readCanonicalJson as lo, readGroupHave as lr, handoffEphemeral as ls, ATPROTO_DECLARED_SCOPE as lt, assembleAppBundle as m, RateWindow as ma, webCryptoSigner as mc, EDIT_CAPABILITY as mi, isBitcoinAddress as mn, rosterHas as mo, SIGNAL_FRESH_MS as mr, handoffReleaseFrame as ms, atprotoProofRecord as mt, appStoreDecision as n, safeBlobType as na, inviteLink as nc, WakeLimiter as ni, utf8Decode as nl, TEST_USDT_FAUCET_AMOUNT as nn, isAppRef as no, GROUP_HAVE_FRAME as nr, handoffAttemptSucceeded as ns, parseSshSignature as nt, checkAppStoreIndex as o, VOICE_LIMITS as oa, HANDOFF_CAPABILITY as oc, relayRequest as oi, assertWholeSats as on, signAppRevocation as oo, groupFileFallback as or, handoffContextProof as os, verifyBitcoinMessage as ot, appViewOf as p, EDIT_RATE_WINDOW_MS as pa, seedSigner as pc, BUTTONS_CAPABILITY as pi, sparkInvoiceDetails as pn, commitHash as po, GROUP_SIGNAL_FRAME as pr, handoffPakeFrame as ps, atprotoDidMethod as pt, GROUP_EDIT_TEXT_BYTES as q, heardTime as qa, publicKeyFromZ32 as qc, irohRelayUrl as qi, parseCashuRequestPayload as qn, HANDOFF_OFFER as qo, typingActivity as qr, readEnrollHello as qs, encodeDidDhtPacket as qt, appUpdateDecision as r, sanitizeFileName as ra, inviteOwnership as rc, deviceWakeRequest as ri, utf8Encode as rl, USDT_PUBLIC_RPC as rn, readAppRevocation as ro, GROUP_WANT_FRAME as rr, handoffBusyFrame as rs, sameSshKey as rt, readAppStore as s, baseMime as sa, deviceEchoFrame as sc, wakeRequest as si, formatPaymentAmount as sn, canonicalJson as so, isGroupMessageId as sr, handoffDataFrame as ss, BitcoinAddressError as st, appRevocationFor as t, formatFileSize as ta, encodeInviteCode as tc, WAKE_CALL_INTERVAL_MS as ti, toZ32 as tl, SEPOLIA_TEST_USDT_FAUCET as tn, isAppKey as to, GROUP_FILE_LIMITS as tr, handoffAttemptFailed as ts, parseSshPublicKey as tt, APP_BUNDLE_MAGIC as u, voicePeaksOf as ua, deviceLinkPairing as uc, chatAppId as ui, SPARK_NETWORKS as un, GROUP_MEMBER_CAP as uo, readGroupWant as ur, handoffHelloFrame as us, ATPROTO_FULL_SCOPE as ut, GROUP_TYPING_FRAME as v, readForwarded as va, classifyTurnRead as vc, HOLD_DATED_BACK_MS as vi, newPubkyProofFolder as vn, DHT_POLL_INTERVALS as vo, readGroupSignal as vr, newHandoffId as vs, normalizeAtprotoHandle as vt, CommunitySession as w, queueReaction as wa, readTurnPacket as wc, CapsExchange as wi, pubkyHomeserverOf as wn, parseLocalTarget as wo, beaconKeys as wr, readHandoffPake as ws, DID_FILE_MAX_BYTES as wt, openGroupTyping as x, REACTION_LIMITS as xa, TURN_MAX as xc, HoldRefusedError as xi, pubkyProofFile as xn, presenceSeenAt as xo, meshHubs as xr, readHandoffDone as xs, AtprotoProofError as xt, GroupTypingBoard as y, COMMUNITY_REACTION_FRAME as ya, turnPutSummary as yc, HOLD_LIMITS as yi, normalizePubkyKey as yn, EXPECT_PEER_MS as yo, MESH_HUBS as yr, readHandoffAck as ys, parseAtprotoDidDocument as yt, groupWakeFrame as z, buttonLabelClash as za, RELAY_PAYLOAD_MAX_BYTES as zc, revokesIdentity as zi, requestLnurlInvoice as zn, HTTP_SERVICE_PROTO as zo, ChatFiles as zr, enrollCancelFrame as zs, parseDidDocument as zt };
29604
29689
 
29605
- //# sourceMappingURL=src-BMUcYQ7b.js.map
29690
+ //# sourceMappingURL=src-aKGjb_yz.js.map