diff --git a/spec/EventEmitterPubSub.spec.js b/spec/EventEmitterPubSub.spec.js index c457215b..c786c81c 100644 --- a/spec/EventEmitterPubSub.spec.js +++ b/spec/EventEmitterPubSub.spec.js @@ -1,4 +1,4 @@ -var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; +var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub; describe('EventEmitterPubSub', function() { it('can publish and subscribe', function() { diff --git a/spec/ParsePubSub.spec.js b/spec/ParsePubSub.spec.js index 3cf67644..71bbca5c 100644 --- a/spec/ParsePubSub.spec.js +++ b/spec/ParsePubSub.spec.js @@ -8,13 +8,13 @@ describe('ParsePubSub', function() { createPublisher: jasmine.createSpy('createPublisherRedis'), createSubscriber: jasmine.createSpy('createSubscriberRedis') }; - jasmine.mockLibrary('../src/LiveQuery/RedisPubSub', 'RedisPubSub', mockRedisPubSub); + jasmine.mockLibrary('../src/Adapters/PubSub/RedisPubSub', 'RedisPubSub', mockRedisPubSub); // Mock EventEmitterPubSub var mockEventEmitterPubSub = { createPublisher: jasmine.createSpy('createPublisherEventEmitter'), createSubscriber: jasmine.createSpy('createSubscriberEventEmitter') }; - jasmine.mockLibrary('../src/LiveQuery/EventEmitterPubSub', 'EventEmitterPubSub', mockEventEmitterPubSub); + jasmine.mockLibrary('../src/Adapters/PubSub/EventEmitterPubSub', 'EventEmitterPubSub', mockEventEmitterPubSub); done(); }); @@ -23,17 +23,17 @@ describe('ParsePubSub', function() { redisURL: 'redisURL' }); - var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; - var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; - expect(RedisPubSub.createPublisher).toHaveBeenCalledWith('redisURL'); + var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub; + var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub; + expect(RedisPubSub.createPublisher).toHaveBeenCalledWith({redisURL: 'redisURL'}); expect(EventEmitterPubSub.createPublisher).not.toHaveBeenCalled(); }); it('can create event emitter publisher', function() { var publisher = ParsePubSub.createPublisher({}); - var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; - var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; + var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub; + var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub; expect(RedisPubSub.createPublisher).not.toHaveBeenCalled(); expect(EventEmitterPubSub.createPublisher).toHaveBeenCalled(); }); @@ -43,23 +43,73 @@ describe('ParsePubSub', function() { redisURL: 'redisURL' }); - var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; - var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; - expect(RedisPubSub.createSubscriber).toHaveBeenCalledWith('redisURL'); + var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub; + var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub; + expect(RedisPubSub.createSubscriber).toHaveBeenCalledWith({redisURL: 'redisURL'}); expect(EventEmitterPubSub.createSubscriber).not.toHaveBeenCalled(); }); it('can create event emitter subscriber', function() { var subscriptionInfos = ParsePubSub.createSubscriber({}); - var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; - var EventEmitterPubSub = require('../src/LiveQuery/EventEmitterPubSub').EventEmitterPubSub; + var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub; + var EventEmitterPubSub = require('../src/Adapters/PubSub/EventEmitterPubSub').EventEmitterPubSub; expect(RedisPubSub.createSubscriber).not.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(){ - jasmine.restoreLibrary('../src/LiveQuery/RedisPubSub', 'RedisPubSub'); - jasmine.restoreLibrary('../src/LiveQuery/EventEmitterPubSub', 'EventEmitterPubSub'); + jasmine.restoreLibrary('../src/Adapters/PubSub/RedisPubSub', 'RedisPubSub'); + jasmine.restoreLibrary('../src/Adapters/PubSub/EventEmitterPubSub', 'EventEmitterPubSub'); }); }); diff --git a/spec/RedisPubSub.spec.js b/spec/RedisPubSub.spec.js index 097a678d..5e5684f7 100644 --- a/spec/RedisPubSub.spec.js +++ b/spec/RedisPubSub.spec.js @@ -1,4 +1,4 @@ -var RedisPubSub = require('../src/LiveQuery/RedisPubSub').RedisPubSub; +var RedisPubSub = require('../src/Adapters/PubSub/RedisPubSub').RedisPubSub; describe('RedisPubSub', function() { @@ -10,14 +10,14 @@ describe('RedisPubSub', function() { }); it('can create publisher', function() { - var publisher = RedisPubSub.createPublisher('redisAddress'); + var publisher = RedisPubSub.createPublisher({redisURL: 'redisAddress'}); var redis = require('redis'); expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { no_ready_check: true }); }); it('can create subscriber', function() { - var subscriber = RedisPubSub.createSubscriber('redisAddress'); + var subscriber = RedisPubSub.createSubscriber({redisURL: 'redisAddress'}); var redis = require('redis'); expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { no_ready_check: true }); diff --git a/src/LiveQuery/EventEmitterPubSub.js b/src/Adapters/PubSub/EventEmitterPubSub.js similarity index 100% rename from src/LiveQuery/EventEmitterPubSub.js rename to src/Adapters/PubSub/EventEmitterPubSub.js diff --git a/src/LiveQuery/RedisPubSub.js b/src/Adapters/PubSub/RedisPubSub.js similarity index 65% rename from src/LiveQuery/RedisPubSub.js rename to src/Adapters/PubSub/RedisPubSub.js index 92e3d86e..7fb62dfc 100644 --- a/src/LiveQuery/RedisPubSub.js +++ b/src/Adapters/PubSub/RedisPubSub.js @@ -1,14 +1,14 @@ import redis from 'redis'; -function createPublisher(redisURL: string): any { +function createPublisher({redisURL}): any { 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 }); } -let RedisPubSub = { +const RedisPubSub = { createPublisher, createSubscriber } diff --git a/src/LiveQuery/ParseLiveQueryServer.js b/src/LiveQuery/ParseLiveQueryServer.js index 68b1c220..c44e1e4f 100644 --- a/src/LiveQuery/ParseLiveQueryServer.js +++ b/src/LiveQuery/ParseLiveQueryServer.js @@ -54,9 +54,7 @@ class ParseLiveQueryServer { ); // Initialize subscriber - this.subscriber = ParsePubSub.createSubscriber({ - redisURL: config.redisURL - }); + this.subscriber = ParsePubSub.createSubscriber(config); this.subscriber.subscribe('afterSave'); this.subscriber.subscribe('afterDelete'); // Register message handler for subscriber. When publisher get messages, it will publish message diff --git a/src/LiveQuery/ParsePubSub.js b/src/LiveQuery/ParsePubSub.js index d49d8566..46b510d0 100644 --- a/src/LiveQuery/ParsePubSub.js +++ b/src/LiveQuery/ParsePubSub.js @@ -1,5 +1,11 @@ -import { RedisPubSub } from './RedisPubSub'; -import { EventEmitterPubSub } from './EventEmitterPubSub'; +import { loadAdapter } from '../Adapters/AdapterLoader'; +import { + EventEmitterPubSub +} from '../Adapters/PubSub/EventEmitterPubSub'; + +import { + RedisPubSub +} from '../Adapters/PubSub/RedisPubSub'; let ParsePubSub = {}; @@ -10,17 +16,25 @@ function useRedis(config: any): boolean { ParsePubSub.createPublisher = function(config: any): any { if (useRedis(config)) { - return RedisPubSub.createPublisher(config.redisURL); + return RedisPubSub.createPublisher(config); } 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 { if (useRedis(config)) { - return RedisPubSub.createSubscriber(config.redisURL); + return RedisPubSub.createSubscriber(config); } 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); } }