Skip to content

Commit 3f26c9f

Browse files
committed
wsjson: Write messages in a single frame always
Closes #315
1 parent a633a10 commit 3f26c9f

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

internal/util/util.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package util
2+
3+
type WriterFunc func(p []byte) (int, error)
4+
5+
func (f WriterFunc) Write(p []byte) (int, error) {
6+
return f(p)
7+
}

wsjson/wsjson.go

+9-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"nhooyr.io/websocket"
1010
"nhooyr.io/websocket/internal/bpool"
11+
"nhooyr.io/websocket/internal/util"
1112
"nhooyr.io/websocket/internal/errd"
1213
)
1314

@@ -51,17 +52,17 @@ func Write(ctx context.Context, c *websocket.Conn, v interface{}) error {
5152
func write(ctx context.Context, c *websocket.Conn, v interface{}) (err error) {
5253
defer errd.Wrap(&err, "failed to write JSON message")
5354

54-
w, err := c.Writer(ctx, websocket.MessageText)
55-
if err != nil {
56-
return err
57-
}
58-
5955
// json.Marshal cannot reuse buffers between calls as it has to return
6056
// a copy of the byte slice but Encoder does as it directly writes to w.
61-
err = json.NewEncoder(w).Encode(v)
57+
err = json.NewEncoder(util.WriterFunc(func(p []byte) (int, error) {
58+
err := c.Write(ctx, websocket.MessageText, p)
59+
if err != nil {
60+
return 0, err
61+
}
62+
return len(p), nil
63+
})).Encode(v)
6264
if err != nil {
6365
return fmt.Errorf("failed to marshal JSON: %w", err)
6466
}
65-
66-
return w.Close()
67+
return nil
6768
}

0 commit comments

Comments
 (0)