diff --git a/README.md b/README.md new file mode 100644 index 0000000..3e44287 --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ +# 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