npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

api-wgeasy

v1.0.1

Published

TypeScript/JavaScript client library for interacting with the WgEasy (WireGuard Easy) API

Downloads

10

Readme

api-wgeasy

npm version License: MIT

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.


🇬🇧 English

Features

  • 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

Installation

npm install api-wgeasy

Quick Start

import { 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();

Configuration

From Options

const wg = new WgEasyClient({
    baseUrl: 'http://localhost:51821',
    password: 'your-password',
    timeout: 30000,
    retryAttempts: 3,
    retryDelay: 1000,
    logLevel: LogLevel.DEBUG,
});

From Environment Variables

// Set environment variables:
// WG_EASY_BASE_URL=http://localhost:51821
// WG_EASY_PASSWORD=your-password

const wg = WgEasyClient.fromEnv();

Auto-connect

// Automatically initializes and authenticates
const wg = await WgEasyClient.connect({
    baseUrl: 'http://localhost:51821',
    password: 'your-password',
});

Client Management

Basic Operations

// 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');

Advanced Operations

// 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 });

Client Collection Methods

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();

Configuration Management

// 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);

Events

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.

Error Handling

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');
    }
}

Client Model

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")

Logging

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
});

Examples

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

API Reference

WgEasyClient

Main client class for interacting with WgEasy API.

Methods:

  • initialize() - Initialize and authenticate
  • login(password?) - Login manually
  • logout() - Logout
  • getClients() - Get all clients (returns ClientCollection)
  • getClient(id) - Get client by ID
  • createClient(name) - Create new client
  • deleteClient(id) - Delete client
  • enableClient(id) - Enable client
  • disableClient(id) - Disable client
  • getClientConfig(id) - Get client configuration
  • getClientQrCode(id) - Get client QR code (SVG)
  • on(event, handler) - Subscribe to events
  • off(event, handler) - Unsubscribe from events
  • once(event, handler) - Subscribe to event once

Services:

  • wg.clients - ClientService for advanced client operations
  • wg.configs - ConfigService for configuration management
  • wg.auth - AuthService for authentication

ClientService

Advanced client operations.

Methods:

  • getAll() - Get all clients
  • getById(id) - Get client by ID
  • getByName(name) - Get client by name
  • create(dto) - Create client
  • update(id, dto) - Update client
  • delete(id) - Delete client
  • enable(id) - Enable client
  • disable(id) - Disable client
  • getConfiguration(id) - Get configuration
  • getQrCode(id) - Get QR code
  • bulkCreate(names) - Create multiple clients
  • bulkEnable(ids) - Enable multiple clients
  • bulkDisable(ids) - Disable multiple clients
  • bulkDelete(ids) - Delete multiple clients
  • filter(filter) - Filter clients
  • getOnline() - Get online clients
  • getOffline() - Get offline clients
  • getEnabled() - Get enabled clients
  • getDisabled() - Get disabled clients
  • search(query) - Search clients
  • getStatistics() - Get statistics
  • paginate(options) - Paginate clients

ConfigService

Configuration management.

Methods:

  • exportClient(id) - Export client configuration
  • exportAllClients() - Export all client configurations
  • generateConfigFile(config, name) - Generate config file
  • parseConfigFile(content) - Parse config file content

License

MIT License - see LICENSE file for details.

Repository

GitHub: https://github.com/Mvory9/api-wgeasy


🇷🇺 Русский

Возможности

  • Типобезопасность - Полная поддержка TypeScript с подробными определениями типов
  • События - Встроенный эмиттер событий для отслеживания изменений в реальном времени
  • Простота использования - Простой и интуитивный API
  • Полнота - Полное покрытие всех endpoints WgEasy API
  • Методы коллекций - Мощная фильтрация, сортировка и пагинация
  • Массовые операции - Создание, включение, отключение и удаление нескольких клиентов одновременно
  • Управление конфигурациями - Экспорт, парсинг и генерация файлов конфигурации WireGuard
  • Генерация QR-кодов - Генерация QR-кодов для простой настройки клиентов
  • Кэширование - Встроенное кэширование запросов для лучшей производительности
  • Обработка ошибок - Подробные типы исключений
  • Логирование - Настраиваемые уровни логирования

Установка

npm install api-wgeasy

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

import { 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

Модель 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 - Расширенные возможности: массовые операции, фильтрация и управление конфигурациями

Справочник API

WgEasyClient

Основной класс клиента для взаимодействия с WgEasy API.

Методы:

  • initialize() - Инициализация и аутентификация
  • login(password?) - Ручной вход
  • logout() - Выход
  • getClients() - Получить всех клиентов (возвращает ClientCollection)
  • getClient(id) - Получить клиента по ID
  • createClient(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 для аутентификации

ClientService

Расширенные операции с клиентами.

Методы:

  • getAll() - Получить всех клиентов
  • getById(id) - Получить клиента по ID
  • getByName(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) - Пагинация клиентов

ConfigService

Управление конфигурациями.

Методы:

  • exportClient(id) - Экспортировать конфигурацию клиента
  • exportAllClients() - Экспортировать конфигурации всех клиентов
  • generateConfigFile(config, name) - Сгенерировать файл конфигурации
  • parseConfigFile(content) - Распарсить содержимое файла конфигурации

Лицензия

MIT License - см. файл LICENSE для деталей.

Репозиторий

GitHub: https://github.com/Mvory9/api-wgeasy