it never ends.
This commit is contained in:
@@ -1,34 +0,0 @@
|
||||
package count
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"fiatjaf.com/nostr/eventstore"
|
||||
"fiatjaf.com/nostr"
|
||||
)
|
||||
|
||||
type Wrapper struct {
|
||||
eventstore.Store
|
||||
}
|
||||
|
||||
var _ eventstore.Store = (*Wrapper)(nil)
|
||||
|
||||
func (w Wrapper) CountEvents(ctx context.Context, filter nostr.Filter) (int64, error) {
|
||||
if counter, ok := w.Store.(eventstore.Counter); ok {
|
||||
return counter.CountEvents(ctx, filter)
|
||||
}
|
||||
|
||||
ch, err := w.Store.QueryEvents(ctx, filter)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if ch == nil {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
var count int64
|
||||
for range ch {
|
||||
count++
|
||||
}
|
||||
return count, nil
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
package disablesearch
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"fiatjaf.com/nostr/eventstore"
|
||||
"fiatjaf.com/nostr"
|
||||
)
|
||||
|
||||
type Wrapper struct {
|
||||
eventstore.Store
|
||||
}
|
||||
|
||||
var _ eventstore.Store = (*Wrapper)(nil)
|
||||
|
||||
func (w Wrapper) QueryEvents(ctx context.Context, filter nostr.Filter) (chan *nostr.Event, error) {
|
||||
if filter.Search != "" {
|
||||
return nil, nil
|
||||
}
|
||||
return w.Store.QueryEvents(ctx, filter)
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package wrappers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"fiatjaf.com/nostr"
|
||||
"fiatjaf.com/nostr/eventstore"
|
||||
)
|
||||
|
||||
var _ nostr.Publisher = StorePublisher{}
|
||||
|
||||
type StorePublisher struct {
|
||||
eventstore.Store
|
||||
}
|
||||
|
||||
func (w StorePublisher) Publish(ctx context.Context, evt nostr.Event) error {
|
||||
if nostr.IsEphemeralKind(evt.Kind) {
|
||||
// do not store ephemeral events
|
||||
return nil
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(ctx)
|
||||
defer cancel()
|
||||
|
||||
if nostr.IsRegularKind(evt.Kind) {
|
||||
// regular events are just saved directly
|
||||
if err := w.SaveEvent(evt); err != nil && err != eventstore.ErrDupEvent {
|
||||
return fmt.Errorf("failed to save: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// others are replaced
|
||||
w.Store.ReplaceEvent(evt)
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package wrappers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"slices"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"fiatjaf.com/nostr"
|
||||
"fiatjaf.com/nostr/eventstore/slicestore"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
var sk = nostr.MustSecretKeyFromHex("486d5f6d4891f4ce3cd5f4d6b62d184ec8ea10db455830ab7918ca43d4d7ad24")
|
||||
|
||||
func TestRelayWrapper(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
s := &slicestore.SliceStore{}
|
||||
s.Init()
|
||||
defer s.Close()
|
||||
|
||||
w := StorePublisher{Store: s}
|
||||
|
||||
evt1 := nostr.Event{
|
||||
Kind: 3,
|
||||
CreatedAt: 0,
|
||||
Tags: nostr.Tags{},
|
||||
Content: "first",
|
||||
}
|
||||
evt1.Sign(sk)
|
||||
|
||||
evt2 := nostr.Event{
|
||||
Kind: 3,
|
||||
CreatedAt: 1,
|
||||
Tags: nostr.Tags{},
|
||||
Content: "second",
|
||||
}
|
||||
evt2.Sign(sk)
|
||||
|
||||
for range 200 {
|
||||
go w.Publish(ctx, evt1)
|
||||
go w.Publish(ctx, evt1)
|
||||
}
|
||||
time.Sleep(time.Millisecond * 200)
|
||||
|
||||
evts := slices.Collect(w.QueryEvents(nostr.Filter{Kinds: []uint16{3}}))
|
||||
require.Len(t, evts, 1)
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package wrappers
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"fiatjaf.com/nostr"
|
||||
"fiatjaf.com/nostr/eventstore"
|
||||
)
|
||||
|
||||
var _ nostr.Querier = StoreQuerier{}
|
||||
|
||||
type StoreQuerier struct {
|
||||
eventstore.Store
|
||||
}
|
||||
|
||||
func (w StoreQuerier) QueryEvents(ctx context.Context, filter nostr.Filter) (chan nostr.Event, error) {
|
||||
ch := make(chan nostr.Event)
|
||||
|
||||
go func() {
|
||||
for evt := range w.Store.QueryEvents(filter) {
|
||||
ch <- evt
|
||||
}
|
||||
}()
|
||||
|
||||
return ch, nil
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
package skipevent
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"fiatjaf.com/nostr/eventstore"
|
||||
"fiatjaf.com/nostr"
|
||||
)
|
||||
|
||||
type Wrapper struct {
|
||||
eventstore.Store
|
||||
|
||||
Skip func(ctx context.Context, evt *nostr.Event) bool
|
||||
}
|
||||
|
||||
var _ eventstore.Store = (*Wrapper)(nil)
|
||||
|
||||
func (w Wrapper) SaveEvent(ctx context.Context, evt *nostr.Event) error {
|
||||
if w.Skip(ctx, evt) {
|
||||
return nil
|
||||
}
|
||||
|
||||
return w.Store.SaveEvent(ctx, evt)
|
||||
}
|
||||
Reference in New Issue
Block a user