Skip to content

Commit 7dbe93c

Browse files
committed
Switch to stateless compression with klauspost/compress
1 parent 503b469 commit 7dbe93c

File tree

4 files changed

+15
-35
lines changed

4 files changed

+15
-35
lines changed

compress_notjs.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -98,22 +98,6 @@ func putFlateReader(fr io.Reader) {
9898
flateReaderPool.Put(fr)
9999
}
100100

101-
var flateWriterPool sync.Pool
102-
103-
func getFlateWriter(w io.Writer) *flate.Writer {
104-
fw, ok := flateWriterPool.Get().(*flate.Writer)
105-
if !ok {
106-
fw, _ = flate.NewWriter(w, flate.BestSpeed)
107-
return fw
108-
}
109-
fw.Reset(w)
110-
return fw
111-
}
112-
113-
func putFlateWriter(w *flate.Writer) {
114-
flateWriterPool.Put(w)
115-
}
116-
117101
type slidingWindow struct {
118102
buf []byte
119103
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/golang/protobuf v1.3.3
1010
github.com/google/go-cmp v0.4.0
1111
github.com/gorilla/websocket v1.4.1
12+
github.com/klauspost/compress v1.10.0
1213
golang.org/x/time v0.0.0-20191024005414-555d28b269f0
1314
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
1415
)

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
1010
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
1111
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
1212
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
13+
github.com/klauspost/compress v1.10.0 h1:92XGj1AcYzA6UrVdd4qIIBrT8OroryvRvdmg/IfmC7Y=
14+
github.com/klauspost/compress v1.10.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
1315
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
1416
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
1517
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=

write.go

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ package websocket
44

55
import (
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

6666
func 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.
149139
func (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

217210
func (mw *msgWriter) close() {
218211
mw.writeMu.Lock()
219-
mw.returnFlateWriter()
212+
mw.dict.close()
220213
}
221214

222215
func (c *Conn) writeControl(ctx context.Context, opcode opcode, p []byte) error {

0 commit comments

Comments
 (0)