{"version":3,"file":"index.mjs","sources":["../src/logger.ts","../src/index.ts"],"sourcesContent":["import pino from \"pino\";\n\nexport const logger = pino({\n  name: \"rivalsjs\",\n  level:\n    process.env.NODE_ENV === \"production\"\n      ? process.env.LOG_LEVEL || \"info\"\n      : \"debug\",\n  transport:\n    process.env.NODE_ENV === \"production\"\n      ? undefined\n      : {\n          target: \"pino-pretty\",\n          options: {\n            colorize: true,\n          },\n        },\n});\n","import axios from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport camelcaseKeys from \"camelcase-keys\";\nimport { BASE_API_URL } from \"./constants\";\nimport { logger } from \"./logger\";\nimport type { ClientConfig } from \"./types\";\n\nexport type Client = ReturnType<typeof buildAxios>;\n\n/**\n * Create an Axios client to be used with RivalsJS.\n *\n * @export\n * @param {ClientConfig} config\n * @returns {Client}\n */\nexport function createRivalsClient(config: ClientConfig): Client {\n  if (!config.apiKey) {\n    throw new Error(\"API key is required to create a client.\");\n  }\n\n  if (\n    config.retryOnRateLimit === undefined ||\n    config.retryOnRateLimit === null\n  ) {\n    logger.warn(\n      \"`retryOnRateLimit` is not set. Defaulting to `false`. Will throw an error on rate limit exceeded.\",\n    );\n    config.retryOnRateLimit = false;\n  }\n\n  if (\n    config.verifyRateLimitHeader === undefined ||\n    config.verifyRateLimitHeader === null\n  ) {\n    logger.warn(\n      \"`verifyRateLimitHeader` is not set. Defaulting to `true`. Bad cache headers will throw error.\",\n    );\n    config.verifyRateLimitHeader = true;\n  }\n\n  const client = buildAxios(config);\n\n  return client;\n}\n\nfunction buildAxios(config: ClientConfig) {\n  const version = process.env.__PACKAGE_VERSION__ ?? \"dev\";\n\n  logger.debug(\"Using RivalsJS version %s\", version);\n\n  const client = axios.create({\n    baseURL: BASE_API_URL,\n    headers: {\n      \"X-API-Key\": config.apiKey,\n      \"Content-Type\": \"application/json\",\n      Accept: \"application/json\",\n      \"User-Agent\": `RivalsJS/${version}`,\n    },\n  });\n\n  client.interceptors.request.use(\n    (config) => {\n      logger.debug(\n        \"Requesting %s %s\",\n        config.method?.toUpperCase(),\n        config.url,\n      );\n      return config;\n    },\n    (error) => {\n      logger.error(\"Request error:\", error);\n      return Promise.reject(error);\n    },\n  );\n\n  // Dev shit\n  client.interceptors.response.use(\n    (response) => {\n      const rateLimitRemaining = response.headers[\"x-ratelimit-remaining\"];\n\n      // TODO: Find a better way to handle the healthcheck endpoint\n      if (!rateLimitRemaining) {\n        // This is a fallback for when the header is not present assuming it's the healthcheck endpoint\n        return response;\n      }\n\n      logger.debug(\n        \"Received %d response from %s %s\",\n        response.status,\n        response.config.method?.toUpperCase(),\n        response.config.url,\n      );\n\n      logger.debug(\"Rate limit remaining: %s\", rateLimitRemaining);\n\n      if (config.verifyRateLimitHeader) {\n        if (\n          String(rateLimitRemaining).toLowerCase() !== \"cache\" &&\n          Number.isNaN(Number(rateLimitRemaining))\n        ) {\n          logger.error(\"Invalid rate limit header: %s\", rateLimitRemaining);\n\n          return Promise.reject(\"Invalid rate limit header\");\n        }\n      }\n\n      return response;\n    },\n    (error) => {\n      if (error.response) {\n        logger.error(\n          \"Response error: %s %d - %s\",\n          error.response.config.url,\n          error.response.status,\n          error.response.statusText,\n        );\n        logger.debug(\"Response data:\", error.response.data);\n      } else {\n        logger.error(\"Network or request error:\", error.message);\n      }\n      return Promise.reject(error);\n    },\n  );\n\n  // Camelcase transformer\n  client.interceptors.response.use(\n    (response) => {\n      const cleanedData = camelcaseKeys(response.data, { deep: true });\n\n      return {\n        ...response,\n        data: cleanedData,\n      };\n    },\n    (error) => Promise.reject(error),\n  );\n\n  // Retry section\n  if (config.retryOnRateLimit) {\n    axiosRetry(client, {\n      retries: 2,\n      retryCondition: (error) => {\n        return (\n          axiosRetry.isNetworkOrIdempotentRequestError(error) ||\n          error.response?.status === 429\n        );\n      },\n      retryDelay: (retryCount, error) => {\n        const resetHeader = error.response?.headers[\"x-ratelimit-reset\"];\n\n        if (error.response?.status === 429 && resetHeader) {\n          const resetTimestamp = parseInt(resetHeader, 10) * 1000;\n          const delay = Math.max(0, resetTimestamp - Date.now());\n          logger.debug(\"Rate limit exceeded, retrying after %d ms\", delay);\n          return delay;\n        }\n\n        return axiosRetry.exponentialDelay(retryCount, error);\n      },\n    });\n  }\n\n  return client;\n}\n"],"names":[],"mappings":"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"}