@codingame/monaco-vscode-extensions-service-override
Version:
VSCode public API plugged on the monaco editor - extensions service-override
262 lines (258 loc) • 13.8 kB
JavaScript
import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
import { VSBuffer } from '@codingame/monaco-vscode-api/vscode/vs/base/common/buffer';
import { Emitter } from '@codingame/monaco-vscode-api/vscode/vs/base/common/event';
import { Disposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
import { Schemas } from '@codingame/monaco-vscode-api/vscode/vs/base/common/network';
import { language, isWeb } from '@codingame/monaco-vscode-api/vscode/vs/base/common/platform';
import { IExtensionHostDebugService } from '@codingame/monaco-vscode-api/vscode/vs/platform/debug/common/extensionHostDebug.service';
import { ILabelService } from '@codingame/monaco-vscode-api/vscode/vs/platform/label/common/label.service';
import { ILogService, ILoggerService } from '@codingame/monaco-vscode-api/vscode/vs/platform/log/common/log.service';
import { IProductService } from '@codingame/monaco-vscode-api/vscode/vs/platform/product/common/productService.service';
import { connectRemoteAgentExtensionHost } from '@codingame/monaco-vscode-api/vscode/vs/platform/remote/common/remoteAgentConnection';
import { IRemoteAuthorityResolverService } from '@codingame/monaco-vscode-api/vscode/vs/platform/remote/common/remoteAuthorityResolver.service';
import { IRemoteSocketFactoryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/remote/common/remoteSocketFactoryService.service';
import { ISignService } from '@codingame/monaco-vscode-api/vscode/vs/platform/sign/common/sign.service';
import { ITelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service';
import { isLoggingOnly } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetryUtils';
import { WorkbenchState } from '@codingame/monaco-vscode-api/vscode/vs/platform/workspace/common/workspace';
import { IWorkspaceContextService } from '@codingame/monaco-vscode-api/vscode/vs/platform/workspace/common/workspace.service';
import { IWorkbenchEnvironmentService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/environment/common/environmentService.service';
import { IDefaultLogLevelsService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/log/common/defaultLogLevels.service';
import { parseExtensionDevOptions } from './extensionDevOptions.js';
import { isMessageOfType, MessageType, UIKind, createMessageOfType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/extensions/common/extensionHostProtocol';
import { ExtensionHostStartup } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/extensions/common/extensions';
let RemoteExtensionHost = class RemoteExtensionHost extends Disposable {
constructor(
runningLocation,
_initDataProvider,
remoteSocketFactoryService,
_contextService,
_environmentService,
_telemetryService,
_logService,
_loggerService,
_labelService,
remoteAuthorityResolverService,
_extensionHostDebugService,
_productService,
_signService,
_defaultLogLevelsService
) {
super();
this.runningLocation = runningLocation;
this._initDataProvider = _initDataProvider;
this.remoteSocketFactoryService = remoteSocketFactoryService;
this._contextService = _contextService;
this._environmentService = _environmentService;
this._telemetryService = _telemetryService;
this._logService = _logService;
this._loggerService = _loggerService;
this._labelService = _labelService;
this.remoteAuthorityResolverService = remoteAuthorityResolverService;
this._extensionHostDebugService = _extensionHostDebugService;
this._productService = _productService;
this._signService = _signService;
this._defaultLogLevelsService = _defaultLogLevelsService;
this.pid = null;
this.startup = ExtensionHostStartup.EagerAutoStart;
this.extensions = null;
this._onExit = this._register(( new Emitter()));
this.onExit = this._onExit.event;
this._hasDisconnected = false;
this.remoteAuthority = this._initDataProvider.remoteAuthority;
this._protocol = null;
this._hasLostConnection = false;
this._terminating = false;
const devOpts = parseExtensionDevOptions(this._environmentService);
this._isExtensionDevHost = devOpts.isExtensionDevHost;
}
start() {
const options = {
commit: this._productService.commit,
quality: this._productService.quality,
addressProvider: {
getAddress: async () => {
const {
authority
} = await this.remoteAuthorityResolverService.resolveAuthority(this._initDataProvider.remoteAuthority);
return {
connectTo: authority.connectTo,
connectionToken: authority.connectionToken
};
}
},
remoteSocketFactoryService: this.remoteSocketFactoryService,
signService: this._signService,
logService: this._logService,
ipcLogger: null
};
return this.remoteAuthorityResolverService.resolveAuthority(this._initDataProvider.remoteAuthority).then(resolverResult => {
const startParams = {
language: language,
debugId: this._environmentService.debugExtensionHost.debugId,
break: this._environmentService.debugExtensionHost.break,
port: this._environmentService.debugExtensionHost.port,
env: {
...this._environmentService.debugExtensionHost.env,
...resolverResult.options?.extensionHostEnv
}
};
const extDevLocs = this._environmentService.extensionDevelopmentLocationURI;
let debugOk = true;
if (extDevLocs && extDevLocs.length > 0) {
if (extDevLocs[0].scheme === Schemas.file) {
debugOk = false;
}
}
if (!debugOk) {
startParams.break = false;
}
return connectRemoteAgentExtensionHost(options, startParams).then(result => {
this._register(result);
const {
protocol,
debugPort,
reconnectionToken
} = result;
const isExtensionDevelopmentDebug = typeof debugPort === "number";
if (debugOk && this._environmentService.isExtensionDevelopment && this._environmentService.debugExtensionHost.debugId && debugPort) {
this._extensionHostDebugService.attachSession(
this._environmentService.debugExtensionHost.debugId,
debugPort,
this._initDataProvider.remoteAuthority
);
}
protocol.onDidDispose(() => {
this._onExtHostConnectionLost(reconnectionToken);
});
protocol.onSocketClose(() => {
if (this._isExtensionDevHost) {
this._onExtHostConnectionLost(reconnectionToken);
}
});
return ( new Promise((resolve, reject) => {
const handle = setTimeout(() => {
reject(
"The remote extension host took longer than 60s to send its ready message."
);
}, 60 * 1000);
const disposable = protocol.onMessage(msg => {
if (isMessageOfType(msg, MessageType.Ready)) {
this._createExtHostInitData(isExtensionDevelopmentDebug).then(data => {
protocol.send(VSBuffer.fromString(JSON.stringify(data)));
});
return;
}
if (isMessageOfType(msg, MessageType.Initialized)) {
clearTimeout(handle);
disposable.dispose();
this._protocol = protocol;
resolve(protocol);
return;
}
console.error(
`received unexpected message during handshake phase from the extension host: `,
msg
);
});
}));
});
});
}
_onExtHostConnectionLost(reconnectionToken) {
if (this._hasLostConnection) {
return;
}
this._hasLostConnection = true;
if (this._isExtensionDevHost && this._environmentService.debugExtensionHost.debugId) {
this._extensionHostDebugService.close(this._environmentService.debugExtensionHost.debugId);
}
if (this._terminating) {
return;
}
this._onExit.fire([0, reconnectionToken]);
}
async _createExtHostInitData(isExtensionDevelopmentDebug) {
const remoteInitData = await this._initDataProvider.getInitData();
this.extensions = remoteInitData.extensions;
const workspace = this._contextService.getWorkspace();
return {
commit: this._productService.commit,
version: this._productService.version,
quality: this._productService.quality,
date: this._productService.date,
parentPid: remoteInitData.pid,
environment: {
isExtensionDevelopmentDebug,
appRoot: remoteInitData.appRoot,
appName: this._productService.nameLong,
appHost: this._productService.embedderIdentifier || "desktop",
appUriScheme: this._productService.urlProtocol,
isExtensionTelemetryLoggingOnly: isLoggingOnly(this._productService, this._environmentService),
appLanguage: language,
extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI,
extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI,
globalStorageHome: remoteInitData.globalStorageHome,
workspaceStorageHome: remoteInitData.workspaceStorageHome,
extensionLogLevel: this._defaultLogLevelsService.defaultLogLevels.extensions,
isSessionsWindow: this._environmentService.isSessionsWindow
},
workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : {
configuration: workspace.configuration,
id: workspace.id,
name: this._labelService.getWorkspaceLabel(workspace),
transient: workspace.transient
},
remote: {
isRemote: true,
authority: this._initDataProvider.remoteAuthority,
connectionData: remoteInitData.connectionData
},
consoleForward: {
includeStack: false,
logNative: Boolean(this._environmentService.debugExtensionHost.debugId)
},
extensions: this.extensions.toSnapshot(),
telemetryInfo: {
sessionId: this._telemetryService.sessionId,
machineId: this._telemetryService.machineId,
sqmId: this._telemetryService.sqmId,
devDeviceId: this._telemetryService.devDeviceId ?? this._telemetryService.machineId,
firstSessionDate: this._telemetryService.firstSessionDate,
msftInternal: this._telemetryService.msftInternal
},
remoteExtensionTips: this._productService.remoteExtensionTips,
virtualWorkspaceExtensionTips: this._productService.virtualWorkspaceExtensionTips,
logLevel: this._logService.getLevel(),
loggers: [...this._loggerService.getRegisteredLoggers()],
logsLocation: remoteInitData.extensionHostLogsPath,
autoStart: (this.startup === ExtensionHostStartup.EagerAutoStart),
uiKind: isWeb ? UIKind.Web : UIKind.Desktop
};
}
getInspectPort() {
return undefined;
}
enableInspectPort() {
return Promise.resolve(false);
}
async disconnect() {
if (this._protocol && !this._hasDisconnected) {
this._protocol.send(createMessageOfType(MessageType.Terminate));
this._protocol.sendDisconnect();
this._hasDisconnected = true;
await this._protocol.drain();
}
}
dispose() {
super.dispose();
this._terminating = true;
this.disconnect();
if (this._protocol) {
this._protocol.getSocket().end();
this._protocol = null;
}
}
};
RemoteExtensionHost = ( __decorate([( __param(2, IRemoteSocketFactoryService)), ( __param(3, IWorkspaceContextService)), ( __param(4, IWorkbenchEnvironmentService)), ( __param(5, ITelemetryService)), ( __param(6, ILogService)), ( __param(7, ILoggerService)), ( __param(8, ILabelService)), ( __param(9, IRemoteAuthorityResolverService)), ( __param(10, IExtensionHostDebugService)), ( __param(11, IProductService)), ( __param(12, ISignService)), ( __param(13, IDefaultLogLevelsService))], RemoteExtensionHost));
export { RemoteExtensionHost };