fix: websocket connection of LiveQuery interrupts frequently (#8048)
This commit is contained in:
@@ -76,6 +76,35 @@ describe('ParseWebSocketServer', function () {
|
|||||||
expect(wssError).toBe('Invalid Packet');
|
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 () => {
|
it('closes interrupted connection', async () => {
|
||||||
const onConnectCallback = jasmine.createSpy('onConnectCallback');
|
const onConnectCallback = jasmine.createSpy('onConnectCallback');
|
||||||
const http = require('http');
|
const http = require('http');
|
||||||
@@ -93,8 +122,10 @@ describe('ParseWebSocketServer', function () {
|
|||||||
|
|
||||||
// Make sure callback is called
|
// Make sure callback is called
|
||||||
expect(onConnectCallback).toHaveBeenCalled();
|
expect(onConnectCallback).toHaveBeenCalled();
|
||||||
|
expect(ws.waitingForPong).toBe(false);
|
||||||
await new Promise(resolve => setTimeout(resolve, 10));
|
await new Promise(resolve => setTimeout(resolve, 10));
|
||||||
expect(ws.ping).toHaveBeenCalled();
|
expect(ws.ping).toHaveBeenCalled();
|
||||||
|
expect(ws.waitingForPong).toBe(true);
|
||||||
await new Promise(resolve => setTimeout(resolve, 10));
|
await new Promise(resolve => setTimeout(resolve, 10));
|
||||||
expect(ws.terminate).toHaveBeenCalled();
|
expect(ws.terminate).toHaveBeenCalled();
|
||||||
server.close();
|
server.close();
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export class ParseWebSocketServer {
|
|||||||
wss.onConnection = ws => {
|
wss.onConnection = ws => {
|
||||||
ws.waitingForPong = false;
|
ws.waitingForPong = false;
|
||||||
ws.on('pong', () => {
|
ws.on('pong', () => {
|
||||||
this.waitingForPong = false;
|
ws.waitingForPong = false;
|
||||||
});
|
});
|
||||||
ws.on('error', error => {
|
ws.on('error', error => {
|
||||||
logger.error(error.message);
|
logger.error(error.message);
|
||||||
|
|||||||
Reference in New Issue
Block a user