Skip to content

Conversation

@kbarbounakis
Copy link
Contributor

This PR closes #226 and binds sendCommand, passed as parameter of the RedisStore constructor, to the current instance. This operation allows sendCommand method to use this keyword, if this is required.

Copy link
Member

@gamemaker1 gamemaker1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM apart from the one missing test. Thank you :)

expect(result.totalHits).toEqual(1)
})

it('should bind sendCommand to this', async () => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please add a similar test for sendCommandCluster?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @gamemaker1
test/store-test.ts is missing a mock function -and some tests- for sendCommandCluster. Have you prepared such a method? It seems that sendCommandCluster option should be tested too. Maybe in a different PR?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gamemaker1 I have pushed a commit for testing sendCommandCluster binding. It's a simple test using the already implemented mock sendCommand. ioredis-mock provides a Cluster mock class -for future use- but it does not follow the specification of a redis cluster command
https://github.com/stipsan/ioredis-mock/?tab=readme-ov-file#clusterexperimental

source/lib.ts Outdated
// Normal case: wrap the sendCommand function to convert from cluster to regular
this.sendCommand = async ({ command }: SendCommandClusterDetails) =>
options.sendCommand(...command)
options.sendCommand.bind(this)(...command)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't a huge deal, but could we bind sendCommand & sendCommandCluster once rather than every time they're called?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I pushed a new commit for binding the given sendCommand before using it inside the wrapper func.

https://github.com/express-rate-limit/rate-limit-redis/pull/227/files#diff-5c2516e9822679491492c832b9ace79b6945bdd891586e07b0232ebef1c7e0b1R97

The sendCommandCluster function is already bound once.

Copy link
Member

@nfriedly nfriedly left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more little thing, but otherwise I think this is good to go

Comment on lines 363 to 370
class CustomRedisStore extends RedisStore {
constructor() {
super({
sendCommand: customSendCommand,
})
}
}
const store = new CustomRedisStore()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry I missed this yesterday, but I don't think we need the new class here (?)

I think this would work:

Suggested change
class CustomRedisStore extends RedisStore {
constructor() {
super({
sendCommand: customSendCommand,
})
}
}
const store = new CustomRedisStore()
const store = new RedisStore({
sendCommand: customSendCommand,
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test case is being used here for approaching and presenting subclassing, where a class inherits RedisStore and encloses a custom sendCommand -as I have mentioned in the issue-. It's not really needed here. It might be removed.

Copy link
Contributor Author

@kbarbounakis kbarbounakis Nov 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have updated sendCommand test case for understanding the usage of this binding while we are using a subclass of RedisStore.It now includes a more realistic case where decrement operation is not allowed for some reasons.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I understand what you're doing better now. I think I can go with this.

Comment on lines 390 to 397
class CustomRedisClusterStore extends RedisStore {
constructor() {
super({
sendCommandCluster: customSendCommandCluster,
})
}
}
const store = new CustomRedisClusterStore()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto above

Suggested change
class CustomRedisClusterStore extends RedisStore {
constructor() {
super({
sendCommandCluster: customSendCommandCluster,
})
}
}
const store = new CustomRedisClusterStore()
const store = new RedisStore ({
sendCommandCluster: customSendCommandCluster,
})

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same as above.

Copy link
Contributor Author

@kbarbounakis kbarbounakis Nov 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have removed these lines of code because the usage of this keyword using a subclass is being presented in the previous test.

@nfriedly nfriedly merged commit 8e00add into express-rate-limit:main Nov 30, 2025
8 checks passed
@kbarbounakis kbarbounakis deleted the 226-bind-sendCommand-to-the-current-instance branch November 30, 2025 17:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bind the given sendCommand to the current instance

3 participants