Committed by
GitHub
Send participant sid on reconnect (#156)
* Add participant sid when reconnecting * tests
正在显示
5 个修改的文件
包含
35 行增加
和
10 行删除
| @@ -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 |
-
请 注册 或 登录 后发表评论