Easee: refresh token within access token validity time (#8783)
This commit is contained in:
parent
167b992b2a
commit
46569c73ac
3 changed files with 28 additions and 9 deletions
|
|
@ -178,17 +178,17 @@ func NewEasee(user, password, charger string, timeout time.Duration) (*Easee, er
|
|||
}
|
||||
|
||||
if err == nil {
|
||||
go c.heartbeat()
|
||||
go c.keepalive()
|
||||
}
|
||||
|
||||
return c, err
|
||||
}
|
||||
|
||||
// heartbeat ensures tokens are refreshed even when not charging for longer time
|
||||
func (c *Easee) heartbeat() {
|
||||
for range time.Tick(6 * time.Hour) {
|
||||
// keepalive ensures tokens are refreshed even when not charging for longer time
|
||||
func (c *Easee) keepalive() {
|
||||
for range time.Tick(time.Hour) {
|
||||
if _, err := c.chargerSite(c.charger); err != nil {
|
||||
c.log.ERROR.Println("heartbeat:", err)
|
||||
c.log.ERROR.Println("keep alive:", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ func TokenSource(log *util.Logger, user, password string) (oauth2.TokenSource, e
|
|||
if err == nil {
|
||||
var token Token
|
||||
if err = c.DoJSON(req, &token); err == nil {
|
||||
c.TokenSource = oauth.RefreshTokenSource(token.AsOAuth2Token(), c)
|
||||
c.TokenSource = oauth.RefreshTokenSource(token.AsOAuth2Token(), c, oauth.WithExpiryMargin(6*time.Hour))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,17 +17,36 @@ type TokenSource struct {
|
|||
mu sync.Mutex
|
||||
token *oauth2.Token
|
||||
refresher TokenRefresher
|
||||
margin time.Duration
|
||||
}
|
||||
|
||||
func RefreshTokenSource(token *oauth2.Token, refresher TokenRefresher) oauth2.TokenSource {
|
||||
return &TokenSource{token: token, refresher: refresher}
|
||||
type TokenSourceOption func(*TokenSource)
|
||||
|
||||
func WithExpiryMargin(margin time.Duration) TokenSourceOption {
|
||||
return func(ts *TokenSource) {
|
||||
ts.margin = margin
|
||||
}
|
||||
}
|
||||
|
||||
func RefreshTokenSource(token *oauth2.Token, refresher TokenRefresher, opt ...TokenSourceOption) oauth2.TokenSource {
|
||||
ts := &TokenSource{
|
||||
token: token,
|
||||
refresher: refresher,
|
||||
margin: time.Minute,
|
||||
}
|
||||
|
||||
for _, o := range opt {
|
||||
o(ts)
|
||||
}
|
||||
|
||||
return ts
|
||||
}
|
||||
|
||||
func (ts *TokenSource) Token() (*oauth2.Token, error) {
|
||||
ts.mu.Lock()
|
||||
defer ts.mu.Unlock()
|
||||
var err error
|
||||
if ts.token == nil || time.Until(ts.token.Expiry) < time.Minute {
|
||||
if ts.token == nil || time.Until(ts.token.Expiry) < ts.margin {
|
||||
var token *oauth2.Token
|
||||
if token, err = ts.refresher.RefreshToken(ts.token); err == nil {
|
||||
if token.AccessToken == "" {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue