CachePublicKey caches the result from the given PublicKeyProvider with the TTL.
(provider PublicKeyProvider, ttl time.Duration)
| 211 | |
| 212 | // CachePublicKey caches the result from the given PublicKeyProvider with the TTL. |
| 213 | func CachePublicKey(provider PublicKeyProvider, ttl time.Duration) PublicKeyProvider { |
| 214 | var ( |
| 215 | key *jose.JSONWebKeySet |
| 216 | err error |
| 217 | t time.Time |
| 218 | mu sync.Mutex |
| 219 | ) |
| 220 | return PublicKeyProviderFunc(func(ctx context.Context) (*jose.JSONWebKeySet, error) { |
| 221 | mu.Lock() |
| 222 | defer mu.Unlock() |
| 223 | if key == nil && err == nil || time.Since(t) > ttl { |
| 224 | key, err = provider.PublicKeys(ctx) |
| 225 | t = time.Now() |
| 226 | } |
| 227 | return key, err |
| 228 | }) |
| 229 | } |
| 230 | |
| 231 | var errFetchToken = errors.DefineAborted("fetch_token", "fetch token") |
| 232 |