typing.py 5.5 KB

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