Fix backend websocket concurrent subscriptions issue

This commit is contained in:
Brieuc Dubois 2024-01-21 01:16:23 +01:00
parent a1b322bdcb
commit 74e191c94d
1 changed files with 9 additions and 5 deletions

View File

@ -3,13 +3,14 @@ package handlers
import (
"encoding/json"
"log"
"sync"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/websocket/v2"
)
var (
subscribers = make(map[*websocket.Conn]bool)
subscribers = sync.Map{}
)
func wsRouter(router fiber.Router) error {
@ -27,9 +28,9 @@ func upgradeWebsocket(c *fiber.Ctx) error {
}
func handleWebsocket(c *websocket.Conn) {
subscribers[c] = true
subscribers.Store(c, true)
defer func() {
delete(subscribers, c)
subscribers.Delete(c)
c.Close()
}()
@ -48,10 +49,13 @@ func publish(content fiber.Map) {
return
}
for s := range subscribers {
subscribers.Range(func(key, value interface{}) bool {
s := key.(*websocket.Conn)
if err := s.WriteMessage(websocket.TextMessage, jsonMessage); err != nil {
log.Println("Error writing to websocket:", err)
s.Close()
subscribers.Delete(s)
}
}
return true
})
}