Skip to content
Snippets Groups Projects
README.md 2.18 KiB
Newer Older
Jono Wenger's avatar
Jono Wenger committed
# xxdk-WASM

This repository contains the WebAssembly bindings for xxDK. It also includes a
test server to serve the compiled WebAssembly module.
Jono Wenger's avatar
Jono Wenger committed

Jono Wenger's avatar
Jono Wenger committed
## Building
Jono Wenger's avatar
Jono Wenger committed

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

Jono Wenger's avatar
Jono Wenger committed
```shell
$ GOOS=js GOARCH=wasm go build -o xxdk.wasm
Jono Wenger's avatar
Jono Wenger committed
```

### Running Unit Tests
Jono Wenger's avatar
Jono Wenger committed

Because the bindings use `syscall/js`, tests cannot only be run in a browser. To
automate this process first install
[wasmbrowsertest](https://github.com/agnivade/wasmbrowsertest). Then, tests can
be run using the following command.
Jono Wenger's avatar
Jono Wenger committed

```shell
$ GOOS=js GOARCH=wasm go test ./...
Jono Wenger's avatar
Jono Wenger committed
```

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.

Jono Wenger's avatar
Jono Wenger committed
## Testing
Jono Wenger's avatar
Jono Wenger committed

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
Jono Wenger's avatar
Jono Wenger committed

Jono Wenger's avatar
Jono Wenger committed
```shell
$ GOOS=js GOARCH=wasm go build -o test/assets/xxdk.wasm
$ cd test/server/
$ go run main.go
Jono Wenger's avatar
Jono Wenger committed
```
Jono Wenger's avatar
Jono Wenger committed

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

## `wasm_exec.js`
Jono Wenger's avatar
Jono Wenger committed

Jono Wenger's avatar
Jono Wenger committed
`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.
Jono Wenger's avatar
Jono Wenger committed

Jono Wenger's avatar
Jono Wenger committed
```shell
$ cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" test/assets/
```
Jono Wenger's avatar
Jono Wenger committed

Jono Wenger's avatar
Jono Wenger committed
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`.

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