diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 55194335a0..7783b1329f 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,6 +1,6 @@
# Contributing to Lettuce
-Lettuce is released under the Apache 2.0 license. If you would like to contribute something, or simply want to hack on the code this document should help you get started.
+Lettuce is released under the MIT license. If you would like to contribute something, or simply want to hack on the code this document should help you get started.
## Code of Conduct
diff --git a/.github/wordlist.txt b/.github/wordlist.txt
index 97da8e4180..f51a8a92cd 100644
--- a/.github/wordlist.txt
+++ b/.github/wordlist.txt
@@ -251,3 +251,5 @@ unix
uring
whitespace
xml
+RedisJSON
+MkDocs
\ No newline at end of file
diff --git a/README.md b/README.md
index 2dbf4eb032..8358a1538e 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,16 @@
Lettuce - Advanced Java Redis client
===============================
- [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.lettuce/lettuce-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.lettuce/lettuce-core)
- [![Javadocs](https://www.javadoc.io/badge/io.lettuce/lettuce-core.svg)](https://www.javadoc.io/doc/io.lettuce/lettuce-core)
- [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE.txt)
[![Integration](https://github.com/redis/lettuce/actions/workflows/integration.yml/badge.svg?branch=main)](https://github.com/redis/lettuce/actions/workflows/integration.yml)
[![codecov](https://codecov.io/gh/redis/lettuce/branch/main/graph/badge.svg?token=pAstxAAjYo)](https://codecov.io/gh/redis/lettuce)
- [![Discord](https://img.shields.io/discord/697882427875393627?style=flat-square)](https://discord.gg/redis)
+ [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE.txt)
+ [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.lettuce/lettuce-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.lettuce/lettuce-core)
+ [![Javadocs](https://www.javadoc.io/badge/io.lettuce/lettuce-core.svg)](https://www.javadoc.io/doc/io.lettuce/lettuce-core)
+
+[![Discord](https://img.shields.io/discord/697882427875393627.svg?style=social&logo=discord)](https://discord.gg/redis)
+[![Twitch](https://img.shields.io/twitch/status/redisinc?style=social)](https://www.twitch.tv/redisinc)
+[![YouTube](https://img.shields.io/youtube/channel/views/UCD78lHSwYqMlyetR0_P4Vig?style=social)](https://www.youtube.com/redisinc)
+[![Twitter](https://img.shields.io/twitter/follow/redisinc?style=social)](https://twitter.com/redisinc)
Lettuce is a scalable thread-safe Redis client for synchronous,
asynchronous and reactive usage. Multiple threads may share one connection if they avoid blocking and transactional
@@ -43,16 +47,6 @@ See the [reference documentation](https://redis.github.io/lettuce/) and [API Ref
[Work at Redis](https://redis.com/company/careers/jobs/)
-Communication
----------------
-
-* [GitHub Discussions](https://github.com/redis/lettuce/discussions) (Q&A, Ideas, General discussion)
-* Stack Overflow (Questions): [https://stackoverflow.com/questions/tagged/lettuce](https://stackoverflow.com/questions/tagged/lettuce)
-* Discord: [![Discord](https://img.shields.io/discord/697882427875393627.svg?style=social&logo=discord)](https://discord.gg/redis)
-* Twitter: [![Twitter](https://img.shields.io/twitter/follow/redisinc?style=social)](https://twitter.com/redisinc)
-* [GitHub Issues](https://github.com/redis/lettuce/issues) (Bug reports, feature requests)
-
-
Documentation
---------------
diff --git a/docs/new-features.md b/docs/new-features.md
index 5b02a98533..c67cd1089d 100644
--- a/docs/new-features.md
+++ b/docs/new-features.md
@@ -1,5 +1,12 @@
# New & Noteworthy
+## What’s new in Lettuce 6.5
+
+- [RedisJSON support](user-guide/redis-json.md) through `RedisJSONCommands` and the respective reactive, async and Kotlin APIs
+- Complete support for all `CLUSTER` commands (added `CLUSTER MYSHARDID` and `CLUSTER LINKS`)
+- Added support for the `CLIENT TRACKING` command
+- Migrated the documentation to [MkDocs](https://www.mkdocs.org/)
+
## What’s new in Lettuce 6.4
- [Hash Field Expiration](https://redis.io/docs/latest/develop/data-types/hashes/#field-expiration) is now fully supported
diff --git a/src/main/java/io/lettuce/core/json/README.md b/docs/user-guide/redis-json.md
similarity index 100%
rename from src/main/java/io/lettuce/core/json/README.md
rename to docs/user-guide/redis-json.md
diff --git a/src/main/java/io/lettuce/core/api/reactive/RedisHashReactiveCommands.java b/src/main/java/io/lettuce/core/api/reactive/RedisHashReactiveCommands.java
index c0bc9f073d..99d60e7053 100644
--- a/src/main/java/io/lettuce/core/api/reactive/RedisHashReactiveCommands.java
+++ b/src/main/java/io/lettuce/core/api/reactive/RedisHashReactiveCommands.java
@@ -314,7 +314,7 @@ public interface RedisHashReactiveCommands {
* @param channel streaming channel that receives a call for every key.
* @param key the key.
* @return StreamScanCursor scan cursor.
- * @deprecated since 7.0 in favor of consuming large results through the {@link org.reactivestreams.Publisher} returned by
+ * @deprecated since 6.4 in favor of consuming large results through the {@link org.reactivestreams.Publisher} returned by
* {@link #hscanNovalues}.
*/
@Deprecated
@@ -340,7 +340,7 @@ public interface RedisHashReactiveCommands {
* @param key the key.
* @param scanArgs scan arguments.
* @return StreamScanCursor scan cursor.
- * @deprecated since 7.0 in favor of consuming large results through the {@link org.reactivestreams.Publisher} returned by
+ * @deprecated since 6.4 in favor of consuming large results through the {@link org.reactivestreams.Publisher} returned by
* {@link #hscanNovalues}.
*/
@Deprecated
@@ -368,7 +368,7 @@ public interface RedisHashReactiveCommands {
* @param scanCursor cursor to resume from a previous scan, must not be {@code null}.
* @param scanArgs scan arguments.
* @return StreamScanCursor scan cursor.
- * @deprecated since 7.0 in favor of consuming large results through the {@link org.reactivestreams.Publisher} returned by
+ * @deprecated since 6.4 in favor of consuming large results through the {@link org.reactivestreams.Publisher} returned by
* {@link #hscanNovalues}.
*/
@Deprecated
@@ -394,7 +394,7 @@ public interface RedisHashReactiveCommands {
* @param key the key.
* @param scanCursor cursor to resume from a previous scan, must not be {@code null}.
* @return StreamScanCursor scan cursor.
- * @deprecated since 7.0 in favor of consuming large results through the {@link org.reactivestreams.Publisher} returned by
+ * @deprecated since 6.4 in favor of consuming large results through the {@link org.reactivestreams.Publisher} returned by
* {@link #hscanNovalues}.
*/
@Deprecated
diff --git a/src/main/kotlin/io/lettuce/core/ScanFlow.kt b/src/main/kotlin/io/lettuce/core/ScanFlow.kt
index 7cc560fb60..0c8853df5d 100644
--- a/src/main/kotlin/io/lettuce/core/ScanFlow.kt
+++ b/src/main/kotlin/io/lettuce/core/ScanFlow.kt
@@ -82,7 +82,7 @@ object ScanFlow {
* @param key the key.
* @param scanArgs scan arguments.
* @return `Flow>` flow of key-values.
- * @since 7.0
+ * @since 6.4
*/
fun hscanNovalues(commands: RedisHashCoroutinesCommands, key: K, scanArgs: ScanArgs? = null): Flow {
val ops = when (commands) {
diff --git a/src/main/kotlin/io/lettuce/core/api/coroutines/BaseRedisCoroutinesCommands.kt b/src/main/kotlin/io/lettuce/core/api/coroutines/BaseRedisCoroutinesCommands.kt
index df829da7b5..475a9f81bc 100644
--- a/src/main/kotlin/io/lettuce/core/api/coroutines/BaseRedisCoroutinesCommands.kt
+++ b/src/main/kotlin/io/lettuce/core/api/coroutines/BaseRedisCoroutinesCommands.kt
@@ -91,7 +91,7 @@ interface BaseRedisCoroutinesCommands {
*
* @param shardChannels channel keys.
* @return array-reply a list of channels and number of subscribers for every channel.
- * @since 7.0
+ * @since 6.4
*/
suspend fun pubsubShardNumsub(vararg shardChannels: K): Map?
@@ -108,7 +108,7 @@ interface BaseRedisCoroutinesCommands {
* @param shardChannel the shard channel type: key.
* @param message the message type: value.
* @return Long integer-reply the number of clients that received the message.
- * @since 7.0
+ * @since 6.4
*/
suspend fun spublish(shardChannel: K, message: V): Long?
diff --git a/src/main/kotlin/io/lettuce/core/api/coroutines/RedisHashCoroutinesCommands.kt b/src/main/kotlin/io/lettuce/core/api/coroutines/RedisHashCoroutinesCommands.kt
index 99c330a35b..3bee6f59b9 100644
--- a/src/main/kotlin/io/lettuce/core/api/coroutines/RedisHashCoroutinesCommands.kt
+++ b/src/main/kotlin/io/lettuce/core/api/coroutines/RedisHashCoroutinesCommands.kt
@@ -190,7 +190,7 @@ interface RedisHashCoroutinesCommands {
*
* @param key the key.
* @return KeyScanCursor key scan cursor.
- * @since 7.0
+ * @since 6.4
*/
suspend fun hscanNovalues(key: K): KeyScanCursor?
@@ -209,7 +209,7 @@ interface RedisHashCoroutinesCommands {
* @param key the key.
* @param scanArgs scan arguments.
* @return KeyScanCursor key scan cursor.
- * @since 7.0
+ * @since 6.4
*/
suspend fun hscanNovalues(key: K, scanArgs: ScanArgs): KeyScanCursor?
@@ -230,7 +230,7 @@ interface RedisHashCoroutinesCommands {
* @param scanCursor cursor to resume from a previous scan, must not be `null`.
* @param scanArgs scan arguments.
* @return KeyScanCursor key scan cursor.
- * @since 7.0
+ * @since 6.4
*/
suspend fun hscanNovalues(key: K, scanCursor: ScanCursor, scanArgs: ScanArgs): KeyScanCursor?
@@ -249,7 +249,7 @@ interface RedisHashCoroutinesCommands {
* @param key the key.
* @param scanCursor cursor to resume from a previous scan, must not be `null`.
* @return KeyScanCursor key scan cursor.
- * @since 7.0
+ * @since 6.4
*/
suspend fun hscanNovalues(key: K, scanCursor: ScanCursor): KeyScanCursor?
@@ -317,7 +317,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is 0; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpire(key: K, seconds: Long, vararg fields: K): List
@@ -332,7 +332,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is 0; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpire(key: K, seconds: Long, expireArgs: ExpireArgs, vararg fields: K): List
@@ -346,7 +346,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is 0; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpire(key: K, seconds: Duration, vararg fields: K): List
@@ -361,7 +361,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is 0; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpire(key: K, seconds: Duration, expireArgs: ExpireArgs, vararg fields: K): List
@@ -375,7 +375,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpireat(key: K, timestamp: Long, vararg fields: K): List
@@ -390,7 +390,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpireat(key: K, timestamp: Long, expireArgs: ExpireArgs, vararg fields: K): List
@@ -404,7 +404,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpireat(key: K, timestamp: Date, vararg fields: K): List
@@ -419,7 +419,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpireat(key: K, timestamp: Date, expireArgs: ExpireArgs, vararg fields: K): List
@@ -433,7 +433,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpireat(key: K, timestamp: Instant, vararg fields: K): List
@@ -448,7 +448,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpireat(key: K, timestamp: Instant, expireArgs: ExpireArgs, vararg fields: K): List
@@ -459,7 +459,7 @@ interface RedisHashCoroutinesCommands {
* @param fields one or more fields to get the TTL for.
* @return a list of [Long] values for each of the fields provided: expiration time as a UNIX timestamp in seconds;
* `-1` indicating the field has no expiry time set; `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hexpiretime(key: K, vararg fields: K): List
@@ -470,7 +470,7 @@ interface RedisHashCoroutinesCommands {
* @param fields one or more fields to remove the TTL for.
* @return a list of [Long] values for each of the fields provided: `1` indicating expiration time is removed;
* `-1` field has no expiration time to be removed; `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpersist(key: K, vararg fields: K): List
@@ -484,7 +484,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is 0; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpire(key: K, milliseconds: Long, vararg fields: K): List
@@ -499,7 +499,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is 0; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpire(key: K, milliseconds: Long, expireArgs: ExpireArgs, vararg fields: K): List
@@ -513,7 +513,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is 0; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpire(key: K, milliseconds: Duration, vararg fields: K): List
@@ -528,7 +528,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is 0; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpire(key: K, milliseconds: Duration, expireArgs: ExpireArgs, vararg fields: K): List
@@ -542,7 +542,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpireat(key: K, timestamp: Long, vararg fields: K): List
@@ -557,7 +557,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpireat(key: K, timestamp: Long, expireArgs: ExpireArgs, vararg fields: K): List
@@ -571,7 +571,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpireat(key: K, timestamp: Date, vararg fields: K): List
@@ -586,7 +586,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpireat(key: K, timestamp: Date, expireArgs: ExpireArgs, vararg fields: K): List
@@ -600,7 +600,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpireat(key: K, timestamp: Instant, vararg fields: K): List
@@ -615,7 +615,7 @@ interface RedisHashCoroutinesCommands {
* already due to expiration, or provided expriry interval is in the past; `1` indicating expiration time is
* set/updated; `0` indicating the expiration time is not set (a provided NX | XX | GT | LT condition is not
* met); `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpireat(key: K, timestamp: Instant, expireArgs: ExpireArgs, vararg fields: K): List
@@ -626,7 +626,7 @@ interface RedisHashCoroutinesCommands {
* @param fields one or more fields to get the TTL for.
* @return a list of [Long] values for each of the fields provided: expiration time as a UNIX timestamp in milliseconds;
* `-1` indicating the field has no expiry time set; `-2` indicating there is no such field
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpexpiretime(key: K, vararg fields: K): List
@@ -638,7 +638,7 @@ interface RedisHashCoroutinesCommands {
* @return a list of [Long] values for each of the fields provided: the time to live in seconds; or a negative value in
* order to signal an error. The command returns `-1` if the key exists but has no associated expiration time.
* The command returns `-2` if the key does not exist.
- * @since 7.0
+ * @since 6.4
*/
suspend fun httl(key: K, vararg fields: K): List
@@ -650,7 +650,7 @@ interface RedisHashCoroutinesCommands {
* @return a list of [Long] values for each of the fields provided: the time to live in milliseconds; or a negative
* value in order to signal an error. The command returns `-1` if the key exists but has no associated
* expiration time. The command returns `-2` if the key does not exist.
- * @since 7.0
+ * @since 6.4
*/
suspend fun hpttl(key: K, vararg fields: K): List
diff --git a/src/main/kotlin/io/lettuce/core/api/coroutines/RedisScriptingCoroutinesCommands.kt b/src/main/kotlin/io/lettuce/core/api/coroutines/RedisScriptingCoroutinesCommands.kt
index 711e7569b8..8b0d4a0aa3 100644
--- a/src/main/kotlin/io/lettuce/core/api/coroutines/RedisScriptingCoroutinesCommands.kt
+++ b/src/main/kotlin/io/lettuce/core/api/coroutines/RedisScriptingCoroutinesCommands.kt
@@ -94,7 +94,7 @@ interface RedisScriptingCoroutinesCommands {
* @param values the values.
* @param expected return type.
* @return script result.
- * @since 7.0
+ * @since 6.4
*/
suspend fun evalReadOnly(
script: String,
diff --git a/src/main/resources/META-INF/LICENSE b/src/main/resources/META-INF/LICENSE
index 62589edd12..7e01d712b2 100644
--- a/src/main/resources/META-INF/LICENSE
+++ b/src/main/resources/META-INF/LICENSE
@@ -1,202 +1,21 @@
-
- Apache License
- Version 2.0, January 2004
- https://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+MIT License
+
+Copyright (c) 2023-Present, Redis Ltd.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/src/main/resources/META-INF/NOTICE b/src/main/resources/META-INF/NOTICE
deleted file mode 100644
index ffffbcdf64..0000000000
--- a/src/main/resources/META-INF/NOTICE
+++ /dev/null
@@ -1,11 +0,0 @@
-Lettuce Java Redis Client ${version}
-Copyright (c) 2011-2020 Mark Paluch
-
-This product is licensed to you under the Apache License, Version 2.0
-(the "License"). You may not use this product except in compliance with
-the License.
-
-This product may include a number of subcomponents with separate
-copyright notices and license terms. Your use of the source code for
-these subcomponents is subject to the terms and conditions of the
-subcomponent's license, as noted in the license file.