From 9cfe8f661bc2ead2851088300b7edc5611128666 Mon Sep 17 00:00:00 2001
From: Jono Wenger <jono@elixxir.io>
Date: Thu, 8 Sep 2022 09:38:30 -0700
Subject: [PATCH] Fix authCallbacks argument conversion and fix WrapCB to
 unravel the args

---
 examples/sendE2E/index.html           |   5 +-
 examples/sendE2E/index2.html          |   6 +-
 examples/sendE2E/receiver-favicon.ico | Bin 0 -> 15406 bytes
 examples/sendE2E/sender-favicon.ico   | Bin 0 -> 15406 bytes
 examples/sendE2E/xxdk.js              |  97 ++++++++++++++++----------
 wasm/e2e.go                           |   9 ++-
 wasm/utils.go                         |   2 +-
 7 files changed, 75 insertions(+), 44 deletions(-)
 create mode 100644 examples/sendE2E/receiver-favicon.ico
 create mode 100644 examples/sendE2E/sender-favicon.ico

diff --git a/examples/sendE2E/index.html b/examples/sendE2E/index.html
index 90c544f3..27067671 100644
--- a/examples/sendE2E/index.html
+++ b/examples/sendE2E/index.html
@@ -9,9 +9,11 @@
 <html lang="en">
 <head>
 	<meta charset="UTF-8">
-	<title>xxDk WebAssembly Test</title>
+	<title>Receiver</title>
 
 	<link rel="stylesheet" type="text/css" href="../styles.css">
+	<link rel="shortcut icon" type="image/x-icon" href="receiver-favicon.ico" />
+
 	<script type="text/javascript" src="xxdk.js"></script>
 	<script type="text/javascript" src="../wasm_exec.js"></script>
 	<script>
@@ -40,6 +42,7 @@
 	</script>
 </head>
 <body>
+<h1>Receiver</h1>
 <form id="start-cmix">
 	<div>
 		<label for="ndf-input">Select NDF file to use <code>ndf</code> variable in JS (required):</label><br/>
diff --git a/examples/sendE2E/index2.html b/examples/sendE2E/index2.html
index 72443bc5..6665b33c 100644
--- a/examples/sendE2E/index2.html
+++ b/examples/sendE2E/index2.html
@@ -9,9 +9,10 @@
 <html lang="en">
 <head>
 	<meta charset="UTF-8">
-	<title>xxDk WebAssembly Test</title>
+	<title>Sender</title>
 
 	<link rel="stylesheet" type="text/css" href="../styles.css">
+	<link rel="shortcut icon" type="image/x-icon" href="sender-favicon.ico" />
 	<script type="text/javascript" src="xxdk.js"></script>
 	<script type="text/javascript" src="../wasm_exec.js"></script>
 	<script>
@@ -23,7 +24,7 @@
 
             LogLevel(0);
 
