4
4
package software.aws.toolkits.jetbrains.services.codewhisperer.credentials
5
5
6
6
import com.intellij.openapi.Disposable
7
- import com.intellij.openapi.application.ApplicationManager
8
7
import com.intellij.openapi.components.service
9
8
import com.intellij.openapi.project.Project
10
9
import com.intellij.util.text.nullize
@@ -41,14 +40,10 @@ import software.amazon.awssdk.services.codewhispererruntime.model.TargetCode
41
40
import software.amazon.awssdk.services.codewhispererruntime.model.UserIntent
42
41
import software.aws.toolkits.core.utils.debug
43
42
import software.aws.toolkits.core.utils.getLogger
44
- import software.aws.toolkits.core.utils.warn
45
43
import software.aws.toolkits.jetbrains.core.AwsClientManager
46
44
import software.aws.toolkits.jetbrains.core.awsClient
47
- import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
48
- import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
49
45
import 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
52
47
import software.aws.toolkits.jetbrains.services.amazonq.codeWhispererUserContext
53
48
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
54
49
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
@@ -67,7 +62,6 @@ import java.util.concurrent.TimeUnit
67
62
import kotlin.reflect.KProperty0
68
63
import kotlin.reflect.jvm.isAccessible
69
64
70
- // TODO: move this file to package "/client"
71
65
// As the connection is project-level, we need to make this project-level too
72
66
@Deprecated(" Methods can throw a NullPointerException if callee does not check if connection is valid" )
73
67
interface CodeWhispererClientAdaptor : Disposable {
@@ -283,37 +277,16 @@ interface CodeWhispererClientAdaptor : Disposable {
283
277
open class CodeWhispererClientAdaptorImpl (override val project : Project ) : CodeWhispererClientAdaptor {
284
278
private val mySigv4Client by lazy { createUnmanagedSigv4Client() }
285
279
286
- @Volatile
287
- private var myBearerClient: CodeWhispererRuntimeClient ? = null
288
-
289
280
private val KProperty0 <* >.isLazyInitialized: Boolean
290
281
get() {
291
282
isAccessible = true
292
283
return (getDelegate() as Lazy <* >).isInitialized()
293
284
}
294
285
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" )
317
290
318
291
override fun generateCompletionsPaginator (firstRequest : GenerateCompletionsRequest ) = sequence<GenerateCompletionsResponse > {
319
292
var nextToken: String? = firstRequest.nextToken()
@@ -854,28 +827,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
854
827
if (this ::mySigv4Client.isLazyInitialized) {
855
828
mySigv4Client.close()
856
829
}
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())
879
830
}
880
831
881
832
companion object {
@@ -889,7 +840,6 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
889
840
}
890
841
891
842
class MockCodeWhispererClientAdaptor (override val project : Project ) : CodeWhispererClientAdaptorImpl(project) {
892
- override fun getBearerClient (oldProviderIdToRemove : String ): CodeWhispererRuntimeClient = project.awsClient()
893
843
override fun dispose () {}
894
844
}
895
845
0 commit comments