commit cbbc8ddd5814d091ec4be0f779f2e2d10e16deed
parent 51baae59f8ef6b485f5eefcaffd0985506ef3395
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 28 Dec 2023 23:47:40 -0500
cleanup
Diffstat:
4 files changed, 34 insertions(+), 17 deletions(-)
diff --git a/pkg/web/handlers/api/v1/chat.go b/pkg/web/handlers/api/v1/chat.go
@@ -113,10 +113,11 @@ func ChatStreamMessagesHandler(c echo.Context) error {
quit := hutils.SetStreaming(c)
// Keep track of users streams, so we can limit how many are open at one time per user
- if err := usersStreamsManager.Inst.Add(authUser.ID, ""); err != nil {
+ if item, err := usersStreamsManager.Inst.Add(authUser.ID, ""); err == nil {
+ defer item.Cleanup()
+ } else {
return nil
}
- defer usersStreamsManager.Inst.Remove(authUser.ID, "")
// Keep track of how many bytes we sent on the http request, so we can auto-refresh when passing a threshold
bytesSent := 0
@@ -432,10 +433,11 @@ func ChatStreamMenuHandler(c echo.Context) error {
}
// Keep track of users streams, so we can limit how many are open at one time per user
- if err := usersStreamsManager.Inst.Add(authUser.ID, ""); err != nil {
+ if item, err := usersStreamsManager.Inst.Add(authUser.ID, ""); err == nil {
+ defer item.Cleanup()
+ } else {
return nil
}
- defer usersStreamsManager.Inst.Remove(authUser.ID, "")
quit := hutils.SetStreaming(c)
send := func(s string) { _, _ = c.Response().Write([]byte(s)) }
diff --git a/pkg/web/handlers/chess.go b/pkg/web/handlers/chess.go
@@ -120,10 +120,11 @@ func ChessGameAnalyzeHandler(c echo.Context) error {
quit := hutils.SetStreaming(c)
- if err := usersStreamsManager.Inst.Add(authUser.ID, "analyze_"+key); err != nil {
+ if item, err := usersStreamsManager.Inst.Add(authUser.ID, "analyze_"+key); err == nil {
+ defer item.Cleanup()
+ } else {
return nil
}
- defer usersStreamsManager.Inst.Remove(authUser.ID, "analyze_"+key)
sub := interceptors.ChessAnalyzeProgressPubSub.Subscribe([]string{"chess_analyze_progress_" + key})
defer sub.Close()
@@ -600,10 +601,11 @@ func ChessGameHandler(c echo.Context) error {
quit := hutils.SetStreaming(c)
- if err := usersStreamsManager.Inst.Add(authUser.ID, key); err != nil {
+ if item, err := usersStreamsManager.Inst.Add(authUser.ID, key); err == nil {
+ defer item.Cleanup()
+ } else {
return nil
}
- defer usersStreamsManager.Inst.Remove(authUser.ID, key)
send(hutils.HtmlCssReset)
send(`<style>html, body { background-color: #222; }</style>`)
diff --git a/pkg/web/handlers/poker.go b/pkg/web/handlers/poker.go
@@ -420,10 +420,11 @@ func PokerStreamHandler(c echo.Context) error {
quit := hutils.SetStreaming(c)
// Keep track of users streams, so we can limit how many are open at one time per user
- if err := usersStreamsManager.Inst.Add(authUser.ID, roomTopic); err != nil {
+ if item, err := usersStreamsManager.Inst.Add(authUser.ID, roomTopic); err == nil {
+ defer item.Cleanup()
+ } else {
return nil
}
- defer usersStreamsManager.Inst.Remove(authUser.ID, roomTopic)
sub := poker.PubSub.Subscribe([]string{roomTopic, roomUserTopic, "refresh_loading_icon_" + string(authUser.Username)})
defer sub.Close()
@@ -459,10 +460,11 @@ func PokerLogsHandler(c echo.Context) error {
quit := hutils.SetStreaming(c)
// Keep track of users streams, so we can limit how many are open at one time per user
- if err := usersStreamsManager.Inst.Add(authUser.ID, roomLogsTopic); err != nil {
+ if item, err := usersStreamsManager.Inst.Add(authUser.ID, roomLogsTopic); err == nil {
+ defer item.Cleanup()
+ } else {
return nil
}
- defer usersStreamsManager.Inst.Remove(authUser.ID, roomLogsTopic)
send(hutils.HtmlCssReset)
send(`<style>body { background-color: #444; color: #ddd; padding: 3px; }</style><div style="display:flex;flex-direction:column-reverse;">`)
@@ -501,10 +503,11 @@ func PokerBetHandler(c echo.Context) error {
quit := hutils.SetStreaming(c)
// Keep track of users streams, so we can limit how many are open at one time per user
- if err := usersStreamsManager.Inst.Add(authUser.ID, roomUserTopic); err != nil {
+ if item, err := usersStreamsManager.Inst.Add(authUser.ID, roomUserTopic); err == nil {
+ defer item.Cleanup()
+ } else {
return nil
}
- defer usersStreamsManager.Inst.Remove(authUser.ID, roomUserTopic)
if c.Request().Method == http.MethodPost {
submitBtn := c.Request().PostFormValue("submitBtn")
diff --git a/pkg/web/handlers/usersStreamsManager/usersStreamsManager.go b/pkg/web/handlers/usersStreamsManager/usersStreamsManager.go
@@ -32,19 +32,29 @@ func NewUsersStreamsManager() *UsersStreamsManager {
return &UsersStreamsManager{m: make(map[database.UserID]UserStreamsMap)}
}
-func (m *UsersStreamsManager) Add(userID database.UserID, key string) error {
+type Item struct {
+ m *UsersStreamsManager
+ userID database.UserID
+ key string
+}
+
+func (i *Item) Cleanup() {
+ i.m.Remove(i.userID, i.key)
+}
+
+func (m *UsersStreamsManager) Add(userID database.UserID, key string) (*Item, error) {
m.Lock()
defer m.Unlock()
userMap, found := m.m[userID]
if found && userMap.count() >= userMaxStream {
- return ErrTooManyStreams
+ return nil, ErrTooManyStreams
}
if !found {
userMap = make(UserStreamsMap)
}
userMap[key]++
m.m[userID] = userMap
- return nil
+ return &Item{m: m, userID: userID, key: key}, nil
}
func (m *UsersStreamsManager) Remove(userID database.UserID, key string) {