Skip to main content
v0.11.0-beta.2 makes the client async. Every break has a one-line fix.

The changes

Cache reads are unchanged and still synchronous: get_config, get_all_configs, get_secret, get_secret_file_path, get_flag, find_flag, get_all_flags, kind, key_type, billing_overdue, synced_at. They read in-memory state and make no network call, so an .await would add noise without adding a suspension point.

Before and after

Staying synchronous

If your application has no runtime, enable the blocking feature and change one import:
Everything else stays as it was - the blocking client exposes the same methods without .await, and it owns a small runtime on its own threads so it works from inside another runtime too.

Configuration errors moved

Validation failures used to arrive as NexusError::SyncFailed(String), so telling an unparseable endpoint from a failed sync meant matching on message text. They are now NexusError::Config(String), and the message names the option and, for lists, the index:
Two values that used to be accepted are now rejected at construction: a ttl below one second, and a 0 entry in sse_reconnect_cooldown.

Recovering the transport error

The concrete type is deliberately absent from the signature, so a future change of HTTP client will not break your build again.

Minimum Rust version

1.88. Raising it can break consumers on older toolchains, so it is stated explicitly and verified by a CI job that builds and tests with exactly that toolchain.

New in the same release

  • close() - stop all background work and remove materialised file-type secrets, at a point you choose.
  • synced_at() - when the cache was last filled successfully.
  • find_flag() - None for an absent flag, so you can tell it from one that is present and false.
  • StreamHandle::abort() - stop SSE and keep TTL polling.