Skip to content

Commit

Permalink
Merge pull request supabase#119 from supabase/deno-node
Browse files Browse the repository at this point in the history
Deno built-in node modules
  • Loading branch information
laktek authored Jul 14, 2023
2 parents 374c1bb + 2d260cb commit cafeeeb
Show file tree
Hide file tree
Showing 278 changed files with 86,400 additions and 88 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ target/
temp/
.idea/
.idea
scripts/debug.sh

node_modules/
.DS_Store
100 changes: 60 additions & 40 deletions Cargo.lock

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

4 changes: 3 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ members = [
"./crates/sb_core",
"./crates/flaky_test",
"./crates/sb_os",
"./crates/node",
"./crates/cpu_timer"
]
resolver = "2"
Expand All @@ -27,7 +28,6 @@ deno_io = "0.7.0"
deno_graph = "=0.45.0"
deno_http = { version = "0.92.0" }
deno_net = { version = "0.89.0" }
deno_node = { version = "0.34.0" }
deno_url = { version = "0.97.0" }
deno_tls = { version = "0.84.0"}
deno_webidl = { version = "0.97.0" }
Expand All @@ -48,6 +48,8 @@ regex = "^1.7.0"
fs3 = "0.5.0"
tokio-util = "0.7.4"
uuid = { version = "1.1.2", features = ["v4"] }
rsa = { version = "0.7.0", default-features = false, features = ["std", "pem", "hazmat"] }
deno_flash = "0.33.0"

[profile.release]
lto = true
6 changes: 4 additions & 2 deletions crates/base/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ deno_crypto = { workspace = true }
deno_fetch = { workspace = true }
deno_http = { workspace = true }
deno_net = { workspace = true }
deno_node = { workspace = true }
deno_url = { workspace = true }
deno_tls = { workspace = true }
deno_webidl = { workspace = true }
Expand All @@ -40,6 +39,8 @@ sb_workers = { version = "0.1.0", path = "../sb_workers" }
sb_env = { version = "0.1.0", path = "../sb_env" }
sb_core = { version = "0.1.0", path = "../sb_core" }
sb_os = { version = "0.1.0", path = "../sb_os" }
sb_node = { version = "0.1.0", path = "../node" }
deno_flash.workspace = true
urlencoding = { version = "2.1.2" }
uuid = { workspace = true }

Expand All @@ -59,7 +60,6 @@ deno_crypto = { workspace = true }
deno_fetch = { workspace = true }
deno_http = { workspace = true }
deno_net = { workspace = true }
deno_node = { workspace = true }
deno_url = { workspace = true }
deno_tls = { workspace = true }
deno_webidl = { workspace = true }
Expand All @@ -80,3 +80,5 @@ sb_workers = { version = "0.1.0", path = "../sb_workers" }
sb_env = { version = "0.1.0", path = "../sb_env" }
sb_core = { version = "0.1.0", path = "../sb_core" }
sb_os = { version = "0.1.0", path = "../sb_os" }
sb_node = { version = "0.1.0", path = "../node" }
deno_flash.workspace = true
26 changes: 25 additions & 1 deletion crates/base/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ mod supabase_startup_snapshot {
}

#[derive(Clone)]
struct Permissions;
pub struct Permissions;

impl deno_net::NetPermissions for Permissions {
fn check_net<T: AsRef<str>>(
Expand Down Expand Up @@ -153,6 +153,28 @@ mod supabase_startup_snapshot {
}
}

impl sb_node::NodePermissions for Permissions {
fn check_read(&mut self, _path: &Path) -> Result<(), AnyError> {
Ok(())
}
}

impl deno_flash::FlashPermissions for Permissions {
fn check_net<T: AsRef<str>>(
&mut self,
_host: &(T, Option<u16>),
_api_name: &str,
) -> Result<(), AnyError> {
Ok(())
}
}

pub struct RuntimeNodeEnv;
impl sb_node::NodeEnv for RuntimeNodeEnv {
type P = Permissions;
type Fs = sb_node::RealFs;
}

pub fn create_runtime_snapshot(snapshot_path: PathBuf) {
let user_agent = String::from("supabase");
let extensions: Vec<Extension> = vec![
Expand All @@ -177,13 +199,15 @@ mod supabase_startup_snapshot {
deno_http::deno_http::init_ops_and_esm(),
deno_io::deno_io::init_ops_and_esm(Default::default()),
deno_fs::deno_fs::init_ops_and_esm::<Permissions>(false),
deno_flash::deno_flash::init_ops_and_esm::<Permissions>(false),
sb_env::init_ops_and_esm(),
sb_os::sb_os::init_ops_and_esm(),
sb_user_workers::init_ops_and_esm(),
sb_user_event_worker::init_ops_and_esm(),
sb_core_main_js::init_ops_and_esm(),
sb_core_net::init_ops_and_esm(),
sb_core_http::init_ops_and_esm(),
// sb_node::deno_node::init_ops_and_esm::<RuntimeNodeEnv>(None),
sb_core_runtime::init_ops_and_esm(None),
];

Expand Down
29 changes: 28 additions & 1 deletion crates/base/src/deno_runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,13 +157,15 @@ impl DenoRuntime {
deno_http::deno_http::init_ops(),
deno_io::deno_io::init_ops(Some(Default::default())),
deno_fs::deno_fs::init_ops::<Permissions>(false),
deno_flash::deno_flash::init_ops::<Permissions>(false),
sb_env_op::init_ops(),
sb_os::sb_os::init_ops(),
sb_user_workers::init_ops(),
sb_user_event_worker::init_ops(),
sb_core_main_js::init_ops(),
sb_core_net::init_ops(),
sb_core_http::init_ops(),
// sb_node::deno_node::init_ops::<RuntimeNodeEnv>(None),
sb_core_runtime::init_ops(Some(main_module_url.clone())),
];

Expand Down Expand Up @@ -418,6 +420,31 @@ mod test {
);
}

// #[tokio::test]
// async fn test_node_builtin_imports() {
// let mut main_rt = create_runtime(
// Some(PathBuf::from("./test_cases/node-built-in")),
// Some(std::env::vars().collect()),
// None,
// )
// .await;
// let mod_evaluate = main_rt.js_runtime.mod_evaluate(main_rt.main_module_id);
// let _ = main_rt.js_runtime.run_event_loop(false).await;
// let global_value_deno_read_file_script = main_rt
// .js_runtime
// .execute_script(
// "<anon>",
// r#"
// globalThis.basename('/Users/Refsnes/demo_path.js');
// "#,
// )
// .unwrap();
// let fs_read_result =
// main_rt.to_value::<deno_core::serde_json::Value>(&global_value_deno_read_file_script);
// assert_eq!(fs_read_result.unwrap().as_str().unwrap(), "demo_path.js");
// std::mem::drop(mod_evaluate);
// }

#[tokio::test]
async fn test_os_ops() {
let mut user_rt = create_runtime(
Expand Down Expand Up @@ -614,7 +641,7 @@ mod test {

#[tokio::test]
async fn test_read_file_user_rt() {
let user_rt = create_basic_user_runtime("./test_cases/readFile", 5, 1000).await;
let user_rt = create_basic_user_runtime("./test_cases/readFile", 10, 1000).await;
let (_tx, unix_stream_rx) = mpsc::unbounded_channel::<UnixStream>();
let result = user_rt.run(unix_stream_rx).await;
match result {
Expand Down
5 changes: 5 additions & 0 deletions crates/base/src/js_worker/module_loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,11 @@ impl ModuleLoader for DefaultModuleLoader {
.resolve(specifier, &referrer_url)
.map_err(|err| err.into())
} else {
// Built-in Node modules
if let Some(module_name) = specifier.strip_prefix("node:") {
return module_fetcher::node::resolve_builtin_node_module(module_name);
}

deno_core::resolve_import(specifier, referrer).map_err(|err| err.into())
}
}
Expand Down
4 changes: 4 additions & 0 deletions crates/base/test_cases/node-built-in/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { basename } from "node:path";

console.log(basename);
globalThis.basename = basename;
2 changes: 1 addition & 1 deletion crates/module_fetcher/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ deno_console = { workspace = true }
deno_crypto = { workspace = true }
deno_fetch = { workspace = true }
deno_graph = { workspace = true }
deno_node = { workspace = true }
deno_tls = { workspace = true }
deno_web = { workspace = true }
deno_webstorage = { workspace = true }
Expand All @@ -43,6 +42,7 @@ flate2.workspace = true
tar.workspace = true
tokio-util.workspace = true
percent-encoding = "2.2.0"
sb_node = { version = "0.1.0", path = "../node" }

[dev-dependencies]
pretty_assertions = "1"
2 changes: 1 addition & 1 deletion crates/module_fetcher/src/args/package_json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use deno_core::error::AnyError;
use deno_graph::npm::NpmPackageReq;
use deno_graph::semver::NpmVersionReqSpecifierParseError;
use deno_graph::semver::VersionReq;
use deno_node::PackageJson;
use sb_node::PackageJson;
use thiserror::Error;

#[derive(Debug, Clone, Error, PartialEq, Eq, Hash)]
Expand Down
Loading

0 comments on commit cafeeeb

Please sign in to comment.