diff --git a/src/LiveQueryClient.js b/src/LiveQueryClient.js index 9904e3a61..0d41f2567 100644 --- a/src/LiveQueryClient.js +++ b/src/LiveQueryClient.js @@ -396,7 +396,11 @@ class LiveQueryClient extends EventEmitter { if (!subscription) { break; } - subscription.emit(data.op, parseObject); + if (data.original) { + delete data.original.__type; + data.original = ParseObject.fromJSON(data.original, false); + } + subscription.emit(data.op, parseObject, data.original); } } } diff --git a/src/LiveQuerySubscription.js b/src/LiveQuerySubscription.js index 3593bc74e..b2013a26b 100644 --- a/src/LiveQuerySubscription.js +++ b/src/LiveQuerySubscription.js @@ -37,22 +37,26 @@ import CoreManager from './CoreManager'; * * });
* - *Update Event - When an existing ParseObject which fulfills the ParseQuery you subscribe + *
Update Event - When an existing ParseObject (original) which fulfills the ParseQuery you subscribe * is updated (The ParseObject fulfills the ParseQuery before and after changes), * you'll get this event. The object is the ParseObject which is updated. * Its content is the latest value of the ParseObject. * + * Parse-Server 3.1.3+ Required for original object parameter + * *
- * subscription.on('update', (object) => { + * subscription.on('update', (object, original) => { * * });* - *
Enter Event - When an existing ParseObject's old value doesn't fulfill the ParseQuery + *
Enter Event - When an existing ParseObject's (original) old value doesn't fulfill the ParseQuery * but its new value fulfills the ParseQuery, you'll get this event. The object is the * ParseObject which enters the ParseQuery. Its content is the latest value of the ParseObject. * + * Parse-Server 3.1.3+ Required for original object parameter + * *
- * subscription.on('enter', (object) => { + * subscription.on('enter', (object, original) => { * * });* diff --git a/src/__tests__/LiveQueryClient-test.js b/src/__tests__/LiveQueryClient-test.js index 6c289d777..ad2afaa54 100644 --- a/src/__tests__/LiveQueryClient-test.js +++ b/src/__tests__/LiveQueryClient-test.js @@ -221,6 +221,49 @@ describe('LiveQueryClient', () => { expect(isChecked).toBe(true); }); + it('can handle WebSocket response with original', () => { + const liveQueryClient = new LiveQueryClient({ + applicationId: 'applicationId', + serverURL: 'ws://test', + javascriptKey: 'javascriptKey', + masterKey: 'masterKey', + sessionToken: 'sessionToken' + }); + // Add mock subscription + const subscription = new events.EventEmitter(); + liveQueryClient.subscriptions.set(1, subscription); + const object = new ParseObject('Test'); + const original = new ParseObject('Test'); + object.set('key', 'value'); + original.set('key', 'old'); + const data = { + op: 'update', + clientId: 1, + requestId: 1, + object: object._toFullJSON(), + original: original._toFullJSON(), + }; + const event = { + data: JSON.stringify(data) + } + // Register checked in advance + let isChecked = false; + subscription.on('update', (parseObject, parseOriginalObject) => { + isChecked = true; + expect(parseObject.get('key')).toEqual('value'); + expect(parseObject.get('className')).toBeUndefined(); + expect(parseObject.get('__type')).toBeUndefined(); + + expect(parseOriginalObject.get('key')).toEqual('old'); + expect(parseOriginalObject.get('className')).toBeUndefined(); + expect(parseOriginalObject.get('__type')).toBeUndefined(); + }); + + liveQueryClient._handleWebSocketMessage(event); + + expect(isChecked).toBe(true); + }); + it('can handle WebSocket close message', () => { const liveQueryClient = new LiveQueryClient({ applicationId: 'applicationId',