cdp_html_shot/
general_utils.rs

1use std::sync::Arc;
2use anyhow::{anyhow, Result};
3use serde_json::{json, Value};
4use std::sync::atomic::{AtomicUsize, Ordering};
5
6use crate::transport::Transport;
7use crate::transport_actor::{TargetMessage, TransportResponse};
8
9pub(crate) static GLOBAL_ID_COUNTER: AtomicUsize = AtomicUsize::new(0);
10
11pub(crate) fn next_id() -> usize {
12    GLOBAL_ID_COUNTER.fetch_add(1, Ordering::SeqCst) + 1
13}
14
15pub(crate) fn serde_msg(msg: &TargetMessage) -> Value {
16    let message: Value = serde_json::from_str(msg.params["message"].as_str().unwrap().trim_matches('"')).unwrap();
17    message
18}
19
20pub(crate) async fn send_and_get_msg(
21    transport: Arc<Transport>,
22    msg_id: usize,
23    session_id: &str,
24    msg: String,
25) -> Result<TargetMessage> {
26    let (_, target_msg) = futures::try_join!(
27        transport.send(json!({
28            "id": next_id(),
29            "method": "Target.sendMessageToTarget",
30            "params": {
31                "sessionId": session_id,
32                "message": msg
33            }
34        })),
35        transport.get_target_msg(msg_id),
36    )?;
37
38    match target_msg {
39        TransportResponse::Target(res) => Ok(res),
40        other => Err(anyhow!("Unexpected transport response: {:?}", other)),
41    }
42}