1package dev.rafex.ether.websocket.jetty12;
29import java.nio.charset.StandardCharsets;
30import java.util.ArrayList;
31import java.util.LinkedHashMap;
34import java.util.Objects;
36import org.eclipse.jetty.http.pathmap.PathSpec;
37import org.eclipse.jetty.server.Handler;
38import org.eclipse.jetty.server.Server;
39import org.eclipse.jetty.server.ServerConnector;
40import org.eclipse.jetty.server.handler.ContextHandler;
41import org.eclipse.jetty.util.MultiMap;
42import org.eclipse.jetty.util.UrlEncoded;
43import org.eclipse.jetty.util.thread.QueuedThreadPool;
44import org.eclipse.jetty.websocket.server.ServerUpgradeRequest;
45import org.eclipse.jetty.websocket.server.ServerUpgradeResponse;
46import org.eclipse.jetty.websocket.server.WebSocketUpgradeHandler;
48import dev.rafex.ether.websocket.core.WebSocketPatterns;
49import dev.rafex.ether.websocket.core.WebSocketRoute;
58public final class JettyWebSocketServerFactory {
60 private JettyWebSocketServerFactory() {
77 Objects.requireNonNull(
config,
"config");
78 Objects.requireNonNull(routeRegistry,
"routeRegistry");
80 final var pool =
new QueuedThreadPool();
81 pool.setMaxThreads(
config.maxThreads());
82 pool.setMinThreads(
config.minThreads());
83 pool.setIdleTimeout(
config.idleTimeoutMs());
84 pool.setName(
config.threadPoolName());
86 final var server =
new Server(pool);
87 final var connector =
new ServerConnector(server);
88 connector.setPort(
config.port());
89 server.addConnector(connector);
91 final var context =
new ContextHandler(
"/");
92 context.setHandler(buildUpgradeHandler(server, routeRegistry.routes()));
93 server.setHandler(context);
107 final List<JettyWebSocketModule> modules) {
111 module.registerRoutes(routeRegistry, context);
124 private static Handler buildUpgradeHandler(
final Server server,
final List<WebSocketRoute> routes) {
125 return WebSocketUpgradeHandler.from(server, container -> {
126 for (
final var route : routes ==
null ? List.<WebSocketRoute>of() :
new ArrayList<>(routes)) {
127 container.addMapping(PathSpec.from(route.pattern()),
128 (request, response, callback) -> createEndpoint(route, request, response));
142 private static Object createEndpoint(
final WebSocketRoute route,
final ServerUpgradeRequest request,
143 final ServerUpgradeResponse response) {
144 return JettyWebSocketUpgrades.createEndpoint(route, request, response);
Mutable registry that collects WebSocket routes during module registration.
static JettyWebSocketServerRunner create(final JettyWebSocketServerConfig config, final JettyWebSocketRouteRegistry routeRegistry)
Creates a WebSocket server from the given configuration and route registry.
static JettyWebSocketServerRunner create(final JettyWebSocketServerConfig config, final List< JettyWebSocketModule > modules)
Creates a WebSocket server by invoking all given modules to populate the route registry,...
Thin wrapper around a Jetty Server that exposes lifecycle methods.
SPI contract for WebSocket modules that register endpoint routes.
Typed configuration entry points and composition APIs for Ether applications.
record JettyWebSocketServerConfig(int port, int minThreads, int maxThreads, int idleTimeoutMs, String threadPoolName)
Immutable configuration for the Jetty WebSocket server.
record JettyWebSocketModuleContext(JettyWebSocketServerConfig config)
Read-only context passed to JettyWebSocketModule#registerRoutes.