Skip to content

Commit 7a89665

Browse files
authored
fix: Live Query not working on Expo React Native (#2109)
1 parent a821777 commit 7a89665

File tree

4 files changed

+44
-7
lines changed

4 files changed

+44
-7
lines changed

integration/test/ParseLiveQueryTest.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const assert = require('assert');
44
const Parse = require('../../node');
55
const sleep = require('./sleep');
66
const { resolvingPromise } = require('../../lib/node/promiseUtils');
7+
const { EventEmitter } = require('events');
78

89
describe('Parse LiveQuery', () => {
910
beforeEach(() => {
@@ -367,4 +368,41 @@ describe('Parse LiveQuery', () => {
367368
client.state = 'closed';
368369
await client.close();
369370
});
371+
372+
it('can subscribe to query with EventEmitter private fields', async () => {
373+
class CustomEmitter {
374+
#privateEmitter;
375+
376+
constructor() {
377+
this.#privateEmitter = new EventEmitter();
378+
}
379+
on(event, listener) {
380+
this.#privateEmitter.on(event, listener);
381+
}
382+
emit(event, ...args) {
383+
this.#privateEmitter.emit(event, ...args);
384+
}
385+
}
386+
387+
const EV = Parse.CoreManager.getEventEmitter();
388+
389+
Parse.CoreManager.setEventEmitter(CustomEmitter);
390+
const object = new TestObject();
391+
await object.save();
392+
const installationId = await Parse.CoreManager.getInstallationController().currentInstallationId();
393+
394+
const query = new Parse.Query(TestObject);
395+
query.equalTo('objectId', object.id);
396+
const subscription = await query.subscribe();
397+
const promise = resolvingPromise();
398+
subscription.on('update', (object, original, response) => {
399+
assert.equal(object.get('foo'), 'bar');
400+
assert.equal(response.installationId, installationId);
401+
promise.resolve();
402+
});
403+
object.set({ foo: 'bar' });
404+
await object.save();
405+
await promise;
406+
Parse.CoreManager.setEventEmitter(EV);
407+
});
370408
});

src/LiveQueryClient.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ class LiveQueryClient {
157157
const EventEmitter = CoreManager.getEventEmitter();
158158
this.emitter = new EventEmitter();
159159

160-
this.on = this.emitter.on;
161-
this.emit = this.emitter.emit;
160+
this.on = (eventName, listener) => this.emitter.on(eventName, listener);
161+
this.emit = (eventName, ...args) => this.emitter.emit(eventName, ...args);
162162
// adding listener so process does not crash
163163
// best practice is for developer to register their own listener
164164
this.on('error', () => {});

src/LiveQuerySubscription.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ class Subscription {
9999
const EventEmitter = CoreManager.getEventEmitter();
100100
this.emitter = new EventEmitter();
101101

102-
this.on = this.emitter.on;
103-
this.emit = this.emitter.emit;
102+
this.on = (eventName, listener) => this.emitter.on(eventName, listener);
103+
this.emit = (eventName, ...args) => this.emitter.emit(eventName, ...args);
104104
// adding listener so process does not crash
105105
// best practice is for developer to register their own listener
106106
this.on('error', () => {});

src/ParseLiveQuery.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ class LiveQuery {
3939
constructor() {
4040
const EventEmitter = CoreManager.getEventEmitter();
4141
this.emitter = new EventEmitter();
42-
this.on = this.emitter.on;
43-
this.emit = this.emitter.emit;
44-
42+
this.on = (eventName, listener) => this.emitter.on(eventName, listener);
43+
this.emit = (eventName, ...args) => this.emitter.emit(eventName, ...args);
4544
// adding listener so process does not crash
4645
// best practice is for developer to register their own listener
4746
this.on('error', () => {});

0 commit comments

Comments
 (0)