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.