Skip to content

KMP (pure Kotlin) implementation of SocketIO client.

License

Notifications You must be signed in to change notification settings

HackWebRTC/kmp-socketio

Repository files navigation

kmp-socketio

KMP (pure Kotlin) implementation of SocketIO client.

Maven Central Version Main branch status Coverage

Supported platforms

Platform 🛠Builds🛠 + 🔬Tests🔬
JVM 17 🚀
Browser (Chrome) 🚀
Android 🚀
iOS 🚀
macOS 🚀
Windows X64 🚀
Linux X64 🔮

About Linux support: Ktor's curl engine doesn't support websockets now, although CIO engine supports websockets, but it doesn't support TLS.

Ref:

Dependency

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")
      }
    }
  }
}

Usage

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 emit only accepts String/Boolean/Number/JsonElement/ByteString, other types will be converted to String using toString(), so there is no way to put ByteString in JsonElement.

Set logging callback

Logger.setLogger(object : LoggerInterface {
    override fun debug(tag: String, log: String) {
        TODO("Not yet implemented")
    }

    override fun info(tag: String, log: String) {
        TODO("Not yet implemented")
    }

    override fun error(tag: String, log: String) {
        TODO("Not yet implemented")
    }
})

Example

Android

Open the project (the repo root dir) in Android studio, and run the example.androidApp target.

iOS

cd example/iosApp
pod install
# open iosApp.xcworkspace in Xcode, and run it.

JS

Use Chrome CORS Unblock extension to workaround with CORS error.

./gradlew :example:shared:jsBrowserRun

Windows

.\gradlew runKmp_socketioDebugExecutableMingwX64

macOS

./gradlew runKmp_socketioDebugExecutableMacosX64

Publish

Maven central portal credentials and signing configs are set in ~/.gradle/gradle.properties.

# 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 \
    --no-configuration-cache

Login to https://central.sonatype.com/publishing/deployments, and release them manually.

Credit

About

KMP (pure Kotlin) implementation of SocketIO client.

Resources

License

Stars

Watchers

Forks

Packages

No packages published