tlpt 0.8.0

A set of protocols for building local-first distributed systems
Documentation
use std::{
    cell::RefCell,
    collections::HashMap,
    pin::Pin,
    rc::{Rc, Weak},
};

use crew_rs::{CredentialSource, CrewManager, SimpleCredentialSource};
use endr::{Remote, StorageBackend};
use futures::{future, Future, FutureExt, Stream, StreamExt};
use mofo::Mofo;

use crate::{Doc, DocID, TeamID, doc::WeakDoc};

struct TlptInner {
    endr: endr::Node,
    croo: CrewManager,
    pub(crate) docs: HashMap<DocID, WeakDoc>,
    account: Option<TeamID>,
    background: Mofo,
}

#[derive(Clone)]
pub struct Tlpt(Rc<RefCell<TlptInner>>);

#[derive(Clone)]
pub(crate) struct WeakTlpt(Weak<RefCell<TlptInner>>);

impl WeakTlpt {
    pub fn upgrade(&self) -> Option<Tlpt> {
        self.0.upgrade().map(Tlpt)
    }
}

impl Tlpt {
    pub fn new(
        name: String,
        background: Mofo,
        endr: endr::Node,
        credential_source: Box<dyn CredentialSource>,
        account: Option<TeamID>,
    ) -> Self {
        let croo = CrewManager::new(
            endr.clone(),
            background.clone(),
            credential_source,
        );
        let tlpt = Tlpt(Rc::new(RefCell::new(TlptInner {
            endr,
            croo,
            docs: HashMap::new(),
            account,
            background,
        })));

        tlpt
    }

    pub(crate) fn weak_ref(&self) -> WeakTlpt {
        WeakTlpt(Rc::downgrade(&self.0))
    }

    pub(crate) fn croo(&self) -> CrewManager {
        self.0.borrow().croo.clone()
    }

    pub(crate) fn endr(&self) -> endr::Node {
        self.0.borrow().endr.clone()
    }

    pub(crate) fn background(&self) -> Mofo {
        self.0.borrow().background.clone()
    }

    pub(crate) fn account(&self) -> Option<TeamID> {
        self.0.borrow().account.clone()
    }

    pub(crate) fn get_doc(&self, doc_id: &DocID) -> Option<Doc> {
        self.0.borrow().docs.get(doc_id).and_then(|weak| weak.upgrade())
    }

    pub(crate) fn insert_doc(&self, doc: Doc) {
        self.0.borrow_mut().docs.insert(doc.id(), doc.as_weak());
    }

    pub async fn add_remote(&self, remote: Remote) {
        self.endr().add_remote(remote).await;
    }
}