Перейти к содержанию

IPC

Граница между отладчиком и редактором. Крейта два: source-frontend-protocol для типов обмена и nvim-ipc для сервера.

Почему граница вообще есть

Потому что редактор не владелец. Если бы сессию держал Neovim, не было бы ни границы, ни протокола — и не было бы способа пережить редактор.

Именно граница делает source frontend заменяемым: место Neovim может занять что угодно, говорящее на этом протоколе, и в отладчике ничего не поменяется.

Транспорт

Unix domain socket, создаётся по пути /tmp/rust-debugger-nvim-<pid>.sock.

Unix-сокеты, а не TCP: фронтенд всегда на той же машине, а файловый сокет несёт с собой права — файл создаётся с 0600, поэтому другой пользователь к вашей сессии отладки не подключится.

Что пересекает границу

Направление Сообщения
фронтенд → отладчик запуск сессии с профилем; набор точек останова; команды выполнения; просьба вывести окно вперёд
отладчик → фронтенд текущее место остановки; состояния точек от адаптера; фаза сессии

Заметно не пересекают её: переменные, содержимое стека, результаты watches. Ими владеет и их рисует окно, у которого они и так есть. Отправка их ещё и редактору создала бы второго держателя того же состояния, а вместе с ним и вопрос, кто из двоих прав.

Переподключение

hello — рукопожатие переподключения. Фронтенд, который подключился — впервые или после перезапуска редактора, — получает снимок текущего состояния, а не проигрывание пропущенного.

Проигрывание было бы и объёмнее, и неверно по сути: фронтенду нужна не история сессии, а возможность нарисовать настоящее. Именно поэтому закрыть Neovim посреди сессии безобидно.

С auto_attach = true в плагине старт Neovim молча подключается к идущей сессии проекта.

Управляющий сокет

bugsaur gui --control-socket <путь> — второй, отдельный канал для управления уже работающим окном, например для его подъёма: этим и заняты :DebugFocus и gui_focus_on_stop.

Подъём окна привязан к поколению остановки: сколько бы кадров ни прошло, на одну остановку приходится ровно один подъём, а замена сессии начинает счёт заново. Окно, поднимающее себя на каждом кадре, было бы непригодно для работы.

Тесты

У nvim-ipc есть свои тесты, а приёмочные сценарии гоняют настоящий Neovim в headless-режиме:

make test-m8

Матрица CI включает macOS и Linux именно потому, что этот слой у них и различается: поведение Unix-сокетов, права 0600 и то, что происходит при закрытии соединения, у двух систем не совпадают.

Связанные решения

ADR Тема
ADR-005 IPC с source frontend
ADR-007 подъём окна на остановке

См. Architecture Decision Records.