Skip to content

Commit a94999f

Browse files
committed
close: Implement CloseNow
Closes #384
1 parent 1dbc141 commit a94999f

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed

Diff for: close.go

+14-1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ func (c *Conn) Close(code StatusCode, reason string) error {
102102
return c.closeHandshake(code, reason)
103103
}
104104

105+
// CloseNow closes the WebSocket connection without attempting a close handshake.
106+
// Use When you do not want the overhead of the close handshake.
107+
func (c *Conn) CloseNow() (err error) {
108+
defer errd.Wrap(&err, "failed to close WebSocket")
109+
110+
if c.isClosed() {
111+
return errClosed
112+
}
113+
114+
c.close(nil)
115+
return c.closeErr
116+
}
117+
105118
func (c *Conn) closeHandshake(code StatusCode, reason string) (err error) {
106119
defer errd.Wrap(&err, "failed to close WebSocket")
107120

@@ -265,7 +278,7 @@ func (c *Conn) setCloseErr(err error) {
265278
}
266279

267280
func (c *Conn) setCloseErrLocked(err error) {
268-
if c.closeErr == nil {
281+
if c.closeErr == nil && err != nil {
269282
c.closeErr = fmt.Errorf("WebSocket closed: %w", err)
270283
}
271284
}

Diff for: conn.go

+3
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ func (c *Conn) close(err error) {
147147
if c.isClosed() {
148148
return
149149
}
150+
if err == nil {
151+
err = c.rwc.Close()
152+
}
150153
c.setCloseErrLocked(err)
151154
close(c.closed)
152155
runtime.SetFinalizer(c, nil)

Diff for: conn_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,19 @@ func TestConn(t *testing.T) {
295295
err = c1.Close(websocket.StatusNormalClosure, "")
296296
assert.Success(t, err)
297297
})
298+
299+
t.Run("CloseNow", func(t *testing.T) {
300+
_, c1, c2 := newConnTest(t, nil, nil)
301+
302+
err1 := c1.CloseNow()
303+
err2 := c2.CloseNow()
304+
assert.Success(t, err1)
305+
assert.Success(t, err2)
306+
err1 = c1.CloseNow()
307+
err2 = c2.CloseNow()
308+
assert.ErrorIs(t, websocket.ErrClosed, err1)
309+
assert.ErrorIs(t, websocket.ErrClosed, err2)
310+
})
298311
}
299312

300313
func TestWasm(t *testing.T) {

Diff for: export_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,5 @@ func (c *Conn) RecordBytesRead() *int {
2323
}))
2424
return &bytesRead
2525
}
26+
27+
var ErrClosed = errClosed

0 commit comments

Comments
 (0)