Browse Source

add shared array buffer support for dev server as opt config

chaosprint 2 years ago
parent
commit
257465a6d5
6 changed files with 157 additions and 3 deletions
  1. 79 0
      Cargo.lock
  2. 1 1
      Cargo.toml
  3. 5 0
      src/cli/cfg.rs
  4. 1 0
      src/cli/serve/mod.rs
  5. 7 0
      src/config.rs
  6. 64 2
      src/server/mod.rs

+ 79 - 0
Cargo.lock

@@ -49,6 +49,21 @@ dependencies = [
  "memchr",
  "memchr",
 ]
 ]
 
 
+[[package]]
+name = "alloc-no-stdlib"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
+
+[[package]]
+name = "alloc-stdlib"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
+dependencies = [
+ "alloc-no-stdlib",
+]
+
 [[package]]
 [[package]]
 name = "android_system_properties"
 name = "android_system_properties"
 version = "0.1.5"
 version = "0.1.5"
@@ -76,6 +91,20 @@ version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
 checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
 
 
+[[package]]
+name = "async-compression"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a"
+dependencies = [
+ "brotli",
+ "flate2",
+ "futures-core",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
+]
+
 [[package]]
 [[package]]
 name = "async-trait"
 name = "async-trait"
 version = "0.1.64"
 version = "0.1.64"
@@ -241,6 +270,27 @@ dependencies = [
  "generic-array",
  "generic-array",
 ]
 ]
 
 
+[[package]]
+name = "brotli"
+version = "3.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+ "brotli-decompressor",
+]
+
+[[package]]
+name = "brotli-decompressor"
+version = "2.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+]
+
 [[package]]
 [[package]]
 name = "bstr"
 name = "bstr"
 version = "0.2.17"
 version = "0.2.17"
@@ -1521,6 +1571,15 @@ version = "2.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146"
 checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146"
 
 
+[[package]]
+name = "iri-string"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f0f7638c1e223529f1bfdc48c8b133b9e0b434094d1d28473161ee48b235f78"
+dependencies = [
+ "nom",
+]
+
 [[package]]
 [[package]]
 name = "is_executable"
 name = "is_executable"
 version = "0.1.2"
 version = "0.1.2"
@@ -1737,6 +1796,12 @@ dependencies = [
  "unicase",
  "unicase",
 ]
 ]
 
 
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
 [[package]]
 [[package]]
 name = "miniz_oxide"
 name = "miniz_oxide"
 version = "0.6.2"
 version = "0.6.2"
@@ -1823,6 +1888,16 @@ dependencies = [
  "static_assertions",
  "static_assertions",
 ]
 ]
 
 
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
 [[package]]
 [[package]]
 name = "notify"
 name = "notify"
 version = "5.1.0"
 version = "5.1.0"
