Files
websocket-qris/internal/services/websocket/message.go
2025-10-24 12:33:10 +00:00

110 lines
3.3 KiB
Go

package websocket
import (
"time"
"github.com/google/uuid"
)
// MessageType mendefinisikan tipe-tipe pesan yang valid
type MessageType string
const (
// Pesan koneksi
WelcomeMessage MessageType = "welcome"
ErrorMessage MessageType = "error"
DisconnectMessage MessageType = "disconnect"
// Pesan kontrol
PingMessage MessageType = "ping"
PongMessage MessageType = "pong"
HeartbeatMessage MessageType = "heartbeat"
ConnectionTestMessage MessageType = "connection_test"
// Pesan informasi
ServerInfoMessage MessageType = "server_info"
ClientInfoMessage MessageType = "client_info"
OnlineUsersMessage MessageType = "online_users"
// Pesan komunikasi
DirectMessage MessageType = "direct_message"
RoomMessage MessageType = "room_message"
BroadcastMessage MessageType = "broadcast"
// Pesan database
DatabaseQueryMessage MessageType = "database_query"
DatabaseChangeMessage MessageType = "database_change"
DatabaseInsertMessage MessageType = "db_insert"
DatabaseCustomQueryMessage MessageType = "db_custom_query"
// Pesan monitoring
SystemStatusMessage MessageType = "system_status"
DataStreamMessage MessageType = "data_stream"
// Pesan room management
JoinRoomMessage MessageType = "join_room"
LeaveRoomMessage MessageType = "leave_room"
GetRoomInfoMessage MessageType = "get_room_info"
// Pesan admin
AdminKickClientMessage MessageType = "admin_kick_client"
AdminKillServerMessage MessageType = "admin_kill_server"
GetServerStatsMessage MessageType = "get_server_stats"
GetSystemHealthMessage MessageType = "get_system_health"
AdminClearLogsMessage MessageType = "admin_clear_logs"
// Pesan utility
GetStatsMessage MessageType = "get_stats"
)
// WebSocketMessage menyimpan struktur pesan WebSocket
type WebSocketMessage struct {
Type MessageType `json:"type"`
Data interface{} `json:"data"`
Timestamp time.Time `json:"timestamp"`
ClientID string `json:"client_id,omitempty"`
MessageID string `json:"message_id,omitempty"`
Room string `json:"room,omitempty"`
}
// NewWebSocketMessage membuat pesan WebSocket baru
func NewWebSocketMessage(msgType MessageType, data interface{}, clientID, room string) WebSocketMessage {
return WebSocketMessage{
Type: msgType,
Data: data,
Timestamp: time.Now(),
ClientID: clientID,
MessageID: uuid.New().String(),
Room: room,
}
}
// MessageHandler mendefinisikan interface untuk handler pesan
type MessageHandler interface {
HandleMessage(client *Client, message WebSocketMessage) error
MessageType() MessageType
}
// MessageRegistry menyimpan registry untuk handler pesan
type MessageRegistry struct {
handlers map[MessageType]MessageHandler
}
// NewMessageRegistry membuat registry pesan baru
func NewMessageRegistry() *MessageRegistry {
return &MessageRegistry{
handlers: make(map[MessageType]MessageHandler),
}
}
// RegisterHandler mendaftarkan handler untuk tipe pesan tertentu
func (r *MessageRegistry) RegisterHandler(handler MessageHandler) {
r.handlers[handler.MessageType()] = handler
}
// GetHandler mendapatkan handler untuk tipe pesan tertentu
func (r *MessageRegistry) GetHandler(msgType MessageType) (MessageHandler, bool) {
handler, exists := r.handlers[msgType]
return handler, exists
}