| 1 | //! a browser-side slice of macltok, login through to a live sync, exported for |
| 2 | //! wasm-bindgen so both the worker test and the size measurement reach the same code |
| 3 | |
| 4 | use futures_channel::oneshot; |
| 5 | use macltok::{ |
| 6 | ConnectionState, EncryptedSessionStore, EngineConfig, Event, PasswordLogin, Session, StoreConfig, |
| 7 | }; |
| 8 | use wasm_bindgen::prelude::*; |
| 9 | |
| 10 | #[wasm_bindgen] |
| 11 | pub async fn smoke( |
| 12 | homeserver: String, |
| 13 | username: String, |
| 14 | password: String, |
| 15 | store_name: String, |
| 16 | ) -> Result<(), JsError> { |
| 17 | let sessions = EncryptedSessionStore::indexeddb( |
| 18 | StoreConfig::indexeddb(store_name, "macltok-web").with_lock_holder("macltok-web-worker"), |
| 19 | ); |
| 20 | let login = PasswordLogin::new(homeserver, username, password); |
| 21 | let session = Session::login_password(login, &sessions).await?; |
| 22 | let (engine, handle, mut events) = session.build(EngineConfig::default()).await?; |
| 23 | let (done, running) = oneshot::channel(); |
| 24 | wasm_bindgen_futures::spawn_local(async move { |
| 25 | let _ = done.send(engine.run().await); |
| 26 | }); |
| 27 | |
| 28 | let mut online = false; |
| 29 | let mut rooms = false; |
| 30 | while !(online && rooms) { |
| 31 | match events.recv().await { |
| 32 | Some(Event::ConnectionChanged(ConnectionState::Online)) => online = true, |
| 33 | Some(Event::RoomsChanged) => rooms = true, |
| 34 | Some(Event::Stopped) | None => { |
| 35 | return Err(JsError::new("engine stopped before it came online")); |
| 36 | } |
| 37 | Some(_) => {} |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | handle.shutdown().await?; |
| 42 | while events.recv().await.is_some() {} |
| 43 | running |
| 44 | .await |
| 45 | .map_err(|_| JsError::new("engine task vanished"))??; |
| 46 | Ok(()) |
| 47 | } |