1pub mod polyfill;
7pub mod preprocessor;
8
9#[cfg(feature = "qjs")]
10pub mod quickjs;
11
12#[cfg(feature = "boa")]
13pub mod boa;
14
15#[cfg(feature = "external")]
16pub mod deno;
17
18#[cfg(feature = "external")]
19pub mod node;
20
21#[cfg(feature = "external")]
22pub mod bun;
23
24use crate::{JsChallengeType, provider::JsChallengeError};
25use std::collections::HashMap;
26
27pub enum JsRuntimeProvider {
29 #[cfg(feature = "qjs")]
30 QuickJS(quickjs::QuickJSJCP),
31 #[cfg(feature = "boa")]
32 Boa(Box<boa::BoaJCP>),
33 #[cfg(feature = "external")]
34 Deno(deno::DenoJCP),
35 #[cfg(feature = "external")]
36 Node(node::NodeJCP),
37 #[cfg(feature = "external")]
38 Bun(bun::BunJCP),
39}
40
41impl JsRuntimeProvider {
42 pub fn solve_n(&mut self, challenge: &str) -> Result<String, JsChallengeError> {
43 match self {
44 #[cfg(feature = "qjs")]
45 Self::QuickJS(p) => p.solve_n(challenge),
46 #[cfg(feature = "boa")]
47 Self::Boa(p) => p.solve_n(challenge),
48 #[cfg(feature = "external")]
49 Self::Deno(p) => p.solve("n", challenge),
50 #[cfg(feature = "external")]
51 Self::Node(p) => p.solve("n", challenge),
52 #[cfg(feature = "external")]
53 Self::Bun(p) => p.solve("n", challenge),
54 }
55 }
56
57 pub fn solve_sig(&mut self, challenge: &str) -> Result<String, JsChallengeError> {
58 match self {
59 #[cfg(feature = "qjs")]
60 Self::QuickJS(p) => p.solve_sig(challenge),
61 #[cfg(feature = "boa")]
62 Self::Boa(p) => p.solve_sig(challenge),
63 #[cfg(feature = "external")]
64 Self::Deno(p) => p.solve("sig", challenge),
65 #[cfg(feature = "external")]
66 Self::Node(p) => p.solve("sig", challenge),
67 #[cfg(feature = "external")]
68 Self::Bun(p) => p.solve("sig", challenge),
69 }
70 }
71
72 pub fn solve_challenges(
73 &mut self,
74 req_type: &JsChallengeType,
75 challenges: &[String],
76 ) -> Result<HashMap<String, String>, JsChallengeError> {
77 let mut results = HashMap::with_capacity(challenges.len());
78 for challenge in challenges {
79 let result = match req_type {
80 JsChallengeType::N => self.solve_n(challenge)?,
81 JsChallengeType::Sig => self.solve_sig(challenge)?,
82 };
83 results.insert(challenge.clone(), result);
84 }
85 Ok(results)
86 }
87}