Skip to content

Commit 44f69e9

Browse files
author
Fernando Fernandes
committed
Add a retry mechanism
1 parent e7f5225 commit 44f69e9

File tree

6 files changed

+42
-24
lines changed

6 files changed

+42
-24
lines changed

Sources/SwiftTrader/Model/Kucoin/KucoinFuturesAccountOverviewResponse.swift renamed to Sources/SwiftTrader/Model/Kucoin/KucoinFuturesAccountOverview.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// KucoinFuturesAccountOverviewResponse.swift
2+
// KucoinFuturesAccountOverview.swift
33
//
44
//
55
// Created by Fernando Fernandes on 27.01.22.
@@ -10,7 +10,7 @@ import Foundation
1010
/// Kucoin "Get Account Overview" REST API response.
1111
///
1212
/// https://docs.kucoin.com/futures/#account
13-
public struct KucoinFuturesAccountOverviewResponse: Codable {
13+
public struct KucoinFuturesAccountOverview: Codable {
1414
public let code: String
1515
public let data: KucoinFuturesAccountData
1616
}

Sources/SwiftTrader/Network/Kucoin/AccountOverview/KucoinAccountOverviewRequest.swift renamed to Sources/SwiftTrader/Network/Kucoin/AccountOverview/KucoinFuturesAccountOverviewRequest.swift

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// KucoinAccountOverviewRequest.swift
2+
// KucoinFuturesAccountOverviewRequest.swift
33
//
44
//
55
// Created by Fernando Fernandes on 29.01.22.
@@ -13,24 +13,27 @@ import FoundationNetworking
1313
/// A **request** for an overview of a Kucoin Futures account.
1414
///
1515
/// https://docs.kucoin.com/futures/#account
16-
public struct KucoinAccountOverviewRequest: NetworkRequest {
16+
public struct KucoinFuturesAccountOverviewRequest: NetworkRequest {
1717

1818
// MARK: - Properties
1919

20-
public typealias DecodableModel = KucoinFuturesAccountOverviewResponse
20+
public typealias DecodableModel = KucoinFuturesAccountOverview
2121

2222
public var session: URLSession
2323

2424
public var request: URLRequest {
2525
get throws {
26-
let accountOverviewResource = KucoinAccountOverviewResource(currencySymbol: currencySymbol)
27-
var urlRequest = URLRequest(url: try accountOverviewResource.url)
26+
let futuresAccountOverviewResource = KucoinFuturesAccountOverviewResource(currencySymbol: currencySymbol)
27+
var urlRequest = URLRequest(url: try futuresAccountOverviewResource.url)
2828
urlRequest.httpMethod = HTTPMethod.GET.rawValue
2929
try KucoinAPI.setRequestHeaderFields(request: &urlRequest, kucoinAuth: kucoinAuth)
3030
return urlRequest
3131
}
3232
}
3333

34+
#warning("TODO: [CONFIG] number of retries")
35+
public var numberOfRetries: Int { 3 }
36+
3437
// MARK: Private
3538

3639
private let currencySymbol: CurrencySymbol
@@ -39,7 +42,7 @@ public struct KucoinAccountOverviewRequest: NetworkRequest {
3942

4043
// MARK: - Lifecycle
4144

42-
/// Creates a new `KucoinAccountOverviewRequest` instance.
45+
/// Creates a new `KucoinFuturesAccountOverviewRequest` instance.
4346
///
4447
/// - Parameter session: `URLSession` instance, the default is `.shared`.
4548
public init(session: URLSession = .shared, currencySymbol: CurrencySymbol = .USDT, kucoinAuth: KucoinAuth) {
@@ -51,9 +54,9 @@ public struct KucoinAccountOverviewRequest: NetworkRequest {
5154

5255
// MARK: - Network Request Protocol
5356

54-
public extension KucoinAccountOverviewRequest {
57+
public extension KucoinFuturesAccountOverviewRequest {
5558

5659
func decode(_ data: Data) throws -> DecodableModel {
57-
try JSONDecoder().decode(KucoinFuturesAccountOverviewResponse.self, from: data)
60+
try JSONDecoder().decode(KucoinFuturesAccountOverview.self, from: data)
5861
}
5962
}

Sources/SwiftTrader/Network/Kucoin/AccountOverview/KucoinAccountOverviewResource.swift renamed to Sources/SwiftTrader/Network/Kucoin/AccountOverview/KucoinFuturesAccountOverviewResource.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// KucoinAccountOverviewResource.swift
2+
// KucoinFuturesAccountOverviewResource.swift
33
//
44
//
55
// Created by Fernando Fernandes on 29.01.22.
@@ -10,7 +10,7 @@ import Foundation
1010
/// The **resource** for requesting an overview of a Kucoin Futures account.
1111
///
1212
/// https://docs.kucoin.com/futures/#account
13-
public struct KucoinAccountOverviewResource: NetworkResource {
13+
public struct KucoinFuturesAccountOverviewResource: NetworkResource {
1414

1515
// MARK: - Properties
1616

@@ -38,7 +38,7 @@ public struct KucoinAccountOverviewResource: NetworkResource {
3838

3939
// MARK: - Lifecycle
4040

41-
/// Creates a new `KucoinAccountOverviewResource` instance.
41+
/// Creates a new `KucoinFuturesAccountOverviewResource` instance.
4242
///
4343
/// - Parameter currencySymbol: `CurrencySymbol`, default is `USDT`.
4444
init(currencySymbol: CurrencySymbol = .USDT) {

Sources/SwiftTrader/Network/NetworkRequest/NetworkRequestProtocol+Execution.swift

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,41 @@ public extension NetworkRequest {
2121
///
2222
/// - Parameter request: `URLRequest` containing the target `URL`.
2323
/// - Returns: `NetworkRequestResult`.
24-
func execute() async -> NetworkRequestResult {
24+
func execute(attemptNumber: Int = 1) async -> NetworkRequestResult {
2525
let req: URLRequest
2626
do {
2727
req = try request
2828
} catch {
2929
return .failure(.invalidRequest(error: error))
3030
}
3131
#if os(macOS) || os(iOS)
32-
return await runOnApplePlatforms(request: req)
32+
let result = await runOnApplePlatforms(request: req)
33+
switch result {
34+
case .success:
35+
return result
36+
case .failure:
37+
if attemptNumber <= numberOfRetries {
38+
#warning("TODO: [CONFIG] Wait time between attempts")
39+
let seconds: Double = 2
40+
await Task.sleep(UInt64(seconds * Double(NSEC_PER_SEC)))
41+
#warning("TODO: logger")
42+
print("Retrying... \(attemptNumber) of \(numberOfRetries)")
43+
fflush(stdout)
44+
return await execute(attemptNumber: attemptNumber + 1)
45+
} else {
46+
return result
47+
}
48+
}
3349
#elseif canImport(FoundationNetworking)
3450
return await runOnLinux(request: req)
3551
#endif
3652
}
3753
}
3854

39-
#warning("TODO: retry mechanism, at least 3 times")
40-
4155
// MARK: - Private
4256

4357
private extension NetworkRequest {
44-
58+
4559
#if os(macOS) || os(iOS)
4660
/// macOS and iOS.
4761
func runOnApplePlatforms(request: URLRequest) async -> NetworkRequestResult {
@@ -53,7 +67,7 @@ private extension NetworkRequest {
5367
}
5468
}
5569
#endif
56-
70+
5771
/// `async/await` isn't fully ported to Linux; use "withCheckedContinuation(function:_:)" instead.
5872
func runOnLinux(request: URLRequest) async -> NetworkRequestResult {
5973
let (data, response, error) = await withCheckedContinuation { continuation in

Sources/SwiftTrader/Network/NetworkRequest/NetworkRequestProtocol.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public protocol NetworkRequest {
1717
associatedtype DecodableModel: Decodable
1818
var session: URLSession { get }
1919
var request: URLRequest { get throws }
20-
func execute() async -> NetworkRequestResult
20+
var numberOfRetries: Int { get }
21+
func execute(attemptNumber: Int) async -> NetworkRequestResult
2122
func decode(_ data: Data) throws -> DecodableModel
2223
}

Sources/SwiftTrader/SwiftTrader.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ public struct SwiftTrader {
2525

2626
public extension SwiftTrader {
2727

28-
func kucoinFuturesAccountOverview() async throws -> Result<KucoinFuturesAccountOverviewResponse, SwiftTraderError> {
29-
let request = KucoinAccountOverviewRequest(kucoinAuth: kucoinAuth)
28+
func kucoinFuturesAccountOverview(currencySymbol: CurrencySymbol = .USDT) async throws -> Result<KucoinFuturesAccountOverview, SwiftTraderError> {
29+
let request = KucoinFuturesAccountOverviewRequest(currencySymbol: currencySymbol, kucoinAuth: kucoinAuth)
3030
switch await request.execute() {
3131
case .success(let model):
32-
guard let accountOverview = model as? KucoinFuturesAccountOverviewResponse else {
32+
guard let futuresAccountOverview = model as? KucoinFuturesAccountOverview else {
3333
return .failure(.unexpectedResponse(modelString: "\(model)"))
3434
}
35-
return .success(accountOverview)
35+
return .success(futuresAccountOverview)
3636
case .failure(let error):
3737
switch error {
3838
case .statusCodeNotOK(let statusCode, let errorMessage, let data):

0 commit comments

Comments
 (0)