94 lines
2 KiB
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)
|
|
}
|
|
}
|
|
}
|