mirror of
https://github.com/Theodor-Springmann-Stiftung/musenalm.git
synced 2025-10-29 17:25:32 +00:00
hot reload, search refactor begin
This commit is contained in:
57
templating/ws.go
Normal file
57
templating/ws.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package templating
|
||||
|
||||
import (
|
||||
"log"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/net/websocket"
|
||||
)
|
||||
|
||||
// WsServer manages all active WebSocket connections so we can broadcast.
|
||||
type WsServer struct {
|
||||
mu sync.Mutex
|
||||
conns map[*websocket.Conn]bool
|
||||
}
|
||||
|
||||
// NewWsServer creates a WsServer.
|
||||
func NewWsServer() *WsServer {
|
||||
return &WsServer{
|
||||
conns: make(map[*websocket.Conn]bool),
|
||||
}
|
||||
}
|
||||
|
||||
// Handler is invoked for each new WebSocket connection.
|
||||
func (s *WsServer) Handler(conn *websocket.Conn) {
|
||||
s.mu.Lock()
|
||||
s.conns[conn] = true
|
||||
s.mu.Unlock()
|
||||
log.Println("[WsServer] Connected:", conn.RemoteAddr())
|
||||
|
||||
// Read in a loop until an error (client disconnect).
|
||||
var msg string
|
||||
for {
|
||||
if err := websocket.Message.Receive(conn, &msg); err != nil {
|
||||
log.Println("[WsServer] Disconnected:", conn.RemoteAddr())
|
||||
s.mu.Lock()
|
||||
delete(s.conns, conn)
|
||||
s.mu.Unlock()
|
||||
conn.Close()
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BroadcastReload sends a "reload" message to all connected clients.
|
||||
func (s *WsServer) BroadcastReload() {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
|
||||
for conn := range s.conns {
|
||||
err := websocket.Message.Send(conn, "reload")
|
||||
if err != nil {
|
||||
log.Println("[WsServer] Broadcast error:", err)
|
||||
conn.Close()
|
||||
delete(s.conns, conn)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user