From d30ae19e2a789f7bf5d430f9c7d065268d6a2957 Mon Sep 17 00:00:00 2001 From: Wim Date: Thu, 7 Dec 2017 23:48:44 +0100 Subject: [PATCH] Add (simple, one listener) long-polling support (api). Closes #307 --- bridge/api/api.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/bridge/api/api.go b/bridge/api/api.go index ab473afc..b422c8d9 100644 --- a/bridge/api/api.go +++ b/bridge/api/api.go @@ -1,6 +1,7 @@ package api import ( + "encoding/json" "github.com/42wim/matterbridge/bridge/config" log "github.com/Sirupsen/logrus" "github.com/labstack/echo" @@ -8,6 +9,7 @@ import ( "github.com/zfjagann/golang-ring" "net/http" "sync" + "time" ) type Api struct { @@ -47,6 +49,7 @@ func New(cfg config.Protocol, account string, c chan config.Message) *Api { })) } e.GET("/api/messages", b.handleMessages) + e.GET("/api/stream", b.handleStream) e.POST("/api/message", b.handlePostMessage) go func() { flog.Fatal(e.Start(cfg.BindAddress)) @@ -103,3 +106,25 @@ func (b *Api) handleMessages(c echo.Context) error { b.Messages = ring.Ring{} return nil } + +func (b *Api) handleStream(c echo.Context) error { + c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSON) + c.Response().WriteHeader(http.StatusOK) + closeNotifier := c.Response().CloseNotify() + for { + select { + case <-closeNotifier: + return nil + default: + msg := b.Messages.Dequeue() + if msg != nil { + if err := json.NewEncoder(c.Response()).Encode(msg); err != nil { + return err + } + c.Response().Flush() + } + time.Sleep(200 * time.Millisecond) + } + } + return nil +}