@ghostlytools/cli 1.1.1 → 1.1.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/README.md +6 -6
- package/SKILL.md +1 -1
- package/dist/assets/{hyperdhtRelay-CVLCuqVr.js → hyperdhtRelay-CHMS7_KO.js} +3 -3
- package/dist/assets/{hyperdhtRelay-CVLCuqVr.js.map → hyperdhtRelay-CHMS7_KO.js.map} +1 -1
- package/dist/assets/{mainline-CKFpwXcB.js → mainline-B0UTU0-4.js} +2 -2
- package/dist/assets/{mainline-CKFpwXcB.js.map → mainline-B0UTU0-4.js.map} +1 -1
- package/dist/assets/{server-vGoe9MET.js → server-9AM0ta6q.js} +84 -72
- package/dist/assets/{server-vGoe9MET.js.map → server-9AM0ta6q.js.map} +1 -1
- package/dist/assets/{src-CJdPTl7Q.js → src-C_E99PGx.js} +42 -42
- package/dist/assets/{src-CJdPTl7Q.js.map → src-C_E99PGx.js.map} +1 -1
- package/dist/ghostly.mjs +32 -32
- package/dist/ghostly.mjs.map +1 -1
- package/examples/call-echo.mjs +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as fileBytesOf, c as removeFileBytes, d as __exportAll, i as fileBytes, n as blobDigest } from "./fileBytes-DxiJHmTk.js";
|
|
2
|
-
import { $a as filePartName, $i as BUTTON_ID, $n as freshHubs, $o as createChatInvite, $r as IdentityExchange, $s as randomBytes, $t as isPubkyKey, A as GROUP_EDIT_TEXT_BYTES, Aa as RTC_CONFIG, An as findEndpoint, Ao as readSetUpdate, Ar as newWakeToken, As as RelayTransport, At as encodeDidDhtPacket, Ba as LEGACY_SERVICES, Bi as GROUP_REACTION_FRAME, Bo as enrollCancelReason, Br as HOLD_LIMITS, Bs as createRelayPayload, Bt as USDT_PUBLIC_RPC, C as groupWakes, Ca as formatLocalTarget, Co as readHandoffHello, Cr as nextPinNumber, Cs as nextTurnPosition, D as GroupSession, Da as decodeControl, Dn as ENDPOINT, Do as sealHandoffPiece, Dr as WAKE_CALL_INTERVAL_MS, Ds as turnKeys, Dt as didDhtDocument, E as GROUP_READ_NOTE, Ea as LIMITS, En as decodeBolt11, Eo as readHandoffVerified, Er as readPin, Es as signTurnRelease, Fi as dhtEditId, Fn as INVITE_TAKEN, Fr as vapidKeysMatch, Fs as budgetRetryMs, Ft as ONCHAIN_PROVIDER, Ga as HANDOFF_HAVE, Gi as reactionEmoji, Gn as MESH_HUBS, Go as enrollProofFrame, Gr as CapsExchange, Gs as identityFromSeed, Gt as validatePaymentTarget, Ha as HANDOFF_ACK, Hi as ReactionWindow, Ho as enrollDoneFrame, Hr as HoldRefusedError, Ht as assertTokenUnits, Ia as parseCallSignal, Ii as parseLinkPreview, In as LIVENESS_PING_MS, Is as isDiscoveryBudgetError, It as PaymentPreflightError, Ja as HANDOFF_PAKE, Ji as validReactionNumber, Jn as pickMeshHubs, Jo as verifyEnrollProof, Jr as dialDescriptors, Js as verify, Jt as SPARK_PROVIDER, Ka as HANDOFF_HELLO, Ki as reactionIsNewer, Kn as mayBeHub, Ko as readEnrollGrant, Kr as DHT_TEXT_CAPABILITY, Ks as identityFromSeedB64, Kt as walletNetworkOf, Li as forwardedAgain, Ln as pairedMessageFrame, Lr as EDIT_CAPABILITY, Ls as withRequestOptions, Lt as SEPOLIA_TEST_USDT, M as parseCommunityEdit, Mi as EDIT_BUFFER_MS, Mn as parseCashuRequestPayload, Mo as setUpdateFrame, Mr as relayRequest, Ms as normalizeRelayUrl, Mt as signDidDhtPacket, N as mentionsMember, Ni as EDIT_RATE_WINDOW_MS, Nn as parseFedimintRequestPayload, No as signTombstone, Nr as wakeRequest, Nt as ETHEREUM_USDT, Oa as encodeControl, Oi as fileMessageText, On as cashuRequestPayload, Or as WakeLimiter, Os as turnName, Ot as didDhtFromPublicKey, P as groupName, Pi as RateWindow, Pn as GhostLink, Po as verifySetUpdate, Pr as checkPushEndpoint, Ps as traceLink, Pt as EVM_TEST_CHAINS, Qa as HANDOFF_VERIFIED, Qi as replySnippet, Qn as doorHubs, Qo as OwnInviteError, Qs as fromBase64Url, Ra as emptyLinkRecords, Ri as readForwarded, Rn as CarriedTransport, Rr as HOLD_CAPABILITY, Rs as PacketTooLargeError, Rt as SEPOLIA_TEST_USDT_FAUCET, S as groupWakeFrame, Sa as GhostlyHttpError, Si as safeBlobType, So as readHandoffHave, Sr as mayPin, Ss as firstDeviceSetSecret, Ta as webLocalFetch, Tn as engineText, To as readHandoffTurnFrame, Tr as pinNumberHolds, Ts as signTurnPacket, Ua as HANDOFF_CANCEL, Ui as nextReactionNumber, Un as groupSignalFrame, Uo as enrollGrantFrame, Ur as newMailbox, Ut as assertWholeSats, Va as serviceIdFromName, Vi as REACTION_LIMITS, Vo as enrollDigits, Vr as HoldKeys, Vt as WALLET_NETWORKS, Wa as HANDOFF_DONE, Wi as queueReaction, Wn as readGroupSignal, Wo as enrollHelloFrame, Wr as readManifest, Ws as createIdentity, Wt as formatPaymentAmount, Xa as HANDOFF_REQUEST, Xi as pairedReplyAuthor, Xn as beaconKeys, Xo as deviceInviteJoinerParams, Xs as sanitizeAvatar, Xt as sparkInvoiceDetails, Ya as HANDOFF_PIECE_BYTES, Yi as wireReaction, Yn as COMMUNITY_TOPOLOGY, Yo as createDeviceInvite, Yt as sparkAddressKind, Za as HANDOFF_TIMINGS, Zi as readReply, Zn as beaconRecords, Zo as readDeviceInvite, Zr as IDENTITY_REVOCATION_LABEL, Zs as bytesEqual, Zt as isBitcoinAddress, _ as knockRecords, _a as edgeParams, _i as peekDhtMailbox, _o as handoffVersions, _r as TypingSender, _s as TURN_SETTLE_MS, a as sealGroupTyping, aa as sameButtonText, ai as receivedIdentityStatus, ao as handoffContext, ar as pickHubs, as as ENROLL_CAPABILITY, ba as RELAY_POLL_INTERVALS, bi as parseImageMeta, bo as readHandoffCancel, bs as TURN_LAST_SEQUENCE, c as GROUP_READ_NOTE_COMMUNITY, ca as claimedTime, ci as PeerProofs, co as handoffDigest, cr as readBeaconHead, cs as deviceEchoNonce, d as encodeCommunityLink, da as shownTime, di as TRANSPORTS, do as handoffManifestFrames, dr as ChatFiles, ds as devicePingFrame, ec as toBase64Url, eo as handoffAttemptAllowed, er as lobbyKeys, es as decodeInviteCode, et as isAtprotoDid, fa as GROUP_MEMBER_CAP, fi as automaticTransport, fo as handoffOfferFrame, fr as FILE_LIMITS, fs as newDeviceSetSecret, g as knockIdentity, ga as verifyCommitSignature, gi as DHT_MESSAGE_TTL, go as handoffStreamKey, gs as TURN_RAISE_READ_TIMEOUT_MS, h as entryParams, ha as rosterHas, ho as handoffRetryAfter, i as openGroupTyping, ia as checkStatusCard, ii as newIdentityBinding, io as handoffCancelFrame, ir as newerHead, is as DEVICES_CAPABILITY, j as carryMentions, ji as parseVideoMeta, jn as isFederationId, jo as setAckFrame, jr as parseWakeFrame, js as currentRelays, ki as parseVoiceMeta, kn as fedimintRequestPayload, kr as deviceWakeRequest, ks as DEFAULT_RELAYS, kt as encodeDidDhtDeactivated, l as communityHasFrame, la as heardTime, li as emptyProofLedger, lo as handoffEphemeral, lr as readLobby, ls as deviceKeyZ32, m as encodeGroupEntryLink, ma as MEMBER_KEY, mi as irohRelayUrl, mo as handoffReleaseFrame, mr as transferStalled, ms as webCryptoSigner, n as GroupTypingBoard, na as STATUS_CARD_LIMITS, nc as utf8Decode, ni as identityRevocationValue, no as handoffAttemptSucceeded, nr as mergeBeacon, o as COMMUNITY_LIMITS, oa as statusCardText, oi as revokesIdentity, oo as handoffContextProof, or as rankHubs, os as HANDOFF_CAPABILITY, p as decodeGroupEntryLink, pi as irohDescriptor, po as handoffPakeFrame, pr as transferEnded, ps as seedSigner, qa as HANDOFF_OFFER, qi as readReaction, qn as meshHubs, qo as readEnrollHello, qr as capsDescriptors, qs as publicKeyFromZ32, qt as SPARK_NETWORKS, r as groupTypingEpoch, rc as utf8Encode, ri as identityStatement, ro as handoffBusyFrame, rr as mergeLobby, rs as inviteOwnership, s as CommunitySession, sa as arrivalKey, si as lastSharedWithMe, so as handoffDataFrame, sr as readBeacon, ss as deviceEchoFrame, tc as toZ32, ti as emptyIdentityLedger, to as handoffAttemptFailed, tr as lobbyRecords, ts as encodeInviteCode, tt as normalizeAtprotoHandle, u as decodeCommunityLink, ua as receivedTimestamp, ui as validExternalKey, uo as handoffHelloFrame, ur as shouldBeHub, us as deviceLinkPairing, v as mergeKnocks, va as DirectPathWatch, vi as DHT_FILE_CAPABILITY, vo as newHandoffId, vs as classifyTurnRead, w as parseGroupWakeFrame, wa as parseLocalTarget, wn as engineError, wo as readHandoffPake, wr as pinIsNewer, ws as readTurnPacket, x as GroupWakeLimiter, xa as presenceSeenAt, xo as readHandoffDone, xr as PIN_LIMITS, xs as TURN_MAX, y as readKnocks, yi as dhtFileId, yo as readHandoffAck, yr as typingActivity, ys as turnPutSummary, za as HTTP_SERVICE_PROTO, zi as COMMUNITY_REACTION_FRAME, zo as enrollCancelFrame, zr as HOLD_DATED_BACK_MS, zt as TEST_USDT_FAUCET_AMOUNT } from "./src-
|
|
2
|
+
import { $a as filePartName, $i as BUTTON_ID, $n as freshHubs, $o as createChatInvite, $r as IdentityExchange, $s as randomBytes, $t as isPubkyKey, A as GROUP_EDIT_TEXT_BYTES, Aa as RTC_CONFIG, An as findEndpoint, Ao as readSetUpdate, Ar as newWakeToken, As as RelayTransport, At as encodeDidDhtPacket, Ba as LEGACY_SERVICES, Bi as GROUP_REACTION_FRAME, Bo as enrollCancelReason, Br as HOLD_LIMITS, Bs as createRelayPayload, Bt as USDT_PUBLIC_RPC, C as groupWakes, Ca as formatLocalTarget, Co as readHandoffHello, Cr as nextPinNumber, Cs as nextTurnPosition, D as GroupSession, Da as decodeControl, Dn as ENDPOINT, Do as sealHandoffPiece, Dr as WAKE_CALL_INTERVAL_MS, Ds as turnKeys, Dt as didDhtDocument, E as GROUP_READ_NOTE, Ea as LIMITS, En as decodeBolt11, Eo as readHandoffVerified, Er as readPin, Es as signTurnRelease, Fi as dhtEditId, Fn as INVITE_TAKEN, Fr as vapidKeysMatch, Fs as budgetRetryMs, Ft as ONCHAIN_PROVIDER, Ga as HANDOFF_HAVE, Gi as reactionEmoji, Gn as MESH_HUBS, Go as enrollProofFrame, Gr as CapsExchange, Gs as identityFromSeed, Gt as validatePaymentTarget, Ha as HANDOFF_ACK, Hi as ReactionWindow, Ho as enrollDoneFrame, Hr as HoldRefusedError, Ht as assertTokenUnits, Ia as parseCallSignal, Ii as parseLinkPreview, In as LIVENESS_PING_MS, Is as isDiscoveryBudgetError, It as PaymentPreflightError, Ja as HANDOFF_PAKE, Ji as validReactionNumber, Jn as pickMeshHubs, Jo as verifyEnrollProof, Jr as dialDescriptors, Js as verify, Jt as SPARK_PROVIDER, Ka as HANDOFF_HELLO, Ki as reactionIsNewer, Kn as mayBeHub, Ko as readEnrollGrant, Kr as DHT_TEXT_CAPABILITY, Ks as identityFromSeedB64, Kt as walletNetworkOf, Li as forwardedAgain, Ln as pairedMessageFrame, Lr as EDIT_CAPABILITY, Ls as withRequestOptions, Lt as SEPOLIA_TEST_USDT, M as parseCommunityEdit, Mi as EDIT_BUFFER_MS, Mn as parseCashuRequestPayload, Mo as setUpdateFrame, Mr as relayRequest, Ms as normalizeRelayUrl, Mt as signDidDhtPacket, N as mentionsMember, Ni as EDIT_RATE_WINDOW_MS, Nn as parseFedimintRequestPayload, No as signTombstone, Nr as wakeRequest, Nt as ETHEREUM_USDT, Oa as encodeControl, Oi as fileMessageText, On as cashuRequestPayload, Or as WakeLimiter, Os as turnName, Ot as didDhtFromPublicKey, P as groupName, Pi as RateWindow, Pn as GhostLink, Po as verifySetUpdate, Pr as checkPushEndpoint, Ps as traceLink, Pt as EVM_TEST_CHAINS, Qa as HANDOFF_VERIFIED, Qi as replySnippet, Qn as doorHubs, Qo as OwnInviteError, Qs as fromBase64Url, Ra as emptyLinkRecords, Ri as readForwarded, Rn as CarriedTransport, Rr as HOLD_CAPABILITY, Rs as PacketTooLargeError, Rt as SEPOLIA_TEST_USDT_FAUCET, S as groupWakeFrame, Sa as GhostlyHttpError, Si as safeBlobType, So as readHandoffHave, Sr as mayPin, Ss as firstDeviceSetSecret, Ta as webLocalFetch, Tn as engineText, To as readHandoffTurnFrame, Tr as pinNumberHolds, Ts as signTurnPacket, Ua as HANDOFF_CANCEL, Ui as nextReactionNumber, Un as groupSignalFrame, Uo as enrollGrantFrame, Ur as newMailbox, Ut as assertWholeSats, Va as serviceIdFromName, Vi as REACTION_LIMITS, Vo as enrollDigits, Vr as HoldKeys, Vt as WALLET_NETWORKS, Wa as HANDOFF_DONE, Wi as queueReaction, Wn as readGroupSignal, Wo as enrollHelloFrame, Wr as readManifest, Ws as createIdentity, Wt as formatPaymentAmount, Xa as HANDOFF_REQUEST, Xi as pairedReplyAuthor, Xn as beaconKeys, Xo as deviceInviteJoinerParams, Xs as sanitizeAvatar, Xt as sparkInvoiceDetails, Ya as HANDOFF_PIECE_BYTES, Yi as wireReaction, Yn as COMMUNITY_TOPOLOGY, Yo as createDeviceInvite, Yt as sparkAddressKind, Za as HANDOFF_TIMINGS, Zi as readReply, Zn as beaconRecords, Zo as readDeviceInvite, Zr as IDENTITY_REVOCATION_LABEL, Zs as bytesEqual, Zt as isBitcoinAddress, _ as knockRecords, _a as edgeParams, _i as peekDhtMailbox, _o as handoffVersions, _r as TypingSender, _s as TURN_SETTLE_MS, a as sealGroupTyping, aa as sameButtonText, ai as receivedIdentityStatus, ao as handoffContext, ar as pickHubs, as as ENROLL_CAPABILITY, ba as RELAY_POLL_INTERVALS, bi as parseImageMeta, bo as readHandoffCancel, bs as TURN_LAST_SEQUENCE, c as GROUP_READ_NOTE_COMMUNITY, ca as claimedTime, ci as PeerProofs, co as handoffDigest, cr as readBeaconHead, cs as deviceEchoNonce, d as encodeCommunityLink, da as shownTime, di as TRANSPORTS, do as handoffManifestFrames, dr as ChatFiles, ds as devicePingFrame, ec as toBase64Url, eo as handoffAttemptAllowed, er as lobbyKeys, es as decodeInviteCode, et as isAtprotoDid, fa as GROUP_MEMBER_CAP, fi as automaticTransport, fo as handoffOfferFrame, fr as FILE_LIMITS, fs as newDeviceSetSecret, g as knockIdentity, ga as verifyCommitSignature, gi as DHT_MESSAGE_TTL, go as handoffStreamKey, gs as TURN_RAISE_READ_TIMEOUT_MS, h as entryParams, ha as rosterHas, ho as handoffRetryAfter, i as openGroupTyping, ia as checkStatusCard, ii as newIdentityBinding, io as handoffCancelFrame, ir as newerHead, is as DEVICES_CAPABILITY, j as carryMentions, ji as parseVideoMeta, jn as isFederationId, jo as setAckFrame, jr as parseWakeFrame, js as currentRelays, ki as parseVoiceMeta, kn as fedimintRequestPayload, kr as deviceWakeRequest, ks as DEFAULT_RELAYS, kt as encodeDidDhtDeactivated, l as communityHasFrame, la as heardTime, li as emptyProofLedger, lo as handoffEphemeral, lr as readLobby, ls as deviceKeyZ32, m as encodeGroupEntryLink, ma as MEMBER_KEY, mi as irohRelayUrl, mo as handoffReleaseFrame, mr as transferStalled, ms as webCryptoSigner, n as GroupTypingBoard, na as STATUS_CARD_LIMITS, nc as utf8Decode, ni as identityRevocationValue, no as handoffAttemptSucceeded, nr as mergeBeacon, o as COMMUNITY_LIMITS, oa as statusCardText, oi as revokesIdentity, oo as handoffContextProof, or as rankHubs, os as HANDOFF_CAPABILITY, p as decodeGroupEntryLink, pi as irohDescriptor, po as handoffPakeFrame, pr as transferEnded, ps as seedSigner, qa as HANDOFF_OFFER, qi as readReaction, qn as meshHubs, qo as readEnrollHello, qr as capsDescriptors, qs as publicKeyFromZ32, qt as SPARK_NETWORKS, r as groupTypingEpoch, rc as utf8Encode, ri as identityStatement, ro as handoffBusyFrame, rr as mergeLobby, rs as inviteOwnership, s as CommunitySession, sa as arrivalKey, si as lastSharedWithMe, so as handoffDataFrame, sr as readBeacon, ss as deviceEchoFrame, tc as toZ32, ti as emptyIdentityLedger, to as handoffAttemptFailed, tr as lobbyRecords, ts as encodeInviteCode, tt as normalizeAtprotoHandle, u as decodeCommunityLink, ua as receivedTimestamp, ui as validExternalKey, uo as handoffHelloFrame, ur as shouldBeHub, us as deviceLinkPairing, v as mergeKnocks, va as DirectPathWatch, vi as DHT_FILE_CAPABILITY, vo as newHandoffId, vs as classifyTurnRead, w as parseGroupWakeFrame, wa as parseLocalTarget, wn as engineError, wo as readHandoffPake, wr as pinIsNewer, ws as readTurnPacket, x as GroupWakeLimiter, xa as presenceSeenAt, xo as readHandoffDone, xr as PIN_LIMITS, xs as TURN_MAX, y as readKnocks, yi as dhtFileId, yo as readHandoffAck, yr as typingActivity, ys as turnPutSummary, za as HTTP_SERVICE_PROTO, zi as COMMUNITY_REACTION_FRAME, zo as enrollCancelFrame, zr as HOLD_DATED_BACK_MS, zt as TEST_USDT_FAUCET_AMOUNT } from "./src-C_E99PGx.js";
|
|
3
3
|
import { a as deleteDatabase, c as profileOpenFailure, d as wrap, i as databaseName, l as store, n as STORES$1, o as fileStore, r as clearProfileStores, s as openDb, t as CARD_INDEX, u as transact } from "./idb-Co2lObpU.js";
|
|
4
4
|
import { $ as onAdaptersChanged, A as intentRepository, C as ProviderSources, Ct as FileAppender, D as requireTurn, Dt as streamStored, E as refuseAway, Et as storedSize, F as ModeGate, G as fakesLightning, H as BITCOIN_INVOICE_ON_TESTNET, I as WrongNetworkError, J as mintNetwork, K as isTestMint, L as networkLabel, M as sealSeed, N as unsealSeed, O as setAwayWallets, P as ModeChanged, Q as identityProviders, R as CASHU_MINT_SOURCE, S as lightningPaying, St as paymentWireId, T as awayFrom, Tt as removeStored, U as DEFAULT_MINTS, V as WALLET_TYPES, W as TEST_MINT, X as BACKUP_MEDIA_TYPE, Y as paysItsOwnInvoices, Z as MAX_BACKUP_BYTES, _ as normalizePhrase, _t as pairedWireReply, a as createFailure, at as SourceConfigError, b as breezDatabasesFor, bt as replyTo, c as paymentNetwork, ct as networkMode, d as networkReason, dt as resolveAtprotoDid, et as registeredLightningProviders, f as rpcHost, ft as setOwnDidSource, g as isRecoveryPhrase, gt as groupReply, h as cardsKey, ht as chosenResolver, i as assertConfirmedReal, it as PROVIDER_PLATFORMS, j as newDeviceKey, k as setSingleWriterGate, l as paymentNetworksOf, lt as redact, m as LightningCards, mt as verifyIdentity, n as loadFedimintSdk, nt as reserveAdapterIds, o as createTiming, ot as SourceUnreachableError, p as CASHU_CARD, pt as boundedIdentityFetch, q as isWorthlessMint, r as WALLET_NAMES, rt as NothingSpentError, s as crossNetwork, st as isNothingSpentError, t as fedimintDatabase, tt as registeredOnchainProviders, u as walletInstances, ut as assertPublicServer, v as breezDatabase, vt as receivedPairedReply, w as sourceKey, wt as readStored$1, x as dropBreezDatabase, xt as paymentAlias, y as breezDatabaseInUse, yt as replyRef, z as cashuMint } from "../ghostly.mjs";
|
|
5
5
|
import { hkdf } from "@noble/hashes/hkdf.js";
|
|
@@ -10799,7 +10799,7 @@ function nostrPost(note) {
|
|
|
10799
10799
|
}
|
|
10800
10800
|
/**
|
|
10801
10801
|
* Nostr: kind-1 notes and the kind-3 follow list of exactly the proven key, from the relays in the person's settings
|
|
10802
|
-
* (never relays named in events, hints or NIP-65 lists: docs/wisps/
|
|
10802
|
+
* (never relays named in events, hints or NIP-65 lists: docs/wisps/309-nostr-social.md). Replies are left out; a page
|
|
10803
10803
|
* reads twice as many notes to find ten that are not. Followers cannot be listed without trusting a counting service.
|
|
10804
10804
|
*/
|
|
10805
10805
|
var nostrActivity = {
|
|
@@ -19095,7 +19095,7 @@ function canEdit(message) {
|
|
|
19095
19095
|
}
|
|
19096
19096
|
/** A group message's id: `<sender>:<epoch>:<seq>` in a private group, `<sender>:<epoch>:<commit>:<seq>` in a community. */
|
|
19097
19097
|
var GROUP_MESSAGE_ID = /^[a-z0-9]{52}:\d+:(?:[0-9a-f]{16}:)?\d+$/;
|
|
19098
|
-
/** A text of mine in a group (WISP
|
|
19098
|
+
/** A text of mine in a group (WISP 902 § Edits): one the group carried under its id, not a payment, a note or an event line. */
|
|
19099
19099
|
function canEditInGroup(message) {
|
|
19100
19100
|
return message.sender === "me" && message.linkId.startsWith("group:") && GROUP_MESSAGE_ID.test(message.id) && !message.file && !message.paymentId && !message.event && !message.groupPay;
|
|
19101
19101
|
}
|
|
@@ -19109,9 +19109,9 @@ function takesPeerEdit(message, text) {
|
|
|
19109
19109
|
/**
|
|
19110
19110
|
* The message after edit `seq`, made at `at`: the new text (and the preview and the status card that came with it, or
|
|
19111
19111
|
* none: each belongs to its version), the version it replaces kept in the history. A text that did not change adds no
|
|
19112
|
-
* version. A status card's update adds none either (WISP
|
|
19112
|
+
* version. A status card's update adds none either (WISP 405 · Status Cards): it replaces the card in place, and its
|
|
19113
19113
|
* text is only the card's fallback, so a bot's thousands of updates keep one card and no trail of versions. Buttons
|
|
19114
|
-
* (WISP
|
|
19114
|
+
* (WISP 406 · Message Buttons) are the exception: their text is the question people answer, so a new one keeps the
|
|
19115
19115
|
* version it replaces, and only a change of the buttons alone (the answer marked, closed) adds none.
|
|
19116
19116
|
*/
|
|
19117
19117
|
function withEdit(message, edit) {
|
|
@@ -19745,7 +19745,7 @@ var EditQueue = class {
|
|
|
19745
19745
|
/** A card's updates from someone else are applied (stored, shown) at most once per this long, per message. */
|
|
19746
19746
|
var CARD_APPLY_GAP_MS = 1e3;
|
|
19747
19747
|
/**
|
|
19748
|
-
* Received status card updates, paced per message (WISP
|
|
19748
|
+
* Received status card updates, paced per message (WISP 405 · Status Cards): the first applies at once, the rest within
|
|
19749
19749
|
* `CARD_APPLY_GAP_MS` wait, and only the highest edit number of them applies when the time is up. A sender that
|
|
19750
19750
|
* ignores its own pace costs this side one write and one render a second per card, whatever it sends.
|
|
19751
19751
|
*/
|
|
@@ -20771,8 +20771,8 @@ var HUB_CLOCK_SLACK_MS = COMMUNITY_TOPOLOGY.beaconEveryMs * 1.5;
|
|
|
20771
20771
|
/** A hub's clock is remembered this long after its entry was last in the beacon. */
|
|
20772
20772
|
var HUB_CLOCK_KEPT_MS = 6e5;
|
|
20773
20773
|
/**
|
|
20774
|
-
* Each hub's clock as its beacon entry showed it (WISP
|
|
20775
|
-
* hubs read their beacon the same way, WISP
|
|
20774
|
+
* Each hub's clock as its beacon entry showed it (WISP 903 · Group Community § Topology, Clocks that differ; the mesh's
|
|
20775
|
+
* hubs read their beacon the same way, WISP 902 · Group Mesh § Hubs). Held against mine as it is, a hub whose clock is
|
|
20776
20776
|
* a minute and a half from mine never looks fresh (its entry is "stale", or "not come yet"): a member saw no hub and a
|
|
20777
20777
|
* hub with such a clock was no hub to anyone. So a hub's clock is learned from its entry: when the entry moved between
|
|
20778
20778
|
* two readings of mine at most `readGapMs` apart, it was written between them, and what it says the time was then,
|
|
@@ -21223,14 +21223,14 @@ var Communities = class {
|
|
|
21223
21223
|
messageId: result.id
|
|
21224
21224
|
};
|
|
21225
21225
|
}
|
|
21226
|
-
/** An application frame to everyone in the group (WISP
|
|
21226
|
+
/** An application frame to everyone in the group (WISP 903 · Group Community § Payments). */
|
|
21227
21227
|
async sendApp(groupId, frame) {
|
|
21228
21228
|
const live = this.live.get(groupId);
|
|
21229
21229
|
if (!live) throw new Error("You are not in this group yet");
|
|
21230
21230
|
const result = await live.session.sendApp(frame, this.host.myNick?.(), this.now());
|
|
21231
21231
|
if ("error" in result) throw new Error(result.error);
|
|
21232
21232
|
}
|
|
21233
|
-
/** An edit of my message, through the group like any frame (WISP
|
|
21233
|
+
/** An edit of my message, through the group like any frame (WISP 903 · Group Community § Edits). An error when it cannot go now. */
|
|
21234
21234
|
async sendEdit(groupId, edit) {
|
|
21235
21235
|
const live = this.live.get(groupId);
|
|
21236
21236
|
if (!live) return "You are not in this group yet";
|
|
@@ -21635,7 +21635,7 @@ var Communities = class {
|
|
|
21635
21635
|
}
|
|
21636
21636
|
/**
|
|
21637
21637
|
* The members this hub may keep edges with: `hubCapacity`, or on an app with a budget of connections (a Mac, WISP
|
|
21638
|
-
*
|
|
21638
|
+
* 902 · Group Mesh § Hubs, Budget) what its other groups and 1:1 chats leave (`peerRoom`), less its edges to the
|
|
21639
21639
|
* other hubs and, for taking someone new (`entries`), its entry sessions.
|
|
21640
21640
|
*/
|
|
21641
21641
|
capacity(groupId, live, now, entries = true) {
|
|
@@ -21672,7 +21672,7 @@ var Communities = class {
|
|
|
21672
21672
|
return true;
|
|
21673
21673
|
}
|
|
21674
21674
|
/**
|
|
21675
|
-
* The newest message frame I hold, for the beacon's head (WISP
|
|
21675
|
+
* The newest message frame I hold, for the beacon's head (WISP 903 § Head): what a member's other profile on the
|
|
21676
21676
|
* same device compares with what it took, to show that something new was said while it was not running.
|
|
21677
21677
|
*/
|
|
21678
21678
|
newestFrame(live) {
|
|
@@ -22428,7 +22428,7 @@ var GONE_LINGER_MS = 15e3;
|
|
|
22428
22428
|
*/
|
|
22429
22429
|
var HUB_CLOCK_READ_GAP_MS = 75e3;
|
|
22430
22430
|
/**
|
|
22431
|
-
* The hubs of the private groups this device is in (WISP
|
|
22431
|
+
* The hubs of the private groups this device is in (WISP 902 · Group Mesh § Hubs): whether a group runs on hubs, who
|
|
22432
22432
|
* they are (the community's sealed beacon and lobbies, under the epoch's rendezvous secret), whether I am one, which
|
|
22433
22433
|
* edges that asks for, and passing frames on as a hub. `Groups` owns the sessions and the edges; this decides.
|
|
22434
22434
|
*/
|
|
@@ -22501,7 +22501,7 @@ var MeshHubs = class {
|
|
|
22501
22501
|
this.live.delete(groupId);
|
|
22502
22502
|
}
|
|
22503
22503
|
/**
|
|
22504
|
-
* The edges this app may keep in a group, within its budget of connections (WISP
|
|
22504
|
+
* The edges this app may keep in a group, within its budget of connections (WISP 902 · Group Mesh § Hubs, Budget):
|
|
22505
22505
|
* what the other groups' links do not hold, less what the groups I am a hub of still have to open. Undefined for an
|
|
22506
22506
|
* app without a budget. What this group holds itself does not count: a hub that stepped down would fit again at once.
|
|
22507
22507
|
*/
|
|
@@ -22912,7 +22912,7 @@ var MeshHubs = class {
|
|
|
22912
22912
|
}
|
|
22913
22913
|
/**
|
|
22914
22914
|
* As a hub, what the session took for the first time goes on to every other edge that is up: not back where it came
|
|
22915
|
-
* from, nor to its author. Everyone else takes it as a frame handed on (WISP
|
|
22915
|
+
* from, nor to its author. Everyone else takes it as a frame handed on (WISP 902 § Catch-up).
|
|
22916
22916
|
*/
|
|
22917
22917
|
passOn(groupId, session, from, frames) {
|
|
22918
22918
|
if (!this.live.get(groupId)?.hub || !frames.length) return 0;
|
|
@@ -22955,7 +22955,7 @@ function authorOf(frame) {
|
|
|
22955
22955
|
//#endregion
|
|
22956
22956
|
//#region ../browser/src/engine/groupTyping.ts
|
|
22957
22957
|
/**
|
|
22958
|
-
* Typing in private groups (WISP
|
|
22958
|
+
* Typing in private groups (WISP 902 · Group Mesh § Typing): this side's word goes sealed on every open edge to a
|
|
22959
22959
|
* member, and each member's word is shown until its `stop`, its message, or 6 s without a new `start`. Never stored.
|
|
22960
22960
|
* Community groups do not carry it yet (their frames are all stored messages).
|
|
22961
22961
|
*/
|
|
@@ -23022,7 +23022,7 @@ var GroupTypings = class {
|
|
|
23022
23022
|
//#endregion
|
|
23023
23023
|
//#region ../browser/src/engine/meshSignals.ts
|
|
23024
23024
|
/**
|
|
23025
|
-
* Edge signaling through members (WISP
|
|
23025
|
+
* Edge signaling through members (WISP 902 · Group Mesh § Signaling through members; `CarriedTransport` in core): which
|
|
23026
23026
|
* links an edge's packet is handed to, what a member does with one that is for someone else, and what happens to one
|
|
23027
23027
|
* that is for me. A packet is the edge's own Pkarr packet, signed under a key only its two ends derive: whoever
|
|
23028
23028
|
* carries it sees a signed blob, as a relay does, and the edge checks it as it checks a relay's answer.
|
|
@@ -23395,7 +23395,7 @@ var HERE_PER_MINUTE = 4;
|
|
|
23395
23395
|
* re-offer) slows in proportion, and an edge to someone away (read to notice them come back) by the square root:
|
|
23396
23396
|
* at 32 members, every four minutes and every minute, so 31 edges cost about 8 reads a minute when everyone is here
|
|
23397
23397
|
* and 32 when nobody is. Whoever reaches a member coming back first tells the others (`group-here`), who then look
|
|
23398
|
-
* fast for it (WISP
|
|
23398
|
+
* fast for it (WISP 902 § Cost per member).
|
|
23399
23399
|
*/
|
|
23400
23400
|
function meshEdgeScale(members, connected = true) {
|
|
23401
23401
|
const ratio = Math.max(1, (members - 1) / 8);
|
|
@@ -23489,15 +23489,15 @@ var Groups = class {
|
|
|
23489
23489
|
communities;
|
|
23490
23490
|
/** My messages and edits an edge of a private group took. */
|
|
23491
23491
|
frames = new FramesTaken();
|
|
23492
|
-
/** Hubs of the private groups past 16 members (WISP
|
|
23492
|
+
/** Hubs of the private groups past 16 members (WISP 902 · Group Mesh § Hubs). */
|
|
23493
23493
|
hubs;
|
|
23494
23494
|
/** Groups whose edges are being reconciled because their hubs changed: one at a time. */
|
|
23495
23495
|
hubReconcile = /* @__PURE__ */ new Set();
|
|
23496
23496
|
/** Groups a commit took me out of, and when: their edges close `REMOVED_LINGER_MS` later. */
|
|
23497
23497
|
removedAt = /* @__PURE__ */ new Map();
|
|
23498
|
-
/** Who is typing in each private group, and this side's word there (WISP
|
|
23498
|
+
/** Who is typing in each private group, and this side's word there (WISP 902 · Group Mesh § Typing). */
|
|
23499
23499
|
typings;
|
|
23500
|
-
/** Edge signaling through members (WISP
|
|
23500
|
+
/** Edge signaling through members (WISP 902 · Group Mesh § Signaling through members). */
|
|
23501
23501
|
signals;
|
|
23502
23502
|
constructor(host, store = db, timings = ENTRY_TIMINGS, communityTimings = COMMUNITY_TIMINGS, random, hubTimings = MESH_HUB_TIMINGS) {
|
|
23503
23503
|
this.host = host;
|
|
@@ -23677,7 +23677,7 @@ var Groups = class {
|
|
|
23677
23677
|
return this.isCommunity(groupId) ? this.communities.taken(groupId, key) : this.frames.count(groupId, key);
|
|
23678
23678
|
}
|
|
23679
23679
|
/**
|
|
23680
|
-
* Says an edit of my message to the group (WISP
|
|
23680
|
+
* Says an edit of my message to the group (WISP 902 § Edits): over the edges of a private group (to member `to`
|
|
23681
23681
|
* alone, when given), through a community like any frame. An error when it cannot go now.
|
|
23682
23682
|
*/
|
|
23683
23683
|
async sendEdit(groupId, edit, to) {
|
|
@@ -23762,7 +23762,7 @@ var Groups = class {
|
|
|
23762
23762
|
}
|
|
23763
23763
|
/**
|
|
23764
23764
|
* Sends a text; `messageId` is the id it is kept under here (what history, replies and reactions name). `forwarded`:
|
|
23765
|
-
* the hop count of a forwarded text (WISP
|
|
23765
|
+
* the hop count of a forwarded text (WISP 902 § Forwards). `card`: a checked status card, the text its fallback.
|
|
23766
23766
|
*/
|
|
23767
23767
|
async send(groupId, text, mentions = [], reply, forwarded, card) {
|
|
23768
23768
|
if (this.isCommunity(groupId)) return card ? this.communities.send(groupId, text, mentions, reply, forwarded, card) : this.communities.send(groupId, text, mentions, reply, forwarded);
|
|
@@ -23776,7 +23776,7 @@ var Groups = class {
|
|
|
23776
23776
|
};
|
|
23777
23777
|
}
|
|
23778
23778
|
/**
|
|
23779
|
-
* This side is typing in a private group (with what it is doing), or stopped (WISP
|
|
23779
|
+
* This side is typing in a private group (with what it is doing), or stopped (WISP 902 · Group Mesh § Typing).
|
|
23780
23780
|
* Nothing for a community: it does not carry typing yet.
|
|
23781
23781
|
*/
|
|
23782
23782
|
setTyping(groupId, typing, activity) {
|
|
@@ -23995,7 +23995,7 @@ var Groups = class {
|
|
|
23995
23995
|
}
|
|
23996
23996
|
/**
|
|
23997
23997
|
* The admin pins a member of a private group as a hub, excludes one from being a hub, or leaves it to the member's
|
|
23998
|
-
* app (`null`): said in the group's metadata, which every member keeps (WISP
|
|
23998
|
+
* app (`null`): said in the group's metadata, which every member keeps (WISP 902 · Group Mesh § Hubs).
|
|
23999
23999
|
*/
|
|
24000
24000
|
async setHub(groupId, key, role) {
|
|
24001
24001
|
if (this.isCommunity(groupId)) throw new Error("A community group chooses its hubs by itself");
|
|
@@ -24005,12 +24005,12 @@ var Groups = class {
|
|
|
24005
24005
|
rotate(groupId) {
|
|
24006
24006
|
return this.isCommunity(groupId) ? this.communities.rotate(groupId) : this.session(groupId).rotate();
|
|
24007
24007
|
}
|
|
24008
|
-
/** The admin sets or removes the group's picture; every member gets it over the edges (WISP
|
|
24008
|
+
/** The admin sets or removes the group's picture; every member gets it over the edges (WISP 902 § Metadata). */
|
|
24009
24009
|
async setPicture(groupId, picture) {
|
|
24010
24010
|
if (this.isCommunity(groupId)) return this.communities.setPicture(groupId, picture);
|
|
24011
24011
|
await this.session(groupId).setPicture(picture);
|
|
24012
24012
|
}
|
|
24013
|
-
/** The admin renames the group; every member gets the name over the edges, beside the picture (WISP
|
|
24013
|
+
/** The admin renames the group; every member gets the name over the edges, beside the picture (WISP 902 § Metadata). */
|
|
24014
24014
|
async rename(groupId, name) {
|
|
24015
24015
|
if (this.isCommunity(groupId)) return this.communities.rename(groupId, name);
|
|
24016
24016
|
await this.session(groupId).rename(name);
|
|
@@ -24173,7 +24173,7 @@ var Groups = class {
|
|
|
24173
24173
|
}
|
|
24174
24174
|
}
|
|
24175
24175
|
/**
|
|
24176
|
-
* Private groups past 16 members: their hubs (WISP
|
|
24176
|
+
* Private groups past 16 members: their hubs (WISP 902 · Group Mesh § Hubs), then their edges, when what the hubs
|
|
24177
24177
|
* ask for is not what exists (a hub came or went, I became one, a member asked me).
|
|
24178
24178
|
*/
|
|
24179
24179
|
async hubsTick(now) {
|
|
@@ -24224,7 +24224,7 @@ var Groups = class {
|
|
|
24224
24224
|
return Object.entries(this.stored.get(groupId)?.contacts ?? {}).find(([, id]) => id === linkId)?.[0];
|
|
24225
24225
|
}
|
|
24226
24226
|
/**
|
|
24227
|
-
* My packet for the edge to `to`, handed to links that reach that member or may pass it on (WISP
|
|
24227
|
+
* My packet for the edge to `to`, handed to links that reach that member or may pass it on (WISP 902 · Group Mesh
|
|
24228
24228
|
* § Signaling through members): how many took it, and whether one of them surely reaches that member. None in a
|
|
24229
24229
|
* community, whose members keep no edges with each other.
|
|
24230
24230
|
*/
|
|
@@ -24581,7 +24581,7 @@ var Groups = class {
|
|
|
24581
24581
|
}
|
|
24582
24582
|
/**
|
|
24583
24583
|
* A reaction: from the member whose edge it came on (`group-react`), or signed by a member and passed on by a hub
|
|
24584
|
-
* (`group-reacted`). As a hub, a signed one goes on to the other edges (WISP
|
|
24584
|
+
* (`group-reacted`). As a hub, a signed one goes on to the other edges (WISP 902 · Group Mesh § Hubs).
|
|
24585
24585
|
*/
|
|
24586
24586
|
async reaction(groupId, session, from, raw) {
|
|
24587
24587
|
if (session.status !== "active" || raw.g !== groupId) return;
|
|
@@ -24992,7 +24992,7 @@ var Groups = class {
|
|
|
24992
24992
|
//#endregion
|
|
24993
24993
|
//#region ../browser/src/engine/groupEdges.ts
|
|
24994
24994
|
/**
|
|
24995
|
-
* An edge of a group as the group page shows it (WISP
|
|
24995
|
+
* An edge of a group as the group page shows it (WISP 902 § Mesh): open means group frames flow, which
|
|
24996
24996
|
* is what "reachable" means everywhere else in groups; what carries it; when the member was last heard.
|
|
24997
24997
|
*/
|
|
24998
24998
|
function edgeView(live, now = Date.now(), noSlot = false) {
|
|
@@ -25016,7 +25016,7 @@ function edgeView(live, now = Date.now(), noSlot = false) {
|
|
|
25016
25016
|
//#endregion
|
|
25017
25017
|
//#region ../browser/src/engine/groupPayments.ts
|
|
25018
25018
|
/**
|
|
25019
|
-
* Payments in a group (WISP
|
|
25019
|
+
* Payments in a group (WISP 902 § Payments). The money, the invoice and the receipts travel only on the edge
|
|
25020
25020
|
* between the two members, as they would on a 1:1 chat (the PaymentDesk does that part, with the edge's link as
|
|
25021
25021
|
* the chat). What the rest of the group learns is a `group-pay` note, sent by each side about its own part over
|
|
25022
25022
|
* every edge: who pays whom, how much, over what, and how it stands. A note is believed only from the member it
|
|
@@ -25335,7 +25335,7 @@ var GroupEdits = class {
|
|
|
25335
25335
|
host;
|
|
25336
25336
|
now;
|
|
25337
25337
|
buffer;
|
|
25338
|
-
/** Members' status card updates, applied at most once a second per message (WISP
|
|
25338
|
+
/** Members' status card updates, applied at most once a second per message (WISP 405 · Status Cards). */
|
|
25339
25339
|
cards;
|
|
25340
25340
|
sendPace = /* @__PURE__ */ new Map();
|
|
25341
25341
|
receivePace = /* @__PURE__ */ new Map();
|
|
@@ -25351,7 +25351,7 @@ var GroupEdits = class {
|
|
|
25351
25351
|
/**
|
|
25352
25352
|
* Edits a text of mine in a group: the new text here at once, and to the group as soon as the pace allows. Mentions
|
|
25353
25353
|
* the message had stay where their words still are; `added` are those picked while editing. `card`: the status card
|
|
25354
|
-
* of the new version, already checked (WISP
|
|
25354
|
+
* of the new version, already checked (WISP 405 · Status Cards); a card message then takes `STATUS_CARD_LIMITS.edits`.
|
|
25355
25355
|
*/
|
|
25356
25356
|
async edit(groupId, messageId, raw, added = [], card) {
|
|
25357
25357
|
const refuse = (error) => ({
|
|
@@ -25538,7 +25538,7 @@ var GroupEdits = class {
|
|
|
25538
25538
|
//#endregion
|
|
25539
25539
|
//#region ../browser/src/shared/payLinks.ts
|
|
25540
25540
|
/**
|
|
25541
|
-
* The desk's links to members of a community group (WISP
|
|
25541
|
+
* The desk's links to members of a community group (WISP 903 · Group Community § Payments): payments with a member
|
|
25542
25542
|
* go through the group, sealed to them, over `cpay:<group>:<member>`; a request to everyone over `cpay:<group>`.
|
|
25543
25543
|
*/
|
|
25544
25544
|
var pairLinkId = (groupId, member) => `cpay:${groupId}:${member}`;
|
|
@@ -25554,7 +25554,7 @@ function parsePayLink(linkId) {
|
|
|
25554
25554
|
//#endregion
|
|
25555
25555
|
//#region ../browser/src/engine/communityPay.ts
|
|
25556
25556
|
/**
|
|
25557
|
-
* Payments in community groups (WISP
|
|
25557
|
+
* Payments in community groups (WISP 903 · Group Community § Payments). Members have no edge to each other: what
|
|
25558
25558
|
* two members say about a payment (`pay-req`, `pay-ask`, `pay`, `pay-res`) is sealed to the other one inside a frame
|
|
25559
25559
|
* the whole group carries (`CommunitySession.sendPair`), so hubs relay it and keep it for a member who was away
|
|
25560
25560
|
* without being able to read it. A request to the whole group, and its "paid", go to everyone as an application
|
|
@@ -26003,7 +26003,7 @@ var HOLD_FETCH_BYTES_PER_S = 65536;
|
|
|
26003
26003
|
var holdFetchTimeoutMs = (max) => HOLD_FETCH_MS + Math.ceil(max / HOLD_FETCH_BYTES_PER_S) * 1e3;
|
|
26004
26004
|
var hex$2 = (bytes) => Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
26005
26005
|
/**
|
|
26006
|
-
* Store-and-forward for away contacts (WISP
|
|
26006
|
+
* Store-and-forward for away contacts (WISP 404, `hold/1`), on both ends of every chat that turned it
|
|
26007
26007
|
* on: what this device sends while the contact is away is sealed and put in this device's own storage,
|
|
26008
26008
|
* named in a manifest, and pointed at from a small record on the DHT; what the contact held for this
|
|
26009
26009
|
* device is picked up from its pointer, checked and stored in order, and acknowledged on this device's
|
|
@@ -27513,7 +27513,7 @@ var ProfilePeek = class {
|
|
|
27513
27513
|
};
|
|
27514
27514
|
}
|
|
27515
27515
|
/**
|
|
27516
|
-
* A community group: its beacon, which hubs republish every 30 s with the newest frame they hold (WISP
|
|
27516
|
+
* A community group: its beacon, which hubs republish every 30 s with the newest frame they hold (WISP 903 § Head).
|
|
27517
27517
|
* New when this profile has not taken that frame. Nothing is opened but the head.
|
|
27518
27518
|
*/
|
|
27519
27519
|
async community(group, transport) {
|
|
@@ -27750,7 +27750,7 @@ var S3Store = class {
|
|
|
27750
27750
|
}
|
|
27751
27751
|
/**
|
|
27752
27752
|
* A URL that reads one object with no credential until `seconds` from now: what an away contact is
|
|
27753
|
-
* handed to pick up what was held for it (WISP
|
|
27753
|
+
* handed to pick up what was held for it (WISP 404). The secret key never leaves this device; the
|
|
27754
27754
|
* signature covers the exact object, method and lifetime, so the URL reads that object and nothing else.
|
|
27755
27755
|
*/
|
|
27756
27756
|
async presign(name, seconds) {
|
|
@@ -29752,7 +29752,7 @@ var PaymentDesk = class {
|
|
|
29752
29752
|
return { paymentId: id };
|
|
29753
29753
|
}
|
|
29754
29754
|
/**
|
|
29755
|
-
* A request to a whole group (WISP
|
|
29755
|
+
* A request to a whole group (WISP 902 § Payments): one request, on one rail, sent to every member over their
|
|
29756
29756
|
* edge; the first payment that settles it wins. One rail only, because each enforces "once" by itself: a
|
|
29757
29757
|
* Lightning invoice can be paid once, and ecash is checked here before it is redeemed (a later token is refused
|
|
29758
29758
|
* unredeemed, so its payer takes it back). Two rails at once would let an invoice and a token both pay it.
|
|
@@ -30052,7 +30052,7 @@ var PaymentDesk = class {
|
|
|
30052
30052
|
endpoints: [...payment.invoice ? [[ENDPOINT.bolt11, payment.invoice]] : [], ...payment.mints?.length ? [[ENDPOINT.cashu, cashuRequestPayload(payment.mints)]] : []]
|
|
30053
30053
|
};
|
|
30054
30054
|
}
|
|
30055
|
-
/** `held`: picked up from the contact's storage while it was away (WISP
|
|
30055
|
+
/** `held`: picked up from the contact's storage while it was away (WISP 404): only what this device allows counts, and only Cashu or Lightning. */
|
|
30056
30056
|
async onPaymentRequest(linkId, request, held = false) {
|
|
30057
30057
|
if (this.find(linkId, request.id)?.linkId === linkId) return;
|
|
30058
30058
|
if (held && (findEndpoint(request.endpoints, ENDPOINT.usdt) || findEndpoint(request.endpoints, ENDPOINT.arkade) || findEndpoint(request.endpoints, ENDPOINT.bark) || findEndpoint(request.endpoints, ENDPOINT.bitcoin) || findEndpoint(request.endpoints, ENDPOINT.fedimint) || findEndpoint(request.endpoints, ENDPOINT.spark))) return;
|
|
@@ -32557,7 +32557,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
32557
32557
|
editQueues = /* @__PURE__ */ new Map();
|
|
32558
32558
|
/** The contacts' edits of messages not here yet. */
|
|
32559
32559
|
editBuffer = new EditBuffer();
|
|
32560
|
-
/** Received status card updates, applied at most once a second per message (WISP
|
|
32560
|
+
/** Received status card updates, applied at most once a second per message (WISP 405 · Status Cards). */
|
|
32561
32561
|
cardEdits = new CardEditPacer();
|
|
32562
32562
|
/** When each message's buttons were last pressed here (`pressButton`). */
|
|
32563
32563
|
pressedAt = /* @__PURE__ */ new Map();
|
|
@@ -32565,7 +32565,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
32565
32565
|
wakeLimiter = new WakeLimiter();
|
|
32566
32566
|
/** Call wake-ups have their own, shorter limit: a call is rarer than a message and cannot wait five minutes. */
|
|
32567
32567
|
callWakeLimiter = new WakeLimiter(WAKE_CALL_INTERVAL_MS);
|
|
32568
|
-
/** Mentions in private groups: one per member per 5 minutes, four per group per minute (WISP
|
|
32568
|
+
/** Mentions in private groups: one per member per 5 minutes, four per group per minute (WISP 902 · Group Mesh § Wake-up push). */
|
|
32569
32569
|
groupWakeLimiter = new GroupWakeLimiter();
|
|
32570
32570
|
/** `group-wake` frames read per edge, a handful a minute. */
|
|
32571
32571
|
groupWakeReceived = /* @__PURE__ */ new Map();
|
|
@@ -32603,7 +32603,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
32603
32603
|
paymentTimer = null;
|
|
32604
32604
|
/** Every minute, the reviews no Approve can send any more are cancelled (dropStaleReviews). */
|
|
32605
32605
|
staleReviewTimer;
|
|
32606
|
-
/** Group links: admins read knocks, joiners knock (WISP
|
|
32606
|
+
/** Group links: admins read knocks, joiners knock (WISP 902 § Entry link). */
|
|
32607
32607
|
groupEntryTimer = null;
|
|
32608
32608
|
walletView = {
|
|
32609
32609
|
mints: [],
|
|
@@ -32872,7 +32872,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
32872
32872
|
await this.sparkWallets[network].adapter?.sync();
|
|
32873
32873
|
}
|
|
32874
32874
|
})));
|
|
32875
|
-
/** Store-and-forward for away contacts (WISP
|
|
32875
|
+
/** Store-and-forward for away contacts (WISP 404): items sealed into this device's own storage, picked up from the contact's. */
|
|
32876
32876
|
holdStore = null;
|
|
32877
32877
|
hold = new HoldEngine({
|
|
32878
32878
|
transport: void 0,
|
|
@@ -33094,7 +33094,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
33094
33094
|
publish: (seed, records) => this.transport.publish(identityFromSeed(seed), records),
|
|
33095
33095
|
resolve: async (key) => (await this.transport.resolve(key))?.records ?? null
|
|
33096
33096
|
});
|
|
33097
|
-
/** The profile's did:dht: a key of its own, public, never tied to a chat (WISP
|
|
33097
|
+
/** The profile's did:dht: a key of its own, public, never tied to a chat (WISP 310-did-dht). */
|
|
33098
33098
|
did = new ProfileDid({
|
|
33099
33099
|
online: () => this.networkOn,
|
|
33100
33100
|
emit: () => this.emitState(),
|
|
@@ -33322,7 +33322,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
33322
33322
|
communityPair: (groupId, sender, payload) => this.communityPay.receivePair(groupId, sender, payload)
|
|
33323
33323
|
});
|
|
33324
33324
|
/**
|
|
33325
|
-
* Payments in community groups (WISP
|
|
33325
|
+
* Payments in community groups (WISP 903 · Group Community § Payments): the desk pays and requests over a link
|
|
33326
33326
|
* per member that sends through the group, sealed to that member; the group request goes to everyone at once.
|
|
33327
33327
|
*/
|
|
33328
33328
|
communityPay = new CommunityPay({
|
|
@@ -33338,7 +33338,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
33338
33338
|
emit: () => this.emitState()
|
|
33339
33339
|
});
|
|
33340
33340
|
/**
|
|
33341
|
-
* Edits in groups (WISP
|
|
33341
|
+
* Edits in groups (WISP 902 § Edits): mine said to the group at the pace allowed, the members' on their messages.
|
|
33342
33342
|
* Never a new message: no sound, no unread.
|
|
33343
33343
|
*/
|
|
33344
33344
|
groupEdits = new GroupEdits({
|
|
@@ -33374,7 +33374,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
33374
33374
|
return this.outsideEdge(linkId) ? null : this.links.get(linkId)?.link ?? this.communityPay.link(linkId);
|
|
33375
33375
|
}
|
|
33376
33376
|
/**
|
|
33377
|
-
* Payments in groups (WISP
|
|
33377
|
+
* Payments in groups (WISP 902 § Payments): the money goes over the edge to one member through the desk, like a
|
|
33378
33378
|
* chat's; what the group sees of it goes to every member as a `group-pay` note.
|
|
33379
33379
|
*/
|
|
33380
33380
|
groupPayments = new GroupPayments({
|
|
@@ -35053,7 +35053,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
35053
35053
|
}));
|
|
35054
35054
|
}
|
|
35055
35055
|
/**
|
|
35056
|
-
* `card`: a bot's status card (WISP
|
|
35056
|
+
* `card`: a bot's status card (WISP 405 · Status Cards), checked here by the sender's rule; the text is its fallback,
|
|
35057
35057
|
* written from the card when none is given. Only the headless runtime and SDKs send one: the app never offers it.
|
|
35058
35058
|
*/
|
|
35059
35059
|
async sendMessage(params) {
|
|
@@ -35068,7 +35068,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
35068
35068
|
error: "Nothing to send",
|
|
35069
35069
|
refused: true
|
|
35070
35070
|
};
|
|
35071
|
-
const live = this.
|
|
35071
|
+
const live = await this.linkWhenAdded(linkId);
|
|
35072
35072
|
const trimmed = text.trim();
|
|
35073
35073
|
const bytes = new TextEncoder().encode(trimmed).length;
|
|
35074
35074
|
if (live && !live.stored.profile && !(live.link?.isDataLinkOpen && trimmed.length <= LIMITS.maxChatMessageBytes / 4) && bytes > 500) return {
|
|
@@ -35293,7 +35293,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
35293
35293
|
static dhtByChoice(live) {
|
|
35294
35294
|
return live?.stored.deliveryMode === "dht" || live?.link?.dhtDelivery?.peerMode === "dht";
|
|
35295
35295
|
}
|
|
35296
|
-
/** A status card a caller asks to send, by the sender's rule (WISP
|
|
35296
|
+
/** A status card a caller asks to send, by the sender's rule (WISP 405 · Status Cards), or why it cannot go. */
|
|
35297
35297
|
static cardToSend(raw) {
|
|
35298
35298
|
const checked = checkStatusCard(raw);
|
|
35299
35299
|
return "error" in checked ? `Status card: ${checked.error}` : checked.card;
|
|
@@ -35418,7 +35418,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
35418
35418
|
return !!live?.caps?.peer?.capabilities.includes(EDIT_CAPABILITY);
|
|
35419
35419
|
}
|
|
35420
35420
|
/**
|
|
35421
|
-
* A question of mine with buttons went on the DHT floor or into a hold, which carry its text alone (WISP
|
|
35421
|
+
* A question of mine with buttons went on the DHT floor or into a hold, which carry its text alone (WISP 406 · Message
|
|
35422
35422
|
* Buttons): its buttons are due to go again live. Once: a row that had them restored already stays so.
|
|
35423
35423
|
*/
|
|
35424
35424
|
async buttonsWentBare(linkId, message) {
|
|
@@ -35426,7 +35426,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
35426
35426
|
await db.patchMessage(linkId, message.id, (current) => current.sender === "me" && current.card?.kind === "buttons" && !current.buttonsRestore ? { buttonsRestore: "due" } : null);
|
|
35427
35427
|
}
|
|
35428
35428
|
/**
|
|
35429
|
-
* Buttons the contact may not have (WISP
|
|
35429
|
+
* Buttons the contact may not have (WISP 406 · Message Buttons): a question whose text went on the DHT floor or into a
|
|
35430
35430
|
* hold reached the contact as text alone, and a copy under the same id that comes live later is taken as the one
|
|
35431
35431
|
* already there. Once the chat is live with an app that shows buttons (`buttons/1`) and takes edits, each such
|
|
35432
35432
|
* question goes again as an edit of its buttons alone: the same text, so no version and no edit mark. Once per
|
|
@@ -35526,7 +35526,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
35526
35526
|
}
|
|
35527
35527
|
await this.outboxFor(linkId).transmit(messageId, { manual: true });
|
|
35528
35528
|
}
|
|
35529
|
-
/** The contact is away, and both sides chose to hold what is sent meanwhile (WISP
|
|
35529
|
+
/** The contact is away, and both sides chose to hold what is sent meanwhile (WISP 404). */
|
|
35530
35530
|
holdingFor(live) {
|
|
35531
35531
|
return !!live.stored.profile && !!live.link && !live.link.isDataLinkOpen && this.hold.canHold(live.stored.id);
|
|
35532
35532
|
}
|
|
@@ -35875,7 +35875,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
35875
35875
|
...forwarded && { forwarded }
|
|
35876
35876
|
};
|
|
35877
35877
|
const wire = reply && pairedWireReply(reply);
|
|
35878
|
-
const live = this.links.get(linkId);
|
|
35878
|
+
const live = this.linksAdding.has(linkId) ? await this.linkWhenAdded(linkId) : this.links.get(linkId);
|
|
35879
35879
|
const fail = (error) => {
|
|
35880
35880
|
const transfer = {
|
|
35881
35881
|
state: "failed",
|
|
@@ -36634,7 +36634,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
36634
36634
|
return this.groups.messages(groupId);
|
|
36635
36635
|
}
|
|
36636
36636
|
/**
|
|
36637
|
-
* Presses a button of a message someone else sent to a chat or a group (`group:<id>`), WISP
|
|
36637
|
+
* Presses a button of a message someone else sent to a chat or a group (`group:<id>`), WISP 406 · Message Buttons:
|
|
36638
36638
|
* a reply to it whose text is the button's label and whose `r` names the button, so the author learns who pressed
|
|
36639
36639
|
* what, and an app without buttons reads an ordinary reply. Refused: my own message, a button it does not have,
|
|
36640
36640
|
* buttons the author closed, a question I already answered with a `once` button, a second press within a second.
|
|
@@ -36725,7 +36725,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
36725
36725
|
result.error ??= error;
|
|
36726
36726
|
};
|
|
36727
36727
|
const groupId = to.startsWith("group:") ? to.slice(6) : void 0;
|
|
36728
|
-
const live = groupId ? void 0 : this.
|
|
36728
|
+
const live = groupId ? void 0 : await this.linkWhenAdded(to);
|
|
36729
36729
|
if (groupId ? !this.membership(groupId) : !live || live.stored.group !== void 0) {
|
|
36730
36730
|
note(groupId ? "You are not in this group" : "Chat not found");
|
|
36731
36731
|
continue;
|
|
@@ -37099,7 +37099,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
37099
37099
|
if (typing === true && this.settings.sendTyping !== false) live.link?.setTyping(true, typingActivity(kind, status));
|
|
37100
37100
|
else live.link?.setTyping(false);
|
|
37101
37101
|
}
|
|
37102
|
-
/** WISP
|
|
37102
|
+
/** WISP 902 · Group Mesh § Typing: the same word in a private group, on its edges; a community says nothing yet. */
|
|
37103
37103
|
setGroupTyping({ groupId, typing, kind, status }) {
|
|
37104
37104
|
if (typeof groupId !== "string") return;
|
|
37105
37105
|
if (typing === true && this.settings.sendTyping !== false) this.groups.setTyping(groupId, true, typingActivity(kind, status));
|
|
@@ -37851,6 +37851,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
37851
37851
|
const paying = params.target.method === "cashu" ? mintNetwork(params.target.provider) : walletNetworkOf(params.target.network);
|
|
37852
37852
|
if (params.network && params.network !== paying) throw new Error(crossNetwork(params.network, paying));
|
|
37853
37853
|
if (params.linkId) {
|
|
37854
|
+
await this.linkWhenAdded(params.linkId);
|
|
37854
37855
|
const link = this.paymentLink(params.linkId);
|
|
37855
37856
|
if (!link) throw new Error("The peer is offline");
|
|
37856
37857
|
const payee = this.links.get(params.linkId)?.stored.peerPubKeyZ32 ?? parsePayLink(params.linkId)?.member ?? "";
|
|
@@ -37951,8 +37952,8 @@ var GhostlyNode = class GhostlyNode {
|
|
|
37951
37952
|
}).catch(() => []);
|
|
37952
37953
|
}
|
|
37953
37954
|
/** `network`: the Cashu card of that network sends (its mints). `confirmedReal`: required on Mainnet. */
|
|
37954
|
-
sendPayment(params) {
|
|
37955
|
-
const live = this.
|
|
37955
|
+
async sendPayment(params) {
|
|
37956
|
+
const live = await this.linkWhenAdded(params.linkId);
|
|
37956
37957
|
if (live && this.holdingFor(live)) throw new Error("Ecash is not held for an away contact. Send a request instead, or wait until they are back.");
|
|
37957
37958
|
return this.desk.send({
|
|
37958
37959
|
...params,
|
|
@@ -37961,7 +37962,8 @@ var GhostlyNode = class GhostlyNode {
|
|
|
37961
37962
|
}
|
|
37962
37963
|
/** `network`: the card's network; the request is paid only by a wallet of that network. */
|
|
37963
37964
|
/** `card`: the Lightning card the request's invoice comes from; absent, the network's default for receiving. */
|
|
37964
|
-
requestPayment(params) {
|
|
37965
|
+
async requestPayment(params) {
|
|
37966
|
+
await this.linkWhenAdded(params.linkId);
|
|
37965
37967
|
return this.desk.request({
|
|
37966
37968
|
linkId: params.linkId,
|
|
37967
37969
|
amount: params.amount,
|
|
@@ -37973,7 +37975,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
37973
37975
|
...params.rail === "cashu" || params.rail === "lightning" ? { rail: params.rail } : {}
|
|
37974
37976
|
});
|
|
37975
37977
|
}
|
|
37976
|
-
/** A request any member of a group may pay, once (WISP
|
|
37978
|
+
/** A request any member of a group may pay, once (WISP 902 § Payments). */
|
|
37977
37979
|
requestGroupPayment(params) {
|
|
37978
37980
|
const group = this.groups.views().find((g) => g.id === params.groupId);
|
|
37979
37981
|
if (group?.status !== "active") throw new Error("You are not in this group");
|
|
@@ -37984,8 +37986,9 @@ var GhostlyNode = class GhostlyNode {
|
|
|
37984
37986
|
});
|
|
37985
37987
|
}
|
|
37986
37988
|
/** Paying on a card without a request (Ark, Bark, Spark, USDT, on-chain): the contact's app answers with one, on this card's network. */
|
|
37987
|
-
askToPay(params) {
|
|
37989
|
+
async askToPay(params) {
|
|
37988
37990
|
if (params.method !== "arkade" && params.method !== "usdt" && params.method !== "bark" && params.method !== "bitcoin" && params.method !== "fedimint" && params.method !== "spark") throw new Error("Only Ark, Bark, Spark, USDT, on-chain Bitcoin and Fedimint are paid this way");
|
|
37991
|
+
await this.linkWhenAdded(params.linkId);
|
|
37989
37992
|
return this.desk.ask({
|
|
37990
37993
|
...params,
|
|
37991
37994
|
network: this.net(params.network)
|
|
@@ -38622,9 +38625,9 @@ var GhostlyNode = class GhostlyNode {
|
|
|
38622
38625
|
}
|
|
38623
38626
|
/**
|
|
38624
38627
|
* Whether this profile holds anything a person would lose if it became a standby here: a chat, a group, an identity,
|
|
38625
|
-
* money or a payment, or a wallet with keys of its own. The wallets a new profile gets by itself (Mainnet Cashu
|
|
38626
|
-
* USDT, `walletSetup.ts`) count only once they hold, wait for or have moved
|
|
38627
|
-
* join. `loading`: what they hold is not known yet (the engine is starting, or the USDT balance was not read).
|
|
38628
|
+
* money or a payment, or a wallet with keys of its own. The wallets a new profile gets by itself (Mainnet Cashu, with
|
|
38629
|
+
* the Cashu mints' Lightning card, and USDT, `walletSetup.ts`) count only once they hold, wait for or have moved
|
|
38630
|
+
* money: otherwise no new install could join. `loading`: what they hold is not known yet (the engine is starting, or the USDT balance was not read).
|
|
38628
38631
|
*/
|
|
38629
38632
|
inUse() {
|
|
38630
38633
|
if (this.links.size > 0 || this.groups.views().length > 0 || this.identities.views().length > 0) return "in-use";
|
|
@@ -38633,7 +38636,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
38633
38636
|
const networks = [this.walletView, ...Object.values(this.walletView.networks ?? {})];
|
|
38634
38637
|
const holds = (network) => !!network && (money(network.balance) || (network.history?.length ?? 0) > 0 || (network.awaiting?.length ?? 0) > 0 || money(network.setAside) || money(network.openSwaps) || money(network.swapsAmount) || money(network.unconfirmed) || !!network.usdt?.configured && (money(network.usdt.balance) || money(network.usdt.gasBalance)));
|
|
38635
38638
|
if (networks.some(holds)) return "in-use";
|
|
38636
|
-
const firstRun = (wallet) => wallet.network === "mainnet" && (wallet.type === "cashu" || wallet.type === "usdt");
|
|
38639
|
+
const firstRun = (wallet) => wallet.network === "mainnet" && (wallet.type === "cashu" || wallet.type === "usdt" || wallet.type === "lightning" && wallet.card === "cashu");
|
|
38637
38640
|
if ((this.walletView.wallets ?? []).some((wallet) => !firstRun(wallet))) return "in-use";
|
|
38638
38641
|
return networks.some((network) => !!network?.usdt?.configured && (network.usdt.locked || !network.usdt.read)) ? "loading" : null;
|
|
38639
38642
|
}
|
|
@@ -38890,6 +38893,15 @@ var GhostlyNode = class GhostlyNode {
|
|
|
38890
38893
|
async existingLink(id) {
|
|
38891
38894
|
return await this.linksAdding.get(id) ?? id;
|
|
38892
38895
|
}
|
|
38896
|
+
/**
|
|
38897
|
+
* The chat by its id, once it has started if it is still being added: the app may send to it by that id (a message,
|
|
38898
|
+
* a file, a forward, a payment) right after a reload, and that send waits for the chat rather than say "You are
|
|
38899
|
+
* offline" for that moment. A chat not being added is returned at once, offline or not; one whose adding failed is gone.
|
|
38900
|
+
*/
|
|
38901
|
+
async linkWhenAdded(linkId) {
|
|
38902
|
+
await this.linksAdding.get(linkId)?.catch(() => {});
|
|
38903
|
+
return this.links.get(linkId);
|
|
38904
|
+
}
|
|
38893
38905
|
addLink(params, inviteCode) {
|
|
38894
38906
|
const id = identityFromSeedB64(params.seedB64).pubKeyZ32.slice(0, 16);
|
|
38895
38907
|
const adding = this.addLinkNow(params, inviteCode).finally(() => {
|
|
@@ -39256,7 +39268,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
39256
39268
|
if (native) this.ensureNativeEndpoints(linkId);
|
|
39257
39269
|
}
|
|
39258
39270
|
/**
|
|
39259
|
-
* Whether a group's link (an edge, an entry session) runs native endpoints (WISP
|
|
39271
|
+
* Whether a group's link (an edge, an entry session) runs native endpoints (WISP 902 § Transports): where this app has
|
|
39260
39272
|
* no WebRTC (the Linux Desktop), and where the member's has none, as its packet said. Between two apps that have
|
|
39261
39273
|
* WebRTC it runs none, as before: a group of eight would otherwise hold seven listeners per transport for nothing.
|
|
39262
39274
|
*/
|
|
@@ -39269,7 +39281,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
39269
39281
|
* (`DirectEvidence`): a network that lets no direct connection through (a VPN, a firewall, on either side). WebRTC is
|
|
39270
39282
|
* all an edge between two apps that have it runs, and there is no TURN server unless someone set one, so the edge
|
|
39271
39283
|
* never went live, and the member stayed unreachable for as long as that network lasted. The edge starts again as on an
|
|
39272
|
-
* app with no WebRTC (WISP
|
|
39284
|
+
* app with no WebRTC (WISP 902 § Transports): it runs its native endpoints and says so in its packet (`_tr`, with no
|
|
39273
39285
|
* `webrtc/1`), the member's app starts its own for it as it does for a Linux Desktop, and the two meet over Iroh
|
|
39274
39286
|
* through its relay. For this run of the app only.
|
|
39275
39287
|
*/
|
|
@@ -39772,7 +39784,7 @@ var GhostlyNode = class GhostlyNode {
|
|
|
39772
39784
|
get nativeFactories() {
|
|
39773
39785
|
const relay = this.relaysHyperdht ? this.hyperdhtRelay : "";
|
|
39774
39786
|
return {
|
|
39775
|
-
...relay ? { "hyperdht/1": async (seedB64) => (await import("./hyperdhtRelay-
|
|
39787
|
+
...relay ? { "hyperdht/1": async (seedB64) => (await import("./hyperdhtRelay-CHMS7_KO.js")).createRelayedHyperEndpoint(seedB64, relay) } : {},
|
|
39776
39788
|
...this.options.nativeTransports,
|
|
39777
39789
|
...this.ownIrohRelays ? { "iroh/1": (seedB64) => this.options.nativeTransports["iroh/1"](seedB64, this.settings.irohRelays?.length ? { relays: [...this.settings.irohRelays] } : {}) } : {},
|
|
39778
39790
|
...this.options.irohWeb ? { "iroh/1": (seedB64) => createIrohWebEndpoint(seedB64, { relays: this.irohRelays }) } : {}
|
|
@@ -40493,4 +40505,4 @@ function signalKind(signal) {
|
|
|
40493
40505
|
//#endregion
|
|
40494
40506
|
export { EngineServer, hyperdhtRelayProblem as n, server_exports as t };
|
|
40495
40507
|
|
|
40496
|
-
//# sourceMappingURL=server-
|
|
40508
|
+
//# sourceMappingURL=server-9AM0ta6q.js.map
|