Wait for relay OK ack before marking SENT

- Quartz: expose pendingPublishRelaysFor(eventId) on INostrClient
- Worker: after publish(), poll pendingPublishRelaysFor every 500ms up
to OK_TIMEOUT_SEC=30s
- notify user when a scheduled post fires or fails
This commit is contained in:
davotoula
2026-05-07 16:20:10 +02:00
parent 28defaf96e
commit f6991bee15
10 changed files with 219 additions and 2 deletions
@@ -72,6 +72,13 @@ interface INostrClient : AutoCloseable {
relayList: Set<NormalizedRelayUrl>,
)
/**
* Returns the relays that have not yet acknowledged [eventId] with an OK,
* or null if the event is not tracked (never published, or already fully done).
* Use to poll for delivery confirmation after [publish].
*/
fun pendingPublishRelaysFor(eventId: HexKey): Set<NormalizedRelayUrl>?
fun addConnectionListener(listener: RelayConnectionListener)
fun removeConnectionListener(listener: RelayConnectionListener)
@@ -123,6 +130,8 @@ class EmptyNostrClient : INostrClient {
relayList: Set<NormalizedRelayUrl>,
) { }
override fun pendingPublishRelaysFor(eventId: HexKey): Set<NormalizedRelayUrl>? = null
override fun addConnectionListener(listener: RelayConnectionListener) {}
override fun removeConnectionListener(listener: RelayConnectionListener) {}
@@ -358,6 +358,8 @@ class NostrClient(
override fun activeOutboxCache(url: NormalizedRelayUrl): Set<HexKey> = eventOutbox.activeOutboxCacheFor(url)
override fun pendingPublishRelaysFor(eventId: HexKey): Set<NormalizedRelayUrl>? = eventOutbox.pendingRelaysFor(eventId)
override fun getReqFiltersOrNull(subId: String): Map<NormalizedRelayUrl, List<Filter>>? = activeRequests.getSubscriptionFiltersOrNull(subId)
override fun getCountFiltersOrNull(subId: String): Map<NormalizedRelayUrl, List<Filter>>? = activeCounts.getSubscriptionFiltersOrNull(subId)
@@ -90,6 +90,14 @@ class PoolEventOutbox {
return myEvents
}
/**
* Returns the relays that have NOT yet acknowledged [eventId] with an OK, or
* null if the event is not currently tracked (never sent or already fully done).
* Callers can poll this after publish to detect when relays ack: the set shrinks
* as OKs arrive, then the entry is removed from the outbox (returns null).
*/
fun pendingRelaysFor(eventId: HexKey): Set<NormalizedRelayUrl>? = eventOutbox[eventId]?.relaysLeft()
fun markAsSending(
event: Event,
relays: Set<NormalizedRelayUrl>,