ContainerizationExtras: Timeout adjustments (#254)

Three things:

1. Timeout.run today didn't allow a throwing closure.
2. Add a new constructor for Timeout that takes in a Duration directly
so we can be more granular than seconds.
3. Add unit tests because we all love those :)
This commit is contained in:
Danny Canter
2025-08-07 14:34:45 -04:00
committed by GitHub
parent adf5bd1866
commit 259c841591
2 changed files with 82 additions and 2 deletions
+25 -2
View File
@@ -23,11 +23,11 @@ public struct Timeout {
/// doesn't finish in the provided `seconds` amount.
public static func run<T: Sendable>(
seconds: UInt32,
operation: @escaping @Sendable () async -> T
operation: @escaping @Sendable () async throws -> T
) async throws -> T {
try await withThrowingTaskGroup(of: T.self) { group in
group.addTask {
await operation()
try await operation()
}
group.addTask {
@@ -43,4 +43,27 @@ public struct Timeout {
return result
}
}
public static func run<T: Sendable>(
for duration: Duration,
operation: @escaping @Sendable () async throws -> T
) async throws -> T {
try await withThrowingTaskGroup(of: T.self) { group in
group.addTask {
try await operation()
}
group.addTask {
try await Task.sleep(for: duration)
throw CancellationError()
}
guard let result = try await group.next() else {
fatalError()
}
group.cancelAll()
return result
}
}
}