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 {
func didUpdateTraffic(up: Int, down: Int)
func didGetLog(log: String, level: String)
func didUpdateMemory(memory: Int64)
func streamStatusChanged()
}
@@ -85,11 +85,15 @@ class ApiRequest {
private var trafficWebSocket: WebSocket?
private var loggingWebSocket: WebSocket?
private var memoryWebSocket: WebSocket?
private var trafficWebSocketRetryDelay: TimeInterval = 1
private var loggingWebSocketRetryDelay: TimeInterval = 1
private var memoryWebSocketRetryDelay: TimeInterval = 1
private var trafficWebSocketRetryTimer: Timer?
private var loggingWebSocketRetryTimer: Timer?
private var memoryWebSocketRetryTimer: Timer?
private var alamoFireManager: Session
@@ -428,6 +432,7 @@ extension ApiRequest {
func resetStreamApis() {
resetLogStreamApi()
resetTrafficStreamApi()
resetMemoryStreamApi()
}
func resetLogStreamApi() {
@@ -444,6 +449,13 @@ extension ApiRequest {
requestTrafficInfo()
}
func resetMemoryStreamApi() {
memoryWebSocketRetryTimer?.invalidate()
memoryWebSocketRetryTimer = nil
memoryWebSocketRetryDelay = 1
requestMemoryInfo()
}
private func requestTrafficInfo() {
trafficWebSocketRetryTimer?.invalidate()
trafficWebSocketRetryTimer = nil
@@ -474,20 +486,40 @@ extension ApiRequest {
socket.connect()
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 {
func websocketDidConnect(socket: WebSocketClient) {
guard let webSocket = socket as? WebSocket else { return }
if webSocket == trafficWebSocket {
switch webSocket {
case trafficWebSocket:
trafficWebSocketRetryDelay = 1
Logger.log("trafficWebSocket did Connect", level: .debug)
ConfigManager.shared.isRunning = true
delegate?.streamStatusChanged()
} else {
case loggingWebSocket:
loggingWebSocketRetryDelay = 1
Logger.log("loggingWebSocket did Connect", level: .debug)
case memoryWebSocket:
memoryWebSocketRetryDelay = 1
Logger.log("memoryWebSocket did Connect", level: .debug)
default:
return
}
}
@@ -506,7 +538,8 @@ extension ApiRequest: WebSocketDelegate {
guard let webSocket = socket as? WebSocket else { return }
if webSocket == trafficWebSocket {
switch webSocket {
case trafficWebSocket:
Logger.log("trafficWebSocket did disconnect", level: .debug)
trafficWebSocketRetryTimer?.invalidate()
@@ -517,7 +550,7 @@ extension ApiRequest: WebSocketDelegate {
self?.requestTrafficInfo()
})
trafficWebSocketRetryDelay *= 2
} else {
case loggingWebSocket:
Logger.log("loggingWebSocket did disconnect", level: .debug)
loggingWebSocketRetryTimer =
Timer.scheduledTimer(withTimeInterval: loggingWebSocketRetryDelay, repeats: false, block: {
@@ -526,16 +559,36 @@ extension ApiRequest: WebSocketDelegate {
self?.requestLog()
})
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) {
guard let webSocket = socket as? WebSocket else { return }
let json = JSON(parseJSON: text)
if webSocket == trafficWebSocket {
switch webSocket {
case trafficWebSocket:
delegate?.didUpdateTraffic(up: json["up"].intValue, down: json["down"].intValue)
} else {
case loggingWebSocket:
delegate?.didGetLog(log: json["payload"].stringValue, level: json["type"].string ?? "info")
case memoryWebSocket:
delegate?.didUpdateMemory(memory: json["inuse"].int64Value)
default:
return
}
}