Skip to content

Commit 03caae1

Browse files
authored
fix: websocket connection of LiveQuery interrupts frequently (#8048)
1 parent 72fac8a commit 03caae1

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

Diff for: spec/ParseWebSocketServer.spec.js

+31
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,35 @@ describe('ParseWebSocketServer', function () {
7676
expect(wssError).toBe('Invalid Packet');
7777
});
7878

79+
it('can handle ping/pong', async () => {
80+
const onConnectCallback = jasmine.createSpy('onConnectCallback');
81+
const http = require('http');
82+
const server = http.createServer();
83+
const parseWebSocketServer = new ParseWebSocketServer(server, onConnectCallback, {
84+
websocketTimeout: 10,
85+
}).server;
86+
87+
const ws = new EventEmitter();
88+
ws.readyState = 0;
89+
ws.OPEN = 0;
90+
ws.ping = jasmine.createSpy('ping');
91+
ws.terminate = jasmine.createSpy('terminate');
92+
93+
parseWebSocketServer.onConnection(ws);
94+
95+
expect(onConnectCallback).toHaveBeenCalled();
96+
expect(ws.waitingForPong).toBe(false);
97+
await new Promise(resolve => setTimeout(resolve, 10));
98+
expect(ws.ping).toHaveBeenCalled();
99+
expect(ws.waitingForPong).toBe(true);
100+
ws.emit('pong');
101+
expect(ws.waitingForPong).toBe(false);
102+
await new Promise(resolve => setTimeout(resolve, 10));
103+
expect(ws.waitingForPong).toBe(true);
104+
expect(ws.terminate).not.toHaveBeenCalled();
105+
server.close();
106+
});
107+
79108
it('closes interrupted connection', async () => {
80109
const onConnectCallback = jasmine.createSpy('onConnectCallback');
81110
const http = require('http');
@@ -93,8 +122,10 @@ describe('ParseWebSocketServer', function () {
93122

94123
// Make sure callback is called
95124
expect(onConnectCallback).toHaveBeenCalled();
125+
expect(ws.waitingForPong).toBe(false);
96126
await new Promise(resolve => setTimeout(resolve, 10));
97127
expect(ws.ping).toHaveBeenCalled();
128+
expect(ws.waitingForPong).toBe(true);
98129
await new Promise(resolve => setTimeout(resolve, 10));
99130
expect(ws.terminate).toHaveBeenCalled();
100131
server.close();

Diff for: src/LiveQuery/ParseWebSocketServer.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export class ParseWebSocketServer {
1616
wss.onConnection = ws => {
1717
ws.waitingForPong = false;
1818
ws.on('pong', () => {
19-
this.waitingForPong = false;
19+
ws.waitingForPong = false;
2020
});
2121
ws.on('error', error => {
2222
logger.error(error.message);

0 commit comments

Comments
 (0)