Skip to content

Error Handling

LPDBError

The client throws LPDBError for API errors:

typescript
import { LPDBClient, LPDBError } from '@npldev/lpdb-ts-client'

const client = new LPDBClient({ apiKey: 'your-api-key' })

try {
  const response = await client.endpoint('/player').wiki('dota2').execute()
} catch (error) {
  if (error instanceof LPDBError) {
    console.error('Status:', error.status)
    console.error('Message:', error.message)
    console.error('Data:', error.data)
  }
}

Error Properties

PropertyTypeDescription
statusnumberHTTP status code
messagestringError message
dataunknownRaw error response from API

Common Error Codes

StatusDescription
403Invalid API key
404Resource not found
429Rate limit exceeded

Handling Rate Limits

Liquipedia has rate limits. Handle 429 errors with retry logic:

typescript
async function queryWithRetry<T>(fn: () => Promise<T>, maxRetries = 3): Promise<T> {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn()
    } catch (error) {
      if (error instanceof LPDBError && error.status === 429) {
        const delay = Math.pow(2, i) * 1000 // Exponential backoff
        console.log(`Rate limited, retrying in ${delay}ms...`)
        await new Promise((resolve) => setTimeout(resolve, delay))
        continue
      }
      throw error
    }
  }
  throw new Error('Max retries exceeded')
}

// Usage
const response = await queryWithRetry(() =>
  client.endpoint('/player').wiki('dota2').limit(100).execute()
)

Network Errors

Network errors (no internet, DNS failure, etc.) will throw standard Error objects, not LPDBError:

typescript
try {
  const response = await client.endpoint('/player').wiki('dota2').execute()
} catch (error) {
  if (error instanceof LPDBError) {
    // API returned an error response
    console.error('API Error:', error.status)
  } else if (error instanceof Error) {
    // Network or other error
    console.error('Network Error:', error.message)
  }
}

Released under the MIT License.