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
36
37
38
39
40
41
42
43
use std::net::SocketAddr;
use tokio::net::TcpListener;

use crate::actor::prelude::*;
use crate::traits::actor::RPCBridgeActor;

mod listen;
mod request;
mod response;
mod rpc;
mod session;

use listen::{RPCListenActor, RPCTcpConnectMessage};
pub use rpc::RPCActor;

pub fn rpc_start<A: RPCBridgeActor>(rpc_socket: SocketAddr) -> Addr<RPCActor<A>> {
    // start rpc actor
    let rpc_addr = RPCActor::create(|ctx: &mut Context<RPCActor<A>>| {
        ctx.set_mailbox_capacity(100);
        RPCActor::load()
    });

    // listen RPC TCP socket
    let listener =
        TcpListener::bind(&rpc_socket).expect(&format!("RPC Socket bind: {} fail!", rpc_socket));

    let new_rpc_addr = rpc_addr.clone();

    println!("DEBUG: RPC listen: {}", rpc_socket);
    // start rpc session actor
    RPCListenActor::create(|ctx| {
        ctx.set_mailbox_capacity(100);
        ctx.add_message_stream(listener.incoming().map_err(|_| ()).map(|st| {
            let addr = st.peer_addr().unwrap();
            RPCTcpConnectMessage(st, addr)
        }));
        RPCListenActor {
            rpc_addr: new_rpc_addr,
        }
    });

    rpc_addr
}