Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit 78407c23f75f2238306657c449afcb2e7adf6ea6 Author: NikkyAI <root@nikky.moe> Date: Wed Aug 26 22:27:00 2020 +0000 Replace gorilla with melody for websocket API (#1205) diff --git a/bridge/api/api.go b/bridge/api/api.go index 6233688..9c93756 100644 --- a/bridge/api/api.go +++ b/bridge/api/api.go @@ -69 +610 @@ import (   "sync"   "time"   + "gopkg.in/olahol/melody.v1" +   "github.com/42wim/matterbridge/bridge"   "github.com/42wim/matterbridge/bridge/config" - "github.com/gorilla/websocket"   "github.com/labstack/echo/v4"   "github.com/labstack/echo/v4/middleware"   ring "github.com/zfjagann/golang-ring" @@ -186 +197 @@ type API struct {   Messages ring.Ring   sync.RWMutex   *bridge.Config + mrouter *melody.Melody  }    type Message struct { @@ -336 +3532 @@ func New(cfg *bridge.Config) bridge.Bridger {   e := echo.New()   e.HideBanner = true   e.HidePort = true + + b.mrouter = melody.New() + b.mrouter.HandleMessage(func(s *melody.Session, msg []byte) { + message := config.Message{} + err := json.Unmarshal(msg, &message) + if err != nil { + b.Log.Errorf("failed to decode message from byte[] '%s'", string(msg)) + return + } + b.handleWebsocketMessage(message) + }) + b.mrouter.HandleConnect(func(session *melody.Session) { + greet := b.getGreeting() + data, err := json.Marshal(greet) + if err != nil { + b.Log.Errorf("failed to encode message '%v'", greet) + return + } + err = session.Write(data) + if err != nil { + b.Log.Errorf("failed to write message '%s'", string(data)) + return + } + // TODO: send message history buffer from `b.Messages` here + }) +   b.Messages = ring.Ring{}   if b.GetInt("Buffer") != 0 {   b.Messages.SetCapacity(b.GetInt("Buffer")) @@ -6713 +9513 @@ func New(cfg *bridge.Config) bridge.Bridger {  func (b *API) Connect() error {   return nil  } +  func (b *API) Disconnect() error {   return nil -  } +  func (b *API) JoinChannel(channel config.ChannelInfo) error {   return nil -  }    func (b *API) Send(msg config.Message) (string, error) { @@ -837 +11114 @@ func (b *API) Send(msg config.Message) (string, error) {   if msg.Event == config.EventMsgDelete {   return "", nil   } - b.Messages.Enqueue(&msg) + b.Log.Debugf("enqueueing message from %s on ring buffer", msg.Username) + b.Messages.Enqueue(msg) + + data, err := json.Marshal(msg) + if err != nil { + b.Log.Errorf("failed to encode message '%s'", msg) + } + _ = b.mrouter.Broadcast(data)   return "", nil  }   @@ -1316 +1667 @@ func (b *API) handleStream(c echo.Context) error {   }   c.Response().Flush()   for { + // TODO: this causes issues, messages should be broadcasted to all connected clients   msg := b.Messages.Dequeue()   if msg != nil {   if err := json.NewEncoder(c.Response()).Encode(msg); err != nil { @@ -15340 +18912 @@ func (b *API) handleWebsocketMessage(message config.Message) {   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) + err := b.mrouter.HandleRequest(c.Response(), c.Request())   if err != nil { + b.Log.Errorf("error in websocket handling '%v'", err)   return err   }   - greet := b.getGreeting() - _ = conn.WriteJSON(greet) - - go b.writePump(conn) - go b.readPump(conn) -   return nil  } diff --git a/go.mod b/go.mod index 64be9a2..4548ecb 100644 --- a/go.mod +++ b/go.mod @@ -506 +507 @@ require (   golang.org/x/image v0.0.0-20200618115811-c13761719519   golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d   gomod.garykim.dev/nc-talk v0.0.2 + gopkg.in/olahol/melody.v1 v1.0.0-20170518105555-d52139073376  )    go 1.13 diff --git a/go.sum b/go.sum index 7eb4e85..7116efb 100644 --- a/go.sum +++ b/go.sum @@ -9286 +9288 @@ gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=  gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=  gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=  gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/olahol/melody.v1 v1.0.0-20170518105555-d52139073376 h1:sY2a+y0j4iDrajJcorb+a0hJIQ6uakU5gybjfLWHlXo= +gopkg.in/olahol/melody.v1 v1.0.0-20170518105555-d52139073376/go.mod h1:BHKOc1m5wm8WwQkMqYBoo4vNxhmF7xg8+xhG8L+Cy3M=  gopkg.in/olivere/elastic.v6 v6.2.30/go.mod h1:2cTT8Z+/LcArSWpCgvZqBgt3VOqXiy7v00w12Lz8bd4=  gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=  gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample index 673500e..7aeaec3 100644 --- a/matterbridge.toml.sample +++ b/matterbridge.toml.sample @@ -15406 +15408 @@ Buffer=1000    #Bearer token used for authentication  #curl -H "Authorization: Bearer token" http://localhost:4242/api/messages +# https://github.com/vi/websocat +# websocat -H="Authorization: Bearer token" ws://127.0.0.1:4242/api/websocket  #OPTIONAL (no authorization if token is empty)  Token="mytoken"