in Sources/Confidence/RemoteConfidenceClient.swift [35:97]
func upload(events: [NetworkEvent]) async throws -> Bool {
let timeString = Date.backport.nowISOString
let request = PublishEventRequest(
events: events.map { event in NetworkEvent(
eventDefinition: "eventDefinitions/\(event.eventDefinition)",
payload: event.payload,
eventTime: event.eventTime)
},
clientSecret: options.credentials.getSecret(),
sendTime: timeString,
sdk: Sdk(id: metadata.name, version: metadata.version)
)
do {
let result: HttpClientResult<PublishEventResponse> =
try await self.httpClient.post(path: ":publish", data: request)
switch result {
case .success(let successData):
let status = successData.response.statusCode
let indecesWithError = successData.decodedData?.errors.map { error in
error.index
} ?? []
let successEventNames = events.enumerated()
// Filter only events in batch that have no error reported from backend
.filter { index, _ in
return !(indecesWithError.contains(index))
}
.map { _, event in
event.eventDefinition
}
switch status {
case 200:
// clean up in case of success
debugLogger?.logMessage(
message: "Event upload: HTTP status 200. Events: \(successEventNames.joined(separator: ","))",
isWarning: false
)
return true
case 429:
// we shouldn't clean up for rate limiting
debugLogger?.logMessage(
message: "Event upload: HTTP status 429",
isWarning: true
)
return false
case 400...499:
// if batch couldn't be processed, we should clean it up
debugLogger?.logMessage(
message: "Event upload: couldn't process batch",
isWarning: true
)
return true
default:
debugLogger?.logMessage(
message: "Event upload error. Status code \(status)",
isWarning: true
)
return false
}
case .failure(let errorData):
throw handleError(error: errorData)
}
}
}