caching the last X log messages
parent
b7e02bb4fd
commit
5a15e7b751
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
main.go
4
main.go
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue