atagen

macltok

public
Star0
Watch0
49d2c9515895c13c4d06bb0dab072745da0175d6
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git

Blame: src/engine/executor.rs

1fe480c16a3catagen2026-09-26 08:44 UTC1
use std::future::Future;
1fe480c16a3catagen2026-09-26 08:44 UTC2
1fe480c16a3catagen2026-09-26 08:44 UTC3
use futures_util::{StreamExt, stream::FuturesUnordered};
1fe480c16a3catagen2026-09-26 08:44 UTC4
use matrix_sdk::SendOutsideWasm;
1fe480c16a3catagen2026-09-26 08:44 UTC5
pub(super) use matrix_sdk::executor::{AbortHandle, JoinError, JoinHandle, spawn};
1fe480c16a3catagen2026-09-26 08:44 UTC6
1fe480c16a3catagen2026-09-26 08:44 UTC7
#[cfg(not(target_family = "wasm"))]
a319bae745d8atagen2026-09-26 09:59 UTC8
pub(crate) type EngineBoxFuture<'a, T> = futures_util::future::BoxFuture<'a, T>;
1fe480c16a3catagen2026-09-26 08:44 UTC9
#[cfg(target_family = "wasm")]
a319bae745d8atagen2026-09-26 09:59 UTC10
pub(crate) type EngineBoxFuture<'a, T> = futures_util::future::LocalBoxFuture<'a, T>;
1fe480c16a3catagen2026-09-26 08:44 UTC11
1fe480c16a3catagen2026-09-26 08:44 UTC12
#[cfg(not(target_family = "wasm"))]
1fe480c16a3catagen2026-09-26 08:44 UTC13
pub(super) fn is_panic(error: &JoinError) -> bool {
1fe480c16a3catagen2026-09-26 08:44 UTC14
    error.is_panic()
1fe480c16a3catagen2026-09-26 08:44 UTC15
}
1fe480c16a3catagen2026-09-26 08:44 UTC16
7b376d620a3datagen2026-09-26 12:53 UTC17
/// the sdk's wasm join error has no payload, and a real panic traps before it gets here
1fe480c16a3catagen2026-09-26 08:44 UTC18
#[cfg(target_family = "wasm")]
1fe480c16a3catagen2026-09-26 08:44 UTC19
pub(super) fn is_panic(error: &JoinError) -> bool {
1fe480c16a3catagen2026-09-26 08:44 UTC20
    !error.is_cancelled()
1fe480c16a3catagen2026-09-26 08:44 UTC21
}
1fe480c16a3catagen2026-09-26 08:44 UTC22
1fe480c16a3catagen2026-09-26 08:44 UTC23
#[cfg(not(target_family = "wasm"))]
1fe480c16a3catagen2026-09-26 08:44 UTC24
pub(super) fn resume_unwind(error: JoinError) -> ! {
1fe480c16a3catagen2026-09-26 08:44 UTC25
    std::panic::resume_unwind(error.into_panic())
1fe480c16a3catagen2026-09-26 08:44 UTC26
}
1fe480c16a3catagen2026-09-26 08:44 UTC27
1fe480c16a3catagen2026-09-26 08:44 UTC28
#[cfg(target_family = "wasm")]
1fe480c16a3catagen2026-09-26 08:44 UTC29
pub(super) fn resume_unwind(error: JoinError) -> ! {
1fe480c16a3catagen2026-09-26 08:44 UTC30
    panic!("{error}")
1fe480c16a3catagen2026-09-26 08:44 UTC31
}
1fe480c16a3catagen2026-09-26 08:44 UTC32
1fe480c16a3catagen2026-09-26 08:44 UTC33
/// a `JoinSet` that runs on wasm too, and like it aborts whatever's left when dropped
1fe480c16a3catagen2026-09-26 08:44 UTC34
pub(super) struct TaskSet<T: 'static> {
1fe480c16a3catagen2026-09-26 08:44 UTC35
    handles: FuturesUnordered<JoinHandle<T>>,
