Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions examples/async_browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,22 @@
import logging
from typing import Any, Optional, cast

from zeroconf import IPVersion, ServiceStateChange
from zeroconf.aio import AsyncServiceBrowser, AsyncZeroconf, AsyncZeroconfServiceTypes
from zeroconf import IPVersion, ServiceStateChange, Zeroconf
from zeroconf.aio import AsyncServiceBrowser, AsyncServiceInfo, AsyncZeroconf, AsyncZeroconfServiceTypes


def async_on_service_state_change(
zeroconf: AsyncZeroconf, service_type: str, name: str, state_change: ServiceStateChange
zeroconf: Zeroconf, service_type: str, name: str, state_change: ServiceStateChange
) -> None:
print("Service %s of type %s state changed: %s" % (name, service_type, state_change))
if state_change is not ServiceStateChange.Added:
return
asyncio.ensure_future(async_display_service_info(zeroconf, service_type, name))


async def async_display_service_info(zeroconf: AsyncZeroconf, service_type: str, name: str) -> None:
info = await zeroconf.async_get_service_info(service_type, name)
async def async_display_service_info(zeroconf: Zeroconf, service_type: str, name: str) -> None:
info = AsyncServiceInfo(service_type, name)
await info.async_request(zeroconf, 3000)
print("Info from zeroconf.get_service_info: %r" % (info))
if info:
addresses = ["%s:%d" % (addr, cast(int, info.port)) for addr in info.parsed_addresses()]
Expand Down Expand Up @@ -59,7 +60,9 @@ async def async_run(self) -> None:
)

print("\nBrowsing %s service(s), press Ctrl-C to exit...\n" % services)
self.aiobrowser = AsyncServiceBrowser(self.aiozc, services, handlers=[async_on_service_state_change])
self.aiobrowser = AsyncServiceBrowser(
self.aiozc.zeroconf, services, handlers=[async_on_service_state_change]
)
while True:
await asyncio.sleep(1)

Expand Down
13 changes: 2 additions & 11 deletions tests/test_aio.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

import pytest

from zeroconf.aio import AsyncServiceInfo, AsyncServiceListener, AsyncZeroconf, AsyncZeroconfServiceTypes
from zeroconf.aio import AsyncServiceInfo, AsyncZeroconf, AsyncZeroconfServiceTypes
from zeroconf import Zeroconf
from zeroconf.const import _LISTENER_TIME
from zeroconf._exceptions import BadTypeInNameException, NonUniqueNameException, ServiceNameAlreadyRegistered
Expand Down Expand Up @@ -433,16 +433,7 @@ async def test_async_service_browser() -> None:

calls = []

with pytest.raises(NotImplementedError):
AsyncServiceListener().add_service(aiozc, "_type", "name._type")

with pytest.raises(NotImplementedError):
AsyncServiceListener().remove_service(aiozc, "_type", "name._type")

with pytest.raises(NotImplementedError):
AsyncServiceListener().update_service(aiozc, "_type", "name._type")

class MyListener(AsyncServiceListener):
class MyListener(ServiceListener):
def add_service(self, aiozc: AsyncZeroconf, type: str, name: str) -> None:
calls.append(("add", type, name))

Expand Down
31 changes: 10 additions & 21 deletions zeroconf/aio.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

from ._core import Zeroconf
from ._exceptions import NonUniqueNameException
from ._services import ServiceListener
from ._services.browser import _ServiceBrowserBase
from ._services.info import ServiceInfo, instance_name_from_service_info
from ._services.types import ZeroconfServiceTypes
Expand All @@ -45,22 +46,10 @@
"AsyncZeroconf",
"AsyncServiceInfo",
"AsyncServiceBrowser",
"AsyncServiceListener",
"AsyncZeroconfServiceTypes",
]


class AsyncServiceListener:
def add_service(self, aiozc: 'AsyncZeroconf', type_: str, name: str) -> None:
raise NotImplementedError()

def remove_service(self, aiozc: 'AsyncZeroconf', type_: str, name: str) -> None:
raise NotImplementedError()

def update_service(self, aiozc: 'AsyncZeroconf', type_: str, name: str) -> None:
raise NotImplementedError()


class AsyncServiceInfo(ServiceInfo):
"""An async version of ServiceInfo."""

Expand All @@ -74,15 +63,15 @@ class AsyncServiceBrowser(_ServiceBrowserBase):

def __init__(
self,
aiozc: 'AsyncZeroconf',
zeroconf: 'Zeroconf',
type_: Union[str, list],
handlers: Optional[Union[AsyncServiceListener, List[Callable[..., None]]]] = None,
listener: Optional[AsyncServiceListener] = None,
handlers: Optional[Union[ServiceListener, List[Callable[..., None]]]] = None,
listener: Optional[ServiceListener] = None,
addr: Optional[str] = None,
port: int = _MDNS_PORT,
delay: int = _BROWSER_TIME,
) -> None:
super().__init__(aiozc.zeroconf, type_, handlers, listener, addr, port, delay) # type: ignore
super().__init__(zeroconf, type_, handlers, listener, addr, port, delay)
self._browser_task = cast(asyncio.Task, asyncio.ensure_future(self.async_browser_task()))

async def async_cancel(self) -> None:
Expand Down Expand Up @@ -115,7 +104,7 @@ async def async_find(
local_zc = aiozc or AsyncZeroconf(interfaces=interfaces, ip_version=ip_version)
listener = cls()
async_browser = AsyncServiceBrowser(
local_zc, _SERVICE_TYPE_ENUMERATION_NAME, listener=listener # type: ignore
local_zc.zeroconf, _SERVICE_TYPE_ENUMERATION_NAME, listener=listener
)

# wait for responses
Expand Down Expand Up @@ -168,7 +157,7 @@ def __init__(
ip_version=ip_version,
apple_p2p=apple_p2p,
)
self.async_browsers: Dict[AsyncServiceListener, AsyncServiceBrowser] = {}
self.async_browsers: Dict[ServiceListener, AsyncServiceBrowser] = {}

async def _async_broadcast_service(self, info: ServiceInfo, interval: int, ttl: Optional[int]) -> None:
"""Send a broadcasts to announce a service at intervals."""
Expand Down Expand Up @@ -269,14 +258,14 @@ async def async_get_service_info(
return info
return None

async def async_add_service_listener(self, type_: str, listener: AsyncServiceListener) -> None:
async def async_add_service_listener(self, type_: str, listener: ServiceListener) -> None:
"""Adds a listener for a particular service type. This object
will then have its add_service and remove_service methods called when
services of that type become available and unavailable."""
await self.async_remove_service_listener(listener)
self.async_browsers[listener] = AsyncServiceBrowser(self, type_, listener)
self.async_browsers[listener] = AsyncServiceBrowser(self.zeroconf, type_, listener)

async def async_remove_service_listener(self, listener: AsyncServiceListener) -> None:
async def async_remove_service_listener(self, listener: ServiceListener) -> None:
"""Removes a listener from the set that is currently listening."""
if listener in self.async_browsers:
await self.async_browsers[listener].async_cancel()
Expand Down