Skip to content

Commit 3f5f132

Browse files
committed
Fix webrtc:ws source after 1.9.5 #1425
1 parent 8cca8de commit 3f5f132

File tree

2 files changed

+48
-10
lines changed

2 files changed

+48
-10
lines changed

internal/api/ws/ws.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,21 @@ var log zerolog.Logger
3737
type Message struct {
3838
Type string `json:"type"`
3939
Value any `json:"value,omitempty"`
40-
Raw []byte `json:"-"`
4140
}
4241

4342
func (m *Message) String() (value string) {
44-
_ = json.Unmarshal(m.Raw, &value)
43+
if s, ok := m.Value.(string); ok {
44+
return s
45+
}
4546
return
4647
}
4748

4849
func (m *Message) Unmarshal(v any) error {
49-
return json.Unmarshal(m.Raw, v)
50+
b, err := json.Marshal(m.Value)
51+
if err != nil {
52+
return err
53+
}
54+
return json.Unmarshal(b, v)
5055
}
5156

5257
type WSHandler func(tr *Transport, msg *Message) error
@@ -113,20 +118,15 @@ func apiWS(w http.ResponseWriter, r *http.Request) {
113118
})
114119

115120
for {
116-
var raw struct {
117-
Type string `json:"type"`
118-
Value json.RawMessage `json:"value"`
119-
}
120-
if err = ws.ReadJSON(&raw); err != nil {
121+
msg := new(Message)
122+
if err = ws.ReadJSON(msg); err != nil {
121123
if !websocket.IsCloseError(err, websocket.CloseNoStatusReceived) {
122124
log.Trace().Err(err).Caller().Send()
123125
}
124126
_ = ws.Close()
125127
break
126128
}
127129

128-
msg := &Message{Type: raw.Type, Raw: raw.Value}
129-
130130
log.Trace().Str("type", msg.Type).Msg("[api] ws msg")
131131

132132
if handler := wsHandlers[msg.Type]; handler != nil {

internal/webrtc/webrtc_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package webrtc
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
"github.com/AlexxIT/go2rtc/internal/api/ws"
8+
pion "github.com/pion/webrtc/v3"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestWebRTCAPIv1(t *testing.T) {
13+
raw := `{"type":"webrtc/offer","value":"v=0\n..."}`
14+
msg := new(ws.Message)
15+
err := json.Unmarshal([]byte(raw), msg)
16+
require.Nil(t, err)
17+
18+
require.Equal(t, "v=0\n...", msg.String())
19+
}
20+
21+
func TestWebRTCAPIv2(t *testing.T) {
22+
raw := `{"type":"webrtc","value":{"type":"offer","sdp":"v=0\n...","ice_servers":[{"urls":["stun:stun.l.google.com:19302"]}]}}`
23+
msg := new(ws.Message)
24+
err := json.Unmarshal([]byte(raw), msg)
25+
require.Nil(t, err)
26+
27+
var offer struct {
28+
Type string `json:"type"`
29+
SDP string `json:"sdp"`
30+
ICEServers []pion.ICEServer `json:"ice_servers"`
31+
}
32+
err = msg.Unmarshal(&offer)
33+
require.Nil(t, err)
34+
35+
require.Equal(t, "offer", offer.Type)
36+
require.Equal(t, "v=0\n...", offer.SDP)
37+
require.Equal(t, "stun:stun.l.google.com:19302", offer.ICEServers[0].URLs[0])
38+
}

0 commit comments

Comments
 (0)