@@ -4,6 +4,12 @@ import Foundation
44import FoundationNetworking
55#endif
66
7+ #if canImport(os)
8+ // os_log is not supported on some platforms, but we want to use it for most of our customer's
9+ // use cases that use Apple OSs
10+ import os. log
11+ #endif
12+
713/**
814 Provides an EventSource client for consuming Server-Sent Events.
915
@@ -51,12 +57,18 @@ public class EventSource {
5157 public var method : String = " GET "
5258 /// Optional HTTP body to be included in the API request.
5359 public var body : Data ?
54- /// An initial value for the last-event-id header to be sent on the initial request
55- public var lastEventId : String = " "
5660 /// Additional HTTP headers to be set on the request
5761 public var headers : [ String : String ] = [ : ]
5862 /// Transform function to allow dynamically configuring the headers on each API request.
5963 public var headerTransform : HeaderTransform = { $0 }
64+ /// An initial value for the last-event-id header to be sent on the initial request
65+ public var lastEventId : String = " "
66+
67+ #if canImport(os)
68+ /// Configure the logger that will be used.
69+ public var logger : OSLog = OSLog ( subsystem: " com.launchdarkly.swift-eventsource " , category: " LDEventSource " )
70+ #endif
71+
6072 /// The minimum amount of time to wait before reconnecting after a failure
6173 public var reconnectTime : TimeInterval = 1.0
6274 /// The maximum amount of time to wait before reconnecting after a failure
@@ -152,8 +164,9 @@ class ReconnectionTimer {
152164// MARK: EventSourceDelegate
153165class EventSourceDelegate : NSObject , URLSessionDataDelegate {
154166 private let delegateQueue : DispatchQueue = DispatchQueue ( label: " ESDelegateQueue " )
155- private let logger = Logs ( )
156-
167+
168+ public var logger : InternalLogging
169+
157170 private let config : EventSource . Config
158171
159172 private var readyState : ReadyState = . raw {
@@ -170,6 +183,14 @@ class EventSourceDelegate: NSObject, URLSessionDataDelegate {
170183
171184 init ( config: EventSource . Config ) {
172185 self . config = config
186+
187+ #if canImport(os)
188+ self . logger = OSLogAdapter ( osLog: config. logger)
189+ #else
190+ self . logger = NoOpLogging ( )
191+ #endif
192+
193+
173194 self . eventParser = EventParser ( handler: config. handler,
174195 initialEventId: config. lastEventId,
175196 initialRetry: config. reconnectTime)
@@ -277,7 +298,8 @@ class EventSourceDelegate: NSObject, URLSessionDataDelegate {
277298
278299 readyState = . closed
279300 let sleep = reconnectionTimer. reconnectDelay ( baseDelay: currentRetry)
280- logger. log ( . info, " Waiting %.3f seconds before reconnecting... " , sleep)
301+ // this formatting shenanigans is to workaround String not implementing CVarArg on Swift<5.4 on Linux
302+ logger. log ( . info, " Waiting %@ seconds before reconnecting... " , String ( format: " %.3f " , sleep) )
281303 delegateQueue. asyncAfter ( deadline: . now( ) + sleep) { [ weak self] in
282304 self ? . connect ( )
283305 }
@@ -305,7 +327,8 @@ class EventSourceDelegate: NSObject, URLSessionDataDelegate {
305327 config. handler. onOpened ( )
306328 completionHandler ( . allow)
307329 } else {
308- logger. log ( . info, " Unsuccessful response: %d " , statusCode)
330+ // this formatting shenanigans is to workaround String not implementing CVarArg on Swift<5.4 on Linux
331+ logger. log ( . info, " Unsuccessful response: %@ " , String ( format: " %d " , statusCode) )
309332 if dispatchError ( error: UnsuccessfulResponseError ( responseCode: statusCode) ) == . shutdown {
310333 logger. log ( . info, " Connection has been explicitly shut down by error handler " )
311334 readyState = . shutdown
0 commit comments