Skip to content

Commit

Permalink
Merge pull request #24 from AppcentMobile/feature/reconfigure
Browse files Browse the repository at this point in the history
Feature/reconfigure
  • Loading branch information
burakcolakappcent authored Jan 25, 2024
2 parents 3cd9ca6 + e2a5a8f commit d260435
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 26 deletions.
33 changes: 20 additions & 13 deletions Sources/ACMNetworking/ACMNetworking.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,36 @@ import Foundation

/// ACMNetworking, make requests easily
public class ACMNetworking: NSObject {
var mainEndpoint: ACMBaseEndpoint?
var session: URLSession?
var requestTask: URLSessionDataTask?
var downloadTask: URLSessionDownloadTask?
var taskProgress: NSKeyValueObservation?
var endpoint: ACMEndpoint?

public func getBaseEndpoint() -> ACMBaseEndpoint? {
getEndpoint().build()
}

/// Predefined variables
var logger: ACMBaseLogger? {
mainEndpoint?.logger
public func getEndpoint() -> ACMEndpoint {
endpoint ?? ACMEndpoint()
}

public var stringUtils: ACMStringUtils? {
mainEndpoint?.stringUtils
public func getPlistUtils() -> ACMPlistUtils {
getBaseEndpoint()?.plistUtils ?? ACMPlistUtils()
}

public var plistUtils: ACMPlistUtils? {
mainEndpoint?.plistUtils
public func getStrUtils() -> ACMStringUtils {
getBaseEndpoint()?.stringUtils ?? ACMStringUtils()
}

var session: URLSession?
var requestTask: URLSessionDataTask?
var downloadTask: URLSessionDownloadTask?
var taskProgress: NSKeyValueObservation?

var onPartial: ACMGenericCallbacks.StreamCallback?

/// Public Init function
/// For creating object with SDK
override public init() {
super.init()
endpoint = ACMEndpoint()
}

/// Cancels the current network request
Expand All @@ -39,7 +46,7 @@ public class ACMNetworking: NSObject {
session = nil
taskProgress?.invalidate()
taskProgress = nil
mainEndpoint = nil
endpoint = nil
}

private func cancelRequestTask() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// ACMGenericCallbacks.swift
//

import Foundation

/// ACMGenericCallbacks
///
/// Enumaration for holding the callbacks
Expand All @@ -13,9 +15,12 @@ public enum ACMGenericCallbacks {
/// Info callback with success check and error for generic closures
public typealias InfoCallback = ((Bool?, Error?) -> Void)?
/// Success callback with generic response for closures
public typealias ResponseCallback<T> = ((T) -> Void)?
public typealias ResponseCallback<Codable> = ((Codable) -> Void)?
/// Success callback with generic response for closures
public typealias DownloadCallback = ((ACMDownloadModel) -> Void)?
/// Progress callback with generic response for closures
public typealias ProgressCallback = ((ACMProgressModel) -> Void)?
/// Success callback with generic response for closures
public typealias StreamCallback = ((Data) -> Void)

}
Original file line number Diff line number Diff line change
Expand Up @@ -72,21 +72,38 @@ extension ACMNetworking {
}
}

extension ACMNetworking: URLSessionTaskDelegate {
extension ACMNetworking: URLSessionTaskDelegate, URLSessionDelegate, URLSessionDataDelegate {
/// URL Session data task for stream requests
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
let dataString = String(data: data, encoding: .utf8) ?? ""
if !dataString.contains("[DONE]") {
let response = dataString.components(separatedBy: "\n")
.filter{ !$0.replacingOccurrences(of: " ", with: "").isEmpty }
.map { $0.replacingOccurrences(of: "data:", with: "")
.replacingOccurrences(of: " ", with: "")
}
for item in response {
if let data = item.toData {
onPartial?(data)
}
}
}
}

/// URL Session didFinishCollecting
///
/// - Parameters:
/// - session: URL Session
/// - task: URL session task
/// - didFinishCollecting: Metrics that gathered
public func urlSession(_: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {
let message = mainEndpoint?.stringUtils?.merge(list: [
let message = getBaseEndpoint()?.stringUtils?.merge(list: [
"didFinishCollecting",
task.description,
"metrics",
"\(metrics.taskInterval)",
])
logger?.info(message)
getBaseEndpoint()?.logger?.info(message)
}

/// URL Session taskIsWaitingForConnectivity
Expand All @@ -95,11 +112,11 @@ extension ACMNetworking: URLSessionTaskDelegate {
/// - session: URL Session
/// - task: URL session task
public func urlSession(_: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {
let message = mainEndpoint?.stringUtils?.merge(list: [
let message = getBaseEndpoint()?.stringUtils?.merge(list: [
"taskIsWaitingForConnectivity",
task.description,
])
logger?.info(message)
getBaseEndpoint()?.logger?.info(message)
}

/// URL Session didSendBodyData
Expand All @@ -111,7 +128,7 @@ extension ACMNetworking: URLSessionTaskDelegate {
/// - totalBytesSent
/// - totalBytesExpectedToSend
public func urlSession(_: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
let message = mainEndpoint?.stringUtils?.merge(list: [
let message = getBaseEndpoint()?.stringUtils?.merge(list: [
"task",
task.description,
"didSendBodyData",
Expand All @@ -121,6 +138,6 @@ extension ACMNetworking: URLSessionTaskDelegate {
"totalBytesExpectedToSend",
"\(totalBytesExpectedToSend)",
])
logger?.info(message)
getBaseEndpoint()?.logger?.info(message)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,25 @@
import Foundation

public extension ACMNetworking {
func stream(to endpoint: ACMBaseEndpoint,
currentRetryCount: Int? = 0,
onPartial: @escaping ACMGenericCallbacks.StreamCallback,
onProgress: ACMGenericCallbacks.ProgressCallback = nil,
onError: ACMGenericCallbacks.ErrorCallback = nil) {
self.onPartial = onPartial

session = endpoint.session(delegate: self)
guard let urlRequest = generateURLRequest(endpoint: endpoint) else { return }
requestTask = session?.dataTask(with: urlRequest)

taskProgress = requestTask?.progress.observe(\.fractionCompleted, changeHandler: { progress, _ in
let model = ACMProgressModel(progress: progress.fractionCompleted)
onProgress?(model)
})

requestTask?.resume()
}

/// Main request function
///
/// - Parameters:
Expand All @@ -21,14 +40,12 @@ public extension ACMNetworking {
func request<T: Decodable>(to endpoint: ACMBaseEndpoint,
currentRetryCount: Int? = 0,
onSuccess: ACMGenericCallbacks.ResponseCallback<T>,
onPartial: ACMGenericCallbacks.ResponseCallback<T> = nil,
onProgress: ACMGenericCallbacks.ProgressCallback = nil,
onError: ACMGenericCallbacks.ErrorCallback = nil)
{
onError: ACMGenericCallbacks.ErrorCallback = nil) {
guard let urlRequest = generateURLRequest(endpoint: endpoint) else { return }

mainEndpoint = endpoint

session = mainEndpoint?.session(delegate: self)
session = endpoint.session(delegate: self)

requestTask = session?.dataTask(with: urlRequest) { [weak self] data, response, error in
guard let self else { return }
Expand Down
4 changes: 4 additions & 0 deletions Sources/ACMNetworking/Library/Manager/ACMBaseEndpoint.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ public struct ACMBaseEndpoint {

var stringUtils: ACMStringUtils?

// MARK: Enc utils

var encUtils: ACMEncryptionUtils?

// MARK: Config

var config: ACMPlistModel?
Expand Down

0 comments on commit d260435

Please sign in to comment.