Files
godoxy-yusing/internal/idlewatcher/events.go
yusing 3c6e931f46 refactor(idlewatcher): migrate from custom event system to goutils/events package
This refactor replaces the custom event broadcasting implementation with the centralized goutils/events package across idlewatcher.
The changes include simplifying the WakeEvent struct, removing manual SSE channel management, and adopting a cleaner event history pattern.
The frontend JavaScript has been updated to work with the new event format.
2026-02-11 00:10:56 +08:00

78 lines
1.6 KiB
Go

package idlewatcher
import (
"fmt"
"io"
"github.com/bytedance/sonic"
gevents "github.com/yusing/goutils/events"
)
type WakeEvent struct {
Message string `json:"message"`
Error string `json:"error,omitempty"`
}
type WakeEventType string
const (
WakeEventStarting WakeEventType = "starting"
WakeEventWakingDep WakeEventType = "waking_dep"
WakeEventDepReady WakeEventType = "dep_ready"
WakeEventContainerWoke WakeEventType = "container_woke"
WakeEventWaitingReady WakeEventType = "waiting_ready"
WakeEventReady WakeEventType = "ready"
WakeEventError WakeEventType = "error"
)
func writeSSE(w io.Writer, v any) error {
data, err := sonic.Marshal(v)
if err != nil {
return err
}
_, err = fmt.Fprintf(w, "data: %s\n\n", data)
return err
}
func (w *Watcher) newWakeEvent(message string, err error) *WakeEvent {
event := &WakeEvent{
Message: message,
}
if err != nil {
event.Error = err.Error()
}
return event
}
func (e *WakeEvent) WriteSSE(w io.Writer) error {
data, err := sonic.Marshal(e)
if err != nil {
return err
}
_, err = fmt.Fprintf(w, "data: %s\n\n", data)
return err
}
func (w *Watcher) clearEventHistory() {
w.events.Clear()
}
func (w *Watcher) sendEvent(eventType WakeEventType, message string, err error) {
// NOTE: events will be cleared on stop/pause
wakeEvent := w.newWakeEvent(message, err)
w.l.Debug().Str("event", string(eventType)).Str("message", message).Err(err).Msg("sending event")
level := gevents.LevelInfo
if eventType == WakeEventError {
level = gevents.LevelError
}
w.events.Add(gevents.NewEvent(
level,
w.cfg.ContainerName(),
string(eventType),
wakeEvent,
))
}