Files
Bridge-and-Join-s/internal/nsdadapter
zuevav fd238c1078 feat(admin): dev-страница «Эмуляторы» — переключатели и настройки эмуляции НРД и МНП QUIK
В режиме разработки новая страница /admin/emulators с двумя клавишами:

- «Эмулятор НРД» (флаг LK.EmulateNSD): заявки ЛК и ручного ввода идут через
  внутренний имитатор, в НРД ничего не отправляется. Настройки: задержка
  решения (0–300 с), исход (подтвердить/отклонить/не отвечать), код отказа
  M2M01–M2M09/18. Сендер перенастраивается в рантайме через потокобезопасный
  mock.Sender.Reconfigure — без перезапуска.
- «Эмулятор МНП QUIK» (флаг QuikMNP.Emulate): шаги цикла без записи в боевую
  БД МНП. Настройки: задержка шага (0–60 с), точечные отказы по шагам
  (регистрация/подпись/отказ/зачисление) — эмулированный отказ ведёт себя как
  боевой: шаг OK=false, состояние не продвигается, повтор на следующем проходе.

Настройки хранятся в setup.json (nsd_emu/mnp_emu), обратная совместимость —
дефолты. Баннер «Режим эмуляции» показывается и при ручном включении
эмуляторов (раньше зависел только от отсутствия ИШ). Пункт меню «Эмуляторы»
и две плитки на дашборде — только в dev. Пути занесены в devOnlyPath.

Попутно: исправлен race в TestLicenseActivateAndRenew (cleanup восстанавливал
DefaultLicensePublicKey без moduleEnforceMu — падал под -race и на чистом HEAD).
2026-10-07 21:34:39 +03:00
..
…
…
…
…
…

internal/nsdadapter — транспорт к НРД

Реализует m2mcore.NSDSender. Основной канал — Интеграционный шлюз (ИШ) НРД через REST API; ИШ сам подписывает и упаковывает пакеты ЭДО, нам XMLDSig не требуется. Резерв — WS ONYX (заглушка до PR-6).

Состав

  • igw/client.go — REST-клиент ИШ: SendPackage, GetStatus, ListIncoming. Body передаётся base64 в JSON, ретраи на 5xx и сетевые ошибки, 4xx не ретраится.
  • router.go — маршрутизация доменного типа сообщения в PackageType ЭДО (#M2MTR, #M2MTD, #M2MER, SUBBR/SUBER/SUB16, Assets_investment).
  • sender.go — реализация m2mcore.NSDSender: сериализует Request в windows-1251 через nsdxml.Marshal и шлёт в ИШ. Ответы НРД приходят асинхронно через входящий поллер.
  • config.go — профили guest-gost, guest-rsa, test3-gost, test3-rsa, prod-gost, prod-rsa (URL ИШ, канал, контейнер ключа, таймауты, retry).
  • onyx/onyx.go — скелет SOAP-клиента WS ONYX. Реальная реализация — после PR-6 (подпись через crypto-service).

cmd/nsd-adapter

cmd/nsd-adapter/main.go — сервис с HTTP /healthz и фоновым поллером входящих пакетов (ListIncoming по типам ЭДО из IncomingPackageKinds). Параметры:

  • BJ_HTTP_ADDR — адрес HTTP (по умолчанию :8082).
  • BJ_NSD_PROFILE — имя профиля. Если не задан — сервис стартует в режиме idle (только healthz, опрос отключён). Полезно для CI и смоук-тестов без реального ИШ.
  • BJ_NSD_POLL_INTERVAL — частота опроса, например 15s.

Принципы логирования

  • Логируем: метод, путь, HTTP-статус, package_id, длительность.
  • Не логируем тело пакета — там могут быть ПДн.
  • Маскировка ПДн в любых журналах — на стороне m2m-core при логировании content до отправки в адаптер.