Open Pines-Cheng opened 3 years ago
您好,请问你们有需要做ide非活动后一段时间提示或者断开链接吗?跟gitpod类似,非活动一段时间会自动断开。目前想的是通过追踪ws,根据里面的message来判断。不过目前追踪message,会修改到源码。不知道您这边有研究吗?
您好,请问你们有需要做ide非活动后一段时间提示或者断开链接吗?跟gitpod类似,非活动一段时间会自动断开。目前想的是通过追踪ws,根据里面的message来判断。不过目前追踪message,会修改到源码。不知道您这边有研究吗?
@zzkkui 方法很多,最简单的方式就是通过注入 JS 脚本轮询实现。
您好,请问你们有需要做ide非活动后一段时间提示或者断开链接吗?跟gitpod类似,非活动一段时间会自动断开。目前想的是通过追踪ws,根据里面的message来判断。不过目前追踪message,会修改到源码。不知道您这边有研究吗?
@zzkkui 方法很多,最简单的方式就是通过注入 JS 脚本轮询实现。
对,肯定会采用轮询,目前的话我觉得有两种方法可行,一种就是通过mouseover
事件,另外一种就是追踪 ws 的message,判断是否是像下面这种状态
但是如何在不修改theia源码的情况下,我还没找方法通过扩展的方式来拦截
https://github.com/eclipse-theia/theia/blob/65509341ebf2e6c2aedd98c066c9d405a111200f/packages/core/src/common/messaging/web-socket-channel.ts#L118-L122
或者
https://github.com/eclipse-theia/theia/blob/65509341ebf2e6c2aedd98c066c9d405a111200f/packages/core/src/common/messaging/abstract-connection-provider.ts#L107-L116
不知道您这边有做过相关研究没。谢谢
@zzkkui 分为两种情况吧:
mouseover
等事件,加个 debounce
触发弹窗或关闭就行了,没必要做到 ws 那么细的粒度,除非有额外的需求。
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,具有以下优点:
参考