davidliu
Committed by GitHub

Send participant sid on reconnect (#156)

* Add participant sid when reconnecting

* tests
@@ -25,4 +25,5 @@ data class ConnectOptions( @@ -25,4 +25,5 @@ data class ConnectOptions(
25 val protocolVersion: ProtocolVersion = ProtocolVersion.v8 25 val protocolVersion: ProtocolVersion = ProtocolVersion.v8
26 ) { 26 ) {
27 internal var reconnect: Boolean = false 27 internal var reconnect: Boolean = false
  28 + internal var participantSid: String? = null
28 } 29 }
@@ -86,6 +86,7 @@ internal constructor( @@ -86,6 +86,7 @@ internal constructor(
86 private var sessionToken: String? = null 86 private var sessionToken: String? = null
87 private var connectOptions: ConnectOptions? = null 87 private var connectOptions: ConnectOptions? = null
88 private var lastRoomOptions: RoomOptions? = null 88 private var lastRoomOptions: RoomOptions? = null
  89 + private var participantSid: String? = null
89 90
90 private val publisherObserver = PublisherTransportObserver(this, client) 91 private val publisherObserver = PublisherTransportObserver(this, client)
91 private val subscriberObserver = SubscriberTransportObserver(this, client) 92 private val subscriberObserver = SubscriberTransportObserver(this, client)
@@ -163,6 +164,12 @@ internal constructor( @@ -163,6 +164,12 @@ internal constructor(
163 return 164 return
164 } 165 }
165 166
  167 + participantSid = if (joinResponse.hasParticipant()) {
  168 + joinResponse.participant.sid
  169 + } else {
  170 + null
  171 + }
  172 +
166 // update ICE servers before creating PeerConnection 173 // update ICE servers before creating PeerConnection
167 val iceServers = if (connectOptions?.iceServers != null) { 174 val iceServers = if (connectOptions?.iceServers != null) {
168 connectOptions.iceServers 175 connectOptions.iceServers
@@ -312,6 +319,7 @@ internal constructor( @@ -312,6 +319,7 @@ internal constructor(
312 sessionToken = null 319 sessionToken = null
313 connectOptions = null 320 connectOptions = null
314 lastRoomOptions = null 321 lastRoomOptions = null
  322 + participantSid = null
315 reconnectingJob?.cancel() 323 reconnectingJob?.cancel()
316 reconnectingJob = null 324 reconnectingJob = null
317 coroutineScope.close() 325 coroutineScope.close()
@@ -392,7 +400,7 @@ internal constructor( @@ -392,7 +400,7 @@ internal constructor(
392 LKLog.v { "Attempting soft reconnect." } 400 LKLog.v { "Attempting soft reconnect." }
393 subscriber.prepareForIceRestart() 401 subscriber.prepareForIceRestart()
394 try { 402 try {
395 - client.reconnect(url, token) 403 + client.reconnect(url, token, participantSid)
396 // no join response for regular reconnects 404 // no join response for regular reconnects
397 client.onReadyForResponses() 405 client.onReadyForResponses()
398 } catch (e: Exception) { 406 } catch (e: Exception) {
@@ -88,12 +88,15 @@ constructor( @@ -88,12 +88,15 @@ constructor(
88 /** 88 /**
89 * @throws Exception if fails to connect. 89 * @throws Exception if fails to connect.
90 */ 90 */
91 - suspend fun reconnect(url: String, token: String) { 91 + suspend fun reconnect(url: String, token: String, participantSid: String?) {
92 connect( 92 connect(
93 url, 93 url,
94 token, 94 token,
95 (lastOptions ?: ConnectOptions()).copy() 95 (lastOptions ?: ConnectOptions()).copy()
96 - .apply { reconnect = true }, 96 + .apply {
  97 + reconnect = true
  98 + this.participantSid = participantSid
  99 + },
97 lastRoomOptions ?: RoomOptions() 100 lastRoomOptions ?: RoomOptions()
98 ) 101 )
99 } 102 }
@@ -141,6 +144,9 @@ constructor( @@ -141,6 +144,9 @@ constructor(
141 144
142 if (options.reconnect) { 145 if (options.reconnect) {
143 queryParams.add(CONNECT_QUERY_RECONNECT to 1.toString()) 146 queryParams.add(CONNECT_QUERY_RECONNECT to 1.toString())
  147 + options.participantSid?.let { sid ->
  148 + queryParams.add(CONNECT_QUERY_PARTICIPANT_SID to sid)
  149 + }
144 } 150 }
145 151
146 val autoSubscribe = if (options.autoSubscribe) 1 else 0 152 val autoSubscribe = if (options.autoSubscribe) 1 else 0
@@ -671,6 +677,7 @@ constructor( @@ -671,6 +677,7 @@ constructor(
671 const val CONNECT_QUERY_OS = "os" 677 const val CONNECT_QUERY_OS = "os"
672 const val CONNECT_QUERY_OS_VERSION = "os_version" 678 const val CONNECT_QUERY_OS_VERSION = "os_version"
673 const val CONNECT_QUERY_NETWORK_TYPE = "network" 679 const val CONNECT_QUERY_NETWORK_TYPE = "network"
  680 + const val CONNECT_QUERY_PARTICIPANT_SID = "sid"
674 681
675 const val SD_TYPE_ANSWER = "answer" 682 const val SD_TYPE_ANSWER = "answer"
676 const val SD_TYPE_OFFER = "offer" 683 const val SD_TYPE_OFFER = "offer"
@@ -30,7 +30,7 @@ class RTCEngineMockE2ETest : MockE2ETest() { @@ -30,7 +30,7 @@ class RTCEngineMockE2ETest : MockE2ETest() {
30 @Test 30 @Test
31 fun iceSubscriberConnect() = runTest { 31 fun iceSubscriberConnect() = runTest {
32 connect() 32 connect()
33 - Assert.assertEquals( 33 + assertEquals(
34 SignalClientTest.OFFER.offer.sdp, 34 SignalClientTest.OFFER.offer.sdp,
35 rtcEngine.subscriber.peerConnection.remoteDescription.description 35 rtcEngine.subscriber.peerConnection.remoteDescription.description
36 ) 36 )
@@ -43,9 +43,9 @@ class RTCEngineMockE2ETest : MockE2ETest() { @@ -43,9 +43,9 @@ class RTCEngineMockE2ETest : MockE2ETest() {
43 val subPeerConnection = rtcEngine.subscriber.peerConnection as MockPeerConnection 43 val subPeerConnection = rtcEngine.subscriber.peerConnection as MockPeerConnection
44 val localAnswer = subPeerConnection.localDescription ?: throw IllegalStateException("no answer was created.") 44 val localAnswer = subPeerConnection.localDescription ?: throw IllegalStateException("no answer was created.")
45 Assert.assertTrue(sentRequest.hasAnswer()) 45 Assert.assertTrue(sentRequest.hasAnswer())
46 - Assert.assertEquals(localAnswer.description, sentRequest.answer.sdp)  
47 - Assert.assertEquals(localAnswer.type.canonicalForm(), sentRequest.answer.type)  
48 - Assert.assertEquals(ConnectionState.CONNECTED, rtcEngine.connectionState) 46 + assertEquals(localAnswer.description, sentRequest.answer.sdp)
  47 + assertEquals(localAnswer.type.canonicalForm(), sentRequest.answer.type)
  48 + assertEquals(ConnectionState.CONNECTED, rtcEngine.connectionState)
49 } 49 }
50 50
51 @Test 51 @Test
@@ -95,7 +95,7 @@ class RTCEngineMockE2ETest : MockE2ETest() { @@ -95,7 +95,7 @@ class RTCEngineMockE2ETest : MockE2ETest() {
95 testScheduler.advanceUntilIdle() 95 testScheduler.advanceUntilIdle()
96 val newToken = wsFactory.request.url.queryParameter(SignalClient.CONNECT_QUERY_TOKEN) 96 val newToken = wsFactory.request.url.queryParameter(SignalClient.CONNECT_QUERY_TOKEN)
97 Assert.assertNotEquals(oldToken, newToken) 97 Assert.assertNotEquals(oldToken, newToken)
98 - Assert.assertEquals(SignalClientTest.REFRESH_TOKEN.refreshToken, newToken) 98 + assertEquals(SignalClientTest.REFRESH_TOKEN.refreshToken, newToken)
99 } 99 }
100 100
101 @Test 101 @Test
@@ -114,4 +114,13 @@ class RTCEngineMockE2ETest : MockE2ETest() { @@ -114,4 +114,13 @@ class RTCEngineMockE2ETest : MockE2ETest() {
114 val pubPeerConnection = rtcEngine.subscriber.peerConnection as MockPeerConnection 114 val pubPeerConnection = rtcEngine.subscriber.peerConnection as MockPeerConnection
115 assertEquals(PeerConnection.IceTransportsType.RELAY, pubPeerConnection.rtcConfig.iceTransportsType) 115 assertEquals(PeerConnection.IceTransportsType.RELAY, pubPeerConnection.rtcConfig.iceTransportsType)
116 } 116 }
  117 +
  118 + fun participantIdOnReconnect() = runTest {
  119 + connect()
  120 + wsFactory.listener.onFailure(wsFactory.ws, Exception(), null)
  121 +
  122 + testScheduler.advanceUntilIdle()
  123 + val sid = wsFactory.request.url.queryParameter(SignalClient.CONNECT_QUERY_PARTICIPANT_SID)
  124 + assertEquals(SignalClientTest.JOIN.join.participant.sid, sid)
  125 + }
117 } 126 }
@@ -82,7 +82,7 @@ class SignalClientTest : BaseTest() { @@ -82,7 +82,7 @@ class SignalClientTest : BaseTest() {
82 @Test 82 @Test
83 fun reconnect() = runTest { 83 fun reconnect() = runTest {
84 val job = async { 84 val job = async {
85 - client.reconnect(EXAMPLE_URL, "") 85 + client.reconnect(EXAMPLE_URL, "", "participant_sid")
86 } 86 }
87 87
88 client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request)) 88 client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request))
@@ -197,7 +197,7 @@ class SignalClientTest : BaseTest() { @@ -197,7 +197,7 @@ class SignalClientTest : BaseTest() {
197 client.sendMuteTrack("sid", true) 197 client.sendMuteTrack("sid", true)
198 client.sendMuteTrack("sid", true) 198 client.sendMuteTrack("sid", true)
199 199
200 - val job = async { client.reconnect(EXAMPLE_URL, "") } 200 + val job = async { client.reconnect(EXAMPLE_URL, "", "participant_sid") }
201 client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request)) 201 client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request))
202 job.await() 202 job.await()
203 203