Skip to content

Timeout Configuration

Httx provides flexible timeout configuration options for your HTTP requests.

Basic Timeout

typescript
const response = await client.request('/api/users', {
  method: 'GET',
  timeout: 5000 // 5 seconds timeout
})

Global Timeout

You can set a default timeout for all requests:

typescript
const client = new HttxClient({
  timeout: 10000 // 10 seconds default timeout
})

// All requests will use the 10-second timeout unless overridden
const response = await client.request('/api/users', {
  method: 'GET'
})

Per-Request Timeout

Override the global timeout for specific requests:

typescript
const client = new HttxClient({
  timeout: 10000 // 10 seconds default
})

// This request will timeout after 2 seconds
const response = await client.request('/api/slow', {
  method: 'GET',
  timeout: 2000
})

Timeout Error Handling

typescript
const result = await client.request('/api/slow', {
  method: 'GET',
  timeout: 5000
})

if (result.isErr()) {
  const error = result.error
  if (error instanceof DOMException && error.name === 'AbortError') {
    console.error('Request timed out after 5 seconds')
  }
}

Custom Timeout Strategy

You can implement a custom timeout strategy:

typescript
class AdaptiveTimeoutClient extends HttxClient {
  private requestCount = 0
  private readonly baseTimeout = 5000

  async request<T>(url: string, options: RequestOptions): Promise<Result<HttxResponse<T>, Error>> {
    this.requestCount++

    // Increase timeout for every 10 requests
    const timeout = this.baseTimeout + (Math.floor(this.requestCount / 10) * 1000)

    return super.request(url, {
      ...options,
      timeout
    })
  }
}

Timeout with Retry

typescript
class RetryClient extends HttxClient {
  async request<T>(url: string, options: RequestOptions): Promise<Result<HttxResponse<T>, Error>> {
    const maxRetries = 3
    let lastError: Error | null = null

    for (let i = 0; i < maxRetries; i++) {
      const result = await super.request(url, options)

      if (result.isOk()) {
        return result
      }

      lastError = result.error

      // Only retry on timeout errors
      if (!(lastError instanceof DOMException && lastError.name === 'AbortError')) {
        return result
      }

      // Wait before retrying
      await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)))
    }

    return err(lastError!)
  }
}

Timeout Monitoring

typescript
class MonitoredClient extends HttxClient {
  private timeouts: number[] = []

  async request<T>(url: string, options: RequestOptions): Promise<Result<HttxResponse<T>, Error>> {
    const result = await super.request(url, options)

    if (result.isErr() && result.error instanceof DOMException && result.error.name === 'AbortError') {
      this.timeouts.push(options.timeout || this.config.timeout)
      this.analyzeTimeouts()
    }

    return result
  }

  private analyzeTimeouts() {
    const avgTimeout = this.timeouts.reduce((a, b) => a + b, 0) / this.timeouts.length
    console.log(`Average timeout: ${avgTimeout}ms`)
    console.log(`Total timeouts: ${this.timeouts.length}`)
  }
}

Released under the MIT License.