diff --git a/relay.go b/relay.go index 6249607..61e2477 100644 --- a/relay.go +++ b/relay.go @@ -300,6 +300,10 @@ func (r *Relay) Connect(ctx context.Context) error { if subscription, ok := r.Subscriptions.Load(string(*env)); ok { subscription.dispatchEose() } + case *ClosedEnvelope: + if subscription, ok := r.Subscriptions.Load(string(env.SubscriptionID)); ok { + subscription.dispatchClosed(env.Reason) + } case *CountEnvelope: if subscription, ok := r.Subscriptions.Load(string(env.SubscriptionID)); ok && env.Count != nil && subscription.countResult != nil { subscription.countResult <- *env.Count @@ -478,6 +482,7 @@ func (r *Relay) PrepareSubscription(ctx context.Context, filters Filters, opts . counter: int(current), Events: make(chan *Event), EndOfStoredEvents: make(chan struct{}), + ClosedReason: make(chan string, 1), Filters: filters, } diff --git a/subscription.go b/subscription.go index 9b25814..930bec9 100644 --- a/subscription.go +++ b/subscription.go @@ -26,11 +26,15 @@ type Subscription struct { // the EndOfStoredEvents channel gets closed when an EOSE comes for that subscription EndOfStoredEvents chan struct{} + // the ClosedReason channel emits the reason when a CLOSED message is received + ClosedReason chan string + // Context will be .Done() when the subscription ends Context context.Context live atomic.Bool eosed atomic.Bool + closed atomic.Bool cancel context.CancelFunc // this keeps track of the events we've received before the EOSE that we must dispatch before @@ -107,6 +111,13 @@ func (sub *Subscription) dispatchEose() { } } +func (sub *Subscription) dispatchClosed(reason string) { + if sub.closed.CompareAndSwap(false, true) { + sub.ClosedReason <- reason + close(sub.ClosedReason) + } +} + // Unsub closes the subscription, sending "CLOSE" to relay as in NIP-01. // Unsub() also closes the channel sub.Events and makes a new one. func (sub *Subscription) Unsub() { diff --git a/subscription_test.go b/subscription_test.go index fa0e80c..0114039 100644 --- a/subscription_test.go +++ b/subscription_test.go @@ -8,7 +8,7 @@ import ( "time" ) -const RELAY = "wss://nostr.mom" +const RELAY = "wss://relay.nostr.bg" // test if we can fetch a couple of random events func TestSubscribe(t *testing.T) {