diff --git a/packages/kernel/py/stlite-server/poetry.lock b/packages/kernel/py/stlite-server/poetry.lock index 3277e1c6c..df3f53bb1 100644 --- a/packages/kernel/py/stlite-server/poetry.lock +++ b/packages/kernel/py/stlite-server/poetry.lock @@ -1126,6 +1126,17 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyodide-py" +version = "0.26.1" +description = "A Python package providing core interpreter functionality for Pyodide" +optional = false +python-versions = ">=3.12" +files = [ + {file = "pyodide_py-0.26.1-py3-none-any.whl", hash = "sha256:7b7a1be1c1faa5bfc642cf4bf6a8497793e5aa874f7fa8b53d1840c92dc2a13e"}, + {file = "pyodide_py-0.26.1.tar.gz", hash = "sha256:02f2e20f8babe016920e43d63dbae6e253954362d02de9059eb48fe669f017a6"}, +] + [[package]] name = "pyparsing" version = "3.1.2" @@ -1613,4 +1624,4 @@ watchmedo = ["PyYAML (>=3.10)"] [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "af05719fc03dd79cf7aea92ff35d93670eccc83ed19063b254a43dc772b2248b" +content-hash = "550f036d16912d4223d6c0b634544924dadbf7587840ce5e556b7ded90d6e25c" diff --git a/packages/kernel/py/stlite-server/pyproject.toml b/packages/kernel/py/stlite-server/pyproject.toml index 310d62d59..802eaabfd 100644 --- a/packages/kernel/py/stlite-server/pyproject.toml +++ b/packages/kernel/py/stlite-server/pyproject.toml @@ -16,6 +16,7 @@ streamlit-aggrid = "^1.0.5" pandas-stubs = "^2.2.2.240603" matplotlib = "^3.9.0" ruff = "^0.5.2" +pyodide-py = "^0.26.1" [build-system] requires = ["poetry-core>=1.0.0"] @@ -33,7 +34,7 @@ module = ["streamlit", "streamlit.*", "tests.*"] ignore_errors = true [[tool.mypy.overrides]] -module = ["pyodide", "pyodide.*", "matplotlib", "st_aggrid"] +module = ["st_aggrid"] ignore_missing_imports = true [tool.pytest.ini_options] diff --git a/packages/kernel/py/stlite-server/stlite_server/server.py b/packages/kernel/py/stlite-server/stlite_server/server.py index d4d2dfd54..4d62fc899 100644 --- a/packages/kernel/py/stlite-server/stlite_server/server.py +++ b/packages/kernel/py/stlite-server/stlite_server/server.py @@ -4,7 +4,7 @@ import urllib.parse from typing import Callable, Final, cast -import pyodide +import pyodide.ffi from streamlit.proto.BackMsg_pb2 import BackMsg from streamlit.proto.ForwardMsg_pb2 import ForwardMsg from streamlit.runtime import Runtime, RuntimeConfig, SessionClient @@ -102,7 +102,10 @@ def start_websocket(self, path: str, on_message): raise RuntimeError("Invalid WebSocket endpoint") self._websocket_handler.open(on_message) - def receive_websocket_from_js(self, payload_from_js: pyodide.ffi.JsProxy): + def receive_websocket_from_js( + self, + payload_from_js: pyodide.ffi.JsBuffer, # Unit8Array value is passed from JS + ): payload = payload_from_js.to_bytes() if not isinstance(payload, bytes): @@ -120,14 +123,16 @@ def receive_http_from_js( self, method: str, path: str, - headers: pyodide.ffi.JsProxy, - body: str | pyodide.ffi.JsProxy, + headers_proxy: pyodide.ffi.JsProxy, # object is passed from JS + body_proxy: str + | pyodide.ffi.JsBuffer, # string or ArrayBuffer value is passed from JS on_response: Callable[[int, dict, bytes], None], ): - headers = headers.to_py() + headers: dict = headers_proxy.to_py() - if isinstance(body, pyodide.ffi.JsProxy): - body = body.to_bytes() + body: str | bytes = ( + body_proxy if isinstance(body_proxy, str) else body_proxy.to_bytes() + ) return self.receive_http( method=method, @@ -153,11 +158,10 @@ def receive_http( # Find the handler for the path and method. handler = None for path_regex, handler_candidate in self._routes: - match = path_regex.match(path) - if match: + if match := path_regex.match(path): handler = handler_candidate break - if handler is None: + else: on_response(404, {}, b"No handler found") return method_name = method.lower()