mirror of
https://github.com/42wim/matterbridge.git
synced 2024-11-30 14:42:00 -08:00
Add websocket to API (#970)
Co-authored-by: Qais Patankar <qaisjp@gmail.com>
This commit is contained in:
parent
2977a5957e
commit
9b22f16497
@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
"github.com/42wim/matterbridge/bridge"
|
"github.com/42wim/matterbridge/bridge"
|
||||||
"github.com/42wim/matterbridge/bridge/config"
|
"github.com/42wim/matterbridge/bridge/config"
|
||||||
|
"github.com/gorilla/websocket"
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"github.com/labstack/echo/v4/middleware"
|
"github.com/labstack/echo/v4/middleware"
|
||||||
ring "github.com/zfjagann/golang-ring"
|
ring "github.com/zfjagann/golang-ring"
|
||||||
@ -51,6 +52,7 @@ func New(cfg *bridge.Config) bridge.Bridger {
|
|||||||
e.GET("/api/health", b.handleHealthcheck)
|
e.GET("/api/health", b.handleHealthcheck)
|
||||||
e.GET("/api/messages", b.handleMessages)
|
e.GET("/api/messages", b.handleMessages)
|
||||||
e.GET("/api/stream", b.handleStream)
|
e.GET("/api/stream", b.handleStream)
|
||||||
|
e.GET("/api/websocket", b.handleWebsocket)
|
||||||
e.POST("/api/message", b.handlePostMessage)
|
e.POST("/api/message", b.handlePostMessage)
|
||||||
go func() {
|
go func() {
|
||||||
if b.GetString("BindAddress") == "" {
|
if b.GetString("BindAddress") == "" {
|
||||||
@ -113,13 +115,17 @@ func (b *API) handleMessages(c echo.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *API) handleStream(c echo.Context) error {
|
func (b *API) getGreeting() config.Message {
|
||||||
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
|
return config.Message{
|
||||||
c.Response().WriteHeader(http.StatusOK)
|
|
||||||
greet := config.Message{
|
|
||||||
Event: config.EventAPIConnected,
|
Event: config.EventAPIConnected,
|
||||||
Timestamp: time.Now(),
|
Timestamp: time.Now(),
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *API) handleStream(c echo.Context) error {
|
||||||
|
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
|
||||||
|
c.Response().WriteHeader(http.StatusOK)
|
||||||
|
greet := b.getGreeting()
|
||||||
if err := json.NewEncoder(c.Response()).Encode(greet); err != nil {
|
if err := json.NewEncoder(c.Response()).Encode(greet); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -135,3 +141,52 @@ func (b *API) handleStream(c echo.Context) error {
|
|||||||
time.Sleep(200 * time.Millisecond)
|
time.Sleep(200 * time.Millisecond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *API) handleWebsocketMessage(message config.Message) {
|
||||||
|
message.Channel = "api"
|
||||||
|
message.Protocol = "api"
|
||||||
|
message.Account = b.Account
|
||||||
|
message.ID = ""
|
||||||
|
message.Timestamp = time.Now()
|
||||||
|
|
||||||
|
b.Log.Debugf("Sending websocket message from %s on %s to gateway", message.Username, "api")
|
||||||
|
b.Remote <- message
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *API) writePump(conn *websocket.Conn) {
|
||||||
|
for {
|
||||||
|
msg := b.Messages.Dequeue()
|
||||||
|
if msg != nil {
|
||||||
|
err := conn.WriteJSON(msg)
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *API) readPump(conn *websocket.Conn) {
|
||||||
|
for {
|
||||||
|
message := config.Message{}
|
||||||
|
err := conn.ReadJSON(&message)
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
b.handleWebsocketMessage(message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *API) handleWebsocket(c echo.Context) error {
|
||||||
|
conn, err := websocket.Upgrade(c.Response().Writer, c.Request(), nil, 1024, 1024)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
greet := b.getGreeting()
|
||||||
|
_ = conn.WriteJSON(greet)
|
||||||
|
|
||||||
|
go b.writePump(conn)
|
||||||
|
go b.readPump(conn)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user