<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type="text/css">
        pre {
            font-family: monospace;
            display: block;
            white-space: pre;
            font-size: 2em;
        }
    </style>
</head>
<body>
    <script type="text/javascript" src="../lib/olm/olm.js"></script>
    <script type="module">

        async function main() {
            const Olm = window.Olm;
            await Olm.init({
                locateFile: () => "../lib/olm/olm.wasm",
            });
            const alice = new Olm.Account();
            alice.create();
            console.log("alice", alice.identity_keys());

            const bob = new Olm.Account();
            bob.unpickle("secret", "EWfA87or4GgQ+wqVkyuFiW9gUk3FI6QSXgp8E2dS5RFLvXgy4oFvxwQ1gVnbMkdJz2Hy9ex9UmJ/ZyuRU0aRt0IwXpw/SUNq4IQeVJ7J/miXW7rV4Ep+4RSEf945KbDrokDCS2CoL5PIfv/NYyey32gA0hMi8wWIfIlOxFBV4SBJYSC+Qd54VjprwCg0Sn9vjQouKVrM/+5jzsv9+JK5OpWW0Vrb3qrXwyAOEAQ4WlOQcqZHAyPQIw");
            console.log("bob", bob.identity_keys());
            // generate OTK on receiver side
            bob.generate_one_time_keys(1);
            const bobOneTimeKeys = JSON.parse(bob.one_time_keys());
            const bobOneTimeKey = Object.values(bobOneTimeKeys.curve25519)[0];
            // encrypt
            const aliceSession = new Olm.Session();
            aliceSession.create_outbound(
                alice,
                JSON.parse(bob.identity_keys()).curve25519,
                bobOneTimeKey,
            );
            const message = aliceSession.encrypt("hello secret world");
            console.log("message", message);
            // decrypt
            const bobSession = new Olm.Session();
            bobSession.create_inbound(bob, message.body);
            const plaintext = bobSession.decrypt(message.type, message.body);
            console.log("plaintext", plaintext);
            // remove Bob's OTK as it was used to start an olm session
            console.log("bob OTK before removing", bob.one_time_keys());
            bob.remove_one_time_keys(bobSession);
            console.log("bob OTK after removing", bob.one_time_keys());
        }

        main();
    </script>
</body>
</html>