Skip to main content

Professional Python client for VPN Subscription API

Project description

V2Hub - VPN Subscription API Client

Professional Python client library for VPN Subscription API with async/sync support, comprehensive error handling, and production-ready features.

Features

  • 🚀 Async & Sync: Both AsyncVPNClient and VPNClient (sync wrapper)
  • 📦 Pydantic Models: Full type safety and validation with Pydantic v2
  • 🔄 Smart Retry: Exponential backoff with jitter and circuit breaker
  • 🛡️ Exception Hierarchy: 11 typed exceptions with is_retryable and recovery_hint
  • 🎯 Type Safe: Full type hints for IDE support
  • 📊 Production Ready: Logging, observability, and middleware support

Installation

pip install v2hub

Quick Start

Async Usage

from v2hub import AsyncVPNClient

async with AsyncVPNClient("https://api.example.com", "your-api-token") as client:
    # Create subscription
    sub = await client.create_subscription("my-vpn")

    # Add sources
    await client.add_sources(sub.token, ["vless://server1", "vmess://server2"])

    # Get subscription config
    config = await client.get_subscription_config(sub.token)
    print(config)

Sync Usage

from v2hub import VPNClient

with VPNClient("https://api.example.com", "your-api-token") as client:
    # Create subscription
    sub = client.create_subscription("my-vpn")

    # Add sources
    client.add_sources(sub.token, ["vless://server1"])

    # List subscriptions
    subs = client.list_subscriptions()
    for s in subs:
        print(f"{s.name}: {s.token}")

Error Handling

from v2hub import (
    AsyncVPNClient,
    VPNAPIError,
    RateLimitError,
    NotFoundError,
)

async with AsyncVPNClient(base_url, token) as client:
    try:
        sub = await client.get_subscription("token123")
    except NotFoundError:
        print("Subscription not found")
    except RateLimitError as e:
        print(f"Rate limited. Retry after: {e.retry_after}")
    except VPNAPIError as e:
        if e.is_retryable:
            print(f"Retryable error: {e.recovery_hint}")
        else:
            print(f"Permanent error: {e}")

Configuration

Retry Configuration

from v2hub import AsyncVPNClient, RetryConfig

config = RetryConfig(
    max_retries=5,
    initial_delay=1.0,
    max_delay=60.0,
    exponential_base=2,
    jitter=True,
)

client = AsyncVPNClient(
    base_url="https://api.example.com",
    api_token="your-token",
    retry_config=config,
)

Circuit Breaker

from v2hub import AsyncVPNClient, CircuitBreakerConfig

breaker = CircuitBreakerConfig(
    failure_threshold=5,
    recovery_timeout=60.0,
    expected_exception=VPNAPIError,
)

client = AsyncVPNClient(
    base_url="https://api.example.com",
    api_token="your-token",
    circuit_breaker_config=breaker,
)

API Coverage

Subscriptions

  • create_subscription(name, comment?) - Create new subscription
  • get_subscription(token) - Get subscription details
  • list_subscriptions() - List all subscriptions
  • update_subscription(token, name?, comment?) - Update subscription
  • delete_subscription(token) - Delete subscription
  • refresh_subscription(token) - Refresh subscription config

Sources

  • add_sources(token, uris) - Add source URIs
  • replace_sources(token, uris) - Replace all sources
  • remove_sources(token, uris) - Remove specific sources
  • get_sources(token) - Get all sources for subscription

Public Access

  • get_subscription_config(token) - Get public subscription config (no auth)
  • get_public_info(token) - Get public subscription metadata (no auth)

Development

# Install with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Type checking
mypy src/

# Linting
ruff check src/

Extensions

  • v2hub-admin: Admin API extension with HMAC authentication
  • v2hub-cli: Beautiful command-line interface

License

MIT License - see LICENSE file for details.

Author

nestt

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

v2hub-1.0.3.tar.gz (18.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

v2hub-1.0.3-py3-none-any.whl (24.6 kB view details)

Uploaded Python 3

File details

Details for the file v2hub-1.0.3.tar.gz.

File metadata

  • Download URL: v2hub-1.0.3.tar.gz
  • Upload date:
  • Size: 18.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for v2hub-1.0.3.tar.gz
Algorithm Hash digest
SHA256 416256f1cece435bd961a8c2a53d458c103b84c24f72e9784ec67877a7ca1dc9
MD5 a29ab7725f9d84bb74a080059ae57eb6
BLAKE2b-256 6383eb03003b270208b96b3e879453cca7800e3079d3d6d8d12d7ed7e592f4e0

See more details on using hashes here.

File details

Details for the file v2hub-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: v2hub-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 24.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for v2hub-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 b56d4997189a0628ecbab50f4831c8759e4bccd090ec87d3c9fa677688b20605
MD5 587f2f5ad0184b288677c3c46f12ab43
BLAKE2b-256 33e58f67e927b0ff64f6af38fe6da90140238a6b955cfb2ecc8114e1f8c76eae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page