mirror of https://github.com/tauri-apps/tauri
chore(merge) feature/serverless (#7)
* feat(template) serverless code for JS and CSS loading * fix(ffi) define struct (#5) Per Boscops self-raised, but never merged issue https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs Basically removes potentially undefined behavior
This commit is contained in:
parent
19c5d410de
commit
b9cc35ca39
|
@ -5,7 +5,8 @@ extern crate bitflags;
|
|||
|
||||
use std::os::raw::*;
|
||||
|
||||
pub enum CWebView {} // opaque type, only used in ffi pointers
|
||||
// https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs
|
||||
#[repr(C)] pub struct CWebView { _private: [u8; 0] }
|
||||
|
||||
type ErasedExternalInvokeFn = extern "C" fn(webview: *mut CWebView, arg: *const c_char);
|
||||
type ErasedDispatchFn = extern "C" fn(webview: *mut CWebView, arg: *mut c_void);
|
||||
|
|
|
@ -26,6 +26,7 @@ includedir_codegen = "0.5.0"
|
|||
|
||||
[features]
|
||||
dev = [] # has no explicit dependencies
|
||||
serverless = [] # has no explicit dependencies
|
||||
|
||||
[package.metadata.bundle]
|
||||
identifier = "com.quasar.dev"
|
||||
|
|
|
@ -22,12 +22,13 @@ use std::thread;
|
|||
mod cmd;
|
||||
|
||||
#[cfg(not(feature = "dev"))]
|
||||
#[cfg(not(feature = "serverless"))]
|
||||
mod server;
|
||||
|
||||
fn main() {
|
||||
let debug;
|
||||
let content;
|
||||
|
||||
let _server_url: String;
|
||||
|
||||
#[cfg(not(feature = "dev"))]
|
||||
{
|
||||
|
@ -61,27 +62,24 @@ fn main() {
|
|||
content = proton_ui::Content::Url(matches.value_of("url").unwrap().to_owned());
|
||||
debug = true;
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "dev"))]
|
||||
{
|
||||
if let Some(available_port) = proton::tcp::get_available_port() {
|
||||
let server_url = format!("{}:{}", "127.0.0.1", available_port);
|
||||
content = proton_ui::Content::Url(format!("http://{}", server_url));
|
||||
debug = cfg!(debug_assertions);
|
||||
|
||||
thread::spawn(move || {
|
||||
let server = tiny_http::Server::http(server_url).unwrap();
|
||||
for request in server.incoming_requests() {
|
||||
let mut url = request.url().to_string();
|
||||
if url == "/" {
|
||||
url = "/index.html".to_string();
|
||||
#[cfg(feature = "serverless")]
|
||||
{
|
||||
content = proton_ui::Content::Html(include_str!("../target/compiled-web/index.html"));
|
||||
}
|
||||
request.respond(server::asset_response(&url)).unwrap();
|
||||
}
|
||||
});
|
||||
#[cfg(not(feature = "serverless"))]
|
||||
{
|
||||
if let Some(available_port) = proton::tcp::get_available_port() {
|
||||
_server_url = format!("{}:{}", "127.0.0.1", available_port);
|
||||
content = proton_ui::Content::Url(format!("http://{}", _server_url));
|
||||
} else {
|
||||
panic!("Could not find an open port");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let webview = proton_ui::builder()
|
||||
.title("MyAppTitle")
|
||||
|
@ -113,5 +111,31 @@ fn main() {
|
|||
.build()
|
||||
.unwrap();
|
||||
|
||||
#[cfg(not(feature = "dev"))]
|
||||
{
|
||||
#[cfg(feature = "serverless")]
|
||||
{
|
||||
let handle = webview.handle();
|
||||
handle.dispatch(move |_webview| {
|
||||
_webview.inject_css(include_str!("../target/compiled-web/css/app.css")).unwrap();
|
||||
_webview.eval(include_str!("../target/compiled-web/js/app.js"))
|
||||
}).unwrap();
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "serverless"))]
|
||||
{
|
||||
thread::spawn(move || {
|
||||
let server = tiny_http::Server::http(_server_url).unwrap();
|
||||
for request in server.incoming_requests() {
|
||||
let mut url = request.url().to_string();
|
||||
if url == "/" {
|
||||
url = "/index.html".to_string();
|
||||
}
|
||||
request.respond(server::asset_response(&url)).unwrap();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
webview.run().unwrap();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue