         mainQueue.async { [weak self] in self?.onOpenCallback?() }
     }
 
-    public func urlSession(_ session: URLSession,
-                           task: URLSessionTask,
-                           didCompleteWithError error: Error?) {
+    open func urlSession(_ session: URLSession,
+                         task: URLSessionTask,
+                         didCompleteWithError error: Error?) {
 
         guard let responseStatusCode = (task.response as? HTTPURLResponse)?.statusCode else {
             mainQueue.async { [weak self] in self?.onComplete?(nil, nil, error as NSError?) }

        mainQueue.async { [weak self] in self?.onComplete?(responseStatusCode, reconnect, nil) }
    }

    public func urlSession(_ session: URLSession,
                           task: URLSessionTask,
                           willPerformHTTPRedirection response: HTTPURLResponse,
                           newRequest request: URLRequest,
                           completionHandler: @escaping (URLRequest?) -> Void) {

        var newRequest = request
        self.headers.forEach { newRequest.setValue($1, forHTTPHeaderField: $0) }

    func removeEventListener(_ event: String)
}

open class EventSource: NSObject, EventSourceProtocol, URLSessionDataDelegate {
    static let DefaultRetryTime = 3000

    public let url: URL
