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-режиме:
Матрица CI включает macOS и Linux именно потому, что этот слой у них и
различается: поведение Unix-сокетов, права 0600 и то, что происходит при
закрытии соединения, у двух систем не совпадают.
Связанные решения¶
| ADR | Тема |
|---|---|
| ADR-005 | IPC с source frontend |
| ADR-007 | подъём окна на остановке |