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 {
|
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) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user