You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
obws/coverage/src/client/connection.rs.html

1 line
74 KiB
HTML

<!doctype html><html><head><meta name='viewport' content='width=device-width,initial-scale=1'><meta charset='UTF-8'><link rel='stylesheet' type='text/css' href='../../../style.css'></head><body><h2>Coverage Report</h2><h4>Created: 2022-07-04 16:17</h4><div class='centered'><table><div class='source-name-title'><pre>src/client/connection.rs</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source (<a href='#L23'>jump to first uncovered line</a>)</pre></td></td></tr><tr><td class='line-number'><a name='L1' href='#L1'><pre>1</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>use std::collections::{HashMap, VecDeque};</pre></td></tr><tr><td class='line-number'><a name='L2' href='#L2'><pre>2</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L3' href='#L3'><pre>3</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>use futures_util::{Sink, SinkExt, Stream, StreamExt};</pre></td></tr><tr><td class='line-number'><a name='L4' href='#L4'><pre>4</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>use tokio::sync::{oneshot, Mutex};</pre></td></tr><tr><td class='line-number'><a name='L5' href='#L5'><pre>5</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>use tokio_tungstenite::tungstenite::Message;</pre></td></tr><tr><td class='line-number'><a name='L6' href='#L6'><pre>6</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>use tracing::debug;</pre></td></tr><tr><td class='line-number'><a name='L7' href='#L7'><pre>7</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L8' href='#L8'><pre>8</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>use super::InnerError;</pre></td></tr><tr><td class='line-number'><a name='L9' href='#L9'><pre>9</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>use crate::{</pre></td></tr><tr><td class='line-number'><a name='L10' href='#L10'><pre>10</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> requests::{ClientRequest, EventSubscription, Identify},</pre></td></tr><tr><td class='line-number'><a name='L11' href='#L11'><pre>11</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> responses::{Hello, Identified, RequestResponse, ServerMessage, Status},</pre></td></tr><tr><td class='line-number'><a name='L12' href='#L12'><pre>12</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>};</pre></td></tr><tr><td class='line-number'><a name='L13' href='#L13'><pre>13</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L14' href='#L14'><pre>14</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>/// Wrapper for the list of ongoing requests that wait for response.</pre></td></tr><tr><td class='line-number'><a name='L15' href='#L15'><pre>15</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>#[derive(Default)]</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>&lt;obws::client::connection::ReceiverList as core::default::Default&gt;::default</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L15' href='#L15'><pre>15</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>#[derive(Default)]</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList as core::default::Default&gt;::default</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList as core::default::Default&gt;::default</pre></div></div></td></tr><tr><td class='line-number'><a name='L16' href='#L16'><pre>16</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>pub(super) struct ReceiverList(Mutex&lt;HashMap&lt;u64, oneshot::Sender&lt;(Status, serde_json::Value)&gt;&gt;&gt;);</pre></td></tr><tr><td class='line-number'><a name='L17' href='#L17'><pre>17</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L18' href='#L18'><pre>18</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>impl ReceiverList {</pre></td></tr><tr><td class='line-number'><a name='L19' href='#L19'><pre>19</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Add a new receiver to the wait list, that will be notified once a request with the given</pre></td></tr><tr><td class='line-number'><a name='L20' href='#L20'><pre>20</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// ID is received.</pre></td></tr><tr><td class='line-number'><a name='L21' href='#L21'><pre>21</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> pub async fn add(&amp;self, id: u64) -&gt; oneshot::Receiver&lt;(Status, serde_json::Value)&gt; {</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>&lt;obws::client::connection::ReceiverList&gt;::add</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L21' href='#L21'><pre>21</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> pub async fn add(&amp;self, id: u64) -&gt; oneshot::Receiver&lt;(Status, serde_json::Value)&gt; {</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::add</pre></div></div></td></tr><tr><td class='line-number'><a name='L22' href='#L22'><pre>22</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> let (tx, rx) = oneshot::channel();</pre></td></tr><tr><td class='line-number'><a name='L23' href='#L23'><pre>23</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> self.0.lock()<div class='tooltip'><span class='red'>.await</span><span class='tooltip-content'>0</span></div>.insert(id, tx);</pre></td></tr><tr><td class='line-number'><a name='L24' href='#L24'><pre>24</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> rx</pre></td></tr><tr><td class='line-number'><a name='L25' href='#L25'><pre>25</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> }</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>&lt;obws::client::connection::ReceiverList&gt;::add::{closure#0}</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L21' href='#L21'><pre>21</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> pub async fn add(&amp;self, id: u64) -&gt; oneshot::Receiver&lt;(Status, serde_json::Value)&gt; {</pre></td></tr><tr><td class='line-number'><a name='L22' href='#L22'><pre>22</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> let (tx, rx) = oneshot::channel();</pre></td></tr><tr><td class='line-number'><a name='L23' href='#L23'><pre>23</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> self.0.lock()<div class='tooltip'><span class='red'>.await</span><span class='tooltip-content'>0</span></div>.insert(id, tx);</pre></td></tr><tr><td class='line-number'><a name='L24' href='#L24'><pre>24</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> rx</pre></td></tr><tr><td class='line-number'><a name='L25' href='#L25'><pre>25</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> }</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::add::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::add::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L26' href='#L26'><pre>26</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L27' href='#L27'><pre>27</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Remove a previously added receiver. Used to free up resources, in case sending the request</pre></td></tr><tr><td class='line-number'><a name='L28' href='#L28'><pre>28</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// failed.</pre></td></tr><tr><td class='line-number'><a name='L29' href='#L29'><pre>29</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> <span class='red'>pub async fn remove(&amp;self, id: u64) </span><span class='red'>{</span></pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::remove</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::remove</pre></div></div></td></tr><tr><td class='line-number'><a name='L30' href='#L30'><pre>30</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> self.0.lock()</span><span class='red'>.await</span>.<span class='red'>remove(&amp;id);</span></pre></td></tr><tr><td class='line-number'><a name='L31' href='#L31'><pre>31</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> }</span></pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::remove::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::remove::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::remove::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L32' href='#L32'><pre>32</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L33' href='#L33'><pre>33</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Notify a waiting receiver with the response to a request.</pre></td></tr><tr><td class='line-number'><a name='L34' href='#L34'><pre>34</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> pub async fn notify(&amp;self, response: RequestResponse) -&gt; Result&lt;(), InnerError&gt; {</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>&lt;obws::client::connection::ReceiverList&gt;::notify</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L34' href='#L34'><pre>34</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> pub async fn notify(&amp;self, response: RequestResponse) -&gt; Result&lt;(), InnerError&gt; {</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::notify</pre></div></div></td></tr><tr><td class='line-number'><a name='L35' href='#L35'><pre>35</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> let RequestResponse {</pre></td></tr><tr><td class='line-number'><a name='L36' href='#L36'><pre>36</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> r#type: _,</pre></td></tr><tr><td class='line-number'><a name='L37' href='#L37'><pre>37</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> id,</pre></td></tr><tr><td class='line-number'><a name='L38' href='#L38'><pre>38</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> status,</pre></td></tr><tr><td class='line-number'><a name='L39' href='#L39'><pre>39</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> data,</pre></td></tr><tr><td class='line-number'><a name='L40' href='#L40'><pre>40</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> } = response;</pre></td></tr><tr><td class='line-number'><a name='L41' href='#L41'><pre>41</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L42' href='#L42'><pre>42</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> let id = id</pre></td></tr><tr><td class='line-number'><a name='L43' href='#L43'><pre>43</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> .parse()</pre></td></tr><tr><td class='line-number'><a name='L44' href='#L44'><pre>44</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> .map_err(|e| <div class='tooltip'><span class='red'>InnerError::InvalidRequestId(e, id)</span><span class='tooltip-content'>0</span></div>)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div>;</pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::notify::{closure#0}::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::notify::{closure#0}::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::notify::{closure#0}::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L45' href='#L45'><pre>45</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L46' href='#L46'><pre>46</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> if let Some(tx) = self.0.lock()<div class='tooltip'><span class='red'>.await</span><span class='tooltip-content'>0</span></div>.remove(&amp;id) {</pre></td></tr><tr><td class='line-number'><a name='L47' href='#L47'><pre>47</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> tx.send((status, data)).ok();</pre></td></tr><tr><td class='line-number'><a name='L48' href='#L48'><pre>48</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> }<div class='tooltip'><span class='red'></span><span class='tooltip-content'>0</span></div></pre></td></tr><tr><td class='line-number'><a name='L49' href='#L49'><pre>49</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L50' href='#L50'><pre>50</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> Ok(())</pre></td></tr><tr><td class='line-number'><a name='L51' href='#L51'><pre>51</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> }</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>&lt;obws::client::connection::ReceiverList&gt;::notify::{closure#0}</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L34' href='#L34'><pre>34</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> pub async fn notify(&amp;self, response: RequestResponse) -&gt; Result&lt;(), InnerError&gt; {</pre></td></tr><tr><td class='line-number'><a name='L35' href='#L35'><pre>35</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> let RequestResponse {</pre></td></tr><tr><td class='line-number'><a name='L36' href='#L36'><pre>36</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> r#type: _,</pre></td></tr><tr><td class='line-number'><a name='L37' href='#L37'><pre>37</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> id,</pre></td></tr><tr><td class='line-number'><a name='L38' href='#L38'><pre>38</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> status,</pre></td></tr><tr><td class='line-number'><a name='L39' href='#L39'><pre>39</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> data,</pre></td></tr><tr><td class='line-number'><a name='L40' href='#L40'><pre>40</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> } = response;</pre></td></tr><tr><td class='line-number'><a name='L41' href='#L41'><pre>41</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L42' href='#L42'><pre>42</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> let id = id</pre></td></tr><tr><td class='line-number'><a name='L43' href='#L43'><pre>43</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> .parse()</pre></td></tr><tr><td class='line-number'><a name='L44' href='#L44'><pre>44</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> .map_err(|e| InnerError::InvalidRequestId(e, id))<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div>;</pre></td></tr><tr><td class='line-number'><a name='L45' href='#L45'><pre>45</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L46' href='#L46'><pre>46</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> if let Some(tx) = self.0.lock()<div class='tooltip'><span class='red'>.await</span><span class='tooltip-content'>0</span></div>.remove(&amp;id) {</pre></td></tr><tr><td class='line-number'><a name='L47' href='#L47'><pre>47</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> tx.send((status, data)).ok();</pre></td></tr><tr><td class='line-number'><a name='L48' href='#L48'><pre>48</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> }<div class='tooltip'><span class='red'></span><span class='tooltip-content'>0</span></div></pre></td></tr><tr><td class='line-number'><a name='L49' href='#L49'><pre>49</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L50' href='#L50'><pre>50</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> Ok(())</pre></td></tr><tr><td class='line-number'><a name='L51' href='#L51'><pre>51</pre></a></td><td class='covered-line'><pre>346</pre></td><td class='code'><pre> }</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::notify::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::notify::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L52' href='#L52'><pre>52</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L53' href='#L53'><pre>53</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Reset the list, canceling any outstanding receivers.</pre></td></tr><tr><td class='line-number'><a name='L54' href='#L54'><pre>54</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> <span class='red'>pub async fn reset(&amp;self) </span><span class='red'>{</span></pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::reset</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::reset</pre></div></div></td></tr><tr><td class='line-number'><a name='L55' href='#L55'><pre>55</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> self.0.lock()</span><span class='red'>.await</span>.<span class='red'>clear();</span></pre></td></tr><tr><td class='line-number'><a name='L56' href='#L56'><pre>56</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> }</span></pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::reset::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::reset::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReceiverList&gt;::reset::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L57' href='#L57'><pre>57</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>}</pre></td></tr><tr><td class='line-number'><a name='L58' href='#L58'><pre>58</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L59' href='#L59'><pre>59</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>/// Wrapper around a thread-safe queue to park and notify re-identify listener.</pre></td></tr><tr><td class='line-number'><a name='L60' href='#L60'><pre>60</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>#[derive(Default)]</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>&lt;obws::client::connection::ReidentifyReceiverList as core::default::Default&gt;::default</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L60' href='#L60'><pre>60</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>#[derive(Default)]</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList as core::default::Default&gt;::default</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList as core::default::Default&gt;::default</pre></div></div></td></tr><tr><td class='line-number'><a name='L61' href='#L61'><pre>61</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>pub(super) struct ReidentifyReceiverList(Mutex&lt;VecDeque&lt;oneshot::Sender&lt;Identified&gt;&gt;&gt;);</pre></td></tr><tr><td class='line-number'><a name='L62' href='#L62'><pre>62</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L63' href='#L63'><pre>63</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>impl ReidentifyReceiverList {</pre></td></tr><tr><td class='line-number'><a name='L64' href='#L64'><pre>64</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Add a new receiver to the wait list, returning a channel to await the result on.</pre></td></tr><tr><td class='line-number'><a name='L65' href='#L65'><pre>65</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> <span class='red'>pub async fn add(&amp;self) -&gt; oneshot::Receiver&lt;Identified&gt; </span><span class='red'>{</span></pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::add</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::add</pre></div></div></td></tr><tr><td class='line-number'><a name='L66' href='#L66'><pre>66</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> let (tx, rx) = oneshot::channel();</span></pre></td></tr><tr><td class='line-number'><a name='L67' href='#L67'><pre>67</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> self.0.lock()</span><span class='red'>.await</span>.<span class='red'>push_back(tx);</span></pre></td></tr><tr><td class='line-number'><a name='L68' href='#L68'><pre>68</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> rx</span></pre></td></tr><tr><td class='line-number'><a name='L69' href='#L69'><pre>69</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> }</span></pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::add::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::add::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L70' href='#L70'><pre>70</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L71' href='#L71'><pre>71</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Notify the next listener in the queue, transferring it the response.</pre></td></tr><tr><td class='line-number'><a name='L72' href='#L72'><pre>72</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> <span class='red'>pub async fn notify(&amp;self, identified: Identified) </span>{</pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::notify</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::notify</pre></div></div></td></tr><tr><td class='line-number'><a name='L73' href='#L73'><pre>73</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> if let Some(<span class='red'>tx</span>) = <span class='red'>self.0.lock()</span><span class='red'>.await</span>.<span class='red'>pop_front()</span> <span class='red'>{</span></pre></td></tr><tr><td class='line-number'><a name='L74' href='#L74'><pre>74</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> tx.send(identified).ok();</span></pre></td></tr><tr><td class='line-number'><a name='L75' href='#L75'><pre>75</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> }</span><span class='red'></span></pre></td></tr><tr><td class='line-number'><a name='L76' href='#L76'><pre>76</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> <span class='red'>}</span></pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::notify::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::notify::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::notify::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L77' href='#L77'><pre>77</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L78' href='#L78'><pre>78</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Reset the list, canceling any outstanding receivers.</pre></td></tr><tr><td class='line-number'><a name='L79' href='#L79'><pre>79</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> <span class='red'>pub async fn reset(&amp;self) </span><span class='red'>{</span></pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::reset</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::reset</pre></div></div></td></tr><tr><td class='line-number'><a name='L80' href='#L80'><pre>80</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> self.0.lock()</span><span class='red'>.await</span>.<span class='red'>clear();</span></pre></td></tr><tr><td class='line-number'><a name='L81' href='#L81'><pre>81</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> }</span></pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::reset::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::reset::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::ReidentifyReceiverList&gt;::reset::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L82' href='#L82'><pre>82</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>}</pre></td></tr><tr><td class='line-number'><a name='L83' href='#L83'><pre>83</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L84' href='#L84'><pre>84</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>/// Errors that can occur while performing the initial handshake with obs-websocket.</pre></td></tr><tr><td class='line-number'><a name='L85' href='#L85'><pre>85</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre>#[derive(<span class='red'>D</span>ebu<span class='red'>g</span>, <span class='red'>t</span><span class='red'>hiserror::Erro</span><span class='red'>r</span>)]</pre><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::HandshakeError as core::fmt::Debug&gt;::fmt</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::HandshakeError as core::fmt::Debug&gt;::fmt</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::HandshakeError as core::fmt::Display&gt;::fmt</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::HandshakeError as std::error::Error&gt;::source</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::HandshakeError as std::error::Error&gt;::source</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: &lt;obws::client::connection::HandshakeError as core::fmt::Display&gt;::fmt</pre></div></div></td></tr><tr><td class='line-number'><a name='L86' href='#L86'><pre>86</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>pub enum HandshakeError {</pre></td></tr><tr><td class='line-number'><a name='L87' href='#L87'><pre>87</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// The connection to obs-websocket was interrupted while trying to read a message.</pre></td></tr><tr><td class='line-number'><a name='L88' href='#L88'><pre>88</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> #[error(&quot;connection to obs-websocket was closed&quot;)]</pre></td></tr><tr><td class='line-number'><a name='L89' href='#L89'><pre>89</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> ConnectionClosed,</pre></td></tr><tr><td class='line-number'><a name='L90' href='#L90'><pre>90</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Receiving a message did not succeed.</pre></td></tr><tr><td class='line-number'><a name='L91' href='#L91'><pre>91</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> #[error(&quot;failed reading websocket message&quot;)]</pre></td></tr><tr><td class='line-number'><a name='L92' href='#L92'><pre>92</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> Receive(#[source] tokio_tungstenite::tungstenite::Error),</pre></td></tr><tr><td class='line-number'><a name='L93' href='#L93'><pre>93</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// The web-socket message was not convertible to text.</pre></td></tr><tr><td class='line-number'><a name='L94' href='#L94'><pre>94</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> #[error(&quot;websocket message not convertible to text&quot;)]</pre></td></tr><tr><td class='line-number'><a name='L95' href='#L95'><pre>95</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> IntoText(#[source] tokio_tungstenite::tungstenite::Error),</pre></td></tr><tr><td class='line-number'><a name='L96' href='#L96'><pre>96</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// A message from obs-websocket could not be deserialized.</pre></td></tr><tr><td class='line-number'><a name='L97' href='#L97'><pre>97</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> #[error(&quot;failed deserializing message&quot;)]</pre></td></tr><tr><td class='line-number'><a name='L98' href='#L98'><pre>98</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> DeserializeMessage(#[source] serde_json::Error),</pre></td></tr><tr><td class='line-number'><a name='L99' href='#L99'><pre>99</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// A message could not be serialized for sending.</pre></td></tr><tr><td class='line-number'><a name='L100' href='#L100'><pre>100</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> #[error(&quot;failed serializing message&quot;)]</pre></td></tr><tr><td class='line-number'><a name='L101' href='#L101'><pre>101</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> SerializeMessage(#[source] serde_json::Error),</pre></td></tr><tr><td class='line-number'><a name='L102' href='#L102'><pre>102</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Sending a message to obs-websocket failed.</pre></td></tr><tr><td class='line-number'><a name='L103' href='#L103'><pre>103</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> #[error(&quot;failed to send message to obs-websocket&quot;)]</pre></td></tr><tr><td class='line-number'><a name='L104' href='#L104'><pre>104</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> Send(#[source] tokio_tungstenite::tungstenite::Error),</pre></td></tr><tr><td class='line-number'><a name='L105' href='#L105'><pre>105</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Didn&apos;t receive the initial `Hello` message from obs-websocket after connecting.</pre></td></tr><tr><td class='line-number'><a name='L106' href='#L106'><pre>106</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> #[error(&quot;didn&apos;t receive a `Hello` message after connecting&quot;)]</pre></td></tr><tr><td class='line-number'><a name='L107' href='#L107'><pre>107</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> NoHello,</pre></td></tr><tr><td class='line-number'><a name='L108' href='#L108'><pre>108</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> /// Didn&apos;t receive a `Identified` message from obs-websocket after authentication.</pre></td></tr><tr><td class='line-number'><a name='L109' href='#L109'><pre>109</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> #[error(&quot;didn&apos;t receive a `Identified` message&quot;)]</pre></td></tr><tr><td class='line-number'><a name='L110' href='#L110'><pre>110</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> NoIdentified,</pre></td></tr><tr><td class='line-number'><a name='L111' href='#L111'><pre>111</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>}</pre></td></tr><tr><td class='line-number'><a name='L112' href='#L112'><pre>112</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L113' href='#L113'><pre>113</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>pub(super) async fn handshake(</pre></td></tr><tr><td class='line-number'><a name='L114' href='#L114'><pre>114</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> write: &amp;mut (impl Sink&lt;Message, Error = tokio_tungstenite::tungstenite::Error&gt; + Unpin),</pre></td></tr><tr><td class='line-number'><a name='L115' href='#L115'><pre>115</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> read: &amp;mut (impl Stream&lt;Item = tokio_tungstenite::tungstenite::Result&lt;Message&gt;&gt; + Unpin),</pre></td></tr><tr><td class='line-number'><a name='L116' href='#L116'><pre>116</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> password: Option&lt;&amp;str&gt;,</pre></td></tr><tr><td class='line-number'><a name='L117' href='#L117'><pre>117</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> event_subscriptions: Option&lt;EventSubscription&gt;,</pre></td></tr><tr><td class='line-number'><a name='L118' href='#L118'><pre>118</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>) -&gt; Result&lt;(), HandshakeError&gt; {</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>obws::client::connection::handshake::&lt;futures_util::stream::stream::split::SplitSink&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;, tungstenite::protocol::message::Message&gt;, futures_util::stream::stream::split::SplitStream&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;&gt;&gt;</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L113' href='#L113'><pre>113</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>pub(super) async fn handshake(</pre></td></tr><tr><td class='line-number'><a name='L114' href='#L114'><pre>114</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> write: &amp;mut (impl Sink&lt;Message, Error = tokio_tungstenite::tungstenite::Error&gt; + Unpin),</pre></td></tr><tr><td class='line-number'><a name='L115' href='#L115'><pre>115</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> read: &amp;mut (impl Stream&lt;Item = tokio_tungstenite::tungstenite::Result&lt;Message&gt;&gt; + Unpin),</pre></td></tr><tr><td class='line-number'><a name='L116' href='#L116'><pre>116</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> password: Option&lt;&amp;str&gt;,</pre></td></tr><tr><td class='line-number'><a name='L117' href='#L117'><pre>117</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> event_subscriptions: Option&lt;EventSubscription&gt;,</pre></td></tr><tr><td class='line-number'><a name='L118' href='#L118'><pre>118</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>) -&gt; Result&lt;(), HandshakeError&gt; {</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::&lt;_, _&gt;</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::&lt;_, _&gt;</pre></div></div></td></tr><tr><td class='line-number'><a name='L119' href='#L119'><pre>119</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> async fn read_message(</pre></td></tr><tr><td class='line-number'><a name='L120' href='#L120'><pre>120</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> read: &amp;mut (impl Stream&lt;Item = tokio_tungstenite::tungstenite::Result&lt;Message&gt;&gt; + Unpin),</pre></td></tr><tr><td class='line-number'><a name='L121' href='#L121'><pre>121</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> ) -&gt; Result&lt;ServerMessage, HandshakeError&gt; {</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>obws::client::connection::handshake::{closure#0}::read_message::&lt;futures_util::stream::stream::split::SplitStream&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;&gt;&gt;</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L119' href='#L119'><pre>119</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> async fn read_message(</pre></td></tr><tr><td class='line-number'><a name='L120' href='#L120'><pre>120</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> read: &amp;mut (impl Stream&lt;Item = tokio_tungstenite::tungstenite::Result&lt;Message&gt;&gt; + Unpin),</pre></td></tr><tr><td class='line-number'><a name='L121' href='#L121'><pre>121</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> ) -&gt; Result&lt;ServerMessage, HandshakeError&gt; {</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::{closure#0}::read_message::&lt;_&gt;</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::{closure#0}::read_message::&lt;_&gt;</pre></div></div></td></tr><tr><td class='line-number'><a name='L122' href='#L122'><pre>122</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> let message = read</pre></td></tr><tr><td class='line-number'><a name='L123' href='#L123'><pre>123</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .next()</pre></td></tr><tr><td class='line-number'><a name='L124' href='#L124'><pre>124</pre></a></td><td class='covered-line'><pre>23</pre></td><td class='code'><pre> .await</pre></td></tr><tr><td class='line-number'><a name='L125' href='#L125'><pre>125</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .ok_or(HandshakeError::ConnectionClosed)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div></pre></td></tr><tr><td class='line-number'><a name='L126' href='#L126'><pre>126</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .map_err(HandshakeError::Receive)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div></pre></td></tr><tr><td class='line-number'><a name='L127' href='#L127'><pre>127</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .into_text()</pre></td></tr><tr><td class='line-number'><a name='L128' href='#L128'><pre>128</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .map_err(HandshakeError::IntoText)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div>;</pre></td></tr><tr><td class='line-number'><a name='L129' href='#L129'><pre>129</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L130' href='#L130'><pre>130</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> serde_json::from_str::&lt;ServerMessage&gt;(&amp;message).map_err(HandshakeError::DeserializeMessage)</pre></td></tr><tr><td class='line-number'><a name='L131' href='#L131'><pre>131</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> }</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>obws::client::connection::handshake::{closure#0}::read_message::&lt;futures_util::stream::stream::split::SplitStream&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;&gt;&gt;::{closure#0}</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L122' href='#L122'><pre>122</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> let message = read</pre></td></tr><tr><td class='line-number'><a name='L123' href='#L123'><pre>123</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .next()</pre></td></tr><tr><td class='line-number'><a name='L124' href='#L124'><pre>124</pre></a></td><td class='covered-line'><pre>23</pre></td><td class='code'><pre> .await</pre></td></tr><tr><td class='line-number'><a name='L125' href='#L125'><pre>125</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .ok_or(HandshakeError::ConnectionClosed)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div></pre></td></tr><tr><td class='line-number'><a name='L126' href='#L126'><pre>126</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .map_err(HandshakeError::Receive)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div></pre></td></tr><tr><td class='line-number'><a name='L127' href='#L127'><pre>127</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .into_text()</pre></td></tr><tr><td class='line-number'><a name='L128' href='#L128'><pre>128</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> .map_err(HandshakeError::IntoText)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div>;</pre></td></tr><tr><td class='line-number'><a name='L129' href='#L129'><pre>129</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L130' href='#L130'><pre>130</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> serde_json::from_str::&lt;ServerMessage&gt;(&amp;message).map_err(HandshakeError::DeserializeMessage)</pre></td></tr><tr><td class='line-number'><a name='L131' href='#L131'><pre>131</pre></a></td><td class='covered-line'><pre>36</pre></td><td class='code'><pre> }</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::{closure#0}::read_message::&lt;_&gt;::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::{closure#0}::read_message::&lt;_&gt;::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L132' href='#L132'><pre>132</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L133' href='#L133'><pre>133</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> match read_message(read)<div class='tooltip'>.await<span class='tooltip-content'>5</span></div><div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div> {</pre></td></tr><tr><td class='line-number'><a name='L134' href='#L134'><pre>134</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> ServerMessage::Hello(Hello {</pre></td></tr><tr><td class='line-number'><a name='L135' href='#L135'><pre>135</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> obs_web_socket_version: _,</pre></td></tr><tr><td class='line-number'><a name='L136' href='#L136'><pre>136</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> rpc_version,</pre></td></tr><tr><td class='line-number'><a name='L137' href='#L137'><pre>137</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> authentication,</pre></td></tr><tr><td class='line-number'><a name='L138' href='#L138'><pre>138</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> }) =&gt; {</pre></td></tr><tr><td class='line-number'><a name='L139' href='#L139'><pre>139</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> let authentication = authentication.zip(password).map(|(auth, password)| {</pre></td></tr><tr><td class='line-number'><a name='L140' href='#L140'><pre>140</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> create_auth_response(&amp;auth.challenge, &amp;auth.salt, password)</pre></td></tr><tr><td class='line-number'><a name='L141' href='#L141'><pre>141</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> });</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>obws::client::connection::handshake::&lt;futures_util::stream::stream::split::SplitSink&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;, tungstenite::protocol::message::Message&gt;, futures_util::stream::stream::split::SplitStream&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;&gt;&gt;::{closure#0}::{closure#0}</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L139' href='#L139'><pre>139</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> let authentication = authentication.zip(password).map(|(auth, password)| {</pre></td></tr><tr><td class='line-number'><a name='L140' href='#L140'><pre>140</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> create_auth_response(&amp;auth.challenge, &amp;auth.salt, password)</pre></td></tr><tr><td class='line-number'><a name='L141' href='#L141'><pre>141</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> });</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::&lt;_, _&gt;::{closure#0}::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::&lt;_, _&gt;::{closure#0}::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L142' href='#L142'><pre>142</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L143' href='#L143'><pre>143</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> let req = serde_json::to_string(&amp;ClientRequest::Identify(Identify {</pre></td></tr><tr><td class='line-number'><a name='L144' href='#L144'><pre>144</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> rpc_version,</pre></td></tr><tr><td class='line-number'><a name='L145' href='#L145'><pre>145</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> authentication,</pre></td></tr><tr><td class='line-number'><a name='L146' href='#L146'><pre>146</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> event_subscriptions,</pre></td></tr><tr><td class='line-number'><a name='L147' href='#L147'><pre>147</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> }))</pre></td></tr><tr><td class='line-number'><a name='L148' href='#L148'><pre>148</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> .map_err(HandshakeError::SerializeMessage)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div>;</pre></td></tr><tr><td class='line-number'><a name='L149' href='#L149'><pre>149</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L150' href='#L150'><pre>150</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> write</pre></td></tr><tr><td class='line-number'><a name='L151' href='#L151'><pre>151</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> .send(Message::Text(req))<span class='red'></span></pre></td></tr><tr><td class='line-number'><a name='L152' href='#L152'><pre>152</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> .await</span></pre></td></tr><tr><td class='line-number'><a name='L153' href='#L153'><pre>153</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> .map_err(HandshakeError::Send)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div>;</pre></td></tr><tr><td class='line-number'><a name='L154' href='#L154'><pre>154</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }</pre></td></tr><tr><td class='line-number'><a name='L155' href='#L155'><pre>155</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> _ =&gt; return <span class='red'>Err(HandshakeError::NoHello)</span>,</pre></td></tr><tr><td class='line-number'><a name='L156' href='#L156'><pre>156</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }</pre></td></tr><tr><td class='line-number'><a name='L157' href='#L157'><pre>157</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L158' href='#L158'><pre>158</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> match read_message(read).await<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div> {</pre></td></tr><tr><td class='line-number'><a name='L159' href='#L159'><pre>159</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> ServerMessage::Identified(Identified {</pre></td></tr><tr><td class='line-number'><a name='L160' href='#L160'><pre>160</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> negotiated_rpc_version,</pre></td></tr><tr><td class='line-number'><a name='L161' href='#L161'><pre>161</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }) =&gt; {</pre></td></tr><tr><td class='line-number'><a name='L162' href='#L162'><pre>162</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> debug!(rpc_version = %negotiated_rpc_version, &quot;identified against obs-websocket&quot;);</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>obws::client::connection::handshake::&lt;futures_util::stream::stream::split::SplitSink&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;, tungstenite::protocol::message::Message&gt;, futures_util::stream::stream::split::SplitStream&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;&gt;&gt;::{closure#0}::{closure#1}</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L162' href='#L162'><pre>162</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> debug!(rpc_version = %negotiated_rpc_version, &quot;identified against obs-websocket&quot;);</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::&lt;_, _&gt;::{closure#0}::{closure#1}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::&lt;_, _&gt;::{closure#0}::{closure#1}</pre></div></div></td></tr><tr><td class='line-number'><a name='L163' href='#L163'><pre>163</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }</pre></td></tr><tr><td class='line-number'><a name='L164' href='#L164'><pre>164</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> _ =&gt; return <span class='red'>Err(HandshakeError::NoIdentified)</span>,</pre></td></tr><tr><td class='line-number'><a name='L165' href='#L165'><pre>165</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }</pre></td></tr><tr><td class='line-number'><a name='L166' href='#L166'><pre>166</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L167' href='#L167'><pre>167</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> Ok(())</pre></td></tr><tr><td class='line-number'><a name='L168' href='#L168'><pre>168</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>}</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>obws::client::connection::handshake::&lt;futures_util::stream::stream::split::SplitSink&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;, tungstenite::protocol::message::Message&gt;, futures_util::stream::stream::split::SplitStream&lt;tokio_tungstenite::WebSocketStream&lt;tokio_tungstenite::stream::MaybeTlsStream&lt;tokio::net::tcp::stream::TcpStream&gt;&gt;&gt;&gt;::{closure#0}</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L133' href='#L133'><pre>133</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> match read_message(read)<div class='tooltip'>.await<span class='tooltip-content'>5</span></div><div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div> {</pre></td></tr><tr><td class='line-number'><a name='L134' href='#L134'><pre>134</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> ServerMessage::Hello(Hello {</pre></td></tr><tr><td class='line-number'><a name='L135' href='#L135'><pre>135</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> obs_web_socket_version: _,</pre></td></tr><tr><td class='line-number'><a name='L136' href='#L136'><pre>136</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> rpc_version,</pre></td></tr><tr><td class='line-number'><a name='L137' href='#L137'><pre>137</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> authentication,</pre></td></tr><tr><td class='line-number'><a name='L138' href='#L138'><pre>138</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> }) =&gt; {</pre></td></tr><tr><td class='line-number'><a name='L139' href='#L139'><pre>139</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> let authentication = authentication.zip(password).map(|(auth, password)| {</pre></td></tr><tr><td class='line-number'><a name='L140' href='#L140'><pre>140</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> create_auth_response(&amp;auth.challenge, &amp;auth.salt, password)</pre></td></tr><tr><td class='line-number'><a name='L141' href='#L141'><pre>141</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> });</pre></td></tr><tr><td class='line-number'><a name='L142' href='#L142'><pre>142</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L143' href='#L143'><pre>143</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> let req = serde_json::to_string(&amp;ClientRequest::Identify(Identify {</pre></td></tr><tr><td class='line-number'><a name='L144' href='#L144'><pre>144</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> rpc_version,</pre></td></tr><tr><td class='line-number'><a name='L145' href='#L145'><pre>145</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> authentication,</pre></td></tr><tr><td class='line-number'><a name='L146' href='#L146'><pre>146</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> event_subscriptions,</pre></td></tr><tr><td class='line-number'><a name='L147' href='#L147'><pre>147</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> }))</pre></td></tr><tr><td class='line-number'><a name='L148' href='#L148'><pre>148</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> .map_err(HandshakeError::SerializeMessage)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div>;</pre></td></tr><tr><td class='line-number'><a name='L149' href='#L149'><pre>149</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L150' href='#L150'><pre>150</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> write</pre></td></tr><tr><td class='line-number'><a name='L151' href='#L151'><pre>151</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> .send(Message::Text(req))<span class='red'></span></pre></td></tr><tr><td class='line-number'><a name='L152' href='#L152'><pre>152</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre><span class='red'> .await</span></pre></td></tr><tr><td class='line-number'><a name='L153' href='#L153'><pre>153</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> .map_err(HandshakeError::Send)<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div>;</pre></td></tr><tr><td class='line-number'><a name='L154' href='#L154'><pre>154</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }</pre></td></tr><tr><td class='line-number'><a name='L155' href='#L155'><pre>155</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> _ =&gt; return <span class='red'>Err(HandshakeError::NoHello)</span>,</pre></td></tr><tr><td class='line-number'><a name='L156' href='#L156'><pre>156</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }</pre></td></tr><tr><td class='line-number'><a name='L157' href='#L157'><pre>157</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L158' href='#L158'><pre>158</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> match read_message(read).await<div class='tooltip'><span class='red'>?</span><span class='tooltip-content'>0</span></div> {</pre></td></tr><tr><td class='line-number'><a name='L159' href='#L159'><pre>159</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> ServerMessage::Identified(Identified {</pre></td></tr><tr><td class='line-number'><a name='L160' href='#L160'><pre>160</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> negotiated_rpc_version,</pre></td></tr><tr><td class='line-number'><a name='L161' href='#L161'><pre>161</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }) =&gt; {</pre></td></tr><tr><td class='line-number'><a name='L162' href='#L162'><pre>162</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> debug!(rpc_version = %negotiated_rpc_version, &quot;identified against obs-websocket&quot;);</pre></td></tr><tr><td class='line-number'><a name='L163' href='#L163'><pre>163</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }</pre></td></tr><tr><td class='line-number'><a name='L164' href='#L164'><pre>164</pre></a></td><td class='uncovered-line'><pre>0</pre></td><td class='code'><pre> _ =&gt; return <span class='red'>Err(HandshakeError::NoIdentified)</span>,</pre></td></tr><tr><td class='line-number'><a name='L165' href='#L165'><pre>165</pre></a></td><td class='uncovered-line'></td><td class='code'><pre> }</pre></td></tr><tr><td class='line-number'><a name='L166' href='#L166'><pre>166</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L167' href='#L167'><pre>167</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> Ok(())</pre></td></tr><tr><td class='line-number'><a name='L168' href='#L168'><pre>168</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>}</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::&lt;_, _&gt;::{closure#0}</pre></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::handshake::&lt;_, _&gt;::{closure#0}</pre></div></div></td></tr><tr><td class='line-number'><a name='L169' href='#L169'><pre>169</pre></a></td><td class='uncovered-line'></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L170' href='#L170'><pre>170</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>fn create_auth_response(challenge: &amp;str, salt: &amp;str, password: &amp;str) -&gt; String {</pre></td></tr><tr><td class='line-number'><a name='L171' href='#L171'><pre>171</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> use sha2::{Digest, Sha256};</pre></td></tr><tr><td class='line-number'><a name='L172' href='#L172'><pre>172</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L173' href='#L173'><pre>173</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> let mut hasher = Sha256::new();</pre></td></tr><tr><td class='line-number'><a name='L174' href='#L174'><pre>174</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> hasher.update(password.as_bytes());</pre></td></tr><tr><td class='line-number'><a name='L175' href='#L175'><pre>175</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> hasher.update(salt.as_bytes());</pre></td></tr><tr><td class='line-number'><a name='L176' href='#L176'><pre>176</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L177' href='#L177'><pre>177</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> let mut auth = String::with_capacity(Sha256::output_size() * 4 / 3 + 4);</pre></td></tr><tr><td class='line-number'><a name='L178' href='#L178'><pre>178</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L179' href='#L179'><pre>179</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> base64::encode_config_buf(hasher.finalize_reset(), base64::STANDARD, &amp;mut auth);</pre></td></tr><tr><td class='line-number'><a name='L180' href='#L180'><pre>180</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L181' href='#L181'><pre>181</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> hasher.update(auth.as_bytes());</pre></td></tr><tr><td class='line-number'><a name='L182' href='#L182'><pre>182</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> hasher.update(challenge.as_bytes());</pre></td></tr><tr><td class='line-number'><a name='L183' href='#L183'><pre>183</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> auth.clear();</pre></td></tr><tr><td class='line-number'><a name='L184' href='#L184'><pre>184</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L185' href='#L185'><pre>185</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> base64::encode_config_buf(hasher.finalize(), base64::STANDARD, &amp;mut auth);</pre></td></tr><tr><td class='line-number'><a name='L186' href='#L186'><pre>186</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L187' href='#L187'><pre>187</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> auth</pre></td></tr><tr><td class='line-number'><a name='L188' href='#L188'><pre>188</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>}</pre><div class='expansion-view'><div class='centered'><table><div class='source-name-title'><pre>obws::client::connection::create_auth_response</pre></div><tr><td><pre>Line</pre></td><td><pre>Count</pre></td><td><pre>Source</pre></td></tr><tr><td class='line-number'><a name='L170' href='#L170'><pre>170</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>fn create_auth_response(challenge: &amp;str, salt: &amp;str, password: &amp;str) -&gt; String {</pre></td></tr><tr><td class='line-number'><a name='L171' href='#L171'><pre>171</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> use sha2::{Digest, Sha256};</pre></td></tr><tr><td class='line-number'><a name='L172' href='#L172'><pre>172</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L173' href='#L173'><pre>173</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> let mut hasher = Sha256::new();</pre></td></tr><tr><td class='line-number'><a name='L174' href='#L174'><pre>174</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> hasher.update(password.as_bytes());</pre></td></tr><tr><td class='line-number'><a name='L175' href='#L175'><pre>175</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> hasher.update(salt.as_bytes());</pre></td></tr><tr><td class='line-number'><a name='L176' href='#L176'><pre>176</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L177' href='#L177'><pre>177</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> let mut auth = String::with_capacity(Sha256::output_size() * 4 / 3 + 4);</pre></td></tr><tr><td class='line-number'><a name='L178' href='#L178'><pre>178</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L179' href='#L179'><pre>179</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> base64::encode_config_buf(hasher.finalize_reset(), base64::STANDARD, &amp;mut auth);</pre></td></tr><tr><td class='line-number'><a name='L180' href='#L180'><pre>180</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L181' href='#L181'><pre>181</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> hasher.update(auth.as_bytes());</pre></td></tr><tr><td class='line-number'><a name='L182' href='#L182'><pre>182</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> hasher.update(challenge.as_bytes());</pre></td></tr><tr><td class='line-number'><a name='L183' href='#L183'><pre>183</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> auth.clear();</pre></td></tr><tr><td class='line-number'><a name='L184' href='#L184'><pre>184</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L185' href='#L185'><pre>185</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> base64::encode_config_buf(hasher.finalize(), base64::STANDARD, &amp;mut auth);</pre></td></tr><tr><td class='line-number'><a name='L186' href='#L186'><pre>186</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre></pre></td></tr><tr><td class='line-number'><a name='L187' href='#L187'><pre>187</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre> auth</pre></td></tr><tr><td class='line-number'><a name='L188' href='#L188'><pre>188</pre></a></td><td class='covered-line'><pre>18</pre></td><td class='code'><pre>}</pre></td></tr></table></div></div><div class='expansion-view'><div class='source-name-title'><pre>Unexecuted instantiation: obws::client::connection::create_auth_response</pre></div></div></td></tr></table></div></body></html>