Source code for caspia.homeserver.services.meadow

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