Skip to content

Commit 967700b

Browse files
authored
fix: LiveQuery server is not shut down properly when handleShutdown is called (#8491)
1 parent 3ea1ace commit 967700b

File tree

5 files changed

+63
-4
lines changed

5 files changed

+63
-4
lines changed

spec/ParseLiveQuery.spec.js

+35
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
const Auth = require('../lib/Auth');
33
const UserController = require('../lib/Controllers/UserController').UserController;
44
const Config = require('../lib/Config');
5+
const ParseServer = require('../lib/index').ParseServer;
56
const triggers = require('../lib/triggers');
67
const validatorFail = () => {
78
throw 'you are not authorized';
@@ -1214,6 +1215,40 @@ describe('ParseLiveQuery', function () {
12141215
await object.save();
12151216
});
12161217

1218+
it('does shutdown liveQuery server', async () => {
1219+
await reconfigureServer({ appId: 'test_app_id' });
1220+
const config = {
1221+
appId: 'hello_test',
1222+
masterKey: 'world',
1223+
port: 1345,
1224+
mountPath: '/1',
1225+
serverURL: 'http://localhost:1345/1',
1226+
liveQuery: {
1227+
classNames: ['Yolo'],
1228+
},
1229+
startLiveQueryServer: true,
1230+
};
1231+
if (process.env.PARSE_SERVER_TEST_DB === 'postgres') {
1232+
config.databaseAdapter = new databaseAdapter.constructor({
1233+
uri: databaseURI,
1234+
collectionPrefix: 'test_',
1235+
});
1236+
config.filesAdapter = defaultConfiguration.filesAdapter;
1237+
}
1238+
const server = await ParseServer.startApp(config);
1239+
const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient();
1240+
client.serverURL = 'ws://localhost:1345/1';
1241+
const query = await new Parse.Query('Yolo').subscribe();
1242+
await Promise.all([
1243+
server.handleShutdown(),
1244+
new Promise(resolve => query.on('close', resolve)),
1245+
]);
1246+
await new Promise(resolve => setTimeout(resolve, 100));
1247+
expect(server.liveQueryServer.server.address()).toBeNull();
1248+
expect(server.liveQueryServer.subscriber.isOpen).toBeFalse();
1249+
await new Promise(resolve => server.server.close(resolve));
1250+
});
1251+
12171252
it('prevent afterSave trigger if not exists', async () => {
12181253
await reconfigureServer({
12191254
liveQuery: {

src/Adapters/Storage/Mongo/MongoStorageAdapter.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,12 @@ export class MongoStorageAdapter implements StorageAdapter {
212212
throw error;
213213
}
214214

215-
handleShutdown() {
215+
async handleShutdown() {
216216
if (!this.client) {
217-
return Promise.resolve();
217+
return;
218218
}
219-
return this.client.close(false);
219+
await this.client.close(false);
220+
delete this.connectionPromise;
220221
}
221222

222223
_adaptiveCollection(name: string) {

src/Adapters/Storage/Postgres/PostgresStorageAdapter.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1194,7 +1194,9 @@ export class PostgresStorageAdapter implements StorageAdapter {
11941194
const now = new Date().getTime();
11951195
const helpers = this._pgp.helpers;
11961196
debug('deleteAllClasses');
1197-
1197+
if (this._client?.$pool.ended) {
1198+
return;
1199+
}
11981200
await this._client
11991201
.task('delete-all-classes', async t => {
12001202
try {

src/LiveQuery/ParseLiveQueryServer.js

+15
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,21 @@ class ParseLiveQueryServer {
9393
}
9494
this._createSubscribers();
9595
}
96+
97+
async shutdown() {
98+
if (this.subscriber.isOpen) {
99+
await Promise.all([
100+
...[...this.clients.values()].map(client => client.parseWebSocket.ws.close()),
101+
this.parseWebSocketServer.close(),
102+
...Array.from(this.subscriber.subscriptions.keys()).map(key =>
103+
this.subscriber.unsubscribe(key)
104+
),
105+
this.subscriber.close?.(),
106+
]);
107+
}
108+
this.subscriber.isOpen = false;
109+
}
110+
96111
_createSubscribers() {
97112
const messageRecieved = (channel, messageStr) => {
98113
logger.verbose('Subscribe message %j', messageStr);

src/ParseServer.js

+6
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,12 @@ class ParseServer {
168168
if (cacheAdapter && typeof cacheAdapter.handleShutdown === 'function') {
169169
promises.push(cacheAdapter.handleShutdown());
170170
}
171+
if (this.liveQueryServer?.server?.close) {
172+
promises.push(new Promise(resolve => this.liveQueryServer.server.close(resolve)));
173+
}
174+
if (this.liveQueryServer) {
175+
promises.push(this.liveQueryServer.shutdown());
176+
}
171177
return (promises.length > 0 ? Promise.all(promises) : Promise.resolve()).then(() => {
172178
if (this.config.serverCloseComplete) {
173179
this.config.serverCloseComplete();

0 commit comments

Comments
 (0)