From 5c872efa5cb79b465810c6e610412ca8ddb155ce Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Fri, 27 Dec 2024 16:19:59 -0600 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9A=97=EF=B8=8F=20Testing=20out=20non-pr?= =?UTF-8?q?omise=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/cmd/wasm/main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/cmd/wasm/main.go b/internal/cmd/wasm/main.go index bff7177..907cf03 100644 --- a/internal/cmd/wasm/main.go +++ b/internal/cmd/wasm/main.go @@ -3,6 +3,7 @@ package main import ( "errors" "fmt" + "strings" "syscall/js" promises "codeberg.org/danjones000/go-promises" @@ -46,5 +47,9 @@ func main() { return internal.GetUser(name.String(), age.Int()), nil })) + js.Global().Get("String").Get("prototype").Set("toTitleCase", js.FuncOf(func(this js.Value, _ []js.Value) any { + return strings.Title(this.String()) + })) + <-make(chan struct{}) } From d4cba7e99d4aaefccc2994da54ab82abc798d374 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Fri, 27 Dec 2024 16:20:31 -0600 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=93=9D=20Add=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 README.md 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