Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions Sources/Auth.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ enum Auth {
static let refreshTokenKey = "refreshToken"
}

static func getAccessToken(settings: LoginSetting, completion: @escaping (Result<String, Error>) -> Void) {
static func getAccessToken(settings: LoginSetting, completion: @escaping @MainActor (Result<String, Error>) -> Void) {
KeychainHelper.getToken(key: Constants.accessTokenKey) { token in
if let token = token,
JWTHelper.isValid(token: token) {
Expand Down Expand Up @@ -54,7 +54,7 @@ enum Auth {
}
}

private static func requestLogin(_ settings: LoginSetting, _ completion: @escaping (Result<String, Error>) -> Void) {
private static func requestLogin(_ settings: LoginSetting, _ completion: @escaping @MainActor (Result<String, Error>) -> Void) {
login(settings: settings) { result in
switch result {
case .success(let response):
Expand Down Expand Up @@ -111,7 +111,7 @@ enum Auth {

private static func login(
settings: LoginSetting,
completion: @escaping (Result<AuthCodeResponse, Error>) -> Void)
completion: @escaping @MainActor (Result<AuthCodeResponse, Error>) -> Void)
{
let verifier = getVerifier()!
let challenge = getChallenge(for: verifier)!
Expand Down Expand Up @@ -139,7 +139,9 @@ enum Auth {
url: url,
callbackURLScheme: Constants.redirectUri.scheme!) { url, error in
if let error {
completion(.failure(error))
DispatchQueue.main.async {
completion(.failure(error))
}
return
}

Expand All @@ -151,10 +153,14 @@ enum Auth {
completion(result)
}
} else {
completion(.failure(LoginError.noCode))
DispatchQueue.main.async {
completion(.failure(LoginError.noCode))
}
}
} else {
completion(.failure(LoginError.noUrl))
DispatchQueue.main.async {
completion(.failure(LoginError.noUrl))
}
}
}
session.presentationContextProvider = PresentationContextProvider.shared
Expand All @@ -164,7 +170,7 @@ enum Auth {
private static func exchangeAuthorizationCodeForTokens(
authorizationCode: String,
verifier: String,
completion: @escaping (Result<AuthCodeResponse, Error>) -> Void)
completion: @escaping @MainActor (Result<AuthCodeResponse, Error>) -> Void)
{
let url = URL(string: "oauth/token", relativeTo: Constants.url)!

Expand Down
16 changes: 9 additions & 7 deletions Sources/Network/URLSession+Distribute.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,25 @@ enum RequestError: Error {
}

extension URLSession {
func checkForUpdate(_ request: URLRequest, completion: @escaping (Result<DistributionUpdateCheckResponse, Error>) -> Void) {
func checkForUpdate(_ request: URLRequest, completion: @escaping @MainActor (Result<DistributionUpdateCheckResponse, Error>) -> Void) {
self.perform(request, decode: DistributionUpdateCheckResponse.self, useCamelCase: true, completion: completion) { [weak self] data, statusCode in
return self?.getErrorFrom(data: data, statusCode: statusCode) ?? RequestError.badRequest("")
}
}

func getAuthDataWith(_ request: URLRequest, completion: @escaping (Result<AuthCodeResponse, Error>) -> Void) {
func getAuthDataWith(_ request: URLRequest, completion: @escaping @MainActor (Result<AuthCodeResponse, Error>) -> Void) {
self.perform(request, decode: AuthCodeResponse.self, useCamelCase: false, completion: completion) { _, _ in
return RequestError.badRequest("")
}
}

func refreshAccessToken(_ request: URLRequest, completion: @escaping (Result<AuthRefreshResponse, Error>) -> Void) {
func refreshAccessToken(_ request: URLRequest, completion: @escaping @MainActor (Result<AuthRefreshResponse, Error>) -> Void) {
self.perform(request, decode: AuthRefreshResponse.self, useCamelCase: false, completion: completion) { _, _ in
return RequestError.badRequest("")
}
}

func getReleaseInfo(_ request: URLRequest, completion: @escaping (Result<DistributionReleaseInfo, Error>) -> Void) {
func getReleaseInfo(_ request: URLRequest, completion: @escaping @MainActor (Result<DistributionReleaseInfo, Error>) -> Void) {
self.perform(request, decode: DistributionReleaseInfo.self, useCamelCase: true, completion: completion) { [weak self] data, statusCode in
return self?.getErrorFrom(data: data, statusCode: statusCode) ?? RequestError.badRequest("")
}
Expand All @@ -42,20 +42,22 @@ extension URLSession {
private func perform<T: Decodable>(_ request: URLRequest,
decode decodable: T.Type,
useCamelCase: Bool = true,
completion: @escaping (Result<T, Error>) -> Void,
completion: @escaping @MainActor (Result<T, Error>) -> Void,
decodeErrorData: ((Data, Int) -> Error)?) {
URLSession.shared.dataTask(with: request) { (data, response, error) in
var result: Result<T, Error> = .failure(RequestError.unknownError)
defer {
completion(result)
DispatchQueue.main.async {
completion(result)
}
}
if let error = error {
result = .failure(error)
return
}
guard let httpResponse = response as? HTTPURLResponse,
let data = data else {
completion(.failure(RequestError.invalidData))
result = .failure(RequestError.invalidData)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This fixes a bug where the completion handler was being called twice

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch

return
}
guard (200...299).contains(httpResponse.statusCode) else {
Expand Down