use std::convert::Infallible; use avril_core::serde_v8::JsBuffer; use avril_core::{Extension, Op}; pub fn init() -> Extension { Extension { name: "ext:form_data", dependencies: &["ext:blob", "ext:encoding", "ext:web"], ops: vec![ Op::new("op_form_data_boundary", |(): ()| { let mut bytes = [0; 16]; getrandom::fill(&mut bytes)?; let mut boundary = String::from("----avril"); for byte in bytes { use std::fmt::Write; write!(boundary, "{byte:02x}").unwrap(); } Ok::<_, getrandom::Error>(boundary) }), Op::new("op_form_data_urlencoded", |bytes: JsBuffer| { let pairs = url::form_urlencoded::parse(&bytes) .map(|(name, value)| (name.into_owned(), value.into_owned())) .collect::>(); Ok::<_, Infallible>(pairs) }), ], modules: &[ ( "ext:form_data/main.js", include_str!(concat!(env!("OUT_DIR"), "/main.js")), ), ( "ext:form_data/form_data.js", include_str!(concat!(env!("OUT_DIR"), "/form_data.js")), ), ( "ext:form_data/multipart.js", include_str!(concat!(env!("OUT_DIR"), "/multipart.js")), ), ], entry_point: Some("ext:form_data/main.js"), } }