WebSocket and PyWorker fixes (#2366)

* WebSocket and PyWorker fixes

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Andrea Giammarchi
2025-07-24 15:03:51 +02:00
committed by GitHub
parent eaa6711756
commit a129be8136
4 changed files with 30 additions and 9 deletions

File diff suppressed because one or more lines are too long

View File

@@ -67,7 +67,11 @@ if RUNNING_IN_WORKER:
else:
import _pyscript
from _pyscript import PyWorker, js_import
from _pyscript import PyWorker as _PyWorker, js_import
from pyscript.ffi import to_js
def PyWorker(url, **kw):
return _PyWorker(url, to_js(kw))
window = globalThis
document = globalThis.document

View File

@@ -1,6 +1,6 @@
import js
from pyscript.ffi import create_proxy
from pyscript.util import as_bytearray
from pyscript.util import as_bytearray, is_awaitable
code = "code"
protocols = "protocols"
@@ -8,6 +8,23 @@ reason = "reason"
methods = ["onclose", "onerror", "onmessage", "onopen"]
def add_listener(socket, onevent, listener):
p = create_proxy(listener)
if is_awaitable(listener):
async def wrapper(e):
await p(EventMessage(e))
m = wrapper
else:
m = lambda e: p(EventMessage(e))
# Pyodide fails at setting socket[onevent] directly
setattr(socket, onevent, m)
class EventMessage:
def __init__(self, event):
self._event = event
@@ -36,20 +53,20 @@ class WebSocket:
socket = js.WebSocket.new(url, kw[protocols])
else:
socket = js.WebSocket.new(url)
socket.binaryType = "arraybuffer"
object.__setattr__(self, "_ws", socket)
for t in methods:
if t in kw:
# Pyodide fails at setting socket[t] directly
setattr(socket, t, create_proxy(kw[t]))
add_listener(socket, t, kw[t])
def __getattr__(self, attr):
return getattr(self._ws, attr)
def __setattr__(self, attr, value):
if attr in methods:
m = lambda e: value(EventMessage(e))
setattr(self._ws, attr, create_proxy(m))
add_listener(self._ws, attr, value)
else:
setattr(self._ws, attr, value)

View File

@@ -14,7 +14,7 @@
print(event.type)
ws.send("hello")
def onmessage(event):
async def onmessage(event):
print(event.type, event.data)
ws.close()