From e11e32e3e2e772bcb9b17d8b12c91242f629dbf8 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Tue, 19 May 2026 20:46:14 -0300 Subject: [PATCH] khatru: handle request synchronously until EOSE, no need for waitgroups. --- khatru/handlers.go | 11 ++--------- khatru/responding.go | 5 +---- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/khatru/handlers.go b/khatru/handlers.go index fe8aa3b..a27fa26 100644 --- a/khatru/handlers.go +++ b/khatru/handlers.go @@ -295,9 +295,6 @@ func (rl *Relay) HandleWebsocket(w http.ResponseWriter, r *http.Request) { case *nostr.ReqEnvelope: rl.removeListenerId(ws, env.SubscriptionID) - eose := sync.WaitGroup{} - eose.Add(len(env.Filters)) - // a context just for the "stored events" request handler reqCtx, cancelReqCtx := context.WithCancelCause(ctx) @@ -306,7 +303,7 @@ func (rl *Relay) HandleWebsocket(w http.ResponseWriter, r *http.Request) { // handle each filter separately -- dispatching events as they're loaded from databases for _, filter := range env.Filters { - err := rl.handleRequest(reqCtx, env.SubscriptionID, &eose, ws, filter) + err := rl.handleRequest(reqCtx, env.SubscriptionID, ws, filter) if err != nil { // fail everything if any filter is rejected reason := err.Error() @@ -324,11 +321,7 @@ func (rl *Relay) HandleWebsocket(w http.ResponseWriter, r *http.Request) { } } - go func() { - // when all events have been loaded from databases and dispatched we can fire the EOSE message - eose.Wait() - ws.WriteJSON(nostr.EOSEEnvelope(env.SubscriptionID)) - }() + ws.WriteJSON(nostr.EOSEEnvelope(env.SubscriptionID)) case *nostr.CloseEnvelope: id := string(*env) rl.removeListenerId(ws, id) diff --git a/khatru/responding.go b/khatru/responding.go index 7ef05fd..7eaa73b 100644 --- a/khatru/responding.go +++ b/khatru/responding.go @@ -3,15 +3,12 @@ package khatru import ( "context" "errors" - "sync" "fiatjaf.com/nostr" "fiatjaf.com/nostr/nip45/hyperloglog" ) -func (rl *Relay) handleRequest(ctx context.Context, id string, eose *sync.WaitGroup, ws *WebSocket, filter nostr.Filter) error { - defer eose.Done() - +func (rl *Relay) handleRequest(ctx context.Context, id string, ws *WebSocket, filter nostr.Filter) error { // then check if we'll reject this filter (we apply this after overwriting // because we may, for example, remove some things from the incoming filters // that we know we don't support, and then if the end result is an empty