(ctx context.Context, sequence int32)
| 230 | } |
| 231 | |
| 232 | func (c *cache) cryptoKey(ctx context.Context, sequence int32) (string, []byte, error) { |
| 233 | c.logger.Debug(ctx, "request for key", slog.F("sequence", sequence)) |
| 234 | c.mu.Lock() |
| 235 | defer c.mu.Unlock() |
| 236 | |
| 237 | if c.closed { |
| 238 | return "", nil, ErrClosed |
| 239 | } |
| 240 | |
| 241 | var key codersdk.CryptoKey |
| 242 | var ok bool |
| 243 | for key, ok = c.key(sequence); !ok && c.fetching && !c.closed; { |
| 244 | c.cond.Wait() |
| 245 | } |
| 246 | |
| 247 | if c.closed { |
| 248 | return "", nil, ErrClosed |
| 249 | } |
| 250 | |
| 251 | if ok { |
| 252 | return checkKey(key, sequence, c.clock.Now()) |
| 253 | } |
| 254 | |
| 255 | c.fetching = true |
| 256 | |
| 257 | c.mu.Unlock() |
| 258 | keys, err := c.cryptoKeys(ctx) |
| 259 | c.mu.Lock() |
| 260 | if err != nil { |
| 261 | return "", nil, xerrors.Errorf("get keys: %w", err) |
| 262 | } |
| 263 | |
| 264 | c.lastFetch = c.clock.Now() |
| 265 | c.refresher.Reset(refreshInterval) |
| 266 | c.keys = keys |
| 267 | c.fetching = false |
| 268 | c.cond.Broadcast() |
| 269 | |
| 270 | key, ok = c.key(sequence) |
| 271 | if !ok { |
| 272 | return "", nil, ErrKeyNotFound |
| 273 | } |
| 274 | |
| 275 | return checkKey(key, sequence, c.clock.Now()) |
| 276 | } |
| 277 | |
| 278 | func (c *cache) key(sequence int32) (codersdk.CryptoKey, bool) { |
| 279 | if sequence == latestSequence { |
no test coverage detected