Skip to content

Commit

Permalink
Fix deriving geolocation server
Browse files Browse the repository at this point in the history
The original implementation had a conceptual error. Instead of calling the geolocated xirsys-API, it replaced the resulting turn url with regional api urls. However, these are not existing turn servers at Xirsys.
  • Loading branch information
Brutus5000 committed Oct 13, 2024
1 parent 4d841c2 commit 8d39373
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.faforever.icebreaker.service.xirsys

import com.faforever.icebreaker.config.FafProperties
import com.faforever.icebreaker.service.xirsys.geolocation.RegionSelectorService
import com.faforever.icebreaker.service.xirsys.geolocation.XirsysRegion
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import io.vertx.core.http.HttpServerRequest
Expand All @@ -28,20 +29,26 @@ class XirsysApiAdapter(
private val objectMapper: ObjectMapper,
@Context private val httpRequest: HttpServerRequest,
) {
private val xirsysApiClient: XirsysApiClient =
RestClientBuilder
.newBuilder()
.baseUri(URI.create(xirsysProperties.baseUrl()))
.register(
BasicAuthenticationRequestFilter(
username = xirsysProperties.ident(),
password = xirsysProperties.secret(),
),
).build(XirsysApiClient::class.java)
private val globalXirsysApiClient: XirsysApiClient = buildXirsysApiClient(xirsysProperties.baseUrl())

private val apiClientByRegion = mutableMapOf<XirsysRegion, XirsysApiClient>()

private fun buildXirsysApiClient(baseUrl: String) = RestClientBuilder
.newBuilder()
.baseUri(URI.create(baseUrl))
.register(
BasicAuthenticationRequestFilter(
username = xirsysProperties.ident(),
password = xirsysProperties.secret(),
),
).build(XirsysApiClient::class.java)

private fun getApiClientForRegion(region: XirsysRegion): XirsysApiClient =
apiClientByRegion.getOrPut(region) { buildXirsysApiClient(region.apiUrl) }

@Retry
fun listChannel(): List<String> = parseAndUnwrap {
xirsysApiClient.listChannel(
globalXirsysApiClient.listChannel(
namespace = xirsysProperties.channelNamespace(),
environment = fafProperties.environment(),
)
Expand All @@ -51,7 +58,7 @@ class XirsysApiAdapter(
fun createChannel(channelName: String) {
try {
parseAndUnwrap<Map<String, String>> {
xirsysApiClient.createChannel(
globalXirsysApiClient.createChannel(
namespace = xirsysProperties.channelNamespace(),
environment = fafProperties.environment(),
channelName = channelName,
Expand All @@ -67,7 +74,7 @@ class XirsysApiAdapter(
fun deleteChannel(channelName: String) {
try {
parseAndUnwrap<Int> {
xirsysApiClient.deleteChannel(
globalXirsysApiClient.deleteChannel(
namespace = xirsysProperties.channelNamespace(),
environment = fafProperties.environment(),
channelName = channelName,
Expand All @@ -85,27 +92,14 @@ class XirsysApiAdapter(
channelName: String,
turnRequest: TurnRequest = TurnRequest(),
): TurnResponse = parseAndUnwrap<TurnResponse> {
xirsysApiClient.requestIceServers(
val region = regionSelectorService.getClosestRegion(httpRequest.getIp())
getApiClientForRegion(region).requestIceServers(
namespace = xirsysProperties.channelNamespace(),
environment = fafProperties.environment(),
channelName = channelName,
turnRequest = turnRequest,
)
}.withUserLocationServers()

private fun TurnResponse.withUserLocationServers(): TurnResponse =
regionSelectorService.getClosestRegion(httpRequest.getIp()).let { region ->
copy(
iceServers = iceServers.copy(
urls = iceServers.urls.map {
it.replace(
regex = Regex("(.+:)([\\w-]+.xirsys.com)(.*)"),
replacement = "$1${region.domain}$3",
)
},
),
)
}
}

@Throws(IOException::class)
private inline fun <reified T : Any> parseAndUnwrap(getResponse: () -> String): T {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.faforever.icebreaker.service.xirsys.geolocation

data class XirsysRegion(
val domain: String,
val apiUrl: String,
val name: String,
val city: String,
override val latitude: Double,
Expand All @@ -11,18 +11,18 @@ data class XirsysRegion(
// listed on https://docs.xirsys.com/?pg=api-intro (manually enriched with geo coordinates)
val allRegions =
listOf(
XirsysRegion("ws.xirsys.com", "US West", "San Jose, CA", 37.33939000, -121.89496000),
XirsysRegion("us.xirsys.com", "US East", "Washington, DC", 38.89511000, -77.03637000),
XirsysRegion("es.xirsys.com", "Europe", "Amsterdam", 52.37403000, 4.88969000),
XirsysRegion("bs.xirsys.com", "India", "Bangalore", 12.97194000, 77.59369000),
XirsysRegion("tk.xirsys.com", "Japan", "Tokyo", 35.67619190, 139.65031060),
XirsysRegion("hk.xirsys.com", "China", "Hong Kong", 22.396428, 114.109497),
XirsysRegion("ss.xirsys.com", "Asia", "Singapore", 1.352083, 103.819836),
XirsysRegion("ms.xirsys.com", "Australia", "Sydney", -33.86785, 151.20732),
XirsysRegion("sp.xirsys.com", "Brazil", "São Paulo", -23.5475, -46.63611),
XirsysRegion("to.xirsys.com", "Canada East", "Toronto", 43.70011, -79.4163),
XirsysRegion("jb.xirsys.com", "South Africa", "Johannesburg", -26.20227, 28.04363),
XirsysRegion("fr.xirsys.com", "Germany", "Frankfurt", 50.11552, 8.68417),
XirsysRegion("https://ws.xirsys.com", "US West", "San Jose, CA", 37.33939000, -121.89496000),
XirsysRegion("https://us.xirsys.com", "US East", "Washington, DC", 38.89511000, -77.03637000),
XirsysRegion("https://es.xirsys.com", "Europe", "Amsterdam", 52.37403000, 4.88969000),
XirsysRegion("https://bs.xirsys.com", "India", "Bangalore", 12.97194000, 77.59369000),
XirsysRegion("https://tk.xirsys.com", "Japan", "Tokyo", 35.67619190, 139.65031060),
XirsysRegion("https://hk.xirsys.com", "China", "Hong Kong", 22.396428, 114.109497),
XirsysRegion("https://ss.xirsys.com", "Asia", "Singapore", 1.352083, 103.819836),
XirsysRegion("https://ms.xirsys.com", "Australia", "Sydney", -33.86785, 151.20732),
XirsysRegion("https://sp.xirsys.com", "Brazil", "São Paulo", -23.5475, -46.63611),
XirsysRegion("https://to.xirsys.com", "Canada East", "Toronto", 43.70011, -79.4163),
XirsysRegion("https://jb.xirsys.com", "South Africa", "Johannesburg", -26.20227, 28.04363),
XirsysRegion("https://fr.xirsys.com", "Germany", "Frankfurt", 50.11552, 8.68417),
)

val fallbackRegion = allRegions.last()
Expand Down

0 comments on commit 8d39373

Please sign in to comment.