Repository: pyscript/pyscript (language: python)

Issue:
example code in user documentation for pyscript WebSocket fails with pyodide
### Checklist

- [X] I added a descriptive title
- [X] I searched for other issues and couldn't find a solution or duplication
- [X] I already searched in Google and didn't find any good information or help

### What happened?

The example code for WebSocket given in the pyscript user documentation works without problems under micropython but gives an error with pyodide.

### What browsers are you seeing the problem on? (if applicable)

Chrome

### Console info

```shell
Traceback (most recent call last):
  File "/lib/python312.zip/_pyodide/_base.py", line 596, in eval_code_async
    await CodeRunner(
  File "/lib/python312.zip/_pyodide/_base.py", line 410, in run_async
    coroutine = eval(self.code, globals, locals)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<exec>", line 17, in <module>
  File "/home/pyodide/pyscript/websocket.py", line 50, in __setattr__
    self._ws[attr] = value
    ~~~~~~~~^^^^^^
TypeError: 'pyodide.ffi.JsProxy' object does not support item assignment
```


### Additional Context

Using pyscript 2024.8.2


Discussion / hints:

Fix patch:
diff --git a/pyscript.core/package-lock.json b/pyscript.core/package-lock.json
index ea94c12cc4f..859efda3f33 100644
--- a/pyscript.core/package-lock.json
+++ b/pyscript.core/package-lock.json
@@ -1,17 +1,17 @@
 {
     "name": "@pyscript/core",
-    "version": "0.5.5",
+    "version": "0.5.6",
     "lockfileVersion": 3,
     "requires": true,
     "packages": {
         "": {
             "name": "@pyscript/core",
-            "version": "0.5.5",
+            "version": "0.5.6",
             "license": "APACHE-2.0",
             "dependencies": {
                 "@ungap/with-resolvers": "^0.1.0",
                 "basic-devtools": "^0.1.6",
-                "polyscript": "^0.15.0",
+                "polyscript": "^0.15.1",
                 "sticky-module": "^0.1.1",
                 "to-json-callback": "^0.1.1",
                 "type-checked-collections": "^0.1.7"
@@ -21,7 +21,7 @@
                 "@codemirror/lang-python": "^6.1.6",
                 "@codemirror/language": "^6.10.2",
                 "@codemirror/state": "^6.4.1",
-                "@codemirror/view": "^6.30.0",
+                "@codemirror/view": "^6.33.0",
                 "@playwright/test": "1.45.3",
                 "@rollup/plugin-commonjs": "^26.0.1",
                 "@rollup/plugin-node-resolve": "^15.2.3",
@@ -29,12 +29,12 @@
                 "@webreflection/toml-j0.4": "^1.1.3",
                 "@xterm/addon-fit": "^0.10.0",
                 "@xterm/addon-web-links": "^0.11.0",
-                "bun": "^1.1.21",
+                "bun": "^1.1.26",
                 "chokidar": "^3.6.0",
                 "codemirror": "^6.0.1",
-                "eslint": "^9.8.0",
+                "eslint": "^9.9.1",
                 "flatted": "^3.3.1",
-                "rollup": "^4.20.0",
+                "rollup": "^4.21.1",
                 "rollup-plugin-postcss": "^4.0.2",
                 "rollup-plugin-string": "^3.0.0",
                 "static-handler": "^0.4.3",
@@ -136,9 +136,9 @@
             "license": "MIT"
         },
         "node_modules/@codemirror/view": {
-            "version": "6.30.0",
-            "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.30.0.tgz",
-            "integrity": "sha512-96Nmn8OeLh6aONQprIeYk8hGVnEuYpWuxKSkdsODOx9hWPxyuyZGvmvxV/JmLsp+CubMO1PsLaN5TNNgrl0UrQ==",
+            "version": "6.33.0",
+            "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.33.0.tgz",
+            "integrity": "sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
@@ -187,9 +187,9 @@
             }
         },
         "node_modules/@eslint/config-array": {
-            "version": "0.17.1",
-            "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz",
-            "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==",
+            "version": "0.18.0",
+            "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
+            "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
             "dev": true,
             "license": "Apache-2.0",
             "dependencies": {
@@ -226,9 +226,9 @@
             }
         },
         "node_modules/@eslint/js": {
-            "version": "9.8.0",
-            "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz",
-            "integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==",
+            "version": "9.9.1",
+            "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz",
+            "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==",
             "dev": true,
             "license": "MIT",
             "engines": {
@@ -462,9 +462,9 @@
             }
         },
         "node_modules/@oven/bun-darwin-aarch64": {
-            "version": "1.1.21",
-            "resolved": "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.1.21.tgz",
-            "integrity": "sha512-n1hZewJPZg5XcubisWDaKn/wLaldgagAWya3ZuMBuFwsz4PnGTeQ7Wl3aBe7XzW6fNUAd+ZIfvfNYBRNv1R7Rw==",
+            "version": "1.1.26",
+            "resolved": "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.1.26.tgz",
+            "integrity": "sha512-E8/3i0RIvsIWS+kyeIlbwBh+4qB5DsQIfcO6xr4p3t7tEzvRWnrFkJrbJthru/eB1UsVV9PJ/hsxTrp3m3za4A==",
             "cpu": [
                 "arm64"
             ],
@@ -476,9 +476,9 @@
             ]
         },
         "node_modules/@oven/bun-darwin-x64": {
-            "version": "1.1.21",
-            "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.1.21.tgz",
-            "integrity": "sha512-Vr7tz6UBrtkJ0UMCQBRhKH/JThWxkZWnGAmcGFf8h3zFgMfCaTmmWzB4PSCad1wu+4GCrmVoEG8P7MY8+TmS7w==",
+            "version": "1.1.26",
+            "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.1.26.tgz",
+            "integrity": "sha512-ENRAAGBr2zh0VfETZXqcNPO3ZnnKDX3U6E/oWY+J70uWa9dJqRlRaj1oLB63AGoYJBNdhEcsSmTAk7toCJ+PGQ==",
             "cpu": [
                 "x64"
             ],
@@ -490,9 +490,9 @@
             ]
         },
         "node_modules/@oven/bun-darwin-x64-baseline": {
-            "version": "1.1.21",
-            "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.1.21.tgz",
-            "integrity": "sha512-4MhDFYONGIg2MqO56u6H/X9TD3+hbDQpOjlGdl7J0aUiV47b3k7vLn5hENYEjAIBR3g744E23rIw4FQAXakFMw==",
+            "version": "1.1.26",
+            "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.1.26.tgz",
+            "integrity": "sha512-36HQlQfbrwP//xOS5VFN9AR/iH6BDQo3y8j5282DmRO+h6jylwlg+2+Sfz+1uXDOLDQWCbnNv3Mpl8+Ltso6cQ==",
             "cpu": [
                 "x64"
             ],
@@ -504,9 +504,9 @@
             ]
         },
         "node_modules/@oven/bun-linux-aarch64": {
-            "version": "1.1.21",
-            "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.1.21.tgz",
-            "integrity": "sha512-0avxsNle8QOLsDwo1lqO1o2Mv1bLp3RlVr83XNV2yGVnzCwZmupQcI76fcc2e+Y+YU173xCUasMkiIbguS271g==",
+            "version": "1.1.26",
+            "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.1.26.tgz",
+            "integrity": "sha512-MqE/ClaEMW6B5i5UIYJnHbadWLt6QQQHV3NBlXd78Mhx1OiZY0YmARQmAItPUp9mxIEgGuA2QyrKvgGD3pzWPQ==",
             "cpu": [
                 "arm64"
             ],
@@ -518,9 +518,9 @@
             ]
         },
         "node_modules/@oven/bun-linux-x64": {
-            "version": "1.1.21",
-            "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.1.21.tgz",
-            "integrity": "sha512-zmps8oWLE2L+9Cn6oQPbcxIWDIjOT1txbYAv9zlcd84I12DXiB++e/PEE8dPe/3powygCpwZM9b7gZfTv9sx0w==",
+            "version": "1.1.26",
+            "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.1.26.tgz",
+            "integrity": "sha512-sD/ZegJpnBg93qsKsiGnJgTROc68CWONwZpvtL65cBROLBqKb965ofhPUaM5oV8HckfaTDmT37cks59hG+tHvw==",
             "cpu": [
                 "x64"
             ],
@@ -532,9 +532,9 @@
             ]
         },
         "node_modules/@oven/bun-linux-x64-baseline": {
-            "version": "1.1.21",
-            "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.1.21.tgz",
-            "integrity": "sha512-HT+PEWa2PY73gBrNuUHrihsGNOBQKp6s6IzAqHUfmDlIyXYaEvRYUZg6vEqyRRSuNcCC6PiQDHWZP99OT2VMZg==",
+            "version": "1.1.26",
+            "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.1.26.tgz",
+            "integrity": "sha512-jQeSLodwfQu5pG529jYG73VSFq26hdrTspxo9E/1B1WvwKrs2Vtz3w32zv+JWH+gvZqc28A/yK6pAmzQMiscNg==",
             "cpu": [
                 "x64"
             ],
@@ -546,9 +546,9 @@
             ]
         },
         "node_modules/@oven/bun-windows-x64": {
-            "version": "1.1.21",
-            "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.1.21.tgz",
-            "integrity": "sha512-p9rjwZPiJJtBafJ7MoJvmqyCA4QxVVpM7QaDx6Lhqua7b+i7dsigog8BgeCxGXAMpSKqoBuAuziqnLh0pcdAYQ==",
+            "version": "1.1.26",
+            "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.1.26.tgz",
+            "integrity": "sha512-EkyW6JYnZPFxD9XsdEDqFxVCnWnAoyacUAiOEUYAiz8LsnbHLMlOfbdw7KYzvm7UPFoEkUZKD78eSdpg6q6c+Q==",
             "cpu": [
                 "x64"
             ],
@@ -560,9 +560,9 @@
             ]
         },
         "node_modules/@oven/bun-windows-x64-baseline": {
-            "version": "1.1.21",
-            "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.1.21.tgz",
-            "integrity": "sha512-xwPqSrcdSAJVmCnDlpvEWVHDSf9lmCBIcL5PtM9udrqTJOAVxiyQm0cpXjuv/h6MAZxt7rtt9YqrcK0ixA2xIQ==",
+            "version": "1.1.26",
+            "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.1.26.tgz",
+            "integrity": "sha512-qb593xu9WIKBCHd47z7ZaZTC9h8r4T6qDbBV/XGLhxdZEJb24ePWdhW8WoHxa9hsATio9SByozqwblXb2tJncw==",
             "cpu": [
                 "x64"
             ],
@@ -699,9 +699,9 @@
             }
         },
         "node_modules/@rollup/rollup-android-arm-eabi": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz",
