Skip to content
Snippets Groups Projects

xxdk-WASM

This repository contains the WebAssembly bindings for xxDK. It also includes a test server to serve the compiled WebAssembly module.

Building

The repository can only be compiled to a WebAssembly binary using GOOS=js and GOARCH=wasm.

$ GOOS=js GOARCH=wasm go build -o xxdk.wasm

Running Unit Tests

Because the bindings use syscall/js, tests cannot only be run in a browser. To automate this process first install wasmbrowsertest. Then, tests can be run using the following command.

$ GOOS=js GOARCH=wasm go test ./...

Note, this will fail because wasm/wasm_js.s contains commands only recognized by the Go WebAssembly compiler and for some reason not recognized by the test runner. To get tests to run, temporarily delete the body of wasm/wasm_js.s during testing.

Testing

The test directory contains assets, a simple web page to run the Javascript, and server, which runs a simple Go HTTP server to deliver the webpage.

To run the server, first compile the bindings and save them to the assets directory. Then run the server

$ GOOS=js GOARCH=wasm go build -o test/assets/xxdk.wasm
$ cd test/server/
$ go run main.go

Navigate to http://localhost:9090 to see the web page.

wasm_exec.js

wasm_exec.js is provided by Go and is used to import the WebAssembly module in the browser. It can be retrieved from Go using the following command.

$ cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" test/assets/

Note that this repository makes edits to wasm_exec.js and you must either use the one in this repository or add the following lines in the go importObject on global.Go.

global.Go = class {
    constructor() {
        // ...
        this.importObject = {
            go: {
                // ...
                // func Throw(exception string, message string)
                'gitlab.com/elixxir/xxdk-wasm/wasm.throw': (sp) => {
                    const exception = loadString(sp + 8)
                    const message = loadString(sp + 24)
                    throw globalThis[exception](message)
                },
            }
        }
    }
}