From d108919cf6a1bd5edc1c3b0b61e4a2c2ca41d5df Mon Sep 17 00:00:00 2001 From: pierre Date: Thu, 24 Aug 2023 13:01:26 +0200 Subject: [PATCH] wip implement pingClient call --- .../native/android/app/build.gradle.kts | 4 +-- .../main/java/net/nymtech/nyms5/NymProxy.kt | 14 +++++++++++ .../java/net/nymtech/nyms5/ProxyWorker.kt | 25 ++++++++++++++++++- sdk/lib/socks5-listener/src/android.rs | 11 ++++++++ 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/nym-connect/native/android/app/build.gradle.kts b/nym-connect/native/android/app/build.gradle.kts index b1c912729f..a93507b8a9 100644 --- a/nym-connect/native/android/app/build.gradle.kts +++ b/nym-connect/native/android/app/build.gradle.kts @@ -7,12 +7,12 @@ plugins { android { namespace = "net.nymtech.nyms5" - compileSdk = 33 + compileSdk = 34 defaultConfig { applicationId = "net.nymtech.nyms5" minSdk = 24 - targetSdk = 33 + targetSdk = 34 versionCode = 1 versionName = "1.0" diff --git a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/NymProxy.kt b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/NymProxy.kt index 8ff13e7c45..7c2f169c12 100644 --- a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/NymProxy.kt +++ b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/NymProxy.kt @@ -22,6 +22,8 @@ class NymProxy { Log.i(tag, "loaded native library $nymNativeLib") } + // this is a blocking call as `startClient` is blocking and will releases when + // the socks5 connection has been terminated fun start(serviceProvider: String, onStartCbObj: Any, onStopCbObj: Any) { Log.d(tag, "calling $nymNativeLib:startClient") try { @@ -42,6 +44,17 @@ class NymProxy { } } + fun ping(): Boolean { + Log.d(tag, "calling $nymNativeLib:pingClient") + try { + return pingClient() + } catch (e: Throwable) { + Log.e(tag, "$nymNativeLib:pingClient internal error: $e") + Sentry.captureException(e) + } + return false + } + fun getState(): State { Log.d(tag, "calling $nymNativeLib:getClientState") try { @@ -66,4 +79,5 @@ class NymProxy { private external fun stopClient() private external fun getClientState(): Int + private external fun pingClient(): Boolean } \ No newline at end of file diff --git a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/ProxyWorker.kt b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/ProxyWorker.kt index 6f798eff9a..f77a68bf38 100644 --- a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/ProxyWorker.kt +++ b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/ProxyWorker.kt @@ -17,6 +17,10 @@ import androidx.work.WorkerParameters import androidx.work.workDataOf import com.github.kittinunf.fuel.Fuel import io.sentry.Sentry +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json @@ -45,6 +49,8 @@ class ProxyWorker( private val tag = "proxyWorker" + private val pingRate = 1000L + private val spUrl = context.getString(R.string.sp_url) private val defaultSp = context.getString(R.string.default_sp) @@ -135,7 +141,24 @@ class ProxyWorker( Log.w(tag, "using a default service provider $defaultSp") } - nymProxy.start(serviceProvider ?: defaultSp, onStartCb, onStopCb) + withContext(Dispatchers.IO) { + val pingJob = launch { + do { + val pong = nymProxy.ping() + delay(pingRate) + } while (pong) + } + + val proxyJob = launch { + nymProxy.start(serviceProvider ?: defaultSp, onStartCb, onStopCb) + } + + // wait for the underlying call to `startClient` to be released which means + // the connection has been terminated (`startClient` is a blocking call) + proxyJob.join() + // stop pinging + pingJob.cancel() + } // the state should be already set to DISCONNECTED at this point // but for the sake of it, reset it diff --git a/sdk/lib/socks5-listener/src/android.rs b/sdk/lib/socks5-listener/src/android.rs index ef51df23f5..2763b3d79f 100644 --- a/sdk/lib/socks5-listener/src/android.rs +++ b/sdk/lib/socks5-listener/src/android.rs @@ -2,6 +2,7 @@ use crate::ClientState; use ::safer_ffi::prelude::*; use jni::{ objects::{JClass, JObject, JString}, + sys::jboolean, sys::jint, JNIEnv, }; @@ -89,3 +90,13 @@ pub unsafe extern "C" fn Java_net_nymtech_nyms5_NymProxy_getClientState( ClientState::Disconnected => 2, } } + +#[no_mangle] +pub unsafe extern "C" fn Java_net_nymtech_nyms5_NymProxy_pingClient( + _env: JNIEnv, + _class: JClass, +) -> jboolean { + // TODO: implement + log::debug!("ping received"); + 1 +}