demo · v137

Wasm fetch()

The second JSPI shape: Wasm-as-Promise-producer. A C/C++/Rust port calls fetch() through a synchronous-looking host import; the JS caller waits on the Promise that the wrapped export returns. This is the pattern that lets unmodified libcurl-style code work on the web.

Heads up · origin trialRequires Chrome 137+ with JSPI shipped, or the flag chrome://flags/#enable-experimental-webassembly-jspi. The probe below reports your exact state.
probing…

JS side log (Promise consumer)

no run yet

"wasm" side log (suspendable producer)

no run yet
status
—
bytes
—
total wall time
—

the code

// Hypothetical C ported via Emscripten:
//
//   int fetch_get(const char* url, char* out, int max);
//   //  declared as if it blocks. Under the hood it calls
//   //  js_fetch() which returns a Promise.
//
// On the JS side, that host import resolves with the body.
const imports = {
  env: {
    js_fetch: async (urlPtr, urlLen) => {
      const url = readString(memory, urlPtr, urlLen);
      const r = await fetch(url);
      return r.text();   // imports can return Promises with JSPI
    },
  },
};

// Wrap the export. The Promise yields when the import suspends.
const fetchGet = WebAssembly.promising(instance.exports.fetch_get);
const body = await fetchGet(urlPtr, urlLen);  // wasm "blocks" on fetch

see also