Coverage Report

Created: 2022-07-04 16:17

src/client/mod.rs
Line
Count
Source (jump to first uncovered line)
1
//! The client to the obs-websocket API and main entry point.
2
3
#[cfg(feature = "events")]
4
use std::sync::Weak;
5
use std::{
6
    future::Future,
7
    sync::{
8
        atomic::{AtomicU64, Ordering},
9
        Arc,
10
    },
11
};
12
13
#[cfg(feature = "events")]
14
use futures_util::stream::Stream;
15
use futures_util::{
16
    sink::SinkExt,
17
    stream::{SplitSink, StreamExt},
18
};
19
use semver::{Comparator, Op, Prerelease};
20
use serde::de::DeserializeOwned;
21
#[cfg(feature = "events")]
22
use tokio::sync::broadcast;
23
use tokio::{net::TcpStream, sync::Mutex, task::JoinHandle};
24
use tokio_tungstenite::{
25
    tungstenite::{protocol::CloseFrame, Message},
26
    MaybeTlsStream, WebSocketStream,
27
};
28
use tracing::{debug, error, info, trace};
29
30
use self::connection::{ReceiverList, ReidentifyReceiverList};
31
pub use self::{
32
    config::Config, connection::HandshakeError, filters::Filters, general::General,
33
    hotkeys::Hotkeys, inputs::Inputs, media_inputs::MediaInputs, outputs::Outputs,
34
    profiles::Profiles, recording::Recording, replay_buffer::ReplayBuffer,
35
    scene_collections::SceneCollections, scene_items::SceneItems, scenes::Scenes, sources::Sources,
36
    streaming::Streaming, transitions::Transitions, ui::Ui, virtual_cam::VirtualCam,
37
};
38
#[cfg(feature = "events")]
39
use crate::events::Event;
40
use crate::{
41
    requests::{ClientRequest, EventSubscription, Reidentify, Request, RequestType},
42
    responses::ServerMessage,
43
    Error, Result,
44
};
45
46
mod config;
47
mod connection;
48
mod filters;
49
mod general;
50
mod hotkeys;
51
mod inputs;
52
mod media_inputs;
53
mod outputs;
54
mod profiles;
55
mod recording;
56
mod replay_buffer;
57
mod scene_collections;
58
mod scene_items;
59
mod scenes;
60
mod sources;
61
mod streaming;
62
mod transitions;
63
mod ui;
64
mod virtual_cam;
65
66
0
#[derive(Debug, thiserror::Error)]
Unexecuted instantiation: <obws::client::InnerError as core::fmt::Debug>::fmt
Unexecuted instantiation: <obws::client::InnerError as core::fmt::Debug>::fmt
Unexecuted instantiation: <obws::client::InnerError as core::fmt::Display>::fmt
Unexecuted instantiation: <obws::client::InnerError as std::error::Error>::source
Unexecuted instantiation: <obws::client::InnerError as std::error::Error>::source
Unexecuted instantiation: <obws::client::InnerError as core::fmt::Display>::fmt
67
enum InnerError {
68
    #[error("websocket message not convertible to text")]
69
    IntoText(#[source] tokio_tungstenite::tungstenite::Error),
70
    #[error("failed deserializing message")]
71
    DeserializeMessage(#[source] serde_json::Error),
72
    #[error("the request ID `{0}` is not an integer")]
73
    InvalidRequestId(#[source] std::num::ParseIntError, String),
74
    #[error("received unexpected server message: {0:?}")]
75
    UnexpectedMessage(ServerMessage),
76
}
77
78
/// The client is the main entry point to access the obs-websocket API. It allows to call various
79
/// functions to remote control an OBS instance as well as to listen to events caused by the user
80
/// by interacting with OBS.
81
pub struct Client {
82
    /// The writer handle to the web-socket stream.
83
    write: Mutex<MessageWriter>,
84
    /// Global counter for requests that help to find out what response belongs to what previously
85
    /// sent request.
86
    id_counter: AtomicU64,
87
    /// A list of currently waiting requests to get a response back. The key is the string version
88
    /// of a request ID and the value is a oneshot sender that allows to send the response back to
89
    /// the other end that waits for the response.
90
    receivers: Arc<ReceiverList>,
91
    /// A list of awaiting [`Self::reidentify`] requests, waiting for confirmation. As
92
    /// these requests don't carry any kind of ID, they're handled sequentially and must be tracked
93
    /// separate from normal requests.
94
    reidentify_receivers: Arc<ReidentifyReceiverList>,
95
    /// Broadcast sender that distributes received events to all current listeners. Events are
96
    /// dropped if nobody listens.
97
    #[cfg(feature = "events")]
98
    event_sender: Weak<broadcast::Sender<Event>>,
99
    /// Handle to the background task that receives messages and distributes them to waiting
100
    /// receivers and event listeners. It allows to shut down all the machinery once the client is
101
    /// no longer needed.
102
    handle: Option<JoinHandle<()>>,
103
}
104
105
/// Shorthand for the writer side of a web-socket stream that has been split into reader and writer.
106
type MessageWriter = SplitSink<WebSocketStream<MaybeTlsStream<TcpStream>>, Message>;
107
108
/// Default broadcast capacity used when not overwritten by the user.
109
#[cfg(feature = "events")]
110
const DEFAULT_CAPACITY: usize = 100;
111
112
/// Configuration for connecting to a obs-websocket instance.
113
pub struct ConnectConfig<H, P>
114
where
115
    H: AsRef<str>,
116
    P: AsRef<str>,
117
{
118
    /// The host name, usually `localhost` unless the OBS instance is on a remote machine.
119
    pub host: H,
120
    /// Port to connect to.
121
    pub port: u16,
122
    /// Optional password to authenticate against `obs-websocket`.
123
    pub password: Option<P>,
124
    /// Optional list of event subscriptions, controlling what events to receive. By default all
125
    /// events are listened to, with the exception of high volume events.
126
    pub event_subscriptions: Option<EventSubscription>,
127
    /// Whether to use TLS when connecting. Only useful when OBS runs on a remote machine.
128
    #[cfg(feature = "tls")]
129
    pub tls: bool,
130
    /// Capacity of the broadcast channel for events. The default is `100` which should suffice.
131
    /// If the consumption of events takes a long time and the broadcast channel fills up faster
132
    /// than events are consumed, it will start dropping old messages from the queue and these will
133
    /// not be send to listeners anymore.
134
    #[cfg_attr(not(feature = "events"), allow(dead_code))]
135
    pub broadcast_capacity: Option<usize>,
136
}
137
138
const OBS_STUDIO_VERSION: Comparator = Comparator {
139
    op: Op::GreaterEq,
140
    major: 27,
141
    minor: None,
142
    patch: None,
143
    pre: Prerelease::EMPTY,
144
};
145
const OBS_WEBSOCKET_VERSION: Comparator = Comparator {
146
    op: Op::Caret,
147
    major: 5,
148
    minor: None,
149
    patch: None,
150
    pre: Prerelease::EMPTY,
151
};
152
const RPC_VERSION: u32 = 1;
153
154
impl<H, P> ConnectConfig<H, P>
155
where
156
    H: AsRef<str>,
157
    P: AsRef<str>,
158
{
159
    #[cfg(feature = "tls")]
160
18
    fn tls(&self) -> bool {
161
18
        self.tls
162
18
    }
<obws::client::ConnectConfig<alloc::string::String, alloc::string::String>>::tls
Line
Count
Source
160
18
    fn tls(&self) -> bool {
161
18
        self.tls
162
18
    }
Unexecuted instantiation: <obws::client::ConnectConfig<_, _>>::tls
Unexecuted instantiation: <obws::client::ConnectConfig<_, _>>::tls
163
164
    #[cfg(not(feature = "tls"))]
165
    fn tls(&self) -> bool {
166
        false
167
    }
168
}
169
170
impl Client {
171
    /// Connect to a obs-websocket instance on the given host and port.
172
18
    pub async fn connect(
173
18
        host: impl AsRef<str>,
174
18
        port: u16,
175
18
        password: Option<impl AsRef<str>>,
176
18
    ) -> Result<Self> {
<obws::client::Client>::connect::<alloc::string::String, alloc::string::String>
Line
Count
Source
172
18
    pub async fn connect(
173
18
        host: impl AsRef<str>,
174
18
        port: u16,
175
18
        password: Option<impl AsRef<str>>,
176
18
    ) -> Result<Self> {
Unexecuted instantiation: <obws::client::Client>::connect::<_, _>
Unexecuted instantiation: <obws::client::Client>::connect::<_, _>
177
18
        Self::connect_with_config(ConnectConfig {
178
18
            host,
179
18
            port,
180
18
            password,
181
18
            event_subscriptions: None,
182
18
            #[cfg(feature = "tls")]
183
18
            tls: false,
184
18
            broadcast_capacity: None,
185
113
        })
186
113
        .await
187
18
    }
<obws::client::Client>::connect::<alloc::string::String, alloc::string::String>::{closure#0}
Line
Count
Source
177
18
        Self::connect_with_config(ConnectConfig {
178
18
            host,
179
18
            port,
180
18
            password,
181
18
            event_subscriptions: None,
182
18
            #[cfg(feature = "tls")]
183
18
            tls: false,
184
18
            broadcast_capacity: None,
185
113
        })
186
113
        .await
187
18
    }
Unexecuted instantiation: <obws::client::Client>::connect::<_, _>::{closure#0}
Unexecuted instantiation: <obws::client::Client>::connect::<_, _>::{closure#0}
188
189
    /// Connect to a obs-websocket instance with the given configuration.
190
18
    pub async fn connect_with_config<H, P>(config: ConnectConfig<H, P>) -> Result<Self>
191
18
    where
192
18
        H: AsRef<str>,
193
18
        P: AsRef<str>,
194
18
    {
<obws::client::Client>::connect_with_config::<alloc::string::String, alloc::string::String>
Line
Count
Source
190
18
    pub async fn connect_with_config<H, P>(config: ConnectConfig<H, P>) -> Result<Self>
191
18
    where
192
18
        H: AsRef<str>,
193
18
        P: AsRef<str>,
194
18
    {
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>
195
18
        let (socket, _) = tokio_tungstenite::connect_async(format!(
196
18
            "{}://{}:{}",
197
18
            if config.tls() { 
"wss"0
} else { "ws" },
198
18
            config.host.as_ref(),
199
            config.port
200
54
        ))
201
54
        .await
202
18
        .map_err(Error::Connect)
?0
;
203
204
18
        let (mut write, mut read) = socket.split();
205
18
206
18
        let receivers = Arc::new(ReceiverList::default());
207
18
        let receivers2 = Arc::clone(&receivers);
208
18
209
18
        let reidentify_receivers = Arc::new(ReidentifyReceiverList::default());
210
18
        let reidentify_receivers2 = Arc::clone(&reidentify_receivers);
211
18
212
18
        #[cfg(feature = "events")]
213
18
        let (event_sender, _) =
214
18
            broadcast::channel(config.broadcast_capacity.unwrap_or(DEFAULT_CAPACITY));
215
18
        #[cfg(feature = "events")]
216
18
        let event_sender = Arc::new(event_sender);
217
18
        #[cfg(feature = "events")]
218
18
        let events_tx = Arc::clone(&event_sender);
219
18
220
18
        self::connection::handshake(
221
18
            &mut write,
222
18
            &mut read,
223
18
            config.password.as_ref().map(AsRef::as_ref),
224
18
            config.event_subscriptions,
225
23
        )
226
23
        .await
?0
;
227
228
18
        let handle = tokio::spawn(async move {
229
606
            while let Some(Ok(
msg588
)) = read.next()
.await420
{
230
588
                if let Message::Close(
info0
) = &msg {
231
0
                    if let Some(CloseFrame { reason, .. }) = info {
232
0
                        info!(%reason, "connection closed with reason");
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<alloc::string::String, alloc::string::String>::{closure#0}::{closure#0}::{closure#1}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#1}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#1}
233
0
                    }
234
235
                    #[cfg(feature = "events")]
236
0
                    events_tx.send(Event::ServerStopping).ok();
237
0
                    continue;
238
588
                }
239
240
1.17k
                let 
res: Result<(), InnerError>588
= async {
241
588
                    let text = msg.into_text().map_err(InnerError::IntoText)
?0
;
242
243
588
                    let message = serde_json::from_str::<ServerMessage>(&text)
244
588
                        .map_err(InnerError::DeserializeMessage)
?0
;
245
246
588
                    match message {
247
346
                        ServerMessage::RequestResponse(response) => {
248
346
                            trace!(
249
346
                                id = %response.id,
250
346
                                status = ?response.status,
251
346
                                data = %response.data,
252
346
                                "got request-response message",
253
346
                            );
<obws::client::Client>::connect_with_config::<alloc::string::String, alloc::string::String>::{closure#0}::{closure#0}::{closure#0}::{closure#0}
Line
Count
Source
248
346
                            trace!(
249
346
                                id = %response.id,
250
346
                                status = ?response.status,
251
346
                                data = %response.data,
252
346
                                "got request-response message",
253
346
                            );
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#0}::{closure#0}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#0}::{closure#0}
254
346
                            receivers2.notify(response)
.await0
?0
;
255
                        }
256
                        #[cfg(feature = "events")]
257
242
                        ServerMessage::Event(event) => {
258
242
                            trace!(?event, "got OBS event");
<obws::client::Client>::connect_with_config::<alloc::string::String, alloc::string::String>::{closure#0}::{closure#0}::{closure#0}::{closure#1}
Line
Count
Source
258
242
                            trace!(?event, "got OBS event");
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#0}::{closure#1}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#0}::{closure#1}
259
242
                            events_tx.send(event).ok();
260
                        }
261
0
                        ServerMessage::Identified(identified) => {
262
0
                            trace!(?identified, "got identified message");
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<alloc::string::String, alloc::string::String>::{closure#0}::{closure#0}::{closure#0}::{closure#2}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#0}::{closure#2}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#0}::{closure#2}
263
0
                            reidentify_receivers2.notify(identified).await;
264
                        }
265
0
                        _ => return Err(InnerError::UnexpectedMessage(message)),
266
                    }
267
268
588
                    Ok(())
269
588
                }
<obws::client::Client>::connect_with_config::<alloc::string::String, alloc::string::String>::{closure#0}::{closure#0}::{closure#0}
Line
Count
Source
240
588
                let res: Result<(), InnerError> = async {
241
588
                    let text = msg.into_text().map_err(InnerError::IntoText)
?0
;
242
243
588
                    let message = serde_json::from_str::<ServerMessage>(&text)
244
588
                        .map_err(InnerError::DeserializeMessage)
?0
;
245
246
588
                    match message {
247
346
                        ServerMessage::RequestResponse(response) => {
248
346
                            trace!(
249
                                id = %response.id,
250
                                status = ?response.status,
251
                                data = %response.data,
252
346
                                "got request-response message",
253
                            );
254
346
                            receivers2.notify(response)
.await0
?0
;
255
                        }
256
                        #[cfg(feature = "events")]
257
242
                        ServerMessage::Event(event) => {
258
242
                            trace!(?event, "got OBS event");
259
242
                            events_tx.send(event).ok();
260
                        }
261
0
                        ServerMessage::Identified(identified) => {
262
0
                            trace!(?identified, "got identified message");
263
0
                            reidentify_receivers2.notify(identified).await;
264
                        }
265
0
                        _ => return Err(InnerError::UnexpectedMessage(message)),
266
                    }
267
268
588
                    Ok(())
269
588
                }
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#0}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#0}
270
0
                .await;
271
272
588
                if let Err(
error0
) = res {
273
0
                    error!(?error, "failed handling message");
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<alloc::string::String, alloc::string::String>::{closure#0}::{closure#0}::{closure#2}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#2}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}::{closure#2}
274
588
                }
275
            }
276
277
            #[cfg(feature = "events")]
278
0
            events_tx.send(Event::ServerStopped).ok();
279
0
280
0
            // clear all outstanding receivers to stop them from waiting forever on responses
281
0
            // they'll never receive.
282
0
            receivers2.reset().await;
283
0
            reidentify_receivers2.reset().await;
284
18
        
}0
);
<obws::client::Client>::connect_with_config::<alloc::string::String, alloc::string::String>::{closure#0}::{closure#0}
Line
Count
Source
228
18
        let handle = tokio::spawn(async move {
229
606
            while let Some(Ok(
msg588
)) = read.next()
.await420
{
230
588
                if let Message::Close(
info0
) = &msg {
231
0
                    if let Some(CloseFrame { reason, .. }) = info {
232
0
                        info!(%reason, "connection closed with reason");
233
0
                    }
234
235
                    #[cfg(feature = "events")]
236
0
                    events_tx.send(Event::ServerStopping).ok();
237
0
                    continue;
238
588
                }
239
240
588
                let res: Result<(), InnerError> = async {
241
                    let text = msg.into_text().map_err(InnerError::IntoText)?;
242
243
                    let message = serde_json::from_str::<ServerMessage>(&text)
244
                        .map_err(InnerError::DeserializeMessage)?;
245
246
                    match message {
247
                        ServerMessage::RequestResponse(response) => {
248
                            trace!(
249
                                id = %response.id,
250
                                status = ?response.status,
251
                                data = %response.data,
252
                                "got request-response message",
253
                            );
254
                            receivers2.notify(response).await?;
255
                        }
256
                        #[cfg(feature = "events")]
257
                        ServerMessage::Event(event) => {
258
                            trace!(?event, "got OBS event");
259
                            events_tx.send(event).ok();
260
                        }
261
                        ServerMessage::Identified(identified) => {
262
                            trace!(?identified, "got identified message");
263
                            reidentify_receivers2.notify(identified).await;
264
                        }
265
                        _ => return Err(InnerError::UnexpectedMessage(message)),
266
                    }
267
268
                    Ok(())
269
0
                }
270
0
                .await;
271
272
588
                if let Err(
error0
) = res {
273
0
                    error!(?error, "failed handling message");
274
588
                }
275
            }
276
277
            #[cfg(feature = "events")]
278
0
            events_tx.send(Event::ServerStopped).ok();
279
0
280
0
            // clear all outstanding receivers to stop them from waiting forever on responses
281
0
            // they'll never receive.
282
0
            receivers2.reset().await;
283
0
            reidentify_receivers2.reset().await;
284
0
        });
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}::{closure#0}
285
18
286
18
        let write = Mutex::new(write);
287
18
        let id_counter = AtomicU64::new(1);
288
18
289
18
        let client = Self {
290
18
            write,
291
18
            id_counter,
292
18
            receivers,
293
18
            reidentify_receivers,
294
18
            #[cfg(feature = "events")]
295
18
            event_sender: Arc::downgrade(&event_sender),
296
18
            handle: Some(handle),
297
18
        };
298
18
299
36
        client.verify_versions().await
?0
;
300
301
18
        Ok(client)
302
18
    }
<obws::client::Client>::connect_with_config::<alloc::string::String, alloc::string::String>::{closure#0}
Line
Count
Source
195
18
        let (socket, _) = tokio_tungstenite::connect_async(format!(
196
18
            "{}://{}:{}",
197
18
            if config.tls() { 
"wss"0
} else { "ws" },
198
18
            config.host.as_ref(),
199
            config.port
200
54
        ))
201
54
        .await
202
18
        .map_err(Error::Connect)
?0
;
203
204
18
        let (mut write, mut read) = socket.split();
205
18
206
18
        let receivers = Arc::new(ReceiverList::default());
207
18
        let receivers2 = Arc::clone(&receivers);
208
18
209
18
        let reidentify_receivers = Arc::new(ReidentifyReceiverList::default());
210
18
        let reidentify_receivers2 = Arc::clone(&reidentify_receivers);
211
18
212
18
        #[cfg(feature = "events")]
213
18
        let (event_sender, _) =
214
18
            broadcast::channel(config.broadcast_capacity.unwrap_or(DEFAULT_CAPACITY));
215
18
        #[cfg(feature = "events")]
216
18
        let event_sender = Arc::new(event_sender);
217
18
        #[cfg(feature = "events")]
218
18
        let events_tx = Arc::clone(&event_sender);
219
18
220
18
        self::connection::handshake(
221
18
            &mut write,
222
18
            &mut read,
223
18
            config.password.as_ref().map(AsRef::as_ref),
224
18
            config.event_subscriptions,
225
23
        )
226
23
        .await
?0
;
227
228
18
        let handle = tokio::spawn(async move {
229
            while let Some(Ok(msg)) = read.next().await {
230
                if let Message::Close(info) = &msg {
231
                    if let Some(CloseFrame { reason, .. }) = info {
232
                        info!(%reason, "connection closed with reason");
233
                    }
234
235
                    #[cfg(feature = "events")]
236
                    events_tx.send(Event::ServerStopping).ok();
237
                    continue;
238
                }
239
240
                let res: Result<(), InnerError> = async {
241
                    let text = msg.into_text().map_err(InnerError::IntoText)?;
242
243
                    let message = serde_json::from_str::<ServerMessage>(&text)
244
                        .map_err(InnerError::DeserializeMessage)?;
245
246
                    match message {
247
                        ServerMessage::RequestResponse(response) => {
248
                            trace!(
249
                                id = %response.id,
250
                                status = ?response.status,
251
                                data = %response.data,
252
                                "got request-response message",
253
                            );
254
                            receivers2.notify(response).await?;
255
                        }
256
                        #[cfg(feature = "events")]
257
                        ServerMessage::Event(event) => {
258
                            trace!(?event, "got OBS event");
259
                            events_tx.send(event).ok();
260
                        }
261
                        ServerMessage::Identified(identified) => {
262
                            trace!(?identified, "got identified message");
263
                            reidentify_receivers2.notify(identified).await;
264
                        }
265
                        _ => return Err(InnerError::UnexpectedMessage(message)),
266
                    }
267
268
                    Ok(())
269
                }
270
                .await;
271
272
                if let Err(error) = res {
273
                    error!(?error, "failed handling message");
274
                }
275
            }
276
277
            #[cfg(feature = "events")]
278
            events_tx.send(Event::ServerStopped).ok();
279
280
            // clear all outstanding receivers to stop them from waiting forever on responses
281
            // they'll never receive.
282
            receivers2.reset().await;
283
            reidentify_receivers2.reset().await;
284
18
        });
285
18
286
18
        let write = Mutex::new(write);
287
18
        let id_counter = AtomicU64::new(1);
288
18
289
18
        let client = Self {
290
18
            write,
291
18
            id_counter,
292
18
            receivers,
293
18
            reidentify_receivers,
294
18
            #[cfg(feature = "events")]
295
18
            event_sender: Arc::downgrade(&event_sender),
296
18
            handle: Some(handle),
297
18
        };
298
18
299
36
        client.verify_versions().await
?0
;
300
301
18
        Ok(client)
302
18
    }
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}
Unexecuted instantiation: <obws::client::Client>::connect_with_config::<_, _>::{closure#0}
303
304
18
    async fn verify_versions(&self) -> Result<()> {
<obws::client::Client>::verify_versions
Line
Count
Source
304
18
    async fn verify_versions(&self) -> Result<()> {
Unexecuted instantiation: <obws::client::Client>::verify_versions
305
36
        let 
mut version18
=
self.general().version()18
.await
?0
;
306
        // TODO: remove this after the official v5 release.
307
        // Current builds have prerelease info (like 5.0.0-91cabe1-git).
308
        // That causes the version check to fail, so we remove it for now.
309
18
        version.obs_web_socket_version.pre = Prerelease::EMPTY;
310
18
311
18
        if !OBS_STUDIO_VERSION.matches(&version.obs_version) {
312
0
            return Err(Error::ObsStudioVersion(
313
0
                version.obs_version,
314
0
                OBS_STUDIO_VERSION,
315
0
            ));
316
18
        }
317
18
318
18
        if !OBS_WEBSOCKET_VERSION.matches(&version.obs_web_socket_version) {
319
0
            return Err(Error::ObsWebsocketVersion(
320
0
                version.obs_web_socket_version,
321
0
                OBS_WEBSOCKET_VERSION,
322
0
            ));
323
18
        }
324
18
325
18
        if RPC_VERSION != version.rpc_version {
326
0
            return Err(Error::RpcVersion {
327
0
                requested: RPC_VERSION,
328
0
                negotiated: version.rpc_version,
329
0
            });
330
18
        }
331
18
332
18
        Ok(())
333
18
    }
<obws::client::Client>::verify_versions::{closure#0}
Line
Count
Source
305
36
        let 
mut version18
=
self.general().version()18
.await
?0
;
306
        // TODO: remove this after the official v5 release.
307
        // Current builds have prerelease info (like 5.0.0-91cabe1-git).
308
        // That causes the version check to fail, so we remove it for now.
309
18
        version.obs_web_socket_version.pre = Prerelease::EMPTY;
310
18
311
18
        if !OBS_STUDIO_VERSION.matches(&version.obs_version) {
312
0
            return Err(Error::ObsStudioVersion(
313
0
                version.obs_version,
314
0
                OBS_STUDIO_VERSION,
315
0
            ));
316
18
        }
317
18
318
18
        if !OBS_WEBSOCKET_VERSION.matches(&version.obs_web_socket_version) {
319
0
            return Err(Error::ObsWebsocketVersion(
320
0
                version.obs_web_socket_version,
321
0
                OBS_WEBSOCKET_VERSION,
322
0
            ));
323
18
        }
324
18
325
18
        if RPC_VERSION != version.rpc_version {
326
0
            return Err(Error::RpcVersion {
327
0
                requested: RPC_VERSION,
328
0
                negotiated: version.rpc_version,
329
0
            });
330
18
        }
331
18
332
18
        Ok(())
333
18
    }
Unexecuted instantiation: <obws::client::Client>::verify_versions::{closure#0}
Unexecuted instantiation: <obws::client::Client>::verify_versions::{closure#0}
334
335
346
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
346
    where
337
346
        R: Into<RequestType<'a>>,
338
346
        T: DeserializeOwned,
339
346
    {
<obws::client::Client>::send_message::<obws::requests::transitions::Request, obws::responses::transitions::TransitionKinds>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::ui::Request, obws::responses::ui::MonitorList>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::config::Request, obws::responses::config::VideoSettings>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::replay_buffer::Request, ()>
Line
Count
Source
335
3
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
3
    where
337
3
        R: Into<RequestType<'a>>,
338
3
        T: DeserializeOwned,
339
3
    {
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::Scenes>
Line
Count
Source
335
19
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
19
    where
337
19
        R: Into<RequestType<'a>>,
338
19
        T: DeserializeOwned,
339
19
    {
<obws::client::Client>::send_message::<obws::requests::transitions::Request, obws::responses::transitions::SceneTransitionList>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::media_inputs::Request, obws::responses::media_inputs::MediaStatus>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::hotkeys::Request, obws::responses::hotkeys::Hotkeys>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::replay_buffer::Request, obws::responses::replay_buffer::OutputActive>
Line
Count
Source
335
21
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
21
    where
337
21
        R: Into<RequestType<'a>>,
338
21
        T: DeserializeOwned,
339
21
    {
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::InputVolume>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::outputs::Request, obws::responses::outputs::OutputStatus>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::general::Request, obws::responses::general::Version>
Line
Count
Source
335
19
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
19
    where
337
19
        R: Into<RequestType<'a>>,
338
19
        T: DeserializeOwned,
339
19
    {
<obws::client::Client>::send_message::<obws::requests::ui::Request, ()>
Line
Count
Source
335
8
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
8
    where
337
8
        R: Into<RequestType<'a>>,
338
8
        T: DeserializeOwned,
339
8
    {
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::GetSceneItemTransform>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::config::Request, obws::responses::config::StreamServiceSettings<serde_json::value::Value>>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::general::Request, obws::responses::general::Stats>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::inputs::Request, ()>
Line
Count
Source
335
10
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
10
    where
337
10
        R: Into<RequestType<'a>>,
338
10
        T: DeserializeOwned,
339
10
    {
<obws::client::Client>::send_message::<obws::requests::recording::Request, obws::responses::recording::OutputStopped>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemId>
Line
Count
Source
335
3
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
3
    where
337
3
        R: Into<RequestType<'a>>,
338
3
        T: DeserializeOwned,
339
3
    {
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemList>
Line
Count
Source
335
2
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
2
    where
337
2
        R: Into<RequestType<'a>>,
338
2
        T: DeserializeOwned,
339
2
    {
<obws::client::Client>::send_message::<obws::requests::transitions::Request, ()>
Line
Count
Source
335
5
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
5
    where
337
5
        R: Into<RequestType<'a>>,
338
5
        T: DeserializeOwned,
339
5
    {
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::Groups>
Line
Count
Source
335
19
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
19
    where
337
19
        R: Into<RequestType<'a>>,
338
19
        T: DeserializeOwned,
339
19
    {
<obws::client::Client>::send_message::<obws::requests::scenes::Request, ()>
Line
Count
Source
335
28
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
28
    where
337
28
        R: Into<RequestType<'a>>,
338
28
        T: DeserializeOwned,
339
28
    {
<obws::client::Client>::send_message::<obws::requests::filters::Request, obws::responses::filters::DefaultFilterSettings<serde_json::value::Value>>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::hotkeys::Request, ()>
Line
Count
Source
335
2
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
2
    where
337
2
        R: Into<RequestType<'a>>,
338
2
        T: DeserializeOwned,
339
2
    {
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::CurrentPreviewScene>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::outputs::Request, obws::responses::outputs::OutputActive>
Line
Count
Source
335
2
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
2
    where
337
2
        R: Into<RequestType<'a>>,
338
2
        T: DeserializeOwned,
339
2
    {
<obws::client::Client>::send_message::<obws::requests::outputs::Request, ()>
Line
Count
Source
335
3
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
3
    where
337
3
        R: Into<RequestType<'a>>,
338
3
        T: DeserializeOwned,
339
3
    {
<obws::client::Client>::send_message::<obws::requests::profiles::Request, obws::responses::profiles::Profiles>
Line
Count
Source
335
20
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
20
    where
337
20
        R: Into<RequestType<'a>>,
338
20
        T: DeserializeOwned,
339
20
    {
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::InputSettings<serde_json::value::Value>>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::recording::Request, ()>
Line
Count
Source
335
3
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
3
    where
337
3
        R: Into<RequestType<'a>>,
338
3
        T: DeserializeOwned,
339
3
    {
<obws::client::Client>::send_message::<obws::requests::config::Request, serde_json::value::Value>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::general::Request, ()>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, ()>
Line
Count
Source
335
10
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
10
    where
337
10
        R: Into<RequestType<'a>>,
338
10
        T: DeserializeOwned,
339
10
    {
<obws::client::Client>::send_message::<obws::requests::recording::Request, obws::responses::recording::OutputPaused>
Line
Count
Source
335
2
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
2
    where
337
2
        R: Into<RequestType<'a>>,
338
2
        T: DeserializeOwned,
339
2
    {
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::CurrentProgramScene>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemEnabled>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemLocked>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::recording::Request, obws::responses::recording::OutputActive>
Line
Count
Source
335
2
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
2
    where
337
2
        R: Into<RequestType<'a>>,
338
2
        T: DeserializeOwned,
339
2
    {
<obws::client::Client>::send_message::<obws::requests::filters::Request, ()>
Line
Count
Source
335
8
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
8
    where
337
8
        R: Into<RequestType<'a>>,
338
8
        T: DeserializeOwned,
339
8
    {
<obws::client::Client>::send_message::<obws::requests::outputs::Request, obws::responses::outputs::OutputList>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::sources::Request, obws::responses::sources::SourceActive>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::media_inputs::Request, ()>
Line
Count
Source
335
3
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
3
    where
337
3
        R: Into<RequestType<'a>>,
338
3
        T: DeserializeOwned,
339
3
    {
<obws::client::Client>::send_message::<obws::requests::outputs::Request, obws::responses::outputs::OutputSettings<serde_json::value::Value>>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::config::Request, ()>
Line
Count
Source
335
3
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
3
    where
337
3
        R: Into<RequestType<'a>>,
338
3
        T: DeserializeOwned,
339
3
    {
<obws::client::Client>::send_message::<obws::requests::virtual_cam::Request, obws::responses::virtual_cam::OutputActive>
Line
Count
Source
335
21
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
21
    where
337
21
        R: Into<RequestType<'a>>,
338
21
        T: DeserializeOwned,
339
21
    {
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemIndex>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::streaming::Request, obws::responses::streaming::StreamStatus>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::transitions::Request, obws::responses::transitions::TransitionCursor>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::SceneTransitionOverride>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::config::Request, obws::responses::config::RecordDirectory>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::profiles::Request, ()>
Line
Count
Source
335
6
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
6
    where
337
6
        R: Into<RequestType<'a>>,
338
6
        T: DeserializeOwned,
339
6
    {
<obws::client::Client>::send_message::<obws::requests::scene_collections::Request, ()>
Line
Count
Source
335
2
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
2
    where
337
2
        R: Into<RequestType<'a>>,
338
2
        T: DeserializeOwned,
339
2
    {
<obws::client::Client>::send_message::<obws::requests::scene_collections::Request, obws::responses::scene_collections::SceneCollections>
Line
Count
Source
335
2
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
2
    where
337
2
        R: Into<RequestType<'a>>,
338
2
        T: DeserializeOwned,
339
2
    {
<obws::client::Client>::send_message::<obws::requests::sources::Request, ()>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::Inputs>
Line
Count
Source
335
19
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
19
    where
337
19
        R: Into<RequestType<'a>>,
338
19
        T: DeserializeOwned,
339
19
    {
<obws::client::Client>::send_message::<obws::requests::profiles::Request, obws::responses::profiles::ProfileParameter>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::sources::Request, obws::responses::sources::ImageData>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::AudioMonitorType>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::transitions::Request, obws::responses::transitions::CurrentSceneTransition>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::InputMuted>
Line
Count
Source
335
3
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
3
    where
337
3
        R: Into<RequestType<'a>>,
338
3
        T: DeserializeOwned,
339
3
    {
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::InputKinds>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::ui::Request, obws::responses::ui::StudioModeEnabled>
Line
Count
Source
335
19
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
19
    where
337
19
        R: Into<RequestType<'a>>,
338
19
        T: DeserializeOwned,
339
19
    {
<obws::client::Client>::send_message::<obws::requests::filters::Request, obws::responses::filters::Filters>
Line
Count
Source
335
19
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
19
    where
337
19
        R: Into<RequestType<'a>>,
338
19
        T: DeserializeOwned,
339
19
    {
<obws::client::Client>::send_message::<obws::requests::replay_buffer::Request, obws::responses::replay_buffer::SavedReplayPath>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemSettings<serde_json::value::Value>>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::DefaultInputSettings<serde_json::value::Value>>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::recording::Request, obws::responses::recording::RecordStatus>
Line
Count
Source
335
19
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
19
    where
337
19
        R: Into<RequestType<'a>>,
338
19
        T: DeserializeOwned,
339
19
    {
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::AudioSyncOffset>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
<obws::client::Client>::send_message::<obws::requests::virtual_cam::Request, ()>
Line
Count
Source
335
2
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
2
    where
337
2
        R: Into<RequestType<'a>>,
338
2
        T: DeserializeOwned,
339
2
    {
<obws::client::Client>::send_message::<obws::requests::filters::Request, obws::responses::filters::SourceFilter>
Line
Count
Source
335
1
    async fn send_message<'a, R, T>(&self, req: R) -> Result<T>
336
1
    where
337
1
        R: Into<RequestType<'a>>,
338
1
        T: DeserializeOwned,
339
1
    {
Unexecuted instantiation: <obws::client::Client>::send_message::<_, _>
Unexecuted instantiation: <obws::client::Client>::send_message::<_, _>
340
346
        async fn send<'a>(
341
346
            id_counter: &AtomicU64,
342
346
            receivers: &Arc<ReceiverList>,
343
346
            write: &Mutex<MessageWriter>,
344
346
            req: RequestType<'a>,
345
346
        ) -> Result<serde_json::Value> {
<obws::client::Client>::send_message::{closure#0}::send
Line
Count
Source
340
346
        async fn send<'a>(
341
346
            id_counter: &AtomicU64,
342
346
            receivers: &Arc<ReceiverList>,
343
346
            write: &Mutex<MessageWriter>,
344
346
            req: RequestType<'a>,
345
346
        ) -> Result<serde_json::Value> {
Unexecuted instantiation: <obws::client::Client>::send_message::{closure#0}::send
346
346
            let id = id_counter.fetch_add(1, Ordering::SeqCst);
347
346
            let id_str = id.to_string();
348
346
            let req = ClientRequest::Request(Request {
349
346
                request_id: &id_str,
350
346
                ty: req,
351
346
            });
352
346
            let json = serde_json::to_string(&req).map_err(Error::SerializeMessage)
?0
;
353
354
346
            let rx = receivers.add(id)
.await0
;
355
356
346
            trace!(%json, "sending message");
<obws::client::Client>::send_message::{closure#0}::send::{closure#0}::{closure#0}
Line
Count
Source
356
346
            trace!(%json, "sending message");
Unexecuted instantiation: <obws::client::Client>::send_message::{closure#0}::send::{closure#0}::{closure#0}
Unexecuted instantiation: <obws::client::Client>::send_message::{closure#0}::send::{closure#0}::{closure#0}
357
346
            let write_result = write
358
346
                .lock()
359
0
                .await
360
346
                .send(Message::Text(json))
361
0
                .await
362
346
                .map_err(Error::Send);
363
364
346
            if let Err(
e0
) = write_result {
365
0
                receivers.remove(id).await;
366
0
                return Err(e);
367
346
            }
368
369
692
            let (
status, resp346
) =
rx346
.await.
map_err(Error::ReceiveMessage)346
?0
;
370
346
            if !status.result {
371
0
                return Err(Error::Api {
372
0
                    code: status.code,
373
0
                    message: status.comment,
374
0
                });
375
346
            }
376
346
377
346
            Ok(resp)
378
346
        }
<obws::client::Client>::send_message::{closure#0}::send::{closure#0}
Line
Count
Source
345
346
        ) -> Result<serde_json::Value> {
346
346
            let id = id_counter.fetch_add(1, Ordering::SeqCst);
347
346
            let id_str = id.to_string();
348
346
            let req = ClientRequest::Request(Request {
349
346
                request_id: &id_str,
350
346
                ty: req,
351
346
            });
352
346
            let json = serde_json::to_string(&req).map_err(Error::SerializeMessage)
?0
;
353
354
346
            let rx = receivers.add(id)
.await0
;
355
356
346
            trace!(%json, "sending message");
357
346
            let write_result = write
358
346
                .lock()
359
0
                .await
360
346
                .send(Message::Text(json))
361
0
                .await
362
346
                .map_err(Error::Send);
363
364
346
            if let Err(
e0
) = write_result {
365
0
                receivers.remove(id).await;
366
0
                return Err(e);
367
346
            }
368
369
692
            let (
status, resp346
) =
rx346
.await.
map_err(Error::ReceiveMessage)346
?0
;
370
346
            if !status.result {
371
0
                return Err(Error::Api {
372
0
                    code: status.code,
373
0
                    message: status.comment,
374
0
                });
375
346
            }
376
346
377
346
            Ok(resp)
378
346
        }
Unexecuted instantiation: <obws::client::Client>::send_message::{closure#0}::send::{closure#0}
Unexecuted instantiation: <obws::client::Client>::send_message::{closure#0}::send::{closure#0}
379
380
692
        let 
resp346
=
send(&self.id_counter, &self.receivers, &self.write, req.into())346
.await
?0
;
381
346
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
346
    }
<obws::client::Client>::send_message::<obws::requests::inputs::Request, ()>::{closure#0}
Line
Count
Source
380
20
        let 
resp10
=
send(&self.id_counter, &self.receivers, &self.write, req.into())10
.await
?0
;
381
10
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
10
    }
<obws::client::Client>::send_message::<obws::requests::config::Request, obws::responses::config::StreamServiceSettings<serde_json::value::Value>>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::transitions::Request, obws::responses::transitions::CurrentSceneTransition>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::media_inputs::Request, ()>::{closure#0}
Line
Count
Source
380
6
        let 
resp3
=
send(&self.id_counter, &self.receivers, &self.write, req.into())3
.await
?0
;
381
3
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
3
    }
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, ()>::{closure#0}
Line
Count
Source
380
20
        let 
resp10
=
send(&self.id_counter, &self.receivers, &self.write, req.into())10
.await
?0
;
381
10
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
10
    }
<obws::client::Client>::send_message::<obws::requests::transitions::Request, ()>::{closure#0}
Line
Count
Source
380
10
        let 
resp5
=
send(&self.id_counter, &self.receivers, &self.write, req.into())5
.await
?0
;
381
5
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
5
    }
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::DefaultInputSettings<serde_json::value::Value>>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::outputs::Request, obws::responses::outputs::OutputSettings<serde_json::value::Value>>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::Inputs>::{closure#0}
Line
Count
Source
380
38
        let 
resp19
=
send(&self.id_counter, &self.receivers, &self.write, req.into())19
.await
?0
;
381
19
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
19
    }
<obws::client::Client>::send_message::<obws::requests::transitions::Request, obws::responses::transitions::SceneTransitionList>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::config::Request, obws::responses::config::RecordDirectory>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::SceneTransitionOverride>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::CurrentPreviewScene>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::outputs::Request, obws::responses::outputs::OutputActive>::{closure#0}
Line
Count
Source
380
4
        let 
resp2
=
send(&self.id_counter, &self.receivers, &self.write, req.into())2
.await
?0
;
381
2
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
2
    }
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::Scenes>::{closure#0}
Line
Count
Source
380
38
        let 
resp19
=
send(&self.id_counter, &self.receivers, &self.write, req.into())19
.await
?0
;
381
19
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
19
    }
<obws::client::Client>::send_message::<obws::requests::general::Request, obws::responses::general::Version>::{closure#0}
Line
Count
Source
380
38
        let 
resp19
=
send(&self.id_counter, &self.receivers, &self.write, req.into())19
.await
?0
;
381
19
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
19
    }
<obws::client::Client>::send_message::<obws::requests::replay_buffer::Request, ()>::{closure#0}
Line
Count
Source
380
6
        let 
resp3
=
send(&self.id_counter, &self.receivers, &self.write, req.into())3
.await
?0
;
381
3
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
3
    }
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemList>::{closure#0}
Line
Count
Source
380
4
        let 
resp2
=
send(&self.id_counter, &self.receivers, &self.write, req.into())2
.await
?0
;
381
2
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
2
    }
<obws::client::Client>::send_message::<obws::requests::recording::Request, obws::responses::recording::RecordStatus>::{closure#0}
Line
Count
Source
380
38
        let 
resp19
=
send(&self.id_counter, &self.receivers, &self.write, req.into())19
.await
?0
;
381
19
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
19
    }
<obws::client::Client>::send_message::<obws::requests::transitions::Request, obws::responses::transitions::TransitionCursor>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::filters::Request, obws::responses::filters::DefaultFilterSettings<serde_json::value::Value>>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::filters::Request, obws::responses::filters::Filters>::{closure#0}
Line
Count
Source
380
38
        let 
resp19
=
send(&self.id_counter, &self.receivers, &self.write, req.into())19
.await
?0
;
381
19
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
19
    }
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::CurrentProgramScene>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::config::Request, obws::responses::config::VideoSettings>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::config::Request, serde_json::value::Value>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemId>::{closure#0}
Line
Count
Source
380
6
        let 
resp3
=
send(&self.id_counter, &self.receivers, &self.write, req.into())3
.await
?0
;
381
3
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
3
    }
<obws::client::Client>::send_message::<obws::requests::replay_buffer::Request, obws::responses::replay_buffer::OutputActive>::{closure#0}
Line
Count
Source
380
42
        let 
resp21
=
send(&self.id_counter, &self.receivers, &self.write, req.into())21
.await
?0
;
381
21
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
21
    }
<obws::client::Client>::send_message::<obws::requests::sources::Request, ()>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::ui::Request, ()>::{closure#0}
Line
Count
Source
380
16
        let 
resp8
=
send(&self.id_counter, &self.receivers, &self.write, req.into())8
.await
?0
;
381
8
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
8
    }
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::InputVolume>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::outputs::Request, obws::responses::outputs::OutputList>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::filters::Request, obws::responses::filters::SourceFilter>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::media_inputs::Request, obws::responses::media_inputs::MediaStatus>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::GetSceneItemTransform>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::config::Request, ()>::{closure#0}
Line
Count
Source
380
6
        let 
resp3
=
send(&self.id_counter, &self.receivers, &self.write, req.into())3
.await
?0
;
381
3
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
3
    }
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::AudioMonitorType>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::replay_buffer::Request, obws::responses::replay_buffer::SavedReplayPath>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::profiles::Request, obws::responses::profiles::Profiles>::{closure#0}
Line
Count
Source
380
40
        let 
resp20
=
send(&self.id_counter, &self.receivers, &self.write, req.into())20
.await
?0
;
381
20
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
20
    }
<obws::client::Client>::send_message::<obws::requests::virtual_cam::Request, ()>::{closure#0}
Line
Count
Source
380
4
        let 
resp2
=
send(&self.id_counter, &self.receivers, &self.write, req.into())2
.await
?0
;
381
2
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
2
    }
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::AudioSyncOffset>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scenes::Request, obws::responses::scenes::Groups>::{closure#0}
Line
Count
Source
380
38
        let 
resp19
=
send(&self.id_counter, &self.receivers, &self.write, req.into())19
.await
?0
;
381
19
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
19
    }
<obws::client::Client>::send_message::<obws::requests::sources::Request, obws::responses::sources::ImageData>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::filters::Request, ()>::{closure#0}
Line
Count
Source
380
16
        let 
resp8
=
send(&self.id_counter, &self.receivers, &self.write, req.into())8
.await
?0
;
381
8
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
8
    }
<obws::client::Client>::send_message::<obws::requests::streaming::Request, obws::responses::streaming::StreamStatus>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::outputs::Request, ()>::{closure#0}
Line
Count
Source
380
6
        let 
resp3
=
send(&self.id_counter, &self.receivers, &self.write, req.into())3
.await
?0
;
381
3
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
3
    }
<obws::client::Client>::send_message::<obws::requests::ui::Request, obws::responses::ui::StudioModeEnabled>::{closure#0}
Line
Count
Source
380
38
        let 
resp19
=
send(&self.id_counter, &self.receivers, &self.write, req.into())19
.await
?0
;
381
19
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
19
    }
<obws::client::Client>::send_message::<obws::requests::outputs::Request, obws::responses::outputs::OutputStatus>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemEnabled>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::profiles::Request, ()>::{closure#0}
Line
Count
Source
380
12
        let 
resp6
=
send(&self.id_counter, &self.receivers, &self.write, req.into())6
.await
?0
;
381
6
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
6
    }
<obws::client::Client>::send_message::<obws::requests::scene_collections::Request, ()>::{closure#0}
Line
Count
Source
380
4
        let 
resp2
=
send(&self.id_counter, &self.receivers, &self.write, req.into())2
.await
?0
;
381
2
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
2
    }
<obws::client::Client>::send_message::<obws::requests::transitions::Request, obws::responses::transitions::TransitionKinds>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::InputMuted>::{closure#0}
Line
Count
Source
380
6
        let 
resp3
=
send(&self.id_counter, &self.receivers, &self.write, req.into())3
.await
?0
;
381
3
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
3
    }
<obws::client::Client>::send_message::<obws::requests::profiles::Request, obws::responses::profiles::ProfileParameter>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemIndex>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::recording::Request, obws::responses::recording::OutputPaused>::{closure#0}
Line
Count
Source
380
4
        let 
resp2
=
send(&self.id_counter, &self.receivers, &self.write, req.into())2
.await
?0
;
381
2
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
2
    }
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::InputSettings<serde_json::value::Value>>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::general::Request, obws::responses::general::Stats>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::general::Request, ()>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemLocked>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scenes::Request, ()>::{closure#0}
Line
Count
Source
380
56
        let 
resp28
=
send(&self.id_counter, &self.receivers, &self.write, req.into())28
.await
?0
;
381
28
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
28
    }
<obws::client::Client>::send_message::<obws::requests::recording::Request, obws::responses::recording::OutputActive>::{closure#0}
Line
Count
Source
380
4
        let 
resp2
=
send(&self.id_counter, &self.receivers, &self.write, req.into())2
.await
?0
;
381
2
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
2
    }
<obws::client::Client>::send_message::<obws::requests::hotkeys::Request, ()>::{closure#0}
Line
Count
Source
380
4
        let 
resp2
=
send(&self.id_counter, &self.receivers, &self.write, req.into())2
.await
?0
;
381
2
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
2
    }
<obws::client::Client>::send_message::<obws::requests::hotkeys::Request, obws::responses::hotkeys::Hotkeys>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scene_items::Request, obws::responses::scene_items::SceneItemSettings<serde_json::value::Value>>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::recording::Request, ()>::{closure#0}
Line
Count
Source
380
6
        let 
resp3
=
send(&self.id_counter, &self.receivers, &self.write, req.into())3
.await
?0
;
381
3
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
3
    }
<obws::client::Client>::send_message::<obws::requests::recording::Request, obws::responses::recording::OutputStopped>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::ui::Request, obws::responses::ui::MonitorList>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::scene_collections::Request, obws::responses::scene_collections::SceneCollections>::{closure#0}
Line
Count
Source
380
4
        let 
resp2
=
send(&self.id_counter, &self.receivers, &self.write, req.into())2
.await
?0
;
381
2
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
2
    }
<obws::client::Client>::send_message::<obws::requests::virtual_cam::Request, obws::responses::virtual_cam::OutputActive>::{closure#0}
Line
Count
Source
380
42
        let 
resp21
=
send(&self.id_counter, &self.receivers, &self.write, req.into())21
.await
?0
;
381
21
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
21
    }
<obws::client::Client>::send_message::<obws::requests::sources::Request, obws::responses::sources::SourceActive>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
<obws::client::Client>::send_message::<obws::requests::inputs::Request, obws::responses::inputs::InputKinds>::{closure#0}
Line
Count
Source
380
2
        let 
resp1
=
send(&self.id_counter, &self.receivers, &self.write, req.into())1
.await
?0
;
381
1
        serde_json::from_value(resp).map_err(Error::DeserializeResponse)
382
1
    }
Unexecuted instantiation: <obws::client::Client>::send_message::<_, _>::{closure#0}
Unexecuted instantiation: <obws::client::Client>::send_message::<_, _>::{closure#0}
383
384
    /// Disconnect from obs-websocket and shut down all machinery.
385
    ///
386
    /// This is called automatically when dropping the client but doesn't wait for all background
387
    /// tasks to complete. Therefore, it is recommended to call this manually once the client is
388
    /// no longer needed.
389
18
    pub fn disconnect(&mut self) -> impl Future {
390
18
        let handle = self.handle.take().map(|h| {
391
18
            h.abort();
392
18
            h
393
18
        });
<obws::client::Client>::disconnect::{closure#0}
Line
Count
Source
390
18
        let handle = self.handle.take().map(|h| {
391
18
            h.abort();
392
18
            h
393
18
        });
Unexecuted instantiation: <obws::client::Client>::disconnect::{closure#0}
394
395
        async {
396
0
            if let Some(h) = handle {
397
0
                h.await.ok();
398
0
            }
399
0
        }
Unexecuted instantiation: <obws::client::Client>::disconnect::{closure#1}
Unexecuted instantiation: <obws::client::Client>::disconnect::{closure#1}
400
18
    }
<obws::client::Client>::disconnect
Line
Count
Source
389
18
    pub fn disconnect(&mut self) -> impl Future {
390
18
        let handle = self.handle.take().map(|h| {
391
            h.abort();
392
            h
393
18
        });
394
395
        async {
396
            if let Some(h) = handle {
397
                h.await.ok();
398
            }
399
        }
400
18
    }
Unexecuted instantiation: <obws::client::Client>::disconnect
401
402
    /// Adjust settings of the currently active connection by re-identifying against
403
    /// `obs-websocket`.
404
    ///
405
    /// This currently allows to change the events to listen for, without the need of a full
406
    /// disconnect and new connection.
407
0
    pub async fn reidentify(&self, event_subscriptions: EventSubscription) -> Result<()> {
Unexecuted instantiation: <obws::client::Client>::reidentify
Unexecuted instantiation: <obws::client::Client>::reidentify
408
0
        let json = serde_json::to_string(&ClientRequest::Reidentify(Reidentify {
409
0
            event_subscriptions: Some(event_subscriptions),
410
0
        }))
411
0
        .map_err(Error::SerializeMessage)?;
412
413
0
        let rx = self.reidentify_receivers.add().await;
414
415
0
        self.write
416
0
            .lock()
417
0
            .await
418
0
            .send(Message::Text(json))
419
0
            .await
420
0
            .map_err(Error::Send)?;
421
422
0
        let resp = rx.await.map_err(Error::ReceiveMessage)?;
423
0
        debug!(
424
0
            rpc_version = %resp.negotiated_rpc_version,
425
0
            "re-identified against obs-websocket",
426
0
        );
Unexecuted instantiation: <obws::client::Client>::reidentify::{closure#0}::{closure#0}
Unexecuted instantiation: <obws::client::Client>::reidentify::{closure#0}::{closure#0}
427
428
0
        Ok(())
429
0
    }
Unexecuted instantiation: <obws::client::Client>::reidentify::{closure#0}
Unexecuted instantiation: <obws::client::Client>::reidentify::{closure#0}
430
431
    /// Get a stream of events. Each call to this function creates a new listener, therefore it's
432
    /// recommended to keep the stream around and iterate over it.
433
    ///
434
    /// **Note**: To be able to iterate over the stream you have to pin it with
435
    /// [`futures_util::pin_mut`] for example.
436
    ///
437
    /// # Errors
438
    ///
439
    /// Getting a new stream of events fails with [`Error::Disconnected`] if the client is
440
    /// disconnected from obs-websocket. That can happen either by manually disconnecting, stopping
441
    /// obs-websocket or closing OBS.
442
    #[cfg(feature = "events")]
443
    pub fn events(&self) -> Result<impl Stream<Item = Event>> {
444
5
        if let Some(sender) = &self.event_sender.upgrade() {
445
5
            let mut receiver = sender.subscribe();
446
5
447
5
            Ok(async_stream::stream! {
448
49
                while let Ok(
event31
) = receiver.recv().await {
449
31
                    yield event;
<obws::client::Client>::events::{closure#0}
Line
Count
Source
447
5
            Ok(async_stream::stream! {
448
49
                while let Ok(
event31
) = receiver.recv().await {
449
31
                    yield event;
Unexecuted instantiation: <obws::client::Client>::events::{closure#0}
Unexecuted instantiation: <obws::client::Client>::events::{closure#0}
450
5
                }
451
5
            })
452
        } else {
453
0
            Err(crate::Error::Disconnected)
454
        }
455
5
    }
<obws::client::Client>::events
Line
Count
Source
444
5
        if let Some(sender) = &self.event_sender.upgrade() {
445
5
            let mut receiver = sender.subscribe();
446
5
447
5
            Ok(async_stream::stream! {
448
5
                while let Ok(event) = receiver.recv().await {
449
5
                    yield event;
450
5
                }
451
5
            })
452
        } else {
453
0
            Err(crate::Error::Disconnected)
454
        }
455
5
    }
Unexecuted instantiation: <obws::client::Client>::events
456
457
    /// Access API functions related to OBS configuration.
458
1
    pub fn config(&self) -> Config<'_> {
459
1
        Config { client: self }
460
1
    }
<obws::client::Client>::config
Line
Count
Source
458
1
    pub fn config(&self) -> Config<'_> {
459
1
        Config { client: self }
460
1
    }
Unexecuted instantiation: <obws::client::Client>::config
461
462
    /// Access API functions related to filters.
463
19
    pub fn filters(&self) -> Filters<'_> {
464
19
        Filters { client: self }
465
19
    }
<obws::client::Client>::filters
Line
Count
Source
463
19
    pub fn filters(&self) -> Filters<'_> {
464
19
        Filters { client: self }
465
19
    }
Unexecuted instantiation: <obws::client::Client>::filters
466
467
    /// Access general API functions.
468
19
    pub fn general(&self) -> General<'_> {
469
19
        General { client: self }
470
19
    }
<obws::client::Client>::general
Line
Count
Source
468
19
    pub fn general(&self) -> General<'_> {
469
19
        General { client: self }
470
19
    }
Unexecuted instantiation: <obws::client::Client>::general
471
472
    /// Access API functions related to hotkeys.
473
1
    pub fn hotkeys(&self) -> Hotkeys<'_> {
474
1
        Hotkeys { client: self }
475
1
    }
<obws::client::Client>::hotkeys
Line
Count
Source
473
1
    pub fn hotkeys(&self) -> Hotkeys<'_> {
474
1
        Hotkeys { client: self }
475
1
    }
Unexecuted instantiation: <obws::client::Client>::hotkeys
476
477
    /// Access API functions related to inputs.
478
19
    pub fn inputs(&self) -> Inputs<'_> {
479
19
        Inputs { client: self }
480
19
    }
<obws::client::Client>::inputs
Line
Count
Source
478
19
    pub fn inputs(&self) -> Inputs<'_> {
479
19
        Inputs { client: self }
480
19
    }
Unexecuted instantiation: <obws::client::Client>::inputs
481
482
    /// Access API functions related to media inputs.
483
1
    pub fn media_inputs(&self) -> MediaInputs<'_> {
484
1
        MediaInputs { client: self }
485
1
    }
<obws::client::Client>::media_inputs
Line
Count
Source
483
1
    pub fn media_inputs(&self) -> MediaInputs<'_> {
484
1
        MediaInputs { client: self }
485
1
    }
Unexecuted instantiation: <obws::client::Client>::media_inputs
486
487
    /// Access API functions related to outputs.
488
1
    pub fn outputs(&self) -> Outputs<'_> {
489
1
        Outputs { client: self }
490
1
    }
<obws::client::Client>::outputs
Line
Count
Source
488
1
    pub fn outputs(&self) -> Outputs<'_> {
489
1
        Outputs { client: self }
490
1
    }
Unexecuted instantiation: <obws::client::Client>::outputs
491
492
    /// Access API functions related to profiles.
493
19
    pub fn profiles(&self) -> Profiles<'_> {
494
19
        Profiles { client: self }
495
19
    }
<obws::client::Client>::profiles
Line
Count
Source
493
19
    pub fn profiles(&self) -> Profiles<'_> {
494
19
        Profiles { client: self }
495
19
    }
Unexecuted instantiation: <obws::client::Client>::profiles
496
497
    /// Access API functions related to recording.
498
19
    pub fn recording(&self) -> Recording<'_> {
499
19
        Recording { client: self }
500
19
    }
<obws::client::Client>::recording
Line
Count
Source
498
19
    pub fn recording(&self) -> Recording<'_> {
499
19
        Recording { client: self }
500
19
    }
Unexecuted instantiation: <obws::client::Client>::recording
501
502
    /// Access API functions related to the replay buffer.
503
19
    pub fn replay_buffer(&self) -> ReplayBuffer<'_> {
504
19
        ReplayBuffer { client: self }
505
19
    }
<obws::client::Client>::replay_buffer
Line
Count
Source
503
19
    pub fn replay_buffer(&self) -> ReplayBuffer<'_> {
504
19
        ReplayBuffer { client: self }
505
19
    }
Unexecuted instantiation: <obws::client::Client>::replay_buffer
506
507
    /// Access API functions related to scene collections.
508
1
    pub fn scene_collections(&self) -> SceneCollections<'_> {
509
1
        SceneCollections { client: self }
510
1
    }
<obws::client::Client>::scene_collections
Line
Count
Source
508
1
    pub fn scene_collections(&self) -> SceneCollections<'_> {
509
1
        SceneCollections { client: self }
510
1
    }
Unexecuted instantiation: <obws::client::Client>::scene_collections
511
512
    /// Access API functions related to scene items.
513
1
    pub fn scene_items(&self) -> SceneItems<'_> {
514
1
        SceneItems { client: self }
515
1
    }
<obws::client::Client>::scene_items
Line
Count
Source
513
1
    pub fn scene_items(&self) -> SceneItems<'_> {
514
1
        SceneItems { client: self }
515
1
    }
Unexecuted instantiation: <obws::client::Client>::scene_items
516
517
    /// Access API functions related to scenes.
518
55
    pub fn scenes(&self) -> Scenes<'_> {
519
55
        Scenes { client: self }
520
55
    }
<obws::client::Client>::scenes
Line
Count
Source
518
55
    pub fn scenes(&self) -> Scenes<'_> {
519
55
        Scenes { client: self }
520
55
    }
Unexecuted instantiation: <obws::client::Client>::scenes
521
522
    /// Access API functions related to sources.
523
1
    pub fn sources(&self) -> Sources<'_> {
524
1
        Sources { client: self }
525
1
    }
<obws::client::Client>::sources
Line
Count
Source
523
1
    pub fn sources(&self) -> Sources<'_> {
524
1
        Sources { client: self }
525
1
    }
Unexecuted instantiation: <obws::client::Client>::sources
526
527
    /// Access API functions related to streaming.
528
1
    pub fn streaming(&self) -> Streaming<'_> {
529
1
        Streaming { client: self }
530
1
    }
<obws::client::Client>::streaming
Line
Count
Source
528
1
    pub fn streaming(&self) -> Streaming<'_> {
529
1
        Streaming { client: self }
530
1
    }
Unexecuted instantiation: <obws::client::Client>::streaming
531
532
    /// Access API functions related to transitions.
533
1
    pub fn transitions(&self) -> Transitions<'_> {
534
1
        Transitions { client: self }
535
1
    }
<obws::client::Client>::transitions
Line
Count
Source
533
1
    pub fn transitions(&self) -> Transitions<'_> {
534
1
        Transitions { client: self }
535
1
    }
Unexecuted instantiation: <obws::client::Client>::transitions
536
537
    /// Access API functions related to the user interface.
538
21
    pub fn ui(&self) -> Ui<'_> {
539
21
        Ui { client: self }
540
21
    }
<obws::client::Client>::ui
Line
Count
Source
538
21
    pub fn ui(&self) -> Ui<'_> {
539
21
        Ui { client: self }
540
21
    }
Unexecuted instantiation: <obws::client::Client>::ui
541
542
    /// Access API functions related to the virtual camera.
543
19
    pub fn virtual_cam(&self) -> VirtualCam<'_> {
544
19
        VirtualCam { client: self }
545
19
    }
<obws::client::Client>::virtual_cam
Line
Count
Source
543
19
    pub fn virtual_cam(&self) -> VirtualCam<'_> {
544
19
        VirtualCam { client: self }
545
19
    }
Unexecuted instantiation: <obws::client::Client>::virtual_cam
546
}
547
548
impl Drop for Client {
549
18
    fn drop(&mut self) {
550
18
        // We simply drop the future as the background task has been aborted but we have no way here
551
18
        // to wait for it to fully shut down (except spinning up a new tokio runtime).
552
18
        drop(self.disconnect());
553
18
    }
<obws::client::Client as core::ops::drop::Drop>::drop
Line
Count
Source
549
18
    fn drop(&mut self) {
550
18
        // We simply drop the future as the background task has been aborted but we have no way here
551
18
        // to wait for it to fully shut down (except spinning up a new tokio runtime).
552
18
        drop(self.disconnect());
553
18
    }
Unexecuted instantiation: <obws::client::Client as core::ops::drop::Drop>::drop
554
}