hot reload, search refactor begin

This commit is contained in:
Simon Martens
2025-02-25 19:23:00 +01:00
parent f35c738cee
commit 4d65b71563
24 changed files with 706 additions and 202 deletions

57
templating/ws.go Normal file
View 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)
}
}
}