# Framework

> HTTP stack for marketplace-sdk — Axios wrapper, retries, concurrency, params serialization, logging hook

- Skill: `contentstack/framework` (Agent Skill)
- Install (CLI): `npx skillmds@latest add contentstack/framework`
- Raw SKILL.md: https://api.skillmd.com/api/skills/contentstack/framework/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools, Integrations & APIs, Web & Frontend
- Author: contentstack (https://skillmd.com/u/contentstack)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/contentstack/framework

---


# HTTP framework (`lib/core`)

This repo separates **domain** (`lib/marketplace/**`) from a small **HTTP framework** in `lib/core/`. Use this skill when changing transport behavior.

## `contentstackHTTPClient.js`

- Builds an **axios** instance with `baseURL` from `endpoint` or `protocol://hostname:port` + `basePath`.
- **Defaults:** `timeout` 30000, `retryOnError` true, `retryCondition` retries **429** (overridable).
- **Headers:** Maps `apiKey` / `accessToken` from config if present.
- **Params:** Custom `paramsSerializer` using **Qs**; nests JSON `query` with `encodeURIComponent`.
- **Concurrency:** Attaches `ConcurrencyQueue` to the instance.
- **Logging:** `logHandler` default from `messageHandler.js` (`httpLogHandler`).

## `concurrency-queue.js`

- Limits parallel in-flight requests (`maxRequests` from client params). Changes here affect all API modules sharing the same HTTP instance.

## `messageHandler.js`

- Central place for HTTP log/telemetry hooks. Keep implementations safe for browsers and Node bundles.

## When to edit

- Retry/backoff policy, timeout, or serializer → prefer extending **existing** options on `client()` rather than one-off axios calls in marketplace modules.
- New global header behavior → `contentstack.js` + potentially `contentstackHTTPClient.js` for low-level concerns.

## Testing

- **`test/unit/ContentstackHTTPClient-test.js`** and **`concurrency-Queue-test.js`** should cover behavioral changes; use mocks rather than live HTTP when possible.

