aboutsummaryrefslogtreecommitdiff
path: root/server/src/federation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/federation.rs')
-rw-r--r--server/src/federation.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/server/src/federation.rs b/server/src/federation.rs
new file mode 100644
index 0000000..578261b
--- /dev/null
+++ b/server/src/federation.rs
@@ -0,0 +1,55 @@
+use crate::CONF;
+use anyhow::anyhow;
+use jellyclient::{Instance, Session};
+use std::{collections::HashMap, sync::Arc, time::Duration};
+use tokio::sync::RwLock;
+
+pub struct Federation {
+ instances: HashMap<String, Instance>,
+ sessions: RwLock<HashMap<String, Arc<Session>>>,
+}
+
+impl Federation {
+ pub fn initialize() -> Self {
+ let instances = CONF
+ .remote_credentials
+ .iter()
+ .map(|(k, (_, _, tls))| (k.to_owned(), Instance::new(k.to_owned(), *tls)))
+ .collect::<HashMap<_, _>>();
+
+ Self {
+ instances,
+ sessions: Default::default(),
+ }
+ }
+
+ pub fn get_instance(&self, host: &String) -> anyhow::Result<&Instance> {
+ Ok(self
+ .instances
+ .get(host)
+ .ok_or(anyhow!("unknown instance"))?)
+ }
+ pub async fn get_session(&self, host: &String) -> anyhow::Result<Arc<Session>> {
+ let mut w = self.sessions.write().await;
+ if let Some(s) = w.get(host) {
+ Ok(s.to_owned())
+ } else {
+ let (username, password, _) = CONF
+ .remote_credentials
+ .get(host)
+ .ok_or(anyhow!("no credentials of the remote server"))?;
+ let s = Arc::new(
+ self.get_instance(host)?
+ .to_owned()
+ .login(
+ username.to_owned(),
+ password.to_owned(),
+ Duration::from_secs(60 * 60 * 24 * 356),
+ )
+ .await?,
+ );
+ w.insert(host.to_owned(), s.clone());
+ Ok(s)
+ }
+ }
+}