@@ -11,6 +11,7 @@ import kotlinx.serialization.encoding.Decoder
1111import kotlinx.serialization.encoding.Encoder
1212import kotlinx.serialization.json.JsonContentPolymorphicSerializer
1313import kotlinx.serialization.json.JsonElement
14+ import kotlinx.serialization.json.JsonObject
1415import kotlinx.serialization.json.JsonPrimitive
1516import kotlinx.serialization.json.jsonObject
1617import kotlinx.serialization.json.jsonPrimitive
@@ -40,6 +41,15 @@ private fun JsonElement.getTypeOrNull(): String? = jsonObject["type"]?.jsonPrimi
4041 */
4142private fun JsonElement.getType (): String = requireNotNull(getTypeOrNull()) { " Missing required 'type' field" }
4243
44+ @Throws(SerializationException ::class )
45+ private fun JsonElement.asJsonObject (): JsonObject {
46+ if (this !is JsonObject ) {
47+ throw SerializationException (" Invalid response. JsonObject expected, got: $this " )
48+ }
49+ val jsonObject = this .jsonObject
50+ return jsonObject
51+ }
52+
4353// ============================================================================
4454// Method Serializer
4555// ============================================================================
@@ -131,7 +141,7 @@ internal object MediaContentPolymorphicSerializer :
131141internal object ResourceContentsPolymorphicSerializer :
132142 JsonContentPolymorphicSerializer <ResourceContents >(ResourceContents ::class ) {
133143 override fun selectDeserializer (element : JsonElement ): DeserializationStrategy <ResourceContents > {
134- val jsonObject = element.jsonObject
144+ val jsonObject = element.asJsonObject()
135145 return when {
136146 " text" in jsonObject -> TextResourceContents .serializer()
137147 " blob" in jsonObject -> BlobResourceContents .serializer()
@@ -284,7 +294,7 @@ internal object ServerNotificationPolymorphicSerializer :
284294 * Returns EmptyResult serializer if the JSON object is empty or contains only metadata.
285295 */
286296private fun selectEmptyResult (element : JsonElement ): DeserializationStrategy <EmptyResult >? {
287- val jsonObject = element.jsonObject
297+ val jsonObject = element.asJsonObject()
288298 return when {
289299 jsonObject.isEmpty() || (jsonObject.size == 1 && " _meta" in jsonObject) -> EmptyResult .serializer()
290300 else -> null
@@ -296,7 +306,7 @@ private fun selectEmptyResult(element: JsonElement): DeserializationStrategy<Emp
296306 * Returns null if the structure doesn't match any known client result type.
297307 */
298308private fun selectClientResultDeserializer (element : JsonElement ): DeserializationStrategy <ClientResult >? {
299- val jsonObject = element.jsonObject
309+ val jsonObject = element.asJsonObject()
300310 return when {
301311 " model" in jsonObject && " role" in jsonObject -> CreateMessageResult .serializer()
302312 " roots" in jsonObject -> ListRootsResult .serializer()
@@ -310,7 +320,7 @@ private fun selectClientResultDeserializer(element: JsonElement): Deserializatio
310320 * Returns null if the structure doesn't match any known server result type.
311321 */
312322private fun selectServerResultDeserializer (element : JsonElement ): DeserializationStrategy <ServerResult >? {
313- val jsonObject = element.jsonObject
323+ val jsonObject = element.asJsonObject()
314324 return when {
315325 " protocolVersion" in jsonObject && " capabilities" in jsonObject -> InitializeResult .serializer()
316326 " completion" in jsonObject -> CompleteResult .serializer()
@@ -378,7 +388,7 @@ internal object ServerResultPolymorphicSerializer :
378388internal object JSONRPCMessagePolymorphicSerializer :
379389 JsonContentPolymorphicSerializer <JSONRPCMessage >(JSONRPCMessage ::class ) {
380390 override fun selectDeserializer (element : JsonElement ): DeserializationStrategy <JSONRPCMessage > {
381- val jsonObject = element.jsonObject
391+ val jsonObject = element.asJsonObject()
382392 return when {
383393 " error" in jsonObject -> JSONRPCError .serializer()
384394 " result" in jsonObject -> JSONRPCResponse .serializer()
0 commit comments