Skip to main content

ClientPool

Struct ClientPool 

Source
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

Source

pub fn new(proxy: ProxyConfig) -> Self

Create a new pool with the given proxy configuration.

Source

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.

Source

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.

Source

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.

Source

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.

Source

pub async fn get_or_build( &self, profile_id: &ProfileId, region: &str, ) -> Option<Arc<Client>>

Return the cached Arc<Client> for (profile_id, region), building one if it does not yet exist.

Returns None if profile_id has not been registered via register_profile.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more