1#[cfg(feature = "encryption")]
2use crate::cfb8::CipherError;
3use crate::reader::{CraftReader, CraftSyncReader, ReadResult};
4use crate::wrapper::{CraftIo, CraftWrapper};
5use crate::writer::{CraftSyncWriter, CraftWriter, WriteResult};
6use mcproto_rs::protocol::{Packet, RawPacket, State, Id};
7#[cfg(feature = "gat")]
8use mcproto_rs::protocol::PacketKind;
9#[cfg(any(feature = "futures-io", feature = "tokio-io"))]
10use {
11 crate::{reader::CraftAsyncReader, writer::CraftAsyncWriter},
12 async_trait::async_trait,
13};
14
15pub struct CraftConnection<R, W> {
16 pub(crate) reader: CraftReader<R>,
17 pub(crate) writer: CraftWriter<W>,
18}
19
20impl<R, W> CraftWrapper<(R, W)> for CraftConnection<R, W> {
21 fn into_inner(self) -> (R, W) {
22 (self.reader.into_inner(), self.writer.into_inner())
23 }
24}
25
26impl<R, W> CraftIo for CraftConnection<R, W> {
27 fn set_state(&mut self, next: State) {
28 self.reader.set_state(next);
29 self.writer.set_state(next);
30 }
31
32 #[cfg(feature = "compression")]
33 fn set_compression_threshold(&mut self, threshold: Option<i32>) {
34 self.reader.set_compression_threshold(threshold);
35 self.writer.set_compression_threshold(threshold);
36 }
37
38 #[cfg(feature = "encryption")]
39 fn enable_encryption(&mut self, key: &[u8], iv: &[u8]) -> Result<(), CipherError> {
40 self.reader.enable_encryption(key, iv)?;
41 self.writer.enable_encryption(key, iv)?;
42 Ok(())
43 }
44
45 fn set_max_packet_size(&mut self, max_size: usize) {
46 self.reader.set_max_packet_size(max_size);
47 self.writer.set_max_packet_size(max_size);
48 }
49
50 fn ensure_buf_capacity(&mut self, capacity: usize) {
51 self.reader.ensure_buf_capacity(capacity);
52 self.writer.ensure_buf_capacity(capacity);
53 }
54
55 #[cfg(feature = "compression")]
56 fn ensure_compression_buf_capacity(&mut self, capacity: usize) {
57 self.reader.ensure_buf_capacity(capacity);
58 self.writer.ensure_buf_capacity(capacity);
59 }
60}
61
62impl<R, W> CraftSyncReader for CraftConnection<R, W>
63where
64 CraftReader<R>: CraftSyncReader,
65 CraftWriter<W>: CraftSyncWriter,
66{
67 #[cfg(not(feature = "gat"))]
68 fn read_packet<'a, P>(&'a mut self) -> ReadResult<<P as RawPacket<'a>>::Packet>
69 where
70 P: RawPacket<'a>,
71 {
72 self.reader.read_packet::<P>()
73 }
74
75 #[cfg(feature = "gat")]
76 fn read_packet<P>(&mut self) -> ReadResult<<P::RawPacket<'_> as RawPacket>::Packet>
77 where
78 P: PacketKind
79 {
80 self.reader.read_packet::<P>()
81 }
82
83 #[cfg(not(feature = "gat"))]
84 fn read_raw_packet<'a, P>(&'a mut self) -> ReadResult<P>
85 where
86 P: RawPacket<'a>,
87 {
88 self.reader.read_raw_packet::<P>()
89 }
90
91 #[cfg(feature = "gat")]
92 fn read_raw_packet<P>(&mut self) -> ReadResult<P::RawPacket<'_>>
93 where
94 P: PacketKind
95 {
96 self.reader.read_raw_packet::<P>()
97 }
98
99 fn read_raw_untyped_packet(&mut self) -> ReadResult<(Id, &[u8])> {
100 self.reader.read_raw_untyped_packet()
101 }
102}
103
104impl<R, W> CraftSyncWriter for CraftConnection<R, W>
105where
106 CraftReader<R>: CraftSyncReader,
107 CraftWriter<W>: CraftSyncWriter,
108{
109 fn write_packet<P>(&mut self, packet: P) -> WriteResult<()>
110 where
111 P: Packet,
112 {
113 self.writer.write_packet(packet)
114 }
115
116 fn write_raw_packet<'a, P>(&mut self, packet: P) -> WriteResult<()>
117 where
118 P: RawPacket<'a>,
119 {
120 self.writer.write_raw_packet(packet)
121 }
122}
123
124#[cfg(any(feature = "futures-io", feature = "tokio-io"))]
125#[async_trait]
126impl<R, W> CraftAsyncReader for CraftConnection<R, W>
127where
128 CraftReader<R>: CraftAsyncReader,
129 R: Send + Sync,
130 CraftWriter<W>: CraftAsyncWriter,
131 W: Send + Sync,
132{
133 #[cfg(not(feature = "gat"))]
134 async fn read_packet_async<'a, P>(&'a mut self) -> ReadResult<<P as RawPacket<'a>>::Packet>
135 where
136 P: RawPacket<'a>,
137 {
138 self.reader.read_packet_async::<P>().await
139 }
140
141 #[cfg(feature = "gat")]
142 async fn read_packet_async<P>(&mut self) -> ReadResult<<P::RawPacket<'_> as RawPacket<'_>>::Packet>
143 where
144 P: PacketKind
145 {
146 self.reader.read_packet_async::<P>().await
147 }
148
149 #[cfg(not(feature = "gat"))]
150 async fn read_raw_packet_async<'a, P>(&'a mut self) -> ReadResult<P>
151 where
152 P: RawPacket<'a>,
153 {
154 self.reader.read_raw_packet_async::<P>().await
155 }
156
157 #[cfg(feature = "gat")]
158 async fn read_raw_packet_async<P>(&mut self) -> ReadResult<P::RawPacket<'_>>
159 where
160 P: PacketKind
161 {
162 self.reader.read_raw_packet_async::<P>().await
163 }
164
165 async fn read_raw_untyped_packet_async(&mut self) -> ReadResult<(Id, &[u8])> {
166 self.reader.read_raw_untyped_packet_async().await
167 }
168}
169
170#[cfg(any(feature = "futures-io", feature = "tokio-io"))]
171#[async_trait]
172impl<R, W> CraftAsyncWriter for CraftConnection<R, W>
173where
174 CraftReader<R>: CraftAsyncReader,
175 R: Send + Sync,
176 CraftWriter<W>: CraftAsyncWriter,
177 W: Send + Sync,
178{
179 async fn write_packet_async<P>(&mut self, packet: P) -> WriteResult<()>
180 where
181 P: Packet + Send + Sync,
182 {
183 self.writer.write_packet_async(packet).await
184 }
185
186 async fn write_raw_packet_async<'a, P>(&mut self, packet: P) -> WriteResult<()>
187 where
188 P: RawPacket<'a> + Send + Sync,
189 {
190 self.writer.write_raw_packet_async(packet).await
191 }
192}
193
194impl<R, W> CraftConnection<R, W> {
195 pub fn into_split(self) -> (CraftReader<R>, CraftWriter<W>) {
196 (self.reader, self.writer)
197 }
198
199 pub fn split(&mut self) -> (&mut CraftReader<R>, &mut CraftWriter<W>) {
200 (&mut self.reader, &mut self.writer)
201 }
202}