mirror of
https://github.com/strukturag/nextcloud-spreed-signaling
synced 2024-04-27 03:31:51 +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
44
client.go
44
client.go
|
@ -100,7 +100,9 @@ type Client struct {
|
||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
|
|
||||||
closeChan chan bool
|
closeChan chan bool
|
||||||
|
messagesDone sync.WaitGroup
|
||||||
|
messageChan chan *bytes.Buffer
|
||||||
|
|
||||||
OnLookupCountry func(*Client) string
|
OnLookupCountry func(*Client) string
|
||||||
OnClosed func(*Client)
|
OnClosed func(*Client)
|
||||||
|
@ -118,10 +120,12 @@ func NewClient(conn *websocket.Conn, remoteAddress string, agent string) (*Clien
|
||||||
agent = "unknown user agent"
|
agent = "unknown user agent"
|
||||||
}
|
}
|
||||||
client := &Client{
|
client := &Client{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
addr: remoteAddress,
|
addr: remoteAddress,
|
||||||
agent: agent,
|
agent: agent,
|
||||||
closeChan: make(chan bool, 1),
|
|
||||||
|
closeChan: make(chan bool, 1),
|
||||||
|
messageChan: make(chan *bytes.Buffer, 16),
|
||||||
|
|
||||||
OnLookupCountry: func(client *Client) string { return unknownCountry },
|
OnLookupCountry: func(client *Client) string { return unknownCountry },
|
||||||
OnClosed: func(client *Client) {},
|
OnClosed: func(client *Client) {},
|
||||||
|
@ -179,6 +183,8 @@ func (c *Client) Close() {
|
||||||
}
|
}
|
||||||
|
|
||||||
c.closeChan <- true
|
c.closeChan <- true
|
||||||
|
c.messagesDone.Wait()
|
||||||
|
close(c.messageChan)
|
||||||
|
|
||||||
c.OnClosed(c)
|
c.OnClosed(c)
|
||||||
c.SetSession(nil)
|
c.SetSession(nil)
|
||||||
|
@ -255,8 +261,8 @@ func (c *Client) ReadPump() {
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
decodeBuffer := bufferPool.Get().(*bytes.Buffer)
|
go c.processMessages()
|
||||||
defer bufferPool.Put(decodeBuffer)
|
|
||||||
for {
|
for {
|
||||||
conn.SetReadDeadline(time.Now().Add(pongWait)) // nolint
|
conn.SetReadDeadline(time.Now().Add(pongWait)) // nolint
|
||||||
messageType, reader, err := conn.NextReader()
|
messageType, reader, err := conn.NextReader()
|
||||||
|
@ -284,8 +290,10 @@ func (c *Client) ReadPump() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
decodeBuffer := bufferPool.Get().(*bytes.Buffer)
|
||||||
decodeBuffer.Reset()
|
decodeBuffer.Reset()
|
||||||
if _, err := decodeBuffer.ReadFrom(reader); err != nil {
|
if _, err := decodeBuffer.ReadFrom(reader); err != nil {
|
||||||
|
bufferPool.Put(decodeBuffer)
|
||||||
if session := c.GetSession(); session != nil {
|
if session := c.GetSession(); session != nil {
|
||||||
log.Printf("Error reading message from client %s: %v", session.PublicId(), err)
|
log.Printf("Error reading message from client %s: %v", session.PublicId(), err)
|
||||||
} else {
|
} else {
|
||||||
|
@ -294,7 +302,27 @@ func (c *Client) ReadPump() {
|
||||||
break
|
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