# async-refresh-tokens [](https://hackage.haskell.org/package/async-refresh-tokens) [](https://www.stackage.org/package/async-refresh-tokens) [](https://travis-ci.org/mtesseract/async-refresh-tokens)
### About
This is Haskell library built on top of the async-refresh package
implementing the logic for refreshing of expiring access tokens.
### Usage
- Create new token types.
- Make the tokens be instances of the `IsToken` type classes by
defining the `tokenScopes` method and (optionally) `tokenName` (a
human readable label for this token).
- Use `newEmptyTokenStore` to create a new token stores (token stores
are basically `TVar`s containing the tokens wrapped in `Either
SomeException`).
- Create a new configuration by adjusting `defaultTokenConf` using the
functions `tokenConfAddRequest` and `tokenConfSetFactor`. The
function `tokenConfAddRequest` expects values of type `RequestToken`
— these values encapsulate the token stores together with a
token-refreshing action.
- Use `newTokenRefresher` to initiate token refreshing for each
registered token refreshing request.
- To use the current token, extract it from the `TVar` using
`readTVar` (and pattern matching on `Right`).
### Example
```
{-# LANGUAGE OverloadedStrings #-}
data TokenFoo
instance IsToken TokenFoo where
tokenScopes _ = ["foo.read", "foo.write"]
createTokenStoreFoo :: LoggingT IO (TokenStore TokenFoo)
createTokenStoreFoo = do
tokenFoo <- newEmptyTokenStore (Proxy :: Proxy TokenFoo)
let conf = defaultTokenConf
& tokenConfAddRequest (RequestToken tokenFoo actionFoo)
_ <- newTokenRefresher conf
return tokenFoo
where actionFoo :: (MonadIO m, IsToken t) => m (RefreshResult (Token t))
actionFoo =
return $ RefreshResult (Token "secret-foo-token") Nothing
```