wasm-transformer
Library to run transformations on WebAssembly binaries.
Documentation for Wasmer-JS Stack can be found on the Wasmer Docs.
This README covers the instructions for installing, using, and contributing to the wasm-transformer Javascript package. The wasm_transformer Rust crate is available here.
Table of Contents
Features
This project depends on wasmparser, and the wasm-pack workflow. Huge shoutout to them!
Runs transformations on Wasm binaries to modify the actual code that gets run, and introduces new features (such as introducing trampoline functions for i64 WASI imports).
Installable on both crates.io, and npm!
The project builds with wasm-pack. Thus, you can use this library in a Javascript library, to modify WebAssembly Binaries, with WebAssembly.
Super fast! Can run the
lower_i64_importstransformations on my 2018 MackBook Pro, with the Chrome Devtools 6x CPU slowdown in ~ 1 second.
Installation
npm install --save @wasmer/wasm-transformer
Quick Start
For a larger example, see the wasm-terminal package.
Node
const wasmTransformer = require("@wasmer/wasm-transformer");
// Read in the input Wasm file
const wasmBuffer = fs.readFileSync("./my-wasm-file.wasm");
// Transform the binary
const wasmBinary = new Uint8Array(wasmBuffer);
const loweredBinary = wasmTransformer.lowerI64Imports(wasmBinary);
// Do something with loweredBinary
Browser
import { lowerI64Imports } from "@wasmer/wasm-transformer";
const fetchAndTransformWasmBinary = async () => {
// Get the original Wasm binary
const fetchedOriginalWasmBinary = await fetch("/original-wasm-module.wasm");
const originalWasmBinaryBuffer = await fetchedOriginalWasmBinary.arrayBuffer();
const originalWasmBinary = new Uint8Array(originalWasmBinaryBuffer);
// Transform the binary, by running the lower_i64_imports from the wasm-transformer
const transformedBinary = await lowerI64Imports(originalWasmBinary);
// Compile the transformed binary
const transformedWasmModule = await WebAssembly.compile(transformedBinary);
return transformedWasmModule;
};
Reference API
The Reference API Documentation can be found on the @wasmer/wasm-transformer Reference API Wasmer Docs.
Contributing
Guidelines
This project follows the all-contributors specification.
Contributions of any kind are welcome!
Building the project
To get started using the project:
Set up the
wasm_transformerrust crateInstall the latest LTS version of Node.js (which includes
npmandnpx). An easy way to do so is with nvm. (Mac and Linux: here, Windows: here).npm run build.