summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/platform.py
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-09-04 03:23:10 +0200
committerChristophe Besson <cbesson@gmail.com>2026-09-04 03:23:10 +0200
commit5098e6cb54173b27673f5761ce187d799ba36b30 (patch)
treeafd6da05673ad3217ebd88e0975a435df34b32ca /packages/meshbay-node/src/meshbay_node/platform.py
parentdad2157ada303a45655d2919f62905369525636f (diff)
downloadmeshbay-5098e6cb54173b27673f5761ce187d799ba36b30.tar.gz
fix(node): run on the default Windows event loop (Proactor)
Verified end to end: a live browser peer on Windows connecting to a Windows node — handshake, index sync, file download and an ffmpeg-transcoded video stream all work on the ProactorEventLoop. aiortc only hangs on it in the same-process loopback the tests use, which the repo-root conftest already handles for the suite. So the daemon no longer forces the SelectorEventLoop: that fixed aiortc-in-one-process but broke ffmpeg (no subprocess support on a Windows SelectorEventLoop). `use_compatible_event_loop()` becomes `configure_event_loop()` — a no-op unless MESHBAY_NODE_EVENT_LOOP=selector is set explicitly, as an escape hatch that probably never needs pulling. This drops the planned "move ffmpeg off the asyncio loop" work. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/platform.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/platform.py26
1 files changed, 12 insertions, 14 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/platform.py b/packages/meshbay-node/src/meshbay_node/platform.py
index 2eab9e1..351289f 100644
--- a/packages/meshbay-node/src/meshbay_node/platform.py
+++ b/packages/meshbay-node/src/meshbay_node/platform.py
@@ -27,25 +27,23 @@ def force_utf8_stdio() -> None:
# ── Event loop ───────────────────────────────────────────────────────────────
-def use_compatible_event_loop() -> None:
+def configure_event_loop() -> None:
"""
- On Windows, select the SelectorEventLoop: aiortc's ICE stack does not
- complete a loopback DataChannel handshake on the default ProactorEventLoop.
+ The daemon runs on Windows' default ProactorEventLoop: verified end to end
+ (a live browser peer connecting, an index sync, a file download and an
+ ffmpeg-transcoded video stream). aiortc only ever hangs on it in the
+ *same-process loopback* the tests use, which the test suite handles on its
+ own (repo-root conftest).
- Cost: SelectorEventLoop cannot spawn subprocesses on Windows, so ffmpeg
- streaming (asyncio.create_subprocess_exec in webrtc_server.py) does not work
- under it. The video path needs a thread-based runner on Windows — tracked
- for the port. No effect off Windows.
-
- Whether the hang is real for a live peer (vs. the same-process loopback in
- the tests) is still being established: set MESHBAY_NODE_EVENT_LOOP=proactor
- to keep the default loop and check.
+ Escape hatch, opt-in only: MESHBAY_NODE_EVENT_LOOP=selector switches to the
+ SelectorEventLoop. That fixes aiortc-in-one-process but breaks ffmpeg
+ (SelectorEventLoop cannot spawn subprocesses on Windows), so it is not the
+ default and probably never should be.
"""
if sys.platform != "win32":
return
- if os.environ.get("MESHBAY_NODE_EVENT_LOOP", "").lower() == "proactor":
- return
- asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
+ if os.environ.get("MESHBAY_NODE_EVENT_LOOP", "").lower() == "selector":
+ asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
# ── Directories ──────────────────────────────────────────────────────────────