typing.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. import sys
  2. from typing import (
  3. Any,
  4. Awaitable,
  5. Callable,
  6. Dict,
  7. Iterable,
  8. Optional,
  9. Tuple,
  10. Type,
  11. Union,
  12. )
  13. if sys.version_info >= (3, 8):
  14. from typing import Literal, Protocol, TypedDict
  15. else:
  16. from typing_extensions import Literal, Protocol, TypedDict
  17. if sys.version_info >= (3, 11):
  18. from typing import NotRequired
  19. else:
  20. from typing_extensions import NotRequired
  21. __all__ = (
  22. "ASGIVersions",
  23. "HTTPScope",
  24. "WebSocketScope",
  25. "LifespanScope",
  26. "WWWScope",
  27. "Scope",
  28. "HTTPRequestEvent",
  29. "HTTPResponseStartEvent",
  30. "HTTPResponseBodyEvent",
  31. "HTTPResponseTrailersEvent",
  32. "HTTPServerPushEvent",
  33. "HTTPDisconnectEvent",
  34. "WebSocketConnectEvent",
  35. "WebSocketAcceptEvent",
  36. "WebSocketReceiveEvent",
  37. "WebSocketSendEvent",
  38. "WebSocketResponseStartEvent",
  39. "WebSocketResponseBodyEvent",
  40. "WebSocketDisconnectEvent",
  41. "WebSocketCloseEvent",
  42. "LifespanStartupEvent",
  43. "LifespanShutdownEvent",
  44. "LifespanStartupCompleteEvent",
  45. "LifespanStartupFailedEvent",
  46. "LifespanShutdownCompleteEvent",
  47. "LifespanShutdownFailedEvent",
  48. "ASGIReceiveEvent",
  49. "ASGISendEvent",
  50. "ASGIReceiveCallable",
  51. "ASGISendCallable",
  52. "ASGI2Protocol",
  53. "ASGI2Application",
  54. "ASGI3Application",
  55. "ASGIApplication",
  56. )
  57. class ASGIVersions(TypedDict):
  58. spec_version: str
  59. version: Union[Literal["2.0"], Literal["3.0"]]
  60. class HTTPScope(TypedDict):
  61. type: Literal["http"]
  62. asgi: ASGIVersions
  63. http_version: str
  64. method: str
  65. scheme: str
  66. path: str
  67. raw_path: bytes
  68. query_string: bytes
  69. root_path: str
  70. headers: Iterable[Tuple[bytes, bytes]]
  71. client: Optional[Tuple[str, int]]
  72. server: Optional[Tuple[str, Optional[int]]]
  73. state: NotRequired[Dict[str, Any]]
  74. extensions: Optional[Dict[str, Dict[object, object]]]
  75. class WebSocketScope(TypedDict):
  76. type: Literal["websocket"]
  77. asgi: ASGIVersions
  78. http_version: str
  79. scheme: str
  80. path: str
  81. raw_path: bytes
  82. query_string: bytes
  83. root_path: str
  84. headers: Iterable[Tuple[bytes, bytes]]
  85. client: Optional[Tuple[str, int]]
  86. server: Optional[Tuple[str, Optional[int]]]
  87. subprotocols: Iterable[str]
  88. state: NotRequired[Dict[str, Any]]
  89. extensions: Optional[Dict[str, Dict[object, object]]]
  90. class LifespanScope(TypedDict):
  91. type: Literal["lifespan"]
  92. asgi: ASGIVersions
  93. state: NotRequired[Dict[str, Any]]
  94. WWWScope = Union[HTTPScope, WebSocketScope]
  95. Scope = Union[HTTPScope, WebSocketScope, LifespanScope]
  96. class HTTPRequestEvent(TypedDict):
  97. type: Literal["http.request"]
  98. body: bytes
  99. more_body: bool
  100. class HTTPResponseDebugEvent(TypedDict):
  101. type: Literal["http.response.debug"]
  102. info: Dict[str, object]
  103. class HTTPResponseStartEvent(TypedDict):
  104. type: Literal["http.response.start"]
  105. status: int
  106. headers: Iterable[Tuple[bytes, bytes]]
  107. trailers: bool
  108. class HTTPResponseBodyEvent(TypedDict):
  109. type: Literal["http.response.body"]
  110. body: bytes
  111. more_body: bool
  112. class HTTPResponseTrailersEvent(TypedDict):
  113. type: Literal["http.response.trailers"]
  114. headers: Iterable[Tuple[bytes, bytes]]
  115. more_trailers: bool
  116. class HTTPServerPushEvent(TypedDict):
  117. type: Literal["http.response.push"]
  118. path: str
  119. headers: Iterable[Tuple[bytes, bytes]]
  120. class HTTPDisconnectEvent(TypedDict):
  121. type: Literal["http.disconnect"]
  122. class WebSocketConnectEvent(TypedDict):
  123. type: Literal["websocket.connect"]
  124. class WebSocketAcceptEvent(TypedDict):
  125. type: Literal["websocket.accept"]
  126. subprotocol: Optional[str]
  127. headers: Iterable[Tuple[bytes, bytes]]
  128. class WebSocketReceiveEvent(TypedDict):
  129. type: Literal["websocket.receive"]
  130. bytes: Optional[bytes]
  131. text: Optional[str]
  132. class WebSocketSendEvent(TypedDict):
  133. type: Literal["websocket.send"]
  134. bytes: Optional[bytes]
  135. text: Optional[str]
  136. class WebSocketResponseStartEvent(TypedDict):
  137. type: Literal["websocket.http.response.start"]
  138. status: int
  139. headers: Iterable[Tuple[bytes, bytes]]
  140. class WebSocketResponseBodyEvent(TypedDict):
  141. type: Literal["websocket.http.response.body"]
  142. body: bytes
  143. more_body: bool
  144. class WebSocketDisconnectEvent(TypedDict):
  145. type: Literal["websocket.disconnect"]
  146. code: int
  147. class WebSocketCloseEvent(TypedDict):
  148. type: Literal["websocket.close"]
  149. code: int
  150. reason: Optional[str]
  151. class LifespanStartupEvent(TypedDict):
  152. type: Literal["lifespan.startup"]
  153. class LifespanShutdownEvent(TypedDict):
  154. type: Literal["lifespan.shutdown"]
  155. class LifespanStartupCompleteEvent(TypedDict):
  156. type: Literal["lifespan.startup.complete"]
  157. class LifespanStartupFailedEvent(TypedDict):
  158. type: Literal["lifespan.startup.failed"]
  159. message: str
  160. class LifespanShutdownCompleteEvent(TypedDict):
  161. type: Literal["lifespan.shutdown.complete"]
  162. class LifespanShutdownFailedEvent(TypedDict):
  163. type: Literal["lifespan.shutdown.failed"]
  164. message: str
  165. ASGIReceiveEvent = Union[
  166. HTTPRequestEvent,
  167. HTTPDisconnectEvent,
  168. WebSocketConnectEvent,
  169. WebSocketReceiveEvent,
  170. WebSocketDisconnectEvent,
  171. LifespanStartupEvent,
  172. LifespanShutdownEvent,
  173. ]
  174. ASGISendEvent = Union[
  175. HTTPResponseStartEvent,
  176. HTTPResponseBodyEvent,
  177. HTTPResponseTrailersEvent,
  178. HTTPServerPushEvent,
  179. HTTPDisconnectEvent,
  180. WebSocketAcceptEvent,
  181. WebSocketSendEvent,
  182. WebSocketResponseStartEvent,
  183. WebSocketResponseBodyEvent,
  184. WebSocketCloseEvent,
  185. LifespanStartupCompleteEvent,
  186. LifespanStartupFailedEvent,
  187. LifespanShutdownCompleteEvent,
  188. LifespanShutdownFailedEvent,
  189. ]
  190. ASGIReceiveCallable = Callable[[], Awaitable[ASGIReceiveEvent]]
  191. ASGISendCallable = Callable[[ASGISendEvent], Awaitable[None]]
  192. class ASGI2Protocol(Protocol):
  193. def __init__(self, scope: Scope) -> None:
  194. ...
  195. async def __call__(
  196. self, receive: ASGIReceiveCallable, send: ASGISendCallable
  197. ) -> None:
  198. ...
  199. ASGI2Application = Type[ASGI2Protocol]
  200. ASGI3Application = Callable[
  201. [
  202. Scope,
  203. ASGIReceiveCallable,
  204. ASGISendCallable,
  205. ],
  206. Awaitable[None],
  207. ]
  208. ASGIApplication = Union[ASGI2Application, ASGI3Application]