mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-12 16:06:08 +00:00
* fix(ios): defer QR pairing after scanner dismissal * fix(ios): process QR pairing after scanner dismissal * fix(ios): harden QR scanner handoff * fix(ios): give QR scanner dismissal more time * fix(ios): keep onboarding open for QR trust prompt * fix(ios): keep QR trust prompt owned by onboarding * fix(ios): recover operator pairing after QR bootstrap * fix(ios): cancel stale QR scanner handoffs Co-authored-by: PollyBot13 <pollybot13@gmail.com> * fix(ios): defer QR setup until onboarding closes * fix(ios): keep QR setup links with visible settings * fix(ios): consume setup links during onboarding * fix(ios): handle setup links during onboarding launch * fix(ios): route setup links through active onboarding * fix(ios): harden QR gateway handoff * fix(ios): cancel superseded gateway attempts * fix(ios): serialize scanner result delivery * fix(ios): prevent stale gateway reconnects * fix(ios): serialize gateway target handoff * fix(ios): disable stale gateway relaunch route * fix(ios): await staged bootstrap reset * test(ios): bound gateway reset handoff * fix(ios): preserve explicit gateway handoff * fix(ios): harden gateway lifecycle ownership * chore(ios): sync native i18n inventory * test(ios): align gateway ownership assertions * refactor(ios): remove superseded gateway helpers * fix(ios): keep gateway auth route scoped * fix(ios): restore gateway target review state * fix(protocol): refresh Swift plugin approval model * test(ios): isolate state directory overrides * fix(ios): preserve watch alerts across gateway switches * fix(ios): bind deferred work to gateway ownership * docs(changelog): credit iOS gateway handoff fix * chore(i18n): sync native app inventory * test(ios): remove unused Watch approval hooks --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
51 lines
1.2 KiB
Swift
51 lines
1.2 KiB
Swift
import Testing
|
|
|
|
private actor StateDirectoryTestGate {
|
|
private var locked = false
|
|
private var waiters: [CheckedContinuation<Void, Never>] = []
|
|
|
|
func acquire() async {
|
|
if !self.locked {
|
|
self.locked = true
|
|
return
|
|
}
|
|
await withCheckedContinuation { continuation in
|
|
self.waiters.append(continuation)
|
|
}
|
|
}
|
|
|
|
func release() {
|
|
guard !self.waiters.isEmpty else {
|
|
self.locked = false
|
|
return
|
|
}
|
|
self.waiters.removeFirst().resume()
|
|
}
|
|
}
|
|
|
|
/// Prevents process-wide state-directory overrides from crossing suite boundaries.
|
|
struct StateDirectoryIsolationTrait: TestTrait, TestScoping {
|
|
private static let gate = StateDirectoryTestGate()
|
|
|
|
func provideScope(
|
|
for test: Test,
|
|
testCase: Test.Case?,
|
|
performing function: @Sendable () async throws -> Void) async throws
|
|
{
|
|
await Self.gate.acquire()
|
|
do {
|
|
try await function()
|
|
} catch {
|
|
await Self.gate.release()
|
|
throw error
|
|
}
|
|
await Self.gate.release()
|
|
}
|
|
}
|
|
|
|
extension Trait where Self == StateDirectoryIsolationTrait {
|
|
static var stateDirectoryIsolated: Self {
|
|
Self()
|
|
}
|
|
}
|