Skip to content

Commit 23b77f7

Browse files
authored
Live query pubsub adapter (#2902)
* Moves LiveQuery pub/sub to adapter folder * Adds ability to provide custom adapter for LiveQuery pubsub * Adds test for function based adapter * Pass all options to createSubscriber * nits
1 parent f23c0a5 commit 23b77f7

File tree

7 files changed

+92
-30
lines changed

7 files changed

+92
-30
lines changed

spec/EventEmitterPubSub.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub;
1+
var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
22

33
describe('EventEmitterPubSub', function() {
44
it('can publish and subscribe', function() {

spec/ParsePubSub.spec.js

Lines changed: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ describe('ParsePubSub', function() {
88
createPublisher: jasmine.createSpy('createPublisherRedis'),
99
createSubscriber: jasmine.createSpy('createSubscriberRedis')
1010
};
11-
jasmine.mockLibrary('../src/LiveQuery/RedisPubSub', 'RedisPubSub', mockRedisPubSub);
11+
jasmine.mockLibrary('../src/Adapters/PubSub/RedisPubSub', 'RedisPubSub', mockRedisPubSub);
1212
// Mock EventEmitterPubSub
1313
var mockEventEmitterPubSub = {
1414
createPublisher: jasmine.createSpy('createPublisherEventEmitter'),
1515
createSubscriber: jasmine.createSpy('createSubscriberEventEmitter')
1616
};
17-
jasmine.mockLibrary('../src/LiveQuery/EventEmitterPubSub', 'EventEmitterPubSub', mockEventEmitterPubSub);
17+
jasmine.mockLibrary('../src/Adapters/PubSub/EventEmitterPubSub', 'EventEmitterPubSub', mockEventEmitterPubSub);
1818
done();
1919
});
2020

@@ -23,17 +23,17 @@ describe('ParsePubSub', function() {
2323
redisURL: 'redisURL'
2424
});
2525

26-
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub;
27-
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub;
28-
expect(RedisPubSub.createPublisher).toHaveBeenCalledWith('redisURL');
26+
var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
27+
var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
28+
expect(RedisPubSub.createPublisher).toHaveBeenCalledWith({redisURL: 'redisURL'});
2929
expect(EventEmitterPubSub.createPublisher).not.toHaveBeenCalled();
3030
});
3131

3232
it('can create event emitter publisher', function() {
3333
var publisher = ParsePubSub.createPublisher({});
3434

35-
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub;
36-
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub;
35+
var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
36+
var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
3737
expect(RedisPubSub.createPublisher).not.toHaveBeenCalled();
3838
expect(EventEmitterPubSub.createPublisher).toHaveBeenCalled();
3939
});
@@ -43,23 +43,73 @@ describe('ParsePubSub', function() {
4343
redisURL: 'redisURL'
4444
});
4545

46-
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub;
47-
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub;
48-
expect(RedisPubSub.createSubscriber).toHaveBeenCalledWith('redisURL');
46+
var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
47+
var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
48+
expect(RedisPubSub.createSubscriber).toHaveBeenCalledWith({redisURL: 'redisURL'});
4949
expect(EventEmitterPubSub.createSubscriber).not.toHaveBeenCalled();
5050
});
5151

5252
it('can create event emitter subscriber', function() {
5353
var subscriptionInfos = ParsePubSub.createSubscriber({});
5454

55-
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub;
56-
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub;
55+
var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
56+
var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
5757
expect(RedisPubSub.createSubscriber).not.toHaveBeenCalled();
5858
expect(EventEmitterPubSub.createSubscriber).toHaveBeenCalled();
5959
});
6060

61+
it('can create publisher/sub with custom adapter', function() {
62+
let adapter = {
63+
createPublisher: jasmine.createSpy('createPublisher'),
64+
createSubscriber: jasmine.createSpy('createSubscriber')
65+
}
66+
ParsePubSub.createPublisher({
67+
pubSubAdapter: adapter
68+
});
69+
expect(adapter.createPublisher).toHaveBeenCalled();
70+
71+
ParsePubSub.createSubscriber({
72+
pubSubAdapter: adapter
73+
});
74+
expect(adapter.createSubscriber).toHaveBeenCalled();
75+
76+
var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
77+
var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
78+
expect(RedisPubSub.createSubscriber).not.toHaveBeenCalled();
79+
expect(EventEmitterPubSub.createSubscriber).not.toHaveBeenCalled();
80+
expect(RedisPubSub.createPublisher).not.toHaveBeenCalled();
81+
expect(EventEmitterPubSub.createPublisher).not.toHaveBeenCalled();
82+
});
83+
84+
it('can create publisher/sub with custom function adapter', function() {
85+
let adapter = {
86+
createPublisher: jasmine.createSpy('createPublisher'),
87+
createSubscriber: jasmine.createSpy('createSubscriber')
88+
}
89+
ParsePubSub.createPublisher({
90+
pubSubAdapter: function() {
91+
return adapter;
92+
}
93+
});
94+
expect(adapter.createPublisher).toHaveBeenCalled();
95+
96+
ParsePubSub.createSubscriber({
97+
pubSubAdapter: function() {
98+
return adapter;
99+
}
100+
});
101+
expect(adapter.createSubscriber).toHaveBeenCalled();
102+
103+
var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
104+
var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
105+
expect(RedisPubSub.createSubscriber).not.toHaveBeenCalled();
106+
expect(EventEmitterPubSub.createSubscriber).not.toHaveBeenCalled();
107+
expect(RedisPubSub.createPublisher).not.toHaveBeenCalled();
108+
expect(EventEmitterPubSub.createPublisher).not.toHaveBeenCalled();
109+
});
110+
61111
afterEach(function(){
62-
jasmine.restoreLibrary('../src/LiveQuery/RedisPubSub', 'RedisPubSub');
63-
jasmine.restoreLibrary('../src/LiveQuery/EventEmitterPubSub', 'EventEmitterPubSub');
112+
jasmine.restoreLibrary('../src/Adapters/PubSub/RedisPubSub', 'RedisPubSub');
113+
jasmine.restoreLibrary('../src/Adapters/PubSub/EventEmitterPubSub', 'EventEmitterPubSub');
64114
});
65115
});

