--- id: 'function-wasm' title: 'Using Wasm modules' component: true description: 'How to use WebAssembly in Edge Functions.' subtitle: 'Use WebAssembly in Edge Functions.' --- Edge Functions supports running [WebAssembly (Wasm)](https://developer.mozilla.org/en-US/docs/WebAssembly) modules. WebAssembly is useful if you want to optimize code that's slower to run in JavaScript or require low-level manipulation. This allows you to: - Optimize performance-critical code beyond JavaScript capabilities - Port existing libraries from other languages (C, C++, Rust) to JavaScript - Access low-level system operations not available in JavaScript For example, libraries like [magick-wasm](/docs/guides/functions/examples/image-manipulation) port existing C libraries to WebAssembly for complex image processing. --- ## Writing a Wasm module You can use different languages and SDKs to write Wasm modules. For this tutorial, we will write a basic Wasm module in Rust that adds two numbers. Follow this [guide on writing Wasm modules in Rust](https://developer.mozilla.org/en-US/docs/WebAssembly/Rust_to_Wasm) to setup your dev environment. Create a new Edge Function called `wasm-add` ```bash supabase functions new wasm-add ``` Create a new Cargo project for the Wasm module inside the function's directory: ```bash cd supabase/functions/wasm-add cargo new --lib add-wasm ``` Add the following code to `add-wasm/src/lib.rs`. <$CodeSample path="edge-functions/supabase/functions/wasm-modules/add-wasm/src/lib.rs" lines={[[1, -1]]} meta="lib.rs" language="rust" /> Update the `add-wasm/Cargo.toml` to include the `wasm-bindgen` dependency. <$CodeSample path="edge-functions/supabase/functions/wasm-modules/add-wasm/Cargo.toml" lines={[[1, -1]]} meta="Cargo.toml" /> Build the package by running: ```bash wasm-pack build --target deno ``` This will produce a Wasm binary file inside `add-wasm/pkg` directory. --- ## Calling the Wasm module from the Edge Function Update your Edge Function to call the add function from the Wasm module: <$CodeSample path="edge-functions/supabase/functions/wasm-modules/index.ts" lines={[[1, -1]]} meta="index.ts" /> Supabase Edge Functions currently use Deno 1.46. From [Deno 2.1, importing Wasm modules](https://deno.com/blog/v2.1) will require even less boilerplate code. --- ## Bundle and deploy Before deploying, ensure the Wasm module is bundled with your function by defining it in `supabase/config.toml`: - You will need update Supabase CLI to 2.7.0 or higher for the `static_files` support. - Static files cannot be deployed using the `--use-api` API flag. You need to build them with [Docker on the CLI](/docs/guides/functions/quickstart#step-6-deploy-to-production). ```toml [functions.wasm-add] static_files = [ "./functions/wasm-add/add-wasm/pkg/*"] ``` Deploy the function by running: ```bash supabase functions deploy wasm-add ```