diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/CoreMessenger.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/CoreMessenger.kt index 8ccb078380..1c0ab242a1 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/CoreMessenger.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/CoreMessenger.kt @@ -7,9 +7,11 @@ import com.github.continuedev.continueintellijextension.`continue`.process.Conti import com.github.continuedev.continueintellijextension.services.ContinuePluginService import com.github.continuedev.continueintellijextension.utils.uuid import com.google.gson.Gson +import com.google.gson.JsonSyntaxException import com.intellij.openapi.components.service +import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope class CoreMessenger( private val project: Project, @@ -20,6 +22,7 @@ class CoreMessenger( private val gson = Gson() private val responseListeners = mutableMapOf Unit>() private val process = startContinueProcess() + private val log = Logger.getInstance(CoreMessenger::class.java) fun request(messageType: String, data: Any?, messageId: String?, onResponse: (Any?) -> Unit) { val id = messageId ?: uuid() @@ -38,13 +41,13 @@ class CoreMessenger( } private fun handleMessage(json: String) { - val responseMap = gson.fromJson(json, Map::class.java) + val responseMap = tryToParse(json) ?: return val messageId = responseMap["messageId"].toString() val messageType = responseMap["messageType"].toString() val data = responseMap["data"] // IDE listeners - if (MessageTypes.IDE_MESSAGE_TYPES.contains(messageType)) { + if (messageType in MessageTypes.IDE_MESSAGE_TYPES) { ideProtocolClient.handleMessage(json) { data -> val message = gson.toJson(mapOf("messageId" to messageId, "messageType" to messageType, "data" to data)) process.write(message) @@ -52,8 +55,9 @@ class CoreMessenger( } // Forward to webview - if (MessageTypes.PASS_THROUGH_TO_WEBVIEW.contains(messageType)) { + if (messageType in MessageTypes.PASS_THROUGH_TO_WEBVIEW) { val continuePluginService = project.service() + // todo: is this a bug below (messageType = ID)? verify continuePluginService.sendToWebview(messageType, responseMap["data"], messageType) } @@ -68,6 +72,15 @@ class CoreMessenger( } } + // todo: map<*, *> = code smell + private fun tryToParse(json: String): Map<*, *>? = + try { + gson.fromJson(json, Map::class.java) + } catch (_: JsonSyntaxException) { + log.warn("Invalid message JSON: $json") // example: NODE_ENV undefined + null + } + fun killSubProcess() { process.close() }