🎉 Initial Commit of Ring
This commit is contained in:
82
pkg/ring/websocket/models.go
Normal file
82
pkg/ring/websocket/models.go
Normal file
@@ -0,0 +1,82 @@
|
||||
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"
|
||||
)
|
||||
Reference in New Issue
Block a user