AIOHTTP Websocket Wrapper
| 355 | |
| 356 | |
| 357 | class WebSocket(BaseWebSocket): |
| 358 | """AIOHTTP Websocket Wrapper""" |
| 359 | |
| 360 | def __init__( |
| 361 | self, |
| 362 | *, |
| 363 | request: Request, |
| 364 | session: aiohttp.ClientSession, |
| 365 | websocket: aiohttp.ClientWebSocketResponse, |
| 366 | ): |
| 367 | super().__init__(request=request) |
| 368 | self.session = session |
| 369 | self.websocket = websocket |
| 370 | |
| 371 | @property |
| 372 | @override |
| 373 | def closed(self): |
| 374 | return self.websocket.closed |
| 375 | |
| 376 | @override |
| 377 | async def accept(self): |
| 378 | raise NotImplementedError |
| 379 | |
| 380 | @override |
| 381 | async def close(self, code: int = 1000, reason: str = ""): |
| 382 | await self.websocket.close(code=code, message=reason.encode("utf-8")) |
| 383 | await self.session.close() |
| 384 | |
| 385 | async def _receive(self) -> aiohttp.WSMessage: |
| 386 | msg = await self.websocket.receive() |
| 387 | if msg.type in ( |
| 388 | aiohttp.WSMsgType.CLOSE, |
| 389 | aiohttp.WSMsgType.CLOSING, |
| 390 | aiohttp.WSMsgType.CLOSED, |
| 391 | ): |
| 392 | raise WebSocketClosed(self.websocket.close_code or 1006) |
| 393 | return msg |
| 394 | |
| 395 | @override |
| 396 | async def receive(self) -> str: |
| 397 | msg = await self._receive() |
| 398 | if msg.type not in (aiohttp.WSMsgType.TEXT, aiohttp.WSMsgType.BINARY): |
| 399 | raise TypeError( |
| 400 | f"WebSocket received unexpected frame type: {msg.type}, {msg.data!r}" |
| 401 | ) |
| 402 | return msg.data |
| 403 | |
| 404 | @override |
| 405 | async def receive_text(self) -> str: |
| 406 | msg = await self._receive() |
| 407 | if msg.type != aiohttp.WSMsgType.TEXT: |
| 408 | raise TypeError( |
| 409 | f"WebSocket received unexpected frame type: {msg.type}, {msg.data!r}" |
| 410 | ) |
| 411 | return msg.data |
| 412 | |
| 413 | @override |
| 414 | async def receive_bytes(self) -> bytes: |