Skip to content

Commit

Permalink
fix: Live Query not working on Expo React Native (#2109)
Browse files Browse the repository at this point in the history
  • Loading branch information
dplewis committed Apr 15, 2024
1 parent a821777 commit 7a89665
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 7 deletions.
38 changes: 38 additions & 0 deletions integration/test/ParseLiveQueryTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const assert = require('assert');
const Parse = require('../../node');
const sleep = require('./sleep');
const { resolvingPromise } = require('../../lib/node/promiseUtils');
const { EventEmitter } = require('events');

describe('Parse LiveQuery', () => {
beforeEach(() => {
Expand Down Expand Up @@ -367,4 +368,41 @@ describe('Parse LiveQuery', () => {
client.state = 'closed';
await client.close();
});

it('can subscribe to query with EventEmitter private fields', async () => {
class CustomEmitter {
#privateEmitter;

constructor() {
this.#privateEmitter = new EventEmitter();
}
on(event, listener) {
this.#privateEmitter.on(event, listener);
}
emit(event, ...args) {
this.#privateEmitter.emit(event, ...args);
}
}

const EV = Parse.CoreManager.getEventEmitter();

Parse.CoreManager.setEventEmitter(CustomEmitter);
const object = new TestObject();
await object.save();
const installationId = await Parse.CoreManager.getInstallationController().currentInstallationId();

const query = new Parse.Query(TestObject);
query.equalTo('objectId', object.id);
const subscription = await query.subscribe();
const promise = resolvingPromise();
subscription.on('update', (object, original, response) => {
assert.equal(object.get('foo'), 'bar');
assert.equal(response.installationId, installationId);
promise.resolve();
});
object.set({ foo: 'bar' });
await object.save();
await promise;
Parse.CoreManager.setEventEmitter(EV);
});
});
4 changes: 2 additions & 2 deletions src/LiveQueryClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,8 @@ class LiveQueryClient {
const EventEmitter = CoreManager.getEventEmitter();
this.emitter = new EventEmitter();

this.on = this.emitter.on;
this.emit = this.emitter.emit;
this.on = (eventName, listener) => this.emitter.on(eventName, listener);
this.emit = (eventName, ...args) => this.emitter.emit(eventName, ...args);
// adding listener so process does not crash
// best practice is for developer to register their own listener
this.on('error', () => {});
Expand Down
4 changes: 2 additions & 2 deletions src/LiveQuerySubscription.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ class Subscription {
const EventEmitter = CoreManager.getEventEmitter();
this.emitter = new EventEmitter();

this.on = this.emitter.on;
this.emit = this.emitter.emit;
this.on = (eventName, listener) => this.emitter.on(eventName, listener);
this.emit = (eventName, ...args) => this.emitter.emit(eventName, ...args);
// adding listener so process does not crash
// best practice is for developer to register their own listener
this.on('error', () => {});
Expand Down
5 changes: 2 additions & 3 deletions src/ParseLiveQuery.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,8 @@ class LiveQuery {
constructor() {
const EventEmitter = CoreManager.getEventEmitter();
this.emitter = new EventEmitter();
this.on = this.emitter.on;
this.emit = this.emitter.emit;

this.on = (eventName, listener) => this.emitter.on(eventName, listener);
this.emit = (eventName, ...args) => this.emitter.emit(eventName, ...args);
// adding listener so process does not crash
// best practice is for developer to register their own listener
this.on('error', () => {});
Expand Down

0 comments on commit 7a89665

Please sign in to comment.