pub struct ClientPool {
proxy: RwLock<ProxyConfig>,
flags: RwLock<HashMap<ProfileId, CompatFlags>>,
credentials: RwLock<HashMap<ProfileId, SharedCredentialsProvider>>,
cache: RwLock<HashMap<(ProfileId, String), Arc<Client>>>,
notification_log: Option<NotificationLogHandle>,
}Expand description
Pool of Arc<aws_sdk_s3::Client> instances, keyed by (ProfileId, region).
Clients are built on first access and cached for the process lifetime.
The pool is safe to share across threads via Arc<ClientPool>.
§Proxy
A single ProxyConfig is applied to every client built by this pool.
Per-profile proxy overrides are a task-8 concern (settings store); this
pool accepts the pool-wide proxy at construction time.
Fields§
§proxy: RwLock<ProxyConfig>Shared proxy configuration applied to every client built by this pool.
Wrapped in a std::sync::RwLock so set_proxy can hot-swap the value
when the user changes the Settings → Proxy mode. Reads clone the value
out of the lock before any .await to avoid holding a guard across an
async point.
flags: RwLock<HashMap<ProfileId, CompatFlags>>Per-profile compat flags registry. Profiles must be registered before
get_or_build is called for them.
credentials: RwLock<HashMap<ProfileId, SharedCredentialsProvider>>Per-profile explicit credentials. Populated by register_credentials
after profile_validate builds a provider (from the keychain secret for
manual profiles, or from the named ~/.aws/credentials entry for
AWS-discovered profiles). When absent, get_or_build falls through to
the SDK’s default credentials chain, which only works for the user’s
default profile and is the source of “dispatch failure” errors against
non-default profiles.
cache: RwLock<HashMap<(ProfileId, String), Arc<Client>>>Cached clients. Built lazily on first get_or_build call.
notification_log: Option<NotificationLogHandle>Optional notification log for surfacing compat-flag warnings.
When None, warnings fall back to stderr/tracing.
Implementations§
Source§impl ClientPool
impl ClientPool
Sourcepub fn new(proxy: ProxyConfig) -> Self
pub fn new(proxy: ProxyConfig) -> Self
Create a new pool with the given proxy configuration.
Sourcepub async fn set_proxy(&self, new_proxy: ProxyConfig)
pub async fn set_proxy(&self, new_proxy: ProxyConfig)
Replace the proxy configuration and evict every cached client so the
next get_or_build rebuilds with the new connector.
Wired to settings_update so the user can toggle proxy modes without
restarting the app. The connector itself is rebuilt per-client at
get_or_build time; evicting the cache is what makes the new value
visible to callers.
Sourcepub fn with_notification_log(self, handle: NotificationLogHandle) -> Self
pub fn with_notification_log(self, handle: NotificationLogHandle) -> Self
Attach a notification log so compat-flag warnings emitted during client construction are pushed into the in-app notification system.
Sourcepub async fn register_profile(&self, profile_id: ProfileId, compat: CompatFlags)
pub async fn register_profile(&self, profile_id: ProfileId, compat: CompatFlags)
Register CompatFlags for a profile. Must be called before
get_or_build for the same profile. Calling again for an existing
profile updates the flags and evicts any cached clients for that
profile so they are rebuilt with the new flags.
Sourcepub async fn register_credentials(
&self,
profile_id: ProfileId,
creds: SharedCredentialsProvider,
)
pub async fn register_credentials( &self, profile_id: ProfileId, creds: SharedCredentialsProvider, )
Attach (or replace) the credentials provider used to build clients for
profile_id. Evicts cached clients so the next get_or_build rebuilds
with the new credentials.
Without this, get_or_build falls back to the SDK’s default chain,
which only loads the user’s default profile — non-default profiles
then return “dispatch failure” because the chain has no credentials
to sign with.
Auto Trait Implementations§
impl !Freeze for ClientPool
impl !RefUnwindSafe for ClientPool
impl Send for ClientPool
impl Sync for ClientPool
impl Unpin for ClientPool
impl UnsafeUnpin for ClientPool
impl !UnwindSafe for ClientPool
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more