-            "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz",
+            "integrity": "sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==",
             "cpu": [
                 "arm"
             ],
@@ -713,9 +713,9 @@
             ]
         },
         "node_modules/@rollup/rollup-android-arm64": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz",
-            "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz",
+            "integrity": "sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==",
             "cpu": [
                 "arm64"
             ],
@@ -727,9 +727,9 @@
             ]
         },
         "node_modules/@rollup/rollup-darwin-arm64": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz",
-            "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz",
+            "integrity": "sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==",
             "cpu": [
                 "arm64"
             ],
@@ -741,9 +741,9 @@
             ]
         },
         "node_modules/@rollup/rollup-darwin-x64": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz",
-            "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz",
+            "integrity": "sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==",
             "cpu": [
                 "x64"
             ],
@@ -755,9 +755,9 @@
             ]
         },
         "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz",
-            "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz",
+            "integrity": "sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==",
             "cpu": [
                 "arm"
             ],
@@ -769,9 +769,9 @@
             ]
         },
         "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz",
-            "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz",
+            "integrity": "sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==",
             "cpu": [
                 "arm"
             ],
@@ -783,9 +783,9 @@
             ]
         },
         "node_modules/@rollup/rollup-linux-arm64-gnu": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz",
-            "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz",
+            "integrity": "sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==",
             "cpu": [
                 "arm64"
             ],
