# Cosmo VPN Panel — JavaScript SDK

JavaScript-клиент для [Seller API](https://github.com/cosmo-vpn/cosmo-panel) панели Cosmo VPN.

Работает в **браузере** и **Node.js** (14+). Использует нативный `fetch`.

## Установка

### npm

```bash
npm install cosmo-panel-client
```

### Прямое подключение (браузер)

```html
<script src="cosmo-panel.js"></script>
<script>
  const client = new CosmoClient({ apiKey: 'wgp_...', baseUrl: 'http://163.5.153.53:8000' });
</script>
```

### ES-модули

```js
import { CosmoClient } from './cosmo-panel.js';
```

## Быстрый старт

```js
const { CosmoClient } = require('cosmo-panel-client');
// или: import { CosmoClient } from 'cosmo-panel-client';

const client = new CosmoClient({
  apiKey: 'wgp_your_api_key_here',
  baseUrl: 'http://163.5.153.53:8000',
});

// Создаём ключ
const key = await client.createKey({
  name: 'Иван Петров',
  days: 30,
  trafficGb: 50,
  email: 'ivan@example.com',
});
console.log('Создан ключ:', key.id);

// Список ключей
const keys = await client.listKeys();
keys.items?.forEach(k => console.log(k.id, k.name));

// Детали
const info = await client.getKey(key.id);
console.log('Статус:', info.status);

// Продлить
await client.extendKey(key.id, { days: 30 });

// Добавить трафик
await client.addTraffic(key.id, { gb: 10 });

// Приостановить / активировать
await client.suspendKey(key.id);
await client.activateKey(key.id);

// Изменить параметры
await client.updateKey(key.id, { name: 'Пётр Иванов', maxDevices: 3 });

// Функции
await client.updateKeyFeatures(key.id, { obfuscation: true, adblock: true });

// Скачать конфиг
const configBlob = await client.getKeyConfig(key.id);
// Браузер: создать ссылку для скачивания
const url = URL.createObjectURL(configBlob);
const a = document.createElement('a');
a.href = url;
a.download = `${key.id}.conf`;
a.click();

// Удалить
await client.deleteKey(key.id);
```

## Обработка ошибок

```js
const { CosmoClient, CosmoError, CosmoRequestError } = require('cosmo-panel-client');

const client = new CosmoClient({ apiKey: 'wgp_...', baseUrl: 'http://163.5.153.53:8000' });

try {
  const key = await client.createKey({ name: 'Тест', days: 30, trafficGb: 10 });
  console.log('Создан:', key.id);
} catch (err) {
  if (err instanceof CosmoRequestError) {
    console.error('Ошибка сети:', err.message);
  } else if (err instanceof CosmoError) {
    console.error(`Ошибка API (${err.statusCode}):`, err.message);
  } else {
    console.error('Неизвестная ошибка:', err);
  }
}
```

## Настройка

```js
const client = new CosmoClient({
  apiKey: 'wgp_...',
  baseUrl: 'http://163.5.153.53:8000',
  timeout: 60000,     // Таймаут в мс (по умолчанию 30000)
  maxRetries: 5,      // Максимум повторных попыток (по умолчанию 3)
});
```

## Все методы

| Метод | HTTP | Эндпоинт | Описание |
|-------|------|----------|----------|
| `createKey({...})` | POST | `/api/v1/keys` | Создать ключ |
| `listKeys({...})` | GET | `/api/v1/keys` | Список ключей |
| `getKey(id)` | GET | `/api/v1/keys/{id}` | Детали ключа |
| `getKeyConfig(id)` | GET | `/api/v1/keys/{id}/config` | Скачать конфиг |
| `extendKey(id, {days})` | POST | `/api/v1/keys/{id}/extend` | Продлить ключ |
| `addTraffic(id, {gb})` | POST | `/api/v1/keys/{id}/traffic` | Добавить трафик |
| `suspendKey(id)` | POST | `/api/v1/keys/{id}/suspend` | Приостановить |
| `activateKey(id)` | POST | `/api/v1/keys/{id}/activate` | Активировать |
| `updateKey(id, {...})` | PATCH | `/api/v1/keys/{id}` | Изменить параметры |
| `updateKeyFeatures(id, {...})` | PATCH | `/api/v1/keys/{id}/features` | Изменить функции |
| `deleteKey(id)` | DELETE | `/api/v1/keys/{id}` | Удалить ключ |

## Работа в Node.js

В Node.js 18+ используется встроенный `fetch`. Для версий 14–17 добавьте полифил:

```bash
npm install node-fetch
```

```js
// В начале приложения
global.fetch = require('node-fetch');
global.AbortController = require('abort-controller');
```

Или используйте Node.js 18+.

## Лицензия

MIT
