gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

context.go (1110B)


      1 package backoff
      2 
      3 import (
      4 	"context"
      5 	"time"
      6 )
      7 
      8 // BackOffContext is a backoff policy that stops retrying after the context
      9 // is canceled.
     10 type BackOffContext interface { // nolint: golint
     11 	BackOff
     12 	Context() context.Context
     13 }
     14 
     15 type backOffContext struct {
     16 	BackOff
     17 	ctx context.Context
     18 }
     19 
     20 // WithContext returns a BackOffContext with context ctx
     21 //
     22 // ctx must not be nil
     23 func WithContext(b BackOff, ctx context.Context) BackOffContext { // nolint: golint
     24 	if ctx == nil {
     25 		panic("nil context")
     26 	}
     27 
     28 	if b, ok := b.(*backOffContext); ok {
     29 		return &backOffContext{
     30 			BackOff: b.BackOff,
     31 			ctx:     ctx,
     32 		}
     33 	}
     34 
     35 	return &backOffContext{
     36 		BackOff: b,
     37 		ctx:     ctx,
     38 	}
     39 }
     40 
     41 func getContext(b BackOff) context.Context {
     42 	if cb, ok := b.(BackOffContext); ok {
     43 		return cb.Context()
     44 	}
     45 	if tb, ok := b.(*backOffTries); ok {
     46 		return getContext(tb.delegate)
     47 	}
     48 	return context.Background()
     49 }
     50 
     51 func (b *backOffContext) Context() context.Context {
     52 	return b.ctx
     53 }
     54 
     55 func (b *backOffContext) NextBackOff() time.Duration {
     56 	select {
     57 	case <-b.ctx.Done():
     58 		return Stop
     59 	default:
     60 		return b.BackOff.NextBackOff()
     61 	}
     62 }