From 555197973bfb7667e29832f3ae9f834e36367c1b Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Thu, 8 Feb 2024 15:54:55 -0300 Subject: [PATCH] RelayStore interface (copied from eventstore) and MultiStore. --- interface.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 interface.go diff --git a/interface.go b/interface.go new file mode 100644 index 0000000..fec2b99 --- /dev/null +++ b/interface.go @@ -0,0 +1,46 @@ +package nostr + +import ( + "context" + "errors" + "slices" +) + +type RelayStore interface { + Publish(ctx context.Context, event Event) error + QuerySync(ctx context.Context, filter Filter, opts ...SubscriptionOption) ([]*Event, error) +} + +var ( + _ RelayStore = (*Relay)(nil) + _ RelayStore = (*MultiStore)(nil) +) + +type MultiStore []RelayStore + +func (multi MultiStore) Publish(ctx context.Context, event Event) error { + errs := make([]error, len(multi)) + for i, s := range multi { + errs[i] = s.Publish(ctx, event) + } + return errors.Join(errs...) +} + +func (multi MultiStore) QuerySync(ctx context.Context, filter Filter, opts ...SubscriptionOption) ([]*Event, error) { + errs := make([]error, len(multi)) + events := make([]*Event, 0, max(filter.Limit, 10)) + for i, s := range multi { + res, err := s.QuerySync(ctx, filter, opts...) + errs[i] = err + events = append(events, res...) + } + slices.SortFunc(events, func(a, b *Event) int { + if b.CreatedAt > a.CreatedAt { + return 1 + } else if b.CreatedAt < a.CreatedAt { + return -1 + } + return 0 + }) + return events, errors.Join(errs...) +}