@@ -24,6 +24,7 @@ import (
2424
2525 "github.com/pion/webrtc/v4"
2626 "go.uber.org/atomic"
27+ "golang.org/x/mod/semver"
2728 "google.golang.org/protobuf/encoding/protojson"
2829 "google.golang.org/protobuf/proto"
2930
@@ -127,9 +128,10 @@ type RTCEngine struct {
127128 engineHandler engineHandler
128129 cbGetLocalParticipantSID func () string
129130
130- pclock sync.Mutex
131- publisher * PCTransport
132- subscriber * PCTransport
131+ pclock sync.Mutex
132+ publisher * PCTransport
133+ pendingPublisherOffer webrtc.SessionDescription
134+ subscriber * PCTransport
133135
134136 signalling signalling.Signalling
135137 signalHandler signalling.SignalHandler
@@ -175,9 +177,15 @@ func NewRTCEngine(
175177 joinTimeout : 15 * time .Second ,
176178 reliableMsgSeq : 1 ,
177179 }
178- e .signalling = signalling .NewSignalling (signalling.SignallingParams {
179- Logger : e .log ,
180- })
180+ if semver .Compare ("v" + Version , "v3.0.0" ) < 0 {
181+ e .signalling = signalling .NewSignalling (signalling.SignallingParams {
182+ Logger : e .log ,
183+ })
184+ } else {
185+ e .signalling = signalling .NewSignallingJoinRequest (signalling.SignallingJoinRequestParams {
186+ Logger : e .log ,
187+ })
188+ }
181189 e .signalHandler = signalling .NewSignalHandler (signalling.SignalHandlerParams {
182190 Logger : e .log ,
183191 Processor : e ,
@@ -219,14 +227,31 @@ func (e *RTCEngine) JoinContext(
219227 e .token .Store (token )
220228 e .connParams = connectParams
221229
222- if err := e .signalTransport .Join (ctx , url , token , * connectParams ); err != nil {
230+ var (
231+ publisherOffer webrtc.SessionDescription
232+ err error
233+ )
234+ if e .signalling .PublishInJoin () {
235+ e .pclock .Lock ()
236+ e .createPublisherPCLocked (webrtc.Configuration {})
237+
238+ publisherOffer , err = e .publisher .GetLocalOffer ()
239+ if err != nil {
240+ e .pclock .Unlock ()
241+ return false , err
242+ }
243+ e .pendingPublisherOffer = publisherOffer
244+ e .pclock .Unlock ()
245+ }
246+
247+ if err = e .signalTransport .Join (ctx , url , token , * connectParams , nil , publisherOffer ); err != nil {
223248 if verr := e .validate (ctx , url , token , connectParams , "" ); verr != nil {
224249 return false , verr
225250 }
226251 return false , err
227252 }
228253
229- if err : = e .waitUntilConnected (); err != nil {
254+ if err = e .waitUntilConnected (); err != nil {
230255 return false , err
231256 }
232257
@@ -1183,12 +1208,25 @@ func (e *RTCEngine) OnJoinResponse(res *livekit.JoinResponse) error {
11831208
11841209 e .signalTransport .Start ()
11851210
1186- // send offer
1187- if ! res .SubscriberPrimary || res .FastPublish {
1211+ if e .signalling .PublishInJoin () {
11881212 if publisher , ok := e .Publisher (); ok {
1189- publisher .Negotiate ()
1190- } else {
1191- e .log .Warnw ("no publisher peer connection" , ErrNoPeerConnection )
1213+ e .pclock .Lock ()
1214+ pendingPublisherOffer := e .pendingPublisherOffer
1215+ e .pendingPublisherOffer = webrtc.SessionDescription {}
1216+ e .pclock .Unlock ()
1217+
1218+ if pendingPublisherOffer .SDP != "" {
1219+ publisher .SetLocalOffer (pendingPublisherOffer )
1220+ }
1221+ }
1222+ } else {
1223+ // send offer
1224+ if ! res .SubscriberPrimary || res .FastPublish {
1225+ if publisher , ok := e .Publisher (); ok {
1226+ publisher .Negotiate ()
1227+ } else {
1228+ e .log .Warnw ("no publisher peer connection" , ErrNoPeerConnection )
1229+ }
11921230 }
11931231 }
11941232
0 commit comments