Skip to content

Commit 1267b7f

Browse files
authored
client: check for client disconnect before sending opcodes (#142)
1 parent ce2d164 commit 1267b7f

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

api/client.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ type Client struct {
4242
// Ya like logs?
4343
Log Logger
4444

45+
Disconnected chan bool
46+
4547
mutex sync.Mutex
4648
}
4749

@@ -75,10 +77,15 @@ func (c *Client) SendRequest(requestBody Params, responseBody Response) error {
7577
c.mutex.Lock()
7678
defer c.mutex.Unlock()
7779

78-
c.Opcodes <- &opcodes.Request{
79-
Type: name,
80-
ID: id,
81-
Data: requestBody,
80+
select {
81+
case <-c.Disconnected:
82+
return fmt.Errorf("request %s: client already disconnected", name)
83+
default:
84+
c.Opcodes <- &opcodes.Request{
85+
Type: name,
86+
ID: id,
87+
Data: requestBody,
88+
}
8289
}
8390

8491
var response *opcodes.RequestResponse

client.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ type Client struct {
3737
dialer *websocket.Dialer
3838
requestHeader http.Header
3939
eventSubscriptions int
40-
disconnected chan bool
4140
profiler *profile.Profile
4241
once sync.Once
4342
}
@@ -123,15 +122,15 @@ func (c *Client) Disconnect() error {
123122
func (c *Client) markDisconnected() {
124123
c.once.Do(func() {
125124
select {
126-
case c.disconnected <- true:
125+
case c.client.Disconnected <- true:
127126
default:
128127
}
129128

130129
c.client.Log.Printf("[TRACE] Closing internal channels")
131130
close(c.IncomingEvents)
132131
close(c.client.Opcodes)
133132
close(c.client.IncomingResponses)
134-
close(c.disconnected)
133+
close(c.client.Disconnected)
135134
})
136135
}
137136

@@ -145,8 +144,8 @@ func New(host string, opts ...Option) (*Client, error) {
145144
dialer: websocket.DefaultDialer,
146145
requestHeader: http.Header{"User-Agent": []string{"goobs/" + LibraryVersion}},
147146
eventSubscriptions: subscriptions.All,
148-
disconnected: make(chan bool),
149147
client: &api.Client{
148+
Disconnected: make(chan bool),
150149
IncomingResponses: make(chan *opcodes.RequestResponse),
151150
Opcodes: make(chan opcodes.Opcode),
152151
ResponseTimeout: 10000,
@@ -248,7 +247,7 @@ func (c *Client) handleRawServerMessages(auth chan<- error) {
248247
c.markDisconnected()
249248
default:
250249
select {
251-
case <-c.disconnected:
250+
case <-c.client.Disconnected:
252251
default:
253252
c.client.Log.Printf("[ERROR] Unhandled error: %s", t)
254253
}
@@ -260,7 +259,7 @@ func (c *Client) handleRawServerMessages(auth chan<- error) {
260259
c.client.Log.Printf("[TRACE] Raw server message: %s", raw)
261260

262261
select {
263-
case <-c.disconnected:
262+
case <-c.client.Disconnected:
264263
// This might happen if the server sends messages to us
265264
// after we've already disconnected, e.g.:
266265
//
@@ -362,7 +361,7 @@ func (c *Client) handleOpcodes(auth chan<- error) {
362361
// to use it, they'll have the latest events available to them.
363362
func (c *Client) writeEvent(event any) {
364363
select {
365-
case <-c.disconnected:
364+
case <-c.client.Disconnected:
366365
case c.IncomingEvents <- event:
367366
default:
368367
if len(c.IncomingEvents) == cap(c.IncomingEvents) {

0 commit comments

Comments
 (0)