Fix an issue where Transfer view was showing transfer size of only the latest transaction

This commit is contained in:
kean
2022-07-31 09:42:59 -04:00
parent 2b310c3983
commit dc9d82eadc
8 changed files with 84 additions and 28 deletions
+1 -5
View File
@@ -44,8 +44,7 @@ public extension LoggerStore {
NSAttributeDescription(name: "currentRequest", type: .binaryDataAttributeType),
NSAttributeDescription(name: "response", type: .binaryDataAttributeType),
NSAttributeDescription(name: "error", type: .binaryDataAttributeType),
NSAttributeDescription(name: "metrics", type: .binaryDataAttributeType),
NSAttributeDescription(name: "lastTransactionDetails", type: .binaryDataAttributeType),
NSAttributeDescription(name: "metrics", type: .binaryDataAttributeType)
]
requestProgress.properties = [
@@ -221,9 +220,6 @@ public final class LoggerNetworkRequestDetailsEntity: NSManagedObject {
@NSManaged public var error: Data?
/// Contains JSON-encoded ``NetworkLoggerMetrics``.
@NSManaged public var metrics: Data?
/// Contains JSON-encoded ``NetworkLoggerTransactionDetailedMetrics`` for
/// the last transaction from metrics.
@NSManaged public var lastTransactionDetails: Data?
}
// MARK: - Helpers
-1
View File
@@ -409,7 +409,6 @@ extension LoggerStore {
details.response = try? encoder.encode(event.response)
details.error = try? encoder.encode(event.error)
details.metrics = try? encoder.encode(event.metrics)
details.lastTransactionDetails = try? encoder.encode(event.metrics?.transactions.last?.details)
// Completed
if let progress = request.progress {
@@ -0,0 +1,39 @@
// The MIT License (MIT)
//
// Copyright (c) 2020–2022 Alexander Grebenyuk (github.com/kean).
import Foundation
import Combine
import SwiftUI
public final class LoggerStoreInsights: ObservableObject {
private weak var logger: LoggerStore?
private var cancellable: AnyCancellable?
@Published private(set) var totalBytesSent: Int64 = 0
@Published private(set) var bodyBytesSent: Int64 = 0
@Published private(set) var headersBytesSent: Int64 = 0
@Published private(set) var totalBytesReceived: Int64 = 0
@Published private(set) var bodyBytesReceived: Int64 = 0
@Published private(set) var headersBytesReceived: Int64 = 0
public init(logger: LoggerStore) {
cancellable = logger.events.receive(on: DispatchQueue.main).sink { [weak self] in
self?.process(event: $0)
}
}
private func process(event: LoggerStoreEvent) {
switch event {
case .messageStored: break
case .networkTaskCreated: break
case .networkTaskProgressUpdated: break
case .networkTaskCompleted(let event): process(event: event)
}
}
private func process(event: LoggerStoreEvent.NetworkTaskCompleted) {
}
}
@@ -114,6 +114,7 @@ public struct NetworkLoggerMetrics: Codable {
public let taskInterval: DateInterval
public let redirectCount: Int
public let transactions: [NetworkLoggerTransactionMetrics]
public var transferSize: TransferSize { TransferSize(metrics: self) }
public init(metrics: URLSessionTaskMetrics) {
self.taskInterval = metrics.taskInterval
@@ -126,6 +127,29 @@ public struct NetworkLoggerMetrics: Codable {
self.redirectCount = redirectCount
self.transactions = transactions
}
/// Total transfer size across all transactions.
public struct TransferSize {
public var totalBytesSent: Int64 = 0
public var bodyBytesSent: Int64 = 0
public var headersBytesSent: Int64 = 0
public var totalBytesReceived: Int64 = 0
public var bodyBytesReceived: Int64 = 0
public var headersBytesReceived: Int64 = 0
public init() {}
public init(metrics: NetworkLoggerMetrics) {
for details in metrics.transactions.compactMap(\.details) {
totalBytesSent += details.countOfRequestBodyBytesBeforeEncoding + details.countOfRequestHeaderBytesSent
bodyBytesSent += details.countOfRequestBodyBytesSent
headersBytesSent += details.countOfRequestHeaderBytesSent
totalBytesReceived += details.countOfResponseBodyBytesReceived + details.countOfResponseHeaderBytesReceived
bodyBytesReceived += details.countOfResponseBodyBytesReceived
headersBytesReceived += details.countOfResponseHeaderBytesReceived
}
}
}
}
public struct NetworkLoggerTransactionMetrics: Codable {
@@ -5,7 +5,6 @@
import Foundation
import Network
import Combine
import SwiftUI
@available(iOS 14.0, tvOS 14.0, *)
extension RemoteLogger {
@@ -111,11 +111,9 @@ struct NetworkInspectorTransferInfoView_Previews: PreviewProvider {
}
private let mockModel = NetworkInspectorTransferInfoViewModel(
details: mockMetrics.transactions.last!.details!, taskType: .dataTask
metrics: LoggerStore.preview.entity(for: .login).metrics!, taskType: .dataTask
)
private let mockMetrics = LoggerStore.preview.entity(for: .login).metrics!
#endif
// MARK: - ViewModel
@@ -132,25 +130,27 @@ struct NetworkInspectorTransferInfoViewModel {
let isUpload: Bool
init(empty: Bool) {
self.totalBytesSent = "–"
self.bodyBytesSent = "–"
self.headersBytesSent = "–"
self.totalBytesReceived = "–"
self.bodyBytesReceived = "–"
self.headersBytesReceived = "–"
self.isUpload = false
totalBytesSent = "–"
bodyBytesSent = "–"
headersBytesSent = "–"
totalBytesReceived = "–"
bodyBytesReceived = "–"
headersBytesReceived = "–"
isUpload = false
}
init(details: NetworkLoggerTransactionDetailedMetrics, taskType: NetworkLoggerTaskType) {
self.totalBytesSent = formatBytes(details.countOfRequestBodyBytesBeforeEncoding + details.countOfRequestHeaderBytesSent)
self.bodyBytesSent = formatBytes(details.countOfRequestBodyBytesSent)
self.headersBytesSent = formatBytes(details.countOfRequestHeaderBytesSent)
init(metrics: NetworkLoggerMetrics, taskType: NetworkLoggerTaskType) {
let transfer = metrics.transferSize
self.totalBytesReceived = formatBytes(details.countOfResponseBodyBytesReceived + details.countOfResponseHeaderBytesReceived)
self.bodyBytesReceived = formatBytes(details.countOfResponseBodyBytesReceived)
self.headersBytesReceived = formatBytes(details.countOfResponseHeaderBytesReceived)
totalBytesSent = formatBytes(transfer.totalBytesSent)
bodyBytesSent = formatBytes(transfer.bodyBytesSent)
headersBytesSent = formatBytes(transfer.headersBytesSent)
self.isUpload = taskType == .uploadTask
totalBytesReceived = formatBytes(transfer.totalBytesReceived)
bodyBytesReceived = formatBytes(transfer.bodyBytesReceived)
headersBytesReceived = formatBytes(transfer.headersBytesReceived)
isUpload = taskType == .uploadTask
}
}
@@ -57,8 +57,8 @@ final class NetworkInspectorSummaryViewModel: ObservableObject {
// MARK: - Header
var transferViewModel: NetworkInspectorTransferInfoViewModel? {
details.lastTransactionDetails.map {
NetworkInspectorTransferInfoViewModel(details: $0, taskType: request.taskType ?? .dataTask)
details.metrics.map {
NetworkInspectorTransferInfoViewModel(metrics: $0, taskType: request.taskType ?? .dataTask)
}
}
@@ -15,7 +15,6 @@ final class DecodedNetworkRequestDetailsEntity {
private(set) lazy var response = decode(NetworkLoggerResponse.self, from: details.response)
private(set) lazy var error = decode(NetworkLoggerError.self, from: details.error)
private(set) lazy var metrics = decode(NetworkLoggerMetrics.self, from: details.metrics)
private(set) lazy var lastTransactionDetails = decode(NetworkLoggerTransactionDetailedMetrics.self, from: details.lastTransactionDetails)
init(request: LoggerNetworkRequestEntity) {
self.details = request.details