Compare commits
2 Commits
1042b5c724
...
a8a4cc507a
| Author | SHA1 | Date | |
|---|---|---|---|
| a8a4cc507a | |||
| f04196ef34 |
@ -164,12 +164,17 @@ actor SDLContextActor {
|
||||
await self.packetOutboundActor.updateDNSService(dnsService)
|
||||
await dnsService.start()
|
||||
|
||||
await self.udpHoleServiceProxy.bindInbound(self.packetInboundActor) { [weak self] event in
|
||||
let udpHoleEventHandler = await self.udpHoleServiceProxy.makeEventHandler { [weak self] event in
|
||||
await self?.handleUDPHoleControlEvent(event)
|
||||
}
|
||||
|
||||
let udpHoleEventHandler = await self.udpHoleServiceProxy.makeEventHandler()
|
||||
let udpHoleService = SDLUDPHoleService(proberActor: self.proberActor, onEvent: udpHoleEventHandler)
|
||||
let packetInboundActor = self.packetInboundActor
|
||||
let udpHoleService = SDLUDPHoleService(
|
||||
proberActor: self.proberActor,
|
||||
onEvent: udpHoleEventHandler,
|
||||
onData: { data in
|
||||
await packetInboundActor.handleData(data)
|
||||
}
|
||||
)
|
||||
await self.udpHoleServiceProxy.replace(udpHoleService)
|
||||
await udpHoleService.start(includeV6: false)
|
||||
|
||||
@ -469,19 +474,14 @@ extension SDLContextActor {
|
||||
}
|
||||
}
|
||||
|
||||
private func handleUDPHolePacket(remoteAddress: SocketAddress, message: SDLHoleMessage, source: SDLUDPHoleKind) async {
|
||||
private func handleUDPHolePacket(remoteAddress: SocketAddress, message: SDLHoleControlMessage, source: SDLUDPHoleKind) async {
|
||||
switch message {
|
||||
case .control(let message):
|
||||
switch message {
|
||||
case .stunReply(_), .stunProbeReply(_):
|
||||
SDLLogger.log("[SDLContext] get a stun reply", for: .debug)
|
||||
case .register(let register):
|
||||
try? await self.handleRegister(remoteAddress: remoteAddress, register: register, source: source)
|
||||
case .registerAck(let registerAck):
|
||||
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck, source: source)
|
||||
}
|
||||
case .data:
|
||||
SDLLogger.log("[SDLContext] unexpected data packet in control path", for: .debug)
|
||||
case .stunReply(_), .stunProbeReply(_):
|
||||
SDLLogger.log("[SDLContext] get a stun reply", for: .debug)
|
||||
case .register(let register):
|
||||
try? await self.handleRegister(remoteAddress: remoteAddress, register: register, source: source)
|
||||
case .registerAck(let registerAck):
|
||||
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck, source: source)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -19,14 +19,16 @@ actor SDLUDPHoleService {
|
||||
enum Event {
|
||||
case ready(SocketAddress)
|
||||
case natType(SDLNATProberActor.NatType)
|
||||
case packet(SocketAddress, SDLHoleMessage, source: SDLUDPHoleKind)
|
||||
case packet(SocketAddress, SDLHoleControlMessage, source: SDLUDPHoleKind)
|
||||
case closed(Error)
|
||||
}
|
||||
|
||||
typealias EventHandler = @Sendable (Event) async -> Void
|
||||
typealias DataHandler = @Sendable (SDLData) async -> Void
|
||||
|
||||
private let proberActor: SDLNATProberActor
|
||||
private let onEvent: EventHandler
|
||||
private let onData: DataHandler
|
||||
|
||||
private var udpHole: SDLUDPHole?
|
||||
private var udpHoleMonitorTask: Task<Void, Never>?
|
||||
@ -36,9 +38,14 @@ actor SDLUDPHoleService {
|
||||
private var udpHoleV6: SDLUDPHoleV6?
|
||||
private var udpHoleV6MonitorTask: Task<Void, Never>?
|
||||
|
||||
init(proberActor: SDLNATProberActor, onEvent: @escaping EventHandler) {
|
||||
init(
|
||||
proberActor: SDLNATProberActor,
|
||||
onEvent: @escaping EventHandler,
|
||||
onData: @escaping DataHandler
|
||||
) {
|
||||
self.proberActor = proberActor
|
||||
self.onEvent = onEvent
|
||||
self.onData = onData
|
||||
}
|
||||
|
||||
func start(includeV6: Bool = false) {
|
||||
@ -171,10 +178,10 @@ actor SDLUDPHoleService {
|
||||
case .stunProbeReply(let probeReply):
|
||||
await self.proberActor.handleProbeReply(localAddress: self.localAddress, reply: probeReply)
|
||||
default:
|
||||
await self.onEvent(.packet(remoteAddress, message, source: .v4))
|
||||
await self.onEvent(.packet(remoteAddress, control, source: .v4))
|
||||
}
|
||||
case .data:
|
||||
await self.onEvent(.packet(remoteAddress, message, source: .v4))
|
||||
case .data(let data):
|
||||
await self.onData(data)
|
||||
}
|
||||
}
|
||||
|
||||
@ -215,10 +222,16 @@ actor SDLUDPHoleService {
|
||||
}
|
||||
|
||||
let onEvent = self.onEvent
|
||||
let onData = self.onData
|
||||
group.addTask {
|
||||
for await (remoteAddress, message) in udpHoleV6.messageStream {
|
||||
try Task.checkCancellation()
|
||||
await onEvent(.packet(remoteAddress, message, source: .v6))
|
||||
switch message {
|
||||
case .control(let control):
|
||||
await onEvent(.packet(remoteAddress, control, source: .v6))
|
||||
case .data(let data):
|
||||
await onData(data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -243,21 +256,14 @@ actor SDLUDPHoleServiceProxy {
|
||||
typealias ControlEventHandler = @Sendable (SDLUDPHoleService.Event) async -> Void
|
||||
|
||||
private var udpHoleService: SDLUDPHoleService?
|
||||
private var packetInboundActor: PacketInboundActor?
|
||||
private var onControlEvent: ControlEventHandler?
|
||||
private var generation: UInt64 = 0
|
||||
|
||||
func bindInbound(_ packetInboundActor: PacketInboundActor, onControlEvent: @escaping ControlEventHandler) {
|
||||
self.packetInboundActor = packetInboundActor
|
||||
self.onControlEvent = onControlEvent
|
||||
}
|
||||
|
||||
func makeEventHandler() -> SDLUDPHoleService.EventHandler {
|
||||
func makeEventHandler(onControlEvent: @escaping ControlEventHandler) -> SDLUDPHoleService.EventHandler {
|
||||
self.generation &+= 1
|
||||
let generation = self.generation
|
||||
|
||||
return { [weak self] event in
|
||||
await self?.handleEvent(event, generation: generation)
|
||||
await self?.handleEvent(event, generation: generation, onControlEvent: onControlEvent)
|
||||
}
|
||||
}
|
||||
|
||||
@ -283,21 +289,11 @@ actor SDLUDPHoleServiceProxy {
|
||||
await self.udpHoleService?.send(type: type, data: data, remoteAddress: remoteAddress)
|
||||
}
|
||||
|
||||
private func handleEvent(_ event: SDLUDPHoleService.Event, generation: UInt64) async {
|
||||
private func handleEvent(_ event: SDLUDPHoleService.Event, generation: UInt64, onControlEvent: ControlEventHandler) async {
|
||||
guard generation == self.generation else {
|
||||
return
|
||||
}
|
||||
|
||||
switch event {
|
||||
case .packet(_, let message, _):
|
||||
switch message {
|
||||
case .data(let data):
|
||||
await self.packetInboundActor?.handleData(data)
|
||||
case .control:
|
||||
await self.onControlEvent?(event)
|
||||
}
|
||||
case .ready, .natType, .closed:
|
||||
await self.onControlEvent?(event)
|
||||
}
|
||||
await onControlEvent(event)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user