From 7c6f75a139128e77f6c0e16ee176192dfef75599 Mon Sep 17 00:00:00 2001 From: sigoden Date: Mon, 6 May 2024 09:08:49 +0800 Subject: refactor: unified access token management (#486) --- src/client/access_token.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/client/access_token.rs (limited to 'src/client/access_token.rs') diff --git a/src/client/access_token.rs b/src/client/access_token.rs new file mode 100644 index 0000000..07640d5 --- /dev/null +++ b/src/client/access_token.rs @@ -0,0 +1,34 @@ +use anyhow::{anyhow, Result}; +use chrono::Utc; +use indexmap::IndexMap; +use lazy_static::lazy_static; +use parking_lot::RwLock; + +lazy_static! { + static ref ACCESS_TOKENS: RwLock> = + RwLock::new(IndexMap::new()); +} + +pub fn get_access_token(client_name: &str) -> Result { + ACCESS_TOKENS + .read() + .get(client_name) + .map(|(token, _)| token.clone()) + .ok_or_else(|| anyhow!("Invalid access token")) +} + +pub fn is_valid_access_token(client_name: &str) -> bool { + let access_tokens = ACCESS_TOKENS.read(); + let (token, expires_at) = match access_tokens.get(client_name) { + Some(v) => v, + None => return false, + }; + !token.is_empty() && Utc::now().timestamp() < *expires_at +} + +pub fn set_access_token(client_name: &str, token: String, expires_at: i64) { + let mut access_tokens = ACCESS_TOKENS.write(); + let entry = access_tokens.entry(client_name.to_string()).or_default(); + entry.0 = token; + entry.1 = expires_at; +} -- cgit v1.2.3