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/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/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java b/proxy-wasm-quarkus-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java
deleted file mode 100644
index 31d18ff..0000000
--- a/proxy-wasm-quarkus-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package io.roastedroot.proxywasm.jaxrs.example;
-
-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();
-
- public static WasmModule parseTestModule(String file) {
- return Parser.parse(Path.of(EXAMPLES_DIR + file));
- }
-
- // configure the ffiTests wasm plugin
- @Produces
- public PluginFactory ffiTests() 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;
- }
-}
diff --git a/proxy-wasm-quarkus-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java b/proxy-wasm-quarkus-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java
deleted file mode 100644
index 50a2f6c..0000000
--- a/proxy-wasm-quarkus-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package io.roastedroot.proxywasm.jaxrs.example;
-
-import io.roastedroot.proxywasm.jaxrs.WasmPlugin;
-import jakarta.ws.rs.POST;
-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;
- }
-}
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/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
new file mode 100644
index 0000000..9071458
--- /dev/null
+++ b/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/App.java
@@ -0,0 +1,28 @@
+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);
+ }
+}
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
new file mode 100644
index 0000000..521b6cb
--- /dev/null
+++ b/quarkus-proxy-wasm-example/src/main/java/io/roastedroot/proxywasm/jaxrs/example/Resources.java
@@ -0,0 +1,16 @@
+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";
+ }
+}
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 52%
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
index 97f8aee..a45a80e 100644
--- 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
@@ -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"));
}
}
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;