jazz-rs 0.1.0

A framework for CRDT based, end-to-end enrypted distributed apps
Documentation
use credo::Credo;
use jazz::{InvitationKind, JazzNode, JoinTeamError};
use jmbl::Input;
use litl::Litl;
use jazz_telepathy::{RemoteNode, SyncMode, TelepathyNode};

#[test]
fn can_create_team_and_share_document() {
    let mut jazz1 = JazzNode::new(
        TelepathyNode::new_rc(),
        Credo::new_rc(TelepathyNode::new_rc()),
    );

    let team = jazz1.create_team();

    let (doc_id, managed_doc_ref) = jazz1.create_document(
        team,
        "main".to_string(),
        Input::CollabMap(vec![(
            Litl::string("test").into(),
            Litl::string("Hello World").into(),
        )]),
    );
    let managed_doc = managed_doc_ref.borrow();

    assert_eq!(
        managed_doc.jmbl.get_root().if_map().unwrap().to_litl(),
        Litl::dict([(Litl::string("test"), Litl::string("Hello World"))])
    );

    let mut invitation_token = jazz1
        .create_invitation(team, InvitationKind::Reader)
        .unwrap();

    let (content_sender1, content_receiver1) = futures::channel::mpsc::channel(100);
    let (content_sender2, content_receiver2) = futures::channel::mpsc::channel(100);
    let (credo_sender1, credo_receiver1) = futures::channel::mpsc::channel(100);
    let (credo_sender2, credo_receiver2) = futures::channel::mpsc::channel(100);

    let mut jazz2 = JazzNode::new(
        TelepathyNode::new_rc(),
        Credo::new_rc(TelepathyNode::new_rc()),
    );

    let (mut content_remotes1, mut credo_remotes1) = jazz1.content_and_credo_remotes();

    content_remotes1
        .try_add_sync(RemoteNode::new(
            content_receiver1,
            content_sender2,
            SyncMode::SyncAll,
        ))
        .unwrap();
    credo_remotes1
        .try_add_sync(RemoteNode::new(
            credo_receiver1,
            credo_sender2,
            SyncMode::SyncAll,
        ))
        .unwrap();

    let (mut content_remotes2, mut credo_remotes2) = jazz2.content_and_credo_remotes();

    content_remotes2
        .try_add_sync(RemoteNode::new(
            content_receiver2,
            content_sender1,
            SyncMode::SyncAll,
        ))
        .unwrap();

    credo_remotes2
        .try_add_sync(RemoteNode::new(
            credo_receiver2,
            credo_sender1,
            SyncMode::SyncAll,
        ))
        .unwrap();

    loop {
        invitation_token = match jazz2.join_team(invitation_token) {
            Ok(_) => break,

            err @ Err(_) => {
                println!("Got err {:?}", &err);
                match err {
                    Ok(_) => unreachable!(),
                    Err(JoinTeamError::ExpectedEncryptedInvitationInTeamState(returned_token))
                    | Err(JoinTeamError::ExpectedInitialTeamStateExisting(returned_token))
                    | Err(JoinTeamError::ExpectedInitialTeamStateReceived(returned_token)) => {
                        returned_token
                    }
                    Err(_) => panic!("Unexpected error {:?}", err),
                }
            }
        };
        println!("Sync 2");
        jazz2.sync_with_remotes();
        println!("Sync 1");
        jazz1.sync_with_remotes();
    }

    let managed_doc_ref2 = jazz2.load_document(doc_id);

    let mut managed_doc2 = managed_doc_ref2.borrow_mut();

    managed_doc2.receive_updates();

    assert_eq!(
        managed_doc2.jmbl.get_root().if_map().unwrap().to_litl(),
        Litl::dict([(Litl::string("test"), Litl::string("Hello World"))])
    );
}