@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.

    Keywords

    none

    Install

    npm i @wasmer/wasm-transformer

    DownloadsWeekly Downloads

    457

    Version

    0.12.0

    License

    MIT

    Unpacked Size

    912 kB

    Total Files

    60

    Last publish

    Collaborators

    • syrusakbary