From 9bde7a6daa7ec47310a692be040efa58ae0fa2dc Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 8 Dec 2025 22:16:05 +0100 Subject: [PATCH] macos: harden control channel connect continuation --- apps/macos/Sources/Clawdis/ControlChannel.swift | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/apps/macos/Sources/Clawdis/ControlChannel.swift b/apps/macos/Sources/Clawdis/ControlChannel.swift index d1d71fc60..ad9ae3093 100644 --- a/apps/macos/Sources/Clawdis/ControlChannel.swift +++ b/apps/macos/Sources/Clawdis/ControlChannel.swift @@ -170,17 +170,27 @@ final class ControlChannel: ObservableObject { self.connection = conn try await withCheckedThrowingContinuation { (cont: CheckedContinuation) in + var resumed = false + let resume: (Result) -> 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 switch state { case .ready: - cont.resume(returning: ()) Task { @MainActor in self.state = .connected } + resume(.success(())) case let .failed(err): Task { @MainActor in self.state = .degraded(err.localizedDescription) } - cont.resume(throwing: err) + resume(.failure(err)) case let .waiting(err): Task { @MainActor in self.state = .degraded(err.localizedDescription) } - cont.resume(throwing: err) + resume(.failure(err)) default: break }