11package io.github.ethersync
22
3- import com.intellij.execution.ExecutionListener
4- import com.intellij.execution.ExecutionManager
53import com.intellij.execution.configurations.GeneralCommandLine
6- import com.intellij.execution.process.ProcessAdapter
4+ import com.intellij.execution.process.ColoredProcessHandler
75import com.intellij.execution.process.ProcessEvent
86import com.intellij.execution.process.ProcessHandler
9- import com.intellij.execution.process.ProcessHandlerFactory
10- import com.intellij.execution.runners.ExecutionEnvironment
11- import com.intellij.openapi.application.EDT
7+ import com.intellij.execution.process.ProcessListener
8+ import com.intellij.execution.ui.ConsoleView
129import com.intellij.openapi.components.Service
1310import com.intellij.openapi.diagnostic.logger
1411import com.intellij.openapi.editor.EditorFactory
@@ -22,11 +19,10 @@ import com.intellij.openapi.project.ProjectManagerListener
2219import com.intellij.openapi.rd.util.withUiContext
2320import com.intellij.openapi.util.Key
2421import com.intellij.openapi.vfs.VirtualFile
22+ import com.intellij.openapi.wm.ToolWindowManager
2523import com.intellij.util.io.await
2624import com.intellij.util.io.awaitExit
2725import com.intellij.util.io.readLineAsync
28- import com.jediterm.terminal.TtyConnector
29- import com.jediterm.terminal.model.TerminalModelListener
3026import io.github.ethersync.protocol.*
3127import io.github.ethersync.settings.AppSettings
3228import io.github.ethersync.sync.Changetracker
@@ -35,13 +31,10 @@ import kotlinx.coroutines.CoroutineScope
3531import kotlinx.coroutines.launch
3632import org.eclipse.lsp4j.jsonrpc.Launcher
3733import org.eclipse.lsp4j.jsonrpc.ResponseErrorException
38- import org.jetbrains.plugins.terminal.ProxyTtyConnector
39- import org.jetbrains.plugins.terminal.TerminalToolWindowManager
4034import java.io.BufferedReader
4135import java.io.File
4236import java.io.InputStreamReader
4337import java.util.concurrent.Executors
44- import java.util.function.Consumer
4538
4639private val LOG = logger<EthersyncServiceImpl >()
4740
@@ -52,6 +45,7 @@ class EthersyncServiceImpl(
5245) : EthersyncService {
5346
5447 private var launcher: Launcher <RemoteEthersyncClientProtocol >? = null
48+ private var daemonProcess: ProcessHandler ? = null
5549 private var clientProcess: Process ? = null
5650
5751 private val changetracker: Changetracker = Changetracker (project, cs)
@@ -103,6 +97,11 @@ class EthersyncServiceImpl(
10397 it.awaitExit()
10498 clientProcess = null
10599 }
100+ daemonProcess?.let {
101+ it.detachProcess()
102+ it.destroyProcess()
103+ daemonProcess = null
104+ }
106105 changetracker.clear()
107106 cursortracker.clear()
108107 }
@@ -118,32 +117,47 @@ class EthersyncServiceImpl(
118117 }
119118
120119 val cmd = GeneralCommandLine (AppSettings .getInstance().state.ethersyncBinaryPath)
120+ cmd.workDirectory = projectDirectory
121121 cmd.addParameter(" daemon" )
122- cmd.addParameter(" --peer" )
123- cmd.addParameter(peer)
122+ if (peer.isNotBlank()) {
123+ cmd.addParameter(" --peer" )
124+ cmd.addParameter(peer)
125+ }
124126 cmd.addParameter(" --socket-name" )
125127 cmd.addParameter(socket)
126128
127129 cs.launch {
128130 shutdown()
129131
130132 withUiContext {
131- // TODO: how to detect errors in the daemon process?
132- // TODO: how to reuse the terminal?
133- // TODO: how to make readonly?
134- // TODO: how to close after exit?
135- val terminalWidget = TerminalToolWindowManager .getInstance(project)
136- .createLocalShellWidget(project.basePath, " Ethersync Daemon" )
137-
138- terminalWidget.executeCommand(cmd.commandLineString)
139- terminalWidget.terminalTextBuffer.addModelListener(object : TerminalModelListener {
140- override fun modelChanged () {
141- if (terminalWidget.terminalTextBuffer.screenLines.contains(" Others can connect with" )) {
133+ daemonProcess = ColoredProcessHandler (cmd)
134+
135+ daemonProcess!! .addProcessListener(object : ProcessListener {
136+ override fun onTextAvailable (event : ProcessEvent , outputType : Key <* >) {
137+ if (event.text.contains(" Others can connect with" )) {
142138 launchEthersyncClient(socket, projectDirectory)
143139 }
144140 }
141+
142+ override fun processTerminated (event : ProcessEvent ) {
143+ cs.launch {
144+ shutdown()
145+ }
146+ }
145147 })
148+
149+
150+ val tw = ToolWindowManager .getInstance(project).getToolWindow(" ethersync" )!!
151+ val console = tw.contentManager.findContent(" Daemon" )!! .component
152+ if (console is ConsoleView ) {
153+ console.attachToProcess(daemonProcess!! )
154+ }
155+
156+ tw.show()
157+
158+ daemonProcess!! .startNotify()
146159 }
160+
147161 }
148162 }
149163
@@ -207,7 +221,6 @@ class EthersyncServiceImpl(
207221 while (true ) {
208222 val line = stderr.readLineAsync() ? : break ;
209223 LOG .trace(line)
210- System .out .println (line)
211224 }
212225 }
213226 }
0 commit comments