Skip to content

Commit

Permalink
update wasm wrapper APIs
Browse files Browse the repository at this point in the history
- change newKeyRequest to return a promise instead
- fix newUpdater
    - now takes 3 arguments
    - keyName, zone, dohHostname
  • Loading branch information
cryptix committed Jun 27, 2024
1 parent 783c1c5 commit 794581e
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 117 deletions.
6 changes: 3 additions & 3 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

96 changes: 19 additions & 77 deletions golang/wasm/wasm_exec.html
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

</script>
</head>
Expand All @@ -175,36 +148,5 @@ <h3>Request</h3>
<input type="text" id="new-name" placeholder="mythingymajig.zenr.io">
<button onclick="requestKey()">Requset new Key</button>
</p>

<h2>Previous Go DNS Query Demo</h1>



<p>
<input type="text" id="domain-name" value="cryptix.zenr.io">
<button id="prepare">Prepare Query</button>
</p>

<h2>Query</h2>
<p>
<textarea type="text" id="query-data" name="dns">
</textarea>
<button onclick="queryViaFetch()">Query via fetch()</button>
</p>

<h2>Update</h2>
<p>
<input type="text" id="entry-address" value="23.42.0.1">
<button onclick="updateViaFetch()">Update</button>
</p>

<h3>Reply</h3>
<p>
<textarea id="dns-answer"></textarea>
<button id="parse-answer">̦Parse answer</button>
</p>

<h3>Parsed</h3>
<pre id="pretty"></pre>
</body>
</html>
89 changes: 52 additions & 37 deletions golang/wasm/wrapper_js.go
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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.
Expand All @@ -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))
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down

0 comments on commit 794581e

Please sign in to comment.