use crate::implementation::model::abort;
use crate::implementation::platform::shared::AccessToken;
use pdk_core::classy::shared_data::concurrent_shared_data::ConcurrentSharedData;
use pdk_core::classy::{Clock, SharedData};
use std::rc::Rc;
use std::str;
pub trait SessionStorage {
fn session_lock_key(&self) -> String;
fn save_token(&self, token: AccessToken);
fn get_token(&self) -> Option<AccessToken>;
}
const SESSION_LOCK: &str = "ANYPOINT_SESSION_LOCK";
const KEY_TOKEN: &str = "ANYPOINT_ACCESS_TOKEN";
pub struct SessionSharedDataStorage {
concurrent_shared_data: ConcurrentSharedData,
}
impl SessionSharedDataStorage {
pub fn new(clock: Rc<dyn Clock>, shared_data: Rc<dyn SharedData>) -> Self {
Self {
concurrent_shared_data: ConcurrentSharedData::new(clock, shared_data),
}
}
}
impl SessionStorage for SessionSharedDataStorage {
fn session_lock_key(&self) -> String {
SESSION_LOCK.to_string()
}
fn save_token(&self, token: AccessToken) {
self.concurrent_shared_data
.insert(KEY_TOKEN.to_string(), token, abort);
}
fn get_token(&self) -> Option<AccessToken> {
self.concurrent_shared_data.get(KEY_TOKEN)
}
}