Skip to content

Commit ed54d72

Browse files
committed
Move backend to platform and wait for connection in timer service
1 parent d02b649 commit ed54d72

File tree

17 files changed

+151
-134
lines changed

17 files changed

+151
-134
lines changed

src/vs/platform/terminal/common/terminal.ts

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { ThemeIcon } from 'vs/base/common/themables';
1313
import { ISerializableEnvironmentVariableCollections } from 'vs/platform/terminal/common/environmentVariable';
1414
import { RawContextKey } from 'vs/platform/contextkey/common/contextkey';
1515
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
16+
import { Registry } from 'vs/platform/registry/common/platform';
1617

1718
export const terminalTabFocusContextKey = new RawContextKey<boolean>('terminalTabFocusMode', false, true);
1819

@@ -944,6 +945,107 @@ export interface ITerminalCommandSelector {
944945
commandExitResult: 'success' | 'error';
945946
}
946947

948+
export interface ITerminalBackend {
949+
readonly remoteAuthority: string | undefined;
950+
951+
readonly isResponsive: boolean;
952+
readonly whenConnected: Promise<void>;
953+
setConnected(): void;
954+
955+
/**
956+
* Fired when the ptyHost process becomes non-responsive, this should disable stdin for all
957+
* terminals using this pty host connection and mark them as disconnected.
958+
*/
959+
onPtyHostUnresponsive: Event<void>;
960+
/**
961+
* Fired when the ptyHost process becomes responsive after being non-responsive. Allowing
962+
* previously disconnected terminals to reconnect.
963+
*/
964+
onPtyHostResponsive: Event<void>;
965+
/**
966+
* Fired when the ptyHost has been restarted, this is used as a signal for listening terminals
967+
* that its pty has been lost and will remain disconnected.
968+
*/
969+
onPtyHostRestart: Event<void>;
970+
971+
onDidRequestDetach: Event<{ requestId: number; workspaceId: string; instanceId: number }>;
972+
973+
attachToProcess(id: number): Promise<ITerminalChildProcess | undefined>;
974+
attachToRevivedProcess(id: number): Promise<ITerminalChildProcess | undefined>;
975+
listProcesses(): Promise<IProcessDetails[]>;
976+
getDefaultSystemShell(osOverride?: OperatingSystem): Promise<string>;
977+
getProfiles(profiles: unknown, defaultProfile: unknown, includeDetectedProfiles?: boolean): Promise<ITerminalProfile[]>;
978+
getWslPath(original: string, direction: 'unix-to-win' | 'win-to-unix'): Promise<string>;
979+
getEnvironment(): Promise<IProcessEnvironment>;
980+
getShellEnvironment(): Promise<IProcessEnvironment | undefined>;
981+
setTerminalLayoutInfo(layoutInfo?: ITerminalsLayoutInfoById): Promise<void>;
982+
updateTitle(id: number, title: string, titleSource: TitleEventSource): Promise<void>;
983+
updateIcon(id: number, userInitiated: boolean, icon: TerminalIcon, color?: string): Promise<void>;
984+
getTerminalLayoutInfo(): Promise<ITerminalsLayoutInfo | undefined>;
985+
reduceConnectionGraceTime(): Promise<void>;
986+
requestDetachInstance(workspaceId: string, instanceId: number): Promise<IProcessDetails | undefined>;
987+
acceptDetachInstanceReply(requestId: number, persistentProcessId?: number): Promise<void>;
988+
persistTerminalState(): Promise<void>;
989+
990+
createProcess(
991+
shellLaunchConfig: IShellLaunchConfig,
992+
cwd: string,
993+
cols: number,
994+
rows: number,
995+
unicodeVersion: '6' | '11',
996+
env: IProcessEnvironment,
997+
options: ITerminalProcessOptions,
998+
shouldPersist: boolean
999+
): Promise<ITerminalChildProcess>;
1000+
1001+
restartPtyHost(): void;
1002+
}
1003+
1004+
export const TerminalExtensions = {
1005+
Backend: 'workbench.contributions.terminal.processBackend'
1006+
};
1007+
1008+
export interface ITerminalBackendRegistry {
1009+
/**
1010+
* Gets all backends in the registry.
1011+
*/
1012+
backends: ReadonlyMap<string, ITerminalBackend>;
1013+
1014+
/**
1015+
* Registers a terminal backend for a remote authority.
1016+
*/
1017+
registerTerminalBackend(backend: ITerminalBackend): void;
1018+
1019+
/**
1020+
* Returns the registered terminal backend for a remote authority.
1021+
*/
1022+
getTerminalBackend(remoteAuthority?: string): ITerminalBackend | undefined;
1023+
}
1024+
1025+
class TerminalBackendRegistry implements ITerminalBackendRegistry {
1026+
private readonly _backends = new Map<string, ITerminalBackend>();
1027+
1028+
get backends(): ReadonlyMap<string, ITerminalBackend> { return this._backends; }
1029+
1030+
registerTerminalBackend(backend: ITerminalBackend): void {
1031+
const key = this._sanitizeRemoteAuthority(backend.remoteAuthority);
1032+
if (this._backends.has(key)) {
1033+
throw new Error(`A terminal backend with remote authority '${key}' was already registered.`);
1034+
}
1035+
this._backends.set(key, backend);
1036+
}
1037+
1038+
getTerminalBackend(remoteAuthority: string | undefined): ITerminalBackend | undefined {
1039+
return this._backends.get(this._sanitizeRemoteAuthority(remoteAuthority));
1040+
}
1041+
1042+
private _sanitizeRemoteAuthority(remoteAuthority: string | undefined) {
1043+
// Normalize the key to lowercase as the authority is case-insensitive
1044+
return remoteAuthority?.toLowerCase() ?? '';
1045+
}
1046+
}
1047+
Registry.add(TerminalExtensions.Backend, new TerminalBackendRegistry());
1048+
9471049
export const ILocalPtyService = createDecorator<ILocalPtyService>('localPtyService');
9481050

