writeCompressedFrame compresses and writes p as a single frame.
(ctx context.Context, p []byte)
| 139 | |
| 140 | // writeCompressedFrame compresses and writes p as a single frame. |
| 141 | func (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. |
| 191 | func (mw *msgWriter) Write(p []byte) (_ int, err error) { |
no test coverage detected