87 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# @webassemblyjs/wasm-edit
 | 
						|
 | 
						|
> Rewrite a WASM binary
 | 
						|
 | 
						|
Replace in-place an AST node in the binary.
 | 
						|
 | 
						|
## Installation
 | 
						|
 | 
						|
```sh
 | 
						|
yarn add @webassemblyjs/wasm-edit
 | 
						|
```
 | 
						|
 | 
						|
## Usage
 | 
						|
 | 
						|
Update:
 | 
						|
 | 
						|
```js
 | 
						|
import { edit } from "@webassemblyjs/wasm-edit";
 | 
						|
 | 
						|
const binary = [/*...*/];
 | 
						|
 | 
						|
const visitors = {
 | 
						|
  ModuleImport({ node }) {
 | 
						|
    node.module = "foo";
 | 
						|
    node.name = "bar";
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
const newBinary = edit(binary, visitors);
 | 
						|
```
 | 
						|
 | 
						|
Replace:
 | 
						|
 | 
						|
```js
 | 
						|
import { edit } from "@webassemblyjs/wasm-edit";
 | 
						|
 | 
						|
const binary = [/*...*/];
 | 
						|
 | 
						|
const visitors = {
 | 
						|
  Instr(path) {
 | 
						|
    const newNode = t.callInstruction(t.indexLiteral(0));
 | 
						|
    path.replaceWith(newNode);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
const newBinary = edit(binary, visitors);
 | 
						|
```
 | 
						|
 | 
						|
Remove:
 | 
						|
 | 
						|
```js
 | 
						|
import { edit } from "@webassemblyjs/wasm-edit";
 | 
						|
 | 
						|
const binary = [/*...*/];
 | 
						|
 | 
						|
const visitors = {
 | 
						|
  ModuleExport({ node }) {
 | 
						|
    path.remove()
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
const newBinary = edit(binary, visitors);
 | 
						|
```
 | 
						|
 | 
						|
Insert:
 | 
						|
 | 
						|
```js
 | 
						|
import { add } from "@webassemblyjs/wasm-edit";
 | 
						|
 | 
						|
const binary = [/*...*/];
 | 
						|
 | 
						|
const newBinary = add(actualBinary, [
 | 
						|
  t.moduleImport("env", "mem", t.memory(t.limit(1)))
 | 
						|
]);
 | 
						|
```
 | 
						|
 | 
						|
## Providing the AST
 | 
						|
 | 
						|
Providing an AST allows you to handle the decoding yourself, here is the API:
 | 
						|
 | 
						|
```js
 | 
						|
addWithAST(Program, ArrayBuffer, Array<Node>): ArrayBuffer;
 | 
						|
editWithAST(Program, ArrayBuffer, visitors): ArrayBuffer;
 | 
						|
```
 | 
						|
 | 
						|
Note that the AST will be updated in-place.
 |