use bevy::prelude::*;
use once_cell::sync::OnceCell;
use std::sync::Arc;
use tokio::runtime::{Builder, Runtime};
static RUNTIME: OnceCell<Arc<Runtime>> = OnceCell::new();
fn init_runtime() -> Arc<Runtime> {
Arc::new(
Builder::new_multi_thread()
.enable_all()
.build()
.expect("Failed to build shared Tokio runtime"),
)
}
pub fn runtime() -> &'static Runtime {
RUNTIME.get_or_init(init_runtime)
}
pub fn block_on<F: std::future::Future>(fut: F) -> F::Output {
runtime().block_on(fut)
}
#[derive(Resource, Clone)]
pub struct SharedRuntime {
pub runtime: Arc<Runtime>,
}
pub fn ensure_runtime(app: &mut App) {
if app.world().contains_resource::<SharedRuntime>() {
return;
}
let arc = RUNTIME.get_or_init(init_runtime).clone();
app.insert_resource(SharedRuntime { runtime: arc });
}