From 57ca32f2be50f33f84efbdc741d00cdc35d73890 Mon Sep 17 00:00:00 2001 From: Michael Rittmeister Date: Thu, 31 Aug 2023 14:05:22 +0200 Subject: [PATCH 1/4] No longer use value class for Reset class in rate-limiter --- rest/api/rest.api | 48 ++++++++----------- .../kotlin/ratelimit/RequestRateLimiter.kt | 3 +- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/rest/api/rest.api b/rest/api/rest.api index 0b4a20cd253..7893368fe5b 100644 --- a/rest/api/rest.api +++ b/rest/api/rest.api @@ -5930,38 +5930,36 @@ public abstract class dev/kord/rest/ratelimit/RequestResponse { public static final field Companion Ldev/kord/rest/ratelimit/RequestResponse$Companion; public abstract fun getBucketKey-JBzVXgM ()Ljava/lang/String; public abstract fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public abstract fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public abstract fun getReset ()Ldev/kord/rest/ratelimit/Reset; } public final class dev/kord/rest/ratelimit/RequestResponse$Accepted : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-JBzVXgM ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; - public final fun copy-ociLOyk (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; - public static synthetic fun copy-ociLOyk$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; + public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; public fun equals (Ljava/lang/Object;)Z public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; - public fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public fun getReset ()Ldev/kord/rest/ratelimit/Reset; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class dev/kord/rest/ratelimit/RequestResponse$BucketRateLimit : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-M0WuMHw ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; - public final fun copy-L_klSFE (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; - public static synthetic fun copy-L_klSFE$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; + public final fun copy-Ec6c71U (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public static synthetic fun copy-Ec6c71U$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; public fun equals (Ljava/lang/Object;)Z public synthetic fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getBucketKey-M0WuMHw ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; - public fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public fun getReset ()Ldev/kord/rest/ratelimit/Reset; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -5973,21 +5971,20 @@ public final class dev/kord/rest/ratelimit/RequestResponse$Error : dev/kord/rest public static final field INSTANCE Ldev/kord/rest/ratelimit/RequestResponse$Error; public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public fun getReset ()Ldev/kord/rest/ratelimit/Reset; } public final class dev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-JBzVXgM ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; - public final fun copy-ociLOyk (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; - public static synthetic fun copy-ociLOyk$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; + public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; public fun equals (Ljava/lang/Object;)Z public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; - public fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public fun getReset ()Ldev/kord/rest/ratelimit/Reset; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -5998,17 +5995,14 @@ public abstract interface class dev/kord/rest/ratelimit/RequestToken { } public final class dev/kord/rest/ratelimit/Reset { - public static final synthetic fun box-impl (Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/Reset; - public static fun constructor-impl (Lkotlinx/datetime/Instant;)Lkotlinx/datetime/Instant; + public fun (Lkotlinx/datetime/Instant;)V + public final fun component1 ()Lkotlinx/datetime/Instant; + public final fun copy (Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/Reset; + public static synthetic fun copy$default (Ldev/kord/rest/ratelimit/Reset;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/Reset; public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Lkotlinx/datetime/Instant;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Lkotlinx/datetime/Instant;Lkotlinx/datetime/Instant;)Z public final fun getValue ()Lkotlinx/datetime/Instant; public fun hashCode ()I - public static fun hashCode-impl (Lkotlinx/datetime/Instant;)I public fun toString ()Ljava/lang/String; - public static fun toString-impl (Lkotlinx/datetime/Instant;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Lkotlinx/datetime/Instant; } public final class dev/kord/rest/ratelimit/Total { diff --git a/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt b/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt index 02580df0ba2..3de5b44651f 100644 --- a/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt +++ b/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt @@ -67,8 +67,7 @@ public value class BucketKey(public val value: String) /** * The [instant][value] when the current bucket gets reset. */ -@JvmInline -public value class Reset(public val value: Instant) +public data class Reset(public val value: Instant) public sealed class RequestResponse { public abstract val bucketKey: BucketKey? From b8b19487d2658ff59337230f80a1754e54c10934 Mon Sep 17 00:00:00 2001 From: lukellmann Date: Sun, 3 Sep 2023 14:20:43 +0200 Subject: [PATCH 2/4] Deprecate Reset and use Instant --- rest/api/rest.api | 62 +++++++---- .../kotlin/ratelimit/AbstractRateLimiter.kt | 15 +-- .../kotlin/ratelimit/RequestRateLimiter.kt | 100 ++++++++++++++++-- .../kotlin/request/KtorRequestHandler.kt | 2 +- .../AbstractRequestRateLimiterTest.kt | 8 +- 5 files changed, 145 insertions(+), 42 deletions(-) diff --git a/rest/api/rest.api b/rest/api/rest.api index 0546d72c0ee..01e6733490d 100644 --- a/rest/api/rest.api +++ b/rest/api/rest.api @@ -5934,36 +5934,47 @@ public abstract class dev/kord/rest/ratelimit/RequestResponse { public static final field Companion Ldev/kord/rest/ratelimit/RequestResponse$Companion; public abstract fun getBucketKey-JBzVXgM ()Ljava/lang/String; public abstract fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public abstract fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public abstract fun getReset ()Lkotlinx/datetime/Instant; + public abstract synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; } public final class dev/kord/rest/ratelimit/RequestResponse$Accepted : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-JBzVXgM ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; - public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; - public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public final fun component3 ()Lkotlinx/datetime/Instant; + public final synthetic fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public final synthetic fun copy-ociLOyk (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public static synthetic fun copy-ociLOyk$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; public fun equals (Ljava/lang/Object;)Z public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public fun getReset ()Lkotlinx/datetime/Instant; + public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public synthetic fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class dev/kord/rest/ratelimit/RequestResponse$BucketRateLimit : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-M0WuMHw ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; - public final fun copy-Ec6c71U (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; - public static synthetic fun copy-Ec6c71U$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public final fun component3 ()Lkotlinx/datetime/Instant; + public final synthetic fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public final fun copy-Ec6c71U (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public static synthetic fun copy-Ec6c71U$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public final synthetic fun copy-L_klSFE (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public static synthetic fun copy-L_klSFE$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; public fun equals (Ljava/lang/Object;)Z public synthetic fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getBucketKey-M0WuMHw ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public fun getReset ()Lkotlinx/datetime/Instant; + public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public synthetic fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -5975,20 +5986,26 @@ public final class dev/kord/rest/ratelimit/RequestResponse$Error : dev/kord/rest public static final field INSTANCE Ldev/kord/rest/ratelimit/RequestResponse$Error; public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public fun getReset ()Lkotlinx/datetime/Instant; + public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; } public final class dev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-JBzVXgM ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; - public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; - public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public final fun component3 ()Lkotlinx/datetime/Instant; + public final synthetic fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public final synthetic fun copy-ociLOyk (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public static synthetic fun copy-ociLOyk$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; public fun equals (Ljava/lang/Object;)Z public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public fun getReset ()Lkotlinx/datetime/Instant; + public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public synthetic fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -5999,14 +6016,17 @@ public abstract interface class dev/kord/rest/ratelimit/RequestToken { } public final class dev/kord/rest/ratelimit/Reset { - public fun (Lkotlinx/datetime/Instant;)V - public final fun component1 ()Lkotlinx/datetime/Instant; - public final fun copy (Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/Reset; - public static synthetic fun copy$default (Ldev/kord/rest/ratelimit/Reset;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/Reset; + public static final synthetic fun box-impl (Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/Reset; + public static fun constructor-impl (Lkotlinx/datetime/Instant;)Lkotlinx/datetime/Instant; public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Lkotlinx/datetime/Instant;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Lkotlinx/datetime/Instant;Lkotlinx/datetime/Instant;)Z public final fun getValue ()Lkotlinx/datetime/Instant; public fun hashCode ()I + public static fun hashCode-impl (Lkotlinx/datetime/Instant;)I public fun toString ()Ljava/lang/String; + public static fun toString-impl (Lkotlinx/datetime/Instant;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Lkotlinx/datetime/Instant; } public final class dev/kord/rest/ratelimit/Total { diff --git a/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt b/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt index b7803871eb8..e561b7241c0 100644 --- a/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt +++ b/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.delay import kotlinx.coroutines.sync.Mutex import kotlinx.datetime.Clock +import kotlinx.datetime.Instant import mu.KLogger import kotlin.time.Duration.Companion.minutes @@ -18,7 +19,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: internal abstract val logger: KLogger private val autoBanRateLimiter = IntervalRateLimiter(limit = 25000, interval = 10.minutes) - private val globalSuspensionPoint = atomic(Reset(clock.now())) + private val globalSuspensionPoint = atomic(clock.now()) internal val buckets = ConcurrentHashMap() private val routeBuckets = ConcurrentHashMap>() @@ -26,8 +27,8 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: private val Request<*, *>.buckets get() = routeBuckets[identifier].orEmpty().map { it.bucket } internal fun RequestIdentifier.addBucket(id: BucketKey) = routeBuckets.getOrPut(this) { mutableSetOf() }.add(id) - internal suspend fun Reset.await() { - val duration = value - clock.now() + private suspend fun Instant.await() { + val duration = this - clock.now() if (duration.isNegative()) return delay(duration) } @@ -66,11 +67,11 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: when (response) { is RequestResponse.GlobalRateLimit -> { - logger.trace { "[RATE LIMIT]:[GLOBAL]:exhausted until ${response.reset.value}" } + logger.trace { "[RATE LIMIT]:[GLOBAL]:exhausted until ${response.reset}" } globalSuspensionPoint.update { response.reset } } is RequestResponse.BucketRateLimit -> { - logger.trace { "[RATE LIMIT]:[BUCKET]:Bucket ${response.bucketKey.value} was exhausted until ${response.reset.value}" } + logger.trace { "[RATE LIMIT]:[BUCKET]:Bucket ${response.bucketKey.value} was exhausted until ${response.reset}" } response.bucketKey.bucket.updateReset(response.reset) } is RequestResponse.Accepted, RequestResponse.Error -> {} @@ -83,7 +84,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: } internal inner class Bucket(val id: BucketKey) { - private val reset = atomic(Reset(clock.now())) + private val reset = atomic(clock.now()) private val mutex = Mutex() suspend fun awaitAndLock() { @@ -92,7 +93,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: reset.value.await() } - fun updateReset(newValue: Reset) { + fun updateReset(newValue: Instant) { reset.update { newValue } } diff --git a/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt b/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt index 3de5b44651f..4d3ba184ba7 100644 --- a/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt +++ b/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt @@ -2,8 +2,10 @@ package dev.kord.rest.ratelimit import dev.kord.rest.request.Request import kotlinx.datetime.Instant +import kotlin.DeprecationLevel.HIDDEN import kotlin.contracts.InvocationKind import kotlin.contracts.contract +import kotlin.js.JsName import kotlin.jvm.JvmInline /** @@ -67,12 +69,23 @@ public value class BucketKey(public val value: String) /** * The [instant][value] when the current bucket gets reset. */ -public data class Reset(public val value: Instant) +@Deprecated( + "Use 'Instant' directly instead.", + ReplaceWith("Instant", "kotlinx.datetime.Instant"), + DeprecationLevel.WARNING, +) +@JvmInline +public value class Reset(public val value: Instant) public sealed class RequestResponse { public abstract val bucketKey: BucketKey? public abstract val rateLimit: RateLimit? - public abstract val reset: Reset? + public abstract val reset: Instant? + + @Suppress("FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("getReset") + public abstract fun `getReset-8536Nbg`(): Instant? /** * The request returned a non-rate limit error code. @@ -80,7 +93,10 @@ public sealed class RequestResponse { public object Error : RequestResponse() { override val bucketKey: BucketKey? = null override val rateLimit: RateLimit? = null - override val reset: Reset? = null + override val reset: Instant? = null + + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + override fun `getReset-8536Nbg`(): Instant? = reset } /** @@ -89,8 +105,30 @@ public sealed class RequestResponse { public data class Accepted( override val bucketKey: BucketKey?, override val rateLimit: RateLimit?, - override val reset: Reset - ) : RequestResponse() + override val reset: Instant, + ) : RequestResponse() { + @Suppress("FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("_component3") + public fun `component3-Ad4v_Ag`(): Instant = reset + + @Suppress("FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("_copy") + public fun `copy-ociLOyk`( + bucketKey: String? = this.bucketKey?.value, + rateLimit: RateLimit? = this.rateLimit, + reset: Instant = this.reset, + ): Accepted = Accepted(bucketKey?.let(::BucketKey), rateLimit, reset) + + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + override fun `getReset-8536Nbg`(): Instant = reset + + @Suppress("NON_FINAL_MEMBER_IN_FINAL_CLASS", "FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("_getReset") + public open fun `getReset-Ad4v_Ag`(): Instant = reset + } /** * The request returned a global rate limit error. @@ -98,8 +136,30 @@ public sealed class RequestResponse { public data class GlobalRateLimit( override val bucketKey: BucketKey?, override val rateLimit: RateLimit?, - override val reset: Reset - ) : RequestResponse() + override val reset: Instant, + ) : RequestResponse() { + @Suppress("FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("_component3") + public fun `component3-Ad4v_Ag`(): Instant = reset + + @Suppress("FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("_copy") + public fun `copy-ociLOyk`( + bucketKey: String? = this.bucketKey?.value, + rateLimit: RateLimit? = this.rateLimit, + reset: Instant = this.reset, + ): GlobalRateLimit = GlobalRateLimit(bucketKey?.let(::BucketKey), rateLimit, reset) + + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + override fun `getReset-8536Nbg`(): Instant = reset + + @Suppress("NON_FINAL_MEMBER_IN_FINAL_CLASS", "FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("_getReset") + public open fun `getReset-Ad4v_Ag`(): Instant = reset + } /** * The request returned a bucket rate limit error. @@ -107,8 +167,30 @@ public sealed class RequestResponse { public data class BucketRateLimit( override val bucketKey: BucketKey, override val rateLimit: RateLimit?, - override val reset: Reset - ) : RequestResponse() + override val reset: Instant, + ) : RequestResponse() { + @Suppress("FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("_component3") + public fun `component3-Ad4v_Ag`(): Instant = reset + + @Suppress("FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("_copy") + public fun `copy-L_klSFE`( + bucketKey: String = this.bucketKey.value, + rateLimit: RateLimit? = this.rateLimit, + reset: Instant = this.reset, + ): BucketRateLimit = BucketRateLimit(BucketKey(bucketKey), rateLimit, reset) + + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + override fun `getReset-8536Nbg`(): Instant = reset + + @Suppress("NON_FINAL_MEMBER_IN_FINAL_CLASS", "FunctionName") + @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) + @JsName("_getReset") + public open fun `getReset-Ad4v_Ag`(): Instant = reset + } public companion object diff --git a/rest/src/commonMain/kotlin/request/KtorRequestHandler.kt b/rest/src/commonMain/kotlin/request/KtorRequestHandler.kt index 3ed22ac5e35..81543ef1bb7 100644 --- a/rest/src/commonMain/kotlin/request/KtorRequestHandler.kt +++ b/rest/src/commonMain/kotlin/request/KtorRequestHandler.kt @@ -122,7 +122,7 @@ public fun RequestResponse.Companion.from(response: HttpResponse, clock: Clock): RateLimit(total, remaining) } - val reset = Reset(response.channelResetPoint(clock)) + val reset = response.channelResetPoint(clock) return when { response.isGlobalRateLimit -> RequestResponse.GlobalRateLimit(bucket, rateLimit, reset) diff --git a/rest/src/commonTest/kotlin/ratelimit/AbstractRequestRateLimiterTest.kt b/rest/src/commonTest/kotlin/ratelimit/AbstractRequestRateLimiterTest.kt index fcd32821356..12501f07cf4 100644 --- a/rest/src/commonTest/kotlin/ratelimit/AbstractRequestRateLimiterTest.kt +++ b/rest/src/commonTest/kotlin/ratelimit/AbstractRequestRateLimiterTest.kt @@ -42,14 +42,14 @@ abstract class AbstractRequestRateLimiterTest { RequestResponse.BucketRateLimit( BucketKey(bucketKey.toString()), rateLimit, - Reset(clock.now().plus(timeout)) + clock.now().plus(timeout) ) ) else -> token.complete( RequestResponse.Accepted( BucketKey(bucketKey.toString()), rateLimit, - Reset(clock.now().plus(timeout)) + clock.now().plus(timeout) ) ) } @@ -72,14 +72,14 @@ abstract class AbstractRequestRateLimiterTest { RequestResponse.BucketRateLimit( BucketKey(bucketKey.toString()), rateLimit, - Reset(clock.now().plus(timeout)) + clock.now().plus(timeout) ) ) else -> complete( RequestResponse.Accepted( BucketKey(bucketKey.toString()), rateLimit, - Reset(clock.now().plus(timeout)) + clock.now().plus(timeout) ) ) } From e08adf58fc1b0498a93e1d1d86f62e5b0b6d5d25 Mon Sep 17 00:00:00 2001 From: lukellmann Date: Sun, 3 Sep 2023 15:51:20 +0200 Subject: [PATCH 3/4] Revert "Deprecate Reset and use Instant" This reverts commit b8b19487d2658ff59337230f80a1754e54c10934. --- rest/api/rest.api | 62 ++++------- .../kotlin/ratelimit/AbstractRateLimiter.kt | 15 ++- .../kotlin/ratelimit/RequestRateLimiter.kt | 100 ++---------------- .../kotlin/request/KtorRequestHandler.kt | 2 +- .../AbstractRequestRateLimiterTest.kt | 8 +- 5 files changed, 42 insertions(+), 145 deletions(-) diff --git a/rest/api/rest.api b/rest/api/rest.api index 01e6733490d..0546d72c0ee 100644 --- a/rest/api/rest.api +++ b/rest/api/rest.api @@ -5934,47 +5934,36 @@ public abstract class dev/kord/rest/ratelimit/RequestResponse { public static final field Companion Ldev/kord/rest/ratelimit/RequestResponse$Companion; public abstract fun getBucketKey-JBzVXgM ()Ljava/lang/String; public abstract fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public abstract fun getReset ()Lkotlinx/datetime/Instant; - public abstract synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public abstract fun getReset ()Ldev/kord/rest/ratelimit/Reset; } public final class dev/kord/rest/ratelimit/RequestResponse$Accepted : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-JBzVXgM ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3 ()Lkotlinx/datetime/Instant; - public final synthetic fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; - public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; - public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; - public final synthetic fun copy-ociLOyk (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; - public static synthetic fun copy-ociLOyk$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; + public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; public fun equals (Ljava/lang/Object;)Z public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Lkotlinx/datetime/Instant; - public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; - public synthetic fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public fun getReset ()Ldev/kord/rest/ratelimit/Reset; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class dev/kord/rest/ratelimit/RequestResponse$BucketRateLimit : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-M0WuMHw ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3 ()Lkotlinx/datetime/Instant; - public final synthetic fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; - public final fun copy-Ec6c71U (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; - public static synthetic fun copy-Ec6c71U$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; - public final synthetic fun copy-L_klSFE (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; - public static synthetic fun copy-L_klSFE$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; + public final fun copy-Ec6c71U (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public static synthetic fun copy-Ec6c71U$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; public fun equals (Ljava/lang/Object;)Z public synthetic fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getBucketKey-M0WuMHw ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Lkotlinx/datetime/Instant; - public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; - public synthetic fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public fun getReset ()Ldev/kord/rest/ratelimit/Reset; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -5986,26 +5975,20 @@ public final class dev/kord/rest/ratelimit/RequestResponse$Error : dev/kord/rest public static final field INSTANCE Ldev/kord/rest/ratelimit/RequestResponse$Error; public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Lkotlinx/datetime/Instant; - public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public fun getReset ()Ldev/kord/rest/ratelimit/Reset; } public final class dev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-JBzVXgM ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3 ()Lkotlinx/datetime/Instant; - public final synthetic fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; - public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; - public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; - public final synthetic fun copy-ociLOyk (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; - public static synthetic fun copy-ociLOyk$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; + public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; public fun equals (Ljava/lang/Object;)Z public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Lkotlinx/datetime/Instant; - public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; - public synthetic fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public fun getReset ()Ldev/kord/rest/ratelimit/Reset; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -6016,17 +5999,14 @@ public abstract interface class dev/kord/rest/ratelimit/RequestToken { } public final class dev/kord/rest/ratelimit/Reset { - public static final synthetic fun box-impl (Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/Reset; - public static fun constructor-impl (Lkotlinx/datetime/Instant;)Lkotlinx/datetime/Instant; + public fun (Lkotlinx/datetime/Instant;)V + public final fun component1 ()Lkotlinx/datetime/Instant; + public final fun copy (Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/Reset; + public static synthetic fun copy$default (Ldev/kord/rest/ratelimit/Reset;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/Reset; public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Lkotlinx/datetime/Instant;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Lkotlinx/datetime/Instant;Lkotlinx/datetime/Instant;)Z public final fun getValue ()Lkotlinx/datetime/Instant; public fun hashCode ()I - public static fun hashCode-impl (Lkotlinx/datetime/Instant;)I public fun toString ()Ljava/lang/String; - public static fun toString-impl (Lkotlinx/datetime/Instant;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Lkotlinx/datetime/Instant; } public final class dev/kord/rest/ratelimit/Total { diff --git a/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt b/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt index e561b7241c0..b7803871eb8 100644 --- a/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt +++ b/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt @@ -11,7 +11,6 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.delay import kotlinx.coroutines.sync.Mutex import kotlinx.datetime.Clock -import kotlinx.datetime.Instant import mu.KLogger import kotlin.time.Duration.Companion.minutes @@ -19,7 +18,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: internal abstract val logger: KLogger private val autoBanRateLimiter = IntervalRateLimiter(limit = 25000, interval = 10.minutes) - private val globalSuspensionPoint = atomic(clock.now()) + private val globalSuspensionPoint = atomic(Reset(clock.now())) internal val buckets = ConcurrentHashMap() private val routeBuckets = ConcurrentHashMap>() @@ -27,8 +26,8 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: private val Request<*, *>.buckets get() = routeBuckets[identifier].orEmpty().map { it.bucket } internal fun RequestIdentifier.addBucket(id: BucketKey) = routeBuckets.getOrPut(this) { mutableSetOf() }.add(id) - private suspend fun Instant.await() { - val duration = this - clock.now() + internal suspend fun Reset.await() { + val duration = value - clock.now() if (duration.isNegative()) return delay(duration) } @@ -67,11 +66,11 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: when (response) { is RequestResponse.GlobalRateLimit -> { - logger.trace { "[RATE LIMIT]:[GLOBAL]:exhausted until ${response.reset}" } + logger.trace { "[RATE LIMIT]:[GLOBAL]:exhausted until ${response.reset.value}" } globalSuspensionPoint.update { response.reset } } is RequestResponse.BucketRateLimit -> { - logger.trace { "[RATE LIMIT]:[BUCKET]:Bucket ${response.bucketKey.value} was exhausted until ${response.reset}" } + logger.trace { "[RATE LIMIT]:[BUCKET]:Bucket ${response.bucketKey.value} was exhausted until ${response.reset.value}" } response.bucketKey.bucket.updateReset(response.reset) } is RequestResponse.Accepted, RequestResponse.Error -> {} @@ -84,7 +83,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: } internal inner class Bucket(val id: BucketKey) { - private val reset = atomic(clock.now()) + private val reset = atomic(Reset(clock.now())) private val mutex = Mutex() suspend fun awaitAndLock() { @@ -93,7 +92,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: reset.value.await() } - fun updateReset(newValue: Instant) { + fun updateReset(newValue: Reset) { reset.update { newValue } } diff --git a/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt b/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt index 4d3ba184ba7..3de5b44651f 100644 --- a/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt +++ b/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt @@ -2,10 +2,8 @@ package dev.kord.rest.ratelimit import dev.kord.rest.request.Request import kotlinx.datetime.Instant -import kotlin.DeprecationLevel.HIDDEN import kotlin.contracts.InvocationKind import kotlin.contracts.contract -import kotlin.js.JsName import kotlin.jvm.JvmInline /** @@ -69,23 +67,12 @@ public value class BucketKey(public val value: String) /** * The [instant][value] when the current bucket gets reset. */ -@Deprecated( - "Use 'Instant' directly instead.", - ReplaceWith("Instant", "kotlinx.datetime.Instant"), - DeprecationLevel.WARNING, -) -@JvmInline -public value class Reset(public val value: Instant) +public data class Reset(public val value: Instant) public sealed class RequestResponse { public abstract val bucketKey: BucketKey? public abstract val rateLimit: RateLimit? - public abstract val reset: Instant? - - @Suppress("FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("getReset") - public abstract fun `getReset-8536Nbg`(): Instant? + public abstract val reset: Reset? /** * The request returned a non-rate limit error code. @@ -93,10 +80,7 @@ public sealed class RequestResponse { public object Error : RequestResponse() { override val bucketKey: BucketKey? = null override val rateLimit: RateLimit? = null - override val reset: Instant? = null - - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - override fun `getReset-8536Nbg`(): Instant? = reset + override val reset: Reset? = null } /** @@ -105,30 +89,8 @@ public sealed class RequestResponse { public data class Accepted( override val bucketKey: BucketKey?, override val rateLimit: RateLimit?, - override val reset: Instant, - ) : RequestResponse() { - @Suppress("FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("_component3") - public fun `component3-Ad4v_Ag`(): Instant = reset - - @Suppress("FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("_copy") - public fun `copy-ociLOyk`( - bucketKey: String? = this.bucketKey?.value, - rateLimit: RateLimit? = this.rateLimit, - reset: Instant = this.reset, - ): Accepted = Accepted(bucketKey?.let(::BucketKey), rateLimit, reset) - - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - override fun `getReset-8536Nbg`(): Instant = reset - - @Suppress("NON_FINAL_MEMBER_IN_FINAL_CLASS", "FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("_getReset") - public open fun `getReset-Ad4v_Ag`(): Instant = reset - } + override val reset: Reset + ) : RequestResponse() /** * The request returned a global rate limit error. @@ -136,30 +98,8 @@ public sealed class RequestResponse { public data class GlobalRateLimit( override val bucketKey: BucketKey?, override val rateLimit: RateLimit?, - override val reset: Instant, - ) : RequestResponse() { - @Suppress("FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("_component3") - public fun `component3-Ad4v_Ag`(): Instant = reset - - @Suppress("FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("_copy") - public fun `copy-ociLOyk`( - bucketKey: String? = this.bucketKey?.value, - rateLimit: RateLimit? = this.rateLimit, - reset: Instant = this.reset, - ): GlobalRateLimit = GlobalRateLimit(bucketKey?.let(::BucketKey), rateLimit, reset) - - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - override fun `getReset-8536Nbg`(): Instant = reset - - @Suppress("NON_FINAL_MEMBER_IN_FINAL_CLASS", "FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("_getReset") - public open fun `getReset-Ad4v_Ag`(): Instant = reset - } + override val reset: Reset + ) : RequestResponse() /** * The request returned a bucket rate limit error. @@ -167,30 +107,8 @@ public sealed class RequestResponse { public data class BucketRateLimit( override val bucketKey: BucketKey, override val rateLimit: RateLimit?, - override val reset: Instant, - ) : RequestResponse() { - @Suppress("FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("_component3") - public fun `component3-Ad4v_Ag`(): Instant = reset - - @Suppress("FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("_copy") - public fun `copy-L_klSFE`( - bucketKey: String = this.bucketKey.value, - rateLimit: RateLimit? = this.rateLimit, - reset: Instant = this.reset, - ): BucketRateLimit = BucketRateLimit(BucketKey(bucketKey), rateLimit, reset) - - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - override fun `getReset-8536Nbg`(): Instant = reset - - @Suppress("NON_FINAL_MEMBER_IN_FINAL_CLASS", "FunctionName") - @Deprecated("Binary compatibility, keep for some releases.", level = HIDDEN) - @JsName("_getReset") - public open fun `getReset-Ad4v_Ag`(): Instant = reset - } + override val reset: Reset + ) : RequestResponse() public companion object diff --git a/rest/src/commonMain/kotlin/request/KtorRequestHandler.kt b/rest/src/commonMain/kotlin/request/KtorRequestHandler.kt index 81543ef1bb7..3ed22ac5e35 100644 --- a/rest/src/commonMain/kotlin/request/KtorRequestHandler.kt +++ b/rest/src/commonMain/kotlin/request/KtorRequestHandler.kt @@ -122,7 +122,7 @@ public fun RequestResponse.Companion.from(response: HttpResponse, clock: Clock): RateLimit(total, remaining) } - val reset = response.channelResetPoint(clock) + val reset = Reset(response.channelResetPoint(clock)) return when { response.isGlobalRateLimit -> RequestResponse.GlobalRateLimit(bucket, rateLimit, reset) diff --git a/rest/src/commonTest/kotlin/ratelimit/AbstractRequestRateLimiterTest.kt b/rest/src/commonTest/kotlin/ratelimit/AbstractRequestRateLimiterTest.kt index 12501f07cf4..fcd32821356 100644 --- a/rest/src/commonTest/kotlin/ratelimit/AbstractRequestRateLimiterTest.kt +++ b/rest/src/commonTest/kotlin/ratelimit/AbstractRequestRateLimiterTest.kt @@ -42,14 +42,14 @@ abstract class AbstractRequestRateLimiterTest { RequestResponse.BucketRateLimit( BucketKey(bucketKey.toString()), rateLimit, - clock.now().plus(timeout) + Reset(clock.now().plus(timeout)) ) ) else -> token.complete( RequestResponse.Accepted( BucketKey(bucketKey.toString()), rateLimit, - clock.now().plus(timeout) + Reset(clock.now().plus(timeout)) ) ) } @@ -72,14 +72,14 @@ abstract class AbstractRequestRateLimiterTest { RequestResponse.BucketRateLimit( BucketKey(bucketKey.toString()), rateLimit, - clock.now().plus(timeout) + Reset(clock.now().plus(timeout)) ) ) else -> complete( RequestResponse.Accepted( BucketKey(bucketKey.toString()), rateLimit, - clock.now().plus(timeout) + Reset(clock.now().plus(timeout)) ) ) } From 54c42ed773f53b229cb45f75881901df57ebd893 Mon Sep 17 00:00:00 2001 From: lukellmann Date: Sun, 3 Sep 2023 15:59:04 +0200 Subject: [PATCH 4/4] Don't change public API, just use Instant in internals --- rest/api/rest.api | 48 +++++++++++-------- .../kotlin/ratelimit/AbstractRateLimiter.kt | 14 +++--- .../kotlin/ratelimit/RequestRateLimiter.kt | 3 +- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/rest/api/rest.api b/rest/api/rest.api index 0546d72c0ee..96cc14dc4c0 100644 --- a/rest/api/rest.api +++ b/rest/api/rest.api @@ -5934,36 +5934,38 @@ public abstract class dev/kord/rest/ratelimit/RequestResponse { public static final field Companion Ldev/kord/rest/ratelimit/RequestResponse$Companion; public abstract fun getBucketKey-JBzVXgM ()Ljava/lang/String; public abstract fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public abstract fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public abstract fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; } public final class dev/kord/rest/ratelimit/RequestResponse$Accepted : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-JBzVXgM ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; - public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; - public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public final fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public final fun copy-ociLOyk (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; + public static synthetic fun copy-ociLOyk$default (Ldev/kord/rest/ratelimit/RequestResponse$Accepted;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$Accepted; public fun equals (Ljava/lang/Object;)Z public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class dev/kord/rest/ratelimit/RequestResponse$BucketRateLimit : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-M0WuMHw ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; - public final fun copy-Ec6c71U (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; - public static synthetic fun copy-Ec6c71U$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public final fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public final fun copy-L_klSFE (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; + public static synthetic fun copy-L_klSFE$default (Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$BucketRateLimit; public fun equals (Ljava/lang/Object;)Z public synthetic fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getBucketKey-M0WuMHw ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -5975,20 +5977,21 @@ public final class dev/kord/rest/ratelimit/RequestResponse$Error : dev/kord/rest public static final field INSTANCE Ldev/kord/rest/ratelimit/RequestResponse$Error; public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; } public final class dev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit : dev/kord/rest/ratelimit/RequestResponse { - public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-JBzVXgM ()Ljava/lang/String; public final fun component2 ()Ldev/kord/rest/ratelimit/RateLimit; - public final fun component3 ()Ldev/kord/rest/ratelimit/Reset; - public final fun copy-Rgdz8z0 (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; - public static synthetic fun copy-Rgdz8z0$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Ldev/kord/rest/ratelimit/Reset;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public final fun component3-Ad4v_Ag ()Lkotlinx/datetime/Instant; + public final fun copy-ociLOyk (Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; + public static synthetic fun copy-ociLOyk$default (Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit;Ljava/lang/String;Ldev/kord/rest/ratelimit/RateLimit;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/RequestResponse$GlobalRateLimit; public fun equals (Ljava/lang/Object;)Z public fun getBucketKey-JBzVXgM ()Ljava/lang/String; public fun getRateLimit ()Ldev/kord/rest/ratelimit/RateLimit; - public fun getReset ()Ldev/kord/rest/ratelimit/Reset; + public synthetic fun getReset-8536Nbg ()Lkotlinx/datetime/Instant; + public fun getReset-Ad4v_Ag ()Lkotlinx/datetime/Instant; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -5999,14 +6002,17 @@ public abstract interface class dev/kord/rest/ratelimit/RequestToken { } public final class dev/kord/rest/ratelimit/Reset { - public fun (Lkotlinx/datetime/Instant;)V - public final fun component1 ()Lkotlinx/datetime/Instant; - public final fun copy (Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/Reset; - public static synthetic fun copy$default (Ldev/kord/rest/ratelimit/Reset;Lkotlinx/datetime/Instant;ILjava/lang/Object;)Ldev/kord/rest/ratelimit/Reset; + public static final synthetic fun box-impl (Lkotlinx/datetime/Instant;)Ldev/kord/rest/ratelimit/Reset; + public static fun constructor-impl (Lkotlinx/datetime/Instant;)Lkotlinx/datetime/Instant; public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Lkotlinx/datetime/Instant;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Lkotlinx/datetime/Instant;Lkotlinx/datetime/Instant;)Z public final fun getValue ()Lkotlinx/datetime/Instant; public fun hashCode ()I + public static fun hashCode-impl (Lkotlinx/datetime/Instant;)I public fun toString ()Ljava/lang/String; + public static fun toString-impl (Lkotlinx/datetime/Instant;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Lkotlinx/datetime/Instant; } public final class dev/kord/rest/ratelimit/Total { diff --git a/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt b/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt index b7803871eb8..874360ba85d 100644 --- a/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt +++ b/rest/src/commonMain/kotlin/ratelimit/AbstractRateLimiter.kt @@ -6,11 +6,11 @@ import dev.kord.rest.request.Request import dev.kord.rest.request.RequestIdentifier import dev.kord.rest.request.identifier import kotlinx.atomicfu.atomic -import kotlinx.atomicfu.update import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.delay import kotlinx.coroutines.sync.Mutex import kotlinx.datetime.Clock +import kotlinx.datetime.Instant import mu.KLogger import kotlin.time.Duration.Companion.minutes @@ -18,7 +18,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: internal abstract val logger: KLogger private val autoBanRateLimiter = IntervalRateLimiter(limit = 25000, interval = 10.minutes) - private val globalSuspensionPoint = atomic(Reset(clock.now())) + private val globalSuspensionPoint = atomic(clock.now()) internal val buckets = ConcurrentHashMap() private val routeBuckets = ConcurrentHashMap>() @@ -26,8 +26,8 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: private val Request<*, *>.buckets get() = routeBuckets[identifier].orEmpty().map { it.bucket } internal fun RequestIdentifier.addBucket(id: BucketKey) = routeBuckets.getOrPut(this) { mutableSetOf() }.add(id) - internal suspend fun Reset.await() { - val duration = value - clock.now() + private suspend fun Instant.await() { + val duration = this - clock.now() if (duration.isNegative()) return delay(duration) } @@ -67,7 +67,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: when (response) { is RequestResponse.GlobalRateLimit -> { logger.trace { "[RATE LIMIT]:[GLOBAL]:exhausted until ${response.reset.value}" } - globalSuspensionPoint.update { response.reset } + globalSuspensionPoint.value = response.reset.value } is RequestResponse.BucketRateLimit -> { logger.trace { "[RATE LIMIT]:[BUCKET]:Bucket ${response.bucketKey.value} was exhausted until ${response.reset.value}" } @@ -83,7 +83,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: } internal inner class Bucket(val id: BucketKey) { - private val reset = atomic(Reset(clock.now())) + private val reset = atomic(clock.now()) private val mutex = Mutex() suspend fun awaitAndLock() { @@ -93,7 +93,7 @@ public abstract class AbstractRateLimiter internal constructor(public val clock: } fun updateReset(newValue: Reset) { - reset.update { newValue } + reset.value = newValue.value } fun unlock() = mutex.unlock() diff --git a/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt b/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt index 3de5b44651f..02580df0ba2 100644 --- a/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt +++ b/rest/src/commonMain/kotlin/ratelimit/RequestRateLimiter.kt @@ -67,7 +67,8 @@ public value class BucketKey(public val value: String) /** * The [instant][value] when the current bucket gets reset. */ -public data class Reset(public val value: Instant) +@JvmInline +public value class Reset(public val value: Instant) public sealed class RequestResponse { public abstract val bucketKey: BucketKey?