@opensumi/ide-connection 2.12.1-next-079c1930

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +208 -0
  2. package/lib/browser/ws-channel-handler.d.ts +27 -0
  3. package/lib/browser/ws-channel-handler.d.ts.map +1 -0
  4. package/lib/browser/ws-channel-handler.js +134 -0
  5. package/lib/browser/ws-channel-handler.js.map +1 -0
  6. package/lib/common/message.d.ts +29 -0
  7. package/lib/common/message.d.ts.map +1 -0
  8. package/lib/common/message.js +84 -0
  9. package/lib/common/message.js.map +1 -0
  10. package/lib/common/proxy.d.ts +2 -0
  11. package/lib/common/proxy.d.ts.map +1 -0
  12. package/lib/common/proxy.js +5 -0
  13. package/lib/common/proxy.js.map +1 -0
  14. package/lib/common/rpcProtocol.d.ts +68 -0
  15. package/lib/common/rpcProtocol.d.ts.map +1 -0
  16. package/lib/common/rpcProtocol.js +279 -0
  17. package/lib/common/rpcProtocol.js.map +1 -0
  18. package/lib/common/utils.d.ts +3 -0
  19. package/lib/common/utils.d.ts.map +1 -0
  20. package/lib/common/utils.js +12 -0
  21. package/lib/common/utils.js.map +1 -0
  22. package/lib/common/ws-channel.d.ts +74 -0
  23. package/lib/common/ws-channel.d.ts.map +1 -0
  24. package/lib/common/ws-channel.js +86 -0
  25. package/lib/common/ws-channel.js.map +1 -0
  26. package/lib/index.d.ts +6 -0
  27. package/lib/index.d.ts.map +1 -0
  28. package/lib/index.js +10 -0
  29. package/lib/index.js.map +1 -0
  30. package/lib/node/center/index.d.ts +63 -0
  31. package/lib/node/center/index.d.ts.map +1 -0
  32. package/lib/node/center/index.js +198 -0
  33. package/lib/node/center/index.js.map +1 -0
  34. package/lib/node/center/proxy.d.ts +43 -0
  35. package/lib/node/center/proxy.d.ts.map +1 -0
  36. package/lib/node/center/proxy.js +210 -0
  37. package/lib/node/center/proxy.js.map +1 -0
  38. package/lib/node/common-channel-handler.d.ts +35 -0
  39. package/lib/node/common-channel-handler.d.ts.map +1 -0
  40. package/lib/node/common-channel-handler.js +210 -0
  41. package/lib/node/common-channel-handler.js.map +1 -0
  42. package/lib/node/index.d.ts +4 -0
  43. package/lib/node/index.d.ts.map +1 -0
  44. package/lib/node/index.js +7 -0
  45. package/lib/node/index.js.map +1 -0
  46. package/lib/node/ws.d.ts +21 -0
  47. package/lib/node/ws.d.ts.map +1 -0
  48. package/lib/node/ws.js +88 -0
  49. package/lib/node/ws.js.map +1 -0
  50. package/package.json +30 -0
