# @budarin/http-constants

TypeScript библиотека с константами для HTTP протокола.

В Node.js экосистеме есть отдельные пакеты для HTTP статусов (`http-status-codes`) и MIME типов (`mime-types`), но нет единого модуля, объединяющего все необходимые HTTP константы в одном месте.

## Установка

```bash
npm install @budarin/http-constants
# или
pnpm add @budarin/http-constants
```

## Использование

> ⚡ **Оптимизация бандла**: Библиотека использует **subpath exports** (например, `/methods`, `/headers`, ...), поэтому импорт отдельных модулей дает идеальный tree-shaking.
>
> Также поддерживается корневой entry `@budarin/http-constants` с **именованными (named) exports**, если нужен единый импорт “в одну строку”.

## Доступные константы

### HTTP методы (`methods`)

- `HTTP_METHOD_GET`, `HTTP_METHOD_POST`, `HTTP_METHOD_PUT`, `HTTP_METHOD_DELETE`, `HTTP_METHOD_PATCH`, `HTTP_METHOD_OPTIONS`, `HTTP_METHOD_HEAD`

### HTTP статус коды (`statuses`) - 47 статусов

- **1xx Информационные**: `HTTP_STATUS_CONTINUE`, `HTTP_STATUS_SWITCHING_PROTOCOLS`, `HTTP_STATUS_PROCESSING`, `HTTP_STATUS_EARLY_HINTS`
- **2xx Успешные**: `HTTP_STATUS_OK`, `HTTP_STATUS_CREATED`, `HTTP_STATUS_ACCEPTED`, `HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION`, `HTTP_STATUS_NO_CONTENT`, `HTTP_STATUS_RESET_CONTENT`, `HTTP_STATUS_PARTIAL_CONTENT`, `HTTP_STATUS_MULTI_STATUS`, `HTTP_STATUS_ALREADY_REPORTED`, `HTTP_STATUS_IM_USED`
- **3xx Перенаправления**: `HTTP_STATUS_MULTIPLE_CHOICES`, `HTTP_STATUS_MOVED_PERMANENTLY`, `HTTP_STATUS_FOUND`, `HTTP_STATUS_SEE_OTHER`, `HTTP_STATUS_NOT_MODIFIED`, `HTTP_STATUS_USE_PROXY`, `HTTP_STATUS_TEMPORARY_REDIRECT`, `HTTP_STATUS_PERMANENT_REDIRECT`
- **4xx Ошибки клиента**: `HTTP_STATUS_BAD_REQUEST`, `HTTP_STATUS_UNAUTHORIZED`, `HTTP_STATUS_PAYMENT_REQUIRED`, `HTTP_STATUS_FORBIDDEN`, `HTTP_STATUS_NOT_FOUND`, `HTTP_STATUS_METHOD_NOT_ALLOWED`, `HTTP_STATUS_NOT_ACCEPTABLE`, `HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED`, `HTTP_STATUS_REQUEST_TIMEOUT`, `HTTP_STATUS_CONFLICT`, `HTTP_STATUS_GONE`, `HTTP_STATUS_LENGTH_REQUIRED`, `HTTP_STATUS_PRECONDITION_FAILED`, `HTTP_STATUS_PAYLOAD_TOO_LARGE`, `HTTP_STATUS_URI_TOO_LONG`, `HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE`, `HTTP_STATUS_RANGE_NOT_SATISFIABLE`, `HTTP_STATUS_EXPECTATION_FAILED`, `HTTP_STATUS_IM_A_TEAPOT`, `HTTP_STATUS_MISDIRECTED_REQUEST`, `HTTP_STATUS_UNPROCESSABLE_ENTITY`, `HTTP_STATUS_LOCKED`, `HTTP_STATUS_FAILED_DEPENDENCY`, `HTTP_STATUS_TOO_EARLY`, `HTTP_STATUS_UPGRADE_REQUIRED`, `HTTP_STATUS_PRECONDITION_REQUIRED`, `HTTP_STATUS_TOO_MANY_REQUESTS`, `HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE`, `HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS`
- **5xx Ошибки сервера**: `HTTP_STATUS_INTERNAL_SERVER_ERROR`, `HTTP_STATUS_NOT_IMPLEMENTED`, `HTTP_STATUS_BAD_GATEWAY`, `HTTP_STATUS_SERVICE_UNAVAILABLE`, `HTTP_STATUS_GATEWAY_TIMEOUT`, `HTTP_STATUS_VERSION_NOT_SUPPORTED `, `HTTP_STATUS_VARIANT_ALSO_NEGOTIATES`, `HTTP_STATUS_INSUFFICIENT_STORAGE`, `HTTP_STATUS_LOOP_DETECTED`, `HTTP_STATUS_NOT_EXTENDED`, `HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED`

