github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/libkb/bgticker.go (about)

     1  package libkb
     2  
     3  import (
     4  	"time"
     5  )
     6  
     7  const DefaultBgTickerWait = 5 * time.Second
     8  
     9  type BgTicker struct {
    10  	C          <-chan time.Time
    11  	c          chan time.Time
    12  	ticker     *time.Ticker
    13  	resumeWait time.Duration
    14  }
    15  
    16  // This ticker wrap's Go's time.Ticker to wait a given time.Duration before
    17  // firing. This is helpful to not overload the mobile apps when they are
    18  // brought to the foreground and all have tasks that are ready to fire.
    19  
    20  // NewBgTicker will panic if wait > duration as time.Ticker does with a
    21  // negative duration.
    22  func NewBgTicker(duration time.Duration) *BgTicker {
    23  	return NewBgTickerWithWait(duration, DefaultBgTickerWait)
    24  }
    25  
    26  func NewBgTickerWithWait(duration time.Duration, wait time.Duration) *BgTicker {
    27  	c := make(chan time.Time, 1)
    28  	t := &BgTicker{
    29  		C:          c,
    30  		c:          c,
    31  		ticker:     time.NewTicker(duration - wait),
    32  		resumeWait: wait,
    33  	}
    34  	go t.tick()
    35  	return t
    36  }
    37  
    38  func (t *BgTicker) tick() {
    39  	for c := range t.ticker.C {
    40  		time.Sleep(RandomJitter(t.resumeWait))
    41  		t.c <- c
    42  	}
    43  }
    44  
    45  func (t *BgTicker) Stop() {
    46  	t.ticker.Stop()
    47  }