diff --git a/adding.go b/adding.go index 3509495..aa232fd 100644 --- a/adding.go +++ b/adding.go @@ -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 } diff --git a/handlers.go b/handlers.go index d0ceef8..3659033 100644 --- a/handlers.go +++ b/handlers.go @@ -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:") {