110 lines
3.3 KiB
Go
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
|
|
}
|