From 172e7890b98875999b66c218fc109a533d19dc7d Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 28 Mar 2026 10:47:25 -0300 Subject: [PATCH] khatru: use a channelmutex so we can fail to lock on addListener() if there's a disconnect. --- go.mod | 1 + go.sum | 2 ++ khatru/listener.go | 8 ++++++-- khatru/relay.go | 8 +++++--- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 95864b5..4baecdc 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( ) require ( + fiatjaf.com/lib v0.3.6 github.com/dgraph-io/ristretto/v2 v2.3.0 github.com/go-git/go-git/v5 v5.16.3 github.com/sivukhin/godjot v1.0.6 diff --git a/go.sum b/go.sum index b4ececd..788c24b 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +fiatjaf.com/lib v0.3.6 h1:GRZNSxHI2EWdjSKVuzaT+c0aifLDtS16SzkeJaHyJfY= +fiatjaf.com/lib v0.3.6/go.mod h1:UlHaZvPHj25PtKLh9GjZkUHRmQ2xZ8Jkoa4VRaLeeQ8= github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= diff --git a/khatru/listener.go b/khatru/listener.go index 579abbc..7a35ce1 100644 --- a/khatru/listener.go +++ b/khatru/listener.go @@ -40,8 +40,12 @@ func (rl *Relay) addListener( filter nostr.Filter, cancel context.CancelCauseFunc, ) { - rl.clientsMutex.Lock() - defer rl.clientsMutex.Unlock() + select { + case <-rl.clientsMutex.C(): + defer rl.clientsMutex.Unlock() + case <-ws.Context.Done(): + return + } if specs, ok := rl.clients[ws]; ok /* this will always be true unless client has disconnected very rapidly */ { idx := len(subrelay.listeners) diff --git a/khatru/relay.go b/khatru/relay.go index f395501..0cc150e 100644 --- a/khatru/relay.go +++ b/khatru/relay.go @@ -8,9 +8,9 @@ import ( "os" "strconv" "strings" - "sync" "time" + "fiatjaf.com/lib/channelmutex" "fiatjaf.com/nostr" "fiatjaf.com/nostr/eventstore" "fiatjaf.com/nostr/nip11" @@ -39,7 +39,9 @@ func NewRelay() *Relay { CheckOrigin: func(r *http.Request) bool { return true }, }, - clients: make(map[*WebSocket][]listenerSpec, 100), + clients: make(map[*WebSocket][]listenerSpec, 100), + clientsMutex: channelmutex.New(), + listeners: make([]listener, 0, 100), serveMux: &http.ServeMux{}, @@ -107,7 +109,7 @@ type Relay struct { // also used for keeping track of who is listening to what clients map[*WebSocket][]listenerSpec listeners []listener - clientsMutex sync.Mutex + clientsMutex *channelmutex.Mutex // set this to true to support negentropy Negentropy bool