diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index af5f4de..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(cd:*)", - "WebFetch(domain:github.com)", - "WebFetch(domain:raw.githubusercontent.com)", - "WebFetch(domain:api.github.com)", - "Bash(xargs grep:*)", - "Bash(jfr summary:*)", - "Bash(jfr print:*)", - "Bash(sort -t= -k4 -rn)", - "Bash(sed 's/.*objectClass = //')", - "Bash(sed 's/ \\(.*//')", - "Bash(sed 's/^\\\\s*//')", - "Bash(jar tf:*)", - "Bash(javap -c -p /c/Users/elorc/.m2/repository/dev/relism/fpr-core/1.1.0/fpr-core-1.1.0.jar!/dev/relism/fpr/core/internal/runtime/FrozenRouter.class)", - "Read(//c/tmp/**)", - "Bash(jar xf:*)", - "Bash(javap -c -p dev/relism/fpr/core/internal/runtime/FrozenRouter.class)", - "Bash(javap -c -p dev/relism/fpr/core/internal/runtime/RouteSearch.class)" - ] - } -} diff --git a/.gitignore b/.gitignore index e3d1024..ee23e88 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ build/ .DS_Store CLAUDE.md +.claude/ ### Local / scratch ### flash/src/main/java/dev/relism/Main.java diff --git a/README.md b/README.md index c912e82..760fd5d 100644 --- a/README.md +++ b/README.md @@ -1,83 +1 @@ # Flash - -A high-performance HTTP/1.1 server library for Java 21+, built for low-latency workloads. - -## Features - -- **Virtual threads** — one virtual thread per connection via `Executors.newVirtualThreadPerTaskExecutor()` -- **Zero-allocation hot path** — header buffer reused across keep-alive requests; `ByteView` slices avoid copies -- **Fast routing** — `fpr-core` compiles routes into a byte-level finite automaton at first request; path params via `PathParams` -- **Two-tier router** — mounted sub-routers matched by longest prefix, then `FastPathRouterImpl` fallback -- **Middleware chain** — composable `Middleware` lambdas fused at registration time (no per-request allocation) -- **Chunked transfer** — `ChunkedInputStream` de-chunks on the fly, keeps socket positioned for pipelining -- **Request body** — `bytes()` for full materialization or `stream()` for zero-copy streaming - -## Requirements - -- Java 21+ -- Maven 3.8+ - -## Build - -```bash -mvn clean package -DskipTests -``` - -## Quick start - -```java -HttpServer server = new HttpServer( - HttpServerConfiguration.builder().port(8080).build() -); - -server.get("/hello", (req, res) -> "Hello, world!"); - -server.register(new MyHandler()); // @Route(path="/...", method=GET) - -server.start().thenRun(() -> System.out.println("Listening on :8080")); -``` - -## Handler styles - -**Lambda:** -```java -server.get("/ping", (req, res) -> "pong"); -``` - -**Class-based (`@Route`):** -```java -@Route(path = "/users/{id}", method = HttpMethod.GET) -public class GetUser extends RequestHandler { - @Override - public Object handle(Request req, Response res) { - String id = req.pathParam("id"); - return "{\"id\":\"" + id + "\"}"; - } -} -``` - -**Middleware:** -```java -Middleware cors = next -> (req, res) -> { - res.header("Access-Control-Allow-Origin", "*"); - return next.handle(req, res); -}; -server.register(new GetUser(), cors); -``` - -## Maven dependency - -```xml - - - relism-releases - https://maven.relism.dev/releases - - - - - dev.relism - flash - 1.0-SNAPSHOT - -```