mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-12 08:45:38 +02:00
⭐ feat: protobuf input messaging (#165)
Replace json protocol by protobuf generate protobuf files with `bun buf generate` or just `buf generate` - [x] Implement all datatypes with proto files - [x] Map to ts types or use the generated proto types directly with: - [x] web frontend - [x] relay - [x] runner - [ ] final performance test (to be done when CI builds new images) --------- Co-authored-by: DatCaptainHorse <DatCaptainHorse@users.noreply.github.com>
This commit is contained in:
@@ -1,27 +1,17 @@
|
||||
package relay
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/pion/webrtc/v4"
|
||||
"time"
|
||||
)
|
||||
|
||||
// OnMessageCallback is a callback for binary messages of given type
|
||||
// OnMessageCallback is a callback for messages of given type
|
||||
type OnMessageCallback func(data []byte)
|
||||
|
||||
// MessageBase is the base type for WS/DC messages.
|
||||
type MessageBase struct {
|
||||
PayloadType string `json:"payload_type"`
|
||||
LatencyTracker LatencyTracker `json:"latency_tracker,omitempty"`
|
||||
}
|
||||
|
||||
// MessageInput represents an input message.
|
||||
type MessageInput struct {
|
||||
MessageBase
|
||||
Data string `json:"data"`
|
||||
PayloadType string `json:"payload_type"`
|
||||
Latency *LatencyTracker `json:"latency,omitempty"`
|
||||
}
|
||||
|
||||
// MessageLog represents a log message.
|
||||
@@ -93,50 +83,6 @@ type MessageAnswer struct {
|
||||
AnswerType AnswerType `json:"answer_type"`
|
||||
}
|
||||
|
||||
// EncodeMessage encodes a message to be sent with gzip compression
|
||||
func EncodeMessage(msg interface{}) ([]byte, error) {
|
||||
// Marshal the message to JSON
|
||||
data, err := json.Marshal(msg)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to encode message: %w", err)
|
||||
}
|
||||
|
||||
// Gzip compress the JSON
|
||||
var compressedData bytes.Buffer
|
||||
writer := gzip.NewWriter(&compressedData)
|
||||
_, err = writer.Write(data)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to compress message: %w", err)
|
||||
}
|
||||
if err := writer.Close(); err != nil {
|
||||
return nil, fmt.Errorf("failed to finalize compression: %w", err)
|
||||
}
|
||||
|
||||
return compressedData.Bytes(), nil
|
||||
}
|
||||
|
||||
// DecodeMessage decodes a message received with gzip decompression
|
||||
func DecodeMessage(data []byte, target interface{}) error {
|
||||
// Gzip decompress the data
|
||||
reader, err := gzip.NewReader(bytes.NewReader(data))
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to initialize decompression: %w", err)
|
||||
}
|
||||
defer func(reader *gzip.Reader) {
|
||||
if err = reader.Close(); err != nil {
|
||||
fmt.Printf("failed to close reader: %v\n", err)
|
||||
}
|
||||
}(reader)
|
||||
|
||||
// Decode the JSON
|
||||
err = json.NewDecoder(reader).Decode(target)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to decode message: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SendLogMessageWS sends a log message to the given WebSocket connection.
|
||||
func (ws *SafeWebSocket) SendLogMessageWS(level, message string) error {
|
||||
msg := MessageLog{
|
||||
@@ -145,12 +91,7 @@ func (ws *SafeWebSocket) SendLogMessageWS(level, message string) error {
|
||||
Message: message,
|
||||
Time: time.Now().Format(time.RFC3339),
|
||||
}
|
||||
encoded, err := EncodeMessage(msg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to encode log message: %w", err)
|
||||
}
|
||||
|
||||
return ws.SendBinary(encoded)
|
||||
return ws.SendJSON(msg)
|
||||
}
|
||||
|
||||
// SendMetricsMessageWS sends a metrics message to the given WebSocket connection.
|
||||
@@ -162,12 +103,7 @@ func (ws *SafeWebSocket) SendMetricsMessageWS(usageCPU, usageMemory float64, upt
|
||||
Uptime: uptime,
|
||||
PipelineLatency: pipelineLatency,
|
||||
}
|
||||
encoded, err := EncodeMessage(msg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to encode metrics message: %w", err)
|
||||
}
|
||||
|
||||
return ws.SendBinary(encoded)
|
||||
return ws.SendJSON(msg)
|
||||
}
|
||||
|
||||
// SendICECandidateMessageWS sends an ICE candidate message to the given WebSocket connection.
|
||||
@@ -176,12 +112,7 @@ func (ws *SafeWebSocket) SendICECandidateMessageWS(candidate webrtc.ICECandidate
|
||||
MessageBase: MessageBase{PayloadType: "ice"},
|
||||
Candidate: candidate,
|
||||
}
|
||||
encoded, err := EncodeMessage(msg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to encode ICE candidate message: %w", err)
|
||||
}
|
||||
|
||||
return ws.SendBinary(encoded)
|
||||
return ws.SendJSON(msg)
|
||||
}
|
||||
|
||||
// SendSDPMessageWS sends an SDP message to the given WebSocket connection.
|
||||
@@ -190,12 +121,7 @@ func (ws *SafeWebSocket) SendSDPMessageWS(sdp webrtc.SessionDescription) error {
|
||||
MessageBase: MessageBase{PayloadType: "sdp"},
|
||||
SDP: sdp,
|
||||
}
|
||||
encoded, err := EncodeMessage(msg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to encode SDP message: %w", err)
|
||||
}
|
||||
|
||||
return ws.SendBinary(encoded)
|
||||
return ws.SendJSON(msg)
|
||||
}
|
||||
|
||||
// SendAnswerMessageWS sends an answer message to the given WebSocket connection.
|
||||
@@ -204,24 +130,5 @@ func (ws *SafeWebSocket) SendAnswerMessageWS(answer AnswerType) error {
|
||||
MessageBase: MessageBase{PayloadType: "answer"},
|
||||
AnswerType: answer,
|
||||
}
|
||||
encoded, err := EncodeMessage(msg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to encode answer message: %w", err)
|
||||
}
|
||||
|
||||
return ws.SendBinary(encoded)
|
||||
}
|
||||
|
||||
// SendInputMessageDC sends an input message to the given DataChannel connection.
|
||||
func (ndc *NestriDataChannel) SendInputMessageDC(data string) error {
|
||||
msg := MessageInput{
|
||||
MessageBase: MessageBase{PayloadType: "input"},
|
||||
Data: data,
|
||||
}
|
||||
encoded, err := EncodeMessage(msg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to encode input message: %w", err)
|
||||
}
|
||||
|
||||
return ndc.SendBinary(encoded)
|
||||
return ws.SendJSON(msg)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user