refactor: rename packages and files to use 'flash' prefix for consistency
This commit is contained in:
+1
-1
@@ -1,4 +1,4 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
+6
-4
@@ -1,13 +1,15 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import dev.relism.routing.Middleware;
|
||||
import dev.relism.flash.exceptions.InitializationException;
|
||||
import dev.relism.flash.extension.FlashContext;
|
||||
import dev.relism.flash.routing.Middleware;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Manual rate-limit guard for lambda routes.
|
||||
*
|
||||
* <p>Available via {@link dev.relism.extension.FlashContext}:
|
||||
* <p>Available via {@link FlashContext}:
|
||||
* <pre>{@code
|
||||
* Guard guard = ctx.require(Guard.class);
|
||||
* }</pre>
|
||||
@@ -23,7 +25,7 @@ import java.util.concurrent.TimeUnit;
|
||||
* }</pre>
|
||||
*
|
||||
* <p>The resolver name is looked up once here (at wiring time, not on each request).
|
||||
* If the name is not registered, {@link dev.relism.exceptions.InitializationException}
|
||||
* If the name is not registered, {@link InitializationException}
|
||||
* is thrown immediately.
|
||||
*/
|
||||
public final class Guard {
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import dev.relism.models.Request;
|
||||
import dev.relism.flash.models.Request;
|
||||
|
||||
/**
|
||||
* Extracts a partition key from an incoming request.
|
||||
+6
-3
@@ -1,4 +1,7 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import dev.relism.flash.exceptions.InitializationException;
|
||||
import dev.relism.flash.models.RequestHandler;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -7,11 +10,11 @@ import java.lang.annotation.Target;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Applies a rate limit to a class-based {@link dev.relism.models.RequestHandler}.
|
||||
* Applies a rate limit to a class-based {@link RequestHandler}.
|
||||
*
|
||||
* <p>The annotation is processed at boot time by the {@link LimiterExtension} annotation
|
||||
* processor. If {@link #key()} names a resolver that was never registered,
|
||||
* startup fails immediately with {@link dev.relism.exceptions.InitializationException}.
|
||||
* startup fails immediately with {@link InitializationException}.
|
||||
*
|
||||
* <pre>{@code
|
||||
* // 100 req/s per client IP — fixed window
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
/**
|
||||
* Immutable configuration snapshot for a single rate-limit rule.
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import dev.relism.ext.limiter.strategy.FixedWindowStrategy;
|
||||
import dev.relism.ext.limiter.strategy.SlidingWindowStrategy;
|
||||
import dev.relism.ext.limiter.strategy.TokenBucketStrategy;
|
||||
import dev.relism.flash.ext.limiter.strategy.FixedWindowStrategy;
|
||||
import dev.relism.flash.ext.limiter.strategy.SlidingWindowStrategy;
|
||||
import dev.relism.flash.ext.limiter.strategy.TokenBucketStrategy;
|
||||
|
||||
/**
|
||||
* Enumeration of built-in rate-limit algorithms. Each constant is a factory
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import dev.relism.exceptions.InitializationException;
|
||||
import dev.relism.flash.exceptions.InitializationException;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.LinkedHashMap;
|
||||
+15
-13
@@ -1,14 +1,16 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import dev.relism.ext.openapi.OpenApiContributorRegistry;
|
||||
import dev.relism.ext.openapi.OpenApiOperationContribution;
|
||||
import dev.relism.ext.openapi.OpenApiResponseContribution;
|
||||
import dev.relism.extension.ExtensionPhase;
|
||||
import dev.relism.extension.FlashContext;
|
||||
import dev.relism.extension.FlashExtension;
|
||||
import dev.relism.extension.FlashRegistrar;
|
||||
import dev.relism.http.HttpStatus;
|
||||
import dev.relism.routing.Middleware;
|
||||
import dev.relism.flash.ext.openapi.OpenApiContributor;
|
||||
import dev.relism.flash.ext.openapi.OpenApiContributorRegistry;
|
||||
import dev.relism.flash.ext.openapi.OpenApiOperationContribution;
|
||||
import dev.relism.flash.ext.openapi.OpenApiResponseContribution;
|
||||
import dev.relism.flash.extension.AnnotationProcessor;
|
||||
import dev.relism.flash.extension.ExtensionPhase;
|
||||
import dev.relism.flash.extension.FlashContext;
|
||||
import dev.relism.flash.extension.FlashExtension;
|
||||
import dev.relism.flash.extension.FlashRegistrar;
|
||||
import dev.relism.flash.http.HttpStatus;
|
||||
import dev.relism.flash.routing.Middleware;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
@@ -21,7 +23,7 @@ import java.util.Map;
|
||||
* <ol>
|
||||
* <li>Creates a single {@link BucketStore} shared by all rules in this extension instance.</li>
|
||||
* <li>Provides a {@link Guard} in the {@link FlashContext} for manual use on lambda routes.</li>
|
||||
* <li>Registers an {@link dev.relism.extension.AnnotationProcessor} for {@link Limit}:
|
||||
* <li>Registers an {@link AnnotationProcessor} for {@link Limit}:
|
||||
* reads the annotation once per handler class at boot, resolves the key lambda
|
||||
* fail-fast, then returns a pre-compiled middleware — zero map lookups at request time.</li>
|
||||
* </ol>
|
||||
@@ -162,9 +164,9 @@ public final class LimiterExtension implements FlashExtension {
|
||||
|
||||
static void register(FlashContext ctx) {
|
||||
ctx.find(OpenApiContributorRegistry.class)
|
||||
.ifPresent(registry -> registry.add(new dev.relism.ext.openapi.OpenApiContributor() {
|
||||
.ifPresent(registry -> registry.add(new OpenApiContributor() {
|
||||
@Override
|
||||
public dev.relism.ext.openapi.OpenApiOperationContribution operationFor(Class<?> handlerClass) {
|
||||
public OpenApiOperationContribution operationFor(Class<?> handlerClass) {
|
||||
if (handlerClass.getAnnotation(Limit.class) == null) {
|
||||
return OpenApiOperationContribution.builder().build();
|
||||
}
|
||||
+8
-4
@@ -1,4 +1,8 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import dev.relism.flash.ext.limiter.strategy.FixedWindowStrategy;
|
||||
import dev.relism.flash.ext.limiter.strategy.SlidingWindowStrategy;
|
||||
import dev.relism.flash.ext.limiter.strategy.TokenBucketStrategy;
|
||||
|
||||
/**
|
||||
* Contract for a rate-limit algorithm. Implementations must be:
|
||||
@@ -10,9 +14,9 @@ package dev.relism.ext.limiter;
|
||||
*
|
||||
* <p>Called on every request — must not allocate on the hot path.
|
||||
*
|
||||
* @see dev.relism.ext.limiter.strategy.FixedWindowStrategy
|
||||
* @see dev.relism.ext.limiter.strategy.SlidingWindowStrategy
|
||||
* @see dev.relism.ext.limiter.strategy.TokenBucketStrategy
|
||||
* @see FixedWindowStrategy
|
||||
* @see SlidingWindowStrategy
|
||||
* @see TokenBucketStrategy
|
||||
*/
|
||||
public interface RateLimitStrategy {
|
||||
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
package dev.relism.ext.limiter.strategy;
|
||||
package dev.relism.flash.ext.limiter.strategy;
|
||||
|
||||
import dev.relism.ext.limiter.Bucket;
|
||||
import dev.relism.ext.limiter.LimitConfig;
|
||||
import dev.relism.ext.limiter.RateLimitStrategy;
|
||||
import dev.relism.flash.ext.limiter.Bucket;
|
||||
import dev.relism.flash.ext.limiter.LimitConfig;
|
||||
import dev.relism.flash.ext.limiter.RateLimitStrategy;
|
||||
|
||||
/**
|
||||
* Fixed-window rate limit: allows up to {@link LimitConfig#limit()} requests per window of
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
package dev.relism.ext.limiter.strategy;
|
||||
package dev.relism.flash.ext.limiter.strategy;
|
||||
|
||||
import dev.relism.ext.limiter.Bucket;
|
||||
import dev.relism.ext.limiter.LimitConfig;
|
||||
import dev.relism.ext.limiter.RateLimitStrategy;
|
||||
import dev.relism.flash.ext.limiter.Bucket;
|
||||
import dev.relism.flash.ext.limiter.LimitConfig;
|
||||
import dev.relism.flash.ext.limiter.RateLimitStrategy;
|
||||
|
||||
/**
|
||||
* Sliding-window counter rate limit: approximates a true sliding window by interpolating
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
package dev.relism.ext.limiter.strategy;
|
||||
package dev.relism.flash.ext.limiter.strategy;
|
||||
|
||||
import dev.relism.ext.limiter.Bucket;
|
||||
import dev.relism.ext.limiter.LimitConfig;
|
||||
import dev.relism.ext.limiter.RateLimitStrategy;
|
||||
import dev.relism.flash.ext.limiter.Bucket;
|
||||
import dev.relism.flash.ext.limiter.LimitConfig;
|
||||
import dev.relism.flash.ext.limiter.RateLimitStrategy;
|
||||
|
||||
/**
|
||||
* Token-bucket rate limit: tokens refill continuously at a rate of
|
||||
+10
-10
@@ -1,14 +1,14 @@
|
||||
package dev.relism.ext.limiter;
|
||||
package dev.relism.flash.ext.limiter;
|
||||
|
||||
import dev.relism.ext.openapi.OpenApiContributor;
|
||||
import dev.relism.ext.openapi.OpenApiContributorRegistry;
|
||||
import dev.relism.ext.openapi.OpenApiOperationContribution;
|
||||
import dev.relism.ext.openapi.OpenApiResponseContribution;
|
||||
import dev.relism.extension.FlashContext;
|
||||
import dev.relism.models.Request;
|
||||
import dev.relism.models.RequestHandler;
|
||||
import dev.relism.models.Response;
|
||||
import dev.relism.routing.GET;
|
||||
import dev.relism.flash.ext.openapi.OpenApiContributor;
|
||||
import dev.relism.flash.ext.openapi.OpenApiContributorRegistry;
|
||||
import dev.relism.flash.ext.openapi.OpenApiOperationContribution;
|
||||
import dev.relism.flash.ext.openapi.OpenApiResponseContribution;
|
||||
import dev.relism.flash.extension.FlashContext;
|
||||
import dev.relism.flash.models.Request;
|
||||
import dev.relism.flash.models.RequestHandler;
|
||||
import dev.relism.flash.models.Response;
|
||||
import dev.relism.flash.routing.GET;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
Reference in New Issue
Block a user