This commit is contained in:
yusing
2026-02-16 08:59:01 +08:00
parent 15b9635ee1
commit e4e6f6b3e8
242 changed files with 3953 additions and 3502 deletions

View File

@@ -7,10 +7,10 @@ import (
"net/http"
"strconv"
"github.com/rs/zerolog/log"
"github.com/yusing/godoxy/internal/homepage/icons"
iconfetch "github.com/yusing/godoxy/internal/homepage/icons/fetch"
idlewatcher "github.com/yusing/godoxy/internal/idlewatcher/types"
gperr "github.com/yusing/goutils/errs"
httputils "github.com/yusing/goutils/http"
_ "unsafe"
@@ -47,15 +47,6 @@ func (w *Watcher) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
}
func (w *Watcher) handleWakeEventsSSE(rw http.ResponseWriter, r *http.Request) {
// Create a dedicated channel for this SSE connection and register it
eventCh := make(chan *WakeEvent, 10)
w.eventChs.Store(eventCh, struct{}{})
// Clean up when done
defer func() {
w.eventChs.Delete(eventCh)
close(eventCh)
}()
// Set SSE headers
rw.Header().Set("Content-Type", "text/event-stream")
rw.Header().Set("Cache-Control", "no-cache")
@@ -66,20 +57,18 @@ func (w *Watcher) handleWakeEventsSSE(rw http.ResponseWriter, r *http.Request) {
controller := http.NewResponseController(rw)
ctx := r.Context()
// Send historical events first
w.eventHistoryMu.RLock()
historicalEvents := make([]WakeEvent, len(w.eventHistory))
copy(historicalEvents, w.eventHistory)
w.eventHistoryMu.RUnlock()
current, ch, cancel := w.events.SnapshotAndListen()
defer cancel()
for _, event := range historicalEvents {
// Send historical events first
for _, evt := range current {
select {
case <-ctx.Done():
return
default:
err := errors.Join(event.WriteSSE(rw), controller.Flush())
err := errors.Join(writeSSE(rw, evt), controller.Flush())
if err != nil {
gperr.LogError("Failed to write SSE event", err, &w.l)
log.Err(err).Msg("Failed to write SSE event")
return
}
}
@@ -88,10 +77,10 @@ func (w *Watcher) handleWakeEventsSSE(rw http.ResponseWriter, r *http.Request) {
// Listen for new events and send them to client
for {
select {
case event := <-eventCh:
err := errors.Join(event.WriteSSE(rw), controller.Flush())
case evt := <-ch:
err := errors.Join(writeSSE(rw, evt), controller.Flush())
if err != nil {
gperr.LogError("Failed to write SSE event", err, &w.l)
log.Err(err).Msg("Failed to write SSE event")
return
}
case <-ctx.Done():
@@ -169,7 +158,7 @@ func (w *Watcher) wakeFromHTTP(rw http.ResponseWriter, r *http.Request) (shouldN
err := w.Wake(r.Context())
if err != nil {
gperr.LogError("Failed to wake container", err, &w.l)
log.Err(err).Msg("Failed to wake container")
if !acceptHTML {
http.Error(rw, "Failed to wake container", http.StatusInternalServerError)
return false