Skip to content

Commit 3ef57c3

Browse files
committed
Don't call onclose if connect fails
1 parent 6a50b16 commit 3ef57c3

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed

src/SignalR/clients/ts/signalr/src/WebSocketTransport.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export class WebSocketTransport implements ITransport {
4949
url = url.replace(/^http/, "ws");
5050
let webSocket: WebSocket | undefined;
5151
const cookies = this.httpClient.getCookieString(url);
52+
let opened = false;
5253

5354
if (Platform.isNode && cookies) {
5455
// Only pass cookies when in non-browser environments
@@ -72,6 +73,7 @@ export class WebSocketTransport implements ITransport {
7273
webSocket.onopen = (_event: Event) => {
7374
this.logger.log(LogLevel.Information, `WebSocket connected to ${url}.`);
7475
this.webSocket = webSocket;
76+
opened = true;
7577
resolve();
7678
};
7779

@@ -94,7 +96,21 @@ export class WebSocketTransport implements ITransport {
9496
}
9597
};
9698

97-
webSocket.onclose = (event: CloseEvent) => this.close(event);
99+
webSocket.onclose = (event: CloseEvent) => {
100+
if (opened) {
101+
this.close(event);
102+
} else {
103+
let error: any = null;
104+
// ErrorEvent is a browser only type we need to check if the type exists before using it
105+
if (typeof ErrorEvent !== "undefined" && event instanceof ErrorEvent) {
106+
error = event.error;
107+
} else {
108+
error = new Error("There was an error with the transport.");
109+
}
110+
111+
reject(error);
112+
}
113+
};
98114
});
99115
}
100116

src/SignalR/clients/ts/signalr/tests/ServerSentEventsTransport.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,28 @@ describe("ServerSentEventsTransport", () => {
4545
});
4646
});
4747

48+
it("connect failure does not call onclose handler", async () => {
49+
await VerifyLogger.run(async (logger) => {
50+
const sse = new ServerSentEventsTransport(new TestHttpClient(), undefined, logger, true, TestEventSource);
51+
let closeCalled = false;
52+
sse.onclose = () => closeCalled = true;
53+
54+
const connectPromise = (async () => {
55+
await sse.connect("http://example.com", TransferFormat.Text);
56+
})();
57+
58+
await TestEventSource.eventSource.openSet;
59+
60+
TestEventSource.eventSource.onerror(new TestMessageEvent());
61+
62+
try {
63+
await connectPromise;
64+
expect(false).toBe(true);
65+
} catch { }
66+
expect(closeCalled).toBe(false);
67+
});
68+
});
69+
4870
[["http://example.com", "http://example.com?access_token=secretToken"],
4971
["http://example.com?value=null", "http://example.com?value=null&access_token=secretToken"]]
5072
.forEach(([input, expected]) => {

src/SignalR/clients/ts/signalr/tests/WebSocketTransport.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,33 @@ describe("WebSocketTransport", () => {
6666
});
6767
});
6868

69+
it("connect failure does not call onclose handler", async () => {
70+
await VerifyLogger.run(async (logger) => {
71+
(global as any).ErrorEvent = TestErrorEvent;
72+
const webSocket = new WebSocketTransport(new TestHttpClient(), undefined, logger, true, TestWebSocket);
73+
let closeCalled = false;
74+
webSocket.onclose = () => closeCalled = true;
75+
76+
let connectComplete: boolean = false;
77+
const connectPromise = (async () => {
78+
await webSocket.connect("http://example.com", TransferFormat.Text);
79+
connectComplete = true;
80+
})();
81+
82+
await TestWebSocket.webSocket.closeSet;
83+
84+
expect(connectComplete).toBe(false);
85+
86+
TestWebSocket.webSocket.onclose(new TestEvent());
87+
88+
await expect(connectPromise)
89+
.rejects
90+
.toThrow("There was an error with the transport.");
91+
expect(connectComplete).toBe(false);
92+
expect(closeCalled).toBe(false);
93+
});
94+
});
95+
6996
[["http://example.com", "ws://example.com?access_token=secretToken"],
7097
["http://example.com?value=null", "ws://example.com?value=null&access_token=secretToken"],
7198
["https://example.com?value=null", "wss://example.com?value=null&access_token=secretToken"]]

0 commit comments

Comments
 (0)