-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSTEventMonitor.swift
More file actions
119 lines (98 loc) · 6.23 KB
/
STEventMonitor.swift
File metadata and controls
119 lines (98 loc) · 6.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//
// STEventMonitor.swift
// STBaseProject
//
// Created by 寒江孤影 on 2018/12/10.
//
import Foundation
public protocol STEventMonitor: AnyObject {
var queue: DispatchQueue { get }
func requestDidResume(_ request: STRequest)
func requestDidSuspend(_ request: STRequest)
func requestDidCancel(_ request: STRequest)
func requestDidFinish(_ request: STRequest)
func requestDidTransition(_ request: STRequest, from: STRequestState, to: STRequestState)
func request(_ request: STRequest, didCreateURLRequest urlRequest: URLRequest)
func request(_ request: STRequest, didAdaptURLRequest initial: URLRequest, to adapted: URLRequest)
func request(_ request: STRequest, didReceiveHTTPResponse response: HTTPURLResponse)
func request(_ request: STDataRequest, didReceiveData data: Data)
func request(_ request: STUploadRequest, didSendBytes bytesSent: Int64, totalBytesSent: Int64, totalBytesExpected: Int64)
func request(_ request: STDownloadRequest, didWriteData bytesWritten: Int64, totalWritten: Int64, totalExpected: Int64)
}
public extension STEventMonitor {
var queue: DispatchQueue { .main }
func requestDidResume(_ request: STRequest) {}
func requestDidSuspend(_ request: STRequest) {}
func requestDidCancel(_ request: STRequest) {}
func requestDidFinish(_ request: STRequest) {}
func requestDidTransition(_ request: STRequest, from: STRequestState, to: STRequestState) {}
func request(_ request: STRequest, didCreateURLRequest urlRequest: URLRequest) {}
func request(_ request: STRequest, didAdaptURLRequest initial: URLRequest, to adapted: URLRequest) {}
func request(_ request: STRequest, didReceiveHTTPResponse response: HTTPURLResponse) {}
func request(_ request: STDataRequest, didReceiveData data: Data) {}
func request(_ request: STUploadRequest, didSendBytes bytesSent: Int64, totalBytesSent: Int64, totalBytesExpected: Int64) {}
func request(_ request: STDownloadRequest, didWriteData bytesWritten: Int64, totalWritten: Int64, totalExpected: Int64) {}
}
// MARK: - Composite Monitor
public final class STCompositeEventMonitor: STEventMonitor {
private let monitors: [STEventMonitor]
public init(monitors: [STEventMonitor]) {
self.monitors = monitors
}
private func notify(_ block: @escaping (STEventMonitor) -> Void) {
for monitor in self.monitors {
monitor.queue.async { block(monitor) }
}
}
public func requestDidResume(_ request: STRequest) { self.notify { $0.requestDidResume(request) } }
public func requestDidSuspend(_ request: STRequest) { self.notify { $0.requestDidSuspend(request) } }
public func requestDidCancel(_ request: STRequest) { self.notify { $0.requestDidCancel(request) } }
public func requestDidFinish(_ request: STRequest) { self.notify { $0.requestDidFinish(request) } }
public func requestDidTransition(_ request: STRequest, from: STRequestState, to: STRequestState) { self.notify { $0.requestDidTransition(request, from: from, to: to) } }
public func request(_ request: STRequest, didCreateURLRequest urlRequest: URLRequest) { self.notify { $0.request(request, didCreateURLRequest: urlRequest) } }
public func request(_ request: STRequest, didAdaptURLRequest initial: URLRequest, to adapted: URLRequest) { self.notify { $0.request(request, didAdaptURLRequest: initial, to: adapted) } }
public func request(_ request: STRequest, didReceiveHTTPResponse response: HTTPURLResponse) { self.notify { $0.request(request, didReceiveHTTPResponse: response) } }
public func request(_ request: STDataRequest, didReceiveData data: Data) { self.notify { $0.request(request, didReceiveData: data) } }
public func request(_ request: STUploadRequest, didSendBytes bytesSent: Int64, totalBytesSent: Int64, totalBytesExpected: Int64) { self.notify { $0.request(request, didSendBytes: bytesSent, totalBytesSent: totalBytesSent, totalBytesExpected: totalBytesExpected) } }
public func request(_ request: STDownloadRequest, didWriteData bytesWritten: Int64, totalWritten: Int64, totalExpected: Int64) { self.notify { $0.request(request, didWriteData: bytesWritten, totalWritten: totalWritten, totalExpected: totalExpected) } }
}
// MARK: - Console Logger
public final class STConsoleEventMonitor: STEventMonitor {
public static let `default` = STConsoleEventMonitor()
public func request(_ request: STRequest, didCreateURLRequest urlRequest: URLRequest) {
let method = urlRequest.httpMethod ?? "??"
let url = urlRequest.url?.absoluteString ?? ""
STLog("[\(method)] --> \(url)", level: .debug)
if let body = urlRequest.httpBody,
let bodyStr = String(data: body, encoding: .utf8) {
STLog(" Body: \(bodyStr.prefix(500))", level: .debug)
}
}
public func request(_ request: STRequest, didAdaptURLRequest initial: URLRequest, to adapted: URLRequest) {
if initial.allHTTPHeaderFields != adapted.allHTTPHeaderFields {
STLog("[ADAPT] Headers updated", level: .debug)
}
}
public func request(_ request: STRequest, didReceiveHTTPResponse response: HTTPURLResponse) {
let emoji = response.statusCode < 400 ? "✓" : "✗"
let url = response.url?.absoluteString ?? ""
let level: STLogLevel = response.statusCode < 400 ? .info : .warning
STLog("[\(emoji) \(response.statusCode)] <-- \(url)", level: level)
}
public func requestDidCancel(_ request: STRequest) {
STLog("[CANCEL] \(request.urlRequest?.url?.absoluteString ?? "")", level: .warning)
}
public func requestDidFinish(_ request: STRequest) {
STLog("[DONE]", level: .debug)
}
public func request(_ request: STUploadRequest, didSendBytes bytesSent: Int64, totalBytesSent: Int64, totalBytesExpected: Int64) {
guard totalBytesExpected > 0 else { return }
let pct = Int(Double(totalBytesSent) / Double(totalBytesExpected) * 100)
STLog("[UPLOAD] \(pct)%", level: .debug)
}
public func request(_ request: STDownloadRequest, didWriteData bytesWritten: Int64, totalWritten: Int64, totalExpected: Int64) {
guard totalExpected > 0 else { return }
let pct = Int(Double(totalWritten) / Double(totalExpected) * 100)
STLog("[DOWNLOAD] \(pct)%", level: .debug)
}
}