@@ -797,9 +797,9 @@
             ]
         },
         "node_modules/@rollup/rollup-linux-arm64-musl": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz",
-            "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz",
+            "integrity": "sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==",
             "cpu": [
                 "arm64"
             ],
@@ -811,9 +811,9 @@
             ]
         },
         "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz",
-            "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz",
+            "integrity": "sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==",
             "cpu": [
                 "ppc64"
             ],
@@ -825,9 +825,9 @@
             ]
         },
         "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz",
-            "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz",
+            "integrity": "sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==",
             "cpu": [
                 "riscv64"
             ],
@@ -839,9 +839,9 @@
             ]
         },
         "node_modules/@rollup/rollup-linux-s390x-gnu": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz",
-            "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz",
+            "integrity": "sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==",
             "cpu": [
                 "s390x"
             ],
@@ -853,9 +853,9 @@
             ]
         },
         "node_modules/@rollup/rollup-linux-x64-gnu": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz",
-            "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.1.tgz",
+            "integrity": "sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==",
             "cpu": [
                 "x64"
             ],
@@ -867,9 +867,9 @@
             ]
         },
         "node_modules/@rollup/rollup-linux-x64-musl": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz",
-            "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz",
+            "integrity": "sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==",
             "cpu": [
                 "x64"
             ],
@@ -881,9 +881,9 @@
             ]
         },
         "node_modules/@rollup/rollup-win32-arm64-msvc": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz",
-            "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz",
+            "integrity": "sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==",
             "cpu": [
                 "arm64"
             ],
@@ -895,9 +895,9 @@
             ]
         },
         "node_modules/@rollup/rollup-win32-ia32-msvc": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz",
-            "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz",
+            "integrity": "sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==",
             "cpu": [
                 "ia32"
             ],
