1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
use crate::{ import::* }; /// Events related to the WebSocket. You can filter like: /// /// ``` /// use ///{ /// ws_stream_wasm :: * , /// pharos :: * , /// wasm_bindgen :: UnwrapThrowExt , /// wasm_bindgen_futures :: futures_0_3::spawn_local , /// futures :: stream::StreamExt , ///}; /// ///let program = async ///{ /// let (mut ws, _wsio) = WsStream::connect( "127.0.0.1:3012", None ).await /// /// .expect_throw( "assume the connection succeeds" ); /// /// // The Filter type comes from the pharos crate. /// // /// let mut evts = ws.observe( Filter::Pointer( WsEvent::is_closed ).into() ); /// /// ws.close().await; /// /// // Note we will only get the closed event here, the WsEvent::Closing has been filtered out. /// // /// assert!( evts.next().await.unwrap_throw().is_closed () ); ///}; /// ///spawn_local( program ); ///``` // #[ derive( Clone, Debug, PartialEq, Eq ) ] // pub enum WsEvent { /// The connection is now Open // Open, /// An error happened on the connection. For more information about when this event /// occurs, see the [HTML Living Standard](https://html.spec.whatwg.org/multipage/web-sockets.html). // Error, /// The connection has started closing, but is not closed yet. // Closing, /// The connection was closed. This enclosed CloseEvent has some extra information. // Closed( CloseEvent ), } impl WsEvent { /// Predicate indicating whether this is a [WsEvent::Open] event. Can be used as a filter for the /// event stream obtained with [`WsStream::observe`]. // pub fn is_open( &self ) -> bool { match self { Self::Open => true, _ => false, } } /// Predicate indicating whether this is a [WsEvent::Error] event. Can be used as a filter for the /// event stream obtained with [`WsStream::observe`]. // pub fn is_err( &self ) -> bool { match self { Self::Error => true, _ => false, } } /// Predicate indicating whether this is a [WsEvent::Closing] event. Can be used as a filter for the /// event stream obtained with [`WsStream::observe`]. // pub fn is_closing( &self ) -> bool { match self { Self::Closing => true, _ => false, } } /// Predicate indicating whether this is a [WsEvent::Closed] event. Can be used as a filter for the /// event stream obtained with [`WsStream::observe`]. // pub fn is_closed( &self ) -> bool { match self { Self::Closed(_) => true, _ => false, } } } /// An event holding information about how the connection was closed. /// // We use this wrapper because the web_sys version isn't Send and pharos requires events // to be Send. // #[ derive( Clone, Debug, PartialEq, Eq ) ] // pub struct CloseEvent { /// The close code /// See: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close) // pub code : u16 , /// The reason why the connection was closed /// See: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close) // pub reason : String , /// Whether the connection was closed cleanly /// See: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close) // pub was_clean: bool , } impl From<JsCloseEvt> for CloseEvent { fn from( js_evt: JsCloseEvt ) -> Self { Self { code : js_evt.code () , reason : js_evt.reason () , was_clean: js_evt.was_clean() , } } }