Skip to content

Commit 6c20bab

Browse files
authored
LiveQuery Support for Subclasses (#662)
1 parent db3cc91 commit 6c20bab

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

src/LiveQueryClient.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -389,12 +389,10 @@ class LiveQueryClient extends EventEmitter {
389389
break;
390390
default: {
391391
// create, update, enter, leave, delete cases
392-
const className = data.object.className;
393-
// Delete the extrea __type and className fields during transfer to full JSON
392+
393+
// Does not override / clear server data
394394
delete data.object.__type;
395-
delete data.object.className;
396-
const parseObject = new ParseObject(className);
397-
parseObject._finishFetch(data.object);
395+
const parseObject = ParseObject.fromJSON(data.object, false);
398396
if (!subscription) {
399397
break;
400398
}

src/__tests__/LiveQueryClient-test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,4 +416,44 @@ describe('LiveQueryClient', () => {
416416
expect(liveQueryClient.socket.close).toBeCalled();
417417
expect(liveQueryClient.state).toBe('disconnected');
418418
});
419+
420+
it('can handle WebSocket subclass', () => {
421+
const MyExtendedClass = ParseObject.extend('MyExtendedClass');
422+
ParseObject.registerSubclass('MyExtendedClass', MyExtendedClass);
423+
424+
const liveQueryClient = new LiveQueryClient({
425+
applicationId: 'applicationId',
426+
serverURL: 'ws://test',
427+
javascriptKey: 'javascriptKey',
428+
masterKey: 'masterKey',
429+
sessionToken: 'sessionToken'
430+
});
431+
// Add mock subscription
432+
const subscription = new events.EventEmitter();
433+
liveQueryClient.subscriptions.set(1, subscription);
434+
const object = new MyExtendedClass();
435+
object.set('key', 'value');
436+
const data = {
437+
op: 'create',
438+
clientId: 1,
439+
requestId: 1,
440+
object: object._toFullJSON(),
441+
};
442+
const event = {
443+
data: JSON.stringify(data)
444+
}
445+
// Register checked in advance
446+
let isChecked = false;
447+
subscription.on('create', function(parseObject) {
448+
isChecked = true;
449+
expect(parseObject instanceof MyExtendedClass).toBe(true);
450+
expect(parseObject.get('key')).toEqual('value');
451+
expect(parseObject.get('className')).toBeUndefined();
452+
expect(parseObject.get('__type')).toBeUndefined();
453+
});
454+
455+
liveQueryClient._handleWebSocketMessage(event);
456+
457+
expect(isChecked).toBe(true);
458+
});
419459
});

0 commit comments

Comments
 (0)