docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api
uk/docs/api/json-rpc-bundle/developers/known_issues/open.md
новий файл +25
−0
Актуальні помилки
Відомі помилки й нестиковки поточної версії JsonRpcBundle (10.4.2): симптом, причина та обхідний шлях. Виправлені — на сторінці Виправлені помилки.
<include>(.issues/lock-waits-instead-of-error.md)
<include>(.issues/rpc-error-not-for-all-http-errors.md)
<include>(.issues/async-request-event-not-fired.md)
<include>(.issues/dto-collection-on-method.md)
<include>(.issues/translations-locales-shared.md)
<include>(.issues/bundle-docs-link.md)
uk/docs/api/json-rpc-bundle/developers/known_issues/.issues/lock-waits-instead-of-error.md
новий файл +13
−0
#[RPC\Lock] чекає звільнення замість помилки «locked»
Зачеплені версії: 7.4.0 — 10.4.2 (поточна): блокувальний acquire(true) є в RPC\Lock з першої версії (ufo-tech/rpc-objects 2.9.0). Нестиковка між описом релізу 7.4 і поведінкою.
Симптом. Опис 7.4 обіцяє, що виклик заблокованого методу завершиться помилкою -32400 «Method '…' is locked». Насправді паралельний виклик з тим самим ключем чекає, доки перший завершиться, і виконується після нього.
Причина. RPC\Lock::acquire() викликає $lock->acquire(true) (блокувальний режим), а сховище UfoLockerStore не реалізує BlockingStoreInterface. Symfony Lock у такому разі повторює спробу в циклі, поки блокування не звільниться, і LockConflictedException назовні не потрапляє.
Наслідки. Повторні виклики не відхиляються, а накопичуються й тримають воркери. Без ttl очікування не обмежене часом.
Обхідний шлях. Завжди задавайте ttl. Якщо потрібна саме відмова, а не черга, перевіряйте зайнятість власним сервісом Symfony Lock з acquire(false) усередині методу.
uk/docs/api/json-rpc-bundle/developers/known_issues/.issues/rpc-error-not-for-all-http-errors.md
новий файл +13
−0
rpc.error генерується не для всіх помилок одиночного HTTP-запиту
Зачеплені версії: 10.4.2 (поточна). Нестиковка між точками входу.
Симптом. Для одиночного HTTP-запиту частина помилок не проходить через подію rpc.error і не пишеться в лог бандла: недійсний JSON, відсутній чи недійсний токен, невідомий метод, непідтримувана версія jsonrpc, порожній чи вимкнений batch, нестача позиційних параметрів, виняток з вашого лістенера. Відповідь з помилкою клієнт отримує, але ваші лістенери rpc.error її не бачать, і в лог вона не потрапляє взагалі: SymfonyErrorListener зупиняє поширення kernel.exception, тож не спрацьовує і стандартне логування Symfony (ErrorListener::logKernelException).
Для тих самих помилок у консолі (ufo:rpc:process), inline-batch і через RpcExecutor подія rpc.error генерується.
Причина. У HTTP ці винятки перехоплює SymfonyErrorListener на kernel.exception і одразу формує відповідь.
Обхідний шлях. Щоб бачити всі помилки HTTP, підпишіться на Symfony kernel.exception з пріоритетом вище 999 для маршрутів RPC.
uk/docs/api/json-rpc-bundle/developers/known_issues/.issues/async-request-event-not-fired.md
новий файл +11
−0
Подія rpc.async_request оголошена, але не генерується
Зачеплені версії: 7.0.0 — 10.4.2 (поточна). Перевірено за кодом тегів 7.0.0, 8.0.5, 9.2.1, 10.2.3, 10.4.2: метод fireAsyncRequest() ніде не викликається.
Симптом. Лістенер на RpcEvent::REQUEST_ASYNC (rpc.async_request) ніколи не викликається.
Причина. RpcEventFactory::fireAsyncRequest() не викликається в коді бандла. Обробник Symfony Messenger (RpcAsyncProcessor) передає запит одразу в RpcServer::handle(), оминаючи і rpc.request, і rpc.async_request.
Обхідний шлях. Для запитів з черги підписуйтесь на rpc.pre_execute: вона генерується для кожного виконання методу незалежно від джерела.
uk/docs/api/json-rpc-bundle/developers/known_issues/.issues/dto-collection-on-method.md
новий файл +11
−0
#[RPC\DTOCollection] на методі не задає формат відповіді
Зачеплені версії: перевірено за кодом тегів 10.0.6 — 10.4.2 (поточна); DTOCollection з'явився в ufo-tech/rpc-objects 3.8.2.
Симптом. Метод з #[RPC\DTOCollection(UserDto::class)] і типом повернення array не отримує схему колекції DTO в документації, а елементи результату не обробляються як DTO.
Причина. ResponseFiller читає атрибут через getAttributes(DTO::class) без прапорця ReflectionAttribute::IS_INSTANCEOF, тож нащадок DTOCollection не знаходиться.
Обхідний шлях. Використовуйте #[RPC\DTO(UserDto::class, collection: true)] або вкажіть тип у PHPDoc: @return UserDto[].
uk/docs/api/json-rpc-bundle/developers/known_issues/.issues/translations-locales-shared.md
новий файл +12
−0
Мови перекладів документації спільні для всіх груп API
Зачеплені версії: 10.4.0 — 10.4.2 (поточна). За примітками до релізу 10.4 (розділ «Відомі проблеми»).
Симптом. Якщо мова є лише в груповому файлі (наприклад, translations/rpc/bfa.pl.yaml), документація іншої групи з Accept-Language: pl повертає Content-Language: pl, хоча тексти в ній мовою за замовчуванням.
Причина. Перелік доступних мов збирається один для всіх груп.
Обхідний шлях. Тримайте однаковий набір мов у базових і групових файлах перекладів.
uk/docs/api/json-rpc-bundle/developers/known_issues/.issues/bundle-docs-link.md
новий файл +9
−0
Застарілі посилання й політики в репозиторії бандла
Зачеплені версії: 10.4.2 (поточна). Нестиковка документації, на роботу бандла не впливає.
README.md, README-UA.md і homepage у composer.json бандла ведуть на стару вікі docs.ufo-tech.space/bin/view/docs/JsonRpcBundle/. Актуальна документація — на цьому сайті.
У SECURITY.md перелік підтримуваних версій закінчується на 6.1.x, хоча актуальна гілка — 10.x.