core icon indicating copy to clipboard operation
core copied to clipboard

feat: using browser version jsonrpc client to connect server

Open yantze opened this issue 2 years ago • 11 comments

Types

  • [x] 🪚 Refactors

Background or solution

由于 ide-core-browser 引用了 vscode-jsonrpc 的 node 版本,导致不管是 Web 版本还是 Electron 版本在 Browser 环境都需要 Webpack mock 一整套代码,会导致 browser 和 node 层难以分离。

通过单独对 jsonrpc 实现了一个 electron-renderer ,提供专为 electron-renderer 服务的版本,可以完全分离这块的逻辑。 https://github.com/opensumi/vscode-jsonrpc/pull/6

  • [x] vscode-jsonrpc 前序完成 https://github.com/opensumi/vscode-jsonrpc/pull/6 (等 jsonrpc 合并后再合这个 pr)

之后处理 mock 的 setImmediate、buffer 和 TextEncoder 等都可以使用原生,另外 webpack 5 升级可以提上来了

Changelog

electron 场景下使用 electron-renderer 版本的 jsonrpc 客户端连接后端服务

yantze avatar Aug 29 '22 03:08 yantze

Codecov Report

Base: 57.72% // Head: 57.72% // Decreases project coverage by -0.00% :warning:

Coverage data is based on head (a4f88b1) compared to base (d93b6d3). Patch coverage: 80.00% of modified lines in pull request are covered.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1584      +/-   ##
==========================================
- Coverage   57.72%   57.72%   -0.01%     
==========================================
  Files        1299     1299              
  Lines       81607    81607              
  Branches    17009    17009              
==========================================
- Hits        47106    47104       -2     
- Misses      31368    31369       +1     
- Partials     3133     3134       +1     
Flag Coverage Δ
jsdom 52.54% <60.00%> (-0.01%) :arrow_down:
node 16.81% <40.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ
packages/comments/src/common/index.ts 100.00% <ø> (ø)
packages/connection/src/common/message.ts 71.73% <ø> (-0.61%) :arrow_down:
...ages/connection/src/node/common-channel-handler.ts 59.55% <ø> (ø)
packages/editor/src/common/editor.ts 100.00% <ø> (ø)
packages/keymaps/src/common/keymaps.ts 100.00% <ø> (ø)
packages/preferences/src/common/commands.ts 100.00% <ø> (ø)
packages/preferences/src/common/user-storage.ts 100.00% <ø> (ø)
packages/remote-opener/src/common/index.ts 100.00% <ø> (ø)
packages/scm/src/common/scm-menus.ts 100.00% <ø> (ø)
packages/terminal-next/src/common/controller.ts 100.00% <ø> (ø)
... and 9 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

:umbrella: View full report at Codecov.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.

codecov[bot] avatar Sep 20 '22 03:09 codecov[bot]

@yantze @hacke2 找到了一处可能在集成侧被应用导致 Node 层引入 Browser 代码,这里 @opensumi/ide-remote-opener 内在 common 内引入了 @opensumi/ide-core-browser 代码 remote-opener/src/common/index.ts#L1 而其中的 Node 层代码又引入了 ../common 内容,最终会导致 Node 层引入了 Browser 代码。

目前只找到了这处,不知道还有没有

erha19 avatar Oct 17 '22 02:10 erha19

@yantze @hacke2 找到了一处可能在集成侧被应用导致 Node 层引入 Browser 代码,这里 @opensumi/ide-remote-opener 内在 common 内引入了 @opensumi/ide-core-browser 代码 remote-opener/src/common/index.ts#L1 而其中的 Node 层代码又引入了 ../common 内容,最终会导致 Node 层引入了 Browser 代码。

目前只找到了这处,不知道还有没有

common 依赖 @opensumi/ide-core-browser 不影响 connection 模块吧?

hacke2 avatar Oct 17 '22 02:10 hacke2

@hacke2 connection 模块内的 jsonrpc 依赖为自执行代码,只要引入了就会执行,所以这里一旦引入了就会有影响,引入了 core-browser 的最终影响路径是:

@opensumi/ide-core-browser => export * from './bootstrap' => export * from './connection'

erha19 avatar Oct 17 '22 02:10 erha19

image

框架内大概有 30 处这种错误引入,当然如果是纯 Browser 模块,在 common 中引入 @opensumi/ide-core-browser 是允许的,需要统一看一下 @yantze

erha19 avatar Oct 17 '22 02:10 erha19

OpenSumi 中 common 直接引用 ide-core-browser 整个模块的挺多的,感觉都可以去掉。 image

yantze avatar Oct 17 '22 02:10 yantze

但目前的情况是,删除 browser 层中 jsonrpc 模块 Node.js 的初始化,这些在这个 pr 中已经不会影响的了。

之前要保留 import '@opensumi/vscode-jsonrpc/lib/node/main'; 是因为 common 引用了 browser,导致竞速问题,现在已经没有竞速问题了,所以 common 引用 browser 是不会影响到连接的。

yantze avatar Oct 17 '22 02:10 yantze

我处理一下 common 引入 browser 的问题吧。

目前的竞速问题是这样的:

  • node 层 <- common 层 <- browser 层 <- jsonrpc browser 层
  • node 层 <- jsonrpc node 层

node 层 jsonrpc 初始化了 Node 和 Browser 版本的 jsonrpc,导致有竞速问题,只要中断第一个链接即可。

yantze avatar Oct 17 '22 02:10 yantze

/publish

yantze avatar Oct 17 '22 04:10 yantze

/publish

yantze avatar Oct 17 '22 07:10 yantze

🎉 PR Next Release version 2.20.7-next-1665990348.0 publish successful! You can install prerelease version via npm install [email protected] @yantze

2.20.7-next-1665990348.0

github-actions[bot] avatar Oct 17 '22 07:10 github-actions[bot]

根据目前的调查,之前 cloud ide 打不开的情况是因为 createWebSocketConnection 是自己 OpenSumi 自己实现的,没有使用 @opensumi/vscode-jsonrpc 模块中的所有的 RIL.install 初始化,因为没有初始化 RIL,所以导致整个 IDE 打不开。

目前 Node.js 进程初始化 jsonrpc 是一定用 Node.js 层的 RIL 实现,@opensumi/vscode-jsonrpc 里面 browser 其实没有用到。

所以其实只要封装一个和 Node 对应的 node-client browser 层实现即可,目前测试 electron-renderer 目录可以同时应用于 Web / Electron。后续只要改造 electron-renderer 的实现即可

yantze avatar Oct 20 '22 09:10 yantze

@opensumi/vscode-jsonrpc@npm:8.0.0-beta.7 已经测试完毕

yantze avatar Dec 23 '22 06:12 yantze

import '@opensumi/vscode-jsonrpc/lib/node/main' 这个目前去掉后,使用 import { createMessageConnection } from '@opensumi/vscode-jsonrpc/lib/client/main'; 替代,对 electron 和 browser 环境无差别支持。

yantze avatar Dec 23 '22 06:12 yantze

https://github.com/opensumi/vscode-jsonrpc/pull/12 回滚后本分支不再维护

yantze avatar Dec 23 '22 09:12 yantze