mod headers;
mod server;
mod setup;
mod watch;
use setup::{get_preview_id, get_session_id};
use watch::watch_for_changes;
use crate::commands::dev::{socket, Protocol, ServerConfig};
use crate::settings::toml::Target;
use anyhow::Result;
use std::sync::{Arc, Mutex};
use std::thread;
use tokio::runtime::Runtime as TokioRuntime;
use url::Url;
pub fn dev(
target: Target,
server_config: ServerConfig,
local_protocol: Protocol,
verbose: bool,
inspect: bool,
) -> Result<()> {
let session_id = get_session_id()?;
let inspect = if inspect {
Some(target.name.clone())
} else {
None
};
let preview_id = get_preview_id(
target.clone(),
None,
&server_config,
&session_id,
verbose,
)?;
if inspect.is_some() {
let client = reqwest::blocking::Client::builder().build()?;
client
.post("https://prewarm.cloudflareworkers.com/")
.header("CF-EW-Preview", &preview_id)
.body("") .send()?
.error_for_status()?;
}
let preview_id = Arc::new(Mutex::new(preview_id));
{
let session_id = session_id.clone();
let preview_id = preview_id.clone();
let server_config = server_config.clone();
thread::spawn(move || {
watch_for_changes(
target,
&server_config,
Arc::clone(&preview_id),
&session_id,
verbose,
)
});
}
let socket_url = get_socket_url(&session_id)?;
let runtime = TokioRuntime::new()?;
runtime.block_on(async {
let devtools_listener = runtime.spawn(socket::listen(
socket_url.clone(),
server_config.clone(),
inspect,
None,
));
let server = match local_protocol {
Protocol::Https => runtime.spawn(server::https(
server_config.clone(),
Arc::clone(&preview_id),
)),
Protocol::Http => {
runtime.spawn(server::http(server_config.clone(), Arc::clone(&preview_id)))
}
};
let res = tokio::try_join!(async { devtools_listener.await? }, async { server.await? });
match res {
Ok(_) => Ok(()),
Err(e) => Err(e),
}
})
}
fn get_socket_url(session_id: &str) -> Result<Url, url::ParseError> {
Url::parse(&format!(
"wss://cloudflareworkers.com/inspect/{}",
session_id
))
}