Skip to content

Commit 73502bf

Browse files
websocket: do unsubscribe before closing connection
1 parent 7c070dd commit 73502bf

2 files changed

Lines changed: 50 additions & 5 deletions

File tree

graphql/websocket.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,16 +194,18 @@ func (w *webSocketClient) Close() error {
194194
if w.conn == nil {
195195
return nil
196196
}
197-
err := w.conn.WriteMessage(closeMessage, formatCloseMessage(closeNormalClosure, ""))
198-
if err != nil {
199-
return fmt.Errorf("failed to send closure message: %w", err)
200-
}
201-
err = w.UnsubscribeAll()
197+
err := w.UnsubscribeAll()
202198
if err != nil {
203199
return fmt.Errorf("failed to unsubscribe: %w", err)
204200
}
205201
w.Lock()
206202
defer w.Unlock()
203+
204+
err = w.conn.WriteMessage(closeMessage, formatCloseMessage(closeNormalClosure, ""))
205+
if err != nil {
206+
return fmt.Errorf("failed to send closure message: %w", err)
207+
}
208+
207209
w.isClosing = true
208210
close(w.errChan)
209211
return w.conn.Close()

internal/integration/integration_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,49 @@ func TestSubscriptionConnectionParams(t *testing.T) {
242242
}
243243
}
244244

245+
func TestSubscriptionClose(t *testing.T) {
246+
_ = `# @genqlient
247+
subscription count { count }`
248+
249+
ctx := context.Background()
250+
server := server.RunServer()
251+
defer server.Close()
252+
253+
cases := []struct {
254+
name string
255+
unsub bool
256+
}{
257+
{
258+
name: "unsubscribed_manually",
259+
unsub: true,
260+
},
261+
{
262+
name: "unsubscribed_automatically",
263+
unsub: false,
264+
},
265+
}
266+
267+
for _, tc := range cases {
268+
t.Run(tc.name, func(t *testing.T) {
269+
wsClient := newRoundtripWebSocketClient(t, server.URL)
270+
271+
_, err := wsClient.Start(ctx)
272+
require.NoError(t, err)
273+
274+
_, subscriptionID, err := count(ctx, wsClient)
275+
require.NoError(t, err)
276+
277+
if tc.unsub {
278+
err = wsClient.Unsubscribe(subscriptionID)
279+
require.NoError(t, err)
280+
}
281+
282+
err = wsClient.Close()
283+
require.NoError(t, err)
284+
})
285+
}
286+
}
287+
245288
func TestServerError(t *testing.T) {
246289
_ = `# @genqlient
247290
query failingQuery { fail me { id } }`

0 commit comments

Comments
 (0)