Easee: use ReuseTokenSourceWithExpiry for token refresher

This commit is contained in:
andig 2023-07-03 17:40:22 +02:00
parent e8d95afa8c
commit eaa83bff7a
3 changed files with 10 additions and 22 deletions

View file

@ -178,17 +178,17 @@ func NewEasee(user, password, charger string, timeout time.Duration) (*Easee, er
}
if err == nil {
go c.keepalive()
go c.refresh()
}
return c, err
}
// keepalive ensures tokens are refreshed even when not charging for longer time
func (c *Easee) keepalive() {
// refresh ensures tokens are refreshed even when not charging for longer time
func (c *Easee) refresh() {
for range time.Tick(time.Hour) {
if _, err := c.chargerSite(c.charger); err != nil {
c.log.ERROR.Println("keep alive:", err)
if _, err := c.Client.Transport.(*oauth2.Transport).Source.Token(); err != nil {
c.log.ERROR.Println("token refresh:", err)
}
}
}

View file

@ -58,7 +58,9 @@ 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, oauth.WithExpiryMargin(6*time.Hour))
token := token.AsOAuth2Token()
ts := oauth.RefreshTokenSource(token, c)
c.TokenSource = oauth2.ReuseTokenSourceWithExpiry(token, ts, 6*time.Hour)
}
}

View file

@ -17,26 +17,12 @@ type TokenSource struct {
mu sync.Mutex
token *oauth2.Token
refresher TokenRefresher
margin time.Duration
}
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 {
func RefreshTokenSource(token *oauth2.Token, refresher TokenRefresher) oauth2.TokenSource {
ts := &TokenSource{
token: token,
refresher: refresher,
margin: time.Minute,
}
for _, o := range opt {
o(ts)
}
return ts
@ -46,7 +32,7 @@ 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) < ts.margin {
if ts.token == nil || time.Until(ts.token.Expiry) < time.Minute {
var token *oauth2.Token
if token, err = ts.refresher.RefreshToken(ts.token); err == nil {
if token.AccessToken == "" {