prevent relay queriers that exit before EOSE from locking the QueryEvents() function forever.

This commit is contained in:
fiatjaf
2024-02-21 08:41:20 -03:00
parent a86745ec5f
commit 45c69ddf7f
8 changed files with 44 additions and 10 deletions

View File

@@ -127,7 +127,11 @@ func (b BadgerBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (ch
for {
// emit latest event in queue
latest := emitQueue[0]
ch <- latest.Event
select {
case ch <- latest.Event:
case <-ctx.Done():
return
}
// stop when reaching limit
emittedEvents++

View File

@@ -114,7 +114,11 @@ func (b *BoltBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (cha
for {
// emit latest event in queue
latest := emitQueue[0]
ch <- latest.Event
select {
case ch <- latest.Event:
case <-ctx.Done():
return
}
// stop when reaching limit
emittedEvents++

View File

@@ -123,9 +123,15 @@ func (ess *ElasticsearchStorage) QueryEvents(ctx context.Context, filter nostr.F
// optimization: get by id
if isGetByID(filter) {
if evts, err := ess.getByID(filter); err == nil {
go func() {
for _, evt := range evts {
ch <- evt
select {
case ch <- evt:
case <-ctx.Done():
return
}
}
}()
close(ch)
} else {
return nil, fmt.Errorf("error getting by id: %w", err)

View File

@@ -146,7 +146,11 @@ func (b *LMDBBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (cha
for {
// emit latest event in queue
latest := emitQueue[0]
ch <- latest.Event
select {
case ch <- latest.Event:
case <-ctx.Done():
return
}
// stop when reaching limit
emittedEvents++

View File

@@ -37,7 +37,11 @@ func (b MySQLBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (ch
return
}
evt.CreatedAt = nostr.Timestamp(timestamp)
ch <- &evt
select {
case ch <- &evt:
case <-ctx.Done():
return
}
}
}()

View File

@@ -34,7 +34,11 @@ func (b PostgresBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (
return
}
evt.CreatedAt = nostr.Timestamp(timestamp)
ch <- &evt
select {
case ch <- &evt:
case <-ctx.Done():
return
}
}
}()

View File

@@ -55,7 +55,11 @@ func (b *SliceStore) QueryEvents(ctx context.Context, filter nostr.Filter) (chan
break
}
if filter.Matches(event) {
ch <- event
select {
case ch <- event:
case <-ctx.Done():
return
}
count++
}
}

View File

@@ -34,7 +34,11 @@ func (b SQLite3Backend) QueryEvents(ctx context.Context, filter nostr.Filter) (c
return
}
evt.CreatedAt = nostr.Timestamp(timestamp)
ch <- &evt
select {
case ch <- &evt:
case <-ctx.Done():
return
}
}
}()