bsl-language-server
bsl-language-server copied to clipboard
Feature/websocket Поддержка работы через websocket
Описание
Поддержка общения в BSL Language Server через websocket
Связанные задачи
#1427
Чеклист
Общие
- [x] Ветка PR обновлена из develop
- [x] Отладочные, закомментированные и прочие, не имеющие смысла участки кода удалены
- [x] Изменения покрыты тестами
- [x] Обязательные действия перед коммитом выполнены (запускал команду
gradlew precommit
)
Дополнительно
Хотелось бы иметь возможность общаться BSL Language Server через websocket. Например, это нужно для редактора на основе monaco editor, работающего внутри 1С через webkit
Сложности, недоработки, вопросы
С разработкой на Java был мало знаком, до того как решил добавить указанную функциональность, отсюда есть несколько сложностей, которые мешают полноценной работе сервера через вебсокет.
- Сервер всегда использует конфигурацию по умолчанию. Я так понимаю, что взаимодействие с конфигурацией завязано на аннотацию
@RequiredArgsConstructor
и поле классаprivate final LanguageServerConfiguration
. При обработке команды в классеWebsocketStartCommand
никаких проблем с чтением и обновлением конфигурации из указанного файла не возникает. Однако, не ясно, как конфигурацию можно передать вBSLLSWebSocketEndpoint
для дальнейшей передачи вBSLLanguageServer
. Можете подсказать, как решить эту проблему? - Как правильно тестировать работу через вебсокеты, какие тесты желательно реализовать?
ну нихрена себе!
спасибо, заценим.
Описание
Поддержка общения в BSL Language Server через websocket
Связанные задачи
#1427
Чеклист
Общие
- [x] Ветка PR обновлена из develop
- [x] Отладочные, закомментированные и прочие, не имеющие смысла участки кода удалены
- [ ] Изменения покрыты тестами
- [ ] Обязательные действия перед коммитом выполнены (запускал команду
gradlew precommit
)Дополнительно
Хотелось бы иметь возможность общаться BSL Language Server через websocket. Например, это нужно для редактора на основе monaco editor, работающего внутри 1С через webkit
Сложности, недоработки, вопросы
С разработкой на Java был мало знаком, до того как решил добавить указанную функциональность, отсюда есть несколько сложностей, которые мешают полноценной работе сервера через вебсокет.
- Сервер всегда использует конфигурацию по умолчанию. Я так понимаю, что взаимодействие с конфигурацией завязано на аннотацию
@RequiredArgsConstructor
и поле классаprivate final LanguageServerConfiguration
. При обработке команды в классеWebsocketStartCommand
никаких проблем с чтением и обновлением конфигурации из указанного файла не возникает. Однако, не ясно, как конфигурацию можно передать вBSLLSWebSocketEndpoint
для дальнейшей передачи вBSLLanguageServer
. Можете подсказать, как решить эту проблему?- Как правильно тестировать работу через вебсокеты, какие тесты желательно реализовать?
- попробую на днях найти примеры тестирования lsp и вебсокета, вроде такие тесты были в lsp4j.
Прилагаю "клиенты" для тестирования test_client.zip
С простым текстом модуля index_successful.html
всё хорошо, а вот index_fail.html
падает вот здесь и причины падения пока непонятны.
@salexdv а есть стак-трейс и trace.log?
@qtLex тут трейс лог по переменным в индексе. глянешь?
@nixel2007 Гляну.
@qtLex тут трейс лог по переменным в индексе. глянешь?
Вот, что удалось накопать https://github.com/1c-syntax/bsl-language-server/pull/2577.
Влил, спасибо!
Нужно врубать отладочные логи и глядеть... Тестовый клиент ты скидывал, да?
Op wo 20 jul. 2022 18:49 schreef Alexander Shkuraev < @.***>:
@.**** commented on this pull request.
In src/main/java/com/github/_1c_syntax/bsl/languageserver/websocket/BSLLSWebSocketEndpoint.java https://github.com/1c-syntax/bsl-language-server/pull/2567#discussion_r925773569 :
+import com.github._1c_syntax.bsl.languageserver.BSLLSBinding;
+import com.github._1c_syntax.bsl.languageserver.BSLLanguageServer;
+import com.github._1c_syntax.bsl.languageserver.LanguageClientHolder;
+import org.eclipse.lsp4j.jsonrpc.Launcher.Builder;
+import org.eclipse.lsp4j.services.LanguageClient;
+import org.eclipse.lsp4j.websocket.WebSocketEndpoint;
+import org.springframework.stereotype.Component;
+import java.util.Collection;
@.***
+public class BSLLSWebSocketEndpoint extends WebSocketEndpoint<LanguageClient> {
@Override
protected void configure(Builder<LanguageClient> builder) {
builder.setLocalService(BSLLSBinding.getApplicationContext().getBean(BSLLanguageServer.class));
Пробовал так сделать. Сервер стартует, но клиент не соединяется с ним. Вернее соединение устанавливается, клиент вызывает метод initialize и отваливается. Затем заново попытка создать соединение и так по кругу.
[image: chrome_4SK2fxQiUx] https://user-images.githubusercontent.com/6356534/180026172-a2894b60-cb42-4f1e-9c00-036ad86c14f8.gif [image: BSL_Unsupported_0] https://user-images.githubusercontent.com/6356534/180026468-1f8d6dc9-9234-4768-b84a-aaf9809f7efe.png
— Reply to this email directly, view it on GitHub https://github.com/1c-syntax/bsl-language-server/pull/2567#discussion_r925773569, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAIUSKEG44GCLD7TQDJJ3SDVVANXFANCNFSM5PHP5A3A . You are receiving this because you were mentioned.Message ID: @.***>
Нужно врубать отладочные логи и глядеть... Тестовый клиент ты скидывал, да?
Да, выше тут выкладывал
Была у меня такая проблема:
- Сервер всегда использует конфигурацию по умолчанию. Я так понимаю, что взаимодействие с конфигурацией завязано на аннотацию
@RequiredArgsConstructor
и поле классаprivate final LanguageServerConfiguration
. При обработке команды в классеWebsocketStartCommand
никаких проблем с чтением и обновлением конфигурации из указанного файла не возникает. Однако, не ясно, как конфигурацию можно передать вBSLLSWebSocketEndpoint
для дальнейшей передачи вBSLLanguageServer
. Можете подсказать, как решить эту проблему?
Проблему решил, но не уверен, что сделал это правильно. Решение такое:
// Класс WebsocketCommand
LanguageServerConfiguration configuration = BSLLSBinding.getLanguageServerConfiguration();
configuration.update(configurationFile);
Изначально была аннотация @RequiredArgsConstructor
и поле private final LanguageServerConfiguration configuration;
, но в классе BSLLanguageServer
всё равно оказывалась конфигурация по умолчанию, не смотря на передачу имени файла конфигурации при запуске.
Однако, не ясно, как конфигурацию можно передать в BSLLSWebSocketEndpoint
Точно так же, через private final поле. Это класс-синглтон, все классы, которые запрашивают себе конфигурацию, получат один и тот же её инстанс. Соответственно если ты в команде сделаешь configuration.update, то она обновится во всех классах сразу.
Вообще единственное назначение BSLLSBinding - инициализация bsl ls вне спринг контекста, как например в сонар-плагине. Здесь же запуск из cli, поэтому все должно работать штатно, через внедрение зависимостей
Точно так же, через private final поле. Это класс-синглтон, все классы, которые запрашивают себе конфигурацию, получат один и тот же её инстанс. Соответственно если ты в команде сделаешь configuration.update, то она обновится во всех классах сразу.
Это понятно. Изначально по этому пути и пошёл, но не работает.
@salexdv тэкс, я таки осилил перевод веб-сокетов на ядро спринга. просьба протестировать.
@asosnoviy @otymko присоединяйтесь к веселью.
P.S. Из того что обнаружил - в "тест-клиенте" довольно старая версия монако/лэнгклиента и нет свежих фич. плюс клиент не шлет workspace в initialize, из-за этого не подхватываются сорцы из конфиг файла. но это вроде бы все решаемо.
P.S. Из того что обнаружил - в "тест-клиенте" довольно старая версия монако/лэнгклиента и нет свежих фич. плюс клиент не шлет workspace в initialize, из-за этого не подхватываются сорцы из конфиг файла. но это вроде бы все решаемо.
Используется версия monaco 0.20.0. Более новые версии отказываются запускаться внутри 1С. Для использования в вебе вполне можно использовать последнюю.
@salexdv поменял эндпоинт с /bsl-language-server на /lsp. Порт по умолчанию 8025. И порт и путь можно переопределить из командой строки.