File tree Expand file tree Collapse file tree 2 files changed +31
-1
lines changed
kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared
kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client Expand file tree Collapse file tree 2 files changed +31
-1
lines changed Original file line number Diff line number Diff line change 11package io.modelcontextprotocol.kotlin.sdk.shared
22
3+ import io.github.oshai.kotlinlogging.KotlinLogging
34import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage
45import kotlinx.io.Buffer
56import kotlinx.io.indexOf
@@ -9,6 +10,9 @@ import kotlinx.io.readString
910 * Buffers a continuous stdio stream into discrete JSON-RPC messages.
1011 */
1112public class ReadBuffer {
13+
14+ private val logger = KotlinLogging .logger { }
15+
1216 private val buffer: Buffer = Buffer ()
1317
1418 public fun append (chunk : ByteArray ) {
@@ -37,7 +41,13 @@ public class ReadBuffer {
3741 string
3842 }
3943 }
40- return deserializeMessage(line)
44+ try {
45+ return deserializeMessage(line)
46+ } catch (e: Exception ) {
47+ logger.error(e) { " Failed to deserialize message from line: $line \n Skipping..." }
48+ }
49+
50+ return null
4151 }
4252
4353 public fun clear () {
Original file line number Diff line number Diff line change @@ -45,4 +45,24 @@ class StdioClientTransportTest : BaseTransportTest() {
4545 process.waitFor()
4646 process.destroy()
4747 }
48+
49+ @Test
50+ fun `should ignore first output messages` () = runTest {
51+ val processBuilder = ProcessBuilder (" /usr/bin/tee" )
52+ val process = processBuilder.start()
53+ process.outputStream.write(" Stdio server started" .toByteArray())
54+
55+ val input = process.inputStream.asSource().buffered()
56+ val output = process.outputStream.asSink().buffered()
57+
58+ val client = StdioClientTransport (
59+ input = input,
60+ output = output,
61+ )
62+
63+ testClientRead(client)
64+
65+ process.waitFor()
66+ process.destroy()
67+ }
4868}
You can’t perform that action at this time.
0 commit comments