diff --git a/http/api/filesystems.go b/http/api/filesystems.go index 2d8be806..62d7b24b 100644 --- a/http/api/filesystems.go +++ b/http/api/filesystems.go @@ -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"` } diff --git a/http/handler/filesystem.go b/http/handler/filesystem.go index feb509d9..60540e7a 100644 --- a/http/handler/filesystem.go +++ b/http/handler/filesystem.go @@ -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() } } }