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
This commit is contained in:
Florent Vilmart
2016-10-28 12:06:35 -04:00
committed by GitHub
parent f23c0a57ee
commit 23b77f7261
7 changed files with 92 additions and 30 deletions

View File

@@ -1,4 +1,4 @@
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
describe('EventEmitterPubSub', function() { describe('EventEmitterPubSub', function() {
it('can publish and subscribe', function() { it('can publish and subscribe', function() {

View File

@@ -8,13 +8,13 @@ describe('ParsePubSub', function() {
createPublisher: jasmine.createSpy('createPublisherRedis'), createPublisher: jasmine.createSpy('createPublisherRedis'),
createSubscriber: jasmine.createSpy('createSubscriberRedis') createSubscriber: jasmine.createSpy('createSubscriberRedis')
}; };
jasmine.mockLibrary('../src/LiveQuery/RedisPubSub', 'RedisPubSub', mockRedisPubSub); jasmine.mockLibrary('../src/Adapters/PubSub/RedisPubSub', 'RedisPubSub', mockRedisPubSub);
// Mock EventEmitterPubSub // Mock EventEmitterPubSub
var mockEventEmitterPubSub = { var mockEventEmitterPubSub = {
createPublisher: jasmine.createSpy('createPublisherEventEmitter'), createPublisher: jasmine.createSpy('createPublisherEventEmitter'),
createSubscriber: jasmine.createSpy('createSubscriberEventEmitter') createSubscriber: jasmine.createSpy('createSubscriberEventEmitter')
}; };
jasmine.mockLibrary('../src/LiveQuery/EventEmitterPubSub', 'EventEmitterPubSub', mockEventEmitterPubSub); jasmine.mockLibrary('../src/Adapters/PubSub/EventEmitterPubSub', 'EventEmitterPubSub', mockEventEmitterPubSub);
done(); done();
}); });
@@ -23,17 +23,17 @@ describe('ParsePubSub', function() {
redisURL: 'redisURL' redisURL: 'redisURL'
}); });
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
expect(RedisPubSub.createPublisher).toHaveBeenCalledWith('redisURL'); expect(RedisPubSub.createPublisher).toHaveBeenCalledWith({redisURL: 'redisURL'});
expect(EventEmitterPubSub.createPublisher).not.toHaveBeenCalled(); expect(EventEmitterPubSub.createPublisher).not.toHaveBeenCalled();
}); });
it('can create event emitter publisher', function() { it('can create event emitter publisher', function() {
var publisher = ParsePubSub.createPublisher({}); var publisher = ParsePubSub.createPublisher({});
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
expect(RedisPubSub.createPublisher).not.toHaveBeenCalled(); expect(RedisPubSub.createPublisher).not.toHaveBeenCalled();
expect(EventEmitterPubSub.createPublisher).toHaveBeenCalled(); expect(EventEmitterPubSub.createPublisher).toHaveBeenCalled();
}); });
@@ -43,23 +43,73 @@ describe('ParsePubSub', function() {
redisURL: 'redisURL' redisURL: 'redisURL'
}); });
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
expect(RedisPubSub.createSubscriber).toHaveBeenCalledWith('redisURL'); expect(RedisPubSub.createSubscriber).toHaveBeenCalledWith({redisURL: 'redisURL'});
expect(EventEmitterPubSub.createSubscriber).not.toHaveBeenCalled(); expect(EventEmitterPubSub.createSubscriber).not.toHaveBeenCalled();
}); });
it('can create event emitter subscriber', function() { it('can create event emitter subscriber', function() {
var subscriptionInfos = ParsePubSub.createSubscriber({}); var subscriptionInfos = ParsePubSub.createSubscriber({});
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
expect(RedisPubSub.createSubscriber).not.toHaveBeenCalled(); expect(RedisPubSub.createSubscriber).not.toHaveBeenCalled();
expect(EventEmitterPubSub.createSubscriber).toHaveBeenCalled(); expect(EventEmitterPubSub.createSubscriber).toHaveBeenCalled();
}); });
it('can create publisher/sub with custom adapter', function() {
let adapter = {
createPublisher: jasmine.createSpy('createPublisher'),
createSubscriber: jasmine.createSpy('createSubscriber')
}
ParsePubSub.createPublisher({
pubSubAdapter: adapter
});
expect(adapter.createPublisher).toHaveBeenCalled();
ParsePubSub.createSubscriber({
pubSubAdapter: adapter
});
expect(adapter.createSubscriber).toHaveBeenCalled();
var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
expect(RedisPubSub.createSubscriber).not.toHaveBeenCalled();
expect(EventEmitterPubSub.createSubscriber).not.toHaveBeenCalled();
expect(RedisPubSub.createPublisher).not.toHaveBeenCalled();
expect(EventEmitterPubSub.createPublisher).not.toHaveBeenCalled();
});
it('can create publisher/sub with custom function adapter', function() {
let adapter = {
createPublisher: jasmine.createSpy('createPublisher'),
createSubscriber: jasmine.createSpy('createSubscriber')
}
ParsePubSub.createPublisher({
pubSubAdapter: function() {
return adapter;
}
});
expect(adapter.createPublisher).toHaveBeenCalled();
ParsePubSub.createSubscriber({
pubSubAdapter: function() {
return adapter;
}
});
expect(adapter.createSubscriber).toHaveBeenCalled();
var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub;
expect(RedisPubSub.createSubscriber).not.toHaveBeenCalled();
expect(EventEmitterPubSub.createSubscriber).not.toHaveBeenCalled();
expect(RedisPubSub.createPublisher).not.toHaveBeenCalled();
expect(EventEmitterPubSub.createPublisher).not.toHaveBeenCalled();
});
afterEach(function(){ afterEach(function(){
jasmine.restoreLibrary('../src/LiveQuery/RedisPubSub', 'RedisPubSub'); jasmine.restoreLibrary('../src/Adapters/PubSub/RedisPubSub', 'RedisPubSub');
jasmine.restoreLibrary('../src/LiveQuery/EventEmitterPubSub', 'EventEmitterPubSub'); jasmine.restoreLibrary('../src/Adapters/PubSub/EventEmitterPubSub', 'EventEmitterPubSub');
}); });
}); });

