rework ws responses to user, send events to user via ws

This commit is contained in:
2026-04-12 13:18:54 +02:00
parent 9076a5c5c8
commit 63b585313a
9 changed files with 149 additions and 103 deletions
+36 -45
View File
@@ -7,7 +7,7 @@ import (
"net/http"
"time"
"go-socket/Enums/WsMessageFrom"
"go-socket/Enums/WsEventType"
"github.com/coder/websocket"
"github.com/coder/websocket/wsjson"
@@ -54,21 +54,7 @@ func ServeWsConnection(responseWriter http.ResponseWriter, request *http.Request
}
}
func sendMessageStructCloseIfTimeout(user *User, message *Message) {
if user.WsConn == nil {
return
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err := wsjson.Write(ctx, user.WsConn, message)
if err != nil {
log.Printf("json write error: %v", err)
}
}
func sendMessageCloseIfTimeout(user *User, message *map[string]any) {
func WsSendMessageCloseIfTimeout(user *User, message any) {
if user.WsConn == nil {
return
}
@@ -94,65 +80,64 @@ func sendToAllMessageCloseIfTimeout(message *map[string]any) {
mu.RUnlock()
for _, user := range users {
sendMessageCloseIfTimeout(user, message)
WsSendMessageCloseIfTimeout(user, message)
}
}
func WsMessageSendToUser(to *User, message *Message) {
sendMessageStructCloseIfTimeout(to, message)
}
func WsSendToGroup(group *Group, sender *User, message string) error {
func WsSendToGroupAsUser(group *Group, sender *User, message string) error {
for groupUserId := range group.Users {
groupUser, err := CacheGetUserById(groupUserId)
if err != nil || groupUser.Id == sender.Id {
continue
}
// TODO update on groups rework
var msg = map[string]any{
"type": WsMessageFrom.Group,
// "type": WsEventType.Group,
"from": group.Id,
"sender": sender.Id,
"content": message,
}
sendMessageCloseIfTimeout(groupUser, &msg)
WsSendMessageCloseIfTimeout(groupUser, &msg)
}
return nil
}
func handleAuthenticatedMessage(user *User, userMessage *map[string]any) bool {
sendMessageCloseIfTimeout(user, userMessage)
WsSendMessageCloseIfTimeout(user, userMessage)
return true
}
func handleUnauthenticatedMessage(ctx context.Context, user *User, userMessage *map[string]any) bool {
token, ok := (*userMessage)["token"].(string)
response := WsEventMessage{Type: WsEventType.Authentication}
if !ok {
var msg = map[string]any{
"type": WsMessageFrom.Server,
"error": "no token in message",
response.Event = WsAuthMessage{
Success: false,
Error: "no token in message",
}
sendMessageCloseIfTimeout(user, &msg)
WsSendMessageCloseIfTimeout(user, response)
return false
}
userId, err := TokenValidateGetId(token)
if err != nil {
var msg = map[string]any{
"type": WsMessageFrom.Server,
"error": "invalid token",
response.Event = WsAuthMessage{
Success: false,
Error: "invalid token",
}
sendMessageCloseIfTimeout(user, &msg)
WsSendMessageCloseIfTimeout(user, response)
return false
}
userFromCache, err := CacheGetUserById(userId)
if err != nil {
var msg = map[string]any{
"type": WsMessageFrom.Server,
"error": "user not found",
response.Event = WsAuthMessage{
Success: false,
Error: "user not found",
}
sendMessageCloseIfTimeout(user, &msg)
WsSendMessageCloseIfTimeout(user, response)
return false
}
@@ -166,25 +151,31 @@ func handleUnauthenticatedMessage(ctx context.Context, user *User, userMessage *
err = DbGroupGetById(ctx, dbGroup)
if err != nil {
var msg = map[string]any{
"type": "server",
"error": "invalid user data",
response.Event = WsAuthMessage{
Success: false,
Error: "invalid user data",
}
sendMessageCloseIfTimeout(user, &msg)
WsSendMessageCloseIfTimeout(user, response)
return false
}
err = DbGroupGetMembers(ctx, dbGroup)
if err != nil {
var msg = map[string]any{
"type": "server",
"error": "invalid user data",
response.Event = WsAuthMessage{
Success: false,
Error: "invalid user data",
}
sendMessageCloseIfTimeout(user, &msg)
WsSendMessageCloseIfTimeout(user, response)
return false
}
CacheSaveGroup(dbGroup)
}
}
response.Event = WsAuthMessage{
Success: true,
Error: "",
}
WsSendMessageCloseIfTimeout(user, response)
return true
}