Skip to content

Commit 8b552a3

Browse files
committed
WIP
1 parent d91b2ce commit 8b552a3

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

tests/rpc.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#![cfg(feature = "test")]
2+
use std::{net::SocketAddr, path::PathBuf, sync::Arc};
3+
4+
use iroh_blobs::{net_protocol::Blobs, util::local_pool::{self, LocalPool}};
5+
6+
use quinn::{
7+
crypto::rustls::{QuicClientConfig, QuicServerConfig},
8+
rustls, ClientConfig, Endpoint, ServerConfig,
9+
};
10+
11+
12+
/// Returns default server configuration along with its certificate.
13+
#[allow(clippy::field_reassign_with_default)] // https://github.com/rust-lang/rust-clippy/issues/6527
14+
fn configure_server() -> anyhow::Result<(ServerConfig, Vec<u8>)> {
15+
let cert = rcgen::generate_simple_self_signed(vec!["localhost".into()])?;
16+
let cert_der = cert.cert.der();
17+
let priv_key = rustls::pki_types::PrivatePkcs8KeyDer::from(cert.key_pair.serialize_der());
18+
let cert_chain = vec![cert_der.clone()];
19+
20+
let crypto_server_config = rustls::ServerConfig::builder_with_provider(Arc::new(
21+
rustls::crypto::ring::default_provider(),
22+
))
23+
.with_protocol_versions(&[&rustls::version::TLS13])
24+
.expect("valid versions")
25+
.with_no_client_auth()
26+
.with_single_cert(cert_chain, priv_key.into())?;
27+
let quic_server_config = QuicServerConfig::try_from(crypto_server_config)?;
28+
let mut server_config = ServerConfig::with_crypto(Arc::new(quic_server_config));
29+
30+
Arc::get_mut(&mut server_config.transport)
31+
.unwrap()
32+
.max_concurrent_uni_streams(0_u8.into());
33+
34+
Ok((server_config, cert_der.to_vec()))
35+
}
36+
37+
pub fn make_server_endpoint(bind_addr: SocketAddr) -> anyhow::Result<(Endpoint, Vec<u8>)> {
38+
let (server_config, server_cert) = configure_server()?;
39+
let endpoint = Endpoint::server(server_config, bind_addr)?;
40+
Ok((endpoint, server_cert))
41+
}
42+
43+
/// An iroh node that just has the blobs transport
44+
#[derive(Debug)]
45+
pub struct Node {
46+
pub router: iroh::protocol::Router,
47+
pub blobs: Blobs<iroh_blobs::store::fs::Store>,
48+
pub _local_pool: LocalPool,
49+
}
50+
51+
impl Node {
52+
pub async fn new(path: PathBuf) -> anyhow::Result<Self> {
53+
let store = iroh_blobs::store::fs::Store::load(path).await?;
54+
let local_pool = LocalPool::default();
55+
let endpoint = iroh::Endpoint::builder().bind().await?;
56+
let blobs = Blobs::builder(store).build(local_pool.handle(), &endpoint);
57+
let router = iroh::protocol::Router::builder(endpoint)
58+
.accept(iroh_blobs::ALPN, blobs.clone())
59+
.spawn()
60+
.await?;
61+
let endpoint = quinn::Endpoint::server(config, "0.0.0.0:12345".parse().unwrap())?;
62+
let rpc_server = quic_rpc::transport::quinn::QuinnListener::new(endpoint)
63+
Ok(Self {
64+
router,
65+
blobs,
66+
_local_pool: local_pool,
67+
})
68+
}
69+
}

0 commit comments

Comments
 (0)