Skip to content

Commit 6c20f01

Browse files
committed
feat: remove fatal errors
Signed-off-by: Ricky Saechao <ricky@launchbadge.com>
1 parent 0e69fbb commit 6c20f01

File tree

3 files changed

+105
-68
lines changed

3 files changed

+105
-68
lines changed

Sources/Hedera/MirrorNodeGateway.swift

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,7 @@ internal struct MirrorNodeGateway {
4949

5050
let responseBody = try await queryFromMirrorNode(fullApiUrl)
5151

52-
guard let jsonData = responseBody.data(using: .utf8) else {
53-
throw NSError(
54-
domain: "InvalidResponseError", code: -1,
55-
userInfo: [NSLocalizedDescriptionKey: "Response body is not valid UTF-8"])
56-
}
57-
58-
guard let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] else {
59-
throw NSError(
60-
domain: "InvalidResponseError", code: -1,
61-
userInfo: [NSLocalizedDescriptionKey: "Response body is not a valid JSON object"])
62-
}
52+
let jsonObject = try await deserializeJson(responseBody)
6353

6454
return jsonObject
6555
}
@@ -70,47 +60,32 @@ internal struct MirrorNodeGateway {
7060

7161
let responseBody = try await queryFromMirrorNode(fullApiUrl)
7262

73-
guard let jsonData = responseBody.data(using: .utf8) else {
74-
throw NSError(
75-
domain: "InvalidResponseError", code: -1,
76-
userInfo: [NSLocalizedDescriptionKey: "Response body is not valid UTF-8"])
77-
}
78-
guard let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] else {
79-
throw NSError(
80-
domain: "InvalidResponseError", code: -1,
81-
userInfo: [NSLocalizedDescriptionKey: "Response body is not a valid JSON object"])
82-
}
63+
let jsonObject = try await deserializeJson(responseBody)
8364

8465
return jsonObject
8566
}
8667

8768
internal func getAccountTokens(_ idOrAliasOrEvmAddress: String) async throws -> [String: Any] {
8869
let fullApiUrl = MirrorNodeRouter.buildApiUrl(
89-
self.mirrorNodeUrl, MirrorNodeRouter.accountTokensRoute, idOrAliasOrEvmAddress)
70+
self.mirrorNodeUrl, MirrorNodeRouter.tokensAccountRoute, idOrAliasOrEvmAddress)
9071

9172
let responseBody = try await queryFromMirrorNode(fullApiUrl)
9273

93-
guard let jsonData = responseBody.data(using: .utf8) else {
94-
throw NSError(
95-
domain: "InvalidResponseError", code: -1,
96-
userInfo: [NSLocalizedDescriptionKey: "Response body is not valid UTF-8"])
97-
}
98-
99-
guard let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] else {
100-
throw NSError(
101-
domain: "InvalidResponseError", code: -1,
102-
userInfo: [NSLocalizedDescriptionKey: "Response body is not a valid JSON object"])
103-
}
74+
let jsonObject = try await deserializeJson(responseBody)
10475

10576
return jsonObject
10677
}
10778

108-
internal func queryFromMirrorNode(_ apiUrl: String) async throws -> String {
79+
private func queryFromMirrorNode(_ apiUrl: String) async throws -> String {
10980
let httpClient = HTTPClient(eventLoopGroupProvider: .singleton)
11081
defer {
11182
try? httpClient.syncShutdown()
11283
}
11384

85+
if apiUrl.contains("127.0.0.1:5551") {
86+
try await Task.sleep(nanoseconds: 1_000_000_000 * 3)
87+
}
88+
11489
let request = HTTPClientRequest(url: apiUrl)
11590

11691
let response: HTTPClientResponse = try await httpClient.execute(request, timeout: .seconds(30))
@@ -120,4 +95,20 @@ internal struct MirrorNodeGateway {
12095

12196
return bodyString
12297
}
98+
99+
func deserializeJson(_ responseBody: String) async throws -> [String: Any] {
100+
guard let jsonData = responseBody.data(using: .utf8) else {
101+
throw NSError(
102+
domain: "InvalidResponseError", code: -1,
103+
userInfo: [NSLocalizedDescriptionKey: "Response body is not valid UTF-8"])
104+
}
105+
106+
guard let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] else {
107+
throw NSError(
108+
domain: "InvalidResponseError", code: -1,
109+
userInfo: [NSLocalizedDescriptionKey: "Response body is not a valid JSON object"])
110+
}
111+
112+
return jsonObject
113+
}
123114
}

