diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 89925b55d4..9753535b53 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -22,7 +22,7 @@ jobs: fail-fast: false matrix: node-version: ["18", "20", "22"] - redis-version: ["rs-7.4.0-v1", "8.0.2", "8.2-rc2-pre"] + redis-version: ["rs-7.4.0-v1", "8.0.2", "8.2"] steps: - uses: actions/checkout@v4 with: diff --git a/README.md b/README.md index ab6b4707e6..9948858db9 100644 --- a/README.md +++ b/README.md @@ -241,7 +241,7 @@ Node Redis v5 adds support for [Client Side Caching](https://redis.io/docs/manua ```typescript // Enable client side caching with RESP3 const client = createClient({ - RESP: 3, + RESP: 3, clientSideCache: { ttl: 0, // Time-to-live (0 = no expiration) maxEntries: 0, // Maximum entries (0 = unlimited) @@ -304,6 +304,7 @@ Node Redis is supported with the following versions of Redis: | Version | Supported | | ------- | ------------------ | +| 8.2.z | :heavy_check_mark: | | 8.0.z | :heavy_check_mark: | | 7.4.z | :heavy_check_mark: | | 7.2.z | :heavy_check_mark: | diff --git a/package-lock.json b/package-lock.json index ede6844f0b..b4fa4834c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7337,7 +7337,7 @@ }, "packages/bloom": { "name": "@redis/bloom", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "devDependencies": { "@redis/test-utils": "*" @@ -7346,12 +7346,12 @@ "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" } }, "packages/client": { "name": "@redis/client", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2" @@ -7367,7 +7367,7 @@ }, "packages/entraid": { "name": "@redis/entraid", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "dependencies": { "@azure/identity": "^4.7.0", @@ -7386,7 +7386,7 @@ "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" } }, "packages/entraid/node_modules/@types/node": { @@ -7423,7 +7423,7 @@ }, "packages/json": { "name": "@redis/json", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "devDependencies": { "@redis/test-utils": "*" @@ -7432,18 +7432,18 @@ "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" } }, "packages/redis": { - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "dependencies": { - "@redis/bloom": "5.8.0", - "@redis/client": "5.8.0", - "@redis/json": "5.8.0", - "@redis/search": "5.8.0", - "@redis/time-series": "5.8.0" + "@redis/bloom": "5.8.1", + "@redis/client": "5.8.1", + "@redis/json": "5.8.1", + "@redis/search": "5.8.1", + "@redis/time-series": "5.8.1" }, "engines": { "node": ">= 18" @@ -7451,7 +7451,7 @@ }, "packages/search": { "name": "@redis/search", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "devDependencies": { "@redis/test-utils": "*" @@ -7460,7 +7460,7 @@ "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" } }, "packages/test-utils": { @@ -7529,7 +7529,7 @@ }, "packages/time-series": { "name": "@redis/time-series", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "devDependencies": { "@redis/test-utils": "*" @@ -7538,7 +7538,7 @@ "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" } } } diff --git a/packages/bloom/lib/test-utils.ts b/packages/bloom/lib/test-utils.ts index 0f77acae6f..64bc348409 100644 --- a/packages/bloom/lib/test-utils.ts +++ b/packages/bloom/lib/test-utils.ts @@ -4,7 +4,7 @@ import RedisBloomModules from '.'; export default TestUtils.createFromConfig({ dockerImageName: 'redislabs/client-libs-test', dockerImageVersionArgument: 'redis-version', - defaultDockerVersion: '8.2-rc2-pre' + defaultDockerVersion: '8.2' }); export const GLOBAL = { diff --git a/packages/bloom/package.json b/packages/bloom/package.json index 00af3c1869..35e65009ce 100644 --- a/packages/bloom/package.json +++ b/packages/bloom/package.json @@ -1,6 +1,6 @@ { "name": "@redis/bloom", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "main": "./dist/lib/index.js", "types": "./dist/lib/index.d.ts", @@ -13,7 +13,7 @@ "release": "release-it" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" }, "devDependencies": { "@redis/test-utils": "*" diff --git a/packages/client/lib/client/index.spec.ts b/packages/client/lib/client/index.spec.ts index 0aed98450d..9c33f2ce84 100644 --- a/packages/client/lib/client/index.spec.ts +++ b/packages/client/lib/client/index.spec.ts @@ -167,6 +167,14 @@ describe('Client', () => { } ); }); + + it('DB in URL should be parsed', async () => { + const client = RedisClient.create({ + url: 'redis://user:secret@localhost:6379/5' + }); + + assert.equal(client?.options?.database, 5); + }) }); describe('parseOptions', () => { diff --git a/packages/client/lib/client/index.ts b/packages/client/lib/client/index.ts index ccad872e22..1a27ea8898 100644 --- a/packages/client/lib/client/index.ts +++ b/packages/client/lib/client/index.ts @@ -496,8 +496,14 @@ export default class RedisClient< this._commandOptions = options.commandOptions; } - if (options) { - return RedisClient.parseOptions(options); + if (options?.url) { + const parsedOptions = RedisClient.parseOptions(options); + + if (parsedOptions?.database) { + this._self.#selectedDB = parsedOptions.database; + } + + return parsedOptions; } return options; diff --git a/packages/client/lib/commands/EXPIRE.ts b/packages/client/lib/commands/EXPIRE.ts index 15855832c3..985b81071a 100644 --- a/packages/client/lib/commands/EXPIRE.ts +++ b/packages/client/lib/commands/EXPIRE.ts @@ -2,7 +2,6 @@ import { CommandParser } from '../client/parser'; import { RedisArgument, NumberReply, Command } from '../RESP/types'; export default { - IS_READ_ONLY: true, /** * Sets a timeout on key. After the timeout has expired, the key will be automatically deleted * @param parser - The Redis command parser diff --git a/packages/client/lib/commands/EXPIREAT.ts b/packages/client/lib/commands/EXPIREAT.ts index 4956b8aa23..a20407aa78 100644 --- a/packages/client/lib/commands/EXPIREAT.ts +++ b/packages/client/lib/commands/EXPIREAT.ts @@ -3,7 +3,6 @@ import { RedisArgument, NumberReply, Command } from '../RESP/types'; import { transformEXAT } from './generic-transformers'; export default { - IS_READ_ONLY: true, /** * Sets the expiration for a key at a specific Unix timestamp * @param parser - The Redis command parser diff --git a/packages/client/lib/sentinel/test-util.ts b/packages/client/lib/sentinel/test-util.ts index a88c981858..1f8d75a76d 100644 --- a/packages/client/lib/sentinel/test-util.ts +++ b/packages/client/lib/sentinel/test-util.ts @@ -174,16 +174,16 @@ export class SentinelFramework extends DockerBase { this.#testUtils = TestUtils.createFromConfig({ dockerImageName: 'redislabs/client-libs-test', dockerImageVersionArgument: 'redis-version', - defaultDockerVersion: '8.2-rc2-pre' + defaultDockerVersion: '8.2' }); this.#nodeMap = new Map>>>(); this.#sentinelMap = new Map>>>(); } - getSentinelClient(opts?: Partial>, errors = true) { if (opts?.sentinelRootNodes !== undefined) { throw new Error("cannot specify sentinelRootNodes here"); @@ -252,7 +252,7 @@ export class SentinelFramework extends DockerBase { protected async spawnRedisSentinelNodes(replicasCount: number) { const master = await this.#testUtils.spawnRedisServer({serverArguments: DEBUG_MODE_ARGS}) - + const replicas: Array = [] for (let i = 0; i < replicasCount; i++) { const replica = await this.#testUtils.spawnRedisServer({serverArguments: DEBUG_MODE_ARGS}) @@ -282,7 +282,7 @@ export class SentinelFramework extends DockerBase { async getAllRunning() { for (const port of this.getAllNodesPort()) { let first = true; - while (await isPortAvailable(port)) { + while (await isPortAvailable(port)) { if (!first) { console.log(`problematic restart ${port}`); await setTimeout(500); @@ -295,7 +295,7 @@ export class SentinelFramework extends DockerBase { for (const port of this.getAllSentinelsPort()) { let first = true; - while (await isPortAvailable(port)) { + while (await isPortAvailable(port)) { if (!first) { await setTimeout(500); } else { @@ -325,7 +325,7 @@ export class SentinelFramework extends DockerBase { await client.connect(); await client.replicaOf("127.0.0.1", masterPort); await client.close(); - + this.#nodeList.push(replica); this.#nodeMap.set(replica.port.toString(), replica); @@ -333,9 +333,9 @@ export class SentinelFramework extends DockerBase { async getMaster(tracer?: Array): Promise { const client = RedisClient.create({ - name: this.config.sentinelName, + name: this.config.sentinelName, socket: { - host: "127.0.0.1", + host: "127.0.0.1", port: this.#sentinelList[0].port, }, modules: RedisSentinelModule, @@ -464,9 +464,9 @@ export class SentinelFramework extends DockerBase { async sentinelSentinels() { const client = RedisClient.create({ - name: this.config.sentinelName, + name: this.config.sentinelName, socket: { - host: "127.0.0.1", + host: "127.0.0.1", port: this.#sentinelList[0].port, }, modules: RedisSentinelModule, @@ -480,9 +480,9 @@ export class SentinelFramework extends DockerBase { async sentinelMaster() { const client = RedisClient.create({ - name: this.config.sentinelName, + name: this.config.sentinelName, socket: { - host: "127.0.0.1", + host: "127.0.0.1", port: this.#sentinelList[0].port, }, modules: RedisSentinelModule, @@ -496,9 +496,9 @@ export class SentinelFramework extends DockerBase { async sentinelReplicas() { const client = RedisClient.create({ - name: this.config.sentinelName, + name: this.config.sentinelName, socket: { - host: "127.0.0.1", + host: "127.0.0.1", port: this.#sentinelList[0].port, }, modules: RedisSentinelModule, @@ -509,4 +509,4 @@ export class SentinelFramework extends DockerBase { return replicas } -} \ No newline at end of file +} diff --git a/packages/client/lib/test-utils.ts b/packages/client/lib/test-utils.ts index 62509dee14..d6cb67aa01 100644 --- a/packages/client/lib/test-utils.ts +++ b/packages/client/lib/test-utils.ts @@ -9,7 +9,7 @@ import RedisBloomModules from '@redis/bloom'; const utils = TestUtils.createFromConfig({ dockerImageName: 'redislabs/client-libs-test', dockerImageVersionArgument: 'redis-version', - defaultDockerVersion: '8.2-rc2-pre' + defaultDockerVersion: '8.2' }); export default utils; diff --git a/packages/client/package.json b/packages/client/package.json index b7c11d57a8..c685f60e77 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@redis/client", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/entraid/lib/test-utils.ts b/packages/entraid/lib/test-utils.ts index 1b63a955bf..2a240db341 100644 --- a/packages/entraid/lib/test-utils.ts +++ b/packages/entraid/lib/test-utils.ts @@ -6,7 +6,7 @@ import { EntraidCredentialsProvider } from './entraid-credentials-provider'; export const testUtils = TestUtils.createFromConfig({ dockerImageName: 'redislabs/client-libs-test', dockerImageVersionArgument: 'redis-version', - defaultDockerVersion: '8.2-rc2-pre' + defaultDockerVersion: '8.2' }); const DEBUG_MODE_ARGS = testUtils.isVersionGreaterThan([7]) ? diff --git a/packages/entraid/package.json b/packages/entraid/package.json index 2ef4cfca79..2eee504a1f 100644 --- a/packages/entraid/package.json +++ b/packages/entraid/package.json @@ -1,6 +1,6 @@ { "name": "@redis/entraid", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -22,7 +22,7 @@ "@azure/msal-node": "^2.16.1" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" }, "devDependencies": { "@types/express": "^4.17.21", diff --git a/packages/json/lib/test-utils.ts b/packages/json/lib/test-utils.ts index 81a546fcd6..629c2a5fd6 100644 --- a/packages/json/lib/test-utils.ts +++ b/packages/json/lib/test-utils.ts @@ -4,7 +4,7 @@ import RedisJSON from '.'; export default TestUtils.createFromConfig({ dockerImageName: 'redislabs/client-libs-test', dockerImageVersionArgument: 'redis-version', - defaultDockerVersion: '8.2-rc2-pre' + defaultDockerVersion: '8.2' }); export const GLOBAL = { diff --git a/packages/json/package.json b/packages/json/package.json index bab27df34c..2879186a9c 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -1,6 +1,6 @@ { "name": "@redis/json", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "main": "./dist/lib/index.js", "types": "./dist/lib/index.d.ts", @@ -13,7 +13,7 @@ "release": "release-it" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" }, "devDependencies": { "@redis/test-utils": "*" diff --git a/packages/redis/package.json b/packages/redis/package.json index c3cbc01442..de4ac275ed 100644 --- a/packages/redis/package.json +++ b/packages/redis/package.json @@ -1,7 +1,7 @@ { "name": "redis", "description": "A modern, high performance Redis client", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -13,11 +13,11 @@ "release": "release-it" }, "dependencies": { - "@redis/bloom": "5.8.0", - "@redis/client": "5.8.0", - "@redis/json": "5.8.0", - "@redis/search": "5.8.0", - "@redis/time-series": "5.8.0" + "@redis/bloom": "5.8.1", + "@redis/client": "5.8.1", + "@redis/json": "5.8.1", + "@redis/search": "5.8.1", + "@redis/time-series": "5.8.1" }, "engines": { "node": ">= 18" diff --git a/packages/search/lib/test-utils.ts b/packages/search/lib/test-utils.ts index ef4c759b43..ed1f864ef2 100644 --- a/packages/search/lib/test-utils.ts +++ b/packages/search/lib/test-utils.ts @@ -5,7 +5,7 @@ import { RespVersions } from '@redis/client'; export default TestUtils.createFromConfig({ dockerImageName: 'redislabs/client-libs-test', dockerImageVersionArgument: 'redis-version', - defaultDockerVersion: '8.2-rc2-pre' + defaultDockerVersion: '8.2' }); export const GLOBAL = { diff --git a/packages/search/package.json b/packages/search/package.json index 8095a418d6..866371ba11 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -1,6 +1,6 @@ { "name": "@redis/search", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "main": "./dist/lib/index.js", "types": "./dist/lib/index.d.ts", @@ -14,7 +14,7 @@ "release": "release-it" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" }, "devDependencies": { "@redis/test-utils": "*" diff --git a/packages/time-series/lib/test-utils.ts b/packages/time-series/lib/test-utils.ts index 388069ca8a..d454a3c6b6 100644 --- a/packages/time-series/lib/test-utils.ts +++ b/packages/time-series/lib/test-utils.ts @@ -4,7 +4,7 @@ import TimeSeries from '.'; export default TestUtils.createFromConfig({ dockerImageName: 'redislabs/client-libs-test', dockerImageVersionArgument: 'redis-version', - defaultDockerVersion: '8.2-rc2-pre' + defaultDockerVersion: '8.2' }); export const GLOBAL = { diff --git a/packages/time-series/package.json b/packages/time-series/package.json index 0ca01943a5..b22bbd9cb0 100644 --- a/packages/time-series/package.json +++ b/packages/time-series/package.json @@ -1,6 +1,6 @@ { "name": "@redis/time-series", - "version": "5.8.0", + "version": "5.8.1", "license": "MIT", "main": "./dist/lib/index.js", "types": "./dist/lib/index.d.ts", @@ -13,7 +13,7 @@ "release": "release-it" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.1" }, "devDependencies": { "@redis/test-utils": "*"