{"_id":"@backendkit-labs/http-client","_rev":"5-73d206a8ecd390bdaad614e01a5719bb","name":"@backendkit-labs/http-client","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@backendkit-labs/http-client","version":"0.1.0","keywords":["http","axios","circuit-breaker","retry","result","pipeline","cancel","nestjs","node","typescript"],"author":{"name":"Mairon José Cuello Martínez"},"license":"MIT","_id":"@backendkit-labs/http-client@0.1.0","maintainers":[{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"}],"homepage":"https://github.com/backendkit-dev/backendkit-monorepo/tree/master/packages/http-client#readme","bugs":{"url":"https://github.com/backendkit-dev/backendkit-monorepo/issues"},"dist":{"shasum":"417f27a3f7918247cece9ac836519a4826a4a515","tarball":"https://registry.npmjs.org/@backendkit-labs/http-client/-/http-client-0.1.0.tgz","fileCount":20,"integrity":"sha512-A7h5Qu9Q5Ue+SF/C4giEiUmpVv4zMfTrGGbR+VD2Q+/wphnYl6PLz7mrS8CSSMFPUFldI0vUURnupzYS/G7+MQ==","signatures":[{"sig":"MEQCIDYDEUKwBBnwHc3pwt7cLWZ0QmBiNZZjUV5W17NguXB2AiBwSZMxCgQlJbclRA3bK4pwRA5+nIRwnQnylzjdP2jZ9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98713},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs/index.d.ts","import":"./dist/nestjs/index.js","require":"./dist/nestjs/index.cjs"}},"gitHead":"cfc380d28fe85499e2269e4ad6e62d30a2b5df97","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run test && npm run lint"},"_npmUser":{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"},"repository":{"url":"git+https://github.com/backendkit-dev/backendkit-monorepo.git","type":"git","directory":"packages/http-client"},"_npmVersion":"11.8.0","description":"Production-grade HTTP client for Node.js — built on axios with circuit breaker, retry with backoff, request cancellation, typed Result responses, pipeline middleware, and optional NestJS integration","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"@backendkit-labs/result":"*","@backendkit-labs/pipeline":"*","@backendkit-labs/circuit-breaker":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.0.0","axios":"^1.7.0","eslint":"^9.0.0","vitest":"^2.0.0","@eslint/js":"^9.39.4","typescript":"^5.5.0","@types/node":"^22.0.0","@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0","reflect-metadata":"^0.2.0","typescript-eslint":"^8.59.3","axios-mock-adapter":"^2.1.0"},"peerDependencies":{"rxjs":">=7.0.0","axios":">=1.0.0","@nestjs/core":">=10.0.0","@nestjs/common":">=10.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"@nestjs/core":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/http-client_0.1.0_1778780664462_0.5857804540763791","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@backendkit-labs/http-client","version":"0.1.1","keywords":["http","axios","circuit-breaker","retry","result","pipeline","cancel","nestjs","node","typescript"],"author":{"name":"BackendKit Labs","email":"backendkit.dev@gmail.com"},"license":"Apache-2.0","_id":"@backendkit-labs/http-client@0.1.1","maintainers":[{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"}],"homepage":"https://github.com/backendkit-dev/backendkit-monorepo/tree/master/packages/http-client#readme","bugs":{"url":"https://github.com/backendkit-dev/backendkit-monorepo/issues"},"dist":{"shasum":"d5f04d2d9125d19e06855c6a3563822593fa4f26","tarball":"https://registry.npmjs.org/@backendkit-labs/http-client/-/http-client-0.1.1.tgz","fileCount":21,"integrity":"sha512-HfJAtxFyLLg0ijDs4fkb/kVQBWpWUjAoLEVMpBrvpykLB+M0yEBHdgJ2mKIo5nEUUfs9pnVcDoIDZAkjSR7M2A==","signatures":[{"sig":"MEUCID9NrFRi8WRCBS1+c2dPza6N6s3wjlscZC/fUPqur/ZTAiEAvpVeesN8Nif0XwXsXMus7iVmHvs7YpgNsUYBW8gB3aA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109288},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs/index.d.ts","import":"./dist/nestjs/index.js","require":"./dist/nestjs/index.cjs"}},"gitHead":"f6769720db5a99cfb74b9d2c46a99b3b648b86aa","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run test && npm run lint"},"_npmUser":{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"},"repository":{"url":"git+https://github.com/backendkit-dev/backendkit-monorepo.git","type":"git","directory":"packages/http-client"},"_npmVersion":"11.8.0","description":"Production-grade HTTP client for Node.js â€” built on axios with circuit breaker, retry with backoff, request cancellation, typed Result responses, pipeline middleware, and optional NestJS integration","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"@backendkit-labs/result":"*","@backendkit-labs/pipeline":"*","@backendkit-labs/circuit-breaker":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.0.0","axios":"^1.7.0","eslint":"^9.0.0","vitest":"^2.0.0","@eslint/js":"^9.39.4","typescript":"^5.5.0","@types/node":"^22.0.0","@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0","reflect-metadata":"^0.2.0","typescript-eslint":"^8.59.3","axios-mock-adapter":"^2.1.0"},"peerDependencies":{"rxjs":">=7.0.0","axios":">=1.0.0","@nestjs/core":">=10.0.0","@nestjs/common":">=10.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"@nestjs/core":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/http-client_0.1.1_1778797195229_0.33601632528334036","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@backendkit-labs/http-client","version":"0.2.0","keywords":["http","axios","circuit-breaker","retry","result","pipeline","cancel","nestjs","node","typescript"],"author":{"name":"BackendKit Labs","email":"hello@backendkitlabs.dev"},"license":"Apache-2.0","_id":"@backendkit-labs/http-client@0.2.0","maintainers":[{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"}],"homepage":"https://backendkitlabs.dev/docs/http-client/","bugs":{"url":"https://github.com/BackendKit-labs/backendkit-monorepo/issues"},"dist":{"shasum":"b5ec5e094342b91ce5cd9bf29bd4f10fa08a1b1b","tarball":"https://registry.npmjs.org/@backendkit-labs/http-client/-/http-client-0.2.0.tgz","fileCount":21,"integrity":"sha512-k2+f/SULLvXYnm6TFHY+NGsSdl0lt2B4sccXqD4KK1J2WGW6v9YKgiYQssQuNsWg+zzKBL4PeoxErWqjOCTRHA==","signatures":[{"sig":"MEQCIBBsCaYgkuVJA1QI9UJSrrDzVTImXrLRxYAGSWfl1G8uAiB8IEaikAD179ecvBFGyGx1JV2kZfA+W7v6/39F/wHRXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110734},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs/index.d.ts","import":"./dist/nestjs/index.js","require":"./dist/nestjs/index.cjs"}},"gitHead":"f8cd39b773c199d99051bbab5d4960f3680bc86c","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run test && npm run lint"},"_npmUser":{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"},"repository":{"url":"git+https://github.com/BackendKit-labs/backendkit-monorepo.git","type":"git","directory":"packages/http-client"},"_npmVersion":"11.8.0","description":"Production-grade HTTP client for Node.js â€” built on axios with circuit breaker, retry with backoff, request cancellation, typed Result responses, pipeline middleware, and optional NestJS integration","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"@backendkit-labs/result":"*","@backendkit-labs/pipeline":"*","@backendkit-labs/circuit-breaker":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.0.0","axios":"^1.7.0","eslint":"^9.0.0","vitest":"^2.0.0","@eslint/js":"^9.39.4","typescript":"^5.5.0","@types/node":"^22.0.0","@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0","reflect-metadata":"^0.2.0","typescript-eslint":"^8.59.3","axios-mock-adapter":"^2.1.0"},"peerDependencies":{"rxjs":">=7.0.0","axios":">=1.0.0","@nestjs/core":">=10.0.0","@nestjs/common":">=10.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"@nestjs/core":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/http-client_0.2.0_1778972993015_0.4943470928182765","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@backendkit-labs/http-client","version":"0.2.1","keywords":["http","axios","circuit-breaker","retry","result","pipeline","cancel","nestjs","node","typescript"],"author":{"name":"BackendKit Labs","email":"hello@backendkitlabs.dev"},"license":"Apache-2.0","_id":"@backendkit-labs/http-client@0.2.1","maintainers":[{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"}],"homepage":"https://backendkitlabs.dev/docs/http-client/","bugs":{"url":"https://github.com/BackendKit-labs/backendkit-monorepo/issues"},"dist":{"shasum":"1a810e2698a37a6a529f2f83534189488c58e211","tarball":"https://registry.npmjs.org/@backendkit-labs/http-client/-/http-client-0.2.1.tgz","fileCount":21,"integrity":"sha512-bDRu8pTxwrwzVfz3jWqqDPx/vXTv4e/HkEo+Pjd6rWqDUbgO0IVFww9R521bD+Er2Nwwqv3ouyhAq6P2/1GdTg==","signatures":[{"sig":"MEYCIQD4ap4em3loczq53fvPR5z/jJX90xez+bUeRxhOlLx8VQIhALsUuDJ5H9JECOjXMqBDSO1BE/wXjA7sI1smeNzqlemB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110112},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs/index.d.ts","import":"./dist/nestjs/index.js","require":"./dist/nestjs/index.cjs"}},"gitHead":"ddffee07da09e0bab1fdd89039184c99c3eddc8f","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run test && npm run lint"},"_npmUser":{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"},"repository":{"url":"git+https://github.com/BackendKit-labs/backendkit-monorepo.git","type":"git","directory":"packages/http-client"},"_npmVersion":"11.8.0","description":"Production-grade HTTP client for Node.js â€” built on axios with circuit breaker, retry with backoff, request cancellation, typed Result responses, pipeline middleware, and optional NestJS integration","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"@backendkit-labs/result":"*","@backendkit-labs/pipeline":"*","@backendkit-labs/circuit-breaker":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.0.0","axios":"^1.7.0","eslint":"^9.0.0","vitest":"^2.0.0","@eslint/js":"^9.39.4","typescript":"^5.5.0","@types/node":"^22.0.0","@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0","reflect-metadata":"^0.2.0","typescript-eslint":"^8.59.3","axios-mock-adapter":"^2.1.0"},"peerDependencies":{"rxjs":">=7.0.0","axios":">=1.0.0","@nestjs/core":">=10.0.0","@nestjs/common":">=10.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"@nestjs/core":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/http-client_0.2.1_1779136434501_0.0658721216212137","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@backendkit-labs/http-client","version":"0.3.0","license":"Apache-2.0","author":{"name":"BackendKit Labs","email":"hello@backendkitlabs.dev"},"description":"Production-grade HTTP client for Node.js â€” built on axios with circuit breaker, retry with backoff, request cancellation, typed Result responses, pipeline middleware, and optional NestJS integration","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs/index.d.ts","import":"./dist/nestjs/index.js","require":"./dist/nestjs/index.cjs"}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","typecheck":"tsc --noEmit","lint":"eslint src/","prepublishOnly":"npm run build && npm run test && npm run lint"},"keywords":["http","axios","circuit-breaker","retry","result","pipeline","cancel","nestjs","node","typescript"],"homepage":"https://backendkitlabs.dev/docs/http-client/","repository":{"type":"git","url":"git+https://github.com/BackendKit-labs/backendkit-monorepo.git","directory":"packages/http-client"},"bugs":{"url":"https://github.com/BackendKit-labs/backendkit-monorepo/issues"},"publishConfig":{"access":"public"},"sideEffects":false,"engines":{"node":">=18"},"dependencies":{"@backendkit-labs/circuit-breaker":"*","@backendkit-labs/pipeline":"*","@backendkit-labs/result":"*"},"peerDependencies":{"@nestjs/common":">=10.0.0","@nestjs/core":">=10.0.0","axios":">=1.0.0","rxjs":">=7.0.0"},"peerDependenciesMeta":{"@nestjs/common":{"optional":true},"@nestjs/core":{"optional":true},"rxjs":{"optional":true}},"devDependencies":{"@eslint/js":"^9.39.4","@nestjs/common":"^10.0.0","@nestjs/core":"^10.0.0","@types/node":"^22.0.0","axios":"^1.7.0","axios-mock-adapter":"^2.1.0","eslint":"^9.0.0","reflect-metadata":"^0.2.0","rxjs":"^7.8.0","tsup":"^8.0.0","typescript":"^5.5.0","typescript-eslint":"^8.59.3","vitest":"^2.0.0"},"gitHead":"8f45501f784ed112b72b9fd2199a42f70cd251e5","_id":"@backendkit-labs/http-client@0.3.0","_nodeVersion":"24.16.0","_npmVersion":"11.8.0","dist":{"integrity":"sha512-418/Vl1dU6JKS8rP25aJR76gvaSj+qeue7dOCTD7/Hichkd1mEtXGS7zy1T6tbKzffF4saK9xvH4uVcofLfWfg==","shasum":"e59dbbbb41a8db774dd2f9c7ebb79c50eeac1002","tarball":"https://registry.npmjs.org/@backendkit-labs/http-client/-/http-client-0.3.0.tgz","fileCount":21,"unpackedSize":113651,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDrWbmYQDm4x973OYDrRKgoV/9iyyyPsNI3Mi2RC41+LwIhAMt+TGOxcac5fi5jexobjQeenJRsw9KY0fDOfesJK+BF"}]},"_npmUser":{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"},"directories":{},"maintainers":[{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/http-client_0.3.0_1789404996190_0.6831141882402385"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-14T17:44:24.210Z","modified":"2026-09-14T16:56:36.500Z","0.1.0":"2026-05-14T17:44:24.599Z","0.1.1":"2026-05-14T22:19:55.394Z","0.2.0":"2026-05-16T23:09:53.157Z","0.2.1":"2026-05-18T20:33:54.659Z","0.3.0":"2026-09-14T16:56:36.329Z"},"bugs":{"url":"https://github.com/BackendKit-labs/backendkit-monorepo/issues"},"author":{"name":"BackendKit Labs","email":"hello@backendkitlabs.dev"},"license":"Apache-2.0","homepage":"https://backendkitlabs.dev/docs/http-client/","keywords":["http","axios","circuit-breaker","retry","result","pipeline","cancel","nestjs","node","typescript"],"repository":{"type":"git","url":"git+https://github.com/BackendKit-labs/backendkit-monorepo.git","directory":"packages/http-client"},"description":"Production-grade HTTP client for Node.js â€” built on axios with circuit breaker, retry with backoff, request cancellation, typed Result responses, pipeline middleware, and optional NestJS integration","maintainers":[{"name":"backendkit.dev","email":"backendkit.dev@gmail.com"}],"readme":"# @backendkit-labs/http-client\n\n[![npm version](https://img.shields.io/npm/v/@backendkit-labs/http-client?style=flat-square&color=cb3837)](https://www.npmjs.com/package/@backendkit-labs/http-client)\n[![CI](https://img.shields.io/github/actions/workflow/status/BackendKit-labs/backendkit-monorepo/ci.yml?style=flat-square&label=CI)](https://github.com/BackendKit-labs/backendkit-monorepo/actions/workflows/ci.yml)\n[![License](https://img.shields.io/npm/l/@backendkit-labs/http-client?style=flat-square)](LICENSE)\n[![Node](https://img.shields.io/node/v/@backendkit-labs/http-client?style=flat-square)](package.json)\n[![Docs](https://img.shields.io/badge/docs-backendkitlabs.dev-4f7eff?style=flat-square)](https://backendkitlabs.dev/docs/http-client/)\n\n> Production-grade HTTP client for Node.js — built on axios with circuit breaker, retry with exponential backoff, typed `Result<T, E>` responses, request cancellation, pre-request pipeline middleware, and optional NestJS DI integration.\n\nEvery method returns `Result<HttpResponse<T>, HttpClientError>` — no try/catch needed, no unhandled rejections, always typed.\n\n---\n\n## Installation\n\n```bash\nnpm install @backendkit-labs/http-client axios\n```\n\nNestJS peer dependencies (only for the `/nestjs` subpath):\n\n```bash\nnpm install @nestjs/common @nestjs/core rxjs\n```\n\n---\n\n## TypeScript Configuration\n\n### Subpath exports (`/nestjs`)\n\nThis package uses the `exports` field in `package.json` to expose the `/nestjs` subpath. TypeScript's ability to resolve it depends on the `moduleResolution` setting in your `tsconfig.json`.\n\n**Modern resolution (recommended) — no extra config needed:**\n\n```json\n{\n  \"compilerOptions\": {\n    \"moduleResolution\": \"bundler\"\n  }\n}\n```\n\n`\"bundler\"`, `\"node16\"`, and `\"nodenext\"` all understand the `exports` field natively.\n\n**Legacy resolution (`\"node\"`) — add `paths` aliases:**\n\n```json\n{\n  \"compilerOptions\": {\n    \"moduleResolution\": \"node\",\n    \"paths\": {\n      \"@backendkit-labs/http-client/nestjs\": [\n        \"./node_modules/@backendkit-labs/http-client/dist/nestjs/index.d.ts\"\n      ]\n    }\n  }\n}\n```\n\n**NestJS decorator support:**\n\n```json\n{\n  \"compilerOptions\": {\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true\n  }\n}\n```\n\nAnd in your `main.ts`, before anything else:\n\n```typescript\nimport 'reflect-metadata';\n```\n\n---\n\n## Quick Start\n\n```typescript\nimport { HttpClient } from '@backendkit-labs/http-client';\n\nconst client = new HttpClient({\n  baseURL: 'https://api.example.com',\n  timeout: 5_000,\n});\n\n// All methods return Result<HttpResponse<T>, HttpClientError>\nconst result = await client.get<User[]>('/users');\n\nif (result.ok) {\n  console.log(result.value.data);   // User[]\n  console.log(result.value.status); // 200\n} else {\n  console.error(result.error.type);   // 'http' | 'network' | 'timeout' | 'cancelled' | 'circuit-open'\n  console.error(result.error.status); // 404, 500, etc. (for 'http' type)\n}\n```\n\n---\n\n## Configuration\n\n```typescript\nconst client = new HttpClient({\n  baseURL:  'https://api.example.com',\n  timeout:  10_000,          // default: 10 000 ms\n  headers:  { 'X-API-Key': 'secret' },\n\n  // Retry with exponential backoff + jitter\n  retry: {\n    attempts:    3,           // retries after first failure\n    delayMs:     100,\n    maxDelayMs:  5_000,\n    jitter:      true,\n    shouldRetry: (err) => err.type === 'network' || err.type === 'timeout',\n  },\n\n  // Circuit breaker -- by default, 4xx responses are business errors and never\n  // trip it; network errors, timeouts, and 5xx responses do. Pass a custom\n  // `isFailure` to override.\n  circuitBreaker: {\n    failureThreshold:  50,    // % of calls that must fail to open the circuit\n    minimumCalls:      5,     // minimum calls before evaluating thresholds\n    slidingWindowSize: 10,\n    openTimeoutMs:     30_000,\n  },\n\n  // Pre-request middleware steps\n  steps: [authStep, correlationIdStep],\n});\n```\n\n---\n\n## HTTP Methods\n\nAll methods accept an optional `RequestConfig`:\n\n```typescript\ninterface RequestConfig {\n  headers?:       Record<string, string>;\n  params?:        Record<string, unknown>;   // query string parameters\n  timeout?:       number;                    // per-request override\n  cancelKey?:     string;                    // key to cancel this request\n  correlationId?: string;\n}\n```\n\n```typescript\nclient.get<T>(url, config?)\nclient.post<T>(url, data?, config?)\nclient.put<T>(url, data?, config?)\nclient.patch<T>(url, data?, config?)\nclient.delete<T>(url, config?)\n```\n\n---\n\n## Error Types\n\n```typescript\ntype HttpErrorType = 'http' | 'network' | 'timeout' | 'cancelled' | 'circuit-open';\n\ninterface HttpClientError {\n  type:     HttpErrorType;\n  message:  string;\n  status?:  number;   // only for 'http'\n  data?:    unknown;  // response body, only for 'http'\n  cause?:   unknown;  // original axios error\n}\n```\n\n---\n\n## Request Cancellation\n\nRegister a `cancelKey` on the request and cancel by key at any time:\n\n```typescript\nconst promise = client.get('/long-poll', { cancelKey: 'my-poll' });\n\n// Cancel a specific request\nclient.cancelRequest('my-poll');\n\n// Cancel all in-flight requests\nclient.cancelAll();\n\nconst result = await promise;\nif (!result.ok && result.error.type === 'cancelled') {\n  // handle cancellation\n}\n```\n\n---\n\n## Pipeline Middleware\n\nPre-request middleware steps transform the `HttpCtx` before each request. Steps are powered by `@backendkit-labs/pipeline`.\n\n```typescript\nimport type { PipelineStep, StepResult } from '@backendkit-labs/pipeline';\nimport { Ok } from '@backendkit-labs/pipeline';\nimport type { HttpCtx, HttpClientError } from '@backendkit-labs/http-client';\n\nconst authStep: PipelineStep<HttpCtx, HttpClientError> = {\n  stepName: 'auth',\n  async handle(ctx): Promise<StepResult<HttpCtx, HttpClientError>> {\n    const token = await tokenStore.get();\n    return Ok({ ...ctx, headers: { ...ctx.headers, Authorization: `Bearer ${token}` } });\n  },\n};\n\nconst client = new HttpClient({ steps: [authStep] });\n```\n\nA step can abort the request by returning `Err(...)`:\n\n```typescript\nimport { Err } from '@backendkit-labs/pipeline';\n\nconst rateLimitStep: PipelineStep<HttpCtx, HttpClientError> = {\n  stepName: 'rate-limit',\n  async handle(ctx): Promise<StepResult<HttpCtx, HttpClientError>> {\n    if (await rateLimiter.isExceeded()) {\n      return Err({ type: 'network', message: 'Rate limit exceeded' });\n    }\n    return Ok(ctx);\n  },\n};\n```\n\n---\n\n## Observability\n\n```typescript\n// Snapshot of lifetime counters\nclient.getMetrics();\n// → { requests, success, failed, cancelled, circuitOpen, retried }\n\n// Circuit breaker state and counters\nclient.getCircuitBreakerState();   // 'closed' | 'open' | 'half_open' | undefined\nclient.getCircuitBreakerMetrics(); // detailed metrics or undefined\n```\n\n---\n\n## NestJS Integration\n\n### Module registration\n\n```typescript\n// Define typed injection tokens\nexport const PRIMARY_API   = defineHttpClient('primary-api');\nexport const PAYMENTS_API  = defineHttpClient('payments-api');\n```\n\n```typescript\nimport { HttpClientModule } from '@backendkit-labs/http-client/nestjs';\nimport { PRIMARY_API, PAYMENTS_API } from './tokens';\n\n@Module({\n  imports: [\n    HttpClientModule.forRoot({\n      clients: [\n        { token: PRIMARY_API,  config: { baseURL: 'https://api.example.com',     retry: { attempts: 3, delayMs: 100 } } },\n        { token: PAYMENTS_API, config: { baseURL: 'https://payments.example.com', circuitBreaker: { failureThreshold: 40, minimumCalls: 3 } } },\n      ],\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n### Injection\n\n```typescript\nimport { InjectHttpClient } from '@backendkit-labs/http-client/nestjs';\nimport { PRIMARY_API } from './tokens';\n\n@Injectable()\nexport class UserService {\n  constructor(\n    @InjectHttpClient(PRIMARY_API) private readonly http: HttpClient,\n  ) {}\n\n  async getUsers(): Promise<User[]> {\n    const result = await this.http.get<User[]>('/users');\n    if (!result.ok) throw new Error(result.error.message);\n    return result.value.data;\n  }\n}\n```\n\n### Async module registration\n\n```typescript\nHttpClientModule.forRootAsync({\n  imports: [ConfigModule],\n  inject:  [ConfigService],\n  useFactory: (config: ConfigService) => ({\n    clients: [{\n      token:  PRIMARY_API,\n      config: { baseURL: config.get('API_URL'), timeout: config.get('API_TIMEOUT') },\n    }],\n  }),\n}),\n```\n\n---\n\n## Named Clients\n\n```typescript\nimport { defineHttpClient, HttpClientToken } from '@backendkit-labs/http-client';\n\nexport const GITHUB_API: HttpClientToken = defineHttpClient('github-api');\n\n// Provides the token's symbol as the NestJS DI token:\n// Inject with @InjectHttpClient(GITHUB_API)\n```\n\n---\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}