Skip to content
Draft
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
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

target/
wasm/rust_guest.wasm

wasm/confidence_resolver.wasm

57 changes: 54 additions & 3 deletions wasm/java-host/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,18 @@
<protobuf.plugin.version>0.6.1</protobuf.plugin.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.dylibso.chicory</groupId>
<artifactId>bom</artifactId>
<version>1.5.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<!-- Protobuf dependencies -->
<dependency>
Expand All @@ -26,12 +38,10 @@
<dependency>
<groupId>com.dylibso.chicory</groupId>
<artifactId>runtime</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>com.dylibso.chicory</groupId>
<artifactId>compiler</artifactId>
<version>1.4.0</version>
<artifactId>annotations</artifactId>
</dependency>
</dependencies>

Expand Down Expand Up @@ -77,6 +87,47 @@
<artifactId>versions-maven-plugin</artifactId>
<version>2.16.2</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>templating-maven-plugin</artifactId>
<executions>
<execution>
<id>filtering-java-templates</id>
<goals>
<goal>filter-sources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPathsUseDepMgmt>true</annotationProcessorPathsUseDepMgmt>
<annotationProcessorPaths>
<path>
<groupId>com.dylibso.chicory</groupId>
<artifactId>annotations-processor</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>com.dylibso.chicory</groupId>
<artifactId>chicory-compiler-maven-plugin</artifactId>
<executions>
<execution>
<id>confidence-resolver</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<name>com.spotify.confidence.wasmresolvepoc.ConfidenceResolver</name>
<wasmFile>${project.basedir}/../confidence_resolver.wasm</wasmFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.spotify.confidence.wasmresolvepoc;

public final class WasmResource {
public static final String absoluteFile = "file://${project.basedir}/../confidence_resolver.wasm";

private WasmResource() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ public class Main {
private final ResolverApi resolverApi;

public Main() {
Path wasmModulePath = Path.of("../confidence_resolver.wasm");
WasmModule module = Parser.parse(wasmModulePath);
resolverApi = new ResolverApi(module);
resolverApi = new ResolverApi();

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.spotify.confidence.wasmresolvepoc;

import com.dylibso.chicory.compiler.MachineFactoryCompiler;
import com.dylibso.chicory.annotations.WasmModuleInterface;
import com.dylibso.chicory.runtime.ExportFunction;
import com.dylibso.chicory.runtime.ImportFunction;
import com.dylibso.chicory.runtime.ImportValues;
Expand All @@ -25,45 +25,19 @@
import java.util.List;
import java.util.function.Function;

public class ResolverApi {
@WasmModuleInterface(WasmResource.absoluteFile)
public class ResolverApi implements ResolverApi_ModuleImports, ResolverApi_WasmMsg {

private static final FunctionType HOST_FN_TYPE = FunctionType.of(List.of(ValType.I32), List.of(ValType.I32));
private final Instance instance;
private final ResolverApi_ModuleExports exports;

// interop
private final ExportFunction wasmMsgAlloc;
private final ExportFunction wasmMsgFree;

// api
private final ExportFunction wasmMsgGuestSetResolverState;
private final ExportFunction wasmMsgGuestResolve;
private final ExportFunction wasmMsgGuestResolveSimple;

public ResolverApi(WasmModule module) {

instance = Instance.builder(module)
.withImportValues(ImportValues.builder()
.addFunction(createImportFunction("current_time", Messages.Void::parseFrom, this::currentTime))
.addFunction(createImportFunction("log_resolve", Types.LogResolveRequest::parseFrom, this::logResolve))
.addFunction(createImportFunction("log_assign", Types.LogAssignRequest::parseFrom, this::logAssign))
.addFunction(new ImportFunction("wasm_msg", "wasm_msg_current_thread_id", FunctionType.of(List.of(), List.of(ValType.I32)), (instance1, args) -> new long[]{0}))
.build())
.withMachineFactory(MachineFactoryCompiler::compile)
public ResolverApi() {
instance = Instance.builder(ConfidenceResolver.load())
.withImportValues(this.toImportValues())
.withMachineFactory(ConfidenceResolver::create)
.build();
wasmMsgAlloc = instance.export("wasm_msg_alloc");
wasmMsgFree = instance.export("wasm_msg_free");
wasmMsgGuestSetResolverState = instance.export("wasm_msg_guest_set_resolver_state");
wasmMsgGuestResolve = instance.export("wasm_msg_guest_resolve");
wasmMsgGuestResolveSimple = instance.export("wasm_msg_guest_resolve_simple");
}

private GeneratedMessage logAssign(Types.LogAssignRequest logAssignRequest) {
System.out.println("logAssign");
return Messages.Void.getDefaultInstance();
}

private GeneratedMessage logResolve(Types.LogResolveRequest logResolveRequest) {
return Messages.Void.getDefaultInstance();
exports = new ResolverApi_ModuleExports(instance);
}

private Timestamp currentTime(Messages.Void unused) {
Expand All @@ -75,19 +49,19 @@ public void setResolverState(SetResolverStateRequest state) {
.setData(state.toByteString())
.build().toByteArray();
int addr = transfer(request);
int respPtr = (int) wasmMsgGuestSetResolverState.apply(addr)[0];
int respPtr = exports.wasmMsgGuestSetResolverState(addr);
consumeResponse(respPtr, Messages.Void::parseFrom);
}

public ResolveFlagsResponse resolve(ResolveFlagsRequest request) {
int reqPtr = transferRequest(request);
int respPtr = (int) wasmMsgGuestResolve.apply(reqPtr)[0];
int respPtr = exports.wasmMsgGuestResolve(reqPtr);
return consumeResponse(respPtr, ResolveFlagsResponse::parseFrom);
}

public ResolvedFlag resolve_simple(ResolveSimpleRequest request) {
int reqPtr = transferRequest(request);
int respPtr = (int) wasmMsgGuestResolveSimple.apply(reqPtr)[0];
int respPtr = exports.wasmMsgGuestResolveSimple(reqPtr);
return consumeResponse(respPtr, ResolvedFlag::parseFrom);
}

Expand Down Expand Up @@ -138,27 +112,29 @@ private byte[] consume(int addr) {
final Memory mem = instance.memory();
final int len = (int) (mem.readU32(addr - 4) - 4L);
final byte[] data = mem.readBytes(addr, len);
wasmMsgFree.apply(addr);
exports.wasmMsgFree(addr);
return data;
}

private int transfer(byte[] data) {
final Memory mem = instance.memory();
int addr = (int) wasmMsgAlloc.apply(data.length)[0];
int addr = exports.wasmMsgAlloc(data.length);
mem.write(addr, data);
return addr;
}

private <T extends GeneratedMessage> ImportFunction createImportFunction(String name, ParserFn<T> reqCodec, Function<T, GeneratedMessage> impl) {
return new ImportFunction("wasm_msg", "wasm_msg_host_" + name, HOST_FN_TYPE, (instance1, args) -> {
try {
final T message = consumeRequest((int) args[0], reqCodec);
final GeneratedMessage response = impl.apply(message);
return new long[]{transferResponseSuccess(response)};
} catch (Exception e) {
return new long[]{transferResponseError(e.getMessage())};
}
});
@Override
public ResolverApi_WasmMsg wasmMsg() {
return this;
}

@Override
public int wasmMsgHostCurrentTime(int arg0) {
try {
return transferResponseSuccess(currentTime(Messages.Void.getDefaultInstance()));
} catch (Exception e) {
return transferResponseError(e.getMessage());
}
}

private interface ParserFn<T> {
Expand Down