@@ -4,14 +4,14 @@ package websocket
44
55import (
66 "bufio"
7- "compress/flate"
87 "context"
98 "crypto/rand"
109 "encoding/binary"
1110 "io"
1211 "sync"
1312 "time"
1413
14+ "github.com/klauspost/compress/flate"
1515 "golang.org/x/xerrors"
1616
1717 "nhooyr.io/websocket/internal/errd"
@@ -59,8 +59,8 @@ type msgWriter struct {
5959 closed bool
6060 flate bool
6161
62- trimWriter * trimLastFourBytesWriter
63- flateWriter * flate. Writer
62+ trimWriter * trimLastFourBytesWriter
63+ dict slidingWindow
6464}
6565
6666func newMsgWriter (c * Conn ) * msgWriter {
@@ -78,10 +78,7 @@ func (mw *msgWriter) ensureFlate() {
7878 }
7979 }
8080
81- if mw .flateWriter == nil {
82- mw .flateWriter = getFlateWriter (mw .trimWriter )
83- }
84-
81+ mw .dict .init (8192 )
8582 mw .flate = true
8683}
8784
@@ -138,13 +135,6 @@ func (mw *msgWriter) reset(ctx context.Context, typ MessageType) error {
138135 return nil
139136}
140137
141- func (mw * msgWriter ) returnFlateWriter () {
142- if mw .flateWriter != nil {
143- putFlateWriter (mw .flateWriter )
144- mw .flateWriter = nil
145- }
146- }
147-
148138// Write writes the given bytes to the WebSocket connection.
149139func (mw * msgWriter ) Write (p []byte ) (_ int , err error ) {
150140 defer errd .Wrap (& err , "failed to write" )
@@ -165,7 +155,9 @@ func (mw *msgWriter) Write(p []byte) (_ int, err error) {
165155 }
166156
167157 if mw .flate {
168- return mw .flateWriter .Write (p )
158+ err = flate .StatelessDeflate (mw .trimWriter , p , false , mw .dict .buf )
159+ mw .dict .write (p )
160+ return len (p ), err
169161 }
170162
171163 return mw .write (p )
@@ -192,9 +184,9 @@ func (mw *msgWriter) Close() (err error) {
192184 }
193185
194186 if mw .flate {
195- err = mw . flateWriter . Flush ( )
187+ err = flate . StatelessDeflate ( mw . trimWriter , nil , true , nil )
196188 if err != nil {
197- return xerrors .Errorf ("failed to flush flate writer : %w" , err )
189+ return xerrors .Errorf ("failed to flush flate: %w" , err )
198190 }
199191 }
200192
@@ -208,15 +200,16 @@ func (mw *msgWriter) Close() (err error) {
208200 }
209201
210202 if mw .flate && ! mw .flateContextTakeover () {
211- mw .returnFlateWriter ()
203+ mw .dict . close ()
212204 }
205+
213206 mw .mu .Unlock ()
214207 return nil
215208}
216209
217210func (mw * msgWriter ) close () {
218211 mw .writeMu .Lock ()
219- mw .returnFlateWriter ()
212+ mw .dict . close ()
220213}
221214
222215func (c * Conn ) writeControl (ctx context.Context , opcode opcode , p []byte ) error {
0 commit comments