9491051
/**

src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { DeferredPromise } from 'vs/base/common/async';
67
import { Emitter } from 'vs/base/common/event';
78
import { revive } from 'vs/base/common/marshalling';
89
import { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform';
@@ -14,15 +15,15 @@ import { Registry } from 'vs/platform/registry/common/platform';
1415
import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
1516
import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage';
1617
import { ISerializedTerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities';
17-
import { IShellLaunchConfig, IShellLaunchConfigDto, ITerminalChildProcess, ITerminalEnvironment, ITerminalProcessOptions, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ProcessPropertyType, TerminalIcon, TerminalSettingId, TitleEventSource } from 'vs/platform/terminal/common/terminal';
18+
import { IShellLaunchConfig, IShellLaunchConfigDto, ITerminalBackend, ITerminalBackendRegistry, ITerminalChildProcess, ITerminalEnvironment, ITerminalProcessOptions, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ProcessPropertyType, TerminalExtensions, TerminalIcon, TerminalSettingId, TitleEventSource } from 'vs/platform/terminal/common/terminal';
1819
import { IProcessDetails } from 'vs/platform/terminal/common/terminalProcess';
1920
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
2021
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
2122
import { BaseTerminalBackend } from 'vs/workbench/contrib/terminal/browser/baseTerminalBackend';
2223
import { RemotePty } from 'vs/workbench/contrib/terminal/browser/remotePty';
2324
import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal';
2425
import { RemoteTerminalChannelClient, REMOTE_TERMINAL_CHANNEL_NAME } from 'vs/workbench/contrib/terminal/common/remoteTerminalChannel';
25-
import { ICompleteTerminalConfiguration, ITerminalBackend, ITerminalBackendRegistry, ITerminalConfiguration, TerminalExtensions, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal';
26+
import { ICompleteTerminalConfiguration, ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal';
2627
import { TerminalStorageKeys } from 'vs/workbench/contrib/terminal/common/terminalStorageKeys';
2728
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
2829
import { IHistoryService } from 'vs/workbench/services/history/common/history';
@@ -48,6 +49,10 @@ export class RemoteTerminalBackendContribution implements IWorkbenchContribution
4849
class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBackend {
4950
private readonly _ptys: Map<number, RemotePty> = new Map();
5051

52+
private readonly _whenConnected = new DeferredPromise<void>();
53+
get whenConnected(): Promise<void> { return this._whenConnected.p; }
54+
setConnected(): void { this._whenConnected.complete(); }
55+
5156
private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number; workspaceId: string; instanceId: number }>());
5257
readonly onDidRequestDetach = this._onDidRequestDetach.event;
5358
private readonly _onRestoreCommands = this._register(new Emitter<{ id: number; commands: ISerializedTerminalCommand[] }>());

src/vs/workbench/contrib/terminal/browser/terminal.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
1515
import { IKeyMods } from 'vs/platform/quickinput/common/quickInput';
1616
import { IMarkProperties, ITerminalCapabilityStore, ITerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities';
1717
import { IMergedEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable';
18-
import { IExtensionTerminalProfile, IReconnectionProperties, IShellIntegration, IShellLaunchConfig, ITerminalDimensions, ITerminalLaunchError, ITerminalProfile, ITerminalTabLayoutInfoById, TerminalExitReason, TerminalIcon, TerminalLocation, TerminalShellType, TerminalType, TitleEventSource, WaitOnExitValue } from 'vs/platform/terminal/common/terminal';
18+
import { IExtensionTerminalProfile, IReconnectionProperties, IShellIntegration, IShellLaunchConfig, ITerminalBackend, ITerminalDimensions, ITerminalLaunchError, ITerminalProfile, ITerminalTabLayoutInfoById, TerminalExitReason, TerminalIcon, TerminalLocation, TerminalShellType, TerminalType, TitleEventSource, WaitOnExitValue } from 'vs/platform/terminal/common/terminal';
1919
import { IColorTheme } from 'vs/platform/theme/common/themeService';
2020
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
2121
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
2222
import { IEditableData } from 'vs/workbench/common/views';
2323
import { ITerminalStatusList } from 'vs/workbench/contrib/terminal/browser/terminalStatusList';
2424
import { ScrollPosition } from 'vs/workbench/contrib/terminal/browser/xterm/markNavigationAddon';
2525
import { XtermTerminal } from 'vs/workbench/contrib/terminal/browser/xterm/xtermTerminal';
26-
import { IRegisterContributedProfileArgs, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalBackend, ITerminalConfigHelper, ITerminalFont, ITerminalProcessExtHostProxy } from 'vs/workbench/contrib/terminal/common/terminal';
26+
import { IRegisterContributedProfileArgs, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalFont, ITerminalProcessExtHostProxy } from 'vs/workbench/contrib/terminal/common/terminal';
2727
import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn';
2828
import { ISimpleSelectedSuggestion } from 'vs/workbench/services/suggest/browser/simpleSuggestWidget';
2929
import { IMarker, Terminal as RawXtermTerminal } from 'xterm';

src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
import { ITerminalInstance, ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal';
77
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
88
import { Disposable } from 'vs/base/common/lifecycle';
9-
import { IShellLaunchConfig, ITerminalProfile, TerminalLocation } from 'vs/platform/terminal/common/terminal';
9+
import { IShellLaunchConfig, ITerminalBackend, ITerminalBackendRegistry, ITerminalProfile, TerminalExtensions, TerminalLocation } from 'vs/platform/terminal/common/terminal';
1010
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1111
import { TerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminalInstance';
1212
import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
1313
import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper';
14-
import { ITerminalBackend, ITerminalBackendRegistry, TerminalExtensions } from 'vs/workbench/contrib/terminal/common/terminal';
1514
import { URI } from 'vs/base/common/uri';
1615
import { Emitter, Event } from 'vs/base/common/event';
1716
import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey';

src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
1919
import { ISerializedCommandDetectionCapability, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities';
2020
import { NaiveCwdDetectionCapability } from 'vs/platform/terminal/common/capabilities/naiveCwdDetectionCapability';
2121
import { TerminalCapabilityStore } from 'vs/platform/terminal/common/capabilities/terminalCapabilityStore';
22-
import { FlowControlConstants, IProcessDataEvent, IProcessProperty, IProcessPropertyMap, IProcessReadyEvent, IReconnectionProperties, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalEnvironment, ITerminalLaunchError, ITerminalProcessOptions, ProcessPropertyType, TerminalSettingId } from 'vs/platform/terminal/common/terminal';
22+
import { FlowControlConstants, IProcessDataEvent, IProcessProperty, IProcessPropertyMap, IProcessReadyEvent, IReconnectionProperties, IShellLaunchConfig, ITerminalBackend, ITerminalChildProcess, ITerminalDimensions, ITerminalEnvironment, ITerminalLaunchError, ITerminalProcessOptions, ProcessPropertyType, TerminalSettingId } from 'vs/platform/terminal/common/terminal';
2323
import { TerminalRecorder } from 'vs/platform/terminal/common/terminalRecorder';
2424
import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
2525
import { EnvironmentVariableInfoChangesActive, EnvironmentVariableInfoStale } from 'vs/workbench/contrib/terminal/browser/environmentVariableInfo';
2626
import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal';
2727
import { IEnvironmentVariableInfo, IEnvironmentVariableService } from 'vs/workbench/contrib/terminal/common/environmentVariable';
2828
import { MergedEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariableCollection';
2929
import { serializeEnvironmentVariableCollections } from 'vs/platform/terminal/common/environmentVariableShared';
30-
import { IBeforeProcessDataEvent, ITerminalBackend, ITerminalConfigHelper, ITerminalProcessManager, ITerminalProfileResolverService, ProcessState } from 'vs/workbench/contrib/terminal/common/terminal';
30+
import { IBeforeProcessDataEvent, ITerminalConfigHelper, ITerminalProcessManager, ITerminalProfileResolverService, ProcessState } from 'vs/workbench/contrib/terminal/common/terminal';
3131
import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment';
3232
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
3333
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';

src/vs/workbench/contrib/terminal/browser/terminalService.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
2020
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
2121
import { ILogService } from 'vs/platform/log/common/log';
2222
import { INotificationService } from 'vs/platform/notification/common/notification';
23-
import { ICreateContributedTerminalProfileOptions, IShellLaunchConfig, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalExitReason, TerminalLocation, TerminalLocationString, TitleEventSource } from 'vs/platform/terminal/common/terminal';
23+
import { ICreateContributedTerminalProfileOptions, IShellLaunchConfig, ITerminalBackend, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalExitReason, TerminalLocation, TerminalLocationString, TitleEventSource } from 'vs/platform/terminal/common/terminal';
2424
import { formatMessageForTerminal } from 'vs/platform/terminal/common/terminalStrings';
2525
import { iconForeground } from 'vs/platform/theme/common/colorRegistry';
2626
import { getIconRegistry } from 'vs/platform/theme/common/iconRegistry';
@@ -38,7 +38,7 @@ import { getColorStyleContent, getUriClasses } from 'vs/workbench/contrib/termin
3838
import { TerminalProfileQuickpick } from 'vs/workbench/contrib/terminal/browser/terminalProfileQuickpick';
3939
import { getInstanceFromResource, getTerminalUri, parseTerminalUri } from 'vs/workbench/contrib/terminal/browser/terminalUri';
4040
import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView';
41-
import { IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalBackend, ITerminalConfigHelper, ITerminalProcessExtHostProxy, ITerminalProfileService, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal';
41+
import { IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalProcessExtHostProxy, ITerminalProfileService, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal';
4242
import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey';
4343
import { columnToEditorGroup } from 'vs/workbench/services/editor/common/editorGroupColumn';
4444
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
@@ -293,6 +293,9 @@ export class TerminalService implements ITerminalService {
293293
reconnectedPromise.then(() => {
294294
this._setConnected();
295295
this._mark('code/terminal/didReconnect');
296+
for (const backend of this._terminalInstanceService.getRegisteredBackends()) {
297+
backend.setConnected();
298+
}
296299
this._whenConnected.complete();
297300
});
298301

src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
1717
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
1818
import { MenuItemAction } from 'vs/platform/actions/common/actions';
1919
import { MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
20-
import { ITerminalBackend, TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal';
21-
import { TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal';
20+
import { TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal';
21+
import { ITerminalBackend, TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal';
2222
import { Codicon } from 'vs/base/common/codicons';
2323
import { Action } from 'vs/base/common/actions';
2424
import { DEFAULT_LABELS_CONTAINER, IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels';

0 commit comments

Comments
 (0)