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 | | } |