--- layout: default title: KissServer AI Skill library: kiss-server skill_version: 0.1.0 release_version: 0.1.0 maven: io.github.arthurhoch:kiss-server:0.1.0 java: "17+" format: markdown --- # KissServer AI Skill v0.1.0 This Markdown file is a versioned AI skill for using **KissServer** in other Java projects. It is intentionally self-contained so an AI assistant can load this one document, add the Maven dependency, write consumer code, and avoid inventing APIs. Use this skill for release **0.1.0**. If the repository source is on a later -SNAPSHOT, consumer documentation should still use 0.1.0 unless the user explicitly asks for a snapshot build. ## Library Summary Tiny zero-dependency Java 17+ HTTP/1.1 server for simple REST-style applications, explicit routing, bounded parser limits, direct fast responses, and predictable shutdown. ## Maven Dependency ~~~xml io.github.arthurhoch kiss-server 0.1.0 ~~~ ## AI Usage Rules - Target Java 17 or newer. - Prefer the public package rooted at io.github.arthurhoch.kiss.server. - Do not invent convenience APIs. Use only the public members listed in this file or in generated Javadocs for the same release. - Keep examples small and explicit, matching the KISS philosophy. - Do not add extra frameworks unless the consuming project already uses them. - Keep older skill files in place when a new release is documented. ## Quick Example ~~~java KissServer server = KissServer.create(); server.get("/health", ctx -> ctx.text("OK")); server.get("/users/{id}", ctx -> ctx.text("user=" + ctx.pathParam("id"))); try (ServerHandle handle = server.start(8080)) { handle.await(); } ~~~ ## How To Use The Library - `KissServer.create()` starts from default `ServerConfig`. `KissServer.create(config)` uses an explicit config. - Register routes with `get`, `post`, `put`, `delete`, `patch`, `head`, `options`, or `route` before starting the server. - Normal handlers implement `Handler` and receive a `Context` with `Request`, path parameters, and response helpers. - Direct handlers implement `DirectHandler` and return bytes for advanced hot paths. Prefer normal handlers unless profiling justifies direct responses. - Use `ServerHandle.stop()` or try-with-resources to stop. `await()` blocks until shutdown. - Protocol, buffer, routing, and runtime subpackages expose lower-level types for advanced embedding and tests; most consumer apps should use `KissServer`, `ServerConfig`, `Handler`, `Context`, `Request`, and `Response`. ## Behavioral Contract For v0.1.0 - Java 17 is the baseline. Java 21 virtual-thread usage is optional through application-supplied executors or `ExecutorFactories.virtualThreadPerTaskOrCached()` fallback behavior. - `ServerConfig` owns host, port, executor, maximum connections, request/header/body limits, timeouts, keep-alive limits, buffer sizes, and handler execution mode. - `HandlerExecutionMode.WORKER` runs handlers on the configured or owned executor. Direct fast paths bypass normal response allocation when configured by route. - `HttpMethod` values are `GET`, `POST`, `PUT`, `DELETE`, `PATCH`, `HEAD`, and `OPTIONS`. - `Response` validates header names and values to prevent header injection. Body length is computed by the HTTP/1.1 writer. - `HttpStatus` is the source of status code and reason phrases. Use constants such as `OK`, `NO_CONTENT`, `BAD_REQUEST`, `NOT_FOUND`, `METHOD_NOT_ALLOWED`, `PAYLOAD_TOO_LARGE`, `INTERNAL_SERVER_ERROR`, and other enum constants shown in the generated API index. - Known exception families are `KissServerException` and HTTP-specific subclasses such as `BadRequestException`, `NotFoundException`, `MethodNotAllowedException`, `PayloadTooLargeException`, and `HeaderTooLargeException`. ## Practical Examples ### Explicit config ~~~java ServerConfig config = ServerConfig.builder() .host("127.0.0.1") .port(8080) .maxConnections(512) .maxBodyBytes(1024 * 1024) .keepAlive(true) .build(); KissServer server = KissServer.create(config); ~~~ ### JSON route without framework coupling ~~~java server.post("/echo", ctx -> Response.body( HttpStatus.OK, ContentType.APPLICATION_JSON, ctx.bodyAsString(), StandardCharsets.UTF_8 )); ~~~ ## Public API Specification The following index is generated from compiled public classes with javap -public. It includes public constructors, constants, enum methods, record accessors, inherited Object overrides when public, and public nested classes. When an internal package appears here, treat it as implementation detail unless the project documentation explicitly says otherwise. Consumer code should prefer the public surface described above. ~~~text public final class io.github.arthurhoch.kiss.server.ExecutorFactories { public static java.util.concurrent.ExecutorService cached(java.lang.String); public static java.util.concurrent.ExecutorService virtualThreadPerTaskOrCached(); } public final class io.github.arthurhoch.kiss.server.HandlerExecutionMode extends java.lang.Enum { public static final io.github.arthurhoch.kiss.server.HandlerExecutionMode WORKER; public static final io.github.arthurhoch.kiss.server.HandlerExecutionMode DIRECT; public static io.github.arthurhoch.kiss.server.HandlerExecutionMode[] values(); public static io.github.arthurhoch.kiss.server.HandlerExecutionMode valueOf(java.lang.String); } public final class io.github.arthurhoch.kiss.server.KissServer { public static io.github.arthurhoch.kiss.server.KissServer create(); public static io.github.arthurhoch.kiss.server.KissServer create(io.github.arthurhoch.kiss.server.ServerConfig); public io.github.arthurhoch.kiss.server.ServerConfig config(); public io.github.arthurhoch.kiss.server.routing.Router router(); public io.github.arthurhoch.kiss.server.KissServer get(java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public io.github.arthurhoch.kiss.server.KissServer post(java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public io.github.arthurhoch.kiss.server.KissServer put(java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public io.github.arthurhoch.kiss.server.KissServer delete(java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public io.github.arthurhoch.kiss.server.KissServer patch(java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public io.github.arthurhoch.kiss.server.KissServer head(java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public io.github.arthurhoch.kiss.server.KissServer options(java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public io.github.arthurhoch.kiss.server.KissServer route(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public io.github.arthurhoch.kiss.server.KissServer direct(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, io.github.arthurhoch.kiss.server.routing.DirectHandler); public io.github.arthurhoch.kiss.server.KissServer fastGet(java.lang.String, byte[]); public io.github.arthurhoch.kiss.server.ServerHandle start(); public io.github.arthurhoch.kiss.server.ServerHandle start(int); } public final class io.github.arthurhoch.kiss.server.ServerConfig extends java.lang.Record { public static final java.lang.String DEFAULT_HOST; public static final int DEFAULT_PORT; public static final int DEFAULT_MAX_CONNECTIONS; public static final int DEFAULT_MAX_HEADER_BYTES; public static final int DEFAULT_MAX_REQUEST_LINE_BYTES; public static final long DEFAULT_MAX_BODY_BYTES; public static final int DEFAULT_READ_TIMEOUT_MILLIS; public static final int DEFAULT_WRITE_TIMEOUT_MILLIS; public static final int DEFAULT_IDLE_TIMEOUT_MILLIS; public static final boolean DEFAULT_KEEP_ALIVE; public static final int DEFAULT_MAX_KEEP_ALIVE_REQUESTS; public static final int DEFAULT_BUFFER_SIZE; public static final int DEFAULT_BUFFER_POOL_SIZE; public static final io.github.arthurhoch.kiss.server.HandlerExecutionMode DEFAULT_HANDLER_EXECUTION_MODE; public io.github.arthurhoch.kiss.server.ServerConfig(java.lang.String, int, java.util.concurrent.ExecutorService, int, int, int, long, int, int, int, boolean, int, int, int); public io.github.arthurhoch.kiss.server.ServerConfig(java.lang.String, int, java.util.concurrent.ExecutorService, int, int, int, long, int, int, int, boolean, int, int, int, io.github.arthurhoch.kiss.server.HandlerExecutionMode); public static io.github.arthurhoch.kiss.server.ServerConfig defaults(); public static io.github.arthurhoch.kiss.server.ServerConfig$Builder builder(); public io.github.arthurhoch.kiss.server.ServerConfig withPort(int); public final java.lang.String toString(); public final int hashCode(); public final boolean equals(java.lang.Object); public java.lang.String host(); public int port(); public java.util.concurrent.ExecutorService executor(); public int maxConnections(); public int maxHeaderBytes(); public int maxRequestLineBytes(); public long maxBodyBytes(); public int readTimeoutMillis(); public int writeTimeoutMillis(); public int idleTimeoutMillis(); public boolean keepAlive(); public int maxKeepAliveRequests(); public int bufferSize(); public int bufferPoolSize(); public io.github.arthurhoch.kiss.server.HandlerExecutionMode handlerExecutionMode(); } public final class io.github.arthurhoch.kiss.server.ServerConfig$Builder { public io.github.arthurhoch.kiss.server.ServerConfig$Builder host(java.lang.String); public io.github.arthurhoch.kiss.server.ServerConfig$Builder port(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder executor(java.util.concurrent.ExecutorService); public io.github.arthurhoch.kiss.server.ServerConfig$Builder maxConnections(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder maxHeaderBytes(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder maxRequestLineBytes(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder maxBodyBytes(long); public io.github.arthurhoch.kiss.server.ServerConfig$Builder readTimeoutMillis(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder writeTimeoutMillis(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder idleTimeoutMillis(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder keepAlive(boolean); public io.github.arthurhoch.kiss.server.ServerConfig$Builder maxKeepAliveRequests(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder bufferSize(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder bufferPoolSize(int); public io.github.arthurhoch.kiss.server.ServerConfig$Builder handlerExecutionMode(io.github.arthurhoch.kiss.server.HandlerExecutionMode); public io.github.arthurhoch.kiss.server.ServerConfig build(); } public interface io.github.arthurhoch.kiss.server.ServerHandle extends java.lang.AutoCloseable { public abstract int port(); public abstract boolean running(); public abstract void await() throws java.lang.InterruptedException; public abstract void stop(); public default void close(); } public final class io.github.arthurhoch.kiss.server.buffer.BufferPool { public io.github.arthurhoch.kiss.server.buffer.BufferPool(int, int); public synchronized io.github.arthurhoch.kiss.server.buffer.PooledBuffer acquire(); public synchronized int pooledCount(); } public final class io.github.arthurhoch.kiss.server.buffer.InputBuffer { public io.github.arthurhoch.kiss.server.buffer.InputBuffer(int); public byte[] bytes(); public int writeIndex(); public void writeIndex(int); public int remaining(); } public final class io.github.arthurhoch.kiss.server.buffer.OutputBuffer { public io.github.arthurhoch.kiss.server.buffer.OutputBuffer(int); public void write(byte); public int size(); public void flushTo(java.io.OutputStream) throws java.io.IOException; } public final class io.github.arthurhoch.kiss.server.buffer.PooledBuffer implements java.lang.AutoCloseable { public byte[] bytes(); public int length(); public void close(); } public class io.github.arthurhoch.kiss.server.errors.BadRequestException extends io.github.arthurhoch.kiss.server.errors.KissServerException { public io.github.arthurhoch.kiss.server.errors.BadRequestException(java.lang.String); } public interface io.github.arthurhoch.kiss.server.errors.ErrorHandler { public abstract io.github.arthurhoch.kiss.server.http.Response handle(java.lang.Throwable); } public class io.github.arthurhoch.kiss.server.errors.HeaderTooLargeException extends io.github.arthurhoch.kiss.server.errors.BadRequestException { public io.github.arthurhoch.kiss.server.errors.HeaderTooLargeException(java.lang.String); } public class io.github.arthurhoch.kiss.server.errors.KissServerException extends java.lang.RuntimeException { public io.github.arthurhoch.kiss.server.errors.KissServerException(java.lang.String); public io.github.arthurhoch.kiss.server.errors.KissServerException(java.lang.String, java.lang.Throwable); } public class io.github.arthurhoch.kiss.server.errors.MethodNotAllowedException extends io.github.arthurhoch.kiss.server.errors.KissServerException { public io.github.arthurhoch.kiss.server.errors.MethodNotAllowedException(java.lang.String); } public class io.github.arthurhoch.kiss.server.errors.NotFoundException extends io.github.arthurhoch.kiss.server.errors.KissServerException { public io.github.arthurhoch.kiss.server.errors.NotFoundException(java.lang.String); } public class io.github.arthurhoch.kiss.server.errors.PayloadTooLargeException extends io.github.arthurhoch.kiss.server.errors.BadRequestException { public io.github.arthurhoch.kiss.server.errors.PayloadTooLargeException(java.lang.String); } public final class io.github.arthurhoch.kiss.server.http.ContentType { public static final java.lang.String TEXT_PLAIN; public static final java.lang.String HTML; public static final java.lang.String JSON; public static final java.lang.String OCTET_STREAM; } public final class io.github.arthurhoch.kiss.server.http.Context { public io.github.arthurhoch.kiss.server.http.Context(io.github.arthurhoch.kiss.server.http.Request, java.util.Map); public io.github.arthurhoch.kiss.server.http.Request request(); public java.lang.String pathParam(java.lang.String); public java.util.Map pathParams(); public java.lang.String bodyAsString(); public io.github.arthurhoch.kiss.server.http.Response text(java.lang.String); public io.github.arthurhoch.kiss.server.http.Response text(io.github.arthurhoch.kiss.server.http.HttpStatus, java.lang.String); } public final class io.github.arthurhoch.kiss.server.http.HttpHeaders { public static final java.lang.String CONNECTION; public static final java.lang.String CONTENT_LENGTH; public static final java.lang.String CONTENT_TYPE; public static final java.lang.String HOST; public static final java.lang.String TRANSFER_ENCODING; public static void requireValidName(java.lang.String); public static void requireSafeValue(java.lang.String); public static boolean equalsName(java.lang.String, java.lang.String); public static boolean contains(java.util.Map, java.lang.String); public static java.lang.String get(java.util.Map, java.lang.String); } public final class io.github.arthurhoch.kiss.server.http.HttpMethod extends java.lang.Enum { public static final io.github.arthurhoch.kiss.server.http.HttpMethod GET; public static final io.github.arthurhoch.kiss.server.http.HttpMethod POST; public static final io.github.arthurhoch.kiss.server.http.HttpMethod PUT; public static final io.github.arthurhoch.kiss.server.http.HttpMethod DELETE; public static final io.github.arthurhoch.kiss.server.http.HttpMethod PATCH; public static final io.github.arthurhoch.kiss.server.http.HttpMethod HEAD; public static final io.github.arthurhoch.kiss.server.http.HttpMethod OPTIONS; public static io.github.arthurhoch.kiss.server.http.HttpMethod[] values(); public static io.github.arthurhoch.kiss.server.http.HttpMethod valueOf(java.lang.String); public static io.github.arthurhoch.kiss.server.http.HttpMethod from(java.lang.String); } public final class io.github.arthurhoch.kiss.server.http.HttpStatus extends java.lang.Enum { public static final io.github.arthurhoch.kiss.server.http.HttpStatus OK; public static final io.github.arthurhoch.kiss.server.http.HttpStatus CREATED; public static final io.github.arthurhoch.kiss.server.http.HttpStatus NO_CONTENT; public static final io.github.arthurhoch.kiss.server.http.HttpStatus BAD_REQUEST; public static final io.github.arthurhoch.kiss.server.http.HttpStatus NOT_FOUND; public static final io.github.arthurhoch.kiss.server.http.HttpStatus METHOD_NOT_ALLOWED; public static final io.github.arthurhoch.kiss.server.http.HttpStatus PAYLOAD_TOO_LARGE; public static final io.github.arthurhoch.kiss.server.http.HttpStatus REQUEST_HEADER_FIELDS_TOO_LARGE; public static final io.github.arthurhoch.kiss.server.http.HttpStatus INTERNAL_SERVER_ERROR; public static final io.github.arthurhoch.kiss.server.http.HttpStatus NOT_IMPLEMENTED; public static final io.github.arthurhoch.kiss.server.http.HttpStatus SERVICE_UNAVAILABLE; public static io.github.arthurhoch.kiss.server.http.HttpStatus[] values(); public static io.github.arthurhoch.kiss.server.http.HttpStatus valueOf(java.lang.String); public int code(); public java.lang.String reason(); public static io.github.arthurhoch.kiss.server.http.HttpStatus fromCode(int); } public final class io.github.arthurhoch.kiss.server.http.Request { public io.github.arthurhoch.kiss.server.http.Request(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, java.lang.String, java.util.Map, byte[]); public io.github.arthurhoch.kiss.server.http.HttpMethod method(); public java.lang.String path(); public java.lang.String queryString(); public java.util.Map headers(); public byte[] body(); public java.lang.String bodyAsString(); public java.lang.String bodyAsString(java.nio.charset.Charset); public java.lang.String header(java.lang.String); public boolean equals(java.lang.Object); public int hashCode(); } public final class io.github.arthurhoch.kiss.server.http.Response { public static io.github.arthurhoch.kiss.server.http.Response status(io.github.arthurhoch.kiss.server.http.HttpStatus); public static io.github.arthurhoch.kiss.server.http.Response text(java.lang.String); public static io.github.arthurhoch.kiss.server.http.Response text(io.github.arthurhoch.kiss.server.http.HttpStatus, java.lang.String); public static io.github.arthurhoch.kiss.server.http.Response body(io.github.arthurhoch.kiss.server.http.HttpStatus, java.lang.String, java.lang.String, java.nio.charset.Charset); public io.github.arthurhoch.kiss.server.http.Response header(java.lang.String, java.lang.String); public io.github.arthurhoch.kiss.server.http.HttpStatus status(); public java.util.Map headers(); public byte[] body(); public int bodyLength(); public void writeBodyTo(java.io.OutputStream) throws java.io.IOException; } public final class io.github.arthurhoch.kiss.server.protocol.http11.Http11Connection implements java.lang.Runnable { public io.github.arthurhoch.kiss.server.protocol.http11.Http11Connection(java.net.Socket); public io.github.arthurhoch.kiss.server.protocol.http11.Http11Connection(java.net.Socket, io.github.arthurhoch.kiss.server.ServerConfig, io.github.arthurhoch.kiss.server.routing.Router, java.util.concurrent.atomic.AtomicBoolean, java.lang.Runnable); public void run(); } public class io.github.arthurhoch.kiss.server.protocol.http11.Http11ParseException extends java.lang.Exception { public io.github.arthurhoch.kiss.server.protocol.http11.Http11ParseException(io.github.arthurhoch.kiss.server.http.HttpStatus, java.lang.String); public io.github.arthurhoch.kiss.server.http.HttpStatus status(); } public final class io.github.arthurhoch.kiss.server.protocol.http11.Http11ParserLimits extends java.lang.Record { public io.github.arthurhoch.kiss.server.protocol.http11.Http11ParserLimits(int, int, int, long); public final java.lang.String toString(); public final int hashCode(); public final boolean equals(java.lang.Object); public int maxRequestLineBytes(); public int maxHeaderBytes(); public int maxHeaderCount(); public long maxBodyBytes(); } public final class io.github.arthurhoch.kiss.server.protocol.http11.Http11RequestParser { public io.github.arthurhoch.kiss.server.protocol.http11.Http11RequestParser(io.github.arthurhoch.kiss.server.protocol.http11.Http11ParserLimits); public io.github.arthurhoch.kiss.server.protocol.http11.Http11RequestParser(io.github.arthurhoch.kiss.server.protocol.http11.Http11ParserLimits, int); public io.github.arthurhoch.kiss.server.protocol.http11.Http11ParserLimits limits(); public io.github.arthurhoch.kiss.server.protocol.http11.ParsedRequest parse(java.io.InputStream) throws java.io.IOException, io.github.arthurhoch.kiss.server.protocol.http11.Http11ParseException; } public final class io.github.arthurhoch.kiss.server.protocol.http11.Http11ResponseWriter { public io.github.arthurhoch.kiss.server.protocol.http11.Http11ResponseWriter(); public void write(java.io.OutputStream, io.github.arthurhoch.kiss.server.http.Response) throws java.io.IOException; public byte[] toBytes(io.github.arthurhoch.kiss.server.http.Response, boolean); public void write(java.io.OutputStream, io.github.arthurhoch.kiss.server.http.Response, boolean) throws java.io.IOException; public void writeFast(java.io.OutputStream, byte[], boolean, boolean) throws java.io.IOException; } public final class io.github.arthurhoch.kiss.server.protocol.http11.Http11ServerEngine { public io.github.arthurhoch.kiss.server.protocol.http11.Http11ServerEngine(io.github.arthurhoch.kiss.server.ServerConfig, io.github.arthurhoch.kiss.server.routing.Router); public io.github.arthurhoch.kiss.server.ServerConfig config(); public io.github.arthurhoch.kiss.server.routing.Router router(); public io.github.arthurhoch.kiss.server.ServerHandle start(); } public final class io.github.arthurhoch.kiss.server.protocol.http11.ParsedRequest { public io.github.arthurhoch.kiss.server.protocol.http11.ParsedRequest(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, java.lang.String, java.util.Map, byte[]); public io.github.arthurhoch.kiss.server.http.HttpMethod method(); public java.lang.String target(); public java.lang.String version(); public java.util.Map headers(); public byte[] body(); public boolean equals(java.lang.Object); public int hashCode(); } public interface io.github.arthurhoch.kiss.server.routing.DirectHandler { public abstract byte[] handle() throws java.lang.Exception; } public final class io.github.arthurhoch.kiss.server.routing.FastResponses { public static byte[] text(java.lang.String); public static byte[] text(io.github.arthurhoch.kiss.server.http.HttpStatus, java.lang.String); public static byte[] json(java.lang.String); public static byte[] json(io.github.arthurhoch.kiss.server.http.HttpStatus, java.lang.String); public static byte[] noContent(); public static byte[] empty(io.github.arthurhoch.kiss.server.http.HttpStatus); public static byte[] withConnection(byte[], boolean, boolean); public static byte[] crlf(); } public interface io.github.arthurhoch.kiss.server.routing.Handler { public abstract io.github.arthurhoch.kiss.server.http.Response handle(io.github.arthurhoch.kiss.server.http.Context) throws java.lang.Exception; } public final class io.github.arthurhoch.kiss.server.routing.Route { public io.github.arthurhoch.kiss.server.routing.Route(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler, io.github.arthurhoch.kiss.server.routing.DirectHandler); public static io.github.arthurhoch.kiss.server.routing.Route normal(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public static io.github.arthurhoch.kiss.server.routing.Route direct(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, io.github.arthurhoch.kiss.server.routing.DirectHandler); public io.github.arthurhoch.kiss.server.http.HttpMethod method(); public java.lang.String path(); public io.github.arthurhoch.kiss.server.routing.Handler handler(); public io.github.arthurhoch.kiss.server.routing.DirectHandler directHandler(); public byte[] directResponse(); public boolean hasPrebuiltDirectResponse(); public byte[] directResponseUnsafe(); public boolean fast(); public boolean exact(); public java.util.Optional> match(java.lang.String); } public final class io.github.arthurhoch.kiss.server.routing.RouteMatch { public io.github.arthurhoch.kiss.server.routing.RouteMatch(io.github.arthurhoch.kiss.server.routing.Route, java.util.Map); public io.github.arthurhoch.kiss.server.routing.Route route(); public java.util.Map pathParams(); } public final class io.github.arthurhoch.kiss.server.routing.RouteTrie { public io.github.arthurhoch.kiss.server.routing.RouteTrie(); public void add(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public java.util.Optional match(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String); } public final class io.github.arthurhoch.kiss.server.routing.Router { public io.github.arthurhoch.kiss.server.routing.Router(); public void add(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, io.github.arthurhoch.kiss.server.routing.Handler); public void addDirect(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, io.github.arthurhoch.kiss.server.routing.DirectHandler); public void addDirectResponse(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String, byte[]); public java.util.Optional match(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String); public io.github.arthurhoch.kiss.server.routing.RouteMatch matchOrNull(io.github.arthurhoch.kiss.server.http.HttpMethod, java.lang.String); public java.util.List routes(io.github.arthurhoch.kiss.server.http.HttpMethod); public boolean matchesPath(java.lang.String); public java.util.EnumSet allowedMethods(java.lang.String); } public final class io.github.arthurhoch.kiss.server.runtime.ConnectionAcceptor implements java.lang.Runnable { public io.github.arthurhoch.kiss.server.runtime.ConnectionAcceptor(java.net.ServerSocket, java.util.function.Consumer); public void run(); } public final class io.github.arthurhoch.kiss.server.runtime.ConnectionLimiter { public io.github.arthurhoch.kiss.server.runtime.ConnectionLimiter(int); public boolean tryAcquire(); public void release(); public int availablePermits(); public int activeCount(); } public final class io.github.arthurhoch.kiss.server.runtime.ExecutorStrategy implements java.lang.AutoCloseable { public static io.github.arthurhoch.kiss.server.runtime.ExecutorStrategy from(io.github.arthurhoch.kiss.server.ServerConfig); public java.util.concurrent.ExecutorService executor(); public boolean owned(); public void close(); } public final class io.github.arthurhoch.kiss.server.runtime.GracefulShutdown { public static void shutdown(java.util.concurrent.ExecutorService, long); } public final class io.github.arthurhoch.kiss.server.runtime.ServerRuntime implements io.github.arthurhoch.kiss.server.ServerHandle { public io.github.arthurhoch.kiss.server.runtime.ServerRuntime(int, java.lang.Runnable); public int port(); public boolean running(); public void await() throws java.lang.InterruptedException; public void stop(); } ~~~ ## Local Verification Commands Run these commands in the KissServer repository when changing examples, docs, or release skill files: ~~~bash mvn -B clean verify mvn -B javadoc:javadoc ~~~ ## Release Skill Maintenance For a future release such as 0.2.0, create a new file at docs/skills/v0.2.0.md instead of editing or deleting this historical file. Update docs/skills/index.md with a view link and a raw download link for the new version.