typing.py 6.0 KB

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