|
@@ -5,10 +5,12 @@
|
|
|
package main
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
- "github.com/gorilla/websocket"
|
|
|
|
|
|
|
+ "bytes"
|
|
|
"log"
|
|
"log"
|
|
|
"net/http"
|
|
"net/http"
|
|
|
"time"
|
|
"time"
|
|
|
|
|
+
|
|
|
|
|
+ "github.com/gorilla/websocket"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
const (
|
|
@@ -25,6 +27,11 @@ const (
|
|
|
maxMessageSize = 512
|
|
maxMessageSize = 512
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
+var (
|
|
|
|
|
+ newline = []byte{'\n'}
|
|
|
|
|
+ space = []byte{' '}
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
var upgrader = websocket.Upgrader{
|
|
var upgrader = websocket.Upgrader{
|
|
|
ReadBufferSize: 1024,
|
|
ReadBufferSize: 1024,
|
|
|
WriteBufferSize: 1024,
|
|
WriteBufferSize: 1024,
|
|
@@ -56,6 +63,7 @@ func (c *Conn) readPump() {
|
|
|
}
|
|
}
|
|
|
break
|
|
break
|
|
|
}
|
|
}
|
|
|
|
|
+ message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1))
|
|
|
hub.broadcast <- message
|
|
hub.broadcast <- message
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -77,10 +85,26 @@ func (c *Conn) writePump() {
|
|
|
select {
|
|
select {
|
|
|
case message, ok := <-c.send:
|
|
case message, ok := <-c.send:
|
|
|
if !ok {
|
|
if !ok {
|
|
|
|
|
+ // The hub closed the channel.
|
|
|
c.write(websocket.CloseMessage, []byte{})
|
|
c.write(websocket.CloseMessage, []byte{})
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- if err := c.write(websocket.TextMessage, message); err != nil {
|
|
|
|
|
|
|
+
|
|
|
|
|
+ c.ws.SetWriteDeadline(time.Now().Add(writeWait))
|
|
|
|
|
+ w, err := c.ws.NextWriter(websocket.TextMessage)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ w.Write(message)
|
|
|
|
|
+
|
|
|
|
|
+ // Add queued chat messages to the current websocket message.
|
|
|
|
|
+ n := len(c.send)
|
|
|
|
|
+ for i := 0; i < n; i++ {
|
|
|
|
|
+ w.Write(newline)
|
|
|
|
|
+ w.Write(<-c.send)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if err := w.Close(); err != nil {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
case <-ticker.C:
|
|
case <-ticker.C:
|