diff --git a/CHANGELOG.md b/CHANGELOG.md index 4aef562dc..d8364153b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## [Unreleased] + +### Changed + +* Remove legacy path for requesting TURN credentials. This includes breaking changes to internal directory files, which should not impact applications. TURN is still used internally + ## [0.25.2] - 2025-12-09 ### Changed diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientObserver.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientObserver.kt index acf24f6aa..555a6b892 100644 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientObserver.kt +++ b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientObserver.kt @@ -16,9 +16,6 @@ import com.amazonaws.services.chime.sdk.meetings.internal.metric.ClientMetricsCo import com.amazonaws.services.chime.sdk.meetings.internal.utils.ConcurrentSet import com.amazonaws.services.chime.sdk.meetings.internal.utils.DNSServerUtils import com.amazonaws.services.chime.sdk.meetings.internal.utils.ObserverUtils -import com.amazonaws.services.chime.sdk.meetings.internal.utils.TURNRequestUtils -import com.amazonaws.services.chime.sdk.meetings.internal.video.TURNCredentials -import com.amazonaws.services.chime.sdk.meetings.internal.video.TURNRequestParams import com.amazonaws.services.chime.sdk.meetings.session.URLRewriter import com.amazonaws.services.chime.sdk.meetings.utils.SignalingDroppedError import com.amazonaws.services.chime.sdk.meetings.utils.VideoClientFailedError @@ -31,12 +28,10 @@ import com.xodee.client.video.VideoClientEventType import kotlin.Any import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch class DefaultContentShareVideoClientObserver( private val context: Context, private val logger: Logger, - private val turnRequestParams: TURNRequestParams, private val clientMetricsCollector: ClientMetricsCollector, private val urlRewriter: URLRewriter, private val eventAnalyticsController: EventAnalyticsController @@ -97,41 +92,6 @@ class DefaultContentShareVideoClientObserver( } } - override fun requestTurnCreds(client: VideoClient?) { - logger.info(TAG, "requestTurnCreds") - uiScope.launch { - val turnResponse: TURNCredentials? = - TURNRequestUtils.doTurnRequest(turnRequestParams, logger) - with(turnResponse) { - val isActive = client?.isActive ?: false - if (this != null && isActive) { - val newUris = uris.map { url -> - url?.let { - urlRewriter(it) - } - }.toTypedArray() - client?.updateTurnCredentials( - username, - password, - ttl, - newUris, - turnRequestParams.signalingUrl, - VideoClient.VideoClientTurnStatus.VIDEO_CLIENT_TURN_FEATURE_ON - ) - } else { - client?.updateTurnCredentials( - null, - null, - null, - null, - null, - VideoClient.VideoClientTurnStatus.VIDEO_CLIENT_TURN_STATUS_CCP_FAILURE - ) - } - } - } - } - override fun getAvailableDnsServers(): Array { return DNSServerUtils.getAvailableDnsServers(context, logger) } diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/TURNRequestUtils.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/TURNRequestUtils.kt deleted file mode 100644 index d7d92ed82..000000000 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/TURNRequestUtils.kt +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.amazonaws.services.chime.sdk.meetings.internal.utils - -import com.amazonaws.services.chime.sdk.meetings.internal.video.TURNCredentials -import com.amazonaws.services.chime.sdk.meetings.internal.video.TURNRequestParams -import com.amazonaws.services.chime.sdk.meetings.utils.DefaultModality -import com.amazonaws.services.chime.sdk.meetings.utils.logger.Logger -import java.io.BufferedReader -import java.io.BufferedWriter -import java.io.InputStreamReader -import java.io.OutputStreamWriter -import java.net.HttpURLConnection -import java.net.URL -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import org.json.JSONObject - -object TURNRequestUtils { - private val TOKEN_HEADER = "X-Chime-Auth-Token" - private val SYSPROP_USER_AGENT = "http.agent" - private val USER_AGENT_HEADER = "User-Agent" - private val CONTENT_TYPE_HEADER = "Content-Type" - private val CONTENT_TYPE = "application/json" - private val MEETING_ID_KEY = "meetingId" - private val TOKEN_KEY = "_aws_wt_session" - - private val TAG = "TURNRequestUtils" - - private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO - - suspend fun doTurnRequest(turnRequestParams: TURNRequestParams, logger: Logger): TURNCredentials? { - return withContext(ioDispatcher) { - try { - val response = StringBuffer() - logger.info(TAG, "Making TURN Request") - with(URL(turnRequestParams.turnControlUrl).openConnection() as HttpURLConnection) { - requestMethod = "POST" - doInput = true - doOutput = true - addRequestProperty(TOKEN_HEADER, "$TOKEN_KEY=${DefaultModality(turnRequestParams.joinToken).base()}") - setRequestProperty(CONTENT_TYPE_HEADER, CONTENT_TYPE) - val user_agent = System.getProperty(SYSPROP_USER_AGENT) - logger.info(TAG, "User Agent while doing TURN request is $user_agent") - setRequestProperty(USER_AGENT_HEADER, user_agent) - val out = BufferedWriter(OutputStreamWriter(outputStream)) - out.write( - JSONObject().put( - MEETING_ID_KEY, - turnRequestParams.meetingId - ).toString() - ) - out.flush() - out.close() - BufferedReader(InputStreamReader(inputStream)).use { - var inputLine = it.readLine() - while (inputLine != null) { - response.append(inputLine) - inputLine = it.readLine() - } - it.close() - } - if (responseCode == 200) { - logger.info(TAG, "TURN Request Success") - var responseObject = JSONObject(response.toString()) - val jsonArray = - responseObject.getJSONArray(TURNCredentials.TURN_CREDENTIALS_RESULT_URIS) - val uris = arrayOfNulls(jsonArray.length()) - for (i in 0 until jsonArray.length()) { - uris[i] = jsonArray.getString(i) - } - TURNCredentials( - responseObject.getString(TURNCredentials.TURN_CREDENTIALS_RESULT_USERNAME), - responseObject.getString(TURNCredentials.TURN_CREDENTIALS_RESULT_PASSWORD), - responseObject.getString(TURNCredentials.TURN_CREDENTIALS_RESULT_TTL), - uris - ) - } else { - logger.error( - TAG, - "TURN Request got error with Response code: $responseCode" - ) - null - } - } - } catch (exception: Exception) { - logger.error(TAG, "Exception while doing TURN Request: $exception") - null - } - } - } -} diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientObserver.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientObserver.kt index e4fbfc2ff..ea5519be6 100644 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientObserver.kt +++ b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientObserver.kt @@ -23,7 +23,6 @@ import com.amazonaws.services.chime.sdk.meetings.internal.metric.ClientMetricsCo import com.amazonaws.services.chime.sdk.meetings.internal.utils.ConcurrentSet import com.amazonaws.services.chime.sdk.meetings.internal.utils.DNSServerUtils import com.amazonaws.services.chime.sdk.meetings.internal.utils.ObserverUtils -import com.amazonaws.services.chime.sdk.meetings.internal.utils.TURNRequestUtils import com.amazonaws.services.chime.sdk.meetings.realtime.datamessage.DataMessage import com.amazonaws.services.chime.sdk.meetings.realtime.datamessage.DataMessageObserver import com.amazonaws.services.chime.sdk.meetings.session.MeetingSessionStatus @@ -44,12 +43,10 @@ import java.security.InvalidParameterException import kotlin.Any import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch class DefaultVideoClientObserver( private val context: Context, private val logger: Logger, - private val turnRequestParams: TURNRequestParams, private val clientMetricsCollector: ClientMetricsCollector, private val videoClientStateController: VideoClientStateController, private val urlRewriter: URLRewriter, @@ -241,38 +238,6 @@ class DefaultVideoClientObserver( } } - override fun requestTurnCreds(client: VideoClient?) { - logger.info(TAG, "requestTurnCreds") - uiScope.launch { - val turnResponse: TURNCredentials? = TURNRequestUtils.doTurnRequest(turnRequestParams, logger) - with(turnResponse) { - val isActive = client?.isActive ?: false - if (this != null && isActive) { - val newUris = uris.map { url -> url?.let { - urlRewriter(it) - } }.toTypedArray() - client?.updateTurnCredentials( - username, - password, - ttl, - newUris, - turnRequestParams.signalingUrl, - VideoClient.VideoClientTurnStatus.VIDEO_CLIENT_TURN_FEATURE_ON - ) - } else { - client?.updateTurnCredentials( - null, - null, - null, - null, - null, - VideoClient.VideoClientTurnStatus.VIDEO_CLIENT_TURN_STATUS_CCP_FAILURE - ) - } - } - } - } - override fun getAvailableDnsServers(): Array { return DNSServerUtils.getAvailableDnsServers(context, logger) } diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNCredentials.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNCredentials.kt deleted file mode 100644 index ebf5728cc..000000000 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNCredentials.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.amazonaws.services.chime.sdk.meetings.internal.video - -/** - * The credentials needed for TURN. Obtained by making a turn request with [TURNRequestParams]. - */ -data class TURNCredentials( - val username: String, - val password: String, - val ttl: String, - val uris: Array -) { - companion object { - const val TURN_CREDENTIALS_RESULT_USERNAME = "username" - const val TURN_CREDENTIALS_RESULT_PASSWORD = "password" - const val TURN_CREDENTIALS_RESULT_URIS = "uris" - const val TURN_CREDENTIALS_RESULT_TTL = "ttl" - } -} diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNRequestParams.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNRequestParams.kt deleted file mode 100644 index 6df1b3257..000000000 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNRequestParams.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.amazonaws.services.chime.sdk.meetings.internal.video - -/** - * Data needed to make a request for [TURNCredentials]. - */ -data class TURNRequestParams( - val meetingId: String, - val signalingUrl: String, - val turnControlUrl: String, - val joinToken: String -) diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/DefaultMeetingSession.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/DefaultMeetingSession.kt index fdece23fb..098731ed6 100644 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/DefaultMeetingSession.kt +++ b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/DefaultMeetingSession.kt @@ -34,7 +34,6 @@ import com.amazonaws.services.chime.sdk.meetings.internal.video.DefaultVideoClie import com.amazonaws.services.chime.sdk.meetings.internal.video.DefaultVideoClientFactory import com.amazonaws.services.chime.sdk.meetings.internal.video.DefaultVideoClientObserver import com.amazonaws.services.chime.sdk.meetings.internal.video.DefaultVideoClientStateController -import com.amazonaws.services.chime.sdk.meetings.internal.video.TURNRequestParams import com.amazonaws.services.chime.sdk.meetings.realtime.DefaultRealtimeController import com.amazonaws.services.chime.sdk.meetings.utils.logger.Logger @@ -104,14 +103,6 @@ class DefaultMeetingSession @JvmOverloads constructor( eventAnalyticsController ) - val turnRequestParams = - TURNRequestParams( - configuration.meetingId, - configuration.urls.signalingURL, - configuration.urls.turnControlURL, - configuration.credentials.joinToken - ) - val videoClientStateController = DefaultVideoClientStateController( logger @@ -121,7 +112,6 @@ class DefaultMeetingSession @JvmOverloads constructor( DefaultVideoClientObserver( context, logger, - turnRequestParams, metricsCollector, videoClientStateController, configuration.urls.urlRewriter, @@ -187,19 +177,10 @@ class DefaultMeetingSession @JvmOverloads constructor( val contentShareConfiguration = configuration.createContentShareMeetingSessionConfiguration() - val contentShareTurnRequestParams = - TURNRequestParams( - contentShareConfiguration.meetingId, - contentShareConfiguration.urls.signalingURL, - contentShareConfiguration.urls.turnControlURL, - contentShareConfiguration.credentials.joinToken - ) - val contentShareObserver = DefaultContentShareVideoClientObserver( context, logger, - contentShareTurnRequestParams, metricsCollector, contentShareConfiguration.urls.urlRewriter, eventAnalyticsController diff --git a/amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultContentShareVideoClientObserverTest.kt b/amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultContentShareVideoClientObserverTest.kt index a0fb895fd..3799640a2 100644 --- a/amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultContentShareVideoClientObserverTest.kt +++ b/amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultContentShareVideoClientObserverTest.kt @@ -45,9 +45,6 @@ class DefaultContentShareVideoClientObserverTest { @MockK private lateinit var mockLogger: Logger - @MockK - private lateinit var mockTurnRequestParams: TURNRequestParams - @MockK private lateinit var mockClientMetricsCollector: ClientMetricsCollector diff --git a/amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientObserverTest.kt b/amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientObserverTest.kt index ecdf50b7e..d843fc6bf 100644 --- a/amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientObserverTest.kt +++ b/amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientObserverTest.kt @@ -98,14 +98,6 @@ class DefaultVideoClientObserverTest { private lateinit var testVideoClientObserver: DefaultVideoClientObserver - private val turnRequestParams = - TURNRequestParams( - "meetingId", - "signalingUrl", - "turnControlUrl", - "joinToken" - ) - private val videoClientSuccessCode = 0 private val testMessage = "Hello world" private val testProfileId = "aliceId" @@ -145,7 +137,6 @@ class DefaultVideoClientObserverTest { DefaultVideoClientObserver( mockContext, mockLogger, - turnRequestParams, mockMetricsCollector, mockVideoClientStateController, mockDefaultUrlRewriter,