mirror of
https://github.com/pyscript/pyscript.git
synced 2025-12-19 18:27:29 -05:00
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:
committed by
GitHub
parent
eaa6711756
commit
a129be8136
File diff suppressed because one or more lines are too long
@@ -67,7 +67,11 @@ if RUNNING_IN_WORKER:
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
import _pyscript
|
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
|
window = globalThis
|
||||||
document = globalThis.document
|
document = globalThis.document
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import js
|
import js
|
||||||
from pyscript.ffi import create_proxy
|
from pyscript.ffi import create_proxy
|
||||||
from pyscript.util import as_bytearray
|
from pyscript.util import as_bytearray, is_awaitable
|
||||||
|
|
||||||
code = "code"
|
code = "code"
|
||||||
protocols = "protocols"
|
protocols = "protocols"
|
||||||
@@ -8,6 +8,23 @@ reason = "reason"
|
|||||||
methods = ["onclose", "onerror", "onmessage", "onopen"]
|
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:
|
class EventMessage:
|
||||||
def __init__(self, event):
|
def __init__(self, event):
|
||||||
self._event = event
|
self._event = event
|
||||||
@@ -36,20 +53,20 @@ class WebSocket:
|
|||||||
socket = js.WebSocket.new(url, kw[protocols])
|
socket = js.WebSocket.new(url, kw[protocols])
|
||||||
else:
|
else:
|
||||||
socket = js.WebSocket.new(url)
|
socket = js.WebSocket.new(url)
|
||||||
|
|
||||||
|
socket.binaryType = "arraybuffer"
|
||||||
object.__setattr__(self, "_ws", socket)
|
object.__setattr__(self, "_ws", socket)
|
||||||
|
|
||||||
for t in methods:
|
for t in methods:
|
||||||
if t in kw:
|
if t in kw:
|
||||||
# Pyodide fails at setting socket[t] directly
|
add_listener(socket, t, kw[t])
|
||||||
setattr(socket, t, create_proxy(kw[t]))
|
|
||||||
|
|
||||||
def __getattr__(self, attr):
|
def __getattr__(self, attr):
|
||||||
return getattr(self._ws, attr)
|
return getattr(self._ws, attr)
|
||||||
|
|
||||||
def __setattr__(self, attr, value):
|
def __setattr__(self, attr, value):
|
||||||
if attr in methods:
|
if attr in methods:
|
||||||
m = lambda e: value(EventMessage(e))
|
add_listener(self._ws, attr, value)
|
||||||
setattr(self._ws, attr, create_proxy(m))
|
|
||||||
else:
|
else:
|
||||||
setattr(self._ws, attr, value)
|
setattr(self._ws, attr, value)
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
print(event.type)
|
print(event.type)
|
||||||
ws.send("hello")
|
ws.send("hello")
|
||||||
|
|
||||||
def onmessage(event):
|
async def onmessage(event):
|
||||||
print(event.type, event.data)
|
print(event.type, event.data)
|
||||||
ws.close()
|
ws.close()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user