Skip to main content

aedb

aedb — Python SDK для демонов платформы. Публичный интерфейс позволяет подключить демон к NATS, принимать события и задачи, отвечать на RPC и обрабатывать длительные задачи JetStream.

Требуется Python 3.14.

python -m pip install aedb

Настройка демона

export DAEMON_NATS_HOST='nats://localhost:4222'
export DAEMON_NATS_SEED='SU...'

DAEMON_NATS_HOST — адрес NATS; DAEMON_NATS_SEED — секретный NKey seed демона. Оба значения обязательны. Не записывайте seed в исходный код. Таймауты подключения и переподключения можно задать через DAEMON_NATS_TIMEOUT и DAEMON_NATS_RECONNECT_TIMEOUT (по умолчанию 3 секунды). DaemonSettings() читает эти переменные при создании объекта. При необходимости можно передать NATSSettings(host=..., seed=...) явно.

Для первой активации демона укажите также DAEMON_JOIN_HOST — базовый URL Join-сервиса — и вызовите await daemon.join(token) с одноразовым токеном до запуска соединения. Join не вызывается автоматически; при следующих запусках уже активированного демона токен не нужен.

Приём и отправка событий

import asyncio

from aedb.contracts import Event
from aedb.engine.daemons import Daemon, DaemonSettings


daemon = Daemon(DaemonSettings())


@daemon.listen.events("demo.events")
async def on_event(event: Event) -> None:
    print(event.payload)


@daemon.listen.rpc("demo.echo")
async def echo(event: Event) -> Event:
    return Event(task_id=event.task_id, payload=event.payload)


async def main() -> None:
    async with daemon:
        await daemon.action.event("demo.events", {"text": "hello"})
        answer = await daemon.action.rpc("demo.echo", {"text": "ping"})
        print(answer.payload)


asyncio.run(main())

async with daemon: открывает NATS-соединение и подписки, а при выходе закрывает их. Если управление жизненным циклом нужно вручную, используйте await daemon.start() и await daemon.close(). Обработчики можно зарегистрировать до подключения. Для обмена сообщениями нужны права NATS на соответствующие subjects.

Event — JSON-конверт с id, необязательным task_id, meta, timestamp и словарём payload. Методы daemon.action.event, task и rpc принимают как Event, так и словарь payload. rpc возвращает Event.

Приём Отправка Назначение
@daemon.listen.events(subject) await daemon.action.event(subject, payload) Событие без ответа.
@daemon.listen.task(subject, group=None) await daemon.action.task(subject, reply, payload) Задача с явным reply-subject; ответ обработчика публикуется туда, если он есть. group задаёт NATS queue group.
@daemon.listen.rpc(subject) await daemon.action.rpc(subject, payload, timeout=None) Запрос с ожиданием ответа Event.

Обработчик получает Event и может быть синхронной или асинхронной функцией. Для task и rpc результат отправляется только при наличии reply-subject и ненулевого результата. Для action.task ответ следует принимать отдельным обработчиком listen.events(reply).

Длительные задачи JetStream

@daemon.listen.long_task(...) принимает сообщения из заранее созданного durable consumer с explicit ack и фильтром по subject. Асинхронный обработчик возвращает Event с тем же task_id, что у запроса, либо словарь payload. SDK публикует ответ в reply_to и подтверждает входящее сообщение после успешной публикации. При ошибке запрашивается повторная доставка.

from aedb.contracts import Event


@daemon.listen.long_task(
    "demo.jobs.request",
    stream="DEMO_JOBS",
    consumer="worker",
    reply_to="demo.jobs.answer",
    progress_every=20.0,
    retry_delay=5.0,
)
async def process(event: Event) -> Event:
    return Event(task_id=event.task_id, payload={"result": event.payload})


# Выполнять после запуска демона:
# ack = await daemon.action.long_task(
#     "demo.jobs.request", Event(task_id="job-1", payload={"value": 42})
# )

progress_every должен быть меньше AckWait consumer. action.long_task возвращает подтверждение публикации JetStream, но не ждёт результата задачи. Результат поступает отдельно на reply_to.

Команда aedb engine key

Команда создаёт NKey-пару или выводит публичный ключ из существующего seed:

aedb engine key
aedb engine key --type account
aedb engine key --save ./worker
aedb engine key --seed "$(cat ./worker.seed)"
aedb engine key --seed "$(cat ./worker.seed)" --save ./worker-public

По умолчанию создаётся пара типа user. --type принимает user, account, server, operator или cluster. --save BASE сохраняет seed и публичный ключ в BASE.seed и BASE.pub с правами 0600. При --seed SEED новая пара не создаётся: выводится только публичный ключ, а с --save сохраняется только файл BASE.pub.

Metadata

Release files for aedb 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aedb 0.1.0
File Size Uploaded
aedb-0.1.0.tar.gz 96.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aedb 0.1.0
File Interpreter ABI Platform
aedb-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 188.4 kB

Release files / aedb-0.1.0.tar.gz

Download URL aedb-0.1.0.tar.gz
Size 96.8 kB
Tags Source
SHA-256 checksum
How to use checksums
5a7a0ecdcdfa4a94df190176540a29dbd86ef482c9379ad5255fd25df9339b2d
BLAKE2b-256 checksum
How to use checksums
413fd8aecf1428d42ee0552456a74fea689d9d29112312f9e4554abfa461fc4c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / aedb-0.1.0-py3-none-any.whl

Download URL aedb-0.1.0-py3-none-any.whl
Size 91.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
22162ffaa8ea5685ccabb1cfb6fabd44db3ec7665ef96d1a6c1de219bf838625
BLAKE2b-256 checksum
How to use checksums
4a63a9e203ef6f5f596b7496c8ab069750d7ed65ffdede567f0b6a71be7a3876
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page