A TypeScript/JavaScript client library for interacting with the WgEasy (WireGuard Easy) API. This library provides a type-safe, event-driven interface for managing WireGuard clients, configurations, and monitoring server status.
- ✅ Type-safe - Full TypeScript support with comprehensive type definitions
- ✅ Event-driven - Built-in event emitter for real-time client updates
- ✅ Easy to use - Simple and intuitive API
- ✅ Comprehensive - Complete coverage of WgEasy API endpoints
- ✅ Collection methods - Powerful filtering, sorting, and pagination
- ✅ Bulk operations - Create, enable, disable, and delete multiple clients at once
- ✅ Configuration management - Export, parse, and generate WireGuard config files
- ✅ QR code generation - Generate QR codes for easy client setup
- ✅ Caching - Built-in request caching for better performance
- ✅ Error handling - Comprehensive exception types
- ✅ Logging - Configurable logging levels
npm install api-wgeasyimport { WgEasyClient, LogLevel } from 'api-wgeasy';
async function main() {
// Create client with auto-connect
const wg = await WgEasyClient.connect({
baseUrl: 'http://localhost:51821',
password: 'your-password',
logLevel: LogLevel.INFO,
});
// Get all clients
const clients = await wg.getClients();
console.log(`Total clients: ${clients.size}`);
// Create a new client
const newClient = await wg.createClient('my-device');
console.log(`Created: ${newClient.name}`);
// Get client configuration
const config = await wg.getClientConfig(newClient.id);
console.log('Configuration:', config);
// Get QR code
const qrCode = await wg.getClientQrCode(newClient.id);
console.log('QR Code:', qrCode);
// Cleanup
await wg.logout();
}
main();const wg = new WgEasyClient({
baseUrl: 'http://localhost:51821',
password: 'your-password',
timeout: 30000,
retryAttempts: 3,
retryDelay: 1000,
logLevel: LogLevel.DEBUG,
});// Set environment variables:
// WG_EASY_BASE_URL=http://localhost:51821
// WG_EASY_PASSWORD=your-password
const wg = WgEasyClient.fromEnv();// Automatically initializes and authenticates
const wg = await WgEasyClient.connect({
baseUrl: 'http://localhost:51821',
password: 'your-password',
});// Get all clients
const clients = await wg.getClients();
// Get client by ID
const client = await wg.getClient('client-id');
// Create client
const newClient = await wg.createClient('device-name');
// Enable/Disable client
await wg.enableClient('client-id');
await wg.disableClient('client-id');
// Delete client
await wg.deleteClient('client-id');// Bulk operations
const clients = await wg.clients.bulkCreate(['device-1', 'device-2', 'device-3']);
await wg.clients.bulkEnable(['id1', 'id2', 'id3']);
await wg.clients.bulkDisable(['id1', 'id2', 'id3']);
await wg.clients.bulkDelete(['id1', 'id2', 'id3']);
// Filtering
const onlineClients = await wg.clients.getOnline();
const enabledClients = await wg.clients.getEnabled();
// Search
const results = await wg.clients.search('device');
// Complex filtering
const filtered = await wg.clients.filter({
enabled: true,
hasRecentHandshake: true,
minTransferTx: 1024 * 1024, // 1MB minimum
});
// Statistics
const stats = await wg.clients.getStatistics();
console.log(stats);
// {
// total: 10,
// enabled: 8,
// disabled: 2,
// online: 5,
// offline: 5,
// totalTransferRx: 1024000,
// totalTransferTx: 2048000
// }
// Pagination
const page = await wg.clients.paginate({ page: 1, limit: 10 });The getClients() method returns a ClientCollection with powerful methods:
const clients = await wg.getClients();
// Filtering
const enabled = clients.filterBy({ enabled: true });
const online = clients.getOnline();
const searchResults = clients.search('device');
// Sorting
const byName = clients.sortByName();
const byTraffic = clients.sortByTransfer();
const byDate = clients.sortByCreatedAt(false); // newest first
// Chaining
const result = clients
.filterBy({ enabled: true })
.sortByName()
.paginate({ page: 1, limit: 5 });
// Statistics
const stats = clients.getStatistics();// Export single client configuration
const export = await wg.configs.exportClient('client-id');
console.log(export.configuration);
console.log(export.qrCode);
// Export all clients
const exports = await wg.configs.exportAllClients();
for (const exp of exports) {
const { filename, content } = wg.configs.generateConfigFile(
exp.configuration,
exp.clientName
);
// Save to file: fs.writeFileSync(filename, content);
}
// Parse configuration file
const config = await wg.getClientConfig('client-id');
const parsed = wg.configs.parseConfigFile(config);
console.log(parsed);The library provides an event-driven interface for monitoring client changes:
// Listen to events
wg.on<{ client: Client }>('client:created', ({ client }) => {
console.log(`Client created: ${client.name}`);
});
wg.on<{ client: Client }>('client:deleted', ({ client }) => {
console.log(`Client deleted: ${client.name}`);
});
wg.on<{ client: Client }>('client:updated', ({ client }) => {
console.log(`Client updated: ${client.name}`);
});
wg.on<{ client: Client }>('client:enabled', ({ client }) => {
console.log(`Client enabled: ${client.name}`);
});
wg.on<{ client: Client }>('client:disabled', ({ client }) => {
console.log(`Client disabled: ${client.name}`);
});
// Remove listener
wg.off('client:created', handler);
// Listen once
wg.once('client:created', handler);Note: Events are only triggered by API calls made through this client, not by manual changes in the WgEasy admin panel.
The library provides specific exception types:
import {
ClientNotFoundException,
AuthenticationException,
NetworkException,
TimeoutException,
} from 'api-wgeasy';
try {
const client = await wg.getClient('invalid-id');
} catch (error) {
if (error instanceof ClientNotFoundException) {
console.error(`Client not found: ${error.clientId}`);
} else if (error instanceof AuthenticationException) {
console.error('Authentication failed');
} else if (error instanceof NetworkException) {
console.error('Network error:', error.message);
} else if (error instanceof TimeoutException) {
console.error('Request timeout');
}
}The Client model provides useful properties and methods:
const client = await wg.getClient('client-id');
// Properties
client.id; // string
client.name; // string
client.enabled; // boolean
client.address; // string
client.publicKey; // string
client.isOnline; // boolean (based on recent handshake)
client.transferRx; // number (bytes)
client.transferTx; // number (bytes)
client.totalTransfer; // number (bytes)
client.transferRxFormatted; // string (e.g., "1.5 MB")
client.transferTxFormatted; // string
client.totalTransferFormatted; // string
client.age; // number (milliseconds)
client.ageFormatted; // string (e.g., "2d 5h")
client.lastSeenFormatted; // string | null (e.g., "5m ago")Configure logging levels:
import { LogLevel } from 'api-wgeasy';
const wg = new WgEasyClient({
baseUrl: 'http://localhost:51821',
password: 'your-password',
logLevel: LogLevel.DEBUG, // DEBUG, INFO, WARN, ERROR
});See the examples/ directory for complete examples:
- basic.ts - Basic usage and event handling
- advanced.ts - Advanced features like bulk operations, filtering, and configuration management
Main client class for interacting with WgEasy API.
Methods:
initialize()- Initialize and authenticatelogin(password?)- Login manuallylogout()- LogoutgetClients()- Get all clients (returnsClientCollection)getClient(id)- Get client by IDcreateClient(name)- Create new clientdeleteClient(id)- Delete clientenableClient(id)- Enable clientdisableClient(id)- Disable clientgetClientConfig(id)- Get client configurationgetClientQrCode(id)- Get client QR code (SVG)on(event, handler)- Subscribe to eventsoff(event, handler)- Unsubscribe from eventsonce(event, handler)- Subscribe to event once
Services:
wg.clients- ClientService for advanced client operationswg.configs- ConfigService for configuration managementwg.auth- AuthService for authentication
Advanced client operations.
Methods:
getAll()- Get all clientsgetById(id)- Get client by IDgetByName(name)- Get client by namecreate(dto)- Create clientupdate(id, dto)- Update clientdelete(id)- Delete clientenable(id)- Enable clientdisable(id)- Disable clientgetConfiguration(id)- Get configurationgetQrCode(id)- Get QR codebulkCreate(names)- Create multiple clientsbulkEnable(ids)- Enable multiple clientsbulkDisable(ids)- Disable multiple clientsbulkDelete(ids)- Delete multiple clientsfilter(filter)- Filter clientsgetOnline()- Get online clientsgetOffline()- Get offline clientsgetEnabled()- Get enabled clientsgetDisabled()- Get disabled clientssearch(query)- Search clientsgetStatistics()- Get statisticspaginate(options)- Paginate clients
Configuration management.
Methods:
exportClient(id)- Export client configurationexportAllClients()- Export all client configurationsgenerateConfigFile(config, name)- Generate config fileparseConfigFile(content)- Parse config file content
MIT License - see LICENSE file for details.
GitHub: https://github.com/Mvory9/api-wgeasy
- ✅ Типобезопасность - Полная поддержка TypeScript с подробными определениями типов
- ✅ События - Встроенный эмиттер событий для отслеживания изменений в реальном времени
- ✅ Простота использования - Простой и интуитивный API
- ✅ Полнота - Полное покрытие всех endpoints WgEasy API
- ✅ Методы коллекций - Мощная фильтрация, сортировка и пагинация
- ✅ Массовые операции - Создание, включение, отключение и удаление нескольких клиентов одновременно
- ✅ Управление конфигурациями - Экспорт, парсинг и генерация файлов конфигурации WireGuard
- ✅ Генерация QR-кодов - Генерация QR-кодов для простой настройки клиентов
- ✅ Кэширование - Встроенное кэширование запросов для лучшей производительности
- ✅ Обработка ошибок - Подробные типы исключений
- ✅ Логирование - Настраиваемые уровни логирования
npm install api-wgeasyimport { WgEasyClient, LogLevel } from 'api-wgeasy';
async function main() {
// Создание клиента с автоподключением
const wg = await WgEasyClient.connect({
baseUrl: 'http://localhost:51821',
password: 'your-password',
logLevel: LogLevel.INFO,
});
// Получить всех клиентов
const clients = await wg.getClients();
console.log(`Всего клиентов: ${clients.size}`);
// Создать нового клиента
const newClient = await wg.createClient('my-device');
console.log(`Создан: ${newClient.name}`);
// Получить конфигурацию клиента
const config = await wg.getClientConfig(newClient.id);
console.log('Конфигурация:', config);
// Получить QR-код
const qrCode = await wg.getClientQrCode(newClient.id);
console.log('QR-код:', qrCode);
// Завершение работы
await wg.logout();
}
main();const wg = new WgEasyClient({
baseUrl: 'http://localhost:51821',
password: 'your-password',
timeout: 30000,
retryAttempts: 3,
retryDelay: 1000,
logLevel: LogLevel.DEBUG,
});// Установите переменные окружения:
// WG_EASY_BASE_URL=http://localhost:51821
// WG_EASY_PASSWORD=your-password
const wg = WgEasyClient.fromEnv();// Автоматически инициализирует и аутентифицирует
const wg = await WgEasyClient.connect({
baseUrl: 'http://localhost:51821',
password: 'your-password',
});// Получить всех клиентов
const clients = await wg.getClients();
// Получить клиента по ID
const client = await wg.getClient('client-id');
// Создать клиента
const newClient = await wg.createClient('device-name');
// Включить/Отключить клиента
await wg.enableClient('client-id');
await wg.disableClient('client-id');
// Удалить клиента
await wg.deleteClient('client-id');// Массовые операции
const clients = await wg.clients.bulkCreate(['device-1', 'device-2', 'device-3']);
await wg.clients.bulkEnable(['id1', 'id2', 'id3']);
await wg.clients.bulkDisable(['id1', 'id2', 'id3']);
await wg.clients.bulkDelete(['id1', 'id2', 'id3']);
// Фильтрация
const onlineClients = await wg.clients.getOnline();
const enabledClients = await wg.clients.getEnabled();
// Поиск
const results = await wg.clients.search('device');
// Сложная фильтрация
const filtered = await wg.clients.filter({
enabled: true,
hasRecentHandshake: true,
minTransferTx: 1024 * 1024, // минимум 1MB
});
// Статистика
const stats = await wg.clients.getStatistics();
console.log(stats);
// {
// total: 10,
// enabled: 8,
// disabled: 2,
// online: 5,
// offline: 5,
// totalTransferRx: 1024000,
// totalTransferTx: 2048000
// }
// Пагинация
const page = await wg.clients.paginate({ page: 1, limit: 10 });Метод getClients() возвращает ClientCollection с мощными методами:
const clients = await wg.getClients();
// Фильтрация
const enabled = clients.filterBy({ enabled: true });
const online = clients.getOnline();
const searchResults = clients.search('device');
// Сортировка
const byName = clients.sortByName();
const byTraffic = clients.sortByTransfer();
const byDate = clients.sortByCreatedAt(false); // новые первыми
// Цепочки методов
const result = clients
.filterBy({ enabled: true })
.sortByName()
.paginate({ page: 1, limit: 5 });
// Статистика
const stats = clients.getStatistics();// Экспорт конфигурации одного клиента
const export = await wg.configs.exportClient('client-id');
console.log(export.configuration);
console.log(export.qrCode);
// Экспорт всех клиентов
const exports = await wg.configs.exportAllClients();
for (const exp of exports) {
const { filename, content } = wg.configs.generateConfigFile(
exp.configuration,
exp.clientName
);
// Сохранить в файл: fs.writeFileSync(filename, content);
}
// Парсинг файла конфигурации
const config = await wg.getClientConfig('client-id');
const parsed = wg.configs.parseConfigFile(config);
console.log(parsed);Библиотека предоставляет событийный интерфейс для мониторинга изменений:
// Подписка на события
wg.on<{ client: Client }>('client:created', ({ client }) => {
console.log(`Клиент создан: ${client.name}`);
});
wg.on<{ client: Client }>('client:deleted', ({ client }) => {
console.log(`Клиент удален: ${client.name}`);
});
wg.on<{ client: Client }>('client:updated', ({ client }) => {
console.log(`Клиент обновлен: ${client.name}`);
});
wg.on<{ client: Client }>('client:enabled', ({ client }) => {
console.log(`Клиент включен: ${client.name}`);
});
wg.on<{ client: Client }>('client:disabled', ({ client }) => {
console.log(`Клиент отключен: ${client.name}`);
});
// Удаление подписки
wg.off('client:created', handler);
// Подписка один раз
wg.once('client:created', handler);Примечание: События срабатывают только при вызовах API через этот клиент, а не при ручных изменениях в админ-панели WgEasy.
Библиотека предоставляет специфичные типы исключений:
import {
ClientNotFoundException,
AuthenticationException,
NetworkException,
TimeoutException,
} from 'api-wgeasy';
try {
const client = await wg.getClient('invalid-id');
} catch (error) {
if (error instanceof ClientNotFoundException) {
console.error(`Клиент не найден: ${error.clientId}`);
} else if (error instanceof AuthenticationException) {
console.error('Ошибка аутентификации');
} else if (error instanceof NetworkException) {
console.error('Ошибка сети:', error.message);
} else if (error instanceof TimeoutException) {
console.error('Таймаут запроса');
}
}Модель Client предоставляет полезные свойства и методы:
const client = await wg.getClient('client-id');
// Свойства
client.id; // string
client.name; // string
client.enabled; // boolean
client.address; // string
client.publicKey; // string
client.isOnline; // boolean (на основе последнего handshake)
client.transferRx; // number (байты)
client.transferTx; // number (байты)
client.totalTransfer; // number (байты)
client.transferRxFormatted; // string (например, "1.5 MB")
client.transferTxFormatted; // string
client.totalTransferFormatted; // string
client.age; // number (миллисекунды)
client.ageFormatted; // string (например, "2d 5h")
client.lastSeenFormatted; // string | null (например, "5m ago")Настройка уровней логирования:
import { LogLevel } from 'api-wgeasy';
const wg = new WgEasyClient({
baseUrl: 'http://localhost:51821',
password: 'your-password',
logLevel: LogLevel.DEBUG, // DEBUG, INFO, WARN, ERROR
});См. директорию examples/ для полных примеров:
- basic.ts - Базовое использование и обработка событий
- advanced.ts - Расширенные возможности: массовые операции, фильтрация и управление конфигурациями
Основной класс клиента для взаимодействия с WgEasy API.
Методы:
initialize()- Инициализация и аутентификацияlogin(password?)- Ручной входlogout()- ВыходgetClients()- Получить всех клиентов (возвращаетClientCollection)getClient(id)- Получить клиента по IDcreateClient(name)- Создать нового клиентаdeleteClient(id)- Удалить клиентаenableClient(id)- Включить клиентаdisableClient(id)- Отключить клиентаgetClientConfig(id)- Получить конфигурацию клиентаgetClientQrCode(id)- Получить QR-код клиента (SVG)on(event, handler)- Подписаться на событиеoff(event, handler)- Отписаться от событияonce(event, handler)- Подписаться на событие один раз
Сервисы:
wg.clients- ClientService для расширенных операций с клиентамиwg.configs- ConfigService для управления конфигурациямиwg.auth- AuthService для аутентификации
Расширенные операции с клиентами.
Методы:
getAll()- Получить всех клиентовgetById(id)- Получить клиента по IDgetByName(name)- Получить клиента по имениcreate(dto)- Создать клиентаupdate(id, dto)- Обновить клиентаdelete(id)- Удалить клиентаenable(id)- Включить клиентаdisable(id)- Отключить клиентаgetConfiguration(id)- Получить конфигурациюgetQrCode(id)- Получить QR-кодbulkCreate(names)- Создать несколько клиентовbulkEnable(ids)- Включить несколько клиентовbulkDisable(ids)- Отключить несколько клиентовbulkDelete(ids)- Удалить несколько клиентовfilter(filter)- Фильтровать клиентовgetOnline()- Получить онлайн клиентовgetOffline()- Получить офлайн клиентовgetEnabled()- Получить включенных клиентовgetDisabled()- Получить отключенных клиентовsearch(query)- Поиск клиентовgetStatistics()- Получить статистикуpaginate(options)- Пагинация клиентов
Управление конфигурациями.
Методы:
exportClient(id)- Экспортировать конфигурацию клиентаexportAllClients()- Экспортировать конфигурации всех клиентовgenerateConfigFile(config, name)- Сгенерировать файл конфигурацииparseConfigFile(content)- Распарсить содержимое файла конфигурации
MIT License - см. файл LICENSE для деталей.