1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
6#[serde(tag = "kind", content = "address", rename_all = "snake_case")]
7pub enum BrowserProxy {
8 Https(String),
10 Socks5(String),
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
16#[serde(default, deny_unknown_fields)]
17pub struct BrowsrClientConfig {
18 #[serde(skip_serializing_if = "Option::is_none")]
20 pub window_size: Option<(u32, u32)>,
21 #[serde(skip_serializing_if = "Option::is_none")]
23 pub headless: Option<bool>,
24 pub enable_stealth_mode: bool,
26 pub enable_real_emulation: bool,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub proxy: Option<BrowserProxy>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub analysis_model_settings: Option<serde_json::Value>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub user_agent: Option<String>,
37 #[serde(default)]
39 pub use_random_user_agent: bool,
40 #[serde(default = "default_true")]
42 pub disable_automation_detection: bool,
43}
44
45fn default_true() -> bool {
46 true
47}
48
49impl Default for BrowsrClientConfig {
50 fn default() -> Self {
51 Self {
52 window_size: None,
53 headless: Some(true),
54 enable_stealth_mode: true,
55 enable_real_emulation: true,
56 proxy: None,
57 analysis_model_settings: None,
58 user_agent: None,
59 use_random_user_agent: false,
60 disable_automation_detection: true,
61 }
62 }
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
67#[serde(deny_unknown_fields)]
68pub struct BrowserCookie {
69 pub name: String,
70 pub value: String,
71 #[serde(default, skip_serializing_if = "Option::is_none")]
72 pub domain: Option<String>,
73 #[serde(default, skip_serializing_if = "Option::is_none")]
74 pub path: Option<String>,
75 #[serde(default, skip_serializing_if = "Option::is_none")]
76 pub expires: Option<f64>,
77 #[serde(default)]
78 pub http_only: bool,
79 #[serde(default)]
80 pub secure: bool,
81 #[serde(default, skip_serializing_if = "Option::is_none")]
82 pub same_site: Option<String>,
83 #[serde(default, skip_serializing_if = "Option::is_none")]
84 pub priority: Option<String>,
85 #[serde(default, skip_serializing_if = "Option::is_none")]
86 pub source_scheme: Option<String>,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
91pub struct BrowserSessionState {
92 pub cookies: Vec<BrowserCookie>,
93 #[serde(default, skip_serializing_if = "Option::is_none")]
94 pub last_url: Option<String>,
95 #[schemars(with = "String")]
96 pub captured_at: chrono::DateTime<chrono::Utc>,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
101pub struct BrowserSessionRecord {
102 pub user_id: String,
103 pub state: BrowserSessionState,
104 #[schemars(with = "String")]
105 pub updated_at: chrono::DateTime<chrono::Utc>,
106}