### HTTP ответ

- **OK**: 'OK'

### HTTP заголовки (`headers`) - 80+ заголовков

- **General**: `HEADER_CACHE_CONTROL`, `HEADER_CONNECTION`, `HEADER_DATE`, `HEADER_PRAGMA`, `HEADER_TRAILER`, `HEADER_TRANSFER_ENCODING`, `HEADER_UPGRADE`, `HEADER_VIA`, `HEADER_WARNING`
- **Request**: `HEADER_ACCEPT`, `HEADER_ACCEPT_CHARSET`, `HEADER_ACCEPT_ENCODING`, `HEADER_ACCEPT_LANGUAGE`, `HEADER_AUTHORIZATION`, `HEADER_EXPECT`, `HEADER_FROM`, `HEADER_HOST`, `HEADER_IF_MATCH`, `HEADER_IF_MODIFIED_SINCE`, `HEADER_IF_NONE_MATCH`, `HEADER_IF_RANGE`, `HEADER_IF_UNMODIFIED_SINCE`, `HEADER_MAX_FORWARDS`, `HEADER_PROXY_AUTHORIZATION`, `HEADER_RANGE`, `HEADER_REFERER`, `HEADER_TE`, `HEADER_USER_AGENT`
- **Response**: `HEADER_ACCEPT_RANGES`, `HEADER_AGE`, `HEADER_ETAG`, `HEADER_LOCATION`, `HEADER_PROXY_AUTHENTICATE`, `HEADER_RETRY_AFTER`, `HEADER_SERVER`, `HEADER_VARY`, `HEADER_WWW_AUTHENTICATE`
- **Entity**: `HEADER_ALLOW`, `HEADER_CONTENT_ENCODING`, `HEADER_CONTENT_LANGUAGE`, `HEADER_CONTENT_LENGTH`, `HEADER_CONTENT_LOCATION`, `HEADER_CONTENT_MD5`, `HEADER_CONTENT_RANGE`, `HEADER_CONTENT_TYPE`, `HEADER_EXPIRES`, `HEADER_LAST_MODIFIED`
- **Security**: `HEADER_CONTENT_SECURITY_POLICY`, `HEADER_STRICT_TRANSPORT_SECURITY`, `HEADER_X_CONTENT_TYPE_OPTIONS`, `HEADER_X_FRAME_OPTIONS`, `HEADER_X_XSS_PROTECTION`, `HEADER_REFERRER_POLICY`, `HEADER_PERMISSIONS_POLICY`
- **CORS**: `HEADER_ACCESS_CONTROL_ALLOW_ORIGIN`, `HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS`, `HEADER_ACCESS_CONTROL_ALLOW_HEADERS`, `HEADER_ACCESS_CONTROL_ALLOW_METHODS`, и др.
- **Custom**: `HEADER_X_FORWARDED_FOR`, `HEADER_X_FORWARDED_HOST`, `HEADER_X_FORWARDED_PROTO`, `HEADER_X_REAL_IP`, `HEADER_X_REQUESTED_WITH`, `HEADER_X_CSRF_TOKEN`, `HEADER_X_API_KEY`
- **Cookie**: `HEADER_COOKIE`, `HEADER_SET_COOKIE`
- **WebSocket**: `HEADER_SEC_WEBSOCKET_KEY`, `HEADER_SEC_WEBSOCKET_ACCEPT`, `HEADER_SEC_WEBSOCKET_VERSION`, `HEADER_SEC_WEBSOCKET_PROTOCOL`

### MIME Types (`mime-types`) - 68 MIME-типов

