diff --git a/src/transport/websocket/stream.rs b/src/transport/websocket/stream.rs index 268d39e1..2dd20091 100644 --- a/src/transport/websocket/stream.rs +++ b/src/transport/websocket/stream.rs @@ -33,6 +33,8 @@ use std::{ // TODO: add tests +const DEFAULT_BUF_SIZE: usize = 8 * 1024; + /// Send state. enum State { /// State is poisoned. @@ -70,7 +72,7 @@ impl BufferedStream { /// Create new [`BufferedStream`]. pub(super) fn new(stream: WebSocketStream) -> Self { Self { - write_buffer: Vec::with_capacity(2000), + write_buffer: Vec::with_capacity(DEFAULT_BUF_SIZE), read_buffer: None, write_ptr: 0usize, stream, @@ -124,10 +126,12 @@ impl futures::AsyncWrite for BufferedStream match futures::ready!(self.stream.poll_flush_unpin(cx)) { Ok(_res) => { - // TODO: optimize self.state = State::ReadyToSend; self.write_ptr = 0; - self.write_buffer = Vec::with_capacity(2000); + self.write_buffer.clear(); + // In the unlikely event that the buffer is too large, we need to bound the + // capacity to avoid unbounded memory usage. + self.write_buffer.shrink_to(DEFAULT_BUF_SIZE); return Poll::Ready(Ok(())); } Err(_) => return Poll::Ready(Err(std::io::ErrorKind::UnexpectedEof.into())),