summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/asyncrpc/connection.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/asyncrpc/connection.py')
-rw-r--r--bitbake/lib/bb/asyncrpc/connection.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/bitbake/lib/bb/asyncrpc/connection.py b/bitbake/lib/bb/asyncrpc/connection.py
index c4fd24754c..a10628f75a 100644
--- a/bitbake/lib/bb/asyncrpc/connection.py
+++ b/bitbake/lib/bb/asyncrpc/connection.py
@@ -93,3 +93,47 @@ class StreamConnection(object):
93 if self.writer is not None: 93 if self.writer is not None:
94 self.writer.close() 94 self.writer.close()
95 self.writer = None 95 self.writer = None
96
97
98class WebsocketConnection(object):
99 def __init__(self, socket, timeout):
100 self.socket = socket
101 self.timeout = timeout
102
103 @property
104 def address(self):
105 return ":".join(str(s) for s in self.socket.remote_address)
106
107 async def send_message(self, msg):
108 await self.send(json.dumps(msg))
109
110 async def recv_message(self):
111 m = await self.recv()
112 return json.loads(m)
113
114 async def send(self, msg):
115 import websockets.exceptions
116
117 try:
118 await self.socket.send(msg)
119 except websockets.exceptions.ConnectionClosed:
120 raise ConnectionClosedError("Connection closed")
121
122 async def recv(self):
123 import websockets.exceptions
124
125 try:
126 if self.timeout < 0:
127 return await self.socket.recv()
128
129 try:
130 return await asyncio.wait_for(self.socket.recv(), self.timeout)
131 except asyncio.TimeoutError:
132 raise ConnectionError("Timed out waiting for data")
133 except websockets.exceptions.ConnectionClosed:
134 raise ConnectionClosedError("Connection closed")
135
136 async def close(self):
137 if self.socket is not None:
138 await self.socket.close()
139 self.socket = None