89 lines
2.3 KiB
Go
89 lines
2.3 KiB
Go
package khatru
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sync"
|
|
|
|
"github.com/nbd-wtf/go-nostr"
|
|
)
|
|
|
|
func (rl *Relay) handleRequest(ctx context.Context, id string, eose *sync.WaitGroup, ws *WebSocket, filter nostr.Filter) error {
|
|
defer eose.Done()
|
|
|
|
// overwrite the filter (for example, to eliminate some kinds or
|
|
// that we know we don't support)
|
|
for _, ovw := range rl.OverwriteFilter {
|
|
ovw(ctx, &filter)
|
|
}
|
|
|
|
if filter.LimitZero {
|
|
// don't do any queries, just subscribe to future events
|
|
return nil
|
|
}
|
|
|
|
// 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)
|
|
for _, reject := range rl.RejectFilter {
|
|
if reject, msg := reject(ctx, filter); reject {
|
|
return errors.New(nostr.NormalizeOKMessage(msg, "blocked"))
|
|
}
|
|
}
|
|
|
|
// run the functions to query events (generally just one,
|
|
// but we might be fetching stuff from multiple places)
|
|
eose.Add(len(rl.QueryEvents))
|
|
for _, query := range rl.QueryEvents {
|
|
ch, err := query(ctx, filter)
|
|
if err != nil {
|
|
ws.WriteJSON(nostr.NoticeEnvelope(err.Error()))
|
|
eose.Done()
|
|
continue
|
|
} else if ch == nil {
|
|
eose.Done()
|
|
continue
|
|
}
|
|
|
|
go func(ch chan *nostr.Event) {
|
|
for event := range ch {
|
|
for _, ovw := range rl.OverwriteResponseEvent {
|
|
ovw(ctx, event)
|
|
}
|
|
ws.WriteJSON(nostr.EventEnvelope{SubscriptionID: &id, Event: *event})
|
|
}
|
|
eose.Done()
|
|
}(ch)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (rl *Relay) handleCountRequest(ctx context.Context, ws *WebSocket, filter nostr.Filter) int64 {
|
|
// overwrite the filter (for example, to eliminate some kinds or tags that we know we don't support)
|
|
for _, ovw := range rl.OverwriteCountFilter {
|
|
ovw(ctx, &filter)
|
|
}
|
|
|
|
// then check if we'll reject this filter
|
|
for _, reject := range rl.RejectCountFilter {
|
|
if rejecting, msg := reject(ctx, filter); rejecting {
|
|
ws.WriteJSON(nostr.NoticeEnvelope(msg))
|
|
return 0
|
|
}
|
|
}
|
|
|
|
// run the functions to count (generally it will be just one)
|
|
var subtotal int64 = 0
|
|
for _, count := range rl.CountEvents {
|
|
res, err := count(ctx, filter)
|
|
if err != nil {
|
|
ws.WriteJSON(nostr.NoticeEnvelope(err.Error()))
|
|
}
|
|
subtotal += res
|
|
}
|
|
|
|
return subtotal
|
|
}
|