@@ -9,7 +9,9 @@ import com.fasterxml.jackson.databind.DeserializationFeature
9
9
import com.fasterxml.jackson.databind.PropertyNamingStrategies
10
10
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
11
11
import com.intellij.ide.BrowserUtil
12
+ import com.intellij.openapi.Disposable
12
13
import com.intellij.openapi.components.service
14
+ import com.intellij.openapi.diagnostic.Logger
13
15
import com.intellij.openapi.diagnostic.thisLogger
14
16
import com.intellij.remote.RemoteCredentialsHolder
15
17
import com.intellij.ssh.AskAboutHostKey
@@ -20,6 +22,7 @@ import com.intellij.ui.components.JBTextArea
20
22
import com.intellij.ui.dsl.builder.panel
21
23
import com.intellij.ui.dsl.gridLayout.HorizontalAlign
22
24
import com.intellij.ui.dsl.gridLayout.VerticalAlign
25
+ import com.intellij.util.EventDispatcher
23
26
import com.intellij.util.application
24
27
import com.intellij.util.io.DigestUtil
25
28
import com.intellij.util.ui.JBFont
@@ -32,6 +35,8 @@ import com.jetbrains.gateway.ssh.ClientOverSshTunnelConnector
32
35
import com.jetbrains.gateway.thinClientLink.ThinClientHandle
33
36
import com.jetbrains.rd.util.URI
34
37
import com.jetbrains.rd.util.lifetime.Lifetime
38
+ import com.jetbrains.rd.util.lifetime.isAlive
39
+ import com.jetbrains.rd.util.lifetime.onTermination
35
40
import io.gitpod.gitpodprotocol.api.entities.WorkspaceInstance
36
41
import io.gitpod.jetbrains.icons.GitpodIcons
37
42
import kotlinx.coroutines.*
@@ -52,6 +57,26 @@ class GitpodConnectionProvider : GatewayConnectionProvider {
52
57
53
58
private val gitpod = service<GitpodConnectionService >()
54
59
60
+ companion object {
61
+ var jetbrainsClientMap: MutableMap <String , ThinClientHandle > = mutableMapOf ()
62
+
63
+ private val dispatcher = EventDispatcher .create(Listener ::class .java)
64
+
65
+ private interface Listener : EventListener {
66
+ fun didChange ()
67
+ }
68
+
69
+ fun addListener (listener : () -> Unit ): Disposable {
70
+ val internalListener = object : Listener {
71
+ override fun didChange () {
72
+ listener()
73
+ }
74
+ }
75
+ dispatcher.addListener(internalListener);
76
+ return Disposable { dispatcher.removeListener(internalListener) }
77
+ }
78
+ }
79
+
55
80
private val httpClient = HttpClient .newBuilder()
56
81
.followRedirects(HttpClient .Redirect .ALWAYS )
57
82
.build()
@@ -234,18 +259,27 @@ class GitpodConnectionProvider : GatewayConnectionProvider {
234
259
)
235
260
val client = connector.connect()
236
261
client.clientClosed.advise(connectionLifetime) {
262
+ thisLogger().d(" clientClosed, ${client.prettyPrint()} " )
237
263
application.invokeLater {
264
+ connectionLifetime.onTermination {
265
+ thisLogger().d(" clientTermination, clientClosed didChange fired, ${client.prettyPrint()} " )
266
+ dispatcher.multicaster.didChange()
267
+ }
238
268
connectionLifetime.terminate()
239
269
}
240
270
}
241
271
client.onClientPresenceChanged.advise(connectionLifetime) {
272
+ thisLogger().d(" presenceChanged, ${client.prettyPrint()} " )
242
273
application.invokeLater {
274
+ thisLogger().d(" clientPresenceChanged didChange fired, ${client.prettyPrint()} " )
275
+ dispatcher.multicaster.didChange()
243
276
if (client.clientPresent) {
244
277
statusMessage.text = " "
245
278
}
246
279
}
247
280
}
248
281
thinClient = client
282
+ jetbrainsClientMap[update.workspaceId] = client
249
283
} catch (t: Throwable ) {
250
284
if (t is CancellationException ) {
251
285
throw t
@@ -444,3 +478,11 @@ class GitpodConnectionProvider : GatewayConnectionProvider {
444
478
private data class SSHHostKey (val type : String , val hostKey : String )
445
479
446
480
}
481
+
482
+ fun ThinClientHandle.prettyPrint (): String {
483
+ return " uid=${uid} , clientPresent=${clientPresent} , lifeTime={status=${lifetime.status} , alive=${lifetime.isAlive} }"
484
+ }
485
+
486
+ fun Logger.d (message : String ) {
487
+ thisLogger().info(" [jb-gw] $message " )
488
+ }
0 commit comments