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