mirror of
https://github.com/narrrl/proton-sdk-rs.git
synced 2026-11-03 16:41:26 +01:00
added token refresh callback
This commit is contained in:
1 parent
de6b61256e
commit
2e3c23803e
1 file changed
+26
@@ -47,6 +47,9 @@ pub struct ApiHttpClient {
|
|||||||
route_prefix: Arc<str>,
|
route_prefix: Arc<str>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Callback invoked after a successful token refresh.
|
||||||
|
type TokensRefreshedCallback = Arc<dyn Fn(Tokens) + Send + Sync>;
|
||||||
|
|
||||||
struct Inner {
|
struct Inner {
|
||||||
http: reqwest::Client,
|
http: reqwest::Client,
|
||||||
base_url: String,
|
base_url: String,
|
||||||
@@ -59,6 +62,7 @@ struct Inner {
|
|||||||
/// a no-op. `std::sync::Mutex` (not tokio's) — held only for the cheap
|
/// a no-op. `std::sync::Mutex` (not tokio's) — held only for the cheap
|
||||||
/// clone/replace, never across an await.
|
/// clone/replace, never across an await.
|
||||||
telemetry: std::sync::Mutex<Arc<dyn Telemetry>>,
|
telemetry: std::sync::Mutex<Arc<dyn Telemetry>>,
|
||||||
|
on_tokens_refreshed: std::sync::Mutex<Option<TokensRefreshedCallback>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ApiHttpClient {
|
impl ApiHttpClient {
|
||||||
@@ -82,6 +86,7 @@ impl ApiHttpClient {
|
|||||||
session_id,
|
session_id,
|
||||||
tokens: Mutex::new(tokens),
|
tokens: Mutex::new(tokens),
|
||||||
telemetry: std::sync::Mutex::new(NoopTelemetry::shared()),
|
telemetry: std::sync::Mutex::new(NoopTelemetry::shared()),
|
||||||
|
on_tokens_refreshed: std::sync::Mutex::new(None),
|
||||||
}),
|
}),
|
||||||
route_prefix: Arc::from(""),
|
route_prefix: Arc::from(""),
|
||||||
})
|
})
|
||||||
@@ -118,6 +123,16 @@ impl ApiHttpClient {
|
|||||||
.expect("telemetry mutex poisoned") = telemetry;
|
.expect("telemetry mutex poisoned") = telemetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set a callback to be invoked whenever the session's tokens are refreshed.
|
||||||
|
/// Replaces any previous callback. Takes effect for every clone of this client.
|
||||||
|
pub fn set_on_tokens_refreshed(&self, callback: impl Fn(Tokens) + Send + Sync + 'static) {
|
||||||
|
*self
|
||||||
|
.inner
|
||||||
|
.on_tokens_refreshed
|
||||||
|
.lock()
|
||||||
|
.expect("on_tokens_refreshed mutex poisoned") = Some(Arc::new(callback));
|
||||||
|
}
|
||||||
|
|
||||||
/// Snapshot the current telemetry sink.
|
/// Snapshot the current telemetry sink.
|
||||||
fn telemetry(&self) -> Arc<dyn Telemetry> {
|
fn telemetry(&self) -> Arc<dyn Telemetry> {
|
||||||
self.inner
|
self.inner
|
||||||
@@ -340,6 +355,17 @@ impl ApiHttpClient {
|
|||||||
|
|
||||||
let refreshed = self.request_refresh(&guard.refresh_token).await?;
|
let refreshed = self.request_refresh(&guard.refresh_token).await?;
|
||||||
*guard = refreshed.clone();
|
*guard = refreshed.clone();
|
||||||
|
|
||||||
|
// Notify callback
|
||||||
|
if let Some(ref cb) = *self
|
||||||
|
.inner
|
||||||
|
.on_tokens_refreshed
|
||||||
|
.lock()
|
||||||
|
.expect("on_tokens_refreshed mutex poisoned")
|
||||||
|
{
|
||||||
|
cb(refreshed.clone());
|
||||||
|
}
|
||||||
|
|
||||||
Ok(refreshed.access_token)
|
Ok(refreshed.access_token)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user