bsl-language-server icon indicating copy to clipboard operation
bsl-language-server copied to clipboard

Feature/websocket Поддержка работы через websocket

Open salexdv opened this issue 3 years ago • 14 comments

Описание

Поддержка общения в BSL Language Server через websocket

Связанные задачи

#1427

Чеклист

Общие

  • [x] Ветка PR обновлена из develop
  • [x] Отладочные, закомментированные и прочие, не имеющие смысла участки кода удалены
  • [x] Изменения покрыты тестами
  • [x] Обязательные действия перед коммитом выполнены (запускал команду gradlew precommit)

Дополнительно

Хотелось бы иметь возможность общаться BSL Language Server через websocket. Например, это нужно для редактора на основе monaco editor, работающего внутри 1С через webkit bsl

Сложности, недоработки, вопросы

С разработкой на Java был мало знаком, до того как решил добавить указанную функциональность, отсюда есть несколько сложностей, которые мешают полноценной работе сервера через вебсокет.

  1. Сервер всегда использует конфигурацию по умолчанию. Я так понимаю, что взаимодействие с конфигурацией завязано на аннотацию @RequiredArgsConstructor и поле класса private final LanguageServerConfiguration. При обработке команды в классе WebsocketStartCommand никаких проблем с чтением и обновлением конфигурации из указанного файла не возникает. Однако, не ясно, как конфигурацию можно передать в BSLLSWebSocketEndpoint для дальнейшей передачи в BSLLanguageServer. Можете подсказать, как решить эту проблему?
  2. Как правильно тестировать работу через вебсокеты, какие тесты желательно реализовать?

salexdv avatar Feb 24 '22 14:02 salexdv

ну нихрена себе!

спасибо, заценим.

nixel2007 avatar Feb 24 '22 16:02 nixel2007

Описание

Поддержка общения в BSL Language Server через websocket

Связанные задачи

#1427

Чеклист

Общие

  • [x] Ветка PR обновлена из develop
  • [x] Отладочные, закомментированные и прочие, не имеющие смысла участки кода удалены
  • [ ] Изменения покрыты тестами
  • [ ] Обязательные действия перед коммитом выполнены (запускал команду gradlew precommit)

Дополнительно

Хотелось бы иметь возможность общаться BSL Language Server через websocket. Например, это нужно для редактора на основе monaco editor, работающего внутри 1С через webkit bsl

Сложности, недоработки, вопросы

С разработкой на Java был мало знаком, до того как решил добавить указанную функциональность, отсюда есть несколько сложностей, которые мешают полноценной работе сервера через вебсокет.

  1. Сервер всегда использует конфигурацию по умолчанию. Я так понимаю, что взаимодействие с конфигурацией завязано на аннотацию @RequiredArgsConstructor и поле класса private final LanguageServerConfiguration. При обработке команды в классе WebsocketStartCommand никаких проблем с чтением и обновлением конфигурации из указанного файла не возникает. Однако, не ясно, как конфигурацию можно передать в BSLLSWebSocketEndpoint для дальнейшей передачи в BSLLanguageServer. Можете подсказать, как решить эту проблему?
  2. Как правильно тестировать работу через вебсокеты, какие тесты желательно реализовать?
  1. попробую на днях найти примеры тестирования lsp и вебсокета, вроде такие тесты были в lsp4j.

otymko avatar Feb 27 '22 07:02 otymko

Прилагаю "клиенты" для тестирования test_client.zip

С простым текстом модуля index_successful.html всё хорошо, а вот index_fail.html падает вот здесь и причины падения пока непонятны.

salexdv avatar Mar 01 '22 13:03 salexdv

@salexdv а есть стак-трейс и trace.log?

nixel2007 avatar Mar 02 '22 08:03 nixel2007

@salexdv а есть стак-трейс и trace.log?

Да. trace.log

salexdv avatar Mar 02 '22 08:03 salexdv

@qtLex тут трейс лог по переменным в индексе. глянешь?

nixel2007 avatar Mar 12 '22 03:03 nixel2007

@nixel2007 Гляну.

qtLex avatar Mar 12 '22 06:03 qtLex

