import AuthenticationServices import Combine import Swinject protocol AuthorizationManager { var isAuthorized: Bool { get } var authorizationPublisher: AnyPublisher { get } func authorize(credentials: Credentials) -> AnyPublisher func logout() } final class BaseAuthorizationManager: AuthorizationManager, Injectable { private let isAuthorizedSubject = CurrentValueSubject(false) var authorizationPublisher: AnyPublisher { isAuthorizedSubject.eraseToAnyPublisher() } var isAuthorized: Bool { isAuthorizedSubject.value } let credentials = CurrentValueSubject(nil) private var lifetime = Set() @Injected() private var keychain: Keychain! init(resolver: Resolver) { injectServices(resolver) } func authorize(credentials: Credentials) -> AnyPublisher { isAuthorizedSubject.send(true) self.credentials.send(credentials) return Just(()).eraseToAnyPublisher() } func logout() { keychain.removeObject(forKey: Login.Config.credentialsKey).publisher .sink( receiveCompletion: { _ in self.isAuthorizedSubject.send(false) self.credentials.send(nil) }, receiveValue: {} ) .store(in: &lifetime) } }