From 721087a223bff2cead08f973bfbd332bf6e6e058 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 15 Apr 2026 15:34:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=B6=88=E6=81=AF=E4=BC=A0?= =?UTF-8?q?=E9=80=92=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/PacketTunnelProvider.swift | 29 +++++++++------- Tun/Punchnet/Actors/SDLContextActor.swift | 11 +++---- Tun/Punchnet/SDLTunnelAppNotifier.swift | 33 +++++-------------- .../SDLTunnelAppEventStore.swift | 17 ++-------- punchnet/Views/AppContext.swift | 10 +++--- punchnet/Views/Network/NetworkView.swift | 2 +- 6 files changed, 39 insertions(+), 63 deletions(-) diff --git a/Tun/PacketTunnelProvider.swift b/Tun/PacketTunnelProvider.swift index 62a43fd..06360e7 100644 --- a/Tun/PacketTunnelProvider.swift +++ b/Tun/PacketTunnelProvider.swift @@ -60,11 +60,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider { // Add code here to handle the message. Task { do { - let message = try NEMessage(serializedBytes: messageData) - let replyData = try await self.handleAppEvent(message: message) + let message = try AppRequest(serializedBytes: messageData) + let replyData = try await self.handleAppRequest(message: message) completionHandler?(replyData) } catch let err { - var reply = NEReply() + var reply = TunnelResponse() reply.code = 1 reply.message = err.localizedDescription @@ -83,26 +83,33 @@ class PacketTunnelProvider: NEPacketTunnelProvider { // Add code here to wake up. } - private func handleAppEvent(message: NEMessage) async throws -> Data? { - switch message.message { - case .exitNodeIpChanged(let exitNodeIpChanged): - let exitNodeIp = exitNodeIpChanged.ip + private func handleAppRequest(message: AppRequest) async throws -> Data? { + guard let contextActor = self.contextActor else { + throw TunnelError.invalidContext + } + + switch message.command { + case .changeExitNode(let changeExitNode): + let exitNodeIp = changeExitNode.ip do { - try await self.contextActor?.updateExitNode(exitNodeIp: exitNodeIp) - var reply = NEReply() + try await contextActor.updateExitNode(exitNodeIp: exitNodeIp) + var reply = TunnelResponse() reply.code = 0 reply.message = "操作成功" return try reply.serializedData() } catch let err { - var reply = NEReply() + var reply = TunnelResponse() reply.code = 1 reply.message = err.localizedDescription return try reply.serializedData() } case .none: - return nil + var reply = TunnelResponse() + reply.code = 1 + reply.message = "无效请求" + return try reply.serializedData() } } diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index 7ed60e1..0b354c0 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -381,10 +381,9 @@ actor SDLContextActor { self.dataCipher = nil } - private func publishTunnelEvent(level: SDLTunnelAppNotifier.Event.Level = .error, - code: Int? = nil, + private func publishTunnelEvent(code: Int? = nil, message: String) { - SDLTunnelAppNotifier.shared.publish(level: level, code: code, message: message) + SDLTunnelAppNotifier.shared.publish(code: code, message: message) } private func setNatType(natType: SDLNATProberActor.NatType) { @@ -706,7 +705,7 @@ extension SDLContextActor { switch errorCode { case .invalidToken, .nodeDisabled: self.superRegistrationStateMachine.handleFailure() - self.publishTunnelEvent(level: .fatal, code: Int(errorCode.rawValue), message: errorMessage) + self.publishTunnelEvent(code: Int(errorCode.rawValue), message: errorMessage) // 报告错误并退出 let error = NSError(domain: "com.jihe.punchnet.tun", code: -1) self.failReady(error) @@ -714,7 +713,7 @@ extension SDLContextActor { case .noIpAddress, .networkFault, .internalFault: self.superRegistrationStateMachine.handleRetryableNak() - self.publishTunnelEvent(level: .warning, code: Int(errorCode.rawValue), message: errorMessage) + self.publishTunnelEvent(code: Int(errorCode.rawValue), message: errorMessage) } SDLLogger.log("[SDLContext] Get a SuperNak message exit") @@ -735,7 +734,7 @@ extension SDLContextActor { self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress) } case .shutdown(let message): - self.publishTunnelEvent(level: .fatal, message: message) + self.publishTunnelEvent(message: message) // 报告错误并退出 let error = NSError(domain: "com.jihe.punchnet.tun", code: -2) diff --git a/Tun/Punchnet/SDLTunnelAppNotifier.swift b/Tun/Punchnet/SDLTunnelAppNotifier.swift index 6945bbf..1bea8cb 100644 --- a/Tun/Punchnet/SDLTunnelAppNotifier.swift +++ b/Tun/Punchnet/SDLTunnelAppNotifier.swift @@ -8,21 +8,6 @@ import Foundation final class SDLTunnelAppNotifier { - struct Event: Codable, Sendable { - enum Level: String, Codable, Sendable { - case info - case warning - case error - case fatal - } - - let id: String - let timestamp: TimeInterval - let level: Level - let code: Int? - let message: String - } - static let shared = SDLTunnelAppNotifier() private let suiteName: String @@ -34,20 +19,18 @@ final class SDLTunnelAppNotifier { self.eventKey = eventKey } - func publish(level: Event.Level = .error, code: Int? = nil, message: String) { - let event = Event( - id: UUID().uuidString, - timestamp: Date().timeIntervalSince1970, - level: level, - code: code, - message: message - ) + func publish(code: Int? = nil, message: String) { + var event = TunnelEvent() + event.id = UUID().uuidString + event.timestampMs = UInt64(Date().timeIntervalSince1970 * 1000) + event.code = Int32(clamping: code ?? 0) + event.message = message self.publish(event) } - func publish(_ event: Event) { + func publish(_ event: TunnelEvent) { guard let shared = UserDefaults(suiteName: self.suiteName), - let data = try? JSONEncoder().encode(event) else { + let data = try? event.serializedData() else { return } diff --git a/punchnet/AppEventCenter/SDLTunnelAppEventStore.swift b/punchnet/AppEventCenter/SDLTunnelAppEventStore.swift index cda85cf..07fe10b 100644 --- a/punchnet/AppEventCenter/SDLTunnelAppEventStore.swift +++ b/punchnet/AppEventCenter/SDLTunnelAppEventStore.swift @@ -8,25 +8,12 @@ import Foundation struct SDLTunnelAppEventStore { - struct Event: Codable, Sendable, Identifiable { - enum Level: String, Codable, Sendable { - case info - case warning - case error - case fatal - } - - let id: String - let timestamp: TimeInterval - let level: Level - let code: Int? - let message: String - } + typealias Event = TunnelEvent static func loadLatestEvent() -> Event? { guard let shared = UserDefaults(suiteName: SDLNotificationCenter.Configuration.appGroupSuiteName), let data = shared.data(forKey: SDLNotificationCenter.Configuration.latestEventKey), - let event = try? JSONDecoder().decode(Event.self, from: data) else { + let event = try? Event(serializedBytes: data) else { return nil } diff --git a/punchnet/Views/AppContext.swift b/punchnet/Views/AppContext.swift index 25b02b9..8f5abe7 100644 --- a/punchnet/Views/AppContext.swift +++ b/punchnet/Views/AppContext.swift @@ -108,13 +108,13 @@ class AppContext { throw AppContextError(message: "网络未连接") } - var exitNodeIpChanged = NEMessage.ExitNodeIpChanged() - exitNodeIpChanged.ip = exitNodeIp + var changeExitNode = AppRequest.ChangeExitNodeRequest() + changeExitNode.ip = exitNodeIp - var neMessage = NEMessage() - neMessage.message = .exitNodeIpChanged(exitNodeIpChanged) + var appRequest = AppRequest() + appRequest.command = .changeExitNode(changeExitNode) - let message = try neMessage.serializedData() + let message = try appRequest.serializedData() return try await self.vpnManager.sendMessage(message) } diff --git a/punchnet/Views/Network/NetworkView.swift b/punchnet/Views/Network/NetworkView.swift index b451337..04c12e8 100644 --- a/punchnet/Views/Network/NetworkView.swift +++ b/punchnet/Views/Network/NetworkView.swift @@ -163,7 +163,7 @@ struct NetworkStatusBar: View { Button { Task { let result = try await self.appContext.changeExitNodeIp(exitNodeIp: self.exitNodeIp) - let reply = try NEReply(serializedBytes: result) + let reply = try TunnelResponse(serializedBytes: result) NSLog("change exit node ip: \(reply)") } } label: {