Function ssb_client::ssb
[−]
[src]
pub fn ssb<R: AsyncRead, W: AsyncWrite>(
r: R,
w: W
) -> (Client<R, W>, Receive<R, W>, Closed<W>)
Take ownership of an AsyncRead and an AsyncWrite to create an ssb client.
Example
ⓘThis example is not tested
sodiumoxide::init(); let (pk, sk) = load_or_create_keys().unwrap(); let pk = pk.try_into().unwrap(); let sk = sk.try_into().unwrap(); let (ephemeral_pk, ephemeral_sk) = box_::gen_keypair(); let addr = SocketAddr::new(Ipv6Addr::localhost().into(), DEFAULT_TCP_PORT); current_thread::run(|_| { current_thread::spawn(TcpStream::connect(&addr) .and_then(move |tcp| { // Performs a secret-handshake and yields an encrypted duplex connection. OwningClient::new(tcp, &MAINNET_IDENTIFIER, &pk, &sk, &ephemeral_pk, &ephemeral_sk, &pk) .map_err(|(err, _)| err) }) .map_err(|err| panic!("{:?}", err)) .map(move |connection| { let (read, write) = connection.unwrap().split(); let (mut client, receive, _) = ssb(read, write); current_thread::spawn(receive.map_err(|err| panic!("{:?}", err))); let (send_request, response) = client.whoami(); current_thread::spawn(send_request.map_err(|err| panic!("{:?}", err))); current_thread::spawn(response .map(|res| println!("{:?}", res)) .map_err(|err| panic!("{:?}", err)) .and_then(|_| client.close().map_err(|err| panic!("{:?}", err)))); })) });