1fe480c16a3catagen2026-09-26 08:44 UTC36
}
1fe480c16a3catagen2026-09-26 08:44 UTC37
1fe480c16a3catagen2026-09-26 08:44 UTC38
impl<T: 'static> TaskSet<T> {
1fe480c16a3catagen2026-09-26 08:44 UTC39
    pub(super) fn new() -> Self {
1fe480c16a3catagen2026-09-26 08:44 UTC40
        Self {
1fe480c16a3catagen2026-09-26 08:44 UTC41
            handles: FuturesUnordered::new(),
1fe480c16a3catagen2026-09-26 08:44 UTC42
        }
1fe480c16a3catagen2026-09-26 08:44 UTC43
    }
1fe480c16a3catagen2026-09-26 08:44 UTC44
1fe480c16a3catagen2026-09-26 08:44 UTC45
    pub(super) fn spawn(
1fe480c16a3catagen2026-09-26 08:44 UTC46
        &mut self,
1fe480c16a3catagen2026-09-26 08:44 UTC47
        task: impl Future<Output = T> + SendOutsideWasm + 'static,
1fe480c16a3catagen2026-09-26 08:44 UTC48
    ) -> AbortHandle
1fe480c16a3catagen2026-09-26 08:44 UTC49
    where
1fe480c16a3catagen2026-09-26 08:44 UTC50
        T: SendOutsideWasm,
1fe480c16a3catagen2026-09-26 08:44 UTC51
    {
1fe480c16a3catagen2026-09-26 08:44 UTC52
        let handle = spawn(task);
1fe480c16a3catagen2026-09-26 08:44 UTC53
        let abort = handle.abort_handle();
1fe480c16a3catagen2026-09-26 08:44 UTC54
        self.handles.push(handle);
1fe480c16a3catagen2026-09-26 08:44 UTC55
        abort
1fe480c16a3catagen2026-09-26 08:44 UTC56
    }
1fe480c16a3catagen2026-09-26 08:44 UTC57
1fe480c16a3catagen2026-09-26 08:44 UTC58
    pub(super) fn is_empty(&self) -> bool {
1fe480c16a3catagen2026-09-26 08:44 UTC59
        self.handles.is_empty()
1fe480c16a3catagen2026-09-26 08:44 UTC60
    }
1fe480c16a3catagen2026-09-26 08:44 UTC61
1fe480c16a3catagen2026-09-26 08:44 UTC62
    pub(super) async fn join_next(&mut self) -> Option<Result<T, JoinError>> {
1fe480c16a3catagen2026-09-26 08:44 UTC63
        self.handles.next().await
1fe480c16a3catagen2026-09-26 08:44 UTC64
    }
1fe480c16a3catagen2026-09-26 08:44 UTC65
1fe480c16a3catagen2026-09-26 08:44 UTC66
    fn abort_all(&self) {
1fe480c16a3catagen2026-09-26 08:44 UTC67
        for handle in &self.handles {
1fe480c16a3catagen2026-09-26 08:44 UTC68
            handle.abort();
1fe480c16a3catagen2026-09-26 08:44 UTC69
        }
1fe480c16a3catagen2026-09-26 08:44 UTC70
    }
1fe480c16a3catagen2026-09-26 08:44 UTC71
1fe480c16a3catagen2026-09-26 08:44 UTC72
    pub(super) async fn shutdown(&mut self) {
1fe480c16a3catagen2026-09-26 08:44 UTC73
        self.abort_all();
1fe480c16a3catagen2026-09-26 08:44 UTC74
        while self.handles.next().await.is_some() {}
1fe480c16a3catagen2026-09-26 08:44 UTC75
    }
