-
Notifications
You must be signed in to change notification settings - Fork 42
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
Theia 技术揭秘之 JSON-RPC 通信 #85
Comments
您好,请问你们有需要做ide非活动后一段时间提示或者断开链接吗?跟gitpod类似,非活动一段时间会自动断开。目前想的是通过追踪ws,根据里面的message来判断。不过目前追踪message,会修改到源码。不知道您这边有研究吗? |
@zzkkui 方法很多,最简单的方式就是通过注入 JS 脚本轮询实现。 |
对,肯定会采用轮询,目前的话我觉得有两种方法可行,一种就是通过 不知道您这边有做过相关研究没。谢谢 |
@zzkkui 分为两种情况吧:
|
Theia 框架前端 UI 布局和 Services 一样,具备灵活可拓展的特点。VSCode 是内置了一套基本的组件系统,而 Theia 框架的 UI 布局基于 PhosphorJS 框架。 PhosphorJS 提供了包含 widgets、layouts、事件和数据结构的丰富工具包。这使得开发人员能够构建可扩展的、高性能的、类桌面的 Web 应用程序,比如 JupyterLab。
写在前面
前置条件:
Theia JSON RPC 实现的缺点:
Theia JSON-RPC 协议示例
通信场景
通过 Websocket 信道进行通信。
添加日志调试 JSON RPC 服务
在启动后,Theia 会启动一个 Express 服务。前后端的 JSON-RPC 通信,正是基于 Express 上的 Websocket 连接。
接下来将创建调试日志系统服务,然后通过 JSON RPC 连接到它。
注册服务
因此,你要做的第一件事是暴露服务,以便前端可以连接到它。
你需要创建类似于下面这个(logger-server-module. ts)的后端服务器模块文件:
核心在于
ConnectionHandler
和JsonRpcConnectionHandler
。JsonRpcConnectionHandler
:这个工厂允许您创建一个连接处理程序,onConnection
创建代理对象到 JSON-RPC 的后端调用的对象,并将本地对象暴露给 JSON-RPC。ConnectionHandler
ConnectionHandler
类型绑定到messaging-module.ts
中的 ContributionProvider。当
MessagingContribution
启动(调用 onStart)时,它为所有绑定ConnectionHandlers
创建一个 Websocket 连接。即依次在 Server 注册 path,并绑定 onConnection 事件。
JsonRpcConnectionHandler
我们看看一下
JsonRpcConnectionHandler
的实现,就会发现onConnection
做了三件事:JsonRpcProxyFactory
和传入的 path 创建 factory 实例factory.target = this.targetFactory(proxy);
第三步将调用
new JsonRpcConnectionHandler( )
传入的函数:这将在 loggerServer 上设置 Client,在这种情况下,用于向前端发送 onLogLevelChanged 通知。
这样,
services/*
的请求由 Webpack dev server 处理,请参阅webpack.config.js
。Server 实现
Server 定义通过 JSON-RPC 调用的后端对象,
ILoggerServer
接口如下,这里定义了 4 个方法。继承自
JsonRpcServer
:当前,源码中仅有
ConsoleLoggerServer
的实现:export class ConsoleLoggerServer implements ILoggerServer {}
Client 实现
Client 用于定义接收来自后端对象的通知,
DispatchingLoggerClient
实现如下:前端连接服务
上面我们创建了后端服务,接下来我们需要从前端连接它。
分为以下三步:
loggerWatcher.getLoggerClient()
获得本地对象,用来来处理来自远程对象的 JSON-RPC 消息,通过传入 createProxy 创建一个代理WebSocketConnectionProvider 的
connection.createProxy
实际执行以下代码:接下来,即可使用
ILoggerService
获取对象进行 RPC 调用。LoggerWatcher
LoggerWatcher 定义了 onLogLevelChanged 的消息响应。
加载模块
需要导入模块和加载进主容器两步。
完整的通信例子可以看:
Add debug logging support · eclipse-theia/theia@99d191f
源码
核心的接口和类有:ConnectionHandler,JsonRpcConnectionHandler 以及 JsonRpcProxyFactory,搞清楚他们的作用。
ConnectionHandler
ConnectionHandler 是一个简单的接口,它指定连接的 path 以及 onConnection 方法。
JsonRpcConnectionHandler
JsonRpcProxyFactory
在JsonRpcConnectionHandler
中被使用。Websocket 连接正是在
JsonRpcConnectionHandler
类上建立的。建立连接的逻辑在JsonRpcConnectionHandler
类的 onConnection 函数上,过程如下:JsonRpcProxyFactory
JSON RPC 的核心在于:
JsonRpcProxyFactory
,源码里注释很详细,还有使用 Demo,值得好好学习一下。写在最后
个人还是觉得 cyrus-and/chrome-remote-interface 使用协议定义文件自动生成方式更优雅,代码更简洁。且独立成包,每次只需要添加 protocol 类型文件内容即可自动生成接口。
不过 chrome-remote-interface 只是一个客户端接口,并没有服务端。个人参考着设计了基于 Websocket 的 JSON RPC 协议规范和及 API。:cloudbase-interface,具有以下优点:
参考
The text was updated successfully, but these errors were encountered: