diff --git a/examples/wasm/main.go b/examples/wasm/main.go new file mode 100644 index 0000000..0c02c49 --- /dev/null +++ b/examples/wasm/main.go @@ -0,0 +1,78 @@ +//go:build js && wasm +// +build js,wasm + +package main + +import ( + "encoding/hex" + "fmt" + "syscall/js" + + "git.quad4.io/Networks/Reticulum-Go/pkg/wasm" + "git.quad4.io/RNS-Things/reticulum-go-mf/pkg/mf" +) + +var messenger *mf.Messenger + +func main() { + // Register the generic WASM bridge functions first + wasm.RegisterJSFunctions() + + // Add chat-specific functions to the "reticulum" JS object + reticulum := js.Global().Get("reticulum") + reticulum.Set("sendMessage", js.FuncOf(SendMessage)) + reticulum.Set("sendAnnounce", js.FuncOf(SendAnnounce)) + + // Keep the Go program running + select {} +} + +func SendMessage(this js.Value, args []js.Value) interface{} { + if len(args) < 2 { + return js.ValueOf(map[string]interface{}{ + "error": "Destination hash and message required", + }) + } + + destHashHex := args[0].String() + message := args[1].String() + + destHash, err := hex.DecodeString(destHashHex) + if err != nil { + return js.ValueOf(map[string]interface{}{ + "error": fmt.Sprintf("Invalid destination hash: %v", err), + }) + } + + // Initialize messenger if not already done + if messenger == nil { + t := wasm.GetTransport() + d := wasm.GetDestinationPointer() + if t == nil || d == nil { + return js.ValueOf(map[string]interface{}{ + "error": "Reticulum not initialized", + }) + } + messenger = mf.NewMessenger(t, d) + } + + // Use the high-level Messenger from mf package + if err := messenger.SendMessage(destHash, message); err != nil { + return js.ValueOf(map[string]interface{}{ + "error": fmt.Sprintf("Send failed: %v", err), + }) + } + + return js.ValueOf(map[string]interface{}{ + "success": true, + }) +} + +func SendAnnounce(this js.Value, args []js.Value) interface{} { + var appData []byte + if len(args) >= 1 && args[0].String() != "" { + appData = []byte(args[0].String()) + } + + return wasm.SendAnnounce(appData) +} diff --git a/examples/wasm/main_test.go b/examples/wasm/main_test.go new file mode 100644 index 0000000..3a51422 --- /dev/null +++ b/examples/wasm/main_test.go @@ -0,0 +1,33 @@ +//go:build js && wasm +// +build js,wasm + +package main + +import ( + "syscall/js" + "testing" + + "git.quad4.io/Networks/Reticulum-Go/pkg/wasm" +) + +func TestRegisterFunctions(t *testing.T) { + // Register functions + wasm.RegisterJSFunctions() + + reticulum := js.Global().Get("reticulum") + if reticulum.IsUndefined() { + t.Fatal("reticulum object not registered") + } + + // Manually register chat functions since main() has select{} + reticulum.Set("sendMessage", js.FuncOf(SendMessage)) + reticulum.Set("sendAnnounce", js.FuncOf(SendAnnounce)) + + tests := []string{"sendMessage", "sendAnnounce", "init", "getIdentity", "sendData"} + for _, name := range tests { + if reticulum.Get(name).Type() != js.TypeFunction { + t.Errorf("function %s not registered correctly", name) + } + } +} + diff --git a/examples/wasm/public/index.html b/examples/wasm/public/index.html new file mode 100644 index 0000000..2a1ca9c --- /dev/null +++ b/examples/wasm/public/index.html @@ -0,0 +1,43 @@ + + +
+ +Open console to see output.
+ + +