Files
sing-box-for-apple/ApplicationLibrary/Service/ReportTransfer.swift
T
2026-04-23 08:12:53 +08:00

95 lines
2.6 KiB
Swift

import BinaryCodable
import Foundation
import Library
public enum ReportType: String, Codable {
case crash
case oom
public var directoryName: String {
switch self {
case .crash: return "crash_reports"
case .oom: return "oom_reports"
}
}
}
public enum ReportTransferMessageType: UInt8 {
case error = 0
case report = 1
case complete = 2
case ack = 3
}
public struct ReportTransferManifest: Codable {
public var reportType: ReportType
public var timestamp: TimeInterval
public var totalBytes: UInt64
public var files: [ReportTransferManifestFile]
public init(reportType: ReportType, timestamp: TimeInterval, totalBytes: UInt64, files: [ReportTransferManifestFile]) {
self.reportType = reportType
self.timestamp = timestamp
self.totalBytes = totalBytes
self.files = files
}
}
public struct ReportTransferManifestFile: Codable {
public var name: String
public var size: UInt64
public init(name: String, size: UInt64) {
self.name = name
self.size = size
}
}
public struct ReportTransferError: LocalizedError {
public let errorDescription: String?
public init(_ message: String) {
errorDescription = message
}
}
public enum ReportTransferService {
public static let applicationServiceName = "sing-box:report-transfer"
public static let fileChunkSize = 64 * 1024
}
public enum ReportTransferMessage {
public static func encodeReport(_ manifest: ReportTransferManifest) throws -> Data {
var data = Data([ReportTransferMessageType.report.rawValue])
try data.append(BinaryEncoder().encode(manifest))
return data
}
public static func encodeComplete() -> Data {
Data([ReportTransferMessageType.complete.rawValue])
}
public static func encodeAck() -> Data {
Data([ReportTransferMessageType.ack.rawValue])
}
public static func encodeError(_ message: String) -> Data {
var data = Data([ReportTransferMessageType.error.rawValue])
data.append(Data(message.utf8))
return data
}
public static func decodeType(_ data: Data) -> ReportTransferMessageType? {
guard !data.isEmpty else { return nil }
return ReportTransferMessageType(rawValue: data[0])
}
public static func decodeReport(_ data: Data) throws -> ReportTransferManifest {
try BinaryDecoder().decode(ReportTransferManifest.self, from: data.dropFirst())
}
public static func decodeError(_ data: Data) -> String {
String(data: data.dropFirst(), encoding: .utf8) ?? "Unknown error"
}
}