mirror of
https://github.com/strukturag/nextcloud-spreed-signaling
synced 2024-06-08 00:42:25 +02:00
Make client message processing asynchronous.
This helps in detecting clients that disconnect while a backend request for them is still active (e.g. joining a room).
This commit is contained in:
parent
8f3db6da80
commit
2b02a2f929
34
client.go
34
client.go
|
@ -101,6 +101,8 @@ type Client struct {
|
|||
mu sync.Mutex
|
||||
|
||||
closeChan chan bool
|
||||
messagesDone sync.WaitGroup
|
||||
messageChan chan *bytes.Buffer
|
||||
|
||||
OnLookupCountry func(*Client) string
|
||||
OnClosed func(*Client)
|
||||
|
@ -121,7 +123,9 @@ func NewClient(conn *websocket.Conn, remoteAddress string, agent string) (*Clien
|
|||
conn: conn,
|
||||
addr: remoteAddress,
|
||||
agent: agent,
|
||||
|
||||
closeChan: make(chan bool, 1),
|
||||
messageChan: make(chan *bytes.Buffer, 16),
|
||||
|
||||
OnLookupCountry: func(client *Client) string { return unknownCountry },
|
||||
OnClosed: func(client *Client) {},
|
||||
|
@ -179,6 +183,8 @@ func (c *Client) Close() {
|
|||
}
|
||||
|
||||
c.closeChan <- true
|
||||
c.messagesDone.Wait()
|
||||
close(c.messageChan)
|
||||
|
||||
c.OnClosed(c)
|
||||
c.SetSession(nil)
|
||||
|
@ -255,8 +261,8 @@ func (c *Client) ReadPump() {
|
|||
return nil
|
||||
})
|
||||
|
||||
decodeBuffer := bufferPool.Get().(*bytes.Buffer)
|
||||
defer bufferPool.Put(decodeBuffer)
|
||||
go c.processMessages()
|
||||
|
||||
for {
|
||||
conn.SetReadDeadline(time.Now().Add(pongWait)) // nolint
|
||||
messageType, reader, err := conn.NextReader()
|
||||
|
@ -284,8 +290,10 @@ func (c *Client) ReadPump() {
|
|||
continue
|
||||
}
|
||||
|
||||
decodeBuffer := bufferPool.Get().(*bytes.Buffer)
|
||||
decodeBuffer.Reset()
|
||||
if _, err := decodeBuffer.ReadFrom(reader); err != nil {
|
||||
bufferPool.Put(decodeBuffer)
|
||||
if session := c.GetSession(); session != nil {
|
||||
log.Printf("Error reading message from client %s: %v", session.PublicId(), err)
|
||||
} else {
|
||||
|
@ -294,7 +302,27 @@ func (c *Client) ReadPump() {
|
|||
break
|
||||
}
|
||||
|
||||
c.OnMessageReceived(c, decodeBuffer.Bytes())
|
||||
// Stop processing if the client was closed.
|
||||
if atomic.LoadUint32(&c.closed) == 1 {
|
||||
bufferPool.Put(decodeBuffer)
|
||||
break
|
||||
}
|
||||
|
||||
c.messagesDone.Add(1)
|
||||
c.messageChan <- decodeBuffer
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) processMessages() {
|
||||
for {
|
||||
buffer := <-c.messageChan
|
||||
if buffer == nil {
|
||||
break
|
||||
}
|
||||
|
||||
c.OnMessageReceived(c, buffer.Bytes())
|
||||
c.messagesDone.Done()
|
||||
bufferPool.Put(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue