fix SuperClient

This commit is contained in:
anlicheng 2026-05-22 15:34:42 +08:00
parent a648fb2204
commit b984f7e4e9
2 changed files with 41 additions and 45 deletions

View File

@ -8,20 +8,6 @@
import Foundation
import Network
// 便
enum SDLSuperError: Error {
case connectionFailed(Error)
case connectionCancelled
case writeFailed(Error)
case internalError(Error)
case timeout
case decodeError(String)
case packetTooLarge
case dataStreamClosed
}
actor SDLSuperClient {
enum State {
case idle
@ -33,30 +19,24 @@ actor SDLSuperClient {
private let frameParser: SDLSuperFrameParser
private let queue = DispatchQueue(label: "com.sdl.SuperClient.queue") // 线
//
public var messageStream: AsyncThrowingStream<SDLQUICInboundMessage, Error>
public let messageStream: AsyncThrowingStream<SDLQUICInboundMessage, Error>
private let messageCont: AsyncThrowingStream<SDLQUICInboundMessage, Error>.Continuation
private var isMessageContinuationFinished: Bool = false
private var readTask: Task<Void, Never>?
private var connection: NWConnection?
private let serverEndpoint: SDLConfiguration.ResolvedServerEndpoint
private let port: UInt16
private let connection: NWConnection
init(serverEndpoint: SDLConfiguration.ResolvedServerEndpoint, port: UInt16, maxBufferSize: Int = 2 * 1024 * 1024) {
self.serverEndpoint = serverEndpoint
self.port = port
self.frameParser = SDLSuperFrameParser(maxBufferSize: maxBufferSize)
(self.messageStream, self.messageCont) = AsyncThrowingStream.makeStream(of: SDLQUICInboundMessage.self)
}
func start() {
let serverEndpoint = self.serverEndpoint
let queue = DispatchQueue(label: "com.sdl.SuperClient.queue") // 线
let pairs = AsyncThrowingStream.makeStream(of: SDLQUICInboundMessage.self)
self.messageStream = pairs.stream
self.messageCont = pairs.continuation
let options = NWProtocolTLS.Options()
serverEndpoint.host.withCString {
sec_protocol_options_set_tls_server_name(options.securityProtocolOptions, $0)
@ -81,17 +61,17 @@ actor SDLSuperClient {
// Network.framework
params.preferNoProxies = true
let connection = NWConnection(host: Self.makeEndpointHost(address: serverEndpoint.ip), port: .init(rawValue: port)!, using: params)
connection.stateUpdateHandler = { [weak self] state in
self.connection = NWConnection(host: Self.makeEndpointHost(address: serverEndpoint.ip), port: .init(rawValue: port)!, using: params)
}
func start() {
self.connection.stateUpdateHandler = { [weak self] state in
SDLLogger.log("[SDLSuperClient] new state: \(state)", for: .debug)
Task {
await self?.handleConnectionState(state: state)
}
}
connection.start(queue: queue)
self.connection = connection
self.connection.start(queue: queue)
}
private static func makeEndpointHost(address ip: String) -> NWEndpoint.Host {
@ -135,11 +115,12 @@ actor SDLSuperClient {
private func startReadTask() {
self.readTask?.cancel()
self.readTask = Task {
do {
while true {
try Task.checkCancellation()
let data = try await self.readOnce()
let data = try await Self.readOnce(connection: self.connection)
let frames = try self.frameParser.parseFrames(data: data)
for frame in frames {
try Task.checkCancellation()
@ -157,7 +138,7 @@ actor SDLSuperClient {
}
func send(type: SDLPacketType, data: Data) {
guard case .running = state, let connection = self.connection, connection.state == .ready else {
guard case .running = state, connection.state == .ready else {
return
}
@ -176,11 +157,7 @@ actor SDLSuperClient {
})
}
private func readOnce() async throws -> Data {
guard let connection = self.connection else {
throw SDLSuperError.connectionCancelled
}
private static func readOnce(connection: NWConnection) async throws -> Data {
let readContinuation = OnceContinuation<Data, Error>()
return try await withTaskCancellationHandler {
@ -215,9 +192,8 @@ actor SDLSuperClient {
self.readTask = nil
let connection = self.connection
self.connection = nil
connection?.stateUpdateHandler = nil
connection?.cancel()
connection.stateUpdateHandler = nil
connection.cancel()
self.finishMessageContinuationIfNeed(throwing: nil)

View File

@ -0,0 +1,20 @@
//
// SDLSuperError.swift
// punchnet
//
// Created by on 2026/5/22.
//
import Foundation
// 便
enum SDLSuperError: Error {
case connectionFailed(Error)
case connectionCancelled
case writeFailed(Error)
case internalError(Error)
case packetTooLarge
case decodeError(String)
case dataStreamClosed
}