@@ -5,8 +5,11 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.auth
55
66import  com.intellij.openapi.Disposable 
77import  com.intellij.openapi.project.Project 
8+ import  com.intellij.util.concurrency.AppExecutorUtil 
89import  org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage 
910import  software.aws.toolkits.core.TokenConnectionSettings 
11+ import  software.aws.toolkits.core.utils.getLogger 
12+ import  software.aws.toolkits.core.utils.warn 
1013import  software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection 
1114import  software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager 
1215import  software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener 
@@ -26,6 +29,9 @@ import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSe
2629import  software.aws.toolkits.jetbrains.utils.isQConnected 
2730import  software.aws.toolkits.jetbrains.utils.isQExpired 
2831import  java.util.concurrent.CompletableFuture 
32+ import  java.util.concurrent.ScheduledExecutorService 
33+ import  java.util.concurrent.ScheduledFuture 
34+ import  java.util.concurrent.TimeUnit 
2935
3036class  DefaultAuthCredentialsService (
3137    private  val  project :  Project ,
@@ -34,7 +40,12 @@ class DefaultAuthCredentialsService(
3440) : AuthCredentialsService,
3541    BearerTokenProviderListener ,
3642    ToolkitConnectionManagerListener ,
37-     QRegionProfileSelectedListener  {
43+     QRegionProfileSelectedListener ,
44+     Disposable  {
45+ 
46+     private  val  scheduler:  ScheduledExecutorService  =  AppExecutorUtil .getAppScheduledExecutorService()
47+     private  var  tokenSyncTask:  ScheduledFuture <* >?  =  null 
48+     private  val  tokenSyncIntervalSeconds =  10L 
3849
3950    init  {
4051        project.messageBus.connect(serverInstance).apply  {
@@ -49,6 +60,26 @@ class DefaultAuthCredentialsService(
4960                    updateConfiguration()
5061                }
5162        }
63+ 
64+         //  Start periodic token sync
65+         startPeriodicTokenSync()
66+     }
67+ 
68+     private  fun  startPeriodicTokenSync () {
69+         tokenSyncTask =  scheduler.scheduleWithFixedDelay(
70+             {
71+                 try  {
72+                     if  (isQConnected(project) &&  ! isQExpired(project)) {
73+                         updateTokenFromActiveConnection()
74+                     }
75+                 } catch  (e:  Exception ) {
76+                     LOG .warn(e) { " Failed to sync bearer token to Flare"   }
77+                 }
78+             },
79+             tokenSyncIntervalSeconds,
80+             tokenSyncIntervalSeconds,
81+             TimeUnit .SECONDS 
82+         )
5283    }
5384
5485    override  fun  updateTokenCredentials (accessToken :  String , encrypted :  Boolean ): CompletableFuture <ResponseMessage > {
@@ -134,4 +165,13 @@ class DefaultAuthCredentialsService(
134165            server.updateConfiguration(payload)
135166        } ? :  (CompletableFuture .failedFuture(IllegalStateException (" LSP Server not running"  )))
136167    }
168+ 
169+     override  fun  dispose () {
170+         tokenSyncTask?.cancel(false )
171+         tokenSyncTask =  null 
172+     }
173+ 
174+     companion  object  {
175+         private  val  LOG  =  getLogger<DefaultAuthCredentialsService >()
176+     }
137177}
0 commit comments