Skip to content

Commit

Permalink
fix FlyingSocks build errors
Browse files Browse the repository at this point in the history
  • Loading branch information
lhoward committed Jul 23, 2024
1 parent 245c78a commit 87fb0c5
Showing 1 changed file with 23 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ import AsyncExtensions
import FlyingSocks
@_spi(Private)
import func FlyingSocks.withThrowingTimeout
@_spi(Private)
import func FlyingSocks.withIdentifiableThrowingContinuation
import Foundation
import Logging
import SwiftOCA
Expand Down Expand Up @@ -134,7 +136,7 @@ public final class Ocp1FlyingSocksDeviceEndpoint: OcaDeviceEndpointPrivate,
}
}

var waiting: Set<Continuation> = []
var waiting = [Continuation.ID: Continuation]()
private(set) var socket: Socket? {
didSet { isListeningDidUpdate(from: oldValue != nil) }
}
Expand Down Expand Up @@ -259,31 +261,42 @@ public final class Ocp1FlyingSocksDeviceEndpoint: OcaDeviceEndpointPrivate,
extension Ocp1FlyingSocksDeviceEndpoint {
public var isListening: Bool { socket != nil }

func waitUntilListening(timeout: Duration = .seconds(5)) async throws {
try await SwiftOCA.withThrowingTimeout(of: timeout) {
func waitUntilListening(timeout: TimeInterval = 5) async throws {
try await withThrowingTimeout(seconds: timeout) {
try await self.doWaitUntilListening()
}
}

private func doWaitUntilListening() async throws {
guard !isListening else { return }
let continuation = Continuation()
waiting.insert(continuation)
defer { waiting.remove(continuation) }
return try await continuation.value
try await withIdentifiableThrowingContinuation(isolation: OcaDevice.shared) {
appendContinuation($0)
} onCancel: { id in
Task { await self.cancelContinuation(with: id) }
}
}

private func appendContinuation(_ continuation: Continuation) {
waiting[continuation.id] = continuation
}

private func cancelContinuation(with id: Continuation.ID) {
if let continuation = waiting.removeValue(forKey: id) {
continuation.resume(throwing: CancellationError())
}
}

func isListeningDidUpdate(from previous: Bool) {
guard isListening else { return }
let waiting = waiting
self.waiting = []
self.waiting = [:]

for continuation in waiting {
for continuation in waiting.values {
continuation.resume()
}
}

typealias Continuation = CancellingContinuation<(), Never>
typealias Continuation = IdentifiableContinuation<(), any Error>
}

#endif

0 comments on commit 87fb0c5

Please sign in to comment.