spec/RedisPubSub.spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub;
1+
var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
22

33
describe('RedisPubSub', function() {
44

@@ -10,14 +10,14 @@ describe('RedisPubSub', function() {
1010
});
1111

1212
it('can create publisher', function() {
13-
var publisher = RedisPubSub.createPublisher('redisAddress');
13+
var publisher = RedisPubSub.createPublisher({redisURL: 'redisAddress'});
1414

1515
var redis = require('redis');
1616
expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { no_ready_check: true });
1717
});
1818

1919
it('can create subscriber', function() {
20-
var subscriber = RedisPubSub.createSubscriber('redisAddress');
20+
var subscriber = RedisPubSub.createSubscriber({redisURL: 'redisAddress'});
2121

2222
var redis = require('redis');
2323
expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { no_ready_check: true });

src/LiveQuery/RedisPubSub.js renamed to src/Adapters/PubSub/RedisPubSub.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import redis from 'redis';
22

3-
function createPublisher(redisURL: string): any {
3+
function createPublisher({redisURL}): any {
44
return redis.createClient(redisURL, { no_ready_check: true });
55
}
66

7-
function createSubscriber(redisURL: string): any {
7+
function createSubscriber({redisURL}): any {
88
return redis.createClient(redisURL, { no_ready_check: true });
99
}
1010

11-
let RedisPubSub = {
11+
const RedisPubSub = {
1212
createPublisher,
1313
createSubscriber
1414
}

src/LiveQuery/ParseLiveQueryServer.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,7 @@ class ParseLiveQueryServer {
5454
);
5555

5656
// Initialize subscriber
57-
this.subscriber = ParsePubSub.createSubscriber({
58-
redisURL: config.redisURL
59-
});
57+
this.subscriber = ParsePubSub.createSubscriber(config);
6058
this.subscriber.subscribe('afterSave');
6159
this.subscriber.subscribe('afterDelete');
6260
// Register message handler for subscriber. When publisher get messages, it will publish message

src/LiveQuery/ParsePubSub.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1-
import { RedisPubSub } from './RedisPubSub';
2-
import { EventEmitterPubSub } from './EventEmitterPubSub';
1+
import { loadAdapter } from '../Adapters/AdapterLoader';
2+
import {
3+
EventEmitterPubSub
4+
} from '../Adapters/PubSub/EventEmitterPubSub';
5+
6+
import {
7+
RedisPubSub
8+
} from '../Adapters/PubSub/RedisPubSub';
39

410
let ParsePubSub = {};
511

@@ -10,17 +16,25 @@ function useRedis(config: any): boolean {
1016

1117
ParsePubSub.createPublisher = function(config: any): any {
1218
if (useRedis(config)) {
13-
return RedisPubSub.createPublisher(config.redisURL);
19+
return RedisPubSub.createPublisher(config);
1420
} else {
15-
return EventEmitterPubSub.createPublisher();
21+
let adapter = loadAdapter(config.pubSubAdapter, EventEmitterPubSub, config)
22+
if (typeof adapter.createPublisher !== 'function') {
23+
throw 'pubSubAdapter should have createPublisher()';
24+
}
25+
return adapter.createPublisher(config);
1626
}
1727
}
1828

1929
ParsePubSub.createSubscriber = function(config: any): void {
2030
if (useRedis(config)) {
21-
return RedisPubSub.createSubscriber(config.redisURL);
31+
return RedisPubSub.createSubscriber(config);
2232
} else {
23-
return EventEmitterPubSub.createSubscriber();
33+
let adapter = loadAdapter(config.pubSubAdapter, EventEmitterPubSub, config)
34+
if (typeof adapter.createSubscriber !== 'function') {
35+
throw 'pubSubAdapter should have createSubscriber()';
36+
}
37+
return adapter.createSubscriber(config);
2438
}
2539
}
2640

0 commit comments

Comments
 (0)