char/avril

(wip) why'd you have to go and make things so complicaaaaated?

git clone https://git.t4t.associates/char/avril

Charlotte Somport FormData and multipart extension to typescriptc013baf

main
1.5 KiB44 linesraw
1use std::convert::Infallible;
2
3use avril_core::serde_v8::JsBuffer;
4use avril_core::{Extension, Op};
5
6pub fn init() -> Extension {
7    Extension {
8        name: "ext:form_data",
9        dependencies: &["ext:blob", "ext:encoding", "ext:web"],
10        ops: vec![
11            Op::new("op_form_data_boundary", |(): ()| {
12                let mut bytes = [0; 16];
13                getrandom::fill(&mut bytes)?;
14                let mut boundary = String::from("----avril");
15                for byte in bytes {
16                    use std::fmt::Write;
17                    write!(boundary, "{byte:02x}").unwrap();
18                }
19                Ok::<_, getrandom::Error>(boundary)
20            }),
21            Op::new("op_form_data_urlencoded", |bytes: JsBuffer| {
22                let pairs = url::form_urlencoded::parse(&bytes)
23                    .map(|(name, value)| (name.into_owned(), value.into_owned()))
24                    .collect::<Vec<_>>();
25                Ok::<_, Infallible>(pairs)
26            }),
27        ],
28        modules: &[
29            (
30                "ext:form_data/main.js",
31                include_str!(concat!(env!("OUT_DIR"), "/main.js")),
32            ),
33            (
34                "ext:form_data/form_data.js",
35                include_str!(concat!(env!("OUT_DIR"), "/form_data.js")),
36            ),
37            (
38                "ext:form_data/multipart.js",
39                include_str!(concat!(env!("OUT_DIR"), "/multipart.js")),
40            ),
41        ],
42        entry_point: Some("ext:form_data/main.js"),
43    }
44}