|
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() |
8 | 51 | };
|
| 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 | + } |
9 | 71 |
|
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?; |
70 | 76 |
|
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 | +} |
75 | 79 |
|
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 {}); |
77 | 88 | }
|
| 89 | +); |
78 | 90 |
|
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 | +} |
94 | 95 |
|
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 | +} |
104 | 105 |
|
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 | +} |
115 | 113 |
|
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); |
123 | 120 | }
|
124 | 121 | }
|
| 122 | +} |
125 | 123 |
|
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 | +} |
134 | 132 |
|
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 | +} |
140 | 138 |
|
141 |
| - // NOP permissions |
142 |
| - struct Permissions; |
| 139 | +// NOP permissions |
| 140 | +struct Permissions; |
143 | 141 |
|
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 |
148 | 145 | }
|
149 | 146 | }
|
150 | 147 |
|
151 |
| -#[cfg(not(target_arch = "wasm32"))] |
152 | 148 | #[tokio::main(flavor = "current_thread")]
|
153 | 149 | 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) |
160 | 151 | }
|
0 commit comments