mirror of https://github.com/sbt/sbt.git
This commit adds support for remote clients to connect to the sbt server and attach themselves as a virtual terminal. In order to make this work, each connection must send a json rpc request to attach to the server. When this is received, the server will periodically query the remote client to get the terminal properties and capabilities that allow the remote client to act as a jline terminal proxy. There is also support for json messages with ids sbt/systemIn and sbt/systemOut that allow io to be relayed from the remote terminal to the sbt server and back. Certain commands such as `exit` should be evaluated immediately. To make this work, we add the concept of a MaintenanceTask. The CommandExchange has a background thread that reads MaintenanceTasks and evaluates them on demand. This allows maintenance tasks to be evaluated even when sbt is evaluating an exec. If it weren't done this way, when the user typed exit while a different remote connection was running a command, they wouldn't be able to exit until the command completed. The ServerIntents in ServerHandler did not handle JsonRpcResponseMessage because prior to this commit, sbt clients were primarily making requests to the server. But now the server sends requests to the client for the terminal properties and terminal capabilities so it was necessary to add an onResponse handler to ServerIntent. I had to move the network channel publishBytes method to run on a background thread because there were scenarios in which the client socket would get blocked because the server was trying to write on the same thread that the read the bytes from the client. To make the console command work, it is necessary to hijack the classloader for JLine. In MetaBuildLoader, we put a custom forked JLine that has a setter for the TerminalFactory singleton. This allows us to change the terminal that is used by JLine in ConsoleReader. Without this hack, the scala console would not work for remote clients. |
||
|---|---|---|
| .. | ||
| src | ||
| NOTICE | ||