feat: Added stats stream for ios

This commit is contained in:
hiddify
2023-12-27 01:01:56 +03:30
parent 90ae1e180c
commit 92d6f627f0
4 changed files with 69 additions and 2 deletions

View File

@@ -30,6 +30,7 @@
073695782B39DB2B007249BE /* Libcore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 073695722B39DA23007249BE /* Libcore.xcframework */; }; 073695782B39DB2B007249BE /* Libcore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 073695722B39DA23007249BE /* Libcore.xcframework */; };
073695882B3AC757007249BE /* Libcore.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 073695722B39DA23007249BE /* Libcore.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 073695882B3AC757007249BE /* Libcore.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 073695722B39DA23007249BE /* Libcore.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
0736958B2B3AC96D007249BE /* Bundle+Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0736958A2B3AC96D007249BE /* Bundle+Properties.swift */; }; 0736958B2B3AC96D007249BE /* Bundle+Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0736958A2B3AC96D007249BE /* Bundle+Properties.swift */; };
0736958D2B3B79E0007249BE /* StatsEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0736958C2B3B79E0007249BE /* StatsEventHandler.swift */; };
075637BA2B01583F005AFB8E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60F1D4AAC33ACF5C8307310D /* Pods_Runner.framework */; }; 075637BA2B01583F005AFB8E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60F1D4AAC33ACF5C8307310D /* Pods_Runner.framework */; };
075637BB2B01583F005AFB8E /* Pods_Runner.framework in Embed Frameworks (2 items) */ = {isa = PBXBuildFile; fileRef = 60F1D4AAC33ACF5C8307310D /* Pods_Runner.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 075637BB2B01583F005AFB8E /* Pods_Runner.framework in Embed Frameworks (2 items) */ = {isa = PBXBuildFile; fileRef = 60F1D4AAC33ACF5C8307310D /* Pods_Runner.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
075637BC2B015864005AFB8E /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03E392B72ADDA00E000ADF15 /* NetworkExtension.framework */; }; 075637BC2B015864005AFB8E /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03E392B72ADDA00E000ADF15 /* NetworkExtension.framework */; };
@@ -130,6 +131,7 @@
073695722B39DA23007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = "<group>"; }; 073695722B39DA23007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = "<group>"; };
0736957A2B39DE78007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = "<group>"; }; 0736957A2B39DE78007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = "<group>"; };
0736958A2B3AC96D007249BE /* Bundle+Properties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Properties.swift"; sourceTree = "<group>"; }; 0736958A2B3AC96D007249BE /* Bundle+Properties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Properties.swift"; sourceTree = "<group>"; };
0736958C2B3B79E0007249BE /* StatsEventHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsEventHandler.swift; sourceTree = "<group>"; };
075637B22B0157CB005AFB8E /* libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libcore.xcframework; path = ../libcore/bin/libcore.xcframework; sourceTree = "<group>"; }; 075637B22B0157CB005AFB8E /* libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libcore.xcframework; path = ../libcore/bin/libcore.xcframework; sourceTree = "<group>"; };
07A63A832B1E728C00CAFA4D /* Release */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Release; path = ../build/ios/framework/release; sourceTree = "<group>"; }; 07A63A832B1E728C00CAFA4D /* Release */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Release; path = ../build/ios/framework/release; sourceTree = "<group>"; };
07A63A842B1E72AE00CAFA4D /* App.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = App.xcframework; path = ../build/ios/framework/release/App.xcframework; sourceTree = "<group>"; }; 07A63A842B1E72AE00CAFA4D /* App.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = App.xcframework; path = ../build/ios/framework/release/App.xcframework; sourceTree = "<group>"; };
@@ -229,6 +231,7 @@
03B5166A2AE7315E00EA47E2 /* AlertsEventHandler.swift */, 03B5166A2AE7315E00EA47E2 /* AlertsEventHandler.swift */,
03B5166C2AE7325500EA47E2 /* LogsEventHandler.swift */, 03B5166C2AE7325500EA47E2 /* LogsEventHandler.swift */,
03B5167C2AE7AC6200EA47E2 /* GroupsEventHandler.swift */, 03B5167C2AE7AC6200EA47E2 /* GroupsEventHandler.swift */,
0736958C2B3B79E0007249BE /* StatsEventHandler.swift */,
); );
path = Handlers; path = Handlers;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -674,6 +677,7 @@
03B516712AE74CCD00EA47E2 /* VPNConfig.swift in Sources */, 03B516712AE74CCD00EA47E2 /* VPNConfig.swift in Sources */,
03B5166B2AE7315E00EA47E2 /* AlertsEventHandler.swift in Sources */, 03B5166B2AE7315E00EA47E2 /* AlertsEventHandler.swift in Sources */,
0736958B2B3AC96D007249BE /* Bundle+Properties.swift in Sources */, 0736958B2B3AC96D007249BE /* Bundle+Properties.swift in Sources */,
0736958D2B3B79E0007249BE /* StatsEventHandler.swift in Sources */,
03B516692AE7306B00EA47E2 /* StatusEventHandler.swift in Sources */, 03B516692AE7306B00EA47E2 /* StatusEventHandler.swift in Sources */,
032158B82ADDF8BF008D943B /* VPNManager.swift in Sources */, 032158B82ADDF8BF008D943B /* VPNManager.swift in Sources */,
03B516672AE6B93A00EA47E2 /* MethodHandler.swift in Sources */, 03B516672AE6B93A00EA47E2 /* MethodHandler.swift in Sources */,

