feat: extend wasm backend entrypoints

This commit is contained in:
root
2026-06-13 21:50:19 +00:00
parent fe83c52411
commit d6421cb8f3
14 changed files with 315 additions and 83 deletions
+23 -5
View File
@@ -540,6 +540,9 @@ enum WasmResolveKind {
WASM_RESOLVE_RENDER = 1,
WASM_RESOLVE_EXISTS = 2,
WASM_RESOLVE_ONCE = 3,
WASM_RESOLVE_CLI = 4,
WASM_RESOLVE_WEBSOCKET = 5,
WASM_RESOLVE_SERVE_HTTP = 6,
};
static s32 wasm_resolve_target(String target, s32 kind, String* resolved_out = 0)
@@ -652,13 +655,26 @@ void unit_render(String file_name) { unit_render(file_name, *context); }
extern "C" {
// Host calls this to render the request's entry unit. Routing through
// unit_render gives the entry the same ONCE() + dispatch semantics as
// components (the host pre-loaded it, so resolution is a cache hit).
void uce_wasm_render_entry(const char* path, size_t len)
// Host calls this to invoke the request's entry unit through one of its
// directive handlers (render/cli/websocket/serve_http). Routing through the
// resolver gives the entry the same ONCE() + dispatch semantics as components
// (the host pre-loaded it, so resolution is a cache hit). The host pre-checks
// that the handler export exists, so a missing slot here is a silent no-op.
void uce_wasm_invoke_entry(const char* path, size_t len, int32_t kind)
{
// the host always runs uce_wasm_core_init + apply_context before this
unit_render(String(path, len), *context);
String file_name(path, len);
String resolved;
s32 slot = wasm_resolve_target(trim(file_name), kind, &resolved);
if(!slot)
return;
wasm_run_once(resolved, *context);
String previous_unit = context->resources.current_unit_file;
if(resolved != "")
context->resources.current_unit_file = resolved;
request_ref_handler handler = (request_ref_handler)(uintptr_t)slot;
handler(*context);
context->resources.current_unit_file = previous_unit;
}
void* uce_alloc(size_t len)
@@ -745,6 +761,8 @@ int uce_wasm_apply_context(const char* buf, size_t len)
DValue* entry = decoded.key("entry_unit");
if(entry)
wasm_request.resources.current_unit_file = entry->to_string();
DValue* raw_in = decoded.key("in");
wasm_request.in = raw_in ? raw_in->to_string() : "";
return(0);
}