- **Application**: `MIME_APPLICATION_JSON`, `MIME_APPLICATION_XML`, `MIME_APPLICATION_X_WWW_FORM_URLENCODED`, `MIME_APPLICATION_OCTET_STREAM`, `MIME_APPLICATION_PDF`, `MIME_APPLICATION_ZIP`, `MIME_APPLICATION_GZIP`, `MIME_APPLICATION_JAVASCRIPT`, `MIME_APPLICATION_ATOM_XML`, `MIME_APPLICATION_RSS_XML`, `MIME_APPLICATION_XHTML_XML`, `MIME_APPLICATION_SOAP_XML`, `MIME_APPLICATION_JSON_PATCH`, `MIME_APPLICATION_LD_JSON`, `MIME_APPLICATION_VND_API_JSON`, `MIME_APPLICATION_HAL_JSON`, `MIME_APPLICATION_PROBLEM_JSON`, и др.
- **Text**: `MIME_TEXT_PLAIN`, `MIME_TEXT_HTML`, `MIME_TEXT_CSS`, `MIME_TEXT_JAVASCRIPT`, `MIME_TEXT_XML`, `MIME_TEXT_CSV`, `MIME_TEXT_MARKDOWN`, `MIME_TEXT_CALENDAR`, `MIME_TEXT_VCARD`, `MIME_TEXT_RTF`
- **Image**: `MIME_IMAGE_JPEG`, `MIME_IMAGE_PNG`, `MIME_IMAGE_GIF`, `MIME_IMAGE_WEBP`, `MIME_IMAGE_SVG_XML`, `MIME_IMAGE_BMP`, `MIME_IMAGE_ICO`, `MIME_IMAGE_TIFF`, `MIME_IMAGE_AVIF`, `MIME_IMAGE_HEIC`, `MIME_IMAGE_HEIF`
- **Audio**: `MIME_AUDIO_MPEG`, `MIME_AUDIO_WAV`, `MIME_AUDIO_OGG`, `MIME_AUDIO_MP4`, `MIME_AUDIO_AAC`, `MIME_AUDIO_FLAC`, `MIME_AUDIO_WEBM`, `MIME_AUDIO_X_WAV`
- **Video**: `MIME_VIDEO_MP4`, `MIME_VIDEO_WEBM`, `MIME_VIDEO_OGG`, `MIME_VIDEO_AVI`, `MIME_VIDEO_QUICKTIME`, `MIME_VIDEO_X_FLV`, `MIME_VIDEO_3GPP`, `MIME_VIDEO_X_MS_WMV`
- **Multipart**: `MIME_MULTIPART_FORM_DATA`, `MIME_MULTIPART_BYTERANGES`, `MIME_MULTIPART_ALTERNATIVE`, `MIME_MULTIPART_MIXED`
- **Font**: `MIME_FONT_WOFF`, `MIME_FONT_WOFF2`, `MIME_FONT_TTF`, `MIME_FONT_OTF`
- **Message**: `MIME_MESSAGE_RFC822`, `MIME_MESSAGE_PARTIAL`, `MIME_MESSAGE_EXTERNAL_BODY`
- **Model**: `MIME_MODEL_GLTF_JSON`, `MIME_MODEL_GLTF_BINARY`

### Content Types (`content-types`) - Legacy Support

Для обратной совместимости доступны константы с префиксом `CONTENT_TYPE_`:

- **Application**: `CONTENT_TYPE_APPLICATION_JSON`, `CONTENT_TYPE_APPLICATION_XML`, и др.
- **Text**: `CONTENT_TYPE_TEXT_PLAIN`, `CONTENT_TYPE_TEXT_HTML`, и др.
- **Image**: `CONTENT_TYPE_IMAGE_JPEG`, `CONTENT_TYPE_IMAGE_PNG`, и др.
- И все остальные с аналогичным префиксом

### Service Worker messages(`service-worker`)

- **События**: `SW_EVENT_INSTALL, SW_EVENT_ACTIVATE, SW_EVENT_FETCH,, SW_EVENT_MESSAGE, SW_EVENT_SYNC, SW_EVENT_PERIODICSYNC,SW_EVENT_PUSH, SW_EVENT_ERROR, SW_EVENT_MESSAGEERROR, SW_EVENT_UNHANDLEDREJECTION, SW_EVENT_REJECTIONHANDLED, SW_EVENT_STATECHANGE,SW_EVENT_UPDATEFOUND`
- **Состояния**: `SW_STATE_ACTIVATED, SW_STATE_ACTIVATING, SW_STATE_INSTALLED, SW_STATE_INSTALLING, SW_STATE_PARSED, SW_STATE_REDUNDANT`
- **Команды**: `SW_MSG_INSTALLED, SW_MSG_INSTALLING, SW_MSG_START_INSTALLING, SW_MSG_SKIP_WAITING, SW_MSG_PAGE_RELOAD`

## Пример

```typescript
import {
    HTTP_METHOD_GET,
    HTTP_METHOD_POST,
    HEADER_CONTENT_TYPE,
    HEADER_CONTENT_SECURITY_POLICY,
    HEADER_X_FRAME_OPTIONS,
    HTTP_STATUS_OK,
    MIME_APPLICATION_JSON,
} from '@budarin/http-constants';

// Использование в Express.js
app.get('/api/users', (req, res) => {
    if (req.method === HTTP_METHOD_GET) {
        res.status(HTTP_STATUS_OK).json({ users: [] });
    }
});

// Использование в fetch
fetch('/api/data', {
    method: HTTP_METHOD_POST,
    headers: {
        [HEADER_CONTENT_TYPE]: MIME_APPLICATION_JSON,
    },
});

// Использование заголовков безопасности
res.setHeader(HEADER_CONTENT_SECURITY_POLICY, "default-src 'self'");
res.setHeader(HEADER_X_FRAME_OPTIONS, 'DENY');
```

## Лицензия

MIT