View File

@@ -1,4 +1,4 @@
var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub;
describe('RedisPubSub', function() { describe('RedisPubSub', function() {
@@ -10,14 +10,14 @@ describe('RedisPubSub', function() {
}); });
it('can create publisher', function() { it('can create publisher', function() {
var publisher = RedisPubSub.createPublisher('redisAddress'); var publisher = RedisPubSub.createPublisher({redisURL: 'redisAddress'});
var redis = require('redis'); var redis = require('redis');
expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { no_ready_check: true }); expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { no_ready_check: true });
}); });
it('can create subscriber', function() { it('can create subscriber', function() {
var subscriber = RedisPubSub.createSubscriber('redisAddress'); var subscriber = RedisPubSub.createSubscriber({redisURL: 'redisAddress'});
var redis = require('redis'); var redis = require('redis');
expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { no_ready_check: true }); expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { no_ready_check: true });

View File

@@ -1,14 +1,14 @@
import redis from 'redis'; import redis from 'redis';
function createPublisher(redisURL: string): any { function createPublisher({redisURL}): any {
return redis.createClient(redisURL, { no_ready_check: true }); return redis.createClient(redisURL, { no_ready_check: true });
} }
function createSubscriber(redisURL: string): any { function createSubscriber({redisURL}): any {
return redis.createClient(redisURL, { no_ready_check: true }); return redis.createClient(redisURL, { no_ready_check: true });
} }
let RedisPubSub = { const RedisPubSub = {
createPublisher, createPublisher,
createSubscriber createSubscriber
} }

View File

@@ -54,9 +54,7 @@ class ParseLiveQueryServer {
); );
// Initialize subscriber // Initialize subscriber
this.subscriber = ParsePubSub.createSubscriber({ this.subscriber = ParsePubSub.createSubscriber(config);
redisURL: config.redisURL
});
this.subscriber.subscribe('afterSave'); this.subscriber.subscribe('afterSave');
this.subscriber.subscribe('afterDelete'); this.subscriber.subscribe('afterDelete');
// Register message handler for subscriber. When publisher get messages, it will publish message // Register message handler for subscriber. When publisher get messages, it will publish message

View File

@@ -1,5 +1,11 @@
import { RedisPubSub } from './RedisPubSub'; import { loadAdapter } from '../Adapters/AdapterLoader';
import { EventEmitterPubSub } from './EventEmitterPubSub'; import {
EventEmitterPubSub
} from '../Adapters/PubSub/EventEmitterPubSub';
import {
RedisPubSub
} from '../Adapters/PubSub/RedisPubSub';
let ParsePubSub = {}; let ParsePubSub = {};
@@ -10,17 +16,25 @@ function useRedis(config: any): boolean {
ParsePubSub.createPublisher = function(config: any): any { ParsePubSub.createPublisher = function(config: any): any {
if (useRedis(config)) { if (useRedis(config)) {
return RedisPubSub.createPublisher(config.redisURL); return RedisPubSub.createPublisher(config);
} else { } else {
return EventEmitterPubSub.createPublisher(); let adapter = loadAdapter(config.pubSubAdapter, EventEmitterPubSub, config)
if (typeof adapter.createPublisher !== 'function') {
throw 'pubSubAdapter should have createPublisher()';
}
return adapter.createPublisher(config);
} }
} }
ParsePubSub.createSubscriber = function(config: any): void { ParsePubSub.createSubscriber = function(config: any): void {
if (useRedis(config)) { if (useRedis(config)) {
return RedisPubSub.createSubscriber(config.redisURL); return RedisPubSub.createSubscriber(config);
} else { } else {
return EventEmitterPubSub.createSubscriber(); let adapter = loadAdapter(config.pubSubAdapter, EventEmitterPubSub, config)
if (typeof adapter.createSubscriber !== 'function') {
throw 'pubSubAdapter should have createSubscriber()';
}
return adapter.createSubscriber(config);
} }
} }