mirror of
https://github.com/yJason/ClashX-Dashboard.git
synced 2026-02-04 10:02:26 +08:00
feat: memory api
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user