package logging import ( "log" "sync" "time" "github.com/gorilla/websocket" "github.com/nemunaire/repeater/internal/models" ) var ( logEntries []models.LogEntry logMutex sync.RWMutex websocketClients = make(map[*websocket.Conn]bool) clientsMutex sync.RWMutex ) // AddLog adds a new log entry func AddLog(source, message string) { logMutex.Lock() entry := models.LogEntry{ Timestamp: time.Now(), Source: source, Message: message, } logEntries = append(logEntries, entry) // Keep only the last 100 logs if len(logEntries) > 100 { logEntries = logEntries[len(logEntries)-100:] } logMutex.Unlock() // Broadcast to WebSocket clients broadcastToWebSockets(entry) // Log to console log.Printf("[%s] %s", source, message) } // GetLogs returns all log entries func GetLogs() []models.LogEntry { logMutex.RLock() defer logMutex.RUnlock() logs := make([]models.LogEntry, len(logEntries)) copy(logs, logEntries) return logs } // ClearLogs clears all log entries func ClearLogs() { logMutex.Lock() logEntries = []models.LogEntry{} logMutex.Unlock() AddLog("Système", "Logs effacés") } // RegisterWebSocketClient registers a new WebSocket client func RegisterWebSocketClient(conn *websocket.Conn) { clientsMutex.Lock() websocketClients[conn] = true clientsMutex.Unlock() // Send existing logs to the new client logMutex.RLock() for _, entry := range logEntries { conn.WriteJSON(entry) } logMutex.RUnlock() } // UnregisterWebSocketClient removes a WebSocket client func UnregisterWebSocketClient(conn *websocket.Conn) { clientsMutex.Lock() delete(websocketClients, conn) clientsMutex.Unlock() } // broadcastToWebSockets sends a log entry to all connected WebSocket clients func broadcastToWebSockets(entry models.LogEntry) { clientsMutex.RLock() defer clientsMutex.RUnlock() for client := range websocketClients { err := client.WriteJSON(entry) if err != nil { client.Close() delete(websocketClients, client) } } }