修改部分状态不一致的问题
This commit is contained in:
parent
3d551a9bcf
commit
7ce880f3dc
@ -14,7 +14,7 @@ enum TunnelError: Error {
|
||||
|
||||
class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||
var contextActor: SDLContextActor?
|
||||
private var rootTask: Task<Void, Error>?
|
||||
private var rootTask: Task<Void, Never>?
|
||||
|
||||
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
|
||||
// 重置通知中心
|
||||
@ -29,17 +29,24 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||
// 加密算法
|
||||
let rsaCipher = try! CCRSACipher(keySize: 1024)
|
||||
self.rootTask = Task {
|
||||
do {
|
||||
// host: "192.168.0.101", port: 1265
|
||||
guard let options, let config = await SDLConfiguration.parse(options: options) else {
|
||||
completionHandler(TunnelError.invalidConfiguration)
|
||||
return
|
||||
}
|
||||
|
||||
self.contextActor = SDLContextActor(provider: self, config: config, rsaCipher: rsaCipher)
|
||||
await self.contextActor?.start()
|
||||
try await self.contextActor?.waitForReady()
|
||||
let contextActor = SDLContextActor(provider: self, config: config, rsaCipher: rsaCipher)
|
||||
self.contextActor = contextActor
|
||||
await contextActor.start()
|
||||
try await contextActor.waitForReady(timeout: .seconds(30))
|
||||
|
||||
completionHandler(nil)
|
||||
} catch {
|
||||
await self.contextActor?.stop()
|
||||
self.contextActor = nil
|
||||
completionHandler(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -186,6 +186,22 @@ actor SDLContextActor {
|
||||
}
|
||||
}
|
||||
|
||||
public func waitForReady(timeout: Duration) async throws {
|
||||
let timeoutTask = Task {
|
||||
try? await Task.sleep(for: timeout)
|
||||
if Task.isCancelled {
|
||||
return
|
||||
}
|
||||
|
||||
await self.handleReadyTimeout()
|
||||
}
|
||||
defer {
|
||||
timeoutTask.cancel()
|
||||
}
|
||||
|
||||
try await self.waitForReady()
|
||||
}
|
||||
|
||||
// 取消出口节点的时候,ip地址为: 0.0.0.0
|
||||
public func updateExitNode(exitNodeIp: String) async throws {
|
||||
if let ip = SDLUtil.ipv4StrToInt32(exitNodeIp), ip > 0 {
|
||||
@ -418,6 +434,9 @@ actor SDLContextActor {
|
||||
self.registerTask?.cancel()
|
||||
self.registerTask = nil
|
||||
|
||||
self.stunRequestTask?.cancel()
|
||||
self.stunRequestTask = nil
|
||||
|
||||
self.updatePolicyTask?.cancel()
|
||||
self.updatePolicyTask = nil
|
||||
|
||||
@ -451,6 +470,9 @@ actor SDLContextActor {
|
||||
|
||||
// MARK: -- StunRequestTask
|
||||
private func startStunRequestTask(welcome: SDLWelcome) async {
|
||||
self.stunRequestTask?.cancel()
|
||||
self.stunRequestTask = nil
|
||||
|
||||
await self.ipv6AssistClient?.stop()
|
||||
self.ipv6AssistClient = SDLIPV6AssistClient(assistServerInfo: welcome.ipv6Assist)
|
||||
await self.ipv6AssistClient?.start()
|
||||
@ -462,6 +484,10 @@ actor SDLContextActor {
|
||||
timerStream.start(interval: .seconds(8))
|
||||
|
||||
for await _ in timerStream.stream {
|
||||
if Task.isCancelled {
|
||||
break
|
||||
}
|
||||
|
||||
let probeReply = try? await self.ipv6AssistClient?.probe(requestTimeout: .seconds(3))
|
||||
if let v6Info = probeReply?.v6Info, let v6Address = SDLUtil.ipv6DataToString(v6Info.v6) {
|
||||
SDLLogger.log("[SDLContext] probe ipv6 address: \(v6Address)")
|
||||
@ -645,6 +671,24 @@ actor SDLContextActor {
|
||||
self.resumeReadyWaiters(.success(()))
|
||||
}
|
||||
|
||||
private func handleReadyTimeout() {
|
||||
switch self.readyState {
|
||||
case .idle, .starting:
|
||||
break
|
||||
case .ready, .failed, .stopped:
|
||||
return
|
||||
}
|
||||
|
||||
let error = NSError(
|
||||
domain: "com.jihe.punchnet.tun",
|
||||
code: -3,
|
||||
userInfo: [NSLocalizedDescriptionKey: "Tunnel startup timed out"]
|
||||
)
|
||||
SDLLogger.log("[SDLContext] wait ready timeout")
|
||||
self.failReady(error)
|
||||
self.provider.cancelTunnelWithError(error)
|
||||
}
|
||||
|
||||
private func failReady(_ error: any Error) {
|
||||
switch self.readyState {
|
||||
case .ready, .failed, .stopped:
|
||||
|
||||
@ -62,7 +62,7 @@ final class SDLSuperRegistrationStateMachine {
|
||||
}
|
||||
|
||||
func handleRetryableNak() {
|
||||
self.state = .failed
|
||||
self.state = .registering
|
||||
}
|
||||
|
||||
func handleFailure() {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user