Skip to content

Commit

Permalink
feat: denort binary (denoland#9041)
Browse files Browse the repository at this point in the history
This commit adds new binary target called "denort".

It is a "lite" version of "deno" binary that can only execute
code embedded inside the binary itself.

Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
  • Loading branch information
lucacasonato and bartlomieju authored Jan 8, 2021
1 parent e61e81e commit a44349d
Show file tree
Hide file tree
Showing 22 changed files with 315 additions and 258 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ jobs:
run: |
cd target/release
zip -r deno-x86_64-unknown-linux-gnu.zip deno
zip -r denort-x86_64-unknown-linux-gnu.zip denort
./deno types > lib.deno.d.ts
- name: Pre-release (mac)
Expand All @@ -184,13 +185,15 @@ jobs:
run: |
cd target/release
zip -r deno-x86_64-apple-darwin.zip deno
zip -r denort-x86_64-apple-darwin.zip denort
- name: Pre-release (windows)
if: |
startsWith(matrix.os, 'windows') &&
matrix.kind == 'test_release'
run: |
Compress-Archive -CompressionLevel Optimal -Force -Path target/release/deno.exe -DestinationPath target/release/deno-x86_64-pc-windows-msvc.zip
Compress-Archive -CompressionLevel Optimal -Force -Path target/release/denort.exe -DestinationPath target/release/denort-x86_64-pc-windows-msvc.zip
- name: Upload canary (unix)
if: |
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ default-run = "deno"
name = "deno"
path = "main.rs"

[[bin]]
name = "denort"
path = "main_runtime.rs"


[[bench]]
name = "deno_bench"
harness = false
Expand Down Expand Up @@ -51,7 +56,7 @@ indexmap = "1.6.0"
jsonc-parser = "0.14.0"
lazy_static = "1.4.0"
libc = "0.2.77"
log = "0.4.11"
log = { version = "0.4.11", features = ["serde"] }
lspower = "0.1.0"
notify = "5.0.0-pre.3"
percent-encoding = "2.1.0"
Expand Down
6 changes: 6 additions & 0 deletions cli/bench/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,12 @@ fn get_binary_sizes(target_dir: &PathBuf) -> Result<Value> {
Value::Number(Number::from(test_util::deno_exe_path().metadata()?.len())),
);

// add up size for denort
sizes.insert(
"denort".to_string(),
Value::Number(Number::from(test_util::denort_exe_path().metadata()?.len())),
);

// add up size for everything in target/release/deps/libswc*
let swc_size = rlib_size(&target_dir, "libswc");
println!("swc {} bytes", swc_size);
Expand Down
3 changes: 3 additions & 0 deletions cli/colors.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.

// allow(dead_code) because denort does not use this.
#![allow(dead_code)]

use regex::Regex;
use std::env;
use std::fmt;
Expand Down
2 changes: 1 addition & 1 deletion cli/file_fetcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ use crate::colors;
use crate::http_cache::HttpCache;
use crate::http_util::create_http_client;
use crate::http_util::fetch_once;
use crate::http_util::get_user_agent;
use crate::http_util::FetchOnceResult;
use crate::media_type::MediaType;
use crate::text_encoding;
use crate::version::get_user_agent;
use deno_runtime::permissions::Permissions;

use deno_core::error::custom_error;
Expand Down
67 changes: 1 addition & 66 deletions cli/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,11 @@ use clap::Arg;
use clap::ArgMatches;
use clap::ArgSettings;
use clap::SubCommand;
use deno_core::serde::de;
use deno_core::serde::Deserialize;
use deno_core::serde::Deserializer;
use deno_core::serde::Serialize;
use deno_core::serde::Serializer;
use deno_core::url::Url;
use deno_runtime::permissions::PermissionsOptions;
use log::Level;
use std::fmt;
use std::net::SocketAddr;
use std::path::PathBuf;
use std::str::FromStr;
Expand Down Expand Up @@ -100,66 +96,7 @@ impl Default for DenoSubcommand {
}
}

fn deserialize_maybe_log_level<'de, D>(d: D) -> Result<Option<Level>, D::Error>
where
D: Deserializer<'de>,
{
struct OptionalLogLevelVisitor;
impl<'de> de::Visitor<'de> for OptionalLogLevelVisitor {
type Value = Option<Level>;

fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "null or a valid log level string")
}

fn visit_none<E>(self) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(None)
}

fn visit_some<D>(self, d: D) -> Result<Self::Value, D::Error>
where
D: de::Deserializer<'de>,
{
struct LogLevelVisitor;
impl<'de> de::Visitor<'de> for LogLevelVisitor {
type Value = Level;

fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "a valid log level string")
}

fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
Level::from_str(s).map_err(|_| {
de::Error::invalid_value(de::Unexpected::Str(s), &self)
})
}
}
Ok(Some(d.deserialize_str(LogLevelVisitor)?))
}
}
d.deserialize_option(OptionalLogLevelVisitor)
}

fn serialize_maybe_log_level<S>(
maybe_level: &Option<Level>,
s: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match maybe_level {
None => s.serialize_none(),
Some(level) => s.serialize_str(&level.to_string()),
}
}

#[derive(Clone, Debug, PartialEq, Default, Deserialize, Serialize)]
#[derive(Clone, Debug, PartialEq, Default)]
pub struct Flags {
/// Vector of CLI arguments - these are user script arguments, all Deno
/// specific flags are removed.
Expand All @@ -185,8 +122,6 @@ pub struct Flags {
pub inspect_brk: Option<SocketAddr>,
pub lock: Option<PathBuf>,
pub lock_write: bool,
#[serde(deserialize_with = "deserialize_maybe_log_level")]
#[serde(serialize_with = "serialize_maybe_log_level")]
pub log_level: Option<Level>,
pub no_check: bool,
pub no_prompts: bool,
Expand Down
14 changes: 5 additions & 9 deletions cli/http_util.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.

use crate::version;
use deno_core::error::generic_error;
use deno_core::error::AnyError;
use deno_core::url::Url;
Expand All @@ -15,10 +14,6 @@ use deno_runtime::deno_fetch::reqwest::Client;
use deno_runtime::deno_fetch::reqwest::StatusCode;
use std::collections::HashMap;

pub fn get_user_agent() -> String {
format!("Deno/{}", version::deno())
}

/// Create new instance of async reqwest::Client. This client supports
/// proxies and doesn't follow redirects.
pub fn create_http_client(
Expand Down Expand Up @@ -155,6 +150,7 @@ pub async fn fetch_once(
#[cfg(test)]
mod tests {
use super::*;
use crate::version;
use std::fs::read;

fn create_test_client(ca_data: Option<Vec<u8>>) -> Client {
Expand Down Expand Up @@ -313,7 +309,7 @@ mod tests {
Url::parse("https://localhost:5545/cli/tests/fixture.json").unwrap();

let client = create_http_client(
get_user_agent(),
version::get_user_agent(),
Some(
read(
test_util::root_path()
Expand Down Expand Up @@ -345,7 +341,7 @@ mod tests {
)
.unwrap();
let client = create_http_client(
get_user_agent(),
version::get_user_agent(),
Some(
read(
test_util::root_path()
Expand Down Expand Up @@ -376,7 +372,7 @@ mod tests {
let _http_server_guard = test_util::http_server();
let url = Url::parse("https://localhost:5545/etag_script.ts").unwrap();
let client = create_http_client(
get_user_agent(),
version::get_user_agent(),
Some(
read(
test_util::root_path()
Expand Down Expand Up @@ -416,7 +412,7 @@ mod tests {
)
.unwrap();
let client = create_http_client(
get_user_agent(),
version::get_user_agent(),
Some(
read(
test_util::root_path()
Expand Down
4 changes: 2 additions & 2 deletions cli/info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

use crate::colors;
use crate::media_type::serialize_media_type;
use crate::MediaType;
use crate::ModuleSpecifier;
use crate::media_type::MediaType;
use deno_core::ModuleSpecifier;

use serde::Serialize;
use serde::Serializer;
Expand Down
2 changes: 1 addition & 1 deletion cli/lsp/sources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use crate::module_graph::GraphBuilder;
use crate::program_state::ProgramState;
use crate::specifier_handler::FetchHandler;
use crate::text_encoding;
use crate::Permissions;
use deno_runtime::permissions::Permissions;

use deno_core::error::AnyError;
use deno_core::serde_json;
Expand Down
24 changes: 18 additions & 6 deletions cli/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ use crate::program_state::exit_unstable;
use crate::program_state::ProgramState;
use crate::source_maps::apply_source_map;
use crate::specifier_handler::FetchHandler;
use crate::standalone::create_standalone_binary;
use crate::tools::installer::infer_name_from_url;
use deno_core::error::generic_error;
use deno_core::error::AnyError;
Expand Down Expand Up @@ -116,7 +115,7 @@ fn create_web_worker_callback(
.map_or(false, |l| l == log::Level::Debug),
unstable: program_state.flags.unstable,
ca_data: program_state.ca_data.clone(),
user_agent: http_util::get_user_agent(),
user_agent: version::get_user_agent(),
seed: program_state.flags.seed,
module_loader,
create_web_worker_cb,
Expand Down Expand Up @@ -192,7 +191,7 @@ pub fn create_main_worker(
.map_or(false, |l| l == log::Level::Debug),
unstable: program_state.flags.unstable,
ca_data: program_state.ca_data.clone(),
user_agent: http_util::get_user_agent(),
user_agent: version::get_user_agent(),
seed: program_state.flags.seed,
js_error_create_fn: Some(js_error_create_fn),
create_web_worker_cb,
Expand Down Expand Up @@ -307,7 +306,8 @@ async fn compile_command(

let debug = flags.log_level == Some(log::Level::Debug);

let run_flags = standalone::compile_to_runtime_flags(flags.clone(), args)?;
let run_flags =
tools::standalone::compile_to_runtime_flags(flags.clone(), args)?;

let module_specifier = ModuleSpecifier::resolve_url_or_path(&source_file)?;
let program_state = ProgramState::new(flags.clone())?;
Expand Down Expand Up @@ -337,7 +337,12 @@ async fn compile_command(
colors::green("Compile"),
module_specifier.to_string()
);
create_standalone_binary(bundle_str, run_flags, output.clone()).await?;
tools::standalone::create_standalone_binary(
bundle_str,
run_flags,
output.clone(),
)
.await?;

info!("{} {}", colors::green("Emit"), output.display());

Expand Down Expand Up @@ -1244,7 +1249,14 @@ pub fn main() {
colors::enable_ansi(); // For Windows 10

let args: Vec<String> = env::args().collect();
if let Err(err) = standalone::try_run_standalone_binary(args.clone()) {
let standalone_res = match standalone::extract_standalone(args.clone()) {
Ok(Some((metadata, bundle))) => {
tokio_util::run_basic(standalone::run(bundle, metadata))
}
Ok(None) => Ok(()),
Err(err) => Err(err),
};
if let Err(err) = standalone_res {
eprintln!("{}: {}", colors::red_bold("error"), err.to_string());
std::process::exit(1);
}
Expand Down
32 changes: 32 additions & 0 deletions cli/main_runtime.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.

#![deny(warnings)]

#[macro_use]
extern crate lazy_static;

mod colors;
mod standalone;
mod tokio_util;
mod version;

use deno_core::error::anyhow;
use deno_core::error::AnyError;
use std::env;

pub fn main() {
#[cfg(windows)]
colors::enable_ansi(); // For Windows 10

let args: Vec<String> = env::args().collect();
if let Err(err) = run(args) {
eprintln!("{}: {}", colors::red_bold("error"), err.to_string());
std::process::exit(1);
}
}

fn run(args: Vec<String>) -> Result<(), AnyError> {
let (metadata, bundle) = standalone::extract_standalone(args)?
.ok_or_else(|| anyhow!("This executable is used internally by 'deno compile', it is not meant to be invoked directly."))?;
tokio_util::run_basic(standalone::run(bundle, metadata))
}
2 changes: 1 addition & 1 deletion cli/module_graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ use crate::tsc;
use crate::tsc_config::IgnoredCompilerOptions;
use crate::tsc_config::TsConfig;
use crate::version;
use crate::AnyError;
use deno_core::error::AnyError;

use deno_core::error::anyhow;
use deno_core::error::custom_error;
Expand Down
4 changes: 2 additions & 2 deletions cli/program_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ use crate::file_fetcher::CacheSetting;
use crate::file_fetcher::FileFetcher;
use crate::flags;
use crate::http_cache;
use crate::http_util;
use crate::import_map::ImportMap;
use crate::lockfile::Lockfile;
use crate::module_graph::CheckOptions;
Expand All @@ -14,6 +13,7 @@ use crate::module_graph::TranspileOptions;
use crate::module_graph::TypeLib;
use crate::source_maps::SourceMapGetter;
use crate::specifier_handler::FetchHandler;
use crate::version;
use deno_runtime::inspector::InspectorServer;
use deno_runtime::permissions::Permissions;

Expand Down Expand Up @@ -106,7 +106,7 @@ impl ProgramState {
let maybe_inspector_server = match maybe_inspect_host {
Some(host) => Some(Arc::new(InspectorServer::new(
host,
http_util::get_user_agent(),
version::get_user_agent(),
))),
None => None,
};
Expand Down
Loading

0 comments on commit a44349d

Please sign in to comment.