mirror of
https://github.com/nbd-wtf/go-nostr.git
synced 2025-06-29 02:01:02 +02:00
fix unique logic (move it to a helper function, we can't return two channels because that will break if the caller doesn't read from both.)
This commit is contained in:
38
relaypool.go
38
relaypool.go
@ -60,14 +60,18 @@ func NewRelayPool() *RelayPool {
|
|||||||
|
|
||||||
// Add adds a new relay to the pool, if policy is nil, it will be a simple
|
// Add adds a new relay to the pool, if policy is nil, it will be a simple
|
||||||
// read+write policy.
|
// read+write policy.
|
||||||
func (r *RelayPool) Add(url string, policy RelayPoolPolicy) error {
|
func (r *RelayPool) Add(url string, policy RelayPoolPolicy) chan error {
|
||||||
if policy == nil {
|
if policy == nil {
|
||||||
policy = SimplePolicy{Read: true, Write: true}
|
policy = SimplePolicy{Read: true, Write: true}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cherr := make(chan error)
|
||||||
|
|
||||||
|
go func() {
|
||||||
relay, err := RelayConnect(url)
|
relay, err := RelayConnect(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
cherr <- fmt.Errorf("failed to connect to %s: %w", url, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Policies.Store(relay.URL, policy)
|
r.Policies.Store(relay.URL, policy)
|
||||||
@ -86,7 +90,11 @@ func (r *RelayPool) Add(url string, policy RelayPoolPolicy) error {
|
|||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
|
||||||
return nil
|
cherr <- nil
|
||||||
|
close(cherr)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return cherr
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove removes a relay from the pool.
|
// Remove removes a relay from the pool.
|
||||||
@ -101,7 +109,7 @@ func (r *RelayPool) Remove(url string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RelayPool) Sub(filters Filters) (string, chan EventMessage, chan Event) {
|
func (r *RelayPool) Sub(filters Filters) (string, chan EventMessage) {
|
||||||
random := make([]byte, 7)
|
random := make([]byte, 7)
|
||||||
rand.Read(random)
|
rand.Read(random)
|
||||||
id := hex.EncodeToString(random)
|
id := hex.EncodeToString(random)
|
||||||
@ -109,8 +117,6 @@ func (r *RelayPool) Sub(filters Filters) (string, chan EventMessage, chan Event)
|
|||||||
r.subscriptions.Store(id, filters)
|
r.subscriptions.Store(id, filters)
|
||||||
eventStream := make(chan EventMessage)
|
eventStream := make(chan EventMessage)
|
||||||
r.eventStreams.Store(id, eventStream)
|
r.eventStreams.Store(id, eventStream)
|
||||||
uniqueEvents := make(chan Event)
|
|
||||||
emittedAlready := s.MapOf[string, struct{}]{}
|
|
||||||
|
|
||||||
r.Relays.Range(func(_ string, relay *Relay) bool {
|
r.Relays.Range(func(_ string, relay *Relay) bool {
|
||||||
sub := relay.subscribe(id, filters)
|
sub := relay.subscribe(id, filters)
|
||||||
@ -118,16 +124,28 @@ func (r *RelayPool) Sub(filters Filters) (string, chan EventMessage, chan Event)
|
|||||||
go func(sub *Subscription) {
|
go func(sub *Subscription) {
|
||||||
for evt := range sub.Events {
|
for evt := range sub.Events {
|
||||||
eventStream <- EventMessage{Relay: relay.URL, Event: evt}
|
eventStream <- EventMessage{Relay: relay.URL, Event: evt}
|
||||||
if _, ok := emittedAlready.LoadOrStore(evt.ID, struct{}{}); !ok {
|
|
||||||
uniqueEvents <- evt
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}(sub)
|
}(sub)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
|
||||||
return id, eventStream, uniqueEvents
|
return id, eventStream
|
||||||
|
}
|
||||||
|
|
||||||
|
func Unique(all chan EventMessage) chan Event {
|
||||||
|
uniqueEvents := make(chan Event)
|
||||||
|
emittedAlready := s.MapOf[string, struct{}]{}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for eventMessage := range all {
|
||||||
|
if _, ok := emittedAlready.LoadOrStore(eventMessage.Event.ID, struct{}{}); !ok {
|
||||||
|
uniqueEvents <- eventMessage.Event
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return uniqueEvents
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RelayPool) PublishEvent(evt *Event) (*Event, chan PublishStatus, error) {
|
func (r *RelayPool) PublishEvent(evt *Event) (*Event, chan PublishStatus, error) {
|
||||||
|
Reference in New Issue
Block a user