diff --git a/README.md b/README.md index 437b2f3..08c5c4f 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ for notice := range pool.Notices { ### Listening for events ```go -subId, events := pool.Sub(nostr.Filters{ +subId, events, unsub := pool.Sub(nostr.Filters{ { Authors: []string{"0ded86bf80c76847320b16f22b7451c08169434837a51ad5fe3b178af6c35f5d"}, Kinds: []int{nostr.KindTextNote}, // or {1} @@ -38,7 +38,7 @@ go func() { }() time.Sleep(5 * time.Second) -sub.Unsub() +close(unsub) ``` ### Publishing an event @@ -84,4 +84,4 @@ fmt.Println("pk:", nostr.GetPublicKey(sk)) ``` go run example/example.go -``` +``` \ No newline at end of file diff --git a/relaypool.go b/relaypool.go index ddf557c..57033e5 100644 --- a/relaypool.go +++ b/relaypool.go @@ -124,7 +124,7 @@ func (r *RelayPool) Remove(url string) { } } -func (r *RelayPool) Sub(filters Filters) (string, chan EventMessage) { +func (r *RelayPool) Sub(filters Filters) (string, chan EventMessage, chan struct{}) { random := make([]byte, 7) rand.Read(random) id := hex.EncodeToString(random) @@ -132,6 +132,7 @@ func (r *RelayPool) Sub(filters Filters) (string, chan EventMessage) { r.subscriptions.Store(id, filters) eventStream := make(chan EventMessage) r.eventStreams.Store(id, eventStream) + unsub := make(chan struct{}) r.Relays.Range(func(_ string, relay *Relay) bool { sub := relay.prepareSubscription(id) @@ -143,10 +144,17 @@ func (r *RelayPool) Sub(filters Filters) (string, chan EventMessage) { } }(sub) + go func() { + select { + case <-unsub: + sub.Unsub() + } + }() + return true }) - return id, eventStream + return id, eventStream, unsub } func Unique(all chan EventMessage) chan Event {