MCPcopy
hub / github.com/coder/websocket / writeCompressedFrame

Method writeCompressedFrame

write.go:141–188  ·  view source on GitHub ↗

writeCompressedFrame compresses and writes p as a single frame.

(ctx context.Context, p []byte)

Source from the content-addressed store, hash-verified

139
140// writeCompressedFrame compresses and writes p as a single frame.
141func (mw *msgWriter) writeCompressedFrame(ctx context.Context, p []byte) (int, error) {
142 err := mw.writeMu.lock(mw.ctx)
143 if err != nil {
144 return 0, fmt.Errorf("failed to write: %w", err)
145 }
146 defer mw.writeMu.unlock()
147
148 if mw.closed {
149 return 0, errors.New("cannot use closed writer")
150 }
151
152 mw.ensureFlate()
153
154 buf := bpool.Get()
155 defer bpool.Put(buf)
156
157 // Buffer compressed output so we can write as
158 // a single frame instead of chunked frames.
159 origWriter := mw.trimWriter.w
160 mw.trimWriter.w = buf
161 defer func() {
162 mw.trimWriter.w = origWriter
163 }()
164
165 _, err = mw.flateWriter.Write(p)
166 if err != nil {
167 return 0, fmt.Errorf("failed to compress: %w", err)
168 }
169
170 err = mw.flateWriter.Flush()
171 if err != nil {
172 return 0, fmt.Errorf("failed to flush compression: %w", err)
173 }
174
175 mw.trimWriter.reset()
176
177 if !mw.flateContextTakeover() {
178 mw.putFlateWriter()
179 }
180
181 mw.closed = true
182
183 _, err = mw.c.writeFrame(ctx, true, true, mw.opcode, buf.Bytes())
184 if err != nil {
185 return 0, err
186 }
187 return len(p), nil
188}
189
190// Write writes the given bytes to the WebSocket connection.
191func (mw *msgWriter) Write(p []byte) (_ int, err error) {

Callers 1

writeMethod · 0.80

Calls 10

ensureFlateMethod · 0.95
flateContextTakeoverMethod · 0.95
putFlateWriterMethod · 0.95
GetFunction · 0.92
PutFunction · 0.92
lockMethod · 0.80
writeFrameMethod · 0.80
unlockMethod · 0.45
WriteMethod · 0.45
resetMethod · 0.45

Tested by

no test coverage detected