hyperdock_wasm.runtime.browser.templates.python#

Attributes#

python_template

Module Contents#

hyperdock_wasm.runtime.browser.templates.python.python_template = Multiline-String#
Show Value
"""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PyScript Offline</title>
    <script src="https://cdn.jsdelivr.net/pyodide/v0.26.4/full/pyodide.js"></script>
</head>
<body>
<script type="module">
    function loadConfig() {
        globalThis.toolConfigs = {
            envs: `{{ ENV_JSON }}`,
            body: `{{ BODY_JSON_B64 }}`,
            scriptID: `{{ SCRIPT_ID }}`
        }
    }
    async function _main() {
        // load the script configs
        loadConfig();

        // get entrypoint wheel
        const entrypointResp = await fetch(`/scripts/${globalThis.toolConfigs.scriptID}/entrypoint`);
        const { package_name: packageName, entrypoint } = await entrypointResp.json();

        // initialize pyodide
        const pyodide = await loadPyodide({
            env: JSON.parse(globalThis.toolConfigs.envs),
        });
        await pyodide.loadPackage("micropip");
        await pyodide.loadPackage("ssl");
        const micropip = pyodide.pyimport("micropip");
        await micropip.install(entrypoint);
        await micropip.install("pyodide-http")

        let emitted = false;
        const decodedBytes = atob(globalThis.toolConfigs.body);
        pyodide.setStdin({
            stdin: () => {
                if (emitted) {
                    return null;
                }
                emitted = true;
                return decodedBytes;
            },
            autoEOF: true,
        })
        let stdout = "";
        let stderr = "";
        pyodide.setStdout({
            batched: (x) => { stdout += x; },
        })
        pyodide.setStderr({
            batched: (x) => { stderr += x; },
        })
        await pyodide.runPythonAsync(`
import pyodide_http
pyodide_http.patch_all()

import ${packageName}
${packageName}.main()
`);
        console.log(stdout)
        await fetch(`/scripts/${globalThis.toolConfigs.scriptID}/done`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ stdout, stderr })
        });
    }

    async function main() {
        try {
            await _main();
        } catch (e) {
            console.error(e);
            await fetch(`/scripts/${globalThis.toolConfigs.scriptID}/done`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ error: e.message })
            });
        }
    }

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