@@ -4,6 +4,12 @@ import Foundation
4
4
import FoundationNetworking
5
5
#endif
6
6
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
+
7
13
/**
8
14
Provides an EventSource client for consuming Server-Sent Events.
9
15
@@ -51,12 +57,18 @@ public class EventSource {
51
57
public var method : String = " GET "
52
58
/// Optional HTTP body to be included in the API request.
53
59
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 = " "
56
60
/// Additional HTTP headers to be set on the request
57
61
public var headers : [ String : String ] = [ : ]
58
62
/// Transform function to allow dynamically configuring the headers on each API request.
59
63
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
+
60
72
/// The minimum amount of time to wait before reconnecting after a failure
61
73
public var reconnectTime : TimeInterval = 1.0
62
74
/// The maximum amount of time to wait before reconnecting after a failure
@@ -152,8 +164,9 @@ class ReconnectionTimer {
152
164
// MARK: EventSourceDelegate
153
165
class EventSourceDelegate : NSObject , URLSessionDataDelegate {
154
166
private let delegateQueue : DispatchQueue = DispatchQueue ( label: " ESDelegateQueue " )
155
- private let logger = Logs ( )
156
-
167
+
168
+ public var logger : InternalLogging
169
+
157
170
private let config : EventSource . Config
158
171
159
172
private var readyState : ReadyState = . raw {
@@ -170,6 +183,14 @@ class EventSourceDelegate: NSObject, URLSessionDataDelegate {
170
183
171
184
init ( config: EventSource . Config ) {
172
185
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
+
173
194
self . eventParser = EventParser ( handler: config. handler,
174
195
initialEventId: config. lastEventId,
175
196
initialRetry: config. reconnectTime)
@@ -277,7 +298,8 @@ class EventSourceDelegate: NSObject, URLSessionDataDelegate {
277
298
278
299
readyState = . closed
279
300
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) )
281
303
delegateQueue. asyncAfter ( deadline: . now( ) + sleep) { [ weak self] in
282
304
self ? . connect ( )
283
305
}
@@ -305,7 +327,8 @@ class EventSourceDelegate: NSObject, URLSessionDataDelegate {
305
327
config. handler. onOpened ( )
306
328
completionHandler ( . allow)
307
329
} 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) )
309
332
if dispatchError ( error: UnsuccessfulResponseError ( responseCode: statusCode) ) == . shutdown {
310
333
logger. log ( . info, " Connection has been explicitly shut down by error handler " )
311
334
readyState = . shutdown
0 commit comments