@ghostlytools/cli 1.3.7 → 1.3.9
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/README.md +8 -5
- package/SKILL.md +2 -0
- package/dist/assets/{api-DlxlF4jP.js → api-BCrwJ57L.js} +50 -24
- package/dist/assets/api-BCrwJ57L.js.map +1 -0
- package/dist/assets/{api-BL0vpWGN.js → api-Cp9GxjUO.js} +2 -2
- package/dist/assets/{apiKit-BnpVuZrZ.js → apiKit-B4qhnLQT.js} +2 -2
- package/dist/assets/{apiKit-BnpVuZrZ.js.map → apiKit-B4qhnLQT.js.map} +1 -1
- package/dist/assets/{apps-B_6Q-Mq-.js → apps-CpxENMgl.js} +1 -1
- package/dist/assets/{apps-Bs6QYQjm.js → apps-DOH1P_S0.js} +2 -2
- package/dist/assets/{apps-Bs6QYQjm.js.map → apps-DOH1P_S0.js.map} +1 -1
- package/dist/assets/{arkade-DwgUNqCz.js → arkade-Cyf5MGxG.js} +2 -2
- package/dist/assets/{arkade-DwgUNqCz.js.map → arkade-Cyf5MGxG.js.map} +1 -1
- package/dist/assets/{backup-DEe1NqKb.js → backup-CTpFFQ-4.js} +4 -4
- package/dist/assets/{backup-DEe1NqKb.js.map → backup-CTpFFQ-4.js.map} +1 -1
- package/dist/assets/{backup-BqtsbjOT.js → backup-CqM-0-2v.js} +1 -1
- package/dist/assets/{buttons-D9NQ3kV0.js → buttons-BtxwyM2l.js} +3 -3
- package/dist/assets/{buttons-D9NQ3kV0.js.map → buttons-BtxwyM2l.js.map} +1 -1
- package/dist/assets/buttons-CJqNkG-Q.js +2 -0
- package/dist/assets/{envelope-WC8QWYIL.js → envelope-DW8TWKPD.js} +2 -2
- package/dist/assets/{envelope-WC8QWYIL.js.map → envelope-DW8TWKPD.js.map} +1 -1
- package/dist/assets/{groupFiles-BrCMSXxg.js → groupFiles-uxa0U9_n.js} +3 -3
- package/dist/assets/{groupFiles-BrCMSXxg.js.map → groupFiles-uxa0U9_n.js.map} +1 -1
- package/dist/assets/{host-H0IYKNoK.js → host-DPy0eaH9.js} +29 -9
- package/dist/assets/host-DPy0eaH9.js.map +1 -0
- package/dist/assets/{hyperdhtRelay-CEfwbaCO.js → hyperdhtRelay-De5FT7Am.js} +2 -2
- package/dist/assets/{hyperdhtRelay-CEfwbaCO.js.map → hyperdhtRelay-De5FT7Am.js.map} +1 -1
- package/dist/assets/{irohWeb-Bn-JA2kp.js → irohWeb-z5QDDWa-.js} +2 -2
- package/dist/assets/{irohWeb-Bn-JA2kp.js.map → irohWeb-z5QDDWa-.js.map} +1 -1
- package/dist/assets/{main-DiCC-Vjq.js → main-Dt7xrqtb.js} +52 -27
- package/dist/assets/main-Dt7xrqtb.js.map +1 -0
- package/dist/assets/{mainline-gU7pE7s2.js → mainline-Cld-bKeC.js} +2 -2
- package/dist/assets/{mainline-gU7pE7s2.js.map → mainline-Cld-bKeC.js.map} +1 -1
- package/dist/assets/{networkReason-Dl9JThBQ.js → networkReason-vUHo6A_C.js} +2 -2
- package/dist/assets/{networkReason-Dl9JThBQ.js.map → networkReason-vUHo6A_C.js.map} +1 -1
- package/dist/assets/{nwc-CKjZjg-q.js → nwc-zXpmd2FN.js} +3 -3
- package/dist/assets/{nwc-CKjZjg-q.js.map → nwc-zXpmd2FN.js.map} +1 -1
- package/dist/assets/{nwcProvider-GDrc0HM4.js → nwcProvider-D482SQ1a.js} +2 -2
- package/dist/assets/{nwcProvider-GDrc0HM4.js.map → nwcProvider-D482SQ1a.js.map} +1 -1
- package/dist/assets/{registry-Wk7ZHuwm.js → registry-CxsDR3c6.js} +1 -1
- package/dist/assets/{registry-JGOFtJDE.js → registry-OVx2kY3d.js} +3 -3
- package/dist/assets/{registry-JGOFtJDE.js.map → registry-OVx2kY3d.js.map} +1 -1
- package/dist/assets/{resolve-CVpEbud3.js → resolve-CPTAnu-9.js} +2 -2
- package/dist/assets/{resolve-CVpEbud3.js.map → resolve-CPTAnu-9.js.map} +1 -1
- package/dist/assets/{server-CkYscxE3.js → server-p5DJnN7T.js} +17 -13
- package/dist/assets/{server-CkYscxE3.js.map → server-p5DJnN7T.js.map} +1 -1
- package/dist/assets/{src-gJqfoRKI.js → src-Dg1bvMNv.js} +155 -30
- package/dist/assets/src-Dg1bvMNv.js.map +1 -0
- package/dist/assets/{turnRefs-zUQbFkl3.js → turnRefs-WnggXm2T.js} +2 -2
- package/dist/assets/{turnRefs-zUQbFkl3.js.map → turnRefs-WnggXm2T.js.map} +1 -1
- package/dist/assets/{usdt-BkDMGqZa.js → usdt-BY5OIIvG.js} +3 -3
- package/dist/assets/{usdt-BkDMGqZa.js.map → usdt-BY5OIIvG.js.map} +1 -1
- package/dist/ghostly.mjs +1 -1
- package/package.json +1 -1
- package/dist/assets/api-DlxlF4jP.js.map +0 -1
- package/dist/assets/buttons-CB1opfZP.js +0 -2
- package/dist/assets/host-H0IYKNoK.js.map +0 -1
- package/dist/assets/main-DiCC-Vjq.js.map +0 -1
- package/dist/assets/src-gJqfoRKI.js.map +0 -1
|
@@ -864,12 +864,16 @@ var firstWriter = (who) => !who.write || who.background ? null : who.group ? "gr
|
|
|
864
864
|
* packets) and reads from it only when "Also use Pkarr relays" is on. Adding a
|
|
865
865
|
* relay is one line here; see docs/RELAYS.md for how one is chosen.
|
|
866
866
|
*/
|
|
867
|
-
var DEFAULT_RELAYS = [
|
|
867
|
+
var DEFAULT_RELAYS = [
|
|
868
|
+
"https://pkarr.pubky.org",
|
|
869
|
+
"https://pkarr.pubky.app",
|
|
870
|
+
"https://pkarr.miguelmedeiros.dev"
|
|
871
|
+
];
|
|
868
872
|
/**
|
|
869
873
|
* Relay lists that were the defaults once: a profile that still has one gets today's defaults. When a relay
|
|
870
874
|
* joins `DEFAULT_RELAYS`, the list as it was goes here, so profiles on the old defaults move with it.
|
|
871
875
|
*/
|
|
872
|
-
var PREVIOUS_DEFAULT_RELAYS = [];
|
|
876
|
+
var PREVIOUS_DEFAULT_RELAYS = [["https://pkarr.pubky.org", "https://pkarr.pubky.app"]];
|
|
873
877
|
/** The defaults for `relays` when it is one of the old default lists, `relays` itself otherwise. */
|
|
874
878
|
function currentRelays(relays) {
|
|
875
879
|
const same = (a, b) => a.length === b.length && a.every((relay, i) => relay === b[i]);
|
|
@@ -886,8 +890,8 @@ var WRITE_FIRST_MS = 5e3;
|
|
|
886
890
|
var CHAT_RESERVE_MOST_SHARE = 5 / 6;
|
|
887
891
|
/**
|
|
888
892
|
* A 1:1 chat's signaling (a new offer or answer, and its reads for the answer to its offer, `signal`) may go over a
|
|
889
|
-
* relay's minute by this fraction of it: 6 on a relay of 30, 12 on one of 60, 1 on relay.pkarr.org
|
|
890
|
-
* and never more than that in any minute; its reads leave the last of those to a write. Everything else still stops at
|
|
893
|
+
* relay's minute by this fraction of it: 6 on a relay of 30, 12 on one of 60, 1 on a relay of 5 (relay.pkarr.org and
|
|
894
|
+
* pkarr.miguelmedeiros.dev allow 10), and never more than that in any minute; its reads leave the last of those to a write. Everything else still stops at
|
|
891
895
|
* the limit. The minute before a chat leaves DHT only can be spent by then (the pairing, the texts over the DHT), and
|
|
892
896
|
* its offer or answer, the one thing the contact waits for, then waited 40 s for requests to age out while the
|
|
893
897
|
* contact's attempt gave up: the matrix's extension chat stayed "On DHT · retrying live" 46 times in 120 (2026-09-30).
|
|
@@ -895,7 +899,7 @@ var CHAT_RESERVE_MOST_SHARE = 5 / 6;
|
|
|
895
899
|
var SIGNALING_ALLOWANCE_SHARE = 1 / 5;
|
|
896
900
|
/**
|
|
897
901
|
* A group edge's requests for a member that may be back may go over a relay's minute by this fraction of it (4 on a
|
|
898
|
-
* relay of 30, 8 on one of 60, none on relay
|
|
902
|
+
* relay of 30, 8 on one of 60, none on a relay of 5): its reads of a member that went away and its packet
|
|
899
903
|
* written meanwhile, which that member reads first when it is back (`watch`), its offer or answer, and its reads for
|
|
900
904
|
* the answer to its offer (`signal`). Its reads leave the last of those to a write and go
|
|
901
905
|
* one at a time (`GROUP_OVER_PACE_MS`), so the allowance lasts until the member is back, and the read that finds its
|
|
@@ -991,15 +995,17 @@ var READ_TURNS_KEPT = 512;
|
|
|
991
995
|
var NETWORK_ERROR_COOLDOWN_MS = 2e4;
|
|
992
996
|
/**
|
|
993
997
|
* Relays whose limit per address is far from the others': this client's share of theirs, a minute, in place of
|
|
994
|
-
* `REQUESTS_PER_MINUTE`. relay.pkarr.org (not a default, see docs/RELAYS.md)
|
|
995
|
-
* browser cannot read without CORS exposing it
|
|
998
|
+
* `REQUESTS_PER_MINUTE`. relay.pkarr.org (not a default, see docs/RELAYS.md) and pkarr.miguelmedeiros.dev (a default
|
|
999
|
+
* since 2026-10-17) allow 10 (`x-ratelimit-limit`), which a browser cannot read without CORS exposing it: half of it
|
|
1000
|
+
* leaves room for a second app behind the same address. pkarr.pubky.app allows 1000 (pkarr.pubky.org, on the same address,
|
|
996
1001
|
* 50): 60 of ours leaves room for many peers behind one address, and a page that pairs three contacts in a minute,
|
|
997
1002
|
* about ten requests a relay each, still has requests to spare there (2026-09-28). Writes go to every relay and
|
|
998
1003
|
* count once one took them; reads go to a relay with requests left.
|
|
999
1004
|
*/
|
|
1000
1005
|
var RELAY_REQUESTS_PER_MINUTE = {
|
|
1001
1006
|
"https://relay.pkarr.org": 5,
|
|
1002
|
-
"https://pkarr.pubky.app": 60
|
|
1007
|
+
"https://pkarr.pubky.app": 60,
|
|
1008
|
+
"https://pkarr.miguelmedeiros.dev": 5
|
|
1003
1009
|
};
|
|
1004
1010
|
/**
|
|
1005
1011
|
* The hedge delay for a key whose last read found nothing (404): a relay takes 3 to 5 s to say so (it asks the DHT
|
|
@@ -1556,11 +1562,20 @@ var RelayTransport = class {
|
|
|
1556
1562
|
}
|
|
1557
1563
|
throw new Error("No Pkarr relay reachable");
|
|
1558
1564
|
}
|
|
1559
|
-
/**
|
|
1565
|
+
/**
|
|
1566
|
+
* The order a key's read asks the relays in: in turn per key (see `resolve`), relays found slow lately last. A relay
|
|
1567
|
+
* with a small share of its own (`RELAY_REQUESTS_PER_MINUTE` under `REQUESTS_PER_MINUTE`: pkarr.miguelmedeiros.dev's 5)
|
|
1568
|
+
* takes no turns: it comes after the others, for when they refuse, fail or are slow, unless every relay is one. In the
|
|
1569
|
+
* turn, it was spent in seconds and the relay after it took its turns too: pkarr.pubky.org got two reads in three and
|
|
1570
|
+
* pkarr.pubky.app, with twice its share, one. Its few requests are then left for writes, which go to every relay.
|
|
1571
|
+
*/
|
|
1560
1572
|
readOrder(pubKeyZ32) {
|
|
1573
|
+
const full = this.relays.filter((relay) => !((RELAY_REQUESTS_PER_MINUTE[relay] ?? Infinity) < 30));
|
|
1574
|
+
const ring = full.length ? full : this.relays;
|
|
1561
1575
|
const last = this.lastReadFrom.get(pubKeyZ32), lastAt = last === void 0 ? -1 : this.relays.indexOf(last);
|
|
1562
|
-
const
|
|
1563
|
-
const
|
|
1576
|
+
const after = lastAt < 0 ? -1 : ring.findIndex((relay) => this.relays.indexOf(relay) > lastAt);
|
|
1577
|
+
const start = lastAt < 0 ? this.cursor++ : after < 0 ? 0 : after;
|
|
1578
|
+
const turn = [...ring.map((_, i) => ring[(start + i) % ring.length]), ...this.relays.filter((relay) => !ring.includes(relay))];
|
|
1564
1579
|
const now = Date.now(), slow = (relay) => (this.slowUntil.get(relay) ?? 0) > now;
|
|
1565
1580
|
return [...turn.filter((relay) => !slow(relay)), ...turn.filter(slow)];
|
|
1566
1581
|
}
|
|
@@ -1810,9 +1825,9 @@ var RelayTransport = class {
|
|
|
1810
1825
|
this.spentGroupOver.set(relay, groupOver);
|
|
1811
1826
|
if (isGroupSignal(who) && !who.write && recent.length >= limit && groupOver.length > 0) wait = Math.max(wait, groupOver[groupOver.length - 1] + GROUP_OVER_PACE_MS - now);
|
|
1812
1827
|
if (who.background && !starved) {
|
|
1813
|
-
wait = Math.max(wait, over(recentBackground, this.backgroundPerMinute));
|
|
1828
|
+
wait = Math.max(wait, over(recentBackground, Math.min(this.backgroundPerMinute, Math.ceil(limit * 2 / 3))));
|
|
1814
1829
|
const signaling = this.urgentAt + SIGNALING_WINDOW_MS - now;
|
|
1815
|
-
if (signaling > 0 && !who.door) wait = Math.max(wait, Math.min(signaling, over(recentBackground, this.backgroundWhileSignaling)));
|
|
1830
|
+
if (signaling > 0 && !who.door) wait = Math.max(wait, Math.min(signaling, over(recentBackground, Math.min(this.backgroundWhileSignaling, Math.ceil(limit / 6)))));
|
|
1816
1831
|
}
|
|
1817
1832
|
const burst = (this.spentGroupUrgent.get(relay) ?? []).filter((at) => now - at < GROUP_BURST_MS);
|
|
1818
1833
|
this.spentGroupUrgent.set(relay, burst);
|
|
@@ -6116,6 +6131,15 @@ var LinkSession = class {
|
|
|
6116
6131
|
this.departedUntil = Date.now() + DEPARTED_READ_MS;
|
|
6117
6132
|
this.expectPeer();
|
|
6118
6133
|
}
|
|
6134
|
+
/**
|
|
6135
|
+
* Nothing a read finds can be acted on for a while (a dial waiting out its backoff, whose end has a look of its own):
|
|
6136
|
+
* the windows that look fast for the contact (`expectPeer`, `watchPeer`) end, and the link reads at its pace from the
|
|
6137
|
+
* next read on. An offer of this side's out keeps its window.
|
|
6138
|
+
*/
|
|
6139
|
+
calm() {
|
|
6140
|
+
if (this.rtcSignal !== null) return;
|
|
6141
|
+
this.fastPollUntil = this.fastStepsAfter = this.expectUntil = this.watchUntil = 0;
|
|
6142
|
+
}
|
|
6119
6143
|
/** The data link carries chat and services while it is up. */
|
|
6120
6144
|
setDataLinkOpen(open) {
|
|
6121
6145
|
this.connected = open;
|
|
@@ -6833,6 +6857,10 @@ var DataLink = class {
|
|
|
6833
6857
|
return null;
|
|
6834
6858
|
}
|
|
6835
6859
|
}
|
|
6860
|
+
/** The peer connection this link holds now (null when idle): a later one is another attempt. */
|
|
6861
|
+
get connection() {
|
|
6862
|
+
return this.pc;
|
|
6863
|
+
}
|
|
6836
6864
|
close() {
|
|
6837
6865
|
const stalled = Date.now() - this.connectingSince >= STALLED_EVIDENCE_MS;
|
|
6838
6866
|
const evidence = stalled ? this.directEvidence() : null;
|
|
@@ -16504,14 +16532,28 @@ function unpack(bytes, withLoad, max) {
|
|
|
16504
16532
|
* the same set. Only when there is none (a group's first minute), the one that has been a hub longest. And when none said so lately, a hub asking (`me`)
|
|
16505
16533
|
* that sees no other fresh hub in the beacon is the door alone, listed or not: its own entry may not have reached the
|
|
16506
16534
|
* relays yet (a new group's first hub, whose write the relays' budget holds back), and there is nobody to agree with.
|
|
16535
|
+
*
|
|
16536
|
+
* A hub that says since when it is one (`mine.since`) counts itself among those of the first minute, listed or not, so
|
|
16537
|
+
* the first hub whose entry is held back still reads itself as the door beside a newer hub's entry. And one that became
|
|
16538
|
+
* a hub less than a minute ago, reading no other hub but knowing of one (`mine.known`: the member who let it in, whose
|
|
16539
|
+
* entry may be the one held back), is not the door alone: that hub still is.
|
|
16507
16540
|
*/
|
|
16508
|
-
function doorHubs(hubs, now = Date.now(), me) {
|
|
16541
|
+
function doorHubs(hubs, now = Date.now(), me, mine) {
|
|
16509
16542
|
const lately = hubs.filter((h) => now - h.ts < COMMUNITY_TOPOLOGY.beaconEveryMs * 1.5);
|
|
16510
16543
|
const settled = lately.filter((h) => now - (h.since ?? h.ts) >= 6e4);
|
|
16511
16544
|
const since = (h) => Math.floor((h.since ?? h.ts) / 1e3);
|
|
16512
|
-
const
|
|
16545
|
+
const self = mine && me !== void 0 && !lately.some((h) => h.key === me) ? [{
|
|
16546
|
+
key: me,
|
|
16547
|
+
ts: now,
|
|
16548
|
+
load: 0,
|
|
16549
|
+
since: mine.since
|
|
16550
|
+
}] : [];
|
|
16551
|
+
const first = [...lately, ...self].sort((a, b) => since(a) - since(b) || (a.key < b.key ? -1 : 1)).slice(0, 1);
|
|
16513
16552
|
const door = (settled.length ? settled : first).map((h) => h.key);
|
|
16514
|
-
if (
|
|
16553
|
+
if (me === void 0) return door;
|
|
16554
|
+
const alone = !freshHubs(hubs, now).some((h) => h.key !== me);
|
|
16555
|
+
if (alone && mine && now - mine.since < 6e4 && mine.known.some((key) => key !== me) && door.every((key) => key === me)) return [];
|
|
16556
|
+
if (door.length || !alone) return door;
|
|
16515
16557
|
return [me];
|
|
16516
16558
|
}
|
|
16517
16559
|
var HEAD_BYTES = 52;
|
|
@@ -17463,6 +17505,13 @@ function parseEngineError(text) {
|
|
|
17463
17505
|
/** Unanswered offers are repeated less and less often: 1.5, 3, 6, then every 12 minutes. */
|
|
17464
17506
|
/** After a failed attempt: 20 s, then doubling up to 3 min. Someone opening the chat starts it over. */
|
|
17465
17507
|
var AUTO_CONNECT_RETRY_MS = 2e4;
|
|
17508
|
+
/**
|
|
17509
|
+
* Back after a restart (`resume`), a first automatic dial that failed within this long reached nobody (a HyperDHT hole
|
|
17510
|
+
* punch aborted at once on loopback, 4-13 ms): it is tried again after `INSTANT_FAIL_RETRY_MS`, once, before it counts.
|
|
17511
|
+
* Counted, it held the chat 40 s while the app's other chats came back in 0.5-3 s (DHT-direct lab, 2026-10-17).
|
|
17512
|
+
*/
|
|
17513
|
+
var INSTANT_FAIL_MS = 100;
|
|
17514
|
+
var INSTANT_FAIL_RETRY_MS = 3e3;
|
|
17466
17515
|
/** A group link with nothing to dial looks fast for the member's `_tr` on this many attempts, then at its own pace. */
|
|
17467
17516
|
var PACKET_TRANSPORTS_FAST_ATTEMPTS = 3;
|
|
17468
17517
|
/** A native transport that fails this many attempts in a row is skipped for `DEMOTE_MS`, while another remains (WISP 100). */
|
|
@@ -17478,6 +17527,8 @@ var RESUME_WAIT_MS = 1e4;
|
|
|
17478
17527
|
* 7 ms on loopback and under 0.5 s over a relayed Iroh.
|
|
17479
17528
|
*/
|
|
17480
17529
|
var CROSSED_PROBE_MS = 1500;
|
|
17530
|
+
/** Frames a connection waiting on `probeCrossed` keeps for the session that may take it: a handshake's few. */
|
|
17531
|
+
var PROBE_EARLY_FRAMES = 8;
|
|
17481
17532
|
/** A WebRTC attempt under way, not yet open: what a member's packet saying it has no WebRTC ends (`peerPacketTransports`). */
|
|
17482
17533
|
var WEBRTC_ATTEMPT = /* @__PURE__ */ new Set([
|
|
17483
17534
|
"offering",
|
|
@@ -17970,18 +18021,30 @@ var GhostLink = class {
|
|
|
17970
18021
|
resuming;
|
|
17971
18022
|
/** Until then, a dial waits for the native endpoint `resuming` names to start (it is knocked on as it does). */
|
|
17972
18023
|
resumeWaitUntil = 0;
|
|
18024
|
+
/** The contact's other native transports were knocked on while this resume waited (`knockWhileResuming`). */
|
|
18025
|
+
resumeKnocked = false;
|
|
17973
18026
|
/** What the last live session ran on, kept after it ended: a wake resumes on it (`resumeAfterAbsence`). */
|
|
17974
18027
|
lastLiveOn;
|
|
17975
18028
|
/** `resuming` is a wake's, not a restart's. */
|
|
17976
18029
|
resumingWoke = false;
|
|
17977
18030
|
/** Until then, a session that ends was lost while the app was away (`WAKE_LOST_MS`). */
|
|
17978
18031
|
wokeUntil = 0;
|
|
18032
|
+
/** Back after a restart, the first automatic dial is still to go (`INSTANT_FAIL_MS`). */
|
|
18033
|
+
resumeDial = false;
|
|
18034
|
+
/** That dial failed at once: the next waits `INSTANT_FAIL_RETRY_MS`, not `dialWait`'s backoff. */
|
|
18035
|
+
instantRetry = false;
|
|
17979
18036
|
constructor(options) {
|
|
17980
18037
|
this.options = options;
|
|
17981
18038
|
this.apps = new AppSessions(options.appsOpen);
|
|
17982
18039
|
if (options.pairing?.credentials.signer && (options.dht || options.params.deliveryMode === "dht")) throw new Error("A link that signs through a signer has no DHT delivery");
|
|
17983
18040
|
this.deliveryMode = options.params.deliveryMode ?? "stream";
|
|
17984
|
-
|
|
18041
|
+
const dhtState = options.dht?.state;
|
|
18042
|
+
const takenAtStart = !!options.pairing?.credentials.peerKey && !!dhtState?.inviteTaken && !dhtState.wasLive;
|
|
18043
|
+
const firstPairing = options.pairingProgress ?? (takenAtStart ? {
|
|
18044
|
+
role: "joiner",
|
|
18045
|
+
startedAt: options.madeAt ?? Date.now()
|
|
18046
|
+
} : void 0);
|
|
18047
|
+
this.tracker = firstPairing && options.pairing && (!options.pairing.credentials.peerKey || takenAtStart) && this.deliveryMode !== "dht" ? new PairingTracker(firstPairing.role, firstPairing.startedAt, (progress) => {
|
|
17985
18048
|
traceLink(this.myPubKeyZ32, "progress", {
|
|
17986
18049
|
stage: progress.stage,
|
|
17987
18050
|
attempt: progress.attempt,
|
|
@@ -18086,6 +18149,7 @@ var GhostLink = class {
|
|
|
18086
18149
|
this.fallback = options.native?.fallback ?? true;
|
|
18087
18150
|
this.automatic = options.native?.automatic ?? !options.native?.preferred;
|
|
18088
18151
|
this.resuming = options.pairing?.credentials.peerKey && options.params.profile ? options.resume : void 0;
|
|
18152
|
+
this.resumeDial = !!this.resuming && !options.packetTransports;
|
|
18089
18153
|
const events = options.events ?? {};
|
|
18090
18154
|
this.session = new LinkSession({
|
|
18091
18155
|
params: options.params,
|
|
@@ -18217,7 +18281,7 @@ var GhostLink = class {
|
|
|
18217
18281
|
if (this.rtcStartedUnpinned) this.openedUnpinned.add(channel);
|
|
18218
18282
|
const plan = this.switcher.pending;
|
|
18219
18283
|
if (plan?.choices.includes("webrtc/1") && this.paired?.state.status === "ready") this.attachCandidate(channel, void 0, plan).catch(() => {});
|
|
18220
|
-
else if (this.activeBinding)
|
|
18284
|
+
else if (this.activeBinding) this.rtcOverHeld(channel);
|
|
18221
18285
|
else this.attach(channel);
|
|
18222
18286
|
},
|
|
18223
18287
|
onClose: () => {
|
|
@@ -18344,6 +18408,10 @@ var GhostLink = class {
|
|
|
18344
18408
|
upgrade: () => !!this.options.upgradeSupport && this.sessionCapabilities.agreed("upgrade/1")
|
|
18345
18409
|
});
|
|
18346
18410
|
if (options.native?.automatic === false) this.switcher.choseApart();
|
|
18411
|
+
if (takenAtStart) {
|
|
18412
|
+
this.tracker?.pinnedOverDht();
|
|
18413
|
+
this.tracker?.failed("taken", false, INVITE_TAKEN);
|
|
18414
|
+
}
|
|
18347
18415
|
}
|
|
18348
18416
|
get myPubKeyZ32() {
|
|
18349
18417
|
return this.session.identity.pubKeyZ32;
|
|
@@ -19706,6 +19774,22 @@ var GhostLink = class {
|
|
|
19706
19774
|
this.knockedEarly = epoch;
|
|
19707
19775
|
this.knockEarly(epoch, direct);
|
|
19708
19776
|
}
|
|
19777
|
+
/**
|
|
19778
|
+
* Back after a restart on a native transport whose endpoint has not started yet (Iroh waits up to 10 s for its relay,
|
|
19779
|
+
* and does not start at all with the relay out of reach): the contact's other direct transports that are up here are
|
|
19780
|
+
* knocked on meanwhile, once per resume, as a resume over WebRTC knocks as its offer goes out. The contact still holds
|
|
19781
|
+
* its old session and reads slowly; before, the chat waited out `RESUME_WAIT_MS` and then the race's 8 s (20.5-22.9 s
|
|
19782
|
+
* between two CLIs, bh-zero43). The first live wins, and the resumed transport is still knocked once it starts.
|
|
19783
|
+
*/
|
|
19784
|
+
knockWhileResuming() {
|
|
19785
|
+
if (this.resumeKnocked || !this.fallback || !this.peerFallback || this.dialing || this.channel) return;
|
|
19786
|
+
const relayed = this.upgradesFromRelay() ? [] : this.relayedTransports;
|
|
19787
|
+
const offer = this.transportOffer();
|
|
19788
|
+
const direct = TRANSPORTS.filter((t) => t !== "webrtc/1" && t !== this.resuming && this.endpoints.has(t) && offer.includes(t) && !!this.peerTransports?.includes(t) && !relayed.includes(t) && this.canDial(t));
|
|
19789
|
+
if (!direct.length) return;
|
|
19790
|
+
this.resumeKnocked = true;
|
|
19791
|
+
this.knockEarly(this.connectionEpoch, direct, () => true);
|
|
19792
|
+
}
|
|
19709
19793
|
async knockEarly(epoch, transports, standing = () => this.offerOut) {
|
|
19710
19794
|
this.knockingEarly = true;
|
|
19711
19795
|
try {
|
|
@@ -20077,12 +20161,16 @@ var GhostLink = class {
|
|
|
20077
20161
|
*/
|
|
20078
20162
|
maybeAutoConnect(presence) {
|
|
20079
20163
|
if (this.stopped || this.leaving || this.yielding || this.streamBlocked || this.keyStopped || !this.options.autoConnect || !presence.online || this.channel || this.dialing || this.dataLink.state !== "idle") return;
|
|
20080
|
-
if (this.resuming && this.resuming !== "webrtc/1" && !this.endpoints.has(this.resuming) && Date.now() < this.resumeWaitUntil)
|
|
20164
|
+
if (this.resuming && this.resuming !== "webrtc/1" && !this.endpoints.has(this.resuming) && Date.now() < this.resumeWaitUntil) {
|
|
20165
|
+
this.knockWhileResuming();
|
|
20166
|
+
return;
|
|
20167
|
+
}
|
|
20081
20168
|
if (this.departed) {
|
|
20082
20169
|
if (presence.lastPacketAt === this.departed.packet && Date.now() < this.departed.until) return;
|
|
20083
20170
|
this.departed = null;
|
|
20084
20171
|
}
|
|
20085
|
-
|
|
20172
|
+
const pairing = !!this.tracker && !this.tracker.done && this.tracker.progress.stage !== "on-dht";
|
|
20173
|
+
if ((pairing ? this.options.pairingProgress?.role : void 0) === "inviter") {
|
|
20086
20174
|
this.peerSeenAt ||= Date.now();
|
|
20087
20175
|
if (Date.now() - this.peerSeenAt < 2500 && !this.nothingToAwait()) {
|
|
20088
20176
|
this.session.expectPeer();
|
|
@@ -20101,6 +20189,7 @@ var GhostLink = class {
|
|
|
20101
20189
|
failures: this.autoConnectFailures,
|
|
20102
20190
|
left: wait - (Date.now() - this.lastAutoConnectAt)
|
|
20103
20191
|
});
|
|
20192
|
+
if (!pairing && !this.options.packetTransports && this.myPubKeyZ32 < this.options.params.peerPubKeyZ32 && Date.now() >= this.lostUntil) this.session.calm();
|
|
20104
20193
|
this.lookAtRetry();
|
|
20105
20194
|
return;
|
|
20106
20195
|
}
|
|
@@ -20114,11 +20203,18 @@ var GhostLink = class {
|
|
|
20114
20203
|
* 12 s: the pairing turned `on-dht` and the next dial waited 160 s, though nothing had been tried.
|
|
20115
20204
|
*/
|
|
20116
20205
|
autoDial() {
|
|
20117
|
-
const tries = this.anythingToDial();
|
|
20118
|
-
|
|
20206
|
+
const tries = this.anythingToDial(), started = Date.now();
|
|
20207
|
+
const resumeDial = tries && this.resumeDial;
|
|
20208
|
+
if (tries) this.resumeDial = false;
|
|
20209
|
+
this.instantRetry = false;
|
|
20210
|
+
this.lastAutoConnectAt = started;
|
|
20119
20211
|
if (tries) this.autoConnectFailures++;
|
|
20120
20212
|
this.dial().catch((error) => {
|
|
20121
|
-
if (
|
|
20213
|
+
if (resumeDial && Date.now() - started < INSTANT_FAIL_MS && this.lastAutoConnectAt === started && this.autoConnectFailures > 0) {
|
|
20214
|
+
this.autoConnectFailures--;
|
|
20215
|
+
this.instantRetry = true;
|
|
20216
|
+
traceLink(this.myPubKeyZ32, "dial-instant-fail", { ms: Date.now() - started });
|
|
20217
|
+
} else if (tries) this.tracker?.failed("transport", true);
|
|
20122
20218
|
this.dialFailed(error instanceof Error ? error.message : String(error));
|
|
20123
20219
|
this.lookAtRetry();
|
|
20124
20220
|
});
|
|
@@ -20191,6 +20287,7 @@ var GhostLink = class {
|
|
|
20191
20287
|
}
|
|
20192
20288
|
/** How long after the last automatic dial the next one may go. A first pairing tries again sooner: the contact just read the invite and is waiting. */
|
|
20193
20289
|
dialWait() {
|
|
20290
|
+
if (this.instantRetry) return INSTANT_FAIL_RETRY_MS;
|
|
20194
20291
|
return !!this.tracker && !this.tracker.done && this.tracker.progress.stage !== "on-dht" ? Math.min(PAIRING_RETRY_MS * 2 ** this.autoConnectFailures, PAIRING_MAX_RETRY_MS) : Math.min(AUTO_CONNECT_RETRY_MS * 2 ** this.autoConnectFailures, AUTO_CONNECT_MAX_RETRY_MS);
|
|
20195
20292
|
}
|
|
20196
20293
|
/** The name this side shows, told to a paired peer directly. */
|
|
@@ -21068,9 +21165,25 @@ var GhostLink = class {
|
|
|
21068
21165
|
}
|
|
21069
21166
|
this.replaceWith(channel, binding);
|
|
21070
21167
|
}
|
|
21168
|
+
/**
|
|
21169
|
+
* The contact's WebRTC opened while this side holds a native session, with no switch under way. A contact offers only
|
|
21170
|
+
* with no session of its own: its app is back after a crash, with no way to the held transport (its Iroh relay out of
|
|
21171
|
+
* reach, its listener not up yet), and the held session is dead without this side having heard. Closed at once, the
|
|
21172
|
+
* contact counted a failed dial and waited its backoff: live again 52.8 s after its start (two CLIs over a chosen Iroh
|
|
21173
|
+
* whose relay stopped, bug hunt 2026-10-17). The held session is pinged as for a crossing (`probeCrossed`): heard from,
|
|
21174
|
+
* the WebRTC closes, as before; silent, it takes over. Before the pin, or while the held one authenticates, it closes.
|
|
21175
|
+
*/
|
|
21176
|
+
rtcOverHeld(channel) {
|
|
21177
|
+
const held = this.channel;
|
|
21178
|
+
if (!held || this.candidate || !this.options.pairing?.credentials.peerKey || !this.options.params.profile || this.paired?.state.status !== "ready") {
|
|
21179
|
+
channel.close();
|
|
21180
|
+
return;
|
|
21181
|
+
}
|
|
21182
|
+
this.probeCrossed(held, channel);
|
|
21183
|
+
}
|
|
21071
21184
|
replaceWith(channel, binding) {
|
|
21072
21185
|
traceLink(this.myPubKeyZ32, "replacing", {
|
|
21073
|
-
transport: binding
|
|
21186
|
+
transport: binding?.transport ?? "webrtc/1",
|
|
21074
21187
|
held: this.paired?.state.transport
|
|
21075
21188
|
});
|
|
21076
21189
|
this.attach(channel, binding, {
|
|
@@ -21090,7 +21203,7 @@ var GhostLink = class {
|
|
|
21090
21203
|
probeCrossed(held, channel, binding) {
|
|
21091
21204
|
this.dropCrossedProbe();
|
|
21092
21205
|
traceLink(this.myPubKeyZ32, "dial-crossed", {
|
|
21093
|
-
transport: binding
|
|
21206
|
+
transport: binding?.transport ?? "webrtc/1",
|
|
21094
21207
|
held: true,
|
|
21095
21208
|
probe: true
|
|
21096
21209
|
});
|
|
@@ -21098,6 +21211,16 @@ var GhostLink = class {
|
|
|
21098
21211
|
try {
|
|
21099
21212
|
this.sendPing(held, false);
|
|
21100
21213
|
} catch {}
|
|
21214
|
+
const early = [];
|
|
21215
|
+
channel.onMessage = (data) => {
|
|
21216
|
+
if (early.length < PROBE_EARLY_FRAMES) early.push(data);
|
|
21217
|
+
};
|
|
21218
|
+
const take = (attach) => {
|
|
21219
|
+
channel.onMessage = null;
|
|
21220
|
+
attach();
|
|
21221
|
+
const read = channel.onMessage;
|
|
21222
|
+
for (const data of early) read?.(data);
|
|
21223
|
+
};
|
|
21101
21224
|
const timer = setTimeout(() => {
|
|
21102
21225
|
if (this.crossedProbe?.channel !== channel) return;
|
|
21103
21226
|
this.crossedProbe = null;
|
|
@@ -21106,15 +21229,15 @@ var GhostLink = class {
|
|
|
21106
21229
|
return;
|
|
21107
21230
|
}
|
|
21108
21231
|
if (!this.channel) {
|
|
21109
|
-
this.attach(channel, binding);
|
|
21232
|
+
take(() => this.attach(channel, binding));
|
|
21110
21233
|
return;
|
|
21111
21234
|
}
|
|
21112
21235
|
if (this.channel === held && this.framesHeard !== heard) {
|
|
21113
21236
|
channel.close();
|
|
21114
21237
|
return;
|
|
21115
21238
|
}
|
|
21116
|
-
traceLink(this.myPubKeyZ32, "crossed-held-silent", { transport: binding
|
|
21117
|
-
this.replaceWith(channel, binding);
|
|
21239
|
+
traceLink(this.myPubKeyZ32, "crossed-held-silent", { transport: binding?.transport ?? "webrtc/1" });
|
|
21240
|
+
take(() => this.replaceWith(channel, binding));
|
|
21118
21241
|
}, CROSSED_PROBE_MS);
|
|
21119
21242
|
channel.onClose = () => {
|
|
21120
21243
|
if (this.crossedProbe?.channel === channel) {
|
|
@@ -21251,8 +21374,9 @@ var GhostLink = class {
|
|
|
21251
21374
|
this.activeBinding = binding;
|
|
21252
21375
|
this.channelSince = Date.now();
|
|
21253
21376
|
oldPaired?.stop();
|
|
21377
|
+
const oldRtc = oldBinding ? null : this.dataLink.connection;
|
|
21254
21378
|
if (oldChannel) this.retire(oldChannel, () => {
|
|
21255
|
-
if (
|
|
21379
|
+
if (oldRtc && this.activeBinding && this.dataLink.connection === oldRtc) this.dataLink.close();
|
|
21256
21380
|
}, !oldBinding);
|
|
21257
21381
|
this.session.setDataLinkOpen(true);
|
|
21258
21382
|
if (migration.plan) switched = {
|
|
@@ -21906,6 +22030,7 @@ var GhostLink = class {
|
|
|
21906
22030
|
traceLink(this.myPubKeyZ32, "wake-resume", { transport });
|
|
21907
22031
|
if (transport !== "webrtc/1") {
|
|
21908
22032
|
this.resumeWaitUntil = Date.now() + RESUME_WAIT_MS;
|
|
22033
|
+
this.resumeKnocked = false;
|
|
21909
22034
|
return;
|
|
21910
22035
|
}
|
|
21911
22036
|
if (this.dataLink.state === "answering" && this.answeringEpoch === this.connectionEpoch) {
|
|
@@ -31257,4 +31382,4 @@ function appStoreDecision(held, read) {
|
|
|
31257
31382
|
//#endregion
|
|
31258
31383
|
export { COMMUNITY_EDIT_FRAME as $, buttonLabelClash as $a, currentRelays as $c, revokesIdentity as $i, GROUP_FILE_LIMITS as $n, extractParamsFromSdp as $o, WAKE_CALL_INTERVAL_MS as $r, ENROLL_DONE as $s, didDhtFromPublicKey as $t, CommunitySession as A, forwardedAgain as Aa, devicePingFrame as Ac, isPublicAddress as Ai, pubkyProofFile as An, rosterAdmin as Ao, newerHead as Ar, handoffOfferFrame as As, verifyAtprotoRecordProof as At, knockRecords as B, readReaction as Ba, TURN_MAX as Bc, capsDescriptors as Bi, findEndpoint as Bn, GhostlyHttpError as Bo, transferStalled as Br, readHandoffHave as Bs, didWebDocumentUrl as Bt, sha256Paced as C, parseImageMeta as Ca, DEVICES_CAPABILITY as Cc, readManifest as Ci, randomBytes as Cl, isBitcoinAddress as Cn, canonicalJsonBytes as Co, beaconRecords as Cr, handoffContext as Cs, atprotoProofRkey as Ct, openGroupTyping as D, RateWindow as Da, deviceEchoNonce as Dc, domainTxtRecord as Di, utf8Encode as Dl, newPubkyProofFolder as Dn, MEMBER_KEY as Do, lobbyRecords as Dr, handoffEphemeral as Ds, parseAtprotoDidDocument as Dt, groupTypingEpoch as E, EDIT_RATE_WINDOW_MS as Ea, deviceEchoFrame as Ec, dnsProofName as Ei, utf8Decode as El, isPubkyProofFolder as En, MAX_GROUP_CHAIN as Eo, lobbyKeys as Er, handoffDigest as Es, normalizeAtprotoHandle as Et, KNOCK_TTL_MS as F, ReactionWindow as Fa, TURN_RAISE_READ_TIMEOUT_MS as Fc, recordsName as Fi, resolveLightningDestination as Fn, AWAITING_PEER_MS as Fo, readLobby as Fr, handoffVersions as Fs, checkDidJws as Ft, groupWakeFrame as G, replySnippet as Ga, signTurnRelease as Gc, IdentityCheckUnavailable as Gi, INVITE_TAKEN as Gn, decodeControl as Go, typingActivity as Gr, sealHandoffPiece as Gs, normalizeDid as Gt, readKnocks as H, wireReaction as Ha, nextTurnPosition as Hc, IDENTITY_MAX_EVIDENCE as Hi, parseCashuRequestPayload as Hn, parseLocalTarget as Ho, TYPING_REFRESH_MS as Hr, readHandoffPake as Hs, didWebFileNames as Ht, decodeGroupEntryLink as I, nextReactionNumber as Ia, TURN_SETTLE_MS as Ic, txtValue as Ii, decodeBolt11 as In, DHT_POLL_INTERVALS as Io, shouldBeHub as Ir, newHandoffId as Is, checkDidSignature as It, GROUP_LIMITS as J, PR_CHECKS as Ja, turnName as Jc, emptyIdentityLedger as Ji, pairedMessageFits as Jn, RTC_CONFIG as Jo, mayPin as Jr, readSetUpdate as Js, parseDidSignaturePaste as Jt, groupWakes as K, BUTTON_ID as Ka, turnInstance as Kc, IdentityExchange as Ki, LIVENESS_PING_MS as Kn, encodeControl as Ko, GROUP_PIN_FRAME as Kr, SET_ACK as Ks, parseDid as Kt, encodeGroupEntryLink as L, queueReaction as La, classifyTurnRead as Lc, wellKnownUrl as Li, ENDPOINT as Ln, EXPECT_PEER_MS as Lo, ChatFiles as Lr, readHandoffAck as Ls, didGhostlyServiceEntry as Lt, communityHasFrame as M, COMMUNITY_REACTION_FRAME as Ma, seedSigner as Mc, normalizeDomain as Mi, homeserverWebEndpoint as Mn, verifyCommitSignature as Mo, rankHubs as Mr, handoffReleaseFrame as Ms, DID_FILE_MAX_BYTES as Mt, decodeCommunityLink as N, GROUP_REACTION_FRAME as Na, webCryptoSigner as Nc, recordsFromTxt as Ni, pubkyHomeserverOf as Nn, edgeParams as No, readBeacon as Nr, handoffRetryAfter as Ns, DID_JWS_MAX_LENGTH as Nt, sealGroupTyping as O, dhtEditId as Oa, deviceKeyZ32 as Oc, domainWellKnownFile as Oi, normalizePubkyKey as On, commitHash as Oo, mergeBeacon as Or, handoffHelloFrame as Os, shortAtprotoDid as Ot, encodeCommunityLink as P, REACTION_LIMITS as Pa, TURN_PUT_WINDOW_MS as Pc, recordsFromWellKnown as Pi, requestLnurlInvoice as Pn, DirectPathWatch as Po, readBeaconHead as Pr, handoffStreamKey as Ps, DidError as Pt, frameBytes as Q, appCardId as Qa, RelayTransport as Qc, receivedIdentityStatus as Qi, parseEngineError as Qn, callSignalHeardAt as Qo, readPin as Qr, verifySetUpdate as Qs, didDhtDocument as Qt, entryParams as R, reactionEmoji as Ra, turnPutSummary as Rc, CapsExchange as Ri, cashuRequestPayload as Rn, RELAY_POLL_INTERVALS as Ro, FILE_LIMITS as Rr, readHandoffCancel as Rs, didJwsAlg as Rt, readAppBundleAsync as S, parseVideoMeta as Sa, ownInviteRefusal as Sc, newMailbox as Si, isZ32Key as Sl, sparkInvoiceDetails as Sn, canonicalJson as So, beaconKeys as Sr, handoffCancelFrame as Ss, atprotoProofRecord as St, GroupTypingBoard as T, EDIT_BUFFER_MS as Ta, HANDOFF_CAPABILITY as Tc, decodeDnsResponse as Ti, toZ32 as Tl, isPubkyKey as Tn, GROUP_MEMBER_CAP as To, freshHubs as Tr, handoffDataFrame as Ts, isAtprotoDid as Tt, GROUP_WAKE_FRAME as U, pairedReplyAuthor as Ua, readTurnPacket as Uc, IDENTITY_MAX_VALIDITY as Ui, parseFedimintRequestPayload as Un, webLocalFetch as Uo, TypingSender as Ur, readHandoffTurnFrame as Us, didWebFileUrl as Ut, mergeKnocks as V, validReactionNumber as Va, firstDeviceSetSecret as Vc, dialDescriptors as Vi, isFederationId as Vn, formatLocalTarget as Vo, TYPING_KINDS as Vr, readHandoffHello as Vs, didWebFile as Vt, GroupWakeLimiter as W, readReply as Wa, signTurnPacket as Wc, IDENTITY_REVOCATION_LABEL as Wi, GhostLink as Wn, LIMITS as Wo, sanitizeTypingStatus as Wr, readHandoffVerified as Ws, didWebHost as Wt, GROUP_READ_NOTE as X, RUN_RESULTS as Xa, turnVerifierMark as Xc, identityStatement as Xi, engineError as Xn, buildSdpFromSignal as Xo, pinIsNewer as Xr, setUpdateFrame as Xs, staticDidDocument as Xt, GROUP_REACTED_FRAME as Y, PR_STATES as Ya, turnStatedVerifier as Yc, identityRevocationValue as Yi, pairedMessageFrame as Yn, answersOffer as Yo, nextPinNumber as Yr, setAckFrame as Ys, signingKeys as Yt, GroupSession as Z, STATUS_CARD_LIMITS as Za, DEFAULT_RELAYS as Zc, newIdentityBinding as Zi, engineText as Zn, callRtcConfig as Zo, pinNumberHolds as Zr, signTombstone as Zs, strictBase64Url as Zt, assembleAppBundle as _, VOICE_LIMITS as _a, createChatInvite as _c, HOLD_DATED_BACK_MS as _i, MAX_AVATAR_LENGTH as _l, validatePaymentTarget as _n, isAppRef as _o, MESH_HUBS as _r, filePartName as _s, ATPROTO_DECLARED_SCOPE as _t, planAppUpdate as a, automaticTransport as aa, enrollDigits as ac, wakeRequest as ai, withRequestOptions as al, EVM_TEST_CHAINS as an, arrivalKey as ao, isGroupMessageId as ar, serviceIdFromName as as, groupName as at, pacer as b, parseVoiceMeta as ba, inviteLink as bc, HoldRefusedError as bi, bytesEqual as bl, SPARK_PROVIDER as bn, signAppObject as bo, pickMeshHubs as br, handoffAttemptSucceeded as bs, ATPROTO_PROOF_SCOPE as bt, readAppStore as c, DHT_FILE_TOO_LARGE as ca, enrollHelloFrame as cc, APP_DATA_MAX_BYTES as ci, createRelayPayload as cl, SEPOLIA_TEST_USDT as cn, receivedTimestamp as co, readGroupWant as cr, HANDOFF_DONE as cs, SshSigError as ct, APP_BUNDLE_LIMITS as d, DHT_FILE_CAPABILITY as da, readEnrollHello as dc, APPS_CAPABILITY as di, parseRelayPayload as dl, USDT_PUBLIC_RPC as dn, APP_STATEMENT_LIMITS as do, GROUP_SIGNAL_FRAME as dr, HANDOFF_OFFER as ds, sameSshKey as dt, lastSharedWithMe as ea, ENROLL_GRANT as ec, WakeLimiter as ei, normalizeRelayUrl as el, encodeDidDhtDeactivated as en, cardLine as eo, GROUP_HAVE_FRAME as er, parseCallSignal as es, GROUP_EDIT_FRAME as et, APP_BUNDLE_MAGIC as f, dhtFileId as fa, verifyEnrollProof as fc, BUTTONS_CAPABILITY as fi, createIdentity as fl, WALLET_NETWORKS as fn, appFingerprint as fo, SIGNAL_FRESH_MS as fr, HANDOFF_PAKE as fs, sshSignCommand as ft, appViewOf as g, PLAYABLE_AUDIO as ga, OwnInviteError as gc, HOLD_CAPABILITY as gi, verify as gl, formatPaymentAmount as gn, isAppKey as go, readGroupSignal as gr, HANDOFF_VERIFIED as gs, decodeAnyBitcoinAddress as gt, appDigest as h, sanitizeMime as ha, readDeviceInvite as hc, UPGRADE_CAPABILITY as hi, publicKeyFromZ32 as hl, assertWholeSats as hn, isAppHash as ho, groupSignalFrame as hr, HANDOFF_TIMINGS as hs, BitcoinAddressError as ht, checkAppBeforeRun as i, TRANSPORTS as ia, enrollCancelReason as ic, relayRequest as ii, isDiscoveryBudgetError as il, ETHEREUM_USDT as in, statusCardText as io, groupFileFallback as ir, LEGACY_SERVICES as is, mentionsMember as it, GROUP_READ_NOTE_COMMUNITY as j, readForwarded as ja, newDeviceSetSecret as jc, nip05RootKey as ji, pubkyProofPath as jn, rosterHas as jo, pickHubs as jr, handoffPakeFrame as js, DID_DOCUMENT_MAX_BYTES as jt, COMMUNITY_LIMITS as k, parseLinkPreview as ka, deviceLinkPairing as kc, encodeDnsQuery as ki, pubkyProofCapability as kn, parseGroupCommit as ko, mergeLobby as kr, handoffManifestFrames as ks, AtprotoProofError as kt, readAppStoreSteps as l, DHT_MESSAGE_TTL as la, enrollProofFrame as lc, chatAppId as li, newerPacket as ll, SEPOLIA_TEST_USDT_FAUCET as ln, shownTime as lo, readGroupWantNo as lr, HANDOFF_HAVE as ls, parseSshPublicKey as lt, APP_PERMISSIONS as m, sanitizeFileName as ma, deviceInviteJoinerParams as mc, STATUS_CARD_CAPABILITY as mi, identityFromSeedB64 as ml, assertTokenUnits as mn, checkAppRevokeStatement as mo, SIGNAL_REPLY_MS as mr, HANDOFF_REQUEST as ms, verifyBitcoinMessage as mt, appStoreDecision as n, emptyProofLedger as na, ENROLL_PROOF as nc, newWakeToken as ni, traceLink as nl, resolveDidDht as nn, checkStatusCard as no, GROUP_WANT_NO_FRAME as nr, emptyLinkRecords as ns, carryMentions as nt, APP_STORE_LIMITS as o, irohDescriptor as oa, enrollDoneFrame as oc, checkPushEndpoint as oi, PacketTooLargeError as ol, ONCHAIN_PROVIDER as on, claimedTime as oo, readGroupFileMeta as or, HANDOFF_ACK as os, SSHSIG_MAX_ARMOR as ot, APP_ICON_PATH as p, formatFileSize as pa, createDeviceInvite as pc, EDIT_CAPABILITY as pi, identityFromSeed as pl, arkAddressPrefix as pn, appRef as po, SIGNAL_HOLD_MS as pr, HANDOFF_PIECE_BYTES as ps, verifySshSignature as pt, parseGroupWakeFrame as q, ITEM_STATES as qa, turnKeys as qc, boundVerifiedIdentity as qi, PAIRED_FRAME_TOO_LARGE as qn, CALL_SIGNAL_MAX_AGE_MS as qo, PIN_LIMITS as qr, SET_UPDATE as qs, parseDidDocument as qt, appUpdateDecision as r, validExternalKey as ra, enrollCancelFrame as rc, parseWakeFrame as ri, budgetRetryMs as rl, signDidDhtPacket as rn, sameButtonText as ro, fetchesByItself as rr, HTTP_SERVICE_PROTO as rs, parseCommunityEdit as rt, checkAppStoreIndex as s, irohRelayUrl as sa, enrollGrantFrame as sc, vapidKeysMatch as si, RELAY_PAYLOAD_MAX_BYTES as sl, PaymentPreflightError as sn, heardTime as so, readGroupHave as sr, HANDOFF_CANCEL as ss, SSHSIG_NAMESPACE as st, appRevocationFor as t, PeerProofs as ta, ENROLL_HELLO as tc, deviceWakeRequest as ti, setLinkTraceSink as tl, encodeDidDhtPacket as tn, cardUrl as to, GROUP_WANT_FRAME as tr, signalHasVideo as ts, GROUP_EDIT_TEXT_BYTES as tt, signAppStore as u, peekDhtMailbox as ua, readEnrollGrant as uc, isAppVersion as ui, openRelayPayload as ul, TEST_USDT_FAUCET_AMOUNT as un, APP_PREFIXES as uo, CarriedTransport as ur, HANDOFF_HELLO as us, parseSshSignature as ut, checkAppManifest as v, baseMime as va, decodeInviteCode as vc, HOLD_LIMITS as vi, sanitizeAvatar as vl, walletNetworkOf as vn, readAppRevocation as vo, mayBeHub as vr, handoffAttemptAllowed as vs, ATPROTO_FULL_SCOPE as vt, GROUP_TYPING_FRAME as w, readImageMeta as wa, ENROLL_CAPABILITY as wc, DOMAIN_FILE_MAX_BYTES as wi, toBase64Url as wl, PUBKY_PROOF_MAX_BYTES as wn, readCanonicalJson as wo, doorHubs as wr, handoffContextProof as ws, checkAtprotoProofRecord as wt, readAppBundle as x, voicePeaksOf as xa, inviteOwnership as xc, isHoldUrl as xi, fromBase64Url as xl, sparkAddressKind as xn, signAppRevocation as xo, COMMUNITY_TOPOLOGY as xr, handoffBusyFrame as xs, atprotoDidMethod as xt, isAppUrl as y, fileMessageText as ya, encodeInviteCode as yc, HoldKeys as yi, sanitizeDisplayText as yl, SPARK_NETWORKS as yn, readAppRevocations as yo, meshHubs as yr, handoffAttemptFailed as ys, ATPROTO_PROOF_COLLECTION as yt, knockIdentity as z, reactionIsNewer as za, TURN_LAST_SEQUENCE as zc, DHT_TEXT_CAPABILITY as zi, fedimintRequestPayload as zn, presenceSeenAt as zo, transferEnded as zr, readHandoffDone as zs, didSignedMessages as zt };
|
|
31259
31384
|
|
|
31260
|
-
//# sourceMappingURL=src-
|
|
31385
|
+
//# sourceMappingURL=src-Dg1bvMNv.js.map
|