diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientCountExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientCountExt.kt index b1ea3d05d..15dd206ff 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientCountExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientCountExt.kt @@ -65,15 +65,18 @@ suspend fun INostrClient.queryCountSuspend( subscribe(listener) - queryCount(subId = subId, filters = mapOf(relay to listOf(filter))) - val result = - withTimeoutOrNull(timeoutMs) { - resultChannel.receive() + try { + queryCount(subId = subId, filters = mapOf(relay to listOf(filter))) + + withTimeoutOrNull(timeoutMs) { + resultChannel.receive() + } + } finally { + close(subId) + unsubscribe(listener) } - close(subId) - unsubscribe(listener) resultChannel.close() return result diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSendAndWaitExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSendAndWaitExt.kt index 4af4749ea..9815f8d42 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSendAndWaitExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSendAndWaitExt.kt @@ -98,38 +98,41 @@ suspend fun INostrClient.sendAndWaitForResponseDetailed( } } - subscribe(subscription) + val receivedResults = + try { + subscribe(subscription) - // subscribe before sending the result. - val resultSubscription = - coroutineScope { - val result = - async { - val receivedResults = mutableMapOf() - // The withTimeout block will cancel the coroutine if the loop takes too long - withTimeoutOrNull(timeoutInSeconds * 1000) { - while (receivedResults.size < relayList.size) { - val result = resultChannel.receive() + // subscribe before sending the result. + val resultSubscription = + coroutineScope { + val result = + async { + val receivedResults = mutableMapOf() + // The withTimeout block will cancel the coroutine if the loop takes too long + withTimeoutOrNull(timeoutInSeconds * 1000) { + while (receivedResults.size < relayList.size) { + val result = resultChannel.receive() - val currentResult = receivedResults[result.relay] - // do not override a successful result. - if (currentResult == null || !currentResult) { - receivedResults[result.relay] = result.success + val currentResult = receivedResults[result.relay] + // do not override a successful result. + if (currentResult == null || !currentResult) { + receivedResults[result.relay] = result.success + } + } } + receivedResults } - } - receivedResults + + send(event, relayList) + + result } - send(event, relayList) - - result + resultSubscription.await() + } finally { + unsubscribe(subscription) } - val receivedResults = resultSubscription.await() - - unsubscribe(subscription) - // Clean up the channel resultChannel.close() diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSingleDownloadExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSingleDownloadExt.kt index b797ab647..68ee0f621 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSingleDownloadExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSingleDownloadExt.kt @@ -104,14 +104,16 @@ suspend fun INostrClient.downloadFirstEvent( } } - openReqSubscription(subscriptionId, filters, listener) - val result = - withTimeoutOrNull(30000) { - resultChannel.receive() - } + try { + openReqSubscription(subscriptionId, filters, listener) - close(subscriptionId) + withTimeoutOrNull(30000) { + resultChannel.receive() + } + } finally { + close(subscriptionId) + } resultChannel.close()