Merge pull request 'Update LCEssentials+API.swift' (#8) from fix/api/mainactor-session-hang into main

Reviewed-on: #8
This commit is contained in:
2026-07-07 13:21:09 -03:00

View File

@@ -194,14 +194,31 @@ public struct API {
API.requestLOG(method: method, request: request) API.requestLOG(method: method, request: request)
} }
let session = URLSession( // Only spin up a dedicated session (with its own @MainActor
configuration: .default, // delegate hop for every TLS/auth challenge) when client
delegate: URLSessionDelegateHandler( // certificate auth is actually configured. Creating one of
certData: API.certData, // these per request unconditionally and never invalidating
password: API.certPassword // it could stall the async challenge callback waiting on an
), // already-busy MainActor, hanging the request indefinitely with
delegateQueue: nil // no timeout or error ever surfacing. The common case (no
) // client cert) uses the shared session, which has none of this
// risk and is what URLSession is designed to be reused as.
let usesCertSession = API.certData != nil
let session: URLSession = usesCertSession
? URLSession(
configuration: .default,
delegate: URLSessionDelegateHandler(
certData: API.certData,
password: API.certPassword
),
delegateQueue: nil
)
: URLSession.shared
defer {
if usesCertSession {
session.finishTasksAndInvalidate()
}
}
do { do {
let (data, response) = try await session.data(for: request) let (data, response) = try await session.data(for: request)