diff --git a/Cargo.lock b/Cargo.lock index cc01296146..d4d5176172 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -941,6 +941,7 @@ dependencies = [ "reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "sfw-provider-requests 0.1.0", "sphinx 0.1.0", "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1402,6 +1403,13 @@ dependencies = [ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sfw-provider-requests" +version = "0.1.0" +dependencies = [ + "sphinx 0.1.0", +] + [[package]] name = "sha2" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 7125852925..b745efc446 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,8 @@ pem = "0.7.0" reqwest = "0.9.22" serde = { version = "1.0", features = ["derive"] } sphinx = { path = "../sphinx" } +sfw-provider-requests = { path = "../nym-sfw-provider/sfw-provider-requests" } + tokio = { version = "0.2", features = ["full"] } [dev-dependencies] diff --git a/src/clients/provider.rs b/src/clients/provider.rs index e69de29bb2..fbf644b58c 100644 --- a/src/clients/provider.rs +++ b/src/clients/provider.rs @@ -0,0 +1,47 @@ +use sphinx::route::Node as MixNode; +use sphinx::SphinxPacket; +use tokio::prelude::*; +use sfw_provider_requests::*; +use std::net::Shutdown; +use std::time::Duration; +use sfw_provider_requests::requests::{PullRequest, ProviderRequest}; +use sfw_provider_requests::responses::{PullResponse, ProviderResponse}; + +pub struct ProviderClient {} + + +impl ProviderClient { + pub fn new() -> Self { + ProviderClient {} + } + + pub async fn retrieve_messages( + &self, +// provider: &MixNode, + ) -> Result<(), Box> { + let address = [42; 32]; + let pull_request = PullRequest::new(address); + let bytes = pull_request.to_bytes(); + + let mut socket = tokio::net::TcpStream::connect("127.0.0.1:9000").await?; + println!("keep alive: {:?}", socket.keepalive()); + socket.set_keepalive(Some(tokio::time::Duration::from_secs(2))); + socket.write_all(&bytes[..]).await?; + if let Err(e) = socket.shutdown(Shutdown::Write) { + eprintln!("failed to close write part of the socket; err = {:?}", e) + } + + let mut response = Vec::new(); + socket.read_to_end(&mut response).await?; + if let Err(e) = socket.shutdown(Shutdown::Read) { + eprintln!("failed to close read part of the socket; err = {:?}", e) + } + + println!("Received the following response: {:?}", response); + let parsed_response = PullResponse::from_bytes(&response).unwrap(); + for message in parsed_response.messages { + println!("Received: {:?}", String::from_utf8(message).unwrap()) + } + Ok(()) + } +} diff --git a/src/commands/run.rs b/src/commands/run.rs index 0ce7a25f79..aa6cd27ce4 100644 --- a/src/commands/run.rs +++ b/src/commands/run.rs @@ -3,6 +3,7 @@ use crate::clients::directory::presence::{MixNodePresence, Topology}; use crate::clients::directory::requests::presence_topology_get::PresenceTopologyGetRequester; use crate::clients::directory::DirectoryClient; use crate::clients::mix::MixClient; +use crate::clients::provider::ProviderClient; use crate::utils::bytes; use base64; use clap::ArgMatches; @@ -35,7 +36,7 @@ pub fn execute(matches: &ArgMatches) { interval.tick().await; let message = format!("Hello, Sphinx {}", i).as_bytes().to_vec(); - let route_len = 3; + let route_len = 2; // data needed to generate a new Sphinx packet let route = route_from(&topology, route_len); @@ -51,6 +52,14 @@ pub fn execute(matches: &ArgMatches) { let result = mix_client.send(packet, route.first().unwrap()).await; println!("packet sent: {:?}", i); i += 1; + + // retrieve messages every now and then + if i % 3 == 0 { + interval.tick().await; + println!("going to retrieve messages!"); + let provider_client = ProviderClient::new(); + provider_client.retrieve_messages().await.unwrap(); + } } }) } @@ -76,10 +85,13 @@ fn route_from(topology: &Topology, route_len: usize) -> Vec { let decoded_key_bytes = base64::decode_config(&mix.pub_key, base64::URL_SAFE).unwrap(); let key_bytes = bytes::zero_pad_to_32(decoded_key_bytes); let key = MontgomeryPoint(key_bytes); - let sphinx_node = SphinxNode { + let mut sphinx_node = SphinxNode { address: address_bytes, pub_key: key, }; + + // temporary to make it work locally: + sphinx_node.pub_key = Default::default(); route.push(sphinx_node); } route @@ -88,7 +100,7 @@ fn route_from(topology: &Topology, route_len: usize) -> Vec { // TODO: where do we retrieve this guy from? fn get_destination() -> Destination { Destination { - address: [0u8; 32], - identifier: [0u8; 16], + address: [42u8; 32], + identifier: [1u8; 16], } }