Sources/Hedera/MirrorNodeRouter.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ internal struct MirrorNodeRouter {
3232

3333
public static let accountsRoute = "accounts"
3434
public static let contractsRoute = "contracts"
35-
public static let accountTokensRoute = "account_tokens"
35+
public static let tokensAccountRoute = "account_tokens"
3636

3737
static let routes: [String: String] = [
3838
accountsRoute: "/accounts/%@",
3939
contractsRoute: "/contracts/%@",
40-
accountTokensRoute: "/accounts/%@/tokens",
40+
tokensAccountRoute: "/accounts/%@/tokens",
4141
]
4242

4343
private func MirrorNodeRouter() {}

Sources/Hedera/MirrorNodeService.swift

Lines changed: 78 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,14 @@ internal final class MirrorNodeService {
5656
}
5757

5858
internal func getContractNum(_ evmAddress: String) async throws -> UInt64 {
59-
let accountInfoResponse = try await self.mirrorNodeGateway.getContractInfo(evmAddress)
59+
let contractInfoResponse = try await self.mirrorNodeGateway.getContractInfo(evmAddress)
6060

61-
guard let contractId = accountInfoResponse["contract_id"] else {
62-
fatalError("Error while processing getContractNum mirror node query")
61+
guard let contractId = contractInfoResponse["contract_id"] else {
62+
throw NSError(
63+
domain: "InvalidResponseError", code: -1,
64+
userInfo: [
65+
NSLocalizedDescriptionKey: "Error while processing getContractNum mirror node query"
66+
])
6367
}
6468

6569
let contractIdNum = ContractId(String(describing: contractId))?.num
@@ -71,27 +75,43 @@ internal final class MirrorNodeService {
7175
let accountTokensResponse = try await self.mirrorNodeGateway.getAccountTokens(evmAddress)
7276

7377
guard let tokens = accountTokensResponse["tokens"] else {
74-
fatalError("Error while processing getTokenBalancesForAccount mirror node query")
78+
throw NSError(
79+
domain: "InvalidResponseError", code: -1,
80+
userInfo: [
81+
NSLocalizedDescriptionKey: "Error while processing getAccountTokens mirror node query"
82+
])
7583
}
7684

7785
var tokenBalances: [Proto_TokenBalance] = []
7886

79-
guard let tokensList = tokens as? [[String: Any]] else {
87+
guard let tokensList: [[String: Any]] = tokens as? [[String: Any]] else {
8088
throw NSError(
8189
domain: "InvalidResponseError", code: -1,
8290
userInfo: [
8391
NSLocalizedDescriptionKey: "Error while processing getTokenBalancesForAccount mirror node query"
8492
])
8593
}
8694
tokensList.forEach { token in
87-
let tokenId = TokenId(String(describing: token["token_id"]))?.toProtobuf()
88-
let balance = UInt64(String(describing: token["balance"]))
89-
let decimals = UInt32(String(describing: token["decimals"]))
95+
var tokenId: String = ""
96+
var balance: UInt64 = 0
97+
var decimals: UInt32 = 0
98+
99+
if let id = token["token_id"] as? String {
100+
tokenId = id
101+
}
102+
103+
if let hbar = token["balance"] as? String {
104+
balance = UInt64(hbar)!
105+
}
106+
107+
if let dec = token["decimals"] as? String {
108+
decimals = UInt32(dec)!
109+
}
90110

91111
let tokenBalanceProto = Proto_TokenBalance.with { proto in
92-
proto.tokenID = tokenId!
93-
proto.balance = balance!
94-
proto.decimals = decimals!
112+
proto.tokenID = TokenId(tokenId)!.toProtobuf()
113+
proto.balance = balance
114+
proto.decimals = decimals
95115
}
96116

97117
tokenBalances.append(tokenBalanceProto)
@@ -114,28 +134,54 @@ internal final class MirrorNodeService {
114134

115135
var tokenBalances: [Proto_TokenRelationship] = []
116136

117-
if let tokensList = tokens as? [[String: Any]] {
118-
try tokensList.forEach { token in
119-
let tokenId = TokenId(String(describing: token["token_id"]))?.toProtobuf()
120-
let balance = UInt64(String(describing: token["balance"]))
121-
let decimals = UInt32(String(describing: token["decimals"]))
122-
let kycStatus = String(describing: token["kyc_status"])
123-
let freezeStatus = String(describing: token["freeze_status"])
124-
let automaticAssociation = Bool(String(describing: token["automatic_assocation"]))
125-
126-
let tokenRelationshipsProto = try Proto_TokenRelationship.with { proto in
127-
proto.tokenID = tokenId!
128-
proto.balance = balance!
129-
proto.decimals = decimals!
130-
proto.kycStatus = try getTokenKycStatusFromString(kycStatus)
131-
proto.freezeStatus = try getTokenFreezeStatusFromString(freezeStatus)
132-
proto.automaticAssociation = automaticAssociation!
133-
}
134-
135-
tokenBalances.append(tokenRelationshipsProto)
137+
guard let tokensList: [[String: Any]] = tokens as? [[String: Any]] else {
138+
throw NSError(
139+
domain: "InvalidResponseError", code: -1,
140+
userInfo: [
141+
NSLocalizedDescriptionKey: "Error while processing getTokenBalancesForAccount mirror node query"
142+
])
143+
}
144+
try tokensList.forEach { token in
145+
var tokenId: String = ""
146+
var balance: UInt64 = 0
147+
var decimals: UInt32 = 0
148+
var kycStatus: String = ""
149+
var freezeStatus: String = ""
150+
var automaticAssociation: Bool = false
151+
if let id = token["token_id"] as? String {
152+
tokenId = id
153+
}
154+
155+
if let hbar = token["balance"] as? String {
156+
balance = UInt64(hbar)!
157+
}
158+
159+
if let dec = token["decimals"] as? String {
160+
decimals = UInt32(dec)!
161+
}
162+
163+
if let kyc = token["kyc_status"] as? String {
164+
kycStatus = kyc
165+
}
166+
167+
if let freeze = token["freeze_status"] as? String {
168+
freezeStatus = freeze
169+
}
170+
171+
if let auto = token["automatic_association"] as? String {
172+
automaticAssociation = Bool(auto)!
173+
}
174+
175+
let tokenRelationshipsProto = try Proto_TokenRelationship.with { proto in
176+
proto.tokenID = TokenId(tokenId)!.toProtobuf()
177+
proto.balance = balance
178+
proto.decimals = decimals
179+
proto.kycStatus = try getTokenKycStatusFromString(kycStatus)
180+
proto.freezeStatus = try getTokenFreezeStatusFromString(freezeStatus)
181+
proto.automaticAssociation = automaticAssociation
136182
}
137-
} else {
138-
fatalError("Error while processing getTokenRelationshipsForAccount mirror node query")
183+
184+
tokenBalances.append(tokenRelationshipsProto)
139185
}
140186

141187
return tokenBalances

0 commit comments

Comments
 (0)