From ce2ad4913838b5224008806487fcfb7de5d32ec3 Mon Sep 17 00:00:00 2001 From: Felipe Cardozo Date: Fri, 10 Apr 2026 19:28:45 -0300 Subject: [PATCH 1/7] fix: use runtime filesystem for file:// requests Fixes file:// fetch handling to use the runtime's configured deno_fs instead of accessing host files directly. Changes: - Override snapshotted fetch handler with FsFetchHandler at runtime - Update vendored fetch handler to read via deno_fs - Add required dependencies for fs-backed fetch Tests: - Replace regression with real local npm file fetch case - Cover file:// behavior matching actual failure mode --- Cargo.lock | 2 + crates/base/src/runtime/mod.rs | 7 ++++ .../test_cases/fetch-local-npm-file/index.ts | 10 +++++ crates/base/tests/integration_tests.rs | 38 +++++++++++++++++++ vendor/deno_fetch/Cargo.toml | 2 + vendor/deno_fetch/fs_fetch_handler.rs | 21 +++++----- 6 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 crates/base/test_cases/fetch-local-npm-file/index.ts diff --git a/Cargo.lock b/Cargo.lock index 350ecfc87..ee752757c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2187,6 +2187,8 @@ dependencies = [ "bytes", "data-url", "deno_core", + "deno_fs", + "deno_io", "deno_path_util", "deno_permissions", "deno_tls", diff --git a/crates/base/src/runtime/mod.rs b/crates/base/src/runtime/mod.rs index 6c2a09d44..92aad96b1 100644 --- a/crates/base/src/runtime/mod.rs +++ b/crates/base/src/runtime/mod.rs @@ -888,6 +888,13 @@ where let mut js_runtime = JsRuntime::new(runtime_options); + { + let op_state = js_runtime.op_state(); + let mut op_state = op_state.borrow_mut(); + op_state.borrow_mut::().file_fetch_handler = + Rc::new(deno_fetch::FsFetchHandler); + } + let dispatch_fns = { let context = js_runtime.main_context(); let scope = &mut js_runtime.handle_scope(); diff --git a/crates/base/test_cases/fetch-local-npm-file/index.ts b/crates/base/test_cases/fetch-local-npm-file/index.ts new file mode 100644 index 000000000..f5483f795 --- /dev/null +++ b/crates/base/test_cases/fetch-local-npm-file/index.ts @@ -0,0 +1,10 @@ +import * as _meow from "npm:@imagemagick/magick-wasm@0.0.30"; + +const url = import.meta.resolve("npm:@imagemagick/magick-wasm@0.0.30"); + +export default { + async fetch() { + const text = await (await fetch(url)).text(); + return new Response(text); + }, +}; diff --git a/crates/base/tests/integration_tests.rs b/crates/base/tests/integration_tests.rs index c79af3c9c..53e0ce6b2 100644 --- a/crates/base/tests/integration_tests.rs +++ b/crates/base/tests/integration_tests.rs @@ -2371,6 +2371,44 @@ async fn test_declarative_style_fetch_handler() { ); } +#[tokio::test] +#[serial] +async fn test_fetch_local_file_handler() { + let (tx, mut rx) = mpsc::unbounded_channel(); + let tb = TestBedBuilder::new("./test_cases/main") + .with_per_worker_policy(None) + .with_worker_event_sender(Some(tx)) + .build() + .await; + + let mut resp = tb + .request(|b| { + b.uri("/fetch-local-npm-file") + .body(Body::empty()) + .context("can't make request") + }) + .await + .unwrap(); + + let status = resp.status().as_u16(); + let body = to_bytes(resp.body_mut()).await.unwrap(); + let body = String::from_utf8_lossy(&body).to_string(); + + if status != 200 || body.is_empty() { + rx.close(); + tb.exit(Duration::from_secs(TESTBED_DEADLINE_SEC)).await; + + while let Some(ev) = rx.recv().await { + if let WorkerEvents::Log(ev) = ev.event { + eprintln!("[worker-log] {}", ev.msg); + } + } + } + + assert_eq!(status, 200); + assert!(!body.is_empty()); +} + #[tokio::test] #[serial] async fn test_issue_208() { diff --git a/vendor/deno_fetch/Cargo.toml b/vendor/deno_fetch/Cargo.toml index 716d268a0..74e9e3e18 100644 --- a/vendor/deno_fetch/Cargo.toml +++ b/vendor/deno_fetch/Cargo.toml @@ -18,6 +18,8 @@ base64.workspace = true bytes.workspace = true data-url.workspace = true deno_core.workspace = true +deno_fs.workspace = true +deno_io.workspace = true deno_path_util.workspace = true deno_permissions.workspace = true deno_tls.workspace = true diff --git a/vendor/deno_fetch/fs_fetch_handler.rs b/vendor/deno_fetch/fs_fetch_handler.rs index c236dd9c6..b5e3a3993 100644 --- a/vendor/deno_fetch/fs_fetch_handler.rs +++ b/vendor/deno_fetch/fs_fetch_handler.rs @@ -6,35 +6,38 @@ use crate::FetchHandler; use deno_core::futures::FutureExt; use deno_core::futures::TryFutureExt; -use deno_core::futures::TryStreamExt; use deno_core::url::Url; use deno_core::CancelFuture; use deno_core::OpState; +use deno_fs::FileSystemRc; use http::StatusCode; use http_body_util::BodyExt; use std::rc::Rc; -use tokio_util::io::ReaderStream; /// An implementation which tries to read file URLs from the file system via -/// tokio::fs. +/// the runtime's configured file system. #[derive(Clone)] pub struct FsFetchHandler; impl FetchHandler for FsFetchHandler { fn fetch_file( &self, - _state: &mut OpState, + state: &mut OpState, url: &Url, ) -> (CancelableResponseFuture, Option>) { let cancel_handle = CancelHandle::new_rc(); let path_result = url.to_file_path(); + let fs = state.borrow::().clone(); let response_fut = async move { let path = path_result?; - let file = tokio::fs::File::open(path).map_err(|_| ()).await?; - let stream = ReaderStream::new(file) - .map_ok(hyper::body::Frame::data) - .map_err(Into::into); - let body = http_body_util::StreamBody::new(stream).boxed(); + let body = fs + .read_file_async(path, None) + .await + .map_err(|_| ())? + .into_owned(); + let body = http_body_util::Full::new(body.into()) + .map_err(|never| match never {}) + .boxed(); let response = http::Response::builder() .status(StatusCode::OK) .body(body) From 1edfddd7f474a9044746d5bc482018aa7f5a6299 Mon Sep 17 00:00:00 2001 From: Felipe Cardozo Date: Sat, 11 Apr 2026 09:28:46 -0300 Subject: [PATCH 2/7] chore: lint types/global.d.ts --- types/global.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/global.d.ts b/types/global.d.ts index e2693df4a..dceade281 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -231,7 +231,7 @@ declare namespace Supabase { } export class Session { - init: Promise + init: Promise; /** * Create a new model session using given model */ From 1ceec6cef8e597a8845063b75359d6be14c8fb89 Mon Sep 17 00:00:00 2001 From: Kalleby Santos Date: Sat, 11 Apr 2026 14:15:37 +0100 Subject: [PATCH 3/7] stamp: using deno extensions instead of update OpState directly --- crates/base/src/runtime/mod.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/crates/base/src/runtime/mod.rs b/crates/base/src/runtime/mod.rs index 92aad96b1..f781ab171 100644 --- a/crates/base/src/runtime/mod.rs +++ b/crates/base/src/runtime/mod.rs @@ -752,6 +752,7 @@ where deno_fetch::Options { user_agent: deno::versions::user_agent().to_string(), root_cert_store_provider: Some(root_cert_store_provider.clone()), + file_fetch_handler: Rc::new(deno::deno_fetch::FsFetchHandler), ..Default::default() }, ), @@ -888,13 +889,6 @@ where let mut js_runtime = JsRuntime::new(runtime_options); - { - let op_state = js_runtime.op_state(); - let mut op_state = op_state.borrow_mut(); - op_state.borrow_mut::().file_fetch_handler = - Rc::new(deno_fetch::FsFetchHandler); - } - let dispatch_fns = { let context = js_runtime.main_context(); let scope = &mut js_runtime.handle_scope(); From 7f1d557ccb7f269b1031ceb8bee44f4edaf60b30 Mon Sep 17 00:00:00 2001 From: kallebysantos Date: Sat, 11 Apr 2026 13:55:09 +0100 Subject: [PATCH 4/7] stamp: creating wasm-modules example --- examples/main/index.ts | 1 + examples/wasm-module/add-wasm/Cargo.lock | 114 ++++++++++++++++++ examples/wasm-module/add-wasm/Cargo.toml | 12 ++ .../wasm-module/add-wasm/pkg/add_wasm.d.ts | 4 + examples/wasm-module/add-wasm/pkg/add_wasm.js | 35 ++++++ .../wasm-module/add-wasm/pkg/add_wasm_bg.wasm | Bin 0 -> 1274 bytes .../add-wasm/pkg/add_wasm_bg.wasm.d.ts | 6 + examples/wasm-module/add-wasm/src/lib.rs | 5 + examples/wasm-module/add_wasm_bg.wasm | Bin 0 -> 1274 bytes examples/wasm-module/index.ts | 8 ++ 10 files changed, 185 insertions(+) create mode 100644 examples/wasm-module/add-wasm/Cargo.lock create mode 100644 examples/wasm-module/add-wasm/Cargo.toml create mode 100644 examples/wasm-module/add-wasm/pkg/add_wasm.d.ts create mode 100644 examples/wasm-module/add-wasm/pkg/add_wasm.js create mode 100644 examples/wasm-module/add-wasm/pkg/add_wasm_bg.wasm create mode 100644 examples/wasm-module/add-wasm/pkg/add_wasm_bg.wasm.d.ts create mode 100644 examples/wasm-module/add-wasm/src/lib.rs create mode 100644 examples/wasm-module/add_wasm_bg.wasm create mode 100644 examples/wasm-module/index.ts diff --git a/examples/main/index.ts b/examples/main/index.ts index e2ea10f82..6c66125b7 100644 --- a/examples/main/index.ts +++ b/examples/main/index.ts @@ -191,6 +191,7 @@ Deno.serve(async (req: Request) => { const cpuTimeHardLimitMs = 20000; const staticPatterns = [ "./examples/**/*.html", + "./examples/**/*.wasm", ]; return await EdgeRuntime.userWorkers.create({ diff --git a/examples/wasm-module/add-wasm/Cargo.lock b/examples/wasm-module/add-wasm/Cargo.lock new file mode 100644 index 000000000..d36b42614 --- /dev/null +++ b/examples/wasm-module/add-wasm/Cargo.lock @@ -0,0 +1,114 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "add-wasm" +version = "0.1.0" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "proc-macro2" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] diff --git a/examples/wasm-module/add-wasm/Cargo.toml b/examples/wasm-module/add-wasm/Cargo.toml new file mode 100644 index 000000000..63ee0931c --- /dev/null +++ b/examples/wasm-module/add-wasm/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "add-wasm" +version = "0.1.0" +edition = "2021" +license = "MIT/Apache-2.0" +description = "A simple wasm module that adds two numbers" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +wasm-bindgen = "0.2" diff --git a/examples/wasm-module/add-wasm/pkg/add_wasm.d.ts b/examples/wasm-module/add-wasm/pkg/add_wasm.d.ts new file mode 100644 index 000000000..fbf99b5ed --- /dev/null +++ b/examples/wasm-module/add-wasm/pkg/add_wasm.d.ts @@ -0,0 +1,4 @@ +/* tslint:disable */ +/* eslint-disable */ + +export function add(a: number, b: number): number; diff --git a/examples/wasm-module/add-wasm/pkg/add_wasm.js b/examples/wasm-module/add-wasm/pkg/add_wasm.js new file mode 100644 index 000000000..0a039c235 --- /dev/null +++ b/examples/wasm-module/add-wasm/pkg/add_wasm.js @@ -0,0 +1,35 @@ +/* @ts-self-types="./add_wasm.d.ts" */ + +/** + * @param {number} a + * @param {number} b + * @returns {number} + */ +export function add(a, b) { + const ret = wasm.add(a, b); + return ret >>> 0; +} + +function __wbg_get_imports() { + const import0 = { + __proto__: null, + __wbindgen_init_externref_table: function() { + const table = wasm.__wbindgen_externrefs; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + }, + }; + return { + __proto__: null, + "./add_wasm_bg.js": import0, + }; +} + +const wasmUrl = new URL('add_wasm_bg.wasm', import.meta.url); +const wasmInstantiated = await WebAssembly.instantiateStreaming(fetch(wasmUrl), __wbg_get_imports()); +const wasm = wasmInstantiated.instance.exports; +wasm.__wbindgen_start(); diff --git a/examples/wasm-module/add-wasm/pkg/add_wasm_bg.wasm b/examples/wasm-module/add-wasm/pkg/add_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..58aed5a8b0b990c9e0825c4c2dbf857ecf195148 GIT binary patch literal 1274 zcmZ`(&x_b>{9S1DGG`iuD$nO@@XpgRcxYdk&(~?y{kcT|y;bijX*hObI zH{YYl&*SiYtBnmWR9)+IV^!0&HViUl$~H8*tZZjCp*2|u-Ri3#Gpf@zs9K*SEXfL) ziIk_D$3@tm&fgx&#{mrpmP6)~<^p3;U8P0=CDd!P!EMxfeyOu?(dKcKP5Nf_ulXrltmFKZ#VRI z+tI7u(pDd9@69*7!Opxz)y&&VZ9dcr`u!Z3UxvJ|fV{8wfBCQfo3F0^BmZm2@B7+4 zUq9naEmc-^8?P@})a@Gf-gT$L{FhMMgZJkE{TyIK!@?L7OmT!6=2+kuOPml)2%#h* zjBp}IOe9Gtri4-&QARlxG^Ua!5spYiqbOn#k3(>RJ*%wrM9v5XUmC6QD{l1VOwjHQ%G0xc#` z9uxpX2?Qm{eOl!YMfmv_7v^Az(!!0@c{ZkN{vxk;POVj474CLk>)~YF2s?^Tj zeYo!E1YDVh&zbw_X0+c+AbXw!2@SCKVy<(ZVUZOc41xQE`dGd+UPGmo9fQzVz)p6> zcd!*7x;O>-m%5u5T6HU9$^%VpJ+ezEM@s_ABvbX8yY lw-T5g+Nx}P5b^93{!iNICewbmS!z2wUaab_x>WT_{{wH7NGAXQ literal 0 HcmV?d00001 diff --git a/examples/wasm-module/add-wasm/pkg/add_wasm_bg.wasm.d.ts b/examples/wasm-module/add-wasm/pkg/add_wasm_bg.wasm.d.ts new file mode 100644 index 000000000..1a00d2d7c --- /dev/null +++ b/examples/wasm-module/add-wasm/pkg/add_wasm_bg.wasm.d.ts @@ -0,0 +1,6 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const add: (a: number, b: number) => number; +export const __wbindgen_externrefs: WebAssembly.Table; +export const __wbindgen_start: () => void; diff --git a/examples/wasm-module/add-wasm/src/lib.rs b/examples/wasm-module/add-wasm/src/lib.rs new file mode 100644 index 000000000..bdfaa1b94 --- /dev/null +++ b/examples/wasm-module/add-wasm/src/lib.rs @@ -0,0 +1,5 @@ +use wasm_bindgen::prelude::*; +#[wasm_bindgen] +pub fn add(a: u32, b: u32) -> u32 { + a + b +} diff --git a/examples/wasm-module/add_wasm_bg.wasm b/examples/wasm-module/add_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..58aed5a8b0b990c9e0825c4c2dbf857ecf195148 GIT binary patch literal 1274 zcmZ`(&x_b>{9S1DGG`iuD$nO@@XpgRcxYdk&(~?y{kcT|y;bijX*hObI zH{YYl&*SiYtBnmWR9)+IV^!0&HViUl$~H8*tZZjCp*2|u-Ri3#Gpf@zs9K*SEXfL) ziIk_D$3@tm&fgx&#{mrpmP6)~<^p3;U8P0=CDd!P!EMxfeyOu?(dKcKP5Nf_ulXrltmFKZ#VRI z+tI7u(pDd9@69*7!Opxz)y&&VZ9dcr`u!Z3UxvJ|fV{8wfBCQfo3F0^BmZm2@B7+4 zUq9naEmc-^8?P@})a@Gf-gT$L{FhMMgZJkE{TyIK!@?L7OmT!6=2+kuOPml)2%#h* zjBp}IOe9Gtri4-&QARlxG^Ua!5spYiqbOn#k3(>RJ*%wrM9v5XUmC6QD{l1VOwjHQ%G0xc#` z9uxpX2?Qm{eOl!YMfmv_7v^Az(!!0@c{ZkN{vxk;POVj474CLk>)~YF2s?^Tj zeYo!E1YDVh&zbw_X0+c+AbXw!2@SCKVy<(ZVUZOc41xQE`dGd+UPGmo9fQzVz)p6> zcd!*7x;O>-m%5u5T6HU9$^%VpJ+ezEM@s_ABvbX8yY lw-T5g+Nx}P5b^93{!iNICewbmS!z2wUaab_x>WT_{{wH7NGAXQ literal 0 HcmV?d00001 diff --git a/examples/wasm-module/index.ts b/examples/wasm-module/index.ts new file mode 100644 index 000000000..5b11be647 --- /dev/null +++ b/examples/wasm-module/index.ts @@ -0,0 +1,8 @@ +import { add } from './add-wasm/pkg/add_wasm.js'; + +Deno.serve(async (req) => { + const { a, b } = await req.json(); + const result = add(a, b); + + return Response.json({ result }); +}); From 1bc89796cc347634eb61095fe4ffd23b8fc4920a Mon Sep 17 00:00:00 2001 From: Kalleby Santos Date: Sat, 11 Apr 2026 15:26:18 +0100 Subject: [PATCH 5/7] stamp: format --- examples/wasm-module/add-wasm/pkg/add_wasm.js | 43 ++++++++++--------- examples/wasm-module/add-wasm/src/lib.rs | 2 +- examples/wasm-module/index.ts | 2 +- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/examples/wasm-module/add-wasm/pkg/add_wasm.js b/examples/wasm-module/add-wasm/pkg/add_wasm.js index 0a039c235..5c26f5a52 100644 --- a/examples/wasm-module/add-wasm/pkg/add_wasm.js +++ b/examples/wasm-module/add-wasm/pkg/add_wasm.js @@ -6,30 +6,33 @@ * @returns {number} */ export function add(a, b) { - const ret = wasm.add(a, b); - return ret >>> 0; + const ret = wasm.add(a, b); + return ret >>> 0; } function __wbg_get_imports() { - const import0 = { - __proto__: null, - __wbindgen_init_externref_table: function() { - const table = wasm.__wbindgen_externrefs; - const offset = table.grow(4); - table.set(0, undefined); - table.set(offset + 0, undefined); - table.set(offset + 1, null); - table.set(offset + 2, true); - table.set(offset + 3, false); - }, - }; - return { - __proto__: null, - "./add_wasm_bg.js": import0, - }; + const import0 = { + __proto__: null, + __wbindgen_init_externref_table: function () { + const table = wasm.__wbindgen_externrefs; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + }, + }; + return { + __proto__: null, + "./add_wasm_bg.js": import0, + }; } -const wasmUrl = new URL('add_wasm_bg.wasm', import.meta.url); -const wasmInstantiated = await WebAssembly.instantiateStreaming(fetch(wasmUrl), __wbg_get_imports()); +const wasmUrl = new URL("add_wasm_bg.wasm", import.meta.url); +const wasmInstantiated = await WebAssembly.instantiateStreaming( + fetch(wasmUrl), + __wbg_get_imports(), +); const wasm = wasmInstantiated.instance.exports; wasm.__wbindgen_start(); diff --git a/examples/wasm-module/add-wasm/src/lib.rs b/examples/wasm-module/add-wasm/src/lib.rs index bdfaa1b94..bf8298699 100644 --- a/examples/wasm-module/add-wasm/src/lib.rs +++ b/examples/wasm-module/add-wasm/src/lib.rs @@ -1,5 +1,5 @@ use wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn add(a: u32, b: u32) -> u32 { - a + b + a + b } diff --git a/examples/wasm-module/index.ts b/examples/wasm-module/index.ts index 5b11be647..1bfa5e5e3 100644 --- a/examples/wasm-module/index.ts +++ b/examples/wasm-module/index.ts @@ -1,4 +1,4 @@ -import { add } from './add-wasm/pkg/add_wasm.js'; +import { add } from "./add-wasm/pkg/add_wasm.js"; Deno.serve(async (req) => { const { a, b } = await req.json(); From efc6f2f1a74253f7074322c58ad68c26aab4fd7b Mon Sep 17 00:00:00 2001 From: Kalleby Santos Date: Sat, 11 Apr 2026 16:34:25 +0100 Subject: [PATCH 6/7] test: adding 'wasm-module' test - not working(to rebase) --- .../wasm-module/add-wasm/pkg/add_wasm.d.ts | 4 ++ .../wasm-module/add-wasm/pkg/add_wasm.js | 38 ++++++++++++++++++ .../wasm-module/add-wasm/pkg/add_wasm_bg.wasm | Bin 0 -> 1274 bytes .../add-wasm/pkg/add_wasm_bg.wasm.d.ts | 6 +++ crates/base/test_cases/wasm-module/index.ts | 7 ++++ crates/base/tests/integration_tests.rs | 19 +++++++++ 6 files changed, 74 insertions(+) create mode 100644 crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm.d.ts create mode 100644 crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm.js create mode 100644 crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm_bg.wasm create mode 100644 crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm_bg.wasm.d.ts create mode 100644 crates/base/test_cases/wasm-module/index.ts diff --git a/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm.d.ts b/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm.d.ts new file mode 100644 index 000000000..fbf99b5ed --- /dev/null +++ b/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm.d.ts @@ -0,0 +1,4 @@ +/* tslint:disable */ +/* eslint-disable */ + +export function add(a: number, b: number): number; diff --git a/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm.js b/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm.js new file mode 100644 index 000000000..5c26f5a52 --- /dev/null +++ b/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm.js @@ -0,0 +1,38 @@ +/* @ts-self-types="./add_wasm.d.ts" */ + +/** + * @param {number} a + * @param {number} b + * @returns {number} + */ +export function add(a, b) { + const ret = wasm.add(a, b); + return ret >>> 0; +} + +function __wbg_get_imports() { + const import0 = { + __proto__: null, + __wbindgen_init_externref_table: function () { + const table = wasm.__wbindgen_externrefs; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + }, + }; + return { + __proto__: null, + "./add_wasm_bg.js": import0, + }; +} + +const wasmUrl = new URL("add_wasm_bg.wasm", import.meta.url); +const wasmInstantiated = await WebAssembly.instantiateStreaming( + fetch(wasmUrl), + __wbg_get_imports(), +); +const wasm = wasmInstantiated.instance.exports; +wasm.__wbindgen_start(); diff --git a/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm_bg.wasm b/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..58aed5a8b0b990c9e0825c4c2dbf857ecf195148 GIT binary patch literal 1274 zcmZ`(&x_b>{9S1DGG`iuD$nO@@XpgRcxYdk&(~?y{kcT|y;bijX*hObI zH{YYl&*SiYtBnmWR9)+IV^!0&HViUl$~H8*tZZjCp*2|u-Ri3#Gpf@zs9K*SEXfL) ziIk_D$3@tm&fgx&#{mrpmP6)~<^p3;U8P0=CDd!P!EMxfeyOu?(dKcKP5Nf_ulXrltmFKZ#VRI z+tI7u(pDd9@69*7!Opxz)y&&VZ9dcr`u!Z3UxvJ|fV{8wfBCQfo3F0^BmZm2@B7+4 zUq9naEmc-^8?P@})a@Gf-gT$L{FhMMgZJkE{TyIK!@?L7OmT!6=2+kuOPml)2%#h* zjBp}IOe9Gtri4-&QARlxG^Ua!5spYiqbOn#k3(>RJ*%wrM9v5XUmC6QD{l1VOwjHQ%G0xc#` z9uxpX2?Qm{eOl!YMfmv_7v^Az(!!0@c{ZkN{vxk;POVj474CLk>)~YF2s?^Tj zeYo!E1YDVh&zbw_X0+c+AbXw!2@SCKVy<(ZVUZOc41xQE`dGd+UPGmo9fQzVz)p6> zcd!*7x;O>-m%5u5T6HU9$^%VpJ+ezEM@s_ABvbX8yY lw-T5g+Nx}P5b^93{!iNICewbmS!z2wUaab_x>WT_{{wH7NGAXQ literal 0 HcmV?d00001 diff --git a/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm_bg.wasm.d.ts b/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm_bg.wasm.d.ts new file mode 100644 index 000000000..1a00d2d7c --- /dev/null +++ b/crates/base/test_cases/wasm-module/add-wasm/pkg/add_wasm_bg.wasm.d.ts @@ -0,0 +1,6 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const add: (a: number, b: number) => number; +export const __wbindgen_externrefs: WebAssembly.Table; +export const __wbindgen_start: () => void; diff --git a/crates/base/test_cases/wasm-module/index.ts b/crates/base/test_cases/wasm-module/index.ts new file mode 100644 index 000000000..d9b3601b2 --- /dev/null +++ b/crates/base/test_cases/wasm-module/index.ts @@ -0,0 +1,7 @@ +import { add } from "./add-wasm/pkg/add_wasm.js"; + +Deno.serve(async (req) => { + const result = add(1, 2); + + return new Response(`${result}`, { status: 200 }); // result: 3 +}); diff --git a/crates/base/tests/integration_tests.rs b/crates/base/tests/integration_tests.rs index 53e0ce6b2..c6b6f5751 100644 --- a/crates/base/tests/integration_tests.rs +++ b/crates/base/tests/integration_tests.rs @@ -2409,6 +2409,25 @@ async fn test_fetch_local_file_handler() { assert!(!body.is_empty()); } +// https://github.com/supabase/edge-runtime/issues/640 +#[tokio::test] +#[serial] +async fn test_wasm_module() { + integration_test!( + "./test_cases/main", + NON_SECURE_PORT, + "wasm-module", + None, + None, + None, + (|resp| async { + // Testing mod add(1, 2) === 3; + assert_eq!(resp.unwrap().text().await.unwrap(), "3"); + }), + TerminationToken::new() + ); +} + #[tokio::test] #[serial] async fn test_issue_208() { From f8010f10e071894e5f71cb4e885cbccab3ffc4d9 Mon Sep 17 00:00:00 2001 From: Felipe Cardozo Date: Tue, 14 Apr 2026 13:31:00 -0300 Subject: [PATCH 7/7] fix tests --- crates/base/src/runtime/mod.rs | 2 +- crates/base/test_cases/main/index.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/base/src/runtime/mod.rs b/crates/base/src/runtime/mod.rs index f781ab171..3216531f9 100644 --- a/crates/base/src/runtime/mod.rs +++ b/crates/base/src/runtime/mod.rs @@ -752,7 +752,7 @@ where deno_fetch::Options { user_agent: deno::versions::user_agent().to_string(), root_cert_store_provider: Some(root_cert_store_provider.clone()), - file_fetch_handler: Rc::new(deno::deno_fetch::FsFetchHandler), + file_fetch_handler: Rc::new(deno_fetch::FsFetchHandler), ..Default::default() }, ), diff --git a/crates/base/test_cases/main/index.ts b/crates/base/test_cases/main/index.ts index 0639fa9c7..edf88ffa0 100644 --- a/crates/base/test_cases/main/index.ts +++ b/crates/base/test_cases/main/index.ts @@ -97,6 +97,7 @@ Deno.serve(async (req: Request) => { noNpm, envVars, context, + staticPatterns: ["**/*.wasm"], }); };