From 8af428d54b2df60f7e36f04302c223ce426c0283 Mon Sep 17 00:00:00 2001 From: Henry Smith Date: Fri, 9 Jan 2026 12:35:18 -0800 Subject: [PATCH 1/3] Remove legacy TURN credentials request path --- CHANGELOG.md | 6 ++ .../DefaultContentShareVideoClientObserver.kt | 39 -------- .../internal/utils/TURNRequestUtils.kt | 96 ------------------- .../video/DefaultVideoClientObserver.kt | 34 ------- .../internal/video/TURNCredentials.kt | 23 ----- .../internal/video/TURNRequestParams.kt | 16 ---- .../meetings/session/DefaultMeetingSession.kt | 19 ---- ...aultContentShareVideoClientObserverTest.kt | 3 - .../video/DefaultVideoClientObserverTest.kt | 9 -- 9 files changed, 6 insertions(+), 239 deletions(-) delete mode 100644 amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/TURNRequestUtils.kt delete mode 100644 amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNCredentials.kt delete mode 100644 amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNRequestParams.kt 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..11d60357c 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 @@ -36,7 +33,6 @@ 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 +93,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..19af0b5b3 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 @@ -49,7 +48,6 @@ 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 +239,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, From f2c6133d9a8c6057b1d4c02061ae182dc48bfe8f Mon Sep 17 00:00:00 2001 From: Henry Smith <36210679+hensmi-amazon@users.noreply.github.com> Date: Tue, 27 Jan 2026 15:20:36 -0800 Subject: [PATCH 2/3] Update DefaultContentShareVideoClientObserver.kt --- .../contentshare/DefaultContentShareVideoClientObserver.kt | 1 - 1 file changed, 1 deletion(-) 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 11d60357c..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 @@ -28,7 +28,6 @@ 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, From 08a67c16e6f5b157ca61c8d10ffa383fb50fb87f Mon Sep 17 00:00:00 2001 From: Henry Smith <36210679+hensmi-amazon@users.noreply.github.com> Date: Tue, 27 Jan 2026 15:21:10 -0800 Subject: [PATCH 3/3] Update DefaultVideoClientObserver.kt --- .../sdk/meetings/internal/video/DefaultVideoClientObserver.kt | 1 - 1 file changed, 1 deletion(-) 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 19af0b5b3..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 @@ -43,7 +43,6 @@ 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,