Skip to content

Commit eed4797

Browse files
leibalericsammustard-mhSimon Prickettsimonprickett
authored
v4.0.0-rc.4 (#1723)
* update workflows & README * add .deepsource.toml * fix client.quit, add error events on cluster, fix some "deepsource.io" warnings * Release 4.0.0-rc.1 * add cluster.duplicate, add some tests * fix #1650 - add support for Buffer in some commands, add GET_BUFFER command * fix GET and GET_BUFFER return type * update FAQ * Update invalid code example in README.md (#1654) * Update invalid code example in README.md * Update README.md Co-authored-by: Leibale Eidelman <[email protected]> * fix #1652 * ref #1653 - better types * better types * fix 5412479 * Update GEOSEARCHSTORE.spec.ts * fix #1660 - add support for client.HSET('key', 'field', 'value') * upgrade dependencies, update README * fix #1659 - add support for db-number in client options url * fix README, remove unused import, downgrade typedoc & typedoc-plugin-markdown * update client-configurations.md * fix README * add CLUSTER_SLOTS, add some tests * fix "createClient with url" test with redis 5 * remove unused imports * Release 4.0.0-rc.2 * add missing semicolon * replace empty "transformReply" functions with typescript "declare" * fix EVAL & EVALSHA, add some tests, npm update * fix #1665 - add ZRANGEBYLEX, ZRANGEBYSCORE, ZRANGEBYSCORE_WITHSCORES * new issue templates * add all COMMAND commands * run COMMAND & COMMAND INFO tests only on redis >6 * Create SECURITY.md * fix #1671 - add support for all client configurations in cluster * ref #1671 - add support for defaults * remove some commands from cluster, npm update, clean code, * lock benny version * fix #1674 - remove `isolationPoolOptions` when creating isolated connection * increase test coverage * update .npmignore * Release 4.0.0-rc.3 * fix README * remove whitespace from LICENSE * use "export { x as y }" instead of import & const * move from "NodeRedis" to "Redis" * fix #1676 * update comments * Auth before select database (#1679) * Auth before select database * fix #1681 Co-authored-by: leibale <[email protected]> * Adds connect-as-acl-user example. (#1684) * Adds connect-as-acl-user example. * Adds blank line at end. * Set to private. * Adds examples folder to npmignore. * Adds Apple .DS_Store file to .gitignore (#1685) * Adds Apple .DS_Store file. * Add .DS_Store to .npmignore too Co-authored-by: Leibale Eidelman <[email protected]> * move examples * clean some tests * clean code * Adds examples table of contents and contribution guidelines. (#1686) * Updated examples to use named functions. (#1687) * Updated examples to user named functions. * Update README.md Co-authored-by: Leibale Eidelman <[email protected]> * update docs, add 6.0.x to the tests matrix, add eslint, npm update, fix some commands, fix some types Co-authored-by: Simon Prickett <[email protected]> * fix tests with redis 6.0.x * fix ACL GETUSER test * fix client.quit and client.disconnect * fix ACL GETUSER * Adds TypeScript note and corrects a typo. * Fixes a bug in the Scan Iterator section. (#1694) * Made examples use local version. * Add `lua-multi-incr.js` example (#1692) Also fix syntax error in the lua example in the README Closes #1689. * Add(examples): Create an example for blPop & lPush (#1696) * Add(examples): Create an example for blPop & lPush Signed-off-by: Aditya Rastogi <[email protected]> * Update(examples): fix case, add timeout, update readme Signed-off-by: Aditya Rastogi <[email protected]> Closes #1693. * Add command-with-modifiers.js example (#1695) * Adds TypeScript note and corrects a typo. * Adds command-with-modifiers example. (#1688) * Adds command-with-modifiers example. (#1688) * Adds command-with-modifiers example. (#1688) * Removed callbacks. Co-authored-by: Simon Prickett <[email protected]> Closes #1688. * Issue # 1697 FIX - creates an example script that shows how to use the SSCAN iterator (#1699) * #1697 fix for set scan example * adds the js file * adds comment * Minor layout and comment adjustment. Co-authored-by: srawat2 <shashank19aug> Co-authored-by: Simon Prickett <[email protected]> Closes #1697. * fix #1706 - HSET return type should be number * use dockers for tests, fix some bugs * increase dockers timeout to 30s * release drafter (#1683) * release drafter * fixing contributors * use dockers for tests, use npm workspaces, add rejson & redisearch modules, fix some bugs * fix #1712 - fix LINDEX return type * uncomment TIME tests * use codecov * fix tests.yml * uncomment "should handle live resharding" test * fix #1714 - update README(s) * add package-lock.json * update CONTRIBUTING.md * update examples * uncomment some tests * fix test-utils * move "all-in-one" to root folder * fix tests workflow * fix bug in cluster slots, enhance live resharding test * fix live resharding test * fix #1707 - handle number arguments in legacy mode * Add rejectedUnauthorized and other TLS options (#1708) * Update socket.ts * fix #1716 - decode username and password from url * fix some Z (sorted list) commands, increase commands test coverage * remove empty lines * fix 'Scenario' typo (#1720) * update readmes, add createCluster to the `redis` package * add .release-it.json files, update some md files * run tests on pull requests too * 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 * npm update, remove html from readme * add tests and licence badges * update changelog.md * update .npmignore and .release-it.json * update .release-it.json * Release [email protected] * revert d32f1ed * fix .npmignore * replace @redis with @node-redis * Release [email protected] * update json & search version * Release [email protected] * Release [email protected] * update dependencies * Release [email protected] Co-authored-by: Richard Samuelsson <[email protected]> Co-authored-by: mustard <[email protected]> Co-authored-by: Simon Prickett <[email protected]> Co-authored-by: Simon Prickett <[email protected]> Co-authored-by: Suze Shardlow <[email protected]> Co-authored-by: Joshua T <[email protected]> Co-authored-by: Aditya Rastogi <[email protected]> Co-authored-by: Rohan Kumar <[email protected]> Co-authored-by: Kalki <[email protected]> Co-authored-by: Chayim <[email protected]> Co-authored-by: Da-Jin Chu <[email protected]> Co-authored-by: Henrique Corrêa <[email protected]> Co-authored-by: Evert Pot <[email protected]>
1 parent 199285a commit eed4797

File tree

705 files changed

+9977
-4367
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

705 files changed

+9977
-4367
lines changed

.github/README.md

Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
# Node-Redis
2+
3+
[![Tests](https://img.shields.io/github/workflow/status/redis/node-redis/Tests/master.svg?label=tests)](https://codecov.io/gh/redis/node-redis)
4+
[![Coverage](https://codecov.io/gh/redis/node-redis/branch/master/graph/badge.svg?token=xcfqHhJC37)](https://codecov.io/gh/redis/node-redis)
5+
[![License](https://img.shields.io/github/license/redis/node-redis.svg)](https://codecov.io/gh/redis/node-redis)
6+
[![Chat](https://img.shields.io/discord/697882427875393627.svg)](https://discord.gg/XMMVgxUm)
7+
8+
## Installation
9+
10+
```bash
11+
npm install redis@next
12+
```
13+
14+
> :warning: The new interface is clean and cool, but if you have an existing code base, you'll want to read the [migration guide](../docs/v3-to-v4.md).
15+
16+
## Usage
17+
18+
### Basic Example
19+
20+
```typescript
21+
import { createClient } from 'redis';
22+
23+
(async () => {
24+
const client = createClient();
25+
26+
client.on('error', (err) => console.log('Redis Client Error', err));
27+
28+
await client.connect();
29+
30+
await client.set('key', 'value');
31+
const value = await client.get('key');
32+
})();
33+
```
34+
35+
The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format `redis[s]://[[username][:password]@][host][:port][/db-number]`:
36+
37+
```typescript
38+
createClient({
39+
url: 'redis://alice:[email protected]:6380'
40+
});
41+
```
42+
43+
You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](../docs/client-configuration.md).
44+
45+
### Redis Commands
46+
47+
There is built-in support for all of the [out-of-the-box Redis commands](https://redis.io/commands). They are exposed using the raw Redis command names (`HSET`, `HGETALL`, etc.) and a friendlier camel-cased version (`hSet`, `hGetAll`, etc.):
48+
49+
```typescript
50+
// raw Redis commands
51+
await client.HSET('key', 'field', 'value');
52+
await client.HGETALL('key');
53+
54+
// friendly JavaScript commands
55+
await client.hSet('key', 'field', 'value');
56+
await client.hGetAll('key');
57+
```
58+
59+
Modifiers to commands are specified using a JavaScript object:
60+
61+
```typescript
62+
await client.set('key', 'value', {
63+
EX: 10,
64+
NX: true
65+
});
66+
```
67+
68+
Replies will be transformed into useful data structures:
69+
70+
```typescript
71+
await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' }
72+
await client.hVals('key'); // ['value1', 'value2']
73+
```
74+
75+
### Unsupported Redis Commands
76+
77+
If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use `.sendCommand()`:
78+
79+
```typescript
80+
await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK'
81+
82+
await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2']
83+
```
84+
85+
### Transactions (Multi/Exec)
86+
87+
Start a [transaction](https://redis.io/topics/transactions) by calling `.multi()`, then chaining your commands. When you're done, call `.exec()` and you'll get an array back with your results:
88+
89+
```typescript
90+
await client.set('another-key', 'another-value');
91+
92+
const [setKeyReply, otherKeyValue] = await client
93+
.multi()
94+
.set('key', 'value')
95+
.get('another-key')
96+
.exec(); // ['OK', 'another-value']
97+
```
98+
99+
You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change.
100+
101+
To dig deeper into transactions, check out the [Isolated Execution Guide](../docs/isolated-execution.md).
102+
103+
### Blocking Commands
104+
105+
Any command can be run on a new connection by specifying the `isolated` option. The newly created connection is closed when the command's `Promise` is fulfilled.
106+
107+
This pattern works especially well for blocking commands—such as `BLPOP` and `BLMOVE`:
108+
109+
```typescript
110+
import { commandOptions } from 'redis';
111+
112+
const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key', 0);
113+
114+
await client.lPush('key', ['1', '2']);
115+
116+
await blPopPromise; // '2'
117+
```
118+
119+
To learn more about isolated execution, check out the [guide](../docs/isolated-execution.md).
120+
121+
### Pub/Sub
122+
123+
Subscribing to a channel requires a dedicated stand-alone connection. You can easily get one by `.duplicate()`ing an existing Redis connection.
124+
125+
```typescript
126+
const subscriber = client.duplicate();
127+
128+
await subscriber.connect();
129+
```
130+
131+
Once you have one, simply subscribe and unsubscribe as needed:
132+
133+
```typescript
134+
await subscriber.subscribe('channel', (message) => {
135+
console.log(message); // 'message'
136+
});
137+
138+
await subscriber.pSubscribe('channe*', (message, channel) => {
139+
console.log(message, channel); // 'message', 'channel'
140+
});
141+
142+
await subscriber.unsubscribe('channel');
143+
144+
await subscriber.pUnsubscribe('channe*');
145+
```
146+
147+
Publish a message on a channel:
148+
149+
```typescript
150+
await publisher.publish('channel', 'message');
151+
```
152+
153+
### Scan Iterator
154+
155+
[`SCAN`](https://redis.io/commands/scan) results can be looped over using [async iterators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator):
156+
157+
```typescript
158+
for await (const key of client.scanIterator()) {
159+
// use the key!
160+
await client.get(key);
161+
}
162+
```
163+
164+
This works with `HSCAN`, `SSCAN`, and `ZSCAN` too:
165+
166+
```typescript
167+
for await (const { field, value } of client.hScanIterator('hash')) {}
168+
for await (const member of client.sScanIterator('set')) {}
169+
for await (const { score, member } of client.zScanIterator('sorted-set')) {}
170+
```
171+
172+
You can override the default options by providing a configuration object:
173+
174+
```typescript
175+
client.scanIterator({
176+
TYPE: 'string', // `SCAN` only
177+
MATCH: 'patter*',
178+
COUNT: 100
179+
});
180+
```
181+
182+
### Lua Scripts
183+
184+
Define new functions using [Lua scripts](https://redis.io/commands/eval) which execute on the Redis server:
185+
186+
```typescript
187+
import { createClient, defineScript } from 'redis';
188+
189+
(async () => {
190+
const client = createClient({
191+
scripts: {
192+
add: defineScript({
193+
NUMBER_OF_KEYS: 1,
194+
SCRIPT:
195+
'local val = redis.pcall("GET", KEYS[1]);' +
196+
'return val + ARGV[1];',
197+
transformArguments(key: string, toAdd: number): Array<string> {
198+
return [key, toAdd.toString()];
199+
},
200+
transformReply(reply: number): number {
201+
return reply;
202+
}
203+
})
204+
}
205+
});
206+
207+
await client.connect();
208+
209+
await client.set('key', '1');
210+
await client.add('key', 2); // 3
211+
})();
212+
```
213+
214+
### Disconnecting
215+
216+
There are two functions that disconnect a client from the Redis server. In most scenarios you should use `.quit()` to ensure that pending commands are sent to Redis before closing a connection.
217+
218+
#### `.QUIT()`/`.quit()`
219+
220+
Gracefully close a client's connection to Redis, by sending the [`QUIT`](https://redis.io/commands/quit) command to the server. Before quitting, the client executes any remaining commands in its queue, and will receive replies from Redis for each of them.
221+
222+
```typescript
223+
const [ping, get, quit] = await Promise.all([
224+
client.ping(),
225+
client.get('key'),
226+
client.quit()
227+
]); // ['PONG', null, 'OK']
228+
229+
try {
230+
await client.get('key');
231+
} catch (err) {
232+
// ClosedClient Error
233+
}
234+
```
235+
236+
#### `.disconnect()`
237+
238+
Forcibly close a client's connection to Redis immediately. Calling `disconnect` will not send further pending commands to the Redis server, or wait for or parse outstanding responses.
239+
240+
```typescript
241+
await client.disconnect();
242+
```
243+
244+
### Auto-Pipelining
245+
246+
Node Redis will automatically pipeline requests that are made during the same "tick".
247+
248+
```typescript
249+
client.set('Tm9kZSBSZWRpcw==', 'users:1');
250+
client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==');
251+
```
252+
253+
Of course, if you don't do something with your Promises you're certain to get [unhandled Promise exceptions](https://nodejs.org/api/process.html#process_event_unhandledrejection). To take advantage of auto-pipelining and handle your Promises, use `Promise.all()`.
254+
255+
```typescript
256+
await Promise.all([
257+
client.set('Tm9kZSBSZWRpcw==', 'users:1'),
258+
client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==')
259+
]);
260+
```
261+
262+
### Clustering
263+
264+
Check out the [Clustering Guide](../docs/clustering.md) when using Node Redis to connect to a Redis Cluster.
265+
266+
## Supported Redis versions
267+
268+
Node Redis is supported with the following versions of Redis:
269+
270+
| Version | Supported |
271+
|---------|--------------------|
272+
| 6.2.z | :heavy_check_mark: |
273+
| 6.0.z | :heavy_check_mark: |
274+
| 5.y.z | :heavy_check_mark: |
275+
| < 5.0 | :x: |
276+
277+
> Node Redis should work with older versions of Redis, but it is not fully tested and we cannot offer support.
278+
279+
## Packages
280+
281+
| Name | Description |
282+
|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
283+
| [redis](../) | [![Downloads](https://img.shields.io/npm/dm/redis.svg)](https://www.npmjs.com/package/redis/v/next) [![Version](https://img.shields.io/npm/v/redis/next.svg)](https://www.npmjs.com/package/redis/v/next) |
284+
| [@node-redis/client](../packages/client) | [![Downloads](https://img.shields.io/npm/dm/@node-redis/client.svg)](https://www.npmjs.com/package/@node-redis/client/v/next) [![Version](https://img.shields.io/npm/v/@node-redis/client/next.svg)](https://www.npmjs.com/package/@node-redis/client/v/next) |
285+
| [@node-redis/json](../packages/json) | [![Downloads](https://img.shields.io/npm/dm/@node-redis/json.svg)](https://www.npmjs.com/package/@node-redis/json/v/next) [![Version](https://img.shields.io/npm/v/@node-redis/json/next.svg)](https://www.npmjs.com/package/@node-redis/json/v/next) [Redis JSON](https://oss.redis.com/redisjson/) commands |
286+
| [@node-redis/search](../packages/search) | [![Downloads](https://img.shields.io/npm/dm/@node-redis/search.svg)](https://www.npmjs.com/package/@node-redis/search/v/next) [![Version](https://img.shields.io/npm/v/@node-redis/search/next.svg)](https://www.npmjs.com/package/@node-redis/search/v/next) [Redis Search](https://oss.redis.com/redisearch/) commands |
287+
288+
## Contributing
289+
290+
If you'd like to contribute, check out the [contributing guide](CONTRIBUTING.md).
291+
292+
Thank you to all the people who already contributed to Node Redis!
293+
294+
[![Contributors](https://contrib.rocks/image?repo=redis/node-redis)](https://github.com/redis/node-redis/graphs/contributors)
295+
296+
## License
297+
298+
This repository is licensed under the "MIT" license. See [LICENSE](LICENSE).

.github/release-drafter-config.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
name-template: 'Version $NEXT_PATCH_VERSION'
2+
tag-template: 'v$NEXT_PATCH_VERSION'
3+
autolabeler:
4+
- label: 'chore'
5+
files:
6+
- '*.md'
7+
- '.github/*'
8+
- label: 'bug'
9+
branch:
10+
- '/bug-.+'
11+
- label: 'chore'
12+
branch:
13+
- '/chore-.+'
14+
- label: 'feature'
15+
branch:
16+
- '/feature-.+'
17+
categories:
18+
- title: 'Breaking Changes'
19+
labels:
20+
- 'breakingchange'
21+
- title: '🚀 New Features'
22+
labels:
23+
- 'feature'
24+
- 'enhancement'
25+
- title: '🐛 Bug Fixes'
26+
labels:
27+
- 'fix'
28+
- 'bugfix'
29+
- 'bug'
30+
- title: '🧰 Maintenance'
31+
label: 'chore'
32+
change-template: '- $TITLE (#$NUMBER)'
33+
exclude-labels:
34+
- 'skip-changelog'
35+
template: |
36+
## Changes
37+
38+
$CHANGES
39+
40+
## Contributors
41+
We'd like to thank all the contributors who worked on this release!
42+
43+
$CONTRIBUTORS

.github/workflows/benchmark.yml

Lines changed: 0 additions & 46 deletions
This file was deleted.

0 commit comments

Comments
 (0)