diff --git a/spec/ParseWebSocketServer.spec.js b/spec/ParseWebSocketServer.spec.js index 4eb73695d1..5955ee3241 100644 --- a/spec/ParseWebSocketServer.spec.js +++ b/spec/ParseWebSocketServer.spec.js @@ -76,6 +76,35 @@ describe('ParseWebSocketServer', function () { expect(wssError).toBe('Invalid Packet'); }); + it('can handle ping/pong', async () => { + const onConnectCallback = jasmine.createSpy('onConnectCallback'); + const http = require('http'); + const server = http.createServer(); + const parseWebSocketServer = new ParseWebSocketServer(server, onConnectCallback, { + websocketTimeout: 10, + }).server; + + const ws = new EventEmitter(); + ws.readyState = 0; + ws.OPEN = 0; + ws.ping = jasmine.createSpy('ping'); + ws.terminate = jasmine.createSpy('terminate'); + + parseWebSocketServer.onConnection(ws); + + expect(onConnectCallback).toHaveBeenCalled(); + expect(ws.waitingForPong).toBe(false); + await new Promise(resolve => setTimeout(resolve, 10)); + expect(ws.ping).toHaveBeenCalled(); + expect(ws.waitingForPong).toBe(true); + ws.emit('pong'); + expect(ws.waitingForPong).toBe(false); + await new Promise(resolve => setTimeout(resolve, 10)); + expect(ws.waitingForPong).toBe(true); + expect(ws.terminate).not.toHaveBeenCalled(); + server.close(); + }); + it('closes interrupted connection', async () => { const onConnectCallback = jasmine.createSpy('onConnectCallback'); const http = require('http'); @@ -93,8 +122,10 @@ describe('ParseWebSocketServer', function () { // Make sure callback is called expect(onConnectCallback).toHaveBeenCalled(); + expect(ws.waitingForPong).toBe(false); await new Promise(resolve => setTimeout(resolve, 10)); expect(ws.ping).toHaveBeenCalled(); + expect(ws.waitingForPong).toBe(true); await new Promise(resolve => setTimeout(resolve, 10)); expect(ws.terminate).toHaveBeenCalled(); server.close(); diff --git a/src/LiveQuery/ParseWebSocketServer.js b/src/LiveQuery/ParseWebSocketServer.js index b8c66673ab..927ee4b275 100644 --- a/src/LiveQuery/ParseWebSocketServer.js +++ b/src/LiveQuery/ParseWebSocketServer.js @@ -16,7 +16,7 @@ export class ParseWebSocketServer { wss.onConnection = ws => { ws.waitingForPong = false; ws.on('pong', () => { - this.waitingForPong = false; + ws.waitingForPong = false; }); ws.on('error', error => { logger.error(error.message);