From 82e93f1e31b866c12f05e6ad6a500caf10c22ce4 Mon Sep 17 00:00:00 2001 From: Hiram Chirino Date: Sat, 29 Mar 2025 17:51:22 -0400 Subject: [PATCH 1/2] Simplify maven module dependencies. Signed-off-by: Hiram Chirino --- pom.xml | 3 +- proxy-wasm-jaxrs/pom.xml | 38 ++----------------- .../proxywasm/jaxrs/ServerAdaptor.java | 6 --- .../proxywasm/jaxrs/cdi/ServerAdaptor.java | 10 +++++ .../jaxrs/cdi/WasmPluginFeature.java | 4 +- .../.gitignore | 0 .../pom.xml | 4 +- .../proxywasm/jaxrs/example/App.java | 0 .../proxywasm/jaxrs/example/Resources.java | 0 .../src/main/resources/application.properties | 0 .../proxywasm/jaxrs/example/FFITest.java | 0 .../deployment/ProxyWasmProcessor.java | 5 ++- .../runtime}/VertxHttpRequestAdaptor.java | 2 +- .../runtime}/VertxServerAdaptor.java | 2 +- 14 files changed, 25 insertions(+), 49 deletions(-) create mode 100644 proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/cdi/ServerAdaptor.java rename {proxy-wasm-quarkus-example => quarkus-proxy-wasm-example}/.gitignore (100%) rename {proxy-wasm-quarkus-example => quarkus-proxy-wasm-example}/pom.xml (97%) rename {proxy-wasm-quarkus-example => quarkus-proxy-wasm-example}/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java (100%) rename {proxy-wasm-quarkus-example => quarkus-proxy-wasm-example}/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java (100%) rename {proxy-wasm-quarkus-example => quarkus-proxy-wasm-example}/src/main/resources/application.properties (100%) rename {proxy-wasm-quarkus-example => quarkus-proxy-wasm-example}/src/test/java/io/roastedroot/proxywasm/jaxrs/example/FFITest.java (100%) rename {proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/vertx => quarkus-proxy-wasm/runtime/src/main/java/io/quarkiverse/proxywasm/runtime}/VertxHttpRequestAdaptor.java (94%) rename {proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/vertx => quarkus-proxy-wasm/runtime/src/main/java/io/quarkiverse/proxywasm/runtime}/VertxServerAdaptor.java (98%) diff --git a/pom.xml b/pom.xml index 89b0a7a..e255f7e 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,7 @@ ${maven.compiler.version} 3.5.2 ${surefire-plugin.version} + 3.2.7 5.12.0 @@ -232,7 +233,7 @@ quarkus-proxy-wasm - proxy-wasm-quarkus-example + quarkus-proxy-wasm-example diff --git a/proxy-wasm-jaxrs/pom.xml b/proxy-wasm-jaxrs/pom.xml index 700c614..286bab9 100644 --- a/proxy-wasm-jaxrs/pom.xml +++ b/proxy-wasm-jaxrs/pom.xml @@ -26,50 +26,16 @@ - - com.dylibso.chicory - aot-experimental - ${chicory.version} - - - com.dylibso.chicory - host-module-annotations-experimental - ${chicory.version} - - - com.dylibso.chicory - runtime - ${chicory.version} - - - com.dylibso.chicory - wasi - ${chicory.version} - - - - io.quarkus - quarkus-arc - true - io.roastedroot proxy-wasm-java-host ${project.version} - - - io.vertx - vertx-core - true - jakarta.servlet jakarta.servlet-api true - - jakarta.enterprise jakarta.enterprise.cdi-api @@ -80,6 +46,8 @@ jakarta.inject-api provided + + jakarta.ws.rs jakarta.ws.rs-api @@ -93,7 +61,7 @@ io.smallrye jandex-maven-plugin - 3.2.7 + ${jandex.version} make-index diff --git a/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/ServerAdaptor.java b/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/ServerAdaptor.java index b1c34c5..8e49d25 100644 --- a/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/ServerAdaptor.java +++ b/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/ServerAdaptor.java @@ -5,9 +5,6 @@ import io.roastedroot.proxywasm.plugin.HttpCallResponse; import io.roastedroot.proxywasm.plugin.HttpCallResponseHandler; import io.roastedroot.proxywasm.plugin.HttpRequestAdaptor; -import jakarta.annotation.Priority; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Alternative; import jakarta.ws.rs.core.UriBuilder; import java.net.URI; import java.net.http.HttpClient; @@ -19,9 +16,6 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -@Alternative -@Priority(100) -@ApplicationScoped public class ServerAdaptor implements io.roastedroot.proxywasm.plugin.ServerAdaptor { ScheduledExecutorService tickExecutorService = Executors.newScheduledThreadPool(1); diff --git a/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/cdi/ServerAdaptor.java b/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/cdi/ServerAdaptor.java new file mode 100644 index 0000000..0d28d4d --- /dev/null +++ b/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/cdi/ServerAdaptor.java @@ -0,0 +1,10 @@ +package io.roastedroot.proxywasm.jaxrs.cdi; + +import jakarta.annotation.Priority; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Alternative; + +@Alternative +@Priority(100) +@ApplicationScoped +public class ServerAdaptor extends io.roastedroot.proxywasm.jaxrs.ServerAdaptor {} diff --git a/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/cdi/WasmPluginFeature.java b/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/cdi/WasmPluginFeature.java index daf361e..4137df9 100644 --- a/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/cdi/WasmPluginFeature.java +++ b/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/cdi/WasmPluginFeature.java @@ -17,12 +17,12 @@ public class WasmPluginFeature extends io.roastedroot.proxywasm.jaxrs.AbstractWa @Inject Instance factories; - @Inject @Any ServerAdaptor httpServer; + @Inject @Any ServerAdaptor serverAdaptor; @Inject @PostConstruct public void init() throws StartException { - init(factories, httpServer); + init(factories, serverAdaptor); } @PreDestroy diff --git a/proxy-wasm-quarkus-example/.gitignore b/quarkus-proxy-wasm-example/.gitignore similarity index 100% rename from proxy-wasm-quarkus-example/.gitignore rename to quarkus-proxy-wasm-example/.gitignore diff --git a/proxy-wasm-quarkus-example/pom.xml b/quarkus-proxy-wasm-example/pom.xml similarity index 97% rename from proxy-wasm-quarkus-example/pom.xml rename to quarkus-proxy-wasm-example/pom.xml index fd05ecc..d6eef1e 100644 --- a/proxy-wasm-quarkus-example/pom.xml +++ b/quarkus-proxy-wasm-example/pom.xml @@ -9,9 +9,9 @@ ../pom.xml - proxy-wasm-quarkus-example + quarkus-proxy-wasm-example jar - proxy-wasm-quarkus-example + quarkus-proxy-wasm-example diff --git a/proxy-wasm-quarkus-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java b/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java similarity index 100% rename from proxy-wasm-quarkus-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java rename to quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java diff --git a/proxy-wasm-quarkus-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java b/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java similarity index 100% rename from proxy-wasm-quarkus-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java rename to quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java diff --git a/proxy-wasm-quarkus-example/src/main/resources/application.properties b/quarkus-proxy-wasm-example/src/main/resources/application.properties similarity index 100% rename from proxy-wasm-quarkus-example/src/main/resources/application.properties rename to quarkus-proxy-wasm-example/src/main/resources/application.properties diff --git a/proxy-wasm-quarkus-example/src/test/java/io/roastedroot/proxywasm/jaxrs/example/FFITest.java b/quarkus-proxy-wasm-example/src/test/java/io/roastedroot/proxywasm/jaxrs/example/FFITest.java similarity index 100% rename from proxy-wasm-quarkus-example/src/test/java/io/roastedroot/proxywasm/jaxrs/example/FFITest.java rename to quarkus-proxy-wasm-example/src/test/java/io/roastedroot/proxywasm/jaxrs/example/FFITest.java diff --git a/quarkus-proxy-wasm/deployment/src/main/java/io/quarkiverse/proxywasm/deployment/ProxyWasmProcessor.java b/quarkus-proxy-wasm/deployment/src/main/java/io/quarkiverse/proxywasm/deployment/ProxyWasmProcessor.java index bf0725d..9fb6c59 100644 --- a/quarkus-proxy-wasm/deployment/src/main/java/io/quarkiverse/proxywasm/deployment/ProxyWasmProcessor.java +++ b/quarkus-proxy-wasm/deployment/src/main/java/io/quarkiverse/proxywasm/deployment/ProxyWasmProcessor.java @@ -1,5 +1,7 @@ package io.quarkiverse.proxywasm.deployment; +import io.quarkiverse.proxywasm.runtime.VertxHttpRequestAdaptor; +import io.quarkiverse.proxywasm.runtime.VertxServerAdaptor; import io.quarkus.arc.deployment.AdditionalBeanBuildItem; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.FeatureBuildItem; @@ -20,7 +22,8 @@ FeatureBuildItem feature() { @BuildStep AdditionalBeanBuildItem resources() { - return new AdditionalBeanBuildItem(WasmPluginFeature.class); + return new AdditionalBeanBuildItem( + WasmPluginFeature.class, VertxServerAdaptor.class, VertxHttpRequestAdaptor.class); } @BuildStep diff --git a/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/vertx/VertxHttpRequestAdaptor.java b/quarkus-proxy-wasm/runtime/src/main/java/io/quarkiverse/proxywasm/runtime/VertxHttpRequestAdaptor.java similarity index 94% rename from proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/vertx/VertxHttpRequestAdaptor.java rename to quarkus-proxy-wasm/runtime/src/main/java/io/quarkiverse/proxywasm/runtime/VertxHttpRequestAdaptor.java index fde2306..21e5097 100644 --- a/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/vertx/VertxHttpRequestAdaptor.java +++ b/quarkus-proxy-wasm/runtime/src/main/java/io/quarkiverse/proxywasm/runtime/VertxHttpRequestAdaptor.java @@ -1,4 +1,4 @@ -package io.roastedroot.proxywasm.jaxrs.vertx; +package io.quarkiverse.proxywasm.runtime; import io.roastedroot.proxywasm.jaxrs.JaxrsHttpRequestAdaptor; import jakarta.annotation.Priority; diff --git a/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/vertx/VertxServerAdaptor.java b/quarkus-proxy-wasm/runtime/src/main/java/io/quarkiverse/proxywasm/runtime/VertxServerAdaptor.java similarity index 98% rename from proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/vertx/VertxServerAdaptor.java rename to quarkus-proxy-wasm/runtime/src/main/java/io/quarkiverse/proxywasm/runtime/VertxServerAdaptor.java index 83d0c8c..73f6ebb 100644 --- a/proxy-wasm-jaxrs/src/main/java/io/roastedroot/proxywasm/jaxrs/vertx/VertxServerAdaptor.java +++ b/quarkus-proxy-wasm/runtime/src/main/java/io/quarkiverse/proxywasm/runtime/VertxServerAdaptor.java @@ -1,4 +1,4 @@ -package io.roastedroot.proxywasm.jaxrs.vertx; +package io.quarkiverse.proxywasm.runtime; import io.roastedroot.proxywasm.ProxyMap; import io.roastedroot.proxywasm.plugin.HttpCallResponse; From 1fbf715fbf47edc191b86507ea361b9ae6e34576 Mon Sep 17 00:00:00 2001 From: Hiram Chirino Date: Mon, 7 Apr 2025 10:25:17 -0400 Subject: [PATCH 2/2] Improve the README, simplify the Quarkus example Signed-off-by: Hiram Chirino --- README.md | 98 ++++++++++++++++++- .../proxywasm/jaxrs/example/App.java | 31 ++---- .../proxywasm/jaxrs/example/Resources.java | 12 +-- .../proxywasm/jaxrs/example/FFITest.java | 15 ++- 4 files changed, 122 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index b06317c..ba7a234 100644 --- a/README.md +++ b/README.md @@ -1 +1,97 @@ -# Proxy WASM Java SDK +# Proxy WASM Java Host + +The Java implementation for proxy-wasm, enabling developer to run proxy-wasm extensions in Java. + +## Building + +To build the project, you need to have Maven installed. You can build the project using the following command: + +```bash +mvn clean install +``` + +## Quarkus Example + +The `quarkus-proxy-wasm-example` directory contains a simple example of how to use the proxy-wasm Java host with Quarkus. + +It creates a simple JAX-RS application that uses ta proxy-wasm plugin to filter the http request before it reaches the application resource: + +```java +package io.roastedroot.proxywasm.jaxrs.example; + +import io.roastedroot.proxywasm.jaxrs.WasmPlugin; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; + +@Path("/") +public class Resources { + + @Path("/test") + @GET + @WasmPlugin("example") // filter with example wasm plugin + public String ffiTests() { + return "Hello World"; + } +} +``` + +The `WasmPlugin` annotation is used to specify the name of the plugin to be used for filtering. + +```java +package io.roastedroot.proxywasm.jaxrs.example; + +import com.dylibso.chicory.wasm.Parser; +import com.dylibso.chicory.wasm.WasmModule; +import io.roastedroot.proxywasm.StartException; +import io.roastedroot.proxywasm.plugin.Plugin; +import io.roastedroot.proxywasm.plugin.PluginFactory; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Produces; +import java.nio.file.Path; + +@ApplicationScoped +public class App { + + private static WasmModule module = + Parser.parse( + Path.of("../proxy-wasm-java-host/src/test/go-examples/unit_tester/main.wasm")); + + // configure the the example wasm plugin + @Produces + public PluginFactory example() throws StartException { + return () -> + Plugin.builder() + .withName("example") + .withPluginConfig("{ \"type\": \"headerTests\" }") + .build(module); + } +} +``` + +The method `example()` is give CDI a `PluginFactory` that can create instances of the `example` plugin. An instance of that plugin will be used to filter the request on resources that have the `@WasmPlugin("example")` annotation. + +### Running the Example + +Once the project is [built](#building), you can run the example using the following command: + +```bash +cd quarkus-proxy-wasm-example +java -jar target/quarkus-app/quarkus-run.jar +``` + +Then test it using curl command: + +```bash +curl -i http://localhost:8080/test +``` + +The example uses a simple wasm plugin which just adds an `x-response-counter` header to the response. The value of the header is incremented for each request. So you should see output like this: + +``` +HTTP/1.1 200 OK +Content-Type: text/plain;charset=UTF-8 +x-response-counter: 1 +content-length: 11 + +Hello World +``` diff --git a/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java b/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java index 31d18ff..9071458 100644 --- a/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java +++ b/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java @@ -2,42 +2,27 @@ import com.dylibso.chicory.wasm.Parser; import com.dylibso.chicory.wasm.WasmModule; -import com.google.gson.Gson; import io.roastedroot.proxywasm.StartException; import io.roastedroot.proxywasm.plugin.Plugin; import io.roastedroot.proxywasm.plugin.PluginFactory; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; import java.nio.file.Path; -import java.util.Map; @ApplicationScoped public class App { - public static final String EXAMPLES_DIR = "../proxy-wasm-java-host/src/test"; - private static final Gson gson = new Gson(); + private static WasmModule module = + Parser.parse( + Path.of("../proxy-wasm-java-host/src/test/go-examples/unit_tester/main.wasm")); - public static WasmModule parseTestModule(String file) { - return Parser.parse(Path.of(EXAMPLES_DIR + file)); - } - - // configure the ffiTests wasm plugin + // configure the the example wasm plugin @Produces - public PluginFactory ffiTests() throws StartException { + public PluginFactory example() throws StartException { return () -> Plugin.builder() - .withName("ffiTests") - .withPluginConfig("{ \"type\": \"ffiTests\" }") - .withForeignFunctions(Map.of("reverse", App::reverse)) - .build(parseTestModule("/go-examples/unit_tester/main.wasm")); - } - - // This function can be called from the Wasm module - public static byte[] reverse(byte[] data) { - byte[] reversed = new byte[data.length]; - for (int i = 0; i < data.length; i++) { - reversed[i] = data[data.length - 1 - i]; - } - return reversed; + .withName("example") + .withPluginConfig("{ \"type\": \"headerTests\" }") + .build(module); } } diff --git a/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java b/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java index 50a2f6c..521b6cb 100644 --- a/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java +++ b/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java @@ -1,16 +1,16 @@ package io.roastedroot.proxywasm.jaxrs.example; import io.roastedroot.proxywasm.jaxrs.WasmPlugin; -import jakarta.ws.rs.POST; +import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @Path("/") public class Resources { - @Path("/ffiTests/reverse") - @POST - @WasmPlugin("ffiTests") // filter with ffiTests wasm plugin - public String ffiTests(String body) { - return body; + @Path("/test") + @GET + @WasmPlugin("example") // filter with example wasm plugin + public String ffiTests() { + return "Hello World"; } } diff --git a/quarkus-proxy-wasm-example/src/test/java/io/roastedroot/proxywasm/jaxrs/example/FFITest.java b/quarkus-proxy-wasm-example/src/test/java/io/roastedroot/proxywasm/jaxrs/example/FFITest.java index 97f8aee..a45a80e 100644 --- a/quarkus-proxy-wasm-example/src/test/java/io/roastedroot/proxywasm/jaxrs/example/FFITest.java +++ b/quarkus-proxy-wasm-example/src/test/java/io/roastedroot/proxywasm/jaxrs/example/FFITest.java @@ -12,11 +12,18 @@ public class FFITest { @Test public void reverse() throws InterruptedException { - given().body("My Test") - .when() - .post("/ffiTests/reverse") + given().when() + .get("/test") .then() .statusCode(200) - .body(equalTo("tseT yM")); + .header("x-response-counter", "1") + .body(equalTo("Hello World")); + + given().when() + .get("/test") + .then() + .statusCode(200) + .header("x-response-counter", "2") + .body(equalTo("Hello World")); } }