Skip to content

Commit 1b4b517

Browse files
authored
Fb/redis client options fixes (#93)
* propagate tls options to client for non-clusters ignore uri from cf credentials and rely on hostname port password instead * add 5min ping interval by default * add clarifying note * update snaps
1 parent 9601724 commit 1b4b517

File tree

2 files changed

+43
-13
lines changed

2 files changed

+43
-13
lines changed

src/redis-adapter.js

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,20 +90,30 @@ const _createClientBase = (clientName) => {
9090
try {
9191
// NOTE: settings the user explicitly to empty resolves auth problems, see
9292
// https://github.com/go-redis/redis/issues/1343
93-
const redisCredentials = cfEnv.cfServiceCredentialsForLabel(CF_REDIS_SERVICE_LABEL);
94-
const redisIsCluster = redisCredentials.cluster_mode;
95-
const url = redisCredentials.uri.replace(/(?<=rediss:\/\/)[\w-]+?(?=:)/, "");
96-
if (redisIsCluster) {
93+
const {
94+
cluster_mode: isCluster,
95+
hostname: host,
96+
port,
97+
password,
98+
tls,
99+
} = cfEnv.cfServiceCredentialsForLabel(CF_REDIS_SERVICE_LABEL);
100+
const redisClientOptions = {
101+
password,
102+
pingInterval: 5 * 60000,
103+
socket: {
104+
host,
105+
port,
106+
tls,
107+
},
108+
};
109+
if (isCluster) {
97110
return redis.createCluster({
98-
rootNodes: [{ url }],
111+
rootNodes: [redisClientOptions], // NOTE: assume this ignores everything but socket/url
99112
// https://github.com/redis/node-redis/issues/1782
100-
defaults: {
101-
password: redisCredentials.password,
102-
socket: { tls: redisCredentials.tls },
103-
},
113+
defaults: redisClientOptions, // NOTE: assume this ignores socket/url
104114
});
105115
}
106-
return redis.createClient({ url });
116+
return redis.createClient(redisClientOptions);
107117
} catch (err) {
108118
throw new VError(
109119
{ name: VERROR_CLUSTER_NAME, cause: err, info: { clientName } },

test/redis-adapter.test.js

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,37 @@ describe("redis-adapter test", () => {
8787

8888
test("_createClientBase on CF", async () => {
8989
const mockUrl = "rediss://BAD_USERNAME:pwd@mockUrl";
90-
const mockUrlUsable = mockUrl.replace("BAD_USERNAME", "");
9190

9291
envMock.isOnCf = true;
93-
envMock.cfServiceCredentialsForLabel.mockReturnValueOnce({ uri: mockUrl });
92+
envMock.cfServiceCredentialsForLabel.mockReturnValueOnce({
93+
cluster_mode: false,
94+
uri: mockUrl,
95+
hostname: "my-domain.com",
96+
port: "1234",
97+
password: "mock-password",
98+
tls: { tlsOption: "tlsOption" },
99+
});
94100

95101
const client = redisAdapter._._createClientBase();
96102

97103
expect(envMock.cfServiceCredentialsForLabel).toHaveBeenCalledTimes(1);
98104
expect(envMock.cfServiceCredentialsForLabel).toHaveBeenCalledWith("redis-cache");
99105
expect(redis.createClient).toHaveBeenCalledTimes(1);
100-
expect(redis.createClient).toHaveBeenCalledWith({ url: mockUrlUsable });
106+
expect(redis.createClient.mock.calls[0]).toMatchInlineSnapshot(`
107+
[
108+
{
109+
"password": "mock-password",
110+
"pingInterval": 300000,
111+
"socket": {
112+
"host": "my-domain.com",
113+
"port": "1234",
114+
"tls": {
115+
"tlsOption": "tlsOption",
116+
},
117+
},
118+
},
119+
]
120+
`);
101121
expect(client).toBe(mockClient);
102122
expect(loggerSpy.error).not.toHaveBeenCalled();
103123
});

0 commit comments

Comments
 (0)