@@ -140,6 +140,19 @@ def remote_address(self) -> Any:
140140 """
141141 return self .socket .getpeername ()
142142
143+ @property
144+ def state (self ) -> State :
145+ """
146+ State of the WebSocket connection, defined in :rfc:`6455`.
147+
148+ This attribute is provided for completeness. Typical applications
149+ shouldn't check its value. Instead, they should call :meth:`~recv` or
150+ :meth:`send` and handle :exc:`~websockets.exceptions.ConnectionClosed`
151+ exceptions.
152+
153+ """
154+ return self .protocol .state
155+
143156 @property
144157 def subprotocol (self ) -> Subprotocol | None :
145158 """
@@ -150,6 +163,30 @@ def subprotocol(self) -> Subprotocol | None:
150163 """
151164 return self .protocol .subprotocol
152165
166+ @property
167+ def close_code (self ) -> int | None :
168+ """
169+ State of the WebSocket connection, defined in :rfc:`6455`.
170+
171+ This attribute is provided for completeness. Typical applications
172+ shouldn't check its value. Instead, they should inspect attributes
173+ of :exc:`~websockets.exceptions.ConnectionClosed` exceptions.
174+
175+ """
176+ return self .protocol .close_code
177+
178+ @property
179+ def close_reason (self ) -> str | None :
180+ """
181+ State of the WebSocket connection, defined in :rfc:`6455`.
182+
183+ This attribute is provided for completeness. Typical applications
184+ shouldn't check its value. Instead, they should inspect attributes
185+ of :exc:`~websockets.exceptions.ConnectionClosed` exceptions.
186+
187+ """
188+ return self .protocol .close_reason
189+
153190 # Public methods
154191
155192 def __enter__ (self ) -> Connection :
0 commit comments