@@ -69,6 +69,19 @@ internal final class OpenPassClient {
69
69
: . disabled
70
70
}
71
71
72
+ // MARK: - Telemetry
73
+
74
+ /// Record a telemetry event
75
+ /// `/v1/api/telemetry/sdk_event`
76
+ /// - Parameters:
77
+ /// - event: The event to record
78
+ func recordEvent( _ event: TelemetryEvent ) async throws {
79
+ let logTag : StaticString = " Telemetry Event "
80
+ os_log ( logTag, log: log, type: . debug)
81
+ let request = Request . telemetryEvent ( event)
82
+ try await execute ( request, String ( logTag) )
83
+ }
84
+
72
85
// MARK: - Tokens
73
86
74
87
/// Network call to get an ``OpenPassTokens``
@@ -148,11 +161,16 @@ internal final class OpenPassClient {
148
161
149
162
var urlRequest = URLRequest ( url: urlComponents. url!)
150
163
urlRequest. httpMethod = request. method. rawValue
151
- if request. method == . get {
152
- urlComponents. queryItems = request. queryItems
153
- } else if request. method == . post {
164
+
165
+ switch request. body {
166
+ case . none:
167
+ break
168
+ case . form( let queryItems) :
154
169
urlRequest. addValue ( " application/x-www-form-urlencoded " , forHTTPHeaderField: " Content-Type " )
155
- urlRequest. httpBody = encodedPostBody ( request. queryItems)
170
+ urlRequest. httpBody = encodedPostBody ( queryItems)
171
+ case . json( let encodable) :
172
+ urlRequest. addValue ( " application/json " , forHTTPHeaderField: " Content-Type " )
173
+ urlRequest. httpBody = try ? Self . encoder ( ) . encode ( encodable)
156
174
}
157
175
158
176
baseRequestParameters. asHeaderPairs. forEach { field, value in
@@ -161,31 +179,51 @@ internal final class OpenPassClient {
161
179
return urlRequest
162
180
}
163
181
182
+ static internal func encoder( ) -> JSONEncoder {
183
+ let encoder = JSONEncoder ( )
184
+ encoder. keyEncodingStrategy = . convertToSnakeCase
185
+ return encoder
186
+ }
187
+
164
188
private func encodedPostBody( _ queryItems: [ URLQueryItem ] ) -> Data {
165
189
var urlComponents = URLComponents ( )
166
190
urlComponents. queryItems = queryItems
167
191
let query = urlComponents. query ?? " "
168
192
return Data ( query. utf8)
169
193
}
170
194
171
- private func execute< ResponseType : Decodable > (
172
- _ request: Request < ResponseType > ,
195
+ private func execute(
196
+ _ request: URLRequest ,
173
197
_ logTag: String
174
- ) async throws -> ResponseType {
175
- let urlRequest = urlRequest (
176
- request
177
- )
198
+ ) async throws -> Data {
178
199
let data : Data
179
200
let response : HTTPURLResponse
180
201
do {
181
- ( data, response) = try await self . data ( for: urlRequest )
202
+ ( data, response) = try await self . data ( for: request )
182
203
} catch {
183
204
os_log ( " Client request error %@ " , log: log, type: . error, logTag)
184
205
throw error
185
206
}
186
207
if response. statusCode != 200 {
187
208
os_log ( " Client request error (%d) %@ " , log: log, type: . error, response. statusCode, logTag)
188
209
}
210
+ return data
211
+ }
212
+
213
+ private func execute(
214
+ _ request: Request < Void > ,
215
+ _ logTag: String
216
+ ) async throws {
217
+ let urlRequest = urlRequest ( request)
218
+ _ = try await execute ( urlRequest, logTag)
219
+ }
220
+
221
+ private func execute< ResponseType: Decodable > (
222
+ _ request: Request < ResponseType > ,
223
+ _ logTag: String
224
+ ) async throws -> ResponseType {
225
+ let urlRequest = urlRequest ( request)
226
+ let data = try await execute ( urlRequest, logTag)
189
227
let decoder = JSONDecoder ( )
190
228
decoder. keyDecodingStrategy = . convertFromSnakeCase
191
229
do {
0 commit comments