{"_id":"@021.is/spine-http","_rev":"2-d3894ac731483f2053cfe2b52b3b9306","name":"@021.is/spine-http","dist-tags":{"latest":"0.4.3"},"versions":{"0.4.0":{"name":"@021.is/spine-http","version":"0.4.0","license":"MIT","_id":"@021.is/spine-http@0.4.0","maintainers":[{"name":"edvone","email":"edvard@edvone.dev"}],"homepage":"https://github.com/021is/spine-ts#readme","bugs":{"url":"https://github.com/021is/spine-ts/issues"},"dist":{"shasum":"bfb6ffb431232c24d56e4a3174ba7884f9a3c3bb","tarball":"https://registry.npmjs.org/@021.is/spine-http/-/spine-http-0.4.0.tgz","fileCount":4,"integrity":"sha512-o6roV5S2hA+Qc2OWJz6AaIwwoBxZ1GUp8dJrl7vII/eP6dE5orWupKuPeRWiJc2jkrOb39g/G4GzqKTfoXiFxA==","signatures":[{"sig":"MEUCIQDz+9g8Sjc6LON7kFpaDMuDz1RxsmC+UFULtGI+X1UV0wIgMnGPERh7UEVyoYlw6U9Wskrl9w/+8y+y9SBOBUldDHI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8661},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e4434c6f59db8f586e0f05ffdb3b88a96e68e67b","scripts":{"build":"tsup src/index.ts --format esm --dts --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"edvone","email":"edvard@edvone.dev"},"repository":{"url":"git+https://github.com/021is/spine-ts.git","type":"git","directory":"packages/http"},"_npmVersion":"10.9.4","description":"Typed HTTP client base with resilience defaults (timeout, retry, circuit-break). TS twin of a proven Kotlin REST kit.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"@021.is/spine-errors":"^0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/spine-http_0.4.0_1779981947996_0.06767824091947716","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@021.is/spine-http","version":"0.4.3","license":"MIT","description":"Typed HTTP client base with resilience defaults (timeout, retry, circuit-break). TS twin of a proven Kotlin REST kit.","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsup src/index.ts --format esm --dts --clean","typecheck":"tsc --noEmit"},"dependencies":{"@021.is/spine-errors":"^0.4.3"},"repository":{"type":"git","url":"git+https://github.com/021is/spine-ts.git","directory":"packages/http"},"publishConfig":{"access":"public"},"_id":"@021.is/spine-http@0.4.3","gitHead":"b9f9333776fa55686cc2feb05f851aa6000b0e05","bugs":{"url":"https://github.com/021is/spine-ts/issues"},"homepage":"https://github.com/021is/spine-ts#readme","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-H/Cjh32/Gvf7aIM4aVQrQWHTk/2CEK9WN8u/h/kV9OzdlmNKIFHHR4q99k3gjBTS5HU7Y8KsQzTCJPznrvDmBA==","shasum":"aa4865ab8c52e1bee0eba296fedb91a1c4038b5a","tarball":"https://registry.npmjs.org/@021.is/spine-http/-/spine-http-0.4.3.tgz","fileCount":5,"unpackedSize":10141,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCEr7QcOBbH0mx0Rd0OqtzKzAYGcTEDUiSTkbBwceRYCwIhAI9hSXkShsKQY9T+Gdd7aXPZxYQpwBsaraBJ4EDPtd19"}]},"_npmUser":{"name":"edvone","email":"edvard@edvone.dev"},"directories":{},"maintainers":[{"name":"edvone","email":"edvard@edvone.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spine-http_0.4.3_1779995238118_0.33513276463220687"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-28T15:25:47.861Z","modified":"2026-05-28T19:07:18.392Z","0.4.0":"2026-05-28T15:25:48.158Z","0.4.3":"2026-05-28T19:07:18.266Z"},"bugs":{"url":"https://github.com/021is/spine-ts/issues"},"license":"MIT","homepage":"https://github.com/021is/spine-ts#readme","repository":{"type":"git","url":"git+https://github.com/021is/spine-ts.git","directory":"packages/http"},"description":"Typed HTTP client base with resilience defaults (timeout, retry, circuit-break). TS twin of a proven Kotlin REST kit.","maintainers":[{"name":"edvone","email":"edvard@edvone.dev"}],"readme":"# @021.is/spine-http\n\nTyped fetch client with resilience defaults: per-request timeout, retry on idempotent failures, circuit breaker per host. Auto-unwraps `ResponseDto` envelopes from sibling packages.\n\n## Use\n\n```ts\nimport { SpineHttpClient } from \"@021.is/spine-http\";\n\nconst dcEvents = new SpineHttpClient({\n  baseUrl: \"https://api.example.com\",\n  timeoutMs: 1000,             // default\n  retries: 1,                  // default — retries idempotent methods only\n  failureThreshold: 5,         // default — open circuit after 5 fails in 10s\n  windowMs: 10_000,\n  defaultHeaders: { \"x-service\": \"my-app\" },\n  authToken: async () => mintServiceJwt(), // optional\n});\n\n// Auto-unwraps ResponseDto<Event> if peer is your service\nconst event = await dcEvents.get<Event>(`/events/${id}`);\n```\n\n## Resilience defaults (tuned for service-to-service)\n\n| | Default | Tunable |\n|---|---|---|\n| Timeout per request | 1000 ms | `timeoutMs` |\n| Retries on GET/HEAD/PUT/DELETE | 1 | `retries` |\n| Circuit-break threshold | 5 failures in 10s | `failureThreshold`, `windowMs` |\n| Retries on POST/PATCH | 0 (POST is non-idempotent by default) | — |\n\n## Circuit behavior\n\nAfter `failureThreshold` failures within `windowMs`, the circuit opens for the remainder of `windowMs`. New requests fail fast with `circuit open — Xs remaining` until the window expires, then probe-mode resumes.\n\n## ResponseDto unwrap\n\nIf peer returns `{ success, data, code, ... }` shape (i.e., they use spine-errors), the client unwraps and returns `data` directly. If `success: false`, throws an Error carrying `code` + `errorKey`.\n","readmeFilename":"README.md"}