@@ -32,28 +32,40 @@ public enum EventType: String, RawRepresentable {
3232
3333// MARK: - Watcher
3434
35- protocol Watcher {
36- func handle( payload: Data )
35+ public protocol Watcher {
36+ typealias ErrorHandler = ( SwiftkubeClientError ) -> Void
37+
38+ func onError( error: SwiftkubeClientError )
39+ func onNext( payload: Data )
3740}
3841
3942// MARK: - ResourceWatch
4043
41- final public class ResourceWatch < Resource: KubernetesAPIResource > : Watcher {
44+ open class ResourceWatch < Resource: KubernetesAPIResource > : Watcher {
4245
4346 public typealias EventHandler = ( EventType , Resource ) -> Void
4447
45- private let decoder = JSONDecoder ( )
46- private let handler : EventHandler
47- private let logger : Logger
48+ private let decoder : JSONDecoder
49+ private let errorHandler : ErrorHandler ?
50+ private let eventHandler : EventHandler
51+
52+ public init (
53+ decoder: JSONDecoder = JSONDecoder ( ) ,
54+ onError errorHandler: ErrorHandler ? = nil ,
55+ onEvent eventHandler: @escaping EventHandler
56+ ) {
57+ self . decoder = decoder
58+ self . errorHandler = errorHandler
59+ self . eventHandler = eventHandler
60+ }
4861
49- init ( logger: Logger ? = nil , _ handler: @escaping EventHandler ) {
50- self . handler = handler
51- self . logger = logger ?? KubernetesClient . loggingDisabled
62+ public func onError( error: SwiftkubeClientError ) {
63+ errorHandler ? ( error)
5264 }
5365
54- internal func handle ( payload: Data ) {
66+ public func onNext ( payload: Data ) {
5567 guard let string = String ( data: payload, encoding: . utf8) else {
56- logger . warning ( " Could not deserialize payload " )
68+ errorHandler ? ( . decodingError ( " Could not deserialize payload " ) )
5769 return
5870 }
5971
@@ -62,45 +74,52 @@ final public class ResourceWatch<Resource: KubernetesAPIResource>: Watcher {
6274 let data = line. data ( using: . utf8) ,
6375 let event = try ? self . decoder. decode ( meta. v1. WatchEvent. self, from: data)
6476 else {
65- self . logger . warning ( " Error decoding meta.v1.WatchEvent payload " )
77+ self . errorHandler ? ( . decodingError ( " Error decoding meta.v1.WatchEvent payload " ) )
6678 return
6779 }
6880
6981 guard let eventType = EventType ( rawValue: event. type) else {
70- self . logger . warning ( " Error parsing EventType " )
82+ self . errorHandler ? ( . decodingError ( " Error parsing EventType " ) )
7183 return
7284 }
7385
7486 guard
7587 let jsonData = try ? JSONSerialization . data ( withJSONObject: event. object) ,
7688 let resource = try ? self . decoder. decode ( Resource . self, from: jsonData)
7789 else {
78- self . logger . warning ( " Error deserializing \( String ( describing: Resource . self) ) " )
90+ self . errorHandler ? ( . decodingError ( " Error deserializing \( String ( describing: Resource . self) ) " ) )
7991 return
8092 }
8193
82- self . handler ( eventType, resource)
94+ self . eventHandler ( eventType, resource)
8395 }
8496 }
8597}
8698
8799// MARK: - LogWatch
88100
89- final public class LogWatch : Watcher {
101+ open class LogWatch : Watcher {
90102
91103 public typealias LineHandler = ( String ) -> Void
92104
93- private let logger : Logger
105+ private let errorHandler : ErrorHandler ?
94106 private let lineHandler : LineHandler
95107
96- public init ( logger: Logger ? = nil , _ lineHandler: @escaping LineHandler = { line in print ( line) } ) {
97- self . logger = logger ?? KubernetesClient . loggingDisabled
108+ public init (
109+ onError errorHandler: ErrorHandler ? = nil ,
110+ onNext lineHandler: @escaping LineHandler
111+ ) {
112+ self . errorHandler = errorHandler
98113 self . lineHandler = lineHandler
99114 }
100115
101- internal func handle( payload: Data ) {
116+ public func onError( error: SwiftkubeClientError ) {
117+ errorHandler ? ( error)
118+ }
119+
120+ public func onNext( payload: Data ) {
102121 guard let string = String ( data: payload, encoding: . utf8) else {
103- logger . warning ( " Could not deserialize payload " )
122+ errorHandler ? ( . decodingError ( " Could not deserialize payload " ) )
104123 return
105124 }
106125
@@ -116,35 +135,30 @@ internal class WatchDelegate: HTTPClientResponseDelegate {
116135
117136 typealias Response = Void
118137
119- private let watch : Watcher
138+ private let watcher : Watcher
120139 private let logger : Logger
121140
122- init ( watch : Watcher , logger: Logger ) {
123- self . watch = watch
141+ init ( watcher : Watcher , logger: Logger ) {
142+ self . watcher = watcher
124143 self . logger = logger
125144 }
126145
127- func didSendRequestHead( task: HTTPClient . Task < Response > , _ head: HTTPRequestHead ) {
128- logger. debug ( " Did send request head: \( head. headers) " )
129- }
130-
131- func didSendRequestPart( task: HTTPClient . Task < Response > , _ part: IOData ) {
132- logger. debug ( " Did send request part: \( part) " )
133- }
134-
135- func didSendRequest( task: HTTPClient . Task < Response > ) {
136- logger. debug ( " Did send request: \( task) " )
137- }
138-
139146 func didReceiveHead( task: HTTPClient . Task < Response > , _ head: HTTPResponseHead ) -> EventLoopFuture < Void > {
140147 logger. debug ( " Did receive response head: \( head. headers) " )
148+ switch head. status. code {
149+ case HTTPResponseStatus . badRequest. code:
150+ watcher. onError ( error: . badRequest( head. status. reasonPhrase) )
151+ default :
152+ watcher. onError ( error: . emptyResponse)
153+ }
154+
141155 return task. eventLoop. makeSucceededFuture ( ( ) )
142156 }
143157
144158 func didReceiveBodyPart( task: HTTPClient . Task < Response > , _ buffer: ByteBuffer ) -> EventLoopFuture < Void > {
145159 logger. debug ( " Did receive body part: \( task) " )
146160 let payload = Data ( buffer: buffer)
147- watch . handle ( payload: payload)
161+ watcher . onNext ( payload: payload)
148162 return task. eventLoop. makeSucceededFuture ( ( ) )
149163 }
150164
@@ -154,6 +168,7 @@ internal class WatchDelegate: HTTPClientResponseDelegate {
154168 }
155169
156170 func didReceiveError( task: HTTPClient . Task < Response > , _ error: Error ) {
157- logger. warning ( " Did receive error: \( error. localizedDescription) " )
171+ logger. debug ( " Did receive error: \( error. localizedDescription) " )
172+ watcher. onError ( error: . clientError( error) )
158173 }
159174}
0 commit comments