diff --git a/library/build.gradle.kts b/library/build.gradle.kts index fd0b4a11..cf50ae66 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -22,6 +22,11 @@ kotlin { binaryOption("bundleId", "com.tidal.networktime") isStatic = true } + it.compilations.configureEach { + cinterops.create("cinterop") { + defFile(project.file("src/appleMain/cinterop/network_framework.def")) + } + } } applyDefaultHierarchyTemplate() diff --git a/library/src/appleMain/cinterop/network_framework.def b/library/src/appleMain/cinterop/network_framework.def new file mode 100644 index 00000000..463bf98c --- /dev/null +++ b/library/src/appleMain/cinterop/network_framework.def @@ -0,0 +1,14 @@ +package = com.tidal.networktime.network_framework +language = Objective-C + +--- +// https://stackoverflow.com/a/63050804 + +#include + +NW_RETURNS_RETAINED nw_parameters_t nw_parameters_create_secure_udp_workaround() { + return nw_parameters_create_secure_udp( + withTls ? NW_PARAMETERS_DEFAULT_CONFIGURATION : NW_PARAMETERS_DISABLE_PROTOCOL, + NW_PARAMETERS_DEFAULT_CONFIGURATION + ); +} diff --git a/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt b/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt index 7e204723..78527881 100644 --- a/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt +++ b/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt @@ -11,8 +11,6 @@ import kotlinx.cinterop.set import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.withTimeout import platform.Network.NW_CONNECTION_FINAL_MESSAGE_CONTEXT -import platform.Network.NW_PARAMETERS_DEFAULT_CONFIGURATION -import platform.Network.NW_PARAMETERS_DISABLE_PROTOCOL import platform.Network.nw_connection_create import platform.Network.nw_connection_force_cancel import platform.Network.nw_connection_receive @@ -27,12 +25,11 @@ import platform.Network.nw_connection_state_t import platform.Network.nw_connection_t import platform.Network.nw_endpoint_create_host import platform.Network.nw_error_t -import platform.Network.nw_parameters_create_secure_udp import platform.darwin._dispatch_data_destructor_free import platform.darwin.dispatch_data_apply import platform.darwin.dispatch_data_create import platform.darwin.dispatch_data_t -import platform.darwin.dispatch_get_current_queue +import platform.darwin.dispatch_get_main_queue import platform.posix.memcpy import kotlin.test.assertEquals import kotlin.test.assertNull @@ -43,28 +40,37 @@ internal actual class NTPUDPSocketOperations { private var connection: nw_connection_t = null actual suspend fun prepare(address: String, portNumber: Int, connectTimeout: Duration) { - val parameters = nw_parameters_create_secure_udp( - NW_PARAMETERS_DISABLE_PROTOCOL, - NW_PARAMETERS_DEFAULT_CONFIGURATION, - ) - val endpoint = nw_endpoint_create_host(address, portNumber.toString()) - connection = nw_connection_create(endpoint, parameters) - nw_connection_set_queue(connection, dispatch_get_current_queue()) + println("BEFORE CREATESECUREUDP") + val parameters = nw_parameters_create_secure_udp_workaround() + println("BEFORE CREATEHOST") + println("Endpoint is $address/$portNumber") + val endpoint = nw_endpoint_create_host("localhost", "123") + println("BEFORE CONNCREATE") + connection = nw_connection_create(endpoint, null) + println("BEFORE SETQUEUE") + nw_connection_set_queue(connection, dispatch_get_main_queue()) val connectionStateDeferred = CompletableDeferred() + println("BEFORE SETHANDLER") nw_connection_set_state_changed_handler(connection) { state: nw_connection_state_t, _ -> + println("State is $state") when (state) { nw_connection_state_ready, nw_connection_state_failed, nw_connection_state_cancelled -> connectionStateDeferred.complete(state) } } + println("Print test") + println("BEFORE START") nw_connection_start(connection) + println("BEFORE WITHTIMEOUT") withTimeout(connectTimeout) { assertEquals(nw_connection_state_ready, connectionStateDeferred.await()) } + println("AFTER WITHTIMEOUT") } @OptIn(ExperimentalForeignApi::class) actual suspend fun exchange(buffer: ByteArray, readTimeout: Duration) { + println("EXCHANGE") val toSendData = memScoped { val cArray = allocArray(buffer.size) buffer.forEachIndexed { i, it -> @@ -99,6 +105,7 @@ internal actual class NTPUDPSocketOperations { } actual fun tearDown() { + println("TEARDOWN") nw_connection_force_cancel(connection) connection = null }