@@ -909,9 +909,9 @@
             ]
         },
         "node_modules/@rollup/rollup-win32-x64-msvc": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz",
-            "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz",
+            "integrity": "sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==",
             "cpu": [
                 "x64"
             ],
@@ -1202,9 +1202,9 @@
             }
         },
         "node_modules/bun": {
-            "version": "1.1.21",
-            "resolved": "https://registry.npmjs.org/bun/-/bun-1.1.21.tgz",
-            "integrity": "sha512-mvqYEvafGskIVTjlftbKvsXtyR6z/SQnhJsVw0xCU46pc56oX1sAGvaemWKOy/sy/gGMHcgLE0KUidDQQzqXWQ==",
+            "version": "1.1.26",
+            "resolved": "https://registry.npmjs.org/bun/-/bun-1.1.26.tgz",
+            "integrity": "sha512-dWSewAqE7sVbYmflJxgG47dW4vmsbar7VAnQ4ao45y3ulr3n7CwdsMLFnzd28jhPRtF+rsaVK2y4OLIkP3OD4A==",
             "cpu": [
                 "arm64",
                 "x64"
@@ -1222,14 +1222,14 @@
                 "bunx": "bin/bun.exe"
             },
             "optionalDependencies": {
-                "@oven/bun-darwin-aarch64": "1.1.21",
-                "@oven/bun-darwin-x64": "1.1.21",
-                "@oven/bun-darwin-x64-baseline": "1.1.21",
-                "@oven/bun-linux-aarch64": "1.1.21",
-                "@oven/bun-linux-x64": "1.1.21",
-                "@oven/bun-linux-x64-baseline": "1.1.21",
-                "@oven/bun-windows-x64": "1.1.21",
-                "@oven/bun-windows-x64-baseline": "1.1.21"
+                "@oven/bun-darwin-aarch64": "1.1.26",
+                "@oven/bun-darwin-x64": "1.1.26",
+                "@oven/bun-darwin-x64-baseline": "1.1.26",
+                "@oven/bun-linux-aarch64": "1.1.26",
+                "@oven/bun-linux-x64": "1.1.26",
+                "@oven/bun-linux-x64-baseline": "1.1.26",
+                "@oven/bun-windows-x64": "1.1.26",
+                "@oven/bun-windows-x64-baseline": "1.1.26"
             }
         },
         "node_modules/callsites": {
@@ -1344,9 +1344,9 @@
             }
         },
         "node_modules/coincident": {
-            "version": "2.0.6",
-            "resolved": "https://registry.npmjs.org/coincident/-/coincident-2.0.6.tgz",
-            "integrity": "sha512-NMTtehZKCKfYj6X4EAv9e+Rpjg84/gyM/O2M1culPcMZuCKrUnJql99KqDEE7m7V1W16Ou3vmLj8MzAJQB4Gcg==",
+            "version": "2.0.7",
+            "resolved": "https://registry.npmjs.org/coincident/-/coincident-2.0.7.tgz",
+            "integrity": "sha512-kfQTQFShg8znBkorQs8VfDhpHbUsFRauufeoabssPfpp6TUQx5hgNWfTgPxO1szaZb/V/9FkxRl3BqN2t0SAKg==",
             "license": "MIT",
             "dependencies": {
                 "gc-hook": "^0.4.1",
@@ -1748,17 +1748,17 @@
             }
         },
         "node_modules/eslint": {
-            "version": "9.8.0",
-            "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.8.0.tgz",
-            "integrity": "sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==",
+            "version": "9.9.1",
+            "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz",
+            "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.2.0",
                 "@eslint-community/regexpp": "^4.11.0",
-                "@eslint/config-array": "^0.17.1",
+                "@eslint/config-array": "^0.18.0",
                 "@eslint/eslintrc": "^3.1.0",
-                "@eslint/js": "9.8.0",
+                "@eslint/js": "9.9.1",
                 "@humanwhocodes/module-importer": "^1.0.1",
                 "@humanwhocodes/retry": "^0.3.0",
                 "@nodelib/fs.walk": "^1.2.8",
@@ -1797,6 +1797,14 @@
             },
             "funding": {
                 "url": "https://eslint.org/donate"
+            },
+            "peerDependencies": {
+                "jiti": "*"
+            },
+            "peerDependenciesMeta": {
+                "jiti": {
+                    "optional": true
+                }
             }
         },
         "node_modules/eslint-scope": {
@@ -2407,9 +2415,9 @@
             }
         },
         "node_modules/js-proxy": {
-            "version": "0.4.3",
-            "resolved": "https://registry.npmjs.org/js-proxy/-/js-proxy-0.4.3.tgz",
-            "integrity": "sha512-zSkaj+H6V8YiNF/CnHMYDarE+uNFYWEgW9R7xXjSPUchpCdKipS4MEW4HLJ0FA6oQeI7y2nUwx3g0WpRXZTi0w==",
+            "version": "0.4.4",
+            "resolved": "https://registry.npmjs.org/js-proxy/-/js-proxy-0.4.4.tgz",
+            "integrity": "sha512-f2Av1PIsa2Wtgb0VfDehK7aglp8eby2rLsD5juLWcYPlJsWp0WUxyK9r18hjzV9N0ejA76x6kw1v/YlJvKwycw==",
             "license": "MIT",
             "dependencies": {
                 "gc-hook": "^0.3.1",
@@ -2932,9 +2940,9 @@
             }
         },
         "node_modules/polyscript": {
-            "version": "0.15.0",
-            "resolved": "https://registry.npmjs.org/polyscript/-/polyscript-0.15.0.tgz",
-            "integrity": "sha512-HCxHqr3Yyoudu1FvxzzCFAwHj51OeS3duga3eGXPsogTB0s79ACw9V6dsiwId02F7vVrcHLVyWcl0od+FtAK/A==",
+            "version": "0.15.1",
+            "resolved": "https://registry.npmjs.org/polyscript/-/polyscript-0.15.1.tgz",
+            "integrity": "sha512-4vbltiMwQFxN8QMtW+Kgz+dYgoU1ba46B8VNYliv2S2WWppJUKQ4QXaLi0NOtX+A6lCLXSU2/sZJAK40KbUpXA==",
             "license": "APACHE-2.0",
             "dependencies": {
                 "@ungap/structured-clone": "^1.2.0",
@@ -2943,7 +2951,7 @@
                 "@webreflection/idb-map": "^0.3.1",
                 "basic-devtools": "^0.1.6",
                 "codedent": "^0.1.2",
-                "coincident": "^2.0.6",
+                "coincident": "^2.0.7",
                 "gc-hook": "^0.4.1",
                 "html-escaper": "^3.0.3",
                 "proxy-target": "^3.0.2",
@@ -3667,9 +3675,9 @@
             }
         },
         "node_modules/rollup": {
-            "version": "4.20.0",
-            "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz",
-            "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==",
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.1.tgz",
+            "integrity": "sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==",
             "dev": true,
             "license": "MIT",
             "dependencies": {
@@ -3683,22 +3691,22 @@
                 "npm": ">=8.0.0"
             },
             "optionalDependencies": {
-                "@rollup/rollup-android-arm-eabi": "4.20.0",
-                "@rollup/rollup-android-arm64": "4.20.0",
-                "@rollup/rollup-darwin-arm64": "4.20.0",
-                "@rollup/rollup-darwin-x64": "4.20.0",
-                "@rollup/rollup-linux-arm-gnueabihf": "4.20.0",
-                "@rollup/rollup-linux-arm-musleabihf": "4.20.0",
-                "@rollup/rollup-linux-arm64-gnu": "4.20.0",
-                "@rollup/rollup-linux-arm64-musl": "4.20.0",
-                "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0",
-                "@rollup/rollup-linux-riscv64-gnu": "4.20.0",
-                "@rollup/rollup-linux-s390x-gnu": "4.20.0",
-                "@rollup/rollup-linux-x64-gnu": "4.20.0",
-                "@rollup/rollup-linux-x64-musl": "4.20.0",
-                "@rollup/rollup-win32-arm64-msvc": "4.20.0",
-                "@rollup/rollup-win32-ia32-msvc": "4.20.0",
-                "@rollup/rollup-win32-x64-msvc": "4.20.0",
+                "@rollup/rollup-android-arm-eabi": "4.21.1",
+                "@rollup/rollup-android-arm64": "4.21.1",
+                "@rollup/rollup-darwin-arm64": "4.21.1",
+                "@rollup/rollup-darwin-x64": "4.21.1",
+                "@rollup/rollup-linux-arm-gnueabihf": "4.21.1",
+                "@rollup/rollup-linux-arm-musleabihf": "4.21.1",
+                "@rollup/rollup-linux-arm64-gnu": "4.21.1",
+                "@rollup/rollup-linux-arm64-musl": "4.21.1",
+                "@rollup/rollup-linux-powerpc64le-gnu": "4.21.1",
+                "@rollup/rollup-linux-riscv64-gnu": "4.21.1",
+                "@rollup/rollup-linux-s390x-gnu": "4.21.1",
+                "@rollup/rollup-linux-x64-gnu": "4.21.1",
+                "@rollup/rollup-linux-x64-musl": "4.21.1",
+                "@rollup/rollup-win32-arm64-msvc": "4.21.1",
+                "@rollup/rollup-win32-ia32-msvc": "4.21.1",
+                "@rollup/rollup-win32-x64-msvc": "4.21.1",
                 "fsevents": "~2.3.2"
             }
         },
