Skip to content

Commit 16e4831

Browse files
committed
Add the option to pass ICE servers with an async WebRTC offer #1408
1 parent 9d709f0 commit 16e4831

File tree

2 files changed

+46
-30
lines changed

2 files changed

+46
-30
lines changed

internal/api/ws/ws.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ws
22

33
import (
4+
"encoding/json"
45
"io"
56
"net/http"
67
"net/url"
@@ -36,22 +37,16 @@ var log zerolog.Logger
3637
type Message struct {
3738
Type string `json:"type"`
3839
Value any `json:"value,omitempty"`
40+
Raw []byte `json:"-"`
3941
}
4042

41-
func (m *Message) String() string {
42-
if s, ok := m.Value.(string); ok {
43-
return s
44-
}
45-
return ""
43+
func (m *Message) String() (value string) {
44+
_ = json.Unmarshal(m.Raw, &value)
45+
return
4646
}
4747

48-
func (m *Message) GetString(key string) string {
49-
if v, ok := m.Value.(map[string]any); ok {
50-
if s, ok := v[key].(string); ok {
51-
return s
52-
}
53-
}
54-
return ""
48+
func (m *Message) Unmarshal(v any) error {
49+
return json.Unmarshal(m.Raw, v)
5550
}
5651

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

120115
for {
121-
msg := new(Message)
122-
if err = ws.ReadJSON(msg); err != nil {
116+
var raw struct {
117+
Type string `json:"type"`
118+
Value json.RawMessage `json:"value"`
119+
}
120+
if err = ws.ReadJSON(&raw); err != nil {
123121
if !websocket.IsCloseError(err, websocket.CloseNoStatusReceived) {
124122
log.Trace().Err(err).Caller().Send()
125123
}
126124
_ = ws.Close()
127125
break
128126
}
129127

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.go

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,17 @@ func Init() {
4040
AddCandidate(network, candidate)
4141
}
4242

43+
var err error
44+
4345
// create pionAPI with custom codecs list and custom network settings
44-
serverAPI, err := webrtc.NewServerAPI(network, address, &filters)
46+
serverAPI, err = webrtc.NewServerAPI(network, address, &filters)
4547
if err != nil {
4648
log.Error().Err(err).Caller().Send()
4749
return
4850
}
4951

5052
// use same API for WebRTC server and client if no address
51-
clientAPI := serverAPI
53+
clientAPI = serverAPI
5254

5355
if address != "" {
5456
log.Info().Str("addr", cfg.Mod.Listen).Msg("[webrtc] listen")
@@ -81,11 +83,13 @@ func Init() {
8183
streams.HandleFunc("webrtc", streamsHandler)
8284
}
8385

86+
var serverAPI, clientAPI *pion.API
87+
8488
var log zerolog.Logger
8589

8690
var PeerConnection func(active bool) (*pion.PeerConnection, error)
8791

88-
func asyncHandler(tr *ws.Transport, msg *ws.Message) error {
92+
func asyncHandler(tr *ws.Transport, msg *ws.Message) (err error) {
8993
var stream *streams.Stream
9094
var mode core.Mode
9195

@@ -104,8 +108,30 @@ func asyncHandler(tr *ws.Transport, msg *ws.Message) error {
104108
return errors.New(api.StreamNotFound)
105109
}
106110

111+
var offer struct {
112+
Type string `json:"type"`
113+
SDP string `json:"sdp"`
114+
ICEServers []pion.ICEServer `json:"ice_servers"`
115+
}
116+
117+
// V2 - json/object exchange, V1 - raw SDP exchange
118+
apiV2 := msg.Type == "webrtc"
119+
120+
if apiV2 {
121+
if err = msg.Unmarshal(&offer); err != nil {
122+
return err
123+
}
124+
} else {
125+
offer.SDP = msg.String()
126+
}
127+
107128
// create new PeerConnection instance
108-
pc, err := PeerConnection(false)
129+
var pc *pion.PeerConnection
130+
if offer.ICEServers == nil {
131+
pc, err = PeerConnection(false)
132+
} else {
133+
pc, err = serverAPI.NewPeerConnection(pion.Configuration{ICEServers: offer.ICEServers})
134+
}
109135
if err != nil {
110136
log.Error().Err(err).Caller().Send()
111137
return err
@@ -145,20 +171,10 @@ func asyncHandler(tr *ws.Transport, msg *ws.Message) error {
145171
}
146172
})
147173

148-
// V2 - json/object exchange, V1 - raw SDP exchange
149-
apiV2 := msg.Type == "webrtc"
174+
log.Trace().Msgf("[webrtc] offer:\n%s", offer.SDP)
150175

151176
// 1. SetOffer, so we can get remote client codecs
152-
var offer string
153-
if apiV2 {
154-
offer = msg.GetString("sdp")
155-
} else {
156-
offer = msg.String()
157-
}
158-
159-
log.Trace().Msgf("[webrtc] offer:\n%s", offer)
160-
161-
if err = conn.SetOffer(offer); err != nil {
177+
if err = conn.SetOffer(offer.SDP); err != nil {
162178
log.Warn().Err(err).Caller().Send()
163179
return err
164180
}

0 commit comments

Comments
 (0)