macos: harden control channel connect continuation
This commit is contained in:
@@ -170,17 +170,27 @@ final class ControlChannel: ObservableObject {
|
|||||||
self.connection = conn
|
self.connection = conn
|
||||||
|
|
||||||
try await withCheckedThrowingContinuation { (cont: CheckedContinuation<Void, Error>) in
|
try await withCheckedThrowingContinuation { (cont: CheckedContinuation<Void, Error>) in
|
||||||
|
var resumed = false
|
||||||
|
let resume: (Result<Void, Error>) -> Void = { result in
|
||||||
|
guard !resumed else { return }
|
||||||
|
resumed = true
|
||||||
|
switch result {
|
||||||
|
case .success: cont.resume(returning: ())
|
||||||
|
case let .failure(err): cont.resume(throwing: err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
conn.stateUpdateHandler = { state in
|
conn.stateUpdateHandler = { state in
|
||||||
switch state {
|
switch state {
|
||||||
case .ready:
|
case .ready:
|
||||||
cont.resume(returning: ())
|
|
||||||
Task { @MainActor in self.state = .connected }
|
Task { @MainActor in self.state = .connected }
|
||||||
|
resume(.success(()))
|
||||||
case let .failed(err):
|
case let .failed(err):
|
||||||
Task { @MainActor in self.state = .degraded(err.localizedDescription) }
|
Task { @MainActor in self.state = .degraded(err.localizedDescription) }
|
||||||
cont.resume(throwing: err)
|
resume(.failure(err))
|
||||||
case let .waiting(err):
|
case let .waiting(err):
|
||||||
Task { @MainActor in self.state = .degraded(err.localizedDescription) }
|
Task { @MainActor in self.state = .degraded(err.localizedDescription) }
|
||||||
cont.resume(throwing: err)
|
resume(.failure(err))
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user