Skip to content

Commit ec1b358

Browse files
committed
fix(amazonq): reduce log spam and frequency of token updates
We do not need to update tokens every 10s Additionally, if we provide the connection metadata in the token update request, then we reduce overall RPC calls
1 parent 67bd41c commit ec1b358

File tree

5 files changed

+49
-31
lines changed

5 files changed

+49
-31
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -125,19 +125,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
125125
val connection = ToolkitConnectionManager.getInstance(project)
126126
.activeConnectionForFeature(QConnection.getInstance())
127127

128-
when (connection) {
129-
is AwsBearerTokenConnection -> {
130-
ConnectionMetadata(
131-
SsoProfileData(connection.startUrl)
132-
)
133-
}
134-
else -> {
135-
// If no connection or not a bearer token connection return default builderID start url
136-
ConnectionMetadata(
137-
SsoProfileData(AmazonQLspConstants.AWS_BUILDER_ID_URL)
138-
)
139-
}
140-
}
128+
connection?.let { ConnectionMetadata.fromConnection(it) }
141129
}
142130

143131
override fun openTab(params: LSPAny): CompletableFuture<OpenTabResult> {

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/auth/AuthCredentialsService.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.auth
55

66
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
7+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
78
import java.util.concurrent.CompletableFuture
89

910
interface AuthCredentialsService {
10-
fun updateTokenCredentials(accessToken: String, encrypted: Boolean): CompletableFuture<ResponseMessage>
11+
fun updateTokenCredentials(connection: ToolkitConnection, encrypted: Boolean): CompletableFuture<ResponseMessage>
1112
fun deleteTokenCredentials(): CompletableFuture<Unit>
1213
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/auth/DefaultAuthCredentialsService.kt

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,22 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
1010
import software.aws.toolkits.core.TokenConnectionSettings
1111
import software.aws.toolkits.core.utils.getLogger
1212
import software.aws.toolkits.core.utils.warn
13+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
1314
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
1415
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1516
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener
1617
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
1718
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
1819
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProvider
1920
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
21+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspConstants
2022
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
2123
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
2224
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LspServerConfigurations
2325
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.UpdateConfigurationParams
2426
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.BearerCredentials
27+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
28+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
2529
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload
2630
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayloadData
2731
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
@@ -46,7 +50,7 @@ class DefaultAuthCredentialsService(
4650

4751
private val scheduler: ScheduledExecutorService = AppExecutorUtil.getAppScheduledExecutorService()
4852
private var tokenSyncTask: ScheduledFuture<*>? = null
49-
private val tokenSyncIntervalSeconds = 10L
53+
private val tokenSyncIntervalMinutes = 5L
5054

5155
init {
5256
project.messageBus.connect(serverInstance).apply {
@@ -98,14 +102,14 @@ class DefaultAuthCredentialsService(
98102
LOG.warn(e) { "Failed to sync bearer token to Flare" }
99103
}
100104
},
101-
tokenSyncIntervalSeconds,
102-
tokenSyncIntervalSeconds,
103-
TimeUnit.SECONDS
105+
tokenSyncIntervalMinutes,
106+
tokenSyncIntervalMinutes,
107+
TimeUnit.MINUTES
104108
)
105109
}
106110

107-
override fun updateTokenCredentials(accessToken: String, encrypted: Boolean): CompletableFuture<ResponseMessage> {
108-
val payload = createUpdateCredentialsPayload(accessToken, encrypted)
111+
override fun updateTokenCredentials(connection: ToolkitConnection, encrypted: Boolean): CompletableFuture<ResponseMessage> {
112+
val payload = createUpdateCredentialsPayload(connection, encrypted)
109113

110114
return AmazonQLspService.executeIfRunning(project) { server ->
111115
server.updateTokenCredentials(payload)
@@ -142,35 +146,39 @@ class DefaultAuthCredentialsService(
142146
}
143147

144148
private fun updateTokenFromConnection(connection: ToolkitConnection): CompletableFuture<ResponseMessage> =
145-
(connection.getConnectionSettings() as? TokenConnectionSettings)
149+
updateTokenCredentials(connection, true)
150+
151+
override fun invalidate(providerId: String) {
152+
deleteTokenCredentials()
153+
}
154+
155+
private fun createUpdateCredentialsPayload(connection: ToolkitConnection, encrypted: Boolean): UpdateCredentialsPayload {
156+
val token = (connection.getConnectionSettings() as? TokenConnectionSettings)
146157
?.tokenProvider
147158
?.delegate
148159
?.let { it as? BearerTokenProvider }
149160
?.currentToken()
150161
?.accessToken
151-
?.let { token -> updateTokenCredentials(token, true) }
152-
?: CompletableFuture.failedFuture(IllegalStateException("Unable to get token from connection"))
162+
?: error("Unable to get token from connection")
153163

154-
override fun invalidate(providerId: String) {
155-
deleteTokenCredentials()
156-
}
157-
158-
private fun createUpdateCredentialsPayload(token: String, encrypted: Boolean): UpdateCredentialsPayload =
159-
if (encrypted) {
164+
return if (encrypted) {
160165
UpdateCredentialsPayload(
161166
data = encryptionManager.encrypt(
162167
UpdateCredentialsPayloadData(
163168
BearerCredentials(token)
164169
)
165170
),
171+
metadata = ConnectionMetadata.fromConnection(connection),
166172
encrypted = true
167173
)
168174
} else {
169175
UpdateCredentialsPayload(
170176
data = token,
177+
metadata = ConnectionMetadata.fromConnection(connection),
171178
encrypted = false
172179
)
173180
}
181+
}
174182

175183
override fun onProfileSelected(project: Project, profile: QRegionProfile?) {
176184
updateConfiguration()
@@ -180,7 +188,7 @@ class DefaultAuthCredentialsService(
180188
val payload = UpdateConfigurationParams(
181189
section = "aws.q",
182190
settings = mapOf(
183-
"profileArn" to QRegionProfileManager.getInstance().activeProfile(project)?.arn
191+
"profileArn" to "invalidinvalidinvalid"
184192
)
185193
)
186194
return AmazonQLspService.executeIfRunning(project) { server ->

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/credentials/ConnectionMetadata.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,29 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials
55

6+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
7+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
8+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspConstants
9+
610
data class ConnectionMetadata(
711
val sso: SsoProfileData,
8-
)
12+
) {
13+
companion object {
14+
fun fromConnection(connection: ToolkitConnection) = when (connection) {
15+
is AwsBearerTokenConnection -> {
16+
ConnectionMetadata(
17+
SsoProfileData(connection.startUrl)
18+
)
19+
}
20+
else -> {
21+
// If no connection or not a bearer token connection return default builderID start url
22+
ConnectionMetadata(
23+
SsoProfileData(AmazonQLspConstants.AWS_BUILDER_ID_URL)
24+
)
25+
}
26+
}
27+
}
28+
}
929

1030
data class SsoProfileData(
1131
val startUrl: String,

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/credentials/UpdateCredentialsPayload.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentia
55

66
data class UpdateCredentialsPayload(
77
val data: String,
8+
val metadata: ConnectionMetadata,
89
val encrypted: Boolean,
910
)
1011

0 commit comments

Comments
 (0)