#[macro_use]
extern crate futures;
use futures::{future, FutureExt, StreamExt, TryStreamExt};
use ipfs_api::IpfsClient;
use std::time::Duration;
use tokio::time;
static TOPIC: &'static str = "test";
fn get_client() -> IpfsClient {
eprintln!("connecting to localhost:5001...");
IpfsClient::default()
}
#[cfg_attr(feature = "with-actix", actix_rt::main)]
#[cfg_attr(feature = "with-hyper", tokio::main)]
async fn main() {
eprintln!("note: ipfs must be run with the --enable-pubsub-experiment flag");
let publish_client = get_client();
let mut publish = time::interval(Duration::from_secs(1))
.then(|_| future::ok(())) .try_for_each(|_| {
eprintln!();
eprintln!("publishing message...");
publish_client
.pubsub_pub(TOPIC, "Hello World!")
.boxed_local()
})
.boxed_local()
.fuse();
let mut subscribe = {
let client = get_client();
client
.pubsub_sub(TOPIC, false)
.take(5)
.try_for_each(|msg| {
eprintln!();
eprintln!("received ({:?})", msg);
future::ok(())
})
.fuse()
};
eprintln!();
eprintln!("publish messages to ({})...", TOPIC);
eprintln!("waiting for messages from ({})...", TOPIC);
select! {
res = publish => if let Err(e) = res {
eprintln!("error publishing messages: {}", e);
},
res = subscribe => match res {
Ok(_) => eprintln!("done reading messages..."),
Err(e) => eprintln!("error reading messages: {}", e)
},
}
}