diff --git a/cmd/api/api.go b/cmd/api/api.go index 7b95524b..4fe29e08 100644 --- a/cmd/api/api.go +++ b/cmd/api/api.go @@ -9,6 +9,8 @@ import ( "github.com/rs/zerolog" "net" "net/http" + "os" + "strconv" ) func Init() { @@ -38,7 +40,8 @@ func Init() { HandleFunc("/api/frame.mp4", frameHandler) HandleFunc("/api/frame.raw", frameHandler) HandleFunc("/api/stack", stackHandler) - HandleFunc("/api/stats", statsHandler) + HandleFunc("/api/streams", streamsHandler) + HandleFunc("/api/exit", exitHandler) HandleFunc("/api/ws", apiWS) // ensure we can listen without errors @@ -69,19 +72,39 @@ var basePath string var log zerolog.Logger var wsHandlers = make(map[string]WSHandler) -func statsHandler(w http.ResponseWriter, _ *http.Request) { - v := map[string]interface{}{ - "streams": streams.All(), +func streamsHandler(w http.ResponseWriter, r *http.Request) { + src := r.URL.Query().Get("src") + + switch r.Method { + case "PUT": + streams.Get(src) + return + case "DELETE": + streams.Delete(src) + return + } + + var v interface{} + if src != "" { + v = streams.Get(src) + } else { + v = streams.All() } data, err := json.Marshal(v) if err != nil { - log.Error().Err(err).Msg("[api.stats] marshal") + log.Error().Err(err).Msg("[api.streams] marshal") } if _, err = w.Write(data); err != nil { - log.Error().Err(err).Msg("[api.stats] write") + log.Error().Err(err).Msg("[api.streams] write") } } +func exitHandler(w http.ResponseWriter, r *http.Request) { + s := r.URL.Query().Get("code") + code, _ := strconv.Atoi(s) + os.Exit(code) +} + func apiWS(w http.ResponseWriter, r *http.Request) { ctx := new(Context) if err := ctx.Upgrade(w, r); err != nil { diff --git a/cmd/streams/streams.go b/cmd/streams/streams.go index 2013d4a6..b2829292 100644 --- a/cmd/streams/streams.go +++ b/cmd/streams/streams.go @@ -34,6 +34,10 @@ func Get(name string) *Stream { return nil } +func Delete(name string) { + delete(streams, name) +} + func All() map[string]interface{} { all := map[string]interface{}{} for name, stream := range streams {