Skip to content

Commit 3073b77

Browse files
committed
fix: allow Parse.Cloud.beforeSubscribe rejections to be caught by query.subscribe
1 parent ab5be44 commit 3073b77

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

integration/test/ParseLiveQueryTest.js

+27
Original file line numberDiff line numberDiff line change
@@ -256,4 +256,31 @@ describe('Parse LiveQuery', () => {
256256
object.set({ foo: 'bar' });
257257
await object.save();
258258
});
259+
260+
it('live query can handle beforeConnect and beforeSubscribe errors', async () => {
261+
const client = new Parse.LiveQueryClient({
262+
applicationId: 'integration',
263+
serverURL: 'ws://localhost:1337',
264+
javascriptKey: null,
265+
masterKey: null,
266+
sessionToken: null,
267+
installationId: null,
268+
});
269+
client.open();
270+
const query = new Parse.Query('TestError');
271+
let subscription = client.subscribe(query);
272+
await expectAsync(subscription.subscribePromise).toBeRejectedWith(
273+
new Parse.Error(141, 'not allowed to subscribe')
274+
);
275+
client.close();
276+
await reconfigureServer({
277+
cloud: `${__dirname}/cloud/before_connect.js`,
278+
});
279+
client.open();
280+
subscription = client.subscribe(query);
281+
await expectAsync(subscription.subscribePromise).toBeRejectedWith(
282+
new Parse.Error(141, 'not allowed to connect')
283+
);
284+
client.close();
285+
});
259286
});
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Parse.Cloud.beforeConnect(() => {
2+
throw 'not allowed to connect';
3+
});

integration/test/cloud/main.js

+4
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,7 @@ Parse.Cloud.job('CloudJob2', function () {
4848
Parse.Cloud.job('CloudJobFailing', function () {
4949
throw 'cloud job failed';
5050
});
51+
52+
Parse.Cloud.beforeSubscribe('TestError', () => {
53+
throw 'not allowed to subscribe';
54+
});

src/LiveQueryClient.js

+14-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import EventEmitter from './EventEmitter';
1414
import ParseObject from './ParseObject';
1515
import LiveQuerySubscription from './LiveQuerySubscription';
1616
import { resolvingPromise } from './promiseUtils';
17+
import ParseError from './ParseError';
1718

1819
// The LiveQuery client inner state
1920
const CLIENT_STATE = {
@@ -218,6 +219,10 @@ class LiveQueryClient extends EventEmitter {
218219
this.subscriptions.set(this.requestId, subscription);
219220
this.requestId += 1;
220221
this.connectPromise.then(() => {
222+
if (this.connectError) {
223+
subscription.subscribePromise.reject(this.connectError);
224+
return;
225+
}
221226
this.socket.send(JSON.stringify(subscribeRequest));
222227
});
223228

@@ -382,10 +387,16 @@ class LiveQueryClient extends EventEmitter {
382387
setTimeout(() => subscription.emit(SUBSCRIPTION_EMMITER_TYPES.OPEN, response), 200);
383388
}
384389
break;
385-
case OP_EVENTS.ERROR:
390+
case OP_EVENTS.ERROR: {
391+
const parseError = new ParseError(data.code, data.error);
392+
if (!this.id) {
393+
this.connectError = parseError;
394+
this.connectPromise.resolve();
395+
this.state = CLIENT_STATE.DISCONNECTED;
396+
}
386397
if (data.requestId) {
387398
if (subscription) {
388-
subscription.subscribePromise.resolve();
399+
subscription.subscribePromise.reject(parseError);
389400
setTimeout(() => subscription.emit(SUBSCRIPTION_EMMITER_TYPES.ERROR, data.error), 200);
390401
}
391402
} else {
@@ -398,6 +409,7 @@ class LiveQueryClient extends EventEmitter {
398409
this._handleReconnect();
399410
}
400411
break;
412+
}
401413
case OP_EVENTS.UNSUBSCRIBED:
402414
// We have already deleted subscription in unsubscribe(), do nothing here
403415
break;

0 commit comments

Comments
 (0)