Skip to content

Commit f437ad9

Browse files
PIA-1900: Ping just one meta endpoint per region (#17)
1 parent cd83c79 commit f437ad9

6 files changed

Lines changed: 41 additions & 76 deletions

File tree

regions/src/androidMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,29 +40,23 @@ internal actual class PingPerformer : CoroutineScope {
4040
// endregion
4141

4242
actual fun pingEndpoints(
43-
endpoints: Map<String, List<String>>,
44-
callback: (result: Map<String, List<Pair<String, Long>>>) -> Unit
43+
endpoints: Map<String, String>,
44+
callback: (result: Map<String, Long>) -> Unit
4545
) {
4646
async {
47-
val syncResult =
48-
Collections.synchronizedMap(mutableMapOf<String, List<Pair<String, Long>>>())
47+
val syncResult = Collections.synchronizedMap(mutableMapOf<String, Long>())
4948
val requests: MutableList<Job> = mutableListOf()
50-
for ((region, endpointsInRegion) in endpoints) {
51-
val syncRegionEndpointsResults =
52-
Collections.synchronizedList(mutableListOf<Pair<String, Long>>())
53-
endpointsInRegion.forEach {
54-
requests.add(async(Dispatchers.IO) {
55-
var error: Error? = null
56-
var latency = measureTimeMillis {
57-
error = ping(it)
58-
}
59-
latency = error?.let {
60-
REGIONS_PING_TIMEOUT.toLong()
61-
} ?: latency
62-
syncRegionEndpointsResults.add(Pair(it, latency))
63-
syncResult[region] = syncRegionEndpointsResults
64-
})
65-
}
49+
for ((region, endpointInRegion) in endpoints) {
50+
requests.add(async(Dispatchers.IO) {
51+
var error: Error?
52+
var latency = measureTimeMillis {
53+
error = ping(endpointInRegion)
54+
}
55+
latency = error?.let {
56+
REGIONS_PING_TIMEOUT.toLong()
57+
} ?: latency
58+
syncResult[region] = latency
59+
})
6660
}
6761
requests.joinAll()
6862
launch(Dispatchers.Main) { callback(syncResult) }

regions/src/commonMain/kotlin/com/privateinternetaccess/regions/RegionsAPI.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,12 +259,10 @@ public data class RegionJsonFallback(
259259
* Data class defining the response object for a ping request. @see `fun pingRequests(...)`.
260260
*
261261
* @param region `String`.
262-
* @param endpoint `String`.
263262
* @param latency `String`.
264263
*/
265264
public data class RegionLowerLatencyInformation(
266265
val region: String,
267-
val endpoint: String,
268266
val latency: Long
269267
)
270268

regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ package com.privateinternetaccess.regions.internals
33
internal expect class PingPerformer() {
44

55
/**
6-
* @param endpoints Map<String, List<String>>. Key: Region. List<String>: Endpoints within the
7-
* region.
8-
* @param callback Map<String, List<Pair<String, Long>>>. Key: Region.
9-
* List<Pair<String, Long>>>: Endpoints and latencies within the region.
6+
* @param endpoints Map<String, String>. Key: Region. String: Endpoint to ping in the region.
7+
* @param callback Map<String, Long>. Key: Region. Value: Latency.
108
*/
119
fun pingEndpoints(
12-
endpoints: Map<String, List<String>>,
13-
callback: (result: Map<String, List<Pair<String, Long>>>) -> Unit
10+
endpoints: Map<String, String>,
11+
callback: (result: Map<String, Long>) -> Unit
1412
)
1513
}

regions/src/commonMain/kotlin/com/privateinternetaccess/regions/internals/Regions.kt

Lines changed: 17 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -520,61 +520,36 @@ public class Regions internal constructor(
520520
regionsResponse: VpnRegionsResponse,
521521
callback: (response: List<RegionLowerLatencyInformation>) -> Unit
522522
) {
523-
val endpointsToPing = mutableMapOf<String, List<String>>()
524-
val lowerLatencies = mutableListOf<RegionLowerLatencyInformation>()
523+
val endpointsToPing = mutableMapOf<String, String>()
524+
val latencies = mutableListOf<RegionLowerLatencyInformation>()
525525

526526
val allKnownEndpointsDetails = flattenEndpointsInformation(regionsResponse)
527527
for ((region, regionEndpointInformation) in allKnownEndpointsDetails) {
528-
val regionEndpoints = mutableListOf<String>()
529-
regionEndpointInformation.forEach {
530-
regionEndpoints.add(it.endpoint)
531-
}
532-
endpointsToPing[region] = regionEndpoints
528+
endpointsToPing[region] = regionEndpointInformation.endpoint
533529
}
534530

535531
pingPerformer.pingEndpoints(endpointsToPing) { latencyResults ->
536-
for ((region, results) in latencyResults) {
537-
if (results.isEmpty()) {
538-
continue
539-
}
540-
541-
results.minByOrNull { it.second }?.let { minEndpointLatency ->
542-
allKnownEndpointsDetails[region]?.let { allKnownEndpointsDetails ->
543-
allKnownEndpointsDetails.firstOrNull {
544-
it.endpoint == minEndpointLatency.first
545-
}?.let { minEndpointLatencyDetails ->
546-
lowerLatencies.add(RegionLowerLatencyInformation(
547-
minEndpointLatencyDetails.region,
548-
minEndpointLatencyDetails.endpoint,
549-
minEndpointLatency.second
550-
))
551-
}
552-
}
553-
}
532+
for ((region, latency) in latencyResults) {
533+
latencies.add(RegionLowerLatencyInformation(region, latency))
554534
}
555-
callback(lowerLatencies)
535+
callback(latencies)
556536
}
557537
}
558538

559539
private fun flattenEndpointsInformation(
560540
response: VpnRegionsResponse
561-
): Map<String, List<RegionEndpointInformation>> {
562-
val result = mutableMapOf<String, MutableList<RegionEndpointInformation>>()
541+
): Map<String, RegionEndpointInformation> {
542+
val result = mutableMapOf<String, RegionEndpointInformation>()
563543
response.regions.forEach { region ->
564-
region.servers[RegionsProtocol.META.protocol]?.forEach { regionServerProtocol ->
565-
if (result[region.id] == null) {
566-
result[region.id] = mutableListOf()
567-
}
568-
result[region.id]?.add(
569-
RegionEndpointInformation(
570-
region = region.id,
571-
name = region.name,
572-
iso = region.country,
573-
dns = region.dns,
574-
protocol = RegionsProtocol.META.protocol,
575-
endpoint = regionServerProtocol.ip,
576-
portForwarding = region.portForward
577-
)
544+
region.servers[RegionsProtocol.META.protocol]?.firstOrNull()?.let {
545+
result[region.id] = RegionEndpointInformation(
546+
region = region.id,
547+
name = region.name,
548+
iso = region.country,
549+
dns = region.dns,
550+
protocol = RegionsProtocol.META.protocol,
551+
endpoint = it.ip,
552+
portForwarding = region.portForward
578553
)
579554
}
580555
}

regions/src/iosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ internal actual class PingPerformer {
2626
}
2727

2828
actual fun pingEndpoints(
29-
endpoints: Map<String, List<String>>,
30-
callback: (result: Map<String, List<Pair<String, Long>>>) -> Unit
29+
endpoints: Map<String, String>,
30+
callback: (result: Map<String, Long>) -> Unit
3131
) {
32-
val result = mutableMapOf<String, List<Pair<String, Long>>>()
32+
val result = mutableMapOf<String, Long>()
3333
callback(result)
3434
}
3535
}

regions/src/tvosMain/kotlin/com/privateinternetaccess/regions/internals/PingPerformer.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ internal actual class PingPerformer {
2626
}
2727

2828
actual fun pingEndpoints(
29-
endpoints: Map<String, List<String>>,
30-
callback: (result: Map<String, List<Pair<String, Long>>>) -> Unit
29+
endpoints: Map<String, String>,
30+
callback: (result: Map<String, Long>) -> Unit
3131
) {
32-
val result = mutableMapOf<String, List<Pair<String, Long>>>()
32+
val result = mutableMapOf<String, Long>()
3333
callback(result)
3434
}
3535
}

0 commit comments

Comments
 (0)