diff --git a/src/codec/framed.rs b/src/codec/framed.rs
index 968a9689..74a204e7 100644
--- a/src/codec/framed.rs
+++ b/src/codec/framed.rs
@@ -85,7 +85,12 @@ impl<T, U> Framed<T, U> {
     pub fn from_parts(parts: FramedParts<T, U>) -> Framed<T, U> {
         Framed {
             inner: framed_read2_with_buffer(
-                framed_write2_with_buffer(Fuse(parts.io, parts.codec), parts.write_buf, parts.write_buf_lw, parts.write_buf_hw),
+                framed_write2_with_buffer(
+                    Fuse(parts.io, parts.codec),
+                    parts.write_buf,
+                    parts.write_buf_lw,
+                    parts.write_buf_hw,
+                ),
                 parts.read_buf,
             ),
         }
@@ -121,6 +126,11 @@ impl<T, U> Framed<T, U> {
         &mut self.inner.get_mut().get_mut().0
     }
 
+    /// Check if write buffer is full.
+    pub fn is_full(&self) -> bool {
+        self.inner.get_ref().is_full()
+    }
+
     /// Consumes the `Frame`, returning its underlying I/O stream.
     ///
     /// Note that care should be taken to not tamper with the underlying stream
diff --git a/src/codec/framed_write.rs b/src/codec/framed_write.rs
index 57789cc6..337bb4eb 100644
--- a/src/codec/framed_write.rs
+++ b/src/codec/framed_write.rs
@@ -72,6 +72,11 @@ impl<T, E> FramedWrite<T, E> {
     pub fn encoder_mut(&mut self) -> &mut E {
         &mut self.inner.inner.1
     }
+
+    /// Check if write buffer is full
+    pub fn is_full(&self) -> bool {
+        self.inner.is_full()
+    }
 }
 
 impl<T, E> Sink for FramedWrite<T, E>
@@ -123,7 +128,11 @@ where
 
 // ===== impl FramedWrite2 =====
 
-pub fn framed_write2<T>(inner: T, low_watermark: usize, high_watermark: usize) -> FramedWrite2<T> {
+pub fn framed_write2<T>(
+    inner: T,
+    low_watermark: usize,
+    high_watermark: usize,
+) -> FramedWrite2<T> {
     FramedWrite2 {
         inner,
         low_watermark,
@@ -132,7 +141,12 @@ pub fn framed_write2<T>(inner: T, low_watermark: usize, high_watermark: usize) -
     }
 }
 
-pub fn framed_write2_with_buffer<T>(inner: T, mut buffer: BytesMut, low_watermark: usize, high_watermark: usize) -> FramedWrite2<T> {
+pub fn framed_write2_with_buffer<T>(
+    inner: T,
+    mut buffer: BytesMut,
+    low_watermark: usize,
+    high_watermark: usize,
+) -> FramedWrite2<T> {
     if buffer.capacity() < high_watermark {
         let bytes_to_reserve = high_watermark - buffer.capacity();
         buffer.reserve(bytes_to_reserve);
@@ -155,12 +169,21 @@ impl<T> FramedWrite2<T> {
     }
 
     pub fn into_parts(self) -> (T, BytesMut, usize, usize) {
-        (self.inner, self.buffer, self.low_watermark, self.high_watermark)
+        (
+            self.inner,
+            self.buffer,
+            self.low_watermark,
+            self.high_watermark,
+        )
     }
 
     pub fn get_mut(&mut self) -> &mut T {
         &mut self.inner
     }
+
+    pub fn is_full(&self) -> bool {
+        self.buffer.len() >= self.high_watermark
+    }
 }
 
 impl<T> Sink for FramedWrite2<T>