Срез 0: скелет tabular-parser — без фронта и БД, воркер NATS без JetStream, парсер-заглушка, контракт v1.0 #3

Merged
aep merged 50 commits from feat/1-slice-0-skeleton into main 2026-10-04 18:41:02 +03:00
Showing only changes of commit 1b87cd2fdf - Show all commits

View File

@ -8,6 +8,7 @@ middleware (gzip, proxy headers), healthcheck, обработчики исклю
import base64
from contextlib import asynccontextmanager
from datetime import UTC, datetime
from typing import Any
import nkeys
from fastapi import FastAPI
@ -34,7 +35,23 @@ setup_logger(level="DEBUG" if settings.DEBUG else "INFO")
async def _connect_nats() -> NATS | None:
"""Подключение к NATS (core, без JetStream); при ошибке — ``None``, приложение всё равно стартует."""
nats_settings = settings.OPENBAO.NATS
options: dict = {"max_reconnect_attempts": 2}
async def disconnected_cb() -> None:
logger.warning("NATS: соединение потеряно")
async def reconnected_cb() -> None:
logger.info("NATS: соединение восстановлено")
async def closed_cb() -> None:
logger.warning("NATS: соединение закрыто")
# -1 — бесконечное автопереподключение (D-6): иначе клиент закрывается навсегда после короткого сбоя NATS
options: dict[str, Any] = {
"max_reconnect_attempts": -1,
"disconnected_cb": disconnected_cb,
"reconnected_cb": reconnected_cb,
"closed_cb": closed_cb,
}
if nats_settings.NATS_SEED and nats_settings.NATS_JWT:
kp = nkeys.from_seed(nats_settings.NATS_SEED.encode("utf-8"))