-            const recipientContactFile = '<xxc(2)qM22QBlbReXsTQ+zqDWr0ZSh7sFkDRjxqprUHyWe3aUDrgZ7Ugdw/BAr6cY/smgr1a48u+tl0EStWz84jY/oP+2BuftqQ5sW4gRxRsIHR+SG2lQb/NWIZt763UWGFTQAgCMCuSlhX3hVec972BhVY4igzVIazFbaDRZFONT8aeOSHIJFOgSQsFcfLX7s+ZZDSXVyx+4kZduyMRB1EhwtF4z4a5zebmoA9DB9H4B/jXB1H0pvkLXVS8QtWqtSP/9BHvSipXDXtnxlKxTwBaw6xNTWZnCY71nznRe2BElQrkLR7SyLWl3cMXeby2axbLO8nxsx5L9NKwvZOGlhDSlmpSfGaSoU8ETQ9F3LFj+wQ/xMrTR1bb0hUwkRkrLL4gmH9n0dNtZ/EblonRd7+v/lJnYHPCZCAPBMZQ9upqwJ7ZafgJkoP1dX/LT/mHoLB3Z8zeKvIXFC2IpT2notYxfMv1PRpqMna+FEK71dj/UVPxKS9eIOv7KnmUmOEWRQ66OB9MdKiINKMqik0zsTn3jSMj6OyePo2wshWcozHE/VXkvrHHhYVxFMjaN0Ysr2YYHQ/JGCNFkHsfHWQAAAAgA7j/wRIx1q2PjH8zBC6s8kmw==xxc>';
+            const recipientContactFile = '<xxc(2)Q2uq69ry88AeNFKcnpOkCjuCtkYIdv/fgC3F4z6eNUMDrgZ7Ugdw/BAr6bG0KyMpEOL6fulH331JBFOD69e7iZLxkBr3BvZyfyTXL9QtQwpzaDnmPXjyRR5cjAQ6gfk5XQzsrw45Q8qsrKewwZsqGhac0NKJYPiXGa9DTQR6f1VMOY7cco4uquNN5BRo4ucz1gu9w2Ff3N+1Hdz9V1r7xulkkd/78IyoJqHQDgp1eO3q6NZJT55DNsSuS2ZuYQc3yQUyTHH/G7gIF7EwRTU6dhRTGMYpfOQhRT67EVidHOT4e7GSpkWoGzi5XUBA+9N1llRCAwzRJ65lQqJZIC/vNgxJhHR5Cd4AOfHc+KuGlXMpCQkeYjd7a+ggh4RUuPsMW59QlKaBbZ1mbGHPzphFUrJIS63TMcJRrWbGwXHJrvZnD1NYNOM/x/qSR4pTkv8soIHFzgvFbRME5VTfxWfWKSCG/qu3TaWfetnYXmsqhdmnURekF4iSMtyDpVch+86zK5YmuO9Ap18MvdwmnfX5r9xhyPRga/QqmkdEI6ZebuXVYJQGr6Lzsz4z+4AGI0v87j//APsGxvi8fwAAAgA7w6N/pgZWFlB+p/Muirk+VQ==xxc>';
             const myContactFileName = 'theirE2eContact.xxc';
             const statePath = 'statePathSender';
             const statePass = 'password';
@@ -40,6 +41,7 @@
 	</script>
 </head>
 <body>
+<h1>Sender</h1>
 <form id="start-cmix">
 	<div>
 		<label for="ndf-input">Select NDF file to use <code>ndf</code> variable in JS:</label><br/>
