From 794581e872504534f3e701895ebe897297a5b84c Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 27 Jun 2024 10:28:12 +0200 Subject: [PATCH] update wasm wrapper APIs - change newKeyRequest to return a promise instead - fix newUpdater - now takes 3 arguments - keyName, zone, dohHostname --- flake.lock | 6 +-- golang/wasm/wasm_exec.html | 96 ++++++++------------------------------ golang/wasm/wrapper_js.go | 89 ++++++++++++++++++++--------------- 3 files changed, 74 insertions(+), 117 deletions(-) diff --git a/flake.lock b/flake.lock index 5087bbd..77bf2b8 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1715787315, - "narHash": "sha256-cYApT0NXJfqBkKcci7D9Kr4CBYZKOQKDYA23q8XNuWg=", + "lastModified": 1719254875, + "narHash": "sha256-ECni+IkwXjusHsm9Sexdtq8weAq/yUyt1TWIemXt3Ko=", "owner": "nixos", "repo": "nixpkgs", - "rev": "33d1e753c82ffc557b4a585c77de43d4c922ebb5", + "rev": "2893f56de08021cffd9b6b6dfc70fd9ccd51eb60", "type": "github" }, "original": { diff --git a/golang/wasm/wasm_exec.html b/golang/wasm/wasm_exec.html index bc465e0..32acf83 100644 --- a/golang/wasm/wasm_exec.html +++ b/golang/wasm/wasm_exec.html @@ -107,58 +107,31 @@ return } - const keyReq = goFuncs["newKeyRequest"](newName) + const newKeyReq = goFuncs["newKeyRequest"] - let answer = null - while (keyReq.next()) { - const query = keyReq.do(answer) - if (query == null) break - console.log(query) - - const bodyBuf = _base64ToArrayBuffer(query) - - const qryUrl = new URL(`https://doh.zenr.io/dns-query`) - const resp = await fetch(qryUrl, { - method: "POST", - headers: { - "Content-Type": "application/dns-message" - }, - body: bodyBuf - }) - - - const data = await resp.arrayBuffer() - answer = _arrayBufferToBase64(data) - console.log(answer) - } - - if (keyReq.err() !== null) { - console.error("requestKey failed:"+keyReq.err()) - throw new Error(keyReq.err()) - } - - console.log("done!") + newKeyReq(newName, "doh.zenr.io").then(() => { + console.log("key requested!") + }).catch(err => alert(err.message)) } - function listKeys() { - const div = document.getElementById("existing-keys") - if (div.children.length > 0) { - div.removeChild(div.children[0]) - } + function listKeys() { + const div = document.getElementById("existing-keys") + if (div.children.length > 0) { + div.removeChild(div.children[0]) + } - const ul = document.createElement("ul") + const ul = document.createElement("ul") - const list = window.goFuncs.listKeys - for (const k of list()) { - const li = document.createElement("li") - li.innerHTML = k - ul.appendChild(li) - } - div.appendChild(ul) - - return - } + const list = window.goFuncs.listKeys + for (const k of list()) { + const li = document.createElement("li") + li.innerHTML = k + ul.appendChild(li) + } + div.appendChild(ul) + return + } @@ -175,36 +148,5 @@

Request

- -

Previous Go DNS Query Demo

- - - -

- - -

- -

Query

-

- - -

- -

Update

-

- - -

- -

Reply

-

- - -

- -

Parsed

-

 	
 
