mirror of
https://github.com/nbd-wtf/go-nostr.git
synced 2025-09-18 11:32:25 +02:00
change relaypool and subscription such that a Relay can have an independent existence.
This commit is contained in:
@@ -1,18 +1,11 @@
|
||||
package nostr
|
||||
|
||||
import (
|
||||
s "github.com/SaveTheRbtz/generic-sync-map-go"
|
||||
)
|
||||
|
||||
type Subscription struct {
|
||||
channel string
|
||||
relays s.MapOf[string, *Connection]
|
||||
id string
|
||||
conn *Connection
|
||||
|
||||
filters Filters
|
||||
Events chan EventMessage
|
||||
|
||||
started bool
|
||||
UniqueEvents chan Event
|
||||
Events chan Event
|
||||
|
||||
stopped bool
|
||||
}
|
||||
@@ -22,78 +15,22 @@ type EventMessage struct {
|
||||
Relay string
|
||||
}
|
||||
|
||||
func (subscription Subscription) Unsub() {
|
||||
subscription.relays.Range(func(_ string, conn *Connection) bool {
|
||||
conn.WriteJSON([]interface{}{
|
||||
"CLOSE",
|
||||
subscription.channel,
|
||||
})
|
||||
return true
|
||||
})
|
||||
func (sub Subscription) Unsub() {
|
||||
sub.conn.WriteJSON([]interface{}{"CLOSE", sub.id})
|
||||
|
||||
subscription.stopped = true
|
||||
if subscription.Events != nil {
|
||||
close(subscription.Events)
|
||||
}
|
||||
if subscription.UniqueEvents != nil {
|
||||
close(subscription.UniqueEvents)
|
||||
sub.stopped = true
|
||||
if sub.Events != nil {
|
||||
close(sub.Events)
|
||||
}
|
||||
}
|
||||
|
||||
func (subscription *Subscription) Sub(filters Filters) {
|
||||
subscription.filters = filters
|
||||
func (sub *Subscription) Sub(filters Filters) {
|
||||
sub.filters = filters
|
||||
|
||||
subscription.relays.Range(func(_ string, conn *Connection) bool {
|
||||
message := []interface{}{
|
||||
"REQ",
|
||||
subscription.channel,
|
||||
}
|
||||
for _, filter := range subscription.filters {
|
||||
message = append(message, filter)
|
||||
}
|
||||
|
||||
conn.WriteJSON(message)
|
||||
return true
|
||||
})
|
||||
|
||||
if !subscription.started {
|
||||
go subscription.startHandlingUnique()
|
||||
}
|
||||
}
|
||||
|
||||
func (subscription Subscription) startHandlingUnique() {
|
||||
seen := make(map[string]struct{})
|
||||
for em := range subscription.Events {
|
||||
if _, ok := seen[em.Event.ID]; ok {
|
||||
continue
|
||||
}
|
||||
seen[em.Event.ID] = struct{}{}
|
||||
if !subscription.stopped {
|
||||
subscription.UniqueEvents <- em.Event
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (subscription Subscription) removeRelay(relay string) {
|
||||
if conn, ok := subscription.relays.Load(relay); ok {
|
||||
subscription.relays.Delete(relay)
|
||||
conn.WriteJSON([]interface{}{
|
||||
"CLOSE",
|
||||
subscription.channel,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (subscription Subscription) addRelay(relay string, conn *Connection) {
|
||||
subscription.relays.Store(relay, conn)
|
||||
|
||||
message := []interface{}{
|
||||
"REQ",
|
||||
subscription.channel,
|
||||
}
|
||||
for _, filter := range subscription.filters {
|
||||
message := []interface{}{"REQ", sub.id}
|
||||
for _, filter := range sub.filters {
|
||||
message = append(message, filter)
|
||||
}
|
||||
|
||||
conn.WriteJSON(message)
|
||||
sub.conn.WriteJSON(message)
|
||||
}
|
||||
|
Reference in New Issue
Block a user