diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 2c6ad60..d23d1df 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -48,7 +48,12 @@ "Bash(./test-policy.sh:*)", "Bash(docker rm:*)", "Bash(./scripts/docker-policy/test-policy.sh:*)", - "Bash(./policytest:*)" + "Bash(./policytest:*)", + "WebSearch", + "WebFetch(domain:blog.scottlogic.com)", + "WebFetch(domain:eli.thegreenplace.net)", + "WebFetch(domain:learn-wasm.dev)", + "Bash(curl:*)" ], "deny": [], "ask": [] diff --git a/pkg/wasm/README.md b/pkg/wasm/README.md new file mode 100644 index 0000000..4154758 --- /dev/null +++ b/pkg/wasm/README.md @@ -0,0 +1,102 @@ +# WebAssembly Test Server + +Simple Go web server for serving WebAssembly files with correct MIME types. + +## Quick Start + +```bash +# Build and run the server +go run server.go + +# Or with custom port +go run server.go -port 3000 + +# Or serve from a different directory +go run server.go -dir /path/to/wasm/files +``` + +## Build and Install + +```bash +# Build binary +go build -o wasm-server server.go + +# Run +./wasm-server + +# Install to PATH +go install +``` + +## Usage + +Once the server is running, open your browser to: +- http://localhost:8080/ + +The server will serve: +- `index.html` - Main HTML page +- `hello.js` - JavaScript loader for WASM +- `hello.wasm` - WebAssembly binary module +- `hello.wat` - WebAssembly text format (for reference) + +## Files + +- **server.go** - Go web server with WASM MIME type support +- **index.html** - HTML page that loads the WASM module +- **hello.js** - JavaScript glue code to instantiate and run WASM +- **hello.wasm** - Compiled WebAssembly binary +- **hello.wat** - WebAssembly text format source + +## Building WASM Files + +### From WAT (WebAssembly Text Format) + +```bash +# Install wabt tools +sudo apt install wabt + +# Compile WAT to WASM +wat2wasm hello.wat -o hello.wasm + +# Disassemble WASM back to WAT +wasm2wat hello.wasm -o hello.wat +``` + +### From Go (using TinyGo) + +```bash +# Install TinyGo +wget https://github.com/tinygo-org/tinygo/releases/download/v0.31.0/tinygo_0.31.0_amd64.deb +sudo dpkg -i tinygo_0.31.0_amd64.deb + +# Create Go program +cat > main.go << 'EOF' +package main + +import "fmt" + +func main() { + fmt.Println("Hello from Go WASM!") +} +EOF + +# Compile to WASM +tinygo build -o main.wasm -target=wasm main.go + +# Get the WASM runtime helper +cp $(tinygo env TINYGOROOT)/targets/wasm_exec.js . +``` + +## Browser Console + +Open your browser's developer console (F12) to see the output from the WASM module. + +The `hello.wasm` module should print "Hello, World!" to the console. + +## CORS Headers + +The server includes CORS headers to allow: +- Cross-origin requests during development +- Loading WASM modules from different origins + +This is useful when developing and testing WASM modules. diff --git a/pkg/wasm/hello.js b/pkg/wasm/hello.js new file mode 100644 index 0000000..0a34482 --- /dev/null +++ b/pkg/wasm/hello.js @@ -0,0 +1,18 @@ +const memory = new WebAssembly.Memory({ initial: 1 }); + +const log = (offset, length) => { + const bytes = new Uint8Array(memory.buffer, offset, length); + const string = new TextDecoder('utf8').decode(bytes); + + console.log(string); +}; + +(async () => { + const response = await fetch('./hello.wasm'); + const bytes = await response.arrayBuffer(); + const { instance } = await WebAssembly.instantiate(bytes, { + env: { log, memory } + }); + + instance.exports.hello(); +})(); diff --git a/pkg/wasm/index.html b/pkg/wasm/index.html new file mode 100644 index 0000000..3b93a9f --- /dev/null +++ b/pkg/wasm/index.html @@ -0,0 +1,10 @@ + + +
+ +