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...) +}