diff --git a/golang/wasm/wrapper_js.go b/golang/wasm/wrapper_js.go
index 525104d..5e4ed88 100644
--- a/golang/wasm/wrapper_js.go
+++ b/golang/wasm/wrapper_js.go
@@ -1,11 +1,11 @@
 package main
 
 import (
-	"encoding/base64"
 	"fmt"
 	"log"
 	"syscall/js"
 
+	"github.com/davecgh/go-spew/spew"
 	"github.com/miekg/dns"
 
 	"github.com/NetworkCommons/sig0namectl/sig0"
@@ -50,49 +50,65 @@ func listKeys(_ js.Value, _ []js.Value) any {
 // arguments: the name to request
 // returns nill or an error string
 func newKeyRequest(_ js.Value, args []js.Value) any {
-	if len(args) != 1 {
-		return "expected 1 argument"
+	if len(args) != 2 {
+		return "expected 2 arguments: domainName and dohServer"
 	}
 	domainName := args[0].String()
+	dohServer := args[1].String()
 
 	keyReq, err := sig0.NewKeyRequest(domainName)
 	if err != nil {
 		return err.Error()
 	}
 
-	return map[string]any{
-		"next": js.FuncOf(func(_ js.Value, _ []js.Value) any {
-			return keyReq.Next()
-		}),
+	handler := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
+		resolve := args[0]
+		reject := args[1]
+
+		go func() {
+			log.Println("Requesting key for", domainName, "from", dohServer)
 
-		"do": js.FuncOf(func(_ js.Value, args []js.Value) any {
-			if len(args) != 1 {
-				log.Println("invalid args count", len(args))
-				return js.Null()
-			}
 			var answer *dns.Msg
-			if !args[0].IsNull() {
-				answer, err = sig0.ParseBase64Answer(args[0].String())
-				check(err)
-			}
-			qry := keyReq.Do(answer)
-			if qry == nil {
-				return js.Null()
+			var i = 0
+			for keyReq.Next() {
+				qry := keyReq.Do(answer)
+				if qry == nil {
+					break
+				}
+				spew.Dump(qry)
+
+				answer, err = sig0.SendDOHQuery(dohServer, qry)
+				if err != nil {
+					err = fmt.Errorf("Failed to create request key message: %w", err)
+					reject.Invoke(jsErr(err))
+					return
+				}
+
+				spew.Dump(answer)
+				i++
 			}
 
-			out, err := qry.Pack()
-			check(err)
-			return base64.StdEncoding.EncodeToString(out)
-		}),
+			err = keyReq.Err()
+			if err != nil {
+				err = fmt.Errorf("request loop failed: %w", err)
+				reject.Invoke(jsErr(err))
+				return
+			}
 
-		"err": js.FuncOf(func(_ js.Value, _ []js.Value) any {
-			err := keyReq.Err()
-			if err == nil {
-				return js.Null()
+			if answer.Rcode != dns.RcodeSuccess {
+				err = fmt.Errorf("Update failed: %v", answer)
+				reject.Invoke(jsErr(err))
+				return
 			}
-			return err.Error()
-		}),
-	}
+
+			resolve.Invoke(js.Null())
+		}()
+
+		return nil
+	})
+
+	promiseConstructor := js.Global().Get("Promise")
+	return promiseConstructor.New(handler)
 }
 
 // creates a new updater for the passed zone.
@@ -104,13 +120,14 @@ func newKeyRequest(_ js.Value, args []js.Value) any {
 //
 // returns an object with three functions {addRR, signedUpdate, unsignedUpdate}
 func newUpdater(_ js.Value, args []js.Value) any {
-	if len(args) != 2 {
-		panic("expected 2 arguments: zone, dohHostname")
+	if len(args) != 3 {
+		panic("expected 3 arguments: keyName, zone, dohHostname")
 	}
-	zone := args[0].String()
-	dohServer := args[1].String()
+	keyName := args[0].String()
+	zone := args[1].String()
+	dohServer := args[2].String()
 
-	signer, err := sig0.LoadOrGenerateKey(zone)
+	signer, err := sig0.LoadKeyFile(keyName)
 	if err != nil {
 		panic(fmt.Errorf("failed to load key: %w", err))
 	}
@@ -150,7 +167,6 @@ func newUpdater(_ js.Value, args []js.Value) any {
 					}
 					answer, err := sig0.SendDOHQuery(dohServer, msg)
 					if err != nil {
-
 						reject.Invoke(jsErr(err))
 						return
 					}
@@ -187,7 +203,6 @@ func newUpdater(_ js.Value, args []js.Value) any {
 					}
 					answer, err := sig0.SendDOHQuery(dohServer, msg)
 					if err != nil {
-
 						reject.Invoke(jsErr(err))
 						return
 					}