now websockets see messages from others, but not their own anymore

This commit is contained in:
nikky
2020-08-08 02:17:01 +02:00
parent 2d79cb03ef
commit 2f72b7e545

View File

@@ -46,6 +46,11 @@ type Message struct {
Gateway string `json:"gateway"`
}
type MessageWrapper struct {
message config.Message
member *bcast.Member
}
func New(cfg *bridge.Config) bridge.Bridger {
b := &API{Config: cfg}
e := echo.New()
@@ -110,7 +115,7 @@ func (b *API) Send(msg config.Message) (string, error) {
}
b.Log.Debugf("enqueueing message from %s to group broadcast", msg.Username)
b.Messages.Enqueue(msg)
b.group.Send(msg)
b.group.Send(MessageWrapper{msg, nil})
return "", nil
}
@@ -169,17 +174,23 @@ func (b *API) handleStream(c echo.Context) error {
member.Close()
}()
for {
loop: for {
select {
// block until channel has message
case msg := <-member.Read:
if err := json.NewEncoder(c.Response()).Encode(msg); err != nil {
messageWrapper, ok := msg.(MessageWrapper)
if !ok {
break loop
}
message := messageWrapper.message
if err := json.NewEncoder(c.Response()).Encode(message); err != nil {
return err
}
c.Response().Flush()
}
time.Sleep(200 * time.Millisecond)
}
return nil
}
func (b *API) handleWebsocketMessage(message config.Message) {
@@ -193,7 +204,7 @@ func (b *API) handleWebsocketMessage(message config.Message) {
b.Remote <- message
}
func (b *API) writePump(conn *websocket.Conn, member bcast.Member) {
func (b *API) writePump(conn *websocket.Conn, member *bcast.Member) {
ticker := time.NewTicker(pingPeriod)
defer func() {
b.Log.Debug("closing websocket")
@@ -202,14 +213,23 @@ func (b *API) writePump(conn *websocket.Conn, member bcast.Member) {
member.Close()
}()
for {
loop: for {
select {
case msg := <-member.Read:
messageWrapper, ok := msg.(MessageWrapper)
if !ok {
break loop
}
b.Log.Debugf("compare pointer %p == %p", messageWrapper.member, member)
if messageWrapper.member == member {
continue loop
}
message := messageWrapper.message
_ = conn.SetWriteDeadline(time.Now().Add(writeWait))
b.Log.Debugf("sending message %v", msg)
err := conn.WriteJSON(msg)
b.Log.Debugf("sending message %v", message)
err := conn.WriteJSON(message)
if err != nil {
b.Log.Errorf("error: %v", err)
b.Log.Errorf("error: %v", message)
return
}
case <-ticker.C:
@@ -223,10 +243,11 @@ func (b *API) writePump(conn *websocket.Conn, member bcast.Member) {
}
}
func (b *API) readPump(conn *websocket.Conn) {
func (b *API) readPump(conn *websocket.Conn, member *bcast.Member) {
defer func() {
b.Log.Debug("closing websocket")
_ = conn.Close()
member.Close()
}()
_ = conn.SetReadDeadline(time.Now().Add(pongWait))
@@ -248,6 +269,9 @@ func (b *API) readPump(conn *websocket.Conn) {
return
}
b.handleWebsocketMessage(message)
// this also sends to itself, seems like there is no nice way to prevent that
// should not be a problem as long as clients set their userid correctly and filter away messages from themself
member.Send(MessageWrapper{message, member})
}
}
@@ -275,10 +299,10 @@ func (b *API) handleWebsocket(c echo.Context) error {
}
}
member := *b.group.Join()
member := b.group.Join()
go b.writePump(conn, member)
go b.readPump(conn)
go b.readPump(conn, member)
return nil
}