jetty.project icon indicating copy to clipboard operation
jetty.project copied to clipboard

Add GraalVM native support for Jetty WebSocket

Open sdeleuze opened this issue 4 months ago • 7 comments

Hi, based on my tests with Spring, the main broken feature with Jetty + GraalVM native image is the WebSocket support that requires to work:

  • GraalVM for JDK 21 to get method handle support
  • A missing reflection entry I am going to add on Spring side
  • Additional reflection entries to be added in Jetty JAR via a reflect-config.json embedded resource or in https://github.com/oracle/graalvm-reachability-metadata, see below:
[
{
  "name":"org.eclipse.jetty.ee10.websocket.jakarta.common.decoders.ByteBufferDecoder",
  "methods":[{"name":"<init>","parameterTypes":[] }]
},
{
  "name":"org.eclipse.jetty.ee10.websocket.jakarta.common.decoders.StringDecoder",
  "methods":[{"name":"<init>","parameterTypes":[] }]
},
{
  "name":"org.eclipse.jetty.ee10.websocket.jakarta.common.messages.DecodedBinaryMessageSink",
  "methods":[{"name":"<init>","parameterTypes":["org.eclipse.jetty.websocket.core.CoreSession","java.lang.invoke.MethodHandle","java.util.List"] }, {"name":"onWholeMessage","parameterTypes":["java.nio.ByteBuffer"] }]
},
{
  "name":"org.eclipse.jetty.ee10.websocket.jakarta.common.messages.DecodedTextMessageSink",
  "methods":[{"name":"<init>","parameterTypes":["org.eclipse.jetty.websocket.core.CoreSession","java.lang.invoke.MethodHandle","java.util.List"] }, {"name":"onMessage","parameterTypes":["java.lang.String"] }]
},
{
  "name":"org.eclipse.jetty.websocket.common.internal.ByteBufferMessageSink",
  "methods":[{"name":"<init>","parameterTypes":["org.eclipse.jetty.websocket.core.CoreSession","java.lang.invoke.MethodHandle","boolean"] }]
},
{
  "name":"org.eclipse.jetty.websocket.core.messages.StringMessageSink",
  "methods":[{"name":"<init>","parameterTypes":["org.eclipse.jetty.websocket.core.CoreSession","java.lang.invoke.MethodHandle","boolean"] }]
},
{
  "name":"org.springframework.web.socket.adapter.jetty.JettyWebSocketHandlerAdapter",
  "methods":[{"name":"onWebSocketBinary","parameterTypes":["java.nio.ByteBuffer","org.eclipse.jetty.websocket.api.Callback"] }, {"name":"onWebSocketClose","parameterTypes":["int","java.lang.String"] }, {"name":"onWebSocketError","parameterTypes":["java.lang.Throwable"] }, {"name":"onWebSocketFrame","parameterTypes":["org.eclipse.jetty.websocket.api.Frame","org.eclipse.jetty.websocket.api.Callback"] }, {"name":"onWebSocketOpen","parameterTypes":["org.eclipse.jetty.websocket.api.Session"] }, {"name":"onWebSocketText","parameterTypes":["java.lang.String"] }]
}
]

We usually recommend OSS project to start by providing support on https://github.com/oracle/graalvm-reachability-metadata side as it provides the native testing infrastructure, but maybe you prefer to add it on Jetty side (but you should then probably add native tests). Could you provide insights on how you would prefer adding such native support in Jetty (happy to setup a call to discuss that if you want)?

sdeleuze avatar Apr 22 '24 16:04 sdeleuze