1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use std::io;
use std::net::SocketAddr;
use std::time::Duration;

use futures::stream::{SplitSink, SplitStream};
use futures::Future;
use tokio::codec::{Decoder, Framed};
use tokio::net::TcpStream;
use meilies::reqresp::ClientCodec;
use log::warn;

mod sub;
mod paired;
mod steel_connection;

pub use self::sub::{sub_connect, SubStream, SubController, ProtocolError};
pub use self::paired::{paired_connect, PairedConnection};
use self::steel_connection::{retry_strategy, SteelConnection};

pub type ClientConnection = Framed<TcpStream, ClientCodec>;
pub type ClientConnectionWriter = SplitSink<Framed<TcpStream, ClientCodec>>;
pub type ClientConnectionReader = SplitStream<Framed<TcpStream, ClientCodec>>;

/// Open a framed connection with a server using RESP
pub fn connect(addr: &SocketAddr) -> impl Future<Item=ClientConnection, Error=io::Error> {
    TcpStream::connect(addr)
        .map(|socket| {
            let duration = Duration::from_millis(50);
            if let Err(e) = socket.set_keepalive(Some(duration)) {
                warn!("set_keepalive error; {}", e);
            }

            ClientCodec::default().framed(socket)
        })
}