Skip to content

Commit bbc6bd4

Browse files
authored
fix: LiveQueryServer crashes using cacheAdapter on disconnect from Redis 4 server (#9616)
1 parent ef68fb1 commit bbc6bd4

File tree

4 files changed

+23
-5
lines changed

4 files changed

+23
-5
lines changed

spec/RedisPubSub.spec.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ const RedisPubSub = require('../lib/Adapters/PubSub/RedisPubSub').RedisPubSub;
33
describe('RedisPubSub', function () {
44
beforeEach(function (done) {
55
// Mock redis
6-
const createClient = jasmine.createSpy('createClient');
6+
const createClient = jasmine.createSpy('createClient').and.returnValue({
7+
connect: jasmine.createSpy('connect').and.resolveTo(),
8+
on: jasmine.createSpy('on'),
9+
});
710
jasmine.mockLibrary('redis', 'createClient', createClient);
811
done();
912
});

src/Adapters/Cache/RedisCacheAdapter.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class RedisCacheAdapter {
2727
if (this.client.isOpen) {
2828
return;
2929
}
30-
return this.client.connect();
30+
return await this.client.connect();
3131
}
3232

3333
async handleShutdown() {

src/Adapters/PubSub/RedisPubSub.js

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
import { createClient } from 'redis';
2+
import { logger } from '../../logger';
23

34
function createPublisher({ redisURL, redisOptions = {} }): any {
45
redisOptions.no_ready_check = true;
5-
return createClient({ url: redisURL, ...redisOptions });
6+
const client = createClient({ url: redisURL, ...redisOptions });
7+
client.on('error', err => { logger.error('RedisPubSub Publisher client error', { error: err }) });
8+
client.on('connect', () => {});
9+
client.on('reconnecting', () => {});
10+
client.on('ready', () => {});
11+
return client;
612
}
713

814
function createSubscriber({ redisURL, redisOptions = {} }): any {
915
redisOptions.no_ready_check = true;
10-
return createClient({ url: redisURL, ...redisOptions });
16+
const client = createClient({ url: redisURL, ...redisOptions });
17+
client.on('error', err => { logger.error('RedisPubSub Subscriber client error', { error: err }) });
18+
client.on('connect', () => {});
19+
client.on('reconnecting', () => {});
20+
client.on('ready', () => {});
21+
return client;
1122
}
1223

1324
const RedisPubSub = {

src/middlewares.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -534,17 +534,21 @@ export const addRateLimit = (route, config, cloud) => {
534534
store: null,
535535
};
536536
if (route.redisUrl) {
537+
const log = config?.loggerController || defaultLogger;
537538
const client = createClient({
538539
url: route.redisUrl,
539540
});
541+
client.on('error', err => { log.error('Middlewares addRateLimit Redis client error', { error: err }) });
542+
client.on('connect', () => {});
543+
client.on('reconnecting', () => {});
544+
client.on('ready', () => {});
540545
redisStore.connectionPromise = async () => {
541546
if (client.isOpen) {
542547
return;
543548
}
544549
try {
545550
await client.connect();
546551
} catch (e) {
547-
const log = config?.loggerController || defaultLogger;
548552
log.error(`Could not connect to redisURL in rate limit: ${e}`);
549553
}
550554
};

0 commit comments

Comments
 (0)