Skip to main content

anakin/
sessions.rs

1use serde_json::{json, Value};
2
3use crate::client::Client;
4use crate::error::{Error, Result};
5use crate::types::BrowserSession;
6
7/// Browser-session management. Saved sessions can be replayed via the
8/// /v1/browser-connect CDP endpoint to skip re-login flows.
9pub struct Sessions<'a> {
10    client: &'a Client,
11}
12
13impl<'a> Sessions<'a> {
14    pub(crate) fn new(client: &'a Client) -> Self {
15        Self { client }
16    }
17
18    /// List all saved sessions for the API key.
19    pub async fn list(&self) -> Result<Vec<BrowserSession>> {
20        let v: Value = self.client.send_json(reqwest::Method::GET, "/browser-sessions", None).await?;
21        let arr = v.get("sessions").cloned().unwrap_or(v);
22        serde_json::from_value(arr).map_err(|e| Error::Other(format!("decode response: {e}")))
23    }
24
25    /// Create an empty named session.
26    pub async fn create(&self, name: &str, description: Option<&str>) -> Result<BrowserSession> {
27        let mut body = json!({ "name": name });
28        if let Some(d) = description {
29            body["description"] = Value::String(d.to_string());
30        }
31        let v: Value = self.client.send_json(reqwest::Method::POST, "/browser-sessions", Some(body)).await?;
32        serde_json::from_value(v).map_err(|e| Error::Other(format!("decode response: {e}")))
33    }
34
35    /// Save the current state of a CDP session by ID.
36    pub async fn save(&self, session_id: &str, name: Option<&str>, description: Option<&str>) -> Result<BrowserSession> {
37        let mut body = serde_json::Map::new();
38        if let Some(n) = name { body.insert("name".into(), Value::String(n.to_string())); }
39        if let Some(d) = description { body.insert("description".into(), Value::String(d.to_string())); }
40        let path = format!("/browser-sessions/{session_id}/save");
41        let v: Value = self.client.send_json(reqwest::Method::POST, &path, Some(Value::Object(body))).await?;
42        serde_json::from_value(v).map_err(|e| Error::Other(format!("decode response: {e}")))
43    }
44
45    /// Update a saved session's metadata.
46    pub async fn update(&self, session_id: &str, name: Option<&str>, description: Option<&str>) -> Result<BrowserSession> {
47        let mut body = serde_json::Map::new();
48        if let Some(n) = name { body.insert("name".into(), Value::String(n.to_string())); }
49        if let Some(d) = description { body.insert("description".into(), Value::String(d.to_string())); }
50        let path = format!("/browser-sessions/{session_id}");
51        let v: Value = self.client.send_json(reqwest::Method::PUT, &path, Some(Value::Object(body))).await?;
52        serde_json::from_value(v).map_err(|e| Error::Other(format!("decode response: {e}")))
53    }
54
55    /// Delete a saved session.
56    pub async fn delete(&self, session_id: &str) -> Result<()> {
57        let path = format!("/browser-sessions/{session_id}");
58        let _: Value = self.client.send_json(reqwest::Method::DELETE, &path, None).await?;
59        Ok(())
60    }
61}