# go-promises Return promises from Go WASM. ## Usage Write some go code, like this. ```go import ( "syscall/js" promises "codeberg.org/danjones000/go-promises" ) func Add(a, b int) int { return a + b } func AddWrapper() value.JSWrapper { return func(this js.Value, args []js.Value) (any, error) { if len(args) < 2 { return nil, errors.New("add called with too few arguments") } a := args[0] b := args[1] if a.Type() != js.TypeNumber { return nil, fmt.Errorf("First argument must be a number. %s given", a.Type()) } if b.Type() != js.TypeNumber { return nil, fmt.Errorf("secong argument must be a number. %s given", b.Type()) } return Add(a.Int(), b.Int()), nil } } func main() { js.Global().Set("add", promises.PromisifyGoFunc(AddWrapper())) <-make(chan struct{}) } ``` Next, compile this code: ```shell GOOS=js GOARCH=wasm go build -o ./app.wasm ./ ``` Copy the `app.wasm` file, as well as the `wasm_exec.js` from your go installation, into wherever you have your web files located. ```shell cp app.wasm "$(go env GOROOT)"/misc/wasm/wasm_exec.js path/to/web/ ``` Finally, you'll need some frontend code like this: ```javascript const go = new Go(); WebAssembly.instantiateStreaming(fetch("app.wasm"), go.importObject).then((result) => { go.run(result.instance); }); ``` Now, the "add" function is available anywhere in your javascript. ## Roadmap - [ ] Argument validation, so you can write less code in your wrapper function. - [ ] An easy method for attaching functions to other objects, so they don't have to be in the global scope