typing.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import sys
  2. from typing import (
  3. Any,
  4. Awaitable,
  5. Callable,
  6. Dict,
  7. Iterable,
  8. Literal,
  9. Optional,
  10. Protocol,
  11. Tuple,
  12. Type,
  13. TypedDict,
  14. Union,
  15. )
  16. if sys.version_info >= (3, 11):
  17. from typing import NotRequired
  18. else:
  19. from typing_extensions import NotRequired
  20. __all__ = (
  21. "ASGIVersions",
  22. "HTTPScope",
  23. "WebSocketScope",
  24. "LifespanScope",
  25. "WWWScope",
  26. "Scope",
  27. "HTTPRequestEvent",
  28. "HTTPResponseStartEvent",
  29. "HTTPResponseBodyEvent",
  30. "HTTPResponseTrailersEvent",
  31. "HTTPResponsePathsendEvent",
  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 HTTPResponsePathsendEvent(TypedDict):
  117. type: Literal["http.response.pathsend"]
  118. path: str
  119. class HTTPServerPushEvent(TypedDict):
  120. type: Literal["http.response.push"]
  121. path: str
  122. headers: Iterable[Tuple[bytes, bytes]]
  123. class HTTPDisconnectEvent(TypedDict):
  124. type: Literal["http.disconnect"]
  125. class WebSocketConnectEvent(TypedDict):
  126. type: Literal["websocket.connect"]
  127. class WebSocketAcceptEvent(TypedDict):
  128. type: Literal["websocket.accept"]
  129. subprotocol: Optional[str]
  130. headers: Iterable[Tuple[bytes, bytes]]
  131. class WebSocketReceiveEvent(TypedDict):
  132. type: Literal["websocket.receive"]
  133. bytes: Optional[bytes]
  134. text: Optional[str]
  135. class WebSocketSendEvent(TypedDict):
  136. type: Literal["websocket.send"]
  137. bytes: Optional[bytes]
  138. text: Optional[str]
  139. class WebSocketResponseStartEvent(TypedDict):
  140. type: Literal["websocket.http.response.start"]
  141. status: int
  142. headers: Iterable[Tuple[bytes, bytes]]
  143. class WebSocketResponseBodyEvent(TypedDict):
  144. type: Literal["websocket.http.response.body"]
  145. body: bytes
  146. more_body: bool
  147. class WebSocketDisconnectEvent(TypedDict):
  148. type: Literal["websocket.disconnect"]
  149. code: int
  150. class WebSocketCloseEvent(TypedDict):
  151. type: Literal["websocket.close"]
  152. code: int
  153. reason: Optional[str]
  154. class LifespanStartupEvent(TypedDict):
  155. type: Literal["lifespan.startup"]
  156. class LifespanShutdownEvent(TypedDict):
  157. type: Literal["lifespan.shutdown"]
  158. class LifespanStartupCompleteEvent(TypedDict):
  159. type: Literal["lifespan.startup.complete"]
  160. class LifespanStartupFailedEvent(TypedDict):
  161. type: Literal["lifespan.startup.failed"]
  162. message: str
  163. class LifespanShutdownCompleteEvent(TypedDict):
  164. type: Literal["lifespan.shutdown.complete"]
  165. class LifespanShutdownFailedEvent(TypedDict):
  166. type: Literal["lifespan.shutdown.failed"]
  167. message: str
  168. ASGIReceiveEvent = Union[
  169. HTTPRequestEvent,
  170. HTTPDisconnectEvent,
  171. WebSocketConnectEvent,
  172. WebSocketReceiveEvent,
  173. WebSocketDisconnectEvent,
  174. LifespanStartupEvent,
  175. LifespanShutdownEvent,
  176. ]
  177. ASGISendEvent = Union[
  178. HTTPResponseStartEvent,
  179. HTTPResponseBodyEvent,
  180. HTTPResponseTrailersEvent,
  181. HTTPServerPushEvent,
  182. HTTPDisconnectEvent,
  183. WebSocketAcceptEvent,
  184. WebSocketSendEvent,
  185. WebSocketResponseStartEvent,
  186. WebSocketResponseBodyEvent,
  187. WebSocketCloseEvent,
  188. LifespanStartupCompleteEvent,
  189. LifespanStartupFailedEvent,
  190. LifespanShutdownCompleteEvent,
  191. LifespanShutdownFailedEvent,
  192. ]
  193. ASGIReceiveCallable = Callable[[], Awaitable[ASGIReceiveEvent]]
  194. ASGISendCallable = Callable[[ASGISendEvent], Awaitable[None]]
  195. class ASGI2Protocol(Protocol):
  196. def __init__(self, scope: Scope) -> None:
  197. ...
  198. async def __call__(
  199. self, receive: ASGIReceiveCallable, send: ASGISendCallable
  200. ) -> None:
  201. ...
  202. ASGI2Application = Type[ASGI2Protocol]
  203. ASGI3Application = Callable[
  204. [
  205. Scope,
  206. ASGIReceiveCallable,
  207. ASGISendCallable,
  208. ],
  209. Awaitable[None],
  210. ]
  211. ASGIApplication = Union[ASGI2Application, ASGI3Application]