atagen

macltok

public
Star0
Watch0
0b8ce8dc9a1cd891cc940f0bf45774256e072f18
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git
harness/web/src/lib.rsRust47 lines1.6 KB
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
}