Skip to content

Commit f986fcf

Browse files
committed
add wasm and ios targets
1 parent 63a50c1 commit f986fcf

File tree

34 files changed

+433
-236
lines changed

34 files changed

+433
-236
lines changed

build.gradle.kts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
@file:OptIn(ExperimentalKotlinGradlePluginApi::class)
1+
@file:OptIn(ExperimentalKotlinGradlePluginApi::class, ExperimentalWasmDsl::class)
22

33
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
44
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
5+
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
56
import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
67
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
78
import org.jreleaser.model.Active
@@ -194,6 +195,14 @@ kotlin {
194195
}
195196
}
196197

198+
iosArm64()
199+
iosX64()
200+
iosSimulatorArm64()
201+
202+
wasmJs {
203+
nodejs()
204+
}
205+
197206
explicitApi = ExplicitApiMode.Strict
198207

199208
jvmToolchain(21)
@@ -217,7 +226,6 @@ kotlin {
217226
implementation(libs.kotlin.test)
218227
implementation(libs.ktor.server.test.host)
219228
implementation(libs.kotlinx.coroutines.test)
220-
implementation(libs.kotlinx.coroutines.debug)
221229
implementation(libs.kotest.assertions.json)
222230
}
223231
}

gradle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ kotlin.code.style=official
22

33
org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
44
org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true
5+
6+
kotlin.daemon.jvmargs=-Xmx2G

gradle/libs.versions.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ dokka = "2.0.0"
55

