rings-node 0.7.0

Rings is a structured peer-to-peer network implementation using WebRTC, Chord algorithm, and full WebAssembly (WASM) support.
pub mod browser;
pub mod processor;
pub mod snark;
use std::sync::Arc;

use rings_core::ecc::SecretKey;
use rings_core::prelude::uuid;
use rings_core::session::SessionSk;
use rings_core::storage::idb::IdbStorage;
use rings_rpc::protos::rings_node::*;
use wasm_bindgen_futures::JsFuture;

use crate::logging::browser::init_logging;
use crate::prelude::rings_core::utils::js_value;
use crate::processor::Processor;
use crate::processor::ProcessorBuilder;
use crate::processor::ProcessorConfig;
use crate::provider::Provider;

pub fn setup_log() {
    init_logging(crate::logging::LogLevel::Info);
    tracing::debug!("test")
}

pub async fn prepare_processor() -> Processor {
    let key = SecretKey::random();
    let sm = SessionSk::new_with_seckey(&key).unwrap();

    let config = serde_yaml::to_string(&ProcessorConfig::new(
        0,
        "stun://stun.l.google.com:19302".to_string(),
        sm,
        200,
    ))
    .unwrap();

    let storage_name = uuid::Uuid::new_v4().to_simple().to_string();
    let storage = Box::new(
        IdbStorage::new_with_cap_and_name(50000, &storage_name)
            .await
            .unwrap(),
    );

    ProcessorBuilder::from_serialized(&config)
        .unwrap()
        .storage(storage)
        .build()
        .unwrap()
}

pub async fn new_provider() -> Provider {
    let processor = prepare_processor().await;
    Provider::from_processor(Arc::new(processor))
}

pub async fn get_peers(provider: &Provider) -> Vec<PeerInfo> {
    let resp = JsFuture::from(provider.request(
        "listPeers".to_string(),
        js_value::serialize(&ListPeersRequest {}).unwrap(),
    ))
    .await
    .unwrap();

    js_value::deserialize::<ListPeersResponse>(resp)
        .unwrap()
        .peers
}

pub async fn create_connection(provider1: &Provider, provider2: &Provider) {
    let req0 = CreateOfferRequest {
        did: provider2.address(),
    };
    let resp0 = JsFuture::from(provider1.request(
        "createOffer".to_string(),
        js_value::serialize(&req0).unwrap(),
    ))
    .await
    .unwrap();

    let offer = js_value::deserialize::<CreateOfferResponse>(resp0)
        .unwrap()
        .offer;

    let req1 = AnswerOfferRequest { offer };
    let resp1 = JsFuture::from(provider2.request(
        "answerOffer".to_string(),
        js_value::serialize(&req1).unwrap(),
    ))
    .await
    .unwrap();

    let answer = js_value::deserialize::<AnswerOfferResponse>(resp1)
        .unwrap()
        .answer;

    let req2 = AcceptAnswerRequest { answer };
    let _resp2 = JsFuture::from(provider1.request(
        "acceptAnswer".to_string(),
        js_value::serialize(&req2).unwrap(),
    ))
    .await
    .unwrap();
}