1fe480c16a3catagen2026-09-26 08:44 UTC76
}
1fe480c16a3catagen2026-09-26 08:44 UTC77
1fe480c16a3catagen2026-09-26 08:44 UTC78
impl<T: 'static> Drop for TaskSet<T> {
1fe480c16a3catagen2026-09-26 08:44 UTC79
    fn drop(&mut self) {
1fe480c16a3catagen2026-09-26 08:44 UTC80
        self.abort_all();
1fe480c16a3catagen2026-09-26 08:44 UTC81
    }
1fe480c16a3catagen2026-09-26 08:44 UTC82
}
a5865326c81batagen2026-10-26 06:44 UTC83
a5865326c81batagen2026-10-26 06:44 UTC84
/// a store cipher's pbkdf2 holds its thread for over a second in a debug build, so natively it
a5865326c81batagen2026-10-26 06:44 UTC85
/// runs beside the runtime and two stores can derive at once
a5865326c81batagen2026-10-26 06:44 UTC86
#[cfg(not(target_family = "wasm"))]
a5865326c81batagen2026-10-26 06:44 UTC87
pub(crate) async fn derive<T: Send + 'static>(work: impl FnOnce() -> T + Send + 'static) -> T {
a5865326c81batagen2026-10-26 06:44 UTC88
    tokio::task::spawn_blocking(work)
a5865326c81batagen2026-10-26 06:44 UTC89
        .await
a5865326c81batagen2026-10-26 06:44 UTC90
        .unwrap_or_else(|error| std::panic::resume_unwind(error.into_panic()))
a5865326c81batagen2026-10-26 06:44 UTC91
}
a5865326c81batagen2026-10-26 06:44 UTC92
a5865326c81batagen2026-10-26 06:44 UTC93
#[cfg(target_family = "wasm")]
a5865326c81batagen2026-10-26 06:44 UTC94
pub(crate) async fn derive<T>(work: impl FnOnce() -> T) -> T {
a5865326c81batagen2026-10-26 06:44 UTC95
    work()
a5865326c81batagen2026-10-26 06:44 UTC96
}
2819830aef32atagen2026-10-26 08:42 UTC97
2819830aef32atagen2026-10-26 08:42 UTC98
/// a command's variant path such as `Room(Open`, cut off before any content reaches a log
2819830aef32atagen2026-10-26 08:42 UTC99
pub(crate) fn label(command: &impl std::fmt::Debug) -> String {
2819830aef32atagen2026-10-26 08:42 UTC100
    use std::fmt::Write;
2819830aef32atagen2026-10-26 08:42 UTC101
2819830aef32atagen2026-10-26 08:42 UTC102
    struct Label(String);
2819830aef32atagen2026-10-26 08:42 UTC103
    impl Write for Label {
2819830aef32atagen2026-10-26 08:42 UTC104
        fn write_str(&mut self, text: &str) -> std::fmt::Result {
2819830aef32atagen2026-10-26 08:42 UTC105
            for character in text.chars() {
2819830aef32atagen2026-10-26 08:42 UTC106
                if !(character.is_alphanumeric() || character == '_' || character == '(') {
2819830aef32atagen2026-10-26 08:42 UTC107
                    return Err(std::fmt::Error);
2819830aef32atagen2026-10-26 08:42 UTC108
                }
2819830aef32atagen2026-10-26 08:42 UTC109
                self.0.push(character);
2819830aef32atagen2026-10-26 08:42 UTC110
            }
2819830aef32atagen2026-10-26 08:42 UTC111
            Ok(())
2819830aef32atagen2026-10-26 08:42 UTC112
        }
2819830aef32atagen2026-10-26 08:42 UTC113
    }
2819830aef32atagen2026-10-26 08:42 UTC114
    let mut label = Label(String::new());
2819830aef32atagen2026-10-26 08:42 UTC115
    let _ = write!(label, "{command:?}");
2819830aef32atagen2026-10-26 08:42 UTC116
    label.0.trim_end_matches('(').to_owned()
2819830aef32atagen2026-10-26 08:42 UTC117
}