use binary_sv2::{self, Deserialize, Serialize};
use codec_sv2::{Encoder, Error, StandardDecoder, StandardSv2Frame};
use framing_sv2::framing::Sv2Frame;
use std::{
convert::TryInto,
io::{Read, Write},
net::{TcpListener, TcpStream},
};
#[cfg(not(feature = "with_buffer_pool"))]
type Slice = Vec<u8>;
#[cfg(feature = "with_buffer_pool")]
type Slice = buffer_sv2::Slice;
const CUSTOM_MSG_TYPE: u8 = 0xff;
const TCP_ADDR: &str = "127.0.0.1:3333";
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CustomMessage {
nonce: u16,
}
fn main() {
let listener_receiver = TcpListener::bind(TCP_ADDR).expect("Failed to bind TCP listener");
let stream_sender: TcpStream =
TcpStream::connect(TCP_ADDR).expect("Failed to connect to TCP stream");
let stream_receiver: TcpStream = listener_receiver
.incoming()
.next()
.expect("Failed to accept incoming TCP stream")
.expect("Failed to connect to incoming TCP stream");
let nonce = 1337;
let msg = CustomMessage { nonce };
let msg_type = CUSTOM_MSG_TYPE;
let extension_type = 0;
let channel_msg = false;
sender_side(stream_sender, msg, msg_type, extension_type, channel_msg);
let mut decoded_frame = receiver_side(stream_receiver);
let decoded_frame_header = decoded_frame
.get_header()
.expect("Failed to get the frame header");
let decoded_msg: CustomMessage = binary_sv2::from_bytes(decoded_frame.payload())
.expect("Failed to extract the message from the payload");
assert_eq!(decoded_frame_header.msg_type(), CUSTOM_MSG_TYPE);
assert_eq!(decoded_msg.nonce, nonce);
}
fn sender_side(
mut stream_sender: TcpStream,
msg: CustomMessage,
msg_type: u8,
extension_type: u16,
channel_msg: bool,
) {
let frame =
StandardSv2Frame::<CustomMessage>::from_message(msg, msg_type, extension_type, channel_msg)
.expect("Failed to create the frame");
let mut encoder = Encoder::<CustomMessage>::new();
let encoded_frame = encoder
.encode(frame.clone())
.expect("Failed to encode the frame");
stream_sender
.write_all(encoded_frame.as_ref())
.expect("Failed to send the encoded frame");
}
fn receiver_side(mut stream_receiver: TcpStream) -> Sv2Frame<CustomMessage, Slice> {
let mut decoder = StandardDecoder::<CustomMessage>::new();
loop {
let decoder_buf = decoder.writable();
stream_receiver
.read_exact(decoder_buf)
.expect("Failed to read the encoded frame header");
match decoder.next_frame() {
Ok(decoded_frame) => {
return decoded_frame;
}
Err(Error::MissingBytes(_)) => {}
Err(_) => panic!("Failed to decode the frame"),
}
}
}