feat: memory api

This commit is contained in:
mrFq1
2023-05-29 20:13:12 +08:00
parent 30922826e8
commit b49cc39c78

View File

@@ -15,7 +15,7 @@ import SwiftUI
protocol ApiRequestStreamDelegate: AnyObject { protocol ApiRequestStreamDelegate: AnyObject {
func didUpdateTraffic(up: Int, down: Int) func didUpdateTraffic(up: Int, down: Int)
func didGetLog(log: String, level: String) func didGetLog(log: String, level: String)
func didUpdateMemory(memory: Int64)
func streamStatusChanged() func streamStatusChanged()
} }
@@ -85,11 +85,15 @@ class ApiRequest {
private var trafficWebSocket: WebSocket? private var trafficWebSocket: WebSocket?
private var loggingWebSocket: WebSocket? private var loggingWebSocket: WebSocket?
private var memoryWebSocket: WebSocket?
private var trafficWebSocketRetryDelay: TimeInterval = 1 private var trafficWebSocketRetryDelay: TimeInterval = 1
private var loggingWebSocketRetryDelay: TimeInterval = 1 private var loggingWebSocketRetryDelay: TimeInterval = 1
private var memoryWebSocketRetryDelay: TimeInterval = 1
private var trafficWebSocketRetryTimer: Timer? private var trafficWebSocketRetryTimer: Timer?
private var loggingWebSocketRetryTimer: Timer? private var loggingWebSocketRetryTimer: Timer?
private var memoryWebSocketRetryTimer: Timer?
private var alamoFireManager: Session private var alamoFireManager: Session
@@ -428,6 +432,7 @@ extension ApiRequest {
func resetStreamApis() { func resetStreamApis() {
resetLogStreamApi() resetLogStreamApi()
resetTrafficStreamApi() resetTrafficStreamApi()
resetMemoryStreamApi()
} }
func resetLogStreamApi() { func resetLogStreamApi() {
@@ -443,6 +448,13 @@ extension ApiRequest {
trafficWebSocketRetryDelay = 1 trafficWebSocketRetryDelay = 1
requestTrafficInfo() requestTrafficInfo()
} }
func resetMemoryStreamApi() {
memoryWebSocketRetryTimer?.invalidate()
memoryWebSocketRetryTimer = nil
memoryWebSocketRetryDelay = 1
requestMemoryInfo()
}
private func requestTrafficInfo() { private func requestTrafficInfo() {
trafficWebSocketRetryTimer?.invalidate() trafficWebSocketRetryTimer?.invalidate()
@@ -474,21 +486,41 @@ extension ApiRequest {
socket.connect() socket.connect()
loggingWebSocket = socket loggingWebSocket = socket
} }
private func requestMemoryInfo() {
memoryWebSocketRetryTimer?.invalidate()
memoryWebSocketRetryTimer = nil
memoryWebSocket?.disconnect(forceTimeout: 1)
let socket = WebSocket(url: URL(string: ConfigManager.apiUrl.appending("/memory"))!)
for header in ApiRequest.authHeader() {
socket.request.setValue(header.value, forHTTPHeaderField: header.name)
}
socket.delegate = self
socket.connect()
memoryWebSocket = socket
}
} }
extension ApiRequest: WebSocketDelegate { extension ApiRequest: WebSocketDelegate {
func websocketDidConnect(socket: WebSocketClient) { func websocketDidConnect(socket: WebSocketClient) {
guard let webSocket = socket as? WebSocket else { return } guard let webSocket = socket as? WebSocket else { return }
if webSocket == trafficWebSocket { switch webSocket {
trafficWebSocketRetryDelay = 1 case trafficWebSocket:
Logger.log("trafficWebSocket did Connect", level: .debug) trafficWebSocketRetryDelay = 1
Logger.log("trafficWebSocket did Connect", level: .debug)
ConfigManager.shared.isRunning = true ConfigManager.shared.isRunning = true
delegate?.streamStatusChanged() delegate?.streamStatusChanged()
} else { case loggingWebSocket:
loggingWebSocketRetryDelay = 1 loggingWebSocketRetryDelay = 1
Logger.log("loggingWebSocket did Connect", level: .debug) Logger.log("loggingWebSocket did Connect", level: .debug)
} case memoryWebSocket:
memoryWebSocketRetryDelay = 1
Logger.log("memoryWebSocket did Connect", level: .debug)
default:
return
}
} }
func websocketDidDisconnect(socket: WebSocketClient, error: Error?) { func websocketDidDisconnect(socket: WebSocketClient, error: Error?) {
@@ -506,37 +538,58 @@ extension ApiRequest: WebSocketDelegate {
guard let webSocket = socket as? WebSocket else { return } guard let webSocket = socket as? WebSocket else { return }
if webSocket == trafficWebSocket { switch webSocket {
Logger.log("trafficWebSocket did disconnect", level: .debug) case trafficWebSocket:
Logger.log("trafficWebSocket did disconnect", level: .debug)
trafficWebSocketRetryTimer?.invalidate() trafficWebSocketRetryTimer?.invalidate()
trafficWebSocketRetryTimer = trafficWebSocketRetryTimer =
Timer.scheduledTimer(withTimeInterval: trafficWebSocketRetryDelay, repeats: false, block: { Timer.scheduledTimer(withTimeInterval: trafficWebSocketRetryDelay, repeats: false, block: {
[weak self] _ in [weak self] _ in
if self?.trafficWebSocket?.isConnected == true { return } if self?.trafficWebSocket?.isConnected == true { return }
self?.requestTrafficInfo() self?.requestTrafficInfo()
}) })
trafficWebSocketRetryDelay *= 2 trafficWebSocketRetryDelay *= 2
} else { case loggingWebSocket:
Logger.log("loggingWebSocket did disconnect", level: .debug) Logger.log("loggingWebSocket did disconnect", level: .debug)
loggingWebSocketRetryTimer = loggingWebSocketRetryTimer =
Timer.scheduledTimer(withTimeInterval: loggingWebSocketRetryDelay, repeats: false, block: { Timer.scheduledTimer(withTimeInterval: loggingWebSocketRetryDelay, repeats: false, block: {
[weak self] _ in [weak self] _ in
if self?.loggingWebSocket?.isConnected == true { return } if self?.loggingWebSocket?.isConnected == true { return }
self?.requestLog() self?.requestLog()
}) })
loggingWebSocketRetryDelay *= 2 loggingWebSocketRetryDelay *= 2
} case memoryWebSocket:
Logger.log("memoryWebSocket did disconnect", level: .debug)
memoryWebSocketRetryTimer =
Timer.scheduledTimer(withTimeInterval: memoryWebSocketRetryDelay, repeats: false, block: {
[weak self] _ in
if self?.memoryWebSocket?.isConnected == true { return }
self?.requestMemoryInfo()
})
memoryWebSocketRetryDelay *= 2
default:
return
}
} }
func websocketDidReceiveMessage(socket: WebSocketClient, text: String) { func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
guard let webSocket = socket as? WebSocket else { return } guard let webSocket = socket as? WebSocket else { return }
let json = JSON(parseJSON: text) let json = JSON(parseJSON: text)
if webSocket == trafficWebSocket {
delegate?.didUpdateTraffic(up: json["up"].intValue, down: json["down"].intValue)
} else { switch webSocket {
delegate?.didGetLog(log: json["payload"].stringValue, level: json["type"].string ?? "info") case trafficWebSocket:
} delegate?.didUpdateTraffic(up: json["up"].intValue, down: json["down"].intValue)
case loggingWebSocket:
delegate?.didGetLog(log: json["payload"].stringValue, level: json["type"].string ?? "info")
case memoryWebSocket:
delegate?.didUpdateMemory(memory: json["inuse"].int64Value)
default:
return
}
} }
func websocketDidReceiveData(socket: WebSocketClient, data: Data) {} func websocketDidReceiveData(socket: WebSocketClient, data: Data) {}