Files
Turbine/pkg/ring/websocket/models.go
2025-12-13 22:51:11 +08:00

83 lines
2.2 KiB
Go

package websocket
import (
"encoding/json"
"fmt"
pb "git.solsynth.dev/goatworks/turbine/pkg/shared/proto/gen"
"google.golang.org/protobuf/types/known/wrapperspb"
)
// WebSocketPacket represents a WebSocket message packet.
type WebSocketPacket struct {
Type string `json:"type"`
Data json.RawMessage `json:"data,omitempty"` // Use json.RawMessage to delay deserialization
Endpoint string `json:"endpoint,omitempty"`
ErrorMessage string `json:"error_message,omitempty"`
}
// ToBytes serializes the WebSocketPacket to a byte array for sending over WebSocket.
func (w *WebSocketPacket) ToBytes() ([]byte, error) {
return json.Marshal(w)
}
// FromBytes deserializes a byte array into a WebSocketPacket.
func FromBytes(bytes []byte) (*WebSocketPacket, error) {
var packet WebSocketPacket
err := json.Unmarshal(bytes, &packet)
if err != nil {
return nil, fmt.Errorf("failed to deserialize WebSocketPacket: %w", err)
}
return &packet, nil
}
// GetData deserializes the Data property to the specified type T.
func (w *WebSocketPacket) GetData(v interface{}) error {
if w.Data == nil {
return nil
}
return json.Unmarshal(w.Data, v)
}
// ToProtoValue converts the WebSocketPacket to its protobuf equivalent.
func (w *WebSocketPacket) ToProtoValue() *pb.WebSocketPacket {
var dataBytes []byte
if w.Data != nil {
dataBytes = w.Data
}
var errorMessage string
if w.ErrorMessage != "" {
errorMessage = w.ErrorMessage
}
return &pb.WebSocketPacket{
Type: w.Type,
Data: dataBytes,
ErrorMessage: wrapperspb.String(errorMessage),
}
}
// FromProtoValue converts a protobuf WebSocketPacket to its Go struct equivalent.
func FromProtoValue(packet *pb.WebSocketPacket) *WebSocketPacket {
var data json.RawMessage
if packet.Data != nil {
data = json.RawMessage(packet.Data)
}
var errorMessage string
if packet.ErrorMessage != nil {
errorMessage = packet.ErrorMessage.GetValue()
}
return &WebSocketPacket{
Type: packet.Type,
Data: data,
ErrorMessage: errorMessage,
}
}
// WebSocketPacketType constants from C# example
const (
WebSocketPacketTypePing = "ping"
WebSocketPacketTypePong = "pong"
WebSocketPacketTypeError = "error"
)