fix
This commit is contained in:
parent
69815ab701
commit
0e455b187d
@ -34,6 +34,7 @@ actor SDLSuperService {
|
||||
do {
|
||||
try await session.run()
|
||||
self.clearCurrent(session, generation: generation)
|
||||
await session.stop()
|
||||
} catch is CancellationError {
|
||||
self.clearCurrent(session, generation: generation)
|
||||
await session.stop()
|
||||
|
||||
@ -22,13 +22,7 @@ final class SDLSuperSession: @unchecked Sendable {
|
||||
}
|
||||
|
||||
func run() async throws {
|
||||
do {
|
||||
try await self.runLoops()
|
||||
await self.stop()
|
||||
} catch {
|
||||
await self.stop()
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
func stop() async {
|
||||
|
||||
@ -43,6 +43,7 @@ actor SDLUDPHoleService {
|
||||
do {
|
||||
try await session.run()
|
||||
self.clearCurrent(session, generation: generation)
|
||||
await session.stop()
|
||||
} catch is CancellationError {
|
||||
self.clearCurrent(session, generation: generation)
|
||||
await session.stop()
|
||||
|
||||
@ -26,12 +26,28 @@ actor SDLUDPHoleSession {
|
||||
}
|
||||
|
||||
func run() async throws {
|
||||
do {
|
||||
try await self.runV4()
|
||||
await self.stop()
|
||||
} catch {
|
||||
await self.stop()
|
||||
throw error
|
||||
let udpHole = try SDLUDPHole()
|
||||
let localAddress = try udpHole.start()
|
||||
self.udpHole = udpHole
|
||||
self.localAddress = localAddress
|
||||
|
||||
SDLLogger.log("[SDLUDPHoleSession] udpHole started, on address: \(localAddress)")
|
||||
await self.onEvent(.ready(localAddress))
|
||||
|
||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
||||
defer {
|
||||
group.cancelAll()
|
||||
}
|
||||
|
||||
group.addTask {
|
||||
try await self.readLoop(udpHole: udpHole)
|
||||
}
|
||||
|
||||
group.addTask {
|
||||
await self.probeNatType(udpHole: udpHole)
|
||||
}
|
||||
|
||||
try await group.waitForAll()
|
||||
}
|
||||
}
|
||||
|
||||
@ -58,45 +74,10 @@ actor SDLUDPHoleSession {
|
||||
udpHole.send(type: type, data: data, remoteAddress: remoteAddress)
|
||||
}
|
||||
|
||||
private func runV4() async throws {
|
||||
let udpHole = try SDLUDPHole()
|
||||
let localAddress = try udpHole.start()
|
||||
self.udpHole = udpHole
|
||||
self.localAddress = localAddress
|
||||
|
||||
SDLLogger.log("[SDLUDPHoleSession] udpHole started, on address: \(localAddress)")
|
||||
await self.onEvent(.ready(localAddress))
|
||||
|
||||
do {
|
||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
||||
defer {
|
||||
group.cancelAll()
|
||||
}
|
||||
|
||||
group.addTask {
|
||||
try await self.readV4Loop(udpHole: udpHole)
|
||||
}
|
||||
|
||||
group.addTask {
|
||||
await self.probeNatType(udpHole: udpHole)
|
||||
}
|
||||
|
||||
try await group.waitForAll()
|
||||
}
|
||||
} catch {
|
||||
udpHole.stop()
|
||||
if self.udpHole === udpHole {
|
||||
self.udpHole = nil
|
||||
self.localAddress = nil
|
||||
}
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
private func readV4Loop(udpHole: SDLUDPHole) async throws {
|
||||
private func readLoop(udpHole: SDLUDPHole) async throws {
|
||||
for try await datagram in udpHole.messageStream {
|
||||
try Task.checkCancellation()
|
||||
try await self.handleV4Message(remoteAddress: datagram.remoteAddress, message: datagram.message)
|
||||
try await self.handleMessage(remoteAddress: datagram.remoteAddress, message: datagram.message)
|
||||
}
|
||||
}
|
||||
|
||||
@ -113,7 +94,7 @@ actor SDLUDPHoleSession {
|
||||
await self.onEvent(.natType(natType))
|
||||
}
|
||||
|
||||
private func handleV4Message(remoteAddress: SocketAddress, message: SDLHoleMessage) async throws {
|
||||
private func handleMessage(remoteAddress: SocketAddress, message: SDLHoleMessage) async throws {
|
||||
switch message {
|
||||
case .control(let control):
|
||||
switch control {
|
||||
|
||||
@ -29,6 +29,7 @@ actor SDLUDPHoleV6Service {
|
||||
do {
|
||||
try await session.run()
|
||||
self.clearCurrent(session, generation: generation)
|
||||
await session.stop()
|
||||
} catch is CancellationError {
|
||||
self.clearCurrent(session, generation: generation)
|
||||
await session.stop()
|
||||
|
||||
@ -26,7 +26,6 @@ actor SDLUDPHoleV6Session {
|
||||
SDLLogger.log("[SDLUDPHoleV6Session] udpHoleV6 started, no local address")
|
||||
}
|
||||
|
||||
do {
|
||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
||||
defer {
|
||||
group.cancelAll()
|
||||
@ -61,12 +60,6 @@ actor SDLUDPHoleV6Session {
|
||||
|
||||
_ = try await group.next()
|
||||
}
|
||||
|
||||
await self.stop()
|
||||
} catch {
|
||||
await self.stop()
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
func stop() async {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user