Skip to content

Commit 0fdb97a

Browse files
committed
Change findProvs api (bw compatible)
Add ability to add number of providers and also to use streaming json.
1 parent 0f85898 commit 0fdb97a

File tree

5 files changed

+271
-161
lines changed

5 files changed

+271
-161
lines changed

SwiftIpfsApi/HttpIo.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ public class StreamHandler : NSObject, URLSessionDataDelegate {
147147

148148
do {
149149
// fire the update handler
150+
// FIX: Use the return value of the update handler to signal that we want to end the stream.
150151
try _ = updateHandler(data, dataTask)
151152
} catch {
152153
print("In StreamHandler: updateHandler error: \(error)")

SwiftIpfsApi/JsonType.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public extension JsonType {
2828
case let value as Swift.String: return .String(value)
2929

3030
case let value as NSNumber: return .Number(value)
31+
32+
case let value as JsonType: return value
33+
3134
default: return .null
3235
}
3336
}

SwiftIpfsApi/Subcommands/Dht.swift

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,97 @@
99

1010
import SwiftMultihash
1111
import SwiftMultiaddr
12+
import Foundation
1213

1314
public class Dht : ClientSubCommand {
1415

1516
var parent: IpfsApiClient?
1617

1718
/** FindProviders will return a list of peers who are able to provide the value requested. */
18-
public func findProvs(_ hash: Multihash, completionHandler: @escaping (JsonType) -> Void) throws {
19-
try parent!.fetchJson("dht/findprovs?arg=" + b58String(hash), completionHandler: completionHandler)
19+
// public func findProvs(_ hash: Multihash, numProviders: Int = 20, completionHandler: @escaping (JsonType) -> Void) throws {
20+
// try parent!.fetchJson("dht/findprovs?arg=\(b58String(hash))&num-providers=\(numProviders)", completionHandler: completionHandler)
21+
// }
22+
public func findProvs(_ hash: Multihash, numProviders: Int = 20, completionHandler: @escaping (JsonType) -> Void) throws {
23+
/// Two test closures to be passed to the fetchStreamJson as parameters.
24+
let comp = { (result: AnyObject) -> Void in
25+
print("Job done")
26+
}
27+
28+
let update : ((Data, URLSessionDataTask) -> Bool) = { (data: Data, task: URLSessionDataTask) -> Bool in
29+
30+
func getHash(from obj: [String : JsonType], forResponse type: Int) -> [String]? {
31+
32+
if obj["Type"]?.number?.intValue == type {
33+
if let responses = obj["Responses"]?.array {
34+
// only keep the responses that contain an ID.
35+
return responses.compactMap { $0.object?["ID"]?.string }
36+
}
37+
}
38+
return nil
39+
}
40+
41+
42+
print("updates")
43+
let fixed = fixStreamJson(data)
44+
let json = try? JSONSerialization.jsonObject(with: fixed, options: JSONSerialization.ReadingOptions.allowFragments)
45+
let parsedJ = JsonType.parse(json as AnyObject)
46+
47+
var providers = [JsonType]()
48+
// A valid response can either be an array of objects or an object.
49+
switch parsedJ {
50+
case JsonType.Array(let array):
51+
// print("we iz got de arrays")
52+
providers += array.filter { $0.object?["Type"]?.number == 4 }
53+
// for obj in array {
54+
// if let jobj = obj.object, jobj["Type"]?.number == 4 {
55+
// providers += jobj
56+
// }
57+
// }
58+
case JsonType.Object(let obj):
59+
// print("we iz got de hobj innit? \(obj)")
60+
if obj["Type"]?.number == 4 {
61+
providers.append(parsedJ)
62+
}
63+
// if let provs = getHash(from: obj, forResponse: 4) {
64+
// providers += provs
65+
// }
66+
67+
default:
68+
print("fukkal")
69+
}
70+
71+
72+
if providers.count >= numProviders {
73+
print("We found these providers \(providers)")
74+
let provs = JsonType.parse(providers as AnyObject)
75+
completionHandler(provs)
76+
77+
}
78+
79+
// guard let jarray = parsedJ.array else {
80+
// print("No array in parsed json update \(parsedJ)")
81+
// return true
82+
// }
83+
//
84+
// for obj in jarray {
85+
// print("json: \(String(describing: obj.object?["Type"]))")
86+
// }
87+
88+
// print("json: \(json)")
89+
//
90+
// if let arr = json as? [AnyObject] {
91+
// for res in arr {
92+
// print(res)
93+
// }
94+
// } else {
95+
// if let dict = json as? [String: AnyObject] {
96+
// print("It's a dict!:",dict )
97+
// }
98+
// }
99+
return true
100+
}
101+
102+
try parent!.fetchStreamJson("dht/findprovs?arg=\(b58String(hash))&num-providers=\(numProviders)", updateHandler: update, completionHandler: comp)
20103
}
21104

22105
/** Run a 'findClosestPeers' query through the DHT */

SwiftIpfsApi/Subcommands/Swarm.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ public class Swarm : ClientSubCommand {
2323
var addresses: [Multiaddr] = []
2424
if let swarmPeers = result.object?[IpfsCmdString.Peers.rawValue]?.array {
2525
/// Make an array of Multiaddr from each peer in swarmPeers.
26-
addresses = try swarmPeers.map { try newMultiaddr($0.string!) }
26+
addresses = try swarmPeers.map {
27+
guard let peer = $0.object?["Addr"]?.string else { throw IpfsApiError.nilData }
28+
// Broken until multiaddr can deal with p2p-circuit multiaddr
29+
return try newMultiaddr(peer)
30+
}
2731
}
2832

2933
/// convert the data into a Multiaddr array and pass it to the handler

0 commit comments

Comments
 (0)