summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/asyncrpc/serv.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/asyncrpc/serv.py')
-rw-r--r--bitbake/lib/bb/asyncrpc/serv.py53
1 files changed, 52 insertions, 1 deletions
diff --git a/bitbake/lib/bb/asyncrpc/serv.py b/bitbake/lib/bb/asyncrpc/serv.py
index 3e0d0632cb..dfb0377380 100644
--- a/bitbake/lib/bb/asyncrpc/serv.py
+++ b/bitbake/lib/bb/asyncrpc/serv.py
@@ -12,7 +12,7 @@ import signal
12import socket 12import socket
13import sys 13import sys
14import multiprocessing 14import multiprocessing
15from .connection import StreamConnection 15from .connection import StreamConnection, WebsocketConnection
16from .exceptions import ClientError, ServerError, ConnectionClosedError 16from .exceptions import ClientError, ServerError, ConnectionClosedError
17 17
18 18
@@ -178,6 +178,54 @@ class UnixStreamServer(StreamServer):
178 os.unlink(self.path) 178 os.unlink(self.path)
179 179
180 180
181class WebsocketsServer(object):
182 def __init__(self, host, port, handler, logger):
183 self.host = host
184 self.port = port
185 self.handler = handler
186 self.logger = logger
187
188 def start(self, loop):
189 import websockets.server
190
191 self.server = loop.run_until_complete(
192 websockets.server.serve(
193 self.client_handler,
194 self.host,
195 self.port,
196 ping_interval=None,
197 )
198 )
199
200 for s in self.server.sockets:
201 self.logger.debug("Listening on %r" % (s.getsockname(),))
202
203 # Enable keep alives. This prevents broken client connections
204 # from persisting on the server for long periods of time.
205 s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
206 s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 30)
207 s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 15)
208 s.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 4)
209
210 name = self.server.sockets[0].getsockname()
211 if self.server.sockets[0].family == socket.AF_INET6:
212 self.address = "ws://[%s]:%d" % (name[0], name[1])
213 else:
214 self.address = "ws://%s:%d" % (name[0], name[1])
215
216 return [self.server.wait_closed()]
217
218 async def stop(self):
219 self.server.close()
220
221 def cleanup(self):
222 pass
223
224 async def client_handler(self, websocket):
225 socket = WebsocketConnection(websocket, -1)
226 await self.handler(socket)
227
228
181class AsyncServer(object): 229class AsyncServer(object):
182 def __init__(self, logger): 230 def __init__(self, logger):
183 self.logger = logger 231 self.logger = logger
@@ -190,6 +238,9 @@ class AsyncServer(object):
190 def start_unix_server(self, path): 238 def start_unix_server(self, path):
191 self.server = UnixStreamServer(path, self._client_handler, self.logger) 239 self.server = UnixStreamServer(path, self._client_handler, self.logger)
192 240
241 def start_websocket_server(self, host, port):
242 self.server = WebsocketsServer(host, port, self._client_handler, self.logger)
243
193 async def _client_handler(self, socket): 244 async def _client_handler(self, socket):
194 try: 245 try:
195 client = self.accept_client(socket) 246 client = self.accept_client(socket)