diff --git a/CLAUDE.md b/CLAUDE.md index a47c1e3..ac3f99d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ распознанный документ), склеить и сохранить сырой ответ в S3 `raw/{job_id}.json` (в БД не регистрируется), очистить горячую папку (только при `SCAN_CLEANUP=true`), нормализовать в `../docs/contracts/recognition-result.schema.json` (`statementDocument` v1.2: по одному документу на таблицу `table_structure[i]`), опубликовать `files.tabular_parsed` -(`done` / `needs_check` / `error`). Таймаут → ошибка `TIMEOUT` по `min(reply_deadline, старт + SCAN_TIMEOUT_SECONDS=1200)`, +(по умолчанию; задаётся `OPENBAO__NATS__NATS_*_SUBJECT`) (`done` / `needs_check` / `error`). Таймаут → ошибка `TIMEOUT` по `min(reply_deadline, старт + SCAN_TIMEOUT_SECONDS=1200)`, старт — запись файла во «Входящие». **Нет доступа к БД.** ## Правила diff --git a/api/src/core/nats.py b/api/src/core/nats.py index 163329c..6f41dc1 100644 --- a/api/src/core/nats.py +++ b/api/src/core/nats.py @@ -9,10 +9,9 @@ После переподключения nats-py сам отправляет SUB для всех подписок с прежней queue group — подписку повторно оформлять не нужно. - `subscribe_requests(cb)` — подписка на subject запроса `image` из настроек - (`OPENBAO__NATS__NATS_IMAGE_REQUEST_SUBJECT`, - по умолчанию `files.img_uploaded`) в queue group `scan-gateway`: из нескольких - инстансов сообщение получает ровно один. `cb` получает исходное сообщение nats-py (`msg.data`, `msg.headers`); - исключения `cb` логируются, подписка живёт. + (`OPENBAO__NATS__NATS_IMAGE_REQUEST_SUBJECT`, по умолчанию `files.img_uploaded`) в queue group `scan-gateway`: + из нескольких инстансов сообщение получает ровно один. `cb` получает исходное сообщение nats-py + (`msg.data`, `msg.headers`); исключения `cb` логируются, подписка живёт. - `publish(subject, payload, msg_id)` — публикация с заголовком `Nats-Msg-Id` и `flush` (подтверждение сервером) с повторами на временных ошибках (первая попытка + до `PUBLISH_RETRIES` повторов); исчерпаны — `PublishFailed`. Воркер логирует error и идёт дальше: ядро закроет задание по `reply_deadline` (D-7). diff --git a/api/src/core/worker.py b/api/src/core/worker.py index a02f996..8252f38 100644 --- a/api/src/core/worker.py +++ b/api/src/core/worker.py @@ -107,7 +107,7 @@ class ObjectStorage(Protocol): class ResultPublisher(Protocol): - """Часть `NatsGateway`: публикация конверта в `files.tabular_parsed` с `Nats-Msg-Id` и повторами.""" + """Часть `NatsGateway`: публикация конверта в subject ответа с `Nats-Msg-Id` и повторами.""" async def publish_result(self, message: RecognitionResultMessage, attempt: int) -> None: ... @@ -181,7 +181,7 @@ class _WaitResult: class Worker: - """Обработка запросов `files.img_uploaded` (см. докстринг модуля). + """Обработка запросов на subject запроса `image` (см. докстринг модуля). Зависимости внедряются: `storage` (S3), `publisher` (NATS), `hotfolder`, `normalizer`; `clock` — часы UTC для дедлайна (R-20), `sleep` — пауза между опросами (подмены для тестов).