@wasmer/wasm-transformer
TypeScript icon, indicating that this package has built-in type declarations

0.12.0 • Public • Published

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_imports transformations 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_transformer rust crate

  • Install the latest LTS version of Node.js (which includes npm and npx). An easy way to do so is with nvm. (Mac and Linux: here, Windows: here).

  • npm run build.

Readme

Keywords

none

Package Sidebar

Install

npm i @wasmer/wasm-transformer

Weekly Downloads

283

Version

0.12.0

License

MIT

Unpacked Size

912 kB

Total Files

60

Last publish

Collaborators

  • michael-f-bryan
  • syrusakbary