Skip to content
Open
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
13 changes: 9 additions & 4 deletions Sources/EventSource/EventSource.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,13 @@ public struct EventSource: Sendable {
self.timeoutIntervalForResource = timeoutIntervalForResource
}

public func dataTask(for urlRequest: URLRequest) -> DataTask {
public func dataTask(for urlRequest: URLRequest, urlSessionDelegate: URLSessionDelegate? = nil) -> DataTask {
DataTask(
urlRequest: urlRequest,
eventParser: eventParser(),
timeoutIntervalForRequest: timeoutIntervalForRequest,
timeoutIntervalForResource: timeoutIntervalForResource
timeoutIntervalForResource: timeoutIntervalForResource,
urlSessionDelegate: urlSessionDelegate
)
}
}
Expand Down Expand Up @@ -116,6 +117,8 @@ public extension EventSource {

/// A URLRequest of the events source.
public let urlRequest: URLRequest

public let urlSessionDelegate: URLSessionDelegate?

private let _eventParser: Mutex<EventParser>

Expand Down Expand Up @@ -170,12 +173,14 @@ public extension EventSource {
urlRequest: URLRequest,
eventParser: EventParser,
timeoutIntervalForRequest: TimeInterval,
timeoutIntervalForResource: TimeInterval
timeoutIntervalForResource: TimeInterval,
urlSessionDelegate: URLSessionDelegate?
) {
self.urlRequest = urlRequest
self._eventParser = Mutex(eventParser)
self.timeoutIntervalForRequest = timeoutIntervalForRequest
self.timeoutIntervalForResource = timeoutIntervalForResource
self.urlSessionDelegate = urlSessionDelegate
}

/// Creates and returns event stream.
Expand All @@ -188,7 +193,7 @@ public extension EventSource {
}

return AsyncStream { continuation in
let sessionDelegate = SessionDelegate()
let sessionDelegate = SessionDelegate(urlSessionDelegate: urlSessionDelegate)
let urlSession = URLSession(
configuration: urlSessionConfiguration,
delegate: sessionDelegate,
Expand Down
13 changes: 13 additions & 0 deletions Sources/EventSource/SessionDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,14 @@ final class SessionDelegate: NSObject, URLSessionDataDelegate {
}

private let internalStream = AsyncStream<Event>.makeStream()

private let urlSessionDelegate: URLSessionDelegate?

var eventStream: AsyncStream<Event> { internalStream.stream }

init(urlSessionDelegate: URLSessionDelegate?) {
self.urlSessionDelegate = urlSessionDelegate
}

func urlSession(
_ session: URLSession,
Expand All @@ -47,3 +53,10 @@ final class SessionDelegate: NSObject, URLSessionDataDelegate {
internalStream.continuation.yield(.didReceiveData(data))
}
}

extension SessionDelegate: URLSessionDelegate {

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @Sendable @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
urlSessionDelegate?.urlSession?(session, didReceive: challenge, completionHandler: completionHandler)
}
}
Loading