Skip to content

Response Timing

Httx provides detailed timing information for each request, allowing you to monitor performance and identify bottlenecks.

Timing Information

Each response includes a timings object with the following properties:

typescript
interface HttxResponse<T> {
  // ... other properties
  timings: {
    start: number // Request start timestamp
    end: number // Response end timestamp
    duration: number // Total request duration in milliseconds
  }
}

Usage

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

if (result.isOk()) {
  const { timings } = result.value
  console.log(`Request took ${timings.duration}ms`)
  console.log(`Started at: ${new Date(timings.start).toISOString()}`)
  console.log(`Ended at: ${new Date(timings.end).toISOString()}`)
}

Performance Monitoring

You can use the timing information to monitor API performance:

typescript
async function monitorApiPerformance() {
  const results = await Promise.all([
    client.request('/api/endpoint1', { method: 'GET' }),
    client.request('/api/endpoint2', { method: 'GET' }),
    client.request('/api/endpoint3', { method: 'GET' })
  ])

  results.forEach((result, index) => {
    if (result.isOk()) {
      const { timings } = result.value
      console.log(`Endpoint ${index + 1} took ${timings.duration}ms`)
    }
  })
}

Timing with Debug Logging

When debug logging is enabled, timing information is automatically included in the logs:

typescript
const client = new HttxClient({
  verbose: true
})

const result = await client.request('/api/users', {
  method: 'GET'
})

// Log output will include timing information:
// [response] 200 OK (150ms)

Custom Timing Analysis

You can extend the client to add custom timing analysis:

typescript
class TimingClient extends HttxClient {
  private timings: number[] = []

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

    if (result.isOk()) {
      this.timings.push(result.value.timings.duration)
      this.analyzeTimings()
    }

    return result
  }

  private analyzeTimings() {
    const avg = this.timings.reduce((a, b) => a + b, 0) / this.timings.length
    const max = Math.max(...this.timings)
    const min = Math.min(...this.timings)

    console.log(`Average request time: ${avg}ms`)
    console.log(`Fastest request: ${min}ms`)
    console.log(`Slowest request: ${max}ms`)
  }
}

Released under the MIT License.