Add browser_fetch helpers and async HTTP demos for Pyodide

Ship pyfetch-based fetch utilities in lib/, run asyncio scripts via
nest-asyncio in the worker, and add sample demos for HTTPS in the browser.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-14 22:34:34 +12:00
parent 98fa4260d4
commit d38f819c49
5 changed files with 255 additions and 11 deletions

38
lib/browser_fetch.py Normal file
View File

@@ -0,0 +1,38 @@
"""Browser-friendly async HTTP for the Pyodide worker.
These helpers use ``pyodide.http.pyfetch``, which maps to the browser
``fetch`` API (no Python TLS stack). Prefer them for ``https://`` in
Pyodide: ``aiohttp`` in the worker often raises
``RuntimeError('SSL is not supported.')`` for HTTPS even though the wheel
exists, because user-level SSL is not wired the same as on CPython.
The browser's normal rules apply: the page is served over HTTPS so
``http://`` URLs are blocked as mixed content, and the response host must
send permissive CORS headers (e.g. ``Access-Control-Allow-Origin``) or the
browser hides the body even if the request succeeded.
"""
from __future__ import annotations
from typing import Any
async def fetch_text(url: str) -> str:
from pyodide.http import pyfetch
r = await pyfetch(url)
return await r.text()
async def fetch_bytes(url: str) -> bytes:
from pyodide.http import pyfetch
r = await pyfetch(url)
return await r.bytes()
async def fetch_json(url: str, **kwargs: Any) -> Any:
from pyodide.http import pyfetch
r = await pyfetch(url)
return await r.json(**kwargs)