diff options
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/AuthTokenCache.kt | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/AuthTokenCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/AuthTokenCache.kt new file mode 100644 index 0000000000..29077e55f6 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/AuthTokenCache.kt @@ -0,0 +1,42 @@ +package net.mullvad.mullvadvpn.ui.serviceconnection + +import android.os.Messenger +import java.util.LinkedList +import kotlinx.coroutines.CompletableDeferred +import net.mullvad.mullvadvpn.ipc.DispatchingHandler +import net.mullvad.mullvadvpn.ipc.Event +import net.mullvad.mullvadvpn.ipc.Request + +class AuthTokenCache(val connection: Messenger, eventDispatcher: DispatchingHandler<Event>) { + private val fetchQueue = LinkedList<CompletableDeferred<String>>() + + init { + eventDispatcher.registerHandler(Event.AuthToken::class) { event -> + synchronized(this@AuthTokenCache) { + fetchQueue.poll()?.complete(event.token ?: "") + } + } + } + + suspend fun fetchAuthToken(): String { + val authToken = CompletableDeferred<String>() + + synchronized(this) { + fetchQueue.offer(authToken) + } + + connection.send(Request.FetchAuthToken.message) + + return authToken.await() + } + + fun onDestroy() { + synchronized(this) { + for (pendingFetch in fetchQueue) { + pendingFetch.cancel() + } + + fetchQueue.clear() + } + } +} |
