diff --git a/src/index.ts b/src/index.ts index 53793635..c581adc1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1 @@ -export {RedisPubSub} from './redis-pubsub'; +export { RedisPubSub } from './redis-pubsub'; diff --git a/src/pubsub-async-iterator.ts b/src/pubsub-async-iterator.ts index 7467ad91..009c1b66 100644 --- a/src/pubsub-async-iterator.ts +++ b/src/pubsub-async-iterator.ts @@ -1,5 +1,5 @@ import { $$asyncIterator } from 'iterall'; -import {PubSubEngine} from 'graphql-subscriptions/dist/pubsub-engine'; +import { PubSubEngine } from 'graphql-subscriptions/dist/pubsub-engine'; /** * A class for digesting PubSubEngine events via the new AsyncIterator interface. diff --git a/src/redis-pubsub.ts b/src/redis-pubsub.ts index 2c2814f1..fdc004a2 100644 --- a/src/redis-pubsub.ts +++ b/src/redis-pubsub.ts @@ -1,6 +1,6 @@ -import {PubSubEngine} from 'graphql-subscriptions/dist/pubsub-engine'; -import {createClient, RedisClient, ClientOpts as RedisOptions} from 'redis'; -import {PubSubAsyncIterator} from './pubsub-async-iterator'; +import { PubSubEngine } from 'graphql-subscriptions/dist/pubsub-engine'; +import { createClient, RedisClient, ClientOpts as RedisOptions } from 'redis'; +import { PubSubAsyncIterator } from './pubsub-async-iterator'; export interface PubSubRedisOptions { connection?: RedisOptions; @@ -114,8 +114,8 @@ export class RedisPubSub implements PubSubEngine { private redisSubscriber: RedisClient; private redisPublisher: RedisClient; - private subscriptionMap: {[subId: number]: [string , Function]}; - private subsRefsMap: {[trigger: string]: Array}; + private subscriptionMap: { [subId: number]: [string, Function] }; + private subsRefsMap: { [trigger: string]: Array }; private currentSubscriptionId: number; } diff --git a/src/test/benchmark.ts b/src/test/benchmark.ts index a840fa69..341cb819 100644 --- a/src/test/benchmark.ts +++ b/src/test/benchmark.ts @@ -8,8 +8,8 @@ import { GraphQLID, } from 'graphql'; -import {SubscriptionManager, PubSub} from 'graphql-subscriptions'; -import {RedisPubSub} from '../redis-pubsub'; +import { SubscriptionManager, PubSub } from 'graphql-subscriptions'; +import { RedisPubSub } from '../redis-pubsub'; const expect = chai.expect; @@ -120,7 +120,7 @@ describe('Benchmark EE PubSub', function () { const callback = () => publishesCounter++; for (let i = 0; i < numberOfSubscribers; i++) { - const promise = subManager.subscribe({query, operationName: 'X', callback}); + const promise = subManager.subscribe({ query, operationName: 'X', callback }); subsPromises.push(promise); } @@ -295,7 +295,7 @@ describe('Benchmark Redis PubSub', function () { const callback = () => publishesCounter++; for (let i = 0; i < numberOfSubscribers; i++) { - const promise = subManager.subscribe({query, operationName: 'X', callback}); + const promise = subManager.subscribe({ query, operationName: 'X', callback }); subsPromises.push(promise); } @@ -468,7 +468,7 @@ function testEventsPerSecond(eventsPerSec: number, eventPayload: any, subManager } }; - subManager.subscribe({query, operationName: 'X', callback}).then(id => { + subManager.subscribe({ query, operationName: 'X', callback }).then(id => { subId = id; start = Date.now(); for (let i = 0; i < eventsPerSec; i++) { @@ -504,7 +504,7 @@ function testMutationsPerSecond(mutationsPerSec: number, mutationPayload: any, s } }; - subManager.subscribe({query, operationName: 'X', callback}).then(id => { + subManager.subscribe({ query, operationName: 'X', callback }).then(id => { subId = id; start = Date.now(); for (let i = 0; i < mutationsPerSec; i++) { diff --git a/src/test/integration-tests.ts b/src/test/integration-tests.ts index 932ad223..768bfc8c 100644 --- a/src/test/integration-tests.ts +++ b/src/test/integration-tests.ts @@ -10,14 +10,14 @@ import { GraphQLBoolean, } from 'graphql'; -import {SubscriptionManager} from 'graphql-subscriptions'; -import {RedisPubSub} from '../redis-pubsub'; +import { SubscriptionManager } from 'graphql-subscriptions'; +import { RedisPubSub } from '../redis-pubsub'; chai.use(chaiAsPromised); const expect = chai.expect; const assert = chai.assert; -describe('SubscriptionManager', function() { +describe('SubscriptionManager', function () { const schema = new GraphQLSchema({ query: new GraphQLObjectType({ @@ -66,7 +66,7 @@ describe('SubscriptionManager', function() { return root; }, args: { - repoName: {type: GraphQLString}, + repoName: { type: GraphQLString }, }, }, }, @@ -78,34 +78,34 @@ describe('SubscriptionManager', function() { setupFunctions: { 'testFilter': (options, { filterBoolean }) => { return { - 'Filter1': {filter: (root) => root.filterBoolean === filterBoolean}, + 'Filter1': { filter: (root) => root.filterBoolean === filterBoolean }, }; }, 'testFilterMulti': (options) => { return { - 'Trigger1': {filter: () => true}, - 'Trigger2': {filter: () => true}, + 'Trigger1': { filter: () => true }, + 'Trigger2': { filter: () => true }, }; }, }, pubsub: new RedisPubSub(), }); - it('throws an error if query is not valid', function() { + it('throws an error if query is not valid', function () { const query = 'query a{ testInt }'; const callback = () => null; return expect(subManager.subscribe({ query, operationName: 'a', callback })) .to.eventually.be.rejectedWith('Subscription query has validation errors'); }); - it('rejects subscriptions with more than one root field', function() { + it('rejects subscriptions with more than one root field', function () { const query = 'subscription X{ a: testSubscription, b: testSubscription }'; const callback = () => null; return expect(subManager.subscribe({ query, operationName: 'X', callback })) .to.eventually.be.rejectedWith('Subscription query has validation errors'); }); - it('can subscribe with a valid query and gets a subId back', function() { + it('can subscribe with a valid query and gets a subId back', function () { const query = 'subscription X{ testSubscription }'; const callback = () => null; subManager.subscribe({ query, operationName: 'X', callback }).then(subId => { @@ -114,9 +114,9 @@ describe('SubscriptionManager', function() { }); }); - it('can subscribe with a valid query and get the root value', function(done) { + it('can subscribe with a valid query and get the root value', function (done) { const query = 'subscription X{ testSubscription }'; - const callback = function(err, payload){ + const callback = function (err, payload) { try { expect(payload.data.testSubscription).to.equals('good'); } catch (e) { @@ -134,11 +134,11 @@ describe('SubscriptionManager', function() { }); }); - it('can use filter functions properly', function(done) { + it('can use filter functions properly', function (done) { const query = `subscription Filter1($filterBoolean: Boolean){ testFilter(filterBoolean: $filterBoolean) }`; - const callback = function(err, payload){ + const callback = function (err, payload) { try { expect(payload.data.testFilter).to.equals('goodFilter'); } catch (e) { @@ -150,18 +150,18 @@ describe('SubscriptionManager', function() { subManager.subscribe({ query, operationName: 'Filter1', - variables: { filterBoolean: true}, + variables: { filterBoolean: true }, callback, }).then(subId => { - subManager.publish('Filter1', {filterBoolean: false }); - subManager.publish('Filter1', {filterBoolean: true }); + subManager.publish('Filter1', { filterBoolean: false }); + subManager.publish('Filter1', { filterBoolean: true }); setTimeout(() => { subManager.unsubscribe(subId); }, 4); }); }); - it('can subscribe to more than one trigger', function(done) { + it('can subscribe to more than one trigger', function (done) { // I also used this for testing arg parsing (with console.log) // args a and b can safely be removed. // TODO: write real tests for argument parsing @@ -169,7 +169,7 @@ describe('SubscriptionManager', function() { const query = `subscription multiTrigger($filterBoolean: Boolean, $uga: String){ testFilterMulti(filterBoolean: $filterBoolean, a: $uga, b: 66) }`; - const callback = function(err, payload){ + const callback = function (err, payload) { try { expect(payload.data.testFilterMulti).to.equals('goodFilter'); triggerCount++; @@ -184,19 +184,19 @@ describe('SubscriptionManager', function() { subManager.subscribe({ query, operationName: 'multiTrigger', - variables: { filterBoolean: true, uga: 'UGA'}, + variables: { filterBoolean: true, uga: 'UGA' }, callback, }).then(subId => { - subManager.publish('NotATrigger', {filterBoolean: false}); - subManager.publish('Trigger1', {filterBoolean: true }); - subManager.publish('Trigger2', {filterBoolean: true }); + subManager.publish('NotATrigger', { filterBoolean: false }); + subManager.publish('Trigger1', { filterBoolean: true }); + subManager.publish('Trigger2', { filterBoolean: true }); setTimeout(() => { subManager.unsubscribe(subId); }, 6); }); }); - it('can unsubscribe', function(done) { + it('can unsubscribe', function (done) { const query = 'subscription X{ testSubscription }'; const callback = (err, payload) => { try { @@ -219,11 +219,11 @@ describe('SubscriptionManager', function() { .to.throw('undefined'); }); - it('calls the error callback if there is an execution error', function(done) { + it('calls the error callback if there is an execution error', function (done) { const query = `subscription X($uga: Boolean!){ testSubscription @skip(if: $uga) }`; - const callback = function(err, payload){ + const callback = function (err, payload) { try { // tslint:disable-next-line:no-unused-expression expect(payload).to.exist; @@ -247,7 +247,7 @@ describe('SubscriptionManager', function() { }); it('can use transform function to convert the trigger name given into more explicit channel name', function (done) { - const triggerTransform = (trigger, {path}) => [trigger, ...path].join('.'); + const triggerTransform = (trigger, { path }) => [trigger, ...path].join('.'); const pubsub = new RedisPubSub({ triggerTransform, }); @@ -255,9 +255,9 @@ describe('SubscriptionManager', function() { const subManager2 = new SubscriptionManager({ schema, setupFunctions: { - testChannelOptions: (options, {repoName}) => ({ + testChannelOptions: (options, { repoName }) => ({ comments: { - channelOptions: {path: [repoName]}, + channelOptions: { path: [repoName] }, }, }), }, @@ -279,9 +279,9 @@ describe('SubscriptionManager', function() { } `; - const variables = {repoName: 'graphql-redis-subscriptions'}; + const variables = { repoName: 'graphql-redis-subscriptions' }; - subManager2.subscribe({query, operationName: 'X', variables, callback}).then(subId => { + subManager2.subscribe({ query, operationName: 'X', variables, callback }).then(subId => { pubsub.publish('comments.graphql-redis-subscriptions', 'test'); setTimeout(() => pubsub.unsubscribe(subId), 4); @@ -305,7 +305,7 @@ function buildSchema(iterator) { fields: { testString: { type: GraphQLString, - resolve: function(_, args) { + resolve: function (_, args) { return 'works'; }, }, @@ -329,7 +329,7 @@ function buildSchema(iterator) { }); } -describe('PubSubAsyncIterator', function() { +describe('PubSubAsyncIterator', function () { const query = parse(` subscription S1 { diff --git a/src/test/tests.ts b/src/test/tests.ts index ea26af03..a2ab2354 100644 --- a/src/test/tests.ts +++ b/src/test/tests.ts @@ -1,9 +1,9 @@ import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import {spy, restore} from 'simple-mock'; -import {isAsyncIterable} from 'iterall'; +import { spy, restore } from 'simple-mock'; +import { isAsyncIterable } from 'iterall'; import * as redis from 'redis'; -import {RedisPubSub} from '../redis-pubsub'; +import { RedisPubSub } from '../redis-pubsub'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -18,7 +18,7 @@ const unsubscribeSpy = spy((channel, cb) => cb && cb(channel)); const redisPackage = redis as Object; -const createClient = function() { +const createClient = function () { return { publish: publishSpy, subscribe: subscribeSpy, @@ -77,21 +77,21 @@ describe('RedisPubSub', function () { pubSub.subscribe('Posts', () => null), pubSub.subscribe('Posts', () => null), ]) - .then(([subId, secondSubId]) => { - try { - // This assertion is done against a private member, if you change the internals, you may want to change that - expect((pubSub as any).subscriptionMap[subId]).not.to.be.an('undefined'); - pubSub.unsubscribe(subId); - // This assertion is done against a private member, if you change the internals, you may want to change that - expect((pubSub as any).subscriptionMap[subId]).to.be.an('undefined'); - expect(() => pubSub.unsubscribe(subId)).to.throw(`There is no subscription of id "${subId}"`); - pubSub.unsubscribe(secondSubId); - done(); + .then(([subId, secondSubId]) => { + try { + // This assertion is done against a private member, if you change the internals, you may want to change that + expect((pubSub as any).subscriptionMap[subId]).not.to.be.an('undefined'); + pubSub.unsubscribe(subId); + // This assertion is done against a private member, if you change the internals, you may want to change that + expect((pubSub as any).subscriptionMap[subId]).to.be.an('undefined'); + expect(() => pubSub.unsubscribe(subId)).to.throw(`There is no subscription of id "${subId}"`); + pubSub.unsubscribe(secondSubId); + done(); - } catch (e) { - done(e); - } - }); + } catch (e) { + done(e); + } + }); }); it('will not unsubscribe from the redis channel if there is another subscriber on it\'s subscriber list', function (done) { @@ -187,7 +187,7 @@ describe('RedisPubSub', function () { } }).then(subId => { try { - pubSub.publish('Posts', {comment : 'This is amazing'}); + pubSub.publish('Posts', { comment: 'This is amazing' }); pubSub.unsubscribe(subId); } catch (e) { done(e); @@ -202,7 +202,7 @@ describe('RedisPubSub', function () { }); it('can use transform function to convert the trigger name given into more explicit channel name', function (done) { - const triggerTransform = (trigger, {repoName}) => `${trigger}.${repoName}`; + const triggerTransform = (trigger, { repoName }) => `${trigger}.${repoName}`; const pubsub = new RedisPubSub({ triggerTransform, }); @@ -216,7 +216,7 @@ describe('RedisPubSub', function () { } }; - pubsub.subscribe('comments', validateMessage, {repoName: 'graphql-redis-subscriptions'}).then(subId => { + pubsub.subscribe('comments', validateMessage, { repoName: 'graphql-redis-subscriptions' }).then(subId => { pubsub.publish('comments.graphql-redis-subscriptions', 'test'); pubsub.unsubscribe(subId); }); @@ -237,7 +237,7 @@ describe('RedisPubSub', function () { }); -describe('PubSubAsyncIterator', function() { +describe('PubSubAsyncIterator', function () { it('should expose valid asyncItrator for a specific event', () => { const pubSub = new RedisPubSub();