From 0ce4eeae72a4cd04df3c67c9914b7b6d8e6962b0 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 11 May 2019 19:13:41 -0500 Subject: [PATCH] LiveQuery: Add options for Redis (#5584) Closes: https://github.com/parse-community/parse-server/issues/5387 --- spec/ParsePubSub.spec.js | 4 ++++ spec/RedisPubSub.spec.js | 12 ++++++++++-- src/Adapters/PubSub/RedisPubSub.js | 10 ++++++---- src/Options/Definitions.js | 10 ++++++++++ src/Options/docs.js | 2 ++ src/Options/index.js | 4 ++++ src/cli/parse-server.js | 5 +++++ 7 files changed, 41 insertions(+), 6 deletions(-) diff --git a/spec/ParsePubSub.spec.js b/spec/ParsePubSub.spec.js index 91f4c1a7..3159fc7f 100644 --- a/spec/ParsePubSub.spec.js +++ b/spec/ParsePubSub.spec.js @@ -28,6 +28,7 @@ describe('ParsePubSub', function() { it('can create redis publisher', function() { ParsePubSub.createPublisher({ redisURL: 'redisURL', + redisOptions: { socket_keepalive: true }, }); const RedisPubSub = require('../lib/Adapters/PubSub/RedisPubSub') @@ -36,6 +37,7 @@ describe('ParsePubSub', function() { .EventEmitterPubSub; expect(RedisPubSub.createPublisher).toHaveBeenCalledWith({ redisURL: 'redisURL', + redisOptions: { socket_keepalive: true }, }); expect(EventEmitterPubSub.createPublisher).not.toHaveBeenCalled(); }); @@ -54,6 +56,7 @@ describe('ParsePubSub', function() { it('can create redis subscriber', function() { ParsePubSub.createSubscriber({ redisURL: 'redisURL', + redisOptions: { socket_keepalive: true }, }); const RedisPubSub = require('../lib/Adapters/PubSub/RedisPubSub') @@ -62,6 +65,7 @@ describe('ParsePubSub', function() { .EventEmitterPubSub; expect(RedisPubSub.createSubscriber).toHaveBeenCalledWith({ redisURL: 'redisURL', + redisOptions: { socket_keepalive: true }, }); expect(EventEmitterPubSub.createSubscriber).not.toHaveBeenCalled(); }); diff --git a/spec/RedisPubSub.spec.js b/spec/RedisPubSub.spec.js index 1263b14a..ffb189aa 100644 --- a/spec/RedisPubSub.spec.js +++ b/spec/RedisPubSub.spec.js @@ -9,19 +9,27 @@ describe('RedisPubSub', function() { }); it('can create publisher', function() { - RedisPubSub.createPublisher({ redisURL: 'redisAddress' }); + RedisPubSub.createPublisher({ + redisURL: 'redisAddress', + redisOptions: { socket_keepalive: true }, + }); const redis = require('redis'); expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { + socket_keepalive: true, no_ready_check: true, }); }); it('can create subscriber', function() { - RedisPubSub.createSubscriber({ redisURL: 'redisAddress' }); + RedisPubSub.createSubscriber({ + redisURL: 'redisAddress', + redisOptions: { socket_keepalive: true }, + }); const redis = require('redis'); expect(redis.createClient).toHaveBeenCalledWith('redisAddress', { + socket_keepalive: true, no_ready_check: true, }); }); diff --git a/src/Adapters/PubSub/RedisPubSub.js b/src/Adapters/PubSub/RedisPubSub.js index 2e7452a9..e259f09a 100644 --- a/src/Adapters/PubSub/RedisPubSub.js +++ b/src/Adapters/PubSub/RedisPubSub.js @@ -1,11 +1,13 @@ import redis from 'redis'; -function createPublisher({ redisURL }): any { - return redis.createClient(redisURL, { no_ready_check: true }); +function createPublisher({ redisURL, redisOptions = {} }): any { + redisOptions.no_ready_check = true; + return redis.createClient(redisURL, redisOptions); } -function createSubscriber({ redisURL }): any { - return redis.createClient(redisURL, { no_ready_check: true }); +function createSubscriber({ redisURL, redisOptions = {} }): any { + redisOptions.no_ready_check = true; + return redis.createClient(redisURL, redisOptions); } const RedisPubSub = { diff --git a/src/Options/Definitions.js b/src/Options/Definitions.js index 984b2370..654f38ae 100644 --- a/src/Options/Definitions.js +++ b/src/Options/Definitions.js @@ -377,6 +377,11 @@ module.exports.LiveQueryOptions = { help: 'LiveQuery pubsub adapter', action: parsers.moduleOrObjectParser, }, + redisOptions: { + env: 'PARSE_SERVER_LIVEQUERY_REDIS_OPTIONS', + help: "parse-server's LiveQuery redisOptions", + action: parsers.objectParser, + }, redisURL: { env: 'PARSE_SERVER_LIVEQUERY_REDIS_URL', help: "parse-server's LiveQuery redisURL", @@ -421,6 +426,11 @@ module.exports.LiveQueryServerOptions = { help: 'LiveQuery pubsub adapter', action: parsers.moduleOrObjectParser, }, + redisOptions: { + env: 'PARSE_LIVE_QUERY_SERVER_REDIS_OPTIONS', + help: "parse-server's LiveQuery redisOptions", + action: parsers.objectParser, + }, redisURL: { env: 'PARSE_LIVE_QUERY_SERVER_REDIS_URL', help: "parse-server's LiveQuery redisURL", diff --git a/src/Options/docs.js b/src/Options/docs.js index 7bc3a483..4ddd4f57 100644 --- a/src/Options/docs.js +++ b/src/Options/docs.js @@ -76,6 +76,7 @@ * @interface LiveQueryOptions * @property {String[]} classNames parse-server's LiveQuery classNames * @property {Adapter} pubSubAdapter LiveQuery pubsub adapter + * @property {Any} redisOptions parse-server's LiveQuery redisOptions * @property {String} redisURL parse-server's LiveQuery redisURL */ @@ -88,6 +89,7 @@ * @property {String} masterKey This string should match the masterKey in use by your Parse Server. If you deploy the LiveQuery server alongside Parse Server, the LiveQuery server will try to use the same masterKey. * @property {Number} port The port to run the LiveQuery server, defaults to 1337. * @property {Adapter} pubSubAdapter LiveQuery pubsub adapter + * @property {Any} redisOptions parse-server's LiveQuery redisOptions * @property {String} redisURL parse-server's LiveQuery redisURL * @property {String} serverURL This string should match the serverURL in use by your Parse Server. If you deploy the LiveQuery server alongside Parse Server, the LiveQuery server will try to use the same serverURL. * @property {Number} websocketTimeout Number of milliseconds between ping/pong frames. The WebSocket server sends ping/pong frames to the clients to keep the WebSocket alive. This value defines the interval of the ping/pong frame from the server to clients, defaults to 10 * 1000 ms (10 s). diff --git a/src/Options/index.js b/src/Options/index.js index c02723eb..c41102ec 100644 --- a/src/Options/index.js +++ b/src/Options/index.js @@ -196,6 +196,8 @@ export interface LiveQueryOptions { /* parse-server's LiveQuery classNames :ENV: PARSE_SERVER_LIVEQUERY_CLASSNAMES */ classNames: ?(string[]); + /* parse-server's LiveQuery redisOptions */ + redisOptions: ?any; /* parse-server's LiveQuery redisURL */ redisURL: ?string; /* LiveQuery pubsub adapter */ @@ -220,6 +222,8 @@ export interface LiveQueryServerOptions { /* The port to run the LiveQuery server, defaults to 1337. :DEFAULT: 1337 */ port: ?number; + /* parse-server's LiveQuery redisOptions */ + redisOptions: ?any; /* parse-server's LiveQuery redisURL */ redisURL: ?string; /* LiveQuery pubsub adapter */ diff --git a/src/cli/parse-server.js b/src/cli/parse-server.js index 9dcab74e..6328e920 100755 --- a/src/cli/parse-server.js +++ b/src/cli/parse-server.js @@ -60,6 +60,11 @@ runner({ options.liveQuery.redisURL = options['liveQuery.redisURL']; delete options['liveQuery.redisURL']; } + if (options['liveQuery.redisOptions']) { + options.liveQuery = options.liveQuery || {}; + options.liveQuery.redisOptions = options['liveQuery.redisOptions']; + delete options['liveQuery.redisOptions']; + } if (options.cluster) { const numCPUs =