auto.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from __future__ import annotations
  2. import typing
  3. from .._synchronization import current_async_library
  4. from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream
  5. class AutoBackend(AsyncNetworkBackend):
  6. async def _init_backend(self) -> None:
  7. if not (hasattr(self, "_backend")):
  8. backend = current_async_library()
  9. if backend == "trio":
  10. from .trio import TrioBackend
  11. self._backend: AsyncNetworkBackend = TrioBackend()
  12. else:
  13. from .anyio import AnyIOBackend
  14. self._backend = AnyIOBackend()
  15. async def connect_tcp(
  16. self,
  17. host: str,
  18. port: int,
  19. timeout: float | None = None,
  20. local_address: str | None = None,
  21. socket_options: typing.Iterable[SOCKET_OPTION] | None = None,
  22. ) -> AsyncNetworkStream:
  23. await self._init_backend()
  24. return await self._backend.connect_tcp(
  25. host,
  26. port,
  27. timeout=timeout,
  28. local_address=local_address,
  29. socket_options=socket_options,
  30. )
  31. async def connect_unix_socket(
  32. self,
  33. path: str,
  34. timeout: float | None = None,
  35. socket_options: typing.Iterable[SOCKET_OPTION] | None = None,
  36. ) -> AsyncNetworkStream: # pragma: nocover
  37. await self._init_backend()
  38. return await self._backend.connect_unix_socket(
  39. path, timeout=timeout, socket_options=socket_options
  40. )
  41. async def sleep(self, seconds: float) -> None: # pragma: nocover
  42. await self._init_backend()
  43. return await self._backend.sleep(seconds)