WIP - fix #2141 - cluster redirect if client closed
Description
Here is a rough attempt to resolve issues described in #2141 (I'm not an expert with TS and would like someone to take over this PR)
createCluster is currently unable to update slots when slots are out of date (when a master node goes down and a replica takes over)
This causes the client to throw ClientClosedError forever until the application is restarted.
This PR takes inspiration from https://github.com/redis/go-redis
- Whenever a command is executed, we check if the state has been last updated 10s ago reference
- Use concept of state struct to make lazy loading easier reference
Related: https://github.com/redis/node-redis/issues/2141#issuecomment-1929245348
Known issues
Do not use isolated - commandOptions; this breaks the client forever, the duplicated client from using this command option would keep using old node addresses and cause Connection timeout on each reconnection. This PR attempts to make changes only to the cluster client and won't make any fixes to this issue (this issue already exists prior this PR)
e.g.
await client.xRead(
commandOptions({
isolated: true
}),
[
{
key: key,
id:'0-0'
}
],
{
COUNT: 100,
BLOCK: 0
}
);
Try it out
For those interested in trying this client out you can install it using the following:
# I'm using pnpm
"pnpm": {
"overrides": {
"@redis/client": "npm:@scorpionknifes/redis-client@^1.6.0"
}
},
It is available here: https://www.npmjs.com/package/@scorpionknifes/redis-client Reminder - this is a draft and don't use this for production.
Testing
I've tested this against docker, k8s Writing tests for these is almost impossible cause it relies on simulating a Redis master going down. (aka no tests written for these)
Checklist
- [x] Does
npm testpass with this change (including linting)? - [ ] Is the new or changed code fully tested?
- [ ] Is a documentation update included (if this change modifies existing APIs, or introduces new ones)?