@qtLex тут трейс лог по переменным в индексе. глянешь?

Вот, что удалось накопать https://github.com/1c-syntax/bsl-language-server/pull/2577.

qtLex avatar Mar 12 '22 09:03 qtLex

Влил, спасибо!

nixel2007 avatar Mar 12 '22 10:03 nixel2007

Нужно врубать отладочные логи и глядеть... Тестовый клиент ты скидывал, да?

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: @.***>

nixel2007 avatar Jul 20 '22 20:07 nixel2007

Нужно врубать отладочные логи и глядеть... Тестовый клиент ты скидывал, да?

Да, выше тут выкладывал

salexdv avatar Jul 21 '22 04:07 salexdv

Была у меня такая проблема:

  1. Сервер всегда использует конфигурацию по умолчанию. Я так понимаю, что взаимодействие с конфигурацией завязано на аннотацию @RequiredArgsConstructor и поле класса private final LanguageServerConfiguration. При обработке команды в классе WebsocketStartCommand никаких проблем с чтением и обновлением конфигурации из указанного файла не возникает. Однако, не ясно, как конфигурацию можно передать в BSLLSWebSocketEndpoint для дальнейшей передачи в BSLLanguageServer. Можете подсказать, как решить эту проблему?

Проблему решил, но не уверен, что сделал это правильно. Решение такое:

// Класс WebsocketCommand
LanguageServerConfiguration configuration = BSLLSBinding.getLanguageServerConfiguration();
configuration.update(configurationFile);

Изначально была аннотация @RequiredArgsConstructor и поле private final LanguageServerConfiguration configuration;, но в классе BSLLanguageServer всё равно оказывалась конфигурация по умолчанию, не смотря на передачу имени файла конфигурации при запуске.

salexdv avatar Jul 21 '22 05:07 salexdv

Однако, не ясно, как конфигурацию можно передать в BSLLSWebSocketEndpoint

Точно так же, через private final поле. Это класс-синглтон, все классы, которые запрашивают себе конфигурацию, получат один и тот же её инстанс. Соответственно если ты в команде сделаешь configuration.update, то она обновится во всех классах сразу.

Вообще единственное назначение BSLLSBinding - инициализация bsl ls вне спринг контекста, как например в сонар-плагине. Здесь же запуск из cli, поэтому все должно работать штатно, через внедрение зависимостей

nixel2007 avatar Jul 21 '22 06:07 nixel2007

Точно так же, через private final поле. Это класс-синглтон, все классы, которые запрашивают себе конфигурацию, получат один и тот же её инстанс. Соответственно если ты в команде сделаешь configuration.update, то она обновится во всех классах сразу.

Это понятно. Изначально по этому пути и пошёл, но не работает.

salexdv avatar Jul 21 '22 06:07 salexdv

@salexdv тэкс, я таки осилил перевод веб-сокетов на ядро спринга. просьба протестировать.

@asosnoviy @otymko присоединяйтесь к веселью.

P.S. Из того что обнаружил - в "тест-клиенте" довольно старая версия монако/лэнгклиента и нет свежих фич. плюс клиент не шлет workspace в initialize, из-за этого не подхватываются сорцы из конфиг файла. но это вроде бы все решаемо.

nixel2007 avatar Oct 26 '22 14:10 nixel2007

P.S. Из того что обнаружил - в "тест-клиенте" довольно старая версия монако/лэнгклиента и нет свежих фич. плюс клиент не шлет workspace в initialize, из-за этого не подхватываются сорцы из конфиг файла. но это вроде бы все решаемо.

Используется версия monaco 0.20.0. Более новые версии отказываются запускаться внутри 1С. Для использования в вебе вполне можно использовать последнюю.

salexdv avatar Oct 26 '22 16:10 salexdv

@salexdv поменял эндпоинт с /bsl-language-server на /lsp. Порт по умолчанию 8025. И порт и путь можно переопределить из командой строки.

nixel2007 avatar Oct 28 '22 15:10 nixel2007

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

No Coverage information No Coverage information
No Duplication information No Duplication information

sonarqubecloud[bot] avatar Oct 28 '22 18:10 sonarqubecloud[bot]