View File

@@ -27,6 +27,7 @@ import Libcore
AlertsEventHandler.register(with: self.registrar(forPlugin: AlertsEventHandler.name)!) AlertsEventHandler.register(with: self.registrar(forPlugin: AlertsEventHandler.name)!)
LogsEventHandler.register(with: self.registrar(forPlugin: LogsEventHandler.name)!) LogsEventHandler.register(with: self.registrar(forPlugin: LogsEventHandler.name)!)
GroupsEventHandler.register(with: self.registrar(forPlugin: GroupsEventHandler.name)!) GroupsEventHandler.register(with: self.registrar(forPlugin: GroupsEventHandler.name)!)
StatsEventHandler.register(with: self.registrar(forPlugin: StatsEventHandler.name)!)
} }
} }

View File

@@ -33,8 +33,8 @@ public class GroupsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler,
private var channel: FlutterEventChannel? private var channel: FlutterEventChannel?
var commandClient: LibboxCommandClient? private var commandClient: LibboxCommandClient?
var events: FlutterEventSink? private var events: FlutterEventSink?
public static func register(with registrar: FlutterPluginRegistrar) { public static func register(with registrar: FlutterPluginRegistrar) {
let instance = GroupsEventHandler() let instance = GroupsEventHandler()

View File

@@ -6,3 +6,65 @@
// //
import Foundation import Foundation
import Flutter
import Libcore
public class StatsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, LibboxCommandClientHandlerProtocol {
static let name = "\(Bundle.main.serviceIdentifier)/stats"
private var channel: FlutterEventChannel?
private var commandClient: LibboxCommandClient?
private var events: FlutterEventSink?
public static func register(with registrar: FlutterPluginRegistrar) {
let instance = StatsEventHandler()
instance.channel = FlutterEventChannel(name: Self.name, binaryMessenger: registrar.messenger())
instance.channel?.setStreamHandler(instance)
}
public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
FileManager.default.changeCurrentDirectoryPath(FilePath.sharedDirectory.path)
self.events = events
let opts = LibboxCommandClientOptions()
opts.command = LibboxCommandStatus
opts.statusInterval = 300
commandClient = LibboxCommandClient(self, options: opts)
try? commandClient?.connect()
return nil
}
public func onCancel(withArguments arguments: Any?) -> FlutterError? {
try? commandClient?.disconnect()
return nil
}
public func writeStatus(_ message: LibboxStatusMessage?) {
guard
let message
else { return }
let data = [
"connections-in": message.connectionsIn,
"connections-out": message.connectionsOut,
"uplink": message.uplink,
"downlink": message.downlink,
"uplink-total": message.uplinkTotal,
"downlink-total": message.downlinkTotal
] as [String:Any]
guard
let json = try? JSONSerialization.data(withJSONObject: data),
let json = String(data: json, encoding: .utf8)
else { return }
events?(json)
}
}
extension StatsEventHandler {
public func clearLog() {}
public func connected() {}
public func disconnected(_ message: String?) {}
public func initializeClashMode(_ modeList: LibboxStringIteratorProtocol?, currentMode: String?) {}
public func updateClashMode(_ newMode: String?) {}
public func writeGroups(_ message: LibboxOutboundGroupIteratorProtocol?) {}
public func writeLog(_ message: String?) {}
}