Skip to main content

ethrex_p2p/discv4/
codec.rs

1use crate::discv4::messages::{Message, Packet, PacketDecodeErr};
2
3use bytes::BytesMut;
4use secp256k1::SecretKey;
5use tokio_util::codec::{Decoder, Encoder};
6
7#[derive(Debug)]
8pub struct Discv4Codec {
9    signer: SecretKey,
10}
11
12impl Discv4Codec {
13    pub fn new(signer: SecretKey) -> Self {
14        Self { signer }
15    }
16}
17
18impl Decoder for Discv4Codec {
19    type Item = Packet;
20    type Error = PacketDecodeErr;
21
22    fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
23        if !buf.is_empty() {
24            Ok(Some(Packet::decode(&buf.split_to(buf.len()))?))
25        } else {
26            Ok(None)
27        }
28    }
29}
30
31impl Encoder<Message> for Discv4Codec {
32    type Error = PacketDecodeErr;
33
34    fn encode(&mut self, message: Message, buf: &mut BytesMut) -> Result<(), Self::Error> {
35        message.encode_with_header(buf, &self.signer);
36        Ok(())
37    }
38}