From 91093ff64b2f52e76b331941e30bc97262d71045 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Tue, 11 Nov 2025 00:24:20 +0100 Subject: [PATCH 1/2] fetch body --- additional/env.js | 28 ++++++++++++++++--- interfaces/Crafter.CppDOM-BindingsExport.cppm | 6 ++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/additional/env.js b/additional/env.js index e1d5b2e..62f5e57 100644 --- a/additional/env.js +++ b/additional/env.js @@ -685,13 +685,33 @@ let env = { const response = await fetch(urlStr); const result = await response.text(); - console.log(result); - const ptr = writeStringToWasm(result); - console.log(ptr); const { ExecuteFetchHandler} = window.crafter_webbuild_wasi.instance.exports; - console.log("callback"); + ExecuteFetchHandler(handlerID, ptr); + WasmFree(ptr); + + } catch (error) { + return 0; + } + }, + fetchWithBody: async function(url, urlLenght, body, bodyLength, handlerID) { + try { + const urlStr = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, url, urlLenght)); + const bodyStr = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, body, bodyLength)); + + const response = await fetch(urlStr, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: bodyStr + }); + const result = await response.text(); + + const ptr = writeStringToWasm(result); + + const { ExecuteFetchHandler} = window.crafter_webbuild_wasi.instance.exports; ExecuteFetchHandler(handlerID, ptr); WasmFree(ptr); diff --git a/interfaces/Crafter.CppDOM-BindingsExport.cppm b/interfaces/Crafter.CppDOM-BindingsExport.cppm index d287705..15b59c5 100644 --- a/interfaces/Crafter.CppDOM-BindingsExport.cppm +++ b/interfaces/Crafter.CppDOM-BindingsExport.cppm @@ -217,9 +217,15 @@ extern "C" { export namespace Crafter::CppDOMBindings { __attribute__((import_module("env"), import_name("fetch"))) void Fetch(const char* url, std::int32_t urlLenght, std::int32_t handlerID); + __attribute__((import_module("env"), import_name("fetchWithBody"))) void FetchWithBody(const char* url, std::int32_t urlLenght, const char* body, std::int32_t bodyLength, std::int32_t handlerID); void Fetch(const std::string_view url, std::function callback) { std::int32_t id = fetchHandlerMaxId++; CppDOMBindings::fetchHandlers->insert({id, callback}); Fetch(url.data(), url.size(), id); } + void Fetch(const std::string_view url, const std::string_view body, std::function callback) { + std::int32_t id = fetchHandlerMaxId++; + CppDOMBindings::fetchHandlers->insert({id, callback}); + FetchWithBody(url.data(), url.size(), body.data(), body.size(), id); + } } \ No newline at end of file From 6b15c9e20c97814191426902448866182ae54c18 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Tue, 11 Nov 2025 00:25:24 +0100 Subject: [PATCH 2/2] fetch readme --- examples/FetchExample/README.md | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 examples/FetchExample/README.md diff --git a/examples/FetchExample/README.md b/examples/FetchExample/README.md new file mode 100644 index 0000000..debb776 --- /dev/null +++ b/examples/FetchExample/README.md @@ -0,0 +1,42 @@ +# FetchExample + +This sample demonstrates how to use the Fetch API in Crafter.CppDOM to make HTTP requests. + +## Features + +- Shows how to perform HTTP GET requests +- Demonstrates asynchronous response handling +- Illustrates how to update the DOM with fetched data + +## Usage + +```cpp +import Crafter.CppDOM; +import std; +using namespace Crafter::CppDOMBindings; + +int main(){ + void* body = GetElementById("body"); + SetInnerHTML(body, "

Fetch Example

Testing HTTP requests...

"); + + Fetch("https://httpbin.org/get", [body](std::string result){ + if (!result.empty()) { + SetInnerHTML(body, "

Fetch Example

Response: " + result + "

"); + } else { + SetInnerHTML(body, "

Fetch Example

Failed to fetch data

"); + } + FreeJs(body); + }); +} +``` + +## Building and Running + +```bash +crafter-build build executable +run.sh +``` + +Then navigate to `http://localhost:8080/` in your browser. + +If caddy is not installed, you can use your favorite static file server instead. \ No newline at end of file