diff --git a/webapp/platform/client/src/websocket.test.ts b/webapp/platform/client/src/websocket.test.ts index 47eb291629..98785fb237 100644 --- a/webapp/platform/client/src/websocket.test.ts +++ b/webapp/platform/client/src/websocket.test.ts @@ -109,9 +109,11 @@ describe('websocketclient', () => { const client = new WebSocketClient({ newWebSocketFn: (url: string) => { mockWebSocket.url = url; - if (mockWebSocket.onopen) { - mockWebSocket.open(); - } + setTimeout(() => { + if (mockWebSocket.onopen) { + mockWebSocket.open(); + } + }, 1); return mockWebSocket; }, minWebSocketRetryTime: 50, @@ -120,7 +122,6 @@ describe('websocketclient', () => { const initializeSpy = jest.spyOn(client, 'initialize'); client.initialize('mock.url'); - mockWebSocket.open(); mockWebSocket.close(); jest.advanceTimersByTime(10); @@ -145,9 +146,11 @@ describe('websocketclient', () => { const client = new WebSocketClient({ newWebSocketFn: (url: string) => { mockWebSocket.url = url; - if (mockWebSocket.onopen) { - mockWebSocket.open(); - } + setTimeout(() => { + if (mockWebSocket.onopen) { + mockWebSocket.open(); + } + }, 1); return mockWebSocket; }, minWebSocketRetryTime: 50, @@ -156,7 +159,6 @@ describe('websocketclient', () => { const initializeSpy = jest.spyOn(client, 'initialize'); client.initialize('mock.url'); - mockWebSocket.open(); mockWebSocket.close(); jest.advanceTimersByTime(10); @@ -183,9 +185,11 @@ describe('websocketclient', () => { const client = new WebSocketClient({ newWebSocketFn: (url: string) => { mockWebSocket.url = url; - if (mockWebSocket.onopen) { - mockWebSocket.open(); - } + setTimeout(() => { + if (mockWebSocket.onopen) { + mockWebSocket.open(); + } + }, 1); return mockWebSocket; }, minWebSocketRetryTime: 50, @@ -194,7 +198,6 @@ describe('websocketclient', () => { const initializeSpy = jest.spyOn(client, 'initialize'); client.initialize('mock.url'); - mockWebSocket.open(); mockWebSocket.close(); jest.advanceTimersByTime(10); @@ -217,9 +220,11 @@ describe('websocketclient', () => { const client = new WebSocketClient({ newWebSocketFn: (url: string) => { mockWebSocket.url = url; - if (mockWebSocket.onopen) { - mockWebSocket.open(); - } + setTimeout(() => { + if (mockWebSocket.onopen) { + mockWebSocket.open(); + } + }, 1); return mockWebSocket; }, minWebSocketRetryTime: 1, @@ -252,7 +257,6 @@ describe('websocketclient', () => { const closeSpy = jest.spyOn(mockWebSocket, 'close'); client.initialize('mock.url'); - mockWebSocket.open(); jest.advanceTimersByTime(30); @@ -273,9 +277,11 @@ describe('websocketclient', () => { const client = new WebSocketClient({ newWebSocketFn: (url: string) => { mockWebSocket.url = url; - if (mockWebSocket.onopen) { - mockWebSocket.open(); - } + setTimeout(() => { + if (mockWebSocket.onopen) { + mockWebSocket.open(); + } + }, 1); return mockWebSocket; }, minWebSocketRetryTime: 1, @@ -321,7 +327,6 @@ describe('websocketclient', () => { }); client.initialize('mock.url'); - mockWebSocket.open(); jest.advanceTimersByTime(30); @@ -342,9 +347,11 @@ describe('websocketclient', () => { const client = new WebSocketClient({ newWebSocketFn: (url: string) => { mockWebSocket.url = url; - if (mockWebSocket.onopen) { - mockWebSocket.open(); - } + setTimeout(() => { + if (mockWebSocket.onopen) { + mockWebSocket.open(); + } + }, 1); return mockWebSocket; }, minWebSocketRetryTime: 1, @@ -362,8 +369,8 @@ describe('websocketclient', () => { } numPings++; - // don't respond to first ping - if (numPings === 1) { + // don't respond to second ping + if (numPings === 2) { return; } @@ -382,12 +389,20 @@ describe('websocketclient', () => { const closeSpy = jest.spyOn(mockWebSocket, 'close'); client.initialize('mock.url'); - mockWebSocket.open(); // Let first ping happen - jest.advanceTimersByTime(25); + jest.advanceTimersByTime(10); expect(numPings).toBe(1); - expect(numPongs).toBe(0); + expect(numPongs).toBe(1); + + // Let second ping happen + jest.advanceTimersByTime(10); + expect(numPings).toBe(2); + expect(numPongs).toBe(1); + + // Ensure we've still only connected once, and haven't disconnected, yet + expect(openSpy).toHaveBeenCalledTimes(1); + expect(closeSpy).toHaveBeenCalledTimes(0); // Close and reopen connection before ping timeout mockWebSocket.close(); @@ -396,7 +411,7 @@ describe('websocketclient', () => { jest.advanceTimersByTime(100); client.close(); - expect(numPings).toBe(7); + expect(numPings).toBe(9); expect(numPongs).toBe(numPings - 1); // Ensure we only skipped the first response expect(openSpy).toHaveBeenCalledTimes(2); // Initial open and one reconnect expect(closeSpy).toHaveBeenCalledTimes(2); // Manual close and final close diff --git a/webapp/platform/client/src/websocket.ts b/webapp/platform/client/src/websocket.ts index 6401670c0e..1a20161a0c 100644 --- a/webapp/platform/client/src/websocket.ts +++ b/webapp/platform/client/src/websocket.ts @@ -162,7 +162,15 @@ export default class WebSocketClient { } this.stopPingInterval(); - var waitingForPong = false; + + // Send a ping immediately to test the socket + var waitingForPong = true; + this.ping(() => { + waitingForPong = false; + }); + + // And every 30 seconds after, checking to ensure + // we're getting responses from the server this.pingInterval = setInterval( () => { if (!waitingForPong) {