Skip to content

Commit 7ac79af

Browse files
committed
Fix an issue with changing host + Fix an issue with catching errors on socket creation
1 parent 7f90aef commit 7ac79af

File tree

2 files changed

+26
-25
lines changed

2 files changed

+26
-25
lines changed

src/api/coderApi.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,14 @@ export class CoderApi extends Api {
7474
client.setSessionToken(token);
7575
}
7676

77-
setupInterceptors(client, baseUrl, output);
77+
setupInterceptors(client, output);
7878
return client;
7979
}
8080

8181
setSessionToken = (token: string): void => {
82-
const currentToken =
83-
this.getAxiosInstance().defaults.headers.common[coderSessionTokenHeader];
84-
this.getAxiosInstance().defaults.headers.common[coderSessionTokenHeader] =
85-
token;
82+
const defaultHeaders = this.getAxiosInstance().defaults.headers.common;
83+
const currentToken = defaultHeaders[coderSessionTokenHeader];
84+
defaultHeaders[coderSessionTokenHeader] = token;
8685

8786
if (currentToken !== token) {
8887
for (const socket of this.reconnectingSockets) {
@@ -92,8 +91,9 @@ export class CoderApi extends Api {
9291
};
9392

9493
setHost = (host: string | undefined): void => {
95-
const currentHost = this.getAxiosInstance().defaults.baseURL;
96-
this.getAxiosInstance().defaults.baseURL = host;
94+
const defaults = this.getAxiosInstance().defaults;
95+
const currentHost = defaults.baseURL;
96+
defaults.baseURL = host;
9797

9898
if (currentHost !== host) {
9999
for (const socket of this.reconnectingSockets) {
@@ -380,14 +380,11 @@ export class CoderApi extends Api {
380380
/**
381381
* Set up logging and request interceptors for the CoderApi instance.
382382
*/
383-
function setupInterceptors(
384-
client: CoderApi,
385-
baseUrl: string,
386-
output: Logger,
387-
): void {
383+
function setupInterceptors(client: CoderApi, output: Logger): void {
388384
addLoggingInterceptors(client.getAxiosInstance(), output);
389385

390386
client.getAxiosInstance().interceptors.request.use(async (config) => {
387+
const baseUrl = client.getAxiosInstance().defaults.baseURL;
391388
const headers = await getHeaders(
392389
baseUrl,
393390
getHeaderCommand(vscode.workspace.getConfiguration()),
@@ -413,7 +410,12 @@ function setupInterceptors(
413410
client.getAxiosInstance().interceptors.response.use(
414411
(r) => r,
415412
async (err) => {
416-
throw await CertificateError.maybeWrap(err, baseUrl, output);
413+
const baseUrl = client.getAxiosInstance().defaults.baseURL;
414+
if (baseUrl) {
415+
throw await CertificateError.maybeWrap(err, baseUrl, output);
416+
} else {
417+
throw err;
418+
}
417419
},
418420
);
419421
}

src/websocket/reconnectingWebSocket.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import type {
1010
export type SocketFactory<TData> = () => Promise<UnidirectionalStream<TData>>;
1111

1212
export type ReconnectingWebSocketOptions = {
13-
initialBackoffMs?: number; // Default: 250ms
14-
maxBackoffMs?: number; // Default: 30s
15-
jitterFactor?: number; // Default: 0.1 (±10%)
13+
initialBackoffMs?: number;
14+
maxBackoffMs?: number;
15+
jitterFactor?: number;
1616
};
1717

1818
// 403 Forbidden, 410 Gone, 426 Upgrade Required, 1002/1003 Protocol errors
@@ -147,7 +147,6 @@ export class ReconnectingWebSocket<TData = unknown>
147147
}
148148

149149
this.#isConnecting = true;
150-
151150
try {
152151
const socket = await this.#socketFactory();
153152
this.#currentSocket = socket;
@@ -199,13 +198,6 @@ export class ReconnectingWebSocket<TData = unknown>
199198
// Reconnect on abnormal closures (e.g., 1006) or other unexpected codes
200199
this.#scheduleReconnect();
201200
});
202-
} catch (error) {
203-
if (!this.#isDisposed) {
204-
this.#logger.warn(
205-
`[ReconnectingWebSocket] Failed: ${error instanceof Error ? error.message : String(error)} for ${this.#apiRoute}`,
206-
);
207-
this.#scheduleReconnect();
208-
}
209201
} finally {
210202
this.#isConnecting = false;
211203
}
@@ -227,7 +219,14 @@ export class ReconnectingWebSocket<TData = unknown>
227219
this.#reconnectTimeoutId = setTimeout(() => {
228220
this.#reconnectTimeoutId = null;
229221
// Errors already handled in #connect
230-
void this.#connect();
222+
this.#connect().catch((error) => {
223+
if (!this.#isDisposed) {
224+
this.#logger.warn(
225+
`[ReconnectingWebSocket] Failed: ${error instanceof Error ? error.message : String(error)} for ${this.#apiRoute}`,
226+
);
227+
this.#scheduleReconnect();
228+
}
229+
});
231230
}, delayMs);
232231

233232
this.#backoffMs = Math.min(this.#backoffMs * 2, this.#options.maxBackoffMs);

0 commit comments

Comments
 (0)