Metadata-Version: 2.4
Name: pyurt
Version: 3.1.4
Summary: PyURT – Python Universal Retransmission Transport: надёжный протокол поверх TCP с фреймингом, CRC, сжатием, шифрованием, передачей файлов и автоматической ретрансмиссией
Author: HioDev
License: MIT
Project-URL: Homepage, https://github.com/HioDeveloper/PyURT/tree/main
Project-URL: Pro Edition, https://pypi.org/project/pyurt-pro/
Project-URL: Sync Edition, https://pypi.org/project/pyurt-sync/
Project-URL: Web Edition, https://pypi.org/project/pyurt-web/
Keywords: protocol,tcp,retransmission,encryption,compression,files,asyncio
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Framework :: AsyncIO
Description-Content-Type: text/markdown
License-File: LICENSE.txt
Requires-Dist: cryptography>=42.0.0
Requires-Dist: msgpack>=1.0.0
Requires-Dist: zstandard>=0.22.0
Dynamic: license-file

# PyURT – Python Universal Retransmission Transport

**PyURT** — это надёжный асинхронный протокол поверх TCP с поддержкой фрейминга, контроля целостности (CRC32), сжатия (Zstandard), шифрования (AES-GCM), сериализации (msgpack / JSON) и автоматической ретрансмиссии при сбоях. Поддерживает передачу структурированных сообщений и файлов с разбивкой на чанки.

Версия 3.1.4 включает как асинхронный (`asyncio`), так и синхронный (блокирующие сокеты) API — выбирайте тот, который удобнее для вашего проекта.

## Особенности

- **Фрейминг** – длина сообщения + CRC32.
- **Сжатие** – Zstandard (высокая скорость и степень сжатия).
- **Шифрование** – AES-GCM (аутентифицированное шифрование).
- **Сериализация** – msgpack с автоматическим fallback на JSON.
- **Ретрансмиссия** – клиент повторяет отправку при NACK или таймауте (до 3 попыток, с экспоненциальной задержкой).
- **Файловая передача** – разбивка на чанки, контрольная сумма SHA256, подтверждение каждого чанка.
- **Асинхронность** – высокопроизводительный сервер на `asyncio`.
- **Синхронный режим** – блокирующие сокеты для простых скриптов.
- **CLI** – готовые команды для сервера и клиента.
- **Кроссплатформенность** – работает на Windows, Linux, macOS.

## Установка

```bash
pip install pyurt

## Использование в коде

### Асинхронный сервер

```python
import asyncio
from pyurt import PyURTServer

async def main():
    server = PyURTServer()
    # Сервер запустится на хосте и порте из ENV или можно изменить в коде:
    # from pyurt import ENV
    # ENV["HOST"] = "0.0.0.0"
    # ENV["PORT"] = 9999
    await server.run()

if __name__ == "__main__":
    asyncio.run(main())

### Асинхронный клиент

```python
import asyncio
from pyurt import PyURTClient

async def main():
    client = PyURTClient(host="127.0.0.1", port=8888)
    await client.connect()

    # Отправка простого сообщения
    response = await client.send_message({"cmd": "ping", "id": 1})
    print("Ответ:", response)

    # Отправка файла
    success = await client.send_file("/path/to/photo.jpg")
    if success:
        print("Файл отправлен успешно")
    else:
        print("Ошибка при отправке файла")

    await client.close()

asyncio.run(main())

### Синхронный клиент

```python
from pyurt import PyURTClient

client = PyURTClient(host="127.0.0.1", port=8888)

# Отправка сообщения (блокирующий вызов)
response = client.send_message_sync({"cmd": "status"})
if response is not None:
    print("Ответ:", response)
else:
    print("Ошибка доставки")

# Отправка файла синхронно
success = client.send_file_sync("/path/to/document.pdf")
if success:
    print("Файл отправлен")
else:
    print("Ошибка")

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

Все методы клиента возвращают None при ошибке (или False для файлов). Вы можете обработать это:

```python
response = await client.send_message({"key": "value"})
if response is None:
    print("Сообщение не доставлено (NACK, таймаут или ошибка)")
else:
    print("Ответ:", response)

Для файлов:

```python
if not await client.send_file("data.bin"):
    print("Ошибка отправки файла")

## Использование с контекстным менеджером (асинхронный)

```python
async with PyURTClient() as client:
    response = await client.send_message({"hello": "world"})
    print(response)

Отправка произвольных объектов

Вы можете отправлять любые сериализуемые объекты: списки, словари, числа, строки.

```python
await client.send_message([1, 2, 3, "a", "b"])
await client.send_message(42)
await client.send_message("Просто строка")

Автоматическая сериализация через msgpack (с fallback на JSON) обработает всё.

## Получение ответа от сервера

Сервер по умолчанию отвечает объектом:

```json
{
  "echo": <ваше сообщение>,
  "timestamp": 1234567890.123,
  "server": "PyURT/3.1"
}

Вы можете использовать ответ по своему усмотрению.

## Пример обработки файлов на сервере

Сервер автоматически сохраняет принятые файлы в каталог PYURT_RECV_DIR (по умолчанию received_files). Вы можете переопределить каталог переменной окружения.

Если файл с таким именем уже существует, к нему добавляется суффикс с file_id, чтобы избежать перезаписи.

Смена ключа шифрования (безопасность)

Для реального использования обязательно задайте свой ключ (32 байта) через переменную окружения PYURT_KEY или в коде:

```python
from pyurt import ENV, SHARED_KEY
ENV["KEY"] = "my-32-byte-key-here-1234567890123"
# или измените SHARED_KEY напрямую (не рекомендуется)

Убедитесь, что ключ одинаков на сервере и клиенте.
```bash
pyurt-client --text "Привет, мир!"
Отправить JSON:

pyurt-client --text '{"action":"status","id":42}'
Отправить файл:


pyurt-client --file /path/to/document.pdf
Клиент (синхронный) – без asyncio


pyurt-client-sync --text "Hello, sync!"

pyurt-client-sync --file document.pdf