diff --git a/examples/sendE2E/receiver-favicon.ico b/examples/sendE2E/receiver-favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..3a7b5826dfdad175084ea63406202334dfe29bf4
GIT binary patch
literal 15406
zcmeHO>2KUb6gPrDpnTx_mZJm^Qp8b?f@pyPLIM#GAb~`Iatg#*!3VBy6cEP;5TdAU
z8d{pPO;CEMC28nMi<*X}o3<zlg)}q}C82A3z4zLFyf<FE_Ie%Li{sr@J<`PXtjE9K
zym|9x=Di8WoyVQe&6&gDHO9Sg0msefI4%~`o|`V@xYbzJ++6y79>*QLh~t{@9jt;i
zv~s*uOo^2-sHe=Yxf1yHn;_9T?<_C8r!xA@jcfYAyFe+q?NQ_1%-~n7OzL^cD0BKw
zd42x7t3k~tq4@7{tUK3t{mj6p8urfTT<a1i9bek@G6)+Nf|5Oh*e5(;o9i>s(x2kw
z5#YbS-WPsm;B%1rUWClAUw|s-p*R)y#6jn8mVfqmD`O&Ty4{sSrTV!OZCd?}i#*q-
zK2Pm=9kNHi*7#2kxz?>DKUFS3{!|YL>u>N>KhfF*{JQH(`C3S<zRX*_8jZt>M!`oR
z*_jyTg_y}cIVGp@7M0hR{XLiaL;T@h5Vt(YvOsf?!<eMs^!KQa(|dl)<-~BwVgs|g
zPW6ju%k)&7J{Br|^2a4QG`o_Gb>iu_+)Mk56a5ChEc^+HRhNW@pWOC{flW85y>AAF
zO|o)pe_?!|fiH`v0&Tk+zSw=gfvvTDS)grq!>2h|PqH|M^XjFuik}<V#MY3sj*)(P
z2|!hKcu4JgD{$=c_8VYjH>y$uvFq-d;S(KN56*@R%=#~%8HW7HZY}?@70Aw+`+)AH
z-e&@pgBhRJz0@b>EOy@qO6nh@N0j90K*yjPK5<Fzc*4M^o8;DqEF8^z{oZ@QCwmL1
zgL+Es4bBdD!pHSADxeOJYy3AtZ9nOpIf<KFLc=Fpq@*VectsjV{kwQp@M(T2oZh45
z@%=zH*P3wr;r`ICj?MJGx&N(L)+bddK>FbOfnpOcH+&^M1-apN5IXM+9Gmb3+~0~_
z_t<miV%$&SUb4&{MbB3I9Lb}8<>BNPI9JNaPl7I5?n%s%pQL{EG_oO4-$XhP=|Cgt
zfY7l3QoCP8f7CJ~OTFIWO%&6TdY?7wv2W~t4TO$cLtAgsK7wLw<|HRZJmDv|w1ASC
zGFJt)kb=~%S3K1ZqMxhgk8#ax{2R-DmKq`pCqdXy|MDljqkUp|%JeTs*}KO|gOELa
zqgwf=4}V-v9cWL@V+=1SZeG4q4S$M9ntcJRA?TM$?|(Z~?$yda8((3QeQ|2gdz>}E
zy|7>T(>|T_#FEe_kva5Xp#B&yy5n2^=)cSKf5d#aX8y7`ivEY&Lf0L?{Dt-N@hrko
zGj(=P=PVMd!m~N%zVV|!G*6?!xA0d|6Tr8*pKUQ?26^w5Ki_s0`p8Bs+{qW4{`sAn
z=#4IeO8m(-rVqTw&ePDD63V&X*4bn)Psc%Mzp?K4TZQcKq$-d-wlehjN|(EStt5X3
z#<pULr_dQ48rS;w!oL0={;WZY426k9b!9&(Mx#i7TQka9#q(r<bCo@*kRRO+{MzQw
z`=OHj6*eC&Vm@)2Z#CceU69=V7|yfHF&-GVHG$%iG|uZme`egjV9bW}JwLY7)&{a$
zjj;YC84De^;QD{m)`nEy^P%=ZCH<LE{-w1e-+DRD32SZqvqLKyf<N^^=I|%DoKP%n
z$p7BmApGY-X5ceB|B<eS;LoqQ0^@-jEV8EuI(r(X4XRfE+4<t~eGKxKdY9HWe?0pm
zbleODj7yg%@&(bjuC@G?<X=E%1H{b_lyVE6)p%GtQ$6^leH~2=q5b<WAB4)C<Wxz2
z*!lrwN%B0Kr!_yF>HLLR{)MqVj8k7zAN<Y4-0rbG#mPa8yDtu%yQBQwIJ4hX=7-1*
zeT(B^K~1<<#b3^$ypJ${iP(9E^?yA|b90#Em)2s^jwK-VES(`gjcd=x+1a~V?$yJT
cON150!6F@qbRg1!@N@u=2Sq88K-CiX4@F-@-v9sr

literal 0
HcmV?d00001

diff --git a/examples/sendE2E/sender-favicon.ico b/examples/sendE2E/sender-favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..149d6cb2fdb5e20b4a4f80a5797878f73e14d25e
GIT binary patch
literal 15406
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

literal 0
HcmV?d00001

diff --git a/examples/sendE2E/xxdk.js b/examples/sendE2E/xxdk.js
index 9a0840c0..533eead2 100644
--- a/examples/sendE2E/xxdk.js
+++ b/examples/sendE2E/xxdk.js
@@ -59,6 +59,7 @@ async function SendE2e(ndf, recipientContactFile, myContactFileName, statePath,
 
     let confirm = false;
     let confirmContact;
+    let e2eClient;
     let authCallbacks = {
         Confirm: function (contact, receptionId, ephemeralId, roundId) {
             confirm = true;
@@ -69,6 +70,15 @@ async function SendE2e(ndf, recipientContactFile, myContactFileName, statePath,
             console.log("ephemeralId: " + roundId.toString());
 
             output.innerHTML += "Received confirmation from " + ephemeralId.toString() + "<br />"
+        },
+        Request: function (contact, receptionId, ephemeralId, roundId) {
+            console.log("Request:");
+            console.log("contact: " + dec.decode(contact));
+            console.log("receptionId: " + ephemeralId.toString());
+            console.log("ephemeralId: " + roundId.toString());
+
+            e2eClient.Confirm(contact)
+            output.innerHTML += "Received Request from " + ephemeralId.toString() + "<br />"
         }
     }
 
@@ -76,7 +86,9 @@ async function SendE2e(ndf, recipientContactFile, myContactFileName, statePath,
     // Pass in auth object which controls auth callbacks for this client
     const params = GetDefaultE2EParams();
     console.log("Using E2E parameters: " + dec.decode(params));
-    let e2eClient = Login(net.GetID(), authCallbacks, identity, params);
+    e2eClient = Login(net.GetID(), authCallbacks, identity, params);
+
+    e2eClient.DeleteAllRequests()
 
 
     ////////////////////////////////////////////////////////////////////////////
@@ -88,21 +100,8 @@ async function SendE2e(ndf, recipientContactFile, myContactFileName, statePath,
 
     output.innerHTML += "Starting network follower<br />"
 
-    // Set up a wait for the network to be connected
-    let health = false
-    const n = 100
-    let myPromise = new Promise(async function (myResolve, myReject) {
-        for (let i = 0; (health === false) && (i < n); i++) {
-            await sleep(100)
-        }
-        if (health === true) {
-            myResolve("OK");
-        } else {
-            myReject("timed out waiting for healthy network");
-        }
-    });
-
     // Provide a callback that will be signalled when network health status changes
+    let health = false
     net.AddHealthCallback({
         Callback: function (healthy) {
             health = healthy;
@@ -110,17 +109,18 @@ async function SendE2e(ndf, recipientContactFile, myContactFileName, statePath,
     });
     await sleep(3000)
 
-    // Wait until connected or crash on timeout
-    myPromise.then(
-        function (value) {
-            output.innerHTML += "Network is healthy<br />"
-            console.log("network is healthy")
-        },
-        function (error) {
-            output.innerHTML += "Network is not healthy<br />"
-            // throw error;
-        }
-    );
+
+    const n = 100
+    for (let i = 0; (health === false) && (i < n); i++) {
+        await sleep(100)
+    }
+
+    if (health === false) {
+        console.error("Continuing with unhealthy network")
+        output.innerHTML += "Network NOT healthy<br />"
+    } else {
+        output.innerHTML += "Network healthy<br />"
+    }
 
 
     ////////////////////////////////////////////////////////////////////////////
@@ -154,13 +154,22 @@ async function SendE2e(ndf, recipientContactFile, myContactFileName, statePath,
         let exists = false;
         output.innerHTML += "getting ID from contact<br />"
         const recipientContactID = GetIDFromContact(recipientContactFile);
-        output.innerHTML += "Checking for " + btoa(recipientContactID) + "<br />"
-        let partners = e2eClient.GetAllPartnerIDs();
+        console.log(typeof recipientContactID)
+        console.log("recipientContactID: " + recipientContactID)
+
+        output.innerHTML += "Checking for " + recipientContactID + "<br />"
+
+
+        const partnerIDS = dec.decode(e2eClient.GetAllPartnerIDs())
+        console.log("partnerIDS: " + partnerIDS)
+        let partners = JSON.parse(partnerIDS);
 
         for (let i = 0; i < partners.length; i++) {
+            const partnerBytes = base64ToArrayBuffer(partners[i])
+            console.log("partner " + recipientContactID + " == " + i + " " + partnerBytes)
 
-            if (partners[i] === recipientContactID) {
-                console.log("partner " + btoa(recipientContactID) + " matches partner " + i + " " + btoa(partners[i]))
+            if (partnerBytes.toString() === recipientContactID.toString()) {
+                console.log("MATCH! partner " + recipientContactID + " matches partner " + i + " " + partnerBytes)
                 exists = true;
                 break
             }
@@ -168,7 +177,7 @@ async function SendE2e(ndf, recipientContactFile, myContactFileName, statePath,
 
         // If the partner does not exist, send a request
         if (exists === false) {
-            output.innerHTML += "Request sent to " + btoa(recipientContactID) + "<br />"
+            output.innerHTML += "Partner does not exist, Request sent to " + recipientContactID + "<br />"
             const factList = enc.encode('[]')
             e2eClient.Request(enc.encode(recipientContactFile), factList)
 
@@ -176,17 +185,19 @@ async function SendE2e(ndf, recipientContactFile, myContactFileName, statePath,
                 await sleep(50)
             }
             if (confirm === false) {
-                output.innerHTML += "Checking for " + recipientContactID + "<br />"
-                throw new Error("timed out waiting for confirmation")
+                output.innerHTML += "Checking for " + recipientContactIDBase64 + "<br />"
+                console.error(new Error("timed out waiting for confirmation"))
             }
 
             const confirmContactID = GetIDFromContact(confirmContact)
-            if (recipientContactID !== confirmContactID) {
+            if (recipientContactID.toString() !== confirmContactID.toString()) {
                 throw new Error("contact ID from confirmation " +
                     btoa(dec.decode(confirmContactID)) +
                     " does not match recipient ID " +
-                    btoa(dec.decode(recipientContactID)))
+                    recipientContactIDBase64)
             }
+        } else {
+            output.innerHTML += "Partner exists<br />"
         }
 
         ////////////////////////////////////////////////////////////////////////////
@@ -197,8 +208,10 @@ async function SendE2e(ndf, recipientContactFile, myContactFileName, statePath,
         const msgBody = "If this message is sent successfully, we'll have established contact with the recipient."
 
         output.innerHTML += "Sending E2E message<br />"
-        const paramsObj = JSON.parse(dec.decode(params))
-        const e2eSendReport = e2eClient.SendE2E(2, recipientContactID, enc.encode(msgBody), enc.encode(JSON.stringify(paramsObj.Base)))
+        // const paramsObj = JSON.parse(dec.decode(params))
+        // const e2eParams = JSON.stringify(paramsObj.Base)
+        // console.log("e2eParams: " + e2eParams)
+        const e2eSendReport = e2eClient.SendE2E(2, recipientContactID, enc.encode(msgBody), params)
 
         console.log("e2e send report: " + dec.decode(e2eSendReport))
         output.innerHTML += "Send e2e: " + dec.decode(e2eSendReport) + "<br />"
@@ -223,3 +236,13 @@ function download(filename, text) {
 
     document.body.removeChild(element);
 }
+
+function base64ToArrayBuffer(base64) {
+    const binary_string = window.atob(base64);
+    const len = binary_string.length;
+    const bytes = new Uint8Array(len);
+    for (let i = 0; i < len; i++) {
+        bytes[i] = binary_string.charCodeAt(i);
+    }
+    return bytes;
+}
\ No newline at end of file
diff --git a/wasm/e2e.go b/wasm/e2e.go
index 9ae1551b..98203fc7 100644
--- a/wasm/e2e.go
+++ b/wasm/e2e.go
@@ -210,20 +210,23 @@ func newAuthCallbacks(value js.Value) *authCallbacks {
 func (a *authCallbacks) Request(
 	contact, receptionId []byte, ephemeralId, roundId int64) {
 	if a.request != nil {
-		a.request(contact, receptionId, ephemeralId, roundId)
+		a.request(CopyBytesToJS(contact), CopyBytesToJS(receptionId),
+			ephemeralId, roundId)
 	}
 }
 
 func (a *authCallbacks) Confirm(
 	contact, receptionId []byte, ephemeralId, roundId int64) {
 	if a.confirm != nil {
-		a.confirm(contact, receptionId, ephemeralId, roundId)
+		a.confirm(CopyBytesToJS(contact), CopyBytesToJS(receptionId),
+			ephemeralId, roundId)
 	}
 
 }
 func (a *authCallbacks) Reset(
 	contact, receptionId []byte, ephemeralId, roundId int64) {
 	if a.reset != nil {
-		a.reset(contact, receptionId, ephemeralId, roundId)
+		a.reset(CopyBytesToJS(contact), CopyBytesToJS(receptionId),
+			ephemeralId, roundId)
 	}
 }
diff --git a/wasm/utils.go b/wasm/utils.go
index 7959879b..5c7a62ad 100644
--- a/wasm/utils.go
+++ b/wasm/utils.go
@@ -45,7 +45,7 @@ func WrapCB(parent js.Value, m string) func(args ...interface{}) js.Value {
 	}
 
 	return func(args ...interface{}) js.Value {
-		return parent.Call(m, args)
+		return parent.Call(m, args...)
 	}
 }
 
-- 
GitLab