dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit cbbc8ddd5814d091ec4be0f779f2e2d10e16deed
parent 51baae59f8ef6b485f5eefcaffd0985506ef3395
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 28 Dec 2023 23:47:40 -0500

cleanup

Diffstat:
Mpkg/web/handlers/api/v1/chat.go | 10++++++----
Mpkg/web/handlers/chess.go | 10++++++----
Mpkg/web/handlers/poker.go | 15+++++++++------
Mpkg/web/handlers/usersStreamsManager/usersStreamsManager.go | 16+++++++++++++---
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) {