Skip to content

Commit 487a08a

Browse files
authored
Investigate detecting slow network connections (microsoft#178553) (microsoft#182653)
1 parent 09f80f4 commit 487a08a

File tree

13 files changed

+322
-149
lines changed

13 files changed

+322
-149
lines changed

build/lib/i18n.resources.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -322,10 +322,6 @@
322322
"name": "vs/workbench/contrib/bracketPairColorizer2Telemetry",
323323
"project": "vscode-workbench"
324324
},
325-
{
326-
"name": "vs/workbench/contrib/offline",
327-
"project": "vscode-workbench"
328-
},
329325
{
330326
"name": "vs/workbench/contrib/remoteTunnel",
331327
"project": "vscode-workbench"

extensions/vscode-test-resolver/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@
9595
"title": "Pause Connection (Test Reconnect)",
9696
"category": "Remote-TestResolver",
9797
"command": "vscode-testresolver.toggleConnectionPause"
98+
},
99+
{
100+
"title": "Slowdown Connection (Test Slow Down Indicator)",
101+
"category": "Remote-TestResolver",
102+
"command": "vscode-testresolver.toggleConnectionSlowdown"
98103
}
99104
],
100105
"menus": {

extensions/vscode-test-resolver/src/extension.ts

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,25 @@ const enum CharCode {
2222

2323
let outputChannel: vscode.OutputChannel;
2424

25+
const SLOWED_DOWN_CONNECTION_DELAY = 800;
26+
2527
export function activate(context: vscode.ExtensionContext) {
2628

2729
let connectionPaused = false;
2830
const connectionPausedEvent = new vscode.EventEmitter<boolean>();
2931

32+
let connectionSlowedDown = false;
33+
const connectionSlowedDownEvent = new vscode.EventEmitter<boolean>();
34+
const slowedDownConnections = new Set<Function>();
35+
connectionSlowedDownEvent.event(slowed => {
36+
if (!slowed) {
37+
for (const cb of slowedDownConnections) {
38+
cb();
39+
}
40+
slowedDownConnections.clear();
41+
}
42+
});
43+
3044
function getTunnelFeatures(): vscode.TunnelInformation['tunnelFeatures'] {
3145
return {
3246
elevation: true,
@@ -50,6 +64,22 @@ export function activate(context: vscode.ExtensionContext) {
5064
};
5165
}
5266

67+
function maybeSlowdown(): Promise<void> | void {
68+
if (connectionSlowedDown) {
69+
return new Promise(resolve => {
70+
const handle = setTimeout(() => {
71+
resolve();
72+
slowedDownConnections.delete(resolve);
73+
}, SLOWED_DOWN_CONNECTION_DELAY);
74+
75+
slowedDownConnections.add(() => {
76+
resolve();
77+
clearTimeout(handle);
78+
});
79+
});
80+
}
81+
}
82+
5383
function doResolve(authority: string, progress: vscode.Progress<{ message?: string; increment?: number }>): Promise<vscode.ResolverResult> {
5484
if (connectionPaused) {
5585
throw vscode.RemoteAuthorityResolverError.TemporarilyNotAvailable('Not available right now');
@@ -237,13 +267,15 @@ export function activate(context: vscode.ExtensionContext) {
237267
connectionPausedEvent.event(_ => handleConnectionPause());
238268
handleConnectionPause();
239269

240-
proxySocket.on('data', (data) => {
270+
proxySocket.on('data', async (data) => {
271+
await maybeSlowdown();
241272
remoteReady = remoteSocket.write(data);
242273
if (!remoteReady) {
243274
proxySocket.pause();
244275
}
245276
});
246-
remoteSocket.on('data', (data) => {
277+
remoteSocket.on('data', async (data) => {
278+
await maybeSlowdown();
247279
localReady = proxySocket.write(data);
248280
if (!localReady) {
249281
remoteSocket.pause();
@@ -358,6 +390,22 @@ export function activate(context: vscode.ExtensionContext) {
358390
connectionPausedEvent.fire(connectionPaused);
359391
}));
360392

393+
const slowdownStatusBarEntry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
394+
slowdownStatusBarEntry.text = 'Remote connection slowed down. Click to undo';
395+
slowdownStatusBarEntry.command = 'vscode-testresolver.toggleConnectionSlowdown';
396+
slowdownStatusBarEntry.backgroundColor = new vscode.ThemeColor('statusBarItem.errorBackground');
397+
398+
context.subscriptions.push(vscode.commands.registerCommand('vscode-testresolver.toggleConnectionSlowdown', () => {
399+
if (!connectionSlowedDown) {
400+
connectionSlowedDown = true;
401+
slowdownStatusBarEntry.show();
402+
} else {
403+
connectionSlowedDown = false;
404+
slowdownStatusBarEntry.hide();
405+
}
406+
connectionSlowedDownEvent.fire(connectionSlowedDown);
407+
}));
408+
361409
context.subscriptions.push(vscode.commands.registerCommand('vscode-testresolver.openTunnel', async () => {
362410
const result = await vscode.window.showInputBox({
363411
prompt: 'Enter the remote port for the tunnel',

src/vs/code/browser/workbench/workbench.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -500,11 +500,10 @@ function doCreateUri(path: string, queryValues: Map<string, string>): URI {
500500
// Create workbench
501501
create(document.body, {
502502
...config,
503-
settingsSyncOptions: config.settingsSyncOptions ? {
504-
enabled: config.settingsSyncOptions.enabled,
505-
} : undefined,
503+
windowIndicator: config.windowIndicator ?? { label: '$(remote)', tooltip: `${product.nameShort} Web` },
504+
settingsSyncOptions: config.settingsSyncOptions ? { enabled: config.settingsSyncOptions.enabled, } : undefined,
506505
workspaceProvider: WorkspaceProvider.create(config),
507506
urlCallbackProvider: new LocalStorageURLCallbackProvider(config.callbackRoute),
508-
credentialsProvider: config.remoteAuthority ? undefined : new LocalStorageCredentialsProvider() // with a remote, we don't use a local credentials provider
507+
credentialsProvider: config.remoteAuthority ? undefined /* with a remote, we don't use a local credentials provider */ : new LocalStorageCredentialsProvider()
509508
});
510509
})();

src/vs/code/electron-sandbox/issue/IssueReporterService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,7 @@ export class IssueReporter extends Disposable {
991991
const remoteDataTable = $('table', undefined,
992992
$('tr', undefined,
993993
$('td', undefined, 'Remote'),
994-
$('td', undefined, remote.hostName)
994+
$('td', undefined, remote.latency ? `${remote.hostName} (latency: ${remote.latency.current.toFixed(2)}ms last, ${remote.latency.average.toFixed(2)}ms average)` : remote.hostName)
995995
),
996996
$('tr', undefined,
997997
$('td', undefined, 'OS'),

src/vs/code/electron-sandbox/issue/issueReporterModel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ ${this.getInfos()}
185185
186186
|Item|Value|
187187
|---|---|
188-
|Remote|${remote.hostName}|
188+
|Remote|${remote.latency ? `${remote.hostName} (latency: ${remote.latency.current.toFixed(2)}ms last, ${remote.latency.average.toFixed(2)}ms average)` : remote.hostName}|
189189
|OS|${remote.machineInfo.os}|
190190
|CPUs|${remote.machineInfo.cpus}|
191191
|Memory (System)|${remote.machineInfo.memory}|

src/vs/platform/diagnostics/common/diagnostics.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ export interface SystemInfo extends IMachineInfo {
5252

5353
export interface IRemoteDiagnosticInfo extends IDiagnosticInfo {
5454
hostName: string;
55+
latency?: {
56+
current: number;
57+
average: number;
58+
};
5559
}
5660

5761
export interface IRemoteDiagnosticError {

src/vs/workbench/contrib/offline/browser/offline.contribution.ts

Lines changed: 0 additions & 97 deletions
This file was deleted.

0 commit comments

Comments
 (0)