44package software.aws.toolkits.jetbrains.services.codewhisperer.credentials
55
66import com.intellij.openapi.Disposable
7- import com.intellij.openapi.application.ApplicationManager
87import com.intellij.openapi.components.service
98import com.intellij.openapi.project.Project
109import com.intellij.util.text.nullize
@@ -41,14 +40,10 @@ import software.amazon.awssdk.services.codewhispererruntime.model.TargetCode
4140import software.amazon.awssdk.services.codewhispererruntime.model.UserIntent
4241import software.aws.toolkits.core.utils.debug
4342import software.aws.toolkits.core.utils.getLogger
44- import software.aws.toolkits.core.utils.warn
4543import software.aws.toolkits.jetbrains.core.AwsClientManager
4644import software.aws.toolkits.jetbrains.core.awsClient
47- import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
48- import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
4945import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
50- import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener
51- import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection
46+ import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
5247import software.aws.toolkits.jetbrains.services.amazonq.codeWhispererUserContext
5348import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
5449import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
@@ -67,7 +62,6 @@ import java.util.concurrent.TimeUnit
6762import kotlin.reflect.KProperty0
6863import kotlin.reflect.jvm.isAccessible
6964
70- // TODO: move this file to package "/client"
7165// As the connection is project-level, we need to make this project-level too
7266@Deprecated(" Methods can throw a NullPointerException if callee does not check if connection is valid" )
7367interface CodeWhispererClientAdaptor : Disposable {
@@ -283,37 +277,16 @@ interface CodeWhispererClientAdaptor : Disposable {
283277open class CodeWhispererClientAdaptorImpl (override val project : Project ) : CodeWhispererClientAdaptor {
284278 private val mySigv4Client by lazy { createUnmanagedSigv4Client() }
285279
286- @Volatile
287- private var myBearerClient: CodeWhispererRuntimeClient ? = null
288-
289280 private val KProperty0 <* >.isLazyInitialized: Boolean
290281 get() {
291282 isAccessible = true
292283 return (getDelegate() as Lazy <* >).isInitialized()
293284 }
294285
295- init {
296- initClientUpdateListener()
297- }
298-
299- private fun initClientUpdateListener () {
300- ApplicationManager .getApplication().messageBus.connect(this ).subscribe(
301- ToolkitConnectionManagerListener .TOPIC ,
302- object : ToolkitConnectionManagerListener {
303- override fun activeConnectionChanged (newConnection : ToolkitConnection ? ) {
304- if (newConnection is AwsBearerTokenConnection ) {
305- myBearerClient = getBearerClient(newConnection.getConnectionSettings().providerId)
306- }
307- }
308- }
309- )
310- }
311-
312- private fun bearerClient (): CodeWhispererRuntimeClient {
313- if (myBearerClient != null ) return myBearerClient as CodeWhispererRuntimeClient
314- myBearerClient = getBearerClient()
315- return myBearerClient as CodeWhispererRuntimeClient
316- }
286+ fun bearerClient (): CodeWhispererRuntimeClient =
287+ ToolkitConnectionManager .getInstance(project).activeConnectionForFeature(QConnection .getInstance())?.getConnectionSettings()
288+ ?.awsClient<CodeWhispererRuntimeClient >()
289+ ? : throw Exception (" attempt to get bearer client while there is no valid credential" )
317290
318291 override fun generateCompletionsPaginator (firstRequest : GenerateCompletionsRequest ) = sequence<GenerateCompletionsResponse > {
319292 var nextToken: String? = firstRequest.nextToken()
@@ -854,28 +827,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
854827 if (this ::mySigv4Client.isLazyInitialized) {
855828 mySigv4Client.close()
856829 }
857- myBearerClient?.close()
858- }
859-
860- /* *
861- * Every different SSO/AWS Builder ID connection requires a new client which has its corresponding bearer token provider,
862- * thus we have to create them dynamically.
863- * Invalidate and recycle the old client first, and create a new client with the new connection.
864- * This makes sure when we invoke CW, we always use the up-to-date connection.
865- * In case this fails to close the client, myBearerClient is already set to null thus next time when we invoke CW,
866- * it will go through this again which should get the current up-to-date connection. This stale client would be
867- * unused and stay in memory for a while until eventually closed by ToolkitClientManager.
868- */
869- open fun getBearerClient (oldProviderIdToRemove : String = ""): CodeWhispererRuntimeClient ? {
870- myBearerClient = null
871-
872- val connection = ToolkitConnectionManager .getInstance(project).activeConnectionForFeature(CodeWhispererConnection .getInstance())
873- connection as ? AwsBearerTokenConnection ? : run {
874- LOG .warn { " $connection is not a bearer token connection" }
875- return null
876- }
877-
878- return AwsClientManager .getInstance().getClient<CodeWhispererRuntimeClient >(connection.getConnectionSettings())
879830 }
880831
881832 companion object {
@@ -889,7 +840,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
889840}
890841
891842class MockCodeWhispererClientAdaptor (override val project : Project ) : CodeWhispererClientAdaptorImpl(project) {
892- override fun getBearerClient (oldProviderIdToRemove : String ): CodeWhispererRuntimeClient = project.awsClient()
893843 override fun dispose () {}
894844}
895845
0 commit comments