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