35 lines
506 B
Go
35 lines
506 B
Go
|
package fcm
|
||
|
|
||
|
import (
|
||
|
"net"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
minBackoff = 100 * time.Millisecond
|
||
|
maxBackoff = 1 * time.Minute
|
||
|
factor = 2.7
|
||
|
)
|
||
|
|
||
|
func retry(fn func() error, attempts int) error {
|
||
|
var attempt int
|
||
|
for {
|
||
|
err := fn()
|
||
|
if err == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
if tErr, ok := err.(net.Error); !ok || !tErr.Temporary() {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
attempt++
|
||
|
backoff := minBackoff * time.Duration(attempt*attempt)
|
||
|
if attempt > attempts || backoff > maxBackoff {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
time.Sleep(backoff)
|
||
|
}
|
||
|
}
|