github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/updater/update_checker.go (about)

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package updater
     5  
     6  import "time"
     7  
     8  const DefaultTickDuration = time.Hour
     9  
    10  // UpdateChecker runs updates checks every check duration
    11  type UpdateChecker struct {
    12  	updater      *Updater
    13  	ctx          Context
    14  	ticker       *time.Ticker
    15  	log          Log
    16  	tickDuration time.Duration // tickDuration is the ticker delay
    17  	count        int           // count is number of times we've checked
    18  }
    19  
    20  // NewUpdateChecker creates an update checker
    21  func NewUpdateChecker(updater *Updater, ctx Context, tickDuration time.Duration, log Log) UpdateChecker {
    22  	return UpdateChecker{
    23  		updater:      updater,
    24  		ctx:          ctx,
    25  		log:          log,
    26  		tickDuration: tickDuration,
    27  	}
    28  }
    29  
    30  func (u *UpdateChecker) check() error {
    31  	u.count++
    32  	update, err := u.updater.Update(u.ctx)
    33  	u.ctx.AfterUpdateCheck(update)
    34  	return err
    35  }
    36  
    37  // Check checks for an update.
    38  func (u *UpdateChecker) Check() {
    39  	u.updater.config.SetLastUpdateCheckTime()
    40  	if err := u.check(); err != nil {
    41  		u.log.Errorf("Error in update: %s", err)
    42  	}
    43  }
    44  
    45  // Start starts the update checker. Returns false if we are already running.
    46  func (u *UpdateChecker) Start() bool {
    47  	if u.ticker != nil {
    48  		return false
    49  	}
    50  	u.ticker = time.NewTicker(u.tickDuration)
    51  	go func() {
    52  		// If we haven't done an update recently, check now.
    53  		// If there is an error getting the last update time, we don't trigger a
    54  		// check and let the ticker below trigger it.
    55  		if !u.updater.config.IsLastUpdateCheckTimeRecent(u.tickDuration) {
    56  			u.Check()
    57  		}
    58  
    59  		u.log.Debugf("Starting (ticker %s)", u.tickDuration)
    60  		for range u.ticker.C {
    61  			u.log.Debugf("%s", "Checking for update (ticker)")
    62  			u.Check()
    63  		}
    64  	}()
    65  	return true
    66  }
    67  
    68  // Stop stops the update checker
    69  func (u *UpdateChecker) Stop() {
    70  	if u.ticker != nil {
    71  		u.ticker.Stop()
    72  		u.ticker = nil
    73  	}
    74  }
    75  
    76  // Count is number of times the check has been called
    77  func (u UpdateChecker) Count() int {
    78  	return u.count
    79  }