func uploadMetrics()

in Sources/XCMetricsClient/Network/MetricsPublisherServiceHTTP.swift [38:81]


    func uploadMetrics(
        serviceURL: URL,
        additionalHeaders: [String: String],
        projectName: String,
        isCI: Bool,
        skipNotes: Bool,
        truncLargeIssues: Bool,
        uploadRequests: Set<MetricsUploadRequest>,
        completion: @escaping (_ successfulURLs: Set<URL>, _ failedURLs: [URL: Data]) -> Void
    ) {
        var successfulURLs = Set<URL>()
        var failedURLs = [URL: Data]()
        let successfulURLsLock = NSLock()
        let failedURLsLock = NSLock()
        for uploadRequest in uploadRequests {
            self.dispatchGroup.enter()

            self.uploadLog(uploadRequest, to: serviceURL, additionalHeaders: additionalHeaders, projectName: projectName, isCI: isCI, skipNotes: skipNotes, truncLargeIssues: truncLargeIssues) { (result: Result<Void, LogUploadError>) in

                switch result {
                case .success:
                    successfulURLsLock.lock()
                    successfulURLs.insert(uploadRequest.fileURL)
                    successfulURLsLock.unlock()
                case .failure(let error):
                    // If the failed request was for an already failed request, skip writing it to disk since it's
                    // already saved.
                    guard uploadRequest.fileURL.isRequestFile == false else {
                        return
                    }
                    log("Error (\(error.error)) in uploading metrics.")
                    failedURLsLock.lock()
                    failedURLs[uploadRequest.fileURL] = error.body
                    failedURLsLock.unlock()
                }
            }
        }
        dispatchGroup.wait()

        dispatchGroup.notify(queue: dispatchQueue) {
            log("Completed uploading metrics with \(successfulURLs.count) successful and \(failedURLs.count) failed uploads.")
            completion(successfulURLs, failedURLs)
        }
    }