wasm_run icon indicating copy to clipboard operation
wasm_run copied to clipboard

Dart bindings for web issue with WasiConfig

Open renzullomichele opened this issue 9 months ago • 3 comments

I think there is something strange with Dart bindings for web: When I try to setup WasiConfig, the first execution in flutter run -d chrome return an error:
TypeError: Cannot read properties of undefined (reading 'WASI'). or if I enable captureStdErr TypeError: Cannot read properties of undefined (reading 'Fd'). simply doing "r" seems that the "refresh" initialise what failed the first time. Everything seems to work after but is very strange, because of this issue I gave up with WasiConfig and I decided to "write" by myself wasix import basic like fd_write, fd_seek, clock_time_get, proc_exit so that the config can be null... Any solution? If would be possible to expand the test with loading a valid WasiConfig would be also helpful, because I think my config is set up correctly otherwise the code wouldn't work ever.

Here seems the problem from the debugger, I'm investigating:

  WasmInstanceBuilder builder({
    WasiConfig? wasiConfig,
    WorkersConfig? workersConfig,
  }) {
    _WASI? wasi;
    if (wasiConfig != null) {
      final stdout = wasiConfig.captureStdout ? WasiStdio() : null;
      final stderr = wasiConfig.captureStderr ? WasiStdio() : null;

      final wasiWeb = WASI(
        wasiConfig.args,
        wasiConfig.env
            .map((e) => '${e.name}=${e.value}')
            .toList(growable: false),
        [
          OpenFile(WasiWebFile(Uint8List(0))), // TODO: stdin
          stdout?.fd ?? OpenFile(WasiWebFile(Uint8List(0))),
          stderr?.fd ?? OpenFile(WasiWebFile(Uint8List(0))),
          ...wasiConfig.webBrowserFileSystem.entries.map(
            (e) => PreopenDirectory(
              e.key,
              js_util.jsify(_mapWasiFiles(e.value.items)) as Object,
            ),
          ),
        ],
      );
      wasi = _WASI(wasiWeb, stdout, stderr);
    }

    return _Builder(this, wasi, workersConfig);
  }

renzullomichele avatar May 02 '24 15:05 renzullomichele

Solved adding in web/index.html

<head>
<script src="/assets/packages/wasm_run/lib/assets/wasm-feature-detect.js" defer></script>
<script type="module" src="/assets/packages/wasm_run/lib/assets/browser_wasi_shim.js" defer></script>
</head>

The Readme was saying that is not necessary in flutter web, I was assuming this process was done under the hood, but apparently is not because Fd is requested as import in my binary when using WASI call that have an fd, like fd_seek ecc... I think that just updating the Readme will be sufficient

renzullomichele avatar May 05 '24 16:05 renzullomichele

Created pull request #55

michelerenzullo avatar May 05 '24 17:05 michelerenzullo

This Issue can be closed or should be mutated as "fix flutter scripts injector"

michelerenzullo avatar May 16 '24 15:05 michelerenzullo