diff --git a/README.md b/README.md index 3af6e9c..eeeedd3 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,9 @@ kotlin { ## Usage ```kotlin -IO.socket("http://localhost:3000", IO.Options()) { socket -> +val opt = IO.Options() +// opt.trustAllCerts = true +IO.socket("http://localhost:3000", opt) { socket -> socket.on(Socket.EVENT_CONNECT) { args -> println("on connect ${args.joinToString()}") @@ -156,6 +158,7 @@ Maven central portal credentials and signing configs are set in `~/.gradle/gradl # on macOS: need manual release on website ./gradlew clean \ publishKotlinMultiplatformPublicationToMavenCentralRepository \ + publishAndroidReleasePublicationToMavenCentralRepository \ publishJvmPublicationToMavenCentralRepository \ publishIosArm64PublicationToMavenCentralRepository \ publishIosSimulatorArm64PublicationToMavenCentralRepository \ diff --git a/buildSrc/src/main/kotlin/Constants.kt b/buildSrc/src/main/kotlin/Constants.kt index 927cfc0..8ebb7e1 100644 --- a/buildSrc/src/main/kotlin/Constants.kt +++ b/buildSrc/src/main/kotlin/Constants.kt @@ -1,7 +1,7 @@ object Consts { const val releaseGroup = "com.piasy" const val releaseName = "kmp-socketio" - const val releaseVersion = "1.4.0" + const val releaseVersion = "1.4.1" val androidNS = "$releaseGroup.${releaseName.replace('-', '.')}" } diff --git a/example/androidApp/src/main/AndroidManifest.xml b/example/androidApp/src/main/AndroidManifest.xml index 32c911c..3aca396 100644 --- a/example/androidApp/src/main/AndroidManifest.xml +++ b/example/androidApp/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + val opt = IO.Options() + //opt.trustAllCerts = true + IO.socket("http://172.16.11.186:3000", opt) { socket -> socket.on(Socket.EVENT_CONNECT) { args -> println("Greeting on connect ${args.joinToString()}") diff --git a/kmp-socketio/build.gradle.kts b/kmp-socketio/build.gradle.kts index b7cceb3..790ce22 100644 --- a/kmp-socketio/build.gradle.kts +++ b/kmp-socketio/build.gradle.kts @@ -6,13 +6,35 @@ plugins { alias(libs.plugins.kmp) alias(libs.plugins.vanniktech.mavenPublish) alias(libs.plugins.kover) + alias(libs.plugins.android.library) } version = Consts.releaseVersion group = Consts.releaseGroup +android { + namespace = "${Consts.androidNS}.android" + compileSdk = libs.versions.compileSdk.get().toInt() + defaultConfig { + minSdk = libs.versions.minSdk.get().toInt() + } + + compileOptions { + sourceCompatibility = JavaVersion.toVersion(libs.versions.jvm.get().toInt()) + targetCompatibility = JavaVersion.toVersion(libs.versions.jvm.get().toInt()) + } + testOptions { + unitTests.all { + it.failOnNoDiscoveredTests = false + } + } +} + kotlin { jvm() + androidTarget { + publishLibraryVariants("release") + } iosArm64() iosSimulatorArm64() @@ -69,6 +91,11 @@ kotlin { api(libs.ktor.client.cio) // cio engine works fine } } + androidMain { + dependencies { + api(libs.ktor.client.okhttp) + } + } jvmTest { dependencies { implementation(libs.kotlin.test) diff --git a/kmp-socketio/src/androidMain/kotlin/com/piasy/kmp/socketio/engineio/transports/transport.android.kt b/kmp-socketio/src/androidMain/kotlin/com/piasy/kmp/socketio/engineio/transports/transport.android.kt new file mode 100644 index 0000000..979c346 --- /dev/null +++ b/kmp-socketio/src/androidMain/kotlin/com/piasy/kmp/socketio/engineio/transports/transport.android.kt @@ -0,0 +1,35 @@ +package com.piasy.kmp.socketio.engineio.transports + +import io.ktor.client.HttpClient +import io.ktor.client.HttpClientConfig +import io.ktor.client.engine.okhttp.OkHttp +import java.security.SecureRandom +import java.security.cert.X509Certificate +import javax.net.ssl.SSLContext +import javax.net.ssl.X509TrustManager + +actual fun httpClient( + trustAllCerts: Boolean, + config: HttpClientConfig<*>.() -> Unit +): HttpClient = HttpClient(OkHttp) { + if (trustAllCerts) { + val trustManager = object : X509TrustManager { + override fun checkClientTrusted(chain: Array?, authType: String?) = Unit + override fun checkServerTrusted(chain: Array?, authType: String?) = Unit + override fun getAcceptedIssuers(): Array = emptyArray() + } + + val sslContext = SSLContext.getInstance("TLS").apply { + init(null, arrayOf(trustManager), SecureRandom()) + } + + engine { + config { + sslSocketFactory(sslContext.socketFactory, trustManager) + hostnameVerifier { _, _ -> true } + } + } + } + + config(this) +} diff --git a/kmp-socketio/src/jvmTest/kotlin/com/piasy/kmp/socketio/engineio/TestUtil.kt b/kmp-socketio/src/jvmTest/kotlin/com/piasy/kmp/socketio/engineio/TestUtil.kt index a373188..dabf478 100644 --- a/kmp-socketio/src/jvmTest/kotlin/com/piasy/kmp/socketio/engineio/TestUtil.kt +++ b/kmp-socketio/src/jvmTest/kotlin/com/piasy/kmp/socketio/engineio/TestUtil.kt @@ -43,7 +43,9 @@ object TestUtil { @JvmStatic fun closeManager(manager: Manager) { - manager.close() + manager.engine?.scope?.launch { + manager.close() + } } @JvmStatic