Skip to content

Commit 65eb10e

Browse files
cwfitzgeraldWumpf
authored andcommitted
Switch cts_runner to clearer no_main style of wasm compat
1 parent 267f146 commit 65eb10e

File tree

1 file changed

+130
-139
lines changed

1 file changed

+130
-139
lines changed

cts_runner/src/main.rs

Lines changed: 130 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -1,160 +1,151 @@
1-
#[cfg(not(target_arch = "wasm32"))]
2-
mod native {
3-
use std::sync::Arc;
4-
use std::{
5-
env, fmt,
6-
io::{Read, Write},
7-
rc::Rc,
1+
#![cfg_attr(target_arch = "wasm32", no_main)]
2+
#![cfg(not(target_arch = "wasm32"))]
3+
4+
use std::sync::Arc;
5+
use std::{
6+
env, fmt,
7+
io::{Read, Write},
8+
rc::Rc,
9+
};
10+
11+
use deno_core::anyhow::anyhow;
12+
use deno_core::error::AnyError;
13+
use deno_core::op2;
14+
use deno_core::resolve_url_or_path;
15+
use deno_core::serde_json::json;
16+
use deno_core::v8;
17+
use deno_core::JsRuntime;
18+
use deno_core::RuntimeOptions;
19+
use deno_web::BlobStore;
20+
use termcolor::Ansi;
21+
use termcolor::Color::Red;
22+
use termcolor::ColorSpec;
23+
use termcolor::WriteColor;
24+
25+
pub async fn run() -> Result<(), AnyError> {
26+
let mut args_iter = env::args();
27+
let _ = args_iter.next();
28+
let url = args_iter
29+
.next()
30+
.ok_or_else(|| anyhow!("missing specifier in first command line argument"))?;
31+
let specifier = resolve_url_or_path(&url, &env::current_dir()?)?;
32+
33+
let mut feature_checker = deno_core::FeatureChecker::default();
34+
feature_checker.enable_feature(deno_webgpu::UNSTABLE_FEATURE_NAME);
35+
36+
let options = RuntimeOptions {
37+
module_loader: Some(Rc::new(deno_core::FsModuleLoader)),
38+
extensions: vec![
39+
deno_webidl::deno_webidl::init_ops_and_esm(),
40+
deno_console::deno_console::init_ops_and_esm(),
41+
deno_url::deno_url::init_ops_and_esm(),
42+
deno_web::deno_web::init_ops_and_esm::<Permissions>(
43+
Arc::new(BlobStore::default()),
44+
None,
45+
),
46+
deno_webgpu::deno_webgpu::init_ops_and_esm(),
47+
cts_runner::init_ops_and_esm(),
48+
],
49+
feature_checker: Some(Arc::new(feature_checker)),
50+
..Default::default()
851
};
52+
let mut js_runtime = JsRuntime::new(options);
53+
let args = args_iter.collect::<Vec<String>>();
54+
let cfg = json!({"args": args, "cwd": env::current_dir().unwrap().to_string_lossy() });
55+
56+
{
57+
let context = js_runtime.main_context();
58+
let scope = &mut js_runtime.handle_scope();
59+
let context_local = v8::Local::new(scope, context);
60+
let global_obj = context_local.global(scope);
61+
let bootstrap_str = v8::String::new(scope, "bootstrap").unwrap();
62+
let bootstrap_fn = global_obj.get(scope, bootstrap_str.into()).unwrap();
63+
let bootstrap_fn = v8::Local::<v8::Function>::try_from(bootstrap_fn).unwrap();
64+
65+
let options_v8 = deno_core::serde_v8::to_v8(scope, cfg).unwrap();
66+
let undefined = v8::undefined(scope);
67+
bootstrap_fn
68+
.call(scope, undefined.into(), &[options_v8])
69+
.unwrap();
70+
}
971

10-
use deno_core::anyhow::anyhow;
11-
use deno_core::error::AnyError;
12-
use deno_core::op2;
13-
use deno_core::resolve_url_or_path;
14-
use deno_core::serde_json::json;
15-
use deno_core::v8;
16-
use deno_core::JsRuntime;
17-
use deno_core::RuntimeOptions;
18-
use deno_web::BlobStore;
19-
use termcolor::Ansi;
20-
use termcolor::Color::Red;
21-
use termcolor::ColorSpec;
22-
use termcolor::WriteColor;
23-
24-
pub async fn run() -> Result<(), AnyError> {
25-
let mut args_iter = env::args();
26-
let _ = args_iter.next();
27-
let url = args_iter
28-
.next()
29-
.ok_or_else(|| anyhow!("missing specifier in first command line argument"))?;
30-
let specifier = resolve_url_or_path(&url, &env::current_dir()?)?;
31-
32-
let mut feature_checker = deno_core::FeatureChecker::default();
33-
feature_checker.enable_feature(deno_webgpu::UNSTABLE_FEATURE_NAME);
34-
35-
let options = RuntimeOptions {
36-
module_loader: Some(Rc::new(deno_core::FsModuleLoader)),
37-
extensions: vec![
38-
deno_webidl::deno_webidl::init_ops_and_esm(),
39-
deno_console::deno_console::init_ops_and_esm(),
40-
deno_url::deno_url::init_ops_and_esm(),
41-
deno_web::deno_web::init_ops_and_esm::<Permissions>(
42-
Arc::new(BlobStore::default()),
43-
None,
44-
),
45-
deno_webgpu::deno_webgpu::init_ops_and_esm(),
46-
cts_runner::init_ops_and_esm(),
47-
],
48-
feature_checker: Some(Arc::new(feature_checker)),
49-
..Default::default()
50-
};
51-
let mut js_runtime = JsRuntime::new(options);
52-
let args = args_iter.collect::<Vec<String>>();
53-
let cfg = json!({"args": args, "cwd": env::current_dir().unwrap().to_string_lossy() });
54-
55-
{
56-
let context = js_runtime.main_context();
57-
let scope = &mut js_runtime.handle_scope();
58-
let context_local = v8::Local::new(scope, context);
59-
let global_obj = context_local.global(scope);
60-
let bootstrap_str = v8::String::new(scope, "bootstrap").unwrap();
61-
let bootstrap_fn = global_obj.get(scope, bootstrap_str.into()).unwrap();
62-
let bootstrap_fn = v8::Local::<v8::Function>::try_from(bootstrap_fn).unwrap();
63-
64-
let options_v8 = deno_core::serde_v8::to_v8(scope, cfg).unwrap();
65-
let undefined = v8::undefined(scope);
66-
bootstrap_fn
67-
.call(scope, undefined.into(), &[options_v8])
68-
.unwrap();
69-
}
72+
let mod_id = js_runtime.load_main_es_module(&specifier).await?;
73+
let result = js_runtime.mod_evaluate(mod_id);
74+
js_runtime.run_event_loop(Default::default()).await?;
75+
result.await?;
7076

71-
let mod_id = js_runtime.load_main_es_module(&specifier).await?;
72-
let result = js_runtime.mod_evaluate(mod_id);
73-
js_runtime.run_event_loop(Default::default()).await?;
74-
result.await?;
77+
Ok(())
78+
}
7579

76-
Ok(())
80+
deno_core::extension!(
81+
cts_runner,
82+
deps = [deno_webidl, deno_web],
83+
ops = [op_exit, op_read_file_sync, op_write_file_sync],
84+
esm_entry_point = "ext:cts_runner/src/bootstrap.js",
85+
esm = ["src/bootstrap.js"],
86+
state = |state| {
87+
state.put(Permissions {});
7788
}
89+
);
7890

79-
deno_core::extension!(
80-
cts_runner,
81-
deps = [deno_webidl, deno_web],
82-
ops = [op_exit, op_read_file_sync, op_write_file_sync],
83-
esm_entry_point = "ext:cts_runner/src/bootstrap.js",
84-
esm = ["src/bootstrap.js"],
85-
state = |state| {
86-
state.put(Permissions {});
87-
}
88-
);
89-
90-
#[op2(fast)]
91-
fn op_exit(code: i32) {
92-
std::process::exit(code)
93-
}
91+
#[op2(fast)]
92+
fn op_exit(code: i32) {
93+
std::process::exit(code)
94+
}
9495

95-
#[op2]
96-
#[buffer]
97-
fn op_read_file_sync(#[string] path: &str) -> Result<Vec<u8>, std::io::Error> {
98-
let path = std::path::Path::new(path);
99-
let mut file = std::fs::File::open(path)?;
100-
let mut buf = Vec::new();
101-
file.read_to_end(&mut buf)?;
102-
Ok(buf)
103-
}
96+
#[op2]
97+
#[buffer]
98+
fn op_read_file_sync(#[string] path: &str) -> Result<Vec<u8>, std::io::Error> {
99+
let path = std::path::Path::new(path);
100+
let mut file = std::fs::File::open(path)?;
101+
let mut buf = Vec::new();
102+
file.read_to_end(&mut buf)?;
103+
Ok(buf)
104+
}
104105

105-
#[op2(fast)]
106-
fn op_write_file_sync(
107-
#[string] path: &str,
108-
#[buffer] buf: &[u8],
109-
) -> Result<(), std::io::Error> {
110-
let path = std::path::Path::new(path);
111-
let mut file = std::fs::File::create(path)?;
112-
file.write_all(buf)?;
113-
Ok(())
114-
}
106+
#[op2(fast)]
107+
fn op_write_file_sync(#[string] path: &str, #[buffer] buf: &[u8]) -> Result<(), std::io::Error> {
108+
let path = std::path::Path::new(path);
109+
let mut file = std::fs::File::create(path)?;
110+
file.write_all(buf)?;
111+
Ok(())
112+
}
115113

116-
pub fn unwrap_or_exit<T>(result: Result<T, AnyError>) -> T {
117-
match result {
118-
Ok(value) => value,
119-
Err(error) => {
120-
eprintln!("{}: {:?}", red_bold("error"), error);
121-
std::process::exit(1);
122-
}
114+
pub fn unwrap_or_exit<T>(result: Result<T, AnyError>) -> T {
115+
match result {
116+
Ok(value) => value,
117+
Err(error) => {
118+
eprintln!("{}: {:?}", red_bold("error"), error);
119+
std::process::exit(1);
123120
}
124121
}
122+
}
125123

126-
fn style<S: AsRef<str>>(s: S, colorspec: ColorSpec) -> impl fmt::Display {
127-
let mut v = Vec::new();
128-
let mut ansi_writer = Ansi::new(&mut v);
129-
ansi_writer.set_color(&colorspec).unwrap();
130-
ansi_writer.write_all(s.as_ref().as_bytes()).unwrap();
131-
ansi_writer.reset().unwrap();
132-
String::from_utf8_lossy(&v).into_owned()
133-
}
124+
fn style<S: AsRef<str>>(s: S, colorspec: ColorSpec) -> impl fmt::Display {
125+
let mut v = Vec::new();
126+
let mut ansi_writer = Ansi::new(&mut v);
127+
ansi_writer.set_color(&colorspec).unwrap();
128+
ansi_writer.write_all(s.as_ref().as_bytes()).unwrap();
129+
ansi_writer.reset().unwrap();
130+
String::from_utf8_lossy(&v).into_owned()
131+
}
134132

135-
fn red_bold<S: AsRef<str>>(s: S) -> impl fmt::Display {
136-
let mut style_spec = ColorSpec::new();
137-
style_spec.set_fg(Some(Red)).set_bold(true);
138-
style(s, style_spec)
139-
}
133+
fn red_bold<S: AsRef<str>>(s: S) -> impl fmt::Display {
134+
let mut style_spec = ColorSpec::new();
135+
style_spec.set_fg(Some(Red)).set_bold(true);
136+
style(s, style_spec)
137+
}
140138

141-
// NOP permissions
142-
struct Permissions;
139+
// NOP permissions
140+
struct Permissions;
143141

144-
impl deno_web::TimersPermission for Permissions {
145-
fn allow_hrtime(&mut self) -> bool {
146-
false
147-
}
142+
impl deno_web::TimersPermission for Permissions {
143+
fn allow_hrtime(&mut self) -> bool {
144+
false
148145
}
149146
}
150147

151-
#[cfg(not(target_arch = "wasm32"))]
152148
#[tokio::main(flavor = "current_thread")]
153149
async fn main() {
154-
native::unwrap_or_exit(native::run().await)
155-
}
156-
157-
#[cfg(target_arch = "wasm32")]
158-
fn main() {
159-
panic!("This is a native only module. It can't be run on the web!");
150+
unwrap_or_exit(run().await)
160151
}

0 commit comments

Comments
 (0)