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