[terminal] IJPL-246705 Fix dynamic loading of TerminalPortForwardingManager implementation

Use extension point instead of overridable service.


(cherry picked from commit 015c826315a1384a2b95bb32371d72c2e9d58a19)

IJ-CR-210406

GitOrigin-RevId: 2d1153e8f726414d4201d92242047abf5d74a10f
This commit is contained in:
Konstantin Hudyakov
2026-07-21 15:28:54 +00:00
committed by intellij-monorepo-bot
parent 295c9e91f2
commit 900ebc87c1
2 changed files with 19 additions and 6 deletions
@@ -11,6 +11,8 @@
interface="com.intellij.terminal.frontend.action.TerminalEscapeHandler" dynamic="true"/>
<extensionPoint qualifiedName="org.jetbrains.plugins.terminal.terminalSettingsProvider" dynamic="true"
interface="com.intellij.terminal.frontend.settings.TerminalSettingsProvider"/>
<extensionPoint qualifiedName="org.jetbrains.plugins.terminal.portForwardingManager" dynamic="true"
interface="com.intellij.terminal.frontend.view.portForwarding.TerminalPortForwardingManager"/>
</extensionPoints>
<extensions defaultExtensionNs="com.intellij">
@@ -50,10 +52,6 @@
serviceInterface="com.intellij.terminal.frontend.session.TerminalActivityTracker"
serviceImplementation="com.intellij.terminal.frontend.session.TerminalNoOpActivityTracker"
open="true"/>
<applicationService
serviceInterface="com.intellij.terminal.frontend.view.portForwarding.TerminalPortForwardingManager"
serviceImplementation="com.intellij.terminal.frontend.view.portForwarding.TerminalPortForwardingManagerImpl"
open="true"/>
<projectService
serviceInterface="com.intellij.terminal.frontend.view.portForwarding.TerminalPortForwardingPersistenceService"
serviceImplementation="com.intellij.terminal.frontend.view.portForwarding.TerminalPortForwardingNoOpPersistenceService"
@@ -77,6 +75,8 @@
<extensions defaultExtensionNs="org.jetbrains.plugins.terminal">
<toolWindowInitializer implementation="com.intellij.terminal.frontend.toolwindow.impl.TerminalToolWindowTabsManagerImpl$Initializer"/>
<portForwardingManager implementation="com.intellij.terminal.frontend.view.portForwarding.TerminalPortForwardingManagerImpl"/>
<escapeHandler implementation="com.intellij.terminal.frontend.action.CancelSelection"/>
<escapeHandler implementation="com.intellij.terminal.frontend.action.CloseSearch"/>
<escapeHandler implementation="com.intellij.terminal.frontend.action.ClosePopupCompletion"/>
@@ -4,11 +4,12 @@ package com.intellij.terminal.frontend.view.portForwarding
import com.intellij.openapi.actionSystem.DataKey
import com.intellij.platform.eel.EelDescriptor
import com.intellij.platform.eel.EelMachine
import com.intellij.openapi.extensions.ExtensionPointName
import kotlinx.coroutines.flow.Flow
import org.jetbrains.annotations.ApiStatus
/**
* Application-level service that performs TCP port forwarding from the IDE host environment to any
* Application-level extension that performs TCP port forwarding from the IDE host environment to any
* EEL environment and tracks the active forwardings so multiple terminals on the same physical
* machine share a single tunnel per remote port.
*
@@ -45,7 +46,19 @@ interface TerminalPortForwardingManager {
fun stopForwarding(eelMachine: EelMachine, remotePort: Int)
companion object {
private val EP_NAME: ExtensionPointName<TerminalPortForwardingManager> =
ExtensionPointName.create("org.jetbrains.plugins.terminal.portForwardingManager")
val DATA_KEY: DataKey<TerminalPortForwardingManager> = DataKey.create("TerminalPortForwardingManager")
/**
* Returns the highest-priority registered implementation: [TerminalPortForwardingManagerImpl] in the monolith,
* or the Remote Dev thin-client implementation (declared with `order="first"`) when the RD client is loaded.
*/
@JvmStatic
fun getInstance(): TerminalPortForwardingManager = service()
fun getInstance(): TerminalPortForwardingManager {
return EP_NAME.findFirstSafe { true }
?: error("No ${TerminalPortForwardingManager::class.simpleName} implementation is registered")
}
}
}