Easee: refresh token within access token validity time (#8783)

This commit is contained in:
andig 2023-07-03 17:05:27 +02:00 • committed by GitHub
parent 167b992b2a
commit 46569c73ac
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 9 deletions

View file

@ -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)
}
}
}

View file

@ -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))
}
}

View file

@ -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 == "" {