<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <a id="link" href="#">Download</a>
        <script type="text/javascript">
            var link = document.getElementById("link");

            function downloadBlob(blob, filename) {
                var url = URL.createObjectURL(blob);
                link.href = url;
                link.download = filename;
                link.click();
                URL.revokeObjectURL(url);
            }

            function toBase64(buffer) {
                const bytes = new Uint8Array(buffer);
                let binaryStr = "";
                for (let i = 0; i < bytes.byteLength; i++) {
                    binaryStr += String.fromCharCode(bytes[i]);
                }
                return btoa(binaryStr);
            }

            function downloadBuffer(buffer, mimeType, filename) {
                var url = "data:" + mimeType + ";base64," + toBase64(buffer);
                link.href = url;
                link.download = filename;
                link.click();
            }

            window.addEventListener("message", async function(event) {
                if (event.origin === window.location.origin) {
                    if (event.data.type === "downloadBuffer") {
                        await downloadBuffer(event.data.buffer, event.data.mimeType, event.data.filename);
                    } else if (event.data.type === "downloadBlob") {
                        await downloadBlob(event.data.blob, event.data.filename);
                    }
                }
            });
        </script>
    </body>
</html>