Files
nostrlib/khatru/responding.go
2025-11-04 21:19:56 -03:00

85 lines
2.0 KiB
Go

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()
// 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
// filter we can just reject it)
if nil != rl.OnRequest {
if reject, msg := rl.OnRequest(ctx, filter); reject {
return errors.New(nostr.NormalizeOKMessage(msg, "blocked"))
}
}
if filter.LimitZero {
// don't do any queries, just subscribe to future events
return nil
}
// run the function to query events
if nil != rl.QueryStored {
for event := range rl.QueryStored(ctx, filter) {
ws.WriteJSON(nostr.EventEnvelope{SubscriptionID: &id, Event: event})
}
}
return nil
}
func (rl *Relay) handleCountRequest(ctx context.Context, ws *WebSocket, filter nostr.Filter) uint32 {
// check if we'll reject this filter
if nil != rl.OnCount {
if rejecting, msg := rl.OnCount(ctx, filter); rejecting {
ws.WriteJSON(nostr.NoticeEnvelope(msg))
return 0
}
}
// run the functions to count (generally it will be just one)
if nil != rl.Count {
res, err := rl.Count(ctx, filter)
if err != nil {
ws.WriteJSON(nostr.NoticeEnvelope(err.Error()))
}
return res
}
return 0
}
func (rl *Relay) handleCountRequestWithHLL(
ctx context.Context,
ws *WebSocket,
filter nostr.Filter,
offset int,
) (uint32, *hyperloglog.HyperLogLog) {
// check if we'll reject this filter
if nil != rl.OnCount {
if rejecting, msg := rl.OnCount(ctx, filter); rejecting {
ws.WriteJSON(nostr.NoticeEnvelope(msg))
return 0, nil
}
}
if nil != rl.CountHLL {
res, hll, err := rl.CountHLL(ctx, filter, offset)
if err != nil {
ws.WriteJSON(nostr.NoticeEnvelope(err.Error()))
}
return res, hll
}
return 0, nil
}