diff --git a/integration-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketTransportTest.kt b/integration-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketTransportTest.kt similarity index 89% rename from integration-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketTransportTest.kt rename to integration-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketTransportTest.kt index 973307181..fb0c9624e 100644 --- a/integration-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketTransportTest.kt +++ b/integration-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketTransportTest.kt @@ -6,12 +6,13 @@ import io.modelcontextprotocol.kotlin.sdk.server.mcpWebSocket import io.modelcontextprotocol.kotlin.sdk.server.mcpWebSocketTransport import io.modelcontextprotocol.kotlin.sdk.shared.BaseTransportTest import kotlinx.coroutines.CompletableDeferred -import kotlin.test.Ignore -import kotlin.test.Test +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.Timeout +import java.util.concurrent.TimeUnit +@Timeout(30, unit = TimeUnit.SECONDS) class WebSocketTransportTest : BaseTransportTest() { @Test - @Ignore // "Test disabled for investigation #17" fun `should start then close cleanly`() = testApplication { install(WebSockets) routing { @@ -26,7 +27,6 @@ class WebSocketTransportTest : BaseTransportTest() { } @Test - @Ignore // "Test disabled for investigation #17" fun `should read messages`() = testApplication { val clientFinished = CompletableDeferred() diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTransport.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTransport.kt index 5f8bf9dac..713d4d73d 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTransport.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTransport.kt @@ -7,9 +7,9 @@ import io.ktor.websocket.close import io.ktor.websocket.readText import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage import io.modelcontextprotocol.kotlin.sdk.types.McpJson +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.channels.ClosedReceiveChannelException import kotlinx.coroutines.job @@ -81,9 +81,8 @@ public abstract class WebSocketMcpTransport : AbstractTransport() { } } - @OptIn(InternalCoroutinesApi::class) session.coroutineContext.job.invokeOnCompletion { - if (it != null) { + if (it != null && it !is CancellationException) { _onError.invoke(it) } else { invokeOnCloseCallback()