@@ -119,6 +119,102 @@ impl Serialize for SerializedPacket {
119119 }
120120}
121121
122+ #[ derive( Debug , Clone ) ]
123+ pub struct SerializedPacketCompressed {
124+ pub length : usize ,
125+ pub data_length : usize ,
126+ pub id : Compress < super :: VarInt , Zlib > ,
127+ pub data : Compress < Bytes , Zlib > ,
128+ }
129+
130+ impl SerializedPacketCompressed {
131+ pub fn new < P : Packet + Serialize > ( packet : P ) -> Result < Self , Error > {
132+ Self :: new_ref ( & packet)
133+ }
134+
135+ pub fn new_ref < P : Packet + Serialize + ?Sized > ( packet : & P ) -> Result < Self , Error > {
136+ try {
137+ let data = packet. serialize ( ) ?;
138+ let id = P :: ID ;
139+ let data_length = id. length_of ( ) + data. len ( ) ;
140+ let datalength = VarInt :: < i32 > ( data_length. try_into ( ) . unwrap ( ) ) ;
141+ let length = datalength. length_of ( ) + Compress ( datalength, Zlib ) . serialize ( ) ?. len ( ) ;
142+ Self {
143+ length,
144+ data_length,
145+ id : Compress ( id, Zlib ) ,
146+ data : Compress ( data, Zlib ) ,
147+ }
148+ }
149+ }
150+
151+ pub fn try_deserialize < P : Packet + Deserialize < Context = PacketContext > > (
152+ & self ,
153+ state : State ,
154+ ) -> Result < P , Error > {
155+ let context = PacketContext {
156+ id : self . id . 0 ,
157+ state,
158+ } ;
159+
160+ P :: deserialize
161+ . parse_with_context ( self . data . 0 . as_ref ( ) , context)
162+ . map_err ( |e| match e {
163+ Error :: Ser ( error) => Error :: SerSrc ( WithSource {
164+ source : BytesSource :: new (
165+ self . data . 0 . clone ( ) ,
166+ Some ( format ! ( "packet_0x{:x}.bin" , self . id. 0 . 0 ) ) ,
167+ ) ,
168+ span : error. span ,
169+ kind : error. kind ,
170+ } ) ,
171+ e => e,
172+ } )
173+ }
174+ }
175+
176+ impl Deserialize for SerializedPacketCompressed {
177+ #[ parser( extras = "Extra<Self::Context>" ) ]
178+ fn deserialize ( input : & [ u8 ] ) -> Self {
179+ try {
180+ let packet_length_varint = VarInt :: < i32 > :: deserialize ( input) ?;
181+ assert ! ( packet_length_varint. 0 >= 0 ) ;
182+ let packet_length = packet_length_varint. 0 as usize ;
183+ let data_length_varint = VarInt :: < i32 > :: deserialize ( input) ?;
184+ assert ! ( data_length_varint. 0 >= 0 ) ;
185+ let data_length = data_length_varint. 0 as usize ;
186+ let id: Compress < VarInt < i32 > , Zlib > = Compress :: decompress ( Bytes :: copy_from_slice (
187+ input. input . slice_from ( input. offset ..) ,
188+ ) ) ?;
189+ let data = Compress :: decompress ( Bytes :: from (
190+ take ( data_length - id. 0 . length_of ( ) ) . parse_with ( input) ?,
191+ ) ) ?;
192+ Self {
193+ length : packet_length,
194+ data_length,
195+ id,
196+ data,
197+ }
198+ }
199+ }
200+ }
201+
202+ impl Serialize for SerializedPacketCompressed {
203+ fn serialize_to ( & self , buf : & mut BytesMut ) -> Result < ( ) , Error > {
204+ let length = VarInt :: < i32 > ( self . length . try_into ( ) . map_err ( |_| Error :: VarIntTooBig ) ?) ;
205+ length. serialize_to ( buf) ?;
206+ let data_length = VarInt :: < i32 > (
207+ self . data_length
208+ . try_into ( )
209+ . map_err ( |_| Error :: VarIntTooBig ) ?,
210+ ) ;
211+ data_length. serialize_to ( buf) ?;
212+ self . id . serialize_to ( buf) ?;
213+ self . data . serialize_to ( buf) ?;
214+ Ok ( ( ) )
215+ }
216+ }
217+
122218#[ derive( Debug , Clone ) ]
123219pub struct PluginMessage {
124220 pub channel : Identifier ,
0 commit comments