-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Reapply changes for new message rpc #40
Conversation
…ns) (eclipse-theia#11011) Refactors and improves the prototype of a faster JSON-RPC protocol initially contributed by @tsmaeder (See also eclipse-theia#10781). The encoding approach used in the initial POC has some performance drawbacks when encoding plain JSON objects. We refactored the protocol to improve the performance for JSON objects whilst maintaining the excellent performance for encoding objects that contain binary data. Integrates the new message-rpc prototype into the core messaging API (replacing vscode-ws-jsonrpc). This has major impacts on the Messaging API as we no longer expose a `Connection` object (which was provided by vscode-ws-jsonrpc) and directly rely on a generic transport `Channel` implementation instead. - Introduce `Channel` as the main transport concept for messages (instead of the dedicated `Connection` from vscode-jsonrpc) - Replace usage of `vscode-ws-jsonrpc` with a custom binary RPC protocol. - Remove 'vscode-ws-jsonrpc' depdency from "@theia/core/shared". - Refactor all connection providers to use the new binary protocol. - Ensure that the `RemoteFileSystemProvider` API uses `Uint8Arrays` over plain number arrays. This enables direct serialization as buffers and reduces the overhead of unnecessarily converting from and to `Uint8Arrays`. - Refactor terminal widget and terminal backend contribution so that the widgets communicates with the underlying terminal process using the new rpc protocol. - Rework the IPC bootstrap protocol so that it uses a binary pipe for message transmission instead of the `ipc` pipe which only supports string encoding. - Extend the `JsonRpcProxyFactory` with an optional `RpcConnectionFactory` that enables adopter to creates proxies with a that use a custom `RpcProtocol`/`RpcConnection`. The plugin API still uses its own RPC protocol implementation. This will be addressed in a follow-up PR. (See eclipse-theia#11093) Contributed on behalf of STMicroelectronics. Closes eclipse-theia#10684 Co-authored-by: Thomas Mäder <[email protected]>
@tortmayr it would be helpful for the review if you told us what caused the bugs you fixed in the latest commit and how they are addressed. |
- eclipse-theiaGH-11196 Remove dev/debug logoutput from IPCChannel - eclipse-theiaGH-11199 Refactor connection provider and channel multiplexer to properly handle a reconnecting backend - Remove console log in websocket-channel if the socket is not connected. Otherwise we end up in an endless loop. - Ensure that channels & RpcProtocol instances proplery dispose all resources if the backend disconnects. - Ensure that all previously open channels and RpcProtocol instances are properly restored once the backend reconnects. - eclipse-theia#11203 Ensure that debugging is handled gracefully (implicitly fixed with the fix for eclipse-theia#11199) - Remove dependency to `reconnecting-websocket` which is no longer needed since the swap to socket.io Fixes eclipse-theia#11196 Fixes eclipse-theia#11199 Contributed on behalf of STMicroelectronics
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tested the debug and reconnect issues and they seem solved to me. Also, plugins get restarted properly after reconnect
@lucas-koehler Thanks. So I will go ahead and open the "real" PR in the main Theia repository |
Co-authored-by: Olaf Lessenich <[email protected]>
Co-authored-by: Olaf Lessenich <[email protected]>
Co-authored-by: Olaf Lessenich <[email protected]>
Co-authored-by: Olaf Lessenich <[email protected]>
What it does
Reapplies the changes for the binary message rpc, originally introduced with eclipse-theia#11011 and fixes the critical issues with lead to reverting the original change.
In particular the following issues are addressed:
These bugs were caused by a combination of underlying issues:
console.warn
. Using console logging in the browser indirectly also triggers an RPC call to theLoggerServer
. Naturally this call also fails and due to the console logging triggers another rpc call => we end up in and endless loop. Fixed by removing the console.warn statement inwebsocket-channel.ts
.RpcProtocol
instances were only partly disposed. This means once the backend reconnected did end up with multipleRpcProtocl
instances for the same proxy which lead to weird issues e.g. Sending a request from one instance but the reply for the request is then handled by the other instance.This is now fixed by ensuring that all components involved in the rpc communication (websocket main channel, multiplexer, multiplexed service channels,
RpcProtocol
instances) are fully disposed on disconnect and re-instantiated on reconnect.connection-service
was informed too early i.e. before all previously open channels have been restored. As a consequence some RPC calls (e.g. ping requests) were triggered before the responsible service channel was available.Fixed in
WebSocketConnectionProvider
by ensuring that theonSocketDidOpen
event is fired after all previously openend channels have been restored.onIncomingMessgeActivity
event of theWebSocketConnectionProvider
was never fired.How to test
To test the fix for #111999:
To test the fix for eclipse-theia#11203
Review checklist
Reminder for reviewers