KMP (pure Kotlin) implementation of SocketIO client.
| Platform | 🛠Builds🛠 + 🔬Tests🔬 |
|---|---|
JVM 17 |
🚀 |
JS (Chrome, Node) |
🚀 |
WasmJS (Chrome, Node) |
🚀 |
Android |
🚀 |
iOS |
🚀 |
macOS |
🚀 |
Windows X64 |
🚀 |
Linux X64 |
🚀 |
You only need to add gradle dependency:
// add common source set dependency
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
implementation("com.piasy:kmp-socketio:$version")
}
}
}
}IO.socket("http://localhost:3000", IO.Options()) { socket ->
socket.on(Socket.EVENT_CONNECT) { args ->
println("on connect ${args.joinToString()}")
val bin = UnsafeByteStringOperations.wrapUnsafe(byteArrayOf(0x1, 0x3, 0x1, 0x4))
socket.emit("echo", 1, "2", bin, GMTDate())
}.on("echoBack") { args ->
println("on echoBack ${args.joinToString()}")
}
socket.open()
}Most of the APIs are the same as socket.io-client-java, here are some differences:
- Create socket is asynchronous, to make it's easier to guarantee thread safety.
- Binary messages can't be nested, because
emitonly accepts String/Boolean/Number/JsonElement/ByteString, other types will be converted to String usingtoString(), so there is no way to put ByteString in JsonElement.
Logging with kmp-xlog
To check coverage details, run ./gradlew :kmp-socketio:jvmTest --info && ./gradlew koverHtmlReport,
then check kmp-socketio/build/reports/kover/html/index.html.
Before running examples, run node kmp-socketio/src/jvmTest/resources/socket-server.js to start the socket-io echo server,
and update the local IP address in example/shared/src/commonMain/kotlin/com/piasy/kmp/socketio/example/Greeting.kt.
Open the project (the repo root dir) in Android studio, and run the example.androidApp target.
brew install cocoapods xcodegen
# if you have installed them earlier, you need to remove them at first,
# or run brew link --overwrite xcodegen cocoapods
cd example/iosApp
xcodegen
pod install
# open iosApp.xcworkspace in Xcode, and run it.Use Chrome CORS Unblock extension to workaround with CORS error.
./gradlew :example:shared:jsBrowserDevelopmentRunUse Chrome CORS Unblock extension to workaround with CORS error.
./gradlew :example:shared:wasmJsBrowserDevelopmentRun.\gradlew runKmp_socketioDebugExecutableMingwX64./gradlew runKmp_socketioDebugExecutableLinuxX64./gradlew runKmp_socketioDebugExecutableMacosX64Maven central portal credentials and signing configs are set in ~/.gradle/gradle.properties.
# on Linux: need manual release on website
./gradlew clean publishLinuxX64PublicationToMavenCentralRepository --no-configuration-cache
# on Windows: need manual release on website
.\gradlew clean publishMingwX64PublicationToMavenCentralRepository --no-configuration-cache
# on macOS: need manual release on website
./gradlew clean \
publishKotlinMultiplatformPublicationToMavenCentralRepository \
publishJvmPublicationToMavenCentralRepository \
publishIosArm64PublicationToMavenCentralRepository \
publishIosSimulatorArm64PublicationToMavenCentralRepository \
publishIosX64PublicationToMavenCentralRepository \
publishMacosArm64PublicationToMavenCentralRepository \
publishMacosX64PublicationToMavenCentralRepository \
publishJsPublicationToMavenCentralRepository \
publishWasmJsPublicationToMavenCentralRepository \
--no-configuration-cacheLogin to https://central.sonatype.com/publishing/deployments, and release them manually.