From 1470d10fff4e76c7e5d96de2d24bf4c831b539b8 Mon Sep 17 00:00:00 2001 From: Oswaldo Leon Date: Sat, 16 Oct 2021 10:35:02 -0500 Subject: [PATCH] [update] updated restoration token plugin for support queue --- .../Restoration/RestorationTokenPlugin.swift | 66 +++++++++++-------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/APIClient/Default/Plugins/Restoration/RestorationTokenPlugin.swift b/APIClient/Default/Plugins/Restoration/RestorationTokenPlugin.swift index 6fa7730..c1f902c 100644 --- a/APIClient/Default/Plugins/Restoration/RestorationTokenPlugin.swift +++ b/APIClient/Default/Plugins/Restoration/RestorationTokenPlugin.swift @@ -25,7 +25,7 @@ public class RestorationTokenPlugin: PluginType { private var inProgress = false private let credentialProvider: AccessCredentialsProvider private let authErrorResolving: AuthErrorResolving - + private var queue: [(Bool) -> Void] = [] /// - Parameters: /// - credentialProvider: an access credentials provider that provides all required data to restore token; captured /// - shouldHaltRequestsTillResolve: indicates whether APIClient should halt all passing requests in case one of them failed with `unathorized` error and restart them @@ -44,43 +44,55 @@ public class RestorationTokenPlugin: PluginType { } public func canResolve(_ error: Error) -> Bool { - if authErrorResolving(error), inProgress == false { + if authErrorResolving(error) { delegate?.reachUnauthorizedError() return true } - return false + return inProgress } public func resolve(_ error: Error, onResolved: @escaping (Bool) -> Void) { - guard authErrorResolving(error) else { - delegate?.failedToRestore() - onResolved(false) - return - } - - guard credentialProvider.exchangeToken != nil && restorationResultProvider != nil else { - credentialProvider.invalidate() - delegate?.failedToRestore() - onResolved(false) - return - } - - inProgress = true - restorationResultProvider? { [weak self] result in - self?.inProgress = false + if inProgress { + queue.append(onResolved) + } else { + guard authErrorResolving(error) else { + delegate?.failedToRestore() + onResolved(false) + queue.forEach { $0(false) } + queue.removeAll() + return + } - guard let value = result.value else { - self?.credentialProvider.invalidate() - self?.delegate?.failedToRestore() + guard credentialProvider.exchangeToken != nil && restorationResultProvider != nil else { + credentialProvider.invalidate() + delegate?.failedToRestore() onResolved(false) + queue.forEach { $0(false) } + queue.removeAll() return } + + inProgress = true + restorationResultProvider? { [weak self] result in + self?.inProgress = false + + guard let value = result.value else { + self?.credentialProvider.invalidate() + self?.delegate?.failedToRestore() + onResolved(false) + self?.queue.forEach { $0(false) } + self?.queue.removeAll() + return + } - self?.credentialProvider.commitCredentialsUpdate { provider in - provider.accessToken = value.accessToken - provider.exchangeToken = value.exchangeToken - self?.delegate?.restored() - onResolved(true) + self?.credentialProvider.commitCredentialsUpdate { provider in + provider.accessToken = value.accessToken + provider.exchangeToken = value.exchangeToken + self?.delegate?.restored() + onResolved(true) + self?.queue.forEach { $0(true) } + self?.queue.removeAll() + } } } }