Browse Source

Merge pull request #95 from comit-network/embed_frontend

Embed maker/taker frontend into binary
no-contract-setup-message
Philipp Hoenisch 3 years ago
committed by GitHub
parent
commit
8b390354e8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 56
      Cargo.lock
  2. 2
      daemon/Cargo.toml
  3. 5
      daemon/src/maker.rs
  4. 27
      daemon/src/routes.rs
  5. 24
      daemon/src/routes_maker.rs
  6. 23
      daemon/src/routes_taker.rs
  7. 5
      daemon/src/taker.rs
  8. 1
      frontend/.gitignore
  9. 4
      frontend/dist/maker/.gitignore
  10. 4
      frontend/dist/taker/.gitignore

56
Cargo.lock

@ -427,6 +427,7 @@ dependencies = [
"rand 0.6.5", "rand 0.6.5",
"rocket", "rocket",
"rocket_db_pools", "rocket_db_pools",
"rust-embed",
"rust_decimal", "rust_decimal",
"rust_decimal_macros", "rust_decimal_macros",
"serde", "serde",
@ -435,7 +436,6 @@ dependencies = [
"sha2", "sha2",
"sqlx", "sqlx",
"tempfile", "tempfile",
"thiserror",
"tokio", "tokio",
"tokio-util", "tokio-util",
"uuid", "uuid",
@ -1719,6 +1719,40 @@ dependencies = [
"uncased", "uncased",
] ]
[[package]]
name = "rust-embed"
version = "6.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1be44a6694859b7cfc955699935944a6844aa9fe416aeda5d40829e3e38dfee6"
dependencies = [
"rust-embed-impl",
"rust-embed-utils",
"walkdir",
]
[[package]]
name = "rust-embed-impl"
version = "6.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f567ca01565c50c67b29e535f5f67b8ea8aeadaeed16a88f10792ab57438b957"
dependencies = [
"proc-macro2",
"quote",
"rust-embed-utils",
"syn",
"walkdir",
]
[[package]]
name = "rust-embed-utils"
version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6116e7ab9ea963f60f2f20291d8fcf6c7273192cdd7273b3c80729a9605c97b2"
dependencies = [
"sha2",
"walkdir",
]
[[package]] [[package]]
name = "rust_decimal" name = "rust_decimal"
version = "1.16.0" version = "1.16.0"
@ -1779,6 +1813,15 @@ version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
dependencies = [
"winapi-util",
]
[[package]] [[package]]
name = "scoped-tls" name = "scoped-tls"
version = "1.0.0" version = "1.0.0"
@ -2451,6 +2494,17 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
[[package]]
name = "walkdir"
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
dependencies = [
"same-file",
"winapi 0.3.9",
"winapi-util",
]
[[package]] [[package]]
name = "want" name = "want"
version = "0.3.0" version = "0.3.0"

2
daemon/Cargo.toml

@ -13,6 +13,7 @@ hkdf = "0.11"
rand = "0.6" rand = "0.6"
rocket = { git = "https://github.com/SergioBenitez/Rocket", features = ["json"] } rocket = { git = "https://github.com/SergioBenitez/Rocket", features = ["json"] }
rocket_db_pools = { git = "https://github.com/SergioBenitez/Rocket", features = ["sqlx_sqlite"] } rocket_db_pools = { git = "https://github.com/SergioBenitez/Rocket", features = ["sqlx_sqlite"] }
rust-embed = "6.2"
rust_decimal = { version = "1.16", features = ["serde-float", "serde-arbitrary-precision"] } rust_decimal = { version = "1.16", features = ["serde-float", "serde-arbitrary-precision"] }
rust_decimal_macros = "1.15" rust_decimal_macros = "1.15"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
@ -20,7 +21,6 @@ serde_json = "1"
serde_with = { version = "1", features = ["macros"] } serde_with = { version = "1", features = ["macros"] }
sha2 = "0.9" sha2 = "0.9"
sqlx = { version = "0.5", features = ["offline"] } sqlx = { version = "0.5", features = ["offline"] }
thiserror = "1"
tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "net"] } tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "net"] }
tokio-util = { version = "0.6", features = ["codec"] } tokio-util = { version = "0.6", features = ["codec"] }
uuid = { version = "0.8", features = ["serde", "v4"] } uuid = { version = "0.8", features = ["serde", "v4"] }

5
daemon/src/maker.rs

@ -18,6 +18,7 @@ mod keypair;
mod maker_cfd_actor; mod maker_cfd_actor;
mod maker_inc_connections_actor; mod maker_inc_connections_actor;
mod model; mod model;
mod routes;
mod routes_maker; mod routes_maker;
mod seed; mod seed;
mod send_wire_message_actor; mod send_wire_message_actor;
@ -162,6 +163,10 @@ async fn main() -> Result<()> {
routes_maker::get_health_check routes_maker::get_health_check
], ],
) )
.mount(
"/",
rocket::routes![routes_maker::dist, routes_maker::index],
)
.launch() .launch()
.await?; .await?;

27
daemon/src/routes.rs

