Skip to content

feat(oidc-provider): make OidcCredentialProvider cheaply cloneable (shareable warm cache)#69

Merged
alukach merged 2 commits into
mainfrom
feat/shareable-credential-cache
Jun 20, 2026
Merged

feat(oidc-provider): make OidcCredentialProvider cheaply cloneable (shareable warm cache)#69
alukach merged 2 commits into
mainfrom
feat/shareable-credential-cache

Conversation

@alukach

@alukach alukach commented Jun 5, 2026

Copy link
Copy Markdown
Member

Adds Clone to OidcCredentialProvider and CredentialCache (entries behind an Arc), so a runtime that rebuilds its dispatch chain per request (e.g. a Cloudflare Worker) can hold one provider in a shared/static slot and reuse it — keeping the credential cache warm instead of re-minting + re-running AssumeRoleWithWebIdentity on every call. No behavior change for single-instance use. Consumed by source-cooperative/data.source.coop#147.

🤖 Generated with Claude Code

…ply cloneable

Put the cache's entries map behind an Arc and derive Clone on CredentialCache and
OidcCredentialProvider. Cloning a provider now shares the same cache, so a runtime
that rebuilds its dispatch chain per request (e.g. a Cloudflare Worker) can hold
one provider in a shared/static slot and reuse it across requests — keeping the
credential cache warm instead of re-minting a JWT and re-running
AssumeRoleWithWebIdentity on every call.

No behavior change for existing single-instance use.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown

🚀 Latest commit deployed to https://multistore-proxy-pr-69.development-seed.workers.dev

  • Date: 2026-06-20T04:33:54Z
  • Commit: da59c68

@alukach alukach merged commit d6f13f1 into main Jun 20, 2026
12 checks passed
@alukach alukach deleted the feat/shareable-credential-cache branch June 20, 2026 04:42
alukach added a commit that referenced this pull request Jun 20, 2026
Resolve conflicts after main dissolved `backend-federation` (#67) and
shipped its own `oidc-provider` credential cache (#69).

PR #61 added single-flight + proactive-refresh in a standalone
`credential-cache` crate, built on the now-removed `backend-federation`
crate and the pre-rename `FederatedCredentials` type. Main has since
dissolved `backend-federation` (value type -> core as
`BackendCredentials`, AWS exchange -> `oidc-provider`) and added its own
plain TTL `CredentialCache` in `oidc-provider/src/cache.rs`.

Rather than resurrect a separate cache crate (the speculative-separate-
crate pattern #67 deliberately removed), fold PR #61's behavior into
main's existing cache:

- oidc-provider/src/cache.rs: replace the get/put TTL cache with a
  single-flight, proactively-refreshing `get_or_fetch(key, fetch)` over
  `BackendCredentials`. A per-key `futures::lock::Mutex` serializes
  concurrent refreshes; values are shared via `Arc`; the cache stays
  `Clone` for the cheaply-cloneable provider (#69).
- oidc-provider/src/lib.rs: `get_credentials` now goes through
  `get_or_fetch`; drop the external crate, the `CloudCredentials`/
  `Expiring` glue, and the `now` parameter (the cache reads `Utc::now()`
  internally, matching main and the rest of the workspace).
- Drop crates/credential-cache and crates/backend-federation and their
  workspace + manifest entries; add `futures` to oidc-provider for the
  async lock.
- docs/architecture/caching.md: describe the cache as oidc-provider's,
  not a standalone crate; drop the obsolete "caller passes now" note.

Verified: cargo check (native default-members) + cargo check -p
multistore-cf-workers --target wasm32; oidc-provider tests 31 default /
39 azure,gcp; clippy clean on oidc-provider; cargo fmt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant