Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,6 @@ build/

### Mac OS ###
.DS_Store

### Rust ###
target/
15 changes: 15 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,24 @@
#
# $ make build-go-examples
#
# To build the Rust examples, install rustup and cargo install the wasm target with run `rustup target add wasm32-wasip1`
# and then run:
#
# $ make build-rust-examples
#

.PHONY: all
all: build-go-examples build-rust-examples

.PHONY: build-go-examples
build-go-examples:
@find ./src/test/go-examples -mindepth 1 -type f -name "main.go" \
| xargs -I {} bash -c 'dirname {}' \
| xargs -I {} bash -c 'cd {} && env GOOS=wasip1 GOARCH=wasm go build -buildmode=c-shared -o main.wasm ./main.go'


.PHONY: build-rust-examples
build-rust-examples:
@find ./src/test/rust-examples -mindepth 1 -type f -name "Cargo.toml" \
| xargs -I {} bash -c 'dirname {}' \
| xargs -I {} bash -c 'cd {} && cargo build --target wasm32-wasip1 --release; cp ./target/wasm32-wasip1/release/*.wasm ./main.wasm'
157 changes: 141 additions & 16 deletions src/main/java/io/roastedroot/proxywasm/ABI.java
Original file line number Diff line number Diff line change
Expand Up @@ -1107,10 +1107,24 @@ int proxyContinueStream(int arg) {
return result.getValue();
}

// TODO: implement
// https://github.com/proxy-wasm/spec/tree/main/abi-versions/v0.2.1#proxy_close_stream
// TODO: implement
// https://github.com/proxy-wasm/spec/tree/main/abi-versions/v0.2.1#proxy_get_status
/**
* implements: https://github.com/proxy-wasm/spec/tree/main/abi-versions/v0.2.1#proxy_close_stream
*/
@WasmExport
int proxyCloseStream(int proxyStreamType) {
// TODO: implement
return WasmResult.UNIMPLEMENTED.getValue();
}

/**
* implements: https://github.com/proxy-wasm/spec/tree/main/abi-versions/v0.2.1#proxy_get_status
*/
@WasmExport
int proxyGetStatus(
int returnStatusCode, int returnStatusMessageData, int returnStatusMessageSize) {
// TODO: implement
return WasmResult.UNIMPLEMENTED.getValue();
}

// //////////////////////////////////////////////////////////////////////
// TCP streams
Expand Down Expand Up @@ -1421,16 +1435,109 @@ void proxyOnHttpCallResponse(int arg0, int arg1, int arg2, int arg3, int arg4) {
// gRPC calls
// //////////////////////////////////////////////////////////////////////

// TODO: implement
// https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_call
// TODO: implement
// https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_stream
// TODO: implement
// https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_send
// TODO: implement
// https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_cancel
// TODO: implement
// https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_close
/**
* implements https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_call
*/
@WasmExport
int proxyGrpcCall(
int upstreamNameData,
int upstreamNameSize,
int serviceNameData,
int serviceNameSize,
int methodNameData,
int methodNameSize,
int serialized_initial_metadataData,
int serialized_initial_metadataSize,
int messageData,
int messageSize,
int timeout,
int returnCalloutID) {

try {
var upstreamName = string(readMemory(upstreamNameData, upstreamNameSize));
var serviceName = string(readMemory(serviceNameData, serviceNameSize));
var methodName = string(readMemory(methodNameData, methodNameSize));
var initialMetadata =
decodeMap(serialized_initial_metadataData, serialized_initial_metadataSize);
var message = readMemory(messageData, messageSize);

int callId =
handler.grpcCall(
upstreamName,
serviceName,
methodName,
initialMetadata,
message,
timeout);
putUint32(returnCalloutID, callId);
return callId;
} catch (WasmException e) {
return e.result().getValue();
}
}

/**
* implements https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_stream
*/
@WasmExport
int proxyGrpcStream(
int upstreamNameData,
int upstreamNameSize,
int serviceNameData,
int serviceNameSize,
int methodNameData,
int methodNameSize,
int serialized_initial_metadataData,
int serialized_initial_metadataSize,
int returnStreamId) {

try {
var upstreamName = string(readMemory(upstreamNameData, upstreamNameSize));
var serviceName = string(readMemory(serviceNameData, serviceNameSize));
var methodName = string(readMemory(methodNameData, methodNameSize));
var initialMetadata =
decodeMap(serialized_initial_metadataData, serialized_initial_metadataSize);

int streamId =
handler.grpcStream(upstreamName, serviceName, methodName, initialMetadata);
putUint32(returnStreamId, streamId);
return streamId;
} catch (WasmException e) {
return e.result().getValue();
}
}

/**
* https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_send
*/
@WasmExport
int proxyGrpcSend(int streamId, int messageData, int messageSize, int endStream) {
try {
byte[] message = readMemory(messageData, messageSize);
WasmResult result = handler.grpcSend(streamId, message, endStream);
return result.getValue();
} catch (WasmException e) {
return e.result().getValue();
}
}

/**
* https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_cancel
*/
@WasmExport
int proxyGrpcCancel(int callOrstreamId) {
WasmResult result = handler.grpcCancel(callOrstreamId);
return result.getValue();
}

/**
* https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_grpc_close
*/
@WasmExport
int proxyGrpcClose(int callOrstreamId) {
WasmResult result = handler.grpcClose(callOrstreamId);
return result.getValue();
}

/**
* implements https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_on_grpc_receive_initial_metadata
Expand Down Expand Up @@ -1720,8 +1827,26 @@ int proxyGetProperty(int keyPtr, int keySize, int returnValueData, int returnVal
}
}

// TODO: implement
// https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_set_property
/**
* https://github.com/proxy-wasm/spec/tree/main/abi-versions/vNEXT#proxy_set_property
*/
@WasmExport
int proxySetProperty(int pathDataPtr, int pathSize, int valueDataPtr, int valueSize) {
try {
// Get key from memory
String path = string(readMemory(pathDataPtr, pathSize));

// Get value from memory
String value = string(readMemory(valueDataPtr, valueSize));

// Set property value using handler
WasmResult result = handler.setProperty(path, value);
return result.getValue();

} catch (WasmException e) {
return e.result().getValue();
}
}

// //////////////////////////////////////////////////////////////////////
// Foreign function interface (FFI)
Expand Down
45 changes: 45 additions & 0 deletions src/main/java/io/roastedroot/proxywasm/ChainedHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -318,4 +318,49 @@ public byte[] dequeueSharedQueue(int queueId) throws WasmException {
public WasmResult enqueueSharedQueue(int queueId, byte[] value) {
return next().enqueueSharedQueue(queueId, value);
}

@Override
public LogLevel getLogLevel() throws WasmException {
return next().getLogLevel();
}

@Override
public WasmResult setProperty(String path, String value) {
return next().setProperty(path, value);
}

@Override
public int grpcCall(
String upstreamName,
String serviceName,
String methodName,
ProxyMap initialMetadata,
byte[] message,
int timeout)
throws WasmException {
return next().grpcCall(
upstreamName, serviceName, methodName, initialMetadata, message, timeout);
}

@Override
public int grpcStream(
String upstreamName, String serviceName, String methodName, ProxyMap initialMetadata)
throws WasmException {
return next().grpcStream(upstreamName, serviceName, methodName, initialMetadata);
}

@Override
public WasmResult grpcSend(int streamId, byte[] message, int endStream) {
return next().grpcSend(streamId, message, endStream);
}

@Override
public WasmResult grpcCancel(int callOrstreamId) {
return next().grpcCancel(callOrstreamId);
}

@Override
public WasmResult grpcClose(int callOrstreamId) {
return next().grpcClose(callOrstreamId);
}
}
33 changes: 33 additions & 0 deletions src/main/java/io/roastedroot/proxywasm/Handler.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ default String getProperty(String key) throws WasmException {
return null;
}

default WasmResult setProperty(String path, String value) {
return WasmResult.UNIMPLEMENTED;
}

/**
* Get the HTTP request body.
*
Expand Down Expand Up @@ -420,6 +424,35 @@ default long getMetric(int metricId) throws WasmException {
throw new WasmException(WasmResult.UNIMPLEMENTED);
}

default int grpcCall(
String upstreamName,
String serviceName,
String methodName,
ProxyMap initialMetadata,
byte[] message,
int timeout)
throws WasmException {
throw new WasmException(WasmResult.UNIMPLEMENTED);
}

default int grpcStream(
String upstreamName, String serviceName, String methodName, ProxyMap initialMetadata)
throws WasmException {
throw new WasmException(WasmResult.UNIMPLEMENTED);
}

default WasmResult grpcSend(int streamId, byte[] message, int endStream) {
return WasmResult.UNIMPLEMENTED;
}

default WasmResult grpcCancel(int callOrstreamId) {
return WasmResult.UNIMPLEMENTED;
}

default WasmResult grpcClose(int callOrstreamId) {
return WasmResult.UNIMPLEMENTED;
}

class SharedData {
public byte[] data;
public int cas;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.roastedroot.proxywasm.examples;

import static org.junit.jupiter.api.Assertions.assertTrue;

import com.dylibso.chicory.wasm.Parser;
import io.roastedroot.proxywasm.ProxyWasm;
import io.roastedroot.proxywasm.StartException;
import java.nio.file.Path;
import org.junit.jupiter.api.Test;

/**
* Test loading https://github.com/proxy-wasm/proxy-wasm-rust-sdk/tree/c8b2335df66a569a6306c58e346dd0cf9dbc0f3a/examples/hello_world
*/
public class RustHelloWorldTest {

@Test
public void pauseUntilEOS() throws StartException {
var handler = new MockHandler();
var module = Parser.parse(Path.of("./src/test/rust-examples/hello_world/main.wasm"));
try (var host = ProxyWasm.builder().withPluginHandler(handler).build(module)) {

handler.assertLogsEqual("Hello, World!");
host.tick();

assertTrue(handler.loggedMessages().get(1).contains("your lucky number is"));
}
}
}
Loading