davidliu
Committed by GitHub

Send participant sid on reconnect (#156)

* Add participant sid when reconnecting

* tests
... ... @@ -25,4 +25,5 @@ data class ConnectOptions(
val protocolVersion: ProtocolVersion = ProtocolVersion.v8
) {
internal var reconnect: Boolean = false
internal var participantSid: String? = null
}
... ...
... ... @@ -86,6 +86,7 @@ internal constructor(
private var sessionToken: String? = null
private var connectOptions: ConnectOptions? = null
private var lastRoomOptions: RoomOptions? = null
private var participantSid: String? = null
private val publisherObserver = PublisherTransportObserver(this, client)
private val subscriberObserver = SubscriberTransportObserver(this, client)
... ... @@ -163,6 +164,12 @@ internal constructor(
return
}
participantSid = if (joinResponse.hasParticipant()) {
joinResponse.participant.sid
} else {
null
}
// update ICE servers before creating PeerConnection
val iceServers = if (connectOptions?.iceServers != null) {
connectOptions.iceServers
... ... @@ -312,6 +319,7 @@ internal constructor(
sessionToken = null
connectOptions = null
lastRoomOptions = null
participantSid = null
reconnectingJob?.cancel()
reconnectingJob = null
coroutineScope.close()
... ... @@ -392,7 +400,7 @@ internal constructor(
LKLog.v { "Attempting soft reconnect." }
subscriber.prepareForIceRestart()
try {
client.reconnect(url, token)
client.reconnect(url, token, participantSid)
// no join response for regular reconnects
client.onReadyForResponses()
} catch (e: Exception) {
... ...
... ... @@ -88,12 +88,15 @@ constructor(
/**
* @throws Exception if fails to connect.
*/
suspend fun reconnect(url: String, token: String) {
suspend fun reconnect(url: String, token: String, participantSid: String?) {
connect(
url,
token,
(lastOptions ?: ConnectOptions()).copy()
.apply { reconnect = true },
.apply {
reconnect = true
this.participantSid = participantSid
},
lastRoomOptions ?: RoomOptions()
)
}
... ... @@ -141,6 +144,9 @@ constructor(
if (options.reconnect) {
queryParams.add(CONNECT_QUERY_RECONNECT to 1.toString())
options.participantSid?.let { sid ->
queryParams.add(CONNECT_QUERY_PARTICIPANT_SID to sid)
}
}
val autoSubscribe = if (options.autoSubscribe) 1 else 0
... ... @@ -671,6 +677,7 @@ constructor(
const val CONNECT_QUERY_OS = "os"
const val CONNECT_QUERY_OS_VERSION = "os_version"
const val CONNECT_QUERY_NETWORK_TYPE = "network"
const val CONNECT_QUERY_PARTICIPANT_SID = "sid"
const val SD_TYPE_ANSWER = "answer"
const val SD_TYPE_OFFER = "offer"
... ...
... ... @@ -30,7 +30,7 @@ class RTCEngineMockE2ETest : MockE2ETest() {
@Test
fun iceSubscriberConnect() = runTest {
connect()
Assert.assertEquals(
assertEquals(
SignalClientTest.OFFER.offer.sdp,
rtcEngine.subscriber.peerConnection.remoteDescription.description
)
... ... @@ -43,9 +43,9 @@ class RTCEngineMockE2ETest : MockE2ETest() {
val subPeerConnection = rtcEngine.subscriber.peerConnection as MockPeerConnection
val localAnswer = subPeerConnection.localDescription ?: throw IllegalStateException("no answer was created.")
Assert.assertTrue(sentRequest.hasAnswer())
Assert.assertEquals(localAnswer.description, sentRequest.answer.sdp)
Assert.assertEquals(localAnswer.type.canonicalForm(), sentRequest.answer.type)
Assert.assertEquals(ConnectionState.CONNECTED, rtcEngine.connectionState)
assertEquals(localAnswer.description, sentRequest.answer.sdp)
assertEquals(localAnswer.type.canonicalForm(), sentRequest.answer.type)
assertEquals(ConnectionState.CONNECTED, rtcEngine.connectionState)
}
@Test
... ... @@ -95,7 +95,7 @@ class RTCEngineMockE2ETest : MockE2ETest() {
testScheduler.advanceUntilIdle()
val newToken = wsFactory.request.url.queryParameter(SignalClient.CONNECT_QUERY_TOKEN)
Assert.assertNotEquals(oldToken, newToken)
Assert.assertEquals(SignalClientTest.REFRESH_TOKEN.refreshToken, newToken)
assertEquals(SignalClientTest.REFRESH_TOKEN.refreshToken, newToken)
}
@Test
... ... @@ -114,4 +114,13 @@ class RTCEngineMockE2ETest : MockE2ETest() {
val pubPeerConnection = rtcEngine.subscriber.peerConnection as MockPeerConnection
assertEquals(PeerConnection.IceTransportsType.RELAY, pubPeerConnection.rtcConfig.iceTransportsType)
}
fun participantIdOnReconnect() = runTest {
connect()
wsFactory.listener.onFailure(wsFactory.ws, Exception(), null)
testScheduler.advanceUntilIdle()
val sid = wsFactory.request.url.queryParameter(SignalClient.CONNECT_QUERY_PARTICIPANT_SID)
assertEquals(SignalClientTest.JOIN.join.participant.sid, sid)
}
}
\ No newline at end of file
... ...
... ... @@ -82,7 +82,7 @@ class SignalClientTest : BaseTest() {
@Test
fun reconnect() = runTest {
val job = async {
client.reconnect(EXAMPLE_URL, "")
client.reconnect(EXAMPLE_URL, "", "participant_sid")
}
client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request))
... ... @@ -197,7 +197,7 @@ class SignalClientTest : BaseTest() {
client.sendMuteTrack("sid", true)
client.sendMuteTrack("sid", true)
val job = async { client.reconnect(EXAMPLE_URL, "") }
val job = async { client.reconnect(EXAMPLE_URL, "", "participant_sid") }
client.onOpen(wsFactory.ws, createOpenResponse(wsFactory.request))
job.await()
... ...