1#[cfg(feature = "websockets")]
17use futures_util::StreamExt;
18#[cfg(feature = "websockets")]
19use jmap_client::{client::Client, client_ws::WebSocketMessage, core::set::SetObject};
20#[cfg(feature = "websockets")]
21use tokio::sync::mpsc;
22
23#[cfg(feature = "websockets")]
25async fn websocket() {
26 let client = Client::new()
28 .credentials(("john@example.org", "secret"))
29 .connect("https://jmap.example.org")
30 .await
31 .unwrap();
32
33 let mut ws_stream = client.connect_ws().await.unwrap();
35
36 let (stream_tx, mut stream_rx) = mpsc::channel::<WebSocketMessage>(100);
38 tokio::spawn(async move {
39 while let Some(change) = ws_stream.next().await {
40 stream_tx.send(change.unwrap()).await.unwrap();
41 }
42 });
43
44 let mut request = client.build();
46 let create_id = request
47 .set_mailbox()
48 .create()
49 .name("WebSocket Test")
50 .create_id()
51 .unwrap();
52 let request_id = request.send_ws().await.unwrap();
53
54 let mailbox_id = if let Some(WebSocketMessage::Response(mut response)) = stream_rx.recv().await
56 {
57 assert_eq!(request_id, response.request_id().unwrap());
58 response
59 .pop_method_response()
60 .unwrap()
61 .unwrap_set_mailbox()
62 .unwrap()
63 .created(&create_id)
64 .unwrap()
65 .take_id()
66 } else {
67 unreachable!()
68 };
69
70 client
72 .enable_push_ws(None::<Vec<_>>, None::<&str>)
73 .await
74 .unwrap();
75
76 client
78 .mailbox_update_sort_order(&mailbox_id, 1)
79 .await
80 .unwrap();
81 if let Some(WebSocketMessage::StateChange(changes)) = stream_rx.recv().await {
82 println!("Received changes: {:?}", changes);
83 } else {
84 unreachable!()
85 }
86}
87
88fn main() {
89 #[cfg(feature = "websockets")]
90 let _c = websocket();
91}