Срез 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 import base64
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from datetime import UTC, datetime from datetime import UTC, datetime
from typing import Any
import nkeys import nkeys
from fastapi import FastAPI from fastapi import FastAPI
@ -34,7 +35,23 @@ setup_logger(level="DEBUG" if settings.DEBUG else "INFO")
async def _connect_nats() -> NATS | None: async def _connect_nats() -> NATS | None:
"""Подключение к NATS (core, без JetStream); при ошибке — ``None``, приложение всё равно стартует.""" """Подключение к NATS (core, без JetStream); при ошибке — ``None``, приложение всё равно стартует."""
nats_settings = settings.OPENBAO.NATS 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: if nats_settings.NATS_SEED and nats_settings.NATS_JWT:
kp = nkeys.from_seed(nats_settings.NATS_SEED.encode("utf-8")) kp = nkeys.from_seed(nats_settings.NATS_SEED.encode("utf-8"))