Search code examples
gowebassemblytinygo

How to return object from tinygo webassembly target


I am using tinygo to generate a wasm for simple function:

//export onInput
func onInput() map[string]interface{} {
    return map[string]interface{}{
        "key": 60,
        "remove": 1,
    }
}

Then I am using wasm target to build using tinygo, as:

tinygo build -o main.wasm -target wasm ./main.go

And when I call the method wasm.exports.onInput() I am getting a number such as: 102752

How would I get the JS object as a return value like:

{ key: 60, remove: 1 }

// Or array [60, 1] if possible

Note:

The tinygo documentation says:

The WebAssembly target does not return variables directly that cannot be handled by JavaScript (see above about i64, also struct, i64, multiple return values, etc). Instead, they are stored into a pointer passed as the first parameter by the caller.

If that's the cause of the issue, how would I pass the return value as a pointer from javascript?

Edit

I wasn’t able to figure out how I would return any of: arrays, strings or maps from a go function. I would settle for any of the above.


Solution

  • According to example at tinygo github you can try something like this:

    package main
    
    import "syscall/js"
    
    func main() {
        wait := make(chan struct{}, 0)
        js.Global().Set("onInput", js.FuncOf(onInput))
        <-wait
    }
    
    // note that there is no export as we registered this function in global
    func onInput(this js.Value, args []js.Value) interface{} {
        return js.ValueOf(map[string]interface{}{
            "key":    60,
            "remove": 1,
        })
    }
    

    And in your js code use just onInput, without wasmModule.instance.exports prefix