Skip to content

Commit 74ea530

Browse files
authored
Merge pull request #39 from tkey/rss_comm_multipart_stream
feat: RssComm multipart-form for rss_round_2_stream
2 parents b6d9d10 + ba0f300 commit 74ea530

File tree

2 files changed

+107
-22
lines changed

2 files changed

+107
-22
lines changed

Sources/ThresholdKey/RssComm.swift

Lines changed: 106 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,45 +20,130 @@ public final class RssComm {
2020
.replacingOccurrences(of: " ", with: "+")
2121
.replacingOccurrences(of: " ", with: "+", options: [], range: nil)
2222
}
23-
2423
public init() throws {
2524
var errorCode: Int32 = -1
2625

2726
let network_interface: (@convention(c) (UnsafeMutablePointer<CChar>?, UnsafeMutablePointer<CChar>?, UnsafeMutableRawPointer?, UnsafeMutablePointer<Int32>?) -> UnsafeMutablePointer<CChar>?)? = { url, data, _, error_code in
2827
let sem = DispatchSemaphore(value: 0)
29-
let urlString = String(cString: url!)
28+
var urlString = String(cString: url!)
3029
let dataString = String(cString: data!)
3130
string_free(url)
3231
string_free(data)
32+
if urlString.split(separator: "/").last == "rss_round_2" {
33+
urlString.append("_stream") // use multipart-form api instead
34+
}
3335
let url = URL(string: urlString)!
3436
let session = URLSession.shared
3537
var request = URLRequest(url: url)
3638
request.httpMethod = "POST"
3739
request.addValue("*", forHTTPHeaderField: "Access-Control-Allow-Origin")
3840
request.addValue("GET, POST", forHTTPHeaderField: "Access-Control-Allow-Methods")
3941
request.addValue("Content-Type", forHTTPHeaderField: "Access-Control-Allow-Headers")
40-
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
41-
42-
request.httpBody = dataString.data(using: String.Encoding.utf8)
43-
var resultPointer = UnsafeMutablePointer<CChar>(nil)
44-
var result = NSString()
45-
session.dataTask(with: request) { data, _, error in
46-
defer {
47-
sem.signal()
42+
if urlString.split(separator: "/").last == "rss_round_1" {
43+
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
44+
request.httpBody = dataString.data(using: String.Encoding.utf8)
45+
var resultPointer = UnsafeMutablePointer<CChar>(nil)
46+
var result = NSString()
47+
session.dataTask(with: request) { data, _, error in
48+
defer {
49+
sem.signal()
50+
}
51+
if error != nil {
52+
let code: Int32 = 1
53+
error_code?.pointee = code
54+
}
55+
if let data = data {
56+
let resultString: String = String(decoding: data, as: UTF8.self)
57+
result = NSString(string: resultString)
58+
}
59+
}.resume()
60+
61+
sem.wait()
62+
resultPointer = UnsafeMutablePointer<CChar>(mutating: result.utf8String)
63+
return resultPointer
64+
} else {
65+
let json = try! JSONSerialization.jsonObject(with: dataString.data(using: String.Encoding.utf8)!, options: .allowFragments) as! [String: Any]
66+
67+
let boundary = "Boundary-\(UUID().uuidString)"
68+
var request = URLRequest(url: url)
69+
request.httpMethod = "POST"
70+
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
71+
72+
var body = Data()
73+
74+
func appendField(name: String, value: Any) {
75+
body.append("--\(boundary)\r\n".data(using: .utf8)!)
76+
body.append("Content-Disposition: form-data; name=\"\(name)\"\r\n\r\n".data(using: .utf8)!)
77+
body.append("\(value)\r\n".data(using: .utf8)!)
4878
}
49-
if error != nil {
50-
let code: Int32 = 1
51-
error_code?.pointee = code
79+
80+
func appendJSONField(name: String, json: Any) {
81+
if let jsonData = try? JSONSerialization.data(withJSONObject: json, options: []),
82+
let jsonString = String(data: jsonData, encoding: .utf8) {
83+
body.append("--\(boundary)\r\n".data(using: .utf8)!)
84+
body.append("Content-Disposition: form-data; name=\"\(name)\"\r\n".data(using: .utf8)!)
85+
body.append("Content-Type: application/json\r\n\r\n".data(using: .utf8)!)
86+
body.append("\(jsonString)\r\n".data(using: .utf8)!)
87+
}
5288
}
53-
if let data = data {
54-
let resultString: String = String(decoding: data, as: UTF8.self)
55-
result = NSString(string: resultString)
89+
90+
if let roundName = json["round_name"] as? String {
91+
appendField(name: "round_name", value: roundName)
5692
}
57-
}.resume()
58-
59-
sem.wait()
60-
resultPointer = UnsafeMutablePointer<CChar>(mutating: result.utf8String)
61-
return resultPointer
93+
if let serverIndex = json["server_index"] as? Int {
94+
appendField(name: "server_index", value: serverIndex)
95+
}
96+
if let targetIndex = json["target_index"] as? [Int] {
97+
appendField(name: "target_index", value: targetIndex.map { "\($0)" }.joined(separator: ","))
98+
}
99+
100+
if let data = json["data"] as? [[String: Any]] {
101+
for (index, dataItem) in data.enumerated() {
102+
if let masterCommits = dataItem["master_commits"] as? [[String: Any]] {
103+
for (idx, subDataItem) in masterCommits.enumerated() {
104+
appendJSONField(name: "data[\(index)][master_commits[\(idx)]]", json: subDataItem)
105+
}
106+
}
107+
if let serverCommits = dataItem["server_commits"] as? [[String: Any]] {
108+
for (idx, subDataItem) in serverCommits.enumerated() {
109+
appendJSONField(name: "data[\(index)][server_commits[\(idx)]]", json: subDataItem)
110+
}
111+
}
112+
if let serverEncs = dataItem["server_encs"] as? [[String: Any]] {
113+
for (idx, subDataItem) in serverEncs.enumerated() {
114+
appendJSONField(name: "data[\(index)][server_encs[\(idx)]]", json: subDataItem)
115+
}
116+
}
117+
if let factorPubkeys = dataItem["factor_pubkeys"] as? [[String: Any]] {
118+
for (idx, subDataItem) in factorPubkeys.enumerated() {
119+
appendJSONField(name: "data[\(index)][factor_pubkeys[\(idx)]]", json: subDataItem)
120+
}
121+
}
122+
}
123+
}
124+
125+
body.append("--\(boundary)--\r\n".data(using: .utf8)!)
126+
request.httpBody = body
127+
var resultPointer = UnsafeMutablePointer<CChar>(nil)
128+
var result = NSString()
129+
session.dataTask(with: request) { data, _, error in
130+
defer {
131+
sem.signal()
132+
}
133+
if error != nil {
134+
let code: Int32 = 1
135+
error_code?.pointee = code
136+
}
137+
if let data = data {
138+
let resultString: String = String(decoding: data, as: UTF8.self)
139+
result = NSString(string: resultString)
140+
}
141+
}.resume()
142+
143+
sem.wait()
144+
resultPointer = UnsafeMutablePointer<CChar>(mutating: result.utf8String)
145+
return resultPointer
146+
}
62147
}
63148

64149
let result = withUnsafeMutablePointer(to: &errorCode, { error in

tkey-mpc-swift.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |spec|
22
spec.name = "tkey-mpc-swift"
3-
spec.version = "4.0.1"
3+
spec.version = "4.0.2"
44
spec.platform = :ios, "14.0"
55
spec.summary = "SDK allows you to create threshold key setup natively with multiparty computation support"
66
spec.homepage = "https://web3auth.io/"

0 commit comments

Comments
 (0)