1
0
mirror of https://github.com/redis/node-redis.git synced 2025-08-04 15:02:09 +03:00
Commit Graph

195 Commits

Author SHA1 Message Date
Nikolay Karadzhov
65a12d50e7 feat(client): add command timeout option (#3008)
Co-authored-by: Florian Schunk <149071178+florian-schunk@users.noreply.github.com>
2025-07-07 11:37:08 +03:00
Nikolay Karadzhov
79749f2461 fix(sentinel): propagate RESP option to clients (#3011)
`createSentinel` takes RESP as an option, but does not propagate down
to the actual clients. This creates confusion for the users as they
expect the option to be set to all clients, which is reasonable.

In case of clientSideCaching, this problem manifests as validation failure
because clientSideCaching requires RESP3, but if we dont propagate,
clients start with the default RESP2

fixes #3010
2025-07-07 11:06:34 +03:00
Nikolay Karadzhov
742d5713e8 fix(commands): sPopCount return Array<string> (#3006)
Also, touch the tests for spop and spopcount
to use the new parseCommand API

fixes #3004
2025-06-25 13:15:44 +03:00
Nikolay Karadzhov
c5b4f47975 feat: add support for vector sets (#2998)
* wip

* improve the vadd api

* resp3 tests

* fix some tests

* extract json helper functions in client package

* use transformJsonReply

* remove the CACHEABLE flag for all vector set commands

currently, client side caching is not supported
for vector set commands by the server

* properly transform vinfo result

* add resp3 test for vlinks

* add more tests for vrandmember

* fix vrem return types

* fix vsetattr return type

* fix vsim_withscores

* implement vlinks_withscores

* set minimum docker image version to 8

* align return types

* add RAW variant for VEMB -> VEMB_RAW

* use the new parseCommand api
2025-06-24 13:35:29 +03:00
Pavel Pashov
b52177752e feat: added support for new bitop operations (#3001)
refactored bitop tests, covered all operations

updated default docker version on all packages
2025-06-19 13:56:00 +03:00
Nikolay Karadzhov
5d205cf161 chore(tests): bump test container version 8.0.2 (#2997) 2025-06-16 10:20:49 +03:00
Nikolay Karadzhov
62ac8b7c32 fix(client): make unstable cmds throw (#2990)
As per the docs, unstableResp3 commands should throw
when client is created with { RESP: 3, unstableResp3: false|undefined }

fixes #2989
2025-06-06 15:38:52 +03:00
Bobby I.
20c16e0c2c (docs) add jsdoc comments to command parsers (#2984)
* (docs) bloom: add jsdocs for all commands

* (docs) json: add jsdocs

* (docs) search: add jsdocs for all commands

* (docs) jsdocs for std commands

* (docs) jsdoc comments to time series commands
2025-06-03 14:38:07 +03:00
Hristo Temelski
f346bad64e Adapt legacy sentinel tests to use the new test utils (#2976)
* modified legacy sentinel tests

* Adapt legacy sentinel tests to use the new test utils

* modify tmpdir creation

* reduced sentinel config timeouts, removed unneeded comment

---------

Co-authored-by: H. Temelski <hristo.temelski@redis.com>
2025-05-27 14:21:22 +03:00
Nikolay Karadzhov
27537b0ab7 fix(cluster): replace native private with _ (#2971)
Private class fields (e.g., #execute) cause runtime errors when accessed from contexts where `this` is not the exact instance, triggering “Receiver must be an instance of class RedisCluster”.

fixes #2967
2025-05-22 10:35:16 +03:00
Nikolay Karadzhov
9ea260f0f9 fix(handshake): ignore errors on client.setinfo (#2969)
As per the documentation (https://redis.io/docs/latest/commands/client-setinfo):

Client libraries are expected to pipeline this command after authentication on all connections and ignore failures since they could be connected to an older version that doesn't support them.

Turns out different versions of redis server return different errors, so its better to catch all.

fixes #2968
2025-05-21 11:38:29 +03:00
Nikolay Karadzhov
4a5f879ec9 fix(client): bring disableClientInfo option back (#2959)
* fix(client): bring disableClientInfo option back

It disappeared in v5

fixes #2958
2025-05-20 15:15:09 +03:00
Nikolay Karadzhov
f3d1d3352e feat(client): expose socketTimeout option (#2965)
The maximum duration (in milliseconds) that the socket can remain idle (i.e., with no data sent or received) before being automatically closed. Default reconnectionStrategy will ignore the new SocketTimeoutError, but users are allowed to have custom strategies wich handle those errors in different ways
2025-05-20 14:28:15 +03:00
Hristo Temelski
d0a5c4c945 Fix sentinel csc tests (#2966)
Co-authored-by: H. Temelski <hristo.temelski@redis.com>
2025-05-20 11:04:11 +03:00
Bobby I.
f01f1014cb Client Side Caching (#2947)
* CSC POC ontop of Parser

* add csc file that weren't merged after patch

* address review comments

* nits to try and fix github

* last change from review

* Update client-side cache and improve documentation

* Add client side caching RESP3 validation

* Add documentation for RESP and unstableResp3 options

* Add comprehensive cache statistics

The `CacheStats` class provides detailed metrics like hit/miss counts,
load success/failure counts, total load time, and eviction counts.
It also offers derived metrics such as hit/miss rates, load failure rate,
and average load penalty. The design is inspired by Caffeine.

`BasicClientSideCache` now uses a `StatsCounter` to accumulate these
statistics, exposed via a new `stats()` method. The previous
`cacheHits()` and `cacheMisses()` methods have been removed.

A `recordStats` option (default: true) in `ClientSideCacheConfig`
allows disabling statistics collection.

---------

Co-authored-by: Shaya Potter <shaya@redislabs.com>
2025-05-19 15:11:47 +03:00
Nikolay Karadzhov
6f961bd715 fix(client): cache subsequent clients (#2963)
* fix(client): cache subsequent clients

we dont need to recreate a client if
its config hasnt changed

fixes #2954

* handle circular structures

* make cache generic
2025-05-14 17:23:22 +03:00
Hristo Temelski
bb7845dfe3 Disable readOnly for cluster s/pubsub client (#2950) 2025-05-08 10:29:05 +03:00
Clubsandwich
86480aaa74 fix cluster.sUnsubscribe - make listener optional (#2946) 2025-05-07 16:11:09 +03:00
Nikolay Karadzhov
7b737821b2 fix: fix various command import issues (#2944)
* fix: fix various command import issues

there was some sort of a circular dependency
in <module>/lib/commands/index.ts for various modules

fixes #2937 fixes #2941

* remove redundant definition
2025-05-07 16:10:35 +03:00
Nikolay Karadzhov
87b77e3e5f fix(client): add type annotations (#2949)
Fix type parameter for transformTuplesReply in CONFIG_GET and HGETALL commands

fixes #2933
2025-05-07 13:47:23 +03:00
Bobby I.
46bfeaa94e Fix typo and improve Sentinel docs (#2931) 2025-04-30 16:30:16 +03:00
Hristo Temelski
9459660d96 fix(pubsub): Fixed cluster client pubsub logic
* Infer the cluster pubsub client read only mode from the node type

* Modify flag logic
2025-04-30 15:57:01 +03:00
Hristo Temelski
10ff6debab fix(sentinel): Migrated to the new testing framework, fixed issues that were discovered during transition
* [CAE-342] Fix a couple of bugs

* Fixed issue with nodes masterauth persistency, changed docker container

* [CAE-342] Fixed a couple of sentinel issues, enabled most tests

* [CAE-342] Added comment

* [CAE-342] Migrate majority of tests to testUtils

* [CAE-342] Minor refactor

* .

* [CAE-342] Using cae containers for sentinel

* [CAE-342] Improved resiliency of the legacy tests, added TSdoc comment

* [CAE-342] Some extra logging, removed unneeded changes

* [CAE-342] Moved docker env as optional part of redisserverdockerconfig

* [CAE-342] Move password to serverArguments

* [CAE-342] Moved ts-node to devDependencies

* [CAE-342] Reverted legacy testing framework improvements
2025-04-30 15:56:29 +03:00
Hristo Temelski
4cbecf6a09 feat(hash field expiration): Added hash field expiration commands (#2907)
* [CAE-686] Added hash field expiration commands

* [CAE-686] Improve HSETEX return type

* [CAE-686] Minor pushTuples change, renamed HSETEX test

* [CAE-686] Changed hsetex function signature for better consistency with other commands

* [CAE-686] Fixed hsetex test

* [CAE-686] Bumped docker version to 8.0-M05-pre, enabled and fixed tests
2025-03-19 12:26:23 +02:00
Hristo Temelski
a7feb60e0a tests: bumped the version of the 8 docker test image to '8.0-M05-pre' (#2909) 2025-03-18 15:24:11 +02:00
Bobby I.
69d507a572 refactor!: redis 8 compatibility improvements and test infrastructure updates (#2893)
* churn(test): use redislabs/client-libs-test for testing

This  switches our testing infrastructure from redis/redis-stack to
redislabs/client-libs-test Docker image across all packages. This change
also updates the default Docker version from 7.4.0-v1 to 8.0-M04-pre.

* churn(test): verify CONFIG SET / GET compatibility with Redis 8

- Add tests for Redis 8 search configuration settings
- Deprecate Redis Search CONFIG commands in favor of standard CONFIG
- Test read-only config restrictions for Redis 8

* churn(test): handle Redis 8 coordinate precision in GEOPOS

- Update GEOPOS tests to handle increased precision in Redis 8 (17 decimal places vs 14)
- Add precision-aware coordinate comparison helper
- Add comprehensive test suite for coordinate comparison function

* test(search): adapt SUGGET tests for Redis 8 empty results

- Update tests to expect empty array ([]) instead of null for SUGGET variants
- Affects sugGet, sugGetWithPayloads, sugGetWithScores, and sugGetWithScoresWithPayloads

* test(search): support Redis 8 INFO indexes_all field

- Add indexes_all field introduced in Redis 8 to index definition test

* refactor!(search): simplify PROFILE commands to return raw response

- BREAKING CHANGE: FT.PROFILE now returns raw response, letting users implement their own parsing

* test: improve version-specific test coverage

- Add `testWithClientIfVersionWithinRange` method to run tests for specific Redis versions
- Refactor TestUtils to handle version comparisons more accurately
- Update test utilities across Redis modules to run tests against multiple versions, and not against latest only
2025-02-27 10:56:58 +02:00
Bobby I.
6d21de3f31 feat(auth): add Entra ID identity provider integration for Redis client authentication (#2877)
* feat(auth): refactor authentication mechanism to use CredentialsProvider

- Introduce new credential providers: AsyncCredentialsProvider, StreamingCredentialsProvider
- Update client handshake process to use the new CredentialsProviders and to support async credentials fetch / credentials refresh
- Internal conversion of username/password to a CredentialsProvider
- Modify URL parsing to accommodate the new authentication structure
- Tests

* feat(auth): auth extensions

Introduces TokenManager and supporting classes to handle token acquisition, automatic
refresh, and updates via identity providers. This foundation enables consistent
authentication token management across different identity provider implementations.

Key additions:
- Add TokenManager to obtain and maintain auth tokens from identity providers
  with automated refresh scheduling based on TTL and configurable thresholds
- Add IdentityProvider interface for token acquisition from auth providers
- Implement Token class for managing token state and TTL tracking
- Include configurable retry mechanism with exponential backoff and jitter
- Add comprehensive test suite covering refresh cycles and error handling

This change establishes the core infrastructure needed for reliable token
lifecycle management across different authentication providers.

* feat(auth): add Entra ID identity provider integration

Introduces Entra ID (former Azure AD) authentication support with multiple authentication flows
and automated token lifecycle management.

Key additions:
- Add EntraIdCredentialsProvider for handling Entra ID authentication flows
- Implement MSALIdentityProvider to integrate with MSAL/EntraID authentication library
- Add support for multiple authentication methods:
  - Managed identities (system and user-assigned)
  - Client credentials with certificate
  - Client credentials with secret
  - Authorization Code flow with PKCE
- Add factory class with builder methods for each authentication flow
- Include sample Express server implementation for Authorization Code flow
- Add comprehensive configuration options for authority and token management

* feat(test-utils): improve cluster testing

- Add support for configuring replica authentication with 'masterauth'
- Allow default client configuration during test cluster creation

This improves the testing framework's flexibility by automatically
configuring replica authentication when '--requirepass' is used and
enabling custom client configurations across cluster nodes.

* feat(auth): add EntraId integration tests

- Add integration tests for token renewal and re-authentication flows
- Update credentials provider to use uniqueId as username instead of account username
- Add test utilities for loading Redis endpoint configurations
- Split TypeScript configs into separate files for samples and integration tests
- Remove `@redis/authx` package and nest it under `@`
2025-01-30 10:29:19 +02:00
Jeremy
ffa7d2525c Fix cluster-slots discover race condition again (#2867) 2024-11-25 15:36:33 -05:00
Max Gruenfelder
9a3e1c5e03 Fix creation of cluster client again (#2870)
* shallow copy of this.#options.defaults.socket

* shallow copy of this.#options.defaults.socket

* nit

* fix redis create cluster client again

---------

Co-authored-by: Max Gruenfelder <maximilian.gruenfelder@sap.com>
Co-authored-by: Leibale Eidelman <me@leibale.com>
2024-11-25 15:28:44 -05:00
Shaya Potter
8dab27ed02 fix sentinel generics (#2859)
* fix sentinel generics

* comment nit
2024-11-04 10:23:34 -05:00
Shaya Potter
4708736f3b new "transform arguments" API for better key and metadata extraction (#2733)
* Parser support with all commands

* remove "dist" from all imports for consistency

* address most of my review comments

* small tweak to multi type mapping handling

* tweak multi commands / fix addScript cases

* nits

* addressed all in person review comments

* revert addCommand/addScript changes to multi-commands

addCommand needs to be there for sendCommand like ability within a multi.

If its there, it might as well be used by createCommand() et al, to avoid repeating code.

addScript is there (even though only used once), but now made private to keep the logic for bookkeeping near each other.
2024-10-31 12:16:59 -04:00
Shaya Potter
b2d35c5286 V5 bringing RESP3, Sentinel and TypeMapping to node-redis
RESP3 Support
   - Some commands responses in RESP3 aren't stable yet and therefore return an "untyped" ReplyUnion.
 
Sentinel

TypeMapping

Correctly types Multi commands

Note: some API changes to be further documented in v4-to-v5.md
2024-10-15 17:46:52 +03:00
Leibale
18ccc28c2f fix hash expiration tests 2024-07-29 10:11:04 -04:00
Shaya Potter
6f79b49f73 updated per discussion w/ leibele (#2804) 2024-07-24 13:15:01 -04:00
Shaya Potter
b884e132fa don't expand/copy rawValues, return it directly. (#2800) 2024-07-23 21:07:32 +03:00
Shaya Potter
d09aaa311d small internal tweak for maxage per discussion w/ leibele (#2803) 2024-07-23 12:59:27 -04:00
Gabriel Erzse
64fca37944 Support the NOVALUES option of HSCAN (#2711)
* Support the NOVALUES option of HSCAN

Issue #2705

The NOVALUES option instructs HSCAN to only return keys, without their
values. This is materialized as a new command, `hScanNoValues`, given
that the return type is different from the usual return type of `hScan`.
Also a new iterator is provided, `hScanNoValuesIterator`, for the same
reason.

* skip hscan novalues test if redis < 7.4

* Also don't test hscan no values iterator < 7.4

---------

Co-authored-by: Shaya Potter <spotter@gmail.com>
2024-07-14 14:20:30 +03:00
Shaya Potter
7d43a97bc7 add CLIENT KILL maxAge support (v4) (#2761) 2024-07-10 19:45:06 +03:00
Shaya Potter
b4df2b24a8 add support for all hash field expiration commands (#2787) 2024-07-10 19:44:30 +03:00
Max Gruenfelder
4ac97eeaac fix createCluster - copy options.defaults.socket before modifying it (#2783)
* shallow copy of this.#options.defaults.socket

* shallow copy of this.#options.defaults.socket

* nit

---------

Co-authored-by: Max Gruenfelder <maximilian.gruenfelder@sap.com>
Co-authored-by: Leibale Eidelman <me@leibale.com>
2024-07-02 09:00:27 -07:00
jjsimps
bfa803fa55 Fix race condition when slots are re-calculated (#2731) 2024-05-16 10:17:32 -07:00
Brent Layne
295647cf9d fix(clustered pubsub): check that client.isOpen before calling client.disconnect() when unsubscribing (#2687)
* Confirm the client isOpen before disconnecting

* Write tests

* fix tests

* fix tests

---------

Co-authored-by: Leibale Eidelman <me@leibale.com>
2024-01-29 00:25:26 -08:00
Leibale Eidelman
f4680f0849 fix #2665 - handle errors in multi/pipeline replies (#2666)
* fix #2665 - handle errors in multi/pipeline replies

* fix MultiErrorReply replies type

* run tests on all versions, remove console.log, fix bug

* add errors iterator helper

* test `.errors()` as well
2023-12-18 15:15:21 -05:00
Clubsandwich
623b56b5ca fix cluster.sUnsubscribe - make listener optional 2023-11-20 13:40:38 -05:00
Leibale Eidelman
68d835d7a2 fix #2632 - handle socket close in "socket initiator" phase (#2653) 2023-11-20 13:16:36 -05:00
Shaya Potter
a8b81bdd01 Send client user-agent during connection, via CLIENT SETINFO (#2645)
* Add SETINFO support to client connection, with the ability to disable sending the user agent if the end user desires.  * Also enables modifying the user-agent with a tag to enable distinguishing different usages.
2023-11-07 14:43:20 +02:00
Charley DAVID
e00041e0eb Fix: XAUTOCLAIM after a TRIM with pending messages returns nil (#2565)
* fix(client): XCLAIM & XAUTOCLAIM after a TRIM might return nils

* fix(client): Fix race condition in specs

* revert test utils changes

* make tests faster

---------

Co-authored-by: Leibale Eidelman <me@leibale.com>
2023-09-19 17:37:16 -04:00
avinashkrishna613
4ec97be4f0 fix #1956 - add support for LATENCY HISTORY (#2555)
* added support for LATENCY_HISTORY command

* clean code

* Update LATENCY_HISTORY.ts

---------

Co-authored-by: Leibale Eidelman <me@leibale.com>
2023-09-19 16:21:54 -04:00
Asher
6848f3d207 Add support for PUBSUB SHARDNUMSUB (#2541)
* Add support for command 'PUBSUB SHARDNUMSUB'

* Use import from PUBSUB_SHARDNUMSUB

* Add test case for non-empty reply

* clean tests

* run tests in redis >= 7, fix integration test

---------

Co-authored-by: Leibale Eidelman <me@leibale.com>
2023-09-19 15:59:02 -04:00
Moshe L
01ca54e907 fix #1970 - add support for RESTORE (#2535)
* - Added RESTORE functionality

* add FIRST_KEY_INDEX, fix tests, clean example, add example to examples table

* use returnBuffers in test

---------

Co-authored-by: Leibale Eidelman <me@leibale.com>
2023-09-18 19:45:33 -04:00