caching the last X log messages

alpha
alex 2023-02-19 18:36:15 +01:00
parent b7e02bb4fd
commit 5a15e7b751
7 changed files with 84 additions and 28 deletions

35
dist/script.js vendored
View File

@ -86,14 +86,9 @@ function addMessage(messageType, serviceType, serviceName, message, timestamp) {
deleteOldMessages() deleteOldMessages()
} }
function addViewerInfoMessage(joined, timestamp) { function addCustomMessage(message) {
let li = document.createElement("li") let li = document.createElement("li")
li.innerHTML = message
if (joined) {
li.innerHTML = formatDate(timestamp) + "<span style='color: #2ecc71'>A client has joined</span>"
} else {
li.innerHTML = formatDate(timestamp) + "<span style='color: #e74c3c'>A client has left</span>"
}
messages.appendChild(li) messages.appendChild(li)
@ -104,6 +99,14 @@ function addViewerInfoMessage(joined, timestamp) {
deleteOldMessages() deleteOldMessages()
} }
function addViewerInfoMessage(joined, timestamp) {
if (joined) {
addCustomMessage(formatDate(timestamp) + "<span style='color: #2ecc71'>A client has joined</span>")
} else {
addCustomMessage(formatDate(timestamp) + "<span style='color: #e74c3c'>A client has left</span>")
}
}
function deleteOldMessages() { function deleteOldMessages() {
if (messages.childElementCount > 500) { if (messages.childElementCount > 500) {
messages.removeChild(messages.getElementsByTagName("li")[0]) messages.removeChild(messages.getElementsByTagName("li")[0])
@ -195,18 +198,28 @@ function connectWS() {
serviceType = data.ServiceType serviceType = data.ServiceType
timestamp = data.Timestamp timestamp = data.Timestamp
console.log(timestamp) if (messageType == 100 && serviceName == 100) { // viewer count
if (messageType == 100 && serviceName == 100) {
viewersCount.innerHTML = data.Msg + (data.Msg == 1 ? " viewer" : " viewers") viewersCount.innerHTML = data.Msg + (data.Msg == 1 ? " viewer" : " viewers")
addViewerInfoMessage(serviceType == 1, timestamp) addViewerInfoMessage(serviceType == 1, timestamp)
} else if (messageType == 101 && serviceName == 101 && serviceType == 101) {
lastMessages = JSON.parse(data.Msg)
if (lastMessages != null && lastMessages.length > 0) {
addCustomMessage("<span style='color: #7f8c8d'> START OF OLD MESSAGES </span>")
for (const i in lastMessages) {
addMessage(lastMessages[i].MessageType, lastMessages[i].ServiceType, lastMessages[i].ServiceName, lastMessages[i].Msg, lastMessages[i].Timestamp)
}
addCustomMessage("<span style='color: #7f8c8d'> END OF OLD MESSAGES </span>")
}
} else { } else {
if (serviceType == 0 && !checkboxAlpha.checked) return if (serviceType == 0 && !checkboxAlpha.checked) return
if (serviceType == 1 && !checkboxBeta.checked) return if (serviceType == 1 && !checkboxBeta.checked) return
if (serviceType == 2 && !checkboxStable.checked) return if (serviceType == 2 && !checkboxStable.checked) return
addMessage(messageType, serviceType, serviceName, data["Msg"], timestamp) addMessage(messageType, serviceType, serviceName, data.Msg, timestamp)
} }
} }

View File

@ -18,8 +18,6 @@
package main package main
import ( import (
"time"
"clickandjoin.app/managementsystem/modules/config" "clickandjoin.app/managementsystem/modules/config"
"clickandjoin.app/managementsystem/modules/rabbitmq" "clickandjoin.app/managementsystem/modules/rabbitmq"
"clickandjoin.app/managementsystem/modules/scylladb" "clickandjoin.app/managementsystem/modules/scylladb"
@ -79,7 +77,5 @@ func main() {
router.SetupRoutes(app) router.SetupRoutes(app)
gocnjhelper.LogInfof("%s", time.Now().UnixMilli())
app.Listen(cfg.Host + ":" + cfg.Port) app.Listen(cfg.Host + ":" + cfg.Port)
} }

View File

@ -4,35 +4,59 @@ import (
"sync" "sync"
"clickandjoin.app/managementsystem/modules/structs" "clickandjoin.app/managementsystem/modules/structs"
"clickandjoin.app/managementsystem/modules/utils"
gocnjhelper "git.clickandjoin.umbach.dev/ClickandJoin/go-cnj-helper"
) )
var socketClients = make(map[string]*structs.SocketClient) var socketClients = make(map[string]*structs.SocketClient)
var mu sync.RWMutex var muS sync.RWMutex
func AddSocketClient(clientId string, socketClient *structs.SocketClient) { func AddSocketClient(clientId string, socketClient *structs.SocketClient) {
mu.Lock() muS.Lock()
socketClients[clientId] = socketClient socketClients[clientId] = socketClient
mu.Unlock() muS.Unlock()
} }
func DeleteClient(clientId string) { func DeleteClient(clientId string) {
mu.Lock() muS.Lock()
delete(socketClients, clientId) delete(socketClients, clientId)
mu.Unlock() muS.Unlock()
} }
func GetSocketClients() map[string]*structs.SocketClient { func GetSocketClients() map[string]*structs.SocketClient {
mu.RLock() muS.RLock()
defer mu.RUnlock() defer muS.RUnlock()
return socketClients return socketClients
} }
func GetSocketClient(clientId string) (socketClient *structs.SocketClient, ok bool) { func GetSocketClient(clientId string) (socketClient *structs.SocketClient, ok bool) {
mu.RLock() muS.RLock()
defer mu.RUnlock() defer muS.RUnlock()
client, ok := socketClients[clientId] client, ok := socketClients[clientId]
return client, ok return client, ok
} }
var lastLogMessages []gocnjhelper.RabbitMqLogMessage
var muL sync.RWMutex
func AddLastLogMessage(rabbitMqLogMessage gocnjhelper.RabbitMqLogMessage) {
muL.Lock()
if len(lastLogMessages) > utils.CachedLastLogMessages {
lastLogMessages = lastLogMessages[1:]
}
lastLogMessages = append(lastLogMessages, rabbitMqLogMessage)
muL.Unlock()
}
func GetlastLogMessages() []gocnjhelper.RabbitMqLogMessage {
muL.RLock()
defer muL.RUnlock()
return lastLogMessages
}

View File

@ -3,10 +3,10 @@ package rabbitmq
import ( import (
"encoding/json" "encoding/json"
"clickandjoin.app/managementsystem/modules/cache"
"clickandjoin.app/managementsystem/socketclients" "clickandjoin.app/managementsystem/socketclients"
gocnjhelper "git.clickandjoin.umbach.dev/ClickandJoin/go-cnj-helper" gocnjhelper "git.clickandjoin.umbach.dev/ClickandJoin/go-cnj-helper"
amqp "github.com/rabbitmq/amqp091-go" amqp "github.com/rabbitmq/amqp091-go"
"github.com/rs/zerolog/log"
) )
func LogsMessagesHandling() { func LogsMessagesHandling() {
@ -50,10 +50,10 @@ func LogsMessagesHandling() {
continue continue
} }
log.Info().Msgf("msg", logMessage)
socketclients.BroadcastLogMessage(logMessage) socketclients.BroadcastLogMessage(logMessage)
cache.AddLastLogMessage(logMessage)
msg.Ack(false) msg.Ack(false)
} }
} }

View File

@ -1 +1,3 @@
package utils package utils
const CachedLastLogMessages = 499 // Number of messages held in the cache and sent to new clients to receive the latest messages

View File

@ -1,4 +1,6 @@
# Management System # Definitions that are specified in the app
[Click here to see the definitions](modules/utils/definitions.go)
## Tasks ## Tasks
- Admin Dashboard - Admin Dashboard

View File

@ -1,6 +1,9 @@
package socketserver package socketserver
import ( import (
"encoding/json"
"time"
"clickandjoin.app/managementsystem/modules/cache" "clickandjoin.app/managementsystem/modules/cache"
"clickandjoin.app/managementsystem/modules/structs" "clickandjoin.app/managementsystem/modules/structs"
"clickandjoin.app/managementsystem/socketclients" "clickandjoin.app/managementsystem/socketclients"
@ -24,6 +27,22 @@ func RunHub() {
cache.AddSocketClient(newSocketClient.ClientId, newSocketClient) cache.AddSocketClient(newSocketClient.ClientId, newSocketClient)
socketclients.BroadcastViewersCountMessage(1) socketclients.BroadcastViewersCountMessage(1)
if socketClient, ok := cache.GetSocketClient(newSocketClient.ClientId); ok {
lastMessages, err := json.Marshal(cache.GetlastLogMessages())
if err != nil {
gocnjhelper.LogDebugf("Failed to marshal last messages, err: %s")
continue
}
socketClient.SendMessage(gocnjhelper.RabbitMqLogMessage{
MessageType: 101,
ServiceName: 101,
ServiceType: 101,
Msg: string(lastMessages),
Timestamp: time.Now().Unix(),
})
}
case data := <-broadcast: case data := <-broadcast:
gocnjhelper.LogDebugf("RECEIVED WEBSOCKET MESSAGE: %s", data.Msg) gocnjhelper.LogDebugf("RECEIVED WEBSOCKET MESSAGE: %s", data.Msg)