from caspia.meadow.client import ConsumerConnection, ServiceBrowser
from .base import Service
[docs]class MeadowService(Service):
table_name = 'meadow'
def __init__(self, *, browser: ServiceBrowser, consumer_conn: ConsumerConnection, **kwargs):
super().__init__(**kwargs)
self._new_service_names = set()
self.browser = browser
self.lookup = browser.lookup
self.consumer_conn = consumer_conn
self.lookup.add_create_hook(self._create_service_hook)
self.browser.add_services_update_hook(self._on_services_update)
self._load_services()
def _store_services(self):
self.db.purge_table('meadow-known-services')
table = self.db.table('meadow-known-services')
table.insert_multiple({'name': name} for name, service in self.lookup.services.items())
def _load_services(self):
for s_entry in self.db.table('meadow-known-services'):
self.lookup.get(s_entry['name'], create=True)
def _create_service_hook(self, name):
self._new_service_names.add(name)
async def _on_services_update(self, added, removed):
if self._new_service_names:
self._store_services()
self._new_service_names = set()
[docs] async def get_service(self, name):
""" Returns service with given `name`.
If the service is not known, raises ValueError.
"""
service = self.lookup.find(name)
if service is None:
raise ValueError(f"Service {name} not found.")
return service
[docs] async def get_services(self):
""" Returns iterator of all known services. """
for service in self.lookup.services.values():
yield service