main
py 56 lines 1.5 KB
Raw
1 from flaredantic import NotifyEvent
2
3
4 def event_value(event):
5 return event.value if hasattr(event, "value") else event
6
7
8 class TunnelHelper:
9 def __init__(self, port, notify=None):
10 self.port = port
11 self.notify_callback = notify
12 self.tunnel = None
13 self.tunnel_url = None
14
15 def _notify(self, event, message, data=None):
16 if callable(self.notify_callback):
17 self.notify_callback(event, message, data)
18
19 def notify_starting(self, label):
20 self._notify(
21 NotifyEvent.CREATING_TUNNEL,
22 f"Starting {label} on port {self.port}...",
23 )
24
25 def notify_url_ready(self, label, url):
26 self._notify(
27 NotifyEvent.TUNNEL_URL,
28 f"{label} URL is ready",
29 {"url": url},
30 )
31
32 def notify_stopped(self, label):
33 self._notify(NotifyEvent.TUNNEL_STOPPED, f"{label} stopped")
34
35
36 class FlaredanticTunnelHelper(TunnelHelper):
37 label = "Remote Control"
38
39 def build_tunnel(self):
40 raise NotImplementedError
41
42 def start(self):
43 self.notify_starting(self.label)
44 self.tunnel = self.build_tunnel()
45 self.tunnel.start()
46 self.tunnel_url = getattr(self.tunnel, "tunnel_url", None)
47 if self.tunnel_url:
48 self.notify_url_ready(self.label, self.tunnel_url)
49 return self.tunnel_url
50
51 def stop(self):
52 if self.tunnel:
53 self.tunnel.stop()
54 self.tunnel_url = None
55 self.notify_stopped(self.label)
56 return True