mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Add LZ Dictionaries to the initial Participant stream negotiation.
This commit is contained in:
parent
64e4aabd9f
commit
fb0838e2c2
@ -17,6 +17,7 @@ pub enum ProtocolEvent {
|
|||||||
prio: Prio,
|
prio: Prio,
|
||||||
promises: Promises,
|
promises: Promises,
|
||||||
guaranteed_bandwidth: Bandwidth,
|
guaranteed_bandwidth: Bandwidth,
|
||||||
|
lz_dictionary: Vec<u8>,
|
||||||
},
|
},
|
||||||
CloseStream {
|
CloseStream {
|
||||||
sid: Sid,
|
sid: Sid,
|
||||||
@ -36,11 +37,13 @@ impl ProtocolEvent {
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
} => OTFrame::OpenStream {
|
} => OTFrame::OpenStream {
|
||||||
sid: *sid,
|
sid: *sid,
|
||||||
prio: *prio,
|
prio: *prio,
|
||||||
promises: *promises,
|
promises: *promises,
|
||||||
guaranteed_bandwidth: *guaranteed_bandwidth,
|
guaranteed_bandwidth: *guaranteed_bandwidth,
|
||||||
|
lz_dictionary: lz_dictionary.clone(),
|
||||||
},
|
},
|
||||||
ProtocolEvent::CloseStream { sid } => OTFrame::CloseStream { sid: *sid },
|
ProtocolEvent::CloseStream { sid } => OTFrame::CloseStream { sid: *sid },
|
||||||
ProtocolEvent::Message { .. } => {
|
ProtocolEvent::Message { .. } => {
|
||||||
|
@ -39,6 +39,7 @@ pub enum OTFrame {
|
|||||||
prio: Prio,
|
prio: Prio,
|
||||||
promises: Promises,
|
promises: Promises,
|
||||||
guaranteed_bandwidth: Bandwidth,
|
guaranteed_bandwidth: Bandwidth,
|
||||||
|
lz_dictionary: Vec<u8>,
|
||||||
},
|
},
|
||||||
CloseStream {
|
CloseStream {
|
||||||
sid: Sid,
|
sid: Sid,
|
||||||
@ -64,6 +65,7 @@ pub enum ITFrame {
|
|||||||
prio: Prio,
|
prio: Prio,
|
||||||
promises: Promises,
|
promises: Promises,
|
||||||
guaranteed_bandwidth: Bandwidth,
|
guaranteed_bandwidth: Bandwidth,
|
||||||
|
lz_dictionary: Vec<u8>,
|
||||||
},
|
},
|
||||||
CloseStream {
|
CloseStream {
|
||||||
sid: Sid,
|
sid: Sid,
|
||||||
@ -163,7 +165,7 @@ pub(crate) const TCP_CLOSE_STREAM_CNS: usize = 8;
|
|||||||
/// const part of the DATA frame, actual size is variable
|
/// const part of the DATA frame, actual size is variable
|
||||||
pub(crate) const TCP_DATA_CNS: usize = 10;
|
pub(crate) const TCP_DATA_CNS: usize = 10;
|
||||||
pub(crate) const TCP_DATA_HEADER_CNS: usize = 24;
|
pub(crate) const TCP_DATA_HEADER_CNS: usize = 24;
|
||||||
pub(crate) const TCP_OPEN_STREAM_CNS: usize = 18;
|
pub(crate) const TCP_OPEN_STREAM_CNS: usize = 20;
|
||||||
// Size WITHOUT the 1rst indicating byte
|
// Size WITHOUT the 1rst indicating byte
|
||||||
pub(crate) const TCP_SHUTDOWN_CNS: usize = 0;
|
pub(crate) const TCP_SHUTDOWN_CNS: usize = 0;
|
||||||
|
|
||||||
@ -178,12 +180,17 @@ impl OTFrame {
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
} => {
|
} => {
|
||||||
bytes.put_u8(FRAME_OPEN_STREAM);
|
bytes.put_u8(FRAME_OPEN_STREAM);
|
||||||
sid.to_bytes(bytes);
|
sid.to_bytes(bytes);
|
||||||
bytes.put_u8(prio);
|
bytes.put_u8(prio);
|
||||||
bytes.put_u8(promises.to_le_bytes()[0]);
|
bytes.put_u8(promises.to_le_bytes()[0]);
|
||||||
bytes.put_u64_le(guaranteed_bandwidth);
|
bytes.put_u64_le(guaranteed_bandwidth);
|
||||||
|
let lz_wire_length = lz_dictionary.len().min(0xffff);
|
||||||
|
bytes.put_u16_le(lz_wire_length as u16);
|
||||||
|
bytes.reserve(lz_wire_length);
|
||||||
|
bytes.extend_from_slice(&lz_dictionary[0..lz_wire_length]);
|
||||||
},
|
},
|
||||||
Self::CloseStream { sid } => {
|
Self::CloseStream { sid } => {
|
||||||
bytes.put_u8(FRAME_CLOSE_STREAM);
|
bytes.put_u8(FRAME_CLOSE_STREAM);
|
||||||
@ -213,7 +220,12 @@ impl ITFrame {
|
|||||||
};
|
};
|
||||||
let size = match frame_no {
|
let size = match frame_no {
|
||||||
FRAME_SHUTDOWN => TCP_SHUTDOWN_CNS,
|
FRAME_SHUTDOWN => TCP_SHUTDOWN_CNS,
|
||||||
FRAME_OPEN_STREAM => TCP_OPEN_STREAM_CNS,
|
FRAME_OPEN_STREAM => {
|
||||||
|
if bytes.len() < TCP_OPEN_STREAM_CNS {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
u16::from_le_bytes([bytes[18], bytes[19]]) as usize + TCP_OPEN_STREAM_CNS
|
||||||
|
},
|
||||||
FRAME_CLOSE_STREAM => TCP_CLOSE_STREAM_CNS,
|
FRAME_CLOSE_STREAM => TCP_CLOSE_STREAM_CNS,
|
||||||
FRAME_DATA_HEADER => TCP_DATA_HEADER_CNS,
|
FRAME_DATA_HEADER => TCP_DATA_HEADER_CNS,
|
||||||
FRAME_DATA => {
|
FRAME_DATA => {
|
||||||
@ -242,6 +254,12 @@ impl ITFrame {
|
|||||||
prio: bytes.get_u8(),
|
prio: bytes.get_u8(),
|
||||||
promises: Promises::from_bits_truncate(bytes.get_u8()),
|
promises: Promises::from_bits_truncate(bytes.get_u8()),
|
||||||
guaranteed_bandwidth: bytes.get_u64_le(),
|
guaranteed_bandwidth: bytes.get_u64_le(),
|
||||||
|
lz_dictionary: {
|
||||||
|
let lz_wire_length = bytes.get_u16_le();
|
||||||
|
let mut lz_dictionary = Vec::with_capacity(lz_wire_length as usize);
|
||||||
|
bytes.copy_to_slice(&mut lz_dictionary[..]);
|
||||||
|
lz_dictionary
|
||||||
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
FRAME_CLOSE_STREAM => {
|
FRAME_CLOSE_STREAM => {
|
||||||
@ -284,11 +302,13 @@ impl PartialEq<ITFrame> for OTFrame {
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
} => matches!(other, ITFrame::OpenStream {
|
} => matches!(other, ITFrame::OpenStream {
|
||||||
sid,
|
sid,
|
||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
}),
|
}),
|
||||||
Self::CloseStream { sid } => matches!(other, ITFrame::CloseStream { sid }),
|
Self::CloseStream { sid } => matches!(other, ITFrame::CloseStream { sid }),
|
||||||
Self::DataHeader { mid, sid, length } => {
|
Self::DataHeader { mid, sid, length } => {
|
||||||
@ -325,6 +345,7 @@ mod tests {
|
|||||||
prio: 14,
|
prio: 14,
|
||||||
promises: Promises::GUARANTEED_DELIVERY,
|
promises: Promises::GUARANTEED_DELIVERY,
|
||||||
guaranteed_bandwidth: 1_000_000,
|
guaranteed_bandwidth: 1_000_000,
|
||||||
|
lz_dictionary: Vec::new(),
|
||||||
},
|
},
|
||||||
OTFrame::DataHeader {
|
OTFrame::DataHeader {
|
||||||
sid: Sid::new(1337),
|
sid: Sid::new(1337),
|
||||||
@ -499,6 +520,7 @@ mod tests {
|
|||||||
promises: Promises::ENCRYPTED,
|
promises: Promises::ENCRYPTED,
|
||||||
prio: 88,
|
prio: 88,
|
||||||
guaranteed_bandwidth: 1_000_000,
|
guaranteed_bandwidth: 1_000_000,
|
||||||
|
lz_dictionary: Vec::new(),
|
||||||
};
|
};
|
||||||
OTFrame::write_bytes(frame1, &mut buffer);
|
OTFrame::write_bytes(frame1, &mut buffer);
|
||||||
}
|
}
|
||||||
@ -512,6 +534,7 @@ mod tests {
|
|||||||
promises: Promises::ENCRYPTED,
|
promises: Promises::ENCRYPTED,
|
||||||
prio: 88,
|
prio: 88,
|
||||||
guaranteed_bandwidth: 1_000_000,
|
guaranteed_bandwidth: 1_000_000,
|
||||||
|
lz_dictionary: Vec::new(),
|
||||||
};
|
};
|
||||||
OTFrame::write_bytes(frame1, &mut buffer);
|
OTFrame::write_bytes(frame1, &mut buffer);
|
||||||
buffer.truncate(6); // simulate partial retrieve
|
buffer.truncate(6); // simulate partial retrieve
|
||||||
|
@ -15,6 +15,7 @@ struct StreamInfo {
|
|||||||
pub(crate) guaranteed_bandwidth: Bandwidth,
|
pub(crate) guaranteed_bandwidth: Bandwidth,
|
||||||
pub(crate) prio: Prio,
|
pub(crate) prio: Prio,
|
||||||
pub(crate) promises: Promises,
|
pub(crate) promises: Promises,
|
||||||
|
pub(crate) lz_dictionary: Vec<u8>,
|
||||||
pub(crate) messages: VecDeque<OTMessage>,
|
pub(crate) messages: VecDeque<OTMessage>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,11 +45,13 @@ impl PrioManager {
|
|||||||
prio: Prio,
|
prio: Prio,
|
||||||
promises: Promises,
|
promises: Promises,
|
||||||
guaranteed_bandwidth: Bandwidth,
|
guaranteed_bandwidth: Bandwidth,
|
||||||
|
lz_dictionary: Vec<u8>,
|
||||||
) {
|
) {
|
||||||
self.streams.insert(sid, StreamInfo {
|
self.streams.insert(sid, StreamInfo {
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
|
lz_dictionary,
|
||||||
messages: VecDeque::new(),
|
messages: VecDeque::new(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -99,9 +99,10 @@ where
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
} => {
|
} => {
|
||||||
self.store
|
self.store
|
||||||
.open_stream(sid, prio, promises, guaranteed_bandwidth);
|
.open_stream(sid, prio, promises, guaranteed_bandwidth, lz_dictionary);
|
||||||
},
|
},
|
||||||
ProtocolEvent::CloseStream { sid } => {
|
ProtocolEvent::CloseStream { sid } => {
|
||||||
if !self.store.try_close_stream(sid) {
|
if !self.store.try_close_stream(sid) {
|
||||||
@ -123,9 +124,15 @@ where
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
ref lz_dictionary,
|
||||||
} => {
|
} => {
|
||||||
self.store
|
self.store.open_stream(
|
||||||
.open_stream(sid, prio, promises, guaranteed_bandwidth);
|
sid,
|
||||||
|
prio,
|
||||||
|
promises,
|
||||||
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary.clone(),
|
||||||
|
);
|
||||||
event.to_frame().write_bytes(&mut self.buffer);
|
event.to_frame().write_bytes(&mut self.buffer);
|
||||||
self.drain.send(self.buffer.split()).await?;
|
self.drain.send(self.buffer.split()).await?;
|
||||||
},
|
},
|
||||||
@ -228,12 +235,14 @@ where
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
} => {
|
} => {
|
||||||
break 'outer Ok(ProtocolEvent::OpenStream {
|
break 'outer Ok(ProtocolEvent::OpenStream {
|
||||||
sid,
|
sid,
|
||||||
prio: prio.min(crate::types::HIGHEST_PRIO),
|
prio: prio.min(crate::types::HIGHEST_PRIO),
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
ITFrame::CloseStream { sid } => {
|
ITFrame::CloseStream { sid } => {
|
||||||
|
@ -72,6 +72,7 @@ pub struct Stream {
|
|||||||
prio: Prio,
|
prio: Prio,
|
||||||
promises: Promises,
|
promises: Promises,
|
||||||
guaranteed_bandwidth: Bandwidth,
|
guaranteed_bandwidth: Bandwidth,
|
||||||
|
lz_dictionary: Vec<u8>,
|
||||||
send_closed: Arc<AtomicBool>,
|
send_closed: Arc<AtomicBool>,
|
||||||
a2b_msg_s: crossbeam_channel::Sender<(Sid, Bytes)>,
|
a2b_msg_s: crossbeam_channel::Sender<(Sid, Bytes)>,
|
||||||
b2a_msg_recv_r: Option<async_channel::Receiver<Bytes>>,
|
b2a_msg_recv_r: Option<async_channel::Receiver<Bytes>>,
|
||||||
@ -551,6 +552,7 @@ impl Participant {
|
|||||||
prio: u8,
|
prio: u8,
|
||||||
promises: Promises,
|
promises: Promises,
|
||||||
bandwidth: Bandwidth,
|
bandwidth: Bandwidth,
|
||||||
|
lz_dictionary: Vec<u8>,
|
||||||
) -> Result<Stream, ParticipantError> {
|
) -> Result<Stream, ParticipantError> {
|
||||||
debug_assert!(prio <= network_protocol::HIGHEST_PRIO, "invalid prio");
|
debug_assert!(prio <= network_protocol::HIGHEST_PRIO, "invalid prio");
|
||||||
let (p2a_return_stream_s, p2a_return_stream_r) = oneshot::channel::<Stream>();
|
let (p2a_return_stream_s, p2a_return_stream_r) = oneshot::channel::<Stream>();
|
||||||
@ -559,6 +561,7 @@ impl Participant {
|
|||||||
promises,
|
promises,
|
||||||
bandwidth,
|
bandwidth,
|
||||||
p2a_return_stream_s,
|
p2a_return_stream_s,
|
||||||
|
lz_dictionary,
|
||||||
)) {
|
)) {
|
||||||
debug!(?e, "bParticipant is already closed, notifying");
|
debug!(?e, "bParticipant is already closed, notifying");
|
||||||
return Err(ParticipantError::ParticipantDisconnected);
|
return Err(ParticipantError::ParticipantDisconnected);
|
||||||
@ -728,6 +731,7 @@ impl Stream {
|
|||||||
prio: Prio,
|
prio: Prio,
|
||||||
promises: Promises,
|
promises: Promises,
|
||||||
guaranteed_bandwidth: Bandwidth,
|
guaranteed_bandwidth: Bandwidth,
|
||||||
|
lz_dictionary: Vec<u8>,
|
||||||
send_closed: Arc<AtomicBool>,
|
send_closed: Arc<AtomicBool>,
|
||||||
a2b_msg_s: crossbeam_channel::Sender<(Sid, Bytes)>,
|
a2b_msg_s: crossbeam_channel::Sender<(Sid, Bytes)>,
|
||||||
b2a_msg_recv_r: async_channel::Receiver<Bytes>,
|
b2a_msg_recv_r: async_channel::Receiver<Bytes>,
|
||||||
@ -740,6 +744,7 @@ impl Stream {
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
send_closed,
|
send_closed,
|
||||||
a2b_msg_s,
|
a2b_msg_s,
|
||||||
b2a_msg_recv_r: Some(b2a_msg_recv_r),
|
b2a_msg_recv_r: Some(b2a_msg_recv_r),
|
||||||
|
@ -25,7 +25,7 @@ use tokio::{
|
|||||||
use tokio_stream::wrappers::UnboundedReceiverStream;
|
use tokio_stream::wrappers::UnboundedReceiverStream;
|
||||||
use tracing::*;
|
use tracing::*;
|
||||||
|
|
||||||
pub(crate) type A2bStreamOpen = (Prio, Promises, Bandwidth, oneshot::Sender<Stream>);
|
pub(crate) type A2bStreamOpen = (Prio, Promises, Bandwidth, oneshot::Sender<Stream>, Vec<u8>);
|
||||||
pub(crate) type S2bCreateChannel = (Cid, Sid, Protocols, oneshot::Sender<()>);
|
pub(crate) type S2bCreateChannel = (Cid, Sid, Protocols, oneshot::Sender<()>);
|
||||||
pub(crate) type S2bShutdownBparticipant = (Duration, oneshot::Sender<Result<(), ParticipantError>>);
|
pub(crate) type S2bShutdownBparticipant = (Duration, oneshot::Sender<Result<(), ParticipantError>>);
|
||||||
pub(crate) type B2sPrioStatistic = (Pid, u64, u64);
|
pub(crate) type B2sPrioStatistic = (Pid, u64, u64);
|
||||||
@ -225,12 +225,19 @@ impl BParticipant {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let active_err = async {
|
let active_err = async {
|
||||||
if let Some((prio, promises, guaranteed_bandwidth, return_s)) = open {
|
if let Some((prio, promises, guaranteed_bandwidth, return_s, lz_dictionary)) = open
|
||||||
|
{
|
||||||
let sid = stream_ids;
|
let sid = stream_ids;
|
||||||
trace!(?sid, "open stream");
|
trace!(?sid, "open stream");
|
||||||
stream_ids += Sid::from(1);
|
stream_ids += Sid::from(1);
|
||||||
let stream = self
|
let stream = self
|
||||||
.create_stream(sid, prio, promises, guaranteed_bandwidth)
|
.create_stream(
|
||||||
|
sid,
|
||||||
|
prio,
|
||||||
|
promises,
|
||||||
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary.clone(),
|
||||||
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
let event = ProtocolEvent::OpenStream {
|
let event = ProtocolEvent::OpenStream {
|
||||||
@ -238,6 +245,7 @@ impl BParticipant {
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
};
|
};
|
||||||
|
|
||||||
return_s.send(stream).unwrap();
|
return_s.send(stream).unwrap();
|
||||||
@ -388,13 +396,15 @@ impl BParticipant {
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
ref lz_dictionary,
|
||||||
}) => {
|
}) => {
|
||||||
trace!(?sid, "open stream");
|
trace!(?sid, "open stream");
|
||||||
|
let lz_dictionary = lz_dictionary.clone();
|
||||||
let _ = b2b_notify_send_of_recv_s.send(r.unwrap());
|
let _ = b2b_notify_send_of_recv_s.send(r.unwrap());
|
||||||
// waiting for receiving is not necessary, because the send_mgr will first
|
// waiting for receiving is not necessary, because the send_mgr will first
|
||||||
// process this before process messages!
|
// process this before process messages!
|
||||||
let stream = self
|
let stream = self
|
||||||
.create_stream(sid, prio, promises, guaranteed_bandwidth)
|
.create_stream(sid, prio, promises, guaranteed_bandwidth, lz_dictionary)
|
||||||
.await;
|
.await;
|
||||||
b2a_stream_opened_s.send(stream).unwrap();
|
b2a_stream_opened_s.send(stream).unwrap();
|
||||||
retrigger(cid, p, &mut recv_protocols);
|
retrigger(cid, p, &mut recv_protocols);
|
||||||
@ -616,6 +626,7 @@ impl BParticipant {
|
|||||||
prio: Prio,
|
prio: Prio,
|
||||||
promises: Promises,
|
promises: Promises,
|
||||||
guaranteed_bandwidth: Bandwidth,
|
guaranteed_bandwidth: Bandwidth,
|
||||||
|
lz_dictionary: Vec<u8>,
|
||||||
) -> Stream {
|
) -> Stream {
|
||||||
let (b2a_msg_recv_s, b2a_msg_recv_r) = async_channel::unbounded::<Bytes>();
|
let (b2a_msg_recv_s, b2a_msg_recv_r) = async_channel::unbounded::<Bytes>();
|
||||||
let send_closed = Arc::new(AtomicBool::new(false));
|
let send_closed = Arc::new(AtomicBool::new(false));
|
||||||
@ -651,6 +662,7 @@ impl BParticipant {
|
|||||||
prio,
|
prio,
|
||||||
promises,
|
promises,
|
||||||
guaranteed_bandwidth,
|
guaranteed_bandwidth,
|
||||||
|
lz_dictionary,
|
||||||
send_closed,
|
send_closed,
|
||||||
a2b_msg_s,
|
a2b_msg_s,
|
||||||
b2a_msg_recv_r,
|
b2a_msg_recv_r,
|
||||||
|
@ -100,12 +100,12 @@ impl ConnectionHandler {
|
|||||||
let reliable = Promises::ORDERED | Promises::CONSISTENCY;
|
let reliable = Promises::ORDERED | Promises::CONSISTENCY;
|
||||||
let reliablec = reliable | Promises::COMPRESSED;
|
let reliablec = reliable | Promises::COMPRESSED;
|
||||||
|
|
||||||
let general_stream = participant.open(3, reliablec, 500).await?;
|
let general_stream = participant.open(3, reliablec, 500, Vec::new()).await?;
|
||||||
let ping_stream = participant.open(2, reliable, 500).await?;
|
let ping_stream = participant.open(2, reliable, 500, Vec::new()).await?;
|
||||||
let mut register_stream = participant.open(3, reliablec, 500).await?;
|
let mut register_stream = participant.open(3, reliablec, 500, Vec::new()).await?;
|
||||||
let character_screen_stream = participant.open(3, reliablec, 500).await?;
|
let character_screen_stream = participant.open(3, reliablec, 500, Vec::new()).await?;
|
||||||
let in_game_stream = participant.open(3, reliablec, 100_000).await?;
|
let in_game_stream = participant.open(3, reliablec, 100_000, Vec::new()).await?;
|
||||||
let terrain_stream = participant.open(4, reliablec, 20_000).await?;
|
let terrain_stream = participant.open(4, reliablec, 20_000, Vec::new()).await?;
|
||||||
|
|
||||||
let server_data = receiver.recv()?;
|
let server_data = receiver.recv()?;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user