core
core copied to clipboard
feat: using browser version jsonrpc client to connect server
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 客户端连接后端服务
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.
@yantze @hacke2 找到了一处可能在集成侧被应用导致 Node 层引入 Browser 代码,这里 @opensumi/ide-remote-opener
内在 common 内引入了 @opensumi/ide-core-browser
代码 remote-opener/src/common/index.ts#L1 而其中的 Node 层代码又引入了 ../common
内容,最终会导致 Node 层引入了 Browser 代码。
目前只找到了这处,不知道还有没有
@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 connection 模块内的 jsonrpc 依赖为自执行代码,只要引入了就会执行,所以这里一旦引入了就会有影响,引入了 core-browser
的最终影响路径是:
@opensumi/ide-core-browser
=> export * from './bootstrap'
=> export * from './connection'

框架内大概有 30 处这种错误引入,当然如果是纯 Browser 模块,在 common 中引入 @opensumi/ide-core-browser
是允许的,需要统一看一下 @yantze
OpenSumi 中 common 直接引用 ide-core-browser 整个模块的挺多的,感觉都可以去掉。
但目前的情况是,删除 browser 层中 jsonrpc 模块 Node.js 的初始化,这些在这个 pr 中已经不会影响的了。
之前要保留 import '@opensumi/vscode-jsonrpc/lib/node/main';
是因为 common 引用了 browser,导致竞速问题,现在已经没有竞速问题了,所以 common 引用 browser 是不会影响到连接的。
我处理一下 common 引入 browser 的问题吧。
目前的竞速问题是这样的:
- node 层 <- common 层 <- browser 层 <- jsonrpc browser 层
- node 层 <- jsonrpc node 层
node 层 jsonrpc 初始化了 Node 和 Browser 版本的 jsonrpc,导致有竞速问题,只要中断第一个链接即可。
/publish
/publish
🎉 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
根据目前的调查,之前 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 的实现即可
@opensumi/vscode-jsonrpc@npm:8.0.0-beta.7
已经测试完毕
import '@opensumi/vscode-jsonrpc/lib/node/main'
这个目前去掉后,使用 import { createMessageConnection } from '@opensumi/vscode-jsonrpc/lib/client/main';
替代,对 electron 和 browser 环境无差别支持。
https://github.com/opensumi/vscode-jsonrpc/pull/12 回滚后本分支不再维护