66
# libraries version
77
serialization = "1.7.3"
8-
coroutines = "1.9.0"
9-
ktor = "3.0.2"
8+
coroutines = "1.10.2"
9+
ktor = "3.1.2"
1010
mockk = "1.13.13"
1111
logging = "7.0.0"
1212
jreleaser = "1.15.0"
@@ -28,7 +28,6 @@ ktor-server-cio = { group = "io.ktor", name = "ktor-server-cio", version.ref = "
2828
# Testing
2929
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
3030
kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutines" }
31-
kotlinx-coroutines-debug = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-debug", version.ref = "coroutines" }
3231
ktor-server-test-host = { group = "io.ktor", name = "ktor-server-test-host", version.ref = "ktor" }
3332
mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" }
3433
slf4j-simple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" }

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,39 @@
11
package io.modelcontextprotocol.kotlin.sdk.client
22

3-
import io.modelcontextprotocol.kotlin.sdk.*
3+
import io.modelcontextprotocol.kotlin.sdk.CallToolRequest
4+
import io.modelcontextprotocol.kotlin.sdk.CallToolResult
5+
import io.modelcontextprotocol.kotlin.sdk.CallToolResultBase
6+
import io.modelcontextprotocol.kotlin.sdk.ClientCapabilities
7+
import io.modelcontextprotocol.kotlin.sdk.CompatibilityCallToolResult
8+
import io.modelcontextprotocol.kotlin.sdk.CompleteRequest
9+
import io.modelcontextprotocol.kotlin.sdk.CompleteResult
10+
import io.modelcontextprotocol.kotlin.sdk.EmptyRequestResult
11+
import io.modelcontextprotocol.kotlin.sdk.GetPromptRequest
12+
import io.modelcontextprotocol.kotlin.sdk.GetPromptResult
13+
import io.modelcontextprotocol.kotlin.sdk.Implementation
14+
import io.modelcontextprotocol.kotlin.sdk.InitializeRequest
15+
import io.modelcontextprotocol.kotlin.sdk.InitializeResult
16+
import io.modelcontextprotocol.kotlin.sdk.InitializedNotification
17+
import io.modelcontextprotocol.kotlin.sdk.LATEST_PROTOCOL_VERSION
18+
import io.modelcontextprotocol.kotlin.sdk.ListPromptsRequest
19+
import io.modelcontextprotocol.kotlin.sdk.ListPromptsResult
20+
import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesRequest
21+
import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesResult
22+
import io.modelcontextprotocol.kotlin.sdk.ListResourcesRequest
23+
import io.modelcontextprotocol.kotlin.sdk.ListResourcesResult
24+
import io.modelcontextprotocol.kotlin.sdk.ListToolsRequest
25+
import io.modelcontextprotocol.kotlin.sdk.ListToolsResult
26+
import io.modelcontextprotocol.kotlin.sdk.LoggingLevel
427
import io.modelcontextprotocol.kotlin.sdk.LoggingMessageNotification.SetLevelRequest
28+
import io.modelcontextprotocol.kotlin.sdk.Method
29+
import io.modelcontextprotocol.kotlin.sdk.PingRequest
30+
import io.modelcontextprotocol.kotlin.sdk.ReadResourceRequest
31+
import io.modelcontextprotocol.kotlin.sdk.ReadResourceResult
32+
import io.modelcontextprotocol.kotlin.sdk.RootsListChangedNotification
33+
import io.modelcontextprotocol.kotlin.sdk.SUPPORTED_PROTOCOL_VERSIONS
34+
import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities
35+
import io.modelcontextprotocol.kotlin.sdk.SubscribeRequest
36+
import io.modelcontextprotocol.kotlin.sdk.UnsubscribeRequest
537
import io.modelcontextprotocol.kotlin.sdk.shared.Protocol
638
import io.modelcontextprotocol.kotlin.sdk.shared.ProtocolOptions
739
import io.modelcontextprotocol.kotlin.sdk.shared.RequestOptions

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/SSEClientTransport.kt

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,29 @@
11
package io.modelcontextprotocol.kotlin.sdk.client
22

3-
import io.ktor.client.*
4-
import io.ktor.client.plugins.sse.*
5-
import io.ktor.client.request.*
6-
import io.ktor.client.statement.*
7-
import io.ktor.http.*
3+
import io.ktor.client.HttpClient
4+
import io.ktor.client.plugins.sse.ClientSSESession
5+
import io.ktor.client.plugins.sse.sseSession
6+
import io.ktor.client.request.HttpRequestBuilder
7+
import io.ktor.client.request.post
8+
import io.ktor.client.request.setBody
9+
import io.ktor.client.statement.bodyAsText
10+
import io.ktor.http.ContentType
11+
import io.ktor.http.HttpHeaders
12+
import io.ktor.http.Url
13+
import io.ktor.http.append
14+
import io.ktor.http.isSuccess
815
import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage
916
import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport
1017
import io.modelcontextprotocol.kotlin.sdk.shared.McpJson
11-
import kotlinx.coroutines.*
18+
import kotlinx.coroutines.CompletableDeferred
19+
import kotlinx.coroutines.CoroutineName
20+
import kotlinx.coroutines.CoroutineScope
21+
import kotlinx.coroutines.ExperimentalCoroutinesApi
22+
import kotlinx.coroutines.Job
23+
import kotlinx.coroutines.SupervisorJob
24+
import kotlinx.coroutines.cancel
25+
import kotlinx.coroutines.cancelAndJoin
26+
import kotlinx.coroutines.launch
1227
import kotlinx.serialization.encodeToString
1328
import kotlin.concurrent.atomics.AtomicBoolean
1429
import kotlin.concurrent.atomics.ExperimentalAtomicApi

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StdioClientTransport.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,25 @@ package io.modelcontextprotocol.kotlin.sdk.client
22

33
import io.github.oshai.kotlinlogging.KotlinLogging
44
import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage
5+
import io.modelcontextprotocol.kotlin.sdk.internal.IODispatcher
56
import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport
67
import io.modelcontextprotocol.kotlin.sdk.shared.ReadBuffer
78
import io.modelcontextprotocol.kotlin.sdk.shared.serializeMessage
8-
import kotlinx.coroutines.*
9+
import kotlinx.coroutines.CoroutineName
10+
import kotlinx.coroutines.CoroutineScope
11+
import kotlinx.coroutines.Job
12+
import kotlinx.coroutines.SupervisorJob
13+
import kotlinx.coroutines.cancelAndJoin
914
import kotlinx.coroutines.channels.Channel
1015
import kotlinx.coroutines.channels.consumeEach
11-
import kotlinx.io.*
16+
import kotlinx.coroutines.isActive
17+
import kotlinx.coroutines.launch
18+
import kotlinx.io.Buffer
19+
import kotlinx.io.Sink
20+
import kotlinx.io.Source
21+
import kotlinx.io.buffered
22+
import kotlinx.io.readByteArray
23+
import kotlinx.io.writeString
1224
import kotlin.concurrent.atomics.AtomicBoolean
1325
import kotlin.concurrent.atomics.ExperimentalAtomicApi
1426
import kotlin.coroutines.CoroutineContext
@@ -28,7 +40,7 @@ public class StdioClientTransport(
2840
private val output: Sink
2941
) : AbstractTransport() {
3042
private val logger = KotlinLogging.logger {}
31-
private val ioCoroutineContext: CoroutineContext = Dispatchers.IO
43+
private val ioCoroutineContext: CoroutineContext = IODispatcher
3244
private val scope by lazy {
3345
CoroutineScope(ioCoroutineContext + SupervisorJob())
3446
}
@@ -38,7 +50,7 @@ public class StdioClientTransport(
3850
private val readBuffer = ReadBuffer()
3951

4052
override suspend fun start() {
41-
if (!initialized.compareAndSet(false, true)) {
53+
if (!initialized.compareAndSet(expectedValue = false, newValue = true)) {
4254
error("StdioClientTransport already started!")
4355
}
4456

@@ -100,7 +112,7 @@ public class StdioClientTransport(
100112
}
101113

102114
override suspend fun close() {
103-
if (!initialized.compareAndSet(true, false)) {
115+
if (!initialized.compareAndSet(expectedValue = true, newValue = false)) {
104116
error("Transport is already closed")
105117
}
106118
job?.cancelAndJoin()

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketClientTransport.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package io.modelcontextprotocol.kotlin.sdk.client
22

3-
import io.ktor.client.*
4-
import io.ktor.client.plugins.websocket.*
5-
import io.ktor.client.request.*
6-
import io.ktor.http.*
7-
import io.ktor.websocket.*
3+
import io.ktor.client.HttpClient
4+
import io.ktor.client.plugins.websocket.webSocketSession
5+
import io.ktor.client.request.HttpRequestBuilder
6+
import io.ktor.client.request.header
7+
import io.ktor.http.HttpHeaders
8+
import io.ktor.websocket.WebSocketSession
89
import io.modelcontextprotocol.kotlin.sdk.shared.MCP_SUBPROTOCOL
910
import io.modelcontextprotocol.kotlin.sdk.shared.WebSocketMcpTransport
1011
import kotlin.properties.Delegates
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.modelcontextprotocol.kotlin.sdk.internal
2+
3+
import kotlinx.coroutines.CoroutineDispatcher
4+
5+
internal expect val IODispatcher: CoroutineDispatcher

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/KtorServer.kt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
package io.modelcontextprotocol.kotlin.sdk.server
22

33
import io.github.oshai.kotlinlogging.KotlinLogging
4-
import io.ktor.http.*
5-
import io.ktor.server.application.*
6-
import io.ktor.server.response.*
7-
import io.ktor.server.routing.*
8-
import io.ktor.server.sse.*
9-
import io.ktor.util.collections.*
4+
import io.ktor.http.HttpStatusCode
5+
import io.ktor.server.application.Application
6+
import io.ktor.server.application.install
7+
import io.ktor.server.response.respond
8+
import io.ktor.server.routing.Routing
9+
import io.ktor.server.routing.RoutingContext
10+
import io.ktor.server.routing.post
11+
import io.ktor.server.routing.route
12+
import io.ktor.server.routing.routing
13+
import io.ktor.server.sse.SSE
14+
import io.ktor.server.sse.ServerSSESession
15+
import io.ktor.server.sse.sse
16+
import io.ktor.util.collections.ConcurrentMap
1017
import io.ktor.utils.io.KtorDsl
1118

1219
private val logger = KotlinLogging.logger {}

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/SSEServerTransport.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package io.modelcontextprotocol.kotlin.sdk.server
22

3-
import io.ktor.http.*
4-
import io.ktor.server.application.*
5-
import io.ktor.server.request.*
6-
import io.ktor.server.response.*
7-
import io.ktor.server.sse.*
3+
import io.ktor.http.ContentType
4+
import io.ktor.http.HttpStatusCode
5+
import io.ktor.http.encodeURLPath
6+
import io.ktor.server.application.ApplicationCall
7+
import io.ktor.server.request.contentType
8+
import io.ktor.server.request.receiveText
9+
import io.ktor.server.response.respondText
10+
import io.ktor.server.sse.ServerSSESession
811
import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage
912
import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport
1013
import io.modelcontextprotocol.kotlin.sdk.shared.McpJson
@@ -41,7 +44,7 @@ public class SseServerTransport(
4144
* This should be called when a GET request is made to establish the SSE stream.
4245
*/
4346
override suspend fun start() {
44-
if (!initialized.compareAndSet(false, true)) {
47+
if (!initialized.compareAndSet(expectedValue = false, newValue = true)) {
4548
throw error("SSEServerTransport already started! If using Server class, note that connect() calls start() automatically.")
4649
}
4750

0 commit comments

Comments
 (0)