Skip to content

Commit b4d7ead

Browse files
committed
fix(network): allow listeners on network monitor
1 parent cd5d2df commit b4d7ead

1 file changed

Lines changed: 25 additions & 1 deletion

File tree

src/wslink/websocket.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import asyncio
88
import logging
9+
from contextlib import suppress
910

1011
from wslink import register as exportRpc
1112
from wslink import schedule_callback
@@ -75,21 +76,44 @@ class NetworkMonitor:
7576
"""
7677

7778
def __init__(self):
78-
7979
self.pending = 0
80+
self._next_listener_id = 1
81+
self._listeners = {}
8082
self.event = asyncio.Event()
8183

84+
def add_listener(self, enter, exit):
85+
"""Register listener and return id to enable remove"""
86+
self._next_listener_id += 1
87+
self._listeners[self._next_listener_id] = (enter, exit)
88+
return self._next_listener_id
89+
90+
def remove_listener(self, key):
91+
"""Unregister listener using its registration key"""
92+
return self._listeners.pop(key, None)
93+
8294
def network_call_completed(self):
8395
"""Trigger completion event"""
8496
self.event.set()
8597

8698
def on_enter(self, *_, **__):
8799
"""Increase pending request"""
100+
101+
if self.pending == 0:
102+
for enter, _ in self._listeners.values():
103+
with suppress(Exception):
104+
enter()
105+
88106
self.pending += 1
89107

90108
def on_exit(self, *_, **__):
91109
"""Decrease pending request and trigger completion event if we reach 0 pending request"""
92110
self.pending -= 1
111+
112+
if self.pending == 0:
113+
for _, exit in self._listeners.values():
114+
with suppress(Exception):
115+
exit()
116+
93117
if self.pending == 0 and not self.event.is_set():
94118
self.event.set()
95119

0 commit comments

Comments
 (0)