Emit list action

This commit is contained in:
Ingo Oppermann 2025-09-22 21:44:22 +02:00
parent bbf40b6e50
commit 882764dfe3
No known key found for this signature in database
GPG Key ID: 2AB32426E9DD229E
2 changed files with 45 additions and 45 deletions

View File

@ -24,6 +24,7 @@ type FilesystemOperation struct {
}
type FilesystemEvent struct {
Action string `json:"action"`
Name string `json:"name"`
Action string `json:"action"`
Name string `json:"name,omitempty"`
Names []string `json:"names,omitempty"`
}

View File

@ -354,8 +354,11 @@ func (h *FSHandler) ListFiles(c echo.Context) error {
}
func (h *FSHandler) ListFilesEvent(c echo.Context) error {
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
keepaliveTicker := time.NewTicker(5 * time.Second)
defer keepaliveTicker.Stop()
listTicker := time.NewTicker(30 * time.Second)
defer listTicker.Stop()
req := c.Request()
reqctx := req.Context()
@ -384,50 +387,46 @@ func (h *FSHandler) ListFilesEvent(c echo.Context) error {
done := make(chan error, 1)
if contentType == "text/event-stream" {
res.Write([]byte(":keepalive\n\n"))
res.Flush()
for {
select {
case err := <-done:
return err
case <-reqctx.Done():
done <- nil
case <-ticker.C:
res.Write([]byte(":keepalive\n\n"))
res.Flush()
case e := <-evts:
res.Write([]byte("event: " + e.Action + "\ndata: "))
if err := enc.Encode(e); err != nil {
done <- err
}
res.Write([]byte("\n"))
res.Flush()
}
createList := func() api.FilesystemEvent {
files := h.FS.Filesystem.List("/", fs.ListOptions{})
event := api.FilesystemEvent{
Action: "list",
Names: make([]string, 0, len(files)),
}
for _, file := range files {
event.Names = append(event.Names, file.Name())
}
} else {
res.Write([]byte("{\"action\": \"keepalive\"}\n"))
res.Flush()
for {
select {
case err := <-done:
return err
case <-reqctx.Done():
done <- nil
case <-ticker.C:
res.Write([]byte("{\"action\": \"keepalive\"}\n"))
res.Flush()
case e := <-evts:
if err := enc.Encode(api.FilesystemEvent{
Action: e.Action,
Name: e.Name,
}); err != nil {
done <- err
}
res.Flush()
return event
}
if err := enc.Encode(createList()); err != nil {
done <- err
}
res.Flush()
for {
select {
case err := <-done:
return err
case <-reqctx.Done():
done <- nil
case <-keepaliveTicker.C:
res.Write([]byte("{\"action\": \"keepalive\"}\n"))
res.Flush()
case <-listTicker.C:
if err := enc.Encode(createList()); err != nil {
done <- err
}
res.Flush()
case e := <-evts:
if err := enc.Encode(api.FilesystemEvent{
Action: e.Action,
Name: e.Name,
}); err != nil {
done <- err
}
res.Flush()
}
}
}