83 lines
2.2 KiB
Go
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"
|
|
)
|