|
#![cfg_attr(all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows")] |
|
|
|
use axum::routing::get; |
|
use axum::Router; |
|
use fern::colors::{Color, ColoredLevelConfig}; |
|
use graphite_editor::application::Editor; |
|
use graphite_editor::messages::prelude::*; |
|
use graphite_editor::node_graph_executor::GraphRuntimeRequest; |
|
use graphite_editor::node_graph_executor::NODE_RUNTIME; |
|
use graphite_editor::node_graph_executor::*; |
|
use std::sync::Mutex; |
|
|
|
static NODE_RUNTIME_IO: Mutex<Option<NodeRuntimeIO>> = const { Mutex::new(None) }; |
|
|
|
#[tokio::main] |
|
async fn main() { |
|
println!("Starting server..."); |
|
|
|
let colors = ColoredLevelConfig::new().debug(Color::Magenta).info(Color::Green).error(Color::Red); |
|
|
|
fern::Dispatch::new() |
|
.chain(std::io::stdout()) |
|
.level(log::LevelFilter::Trace) |
|
.level_for("naga", log::LevelFilter::Error) |
|
.level_for("wgpu-hal", log::LevelFilter::Error) |
|
.level_for("wgpu_hal", log::LevelFilter::Error) |
|
.level_for("wgpu_core", log::LevelFilter::Error) |
|
.format(move |out, message, record| { |
|
out.finish(format_args!( |
|
"[{}]{} {} {}", |
|
|
|
colors.color(record.level()), |
|
chrono::Utc::now().format("[%Y-%m-%d %H:%M:%S]"), |
|
message, |
|
record.module_path().unwrap_or("") |
|
)) |
|
}) |
|
.apply() |
|
.unwrap(); |
|
|
|
std::thread::spawn(|| loop { |
|
futures::executor::block_on(graphite_editor::node_graph_executor::run_node_graph()); |
|
std::thread::sleep(std::time::Duration::from_millis(16)) |
|
}); |
|
graphite_editor::application::set_uuid_seed(0); |
|
|
|
let mut runtime_lock = NODE_RUNTIME_IO.lock().unwrap(); |
|
*runtime_lock = Some(NodeRuntimeIO::new()); |
|
drop(runtime_lock); |
|
|
|
let app = Router::new().route("/", get(|| async { "Hello, World!" })); |
|
|
|
|
|
tauri::async_runtime::spawn(async { |
|
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); |
|
axum::serve(listener, app).await.unwrap(); |
|
}); |
|
|
|
tauri::Builder::default() |
|
.plugin(tauri_plugin_http::init()) |
|
.plugin(tauri_plugin_shell::init()) |
|
.invoke_handler(tauri::generate_handler![poll_node_graph, runtime_message]) |
|
.setup(|_app| { |
|
use tauri::Manager; |
|
_app.get_webview_window("main").unwrap().open_devtools(); |
|
Ok(()) |
|
}) |
|
.run(tauri::generate_context!()) |
|
.expect("error while running tauri application"); |
|
} |
|
#[tauri::command] |
|
fn poll_node_graph() -> String { |
|
let vec: Vec<_> = NODE_RUNTIME_IO.lock().as_mut().unwrap().as_mut().unwrap().receive().collect(); |
|
ron::to_string(&vec).unwrap() |
|
} |
|
|
|
#[tauri::command] |
|
fn runtime_message(message: String) -> Result<(), String> { |
|
let message = match ron::from_str(&message) { |
|
Ok(message) => message, |
|
Err(e) => { |
|
log::error!("Failed to deserialize message: {}\nwith error: {}", message, e); |
|
return Err("Failed to deserialize message".into()); |
|
} |
|
}; |
|
let response = NODE_RUNTIME_IO.lock().as_ref().unwrap().as_ref().unwrap().send(message); |
|
response |
|
} |
|
|