loadModule method

Future<WasmModule> loadModule({
  1. Future<Uint8List> getUriBodyBytes(
    1. Uri uri
    ) = getUriBodyBytes,
  2. ModuleConfig? config,
})

Loads the wasm file.

May throw WasmFileUrisException

Implementation

Future<WasmModule> loadModule({
  Future<Uint8List> Function(Uri uri) getUriBodyBytes = getUriBodyBytes,
  ModuleConfig? config,
}) async {
  final features = await wasmRuntimeFeatures();
  final uri = uriForFeatures(features);
  final isHttp = uri.isScheme('http') || uri.isScheme('https');
  final isAsset = uri.isScheme('asset');
  const isWeb = identical(0, 0.0);

  final List<ErrorWithTrace> exceptions = [];
  WasmModule? wasmModule;

  if (isAsset && globalLoadAsset != null) {
    try {
      final assetData = await globalLoadAsset!(uri.path);
      final wasmFile = Uint8List.sublistView(assetData);
      if (wasmFile.isEmpty) {
        throw Exception('Asset "$uri" is empty.');
      }
      wasmModule = await compileWasmModule(wasmFile, config: config);
    } catch (e, s) {
      exceptions.add(ErrorWithTrace(e, s));
    }
  } else if (isHttp || isWeb) {
    try {
      final wasmFile = await getUriBodyBytes(uri);
      if (wasmFile.isEmpty) {
        throw Exception('Url "$uri" returned an empty body.');
      }
      wasmModule = await compileWasmModule(wasmFile, config: config);
    } catch (e, s) {
      exceptions.add(ErrorWithTrace(e, s));
    }
  } else {
    try {
      final wasmFile = await File.fromUri(uri).readAsBytes();
      if (wasmFile.isEmpty) {
        throw Exception('File "$uri" is empty.');
      }
      wasmModule = await compileWasmModule(wasmFile, config: config);
    } catch (e, s) {
      exceptions.add(ErrorWithTrace(e, s));
    }
  }
  if (wasmModule == null && fallback != null) {
    try {
      wasmModule = await fallback!.loadModule(
        config: config,
        getUriBodyBytes: getUriBodyBytes,
      );
    } catch (e, s) {
      exceptions.add(ErrorWithTrace(e, s));
    }
  }
  if (wasmModule == null) {
    throw WasmFileUrisException(this, exceptions);
  }
  return wasmModule;
}