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 }