package/README.md ADDED
@@ -0,0 +1,208 @@
1
+ # 通信模块(connection)
2
+
3
+ 基于 jsonrpc 完成多端远程调用场景,兼容 lsp 等通信方式
4
+
5
+
6
+ ### opensumi 中使用
7
+
8
+ **准备**
9
+ 1. 框架中服务分为运行在浏览器环境的 前端服务(frontService) 与运行在 node 环境的 后端服务(backService),服务在两端的实现方式是一致的
10
+ 2. 目前在 `tools/dev-tool` 中的启动逻辑中完成了服务的注册和获取逻辑,在具体功能模块中无需关心具体的通信注册获取逻辑
11
+
12
+ **后端服务(backService)**
13
+ 后端服务(backService) 即在 Web Server 暴露的能力,类似 web 应用框架中 controller提供的请求响应逻辑
14
+
15
+ 1. 注册服务
16
+
17
+ `packages/file-service/src/node/index.ts`
18
+ ```javascript
19
+ import { FileSystemNodeOptions, FileService } from './file-service';
20
+ import {servicePath} from '../common/index';
21
+
22
+ export class FileServiceModule extends NodeModule {
23
+ providers = [{ token: 'FileServiceOptions', useValue: FileSystemNodeOptions.DEFAULT }];
24
+
25
+ backServices = [
26
+ {
27
+ servicePath,
28
+ token: FileService,
29
+ },
30
+ ];
31
+ }
32
+ ```
33
+
34
+ 例如在 file-service 模块中,通过定义 `backServices` 数组,传递模块提供的后端服务,`servicePath` 为前端模块引用的服务地址,以及对应服务的注入 `token`
35
+
36
+ 2. 服务调用
37
+
38
+ `packages/file-tree/src/browser/index.ts`
39
+ ```javascript
40
+
41
+ import {servicePath as FileServicePath} from '@opensumi/ide-file-service';
42
+
43
+ @Injectable()
44
+ export class FileTreeModule extends BrowserModule {
45
+
46
+ providers: Provider[] = [
47
+ createFileTreeAPIProvider(FileTreeAPIImpl),
48
+ ];
49
+ backServices = [{
50
+ servicePath: FileServicePath,
51
+ }];
52
+ }
53
+
54
+ ```
55
+
56
+ 例如在 file-tree 模块中,首先在模块入口位置声明需要用到的 `backServices`,传入引用的服务 `servicePath`,与服务注册时的 `servicePath` 一致
57
+
58
+ `packages/file-tree/src/browser/file-tree.service.ts`
59
+ ```javascript
60
+ import {servicePath as FileServicePath} from '@opensumi/ide-file-service';
61
+
62
+ @Injectable()
63
+ export default class FileTreeService extends Disposable {
64
+
65
+ @observable.shallow
66
+ files: CloudFile[] = [];
67
+
68
+ @Autowired()
69
+ private fileAPI: FileTreeAPI;
70
+
71
+ @Autowired(CommandService)
72
+ private commandService: CommandService;
73
+
74
+ constructor(@Inject(FileServicePath) protected readonly fileSevice) {
75
+ super();
76
+
77
+ this.getFiles();
78
+ }
79
+ createFile = async () => {
80
+ const {content} = await this.fileSevice.resolveContent('/Users/franklife/work/ide/ac/ide-framework/tsconfig.json');
81
+ const file = await this.fileAPI.createFile({
82
+ name: 'name' + Date.now() + '\n' + content,
83
+ path: 'path' + Date.now(),
84
+ });
85
+
86
+ // 只会执行注册在 Module 里声明的 Contribution
87
+ this.commandService.executeCommand('file.tree.console');
88
+
89
+ if (this.files) {
90
+ this.files.push(file);
91
+ } else {
92
+ this.files = [file];
93
+ }
94
+ }
95
+ }
96
+ ```
97
+
98
+ 在 file-tree.service.ts 中通过 `servicePath` 进行注入,并直接调用在服务类上的方法
99
+
100
+ ```javascript
101
+ constructor(@Inject(FileServicePath) protected readonly fileSevice) {
102
+ super();
103
+
104
+ this.getFiles();
105
+ }
106
+ ```
107
+
108
+ 方法调用会转换成一个远程调用进行响应,返回结果
109
+
110
+ ```javascript
111
+ const {content} = await this.fileSevice.resolveContent('/Users/franklife/work/ide/ac/ide-framework/tsconfig.json');
112
+ ```
113
+
114
+
115
+ **前端服务(frontService)**
116
+ 后端服务(backService) 即在 Browser 环境下运行的代码暴露的能力
117
+
118
+ 1. 注册服务
119
+
120
+ `packages/file-ree/src/browser/index.ts`
121
+ ```javascript
122
+ @Injectable()
123
+ export class FileTreeModule extends BrowserModule {
124
+
125
+ providers: Provider[] = [
126
+ createFileTreeAPIProvider(FileTreeAPIImpl),
127
+ ];
128
+ backServices = [{
129
+ servicePath: FileServicePath,
130
+ }];
131
+ frontServices = [{
132
+ servicePath: FileTreeServicePath,
133
+ token: FileTreeService,
134
+ }];
135
+ }
136
+ ```
137
+
138
+ 与后端服务注册类似,例如在 file-tree 模块中声明 `frontServices` 字段,传入对应的服务地址 `servicePath` 和对应服务的注入 `token`
139
+
140
+ 2. 服务使用
141
+
142
+ `packages/file-service/src/node/index.ts`
143
+ ```javascript
144
+ import {servicePath as FileTreeServicePath} from '@opensumi/ide-file-tree';
145
+
146
+ @Injectable()
147
+ export class FileServiceModule extends NodeModule {
148
+ providers = [{ token: 'FileServiceOptions', useValue: FileSystemNodeOptions.DEFAULT }];
149
+
150
+ backServices = [
151
+ {
152
+ servicePath,
153
+ token: FileService,
154
+ },
155
+ ];
156
+ frontServices = [
157
+ {
158
+ servicePath: FileTreeServicePath,
159
+ },
160
+ ];
161
+ }
162
+ ```
163
+
164
+ 与使用后端服务一致,在模块定义中声明需要使用的前端服务 `frontServices`,传入前端服务注册时用的 `servicePath` 一致
165
+
166
+ `packages/file-service/src/node/file-service.ts`
167
+ ```javascript
168
+ @Injectable()
169
+ export class FileService implements IFileService {
170
+
171
+ constructor(
172
+ @Inject('FileServiceOptions') protected readonly options: FileSystemNodeOptions,
173
+ @Inject(FileTreeServicePath) protected readonly fileTreeService
174
+ ) { }
175
+
176
+ async resolveContent(uri: string, options?: { encoding?: string }): Promise<{ stat: FileStat, content: string }> {
177
+ const fileTree = await this.fileTreeService
178
+ fileTree.fileName(uri.substr(-5))
179
+
180
+ ...
181
+ return { stat, content };
182
+ }
183
+ ```
184
+
185
+ 与使用后端服务使用方式一致,在 file-service.ts 中通过 `servicePath` 进行注入,通过调用注入服务的对应方法
186
+
187
+ ```javascript
188
+ constructor(
189
+ @Inject('FileServiceOptions') protected readonly options: FileSystemNodeOptions,
190
+ @Inject(FileTreeServicePath) protected readonly fileTreeService
191
+ ) { }
192
+ ```
193
+
194
+ 方法调用会转换成一个远程调用进行响应,返回结果
195
+ ```javascript
196
+ const fileTree = await this.fileTreeService
197
+ fileTree.fileName(uri.substr(-5))
198
+ ```
199
+
200
+ 与后端服务调用区别的是,目前因前端代码后置执行,所以首先需要获取服务 `await thie.fileTreeService` 后进行调用
201
+
202
+
203
+
204
+
205
+
206
+
207
+
208
+
@@ -0,0 +1,27 @@
1
+ import { WSChannel } from '../common/ws-channel';
2
+ import { IReporterService } from '@opensumi/ide-core-common';
3
+ export declare class WSChannelHandler {
4
+ wsPath: string;
5
+ protocols?: string[] | undefined;
6
+ connection: WebSocket;
7
+ private channelMap;
8
+ private logger;
9
+ clientId: string;
10
+ private heartbeatMessageTimer;
11
+ private reporterService;
12
+ constructor(wsPath: string, logger: any, protocols?: string[] | undefined, clientId?: string);
13
+ replaceLogger(logger: any): void;
14
+ setReporter(reporterService: IReporterService): void;
15
+ private clientMessage;
16
+ private heartbeatMessage;
17
+ initHandler(): Promise<void>;
18
+ private getChannelSend;
19
+ openChannel(channelPath: string): Promise<WSChannel>;
20
+ dispose(): void;
21
+ }
22
+ export declare class WSChanneHandler extends WSChannelHandler {
23
+ wsPath: string;
24
+ protocols?: string[] | undefined;
25
+ constructor(wsPath: string, logger: any, protocols?: string[] | undefined, clientId?: string);
26
+ }
27
+ //# sourceMappingURL=ws-channel-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-channel-handler.d.ts","sourceRoot":"","sources":["../../src/browser/ws-channel-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiB,MAAM,sBAAsB,CAAC;AAIhE,OAAO,EAAE,gBAAgB,EAAe,MAAM,2BAA2B,CAAC;AAU1E,qBAAa,gBAAgB;IAQR,MAAM,EAAE,MAAM;IAAsB,SAAS,CAAC;IAP1D,UAAU,EAAE,SAAS,CAAC;IAC7B,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,MAAM,CAAW;IAClB,QAAQ,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,eAAe,CAAmB;gBAEvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAS,SAAS,CAAC,sBAAU,EAAE,QAAQ,CAAC,EAAE,MAAM;IAM9F,aAAa,CAAC,MAAM,EAAE,GAAG;IAKzB,WAAW,CAAC,eAAe,EAAE,gBAAgB;IAG7C,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,gBAAgB;IAcX,WAAW;IA2CxB,OAAO,CAAC,cAAc,CAQrB;IACY,WAAW,CAAC,WAAW,EAAE,MAAM;IAgBrC,OAAO;CAKf;AAED,qBAAa,eAAgB,SAAQ,gBAAgB;IAChC,MAAM,EAAE,MAAM;IAAsB,SAAS,CAAC;gBAA9C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAS,SAAS,CAAC,sBAAU,EAAE,QAAQ,CAAC,EAAE,MAAM;CAI/F"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WSChanneHandler = exports.WSChannelHandler = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const ws_channel_1 = require("../common/ws-channel");
6
+ const shortid_1 = (0, tslib_1.__importDefault)(require("shortid"));
7
+ const utils_1 = require("../common/utils");
8
+ const warning_1 = require("@opensumi/ide-components/lib/utils/warning");
9
+ const ide_core_common_1 = require("@opensumi/ide-core-common");
10
+ let ReconnectingWebSocket = require('reconnecting-websocket');
11
+ if (ReconnectingWebSocket.default) {
12
+ /* istanbul ignore next */
13
+ ReconnectingWebSocket = ReconnectingWebSocket.default;
14
+ }
15
+ // 前台链接管理类
16
+ class WSChannelHandler {
17
+ constructor(wsPath, logger, protocols, clientId) {
18
+ this.wsPath = wsPath;
19
+ this.protocols = protocols;
20
+ this.channelMap = new Map();
21
+ this.logger = console;
22
+ this.getChannelSend = (connection) => {
23
+ return (content) => {
24
+ connection.send(content, (err) => {
25
+ if (err) {
26
+ this.logger.warn(err);
27
+ }
28
+ });
29
+ };
30
+ };
31
+ this.logger = logger || this.logger;
32
+ this.clientId = clientId || `CLIENT_ID_${shortid_1.default.generate()}`;
33
+ this.connection = new ReconnectingWebSocket(wsPath, protocols, {}); // new WebSocket(wsPath, protocols);
34
+ }
35
+ // 为解决建立连接之后,替换成可落盘的 logger
36
+ replaceLogger(logger) {
37
+ if (logger) {
38
+ this.logger = logger;
39
+ }
40
+ }
41
+ setReporter(reporterService) {
42
+ this.reporterService = reporterService;
43
+ }
44
+ clientMessage() {
45
+ const clientMsg = (0, utils_1.stringify)({
46
+ kind: 'client',
47
+ clientId: this.clientId,
48
+ });
49
+ this.connection.send(clientMsg);
50
+ }
51
+ heartbeatMessage() {
52
+ if (this.heartbeatMessageTimer) {
53
+ clearTimeout(this.heartbeatMessageTimer);
54
+ }
55
+ this.heartbeatMessageTimer = global.setTimeout(() => {
56
+ const msg = (0, utils_1.stringify)({
57
+ kind: 'heartbeat',
58
+ clientId: this.clientId,
59
+ });
60
+ this.connection.send(msg);
61
+ this.heartbeatMessage();
62
+ }, 5000);
63
+ }
64
+ async initHandler() {
65
+ this.connection.onmessage = (e) => {
66
+ // 一个心跳周期内如果有收到消息,则不需要再发送心跳
67
+ this.heartbeatMessage();
68
+ const msg = (0, utils_1.parse)(e.data);
69
+ if (msg.id) {
70
+ const channel = this.channelMap.get(msg.id);
71
+ if (channel) {
72
+ if (msg.kind === 'data' && !channel.fireMessage) {
73
+ // 要求前端发送初始化消息,但后端最先发送消息时,前端并未准备好
74
+ this.logger.error(`channel not ready!`, msg);
75
+ }
76
+ channel.handleMessage(msg);
77
+ }
78
+ else {
79
+ this.logger.warn(`channel ${msg.id} not found`);
80
+ }
81
+ }
82
+ };
83
+ await new Promise((resolve) => {
84
+ this.connection.addEventListener('open', () => {
85
+ this.clientMessage();
86
+ this.heartbeatMessage();
87
+ resolve(undefined);
88
+ // 重连 channel
89
+ if (this.channelMap.size) {
90
+ this.channelMap.forEach((channel) => {
91
+ channel.onOpen(() => {
92
+ this.reporterService && this.reporterService.point(ide_core_common_1.REPORT_NAME.CHANNEL_RECONNECT);
93
+ this.logger && this.logger.log(`channel reconnect ${this.clientId}:${channel.channelPath}`);
94
+ });
95
+ channel.open(channel.channelPath);
96
+ // 针对前端需要重新设置下后台状态的情况
97
+ if (channel.fireReOpen) {
98
+ channel.fireReOpen();
99
+ }
100
+ });
101
+ }
102
+ });
103
+ });
104
+ }
105
+ async openChannel(channelPath) {
106
+ const channelSend = this.getChannelSend(this.connection);
107
+ const channelId = `${this.clientId}:${channelPath}`;
108
+ const channel = new ws_channel_1.WSChannel(channelSend, channelId);
109
+ this.channelMap.set(channel.id, channel);
110
+ await new Promise((resolve) => {
111
+ channel.onOpen(() => {
112
+ resolve(undefined);
113
+ });
114
+ channel.open(channelPath);
115
+ });
116
+ return channel;
117
+ }
118
+ dispose() {
119
+ if (this.heartbeatMessageTimer) {
120
+ clearTimeout(this.heartbeatMessageTimer);
121
+ }
122
+ }
123
+ }
124
+ exports.WSChannelHandler = WSChannelHandler;
125
+ class WSChanneHandler extends WSChannelHandler {
126
+ constructor(wsPath, logger, protocols, clientId) {
127
+ super(wsPath, logger, protocols, clientId);
128
+ this.wsPath = wsPath;
129
+ this.protocols = protocols;
130
+ (0, warning_1.warning)(false, '[Deprecated warning]: WSChanneHandler was a wrong typo, please use WSChannelHandler');
131
+ }
132
+ }
133
+ exports.WSChanneHandler = WSChanneHandler;
134
+ //# sourceMappingURL=ws-channel-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-channel-handler.js","sourceRoot":"","sources":["../../src/browser/ws-channel-handler.ts"],"names":[],"mappings":";;;;AAAA,qDAAgE;AAChE,mEAA8B;AAC9B,2CAAmD;AACnD,wEAAqE;AACrE,+DAA0E;AAE1E,IAAI,qBAAqB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAE9D,IAAI,qBAAqB,CAAC,OAAO,EAAE;IACjC,0BAA0B;IAC1B,qBAAqB,GAAG,qBAAqB,CAAC,OAAO,CAAC;CACvD;AAED,UAAU;AACV,MAAa,gBAAgB;IAQ3B,YAAmB,MAAc,EAAE,MAAW,EAAS,SAAoB,EAAE,QAAiB;QAA3E,WAAM,GAAN,MAAM,CAAQ;QAAsB,cAAS,GAAT,SAAS,CAAW;QANnE,eAAU,GAAoC,IAAI,GAAG,EAAE,CAAC;QACxD,WAAM,GAAG,OAAO,CAAC;QAmFjB,mBAAc,GAAG,CAAC,UAAU,EAAE,EAAE;YACtC,OAAO,CAAC,OAAe,EAAE,EAAE;gBACzB,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;oBACtC,IAAI,GAAG,EAAE;wBACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBACvB;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;QACJ,CAAC,CAAA;QArFC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,aAAa,iBAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC9D,IAAI,CAAC,UAAU,GAAG,IAAI,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,oCAAoC;IAC1G,CAAC;IACD,2BAA2B;IAC3B,aAAa,CAAC,MAAW;QACvB,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACtB;IACH,CAAC;IACD,WAAW,CAAC,eAAiC;QAC3C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IACO,aAAa;QACnB,MAAM,SAAS,GAAkB,IAAA,iBAAS,EAAC;YACzC,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IACO,gBAAgB;QACtB,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;SAC1C;QACD,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YAClD,MAAM,GAAG,GAAG,IAAA,iBAAS,EAAC;gBACpB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAEM,KAAK,CAAC,WAAW;QACtB,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE;YAChC,2BAA2B;YAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAExB,MAAM,GAAG,GAAG,IAAA,aAAK,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE1B,IAAI,GAAG,CAAC,EAAE,EAAE;gBACV,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC5C,IAAI,OAAO,EAAE;oBACX,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAE,OAAe,CAAC,WAAW,EAAE;wBACxD,iCAAiC;wBACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;qBAC9C;oBACD,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;iBAC5B;qBAAM;oBACL,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;iBACjD;aACF;QACH,CAAC,CAAC;QACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC5C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnB,aAAa;gBACb,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;oBACxB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;wBAClC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;4BAClB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,6BAAW,CAAC,iBAAiB,CAAC,CAAC;4BAClF,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;wBAC9F,CAAC,CAAC,CAAC;wBACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;wBAElC,qBAAqB;wBACrB,IAAI,OAAO,CAAC,UAAU,EAAE;4BACtB,OAAO,CAAC,UAAU,EAAE,CAAC;yBACtB;oBACH,CAAC,CAAC,CAAC;iBACJ;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAUM,KAAK,CAAC,WAAW,CAAC,WAAmB;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,sBAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAEzC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;gBAClB,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,OAAO;QACZ,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;SAC1C;IACH,CAAC;CACF;AApHD,4CAoHC;AAED,MAAa,eAAgB,SAAQ,gBAAgB;IACnD,YAAmB,MAAc,EAAE,MAAW,EAAS,SAAoB,EAAE,QAAiB;QAC5F,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAD1B,WAAM,GAAN,MAAM,CAAQ;QAAsB,cAAS,GAAT,SAAS,CAAW;QAEzE,IAAA,iBAAO,EAAC,KAAK,EAAE,qFAAqF,CAAC,CAAC;IACxG,CAAC;CACF;AALD,0CAKC"}
@@ -0,0 +1,29 @@
1
+ import { AbstractMessageReader, AbstractMessageWriter } from '@opensumi/vscode-jsonrpc/lib/common/api';
2
+ import { MessageWriter } from '@opensumi/vscode-jsonrpc/lib/common/messageWriter';
3
+ import { MessageReader, DataCallback } from '@opensumi/vscode-jsonrpc/lib/common/messageReader';
4
+ import { Disposable } from '@opensumi/vscode-jsonrpc/lib/common/disposable';
5
+ export declare class WebSocketMessageReader extends AbstractMessageReader implements MessageReader {
6
+ protected readonly socket: any;
7
+ protected state: 'initial' | 'listening' | 'closed';
8
+ protected callback: DataCallback | undefined;
9
+ protected events: {
10
+ message?: any;
11
+ error?: any;
12
+ }[];
13
+ constructor(socket: any);
14
+ listen(callback: DataCallback): Disposable;
15
+ protected readMessage(message: any): void;
16
+ }
17
+ export declare class WebSocketMessageWriter extends AbstractMessageWriter implements MessageWriter {
18
+ protected readonly socket: any;
19
+ constructor(socket: any);
20
+ write(msg: any): Promise<void>;
21
+ end(): void;
22
+ }
23
+ /**
24
+ * 给服务端的 WebSocket 及 Browser 端的 WebSocket 实例共用的方法
25
+ * @param socket
26
+ * @returns
27
+ */
28
+ export declare function createWebSocketConnection(socket: any): import("@opensumi/vscode-jsonrpc/lib/common/connection").MessageConnection;
29
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/common/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAA2B,MAAM,yCAAyC,CAAC;AAChI,OAAO,EAAE,aAAa,EAAE,MAAM,mDAAmD,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,MAAM,gDAAgD,CAAC;AAE5E,qBAAa,sBAAuB,SAAQ,qBAAsB,YAAW,aAAa;IAK5E,SAAS,CAAC,QAAQ,CAAC,MAAM;IAJrC,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAa;IAChE,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAC7C,SAAS,CAAC,MAAM,EAAE;QAAE,OAAO,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,GAAG,CAAA;KAAE,EAAE,CAAM;gBAEzB,MAAM,KAAA;IAiB9B,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU;IAoBjD,SAAS,CAAC,WAAW,CAAC,OAAO,KAAA;CAQ9B;AAED,qBAAa,sBAAuB,SAAQ,qBAAsB,YAAW,aAAa;IAC5E,SAAS,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,KAAA;IAIrC,KAAK,CAAC,GAAG,KAAA,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlB,GAAG,IAAI,IAAI;CAEnB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,GAAG,8EAKpD"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWebSocketConnection = exports.WebSocketMessageWriter = exports.WebSocketMessageReader = void 0;
4
+ const api_1 = require("@opensumi/vscode-jsonrpc/lib/common/api");
5
+ const disposable_1 = require("@opensumi/vscode-jsonrpc/lib/common/disposable");
6
+ class WebSocketMessageReader extends api_1.AbstractMessageReader {
7
+ constructor(socket) {
8
+ super();
9
+ this.socket = socket;
10
+ this.state = 'initial';
11
+ this.events = [];
12
+ if (this.socket.onMessage) {
13
+ this.socket.onMessage((message) => {
14
+ this.readMessage(message);
15
+ });
16
+ }
17
+ else if (this.socket.onmessage) {
18
+ this.socket.onmessage = (message) => {
19
+ this.readMessage(message);
20
+ };
21
+ }
22
+ else if (this.socket.on) {
23
+ this.socket.on('message', (message) => {
24
+ this.readMessage(message);
25
+ });
26
+ }
27
+ }
28
+ listen(callback) {
29
+ if (this.state === 'initial') {
30
+ this.state = 'listening';
31
+ this.callback = callback;
32
+ }
33
+ while (this.events.length !== 0) {
34
+ const event = this.events.pop();
35
+ if (event.message) {
36
+ this.readMessage(event.message);
37
+ }
38
+ }
39
+ return disposable_1.Disposable.create(() => {
40
+ this.state = 'closed';
41
+ this.callback = undefined;
42
+ this.events = [];
43
+ });
44
+ }
45
+ readMessage(message) {
46
+ if (this.state === 'initial') {
47
+ this.events.splice(0, 0, { message });
48
+ }
49
+ else if (this.state === 'listening') {
50
+ const data = JSON.parse(message);
51
+ this.callback(data);
52
+ }
53
+ }
54
+ }
55
+ exports.WebSocketMessageReader = WebSocketMessageReader;
56
+ class WebSocketMessageWriter extends api_1.AbstractMessageWriter {
57
+ constructor(socket) {
58
+ super();
59
+ this.socket = socket;
60
+ }
61
+ write(msg) {
62
+ try {
63
+ const content = JSON.stringify(msg);
64
+ this.socket.send(content);
65
+ return Promise.resolve();
66
+ }
67
+ catch (e) {
68
+ return Promise.reject(e);
69
+ }
70
+ }
71
+ end() {
72
+ }
73
+ }
74
+ exports.WebSocketMessageWriter = WebSocketMessageWriter;
75
+ /**
76
+ * 给服务端的 WebSocket 及 Browser 端的 WebSocket 实例共用的方法
77
+ * @param socket
78
+ * @returns
79
+ */
80
+ function createWebSocketConnection(socket) {
81
+ return (0, api_1.createMessageConnection)(new WebSocketMessageReader(socket), new WebSocketMessageWriter(socket));
82
+ }
83
+ exports.createWebSocketConnection = createWebSocketConnection;
84
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/common/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from '../node/center/proxy';
2
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/common/proxy.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ (0, tslib_1.__exportStar)(require("../node/center/proxy"), exports);
5
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/common/proxy.ts"],"names":[],"mappings":";;;AAAA,oEAAqC"}
@@ -0,0 +1,68 @@
1
+ import { Event } from '@opensumi/ide-core-common';
2
+ export declare enum RPCProtocolEnv {
3
+ MAIN = 0,
4
+ EXT = 1
5
+ }
6
+ export interface SerializedError {
7
+ readonly $isError: true;
8
+ readonly name: string;
9
+ readonly message: string;
10
+ readonly stack: string;
11
+ }
12
+ export declare function transformErrorForSerialization(error: Error): SerializedError;
13
+ export declare function transformErrorForSerialization(error: any): any;
14
+ export interface IProxyIdentifier {
15
+ serviceId: string;
16
+ countId: number;
17
+ }
18
+ export declare class ProxyIdentifier<T = any> {
19
+ static count: number;
20
+ readonly serviceId: string;
21
+ readonly countId: number;
22
+ constructor(serviceId: string);
23
+ }
24
+ export declare function createExtHostContextProxyIdentifier<T>(serviceId: string): ProxyIdentifier<T>;
25
+ export declare function createMainContextProxyIdentifier<T>(identifier: string): ProxyIdentifier<T>;
26
+ export interface IMessagePassingProtocol {
27
+ send(msg: any): void;
28
+ onMessage: Event<string>;
29
+ }
30
+ export declare namespace ObjectTransfer {
31
+ function replacer(key: string | undefined, value: any): any;
32
+ function reviver(key: string | undefined, value: any): any;
33
+ }
34
+ export declare class MessageIO {
35
+ static cancel(req: string, messageToSendHostId?: string): string;
36
+ static serializeRequest(callId: string, rpcId: string, method: string, args: any[]): string;
37
+ static serializeReplyOK(callId: string, res: any, logger?: any): string;
38
+ static serializeReplyError(callId: string, error: Error, logger?: any): string;
39
+ }
40
+ export declare const IRPCProtocol: unique symbol;
41
+ export interface IRPCProtocol {
42
+ getProxy<T>(proxyId: ProxyIdentifier<T>): T;
43
+ set<T>(identifier: ProxyIdentifier<T>, instance: T): T;
44
+ get<T>(identifier: ProxyIdentifier<T>): T;
45
+ }
46
+ export declare class RPCProtocol implements IRPCProtocol {
47
+ private readonly _protocol;
48
+ private readonly _locals;
49
+ private readonly _proxies;
50
+ private readonly _cancellationTokenSources;
51
+ private _lastMessageId;
52
+ private _pendingRPCReplies;
53
+ private logger;
54
+ constructor(connection: IMessagePassingProtocol, logger?: any);
55
+ set<T>(identifier: ProxyIdentifier<T>, instance: any): any;
56
+ get<T>(identifier: ProxyIdentifier<T>): any;
57
+ getProxy<T>(proxyId: ProxyIdentifier<T>): any;
58
+ private _createProxy;
59
+ private _remoteCall;
60
+ private _receiveOneMessage;
61
+ private _receiveCancel;
62
+ private _receiveError;
63
+ private _receiveRequest;
64
+ private _invokeHandler;
65
+ private _doInvokeHandler;
66
+ private _receiveReply;
67
+ }
68
+ //# sourceMappingURL=rpcProtocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpcProtocol.d.ts","sourceRoot":"","sources":["../../src/common/rpcProtocol.ts"],"names":[],"mappings":"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"}