repeater/internal/logging/logging.go

94 lines
2 KiB
Go

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)
}
}
}