4 votes

Comment utiliser la syntaxe async/await de Rust dans WASI ?

Je voudrais compiler le code suivant avec cargo-wasi .

// reqwest = { version = "0.11", features = ["json"] }
// tokio = { version = "1", features = ["full"] }

use std::collections::HashMap;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let resp = reqwest::get("https://httpbin.org/ip")
        .await?
        .json::<HashMap<String, String>>()
        .await?;
    println!("{:#?}", resp);
    Ok(())
}

Après avoir essayé de le compiler, j'ai obtenu l'erreur suivante car le mio ne supporte pas actuellement le WASI

$ cargo wasi run
   Compiling mio v0.7.9
   Compiling parking_lot v0.11.1
   Compiling serde_json v1.0.64
   Compiling idna v0.2.2
error[E0432]: unresolved import `crate::sys::IoSourceState`
  --> /home/ducaale/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.7.9/src/io_source.rs:12:5
   |
12 | use crate::sys::IoSourceState;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^ no `IoSourceState` in `sys`
... errors omitted

J'ai fait quelques recherches et aucun des exemples que j'ai trouvé jusqu'ici utilisaient async/await. Y a-t-il quelque chose que je puisse remplacer tokio avec pour que mon code compile dans WASI ?

3voto

transistor Points 1021

J'ai essayé de l'exécuter et il semble que la crate reqwests ne se construit pas correctement avec cargo wasi ou wasm-pack car elle est incapable de compiler mio (qui est utilisé par tokio lors de la compilation native). Il y a une mention sur github que reqwests peut être utilisé avec wasm, mais il n'est pas encore entièrement pris en charge, et je n'ai pas pu trouver beaucoup sur la façon de le faire fonctionner. Il semble qu'il n'y ait pas encore beaucoup de solution pour les demandes HTTP sur WASI pour le moment, mais web-sys peut être utilisé pour faire des demandes à travers Node.js ou un navigateur.

Il semble que tokio nécessite des drapeaux de caractéristiques spécifiques afin d'être utilisé avec l'assemblage web. Ce problème mentionne les drapeaux sync et rt en bas de page : https://github.com/tokio-rs/tokio/issues/1597 mais pour utiliser également #[tokio:main], vous aurez besoin des options "rt-multi-thread" et "macros".

Il pourrait également être possible d'utiliser wasm bindgen pour convertir le futur en une promesse, mais cela pourrait ne pas fonctionner avec WASI : https://rustwasm.github.io/wasm-bindgen/api/wasm_bindgen_futures/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X