Skip to content

swhitty/swift-timeout

Repository files navigation

Build Codecov Platforms Swift 6.0

Introduction

swift-timeout is a lightweight wrapper around Task that executes a closure with a given timeout.

Installation

Timeout can be installed by using Swift Package Manager.

Note: Timeout requires Swift 5.10 on Xcode 15.4+. It runs on iOS 13+, tvOS 13+, macOS 10.15+, Linux and Windows. To install using Swift Package Manager, add this to the dependencies: section in your Package.swift file:

.package(url: "https://github.com/swhitty/swift-timeout.git", .upToNextMajor(from: "0.3.0"))

Usage

Provide a closure and a Instant for when the child task must complete else TimeoutError is thrown:

import Timeout

let val = try await withThrowingTimeout(after: .now + .seconds(2)) {
  try await perform()
}

TimeInterval can also be provided:

let val = try await withThrowingTimeout(seconds: 2.0) {
  try await perform()
}

Note: When the timeout expires the task executing the closure is cancelled and TimeoutError is thrown.

An overload includes a TimeoutController object allowing the body to cancel or move the expiration where required:

try await withThrowingTimeout(seconds: 1.0) { timeout in
  try await foo()
  timeout.cancelExpiration()
  try await bar()
  timeout.expire(afer: 0.5)
  try await baz()
}

AsyncTimeoutSequence allows each iteration a fresh timeout to return the next element;

for try await val in sequence.timeout(seconds: 2.0) {
   ...
}

Credits

swift-timeout is primarily the work of Simon Whitty.

(Full list of contributors)

About

Swift Concurrency timeout handler

Resources

License

Stars

Watchers

Forks

Packages

No packages published