/* * Copyright (c) 2021 Proton Technologies AG * This file is part of Proton Technologies AG and ProtonCore. * * ProtonCore is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ProtonCore is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ProtonCore. If not, see . */ package me.proton.core.network.domain.handlers import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import me.proton.core.network.domain.ApiBackend import me.proton.core.network.domain.ApiErrorHandler import me.proton.core.network.domain.ApiManager import me.proton.core.network.domain.ApiResult import me.proton.core.network.domain.serverconnection.ApiConnectionListener class ApiConnectionHandler( private val apiConnectionListener: ApiConnectionListener? ) : ApiErrorHandler { override suspend fun invoke( backend: ApiBackend, error: ApiResult.Error, call: ApiManager.Call ): ApiResult { if (!error.isPotentialBlocking) return error if (error !is ApiResult.Error.Connection) return error return apiConnectionListener?.let { listener -> globalMutex.withLock { listener.onPotentiallyBlocked(error.path, error.query) { backend(call) } } } ?: error } companion object { private val globalMutex: Mutex = Mutex() } }