Files
godoxy-yusing/internal/idlewatcher/events.go

73 lines
1.5 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 {
return writeSSE(w, e)
}
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,
))
}