No description
Find a file
2024-12-27 16:20:31 -06:00
internal ⚗️ Testing out non-promise functions 2024-12-27 16:19:59 -06:00
.gitignore 🎉 Commit of go-promises 2024-12-27 15:29:47 -06:00
errors.go 🎉 Commit of go-promises 2024-12-27 15:29:47 -06:00
go.mod 🎉 Commit of go-promises 2024-12-27 15:29:47 -06:00
new.go 🎉 Commit of go-promises 2024-12-27 15:29:47 -06:00
promisify.go 🎉 Commit of go-promises 2024-12-27 15:29:47 -06:00
README.md 📝 Add README 2024-12-27 16:20:31 -06:00
Taskfile.yml 🎉 Commit of go-promises 2024-12-27 15:29:47 -06:00
value.go 🎉 Commit of go-promises 2024-12-27 15:29:47 -06:00

go-promises

Return promises from Go WASM.

Usage

Write some go code, like this.

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:

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.

cp app.wasm "$(go env GOROOT)"/misc/wasm/wasm_exec.js path/to/web/

Finally, you'll need some frontend code like this:

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