client: add fuzzy timer for update check and ping interval
Uses the same timing parameters as update_engine.
This commit is contained in:
parent
c88c5916bb
commit
1b026dfef5
1 changed files with 21 additions and 0 deletions
|
@ -19,6 +19,7 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"time"
|
||||
|
||||
"github.com/satori/go.uuid"
|
||||
|
||||
|
@ -27,6 +28,11 @@ import (
|
|||
|
||||
const (
|
||||
defaultClientVersion = "go-omaha"
|
||||
|
||||
// periodic update check and ping intervals
|
||||
pingFuzz = 10 * time.Minute
|
||||
pingDelay = 7 * time.Minute // first check after 2-12 minutes
|
||||
pingInterval = 45 * time.Minute // check in every 40-50 minutes
|
||||
)
|
||||
|
||||
// Client supports managing multiple apps using a single server.
|
||||
|
@ -37,6 +43,7 @@ type Client struct {
|
|||
userID string
|
||||
sessionID string
|
||||
isMachine bool
|
||||
sentPing bool
|
||||
apps map[string]*AppClient
|
||||
}
|
||||
|
||||
|
@ -97,6 +104,16 @@ func (c *Client) SetClientVersion(clientVersion string) {
|
|||
c.clientVersion = clientVersion
|
||||
}
|
||||
|
||||
// NextPing returns a timer channel that will fire when the next update
|
||||
// check or ping should be sent.
|
||||
func (c *Client) NextPing() <-chan time.Time {
|
||||
d := pingDelay
|
||||
if c.sentPing {
|
||||
d = pingInterval
|
||||
}
|
||||
return FuzzyAfter(d, pingFuzz)
|
||||
}
|
||||
|
||||
// AppClient gets the application client for the given application ID.
|
||||
func (c *Client) AppClient(appID string) (*AppClient, error) {
|
||||
if app, ok := c.apps[appID]; ok {
|
||||
|
@ -167,6 +184,8 @@ func (ac *AppClient) UpdateCheck() (*omaha.UpdateResponse, error) {
|
|||
app.AddPing()
|
||||
app.AddUpdateCheck()
|
||||
|
||||
ac.sentPing = true
|
||||
|
||||
appResp, err := ac.doReq(ac.apiEndpoint, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -196,6 +215,8 @@ func (ac *AppClient) Ping() error {
|
|||
app := req.Apps[0]
|
||||
app.AddPing()
|
||||
|
||||
ac.sentPing = true
|
||||
|
||||
appResp, err := ac.doReq(ac.apiEndpoint, req)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
Loading…
Reference in a new issue