Created
June 6, 2025 18:39
-
-
Save jstn/7d0123cfc555ccd062dfee15d92b9f64 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
actor HTTPSURLLoader { | |
enum Error: Swift.Error { | |
case unexpectedScheme(String?) | |
case unexpectedResponseType(URLResponse) | |
} | |
private(set) var tasks: [URLRequest: Task<(Data, HTTPURLResponse), any Swift.Error>] = [:] | |
func load(_ request: URLRequest, session: URLSession) async throws -> (Data, HTTPURLResponse) { | |
defer { | |
tasks[request] = nil | |
} | |
if let task = tasks[request] { | |
return try await task.value | |
} | |
let task = Task { | |
guard request.url?.scheme == "https" else { | |
throw Error.unexpectedScheme(request.url?.scheme) | |
} | |
let (data, response) = try await session.data(for: request) | |
guard let httpResponse = response as? HTTPURLResponse else { | |
throw Error.unexpectedResponseType(response) | |
} | |
return (data, httpResponse) | |
} | |
tasks[request] = task | |
return try await task.value | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment