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

49 Commits

Author SHA1 Message Date
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
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
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
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
bb7845dfe3 Disable readOnly for cluster s/pubsub client (#2950) 2025-05-08 10:29:05 +03:00
86480aaa74 fix cluster.sUnsubscribe - make listener optional (#2946) 2025-05-07 16:11:09 +03:00
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
ffa7d2525c Fix cluster-slots discover race condition again (#2867) 2024-11-25 15:36:33 -05:00
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
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
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
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
b4df2b24a8 add support for all hash field expiration commands (#2787) 2024-07-10 19:44:30 +03:00
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
bfa803fa55 Fix race condition when slots are re-calculated (#2731) 2024-05-16 10:17:32 -07:00
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
623b56b5ca fix cluster.sUnsubscribe - make listener optional 2023-11-20 13:40:38 -05:00
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
e1658ba6ef fix cluster extractFirstKey skip commandOptions() passed to args (#2439)
* cluster extractFirstKey skip commandOptions() passed to args

* cluster with commandOptions unit test

* improve performance

* fix type

* fix type

---------

Co-authored-by: Leibale Eidelman <me@leibale.com>
2023-04-26 12:56:04 -04:00
0f28dad2a2 Execute empty MULTI (#2423)
* Fix multi.exec with empty queue and previous watch

When calling exec on a multi instance which you did not use, no command is sent currently.

This is a problem for watched keys, because no EXEC means no unwatch, which might cause hard-to-debug problems.

Proposed Fix: Sending UNWATCH

* execute empty multi command (instead of skipping)

* Update index.ts

* Update index.ts

* Update multi-command.ts

* Update multi-command.ts

* Update multi-command.ts

* Update multi-command.ts

* short circuit empty pipelines

* Update index.ts

---------

Co-authored-by: Leibale <me@leibale.com>
2023-02-24 17:33:16 -05:00
3bd28a9924 fix #2391 - remove node: prefix from imports 2023-01-25 20:37:00 -05:00
3b1bad2296 Add support for sharded PubSub (#2373)
* refactor pubsub, add support for sharded pub sub

* run tests in redis 7 only, fix PUBSUB SHARDCHANNELS test

* add some comments and fix some bugs

* PubSubType, not PubSubTypes 🤦‍♂️

* remove test.txt

* fix some bugs, add tests

* add some tests

* fix #2345 - allow PING in PubSub mode (remove client side validation)

* remove .only

* revert changes in cluster/index.ts

* fix tests minimum version

* handle server sunsubscribe

* add 'sharded-channel-moved' event to docs, improve the events section in the main README (fix #2302)

* exit "resubscribe" if pubsub not active

* Update commands-queue.ts

* Release client@1.5.0-rc.0

* WIP

* use `node:util` instead of `node:util/types` (to support node 14)

* run PubSub resharding test with Redis 7+

* fix inconsistency in live resharding test

* add some tests

* fix iterateAllNodes when starting from a replica

* fix iterateAllNodes random

* fix slotNodesIterator

* fix slotNodesIterator

* clear pubSubNode when node in use

* wait for all nodes cluster state to be ok before testing

* `cluster.minimizeConections` tests

* `client.reconnectStrategry = false | 0` tests

* sharded pubsub + cluster 🎉

* add minimum version to sharded pubsub tests

* add cluster sharded pubsub live reshard test, use stable dockers for tests, make sure to close pubsub clients when a node disconnects from the cluster

* fix "ssubscribe & sunsubscribe" test

* lock search docker to 2.4.9

* change numberOfMasters default to 2

* use edge for bloom

* add tests

* add back getMasters and getSlotMaster as deprecated functions

* add some tests

* fix reconnect strategy + docs

* sharded pubsub docs

* Update pub-sub.md

* some jsdoc, docs, cluster topology test

* clean pub-sub docs

Co-authored-by: Simon Prickett <simon@redislabs.com>

* reconnect startegy docs and bug fix

Co-authored-by: Simon Prickett <simon@redislabs.com>

* refine jsdoc and some docs

Co-authored-by: Simon Prickett <simon@redislabs.com>

* I'm stupid

* fix cluster topology test

* fix cluster topology test

* Update README.md

* Update clustering.md

* Update pub-sub.md

Co-authored-by: Simon Prickett <simon@redislabs.com>
2023-01-25 11:00:39 -05:00
28b9701543 fix #2318 - add MULTI (uppercase) (#2324) 2022-11-24 14:01:43 -05:00
bf80c163b1 fix #2046 - add support for multi in select (#2133)
* fix #2046 - add support for multi in select

* fix "Argument of type 'symbol | undefined' is not assignable to parameter of type 'number | undefined'"
2022-05-26 09:55:47 -04:00
429b11e020 fix #1959 - LCS (#2129)
* fix #1959 - LCS

* newlines at end of files
2022-05-11 14:24:07 -04:00
06c1d2c243 Support all GEORADIUS Commands (#2017)
* Support all GEORADIUS Commands

* move store bool to options

* simplify transformReply for store commands

* clean code

Co-authored-by: leibale <leibale1998@gmail.com>
2022-05-11 09:36:12 -04:00
0752f143a6 prepare 4.1.0 (#2111)
* increase test coverage

* @node-redis to @redis

* ugprade deps

* fix benchmark

* use 7.0 docker (not rc), update readmes, clean code, fix @-redis import

* update readme

* fix function in cluster

* update docs

Co-authored-by: Chayim <chayim@users.noreply.github.com>

* Update clustering.md

* add subpackages move warning

* drop support for node 12

* upgrade deps

* fix tsconfig.base.json

Co-authored-by: Chayim <chayim@users.noreply.github.com>
2022-05-02 11:48:12 -04:00
baf67fd87f fix #1976 - XSETID (#2104) 2022-04-26 09:05:44 -04:00
11c6c24881 Add support for redis functions (#2020)
* fix #1906 - implement BITFIELD_RO

* initial support for redis functions

* fix test utils

* redis functions commands and tests

* upgrade deps

* fix "Property 'uninstall' does not exist on type 'SinonFakeTimers'"

* upgrade dockers version

* Merge branch 'master' of github.com:redis/node-redis into functions

* fix FUNCTION LIST WITHCODE and FUNCTION STATS

* upgrade deps

* set minimum version for FCALL and FCALL_RO

* fix FUNCTION LOAD

* FUNCTION LOAD

* fix FUNCTION LOAD & FUNCTION LIST & FUNCTION LOAD WITHCODE

* fix FUNCTION_LIST_WITHCODE test
2022-04-25 09:09:23 -04:00
b1a0b48d2c Support new muilti pop commands (#2051)
* Support new muilti pop commands

* remove .only

* clean code

* fix for 4558ec6a31

* fix tests

Co-authored-by: leibale <leibale1998@gmail.com>
2022-04-25 07:50:43 -04:00
f6f645bdbb Support SORT_RO (#2041)
* Support SORT_RO

* move pushSortReadOnlyArgs and SortReadOnlyOptions to generic-transformers

* clean code

Co-authored-by: leibale <leibale1998@gmail.com>
2022-03-28 18:36:47 -04:00
515adf1346 Support OBJECT [...] commands (#2014)
* Support OBJECT [...] commands

* move commands to cluster/commands.ts

Co-authored-by: leibale <leibale1998@gmail.com>
2022-03-27 13:35:01 -04:00
24cd9ba9a4 Support new expire features (#2036)
* Support new expire features

* Update PEXPIRETIME.ts

* Update EXPIRETIME.ts

* fix version skip

* clean code

Co-authored-by: leibale <leibale1998@gmail.com>
2022-03-24 10:17:01 -04:00
875298e6e3 Support ZINTERCARD and SINTERCARD (#2040)
* Support ZINTERCARD and SINTERCARD

* clean code

* clean code

Co-authored-by: leibale <leibale1998@gmail.com>
2022-03-20 13:40:19 -04:00
9180b91047 fix #1906 - implement BITFIELD_RO (#1988)
* fix #1906 - implement BITFIELD_RO

* set bitfield_ro min version to 6.2
2022-03-02 05:29:42 -05:00
0803f4e19c add nodeAddressMap config for cluster (#1827)
* add `nodeAddressMap` config for cluster

* Update cluster-slots.ts

* Update cluster-slots.ts

* update docs

Co-authored-by: Guy Royse <guy@guyroyse.com>

Co-authored-by: Guy Royse <guy@guyroyse.com>
2022-02-14 15:23:35 -05:00
46b831c922 fix #1864 - cluster.quit (#1886) 2022-01-31 08:35:35 -05:00
8160fa7d65 fix #1865 - add defaults to RedisModules and RedisScripts (#1885) 2022-01-31 08:35:24 -05:00
2203be5fbd add test for RootNodesUnavailableError 2021-12-30 18:32:48 -05:00
8f88eb289b fix ASK and MOVED errors in multi as well 2021-12-30 17:12:13 -05:00
b97d18b610 fix some types 2021-12-23 17:17:19 -05:00
a0de7967f9 buffers, buffers everywhere... 2021-12-20 14:47:51 -05:00
a1bed9a10f add buffer support to a bunch of commands 2021-12-15 17:08:50 -05:00
42e36dfbb1 enhance cluster reshard handling 2021-11-22 17:42:41 -05:00
7d2629f083 Support esModuleInterop set to false. (#1717)
* Support esModuleInterop set to false.

When testing the upcoming 4.x release, we got a bunch of typescript
errors emitted from this project.

We quickly realized this is because the library uses the esModuleInterop
flag. This makes some imports _slightly_ easier to write, but it comes
at a cost: it forces any application or library using this library to
*also* have esModuleInterop on.

The `esModuleInterop` flag is a bit of a holdover from an earlier time,
and I would not recommend using it in libraries. The main issue is that
if it's set to true, you are forcing any users of the library to also
have `esModuleInterop`, where if you keep have it set to `false` (the
default), you leave the decision to the user.

This change should have no rammifications to users with
`esModuleInterop` on, but it will enable support for those that have it
off.

This is especially good for library authors such as myself, because I
would also like to keep this flag off to not force *my* users into this
feature.

* All tests now pass!

* Move @types/redis-parser into client sub-package

and removed a comma
2021-11-15 16:52:48 -05:00
3d009780ee fix live resharding test 2021-11-10 14:42:53 -05:00
f1f9c7ac24 fix bug in cluster slots, enhance live resharding test 2021-11-10 14:20:46 -05:00
8b3daad88a uncomment "should handle live resharding" test 2021-11-09 13:38:08 -05:00
3eb99dbe83 use dockers for tests, use npm workspaces, add rejson & redisearch modules, fix some bugs 2021-11-08 19:21:15 -05:00