/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin */ use crate::SECRETS; use anyhow::anyhow; use jellyclient::{Instance, Session}; use jellycommon::{config::FederationAccount, user::CreateSessionParams}; use std::{collections::HashMap, sync::Arc}; use tokio::sync::RwLock; pub struct Federation { instances: HashMap, sessions: RwLock>>, } impl Federation { pub fn initialize() -> Self { let instances = SECRETS .federation .iter() .map(|(k, FederationAccount { tls, .. })| { (k.to_owned(), Instance::new(k.to_owned(), *tls)) }) .collect::>(); Self { instances, sessions: Default::default(), } } pub fn get_instance(&self, host: &String) -> anyhow::Result<&Instance> { self.instances.get(host).ok_or(anyhow!("unknown instance")) } pub async fn get_session(&self, host: &String) -> anyhow::Result> { let mut w = self.sessions.write().await; if let Some(s) = w.get(host) { Ok(s.to_owned()) } else { let FederationAccount { username, password, .. } = SECRETS .federation .get(host) .ok_or(anyhow!("no credentials of the remote server"))?; let s = Arc::new( self.get_instance(host)? .to_owned() .login(CreateSessionParams { username: username.to_owned(), password: password.to_owned(), expire: None, drop_permissions: None, }) .await?, ); w.insert(host.to_owned(), s.clone()); Ok(s) } } }