diff --git a/index.html b/index.html new file mode 100644 index 0000000..9898260 --- /dev/null +++ b/index.html @@ -0,0 +1,49 @@ + + +
+

Web worker demo

+ + +
+

+
+

+
+ +
+ + diff --git a/serve.sh b/serve.sh new file mode 100755 index 0000000..e4722f2 --- /dev/null +++ b/serve.sh @@ -0,0 +1,2 @@ +#!/bin/bash +python3 -m http.server 8009 diff --git a/webworker.js b/webworker.js new file mode 100644 index 0000000..24bd1db --- /dev/null +++ b/webworker.js @@ -0,0 +1,51 @@ +importScripts("https://cdn.jsdelivr.net/pyodide/dev/full/pyodide.js"); + +async function startDatasette() { + self.pyodide = await loadPyodide({indexURL : "https://cdn.jsdelivr.net/pyodide/dev/full/"}); + await pyodide.loadPackage('micropip'); + await pyodide.loadPackage('ssl'); + await pyodide.loadPackage('setuptools'); // For pkg_resources + await self.pyodide.runPythonAsync(` + # Grab that fixtures.db database + from pyodide.http import pyfetch + response = await pyfetch("https:/latest.datasette.io/fixtures.db") + with open("fixtures.db", "wb") as fp: + fp.write(await response.bytes()) + + import micropip + await micropip.install( + "https://s3.amazonaws.com/simonwillison-cors-allowed-public/python_baseconv-1.2.2-py3-none-any.whl", + keep_going=True + ) + await micropip.install( + "https://s3.amazonaws.com/simonwillison-cors-allowed-public/click_default_group-1.2.2-py3-none-any.whl", + keep_going=True + ) + await micropip.install( + "https://s3.amazonaws.com/simonwillison-cors-allowed-public/datasette-0.61.1-py3-none-any.whl", + keep_going=True + ) + from datasette.app import Datasette + ds = Datasette(["fixtures.db"], memory=True) + `); +} + +let readyPromise = startDatasette(); + +self.onmessage = async (event) => { + // make sure loading is done + await readyPromise; + console.log(event, event.data); + try { + let [status, text] = await self.pyodide.runPythonAsync( + ` + import json + response = await ds.client.get(${JSON.stringify(event.data.path)}) + [response.status_code, response.text] + ` + ); + self.postMessage({status, text}); + } catch (error) { + self.postMessage({ error: error.message }); + } +};