@ -0,0 +1,27 @@
use rocket::http::{ContentType, Status};
use rust_embed::EmbeddedFile;
use std::borrow::Cow;
use std::ffi::OsStr;
use std::path::PathBuf;
pub trait EmbeddedFileExt {
fn into_response(self, file: PathBuf) -> Result<(ContentType, Cow<'static, [u8]>), Status>;
}
impl EmbeddedFileExt for Option<EmbeddedFile> {
fn into_response(self, file: PathBuf) -> Result<(ContentType, Cow<'static, [u8]>), Status> {
match self {
None => Err(Status::NotFound),
Some(embedded_file) => {
let ext = file
.as_path()
.extension()
.and_then(OsStr::to_str)
.ok_or_else(|| Status::new(400))?;
let content_type =
ContentType::from_extension(ext).ok_or_else(|| Status::new(400))?;
Ok::<(ContentType, Cow<[u8]>), Status>((content_type, embedded_file.data))
}
}
}
}

24
daemon/src/routes_maker.rs

@ -1,14 +1,18 @@
use crate::maker_cfd_actor; use crate::maker_cfd_actor;
use crate::model::cfd::{Cfd, Order, Origin}; use crate::model::cfd::{Cfd, Order, Origin};
use crate::model::{Usd, WalletInfo}; use crate::model::{Usd, WalletInfo};
use crate::routes::EmbeddedFileExt;
use crate::to_sse_event::ToSseEvent; use crate::to_sse_event::ToSseEvent;
use anyhow::Result; use anyhow::Result;
use rocket::http::{ContentType, Status};
use rocket::response::status;
use rocket::response::stream::EventStream; use rocket::response::stream::EventStream;
use rocket::response::{status, Responder};
use rocket::serde::json::Json; use rocket::serde::json::Json;
use rocket::State; use rocket::State;
use rust_embed::RustEmbed;
use serde::Deserialize; use serde::Deserialize;
use std::borrow::Cow;
use std::path::PathBuf;
use tokio::select; use tokio::select;
use tokio::sync::{mpsc, watch}; use tokio::sync::{mpsc, watch};
@ -106,3 +110,19 @@ pub fn get_health_check() {}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
struct RetrieveCurrentOrder; struct RetrieveCurrentOrder;
#[derive(RustEmbed)]
#[folder = "../frontend/dist/maker"]
struct Asset;
#[rocket::get("/assets/<file..>")]
pub fn dist<'r>(file: PathBuf) -> impl Responder<'r, 'static> {
let filename = format!("assets/{}", file.display().to_string());
Asset::get(&filename).into_response(file)
}
#[rocket::get("/<_paths..>", format = "text/html")]
pub fn index<'r>(_paths: PathBuf) -> impl Responder<'r, 'static> {
let asset = Asset::get("index.html").ok_or(Status::NotFound)?;
Ok::<(ContentType, Cow<[u8]>), Status>((ContentType::HTML, asset.data))
}

23
daemon/src/routes_taker.rs

@ -1,13 +1,18 @@
use crate::model::cfd::{calculate_buy_margin, Cfd, Order, OrderId}; use crate::model::cfd::{calculate_buy_margin, Cfd, Order, OrderId};
use crate::model::{Leverage, Usd, WalletInfo}; use crate::model::{Leverage, Usd, WalletInfo};
use crate::routes::EmbeddedFileExt;
use crate::taker_cfd_actor; use crate::taker_cfd_actor;
use crate::to_sse_event::ToSseEvent; use crate::to_sse_event::ToSseEvent;
use bdk::bitcoin::Amount; use bdk::bitcoin::Amount;
use rocket::response::status; use rocket::http::{ContentType, Status};
use rocket::response::stream::EventStream; use rocket::response::stream::EventStream;
use rocket::response::{status, Responder};
use rocket::serde::json::Json; use rocket::serde::json::Json;
use rocket::State; use rocket::State;
use rust_embed::RustEmbed;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::borrow::Cow;
use std::path::PathBuf;
use tokio::select; use tokio::select;
use tokio::sync::{mpsc, watch}; use tokio::sync::{mpsc, watch};
@ -101,3 +106,19 @@ pub fn margin_calc(
Ok(status::Accepted(Some(Json(MarginResponse { margin })))) Ok(status::Accepted(Some(Json(MarginResponse { margin }))))
} }
#[derive(RustEmbed)]
#[folder = "../frontend/dist/maker"]
struct Asset;
#[rocket::get("/assets/<file..>")]
pub fn dist<'r>(file: PathBuf) -> impl Responder<'r, 'static> {
let filename = format!("assets/{}", file.display().to_string());
Asset::get(&filename).into_response(file)
}
#[rocket::get("/<_paths..>", format = "text/html")]
pub fn index<'r>(_paths: PathBuf) -> impl Responder<'r, 'static> {
let asset = Asset::get("index.html").ok_or(Status::NotFound)?;
Ok::<(ContentType, Cow<[u8]>), Status>((ContentType::HTML, asset.data))
}

5
daemon/src/taker.rs

@ -18,6 +18,7 @@ use tokio::sync::watch;
mod db; mod db;
mod keypair; mod keypair;
mod model; mod model;
mod routes;
mod routes_taker; mod routes_taker;
mod seed; mod seed;
mod send_wire_message_actor; mod send_wire_message_actor;
@ -171,6 +172,10 @@ async fn main() -> Result<()> {
routes_taker::margin_calc, routes_taker::margin_calc,
], ],
) )
.mount(
"/",
rocket::routes![routes_taker::dist, routes_taker::index],
)
.launch() .launch()
.await?; .await?;

1
frontend/.gitignore

@ -1,5 +1,4 @@
node_modules node_modules
.DS_Store .DS_Store
dist
dist-ssr dist-ssr
*.local *.local

4
frontend/dist/maker/.gitignore

@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore

4
frontend/dist/taker/.gitignore

@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore
Loading…
Cancel
Save