package email import ( "context" "errors" "time" "github.com/sony/gobreaker" ) type Sender struct { endpoint string breaker *gobreaker.CircuitBreaker } func NewSender(endpoint string) *Sender { return &Sender{ endpoint: endpoint, breaker: gobreaker.NewCircuitBreaker(gobreaker.Settings{ Name: "email-service", MaxRequests: 3, Interval: time.Minute, Timeout: 10 * time.Second, }), } } func (s *Sender) SendInvite(ctx context.Context, email, teamName string) error { _, err := s.breaker.Execute(func() (any, error) { if s.endpoint == "" { return nil, errors.New("email endpoint is empty") } if s.endpoint == "mock://email" { return nil, nil } select { case <-ctx.Done(): return nil, ctx.Err() case <-time.After(20 * time.Millisecond): return nil, nil } }) return err }