diff --git a/regions/src/androidMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt b/regions/src/androidMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt index cd7a1a4..1d7140b 100644 --- a/regions/src/androidMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt +++ b/regions/src/androidMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt @@ -40,29 +40,23 @@ internal actual class PingPerformer : CoroutineScope { // endregion actual fun pingEndpoints( - endpoints: Map>, - callback: (result: Map>>) -> Unit + endpoints: Map, + callback: (result: Map) -> Unit ) { async { - val syncResult = - Collections.synchronizedMap(mutableMapOf>>()) + val syncResult = Collections.synchronizedMap(mutableMapOf()) val requests: MutableList = mutableListOf() - for ((region, endpointsInRegion) in endpoints) { - val syncRegionEndpointsResults = - Collections.synchronizedList(mutableListOf>()) - endpointsInRegion.forEach { - requests.add(async(Dispatchers.IO) { - var error: Error? = null - var latency = measureTimeMillis { - error = ping(it) - } - latency = error?.let { - REGIONS_PING_TIMEOUT.toLong() - } ?: latency - syncRegionEndpointsResults.add(Pair(it, latency)) - syncResult[region] = syncRegionEndpointsResults - }) - } + for ((region, endpointInRegion) in endpoints) { + requests.add(async(Dispatchers.IO) { + var error: Error? + var latency = measureTimeMillis { + error = ping(endpointInRegion) + } + latency = error?.let { + REGIONS_PING_TIMEOUT.toLong() + } ?: latency + syncResult[region] = latency + }) } requests.joinAll() launch(Dispatchers.Main) { callback(syncResult) } diff --git a/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/RegionsAPI.kt b/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/RegionsAPI.kt index 1f9c892..2dfd36d 100644 --- a/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/RegionsAPI.kt +++ b/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/RegionsAPI.kt @@ -259,12 +259,10 @@ public data class RegionJsonFallback( * Data class defining the response object for a ping request. @see `fun pingRequests(...)`. * * @param region `String`. - * @param endpoint `String`. * @param latency `String`. */ public data class RegionLowerLatencyInformation( val region: String, - val endpoint: String, val latency: Long ) diff --git a/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt b/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt index b1819ec..8feda8d 100644 --- a/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt +++ b/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt @@ -3,13 +3,11 @@ package com.privateinternetaccess.regions.internals internal expect class PingPerformer() { /** - * @param endpoints Map>. Key: Region. List: Endpoints within the - * region. - * @param callback Map>>. Key: Region. - * List>>: Endpoints and latencies within the region. + * @param endpoints Map. Key: Region. String: Endpoint to ping in the region. + * @param callback Map. Key: Region. Value: Latency. */ fun pingEndpoints( - endpoints: Map>, - callback: (result: Map>>) -> Unit + endpoints: Map, + callback: (result: Map) -> Unit ) } diff --git a/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/Regions.kt b/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/Regions.kt index d4552f3..437f7ff 100644 --- a/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/Regions.kt +++ b/regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/Regions.kt @@ -520,61 +520,37 @@ public class Regions internal constructor( regionsResponse: VpnRegionsResponse, callback: (response: List) -> Unit ) { - val endpointsToPing = mutableMapOf>() - val lowerLatencies = mutableListOf() + val endpointsToPing = mutableMapOf() + val latencies = mutableListOf() val allKnownEndpointsDetails = flattenEndpointsInformation(regionsResponse) for ((region, regionEndpointInformation) in allKnownEndpointsDetails) { - val regionEndpoints = mutableListOf() - regionEndpointInformation.forEach { - regionEndpoints.add(it.endpoint) - } - endpointsToPing[region] = regionEndpoints + endpointsToPing[region] = regionEndpointInformation.endpoint } + println("Juan2 total endpoints to ping ${endpointsToPing.size}") pingPerformer.pingEndpoints(endpointsToPing) { latencyResults -> - for ((region, results) in latencyResults) { - if (results.isEmpty()) { - continue - } - - results.minByOrNull { it.second }?.let { minEndpointLatency -> - allKnownEndpointsDetails[region]?.let { allKnownEndpointsDetails -> - allKnownEndpointsDetails.firstOrNull { - it.endpoint == minEndpointLatency.first - }?.let { minEndpointLatencyDetails -> - lowerLatencies.add(RegionLowerLatencyInformation( - minEndpointLatencyDetails.region, - minEndpointLatencyDetails.endpoint, - minEndpointLatency.second - )) - } - } - } + for ((region, latency) in latencyResults) { + latencies.add(RegionLowerLatencyInformation(region, latency)) } - callback(lowerLatencies) + callback(latencies) } } private fun flattenEndpointsInformation( response: VpnRegionsResponse - ): Map> { - val result = mutableMapOf>() + ): Map { + val result = mutableMapOf() response.regions.forEach { region -> - region.servers[RegionsProtocol.META.protocol]?.forEach { regionServerProtocol -> - if (result[region.id] == null) { - result[region.id] = mutableListOf() - } - result[region.id]?.add( - RegionEndpointInformation( - region = region.id, - name = region.name, - iso = region.country, - dns = region.dns, - protocol = RegionsProtocol.META.protocol, - endpoint = regionServerProtocol.ip, - portForwarding = region.portForward - ) + region.servers[RegionsProtocol.META.protocol]?.firstOrNull()?.let { + result[region.id] = RegionEndpointInformation( + region = region.id, + name = region.name, + iso = region.country, + dns = region.dns, + protocol = RegionsProtocol.META.protocol, + endpoint = it.ip, + portForwarding = region.portForward ) } } diff --git a/regions/src/iosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt b/regions/src/iosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt index 817ce45..9b717b2 100644 --- a/regions/src/iosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt +++ b/regions/src/iosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt @@ -26,10 +26,10 @@ internal actual class PingPerformer { } actual fun pingEndpoints( - endpoints: Map>, - callback: (result: Map>>) -> Unit + endpoints: Map, + callback: (result: Map) -> Unit ) { - val result = mutableMapOf>>() + val result = mutableMapOf() callback(result) } } \ No newline at end of file diff --git a/regions/src/tvosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt b/regions/src/tvosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt index 817ce45..9b717b2 100644 --- a/regions/src/tvosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt +++ b/regions/src/tvosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt @@ -26,10 +26,10 @@ internal actual class PingPerformer { } actual fun pingEndpoints( - endpoints: Map>, - callback: (result: Map>>) -> Unit + endpoints: Map, + callback: (result: Map) -> Unit ) { - val result = mutableMapOf>>() + val result = mutableMapOf() callback(result) } } \ No newline at end of file