Cache terminal capability

**Problem**
JSON-RPC is currently full of terminal capability query
since JLine seems to be asking them for each line.

**Solution**
This caches the query.
This commit is contained in:
Eugene Yokota 2024-12-28 04:09:01 -05:00
parent 40f5cd1b45
commit 515cae27a8
1 changed files with 20 additions and 12 deletions

View File

@ -38,6 +38,7 @@ import sbt.internal.util.complete.{ Parser, Parsers }
import sbt.util.Logger import sbt.util.Logger
import scala.annotation.tailrec import scala.annotation.tailrec
import scala.collection.concurrent
import scala.collection.mutable import scala.collection.mutable
import scala.concurrent.duration._ import scala.concurrent.duration._
import scala.util.Try import scala.util.Try
@ -828,20 +829,27 @@ final class NetworkChannel(
override lazy val isColorEnabled: Boolean = waitForPending(_.isColorEnabled) override lazy val isColorEnabled: Boolean = waitForPending(_.isColorEnabled)
override lazy val isSupershellEnabled: Boolean = waitForPending(_.isSupershellEnabled) override lazy val isSupershellEnabled: Boolean = waitForPending(_.isSupershellEnabled)
getProperties(false) getProperties(false)
private def getCapability[T](
private val capabilityCache
: concurrent.Map[TerminalCapabilitiesQuery, TerminalCapabilitiesResponse] =
concurrent.TrieMap()
private def getCapability[A1](
query: TerminalCapabilitiesQuery, query: TerminalCapabilitiesQuery,
result: TerminalCapabilitiesResponse => T result: TerminalCapabilitiesResponse => A1
): Option[T] = { ): Option[A1] =
if (closed.get) None if closed.get then None
else { else
val queue = VirtualTerminal.sendTerminalCapabilitiesQuery( val response = capabilityCache.getOrElseUpdate(
term.name, query, {
jsonRpcRequest[TerminalCapabilitiesQuery], val queue = VirtualTerminal.sendTerminalCapabilitiesQuery(
query term.name,
jsonRpcRequest[TerminalCapabilitiesQuery],
query
)
queue.take()
}
) )
Some(result(queue.take)) Some(result(response))
}
}
override def getBooleanCapability(capability: String): Boolean = override def getBooleanCapability(capability: String): Boolean =
getCapability( getCapability(
TerminalCapabilitiesQuery(boolean = Some(capability), numeric = None, string = None), TerminalCapabilitiesQuery(boolean = Some(capability), numeric = None, string = None),