Skip to content

Commit d260435

Browse files
Merge pull request #24 from AppcentMobile/feature/reconfigure
Feature/reconfigure
2 parents 3cd9ca6 + e2a5a8f commit d260435

File tree

5 files changed

+76
-26
lines changed

5 files changed

+76
-26
lines changed

Sources/ACMNetworking/ACMNetworking.swift

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,36 @@ import Foundation
66

77
/// ACMNetworking, make requests easily
88
public class ACMNetworking: NSObject {
9-
var mainEndpoint: ACMBaseEndpoint?
10-
var session: URLSession?
11-
var requestTask: URLSessionDataTask?
12-
var downloadTask: URLSessionDownloadTask?
13-
var taskProgress: NSKeyValueObservation?
9+
var endpoint: ACMEndpoint?
10+
11+
public func getBaseEndpoint() -> ACMBaseEndpoint? {
12+
getEndpoint().build()
13+
}
1414

15-
/// Predefined variables
16-
var logger: ACMBaseLogger? {
17-
mainEndpoint?.logger
15+
public func getEndpoint() -> ACMEndpoint {
16+
endpoint ?? ACMEndpoint()
1817
}
1918

20-
public var stringUtils: ACMStringUtils? {
21-
mainEndpoint?.stringUtils
19+
public func getPlistUtils() -> ACMPlistUtils {
20+
getBaseEndpoint()?.plistUtils ?? ACMPlistUtils()
2221
}
2322

24-
public var plistUtils: ACMPlistUtils? {
25-
mainEndpoint?.plistUtils
23+
public func getStrUtils() -> ACMStringUtils {
24+
getBaseEndpoint()?.stringUtils ?? ACMStringUtils()
2625
}
2726

27+
var session: URLSession?
28+
var requestTask: URLSessionDataTask?
29+
var downloadTask: URLSessionDownloadTask?
30+
var taskProgress: NSKeyValueObservation?
31+
32+
var onPartial: ACMGenericCallbacks.StreamCallback?
33+
2834
/// Public Init function
2935
/// For creating object with SDK
3036
override public init() {
3137
super.init()
38+
endpoint = ACMEndpoint()
3239
}
3340

3441
/// Cancels the current network request
@@ -39,7 +46,7 @@ public class ACMNetworking: NSObject {
3946
session = nil
4047
taskProgress?.invalidate()
4148
taskProgress = nil
42-
mainEndpoint = nil
49+
endpoint = nil
4350
}
4451

4552
private func cancelRequestTask() {

Sources/ACMNetworking/Library/Callbacks/ACMGenericCallbacks.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// ACMGenericCallbacks.swift
33
//
44

5+
import Foundation
6+
57
/// ACMGenericCallbacks
68
///
79
/// Enumaration for holding the callbacks
@@ -13,9 +15,12 @@ public enum ACMGenericCallbacks {
1315
/// Info callback with success check and error for generic closures
1416
public typealias InfoCallback = ((Bool?, Error?) -> Void)?
1517
/// Success callback with generic response for closures
16-
public typealias ResponseCallback<T> = ((T) -> Void)?
18+
public typealias ResponseCallback<Codable> = ((Codable) -> Void)?
1719
/// Success callback with generic response for closures
1820
public typealias DownloadCallback = ((ACMDownloadModel) -> Void)?
1921
/// Progress callback with generic response for closures
2022
public typealias ProgressCallback = ((ACMProgressModel) -> Void)?
23+
/// Success callback with generic response for closures
24+
public typealias StreamCallback = ((Data) -> Void)
25+
2126
}

Sources/ACMNetworking/Library/Extensions/ACMNetworking+Extensions.swift

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,38 @@ extension ACMNetworking {
7272
}
7373
}
7474

75-
extension ACMNetworking: URLSessionTaskDelegate {
75+
extension ACMNetworking: URLSessionTaskDelegate, URLSessionDelegate, URLSessionDataDelegate {
76+
/// URL Session data task for stream requests
77+
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
78+
let dataString = String(data: data, encoding: .utf8) ?? ""
79+
if !dataString.contains("[DONE]") {
80+
let response = dataString.components(separatedBy: "\n")
81+
.filter{ !$0.replacingOccurrences(of: " ", with: "").isEmpty }
82+
.map { $0.replacingOccurrences(of: "data:", with: "")
83+
.replacingOccurrences(of: " ", with: "")
84+
}
85+
for item in response {
86+
if let data = item.toData {
87+
onPartial?(data)
88+
}
89+
}
90+
}
91+
}
92+
7693
/// URL Session didFinishCollecting
7794
///
7895
/// - Parameters:
7996
/// - session: URL Session
8097
/// - task: URL session task
8198
/// - didFinishCollecting: Metrics that gathered
8299
public func urlSession(_: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {
83-
let message = mainEndpoint?.stringUtils?.merge(list: [
100+
let message = getBaseEndpoint()?.stringUtils?.merge(list: [
84101
"didFinishCollecting",
85102
task.description,
86103
"metrics",
87104
"\(metrics.taskInterval)",
88105
])
89-
logger?.info(message)
106+
getBaseEndpoint()?.logger?.info(message)
90107
}
91108

92109
/// URL Session taskIsWaitingForConnectivity
@@ -95,11 +112,11 @@ extension ACMNetworking: URLSessionTaskDelegate {
95112
/// - session: URL Session
96113
/// - task: URL session task
97114
public func urlSession(_: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {
98-
let message = mainEndpoint?.stringUtils?.merge(list: [
115+
let message = getBaseEndpoint()?.stringUtils?.merge(list: [
99116
"taskIsWaitingForConnectivity",
100117
task.description,
101118
])
102-
logger?.info(message)
119+
getBaseEndpoint()?.logger?.info(message)
103120
}
104121

105122
/// URL Session didSendBodyData
@@ -111,7 +128,7 @@ extension ACMNetworking: URLSessionTaskDelegate {
111128
/// - totalBytesSent
112129
/// - totalBytesExpectedToSend
113130
public func urlSession(_: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
114-
let message = mainEndpoint?.stringUtils?.merge(list: [
131+
let message = getBaseEndpoint()?.stringUtils?.merge(list: [
115132
"task",
116133
task.description,
117134
"didSendBodyData",
@@ -121,6 +138,6 @@ extension ACMNetworking: URLSessionTaskDelegate {
121138
"totalBytesExpectedToSend",
122139
"\(totalBytesExpectedToSend)",
123140
])
124-
logger?.info(message)
141+
getBaseEndpoint()?.logger?.info(message)
125142
}
126143
}

Sources/ACMNetworking/Library/MainCalls/ACMNetworking+Request.swift

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,25 @@
88
import Foundation
99

1010
public extension ACMNetworking {
11+
func stream(to endpoint: ACMBaseEndpoint,
12+
currentRetryCount: Int? = 0,
13+
onPartial: @escaping ACMGenericCallbacks.StreamCallback,
14+
onProgress: ACMGenericCallbacks.ProgressCallback = nil,
15+
onError: ACMGenericCallbacks.ErrorCallback = nil) {
16+
self.onPartial = onPartial
17+
18+
session = endpoint.session(delegate: self)
19+
guard let urlRequest = generateURLRequest(endpoint: endpoint) else { return }
20+
requestTask = session?.dataTask(with: urlRequest)
21+
22+
taskProgress = requestTask?.progress.observe(\.fractionCompleted, changeHandler: { progress, _ in
23+
let model = ACMProgressModel(progress: progress.fractionCompleted)
24+
onProgress?(model)
25+
})
26+
27+
requestTask?.resume()
28+
}
29+
1130
/// Main request function
1231
///
1332
/// - Parameters:
@@ -21,14 +40,12 @@ public extension ACMNetworking {
2140
func request<T: Decodable>(to endpoint: ACMBaseEndpoint,
2241
currentRetryCount: Int? = 0,
2342
onSuccess: ACMGenericCallbacks.ResponseCallback<T>,
43+
onPartial: ACMGenericCallbacks.ResponseCallback<T> = nil,
2444
onProgress: ACMGenericCallbacks.ProgressCallback = nil,
25-
onError: ACMGenericCallbacks.ErrorCallback = nil)
26-
{
45+
onError: ACMGenericCallbacks.ErrorCallback = nil) {
2746
guard let urlRequest = generateURLRequest(endpoint: endpoint) else { return }
2847

29-
mainEndpoint = endpoint
30-
31-
session = mainEndpoint?.session(delegate: self)
48+
session = endpoint.session(delegate: self)
3249

3350
requestTask = session?.dataTask(with: urlRequest) { [weak self] data, response, error in
3451
guard let self else { return }

Sources/ACMNetworking/Library/Manager/ACMBaseEndpoint.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ public struct ACMBaseEndpoint {
2020

2121
var stringUtils: ACMStringUtils?
2222

23+
// MARK: Enc utils
24+
25+
var encUtils: ACMEncryptionUtils?
26+
2327
// MARK: Config
2428

2529
var config: ACMPlistModel?

0 commit comments

Comments
 (0)