diff --git a/pyscript.core/package.json b/pyscript.core/package.json
index c2832c9b3d5..fb7913b5417 100644
--- a/pyscript.core/package.json
+++ b/pyscript.core/package.json
@@ -1,6 +1,6 @@
 {
     "name": "@pyscript/core",
-    "version": "0.5.5",
+    "version": "0.5.6",
     "type": "module",
     "description": "PyScript",
     "module": "./index.js",
@@ -45,7 +45,7 @@
     "dependencies": {
         "@ungap/with-resolvers": "^0.1.0",
         "basic-devtools": "^0.1.6",
-        "polyscript": "^0.15.0",
+        "polyscript": "^0.15.1",
         "sticky-module": "^0.1.1",
         "to-json-callback": "^0.1.1",
         "type-checked-collections": "^0.1.7"
@@ -55,7 +55,7 @@
         "@codemirror/lang-python": "^6.1.6",
         "@codemirror/language": "^6.10.2",
         "@codemirror/state": "^6.4.1",
-        "@codemirror/view": "^6.30.0",
+        "@codemirror/view": "^6.33.0",
         "@playwright/test": "1.45.3",
         "@rollup/plugin-commonjs": "^26.0.1",
         "@rollup/plugin-node-resolve": "^15.2.3",
@@ -63,12 +63,12 @@
         "@webreflection/toml-j0.4": "^1.1.3",
         "@xterm/addon-fit": "^0.10.0",
         "@xterm/addon-web-links": "^0.11.0",
-        "bun": "^1.1.21",
+        "bun": "^1.1.26",
         "chokidar": "^3.6.0",
         "codemirror": "^6.0.1",
-        "eslint": "^9.8.0",
+        "eslint": "^9.9.1",
         "flatted": "^3.3.1",
-        "rollup": "^4.20.0",
+        "rollup": "^4.21.1",
         "rollup-plugin-postcss": "^4.0.2",
         "rollup-plugin-string": "^3.0.0",
         "static-handler": "^0.4.3",
diff --git a/pyscript.core/src/stdlib/pyscript/websocket.py b/pyscript.core/src/stdlib/pyscript/websocket.py
index 7ce46ddd049..8e6b759a0d3 100644
--- a/pyscript.core/src/stdlib/pyscript/websocket.py
+++ b/pyscript.core/src/stdlib/pyscript/websocket.py
@@ -1,4 +1,5 @@
 import js
+from pyscript.ffi import create_proxy
 from pyscript.util import as_bytearray
 
 code = "code"
@@ -38,7 +39,8 @@ def __init__(self, **kw):
 
         for t in ["onclose", "onerror", "onmessage", "onopen"]:
             if t in kw:
-                socket[t] = kw[t]
+                # Pyodide fails at setting socket[t] directly
+                setattr(socket, t, create_proxy(kw[t]))
 
     def __getattr__(self, attr):
         return getattr(self._ws, attr)


Test patch:
diff --git a/pyscript.core/tests/index.html b/pyscript.core/tests/index.html
index 432a4b4c888..07d3d50229d 100644
--- a/pyscript.core/tests/index.html
+++ b/pyscript.core/tests/index.html
@@ -14,5 +14,5 @@
             a:hover { opacity: 1; }
         </style>
     </head>
-    <body><ul><li><strong><a href="./config/index.html">config</a></strong><ul><li><a href="./config/ambiguous-config.html">ambiguous-config<small>.html</small></a></li><li><a href="./config/same-config.html">same-config<small>.html</small></a></li><li><a href="./config/too-many-config.html">too-many-config<small>.html</small></a></li><li><a href="./config/too-many-py-config.html">too-many-py-config<small>.html</small></a></li></ul></li><li><strong><a href="./issue-7015/index.html">issue-7015</a></strong></li><li><strong><span>js-integration</span></strong><ul><li><a href="./js-integration/config-url.html">config-url<small>.html</small></a></li><li><strong><a href="./js-integration/fetch/index.html">fetch</a></strong></li><li><a href="./js-integration/ffi.html">ffi<small>.html</small></a></li><li><a href="./js-integration/hooks.html">hooks<small>.html</small></a></li><li><strong><a href="./js-integration/issue-2093/index.html">issue-2093</a></strong></li><li><a href="./js-integration/js_modules.html">js_modules<small>.html</small></a></li><li><a href="./js-integration/mpy.html">mpy<small>.html</small></a></li><li><a href="./js-integration/py-terminal-main.html">py-terminal-main<small>.html</small></a></li><li><a href="./js-integration/py-terminal-worker.html">py-terminal-worker<small>.html</small></a></li><li><a href="./js-integration/py-terminal.html">py-terminal<small>.html</small></a></li><li><a href="./js-integration/py-terminals.html">py-terminals<small>.html</small></a></li><li><a href="./js-integration/storage.html">storage<small>.html</small></a></li><li><strong><a href="./js-integration/workers/index.html">workers</a></strong><ul><li><a href="./js-integration/workers/named.html">named<small>.html</small></a></li></ul></li></ul></li><li><strong><a href="./manual/index.html">manual</a></strong><ul><li><a href="./manual/all-done.html">all-done<small>.html</small></a></li><li><a href="./manual/async.html">async<small>.html</small></a></li><li><a href="./manual/camera.html">camera<small>.html</small></a></li><li><a href="./manual/click.html">click<small>.html</small></a></li><li><a href="./manual/code-a-part.html">code-a-part<small>.html</small></a></li><li><a href="./manual/combo.html">combo<small>.html</small></a></li><li><a href="./manual/config.html">config<small>.html</small></a></li><li><a href="./manual/create-element.html">create-element<small>.html</small></a></li><li><a href="./manual/dialog.html">dialog<small>.html</small></a></li><li><a href="./manual/display.html">display<small>.html</small></a></li><li><a href="./manual/error.html">error<small>.html</small></a></li><li><a href="./manual/html-decode.html">html-decode<small>.html</small></a></li><li><a href="./manual/input.html">input<small>.html</small></a></li><li><a href="./manual/multi.html">multi<small>.html</small></a></li><li><a href="./manual/multiple-editors.html">multiple-editors<small>.html</small></a></li><li><a href="./manual/no-error.html">no-error<small>.html</small></a></li><li><a href="./manual/py-editor.html">py-editor<small>.html</small></a></li><li><a href="./manual/py_modules.html">py_modules<small>.html</small></a></li><li><a href="./manual/split-config.html">split-config<small>.html</small></a></li><li><a href="./manual/target.html">target<small>.html</small></a></li><li><a href="./manual/test_display_HTML.html">test_display_HTML<small>.html</small></a></li><li><a href="./manual/test_when.html">test_when<small>.html</small></a></li><li><a href="./manual/worker.html">worker<small>.html</small></a></li></ul></li><li><strong><a href="./no_sab/index.html">no_sab</a></strong></li><li><strong><a href="./piratical/index.html">piratical</a></strong></li><li><strong><a href="./py-editor/index.html">py-editor</a></strong><ul><li><a href="./py-editor/issue-2056.html">issue-2056<small>.html</small></a></li><li><a href="./py-editor/service-worker.html">service-worker<small>.html</small></a></li></ul></li><li><strong><a href="./py-terminals/index.html">py-terminals</a></strong><ul><li><a href="./py-terminals/no-repl.html">no-repl<small>.html</small></a></li><li><a href="./py-terminals/repl.html">repl<small>.html</small></a></li></ul></li><li><strong><a href="./pyscript_dom/index.html">pyscript_dom</a></strong></li><li><strong><a href="./service-worker/index.html">service-worker</a></strong></li><li><strong><a href="./ui/index.html">ui</a></strong><ul><li><a href="./ui/gallery.html">gallery<small>.html</small></a></li></ul></li></ul></body>
+    <body><ul><li><strong><a href="./config/index.html">config</a></strong><ul><li><a href="./config/ambiguous-config.html">ambiguous-config<small>.html</small></a></li><li><a href="./config/same-config.html">same-config<small>.html</small></a></li><li><a href="./config/too-many-config.html">too-many-config<small>.html</small></a></li><li><a href="./config/too-many-py-config.html">too-many-py-config<small>.html</small></a></li></ul></li><li><strong><a href="./issue-7015/index.html">issue-7015</a></strong></li><li><strong><span>js-integration</span></strong><ul><li><a href="./js-integration/config-url.html">config-url<small>.html</small></a></li><li><strong><a href="./js-integration/fetch/index.html">fetch</a></strong></li><li><a href="./js-integration/ffi.html">ffi<small>.html</small></a></li><li><a href="./js-integration/hooks.html">hooks<small>.html</small></a></li><li><strong><a href="./js-integration/issue-2093/index.html">issue-2093</a></strong></li><li><a href="./js-integration/js_modules.html">js_modules<small>.html</small></a></li><li><a href="./js-integration/mpy.html">mpy<small>.html</small></a></li><li><a href="./js-integration/py-terminal-main.html">py-terminal-main<small>.html</small></a></li><li><a href="./js-integration/py-terminal-worker.html">py-terminal-worker<small>.html</small></a></li><li><a href="./js-integration/py-terminal.html">py-terminal<small>.html</small></a></li><li><a href="./js-integration/py-terminals.html">py-terminals<small>.html</small></a></li><li><a href="./js-integration/storage.html">storage<small>.html</small></a></li><li><strong><a href="./js-integration/workers/index.html">workers</a></strong><ul><li><a href="./js-integration/workers/named.html">named<small>.html</small></a></li></ul></li></ul></li><li><strong><a href="./manual/index.html">manual</a></strong><ul><li><a href="./manual/all-done.html">all-done<small>.html</small></a></li><li><a href="./manual/async.html">async<small>.html</small></a></li><li><a href="./manual/camera.html">camera<small>.html</small></a></li><li><a href="./manual/click.html">click<small>.html</small></a></li><li><a href="./manual/code-a-part.html">code-a-part<small>.html</small></a></li><li><a href="./manual/combo.html">combo<small>.html</small></a></li><li><a href="./manual/config.html">config<small>.html</small></a></li><li><a href="./manual/create-element.html">create-element<small>.html</small></a></li><li><a href="./manual/dialog.html">dialog<small>.html</small></a></li><li><a href="./manual/display.html">display<small>.html</small></a></li><li><a href="./manual/error.html">error<small>.html</small></a></li><li><a href="./manual/html-decode.html">html-decode<small>.html</small></a></li><li><a href="./manual/input.html">input<small>.html</small></a></li><li><a href="./manual/interpreter.html">interpreter<small>.html</small></a></li><li><a href="./manual/multi.html">multi<small>.html</small></a></li><li><a href="./manual/multiple-editors.html">multiple-editors<small>.html</small></a></li><li><a href="./manual/no-error.html">no-error<small>.html</small></a></li><li><a href="./manual/py-editor.html">py-editor<small>.html</small></a></li><li><a href="./manual/py_modules.html">py_modules<small>.html</small></a></li><li><a href="./manual/split-config.html">split-config<small>.html</small></a></li><li><a href="./manual/target.html">target<small>.html</small></a></li><li><a href="./manual/test_display_HTML.html">test_display_HTML<small>.html</small></a></li><li><a href="./manual/test_when.html">test_when<small>.html</small></a></li><li><a href="./manual/worker.html">worker<small>.html</small></a></li></ul></li><li><strong><a href="./no_sab/index.html">no_sab</a></strong></li><li><strong><a href="./piratical/index.html">piratical</a></strong></li><li><strong><a href="./py-editor/index.html">py-editor</a></strong><ul><li><a href="./py-editor/issue-2056.html">issue-2056<small>.html</small></a></li><li><a href="./py-editor/service-worker.html">service-worker<small>.html</small></a></li></ul></li><li><strong><a href="./py-terminals/index.html">py-terminals</a></strong><ul><li><a href="./py-terminals/no-repl.html">no-repl<small>.html</small></a></li><li><a href="./py-terminals/repl.html">repl<small>.html</small></a></li></ul></li><li><strong><a href="./pyscript_dom/index.html">pyscript_dom</a></strong></li><li><strong><a href="./service-worker/index.html">service-worker</a></strong></li><li><strong><a href="./ui/index.html">ui</a></strong><ul><li><a href="./ui/gallery.html">gallery<small>.html</small></a></li></ul></li></ul></body>
 </html>
diff --git a/pyscript.core/tests/manual/interpreter.html b/pyscript.core/tests/manual/interpreter.html
new file mode 100644
index 00000000000..825f8ac7e58
--- /dev/null
+++ b/pyscript.core/tests/manual/interpreter.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <title>Pyodide Worker Version</title>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="stylesheet" href="../../dist/core.css">
+    <script type="module" src="../../dist/core.js"></script>
+</head>
+<body>
+    <script type="py" config='{"interpreter":"https://cdn.jsdelivr.net/pyodide/v0.23.4/full/pyodide.mjs"}' worker>
+      import pyodide
+      print(pyodide.__version__)
+    </script>
+</body>
+</html>
diff --git a/pyscript.core/tests/ws/index.js b/pyscript.core/tests/ws/index.js
index 7db7f7c528a..87b74fa4b4a 100644
--- a/pyscript.core/tests/ws/index.js
+++ b/pyscript.core/tests/ws/index.js
@@ -5,6 +5,8 @@ import { fileURLToPath } from 'url';
 
 const dir = dirname(fileURLToPath(import.meta.url));
 
+console.log('http://localhost:5037/');
+
 serve({
   port: 5037,
   fetch(req, server) {