ytdlp_ejs/builtin/
mod.rs

1//! Built-in JS Challenge Providers
2//!
3//! This module contains the built-in implementations using enum dispatch
4//! for better performance and simpler code.
5
6pub 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
27/// Enum-based provider for static dispatch (no trait objects)
28pub 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}