@@ -11,7 +11,7 @@ import Foundation
1111struct BasePath {
1212 static let DefaultMixpanelAPI = " https://api.mixpanel.com "
1313 static var namedBasePaths = [ String: String] ( )
14-
14+
1515 static func buildURL( base: String , path: String , queryItems: [ URLQueryItem ] ? ) -> URL ? {
1616 guard let url = URL ( string: base) else {
1717 return nil
@@ -25,7 +25,7 @@ struct BasePath {
2525 components. percentEncodedQuery = components. percentEncodedQuery? . replacingOccurrences ( of: " + " , with: " %2B " )
2626 return components. url
2727 }
28-
28+
2929 static func getServerURL( identifier: String ) -> String {
3030 return namedBasePaths [ identifier] ?? DefaultMixpanelAPI
3131 }
@@ -53,24 +53,24 @@ enum Reason {
5353}
5454
5555class Network {
56-
56+
5757 let basePathIdentifier : String
58-
58+
5959 required init ( basePathIdentifier: String ) {
6060 self . basePathIdentifier = basePathIdentifier
6161 }
62-
62+
6363 class func apiRequest< A> ( base: String ,
6464 resource: Resource < A > ,
6565 failure: @escaping ( Reason , Data ? , URLResponse ? ) -> Void ,
6666 success: @escaping ( A , URLResponse ? ) -> Void ) {
6767 guard let request = buildURLRequest ( base, resource: resource) else {
6868 return
6969 }
70-
70+
7171 URLSession . shared. dataTask ( with: request) { ( data, response, error) -> Void in
7272 guard let httpResponse = response as? HTTPURLResponse else {
73-
73+
7474 if let hasError = error {
7575 failure ( . other( hasError) , data, response)
7676 } else {
@@ -90,30 +90,30 @@ class Network {
9090 failure ( . parseError, data, response)
9191 return
9292 }
93-
93+
9494 success ( result, response)
9595 } . resume ( )
9696 }
97-
97+
9898 private class func buildURLRequest< A> ( _ base: String , resource: Resource < A > ) -> URLRequest ? {
9999 guard let url = BasePath . buildURL ( base: base,
100100 path: resource. path,
101101 queryItems: resource. queryItems) else {
102102 return nil
103103 }
104-
104+
105105 Logger . debug ( message: " Fetching URL " )
106106 Logger . debug ( message: url. absoluteURL)
107107 var request = URLRequest ( url: url)
108108 request. httpMethod = resource. method. rawValue
109109 request. httpBody = resource. requestBody
110-
110+
111111 for (k, v) in resource. headers {
112112 request. setValue ( v, forHTTPHeaderField: k)
113113 }
114114 return request as URLRequest
115115 }
116-
116+
117117 class func buildResource< A> ( path: String ,
118118 method: RequestMethod ,
119119 requestBody: Data ? = nil ,
@@ -127,42 +127,49 @@ class Network {
127127 headers: headers,
128128 parse: parse)
129129 }
130-
131- class func sendHttpEvent( eventName: String , apiToken: String , distinctId: String , properties: Dictionary < String , Any > = [ : ] , completion: @escaping ( Bool ) -> Void ) {
130+
131+ class func sendHttpEvent( eventName: String , apiToken: String , distinctId: String ,
132+ properties: Properties = [ : ] ,
133+ completion: ( ( Bool ) -> Void ) ? = nil ) {
132134 let trackProperties = properties. merging ( [ " token " : apiToken,
133- " mp_lib " : " swift " ,
135+ " mp_lib " : properties [ " mp_lib " ] ?? " swift " ,
134136 " distinct_id " : distinctId,
135- " $lib_version " : AutomaticProperties . libVersion ( ) ] ) { ( current, _) in current }
137+ " $lib_version " : properties [ " $lib_version " ] ?? AutomaticProperties . libVersion ( ) ] ) { ( current, _) in current }
136138 let requestData = JSONHandler . encodeAPIData ( [ [ " event " : eventName, " properties " : trackProperties] ] )
137-
139+
138140 let responseParser : ( Data ) -> Int ? = { data in
139141 let response = String ( data: data, encoding: String . Encoding. utf8)
140142 if let response = response {
141143 return Int ( response) ?? 0
142144 }
143145 return nil
144146 }
145-
147+
146148 if let requestData = requestData {
147149 let requestBody = " ip=1&data= \( requestData) "
148150 . data ( using: String . Encoding. utf8)
149-
151+
150152 let resource = Network . buildResource ( path: FlushType . events. rawValue,
151153 method: . post,
152154 requestBody: requestBody,
153155 headers: [ " Accept-Encoding " : " gzip " ] ,
154156 parse: responseParser)
155-
157+
156158 Network . apiRequest ( base: BasePath . DefaultMixpanelAPI,
157159 resource: resource,
158160 failure: { ( _, _, _) in
159- Logger . debug ( message: " failed to track \( eventName) " )
160- completion ( false )
161- } ,
161+ Logger . debug ( message: " failed to track \( eventName) " )
162+ if let completion = completion {
163+ completion ( false )
164+ }
165+
166+ } ,
162167 success: { ( _, _) in
163- Logger . debug ( message: " \( eventName) tracked " )
164- completion ( true )
168+ Logger . debug ( message: " \( eventName) tracked " )
169+ if let completion = completion {
170+ completion ( true )
165171 }
172+ }
166173 )
167174 }
168175 }
0 commit comments