From d3368374af2d29ff247b757a92e99c7d1208e3e7 Mon Sep 17 00:00:00 2001 From: Jason Ramsay Date: Mon, 29 Jan 2024 13:40:53 -0800 Subject: [PATCH 1/2] - Increase socket connection retry delay: 1,2,4,8,16 s - Add reject with onclose event info when available --- ts/src/connections/relayTunnelConnector.ts | 2 +- ts/src/connections/sshHelpers.ts | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ts/src/connections/relayTunnelConnector.ts b/ts/src/connections/relayTunnelConnector.ts index 0a4d755d..9eae945a 100644 --- a/ts/src/connections/relayTunnelConnector.ts +++ b/ts/src/connections/relayTunnelConnector.ts @@ -24,7 +24,7 @@ import { TunnelConnectionOptions } from './tunnelConnectionOptions'; export const maxReconnectDelayMs = 13000; // Delay between the 1st and the 2nd attempts. -const reconnectInitialDelayMs = 100; +const reconnectInitialDelayMs = 1000; // There is no status code information in web socket errors in browser context. // Instead, connection will retry anyway with limited retry attempts. diff --git a/ts/src/connections/sshHelpers.ts b/ts/src/connections/sshHelpers.ts index cdddd6bf..6538fa73 100644 --- a/ts/src/connections/sshHelpers.ts +++ b/ts/src/connections/sshHelpers.ts @@ -50,7 +50,6 @@ export class SshHelpers { if (isNode()) { return SshHelpers.nodeSshStreamFactory(relayUri, protocols, headers, clientConfig); } - return SshHelpers.webSshStreamFactory(new WebSocket(relayUri, protocols)); } @@ -101,6 +100,7 @@ export class SshHelpers { public static webSshStreamFactory(socket: WebSocket): Promise { socket.binaryType = 'arraybuffer'; return new Promise((resolve, reject) => { + const relayError = 'Failed to connect to relay url'; socket.onopen = () => { resolve(new ssh.WebSocketStream(socket)); }; @@ -109,7 +109,15 @@ export class SshHelpers { // the user agents must not convey extended error information including the cases where the server // didn't complete the opening handshake (e.g. because it was not a WebSocket server). // So we cannot obtain the response status code. - reject(new BrowserWebSocketRelayError(`Failed to connect to relay url`)); + // Note: When the socket is connected and an error occurs then `onclose` event occurs after `onerror`. + // However, the promise is already rejected by `onerror` and we loose this information, hence the + // timeout helps to give us some info in this scenario. + setTimeout(() => reject(new BrowserWebSocketRelayError(relayError)), 100); + }; + socket.onclose = (e) => { + if (e.code !== 1000) { + reject(new BrowserWebSocketRelayError(`${relayError} Code: ${e.code} Reason: ${e.reason}`)); + } }; }); } From ccf816f70452bb7c22b96ae12b1338bcc0d144ee Mon Sep 17 00:00:00 2001 From: Jason Ramsay Date: Mon, 29 Jan 2024 14:00:44 -0800 Subject: [PATCH 2/2] Update SDK --- ts/src/connections/package.json | 4 ++-- ts/src/management/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ts/src/connections/package.json b/ts/src/connections/package.json index d03585bd..7320a5e3 100644 --- a/ts/src/connections/package.json +++ b/ts/src/connections/package.json @@ -18,8 +18,8 @@ "buffer": "^5.2.1", "debug": "^4.1.1", "vscode-jsonrpc": "^4.0.0", - "@microsoft/dev-tunnels-contracts": ">1.1.9", - "@microsoft/dev-tunnels-management": ">1.1.9", + "@microsoft/dev-tunnels-contracts": ">1.1.10", + "@microsoft/dev-tunnels-management": ">1.1.10", "@microsoft/dev-tunnels-ssh": "^3.11.36", "@microsoft/dev-tunnels-ssh-tcp": "^3.11.36", "uuid": "^3.3.3", diff --git a/ts/src/management/package.json b/ts/src/management/package.json index 79ca0a37..8f097b4b 100644 --- a/ts/src/management/package.json +++ b/ts/src/management/package.json @@ -18,7 +18,7 @@ "buffer": "^5.2.1", "debug": "^4.1.1", "vscode-jsonrpc": "^4.0.0", - "@microsoft/dev-tunnels-contracts": ">1.1.9", + "@microsoft/dev-tunnels-contracts": ">1.1.10", "axios": "^1.6.6" } }