Skip to content

Commit 89f586d

Browse files
authored
Use JoinRequest as query param (#712)
* Use JoinRequest as query param * deps * split out join request signalling and use it only when client version is >= 3.0.0 * fix semver check * no gzip * gzip in wrapper
1 parent a2f0181 commit 89f586d

12 files changed

+437
-152
lines changed

engine.go

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ require (
1010
github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731
1111
github.com/livekit/media-sdk v0.0.0-20250518151703-b07af88637c5
1212
github.com/livekit/mediatransportutil v0.0.0-20250519131108-fb90f5acfded
13-
github.com/livekit/protocol v1.39.4-0.20250806031641-1edabe8e86df
13+
github.com/livekit/protocol v1.39.4-0.20250807105828-ccbae8154e54
1414
github.com/magefile/mage v1.15.0
1515
github.com/pion/dtls/v3 v3.0.6
1616
github.com/pion/interceptor v0.1.40
@@ -23,9 +23,11 @@ require (
2323
go.uber.org/atomic v1.11.0
2424
golang.org/x/crypto v0.40.0
2525
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792
26-
google.golang.org/protobuf v1.36.6
26+
google.golang.org/protobuf v1.36.7
2727
)
2828

29+
require golang.org/x/mod v0.26.0
30+
2931
require (
3032
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250717185734-6c6e0d3c608e.1 // indirect
3133
buf.build/go/protovalidate v0.14.0 // indirect

go.sum

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ github.com/livekit/media-sdk v0.0.0-20250518151703-b07af88637c5 h1:aFCwt/rticj5L
9999
github.com/livekit/media-sdk v0.0.0-20250518151703-b07af88637c5/go.mod h1:7ssWiG+U4xnbvLih9WiZbhQP6zIKMjgXdUtIE1bm/E8=
100100
github.com/livekit/mediatransportutil v0.0.0-20250519131108-fb90f5acfded h1:ylZPdnlX1RW9Z15SD4mp87vT2D2shsk0hpLJwSPcq3g=
101101
github.com/livekit/mediatransportutil v0.0.0-20250519131108-fb90f5acfded/go.mod h1:mSNtYzSf6iY9xM3UX42VEI+STHvMgHmrYzEHPcdhB8A=
102-
github.com/livekit/protocol v1.39.4-0.20250806031641-1edabe8e86df h1:3YB9qvVAPK0SNWDngETtE7UL75xAygZw07DtsYbKSNk=
103-
github.com/livekit/protocol v1.39.4-0.20250806031641-1edabe8e86df/go.mod h1:YlgUxAegtU8jZ0tVXoIV/4fHeHqqLvS+6JnPKDbpFPU=
102+
github.com/livekit/protocol v1.39.4-0.20250807105828-ccbae8154e54 h1:Bh4IzI1UUqyxUnAJScR2rT/7V8mJqkzFSoEuMfm/T5k=
103+
github.com/livekit/protocol v1.39.4-0.20250807105828-ccbae8154e54/go.mod h1:YlgUxAegtU8jZ0tVXoIV/4fHeHqqLvS+6JnPKDbpFPU=
104104
github.com/livekit/psrpc v0.6.1-0.20250726180611-3915e005e741 h1:KKL1u94l6dF9u4cBwnnfozk27GH1txWy2SlvkfgmzoY=
105105
github.com/livekit/psrpc v0.6.1-0.20250726180611-3915e005e741/go.mod h1:AuDC5uOoEjQJEc69v4Li3t77Ocz0e0NdjQEuFfO+vfk=
106106
github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg=
@@ -214,6 +214,8 @@ golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGc
214214
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
215215
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
216216
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
217+
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
218+
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
217219
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
218220
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
219221
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
@@ -260,8 +262,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:
260262
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
261263
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
262264
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
263-
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
264-
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
265+
google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
266+
google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
265267
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
266268
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
267269
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

room.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@ func WithDisableRegionDiscovery() ConnectOption {
138138
}
139139
}
140140

141+
func WithMetadata(metadata string) ConnectOption {
142+
return func(p *signalling.ConnectParams) {
143+
p.Metadata = metadata
144+
}
145+
}
146+
141147
func WithExtraAttributes(attrs map[string]string) ConnectOption {
142148
return func(p *signalling.ConnectParams) {
143149
if len(attrs) != 0 && p.Attributes == nil {

signalling/interfaces.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,14 @@ type Signalling interface {
3232
Path() string
3333
ValidatePath() string
3434

35+
PublishInJoin() bool
36+
3537
ConnectQueryParams(
3638
version string,
3739
protocol int,
3840
connectParams *ConnectParams,
41+
addTrackRequests []*livekit.AddTrackRequest,
42+
publisherOffer webrtc.SessionDescription,
3943
participantSID string,
4044
) (string, error)
4145
HTTPRequestForValidate(
@@ -70,6 +74,8 @@ type ConnectParams struct {
7074

7175
RetransmitBufferSize uint16
7276

77+
Metadata string // See WithMetadata
78+
7379
Attributes map[string]string // See WithExtraAttributes
7480

7581
Pacer pacer.Factory
@@ -90,6 +96,8 @@ type SignalTransport interface {
9096
url string,
9197
token string,
9298
connectParams ConnectParams,
99+
addTrackRequests []*livekit.AddTrackRequest,
100+
publisherOffer webrtc.SessionDescription,
93101
) error
94102
Reconnect(
95103
url string,

0 commit comments

Comments
 (0)