MCPcopy
hub / github.com/encode/starlette / WebSocket

Class WebSocket

starlette/websockets.py:26–187  ·  starlette/websockets.py::WebSocket

Source from the content-addressed store, hash-verified

24
25
26class WebSocket(HTTPConnection[StateT]):
27 def __init__(self, scope: Scope, receive: Receive, send: Send) -> None:
28 super().__init__(scope)
29 assert scope[class="st">"type"] == class="st">"websocket"
30 self._receive = receive
31 self._send = send
32 self.client_state = WebSocketState.CONNECTING
33 self.application_state = WebSocketState.CONNECTING
34
35 async def receive(self) -> Message:
36 class="st">"""
37 Receive ASGI websocket messages, ensuring valid state transitions.
38 class="st">"""
39 if self.client_state == WebSocketState.CONNECTING:
40 message = await self._receive()
41 message_type = message[class="st">"type"]
42 if message_type != class="st">"websocket.connect":
43 raise RuntimeError(f&class="cm">#x27;Expected ASGI message class="st">"websocket.connect", but got {message_type!r}')
44 self.client_state = WebSocketState.CONNECTED
45 return message
46 elif self.client_state == WebSocketState.CONNECTED:
47 message = await self._receive()
48 message_type = message[class="st">"type"]
49 if message_type not in {class="st">"websocket.receive", class="st">"websocket.disconnect"}:
50 raise RuntimeError(
51 f&class="cm">#x27;Expected ASGI message class="st">"websocket.receive" or class="st">"websocket.disconnect", but got {message_type!r}'
52 )
53 if message_type == class="st">"websocket.disconnect":
54 self.client_state = WebSocketState.DISCONNECTED
55 return message
56 else:
57 raise RuntimeError(&class="cm">#x27;Cannot call class="st">"receive" once a disconnect message has been received.')
58
59 async def send(self, message: Message) -> None:
60 class="st">"""
61 Send ASGI websocket messages, ensuring valid state transitions.
62 class="st">"""
63 if self.application_state == WebSocketState.CONNECTING:
64 message_type = message[class="st">"type"]
65 if message_type not in {class="st">"websocket.accept", class="st">"websocket.close", class="st">"websocket.http.response.start"}:
66 raise RuntimeError(
67 &class="cm">#x27;Expected ASGI message class="st">"websocket.accept", class="st">"websocket.close" or class="st">"websocket.http.response.start", '
68 fclass="st">"but got {message_type!r}"
69 )
70 if message_type == class="st">"websocket.close":
71 self.application_state = WebSocketState.DISCONNECTED
72 elif message_type == class="st">"websocket.http.response.start":
73 self.application_state = WebSocketState.RESPONSE
74 else:
75 self.application_state = WebSocketState.CONNECTED
76 await self._send(message)
77 elif self.application_state == WebSocketState.CONNECTED:
78 message_type = message[class="st">"type"]
79 if message_type not in {class="st">"websocket.send", class="st">"websocket.close"}:
80 raise RuntimeError(
81 f&class="cm">#x27;Expected ASGI message class="st">"websocket.send" or class="st">"websocket.close", but got {message_type!r}'
82 )
83 if message_type == class="st">"websocket.close":

Callers 8

dispatchMethod · 0.90
appFunction · 0.90
__call__Method · 0.90
appFunction · 0.90
asgiFunction · 0.90
appFunction · 0.90
__call__Method · 0.90

Calls

no outgoing calls

Tested by 5

appFunction · 0.72
asgiFunction · 0.72
appFunction · 0.72
__call__Method · 0.72