@@ -2902,6 +2977,8 @@ version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8"
 checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8"
 dependencies = [
 dependencies = [
+ "async-compression",
+ "base64 0.13.1",
  "bitflags",
  "bitflags",
  "bytes",
  "bytes",
  "futures-core",
  "futures-core",
@@ -2910,12 +2987,14 @@ dependencies = [
  "http-body",
  "http-body",
  "http-range-header",
  "http-range-header",
  "httpdate",
  "httpdate",
+ "iri-string",
  "mime",
  "mime",
  "mime_guess",
  "mime_guess",
  "percent-encoding",
  "percent-encoding",
  "pin-project-lite",
  "pin-project-lite",
  "tokio",
  "tokio",
  "tokio-util",
  "tokio-util",
+ "tower",
  "tower-layer",
  "tower-layer",
  "tower-service",
  "tower-service",
  "tracing",
  "tracing",

+ 1 - 1
Cargo.toml

@@ -41,7 +41,7 @@ indicatif = "0.17.0-rc.11"
 subprocess = "0.2.9"
 subprocess = "0.2.9"
 
 
 axum = { version = "0.5.1", features = ["ws", "headers"] }
 axum = { version = "0.5.1", features = ["ws", "headers"] }
-tower-http = { version = "0.2.2", features = ["fs", "trace"] }
+tower-http = { version = "0.2.2", features = ["full"] }
 headers = "0.3.7"
 headers = "0.3.7"
 
 
 walkdir = "2"
 walkdir = "2"

+ 5 - 0
src/cli/cfg.rs

@@ -72,6 +72,11 @@ pub struct ConfigOptsServe {
     #[serde(default)]
     #[serde(default)]
     pub hot_reload: bool,
     pub hot_reload: bool,
 
 
+    /// Build with shared_array_buffer enabled in JS [default: false]
+    #[clap(long)]
+    #[serde(default)]
+    pub shared_array_buffer: bool,
+
     /// Space separated list of features to activate
     /// Space separated list of features to activate
     #[clap(long)]
     #[clap(long)]
     pub features: Option<Vec<String>>,
     pub features: Option<Vec<String>>,

+ 1 - 0
src/cli/serve/mod.rs

@@ -20,6 +20,7 @@ impl Serve {
 
 
         // change the relase state.
         // change the relase state.
         crate_config.with_hot_reload(self.serve.hot_reload);
         crate_config.with_hot_reload(self.serve.hot_reload);
+        crate_config.with_shared_array_buffer(self.serve.shared_array_buffer);
         crate_config.with_release(self.serve.release);
         crate_config.with_release(self.serve.release);
         crate_config.with_verbose(self.serve.verbose);
         crate_config.with_verbose(self.serve.verbose);
 
 

+ 7 - 0
src/config.rs

@@ -146,6 +146,7 @@ pub struct CrateConfig {
     pub dioxus_config: DioxusConfig,
     pub dioxus_config: DioxusConfig,
     pub release: bool,
     pub release: bool,
     pub hot_reload: bool,
     pub hot_reload: bool,
+    pub shared_array_buffer: bool,
     pub verbose: bool,
     pub verbose: bool,
     pub custom_profile: Option<String>,
     pub custom_profile: Option<String>,
     pub features: Option<Vec<String>>,
     pub features: Option<Vec<String>>,
@@ -213,6 +214,7 @@ impl CrateConfig {
             release,
             release,
             dioxus_config,
             dioxus_config,
             hot_reload,
             hot_reload,
+            shared_array_buffer: false,
             custom_profile,
             custom_profile,
             features,
             features,
             verbose,
             verbose,
@@ -234,6 +236,11 @@ impl CrateConfig {
         self
         self
     }
     }
 
 
+    pub fn with_shared_array_buffer(&mut self, shared_array_buffer: bool) -> &mut Self {
+        self.shared_array_buffer = shared_array_buffer;
+        self
+    }
+
     pub fn with_verbose(&mut self, verbose: bool) -> &mut Self {
     pub fn with_verbose(&mut self, verbose: bool) -> &mut Self {
         self.verbose = verbose;
         self.verbose = verbose;
         self
         self

+ 64 - 2
src/server/mod.rs

@@ -2,7 +2,10 @@ use crate::{builder, plugin::PluginManager, serve::Serve, BuildResult, CrateConf
 use axum::{
 use axum::{
     body::{Full, HttpBody},
     body::{Full, HttpBody},
     extract::{ws::Message, Extension, TypedHeader, WebSocketUpgrade},
     extract::{ws::Message, Extension, TypedHeader, WebSocketUpgrade},
-    http::{Response, StatusCode},
+    http::{
+        header::{HeaderName, HeaderValue},
+        Method, Response, StatusCode,
+    },
     response::IntoResponse,
     response::IntoResponse,
     routing::{get, get_service},
     routing::{get, get_service},
     Router,
     Router,
@@ -22,7 +25,10 @@ use std::{
 use tokio::sync::broadcast;
 use tokio::sync::broadcast;
 use tower::ServiceBuilder;
 use tower::ServiceBuilder;
 use tower_http::services::fs::{ServeDir, ServeFileSystemResponseBody};
 use tower_http::services::fs::{ServeDir, ServeFileSystemResponseBody};
-
+use tower_http::{
+    cors::{Any, CorsLayer},
+    ServiceBuilderExt,
+};
 mod proxy;
 mod proxy;
 
 
 pub struct BuildManager {
 pub struct BuildManager {
@@ -264,8 +270,35 @@ pub async fn startup_hot_reload(ip: String, port: u16, config: CrateConfig) -> R
         },
         },
     );
     );
 
 
+    let cors = CorsLayer::new()
+    // allow `GET` and `POST` when accessing the resource
+    .allow_methods([Method::GET, Method::POST])
+    // allow requests from any origin
+    .allow_origin(Any)
+    .allow_headers(Any);
+
+    let (coep, coop) = if config.shared_array_buffer {
+        (
+            HeaderValue::from_static("require-corp"),
+            HeaderValue::from_static("same-origin"),
+        )
+    } else {
+        (
+            HeaderValue::from_static("unsafe-none"),
+            HeaderValue::from_static("unsafe-none"),
+        )
+    };
+
     let file_service_config = config.clone();
     let file_service_config = config.clone();
     let file_service = ServiceBuilder::new()
     let file_service = ServiceBuilder::new()
+        .override_response_header(
+            HeaderName::from_static("cross-origin-embedder-policy"),
+            coep,
+        )
+        .override_response_header(
+            HeaderName::from_static("cross-origin-opener-policy"),
+            coop,
+        )
         .and_then(
         .and_then(
             move |response: Response<ServeFileSystemResponseBody>| async move {
             move |response: Response<ServeFileSystemResponseBody>| async move {
                 let response = if file_service_config
                 let response = if file_service_config
@@ -316,6 +349,7 @@ pub async fn startup_hot_reload(ip: String, port: u16, config: CrateConfig) -> R
 
 
     let router = router
     let router = router
         .route("/_dioxus/hot_reload", get(hot_reload_handler))
         .route("/_dioxus/hot_reload", get(hot_reload_handler))
+        .layer(cors)
         .layer(Extension(ws_reload_state))
         .layer(Extension(ws_reload_state))
         .layer(Extension(hot_reload_state));
         .layer(Extension(hot_reload_state));
 
 
@@ -409,8 +443,35 @@ pub async fn startup_default(ip: String, port: u16, config: CrateConfig) -> Resu
 
 
     PluginManager::on_serve_start(&config)?;
     PluginManager::on_serve_start(&config)?;
 
 
+    let cors = CorsLayer::new()
+    // allow `GET` and `POST` when accessing the resource
+    .allow_methods([Method::GET, Method::POST])
+    // allow requests from any origin
+    .allow_origin(Any)
+    .allow_headers(Any);
+
+    let (coep, coop) = if config.shared_array_buffer {
+        (
+            HeaderValue::from_static("require-corp"),
+            HeaderValue::from_static("same-origin"),
+        )
+    } else {
+        (
+            HeaderValue::from_static("unsafe-none"),
+            HeaderValue::from_static("unsafe-none"),
+        )
+    };
+
     let file_service_config = config.clone();
     let file_service_config = config.clone();
     let file_service = ServiceBuilder::new()
     let file_service = ServiceBuilder::new()
+        .override_response_header(
+            HeaderName::from_static("cross-origin-embedder-policy"),
+            coep,
+        )
+        .override_response_header(
+            HeaderName::from_static("cross-origin-opener-policy"),
+            coop,
+        )
         .and_then(
         .and_then(
             move |response: Response<ServeFileSystemResponseBody>| async move {
             move |response: Response<ServeFileSystemResponseBody>| async move {
                 let response = if file_service_config
                 let response = if file_service_config
@@ -459,6 +520,7 @@ pub async fn startup_default(ip: String, port: u16, config: CrateConfig) -> Resu
                 )
                 )
             }),
             }),
         )
         )
+        .layer(cors)
         .layer(Extension(ws_reload_state));
         .layer(Extension(ws_reload_state));
 
 
     axum::Server::bind(&format!("0.0.0.0:{}", port).parse().unwrap())
     axum::Server::bind(&format!("0.0.0.0:{}", port).parse().unwrap())