@opensumi/ide-remote-opener 2.21.13 → 2.22.0
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.
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/remote.opener.contribution.js.map +1 -1
- package/lib/browser/remote.opener.service.js.map +1 -1
- package/lib/node/index.js.map +1 -1
- package/lib/node/opener.client.js.map +1 -1
- package/lib/node/opener.service.js.map +1 -1
- package/package.json +10 -9
- package/src/browser/index.ts +27 -0
- package/src/browser/remote.opener.contribution.ts +60 -0
- package/src/browser/remote.opener.service.ts +93 -0
- package/src/common/index.ts +65 -0
- package/src/node/index.ts +29 -0
- package/src/node/opener.client.ts +44 -0
- package/src/node/opener.service.ts +41 -0
package/lib/browser/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":";;;;AAAA,qCAA0C;AAC1C,iEAA2D;AAE3D,sCAAwH;AAExH,6EAA8E;AAC9E,mEAAyE;AAEzE,kEAAwC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":";;;;AAAA,qCAA0C;AAC1C,iEAA2D;AAE3D,sCAAwH;AAExH,6EAA8E;AAC9E,mEAAyE;AAEzE,kEAAwC;AAGjC,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,gCAAa;IAA9C;;QACL,yBAAoB,GAAG,CAAC,0CAAiC,CAAC,CAAC;QAC3D,cAAS,GAAG;YACV;gBACE,KAAK,EAAE,wCAA+B;gBACtC,QAAQ,EAAE,sDAA8B;aACzC;YACD,2DAA8B;SAC/B,CAAC;QACF,iBAAY,GAAG;YACb;gBACE,WAAW,EAAE,gCAAuB;gBACpC,WAAW,EAAE,wCAA+B;aAC7C;SACF,CAAC;IACJ,CAAC;CAAA,CAAA;AAfY,kBAAkB;IAD9B,IAAA,eAAU,GAAE;GACA,kBAAkB,CAe9B;AAfY,gDAAkB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.opener.contribution.js","sourceRoot":"","sources":["../../src/browser/remote.opener.contribution.ts"],"names":[],"mappings":";;;;AAAA,qCAAmE;AACnE,kEAAwE;AACxE,iEAA2F;AAC3F,+DAAyF;AAEzF,sCAA0E;AAC1E,sCAImB;AAEnB,2DAA2D;AAC3D,MAAM,WAAW,GAAG,CAAC,QAAkB,EAAE,EAAE;IACzC,IAAI,QAAgB,CAAC;IACrB,MAAM,SAAS,GAAc,QAAQ,CAAC,GAAG,CAAC,4BAAS,CAAC,CAAC;IAErD,sCAAsC;IACtC,oBAAoB;IACpB,IAAI,SAAS,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;QACvD,QAAQ,GAAG,8BAAW,CAAC,QAAQ,CAAC,cAAc,CAAC;KAChD;SAAM;QACL,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,0BAAgB,CAAC,CAAC;QACtD,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;KACpC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"remote.opener.contribution.js","sourceRoot":"","sources":["../../src/browser/remote.opener.contribution.ts"],"names":[],"mappings":";;;;AAAA,qCAAmE;AACnE,kEAAwE;AACxE,iEAA2F;AAC3F,+DAAyF;AAEzF,sCAA0E;AAC1E,sCAImB;AAEnB,2DAA2D;AAC3D,MAAM,WAAW,GAAG,CAAC,QAAkB,EAAE,EAAE;IACzC,IAAI,QAAgB,CAAC;IACrB,MAAM,SAAS,GAAc,QAAQ,CAAC,GAAG,CAAC,4BAAS,CAAC,CAAC;IAErD,sCAAsC;IACtC,oBAAoB;IACpB,IAAI,SAAS,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;QACvD,QAAQ,GAAG,8BAAW,CAAC,QAAQ,CAAC,cAAc,CAAC;KAChD;SAAM;QACL,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,0BAAgB,CAAC,CAAC;QACtD,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;KACpC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAGK,IAAM,8BAA8B,GAApC,MAAM,8BAA8B;IAApC;QAaY,UAAK,GAAG,IAAA,gCAAc,GAAE,CAAC;IAiB5C,CAAC;IAfC,OAAO;QACL,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,CAAC;QACnE,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE;YACxC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;SAC1D;IACH,CAAC;IAED,MAAM;QACJ,IAAI;YACF,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;SACjE;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACrB;IACH,CAAC;CACF,CAAA;AA7BC;IAAC,IAAA,cAAS,EAAC,mBAAc,CAAC;sCACC,aAAQ;gEAAC;AAEpC;IAAC,IAAA,cAAS,EAAC,gCAAuB,CAAC;;+EAC4B;AAE/D;IAAC,IAAA,cAAS,EAAC,0CAAiC,CAAC;;4EACkD;AAE/F;IAAC,IAAA,cAAS,EAAC,wCAA+B,CAAC;;2EACuB;AAXvD,8BAA8B;IAD1C,IAAA,wBAAM,EAAC,wCAAqB,CAAC;GACjB,8BAA8B,CA8B1C;AA9BY,wEAA8B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.opener.service.js","sourceRoot":"","sources":["../../src/browser/remote.opener.service.ts"],"names":[],"mappings":";;;;AAAA,qCAAqD;AACrD,qEAAuE;AACvE,kEAAuE;AACvE,4EAA+E;AAC/E,+DAA8F;AAC9F,qDAA8D;AAI9D,mDAAmD;AACnD,+DAA+D;
|
|
1
|
+
{"version":3,"file":"remote.opener.service.js","sourceRoot":"","sources":["../../src/browser/remote.opener.service.ts"],"names":[],"mappings":"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"}
|
package/lib/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":";;;;AAAA,qCAA0C;AAC1C,2DAAkE;AAElE,sCAAuG;AAEvG,mDAAyD;AACzD,qDAA2D;AAE3D,2DAAiC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":";;;;AAAA,qCAA0C;AAC1C,2DAAkE;AAElE,sCAAuG;AAEvG,mDAAyD;AACzD,qDAA2D;AAE3D,2DAAiC;AAG1B,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,0BAAU;IAArC;;QACL,cAAS,GAAG;YACV;gBACE,KAAK,EAAE,iCAAwB;gBAC/B,QAAQ,EAAE,wCAAuB;aAClC;YACD;gBACE,KAAK,EAAE,gCAAuB;gBAC9B,QAAQ,EAAE,sCAAsB;aACjC;SACF,CAAC;QACF,iBAAY,GAAkB;YAC5B;gBACE,WAAW,EAAE,gCAAuB;gBACpC,KAAK,EAAE,iCAAwB;aAChC;SACF,CAAC;IACJ,CAAC;CAAA,CAAA;AAjBY,YAAY;IADxB,IAAA,eAAU,GAAE;GACA,YAAY,CAiBxB;AAjBY,oCAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opener.client.js","sourceRoot":"","sources":["../../src/node/opener.client.ts"],"names":[],"mappings":";;;;AAAA,qCAAqD;AACrD,2DAAsD;AAItD,kEAAkE;AAClE,0EAA0E;AAC1E,MAAM,gBAAgB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"opener.client.js","sourceRoot":"","sources":["../../src/node/opener.client.ts"],"names":[],"mappings":";;;;AAAA,qCAAqD;AACrD,2DAAsD;AAItD,kEAAkE;AAClE,0EAA0E;AAC1E,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAEpB,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAA5B;QACG,yBAAoB,GAAsC,IAAI,GAAG,EAAE,CAAC;IAiC9E,CAAC;IA5BC,8BAA8B,CAAC,QAAgB,EAAE,OAA6B;QAC5E,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,QAAQ,eAAe,CAAC,CAAC;SACzF;QACD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,iCAAiC,CAAC,QAAgB;QAChD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAA0C,EAAE,QAAgB;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExD,IAAI,CAAC,OAAO,EAAE;YACZ,sBAAsB;YACtB,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,IAAI,gBAAgB,EAAE;gBAC/D,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;oBACtD,OAAO,CAAC,YAAY,iCAAM,IAAI,KAAE,QAAQ,IAAG,CAAC;gBAC9C,CAAC,CAAC,CAAC;aACJ;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,QAAQ,aAAa,CAAC,CAAC;YACrF,OAAO;SACR;QAED,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF,CAAA;AA/BC;IAAC,IAAA,cAAS,EAAC,2BAAW,CAAC;;sDACc;AAJ1B,sBAAsB;IADlC,IAAA,eAAU,GAAE;GACA,sBAAsB,CAkClC;AAlCY,wDAAsB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opener.service.js","sourceRoot":"","sources":["../../src/node/opener.service.ts"],"names":[],"mappings":";;;;AAAA,qCAAqD;AACrD,6DAAsD;AACtD,+DAAgD;AAEhD,sCAMmB;
|
|
1
|
+
{"version":3,"file":"opener.service.js","sourceRoot":"","sources":["../../src/node/opener.service.ts"],"names":[],"mappings":";;;;AAAA,qCAAqD;AACrD,6DAAsD;AACtD,+DAAgD;AAEhD,sCAMmB;AAGZ,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,2BAAU;IAMrD,qBAAqB,CAAC,QAAgB;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,wBAAwB,CAAC,QAAgB;QACvC,IAAI,CAAC,kBAAkB,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAA0C;QAC3D,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE;YACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;SACvD;QAED,IAAI;YACF,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;SAC9G;QAAC,OAAO,GAAG,EAAE;YACZ,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,iCAAiC,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;SACpE;IACH,CAAC;CACF,CAAA;AAxBC;IAAC,IAAA,cAAS,EAAC,gCAAuB,CAAC;;mEACsB;AAJ9C,uBAAuB;IADnC,IAAA,eAAU,GAAE;GACA,uBAAuB,CA2BnC;AA3BY,0DAAuB"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensumi/ide-remote-opener",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.22.0",
|
|
4
4
|
"files": [
|
|
5
|
-
"lib"
|
|
5
|
+
"lib",
|
|
6
|
+
"src"
|
|
6
7
|
],
|
|
7
8
|
"license": "MIT",
|
|
8
9
|
"main": "lib/index.js",
|
|
9
10
|
"typings": "lib/index.d.ts",
|
|
10
11
|
"scripts": {
|
|
11
|
-
"prepublishOnly": "
|
|
12
|
+
"prepublishOnly": "yarn run build",
|
|
12
13
|
"build": "tsc --build ../../configs/ts/references/tsconfig.remote-opener.json"
|
|
13
14
|
},
|
|
14
15
|
"repository": {
|
|
@@ -16,13 +17,13 @@
|
|
|
16
17
|
"url": "git@github.com:opensumi/core.git"
|
|
17
18
|
},
|
|
18
19
|
"dependencies": {
|
|
19
|
-
"@opensumi/ide-connection": "2.
|
|
20
|
-
"@opensumi/ide-core-common": "2.
|
|
21
|
-
"@opensumi/ide-core-node": "2.
|
|
20
|
+
"@opensumi/ide-connection": "2.22.0",
|
|
21
|
+
"@opensumi/ide-core-common": "2.22.0",
|
|
22
|
+
"@opensumi/ide-core-node": "2.22.0"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
|
-
"@opensumi/ide-core-browser": "2.
|
|
25
|
-
"@opensumi/ide-editor": "2.
|
|
25
|
+
"@opensumi/ide-core-browser": "2.22.0",
|
|
26
|
+
"@opensumi/ide-editor": "2.22.0"
|
|
26
27
|
},
|
|
27
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "927717e1c60f9cf5f01622fd51085b318a175eeb"
|
|
28
29
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Injectable } from '@opensumi/di';
|
|
2
|
+
import { BrowserModule } from '@opensumi/ide-core-browser';
|
|
3
|
+
|
|
4
|
+
import { RemoteOpenerConverterContribution, RemoteOpenerServicePath, RemoteOpenerBrowserServiceToken } from '../common';
|
|
5
|
+
|
|
6
|
+
import { RemoteOpenerContributionClient } from './remote.opener.contribution';
|
|
7
|
+
import { RemoteOpenerBrowserServiceImpl } from './remote.opener.service';
|
|
8
|
+
|
|
9
|
+
export * from './remote.opener.service';
|
|
10
|
+
|
|
11
|
+
@Injectable()
|
|
12
|
+
export class RemoteOpenerModule extends BrowserModule {
|
|
13
|
+
contributionProvider = [RemoteOpenerConverterContribution];
|
|
14
|
+
providers = [
|
|
15
|
+
{
|
|
16
|
+
token: RemoteOpenerBrowserServiceToken,
|
|
17
|
+
useClass: RemoteOpenerBrowserServiceImpl,
|
|
18
|
+
},
|
|
19
|
+
RemoteOpenerContributionClient,
|
|
20
|
+
];
|
|
21
|
+
backServices = [
|
|
22
|
+
{
|
|
23
|
+
servicePath: RemoteOpenerServicePath,
|
|
24
|
+
clientToken: RemoteOpenerBrowserServiceToken,
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Autowired, Injector, INJECTOR_TOKEN } from '@opensumi/di';
|
|
2
|
+
import { WSChannelHandler } from '@opensumi/ide-connection/lib/browser';
|
|
3
|
+
import { AppConfig, ClientAppContribution, electronEnv } from '@opensumi/ide-core-browser';
|
|
4
|
+
import { ContributionProvider, Domain, getDebugLogger } from '@opensumi/ide-core-common';
|
|
5
|
+
|
|
6
|
+
import { IRemoteOpenerService, RemoteOpenerServicePath } from '../common';
|
|
7
|
+
import {
|
|
8
|
+
IRemoteOpenerBrowserService,
|
|
9
|
+
RemoteOpenerBrowserServiceToken,
|
|
10
|
+
RemoteOpenerConverterContribution,
|
|
11
|
+
} from '../common';
|
|
12
|
+
|
|
13
|
+
// 从extension.contribution.ts中Copy过来,因为直接引入会有一定概率触发IDE初始化问题
|
|
14
|
+
const getClientId = (injector: Injector) => {
|
|
15
|
+
let clientId: string;
|
|
16
|
+
const appConfig: AppConfig = injector.get(AppConfig);
|
|
17
|
+
|
|
18
|
+
// Electron 环境下,未指定 isRemote 时默认使用本地连接
|
|
19
|
+
// 否则使用 WebSocket 连接
|
|
20
|
+
if (appConfig.isElectronRenderer && !appConfig.isRemote) {
|
|
21
|
+
clientId = electronEnv.metadata.windowClientId;
|
|
22
|
+
} else {
|
|
23
|
+
const channelHandler = injector.get(WSChannelHandler);
|
|
24
|
+
clientId = channelHandler.clientId;
|
|
25
|
+
}
|
|
26
|
+
return clientId;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
@Domain(ClientAppContribution)
|
|
30
|
+
export class RemoteOpenerContributionClient implements ClientAppContribution {
|
|
31
|
+
@Autowired(INJECTOR_TOKEN)
|
|
32
|
+
private readonly injector: Injector;
|
|
33
|
+
|
|
34
|
+
@Autowired(RemoteOpenerServicePath)
|
|
35
|
+
private readonly remoteOpenerNodeService: IRemoteOpenerService;
|
|
36
|
+
|
|
37
|
+
@Autowired(RemoteOpenerConverterContribution)
|
|
38
|
+
private readonly contributionProvider: ContributionProvider<RemoteOpenerConverterContribution>;
|
|
39
|
+
|
|
40
|
+
@Autowired(RemoteOpenerBrowserServiceToken)
|
|
41
|
+
private readonly remoteOpenerService: IRemoteOpenerBrowserService;
|
|
42
|
+
|
|
43
|
+
private readonly debug = getDebugLogger();
|
|
44
|
+
|
|
45
|
+
onStart() {
|
|
46
|
+
const contributions = this.contributionProvider.getContributions();
|
|
47
|
+
for (const contribution of contributions) {
|
|
48
|
+
contribution.registerConverter(this.remoteOpenerService);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
onStop() {
|
|
53
|
+
try {
|
|
54
|
+
const clientId = getClientId(this.injector);
|
|
55
|
+
this.remoteOpenerNodeService.removeConnectionClientId(clientId);
|
|
56
|
+
} catch (e) {
|
|
57
|
+
this.debug.error(e);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Injectable, Autowired } from '@opensumi/di';
|
|
2
|
+
import { RPCService } from '@opensumi/ide-connection/lib/common/proxy';
|
|
3
|
+
import { IOpenerService } from '@opensumi/ide-core-browser/lib/opener';
|
|
4
|
+
import { PreferenceService } from '@opensumi/ide-core-browser/lib/preferences';
|
|
5
|
+
import { CommandService, Disposable, IDisposable, Uri, URI } from '@opensumi/ide-core-common';
|
|
6
|
+
import { WorkbenchEditorService } from '@opensumi/ide-editor';
|
|
7
|
+
|
|
8
|
+
import { IRemoteHostConverter, IRemoteOpenerBrowserService } from '../common';
|
|
9
|
+
|
|
10
|
+
// 不预置SUPPORT_HOSTS,改为用户注册,默认走openerService来处理这部分逻辑
|
|
11
|
+
// const SUPPORT_HOSTS = ['localhost', '0.0.0.0', '127.0.0.1'];
|
|
12
|
+
|
|
13
|
+
@Injectable()
|
|
14
|
+
export class RemoteOpenerBrowserServiceImpl extends RPCService implements IRemoteOpenerBrowserService {
|
|
15
|
+
@Autowired(WorkbenchEditorService)
|
|
16
|
+
private readonly workbenchEditorService: WorkbenchEditorService;
|
|
17
|
+
|
|
18
|
+
@Autowired(CommandService)
|
|
19
|
+
protected commandService: CommandService;
|
|
20
|
+
|
|
21
|
+
@Autowired(PreferenceService)
|
|
22
|
+
private readonly preferenceService: PreferenceService;
|
|
23
|
+
|
|
24
|
+
@Autowired(IOpenerService)
|
|
25
|
+
private readonly openerService: IOpenerService;
|
|
26
|
+
|
|
27
|
+
private supportHosts: Set<string> = new Set();
|
|
28
|
+
|
|
29
|
+
private converter: IRemoteHostConverter | null = null;
|
|
30
|
+
|
|
31
|
+
registerSupportHosts(hosts: string[]) {
|
|
32
|
+
for (const host of hosts) {
|
|
33
|
+
this.supportHosts.add(host);
|
|
34
|
+
}
|
|
35
|
+
return Disposable.create(() => {
|
|
36
|
+
for (const host of hosts) {
|
|
37
|
+
this.supportHosts.delete(host);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
registerConverter(converter: IRemoteHostConverter): IDisposable {
|
|
43
|
+
if (this.converter) {
|
|
44
|
+
throw new Error('Only one converter is allowed.');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
this.converter = converter;
|
|
48
|
+
return Disposable.create(() => {
|
|
49
|
+
this.converter = null;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get isRemoteOpenerEnabled(): boolean {
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
55
|
+
return this.preferenceService.get('remote.opener.enable', true)!;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async $openExternal(type: 'file' | 'url', uri: Uri): Promise<void> {
|
|
59
|
+
if (!this.isRemoteOpenerEnabled) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const revivedUri = Uri.revive(uri);
|
|
64
|
+
switch (type) {
|
|
65
|
+
case 'url': {
|
|
66
|
+
const url = new URL(decodeURIComponent(revivedUri.toString()));
|
|
67
|
+
if (this.supportHosts.has(url.hostname)) {
|
|
68
|
+
if (!this.converter) {
|
|
69
|
+
throw new Error('Converter is not registered.');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const { port } = url;
|
|
73
|
+
const hostname = this.converter.convert(port);
|
|
74
|
+
// Default use https protocol
|
|
75
|
+
url.protocol = 'https';
|
|
76
|
+
// remove port
|
|
77
|
+
url.port = '';
|
|
78
|
+
url.hostname = hostname;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
this.openerService.open(url.toString());
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case 'file':
|
|
85
|
+
this.workbenchEditorService.open(URI.parse(revivedUri.toString()), { preview: false, focus: true });
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
// eslint-disable-next-line no-console
|
|
89
|
+
console.warn(`Unsupported ${type}.`);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { IDisposable, Uri } from '@opensumi/ide-core-browser';
|
|
2
|
+
|
|
3
|
+
export const RemoteOpenerServicePath = 'RemoteOpenerService';
|
|
4
|
+
|
|
5
|
+
export interface IExternalFileArgs {
|
|
6
|
+
type: 'file';
|
|
7
|
+
clientId: string;
|
|
8
|
+
file: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface IExternalUrlArgs {
|
|
12
|
+
type: 'url';
|
|
13
|
+
clientId: string;
|
|
14
|
+
url: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const RemoteOpenerServiceToken = Symbol('RemoteOpenerServiceToken');
|
|
18
|
+
|
|
19
|
+
export interface IRemoteOpenerService {
|
|
20
|
+
openExternal(args: IExternalFileArgs | IExternalUrlArgs): Promise<void>;
|
|
21
|
+
removeConnectionClientId(clientId: string): void;
|
|
22
|
+
setConnectionClientId(clientId: string): void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const RemoteOpenerClientToken = Symbol('RemoteOpenerClientToken');
|
|
26
|
+
|
|
27
|
+
export interface IRemoteOpenerClient {
|
|
28
|
+
removeRemoteOpenerServiceInstance(clientId: string): void;
|
|
29
|
+
setRemoteOpenerServiceInstance(clientId: string, service: IRemoteOpenerService): void;
|
|
30
|
+
openExternal(args: IExternalFileArgs | IExternalUrlArgs, clientId: string): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const RemoteOpenerConverterContribution = Symbol('RemoteOpenerConverterContribution');
|
|
34
|
+
|
|
35
|
+
export interface RemoteOpenerConverterContribution {
|
|
36
|
+
registerConverter(registry: IRemoteOpenerBrowserService): void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface IRemoteHostConverter {
|
|
40
|
+
/**
|
|
41
|
+
* Convert a port to a host name for cloud IDE.
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* // port: 3030
|
|
45
|
+
* const host = converter.convert('3030');
|
|
46
|
+
* // host: 'cloud-ide.opensumi-3030.com'
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
convert(port: string): string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const RemoteOpenerBrowserServiceToken = Symbol('RemoteOpenerBrowserServiceToken');
|
|
53
|
+
|
|
54
|
+
export interface IRemoteOpenerBrowserService {
|
|
55
|
+
$openExternal(type: 'file' | 'url', uri: Uri): Promise<void>;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Register a converter.
|
|
59
|
+
* @see IRemoteHostConverter
|
|
60
|
+
* @param converter is a converter to convert port to host name.
|
|
61
|
+
*/
|
|
62
|
+
registerConverter(converter: IRemoteHostConverter): IDisposable;
|
|
63
|
+
|
|
64
|
+
registerSupportHosts(hosts: string[]): IDisposable;
|
|
65
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Injectable } from '@opensumi/di';
|
|
2
|
+
import { BackService, NodeModule } from '@opensumi/ide-core-node';
|
|
3
|
+
|
|
4
|
+
import { RemoteOpenerClientToken, RemoteOpenerServicePath, RemoteOpenerServiceToken } from '../common';
|
|
5
|
+
|
|
6
|
+
import { RemoteOpenerClientImpl } from './opener.client';
|
|
7
|
+
import { RemoteOpenerServiceImpl } from './opener.service';
|
|
8
|
+
|
|
9
|
+
export * from './opener.service';
|
|
10
|
+
|
|
11
|
+
@Injectable()
|
|
12
|
+
export class OpenerModule extends NodeModule {
|
|
13
|
+
providers = [
|
|
14
|
+
{
|
|
15
|
+
token: RemoteOpenerServiceToken,
|
|
16
|
+
useClass: RemoteOpenerServiceImpl,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
token: RemoteOpenerClientToken,
|
|
20
|
+
useClass: RemoteOpenerClientImpl,
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
backServices: BackService[] = [
|
|
24
|
+
{
|
|
25
|
+
servicePath: RemoteOpenerServicePath,
|
|
26
|
+
token: RemoteOpenerServiceToken,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Injectable, Autowired } from '@opensumi/di';
|
|
2
|
+
import { INodeLogger } from '@opensumi/ide-core-node';
|
|
3
|
+
|
|
4
|
+
import { IExternalFileArgs, IExternalUrlArgs, IRemoteOpenerClient, IRemoteOpenerService } from '../common';
|
|
5
|
+
|
|
6
|
+
// remote opener 强制打开的ClientId的数量限制,在限制之内的话会遍历Map,无视ClientId对应强制打开
|
|
7
|
+
// 原因是:避免Terminal Restore这种场景下,环境变量的ClientID和窗口的不一致,导致无法使用RemoteOpen,做一个兜底
|
|
8
|
+
const FORCE_OPEN_LIMIT = 4;
|
|
9
|
+
@Injectable()
|
|
10
|
+
export class RemoteOpenerClientImpl implements IRemoteOpenerClient {
|
|
11
|
+
private remoteOpenerServices: Map<string, IRemoteOpenerService> = new Map();
|
|
12
|
+
|
|
13
|
+
@Autowired(INodeLogger)
|
|
14
|
+
private readonly logger: INodeLogger;
|
|
15
|
+
|
|
16
|
+
setRemoteOpenerServiceInstance(clientId: string, service: IRemoteOpenerService): void {
|
|
17
|
+
if (this.remoteOpenerServices.has(clientId)) {
|
|
18
|
+
this.logger.error(`Remote opener service instance for client ${clientId} already set.`);
|
|
19
|
+
}
|
|
20
|
+
this.remoteOpenerServices.set(clientId, service);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
removeRemoteOpenerServiceInstance(clientId: string): void {
|
|
24
|
+
this.remoteOpenerServices.delete(clientId);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async openExternal(args: IExternalFileArgs | IExternalUrlArgs, clientId: string): Promise<void> {
|
|
28
|
+
const service = this.remoteOpenerServices.get(clientId);
|
|
29
|
+
|
|
30
|
+
if (!service) {
|
|
31
|
+
// 没有命中ClientID时兜底强制打开
|
|
32
|
+
if (this.remoteOpenerServices.values.length <= FORCE_OPEN_LIMIT) {
|
|
33
|
+
this.remoteOpenerServices.forEach((service, clientId) => {
|
|
34
|
+
service.openExternal({ ...args, clientId });
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
this.logger.warn(`Remote opener service instance for client ${clientId} not found.`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
service.openExternal(args);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Injectable, Autowired } from '@opensumi/di';
|
|
2
|
+
import { RPCService } from '@opensumi/ide-connection';
|
|
3
|
+
import { Uri } from '@opensumi/ide-core-common';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
IExternalFileArgs,
|
|
7
|
+
IExternalUrlArgs,
|
|
8
|
+
IRemoteOpenerClient,
|
|
9
|
+
IRemoteOpenerService,
|
|
10
|
+
RemoteOpenerClientToken,
|
|
11
|
+
} from '../common';
|
|
12
|
+
|
|
13
|
+
@Injectable()
|
|
14
|
+
export class RemoteOpenerServiceImpl extends RPCService implements IRemoteOpenerService {
|
|
15
|
+
private clientId: string | undefined;
|
|
16
|
+
|
|
17
|
+
@Autowired(RemoteOpenerClientToken)
|
|
18
|
+
private readonly remoteOpenerClient: IRemoteOpenerClient;
|
|
19
|
+
|
|
20
|
+
setConnectionClientId(clientId: string): void {
|
|
21
|
+
this.clientId = clientId;
|
|
22
|
+
this.remoteOpenerClient.setRemoteOpenerServiceInstance(clientId, this);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
removeConnectionClientId(clientId: string): void {
|
|
26
|
+
this.remoteOpenerClient.removeRemoteOpenerServiceInstance(clientId);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async openExternal(args: IExternalFileArgs | IExternalUrlArgs): Promise<void> {
|
|
30
|
+
if (args.clientId !== this.clientId) {
|
|
31
|
+
throw new Error(`Unknown client id ${args.clientId}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
await this.client.$openExternal(args.type, args.type === 'file' ? Uri.file(args.file) : Uri.parse(args.url));
|
|
36
|
+
} catch (err) {
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
console.log(`Error opening external error: ${err.message || err}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|