@codingame/monaco-vscode-extensions-service-override 4.1.0 → 4.1.1
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/_virtual/semver.js +3 -0
- package/extensions.js +6 -6
- package/external/vscode-semver/semver.js +985 -0
- package/override/vs/workbench/browser/parts/editor/textEditor.weak.js +8 -0
- package/package.json +9 -9
- package/vscode/src/vs/base/common/console.js +62 -0
- package/vscode/src/vs/platform/extensionManagement/common/extensionManagementCLI.js +497 -0
- package/vscode/src/vs/platform/extensionResourceLoader/browser/extensionResourceLoaderService.js +44 -0
- package/vscode/src/vs/platform/lifecycle/common/lifecycle.js +27 -0
- package/vscode/src/vs/platform/remote/common/managedSocket.js +98 -0
- package/vscode/src/vs/workbench/api/browser/extensionHost.contribution.js +104 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadAiEmbeddingVector.js +31 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadAiRelatedInformation.js +35 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadAuthentication.js +254 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadBulkEdits.js +68 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadCLICommands.js +103 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChat.js +70 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.js +207 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatVariables.js +41 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadClipboard.js +24 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadCodeInsets.js +108 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadCommands.js +98 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadComments.js +560 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadConfiguration.js +80 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadConsole.js +35 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadCustomEditors.js +579 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadDebugService.js +435 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadDecorations.js +102 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadDiagnostics.js +69 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadDialogs.js +68 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.js +79 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadDocuments.js +253 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.js +370 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadDownloadService.js +22 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.js +41 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadEditor.js +414 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadEditorTabs.js +501 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadEditors.js +227 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadErrors.js +24 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadExtensionService.js +317 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadFileSystem.js +208 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService.js +369 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadInlineChat.js +72 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadInteractive.js +28 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadIssueReporter.js +50 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLabelService.js +27 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures.js +1016 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModels.js +185 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguages.js +78 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLocalization.js +35 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLogService.js +78 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadManagedSockets.js +93 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadMessageService.js +137 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebook.js +194 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDocuments.js +123 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.js +188 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDto.js +129 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookEditors.js +131 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookKernels.js +374 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookRenderers.js +25 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookSaveParticipant.js +48 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadOutputService.js +76 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadProfileContentHandlers.js +38 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadProgress.js +68 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadQuickDiff.js +42 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadQuickOpen.js +185 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.js +30 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadSCM.js +493 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant.js +49 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadSearch.js +168 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadSecretState.js +70 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadShare.js +50 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadSpeech.js +99 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadStatusBar.js +53 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadStorage.js +72 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadTask.js +731 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadTelemetry.js +53 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadTerminalService.js +409 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.js +51 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadTesting.js +219 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadTheming.js +24 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadTimeline.js +55 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadTreeViews.js +312 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadTunnelService.js +223 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadUriOpeners.js +110 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadUrls.js +61 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviewManager.js +29 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviewPanels.js +283 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviewViews.js +100 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviews.js +135 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadWindow.js +57 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadWorkspace.js +268 -0
- package/vscode/src/vs/workbench/api/common/shared/dataTransferCache.js +35 -0
- package/vscode/src/vs/workbench/contrib/customEditor/common/customTextEditorModel.js +76 -0
- package/vscode/src/vs/workbench/contrib/externalUriOpener/common/contributedOpeners.js +83 -0
- package/vscode/src/vs/workbench/services/extensions/browser/extensionService.js +285 -0
- package/vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.js +276 -0
- package/vscode/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider.js +52 -0
- package/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService.js +1149 -0
- package/vscode/src/vs/workbench/services/extensions/common/extHostCustomers.js +41 -0
- package/vscode/src/vs/workbench/services/extensions/common/extensionDevOptions.js +25 -0
- package/vscode/src/vs/workbench/services/extensions/common/extensionHostManager.js +512 -0
- package/vscode/src/vs/workbench/services/extensions/common/extensionRunningLocationTracker.js +274 -0
- package/vscode/src/vs/workbench/services/extensions/common/extensionStorageMigration.js +58 -0
- package/vscode/src/vs/workbench/services/extensions/common/extensionsProposedApi.js +80 -0
- package/vscode/src/vs/workbench/services/extensions/common/extensionsUtil.js +64 -0
- package/vscode/src/vs/workbench/services/extensions/common/lazyCreateExtensionHostManager.js +161 -0
- package/vscode/src/vs/workbench/services/extensions/common/remoteConsoleUtil.js +49 -0
- package/vscode/src/vs/workbench/services/extensions/common/remoteExtensionHost.js +222 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function extHostNamedCustomer(id) {
|
|
2
|
+
return function (ctor) {
|
|
3
|
+
ExtHostCustomersRegistryImpl.INSTANCE.registerNamedCustomer(id, ctor);
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
function extHostCustomer(ctor) {
|
|
7
|
+
ExtHostCustomersRegistryImpl.INSTANCE.registerCustomer(ctor);
|
|
8
|
+
}
|
|
9
|
+
var ExtHostCustomersRegistry;
|
|
10
|
+
( (function(ExtHostCustomersRegistry) {
|
|
11
|
+
function getNamedCustomers() {
|
|
12
|
+
return ExtHostCustomersRegistryImpl.INSTANCE.getNamedCustomers();
|
|
13
|
+
}
|
|
14
|
+
ExtHostCustomersRegistry.getNamedCustomers = getNamedCustomers;
|
|
15
|
+
function getCustomers() {
|
|
16
|
+
return ExtHostCustomersRegistryImpl.INSTANCE.getCustomers();
|
|
17
|
+
}
|
|
18
|
+
ExtHostCustomersRegistry.getCustomers = getCustomers;
|
|
19
|
+
})(ExtHostCustomersRegistry || (ExtHostCustomersRegistry = {})));
|
|
20
|
+
class ExtHostCustomersRegistryImpl {
|
|
21
|
+
static { this.INSTANCE = ( new ExtHostCustomersRegistryImpl()); }
|
|
22
|
+
constructor() {
|
|
23
|
+
this._namedCustomers = [];
|
|
24
|
+
this._customers = [];
|
|
25
|
+
}
|
|
26
|
+
registerNamedCustomer(id, ctor) {
|
|
27
|
+
const entry = [id, ctor];
|
|
28
|
+
this._namedCustomers.push(entry);
|
|
29
|
+
}
|
|
30
|
+
getNamedCustomers() {
|
|
31
|
+
return this._namedCustomers;
|
|
32
|
+
}
|
|
33
|
+
registerCustomer(ctor) {
|
|
34
|
+
this._customers.push(ctor);
|
|
35
|
+
}
|
|
36
|
+
getCustomers() {
|
|
37
|
+
return this._customers;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { ExtHostCustomersRegistry, extHostCustomer, extHostNamedCustomer };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Schemas } from 'vscode/vscode/vs/base/common/network';
|
|
2
|
+
|
|
3
|
+
function parseExtensionDevOptions(environmentService) {
|
|
4
|
+
const isExtensionDevHost = environmentService.isExtensionDevelopment;
|
|
5
|
+
let debugOk = true;
|
|
6
|
+
const extDevLocs = environmentService.extensionDevelopmentLocationURI;
|
|
7
|
+
if (extDevLocs) {
|
|
8
|
+
for (const x of extDevLocs) {
|
|
9
|
+
if (x.scheme !== Schemas.file) {
|
|
10
|
+
debugOk = false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const isExtensionDevDebug = debugOk && typeof environmentService.debugExtensionHost.port === 'number';
|
|
15
|
+
const isExtensionDevDebugBrk = debugOk && !!environmentService.debugExtensionHost.break;
|
|
16
|
+
const isExtensionDevTestFromCli = isExtensionDevHost && !!environmentService.extensionTestsLocationURI && !environmentService.debugExtensionHost.debugId;
|
|
17
|
+
return {
|
|
18
|
+
isExtensionDevHost,
|
|
19
|
+
isExtensionDevDebug,
|
|
20
|
+
isExtensionDevDebugBrk,
|
|
21
|
+
isExtensionDevTestFromCli
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { parseExtensionDevOptions };
|
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { IntervalTimer } from 'vscode/vscode/vs/base/common/async';
|
|
3
|
+
import { VSBuffer } from 'vscode/vscode/vs/base/common/buffer';
|
|
4
|
+
import { onUnexpectedError } from 'vscode/vscode/vs/base/common/errors';
|
|
5
|
+
import { Emitter } from 'vscode/vscode/vs/base/common/event';
|
|
6
|
+
import { Disposable } from 'vscode/vscode/vs/base/common/lifecycle';
|
|
7
|
+
import { StopWatch } from 'vscode/vscode/vs/base/common/stopwatch';
|
|
8
|
+
import { localize2WithPath } from 'vscode/vscode/vs/nls';
|
|
9
|
+
import { Categories } from 'vscode/vscode/vs/platform/action/common/actionCommonCategories';
|
|
10
|
+
import { registerAction2, Action2 } from 'vscode/vscode/vs/platform/actions/common/actions';
|
|
11
|
+
import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
|
|
12
|
+
import { ILogService } from 'vscode/vscode/vs/platform/log/common/log';
|
|
13
|
+
import { RemoteAuthorityResolverErrorCode, getRemoteAuthorityPrefix } from 'vscode/vscode/vs/platform/remote/common/remoteAuthorityResolver';
|
|
14
|
+
import { ITelemetryService } from 'vscode/vscode/vs/platform/telemetry/common/telemetry';
|
|
15
|
+
import { IEditorService } from 'vscode/vscode/vs/workbench/services/editor/common/editorService';
|
|
16
|
+
import { IWorkbenchEnvironmentService } from 'vscode/vscode/vs/workbench/services/environment/common/environmentService';
|
|
17
|
+
import { ExtHostCustomersRegistry } from './extHostCustomers.js';
|
|
18
|
+
import { extensionHostKindToString } from 'vscode/vscode/vs/workbench/services/extensions/common/extensionHostKind';
|
|
19
|
+
import { RPCProtocol } from 'vscode/vscode/vs/workbench/services/extensions/common/rpcProtocol';
|
|
20
|
+
|
|
21
|
+
var ExtensionHostManager_1;
|
|
22
|
+
let ExtensionHostManager = ExtensionHostManager_1 = class ExtensionHostManager extends Disposable {
|
|
23
|
+
get pid() {
|
|
24
|
+
return this._extensionHost.pid;
|
|
25
|
+
}
|
|
26
|
+
get kind() {
|
|
27
|
+
return this._extensionHost.runningLocation.kind;
|
|
28
|
+
}
|
|
29
|
+
get startup() {
|
|
30
|
+
return this._extensionHost.startup;
|
|
31
|
+
}
|
|
32
|
+
get friendyName() {
|
|
33
|
+
return friendlyExtHostName(this.kind, this.pid);
|
|
34
|
+
}
|
|
35
|
+
constructor(extensionHost, initialActivationEvents, _internalExtensionService, _instantiationService, _environmentService, _telemetryService, _logService) {
|
|
36
|
+
super();
|
|
37
|
+
this._internalExtensionService = _internalExtensionService;
|
|
38
|
+
this._instantiationService = _instantiationService;
|
|
39
|
+
this._environmentService = _environmentService;
|
|
40
|
+
this._telemetryService = _telemetryService;
|
|
41
|
+
this._logService = _logService;
|
|
42
|
+
this._onDidChangeResponsiveState = this._register(( new Emitter()));
|
|
43
|
+
this.onDidChangeResponsiveState = this._onDidChangeResponsiveState.event;
|
|
44
|
+
this._hasStarted = false;
|
|
45
|
+
this._cachedActivationEvents = ( new Map());
|
|
46
|
+
this._resolvedActivationEvents = ( new Set());
|
|
47
|
+
this._rpcProtocol = null;
|
|
48
|
+
this._customers = [];
|
|
49
|
+
this._extensionHost = extensionHost;
|
|
50
|
+
this.onDidExit = this._extensionHost.onExit;
|
|
51
|
+
const startingTelemetryEvent = {
|
|
52
|
+
time: Date.now(),
|
|
53
|
+
action: 'starting',
|
|
54
|
+
kind: extensionHostKindToString(this.kind)
|
|
55
|
+
};
|
|
56
|
+
this._telemetryService.publicLog2('extensionHostStartup', startingTelemetryEvent);
|
|
57
|
+
this._proxy = this._extensionHost.start().then((protocol) => {
|
|
58
|
+
this._hasStarted = true;
|
|
59
|
+
const successTelemetryEvent = {
|
|
60
|
+
time: Date.now(),
|
|
61
|
+
action: 'success',
|
|
62
|
+
kind: extensionHostKindToString(this.kind)
|
|
63
|
+
};
|
|
64
|
+
this._telemetryService.publicLog2('extensionHostStartup', successTelemetryEvent);
|
|
65
|
+
return this._createExtensionHostCustomers(this.kind, protocol);
|
|
66
|
+
}, (err) => {
|
|
67
|
+
this._logService.error(`Error received from starting extension host (kind: ${extensionHostKindToString(this.kind)})`);
|
|
68
|
+
this._logService.error(err);
|
|
69
|
+
const failureTelemetryEvent = {
|
|
70
|
+
time: Date.now(),
|
|
71
|
+
action: 'error',
|
|
72
|
+
kind: extensionHostKindToString(this.kind)
|
|
73
|
+
};
|
|
74
|
+
if (err && err.name) {
|
|
75
|
+
failureTelemetryEvent.errorName = err.name;
|
|
76
|
+
}
|
|
77
|
+
if (err && err.message) {
|
|
78
|
+
failureTelemetryEvent.errorMessage = err.message;
|
|
79
|
+
}
|
|
80
|
+
if (err && err.stack) {
|
|
81
|
+
failureTelemetryEvent.errorStack = err.stack;
|
|
82
|
+
}
|
|
83
|
+
this._telemetryService.publicLog2('extensionHostStartup', failureTelemetryEvent);
|
|
84
|
+
return null;
|
|
85
|
+
});
|
|
86
|
+
this._proxy.then(() => {
|
|
87
|
+
initialActivationEvents.forEach((activationEvent) => this.activateByEvent(activationEvent, 0 ));
|
|
88
|
+
this._register(registerLatencyTestProvider({
|
|
89
|
+
measure: () => this.measure()
|
|
90
|
+
}));
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
dispose() {
|
|
94
|
+
if (this._extensionHost) {
|
|
95
|
+
this._extensionHost.dispose();
|
|
96
|
+
}
|
|
97
|
+
if (this._rpcProtocol) {
|
|
98
|
+
this._rpcProtocol.dispose();
|
|
99
|
+
}
|
|
100
|
+
for (let i = 0, len = this._customers.length; i < len; i++) {
|
|
101
|
+
const customer = this._customers[i];
|
|
102
|
+
try {
|
|
103
|
+
customer.dispose();
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
onUnexpectedError(err);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
this._proxy = null;
|
|
110
|
+
super.dispose();
|
|
111
|
+
}
|
|
112
|
+
async measure() {
|
|
113
|
+
const proxy = await this._proxy;
|
|
114
|
+
if (!proxy) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const latency = await this._measureLatency(proxy);
|
|
118
|
+
const down = await this._measureDown(proxy);
|
|
119
|
+
const up = await this._measureUp(proxy);
|
|
120
|
+
return {
|
|
121
|
+
remoteAuthority: this._extensionHost.remoteAuthority,
|
|
122
|
+
latency,
|
|
123
|
+
down,
|
|
124
|
+
up
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
async ready() {
|
|
128
|
+
await this._proxy;
|
|
129
|
+
}
|
|
130
|
+
async _measureLatency(proxy) {
|
|
131
|
+
const COUNT = 10;
|
|
132
|
+
let sum = 0;
|
|
133
|
+
for (let i = 0; i < COUNT; i++) {
|
|
134
|
+
const sw = StopWatch.create();
|
|
135
|
+
await proxy.test_latency(i);
|
|
136
|
+
sw.stop();
|
|
137
|
+
sum += sw.elapsed();
|
|
138
|
+
}
|
|
139
|
+
return (sum / COUNT);
|
|
140
|
+
}
|
|
141
|
+
static _convert(byteCount, elapsedMillis) {
|
|
142
|
+
return (byteCount * 1000 * 8) / elapsedMillis;
|
|
143
|
+
}
|
|
144
|
+
async _measureUp(proxy) {
|
|
145
|
+
const SIZE = 10 * 1024 * 1024;
|
|
146
|
+
const buff = VSBuffer.alloc(SIZE);
|
|
147
|
+
const value = Math.ceil(Math.random() * 256);
|
|
148
|
+
for (let i = 0; i < buff.byteLength; i++) {
|
|
149
|
+
buff.writeUInt8(i, value);
|
|
150
|
+
}
|
|
151
|
+
const sw = StopWatch.create();
|
|
152
|
+
await proxy.test_up(buff);
|
|
153
|
+
sw.stop();
|
|
154
|
+
return ExtensionHostManager_1._convert(SIZE, sw.elapsed());
|
|
155
|
+
}
|
|
156
|
+
async _measureDown(proxy) {
|
|
157
|
+
const SIZE = 10 * 1024 * 1024;
|
|
158
|
+
const sw = StopWatch.create();
|
|
159
|
+
await proxy.test_down(SIZE);
|
|
160
|
+
sw.stop();
|
|
161
|
+
return ExtensionHostManager_1._convert(SIZE, sw.elapsed());
|
|
162
|
+
}
|
|
163
|
+
_createExtensionHostCustomers(kind, protocol) {
|
|
164
|
+
let logger = null;
|
|
165
|
+
if (this._environmentService.logExtensionHostCommunication) {
|
|
166
|
+
logger = ( new RPCLogger(kind));
|
|
167
|
+
}
|
|
168
|
+
else if (TelemetryRPCLogger.isEnabled()) {
|
|
169
|
+
logger = ( new TelemetryRPCLogger(this._telemetryService));
|
|
170
|
+
}
|
|
171
|
+
this._rpcProtocol = ( new RPCProtocol(protocol, logger));
|
|
172
|
+
this._register(this._rpcProtocol.onDidChangeResponsiveState((responsiveState) => this._onDidChangeResponsiveState.fire(responsiveState)));
|
|
173
|
+
let extensionHostProxy = null;
|
|
174
|
+
let mainProxyIdentifiers = [];
|
|
175
|
+
const extHostContext = {
|
|
176
|
+
remoteAuthority: this._extensionHost.remoteAuthority,
|
|
177
|
+
extensionHostKind: this.kind,
|
|
178
|
+
getProxy: (identifier) => ( this._rpcProtocol.getProxy(identifier)),
|
|
179
|
+
set: (identifier, instance) => this._rpcProtocol.set(identifier, instance),
|
|
180
|
+
dispose: () => this._rpcProtocol.dispose(),
|
|
181
|
+
assertRegistered: (identifiers) => this._rpcProtocol.assertRegistered(identifiers),
|
|
182
|
+
drain: () => this._rpcProtocol.drain(),
|
|
183
|
+
internalExtensionService: this._internalExtensionService,
|
|
184
|
+
_setExtensionHostProxy: (value) => {
|
|
185
|
+
extensionHostProxy = value;
|
|
186
|
+
},
|
|
187
|
+
_setAllMainProxyIdentifiers: (value) => {
|
|
188
|
+
mainProxyIdentifiers = value;
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
const namedCustomers = ExtHostCustomersRegistry.getNamedCustomers();
|
|
192
|
+
for (let i = 0, len = namedCustomers.length; i < len; i++) {
|
|
193
|
+
const [id, ctor] = namedCustomers[i];
|
|
194
|
+
try {
|
|
195
|
+
const instance = this._instantiationService.createInstance(ctor, extHostContext);
|
|
196
|
+
this._customers.push(instance);
|
|
197
|
+
this._rpcProtocol.set(id, instance);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
this._logService.error(`Cannot instantiate named customer: '${id.sid}'`);
|
|
201
|
+
this._logService.error(err);
|
|
202
|
+
onUnexpectedError(err);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const customers = ExtHostCustomersRegistry.getCustomers();
|
|
206
|
+
for (const ctor of customers) {
|
|
207
|
+
try {
|
|
208
|
+
const instance = this._instantiationService.createInstance(ctor, extHostContext);
|
|
209
|
+
this._customers.push(instance);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
this._logService.error(err);
|
|
213
|
+
onUnexpectedError(err);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (!extensionHostProxy) {
|
|
217
|
+
throw new Error(`Missing IExtensionHostProxy!`);
|
|
218
|
+
}
|
|
219
|
+
this._rpcProtocol.assertRegistered(mainProxyIdentifiers);
|
|
220
|
+
return extensionHostProxy;
|
|
221
|
+
}
|
|
222
|
+
async activate(extension, reason) {
|
|
223
|
+
const proxy = await this._proxy;
|
|
224
|
+
if (!proxy) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
return proxy.activate(extension, reason);
|
|
228
|
+
}
|
|
229
|
+
activateByEvent(activationEvent, activationKind) {
|
|
230
|
+
if (activationKind === 1 && !this._hasStarted) {
|
|
231
|
+
return Promise.resolve();
|
|
232
|
+
}
|
|
233
|
+
if (!( this._cachedActivationEvents.has(activationEvent))) {
|
|
234
|
+
this._cachedActivationEvents.set(activationEvent, this._activateByEvent(activationEvent, activationKind));
|
|
235
|
+
}
|
|
236
|
+
return this._cachedActivationEvents.get(activationEvent);
|
|
237
|
+
}
|
|
238
|
+
activationEventIsDone(activationEvent) {
|
|
239
|
+
return ( this._resolvedActivationEvents.has(activationEvent));
|
|
240
|
+
}
|
|
241
|
+
async _activateByEvent(activationEvent, activationKind) {
|
|
242
|
+
if (!this._proxy) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const proxy = await this._proxy;
|
|
246
|
+
if (!proxy) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (!this._extensionHost.extensions.containsActivationEvent(activationEvent)) {
|
|
250
|
+
this._resolvedActivationEvents.add(activationEvent);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
await proxy.activateByEvent(activationEvent, activationKind);
|
|
254
|
+
this._resolvedActivationEvents.add(activationEvent);
|
|
255
|
+
}
|
|
256
|
+
async getInspectPort(tryEnableInspector) {
|
|
257
|
+
if (this._extensionHost) {
|
|
258
|
+
if (tryEnableInspector) {
|
|
259
|
+
await this._extensionHost.enableInspectPort();
|
|
260
|
+
}
|
|
261
|
+
const port = this._extensionHost.getInspectPort();
|
|
262
|
+
if (port) {
|
|
263
|
+
return port;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return 0;
|
|
267
|
+
}
|
|
268
|
+
async resolveAuthority(remoteAuthority, resolveAttempt) {
|
|
269
|
+
const sw = StopWatch.create(false);
|
|
270
|
+
const prefix = () => `[${extensionHostKindToString(this._extensionHost.runningLocation.kind)}${this._extensionHost.runningLocation.affinity}][resolveAuthority(${getRemoteAuthorityPrefix(remoteAuthority)},${resolveAttempt})][${sw.elapsed()}ms] `;
|
|
271
|
+
const logInfo = (msg) => this._logService.info(`${prefix()}${msg}`);
|
|
272
|
+
const logError = (msg, err = undefined) => this._logService.error(`${prefix()}${msg}`, err);
|
|
273
|
+
logInfo(`obtaining proxy...`);
|
|
274
|
+
const proxy = await this._proxy;
|
|
275
|
+
if (!proxy) {
|
|
276
|
+
logError(`no proxy`);
|
|
277
|
+
return {
|
|
278
|
+
type: 'error',
|
|
279
|
+
error: {
|
|
280
|
+
message: `Cannot resolve authority`,
|
|
281
|
+
code: RemoteAuthorityResolverErrorCode.Unknown,
|
|
282
|
+
detail: undefined
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
logInfo(`invoking...`);
|
|
287
|
+
const intervalLogger = ( new IntervalTimer());
|
|
288
|
+
try {
|
|
289
|
+
intervalLogger.cancelAndSet(() => logInfo('waiting...'), 1000);
|
|
290
|
+
const resolverResult = await proxy.resolveAuthority(remoteAuthority, resolveAttempt);
|
|
291
|
+
intervalLogger.dispose();
|
|
292
|
+
if (resolverResult.type === 'ok') {
|
|
293
|
+
logInfo(`returned ${resolverResult.value.authority.connectTo}`);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
logError(`returned an error`, resolverResult.error);
|
|
297
|
+
}
|
|
298
|
+
return resolverResult;
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
intervalLogger.dispose();
|
|
302
|
+
logError(`returned an error`, err);
|
|
303
|
+
return {
|
|
304
|
+
type: 'error',
|
|
305
|
+
error: {
|
|
306
|
+
message: err.message,
|
|
307
|
+
code: RemoteAuthorityResolverErrorCode.Unknown,
|
|
308
|
+
detail: err
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
async getCanonicalURI(remoteAuthority, uri) {
|
|
314
|
+
const proxy = await this._proxy;
|
|
315
|
+
if (!proxy) {
|
|
316
|
+
throw new Error(`Cannot resolve canonical URI`);
|
|
317
|
+
}
|
|
318
|
+
return proxy.getCanonicalURI(remoteAuthority, uri);
|
|
319
|
+
}
|
|
320
|
+
async start(extensionRegistryVersionId, allExtensions, myExtensions) {
|
|
321
|
+
const proxy = await this._proxy;
|
|
322
|
+
if (!proxy) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const deltaExtensions = this._extensionHost.extensions.set(extensionRegistryVersionId, allExtensions, myExtensions);
|
|
326
|
+
return proxy.startExtensionHost(deltaExtensions);
|
|
327
|
+
}
|
|
328
|
+
async extensionTestsExecute() {
|
|
329
|
+
const proxy = await this._proxy;
|
|
330
|
+
if (!proxy) {
|
|
331
|
+
throw new Error('Could not obtain Extension Host Proxy');
|
|
332
|
+
}
|
|
333
|
+
return proxy.extensionTestsExecute();
|
|
334
|
+
}
|
|
335
|
+
representsRunningLocation(runningLocation) {
|
|
336
|
+
return this._extensionHost.runningLocation.equals(runningLocation);
|
|
337
|
+
}
|
|
338
|
+
async deltaExtensions(incomingExtensionsDelta) {
|
|
339
|
+
const proxy = await this._proxy;
|
|
340
|
+
if (!proxy) {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
const outgoingExtensionsDelta = this._extensionHost.extensions.delta(incomingExtensionsDelta);
|
|
344
|
+
if (!outgoingExtensionsDelta) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
return proxy.deltaExtensions(outgoingExtensionsDelta);
|
|
348
|
+
}
|
|
349
|
+
containsExtension(extensionId) {
|
|
350
|
+
return this._extensionHost.extensions?.containsExtension(extensionId) ?? false;
|
|
351
|
+
}
|
|
352
|
+
async setRemoteEnvironment(env) {
|
|
353
|
+
const proxy = await this._proxy;
|
|
354
|
+
if (!proxy) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
return proxy.setRemoteEnvironment(env);
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
ExtensionHostManager = ExtensionHostManager_1 = ( __decorate([
|
|
361
|
+
( __param(3, IInstantiationService)),
|
|
362
|
+
( __param(4, IWorkbenchEnvironmentService)),
|
|
363
|
+
( __param(5, ITelemetryService)),
|
|
364
|
+
( __param(6, ILogService))
|
|
365
|
+
], ExtensionHostManager));
|
|
366
|
+
function friendlyExtHostName(kind, pid) {
|
|
367
|
+
if (pid) {
|
|
368
|
+
return `${extensionHostKindToString(kind)} pid: ${pid}`;
|
|
369
|
+
}
|
|
370
|
+
return `${extensionHostKindToString(kind)}`;
|
|
371
|
+
}
|
|
372
|
+
const colorTables = [
|
|
373
|
+
['#2977B1', '#FC802D', '#34A13A', '#D3282F', '#9366BA'],
|
|
374
|
+
['#8B564C', '#E177C0', '#7F7F7F', '#BBBE3D', '#2EBECD']
|
|
375
|
+
];
|
|
376
|
+
function prettyWithoutArrays(data) {
|
|
377
|
+
if (Array.isArray(data)) {
|
|
378
|
+
return data;
|
|
379
|
+
}
|
|
380
|
+
if (data && typeof data === 'object' && typeof data.toString === 'function') {
|
|
381
|
+
const result = ( data.toString());
|
|
382
|
+
if (result !== '[object Object]') {
|
|
383
|
+
return result;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return data;
|
|
387
|
+
}
|
|
388
|
+
function pretty(data) {
|
|
389
|
+
if (Array.isArray(data)) {
|
|
390
|
+
return ( data.map(prettyWithoutArrays));
|
|
391
|
+
}
|
|
392
|
+
return prettyWithoutArrays(data);
|
|
393
|
+
}
|
|
394
|
+
class RPCLogger {
|
|
395
|
+
constructor(_kind) {
|
|
396
|
+
this._kind = _kind;
|
|
397
|
+
this._totalIncoming = 0;
|
|
398
|
+
this._totalOutgoing = 0;
|
|
399
|
+
}
|
|
400
|
+
_log(direction, totalLength, msgLength, req, initiator, str, data) {
|
|
401
|
+
data = pretty(data);
|
|
402
|
+
const colorTable = colorTables[initiator];
|
|
403
|
+
const color = colorTable[req % colorTable.length] ;
|
|
404
|
+
let args = [`%c[${extensionHostKindToString(this._kind)}][${direction}]%c[${String(totalLength).padStart(7)}]%c[len: ${String(msgLength).padStart(5)}]%c${String(req).padStart(5)} - ${str}`, 'color: darkgreen', 'color: grey', 'color: grey', `color: ${color}`];
|
|
405
|
+
if (/\($/.test(str)) {
|
|
406
|
+
args = args.concat(data);
|
|
407
|
+
args.push(')');
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
args.push(data);
|
|
411
|
+
}
|
|
412
|
+
console.log.apply(console, args);
|
|
413
|
+
}
|
|
414
|
+
logIncoming(msgLength, req, initiator, str, data) {
|
|
415
|
+
this._totalIncoming += msgLength;
|
|
416
|
+
this._log('Ext \u2192 Win', this._totalIncoming, msgLength, req, initiator, str, data);
|
|
417
|
+
}
|
|
418
|
+
logOutgoing(msgLength, req, initiator, str, data) {
|
|
419
|
+
this._totalOutgoing += msgLength;
|
|
420
|
+
this._log('Win \u2192 Ext', this._totalOutgoing, msgLength, req, initiator, str, data);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
let TelemetryRPCLogger = class TelemetryRPCLogger {
|
|
424
|
+
static isEnabled() {
|
|
425
|
+
return Math.trunc(Math.random() * 1000) < 0.5;
|
|
426
|
+
}
|
|
427
|
+
constructor(_telemetryService) {
|
|
428
|
+
this._telemetryService = _telemetryService;
|
|
429
|
+
this._pendingRequests = ( new Map());
|
|
430
|
+
}
|
|
431
|
+
logIncoming(msgLength, req, initiator, str) {
|
|
432
|
+
if (initiator === 0 && /^receiveReply(Err)?:/.test(str)) {
|
|
433
|
+
const requestStr = this._pendingRequests.get(req) ?? 'unknown_reply';
|
|
434
|
+
this._pendingRequests.delete(req);
|
|
435
|
+
this._telemetryService.publicLog2('extensionhost.incoming', {
|
|
436
|
+
type: `${str} ${requestStr}`,
|
|
437
|
+
length: msgLength
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
if (initiator === 1 && /^receiveRequest /.test(str)) {
|
|
441
|
+
this._telemetryService.publicLog2('extensionhost.incoming', {
|
|
442
|
+
type: `${str}`,
|
|
443
|
+
length: msgLength
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
logOutgoing(msgLength, req, initiator, str) {
|
|
448
|
+
if (initiator === 0 && str.startsWith('request: ')) {
|
|
449
|
+
this._pendingRequests.set(req, str);
|
|
450
|
+
this._telemetryService.publicLog2('extensionhost.outgoing', {
|
|
451
|
+
type: str,
|
|
452
|
+
length: msgLength
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
TelemetryRPCLogger = ( __decorate([
|
|
458
|
+
( __param(0, ITelemetryService))
|
|
459
|
+
], TelemetryRPCLogger));
|
|
460
|
+
const providers = [];
|
|
461
|
+
function registerLatencyTestProvider(provider) {
|
|
462
|
+
providers.push(provider);
|
|
463
|
+
return {
|
|
464
|
+
dispose: () => {
|
|
465
|
+
for (let i = 0; i < providers.length; i++) {
|
|
466
|
+
if (providers[i] === provider) {
|
|
467
|
+
providers.splice(i, 1);
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
function getLatencyTestProviders() {
|
|
475
|
+
return providers.slice(0);
|
|
476
|
+
}
|
|
477
|
+
registerAction2(class MeasureExtHostLatencyAction extends Action2 {
|
|
478
|
+
constructor() {
|
|
479
|
+
super({
|
|
480
|
+
id: 'editor.action.measureExtHostLatency',
|
|
481
|
+
title: ( localize2WithPath(
|
|
482
|
+
'vs/workbench/services/extensions/common/extensionHostManager',
|
|
483
|
+
'measureExtHostLatency',
|
|
484
|
+
"Measure Extension Host Latency"
|
|
485
|
+
)),
|
|
486
|
+
category: Categories.Developer,
|
|
487
|
+
f1: true
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
async run(accessor) {
|
|
491
|
+
const editorService = accessor.get(IEditorService);
|
|
492
|
+
const measurements = await Promise.all(( getLatencyTestProviders().map(provider => provider.measure())));
|
|
493
|
+
editorService.openEditor({ resource: undefined, contents: ( measurements.map(MeasureExtHostLatencyAction._print)).join('\n\n'), options: { pinned: true } });
|
|
494
|
+
}
|
|
495
|
+
static _print(m) {
|
|
496
|
+
if (!m) {
|
|
497
|
+
return '';
|
|
498
|
+
}
|
|
499
|
+
return `${m.remoteAuthority ? `Authority: ${m.remoteAuthority}\n` : ``}Roundtrip latency: ${m.latency.toFixed(3)}ms\nUp: ${MeasureExtHostLatencyAction._printSpeed(m.up)}\nDown: ${MeasureExtHostLatencyAction._printSpeed(m.down)}\n`;
|
|
500
|
+
}
|
|
501
|
+
static _printSpeed(n) {
|
|
502
|
+
if (n <= 1024) {
|
|
503
|
+
return `${n} bps`;
|
|
504
|
+
}
|
|
505
|
+
if (n < 1024 * 1024) {
|
|
506
|
+
return `${(n / 1024).toFixed(1)} kbps`;
|
|
507
|
+
}
|
|
508
|
+
return `${(n / 1024 / 1024).toFixed(1)} Mbps`;
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
export { ExtensionHostManager, friendlyExtHostName };
|