diff --git a/.gitignore b/.gitignore index 1c75a50..26a4e85 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ target/ wasm/rust_guest.wasm - +wasm/confidence_resolver.wasm diff --git a/wasm/java-host/pom.xml b/wasm/java-host/pom.xml index 71b00c0..4df56f9 100644 --- a/wasm/java-host/pom.xml +++ b/wasm/java-host/pom.xml @@ -16,6 +16,18 @@ 0.6.1 + + + + com.dylibso.chicory + bom + 1.5.2 + pom + import + + + + @@ -26,12 +38,10 @@ com.dylibso.chicory runtime - 1.4.0 com.dylibso.chicory - compiler - 1.4.0 + annotations @@ -77,6 +87,47 @@ versions-maven-plugin 2.16.2 + + org.codehaus.mojo + templating-maven-plugin + + + filtering-java-templates + + filter-sources + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + true + + + com.dylibso.chicory + annotations-processor + + + + + + com.dylibso.chicory + chicory-compiler-maven-plugin + + + confidence-resolver + + compile + + + com.spotify.confidence.wasmresolvepoc.ConfidenceResolver + ${project.basedir}/../confidence_resolver.wasm + + + + diff --git a/wasm/java-host/src/main/java-templates/com/spotify/confidence/wasmresolvepoc/WasmResource.java b/wasm/java-host/src/main/java-templates/com/spotify/confidence/wasmresolvepoc/WasmResource.java new file mode 100644 index 0000000..5fb3a86 --- /dev/null +++ b/wasm/java-host/src/main/java-templates/com/spotify/confidence/wasmresolvepoc/WasmResource.java @@ -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() {} +} diff --git a/wasm/java-host/src/main/java/com/spotify/confidence/wasmresolvepoc/Main.java b/wasm/java-host/src/main/java/com/spotify/confidence/wasmresolvepoc/Main.java index defc35e..aa33bed 100644 --- a/wasm/java-host/src/main/java/com/spotify/confidence/wasmresolvepoc/Main.java +++ b/wasm/java-host/src/main/java/com/spotify/confidence/wasmresolvepoc/Main.java @@ -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(); } diff --git a/wasm/java-host/src/main/java/com/spotify/confidence/wasmresolvepoc/ResolverApi.java b/wasm/java-host/src/main/java/com/spotify/confidence/wasmresolvepoc/ResolverApi.java index c67a359..2c9b436 100644 --- a/wasm/java-host/src/main/java/com/spotify/confidence/wasmresolvepoc/ResolverApi.java +++ b/wasm/java-host/src/main/java/com/spotify/confidence/wasmresolvepoc/ResolverApi.java @@ -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; @@ -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) { @@ -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); } @@ -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 ImportFunction createImportFunction(String name, ParserFn reqCodec, Function 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 {