th7/api/websocket.go

91 lines
1.5 KiB
Go
Raw Normal View History

2023-12-12 21:07:04 +00:00
package api
import (
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
type Client struct {
2023-12-13 08:15:23 +00:00
socket *websocket.Conn
send chan []byte
manager *Manager
2023-12-12 21:07:04 +00:00
}
type Manager struct {
clients map[*Client]bool
2023-12-13 08:15:23 +00:00
broadcast chan []byte
2023-12-12 21:07:04 +00:00
register chan *Client
unregister chan *Client
}
func NewManager() *Manager {
return &Manager{
clients: make(map[*Client]bool),
2023-12-13 08:15:23 +00:00
broadcast: make(chan []byte),
2023-12-12 21:07:04 +00:00
register: make(chan *Client),
unregister: make(chan *Client),
}
}
func (man *Manager) start() {
for {
select {
// new connection
case conn := <-man.register:
man.clients[conn] = true
// connection closed
case conn := <-man.unregister:
if _, ok := man.clients[conn]; ok {
close(conn.send)
delete(man.clients, conn)
}
// broadcast a message to all connected clients
case message := <-man.broadcast:
2023-12-13 08:15:23 +00:00
for client := range man.clients {
select {
case client.send <- message:
default:
man.unregister <- client
}
2023-12-12 21:07:04 +00:00
}
}
}
}
2023-12-13 08:15:23 +00:00
func (c *Client) writer() {
2023-12-12 21:07:04 +00:00
defer func() {
_ = c.socket.Close()
}()
for {
select {
case message, ok := <-c.send:
if !ok {
_ = c.socket.WriteMessage(websocket.CloseMessage, []byte{})
2023-12-13 08:15:23 +00:00
c.manager.unregister <- c
2023-12-12 21:07:04 +00:00
return
}
err := c.socket.WriteMessage(websocket.TextMessage, message)
if err != nil {
2023-12-13 08:15:23 +00:00
c.manager.unregister <- c
2023-12-12 21:07:04 +00:00
return
}
}
}
}