Skip to content

Commit

Permalink
Base and some cleanup
Browse files Browse the repository at this point in the history
changed URLSession to be async and started some cleanup
  • Loading branch information
pharms-eth committed Apr 9, 2022
1 parent a9df4c7 commit fb5102c
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 87 deletions.
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ let excludeFiles: String = []
let package = Package(
name: "Web3swift",
platforms: [
.macOS(.v10_12), .iOS(.v11)
.macOS(.v10_12), .iOS(.v15)
],
products: [
.library(name: "web3swift", targets: ["web3swift"])
Expand Down
99 changes: 21 additions & 78 deletions Sources/web3swift/Promises/Promise+HttpProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,92 +9,35 @@ import Foundation

extension Web3HttpProvider {

static func post(_ request: JSONRPCrequest, providerURL: URL, queue: DispatchQueue = .main, session: URLSession) -> Promise<JSONRPCresponse> {
let rp = Promise<Data>.pending()
var task: URLSessionTask? = nil
queue.async {
do {
let encoder = JSONEncoder()
let requestData = try encoder.encode(request)
var urlRequest = URLRequest(url: providerURL, cachePolicy: URLRequest.CachePolicy.reloadIgnoringCacheData)
urlRequest.httpMethod = "POST"
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.setValue("application/json", forHTTPHeaderField: "Accept")
urlRequest.httpBody = requestData
task = session.dataTask(with: urlRequest) { (data, response, error) in
guard error == nil else {
rp.resolver.reject(error!)
return
}
guard data != nil else {
rp.resolver.reject(Web3Error.nodeError(desc: "Node response is empty"))
return
}
rp.resolver.fulfill(data!)
}
task?.resume()
} catch {
rp.resolver.reject(error)
}
}
return rp.promise.ensure(on: queue) {
task = nil
}.map(on: queue){ (data: Data) throws -> JSONRPCresponse in
let parsedResponse = try JSONDecoder().decode(JSONRPCresponse.self, from: data)
if parsedResponse.error != nil {
throw Web3Error.nodeError(desc: "Received an error message from node\n" + String(describing: parsedResponse.error!))
}
return parsedResponse
}
}
static func post<T: Decodable, U: Encodable>(_ request: U, providerURL: URL, session: URLSession) async throws -> T {

static func post(_ request: JSONRPCrequestBatch, providerURL: URL, queue: DispatchQueue = .main, session: URLSession) -> Promise<JSONRPCresponseBatch> {
let rp = Promise<Data>.pending()
var task: URLSessionTask? = nil
queue.async {
do {
let encoder = JSONEncoder()
let requestData = try encoder.encode(request)
var urlRequest = URLRequest(url: providerURL, cachePolicy: URLRequest.CachePolicy.reloadIgnoringCacheData)
urlRequest.httpMethod = "POST"
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.setValue("application/json", forHTTPHeaderField: "Accept")
urlRequest.httpBody = requestData
task = session.dataTask(with: urlRequest){ (data, response, error) in
guard error == nil else {
rp.resolver.reject(error!)
return
}
guard data != nil, data!.count != 0 else {
rp.resolver.reject(Web3Error.nodeError(desc: "Node response is empty"))
return
}
rp.resolver.fulfill(data!)
}
task?.resume()
} catch {
rp.resolver.reject(error)
}
}
return rp.promise.ensure(on: queue) {
task = nil
}.map(on: queue){ (data: Data) throws -> JSONRPCresponseBatch in
// let debugValue = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions(rawValue: 0))
// print(debugValue)
let parsedResponse = try JSONDecoder().decode(JSONRPCresponseBatch.self, from: data)
return parsedResponse
let requestData = try JSONEncoder().encode(request)
var urlRequest = URLRequest(url: providerURL, cachePolicy: .reloadIgnoringCacheData)
urlRequest.httpMethod = "POST"
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.setValue("application/json", forHTTPHeaderField: "Accept")
urlRequest.httpBody = requestData

let (data, _) = try await session.data(for: urlRequest)

let parsedResponse = try JSONDecoder().decode(T.self, from: data)

if let response = parsedResponse as? JSONRPCresponse, response.error == nil {
throw Web3Error.nodeError(desc: "Received an error message from node\n" + String(describing: response.error!))
}
return parsedResponse

}

public func sendAsync(_ request: JSONRPCrequest, queue: DispatchQueue = .main) throws -> JSONRPCresponse {
if request.method == nil {
public func sendAsync(_ request: JSONRPCrequest) async throws -> JSONRPCresponse {
guard request.method != nil else {
throw Web3Error.nodeError(desc: "RPC method is nill")
}

return Web3HttpProvider.post(request, providerURL: self.url, queue: queue, session: self.session)
return try await Web3HttpProvider.post(request, providerURL: self.url, session: self.session)
}

public func sendAsync(_ requests: JSONRPCrequestBatch, queue: DispatchQueue = .main) throws -> JSONRPCresponseBatch {
return Web3HttpProvider.post(requests, providerURL: self.url, queue: queue, session: self.session)
public func sendAsync(_ requests: JSONRPCrequestBatch) async throws -> JSONRPCresponseBatch {
return try await Web3HttpProvider.post(requests, providerURL: self.url, session: self.session)
}
}
2 changes: 0 additions & 2 deletions Sources/web3swift/Web3/Web3+MutatingTransaction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
import Foundation
import BigInt

fileprivate typealias PromiseResult = PromiseKit.Result

public class WriteTransaction: ReadTransaction {

public func assemblePromise(transactionOptions: TransactionOptions? = nil) -> Promise<EthereumTransaction> {
Expand Down
8 changes: 4 additions & 4 deletions Sources/web3swift/Web3/Web3+Protocols.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ public protocol EventParserProtocol {
func parseTransactionByHash(_ hash: Data) throws -> [EventParserResultProtocol]
func parseBlock(_ block: Block) throws -> [EventParserResultProtocol]
func parseBlockByNumber(_ blockNumber: UInt64) throws -> [EventParserResultProtocol]
func parseTransactionPromise(_ transaction: EthereumTransaction) -> Promise<[EventParserResultProtocol]>
func parseTransactionByHashPromise(_ hash: Data) -> Promise<[EventParserResultProtocol]>
func parseBlockByNumberPromise(_ blockNumber: UInt64) -> Promise<[EventParserResultProtocol]>
func parseBlockPromise(_ block: Block) -> Promise<[EventParserResultProtocol]>
func parseTransactionPromise(_ transaction: EthereumTransaction) -> [EventParserResultProtocol]
func parseTransactionByHashPromise(_ hash: Data) -> [EventParserResultProtocol]
func parseBlockByNumberPromise(_ blockNumber: UInt64) -> [EventParserResultProtocol]
func parseBlockPromise(_ block: Block) -> [EventParserResultProtocol]
}

/// Enum for the most-used Ethereum networks. Network ID is crucial for EIP155 support
Expand Down
2 changes: 0 additions & 2 deletions Sources/web3swift/Web3/Web3+ReadingTransaction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
import Foundation
import BigInt

fileprivate typealias PromiseResult = PromiseKit.Result

public class ReadTransaction {
public var transaction: EthereumTransaction
public var contract: EthereumContract
Expand Down

0 comments on commit fb5102c

Please sign in to comment.