deno_runtime/ops/
bootstrap.rs

1// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
2
3use deno_core::op2;
4use deno_core::OpState;
5use deno_terminal::colors::ColorLevel;
6use serde::Serialize;
7
8use crate::BootstrapOptions;
9
10deno_core::extension!(
11  deno_bootstrap,
12  ops = [
13    op_bootstrap_args,
14    op_bootstrap_pid,
15    op_bootstrap_numcpus,
16    op_bootstrap_user_agent,
17    op_bootstrap_language,
18    op_bootstrap_log_level,
19    op_bootstrap_no_color,
20    op_bootstrap_color_depth,
21    op_bootstrap_is_stdout_tty,
22    op_bootstrap_is_stderr_tty,
23    op_bootstrap_unstable_args,
24    op_snapshot_options,
25  ],
26  options = {
27    snapshot_options: Option<SnapshotOptions>,
28  },
29  state = |state, options| {
30    if let Some(snapshot_options) = options.snapshot_options {
31      state.put::<SnapshotOptions>(snapshot_options);
32    }
33  },
34);
35
36#[derive(Serialize)]
37#[serde(rename_all = "camelCase")]
38pub struct SnapshotOptions {
39  pub ts_version: String,
40  pub v8_version: &'static str,
41  pub target: String,
42}
43
44impl Default for SnapshotOptions {
45  fn default() -> Self {
46    let arch = std::env::consts::ARCH;
47    let platform = std::env::consts::OS;
48    let target = match platform {
49      "macos" => format!("{}-apple-darwin", arch),
50      "linux" => format!("{}-unknown-linux-gnu", arch),
51      "windows" => format!("{}-pc-windows-msvc", arch),
52      rest => format!("{}-{}", arch, rest),
53    };
54
55    Self {
56      ts_version: "n/a".to_owned(),
57      v8_version: deno_core::v8::VERSION_STRING,
58      target,
59    }
60  }
61}
62
63// Note: Called at snapshot time, op perf is not a concern.
64#[op2]
65#[serde]
66pub fn op_snapshot_options(state: &mut OpState) -> SnapshotOptions {
67  state.take::<SnapshotOptions>()
68}
69
70#[op2]
71#[serde]
72pub fn op_bootstrap_args(state: &mut OpState) -> Vec<String> {
73  state.borrow::<BootstrapOptions>().args.clone()
74}
75
76#[op2(fast)]
77#[smi]
78pub fn op_bootstrap_pid() -> u32 {
79  std::process::id()
80}
81
82#[op2(fast)]
83#[smi]
84pub fn op_bootstrap_numcpus(state: &mut OpState) -> u32 {
85  state.borrow::<BootstrapOptions>().cpu_count as u32
86}
87
88#[op2]
89#[string]
90pub fn op_bootstrap_user_agent(state: &mut OpState) -> String {
91  state.borrow::<BootstrapOptions>().user_agent.clone()
92}
93
94#[op2]
95#[serde]
96pub fn op_bootstrap_unstable_args(state: &mut OpState) -> Vec<String> {
97  let options = state.borrow::<BootstrapOptions>();
98  let mut flags = Vec::with_capacity(options.unstable_features.len());
99  for granular_flag in crate::UNSTABLE_GRANULAR_FLAGS.iter() {
100    if options.unstable_features.contains(&granular_flag.id) {
101      flags.push(format!("--unstable-{}", granular_flag.name));
102    }
103  }
104  flags
105}
106
107#[op2]
108#[string]
109pub fn op_bootstrap_language(state: &mut OpState) -> String {
110  state.borrow::<BootstrapOptions>().locale.clone()
111}
112
113#[op2(fast)]
114#[smi]
115pub fn op_bootstrap_log_level(state: &mut OpState) -> i32 {
116  state.borrow::<BootstrapOptions>().log_level as i32
117}
118
119#[op2(fast)]
120pub fn op_bootstrap_no_color(state: &mut OpState) -> bool {
121  let options = state.borrow::<BootstrapOptions>();
122  options.no_color
123}
124
125#[op2(fast)]
126pub fn op_bootstrap_color_depth(state: &mut OpState) -> i32 {
127  let options = state.borrow::<BootstrapOptions>();
128  match options.color_level {
129    ColorLevel::None => 1,
130    ColorLevel::Ansi => 4,
131    ColorLevel::Ansi256 => 8,
132    ColorLevel::TrueColor => 24,
133  }
134}
135
136#[op2(fast)]
137pub fn op_bootstrap_is_stdout_tty(state: &mut OpState) -> bool {
138  let options = state.borrow::<BootstrapOptions>();
139  options.is_stdout_tty
140}
141
142#[op2(fast)]
143pub fn op_bootstrap_is_stderr_tty(state: &mut OpState) -> bool {
144  let options = state.borrow::<BootstrapOptions>();
145  options.is_stderr_tty
146}