do not notify listeners when a duplicated event is received.

This commit is contained in:
fiatjaf
2024-04-26 14:56:50 -03:00
parent 8b1a7f2195
commit 848e76c664
2 changed files with 14 additions and 11 deletions

View File

@@ -10,17 +10,17 @@ import (
)
// AddEvent sends an event through then normal add pipeline, as if it was received from a websocket.
func (rl *Relay) AddEvent(ctx context.Context, evt *nostr.Event) error {
func (rl *Relay) AddEvent(ctx context.Context, evt *nostr.Event) (skipBroadcast bool, writeError error) {
if evt == nil {
return errors.New("error: event is nil")
return false, errors.New("error: event is nil")
}
for _, reject := range rl.RejectEvent {
if reject, msg := reject(ctx, evt); reject {
if msg == "" {
return errors.New("blocked: no reason")
return false, errors.New("blocked: no reason")
} else {
return errors.New(nostr.NormalizeOKMessage(msg, "blocked"))
return false, errors.New(nostr.NormalizeOKMessage(msg, "blocked"))
}
}
}
@@ -42,7 +42,7 @@ func (rl *Relay) AddEvent(ctx context.Context, evt *nostr.Event) error {
}
for range ch {
// if we run this it means we already have this event, so we just return a success and exit
return nil
return true, nil
}
}
@@ -67,7 +67,7 @@ func (rl *Relay) AddEvent(ctx context.Context, evt *nostr.Event) error {
// parameterized replaceable event, delete before storing
d := evt.Tags.GetFirst([]string{"d", ""})
if d == nil {
return fmt.Errorf("invalid: missing 'd' tag on parameterized replaceable event")
return false, fmt.Errorf("invalid: missing 'd' tag on parameterized replaceable event")
}
filter := nostr.Filter{Authors: []string{evt.PubKey}, Kinds: []int{evt.Kind}, Tags: nostr.TagMap{"d": []string{(*d)[1]}}}
@@ -91,9 +91,9 @@ func (rl *Relay) AddEvent(ctx context.Context, evt *nostr.Event) error {
if saveErr := store(ctx, evt); saveErr != nil {
switch saveErr {
case eventstore.ErrDupEvent:
return nil
return true, nil
default:
return fmt.Errorf(nostr.NormalizeOKMessage(saveErr.Error(), "error"))
return false, fmt.Errorf(nostr.NormalizeOKMessage(saveErr.Error(), "error"))
}
}
}
@@ -103,5 +103,5 @@ func (rl *Relay) AddEvent(ctx context.Context, evt *nostr.Event) error {
}
}
return nil
return false, nil
}

View File

@@ -161,12 +161,13 @@ func (rl *Relay) HandleWebsocket(w http.ResponseWriter, r *http.Request) {
var ok bool
var writeErr error
var skipBroadcast bool
if env.Event.Kind == 5 {
// this always returns "blocked: " whenever it returns an error
writeErr = rl.handleDeleteRequest(ctx, &env.Event)
} else {
// this will also always return a prefixed reason
writeErr = rl.AddEvent(ctx, &env.Event)
skipBroadcast, writeErr = rl.AddEvent(ctx, &env.Event)
}
var reason string
@@ -175,7 +176,9 @@ func (rl *Relay) HandleWebsocket(w http.ResponseWriter, r *http.Request) {
for _, ovw := range rl.OverwriteResponseEvent {
ovw(ctx, &env.Event)
}
notifyListeners(&env.Event)
if !skipBroadcast {
notifyListeners(&env.Event)
}
} else {
reason = writeErr.Error()
if strings.HasPrefix(reason, "auth-required:") {