feat: Added stats stream for ios
This commit is contained in:
@@ -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 */,
|
||||||
|
|||||||
@@ -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)!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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?) {}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user