@ghostlytools/cli 1.2.2 → 1.2.3
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/assets/{arkade-_gS9wShF.js → arkade-B-ALutmU.js} +2 -2
- package/dist/assets/{arkade-_gS9wShF.js.map → arkade-B-ALutmU.js.map} +1 -1
- package/dist/assets/{hyperdhtRelay-CgYLaQz3.js → hyperdhtRelay-hKC9DpIH.js} +3 -3
- package/dist/assets/{hyperdhtRelay-CgYLaQz3.js.map → hyperdhtRelay-hKC9DpIH.js.map} +1 -1
- package/dist/assets/{mainline-1v8OTYvp.js → mainline-DriRu_hb.js} +2 -2
- package/dist/assets/{mainline-1v8OTYvp.js.map → mainline-DriRu_hb.js.map} +1 -1
- package/dist/assets/{server-Cy4ox7oD.js → server-DHMXMwNn.js} +867 -142
- package/dist/assets/server-DHMXMwNn.js.map +1 -0
- package/dist/assets/{src-XzcHzneo.js → src-_FzJkeAJ.js} +187 -44
- package/dist/assets/src-_FzJkeAJ.js.map +1 -0
- package/dist/assets/{usdt-Deo3g0Nq.js → usdt-D0lO2pRR.js} +2 -2
- package/dist/assets/{usdt-Deo3g0Nq.js.map → usdt-D0lO2pRR.js.map} +1 -1
- package/dist/ghostly.mjs +245 -82
- package/dist/ghostly.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/assets/server-Cy4ox7oD.js.map +0 -1
- package/dist/assets/src-XzcHzneo.js.map +0 -1
|
@@ -2003,6 +2003,33 @@ function turnSequence(turn, rev, author) {
|
|
|
2003
2003
|
if (!Number.isInteger(author) || author < 0 || author >= 4) throw new Error("An author is a slot, 0 to 3");
|
|
2004
2004
|
return turn * 2 ** 20 + rev * 4 + author;
|
|
2005
2005
|
}
|
|
2006
|
+
var VERIFIER_DOMAIN = "ghostly-turn-verifier/1";
|
|
2007
|
+
var VERIFIER_TAG = Uint8Array.of(103, 118);
|
|
2008
|
+
var VERIFIER_TAG_AT = 3;
|
|
2009
|
+
var VERIFIER_MARK_AT = 5;
|
|
2010
|
+
/** The mark of a verifier (its `setup` and `record` as stored), or of a profile that has none (null). 3 bytes. */
|
|
2011
|
+
function turnVerifierMark(verifier) {
|
|
2012
|
+
return sha256(utf8Encode(`${VERIFIER_DOMAIN}\n${verifier?.setup ?? ""}\n${verifier?.record ?? ""}`)).slice(0, 3);
|
|
2013
|
+
}
|
|
2014
|
+
/**
|
|
2015
|
+
* A record's `instance` that states `mark` (`turnVerifierMark`), or, with no mark, one that states nothing: 8 random
|
|
2016
|
+
* bytes that never carry the marker (a tombstone, a record written where the profile's verifier is not at hand).
|
|
2017
|
+
*/
|
|
2018
|
+
function turnInstance(mark, random = randomBytes) {
|
|
2019
|
+
if (mark && mark.length !== 3) throw new Error("A verifier mark is 3 bytes");
|
|
2020
|
+
const instance = random(8).slice(0, 8);
|
|
2021
|
+
if (instance.length !== 8) throw new Error("An instance is 8 bytes");
|
|
2022
|
+
if (mark) {
|
|
2023
|
+
instance.set(VERIFIER_TAG, VERIFIER_TAG_AT);
|
|
2024
|
+
instance.set(mark, VERIFIER_MARK_AT);
|
|
2025
|
+
} else if (turnStatedVerifier(instance)) instance[VERIFIER_TAG_AT] ^= 255;
|
|
2026
|
+
return instance;
|
|
2027
|
+
}
|
|
2028
|
+
/** The verifier mark an `instance` states, or null when it states none (a record written by an app from before). */
|
|
2029
|
+
function turnStatedVerifier(instance) {
|
|
2030
|
+
if (instance.length !== 8 || instance[VERIFIER_TAG_AT] !== VERIFIER_TAG[0] || instance[4] !== VERIFIER_TAG[1]) return null;
|
|
2031
|
+
return instance.slice(VERIFIER_MARK_AT);
|
|
2032
|
+
}
|
|
2006
2033
|
var TurnRecordError = class extends Error {
|
|
2007
2034
|
refusal;
|
|
2008
2035
|
constructor(refusal, detail) {
|
|
@@ -4309,6 +4336,7 @@ function parseCallSignal(json, now = Date.now()) {
|
|
|
4309
4336
|
if (raw.t !== "a" || typeof raw.re !== "number" || !Number.isFinite(raw.re)) return null;
|
|
4310
4337
|
restart.re = raw.re;
|
|
4311
4338
|
}
|
|
4339
|
+
const closed = raw.vr === 0 ? { vr: 0 } : {};
|
|
4312
4340
|
if (raw.o !== void 0 && (typeof raw.o !== "number" || !Number.isFinite(raw.o))) return null;
|
|
4313
4341
|
const answers = raw.t === "a" && raw.o !== void 0 ? { o: raw.o } : {};
|
|
4314
4342
|
return {
|
|
@@ -4324,6 +4352,7 @@ function parseCallSignal(json, now = Date.now()) {
|
|
|
4324
4352
|
...picture,
|
|
4325
4353
|
...payloadTypes,
|
|
4326
4354
|
...restart,
|
|
4355
|
+
...closed,
|
|
4327
4356
|
...answers,
|
|
4328
4357
|
...heard
|
|
4329
4358
|
};
|
|
@@ -4422,7 +4451,7 @@ function buildSdpFromSignal(signal) {
|
|
|
4422
4451
|
} else if (mediaType === "v") {
|
|
4423
4452
|
lines.push(`m=video 9 UDP/TLS/RTP/SAVPF ${vp8}`, "c=IN IP4 0.0.0.0", "a=rtcp:9 IN IP4 0.0.0.0");
|
|
4424
4453
|
for (const c of signal.c ?? []) lines.push(`a=candidate:${c}`);
|
|
4425
|
-
lines.push("a=end-of-candidates", `a=ice-ufrag:${signal.u}`, `a=ice-pwd:${signal.p}`, `a=fingerprint:${fingerprint}`, `a=setup:${signal.s}`, `a=mid:${mid}`, "a=sendrecv",
|
|
4454
|
+
lines.push("a=end-of-candidates", `a=ice-ufrag:${signal.u}`, `a=ice-pwd:${signal.p}`, `a=fingerprint:${fingerprint}`, `a=setup:${signal.s}`, `a=mid:${mid}`, ...signal.vr === 0 ? ["a=inactive"] : ["a=sendrecv", "a=msid:stream video0"], "a=rtcp-mux", "a=rtcp-rsize", `a=rtpmap:${vp8} VP8/90000`, `a=rtcp-fb:${vp8} ccm fir`, `a=rtcp-fb:${vp8} nack`, `a=rtcp-fb:${vp8} nack pli`, `a=rtcp-fb:${vp8} goog-remb`, ...signal.vr === 0 ? [] : [`a=ssrc:${videoSsrc} cname:pkarr`, `a=ssrc:${videoSsrc} msid:stream video0`]);
|
|
4426
4455
|
}
|
|
4427
4456
|
});
|
|
4428
4457
|
return lines.join("\r\n") + "\r\n";
|
|
@@ -5619,10 +5648,14 @@ var LinkSession = class {
|
|
|
5619
5648
|
pollAgain = false;
|
|
5620
5649
|
publishing = null;
|
|
5621
5650
|
publishAgain = false;
|
|
5651
|
+
/** What waits to go out is the presence heartbeat alone (`PRESENCE_HEARTBEAT`): nothing in the packet changed. */
|
|
5652
|
+
upkeepOnly = false;
|
|
5622
5653
|
pollTimer = null;
|
|
5623
5654
|
heartbeatTimer = null;
|
|
5624
5655
|
lastActivity = Date.now();
|
|
5625
5656
|
startedAt = Date.now();
|
|
5657
|
+
/** From when a peer never seen is awaited (`AWAITING_PEER_MS`): never later than this start, whatever the clock said when the chat was made. */
|
|
5658
|
+
awaitingSince;
|
|
5626
5659
|
intervals;
|
|
5627
5660
|
fastPollUntil = 0;
|
|
5628
5661
|
/** An offer to a saved contact is out: from then on its fast window looks less often (`OFFER_FAST_MS`); 0 for none. */
|
|
@@ -5677,6 +5710,7 @@ var LinkSession = class {
|
|
|
5677
5710
|
this.intervals = options.pollIntervals ?? DHT_POLL_INTERVALS;
|
|
5678
5711
|
this.events = options.events ?? {};
|
|
5679
5712
|
this.firstPublish = options.firstPublish ?? "at-start";
|
|
5713
|
+
this.awaitingSince = Math.min(options.awaitingSince ?? this.startedAt, this.startedAt);
|
|
5680
5714
|
}
|
|
5681
5715
|
get peerPresence() {
|
|
5682
5716
|
return this.presence;
|
|
@@ -5880,11 +5914,12 @@ var LinkSession = class {
|
|
|
5880
5914
|
t: timestamp,
|
|
5881
5915
|
m: text
|
|
5882
5916
|
}];
|
|
5917
|
+
this.upkeepOnly = false;
|
|
5883
5918
|
try {
|
|
5884
5919
|
if (await this.publishOnce(true) === 0) return "Message could not be published — DHT payload limit exceeded.";
|
|
5885
5920
|
} catch (error) {
|
|
5886
5921
|
if (this.publishRetryTimer) clearTimeout(this.publishRetryTimer);
|
|
5887
|
-
this.publishRetryTimer = setTimeout(() => void this.publish().catch(() => {}), this.retryDelay(error));
|
|
5922
|
+
this.publishRetryTimer = setTimeout(() => void this.publish(true).catch(() => {}), this.retryDelay(error));
|
|
5888
5923
|
if (!isDiscoveryBudgetError(error)) this.events.onStatus?.("error");
|
|
5889
5924
|
return null;
|
|
5890
5925
|
}
|
|
@@ -5940,7 +5975,7 @@ var LinkSession = class {
|
|
|
5940
5975
|
if (this.connected) return "connected";
|
|
5941
5976
|
if (Date.now() < this.fastPollUntil) return "fast";
|
|
5942
5977
|
if (Date.now() < this.watchUntil) return "active";
|
|
5943
|
-
if (!this.active && this.presence.lastPacketAt === 0 && Date.now() - this.
|
|
5978
|
+
if (!this.active && this.presence.lastPacketAt === 0 && Date.now() - this.awaitingSince < 6e5) return "active";
|
|
5944
5979
|
if (!this.active) return "background";
|
|
5945
5980
|
return Date.now() - this.lastActivity > 6e4 ? "idle" : "active";
|
|
5946
5981
|
}
|
|
@@ -5948,13 +5983,18 @@ var LinkSession = class {
|
|
|
5948
5983
|
if (this.heartbeatTimer) clearTimeout(this.heartbeatTimer);
|
|
5949
5984
|
this.heartbeatTimer = setTimeout(() => {
|
|
5950
5985
|
if (!this.running) return;
|
|
5951
|
-
if (this.getServices() !== void 0) this.publish().catch(() => {});
|
|
5986
|
+
if (this.getServices() !== void 0) this.publish(true).catch(() => {});
|
|
5952
5987
|
this.scheduleHeartbeat();
|
|
5953
5988
|
}, PRESENCE_HEARTBEAT);
|
|
5954
5989
|
}
|
|
5955
|
-
/**
|
|
5956
|
-
|
|
5990
|
+
/**
|
|
5991
|
+
* Coalesces publishes: at most one in flight and one queued behind it. `upkeep`: nothing new to say (the heartbeat, a
|
|
5992
|
+
* retry of what waits): with nothing else asked for since, the packet goes as upkeep (`publishOnce`).
|
|
5993
|
+
*/
|
|
5994
|
+
publish(upkeep = false) {
|
|
5957
5995
|
if (this.silent) return Promise.resolve();
|
|
5996
|
+
if (!upkeep) this.upkeepOnly = false;
|
|
5997
|
+
else if (!this.publishing && !this.publishRetryTimer) this.upkeepOnly = true;
|
|
5958
5998
|
if (this.publishing) {
|
|
5959
5999
|
this.publishAgain = true;
|
|
5960
6000
|
return this.publishing;
|
|
@@ -5965,12 +6005,12 @@ var LinkSession = class {
|
|
|
5965
6005
|
try {
|
|
5966
6006
|
do {
|
|
5967
6007
|
this.publishAgain = false;
|
|
5968
|
-
await this.publishOnce(this.running);
|
|
6008
|
+
await this.publishOnce(this.running, this.upkeepOnly);
|
|
5969
6009
|
} while (this.publishAgain && this.running);
|
|
5970
6010
|
} catch (error) {
|
|
5971
6011
|
if (this.running) {
|
|
5972
6012
|
if (!isDiscoveryBudgetError(error)) this.discoveryResult("publish", error);
|
|
5973
|
-
this.publishRetryTimer = setTimeout(() => void this.publish().catch(() => {}), this.retryDelay(error));
|
|
6013
|
+
this.publishRetryTimer = setTimeout(() => void this.publish(true).catch(() => {}), this.retryDelay(error));
|
|
5974
6014
|
}
|
|
5975
6015
|
throw error;
|
|
5976
6016
|
} finally {
|
|
@@ -5979,7 +6019,7 @@ var LinkSession = class {
|
|
|
5979
6019
|
})();
|
|
5980
6020
|
return this.publishing;
|
|
5981
6021
|
}
|
|
5982
|
-
async publishOnce(advertise) {
|
|
6022
|
+
async publishOnce(advertise, upkeep = false) {
|
|
5983
6023
|
const rtcSignal = advertise ? this.rtcSignal : null;
|
|
5984
6024
|
const built = buildLinkRecords(this.identity.pubKeyZ32, {
|
|
5985
6025
|
messages: this.sentBuffer,
|
|
@@ -5992,7 +6032,7 @@ var LinkSession = class {
|
|
|
5992
6032
|
}, this.encKey);
|
|
5993
6033
|
const started = Date.now();
|
|
5994
6034
|
try {
|
|
5995
|
-
const options = rtcSignal && rtcSignal !== this.rtcSignalOut ? { signal: true } : this.watching() ? { watch: true } : void 0;
|
|
6035
|
+
const options = rtcSignal && rtcSignal !== this.rtcSignalOut ? { signal: true } : this.watching() ? { watch: true } : upkeep && this.connected ? { background: true } : void 0;
|
|
5996
6036
|
await this.transport.publish(this.identity, built.records, options);
|
|
5997
6037
|
} catch (error) {
|
|
5998
6038
|
const ms = Date.now() - started, waiting = isDiscoveryBudgetError(error);
|
|
@@ -6351,6 +6391,8 @@ var DataLink = class {
|
|
|
6351
6391
|
answered = null;
|
|
6352
6392
|
/** Answers refused since a connection last opened, each followed by a new offer at once (`ANSWER_REFUSED_REDIALS`). */
|
|
6353
6393
|
refusedAnswers = 0;
|
|
6394
|
+
/** The last answer dropped as not for this side's offer (`answer-dropped`): each is said once. */
|
|
6395
|
+
droppedAnswerTs = 0;
|
|
6354
6396
|
constructor(options) {
|
|
6355
6397
|
this.options = options;
|
|
6356
6398
|
}
|
|
@@ -6459,6 +6501,12 @@ var DataLink = class {
|
|
|
6459
6501
|
} catch (error) {
|
|
6460
6502
|
if (this.pc === pc) this.answerRefused(error);
|
|
6461
6503
|
}
|
|
6504
|
+
} else if (signal.t === "a" && signal.ts !== this.droppedAnswerTs) {
|
|
6505
|
+
this.droppedAnswerTs = signal.ts;
|
|
6506
|
+
traceLink(this.options.myPubKeyZ32, "answer-dropped", {
|
|
6507
|
+
state: this.state,
|
|
6508
|
+
...this.myOfferTs && signal.o !== void 0 ? { offerMs: signal.o - this.myOfferTs } : {}
|
|
6509
|
+
});
|
|
6462
6510
|
}
|
|
6463
6511
|
}
|
|
6464
6512
|
/**
|
|
@@ -6532,7 +6580,10 @@ var DataLink = class {
|
|
|
6532
6580
|
again
|
|
6533
6581
|
});
|
|
6534
6582
|
this.reset();
|
|
6535
|
-
if (!again)
|
|
6583
|
+
if (!again) {
|
|
6584
|
+
this.options.onAnswersRefused?.();
|
|
6585
|
+
return;
|
|
6586
|
+
}
|
|
6536
6587
|
this.refusedAnswers++;
|
|
6537
6588
|
this.options.onAnswerReplaced?.();
|
|
6538
6589
|
}
|
|
@@ -8060,8 +8111,13 @@ var COMMUNITY_REACTION_FRAME = "reaction";
|
|
|
8060
8111
|
var REACTION_LIMITS = {
|
|
8061
8112
|
/** UTF-8 bytes of one emoji: a family or a subdivision flag fits, a run of emoji does not. */
|
|
8062
8113
|
emojiBytes: 32,
|
|
8063
|
-
/**
|
|
8114
|
+
/**
|
|
8115
|
+
* Reaction frames a receiver takes per window on one chat; the rest are dropped unconfirmed and come again. In a
|
|
8116
|
+
* group nothing comes again (a community's catch-up hands a frame once), so there the rest wait for the next window.
|
|
8117
|
+
*/
|
|
8064
8118
|
receive: 30,
|
|
8119
|
+
/** Group members' reactions past a window, kept per group until it has room: as many as a community's store hands back. */
|
|
8120
|
+
held: 256,
|
|
8065
8121
|
/** Reactions a sender says per window on one chat; the newest of each message waits for room. */
|
|
8066
8122
|
send: 20,
|
|
8067
8123
|
windowMs: 1e4,
|
|
@@ -9763,7 +9819,8 @@ var DhtDelivery = class DhtDelivery {
|
|
|
9763
9819
|
const receipt = this.state.receipt && this.state.receipt.expires > now && this.state.receipt.attempts < MAX_ATTEMPTS ? this.state.receipt : void 0;
|
|
9764
9820
|
const receiptDue = !!receipt && !receipt.settled && (receipt.next ?? 0) <= now;
|
|
9765
9821
|
const reseal = this.resealDue;
|
|
9766
|
-
|
|
9822
|
+
const keepAlive = !force && (!pending || pending.next > now) && !receiptDue && !this.reactionsDue && !reseal;
|
|
9823
|
+
if (keepAlive && this.controlDue > now) return;
|
|
9767
9824
|
const expires = pending?.expires ?? now - 12e4 + CONTROL_TTL;
|
|
9768
9825
|
const issued = Math.min(now, Math.max(now - DHT_ISSUED_BACK_MS, expires - (pending ? DHT_MESSAGE_TTL : CONTROL_TTL), (pending?.message[1] ?? 0) - 3e4));
|
|
9769
9826
|
const { body, records, reactions } = this.fitted(this.state.sequence + 1, issued, expires, pending?.message ?? null, receipt?.id ?? null, pending?.reply, pending?.edit, pending?.forwarded, pending?.file);
|
|
@@ -9797,7 +9854,7 @@ var DhtDelivery = class DhtDelivery {
|
|
|
9797
9854
|
});
|
|
9798
9855
|
if (pending) this.lastPublished = DhtDelivery.facts(body, records, identity.pubKeyZ32);
|
|
9799
9856
|
try {
|
|
9800
|
-
await this.options.transport.publish(identity, records);
|
|
9857
|
+
await this.options.transport.publish(identity, records, keepAlive && this.live ? { background: true } : void 0);
|
|
9801
9858
|
} catch (error) {
|
|
9802
9859
|
this.reactionsDue ||= reactionsWereDue;
|
|
9803
9860
|
if (isDiscoveryBudgetError(error)) await this.heldBack(error, now, before, pending, receipt);
|
|
@@ -10459,6 +10516,43 @@ function irohDescriptor(descriptor, spelling = "dotted") {
|
|
|
10459
10516
|
};
|
|
10460
10517
|
}
|
|
10461
10518
|
/**
|
|
10519
|
+
* A relay server's URL, short: https, or wss for a browser's relay; plain http or ws only on this machine's loopback,
|
|
10520
|
+
* as a test relay is (the same rule as the relay settings).
|
|
10521
|
+
*/
|
|
10522
|
+
var RELAY_URL = /^((https|wss):\/\/[^\s]{1,120}|(http|ws):\/\/(127\.0\.0\.1|localhost|\[::1\])(:\d{1,5})?(\/[^\s]{0,100})?)$/;
|
|
10523
|
+
var HEX_KEY = /^[0-9a-f]{64}$/;
|
|
10524
|
+
/** An Iroh direct address as the adapters parse it: an IPv4 or bracketed IPv6 address and its port. */
|
|
10525
|
+
var SOCKET_ADDRESS = /^(\d{1,3}(\.\d{1,3}){3}|\[[0-9A-Fa-f:.]{2,45}(%[A-Za-z0-9._-]{1,16})?\]):\d{1,5}$/;
|
|
10526
|
+
var MAX_ADDRESSES = 8;
|
|
10527
|
+
/**
|
|
10528
|
+
* A contact's native descriptors as it tells them on a session (`paired-policy`, `paired-adapters`) or as this app
|
|
10529
|
+
* kept them: only what the adapters dial, each field in the shape its adapter makes. The keys are 64 hex characters,
|
|
10530
|
+
* a relay passes `RELAY_URL` (the rule its capability record is read by), an Iroh descriptor lists at most eight
|
|
10531
|
+
* socket addresses. A descriptor that is anything else is left out, as one the contact never told; a field this app
|
|
10532
|
+
* does not know is not kept.
|
|
10533
|
+
*/
|
|
10534
|
+
function checkedDescriptors(value) {
|
|
10535
|
+
const out = {};
|
|
10536
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return out;
|
|
10537
|
+
const raw = value;
|
|
10538
|
+
const relay = (v) => typeof v === "string" && RELAY_URL.test(v);
|
|
10539
|
+
const relayed = (v) => v === void 0 || typeof v === "boolean";
|
|
10540
|
+
const iroh = raw["iroh/1"];
|
|
10541
|
+
if (iroh && typeof iroh === "object" && typeof iroh.id === "string" && HEX_KEY.test(iroh.id) && (iroh.relay === void 0 || iroh.relay === null || relay(iroh.relay)) && relayed(iroh.relayed) && Array.isArray(iroh.addresses) && iroh.addresses.length <= MAX_ADDRESSES && iroh.addresses.every((a) => typeof a === "string" && SOCKET_ADDRESS.test(a))) out["iroh/1"] = {
|
|
10542
|
+
id: iroh.id,
|
|
10543
|
+
relay: iroh.relay ?? null,
|
|
10544
|
+
addresses: [...iroh.addresses],
|
|
10545
|
+
...iroh.relayed !== void 0 ? { relayed: iroh.relayed } : {}
|
|
10546
|
+
};
|
|
10547
|
+
const hyper = raw["hyperdht/1"];
|
|
10548
|
+
if (hyper && typeof hyper === "object" && typeof hyper.publicKey === "string" && HEX_KEY.test(hyper.publicKey) && (hyper.relay === void 0 || relay(hyper.relay)) && relayed(hyper.relayed)) out["hyperdht/1"] = {
|
|
10549
|
+
publicKey: hyper.publicKey,
|
|
10550
|
+
...hyper.relay !== void 0 ? { relay: hyper.relay } : {},
|
|
10551
|
+
...hyper.relayed !== void 0 ? { relayed: hyper.relayed } : {}
|
|
10552
|
+
};
|
|
10553
|
+
return out;
|
|
10554
|
+
}
|
|
10555
|
+
/**
|
|
10462
10556
|
* Relay only (WISP 100, "Relayed"): the transport reaches this contact only through a relay server, never
|
|
10463
10557
|
* directly. A descriptor says so with `relayed: true`, and an Iroh descriptor with no direct address is relayed
|
|
10464
10558
|
* too (a browser's, WISP 102). Either side being relay only makes the whole path relayed. Both sides hold both
|
|
@@ -10498,15 +10592,13 @@ function parsePolicy(raw) {
|
|
|
10498
10592
|
if (!raw || typeof raw !== "object") return null;
|
|
10499
10593
|
const p = raw;
|
|
10500
10594
|
if (!Number.isSafeInteger(p.revision) || p.revision < 0 || !Number.isSafeInteger(p.intent) || p.intent < 0 || !TRANSPORTS.includes(p.preferred) || typeof p.fallback !== "boolean" || !Array.isArray(p.available) || p.available.length > 3 || new Set(p.available).size !== p.available.length || p.available.some((t) => !TRANSPORTS.includes(t)) || !p.descriptors || typeof p.descriptors !== "object" || JSON.stringify(p.descriptors).length > 4096) return null;
|
|
10501
|
-
const descriptors = {};
|
|
10502
|
-
for (const t of ["iroh/1", "hyperdht/1"]) if (p.descriptors[t]) descriptors[t] = p.descriptors[t];
|
|
10503
10595
|
return {
|
|
10504
10596
|
revision: p.revision,
|
|
10505
10597
|
intent: p.intent,
|
|
10506
10598
|
preferred: p.preferred,
|
|
10507
10599
|
fallback: p.fallback,
|
|
10508
10600
|
available: [...p.available],
|
|
10509
|
-
descriptors
|
|
10601
|
+
descriptors: checkedDescriptors(p.descriptors)
|
|
10510
10602
|
};
|
|
10511
10603
|
}
|
|
10512
10604
|
/** Runs only inside a participation-authenticated channel. Both roles may propose;
|
|
@@ -12082,11 +12174,6 @@ var HEX64$1 = /^[0-9a-f]{64}$/;
|
|
|
12082
12174
|
var SIG$4 = /^[A-Za-z0-9_-]{86}$/;
|
|
12083
12175
|
var Z32$2 = /^[ybndrfg8ejkmcpqxot1uwisza345h769]{52}$/;
|
|
12084
12176
|
var KEY$1 = /^[A-Za-z0-9_-]{43}$/;
|
|
12085
|
-
/**
|
|
12086
|
-
* A relay server's URL, short: https, or wss for a browser's relay; plain http or ws only on this machine's loopback,
|
|
12087
|
-
* as a test relay is (the same rule as the relay settings).
|
|
12088
|
-
*/
|
|
12089
|
-
var RELAY = /^((https|wss):\/\/[^\s]{1,120}|(http|ws):\/\/(127\.0\.0\.1|localhost|\[::1\])(:\d{1,5})?(\/[^\s]{0,100})?)$/;
|
|
12090
12177
|
var hexToKey = (hex) => toBase64Url(Uint8Array.from(hex.match(/../g), (b) => parseInt(b, 16)));
|
|
12091
12178
|
var keyToHex = (key) => Array.from(fromBase64Url(key), (b) => b.toString(16).padStart(2, "0")).join("");
|
|
12092
12179
|
/**
|
|
@@ -12098,12 +12185,12 @@ function capsDescriptors(descriptors) {
|
|
|
12098
12185
|
const iroh = descriptors?.["iroh/1"];
|
|
12099
12186
|
if (iroh && typeof iroh.id === "string" && HEX64$1.test(iroh.id)) out["iroh/1"] = {
|
|
12100
12187
|
id: hexToKey(iroh.id),
|
|
12101
|
-
...typeof iroh.relay === "string" &&
|
|
12188
|
+
...typeof iroh.relay === "string" && RELAY_URL.test(iroh.relay) ? { relay: iroh.relay } : {}
|
|
12102
12189
|
};
|
|
12103
12190
|
const hyper = descriptors?.["hyperdht/1"];
|
|
12104
12191
|
if (hyper && typeof hyper.publicKey === "string" && HEX64$1.test(hyper.publicKey)) out["hyperdht/1"] = {
|
|
12105
12192
|
publicKey: hexToKey(hyper.publicKey),
|
|
12106
|
-
...typeof hyper.relay === "string" &&
|
|
12193
|
+
...typeof hyper.relay === "string" && RELAY_URL.test(hyper.relay) ? { relay: hyper.relay } : {}
|
|
12107
12194
|
};
|
|
12108
12195
|
return out;
|
|
12109
12196
|
}
|
|
@@ -12138,14 +12225,14 @@ function parseDescriptors(value) {
|
|
|
12138
12225
|
const out = {};
|
|
12139
12226
|
const iroh = raw["iroh/1"], hyper = raw["hyperdht/1"];
|
|
12140
12227
|
if (iroh !== void 0) {
|
|
12141
|
-
if (!iroh || typeof iroh.id !== "string" || !KEY$1.test(iroh.id) || iroh.relay !== void 0 && (typeof iroh.relay !== "string" || !
|
|
12228
|
+
if (!iroh || typeof iroh.id !== "string" || !KEY$1.test(iroh.id) || iroh.relay !== void 0 && (typeof iroh.relay !== "string" || !RELAY_URL.test(iroh.relay))) return null;
|
|
12142
12229
|
out["iroh/1"] = {
|
|
12143
12230
|
id: iroh.id,
|
|
12144
12231
|
...iroh.relay !== void 0 ? { relay: iroh.relay } : {}
|
|
12145
12232
|
};
|
|
12146
12233
|
}
|
|
12147
12234
|
if (hyper !== void 0) {
|
|
12148
|
-
if (!hyper || typeof hyper.publicKey !== "string" || !KEY$1.test(hyper.publicKey) || hyper.relay !== void 0 && (typeof hyper.relay !== "string" || !
|
|
12235
|
+
if (!hyper || typeof hyper.publicKey !== "string" || !KEY$1.test(hyper.publicKey) || hyper.relay !== void 0 && (typeof hyper.relay !== "string" || !RELAY_URL.test(hyper.relay))) return null;
|
|
12149
12236
|
out["hyperdht/1"] = {
|
|
12150
12237
|
publicKey: hyper.publicKey,
|
|
12151
12238
|
...hyper.relay !== void 0 ? { relay: hyper.relay } : {}
|
|
@@ -16451,7 +16538,7 @@ var GROUP_FILE_LIMITS = {
|
|
|
16451
16538
|
serveAtOnce: 3,
|
|
16452
16539
|
/** File announcements a member sends to one group in a minute. */
|
|
16453
16540
|
announcePerMinute: 8,
|
|
16454
|
-
/** File announcements
|
|
16541
|
+
/** File announcements of one member of a group fetched by themselves in `announceWindowMs`; past it, kept for a Download. */
|
|
16455
16542
|
announceTaken: 30,
|
|
16456
16543
|
announceWindowMs: 6e5,
|
|
16457
16544
|
/** Holders remembered per file. */
|
|
@@ -16922,6 +17009,7 @@ var RTC_UNSTARTED_MS = 6e5;
|
|
|
16922
17009
|
var RACE_RETRY_MS = 2e3;
|
|
16923
17010
|
var DEMOTE_MS = 36e5;
|
|
16924
17011
|
var AUTO_CONNECT_MAX_RETRY_MS = 18e4;
|
|
17012
|
+
var ANSWERS_REFUSED_PAUSE_MS = 2e3;
|
|
16925
17013
|
/**
|
|
16926
17014
|
* A first pairing is different: the contact is right there, having just read the invite, so an attempt
|
|
16927
17015
|
* that did not make it in `PAIRING_ATTEMPT_MS` is given up and the next one starts after `PAIRING_RETRY_MS`
|
|
@@ -17197,6 +17285,9 @@ var GhostLink = class {
|
|
|
17197
17285
|
afterRtc;
|
|
17198
17286
|
/** When the transports after WebRTC are dialled while its offer is still out (`race`). */
|
|
17199
17287
|
raceTimer = null;
|
|
17288
|
+
/** Pauses taken after a run of refused answers since WebRTC last opened, and the one under way (`ANSWERS_REFUSED_PAUSES`). */
|
|
17289
|
+
refusedPauses = 0;
|
|
17290
|
+
refusedPause = null;
|
|
17200
17291
|
/** Set while `race` dials: the offer ending meanwhile is followed up by the race. */
|
|
17201
17292
|
racing = false;
|
|
17202
17293
|
/**
|
|
@@ -17405,7 +17496,7 @@ var GhostLink = class {
|
|
|
17405
17496
|
}
|
|
17406
17497
|
}) : null;
|
|
17407
17498
|
this.streamWasBlocked = this.streamBlocked;
|
|
17408
|
-
this.peerDescriptors = options.native?.peerDescriptors
|
|
17499
|
+
this.peerDescriptors = checkedDescriptors(options.native?.peerDescriptors);
|
|
17409
17500
|
this.peerTransports = options.native?.peerTransports;
|
|
17410
17501
|
this.saidTransports = !!options.packetTransports && !!options.packetTransportsSaid;
|
|
17411
17502
|
this.peerPacketSaid = !!options.packetTransports && !!options.native?.peerTransports;
|
|
@@ -17421,6 +17512,7 @@ var GhostLink = class {
|
|
|
17421
17512
|
nick: options.nick,
|
|
17422
17513
|
lastSeenTimestamp: options.lastSeenTimestamp,
|
|
17423
17514
|
pollIntervals: options.pollIntervals,
|
|
17515
|
+
awaitingSince: options.madeAt,
|
|
17424
17516
|
getServices: options.getServices,
|
|
17425
17517
|
firstPublish: options.firstPublish ?? (this.tracker && options.pairingProgress?.role === "joiner" && options.rtcAvailable !== false || this.resuming ? "after-first-poll" : "at-start"),
|
|
17426
17518
|
events: {
|
|
@@ -17534,6 +17626,7 @@ var GhostLink = class {
|
|
|
17534
17626
|
offerStanding: (ts) => !this.leaving && !this.stopped && !this.streamBlocked && this.peerOfferTs() === ts,
|
|
17535
17627
|
onAnswerReplaced: () => this.redial(),
|
|
17536
17628
|
onDirect: (evidence) => events.onDirectEvidence?.(evidence),
|
|
17629
|
+
onAnswersRefused: () => this.answersRefused(),
|
|
17537
17630
|
onOpen: (channel) => {
|
|
17538
17631
|
if (this.streamBlocked || this.keyStopped) {
|
|
17539
17632
|
channel.close();
|
|
@@ -17556,7 +17649,10 @@ var GhostLink = class {
|
|
|
17556
17649
|
this.trackDataLink(state);
|
|
17557
17650
|
if (this.activeBinding) return;
|
|
17558
17651
|
events.onDataLinkState?.(state);
|
|
17559
|
-
if (state === "open")
|
|
17652
|
+
if (state === "open") {
|
|
17653
|
+
this.afterRtc = void 0;
|
|
17654
|
+
this.refusedPauses = 0;
|
|
17655
|
+
}
|
|
17560
17656
|
if (state === "offering") {
|
|
17561
17657
|
this.offerUnsent = true;
|
|
17562
17658
|
this.dialUnseen = false;
|
|
@@ -17967,6 +18063,7 @@ var GhostLink = class {
|
|
|
17967
18063
|
async stop(announce = true) {
|
|
17968
18064
|
this.stopped = true;
|
|
17969
18065
|
this.clearRace();
|
|
18066
|
+
if (this.refusedPause) clearTimeout(this.refusedPause);
|
|
17970
18067
|
if (this.retryLook) clearTimeout(this.retryLook);
|
|
17971
18068
|
if (this.dhtPinGrace) clearTimeout(this.dhtPinGrace);
|
|
17972
18069
|
if (this.waiting?.timer) clearTimeout(this.waiting.timer);
|
|
@@ -19371,6 +19468,24 @@ var GhostLink = class {
|
|
|
19371
19468
|
});
|
|
19372
19469
|
this.autoDial();
|
|
19373
19470
|
}
|
|
19471
|
+
/** WebRTC here refused a run of answers to this side's offers (`ANSWERS_REFUSED_PAUSES`): the next offer goes after a short pause. */
|
|
19472
|
+
answersRefused() {
|
|
19473
|
+
if (this.refusedPause || this.stopped) return;
|
|
19474
|
+
if (this.refusedPauses >= 3) {
|
|
19475
|
+
traceLink(this.myPubKeyZ32, "answers-refused-out", {});
|
|
19476
|
+
this.options.events?.onAnswersRefused?.();
|
|
19477
|
+
return;
|
|
19478
|
+
}
|
|
19479
|
+
const ms = ANSWERS_REFUSED_PAUSE_MS * 2 ** this.refusedPauses++;
|
|
19480
|
+
traceLink(this.myPubKeyZ32, "answers-refused-pause", {
|
|
19481
|
+
pause: this.refusedPauses,
|
|
19482
|
+
ms
|
|
19483
|
+
});
|
|
19484
|
+
this.refusedPause = setTimeout(() => {
|
|
19485
|
+
this.refusedPause = null;
|
|
19486
|
+
this.redial();
|
|
19487
|
+
}, ms);
|
|
19488
|
+
}
|
|
19374
19489
|
/**
|
|
19375
19490
|
* A failed dial waits `dialWait` before the next, and only a look at the contact's record dials: the next one came at
|
|
19376
19491
|
* the link's own pace (30 s in the background), which knows nothing of the backoff. A member let in to a group
|
|
@@ -20671,11 +20786,7 @@ var GhostLink = class {
|
|
|
20671
20786
|
}
|
|
20672
20787
|
if (frame?.t === "paired-adapters") {
|
|
20673
20788
|
if (!frame.descriptors || typeof frame.descriptors !== "object" || JSON.stringify(frame.descriptors).length > 4096) return;
|
|
20674
|
-
const descriptors =
|
|
20675
|
-
for (const transport of ["iroh/1", "hyperdht/1"]) {
|
|
20676
|
-
const value = frame.descriptors[transport];
|
|
20677
|
-
if (value) descriptors[transport] = value;
|
|
20678
|
-
}
|
|
20789
|
+
const descriptors = checkedDescriptors(frame.descriptors);
|
|
20679
20790
|
const transports = [...this.paired?.peerTransports ?? []];
|
|
20680
20791
|
const fallback = this.paired?.peerAllowsFallback ?? false;
|
|
20681
20792
|
await this.options.events?.onTransportDiscovery?.(descriptors, transports, fallback);
|
|
@@ -24989,7 +25100,9 @@ var GROUP_LIMITS = {
|
|
|
24989
25100
|
*/
|
|
24990
25101
|
catchUpSlice: 16,
|
|
24991
25102
|
/** Between two slices, when the member's app cannot say it handled one (`handled` resolves `false`). */
|
|
24992
|
-
catchUpPauseMs: 500
|
|
25103
|
+
catchUpPauseMs: 500,
|
|
25104
|
+
/** A received message is in the saved state within this long (`persistSoon`): a burst of them is one save, not one each. */
|
|
25105
|
+
saveWithinMs: 1e3
|
|
24993
25106
|
};
|
|
24994
25107
|
/** What every member should know about who can read what, in the words the apps show. */
|
|
24995
25108
|
var GROUP_READ_NOTE = `Everyone in the group can read everything sent while they are a member. Someone removed keeps what they already received and cannot read what comes after; someone who joins later cannot read what came before. Messages go directly to each member; whoever was away gets what they missed from any member who has it (the group's last ${GROUP_LIMITS.relay} messages) when they meet again.`;
|
|
@@ -25170,6 +25283,7 @@ function readFirstPlace(o, epoch) {
|
|
|
25170
25283
|
/** One of my own frames, among mine: `e:n`. */
|
|
25171
25284
|
var ownKey = (f) => `${f.e}:${f.n}`;
|
|
25172
25285
|
/** What a frame weighs in a log, roughly: its boxes plus the fixed fields around them. */
|
|
25286
|
+
/** What a kept frame counts for against `GROUP_LIMITS.relayBytes`. */
|
|
25173
25287
|
var frameBytes = (f) => f.c.length + (f.m?.c.length ?? 0) + (f.r?.c.length ?? 0) + (f.sc?.c.length ?? 0) + (f.fl?.c.length ?? 0) + 400;
|
|
25174
25288
|
/** Only the fields an edit frame has, as `clean` does for a message. */
|
|
25175
25289
|
var cleanEdit = (f) => ({
|
|
@@ -25289,6 +25403,8 @@ var GroupSession = class {
|
|
|
25289
25403
|
pendingMeta;
|
|
25290
25404
|
/** While `handle` runs: the frames it took that a hub passes on (`handle`'s result). */
|
|
25291
25405
|
passOn = null;
|
|
25406
|
+
/** Set while a save of what received messages changed is due (`persistSoon`). */
|
|
25407
|
+
saveTimer;
|
|
25292
25408
|
/** Syncs answered per member, a few a minute (`GROUP_LIMITS.syncAnswers`). In memory only. */
|
|
25293
25409
|
syncsAnswered = /* @__PURE__ */ new Map();
|
|
25294
25410
|
/** Catch-up answers still going out, a slice at a time (`handOut`). */
|
|
@@ -25492,11 +25608,14 @@ var GroupSession = class {
|
|
|
25492
25608
|
const floor = this.hooks.seqFloor?.() ?? 0;
|
|
25493
25609
|
return Number.isSafeInteger(floor) && floor > 0 ? floor : 0;
|
|
25494
25610
|
}
|
|
25495
|
-
/**
|
|
25496
|
-
|
|
25611
|
+
/**
|
|
25612
|
+
* How many messages, per sender, are known to be missing in the current epoch. `past`: only the numbers above it,
|
|
25613
|
+
* for a caller that knows nobody holds the ones up to it any more.
|
|
25614
|
+
*/
|
|
25615
|
+
missing(sender, past = -1) {
|
|
25497
25616
|
const entry = this.state.seen[sender]?.[this.epoch];
|
|
25498
25617
|
if (!entry) return 0;
|
|
25499
|
-
const lowest = Math.max(0, entry.high - GROUP_LIMITS.window + 1);
|
|
25618
|
+
const lowest = Math.max(0, entry.high - GROUP_LIMITS.window + 1, past + 1);
|
|
25500
25619
|
return Math.max(0, entry.high - lowest + 1 - (1 + entry.window.filter((n) => n >= lowest).length));
|
|
25501
25620
|
}
|
|
25502
25621
|
/**
|
|
@@ -25508,7 +25627,7 @@ var GroupSession = class {
|
|
|
25508
25627
|
const out = /* @__PURE__ */ new Map();
|
|
25509
25628
|
for (const [sender, epochs] of Object.entries(this.state.seen)) {
|
|
25510
25629
|
if (sender === this.myKey || !rosterHas(this.roster, sender)) continue;
|
|
25511
|
-
const marks = Object.entries(epochs).
|
|
25630
|
+
const marks = Object.entries(epochs).map(([e, entry]) => [e, this.gaps(entry)]).filter(([, gaps]) => gaps.length).map(([e, gaps]) => `${e}:${gaps.join(".")}`);
|
|
25512
25631
|
if (marks.length) out.set(sender, marks.join(","));
|
|
25513
25632
|
}
|
|
25514
25633
|
return out;
|
|
@@ -25537,8 +25656,31 @@ var GroupSession = class {
|
|
|
25537
25656
|
return operation;
|
|
25538
25657
|
}
|
|
25539
25658
|
persist() {
|
|
25659
|
+
if (this.saveTimer) {
|
|
25660
|
+
clearTimeout(this.saveTimer);
|
|
25661
|
+
this.saveTimer = void 0;
|
|
25662
|
+
}
|
|
25540
25663
|
return this.hooks.save(structuredClone(this.state));
|
|
25541
25664
|
}
|
|
25665
|
+
/**
|
|
25666
|
+
* A save within `GROUP_LIMITS.saveWithinMs`, for what a received message changes (what was seen, what is kept to hand
|
|
25667
|
+
* on): the state holds the whole hand-on log, and a member back in a busy group wrote all of it once per message.
|
|
25668
|
+
* The message itself is stored before (`hooks.message`). An app killed before the save takes those frames again when
|
|
25669
|
+
* it syncs: its store has the messages already, and the state then catches up.
|
|
25670
|
+
*/
|
|
25671
|
+
persistSoon() {
|
|
25672
|
+
if (this.saveTimer) return;
|
|
25673
|
+
this.saveTimer = setTimeout(() => {
|
|
25674
|
+
this.saveTimer = void 0;
|
|
25675
|
+
this.serialize(() => this.hooks.save(structuredClone(this.state))).catch(() => {});
|
|
25676
|
+
}, GROUP_LIMITS.saveWithinMs);
|
|
25677
|
+
}
|
|
25678
|
+
/** Writes what is waiting to be saved now (before a restart, in tests). */
|
|
25679
|
+
flush() {
|
|
25680
|
+
return this.serialize(async () => {
|
|
25681
|
+
if (this.saveTimer) await this.persist();
|
|
25682
|
+
});
|
|
25683
|
+
}
|
|
25542
25684
|
secret(epoch) {
|
|
25543
25685
|
const s = this.state.secrets[epoch];
|
|
25544
25686
|
return s ? fromBase64Url(s) : void 0;
|
|
@@ -26249,7 +26391,7 @@ var GroupSession = class {
|
|
|
26249
26391
|
if (firstFrame && rosterHas(this.state.chain[first.e]?.m ?? [], this.myKey) && this.isDuplicate(firstFrame)) {
|
|
26250
26392
|
this.markSeen(raw);
|
|
26251
26393
|
this.keep(clean(raw));
|
|
26252
|
-
|
|
26394
|
+
this.persistSoon();
|
|
26253
26395
|
if (rosterHas(this.roster, raw.s)) this.took(clean(raw));
|
|
26254
26396
|
return;
|
|
26255
26397
|
}
|
|
@@ -26272,7 +26414,8 @@ var GroupSession = class {
|
|
|
26272
26414
|
...forwarded ? { forwarded } : {},
|
|
26273
26415
|
...card ? { card } : {},
|
|
26274
26416
|
...file ? { file } : {},
|
|
26275
|
-
...completes ? { completes: true } : {}
|
|
26417
|
+
...completes ? { completes: true } : {},
|
|
26418
|
+
...whole ? { frame: clean(raw) } : {}
|
|
26276
26419
|
});
|
|
26277
26420
|
if (!whole) {
|
|
26278
26421
|
this.provisional.add(id);
|
|
@@ -26285,7 +26428,7 @@ var GroupSession = class {
|
|
|
26285
26428
|
this.markSeen(raw);
|
|
26286
26429
|
if (firstFrame && rosterHas(this.state.chain[firstFrame.e]?.m ?? [], this.myKey)) this.markSeen(firstFrame);
|
|
26287
26430
|
this.keep(clean(raw));
|
|
26288
|
-
|
|
26431
|
+
this.persistSoon();
|
|
26289
26432
|
if (rosterHas(this.roster, raw.s)) this.took(clean(raw));
|
|
26290
26433
|
}
|
|
26291
26434
|
/**
|
|
@@ -29864,6 +30007,6 @@ function appStoreDecision(held, read) {
|
|
|
29864
30007
|
return read.digest === held.digest ? "same" : "equivocation";
|
|
29865
30008
|
}
|
|
29866
30009
|
//#endregion
|
|
29867
|
-
export { groupName as $, APP_PREFIXES as $a, sanitizeAvatar as $c, peekDhtMailbox as $i, readGroupWantNo as $n, HANDOFF_REQUEST as $o, isAppVersion as $r, deviceInviteJoinerParams as $s, EVM_TEST_CHAINS as $t, encodeCommunityLink as A, readReaction as Aa, turnKeys as Ac, dialDescriptors as Ai, ENDPOINT as An, decodeControl as Ao, transferStalled as Ar, sealHandoffPiece as As, checkDidSignature as At, GroupWakeLimiter as B, RUN_RESULTS as Ba, withRequestOptions as Bc, newIdentityBinding as Bi, pairedMessageFrame as Bn, signalHasVideo as Bo, pinIsNewer as Br, ENROLL_HELLO as Bs, parseDid as Bt, openGroupTyping as C, GROUP_REACTION_FRAME as Ca, TURN_LAST_SEQUENCE as Cc, recordsFromWellKnown as Ci, pubkyProofFile as Cn, RELAY_POLL_INTERVALS as Co, readBeacon as Cr, readHandoffCancel as Cs, AtprotoProofError as Ct, GROUP_READ_NOTE_COMMUNITY as D, queueReaction as Da, readTurnPacket as Dc, CapsExchange as Di, requestLnurlInvoice as Dn, parseLocalTarget as Do, ChatFiles as Dr, readHandoffPake as Ds, DID_JWS_MAX_LENGTH as Dt, CommunitySession as E, nextReactionNumber as Ea, nextTurnPosition as Ec, wellKnownUrl as Ei, pubkyHomeserverOf as En, formatLocalTarget as Eo, shouldBeHub as Er, readHandoffHello as Es, DID_FILE_MAX_BYTES as Et, knockIdentity as F, replySnippet as Fa, normalizeRelayUrl as Fc, IdentityExchange as Fi, parseCashuRequestPayload as Fn, buildSdpFromSignal as Fo, typingActivity as Fr, setUpdateFrame as Fs, didWebFile as Ft, GROUP_READ_NOTE as G, checkStatusCard as Ga, openRelayPayload as Gc, emptyProofLedger as Gi, GROUP_WANT_FRAME as Gn, HANDOFF_ACK as Go, deviceWakeRequest as Gr, enrollDoneFrame as Gs, strictBase64Url as Gt, groupWakes as H, buttonLabelClash as Ha, RELAY_PAYLOAD_MAX_BYTES as Hc, revokesIdentity as Hi, engineText as Hn, HTTP_SERVICE_PROTO as Ho, readPin as Hr, enrollCancelFrame as Hs, parseDidSignaturePaste as Ht, knockRecords as I, BUTTON_ID as Ia, setLinkTraceSink as Ic, boundVerifiedIdentity as Ii, parseFedimintRequestPayload as In, callRtcConfig as Io, GROUP_PIN_FRAME as Ir, signTombstone as Is, didWebFileNames as It, GROUP_EDIT_FRAME as J, arrivalKey as Ja, identityFromSeed as Jc, automaticTransport as Ji, groupFileFallback as Jn, HANDOFF_HAVE as Jo, relayRequest as Jr, enrollProofFrame as Js, encodeDidDhtDeactivated as Jt, GroupSession as K, sameButtonText as Ka, parseRelayPayload as Kc, validExternalKey as Ki, GROUP_WANT_NO_FRAME as Kn, HANDOFF_CANCEL as Ko, newWakeToken as Kr, enrollGrantFrame as Ks, didDhtDocument as Kt, mergeKnocks as L, ITEM_STATES as La, traceLink as Lc, emptyIdentityLedger as Li, GhostLink as Ln, callSignalHeardAt as Lo, PIN_LIMITS as Lr, verifySetUpdate as Ls, didWebFileUrl as Lt, decodeGroupEntryLink as M, wireReaction as Ma, DEFAULT_RELAYS as Mc, IDENTITY_MAX_VALIDITY as Mi, fedimintRequestPayload as Mn, CALL_SIGNAL_MAX_AGE_MS as Mo, TYPING_REFRESH_MS as Mr, SET_UPDATE as Ms, didJwsAlg as Mt, encodeGroupEntryLink as N, pairedReplyAuthor as Na, RelayTransport as Nc, IDENTITY_REVOCATION_LABEL as Ni, findEndpoint as Nn, RTC_CONFIG as No, TypingSender as Nr, readSetUpdate as Ns, didSignedMessages as Nt, communityHasFrame as O, reactionEmoji as Oa, signTurnPacket as Oc, DHT_TEXT_CAPABILITY as Oi, resolveLightningDestination as On, webLocalFetch as Oo, FILE_LIMITS as Or, readHandoffTurnFrame as Os, DidError as Ot, entryParams as P, readReply as Pa, currentRelays as Pc, IdentityCheckUnavailable as Pi, isFederationId as Pn, answersOffer as Po, sanitizeTypingStatus as Pr, setAckFrame as Ps, didWebDocumentUrl as Pt, mentionsMember as Q, shownTime as Qa, MAX_AVATAR_LENGTH as Qc, DHT_MESSAGE_TTL as Qi, readGroupWant as Qn, HANDOFF_PIECE_BYTES as Qo, chatAppId as Qr, createDeviceInvite as Qs, ETHEREUM_USDT as Qt, readKnocks as R, PR_CHECKS as Ra, budgetRetryMs as Rc, identityRevocationValue as Ri, INVITE_TAKEN as Rn, extractParamsFromSdp as Ro, mayPin as Rr, ENROLL_DONE as Rs, didWebHost as Rt, groupTypingEpoch as S, COMMUNITY_REACTION_FRAME as Sa, turnPutSummary as Sc, recordsFromTxt as Si, pubkyProofCapability as Sn, EXPECT_PEER_MS as So, rankHubs as Sr, readHandoffAck as Ss, shortAtprotoDid as St, COMMUNITY_LIMITS as T, ReactionWindow as Ta, firstDeviceSetSecret as Tc, txtValue as Ti, homeserverWebEndpoint as Tn, GhostlyHttpError as To, readLobby as Tr, readHandoffHave as Ts, DID_DOCUMENT_MAX_BYTES as Tt, parseGroupWakeFrame as U, cardLine as Ua, createRelayPayload as Uc, lastSharedWithMe as Ui, GROUP_FILE_LIMITS as Un, LEGACY_SERVICES as Uo, WAKE_CALL_INTERVAL_MS as Ur, enrollCancelReason as Us, signingKeys as Ut, groupWakeFrame as V, STATUS_CARD_LIMITS as Va, PacketTooLargeError as Vc, receivedIdentityStatus as Vi, engineError as Vn, emptyLinkRecords as Vo, pinNumberHolds as Vr, ENROLL_PROOF as Vs, parseDidDocument as Vt, GROUP_REACTED_FRAME as W, cardUrl as Wa, newerPacket as Wc, PeerProofs as Wi, GROUP_HAVE_FRAME as Wn, serviceIdFromName as Wo, WakeLimiter as Wr, enrollDigits as Ws, staticDidDocument as Wt, carryMentions as X, heardTime as Xa, publicKeyFromZ32 as Xc, irohRelayUrl as Xi, readGroupFileMeta as Xn, HANDOFF_OFFER as Xo, checkPushEndpoint as Xr, readEnrollHello as Xs, resolveDidDht as Xt, GROUP_EDIT_TEXT_BYTES as Y, claimedTime as Ya, identityFromSeedB64 as Yc, irohDescriptor as Yi, isGroupMessageId as Yn, HANDOFF_HELLO as Yo, wakeRequest as Yr, readEnrollGrant as Ys, encodeDidDhtPacket as Yt, parseCommunityEdit as Z, receivedTimestamp as Za, verify as Zc, DHT_FILE_TOO_LARGE as Zi, readGroupHave as Zn, HANDOFF_PAKE as Zo, vapidKeysMatch as Zr, verifyEnrollProof as Zs, signDidDhtPacket as Zt, checkAppManifest as _, RateWindow as _a, webCryptoSigner as _c, domainWellKnownFile as _i, PUBKY_PROOF_MAX_BYTES as _n, rosterHas as _o, lobbyRecords as _r, handoffReleaseFrame as _s, atprotoProofRkey as _t, planAppUpdate as a, safeBlobType as aa, inviteLink as ac, HOLD_CAPABILITY as ai, utf8Decode as al, USDT_PUBLIC_RPC as an, isAppRef as ao, groupSignalFrame as ar, handoffAttemptSucceeded as as, sameSshKey as at, GROUP_TYPING_FRAME as b, forwardedAgain as ba, TURN_SETTLE_MS as bc, nip05RootKey as bi, newPubkyProofFolder as bn, DirectPathWatch as bo, newerHead as br, handoffVersions as bs, normalizeAtprotoHandle as bt, readAppStore as c, PLAYABLE_AUDIO as ca, ENROLL_CAPABILITY as cc, HoldKeys as ci, assertWholeSats as cn, signAppObject as co, mayBeHub as cr, handoffContext as cs, verifyBitcoinMessage as ct, APP_BUNDLE_LIMITS as d, fileMessageText as da, deviceEchoNonce as dc, newMailbox as di, walletNetworkOf as dn, canonicalJsonBytes as do, COMMUNITY_TOPOLOGY as dr, handoffDigest as ds, ATPROTO_DECLARED_SCOPE as dt, DHT_FILE_CAPABILITY as ea, readDeviceInvite as ec, APPS_CAPABILITY as ei, bytesEqual as el, ONCHAIN_PROVIDER as en, APP_STATEMENT_LIMITS as eo, CarriedTransport as er, HANDOFF_TIMINGS as es, SSHSIG_MAX_ARMOR as et, APP_BUNDLE_MAGIC as f, parseVoiceMeta as fa, deviceKeyZ32 as fc, readManifest as fi, SPARK_NETWORKS as fn, readCanonicalJson as fo, beaconKeys as fr, handoffEphemeral as fs, ATPROTO_FULL_SCOPE as ft, assembleAppBundle as g, EDIT_RATE_WINDOW_MS as ga, seedSigner as gc, domainTxtRecord as gi, isBitcoinAddress as gn, commitHash as go, lobbyKeys as gr, handoffPakeFrame as gs, atprotoProofRecord as gt, appViewOf as h, EDIT_BUFFER_MS as ha, newDeviceSetSecret as hc, dnsProofName as hi, sparkInvoiceDetails as hn, MEMBER_KEY as ho, freshHubs as hr, handoffOfferFrame as hs, atprotoDidMethod as ht, checkAppBeforeRun as i, formatFileSize as ia, encodeInviteCode as ic, UPGRADE_CAPABILITY as ii, toZ32 as il, TEST_USDT_FAUCET_AMOUNT as in, isAppKey as io, SIGNAL_REPLY_MS as ir, handoffAttemptFailed as is, parseSshSignature as it, KNOCK_TTL_MS as j, validReactionNumber as ja, turnName as jc, IDENTITY_MAX_EVIDENCE as ji, cashuRequestPayload as jn, encodeControl as jo, TYPING_KINDS as jr, SET_ACK as js, didGhostlyServiceEntry as jt, decodeCommunityLink as k, reactionIsNewer as ka, signTurnRelease as kc, capsDescriptors as ki, decodeBolt11 as kn, LIMITS as ko, transferEnded as kr, readHandoffVerified as ks, checkDidJws as kt, readAppStoreSteps as l, VOICE_LIMITS as la, HANDOFF_CAPABILITY as lc, HoldRefusedError as li, formatPaymentAmount as ln, signAppRevocation as lo, meshHubs as lr, handoffContextProof as ls, BitcoinAddressError as lt, appDigest as m, parseVideoMeta as ma, devicePingFrame as mc, decodeDnsResponse as mi, sparkAddressKind as mn, MAX_GROUP_CHAIN as mo, doorHubs as mr, handoffManifestFrames as ms, ATPROTO_PROOF_SCOPE as mt, appStoreDecision as n, parseImageMeta as na, createChatInvite as nc, EDIT_CAPABILITY as ni, randomBytes as nl, SEPOLIA_TEST_USDT as nn, appRef as no, SIGNAL_FRESH_MS as nr, filePartName as ns, SshSigError as nt, APP_STORE_LIMITS as o, sanitizeFileName as oa, inviteOwnership as oc, HOLD_DATED_BACK_MS as oi, utf8Encode as ol, WALLET_NETWORKS as on, readAppRevocation as oo, readGroupSignal as or, handoffBusyFrame as os, sshSignCommand as ot, APP_ICON_PATH as p, voicePeaksOf as pa, deviceLinkPairing as pc, DOMAIN_FILE_MAX_BYTES as pi, SPARK_PROVIDER as pn, GROUP_MEMBER_CAP as po, beaconRecords as pr, handoffHelloFrame as ps, ATPROTO_PROOF_COLLECTION as pt, COMMUNITY_EDIT_FRAME as q, statusCardText as qa, createIdentity as qc, TRANSPORTS as qi, fetchesByItself as qn, HANDOFF_DONE as qo, parseWakeFrame as qr, enrollHelloFrame as qs, didDhtFromPublicKey as qt, appUpdateDecision as r, readImageMeta as ra, decodeInviteCode as rc, STATUS_CARD_CAPABILITY as ri, toBase64Url as rl, SEPOLIA_TEST_USDT_FAUCET as rn, checkAppRevokeStatement as ro, SIGNAL_HOLD_MS as rr, handoffAttemptAllowed as rs, parseSshPublicKey as rt, checkAppStoreIndex as s, sanitizeMime as sa, DEVICES_CAPABILITY as sc, HOLD_LIMITS as si, assertTokenUnits as sn, readAppRevocations as so, MESH_HUBS as sr, handoffCancelFrame as ss, verifySshSignature as st, appRevocationFor as t, dhtFileId as ta, OwnInviteError as tc, BUTTONS_CAPABILITY as ti, fromBase64Url as tl, PaymentPreflightError as tn, appFingerprint as to, GROUP_SIGNAL_FRAME as tr, HANDOFF_VERIFIED as ts, SSHSIG_NAMESPACE as tt, signAppStore as u, baseMime as ua, deviceEchoFrame as uc, isHoldUrl as ui, validatePaymentTarget as un, canonicalJson as uo, pickMeshHubs as ur, handoffDataFrame as us, decodeAnyBitcoinAddress as ut, isAppUrl as v, dhtEditId as va, TURN_PUT_WINDOW_MS as vc, encodeDnsQuery as vi, isPubkyKey as vn, verifyCommitSignature as vo, mergeBeacon as vr, handoffRetryAfter as vs, checkAtprotoProofRecord as vt, sealGroupTyping as w, REACTION_LIMITS as wa, TURN_MAX as wc, recordsName as wi, pubkyProofPath as wn, presenceSeenAt as wo, readBeaconHead as wr, readHandoffDone as ws, verifyAtprotoRecordProof as wt, GroupTypingBoard as x, readForwarded as xa, classifyTurnRead as xc, normalizeDomain as xi, normalizePubkyKey as xn, DHT_POLL_INTERVALS as xo, pickHubs as xr, newHandoffId as xs, parseAtprotoDidDocument as xt, readAppBundle as y, parseLinkPreview as ya, TURN_RAISE_READ_TIMEOUT_MS as yc, isPublicAddress as yi, isPubkyProofFolder as yn, edgeParams as yo, mergeLobby as yr, handoffStreamKey as ys, isAtprotoDid as yt, GROUP_WAKE_FRAME as z, PR_STATES as za, isDiscoveryBudgetError as zc, identityStatement as zi, LIVENESS_PING_MS as zn, parseCallSignal as zo, nextPinNumber as zr, ENROLL_GRANT as zs, normalizeDid as zt };
|
|
30010
|
+
export { parseCommunityEdit as $, receivedTimestamp as $a, identityFromSeed as $c, DHT_FILE_TOO_LARGE as $i, readGroupHave as $n, HANDOFF_PAKE as $o, vapidKeysMatch as $r, verifyEnrollProof as $s, signDidDhtPacket as $t, encodeCommunityLink as A, reactionEmoji as Aa, signTurnPacket as Ac, DHT_TEXT_CAPABILITY as Ai, resolveLightningDestination as An, webLocalFetch as Ao, FILE_LIMITS as Ar, readHandoffTurnFrame as As, DidError as At, GroupWakeLimiter as B, PR_CHECKS as Ba, normalizeRelayUrl as Bc, identityRevocationValue as Bi, INVITE_TAKEN as Bn, extractParamsFromSdp as Bo, mayPin as Br, ENROLL_DONE as Bs, didWebHost as Bt, openGroupTyping as C, readForwarded as Ca, classifyTurnRead as Cc, normalizeDomain as Ci, normalizePubkyKey as Cn, DHT_POLL_INTERVALS as Co, pickHubs as Cr, newHandoffId as Cs, parseAtprotoDidDocument as Ct, GROUP_READ_NOTE_COMMUNITY as D, ReactionWindow as Da, firstDeviceSetSecret as Dc, txtValue as Di, homeserverWebEndpoint as Dn, GhostlyHttpError as Do, readLobby as Dr, readHandoffHave as Ds, DID_DOCUMENT_MAX_BYTES as Dt, CommunitySession as E, REACTION_LIMITS as Ea, TURN_MAX as Ec, recordsName as Ei, pubkyProofPath as En, presenceSeenAt as Eo, readBeaconHead as Er, readHandoffDone as Es, verifyAtprotoRecordProof as Et, knockIdentity as F, pairedReplyAuthor as Fa, turnStatedVerifier as Fc, IDENTITY_REVOCATION_LABEL as Fi, findEndpoint as Fn, RTC_CONFIG as Fo, TypingSender as Fr, readSetUpdate as Fs, didSignedMessages as Ft, GROUP_REACTED_FRAME as G, cardLine as Ga, withRequestOptions as Gc, lastSharedWithMe as Gi, GROUP_FILE_LIMITS as Gn, LEGACY_SERVICES as Go, WAKE_CALL_INTERVAL_MS as Gr, enrollCancelReason as Gs, signingKeys as Gt, groupWakes as H, RUN_RESULTS as Ha, traceLink as Hc, newIdentityBinding as Hi, pairedMessageFrame as Hn, signalHasVideo as Ho, pinIsNewer as Hr, ENROLL_HELLO as Hs, parseDid as Ht, knockRecords as I, readReply as Ia, turnVerifierMark as Ic, IdentityCheckUnavailable as Ii, isFederationId as In, answersOffer as Io, sanitizeTypingStatus as Ir, setAckFrame as Is, didWebDocumentUrl as It, frameBytes as J, sameButtonText as Ja, createRelayPayload as Jc, validExternalKey as Ji, GROUP_WANT_NO_FRAME as Jn, HANDOFF_CANCEL as Jo, newWakeToken as Jr, enrollGrantFrame as Js, didDhtDocument as Jt, GROUP_READ_NOTE as K, cardUrl as Ka, PacketTooLargeError as Kc, PeerProofs as Ki, GROUP_HAVE_FRAME as Kn, serviceIdFromName as Ko, WakeLimiter as Kr, enrollDigits as Ks, staticDidDocument as Kt, mergeKnocks as L, replySnippet as La, DEFAULT_RELAYS as Lc, IdentityExchange as Li, parseCashuRequestPayload as Ln, buildSdpFromSignal as Lo, typingActivity as Lr, setUpdateFrame as Ls, didWebFile as Lt, decodeGroupEntryLink as M, readReaction as Ma, turnInstance as Mc, dialDescriptors as Mi, ENDPOINT as Mn, decodeControl as Mo, transferStalled as Mr, sealHandoffPiece as Ms, checkDidSignature as Mt, encodeGroupEntryLink as N, validReactionNumber as Na, turnKeys as Nc, IDENTITY_MAX_EVIDENCE as Ni, cashuRequestPayload as Nn, encodeControl as No, TYPING_KINDS as Nr, SET_ACK as Ns, didGhostlyServiceEntry as Nt, communityHasFrame as O, nextReactionNumber as Oa, nextTurnPosition as Oc, wellKnownUrl as Oi, pubkyHomeserverOf as On, formatLocalTarget as Oo, shouldBeHub as Or, readHandoffHello as Os, DID_FILE_MAX_BYTES as Ot, entryParams as P, wireReaction as Pa, turnName as Pc, IDENTITY_MAX_VALIDITY as Pi, fedimintRequestPayload as Pn, CALL_SIGNAL_MAX_AGE_MS as Po, TYPING_REFRESH_MS as Pr, SET_UPDATE as Ps, didJwsAlg as Pt, carryMentions as Q, heardTime as Qa, createIdentity as Qc, irohRelayUrl as Qi, readGroupFileMeta as Qn, HANDOFF_OFFER as Qo, checkPushEndpoint as Qr, readEnrollHello as Qs, resolveDidDht as Qt, readKnocks as R, BUTTON_ID as Ra, RelayTransport as Rc, boundVerifiedIdentity as Ri, parseFedimintRequestPayload as Rn, callRtcConfig as Ro, GROUP_PIN_FRAME as Rr, signTombstone as Rs, didWebFileNames as Rt, groupTypingEpoch as S, forwardedAgain as Sa, TURN_SETTLE_MS as Sc, nip05RootKey as Si, newPubkyProofFolder as Sn, DirectPathWatch as So, newerHead as Sr, handoffVersions as Ss, normalizeAtprotoHandle as St, COMMUNITY_LIMITS as T, GROUP_REACTION_FRAME as Ta, TURN_LAST_SEQUENCE as Tc, recordsFromWellKnown as Ti, pubkyProofFile as Tn, RELAY_POLL_INTERVALS as To, readBeacon as Tr, readHandoffCancel as Ts, AtprotoProofError as Tt, parseGroupWakeFrame as U, STATUS_CARD_LIMITS as Ua, budgetRetryMs as Uc, receivedIdentityStatus as Ui, engineError as Un, emptyLinkRecords as Uo, pinNumberHolds as Ur, ENROLL_PROOF as Us, parseDidDocument as Ut, groupWakeFrame as V, PR_STATES as Va, setLinkTraceSink as Vc, identityStatement as Vi, LIVENESS_PING_MS as Vn, parseCallSignal as Vo, nextPinNumber as Vr, ENROLL_GRANT as Vs, normalizeDid as Vt, GROUP_LIMITS as W, buttonLabelClash as Wa, isDiscoveryBudgetError as Wc, revokesIdentity as Wi, engineText as Wn, HTTP_SERVICE_PROTO as Wo, readPin as Wr, enrollCancelFrame as Ws, parseDidSignaturePaste as Wt, GROUP_EDIT_FRAME as X, arrivalKey as Xa, openRelayPayload as Xc, automaticTransport as Xi, groupFileFallback as Xn, HANDOFF_HAVE as Xo, relayRequest as Xr, enrollProofFrame as Xs, encodeDidDhtDeactivated as Xt, COMMUNITY_EDIT_FRAME as Y, statusCardText as Ya, newerPacket as Yc, TRANSPORTS as Yi, fetchesByItself as Yn, HANDOFF_DONE as Yo, parseWakeFrame as Yr, enrollHelloFrame as Ys, didDhtFromPublicKey as Yt, GROUP_EDIT_TEXT_BYTES as Z, claimedTime as Za, parseRelayPayload as Zc, irohDescriptor as Zi, isGroupMessageId as Zn, HANDOFF_HELLO as Zo, wakeRequest as Zr, readEnrollGrant as Zs, encodeDidDhtPacket as Zt, checkAppManifest as _, EDIT_BUFFER_MS as _a, newDeviceSetSecret as _c, dnsProofName as _i, sparkInvoiceDetails as _n, MEMBER_KEY as _o, freshHubs as _r, handoffOfferFrame as _s, atprotoDidMethod as _t, planAppUpdate as a, readImageMeta as aa, decodeInviteCode as ac, STATUS_CARD_CAPABILITY as ai, bytesEqual as al, SEPOLIA_TEST_USDT_FAUCET as an, checkAppRevokeStatement as ao, SIGNAL_HOLD_MS as ar, handoffAttemptAllowed as as, parseSshPublicKey as at, GROUP_TYPING_FRAME as b, dhtEditId as ba, TURN_PUT_WINDOW_MS as bc, encodeDnsQuery as bi, isPubkyKey as bn, verifyCommitSignature as bo, mergeBeacon as br, handoffRetryAfter as bs, checkAtprotoProofRecord as bt, readAppStore as c, sanitizeFileName as ca, inviteOwnership as cc, HOLD_DATED_BACK_MS as ci, toBase64Url as cl, WALLET_NETWORKS as cn, readAppRevocation as co, readGroupSignal as cr, handoffBusyFrame as cs, sshSignCommand as ct, APP_BUNDLE_LIMITS as d, VOICE_LIMITS as da, HANDOFF_CAPABILITY as dc, HoldRefusedError as di, utf8Encode as dl, formatPaymentAmount as dn, signAppRevocation as do, meshHubs as dr, handoffContextProof as ds, BitcoinAddressError as dt, DHT_MESSAGE_TTL as ea, createDeviceInvite as ec, chatAppId as ei, identityFromSeedB64 as el, ETHEREUM_USDT as en, shownTime as eo, readGroupWant as er, HANDOFF_PIECE_BYTES as es, mentionsMember as et, APP_BUNDLE_MAGIC as f, baseMime as fa, deviceEchoFrame as fc, isHoldUrl as fi, validatePaymentTarget as fn, canonicalJson as fo, pickMeshHubs as fr, handoffDataFrame as fs, decodeAnyBitcoinAddress as ft, assembleAppBundle as g, parseVideoMeta as ga, devicePingFrame as gc, decodeDnsResponse as gi, sparkAddressKind as gn, MAX_GROUP_CHAIN as go, doorHubs as gr, handoffManifestFrames as gs, ATPROTO_PROOF_SCOPE as gt, appViewOf as h, voicePeaksOf as ha, deviceLinkPairing as hc, DOMAIN_FILE_MAX_BYTES as hi, SPARK_PROVIDER as hn, GROUP_MEMBER_CAP as ho, beaconRecords as hr, handoffHelloFrame as hs, ATPROTO_PROOF_COLLECTION as ht, checkAppBeforeRun as i, parseImageMeta as ia, createChatInvite as ic, EDIT_CAPABILITY as ii, sanitizeAvatar as il, SEPOLIA_TEST_USDT as in, appRef as io, SIGNAL_FRESH_MS as ir, filePartName as is, SshSigError as it, KNOCK_TTL_MS as j, reactionIsNewer as ja, signTurnRelease as jc, capsDescriptors as ji, decodeBolt11 as jn, LIMITS as jo, transferEnded as jr, readHandoffVerified as js, checkDidJws as jt, decodeCommunityLink as k, queueReaction as ka, readTurnPacket as kc, CapsExchange as ki, requestLnurlInvoice as kn, parseLocalTarget as ko, ChatFiles as kr, readHandoffPake as ks, DID_JWS_MAX_LENGTH as kt, readAppStoreSteps as l, sanitizeMime as la, DEVICES_CAPABILITY as lc, HOLD_LIMITS as li, toZ32 as ll, assertTokenUnits as ln, readAppRevocations as lo, MESH_HUBS as lr, handoffCancelFrame as ls, verifySshSignature as lt, appDigest as m, parseVoiceMeta as ma, deviceKeyZ32 as mc, readManifest as mi, SPARK_NETWORKS as mn, readCanonicalJson as mo, beaconKeys as mr, handoffEphemeral as ms, ATPROTO_FULL_SCOPE as mt, appStoreDecision as n, DHT_FILE_CAPABILITY as na, readDeviceInvite as nc, APPS_CAPABILITY as ni, verify as nl, ONCHAIN_PROVIDER as nn, APP_STATEMENT_LIMITS as no, CarriedTransport as nr, HANDOFF_TIMINGS as ns, SSHSIG_MAX_ARMOR as nt, APP_STORE_LIMITS as o, formatFileSize as oa, encodeInviteCode as oc, UPGRADE_CAPABILITY as oi, fromBase64Url as ol, TEST_USDT_FAUCET_AMOUNT as on, isAppKey as oo, SIGNAL_REPLY_MS as or, handoffAttemptFailed as os, parseSshSignature as ot, APP_ICON_PATH as p, fileMessageText as pa, deviceEchoNonce as pc, newMailbox as pi, walletNetworkOf as pn, canonicalJsonBytes as po, COMMUNITY_TOPOLOGY as pr, handoffDigest as ps, ATPROTO_DECLARED_SCOPE as pt, GroupSession as q, checkStatusCard as qa, RELAY_PAYLOAD_MAX_BYTES as qc, emptyProofLedger as qi, GROUP_WANT_FRAME as qn, HANDOFF_ACK as qo, deviceWakeRequest as qr, enrollDoneFrame as qs, strictBase64Url as qt, appUpdateDecision as r, dhtFileId as ra, OwnInviteError as rc, BUTTONS_CAPABILITY as ri, MAX_AVATAR_LENGTH as rl, PaymentPreflightError as rn, appFingerprint as ro, GROUP_SIGNAL_FRAME as rr, HANDOFF_VERIFIED as rs, SSHSIG_NAMESPACE as rt, checkAppStoreIndex as s, safeBlobType as sa, inviteLink as sc, HOLD_CAPABILITY as si, randomBytes as sl, USDT_PUBLIC_RPC as sn, isAppRef as so, groupSignalFrame as sr, handoffAttemptSucceeded as ss, sameSshKey as st, appRevocationFor as t, peekDhtMailbox as ta, deviceInviteJoinerParams as tc, isAppVersion as ti, publicKeyFromZ32 as tl, EVM_TEST_CHAINS as tn, APP_PREFIXES as to, readGroupWantNo as tr, HANDOFF_REQUEST as ts, groupName as tt, signAppStore as u, PLAYABLE_AUDIO as ua, ENROLL_CAPABILITY as uc, HoldKeys as ui, utf8Decode as ul, assertWholeSats as un, signAppObject as uo, mayBeHub as ur, handoffContext as us, verifyBitcoinMessage as ut, isAppUrl as v, EDIT_RATE_WINDOW_MS as va, seedSigner as vc, domainTxtRecord as vi, isBitcoinAddress as vn, commitHash as vo, lobbyKeys as vr, handoffPakeFrame as vs, atprotoProofRecord as vt, sealGroupTyping as w, COMMUNITY_REACTION_FRAME as wa, turnPutSummary as wc, recordsFromTxt as wi, pubkyProofCapability as wn, EXPECT_PEER_MS as wo, rankHubs as wr, readHandoffAck as ws, shortAtprotoDid as wt, GroupTypingBoard as x, parseLinkPreview as xa, TURN_RAISE_READ_TIMEOUT_MS as xc, isPublicAddress as xi, isPubkyProofFolder as xn, edgeParams as xo, mergeLobby as xr, handoffStreamKey as xs, isAtprotoDid as xt, readAppBundle as y, RateWindow as ya, webCryptoSigner as yc, domainWellKnownFile as yi, PUBKY_PROOF_MAX_BYTES as yn, rosterHas as yo, lobbyRecords as yr, handoffReleaseFrame as ys, atprotoProofRkey as yt, GROUP_WAKE_FRAME as z, ITEM_STATES as za, currentRelays as zc, emptyIdentityLedger as zi, GhostLink as zn, callSignalHeardAt as zo, PIN_LIMITS as zr, verifySetUpdate as zs, didWebFileUrl as zt };
|
|
29868
30011
|
|
|
29869
|
-
//# sourceMappingURL=src-
|
|
30012
|
+
//# sourceMappingURL=src-_FzJkeAJ.js.map
|